v_sim-3.7.0/0000755000353400050620000000000012216331337007642 500000000000000v_sim-3.7.0/m4/0000755000353400050620000000000012216331337010162 500000000000000v_sim-3.7.0/m4/abinit.m40000644000353400050620000001354712215546054011627 00000000000000AC_DEFUN([AC_CHECK_ABINIT], [ AC_MSG_CHECKING([for Abinit support]) AC_ARG_WITH([abinit], [AS_HELP_STRING([--with-abinit=ARG],[ABINIT directory (with include and lib subdirs)])], [AB_PATH=$withval], [AB_PATH="no"]) AC_ARG_WITH([abinit_include], [AS_HELP_STRING([--with-abinit-include=ARG],[specific ABINIT include directory])], [AB_PATH_INC=$withval], [AB_PATH_INC=""]) AC_ARG_WITH([abinit_libdir], [AS_HELP_STRING([--with-abinit-libdir=ARG],[specific ABINIT library directory])], [AB_PATH_LIBDIR=$withval], [AB_PATH_LIBDIR=""]) AC_MSG_RESULT($AB_PATH) dnl In case ABINIT is demanded, we test Lapack first. if test "z$AB_PATH" != "zno" ; then AC_REQUIRE([ACX_LAPACK]) if test x"$acx_lapack_ok" = xno; then AC_WARN([ABINIT support has been disabled since Lapack is not available.]) AB_PATH="no" fi fi dnl We also test ETSF_IO if test "z$AB_PATH" != "zno" ; then AC_REQUIRE([AC_CHECK_ETSF_IO]) if test x"$ac_etsf_io_ok" = xno; then AC_WARN([ABINIT support has been disabled since ETSF_IO is not available.]) AB_PATH="no" fi fi dnl We also test LibXC if test "z$AB_PATH" != "zno" ; then AC_REQUIRE([AC_CHECK_LIBXC]) if test x"$ac_libxc_ok" = xno; then AC_WARN([ABINIT support has been disabled since LibXC is not available.]) AB_PATH="no" fi fi if test "z$AB_PATH" != "zno" ; then AS_IF([test "z$AB_PATH" = "zyes"],[AB_PATH="/opt/etsf/abinit"]) AS_IF([test "z$AB_PATH_LIBDIR" = "z"],[AB_PATH_LIBDIR="$AB_PATH/lib"]) AS_IF([test "z$AB_PATH_INC" = "z"],[AB_PATH_INC="$AB_PATH/include"]) dnl First thing is to test the header file. CPPFLAGS_SVG=$CPPFLAGS CPPFLAGS="$CPPFLAGS -I$AB_PATH_INC" AC_CHECK_HEADER([ab6_invars.h], [ac_abinit_parser_header="yes"], [ac_abinit_parser_header="no"]) AC_CHECK_HEADER([ab6_symmetry.h], [ac_abinit_symmetry_header="yes"], [ac_abinit_symmetry_header="no"]) CPPFLAGS=$CPPFLAGS_SVG dnl Try to guess the lib name. AB_LIBRARY="abinis" if test -f $AB_PATH_LIBDIR/libabinit6.a ; then AB_LIBRARY="abinit6" fi dnl Try to find the missing dependencies in libabinis.a. AC_FC_WRAPPERS() AC_FC_FUNC([wrtout]) AC_FC_FUNC([leave_new]) AC_FC_FUNC([timab]) AC_FC_FUNC([psp_from_data]) AC_LANG_PUSH([C]) LIBS_SVG=$LIBS LIBS="$LIBS_SVG -L$AB_PATH_LIBDIR -l$AB_LIBRARY $ETSF_IO_LIBS $LIBXC_LIBS $LAPACK_LIBS $BLAS_LIBS $FCLIBS" CFLAGS_SVG=$CFLAGS CFLAGS="$CFLAGS -Wno-error" dnl Look for the parser in libabinis. AC_MSG_CHECKING([for parser capabilities in lib$AB_LIBRARY.a from $AB_PATH_LIBDIR]) AC_LINK_IFELSE([AC_LANG_SOURCE([ void $wrtout() { } void $leave_new() { } void $timab() { } void $psp_from_data() { } int main(int argc, const char **argv) { ab6_invars_new_from_file(); return 0; } ])], [ac_abinit_parser_ok=yes], [ac_abinit_parser_ok=no]) AC_MSG_RESULT([$ac_abinit_parser_ok]) dnl Look for specific functions in the parser routines. if test $ac_abinit_parser_ok = "yes" ; then AC_MSG_CHECKING([for invars.new_from_file_with_pseudo() routine in lib$AB_LIBRARY.a]) AC_LINK_IFELSE([AC_LANG_SOURCE([ void $wrtout() { } void $leave_new() { } void $timab() { } void $psp_from_data() { } int main(int argc, const char **argv) { ab6_invars_new_from_file_with_pseudo(); return 0; } ])], [ac_abinit_invars_has_new_with_pseudo=yes], [ac_abinit_invars_has_new_with_pseudo=no]) AC_MSG_RESULT([$ac_abinit_invars_has_new_with_pseudo]) AC_DEFINE([HAVE_NEW_WITH_PSEUDO], [], [If set, we can call ab6_invars_new_from_file_with_pseudo()]) fi dnl Look for the symmetries in libabinis. AC_MSG_CHECKING([for symmetry capabilities in lib$AB_LIBRARY.a from $AB_PATH_LIBDIR]) AC_LINK_IFELSE([AC_LANG_SOURCE([ void $wrtout() { } void $leave_new() { } void $timab() { } int main(int argc, const char **argv) { ab6_symmetry_new(); return 0; } ])], [ac_abinit_symmetry_ok=yes], [ac_abinit_symmetry_ok=no]) AC_MSG_RESULT([$ac_abinit_symmetry_ok]) dnl Look for specific functions in the symmetry routines. if test $ac_abinit_symmetry_ok = "yes" ; then AC_MSG_CHECKING([for symmetry.get_type() routine in lib$AB_LIBRARY.a]) AC_LINK_IFELSE([AC_LANG_SOURCE([ void $wrtout() { } void $leave_new() { } void $timab() { } int main(int argc, const char **argv) { ab6_symmetry_get_type(); return 0; } ])], [ac_abinit_symmetry_has_get_type=yes], [ac_abinit_symmetry_has_get_type=no]) AC_MSG_RESULT([$ac_abinit_symmetry_has_get_type]) AC_DEFINE([HAVE_SYM_GET_TYPE], [], [If set, we can call ab6_symmetry_get_type()]) fi LIBS=$LIBS_SVG CFLAGS=$CFLAGS_SVG AC_LANG_POP([C]) AS_IF([test "z$ac_abinit_parser_header" = "zyes" -a "z$ac_abinit_parser_ok" = "zyes"], [ac_abinit_parser=yes], [ac_abinit_parser=no]) AS_IF([test "z$ac_abinit_symmetry_header" = "zyes" -a "z$ac_abinit_symmetry_ok" = "zyes"], [ac_abinit_symmetry=yes], [ac_abinit_symmetry=no]) AS_IF([test "z$ac_abinit_symmetry" = "zyes" -o "z$ac_abinit_parser" = "zyes"], [ac_abinit="yes"; AB_LIBS="-L$AB_PATH_LIBDIR -l$AB_LIBRARY $LIBXC_LIBS $ETSF_IO_LIBS $LAPACK_LIBS $BLAS_LIBS"; AB_CPPFLAGS="-I$AB_PATH_INC"], [ac_abinit=no]) else ac_abinit=no fi ]) v_sim-3.7.0/m4/ax_check_gl.m40000644000353400050620000000602612215546054012602 00000000000000##### http://autoconf-archive.cryp.to/ax_check_gl.html # # SYNOPSIS # # AX_CHECK_GL # # DESCRIPTION # # Check for an OpenGL implementation. If GL is found, the required # compiler and linker flags are included in the output variables # "GL_CFLAGS" and "GL_LIBS", respectively. This macro adds the # configure option "--with-apple-opengl-framework", which users can # use to indicate that Apple's OpenGL framework should be used on Mac # OS X. If Apple's OpenGL framework is used, the symbol # "HAVE_APPLE_OPENGL_FRAMEWORK" is defined. If no GL implementation # is found, "no_gl" is set to "yes". # # LAST MODIFICATION # # 2004-11-15 # # COPYLEFT # # Copyright (c) 2004 Braden McDaniel # # Copying and distribution of this file, with or without # modification, are permitted in any medium without royalty provided # the copyright notice and this notice are preserved. AC_DEFUN([AX_CHECK_GL], [AC_REQUIRE([AC_PATH_X])dnl #AC_REQUIRE([ACX_PTHREAD])dnl # # There isn't a reliable way to know we should use the Apple OpenGL framework # without a configure option. A Mac OS X user may have installed an # alternative GL implementation (e.g., Mesa), which may or may not depend on X. # AC_ARG_WITH([apple-opengl-framework], [AC_HELP_STRING([--with-apple-opengl-framework], [use Apple OpenGL framework (Mac OS X only)])]) if test "X$with_apple_opengl_framework" = "Xyes"; then AC_DEFINE([HAVE_APPLE_OPENGL_FRAMEWORK], [1], [Use the Apple OpenGL framework.]) GL_LIBS="-framework OpenGL" else AC_LANG_PUSH(C) AX_LANG_COMPILER_MS if test X$ax_compiler_ms = Xno; then GL_CFLAGS="${PTHREAD_CFLAGS}" GL_LIBS="${PTHREAD_LIBS} -lm" fi # # Use x_includes and x_libraries if they have been set (presumably by # AC_PATH_X). # if test "X$no_x" != "Xyes"; then if test -n "$x_includes"; then GL_CFLAGS="-I${x_includes} ${GL_CFLAGS}" fi if test -n "$x_libraries"; then GL_LIBS="-L${x_libraries} -lX11 ${GL_LIBS}" fi fi AC_CHECK_HEADERS([windows.h]) AC_CACHE_CHECK([for OpenGL library], [ax_cv_check_gl_libgl], [ax_cv_check_gl_libgl="no" ax_save_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${GL_CFLAGS} ${CPPFLAGS}" ax_save_LIBS="${LIBS}" LIBS="" ax_check_libs="-lopengl32 -lGL" for ax_lib in ${ax_check_libs}; do if test X$ax_compiler_ms = Xyes; then ax_try_lib=`echo $ax_lib | sed -e 's/^-l//' -e 's/$/.lib/'` else ax_try_lib="${ax_lib}" fi LIBS="${ax_try_lib} ${GL_LIBS} ${ax_save_LIBS}" AC_LINK_IFELSE( [AC_LANG_PROGRAM([[ # if HAVE_WINDOWS_H && defined(_WIN32) # include # endif # include ]], [[glBegin(0)]])], [ax_cv_check_gl_libgl="${ax_try_lib}"; break]) done LIBS=${ax_save_LIBS} CPPFLAGS=${ax_save_CPPFLAGS}]) if test "X${ax_cv_check_gl_libgl}" = "Xno"; then no_gl="yes" GL_CFLAGS="" GL_LIBS="" else GL_LIBS="${ax_cv_check_gl_libgl} ${GL_LIBS}" fi AC_LANG_POP(C) fi AC_SUBST([GL_CFLAGS]) AC_SUBST([GL_LIBS]) ])dnl v_sim-3.7.0/m4/ax_check_glu.m40000644000353400050620000000472412215546054012772 00000000000000##### http://autoconf-archive.cryp.to/ax_check_glu.html # # SYNOPSIS # # AX_CHECK_GLU # # DESCRIPTION # # Check for GLU. If GLU is found, the required preprocessor and # linker flags are included in the output variables "GLU_CFLAGS" and # "GLU_LIBS", respectively. This macro adds the configure option # "--with-apple-opengl-framework", which users can use to indicate # that Apple's OpenGL framework should be used on Mac OS X. If # Apple's OpenGL framework is used, the symbol # "HAVE_APPLE_OPENGL_FRAMEWORK" is defined. If no GLU implementation # is found, "no_glu" is set to "yes". # # LAST MODIFICATION # # 2004-11-15 # # COPYLEFT # # Copyright (c) 2004 Braden McDaniel # # Copying and distribution of this file, with or without # modification, are permitted in any medium without royalty provided # the copyright notice and this notice are preserved. AC_DEFUN([AX_CHECK_GLU], [AC_REQUIRE([AX_CHECK_GL])dnl AC_REQUIRE([AC_PROG_CXX])dnl GLU_CFLAGS="${GL_CFLAGS}" if test "X${with_apple_opengl_framework}" != "Xyes"; then AC_CACHE_CHECK([for OpenGL Utility library], [ax_cv_check_glu_libglu], [ax_cv_check_glu_libglu="no" ax_save_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${GL_CFLAGS} ${CPPFLAGS}" ax_save_LIBS="${LIBS}" LIBS="" ax_check_libs="-lglu32 -lGLU" for ax_lib in ${ax_check_libs}; do if test X$ax_compiler_ms = Xyes; then ax_try_lib=`echo $ax_lib | sed -e 's/^-l//' -e 's/$/.lib/'` else ax_try_lib="${ax_lib}" fi LIBS="${ax_try_lib} ${GL_LIBS} ${ax_save_LIBS}" # # libGLU typically links with libstdc++ on POSIX platforms. However, # setting the language to C++ means that test program source is named # "conftest.cc"; and Microsoft cl doesn't know what to do with such a # file. # AC_LANG_PUSH([C++]) if test X$ax_compiler_ms = Xyes; then AC_LANG_PUSH([C]) fi AC_LINK_IFELSE( [AC_LANG_PROGRAM([[ # if HAVE_WINDOWS_H && defined(_WIN32) # include # endif # include ]], [[gluBeginCurve(0)]])], [ax_cv_check_glu_libglu="${ax_try_lib}"; break]) if test X$ax_compiler_ms = Xyes; then AC_LANG_POP([C]) fi AC_LANG_POP([C++]) done LIBS=${ax_save_LIBS} CPPFLAGS=${ax_save_CPPFLAGS}]) if test "X${ax_cv_check_glu_libglu}" = "Xno"; then no_glu="yes" GLU_CFLAGS="" GLU_LIBS="" else GLU_LIBS="${ax_cv_check_glu_libglu} ${GL_LIBS}" fi fi AC_SUBST([GLU_CFLAGS]) AC_SUBST([GLU_LIBS]) ]) v_sim-3.7.0/m4/ax_lang_compiler_ms.m40000644000353400050620000000172412215546054014355 00000000000000##### http://autoconf-archive.cryp.to/ax_lang_compiler_ms.html # # SYNOPSIS # # AX_LANG_COMPILER_MS # # DESCRIPTION # # Check whether the compiler for the current language is Microsoft. # # This macro is modeled after _AC_LANG_COMPILER_GNU in the GNU # Autoconf implementation. # # LAST MODIFICATION # # 2004-11-15 # # COPYLEFT # # Copyright (c) 2004 Braden McDaniel # # Copying and distribution of this file, with or without # modification, are permitted in any medium without royalty provided # the copyright notice and this notice are preserved. AC_DEFUN([AX_LANG_COMPILER_MS], [AC_CACHE_CHECK([whether we are using the Microsoft _AC_LANG compiler], [ax_cv_[]_AC_LANG_ABBREV[]_compiler_ms], [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [[#ifndef _MSC_VER choke me #endif ]])], [ax_compiler_ms=yes], [ax_compiler_ms=no]) ax_cv_[]_AC_LANG_ABBREV[]_compiler_ms=$ax_compiler_ms ])]) v_sim-3.7.0/m4/ax_lapack.m40000644000353400050620000001264312215546054012300 00000000000000AC_DEFUN([ACX_BLAS], [ AC_PREREQ(2.50) AC_REQUIRE([AC_F77_LIBRARY_LDFLAGS]) acx_blas_ok=no AC_ARG_WITH(blas, [AC_HELP_STRING([--with-blas=<lib>], [use BLAS library <lib>])]) case $with_blas in yes | "") ;; no) acx_blas_ok=disable ;; -* | */* | *.a | *.so | *.so.* | *.o) BLAS_LIBS="$with_blas" ;; *) BLAS_LIBS="-l$with_blas" ;; esac # Get fortran linker names of BLAS functions to check for. AC_F77_FUNC(sgemm) AC_F77_FUNC(dgemm) acx_blas_save_LIBS="$LIBS" LIBS="$LIBS $FLIBS" # First, check BLAS_LIBS environment variable if test $acx_blas_ok = no; then if test "x$BLAS_LIBS" != x; then save_LIBS="$LIBS"; LIBS="$BLAS_LIBS $LIBS" AC_MSG_CHECKING([for $sgemm in $BLAS_LIBS]) AC_TRY_LINK_FUNC($sgemm, [acx_blas_ok=yes], [BLAS_LIBS=""]) AC_MSG_RESULT($acx_blas_ok) LIBS="$save_LIBS" fi fi # BLAS linked to by default? (happens on some supercomputers) if test $acx_blas_ok = no; then save_LIBS="$LIBS"; LIBS="$LIBS" AC_CHECK_FUNC($sgemm, [acx_blas_ok=yes]) LIBS="$save_LIBS" fi # BLAS in ATLAS library? (http://math-atlas.sourceforge.net/) if test $acx_blas_ok = no; then AC_CHECK_LIB(atlas, ATL_xerbla, [AC_CHECK_LIB(f77blas, $sgemm, [AC_CHECK_LIB(cblas, cblas_dgemm, [acx_blas_ok=yes BLAS_LIBS="-lcblas -lf77blas -latlas"], [], [-lf77blas -latlas])], [], [-latlas])]) fi # BLAS in PhiPACK libraries? (requires generic BLAS lib, too) if test $acx_blas_ok = no; then AC_CHECK_LIB(blas, $sgemm, [AC_CHECK_LIB(dgemm, $dgemm, [AC_CHECK_LIB(sgemm, $sgemm, [acx_blas_ok=yes; BLAS_LIBS="-lsgemm -ldgemm -lblas"], [], [-lblas])], [], [-lblas])]) fi # BLAS in Alpha CXML library? if test $acx_blas_ok = no; then AC_CHECK_LIB(cxml, $sgemm, [acx_blas_ok=yes;BLAS_LIBS="-lcxml"]) fi # BLAS in Alpha DXML library? (now called CXML, see above) if test $acx_blas_ok = no; then AC_CHECK_LIB(dxml, $sgemm, [acx_blas_ok=yes;BLAS_LIBS="-ldxml"]) fi # BLAS in Sun Performance library? if test $acx_blas_ok = no; then if test "x$GCC" != xyes; then # only works with Sun CC AC_CHECK_LIB(sunmath, acosp, [AC_CHECK_LIB(sunperf, $sgemm, [BLAS_LIBS="-xlic_lib=sunperf -lsunmath" acx_blas_ok=yes],[],[-lsunmath])]) fi fi # BLAS in SCSL library? (SGI/Cray Scientific Library) if test $acx_blas_ok = no; then AC_CHECK_LIB(scs, $sgemm, [acx_blas_ok=yes; BLAS_LIBS="-lscs"]) fi # BLAS in SGIMATH library? if test $acx_blas_ok = no; then AC_CHECK_LIB(complib.sgimath, $sgemm, [acx_blas_ok=yes; BLAS_LIBS="-lcomplib.sgimath"]) fi # BLAS in IBM ESSL library? (requires generic BLAS lib, too) if test $acx_blas_ok = no; then AC_CHECK_LIB(blas, $sgemm, [AC_CHECK_LIB(essl, $sgemm, [acx_blas_ok=yes; BLAS_LIBS="-lessl -lblas"], [], [-lblas $FLIBS])]) fi # Generic BLAS library? if test $acx_blas_ok = no; then AC_CHECK_LIB(blas, $sgemm, [acx_blas_ok=yes; BLAS_LIBS="-lblas"]) fi AC_SUBST(BLAS_LIBS) LIBS="$acx_blas_save_LIBS" # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$acx_blas_ok" = xyes; then ifelse([$1],,AC_DEFINE(HAVE_BLAS,1,[Define if you have a BLAS library.]),[$1]) : else acx_blas_ok=no $2 fi ])dnl ACX_BLAS AC_DEFUN([ACX_LAPACK], [ AC_REQUIRE([ACX_BLAS]) acx_lapack_ok=no AC_ARG_WITH(lapack, [AC_HELP_STRING([--with-lapack=<lib>], [use LAPACK library <lib>])]) case $with_lapack in yes | "") ;; no) acx_lapack_ok=disable ;; -* | */* | *.a | *.so | *.so.* | *.o) LAPACK_LIBS="$with_lapack" ;; *) LAPACK_LIBS="-l$with_lapack" ;; esac # Get fortran linker name of LAPACK function to check for. AC_F77_FUNC(cheev) # We cannot use LAPACK if BLAS is not found if test "x$acx_blas_ok" != xyes; then acx_lapack_ok=noblas fi # First, check LAPACK_LIBS environment variable if test "x$LAPACK_LIBS" != x; then save_LIBS="$LIBS"; LIBS="$LAPACK_LIBS $BLAS_LIBS $LIBS $FLIBS" AC_MSG_CHECKING([for $cheev in $LAPACK_LIBS]) AC_TRY_LINK_FUNC($cheev, [acx_lapack_ok=yes], [LAPACK_LIBS=""]) AC_MSG_RESULT($acx_lapack_ok) LIBS="$save_LIBS" if test acx_lapack_ok = no; then LAPACK_LIBS="" fi fi # LAPACK linked to by default? (is sometimes included in BLAS lib) if test $acx_lapack_ok = no; then save_LIBS="$LIBS"; LIBS="$LIBS $BLAS_LIBS $FLIBS" AC_CHECK_FUNC($cheev, [acx_lapack_ok=yes]) LIBS="$save_LIBS" fi # Generic LAPACK library? for lapack in lapack lapack_rs6k; do if test $acx_lapack_ok = no; then save_LIBS="$LIBS"; LIBS="$BLAS_LIBS $LIBS" AC_CHECK_LIB($lapack, $cheev, [acx_lapack_ok=yes; LAPACK_LIBS="-l$lapack"], [], [$FLIBS]) LIBS="$save_LIBS" fi done AC_SUBST(LAPACK_LIBS) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$acx_lapack_ok" = xyes; then ifelse([$1],,AC_DEFINE(HAVE_LAPACK,1,[Define if you have LAPACK library.]),[$1]) : else acx_lapack_ok=no $2 fi ])dnl ACX_LAPACK v_sim-3.7.0/m4/bigdft.m40000644000353400050620000000434212216275117011611 00000000000000AC_DEFUN([AX_CHECK_BIGDFT], [ AC_MSG_CHECKING([for BigDFT support]) AC_ARG_WITH([bigdft], [AS_HELP_STRING([--with-bigdft=ARG],[BigDFT directory (with include and lib subdirs)])], [BIGDFT_PATH=$withval], [BIGDFT_PATH="no"]) AC_ARG_WITH([bigdft_include], [AS_HELP_STRING([--with-bigdft-include=ARG],[specific BigDFT include directory])], [BIGDFT_PATH_INC=$withval], [BIGDFT_PATH_INC=""]) AC_ARG_WITH([bigdft_libdir], [AS_HELP_STRING([--with-bigdft-libdir=ARG],[specific BigDFT library directory])], [BIGDFT_PATH_LIBDIR=$withval], [BIGDFT_PATH_LIBDIR=""]) AC_MSG_RESULT($BIGDFT_PATH) if test "z$BIGDFT_PATH" != "zno" ; then AS_IF([test "z$BIGDFT_PATH" = "zyes"],[BIGDFT_PATH="/opt/etsf/bigdft"]) AS_IF([test "z$BIGDFT_PATH_LIBDIR" = "z"],[BIGDFT_PATH_LIBDIR="$BIGDFT_PATH/lib"]) AS_IF([test "z$BIGDFT_PATH_INC" = "z"],[BIGDFT_PATH_INC="$BIGDFT_PATH/include"]) PKG_CHECK_MODULES(GLIB_BIGDFT, glib-2.0 gobject-2.0 gthread-2.0 gio-2.0 >= 2.22) dnl First thing is to test the header file. CPPFLAGS_SVG=$CPPFLAGS CPPFLAGS="$CPPFLAGS -I$BIGDFT_PATH_INC $GLIB_BIGDFT_CFLAGS" AC_CHECK_HEADER([bigdft.h], [ac_bigdft_header="yes"], [ac_bigdft_header="no"]) CPPFLAGS=$CPPFLAGS_SVG dnl Try to find the missing dependencies in libabinis.a. AC_FC_WRAPPERS() AC_LANG_PUSH([C]) dnl Look for the wavefunction functions in libbigdft.a. AC_MSG_CHECKING([for wavefunctions in libbigdft-1.so from $BIGDFT_PATH_LIBDIR]) CFLAGS_SVG=$CFLAGS CFLAGS="$CFLAGS -Wno-error" LIBS_SVG=$LIBS BIGDFT_LIBS="-L$BIGDFT_PATH_LIBDIR -lbigdft-1" LIBS="$LIBS_SVG $BIGDFT_LIBS" AC_LINK_IFELSE([AC_LANG_SOURCE([ int main(int argc, const char **argv) { bigdft_read_wave_descr(); return 0; } ])], [ac_bigdft_ok=yes], [ac_bigdft_ok=no]) LIBS=$LIBS_SVG CFLAGS=$CFLAGS_SVG AC_MSG_RESULT([$ac_bigdft_ok]) AC_LANG_POP([C]) AS_IF([test "z$ac_bigdft_header" = "zyes" -a "z$ac_bigdft_ok" = "zyes"], [ac_bigdft=yes; BIGDFT_CPPFLAGS="-I$BIGDFT_PATH_INC"], [ac_bigdft=no; BIGDFT_LIBS=""]) else ac_bigdft=no fi ]) v_sim-3.7.0/m4/etsf_io.m40000644000353400050620000000552212215546054012003 00000000000000dnl example of use dnl AC_CHECK_ETSF_IO( dnl [ dnl LIBS="$LIBS $ETSF_IO_LIBS" dnl LDFLAGS="$LDFLAGS $ETSF_IO_LDFLAGS" dnl CPPFLAGS="$CPPFLAGS $ETSF_IO_CPPFLAGS" dnl ], dnl [ dnl echo "*** Use --with-etsf-io for the root etsf_io directory." dnl echo "*** Otherwise use --with-etsf-io-include switch for includes directory" dnl echo "*** and --with-etsf-io-libdir switch for libraries directory." dnl AC_MSG_ERROR([etsf_io library and etsf_io headers are required.]) dnl ] dnl ) # Check for the etsf_io library. # AC_CHECK_ETSF_IO([ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND],[INTERFACE-NR]) # if interface number is given, check for a specific interface # sets ETSF_IO_LDFLAGS, ETSF_IO_LIBS, and, by calling other macros # ETSF_IO_CPPFLAGS and maybe ETSF_IO_ETSF_IO_3_CPPFLAG AC_DEFUN([AC_CHECK_ETSF_IO], [ AC_REQUIRE([AC_CHECK_NETCDF]) AC_ARG_WITH([etsf_io], [AS_HELP_STRING([--with-etsf-io=ARG],[etsf_io directory])], [ETSF_IO_PATH=$withval], [ETSF_IO_PATH=""]) AC_ARG_WITH([etsf_io_include], [AS_HELP_STRING([--with-etsf-io-include=ARG],[etsf_io include directory])], [ETSF_IO_PATH_INC=$withval], [ETSF_IO_PATH_INC=""]) AC_ARG_WITH([etsf_io_libdir], [AS_HELP_STRING([--with-etsf-io-libdir=ARG],[etsf_io library directory])], [ETSF_IO_PATH_LIBDIR=$withval], [ETSF_IO_PATH_LIBDIR=""]) AS_IF([test "z$ETSF_IO_PATH" != "z"],[ AS_IF([test "z$ETSF_IO_PATH_LIBDIR" = "z"],[ETSF_IO_PATH_LIBDIR="$ETSF_IO_PATH/lib"]) AS_IF([test "z$ETSF_IO_PATH_INC" = "z"],[ETSF_IO_PATH_INC="$ETSF_IO_PATH/include"]) ]) ac_etsf_io_ok='no' ETSF_IO_LIBS= AC_LANG_PUSH(Fortran) AC_FC_SRCEXT(f90) LDFLAGS_SVG="$LDFLAGS" LIBS_SVG="$LIBS" FCFLAGS_SVG="$FCFLAGS" AS_IF([test -n "$ETSF_IO_PATH_LIBDIR"], [LDFLAGS="$LDFLAGS -L$ETSF_IO_PATH_LIBDIR"]) AS_IF([test -n "$ETSF_IO_PATH_INC"], [FCFLAGS="$FCFLAGS -I$ETSF_IO_PATH_INC"]) AS_IF([test -n "$NC_LDFLAGS"], [LDFLAGS="$LDFLAGS $NC_LDFLAGS"]) AS_IF([test -n "$NC_CPPFLAGS"], [FCFLAGS="$FCFLAGS $NC_CPPFLAGS"]) LIBS="$LIBS -letsf_io -lnetcdff $NC_LIBS" AC_MSG_CHECKING([for ETSF_IO library]) AC_LINK_IFELSE([[ program main use etsf_io type(etsf_groups_flags) :: groups type(etsf_dims) :: dims logical :: lstat type(etsf_io_low_error) :: error_data call etsf_io_data_init("test", groups, dims, "test", "", lstat, error_data) end]], ac_etsf_io_ok=yes, ac_etsf_io_ok=no) AC_MSG_RESULT([$ac_etsf_io_ok]) LIBS="$LIBS_SVG" LDFLAGS="$LDFLAGS_SVG" FCFLAGS="$FCFLAGS_SVG" if test "$ac_etsf_io_ok" = "yes"; then ETSF_IO_LIBS="-letsf_io_utils -letsf_io -lnetcdff $NC_LIBS" AS_IF([test -n "$ETSF_IO_PATH_LIBDIR"], [ETSF_IO_LIBS="-L$ETSF_IO_PATH_LIBDIR $ETSF_IO_LIBS"]) AC_SUBST([ETSF_IO_LIBS]) fi AC_LANG_POP(Fortran) ]) v_sim-3.7.0/m4/gtk-doc.m40000644000353400050620000000461112215546515011703 00000000000000dnl -*- mode: autoconf -*- # serial 1 dnl Usage: dnl GTK_DOC_CHECK([minimum-gtk-doc-version]) AC_DEFUN([GTK_DOC_CHECK], [ AC_REQUIRE([PKG_PROG_PKG_CONFIG]) AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first dnl check for tools we added during development AC_PATH_PROG([GTKDOC_CHECK],[gtkdoc-check]) AC_PATH_PROGS([GTKDOC_REBASE],[gtkdoc-rebase],[true]) AC_PATH_PROG([GTKDOC_MKPDF],[gtkdoc-mkpdf]) dnl for overriding the documentation installation directory AC_ARG_WITH([html-dir], AS_HELP_STRING([--with-html-dir=PATH], [path to installed docs]),, [with_html_dir='${datadir}/gtk-doc/html']) HTML_DIR="$with_html_dir" AC_SUBST([HTML_DIR]) dnl enable/disable documentation building AC_ARG_ENABLE([gtk-doc], AS_HELP_STRING([--enable-gtk-doc], [use gtk-doc to build documentation [[default=no]]]),, [enable_gtk_doc=no]) if test x$enable_gtk_doc = xyes; then ifelse([$1],[], [PKG_CHECK_EXISTS([gtk-doc],, AC_MSG_ERROR([gtk-doc not installed and --enable-gtk-doc requested]))], [PKG_CHECK_EXISTS([gtk-doc >= $1],, AC_MSG_ERROR([You need to have gtk-doc >= $1 installed to build $PACKAGE_NAME]))]) dnl don't check for glib if we build glib if test "x$PACKAGE_NAME" != "xglib"; then dnl don't fail if someone does not have glib PKG_CHECK_MODULES(GTKDOC_DEPS, glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0,,) fi fi AC_MSG_CHECKING([whether to build gtk-doc documentation]) AC_MSG_RESULT($enable_gtk_doc) dnl enable/disable output formats AC_ARG_ENABLE([gtk-doc-html], AS_HELP_STRING([--enable-gtk-doc-html], [build documentation in html format [[default=yes]]]),, [enable_gtk_doc_html=yes]) AC_ARG_ENABLE([gtk-doc-pdf], AS_HELP_STRING([--enable-gtk-doc-pdf], [build documentation in pdf format [[default=no]]]),, [enable_gtk_doc_pdf=no]) if test -z "$GTKDOC_MKPDF"; then enable_gtk_doc_pdf=no fi AM_CONDITIONAL([ENABLE_GTK_DOC], [test x$enable_gtk_doc = xyes]) AM_CONDITIONAL([GTK_DOC_BUILD_HTML], [test x$enable_gtk_doc_html = xyes]) AM_CONDITIONAL([GTK_DOC_BUILD_PDF], [test x$enable_gtk_doc_pdf = xyes]) AM_CONDITIONAL([GTK_DOC_USE_LIBTOOL], [test -n "$LIBTOOL"]) AM_CONDITIONAL([GTK_DOC_USE_REBASE], [test -n "$GTKDOC_REBASE"]) ]) v_sim-3.7.0/m4/intltool.m40000644000353400050620000002772412215546512012226 00000000000000## intltool.m4 - Configure intltool for the target system. -*-Shell-script-*- ## Copyright (C) 2001 Eazel, Inc. ## Author: Maciej Stachowiak ## Kenneth Christiansen ## ## 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. ## ## As a special exception to the GNU General Public License, if you ## distribute this file as part of a program that contains a ## configuration script generated by Autoconf, you may include it under ## the same distribution terms that you use for the rest of that program. dnl IT_PROG_INTLTOOL([MINIMUM-VERSION], [no-xml]) # serial 42 IT_PROG_INTLTOOL AC_DEFUN([IT_PROG_INTLTOOL], [ AC_PREREQ([2.50])dnl AC_REQUIRE([AM_NLS])dnl case "$am__api_version" in 1.[01234]) AC_MSG_ERROR([Automake 1.5 or newer is required to use intltool]) ;; *) ;; esac INTLTOOL_REQUIRED_VERSION_AS_INT=`echo $1 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` if test -n "$1"; then AC_MSG_CHECKING([for intltool >= $1]) AC_MSG_RESULT([$INTLTOOL_APPLIED_VERSION found]) test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || AC_MSG_ERROR([Your intltool is too old. You need intltool $1 or later.]) fi AC_PATH_PROG(INTLTOOL_UPDATE, [intltool-update]) AC_PATH_PROG(INTLTOOL_MERGE, [intltool-merge]) AC_PATH_PROG(INTLTOOL_EXTRACT, [intltool-extract]) if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then AC_MSG_ERROR([The intltool scripts were not found. Please install intltool.]) fi if test -z "$AM_DEFAULT_VERBOSITY"; then AM_DEFAULT_VERBOSITY=1 fi AC_SUBST([AM_DEFAULT_VERBOSITY]) INTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))' INTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))' INTLTOOL__v_MERGE_0='@echo " ITMRG " [$]@;' AC_SUBST(INTLTOOL_V_MERGE) AC_SUBST(INTLTOOL__v_MERGE_) AC_SUBST(INTLTOOL__v_MERGE_0) INTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))' intltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))' intltool__v_merge_options_0='-q' AC_SUBST(INTLTOOL_V_MERGE_OPTIONS) AC_SUBST(intltool__v_merge_options_) AC_SUBST(intltool__v_merge_options_0) INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -p $(top_srcdir)/po $< [$]@' INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' if test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge 5000; then INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u --no-translations $< [$]@' else INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)_it_tmp_dir=tmp.intltool.[$][$]RANDOM && mkdir [$][$]_it_tmp_dir && LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u [$][$]_it_tmp_dir $< [$]@ && rmdir [$][$]_it_tmp_dir' fi INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' _IT_SUBST(INTLTOOL_DESKTOP_RULE) _IT_SUBST(INTLTOOL_DIRECTORY_RULE) _IT_SUBST(INTLTOOL_KEYS_RULE) _IT_SUBST(INTLTOOL_PROP_RULE) _IT_SUBST(INTLTOOL_OAF_RULE) _IT_SUBST(INTLTOOL_PONG_RULE) _IT_SUBST(INTLTOOL_SERVER_RULE) _IT_SUBST(INTLTOOL_SHEET_RULE) _IT_SUBST(INTLTOOL_SOUNDLIST_RULE) _IT_SUBST(INTLTOOL_UI_RULE) _IT_SUBST(INTLTOOL_XAM_RULE) _IT_SUBST(INTLTOOL_KBD_RULE) _IT_SUBST(INTLTOOL_XML_RULE) _IT_SUBST(INTLTOOL_XML_NOMERGE_RULE) _IT_SUBST(INTLTOOL_CAVES_RULE) _IT_SUBST(INTLTOOL_SCHEMAS_RULE) _IT_SUBST(INTLTOOL_THEME_RULE) _IT_SUBST(INTLTOOL_SERVICE_RULE) _IT_SUBST(INTLTOOL_POLICY_RULE) # Check the gettext tools to make sure they are GNU AC_PATH_PROG(XGETTEXT, xgettext) AC_PATH_PROG(MSGMERGE, msgmerge) AC_PATH_PROG(MSGFMT, msgfmt) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) fi xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) fi AC_PATH_PROG(INTLTOOL_PERL, perl) if test -z "$INTLTOOL_PERL"; then AC_MSG_ERROR([perl not found]) fi AC_MSG_CHECKING([for perl >= 5.8.1]) $INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 if test $? -ne 0; then AC_MSG_ERROR([perl 5.8.1 is required for intltool]) else IT_PERL_VERSION=`$INTLTOOL_PERL -e "printf '%vd', $^V"` AC_MSG_RESULT([$IT_PERL_VERSION]) fi if test "x$2" != "xno-xml"; then AC_MSG_CHECKING([for XML::Parser]) if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then AC_MSG_RESULT([ok]) else AC_MSG_ERROR([XML::Parser perl module is required for intltool]) fi fi # Substitute ALL_LINGUAS so we can use it in po/Makefile AC_SUBST(ALL_LINGUAS) # Set DATADIRNAME correctly if it is not set yet # (copied from glib-gettext.m4) if test -z "$DATADIRNAME"; then AC_LINK_IFELSE( [AC_LANG_PROGRAM([[]], [[extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr]])], [DATADIRNAME=share], [case $host in *-*-solaris*) dnl On Solaris, if bind_textdomain_codeset is in libc, dnl GNU format message catalog is always supported, dnl since both are added to the libc all together. dnl Hence, we'd like to go with DATADIRNAME=share dnl in this case. AC_CHECK_FUNC(bind_textdomain_codeset, [DATADIRNAME=share], [DATADIRNAME=lib]) ;; *) [DATADIRNAME=lib] ;; esac]) fi AC_SUBST(DATADIRNAME) IT_PO_SUBDIR([po]) ]) # IT_PO_SUBDIR(DIRNAME) # --------------------- # All po subdirs have to be declared with this macro; the subdir "po" is # declared by IT_PROG_INTLTOOL. # AC_DEFUN([IT_PO_SUBDIR], [AC_PREREQ([2.53])dnl We use ac_top_srcdir inside AC_CONFIG_COMMANDS. dnl dnl The following CONFIG_COMMANDS should be executed at the very end dnl of config.status. AC_CONFIG_COMMANDS_PRE([ AC_CONFIG_COMMANDS([$1/stamp-it], [ if [ ! grep "^# INTLTOOL_MAKEFILE$" "$1/Makefile.in" > /dev/null ]; then AC_MSG_ERROR([$1/Makefile.in.in was not created by intltoolize.]) fi rm -f "$1/stamp-it" "$1/stamp-it.tmp" "$1/POTFILES" "$1/Makefile.tmp" >"$1/stamp-it.tmp" [sed '/^#/d s/^[[].*] *// /^[ ]*$/d '"s|^| $ac_top_srcdir/|" \ "$srcdir/$1/POTFILES.in" | sed '$!s/$/ \\/' >"$1/POTFILES" ] [sed '/^POTFILES =/,/[^\\]$/ { /^POTFILES =/!d r $1/POTFILES } ' "$1/Makefile.in" >"$1/Makefile"] rm -f "$1/Makefile.tmp" mv "$1/stamp-it.tmp" "$1/stamp-it" ]) ])dnl ]) # _IT_SUBST(VARIABLE) # ------------------- # Abstract macro to do either _AM_SUBST_NOTMAKE or AC_SUBST # AC_DEFUN([_IT_SUBST], [ AC_SUBST([$1]) m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([$1])]) ] ) # deprecated macros AU_ALIAS([AC_PROG_INTLTOOL], [IT_PROG_INTLTOOL]) # A hint is needed for aclocal from Automake <= 1.9.4: # AC_DEFUN([AC_PROG_INTLTOOL], ...) v_sim-3.7.0/m4/libtool.m40000644000353400050620000106043412215546512012022 00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi _LT_TAGVAR(link_all_deplibs, $1)=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS v_sim-3.7.0/m4/libxc.m40000644000353400050620000000470612215546053011456 00000000000000dnl example of use dnl AC_CHECK_LIBXC( dnl [ dnl LIBS="$LIBS $LIBXC_LIBS" dnl LDFLAGS="$LDFLAGS $LIBXC_LDFLAGS" dnl CPPFLAGS="$CPPFLAGS $LIBXC_CPPFLAGS" dnl ], dnl [ dnl echo "*** Use --with-libxc for the root libxc directory." dnl echo "*** Otherwise use --with-libxc-include switch for includes directory" dnl echo "*** and --with-libxc-libdir switch for libraries directory." dnl AC_MSG_ERROR([libxc library and libxc headers are required.]) dnl ] dnl ) # Check for the libxc library. # AC_CHECK_LIBXC([ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND],[INTERFACE-NR]) # if interface number is given, check for a specific interface # sets LIBXC_LDFLAGS, LIBXC_LIBS, and, by calling other macros # LIBXC_CPPFLAGS and maybe LIBXC_LIBXC_3_CPPFLAG AC_DEFUN([AC_CHECK_LIBXC], [ AC_ARG_WITH([libxc], [AS_HELP_STRING([--with-libxc=ARG],[libxc directory])], [LIBXC_PATH=$withval], [LIBXC_PATH=""]) AC_ARG_WITH([libxc_include], [AS_HELP_STRING([--with-libxc-include=ARG],[libxc include directory])], [LIBXC_PATH_INC=$withval], [LIBXC_PATH_INC=""]) AC_ARG_WITH([libxc_libdir], [AS_HELP_STRING([--with-libxc-libdir=ARG],[libxc library directory])], [LIBXC_PATH_LIBDIR=$withval], [LIBXC_PATH_LIBDIR=""]) AS_IF([test "z$LIBXC_PATH" != "z"],[ AS_IF([test "z$LIBXC_PATH_LIBDIR" = "z"],[LIBXC_PATH_LIBDIR="$LIBXC_PATH/lib"]) AS_IF([test "z$LIBXC_PATH_INC" = "z"],[LIBXC_PATH_INC="$LIBXC_PATH/include"]) ]) ac_libxc_ok='no' LIBXC_LIBS= AC_LANG_PUSH(Fortran) AC_FC_SRCEXT(f90) LDFLAGS_SVG="$LDFLAGS" LIBS_SVG="$LIBS" FCFLAGS_SVG="$FCFLAGS" AS_IF([test -n "$LIBXC_PATH_LIBDIR"], [LDFLAGS="$LDFLAGS -L$LIBXC_PATH_LIBDIR"]) AS_IF([test -n "$LIBXC_PATH_INC"], [FCFLAGS="$FCFLAGS -I$LIBXC_PATH_INC"]) AS_IF([test -n "$NC_LDFLAGS"], [LDFLAGS="$LDFLAGS $NC_LDFLAGS"]) AS_IF([test -n "$NC_CPPFLAGS"], [FCFLAGS="$FCFLAGS $NC_CPPFLAGS"]) LIBS="$LIBS -lxc" AC_MSG_CHECKING([for LIBXC library]) AC_LINK_IFELSE([[ program main call xc_f90_family_from_id() end]], ac_libxc_ok=yes, ac_libxc_ok=no) AC_MSG_RESULT([$ac_libxc_ok]) LIBS="$LIBS_SVG" LDFLAGS="$LDFLAGS_SVG" FCFLAGS="$FCFLAGS_SVG" if test "$ac_libxc_ok" = "yes"; then LIBXC_LIBS="-lxc" AS_IF([test -n "$LIBXC_PATH_LIBDIR"], [LIBXC_LIBS="-L$LIBXC_PATH_LIBDIR $LIBXC_LIBS"]) AC_SUBST([LIBXC_LIBS]) fi AC_LANG_POP(Fortran) ]) v_sim-3.7.0/m4/ltoptions.m40000644000353400050620000003007312215546512012404 00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) v_sim-3.7.0/m4/ltsugar.m40000644000353400050620000001042412215546512012030 00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) v_sim-3.7.0/m4/ltversion.m40000644000353400050620000000126212215546512012374 00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) v_sim-3.7.0/m4/lt~obsolete.m40000644000353400050620000001375612215546512012734 00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) v_sim-3.7.0/m4/netcdf.m40000644000353400050620000001714312215546054011620 00000000000000dnl example of use dnl AC_CHECK_NETCDF( dnl [ dnl LIBS="$LIBS $NC_LIBS" dnl LDFLAGS="$LDFLAGS $NC_LDFLAGS" dnl CPPFLAGS="$CPPFLAGS $NC_CPPFLAGS" dnl ], dnl [ dnl echo "*** Use --with-netcdf for the root netcdf directory." dnl echo "*** Otherwise use --with-netcdf-include switch for includes directory" dnl echo "*** and --with-netcdf-libdir switch for libraries directory." dnl AC_MSG_ERROR([netcdf library and netcdf headers are required.]) dnl ] dnl ) # Check for the netcdf library. # AC_CHECK_NETCDF([ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND],[INTERFACE-NR]) # if interface number is given, check for a specific interface # sets NC_LDFLAGS, NC_LIBS, and, by calling other macros # NC_CPPFLAGS and maybe NC_NETCDF_3_CPPFLAG AC_DEFUN([AC_CHECK_NETCDF], [ AC_ARG_WITH([netcdf], [AS_HELP_STRING([--with-netcdf=ARG],[netcdf directory])], [NC_PATH=$withval], [NC_PATH=""]) AC_ARG_WITH([netcdf_include], [AS_HELP_STRING([--with-netcdf-include=ARG],[netcdf include directory])], [NC_PATH_INC=$withval], [NC_PATH_INC=""]) AC_ARG_WITH([netcdf_libdir], [AS_HELP_STRING([--with-netcdf-libdir=ARG],[netcdf library directory])], [NC_PATH_LIBDIR=$withval], [NC_PATH_LIBDIR=""]) AS_IF([test "z$NC_PATH" != "z"], [ AS_IF([test "z$NC_PATH_LIBDIR" = "z"],[NC_PATH_LIBDIR="$NC_PATH/lib"]) AS_IF([test "z$NC_PATH_INC" = "z"],[NC_PATH_INC="$NC_PATH/include"]) ]) ac_netcdf_ok='no' NC_LIBS= NC_LDFLAGS= ac_nc_save_LDFLAGS=$LDFLAGS ac_nc_save_LIBS=$LIBS ac_check_nc_func_checked='ncopen' ac_check_nc_interface= dnl the interface number isn't quoted with "" otherwise a newline dnl following the number isn't stripped. m4_if([$3],[],[ac_check_nc_interface=2],[ac_check_nc_interface=$3]) AS_IF([test "z$ac_check_nc_interface" = 'z3'], [ac_check_nc_func_checked='nc_open']) AS_IF([test "z$NC_PATH_LIBDIR" != "z"], [ NC_LDFLAGS="-L$NC_PATH_LIBDIR" LDFLAGS="$LDFLAGS $NC_LDFLAGS" dnl the autoconf internal cache isn't avoided because we really check for dnl libnetcdf, other libraries that implement the same api have other names dnl AC_LINK_IFELSE([AC_LANG_CALL([],[$ac_check_func_checked])], AC_CHECK_LIB([netcdf],[$ac_check_nc_func_checked], [ NC_LIBS='-lnetcdf' ac_netcdf_ok='yes' ]) ], [ for ac_netcdf_libdir in "" \ /usr/local/netcdf-${ac_check_nc_interface}/lib \ /opt/netcdf-${ac_check_nc_interface}/lib \ /usr/netcdf-${ac_check_nc_interface}/lib \ /usr/local/lib/netcdf-${ac_check_nc_interface} \ /opt/lib/netcdf-${ac_check_nc_interface} \ /usr/lib/netcdf-${ac_check_nc_interface} \ /usr/local/netcdf/lib /opt/netcdf/lib \ /usr/netcdf/lib /usr/local/lib/netcdf /opt/lib/netcdf \ /usr/lib/netcdf ; do AS_IF([test "z$ac_netcdf_libdir" = 'z'], [NC_LDFLAGS=], [ AC_MSG_CHECKING([for netcdf libraries in $ac_netcdf_libdir]) NC_LDFLAGS="-L$ac_netcdf_libdir" ]) LDFLAGS="$LDFLAGS $NC_LDFLAGS" LIBS="$LIBS -lnetcdf" dnl we have to avoid the autoconf internal cache in that case AC_LINK_IFELSE([AC_LANG_CALL([],[$ac_check_nc_func_checked])], [ NC_LIBS='-lnetcdf' ac_netcdf_ok='yes' AS_IF([test "z$ac_netcdf_libdir" != 'z'],[AC_MSG_RESULT([yes])]) ], [ AS_IF([test "z$ac_netcdf_libdir" != 'z'],[AC_MSG_RESULT([no])]) ]) AS_IF([test $ac_netcdf_ok = 'yes'],[break]) LDFLAGS=$ac_nc_save_LDFLAGS LIBS=$ac_nc_save_LIBS done ]) LDFLAGS=$ac_nc_save_LDFLAGS LIBS=$ac_nc_save_LIBS AC_SUBST([NC_LDFLAGS]) AC_SUBST([NC_LIBS]) ac_netcdf_header='no' AS_IF([test "z$NC_PATH_INC" != "z"], [ AC_CHECK_NETCDF_HEADER([$NC_PATH_INC], [ac_netcdf_header='yes'], [ac_netcdf_header='no'], [$ac_check_nc_interface]) ], [ for ac_netcdf_incdir in "" \ /usr/local/netcdf-${ac_check_nc_interface}/include \ /opt/netcdf-${ac_check_nc_interface}/include \ /usr/netcdf-${ac_check_nc_interface}/include \ /usr/local/include/netcdf-${ac_check_nc_interface} \ /opt/include/netcdf-${ac_check_nc_interface} \ /usr/include/netcdf-${ac_check_nc_interface} \ /usr/local/netcdf/include \ /opt/netcdf/include /usr/netcdf/include /usr/local/include/netcdf \ /opt/include/netcdf /usr/include/netcdf ; do AC_MSG_NOTICE([searching netcdf includes in $ac_netcdf_incdir]) AC_CHECK_NETCDF_HEADER([$ac_netcdf_incdir],[ac_netcdf_header='yes'], [ac_netcdf_header='no'],[$ac_check_nc_interface]) AS_IF([test $ac_netcdf_header = 'yes'],[break]) done ]) AS_IF([test "$ac_netcdf_ok" = 'no' -o "$ac_netcdf_header" = 'no'], [m4_if([$2], [], [:], [$2])], [m4_if([$1], [], [:], [$1])]) ]) # Check for the netcdf header. # AC_CHECK_NETCDF_HEADER([INCLUDE-DIR],[ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND],[INTERFACE-NR]) # if interface number is given, check for a specific interface # sets NC_CPPFLAGS and maybe NC_NETCDF_3_CPPFLAG AC_DEFUN([AC_CHECK_NETCDF_HEADER], [ NC_CPPFLAGS= ac_netcdf_h='no' ac_netcdf_h_compile='no' ac_netcdf_h_preproc='no' ac_nc_include_dir= ac_nc_header_interface= ac_nc_save_CPPFLAGS=$CPPFLAGS m4_if([$1],[],[:],[ ac_nc_include_dir="$1" AS_IF([test "z$ac_nc_include_dir" != "z"], [CPPFLAGS="$CPPFLAGS -I$ac_nc_include_dir"]) ]) m4_if([$4],[],[:],[ac_nc_header_interface=$4]) dnl dont use AC_CHECK_HEADERS to avoid autoconf internal caching AC_MSG_CHECKING([for netcdf.h with compiler]) AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include ]])], [ AC_MSG_RESULT([yes]) ac_netcdf_h_compile='yes' ], [ AC_MSG_RESULT([no]) ac_netcdf_h_compile='no' ]) AC_MSG_CHECKING([for netcdf.h with preprocessor]) AC_PREPROC_IFELSE([AC_LANG_SOURCE([[#include ]])], [ AC_MSG_RESULT([yes]) ac_netcdf_h_preproc='yes' ], [ AC_MSG_RESULT([no]) ac_netcdf_h_preproc='no' ]) CPPFLAGS="$ac_nc_save_CPPFLAGS" AS_IF([test $ac_netcdf_h_compile = 'yes'], [ac_netcdf_h='yes' AS_IF([test "z$ac_nc_header_interface" = 'z3'], [AC_CHECK_NETCDF_3_HEADER([$1], [ac_netcdf_h='yes'],[ac_netcdf_h='no'])]) ]) AS_IF([test "$ac_netcdf_h" = 'yes'], [ AS_IF([test "z$ac_nc_include_dir" != "z"], [NC_CPPFLAGS="-I$ac_nc_include_dir"]) m4_if([$2], [], [:], [$2]) ], [m4_if([$3], [], [:], [$3])]) AC_SUBST([NC_CPPFLAGS]) ]) AC_DEFUN([AC_CHECK_NETCDF_3_HEADER], [ NC_NETCDF_3_CPPFLAG= ac_check_netcdf_3_include= ac_check_netcdf_3_header='no' ac_nc_save_CPPFLAGS=$CPPFLAGS AC_MSG_CHECKING([for netcdf 3 interface]) m4_if([$1],[],[:],[ ac_check_netcdf_3_include="$1" ]) AS_IF([test "z$ac_check_netcdf_3_include" != "z"], [CPPFLAGS="$CPPFLAGS -I$ac_check_netcdf_3_include"]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[int status; int ncid; status = nc_open("foo.nc", 0, &ncid); char vernum; vernum = *nc_inq_libvers();]])], [ AS_IF([test "z$ac_check_netcdf_3_include" != "z"], [NC_NETCDF_3_CPPFLAG="-I$ac_check_netcdf_3_include"]) ac_check_netcdf_3_header='yes' ],[ac_check_netcdf_3_header='no']) CPPFLAGS=$ac_nc_save_CPPFLAGS AS_IF([test "$ac_check_netcdf_3_header" = 'yes'], [ AC_MSG_RESULT([yes]) m4_if([$2], [], [:], [$2]) ], [ AC_MSG_RESULT([no]) m4_if([$3], [], [:], [$3]) ]) AC_SUBST([NC_NETCDF_3_CPPFLAG]) ]) v_sim-3.7.0/m4/python.m40000644000353400050620000000361412215546053011673 00000000000000## this one is commonly used with AM_PATH_PYTHONDIR ... dnl AM_CHECK_PYMOD(MODNAME [,SYMBOL [,ACTION-IF-FOUND [,ACTION-IF-NOT-FOUND]]]) dnl Check if a module containing a given symbol is visible to python. AC_DEFUN([AM_CHECK_PYMOD], [AC_REQUIRE([AM_PATH_PYTHON]) py_mod_var=`echo $1['_']$2 | sed 'y%./+-%__p_%'` AC_MSG_CHECKING(for ifelse([$2],[],,[$2 in ])python module $1) AC_CACHE_VAL(py_cv_mod_$py_mod_var, [ ifelse([$2],[], [prog=" import sys try: import $1 except ImportError: sys.exit(1) except: sys.exit(0) sys.exit(0)"], [prog=" import $1 $1.$2"]) if $PYTHON -c "$prog" 1>&AC_FD_CC 2>&AC_FD_CC then eval "py_cv_mod_$py_mod_var=yes" else eval "py_cv_mod_$py_mod_var=no" fi ]) py_val=`eval "echo \`echo '$py_cv_mod_'$py_mod_var\`"` if test "x$py_val" != xno; then AC_MSG_RESULT(yes) ifelse([$3], [],, [$3 ])dnl else AC_MSG_RESULT(no) ifelse([$4], [],, [$4 ])dnl fi ]) dnl a macro to check for ability to create python extensions dnl AM_CHECK_PYTHON_HEADERS([ACTION-IF-POSSIBLE], [ACTION-IF-NOT-POSSIBLE]) dnl function also defines PYTHON_INCLUDES AC_DEFUN([AM_CHECK_PYTHON_HEADERS], [AC_REQUIRE([AM_PATH_PYTHON]) AC_MSG_CHECKING(for headers required to compile python extensions) dnl deduce PYTHON_INCLUDES py_prefix=`$PYTHON -c "import sys; print sys.prefix"` py_exec_prefix=`$PYTHON -c "import sys; print sys.exec_prefix"` if test -x "$PYTHON-config"; then PYTHON_INCLUDES=`$PYTHON-config --includes 2>/dev/null` else PYTHON_INCLUDES="-I${py_prefix}/include/python${PYTHON_VERSION}" if test "$py_prefix" != "$py_exec_prefix"; then PYTHON_INCLUDES="$PYTHON_INCLUDES -I${py_exec_prefix}/include/python${PYTHON_VERSION}" fi fi AC_SUBST(PYTHON_INCLUDES) dnl check if the headers exist: save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $PYTHON_INCLUDES" AC_TRY_CPP([#include ],dnl [AC_MSG_RESULT(found) $1],dnl [AC_MSG_RESULT(not found) $2]) CPPFLAGS="$save_CPPFLAGS" ]) v_sim-3.7.0/README0000644000353400050620000000165212216005700010436 00000000000000 V_Sim visualizes atomic structures such as crystals, grain boundaries, molecules and so on (either in binary format, or in plain text format). The rendering is done in pseudo-3D with spheres (atoms) or arrows (spins). The user can interact through many functions to choose the view, set the bindings, draw cutting planes, compute surfaces from scalar fields, duplicate nodes, measure geometry... Moreover V_Sim allows to export the view as images in PNG, JPG, PDF (bitmap), SVG (scheme) and other formats. Some tools are also available to colorize atoms from data values or to animate on screen many position files. A comprehensive manual is available on the web site, see http://inac.cea.fr/L_Sim/V_Sim/user_guide.html. Compiling and installing V_Sim is detailled at http://inac.cea.fr/L_Sim/V_Sim/install.html and in the INSTALL file of the package (providing dependencies information as well). 1998 - 2013, CEA (France) v_sim-3.7.0/configure.ac0000644000353400050620000005262312216330132012050 00000000000000dnl Process this file with autoconf to produce a configure script. dnl Every `configure' script must call `AC_INIT' dnl $package is the name of the program dnl $version is its number dnl $bugreport is an email dnl $tarname is used to call the directories, ... related to the program AC_INIT([V_Sim stable branch], [3.7.0], [damien D caliste AT cea D fr], [v_sim]) dnl Versioning V_SIM_MAJOR_VERSION=$(echo $PACKAGE_VERSION | cut -d'.' -f1) V_SIM_MINOR_VERSION=$(echo $PACKAGE_VERSION | cut -d'.' -f2) V_SIM_MICRO_VERSION=$(echo $PACKAGE_VERSION | cut -d'.' -f3) case "x$V_SIM_MICRO_VERSION" in x99*) V_SIM_MINOR_VERSION=$(($V_SIM_MINOR_VERSION + 1));; esac AC_SUBST(V_SIM_MAJOR_VERSION) AC_SUBST(V_SIM_MINOR_VERSION) AC_SUBST(V_SIM_MICRO_VERSION) dnl Some variables lib_v_sim_version=$V_SIM_MINOR_VERSION":0" AC_SUBST(lib_v_sim_version) need_cpp_compiler="no" dnl Save this value here, since automake will set cflags later cflags_set=${CFLAGS} cxxflags_set=${CXXFLAGS} dnl Initialize automake with same $package and $version AM_INIT_AUTOMAKE([$PACKAGE_TARNAME], [$PACKAGE_VERSION]) dnl Use a config.h file to store macro definitions AM_CONFIG_HEADER(config.h) AC_CONFIG_MACRO_DIR([m4]) dnl Outputing some informations date="2013-09-16" AC_MSG_NOTICE([Compiling $PACKAGE_NAME]) AC_MSG_NOTICE([$PACKAGE_TARNAME $PACKAGE_VERSION $date]) dnl Set the default prefix AC_PREFIX_DEFAULT([/usr/local]) AC_MSG_CHECKING([for instalation directory]) AC_MSG_RESULT([$prefix]) dnl Starting of consistency checks dnl ------------------------------ dnl cherche un compilateur C dnl set the CC variable AC_PROG_CC dnl set the CXX variable AC_PROG_CXX dnl set the FC variable AC_PROG_F77 AC_PROG_FC dnl If GCC is used, then we define the flag not to tag unused parameters. if test "$GCC" = "yes" ; then AC_DEFINE([_U_], [__attribute((unused))], [Tag this parameter as unused.]) fi dnl Using libtool to handle libraries AC_CHECK_TOOL(LIBTOOL, libtool, :) if test "$libtool" = ":" ; then AC_MSG_ERROR(["No 'libtool' program found."]) fi AC_LIBTOOL_WIN32_DLL AC_PROG_LIBTOOL dnl check for platform AC_MSG_CHECKING([for target architecture]) case x"$target" in xNONE | x) target_or_host="$host" ;; *) target_or_host="$target" ;; esac AC_MSG_RESULT(['$target_or_host']) AC_MSG_CHECKING([for platform]) define_win32=0 define_X11=1 case "$target_or_host" in i686-w64-mingw32) platform=win32 define_win32=1 define_X11=0 EXEEXT=.exe FONT_NORMAL="Sans" FONT_BOLD="Sans bold" EXTRA_LDFLAGS="-no-undefined" EXTRA_CFLAGS="-mms-bitfields" EXTRA_LIBS="-lintl" ;; *-mingw* | *-*-cygwin*) platform=win32 define_win32=1 define_X11=0 EXEEXT=.exe FONT_NORMAL="Sans" FONT_BOLD="Sans bold" EXTRA_LDFLAGS="-no-undefined" EXTRA_CFLAGS="-mms-bitfields -mno-cygwin" EXTRA_LIBS="-lintl" ;; *-apple-darwin*) platform=Apple define_X11=1 define_win32=0 EXEEXT= FONT_NORMAL="Nimbus normal" FONT_BOLD="Nimbus bold" EXTRA_LDFLAGS= EXTRA_LIBS="-dylib_file /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib:/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib" EXTRA_CFLAGS= ;; *) platform=X11 define_X11=1 define_win32=0 EXEEXT= FONT_NORMAL="Nimbus normal" FONT_BOLD="Nimbus bold" EXTRA_LDFLAGS= EXTRA_CFLAGS= ;; esac AC_MSG_RESULT([$platform]) AC_SUBST(FONT_NORMAL) AC_SUBST(FONT_BOLD) AC_SUBST(EXTRA_LDFLAGS) AC_SUBST(EXTRA_CFLAGS) AC_SUBST(EXTRA_LIBS) AC_SUBST(EXEEXT) AM_CONDITIONAL(PLATFORM_X11, test "$define_X11" = "1") AM_CONDITIONAL(PLATFORM_WIN32, test "$define_win32" = "1") AM_CONDITIONAL(BUILD_STATIC_BINARY, test "$define_X11" = "1") AM_CONDITIONAL(BUILD_SHARED_BINARY, test "$define_win32" = "1") dnl Check the GL header and lib. if test x"$platform" = x"Apple" ; then LIBS_SVG="$LIBS" LIBS="$EXTRA_LIBS $LIBS" fi AX_CHECK_GL() if test x"$no_gl" = x"yes" ; then AC_MSG_ERROR(["No GL implementation (header or library issues)."]) fi dnl Check the GLU header and lib. AX_CHECK_GLU() if test x"$no_glu" = x"yes" ; then AC_MSG_ERROR(["No GLU implementation (header or library issues)."]) fi if test x"$platform" = x"Apple" ; then LIBS="$LIBS_SVG" fi dnl Look for FTGL PKG_CHECK_MODULES(FTGL, ftgl, [have_ftgl=yes], [have_ftgl=no]) if test x"$have_ftgl" = x"yes" ; then AC_DEFINE([HAVE_FTGL], [], [If set, we can call FTGL.h]) fi dnl Check the GLX header on Unix platform. if test x"$platform" != x"win32" ; then ac_save_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${GL_CFLAGS} ${CPPFLAGS}" AC_CHECK_HEADER([GL/glx.h], [glxh="yes"], [glxh="no"]) CPPFLAGS="${ac_save_CPPFLAGS}" if test "$glxh" = "no" ; then AC_MSG_ERROR(["No 'GL/glx.h' header file."]) fi dnl Test the Pbuffer availability. LIBS_SVG="$LIBS" LIBS="$LIBS $GLU_LIBS" AC_CHECK_FUNCS([glXChooseFBConfig glXGetVisualFromFBConfig glXCreatePbuffer], [], [ac_have_pbuffer=no]) LIBS="$LIBS_SVG" if test x"$ac_have_pbuffer" != x"no" ; then AC_DEFINE([HAVE_PBUFFER], [1], ["Will use Pbuffer from GLX 1.3 for pixmap rendering."]) fi fi dnl Add the languages which your application supports here. AC_PROG_INTLTOOL([0.35.0]) GETTEXT_PACKAGE=$PACKAGE_TARNAME AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Gettext package.]) AM_GLIB_GNU_GETTEXT dnl checking for glib and gtk if test x"$platform" = x"win32" ; then if test -z "$PKG_CONFIG_PATH" ; then export PKG_CONFIG_PATH=/usr/i686-w64-mingw32/lib/pkgconfig/ fi fi PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.2.0 gmodule-2.0 gobject-2.0 gthread-2.0) PKG_CHECK_MODULES(CAIRO, cairo, [have_cairo=yes], [have_cairo=no]) if test x"$have_cairo" = x"yes" ; then AC_DEFINE([HAVE_CAIRO], [], [If set, we can call cairo.h]) fi AC_ARG_WITH(gtk3, AS_HELP_STRING([--with-gtk3], [use Gtk3 instead of Gtk2.]), [ac_required_gtk="gtk+-3.0 >= 3.0.2"], [ac_required_gtk="gtk+-2.0 >= 2.4.0"]) opengl="built-in" dnl Look for gtkglext support and create the GTKS_CFLAGS and GTKS_LIBS variables. AC_ARG_WITH(gtkglext, AS_HELP_STRING([--with-gtkglext], [use GtkGlExt as rendering surface for OpenGl.]), [WITH_GTK_GL_EXT=$withval], [WITH_GTK_GL_EXT=""]) if test -n "$WITH_GTK_GL_EXT" -a "$WITH_GTK_GL_EXT" != "no" ; then PKG_CHECK_MODULES(GTKS, gtkglext-1.0 >= 1.0.0 glib-2.0 >= 2.2.0 ${ac_required_gtk} gmodule-2.0 gobject-2.0 gthread-2.0) opengl="GtkGlExt" AC_DEFINE([HAVE_GTKGLEXT], [], [If set, we can call gtkgl.h]) fi AM_CONDITIONAL(OPENGL_BUILTIN_WIN32, test "$define_win32" = "1") AM_CONDITIONAL(OPENGL_BUILTIN_X11, test "$define_X11" = "1" -a "$opengl" = "built-in") AM_CONDITIONAL(OPENGL_GTKGLEXT, test "$define_X11" = "1" -a "$opengl" = "GtkGlExt") if test "$opengl" != "GtkGlExt" ; then PKG_CHECK_MODULES(GTKS, glib-2.0 >= 2.2.0 ${ac_required_gtk} gmodule-2.0 gobject-2.0 gthread-2.0) dnl Add -lX11 if missing. if test "$define_X11" = "1" ; then lx="False" for fl in $GLU_LIBS ; do if test x"$fl" = x"-lX11" ; then lx="True" fi done if test x"$lx" = x"False" ; then GLU_LIBS=$GLU_LIBS" -lX11" fi fi fi dnl Yaml parser ac_use_libyaml="yes" AC_ARG_WITH([yaml], AS_HELP_STRING([--without-yaml], [add support of YAML for input files (default = yes).]), [ac_use_libyaml=$withval], [ac_use_libyaml=yes]) AC_ARG_WITH([yaml-path], AS_HELP_STRING([--with-yaml-path], [give a path to find libyaml.]), [ac_path_yaml=$withval]) if test x"$ac_use_libyaml" != x"no" ; then if test x"$ac_path_yaml" == x"" ; then ac_path_yaml="/usr" fi LDFLAGS_SVG="$LDFLAGS" AC_LANG_PUSH(C) LDFLAGS="-L$ac_path_yaml/lib" AC_CHECK_LIB([yaml], [yaml_parser_parse], [ac_use_libyaml=yes], [ac_use_libyaml=warn]) if test x"$ac_use_libyaml" = x"yes"; then if test x"$ac_path_yaml" != x"/usr" ; then LIB_YAML_CFLAGS="-I$ac_path_yaml/include" LIB_YAML_LIBS="-L$ac_path_yaml/lib " fi LIB_YAML_LIBS=$LIB_YAML_LIBS"-lyaml" fi AC_LANG_POP(C) LDFLAGS="$LDFLAGS_SVG" if test x"$ac_use_libyaml" != x"yes" ; then AC_MSG_WARN([libyaml is not available.]) else AC_DEFINE([HAVE_YAML], [], [If set, we can call yaml.h]) fi fi AC_SUBST(LIB_YAML_CFLAGS) AC_SUBST(LIB_YAML_LIBS) dnl Python bindings AC_ARG_ENABLE(python-module, AS_HELP_STRING([--enable-python-module], [create a Python module.]), [enable_python=$enableval], [enable_python="no"]) if test -n "$enable_python" -a "$enable_python" != "no" ; then AM_PATH_PYTHON(2.3.5) AM_CHECK_PYTHON_HEADERS(,[AC_MSG_ERROR(could not find Python headers)]) py_prefix=`$PYTHON -c "import sys; print sys.prefix"` PYTHON_INCLUDES="-I${py_prefix}/include/python${PYTHON_VERSION}" PKG_CHECK_MODULES(PYGTK, pygobject-2.0 pygtk-2.0, [have_pygtk=yes], [have_pygtk=no]) if test x"$have_pygtk" = x"yes" ; then AC_DEFINE([HAVE_PYGTK], [], [If set, we can call pygtk.h]) else AC_MSG_WARN([header files for pygtk not installed.]) enable_python="no" fi fi AM_CONDITIONAL(PYTHON_MODULE, test x"$enable_python" = x"yes") dnl Customization of V_Sim AC_MSG_CHECKING([for debug message]) with_debug_messages=no define_debug=0 AC_ARG_ENABLE(debug-messages, AS_HELP_STRING([--enable-debug-messages], [compile V_Sim with all the debug strings, it is very verbose (default=no).]), with_debug_messages=$enableval, with_debug_messages=no) AC_MSG_RESULT([$with_debug_messages]) if test "$with_debug_messages" = "yes" ; then define_debug=1 AC_MSG_WARN([--enable-debug-messages... are you sure, this is very verbose?]) fi dnl Building the doc GTK_DOC_CHECK([1.3]) dnl Test for plug-ins compilation dnl ----------------------------- dnl Nanoquanta netcdf format AC_MSG_CHECKING([for ETSF file format support]) AC_ARG_WITH(etsf_file_format, AS_HELP_STRING([--with-etsf-file-format], [compile plug-in support for files that follow the ETSF specifications for structural positions and densities (default=no).]), [have_etsf=yes], [have_etsf=no]) AC_ARG_WITH(nanoquanta, AS_HELP_STRING([--with-nanoquanta], [deprecated, use --with-etsf-file-format instead (default=no).]), [have_nanoquanta=yes], [have_nanoquanta=no]) if test x"$have_nanoquanta" = x"yes" ; then have_etsf="yes" fi AC_MSG_RESULT([$have_etsf]) if test x"$have_nanoquanta" = x"yes" ; then AC_MSG_WARN(["--with-nanoquanta is deprecated, use --with-etsf-file-format instead."]) fi if test "$have_etsf" = "yes" ; then AC_CHECK_NETCDF([netcdf="yes"], [netcdf="no"], [3]) if test "$netcdf" = "yes" ; then have_etsf="yes" else AC_MSG_WARN(["No 'netcdf.h' header file, libetsf.so will not be built."]) have_etsf="no" fi fi AM_CONDITIONAL(HAVE_ETSF, test x"$have_etsf" = x"yes") dnl OpenBabel wrapper AC_MSG_CHECKING([for OpenBabel support]) AC_ARG_WITH(openbabel, AS_HELP_STRING([--with-openbabel], [compile plug-in support for a wrapper around the OpenBabel library (default=no).]), [have_openbabel=yes], [have_openbabel=no]) AC_MSG_RESULT([$have_openbabel]) if test "$have_openbabel" = "yes" ; then PKG_CHECK_MODULES([OPENBABEL], [openbabel-2.0 >= 2.0.0], [ob=yes], [ob=no]) if test "$ob" = "yes" ; then have_openbabel="yes" need_cpp_compiler="yes" else AC_MSG_WARN(["No OpenBabel lib/header file found, libobloader.so will not be built."]) AC_MSG_WARN(["Maybe OpenBabel is not installed or version is to old (>=2.0 required)."]) have_openbabel="no" fi fi AM_CONDITIONAL(HAVE_OPENBABEL, test x"$have_openbabel" = x"yes") dnl XCrysDen file format have_xsf="no" AC_ARG_WITH(xsf, AS_HELP_STRING([--with-xsf], [compile plug-in support for files that follow the XCrysDen format for structural positions and densities (default=no).]), [have_xsf=yes], [have_xsf=no]) AC_MSG_CHECKING([for XCrysDen file support]) AC_MSG_RESULT([$have_xsf]) AM_CONDITIONAL(HAVE_XSF, test x"$have_xsf" = x"yes") dnl Cube file format have_cube="no" AC_ARG_WITH(cube, AS_HELP_STRING([--with-cube], [compile plug-in support for Cube files (densities and structures) (default=no).]), [have_cube=yes], [have_cube=no]) AC_MSG_CHECKING([for Cube file support]) AC_MSG_RESULT([$have_cube]) AM_CONDITIONAL(HAVE_CUBE, test x"$have_cube" = x"yes") dnl ABINIT input file ac_abinit="no" AC_CHECK_ABINIT() if test x"$ac_abinit_parser" = x"yes" ; then AC_DEFINE_UNQUOTED(HAVE_ABINIT_PARSER, "$ac_abinit_parser", [Compile the ABINIT parser part for static linking.]) fi AM_CONDITIONAL(HAVE_ABINIT_PARSER, test x"$ac_abinit_parser" = x"yes") if test x"$ac_abinit_symmetry" = x"yes" ; then AC_DEFINE_UNQUOTED(HAVE_ABINIT_SYMMETRY, "$ac_abinit_symmetry", [Compile the ABINIT symmetry part for static linking.]) fi AM_CONDITIONAL(HAVE_ABINIT_SYMMETRY, test x"$ac_abinit_symmetry" = x"yes") AC_SUBST(AB_CPPFLAGS) AC_SUBST(AB_LIBS) AM_CONDITIONAL(HAVE_ABINIT, test x"$ac_abinit_symmetry" = x"yes" -o x"$ac_abinit_parser" = x"yes") dnl Archive input file support ac_archives="no" AC_ARG_WITH([archives], AS_HELP_STRING([--with-archives], [add support of archives for input files.]), [ac_archives=yes], [ac_archives=no]) if test x"$ac_archives" = x"yes" ; then PKG_CHECK_MODULES([LIB_ARCHIVE], [libarchive >= 2.4], [ac_archives=yes], [ac_archives=no]) if test x"$ac_archives" = x"yes" ; then AC_DEFINE([HAVE_LIB_ARCHIVE], [1], [libarchive is linkable.]) else AC_MSG_WARN([libarchive is not available]) fi fi AM_CONDITIONAL(HAVE_LIB_ARCHIVE, test x"$ac_archives" = x"yes") AC_SUBST(LIB_ARCHIVE_CFLAGS) AC_SUBST(LIB_ARCHIVE_LIBS) dnl BigDFT support ac_bigdft="no" AX_CHECK_BIGDFT() AC_SUBST(BIGDFT_CPPFLAGS) AC_SUBST(BIGDFT_LIBS) AM_CONDITIONAL(HAVE_BIGDFT, test x"$ac_bigdft" = x"yes") dnl Add Introspection capabilities GOBJECT_INTROSPECTION_REQUIRED=0.9.0 AC_SUBST(GOBJECT_INTROSPECTION_REQUIRED) PYGOBJECT_REQUIRED=2.21.0 AC_SUBST(PYGOBJECT_REQUIRED) AC_ARG_ENABLE([introspection], AS_HELP_STRING([--enable-introspection], [enable GObject introspection]), [], [enable_introspection=no]) if test "x$enable_introspection" != "xno" ; then dnl if test "x$ac_required_gtk" != "xgtk+-3.0 >= 2.90.2" ; then dnl AC_MSG_ERROR(["GTK+ 3.0 is required for introspection."]) dnl fi PKG_CHECK_MODULES([GOBJECT_INTROSPECTION], [gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_REQUIRED], [enable_introspection=yes], [if test "x$enable_introspection" = "xcheck"; then enable_introspection=no else AC_MSG_ERROR([gobject-introspection is not available]) fi]) PKG_CHECK_MODULES([PYGOBJECT], [pygobject-2.0 >= $PYGOBJECT_REQUIRED], [enable_introspection=yes], [if test "x$enable_introspection" = "xcheck"; then enable_introspection=no else AC_MSG_ERROR([pygobject is not available]) fi]) fi if test "x$enable_introspection" = "xyes" ; then dnl girdir=$($PKG_CONFIG --variable=girdir gobject-introspection-1.0) girdir="$datadir/gir-1.0" typelibsdir=$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0) visutypelibsdir="$libdir/girepository-1.0" AC_DEFINE([WITH_GOBJECT_INTROSPECTION], [1], [enable GObject introspection support]) AC_SUBST(GOBJECT_INTROSPECTION_CFLAGS) AC_SUBST(GOBJECT_INTROSPECTION_LIBS) AC_SUBST(girdir) AC_SUBST(typelibsdir) AC_SUBST(visutypelibsdir) AC_DEFINE_UNQUOTED([GI_TYPELIBS_DIR], ["$typelibsdir"], [Export directory with system .typelib files.]) AC_SUBST([G_IR_SCANNER], [$($PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0)]) AC_SUBST([G_IR_COMPILER], [$($PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0)]) dnl Add Python support for the PythonGI plug-in. AM_PATH_PYTHON(2.3) AM_CHECK_PYTHON_HEADERS(,[AC_MSG_ERROR(could not find Python headers)]) PYTHON_INCLUDES="`python-config --cflags`" AC_SUBST(PYTHON_INCLUDES) PYTHON_LIBS="`python-config --libs`" AC_SUBST(PYTHON_LIBS) pyexecdir=$($PKG_CONFIG --variable=libdir pygobject-2.0)"/python"$PYTHON_VERSION"/site-packages" visupyexecdir="$libdir/python$PYTHON_VERSION/site-packages" AC_DEFINE_UNQUOTED([PYGI_EXEC_DIR], ["$pyexecdir/gtk-2.0"], [Export directory with Python gi module.]) else visupyexecdir=$libdir"/python/site-packages" fi AC_SUBST(visupyexecdir) AM_CONDITIONAL([WITH_GOBJECT_INTROSPECTION], [test "x$enable_introspection" = "xyes"]) dnl Set CFLAGS if not already set by user dnl Setting CFLAGS or not to avoid the -g appended by AC_PROG_CC if test x"$cflags_set" = "x" ; then CFLAGS="-O2" fi if test x"$cxxflags_set" = "x" ; then CXXFLAGS="-O2" fi dnl AC_PROG_CC set the CC variable and detect if we use the GNU compiler dnl We now append some various CFLAGS depending on platform and choice dnl of the user. AC_ARG_WITH(strict-cflags, AS_HELP_STRING([--with-strict-cflags], [if set or absent some correctness cflags are appended to the CFLAGS variable. Appended values dependent on the platform and code branch (default on Unix for development is Wall Wno-unused W Werror ansi pedantic-errors).]), [STRICT_CFLAGS=$withval], [STRICT_CFLAGS="yes"]) flags='Wall W ansi' flags_cpp='Wall W ansi' if test "$GCC" = "yes" -a "$STRICT_CFLAGS" = "yes"; then dnl Used flags for V_Sim. if test "$PACKAGE" = "v_sim-dev" ; then if test x"$platform" != x"win32" -a x"$platform" != x"Apple" ; then flags=$flags' Werror pedantic-errors std=c99 g' flags_cpp=$flags_cpp' Werror pedantic-errors std=c99 g' fi fi fi for fl in $flags ; do case " $CFLAGS " in *[\ \ ]-$fl[\ \ ]*) ;; *) CFLAGS="$CFLAGS -$fl" ;; esac done for fl in $flags_cpp ; do case " $CXXFLAGS " in *[\ \ ]-$fl[\ \ ]*) ;; *) CXXFLAGS="$CXXFLAGS -$fl" ;; esac done AC_MSG_CHECKING([for CFLAGS used]) AC_MSG_RESULT([$CFLAGS]) AC_MSG_CHECKING([for CXXFLAGS used]) AC_MSG_RESULT([$CXXFLAGS]) dnl compatibility for very old version of autotools if test -z "$docdir" ; then docdir="$datadir/doc/$PACKAGE" fi dnl default installation directories v_simexedir="$bindir" AC_SUBST(v_simexedir) v_simresourcesdir="$datadir/$PACKAGE" AC_SUBST(v_simresourcesdir) v_simpixmapsdir="$datadir/$PACKAGE/pixmaps" AC_SUBST(v_simpixmapsdir) v_simiconsdir="$datadir/pixmaps" AC_SUBST(v_simiconsdir) v_simlegaldir="${docdir}" AC_SUBST(v_simlegaldir) v_simexamplesdir="${docdir}/examples" AC_SUBST(v_simexamplesdir) v_simpluginsdir="$libdir/$PACKAGE/plug-ins" AC_SUBST(v_simpluginsdir) dnl Values of flags AC_DEFINE_UNQUOTED(DEBUG, $define_debug, [Compile V_Sim in debug mode, very verbose.]) AC_DEFINE_UNQUOTED(SYSTEM_WIN32, $define_win32, [Target platform.]) AC_DEFINE_UNQUOTED(SYSTEM_X11, $define_X11, [Target platform.]) AC_DEFINE_UNQUOTED(V_SIM_RELEASE_DATE, "$date", [Date of version release.]) AC_OUTPUT([ Makefile src/Makefile lib/plug-ins/Makefile lib/plug-ins/nanoquanta-netcdf/Makefile lib/plug-ins/OpenBabel-wrapper/Makefile lib/plug-ins/xsf/Makefile lib/plug-ins/cube/Makefile lib/plug-ins/abinit/Makefile lib/plug-ins/python-gi/Makefile lib/plug-ins/archives/Makefile lib/plug-ins/bigdft/Makefile lib/python/Makefile lib/Makefile etc/Makefile etc/v_sim.rc etc/v_sim.ini etc/v_sim-dev.ini pixmaps/Makefile examples/Makefile po/Makefile.in Documentation/Makefile Documentation/reference/Makefile Documentation/reference/version ]) echo " Configuration: Source code location: ${srcdir} Destination path prefix: ${prefix} Compiler: ${CC} CFLAGS: ${CFLAGS} LDFLAGS: ${LDFLAGS} GLIB-part CFLAGS: ${GLIB_CFLAGS} GLIB-part LIBS: ${GLIB_LIBS} GTKS-part CFLAGS: ${GTKS_CFLAGS} GTKS-part LIBS: ${GTKS_LIBS} OpenGL: ${opengl} | CFLAGS: ${GLU_CFLAGS} | LIBS: ${GLU_LIBS} | FTGL LIBS: ${FTGL_LIBS} Enable debug messages: ${with_debug_messages} Enable gtk-doc: ${enable_gtk_doc} Enable Python bindings: ${enable_python} Enable introspection: ${enable_introspection} Plug-ins: With Nanoquanta support: ${have_etsf}" if test "$have_etsf" = "yes" ; then echo \ " | CFLAGS: ${NC_CFLAGS} | LDFLAGS LIBS: ${NC_LDFLAGS} ${NC_LIBS}" fi echo " With OpenBabel support: ${have_openbabel}" if test "$have_openbabel" = "yes" ; then echo \ " | CFLAGS: ${OPENBABEL_CFLAGS} | LDFLAGS LIBS: ${OPENBABEL_LIBS}" fi echo " With ABINIT support: ${ac_abinit}" if test "$ac_abinit" = "yes" ; then echo \ " | Input file support ${ac_abinit_parser} | Symmetry analyser ${ac_abinit_symmetry} | CFLAGS: ${AB_CPPFLAGS} | LDFLAGS LIBS: ${AB_LIBS}" fi echo " With XCrysDen support: ${have_xsf} With Cube support: ${have_cube} With Python scripting: ${enable_introspection}" if test "${enable_introspection}" = "yes" ; then echo \ " | CFLAGS: ${PYTHON_INCLUDES} | LDFLAGS LIBS: ${PYTHON_LIBS}" fi echo " With archive support : ${ac_archives}" if test "${ac_archives}" = "yes" ; then echo \ " | CFLAGS: ${LIB_ARCHIVE_CFLAGS} | LDFLAGS LIBS: ${LIB_ARCHIVE_LIBS}" fi echo " With BigDFT support : ${ac_bigdft}" if test "${ac_bigdft}" = "yes" ; then echo \ " | CFLAGS: ${BIGDFT_CPPFLAGS} | LDFLAGS LIBS: ${BIGDFT_LIBS}" fi echo \ " Plug-ins options: Need a C++ compiler: ${need_cpp_compiler}" if test "$need_cpp_compiler" = "yes" ; then echo \ " | compiler: ${CXX} | CXXFLAGS: ${CXXFLAGS} " fi v_sim-3.7.0/aclocal.m40000644000353400050620000017721212216330206011426 00000000000000# generated automatically by aclocal 1.11.3 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, # Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],, [m4_warning([this file was generated for autoconf 2.68. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # Copyright (C) 1995-2002 Free Software Foundation, Inc. # Copyright (C) 2001-2003,2004 Red Hat, Inc. # # This file is free software, distributed under the terms of the GNU # General Public License. As a special exception to the GNU General # Public License, this file may be distributed as part of a program # that contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU Public License # but which still want to provide support for the GNU gettext functionality. # # Macro to add for using GNU gettext. # Ulrich Drepper , 1995, 1996 # # Modified to never use included libintl. # Owen Taylor , 12/15/1998 # # Major rework to remove unused code # Owen Taylor , 12/11/2002 # # Added better handling of ALL_LINGUAS from GNU gettext version # written by Bruno Haible, Owen Taylor 5/30/3002 # # Modified to require ngettext # Matthias Clasen 08/06/2004 # # We need this here as well, since someone might use autoconf-2.5x # to configure GLib then an older version to configure a package # using AM_GLIB_GNU_GETTEXT AC_PREREQ(2.53) dnl dnl We go to great lengths to make sure that aclocal won't dnl try to pull in the installed version of these macros dnl when running aclocal in the glib directory. dnl m4_copy([AC_DEFUN],[glib_DEFUN]) m4_copy([AC_REQUIRE],[glib_REQUIRE]) dnl dnl At the end, if we're not within glib, we'll define the public dnl definitions in terms of our private definitions. dnl # GLIB_LC_MESSAGES #-------------------- glib_DEFUN([GLIB_LC_MESSAGES], [AC_CHECK_HEADERS([locale.h]) if test $ac_cv_header_locale_h = yes; then AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, [AC_TRY_LINK([#include ], [return LC_MESSAGES], am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) if test $am_cv_val_LC_MESSAGES = yes; then AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your file defines LC_MESSAGES.]) fi fi]) # GLIB_PATH_PROG_WITH_TEST #---------------------------- dnl GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) glib_DEFUN([GLIB_PATH_PROG_WITH_TEST], [# Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in /*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in ifelse([$5], , $PATH, [$5]); do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) # GLIB_WITH_NLS #----------------- glib_DEFUN([GLIB_WITH_NLS], dnl NLS is obligatory [USE_NLS=yes AC_SUBST(USE_NLS) gt_cv_have_gettext=no CATOBJEXT=NONE XGETTEXT=: INTLLIBS= AC_CHECK_HEADER(libintl.h, [gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" # # First check in libc # AC_CACHE_CHECK([for ngettext in libc], gt_cv_func_ngettext_libc, [AC_TRY_LINK([ #include ], [return !ngettext ("","", 1)], gt_cv_func_ngettext_libc=yes, gt_cv_func_ngettext_libc=no) ]) if test "$gt_cv_func_ngettext_libc" = "yes" ; then AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc, [AC_TRY_LINK([ #include ], [return !dgettext ("","")], gt_cv_func_dgettext_libc=yes, gt_cv_func_dgettext_libc=no) ]) fi if test "$gt_cv_func_ngettext_libc" = "yes" ; then AC_CHECK_FUNCS(bind_textdomain_codeset) fi # # If we don't have everything we want, check in libintl # if test "$gt_cv_func_dgettext_libc" != "yes" \ || test "$gt_cv_func_ngettext_libc" != "yes" \ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then AC_CHECK_LIB(intl, bindtextdomain, [AC_CHECK_LIB(intl, ngettext, [AC_CHECK_LIB(intl, dgettext, gt_cv_func_dgettext_libintl=yes)])]) if test "$gt_cv_func_dgettext_libintl" != "yes" ; then AC_MSG_CHECKING([if -liconv is needed to use gettext]) AC_MSG_RESULT([]) AC_CHECK_LIB(intl, ngettext, [AC_CHECK_LIB(intl, dcgettext, [gt_cv_func_dgettext_libintl=yes libintl_extra_libs=-liconv], :,-liconv)], :,-liconv) fi # # If we found libintl, then check in it for bind_textdomain_codeset(); # we'll prefer libc if neither have bind_textdomain_codeset(), # and both have dgettext and ngettext # if test "$gt_cv_func_dgettext_libintl" = "yes" ; then glib_save_LIBS="$LIBS" LIBS="$LIBS -lintl $libintl_extra_libs" unset ac_cv_func_bind_textdomain_codeset AC_CHECK_FUNCS(bind_textdomain_codeset) LIBS="$glib_save_LIBS" if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then gt_cv_func_dgettext_libc=no else if test "$gt_cv_func_dgettext_libc" = "yes" \ && test "$gt_cv_func_ngettext_libc" = "yes"; then gt_cv_func_dgettext_libintl=no fi fi fi fi if test "$gt_cv_func_dgettext_libc" = "yes" \ || test "$gt_cv_func_dgettext_libintl" = "yes"; then gt_cv_have_gettext=yes fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then INTLLIBS="-lintl $libintl_extra_libs" fi if test "$gt_cv_have_gettext" = "yes"; then AC_DEFINE(HAVE_GETTEXT,1, [Define if the GNU gettext() function is already present or preinstalled.]) GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl if test "$MSGFMT" != "no"; then glib_save_LIBS="$LIBS" LIBS="$LIBS $INTLLIBS" AC_CHECK_FUNCS(dcgettext) MSGFMT_OPTS= AC_MSG_CHECKING([if msgfmt accepts -c]) GLIB_RUN_PROG([$MSGFMT -c -o /dev/null],[ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Project-Id-Version: test 1.0\n" "PO-Revision-Date: 2007-02-15 12:01+0100\n" "Last-Translator: test \n" "Language-Team: C \n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" ], [MSGFMT_OPTS=-c; AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])]) AC_SUBST(MSGFMT_OPTS) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr], [CATOBJEXT=.gmo DATADIRNAME=share], [case $host in *-*-solaris*) dnl On Solaris, if bind_textdomain_codeset is in libc, dnl GNU format message catalog is always supported, dnl since both are added to the libc all together. dnl Hence, we'd like to go with DATADIRNAME=share and dnl and CATOBJEXT=.gmo in this case. AC_CHECK_FUNC(bind_textdomain_codeset, [CATOBJEXT=.gmo DATADIRNAME=share], [CATOBJEXT=.mo DATADIRNAME=lib]) ;; *-*-openbsd*) CATOBJEXT=.mo DATADIRNAME=share ;; *) CATOBJEXT=.mo DATADIRNAME=lib ;; esac]) LIBS="$glib_save_LIBS" INSTOBJEXT=.mo else gt_cv_have_gettext=no fi fi ]) if test "$gt_cv_have_gettext" = "yes" ; then AC_DEFINE(ENABLE_NLS, 1, [always defined to indicate that i18n is enabled]) fi dnl Test whether we really found GNU xgettext. if test "$XGETTEXT" != ":"; then dnl If it is not GNU xgettext we define it as : so that the dnl Makefiles still can work. if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else AC_MSG_RESULT( [found xgettext program is not GNU xgettext; ignore it]) XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po AC_OUTPUT_COMMANDS( [case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac]) dnl These rules are solely for the distribution goal. While doing this dnl we only have to keep exactly one list of the available catalogs dnl in configure.ac. for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done dnl Make all variables we use known to autoconf. AC_SUBST(CATALOGS) AC_SUBST(CATOBJEXT) AC_SUBST(DATADIRNAME) AC_SUBST(GMOFILES) AC_SUBST(INSTOBJEXT) AC_SUBST(INTLLIBS) AC_SUBST(PO_IN_DATADIR_TRUE) AC_SUBST(PO_IN_DATADIR_FALSE) AC_SUBST(POFILES) AC_SUBST(POSUB) ]) # AM_GLIB_GNU_GETTEXT # ------------------- # Do checks necessary for use of gettext. If a suitable implementation # of gettext is found in either in libintl or in the C library, # it will set INTLLIBS to the libraries needed for use of gettext # and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable # gt_cv_have_gettext will be set to "yes".) It will also call AC_SUBST() # on various variables needed by the Makefile.in.in installed by # glib-gettextize. dnl glib_DEFUN([GLIB_GNU_GETTEXT], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_HEADER_STDC])dnl GLIB_LC_MESSAGES GLIB_WITH_NLS if test "$gt_cv_have_gettext" = "yes"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else AC_MSG_CHECKING(for catalogs to be installed) NEW_LINGUAS= for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then NEW_LINGUAS="$NEW_LINGUAS $presentlang" fi done LINGUAS=$NEW_LINGUAS AC_MSG_RESULT($LINGUAS) fi dnl Construct list of names of catalog files to be constructed. if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly dnl find the mkinstalldirs script in another subdir but ($top_srcdir). dnl Try to locate is. MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi AC_SUBST(MKINSTALLDIRS) dnl Generate list of files to be processed by xgettext which will dnl be included in po/Makefile. test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES ]) # AM_GLIB_DEFINE_LOCALEDIR(VARIABLE) # ------------------------------- # Define VARIABLE to the location where catalog files will # be installed by po/Makefile. glib_DEFUN([GLIB_DEFINE_LOCALEDIR], [glib_REQUIRE([GLIB_GNU_GETTEXT])dnl glib_save_prefix="$prefix" glib_save_exec_prefix="$exec_prefix" glib_save_datarootdir="$datarootdir" test "x$prefix" = xNONE && prefix=$ac_default_prefix test "x$exec_prefix" = xNONE && exec_prefix=$prefix datarootdir=`eval echo "${datarootdir}"` if test "x$CATOBJEXT" = "x.mo" ; then localedir=`eval echo "${libdir}/locale"` else localedir=`eval echo "${datadir}/locale"` fi prefix="$glib_save_prefix" exec_prefix="$glib_save_exec_prefix" datarootdir="$glib_save_datarootdir" AC_DEFINE_UNQUOTED($1, "$localedir", [Define the location where the catalogs will be installed]) ]) dnl dnl Now the definitions that aclocal will find dnl ifdef(glib_configure_ac,[],[ AC_DEFUN([AM_GLIB_GNU_GETTEXT],[GLIB_GNU_GETTEXT($@)]) AC_DEFUN([AM_GLIB_DEFINE_LOCALEDIR],[GLIB_DEFINE_LOCALEDIR($@)]) ])dnl # GLIB_RUN_PROG(PROGRAM, TEST-FILE, [ACTION-IF-PASS], [ACTION-IF-FAIL]) # # Create a temporary file with TEST-FILE as its contents and pass the # file name to PROGRAM. Perform ACTION-IF-PASS if PROGRAM exits with # 0 and perform ACTION-IF-FAIL for any other exit status. AC_DEFUN([GLIB_RUN_PROG], [cat >conftest.foo <<_ACEOF $2 _ACEOF if AC_RUN_LOG([$1 conftest.foo]); then m4_ifval([$3], [$3], [:]) m4_ifvaln([$4], [else $4])dnl echo "$as_me: failed input was:" >&AS_MESSAGE_LOG_FD sed 's/^/| /' conftest.foo >&AS_MESSAGE_LOG_FD fi]) # nls.m4 serial 5 (gettext-0.18) dnl Copyright (C) 1995-2003, 2005-2006, 2008-2010 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ([2.50]) AC_DEFUN([AM_NLS], [ AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE([nls], [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT([$USE_NLS]) AC_SUBST([USE_NLS]) ]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant . # # 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. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11.3], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.3])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, # 2010, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 12 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 8 # AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2009, # 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # AM_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # --------------------------------------------------------------------------- # Adds support for distributing Python modules and packages. To # install modules, copy them to $(pythondir), using the python_PYTHON # automake variable. To install a package with the same name as the # automake package, install to $(pkgpythondir), or use the # pkgpython_PYTHON automake variable. # # The variables $(pyexecdir) and $(pkgpyexecdir) are provided as # locations to install python extension modules (shared libraries). # Another macro is required to find the appropriate flags to compile # extension modules. # # If your package is configured with a different prefix to python, # users will have to add the install directory to the PYTHONPATH # environment variable, or create a .pth file (see the python # documentation for details). # # If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will # cause an error if the version of python installed on the system # doesn't meet the requirement. MINIMUM-VERSION should consist of # numbers and dots only. AC_DEFUN([AM_PATH_PYTHON], [ dnl Find a Python interpreter. Python versions prior to 2.0 are not dnl supported. (2.0 was released on October 16, 2000). m4_define_default([_AM_PYTHON_INTERPRETER_LIST], [python python2 python3 python3.2 python3.1 python3.0 python2.7 dnl python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0]) AC_ARG_VAR([PYTHON], [the Python interpreter]) m4_if([$1],[],[ dnl No version check is needed. # Find any Python interpreter. if test -z "$PYTHON"; then AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :) fi am_display_PYTHON=python ], [ dnl A version check is needed. if test -n "$PYTHON"; then # If the user set $PYTHON, use it and don't search something else. AC_MSG_CHECKING([whether $PYTHON version >= $1]) AM_PYTHON_CHECK_VERSION([$PYTHON], [$1], [AC_MSG_RESULT(yes)], [AC_MSG_ERROR(too old)]) am_display_PYTHON=$PYTHON else # Otherwise, try each interpreter until we find one that satisfies # VERSION. AC_CACHE_CHECK([for a Python interpreter with version >= $1], [am_cv_pathless_PYTHON],[ for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do test "$am_cv_pathless_PYTHON" = none && break AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break]) done]) # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. if test "$am_cv_pathless_PYTHON" = none; then PYTHON=: else AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON]) fi am_display_PYTHON=$am_cv_pathless_PYTHON fi ]) if test "$PYTHON" = :; then dnl Run any user-specified action, or abort. m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])]) else dnl Query Python for its version number. Getting [:3] seems to be dnl the best way to do this; it's what "site.py" does in the standard dnl library. AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version], [am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[[:3]])"`]) AC_SUBST([PYTHON_VERSION], [$am_cv_python_version]) dnl Use the values of $prefix and $exec_prefix for the corresponding dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX. These are made dnl distinct variables so they can be overridden if need be. However, dnl general consensus is that you shouldn't need this ability. AC_SUBST([PYTHON_PREFIX], ['${prefix}']) AC_SUBST([PYTHON_EXEC_PREFIX], ['${exec_prefix}']) dnl At times (like when building shared libraries) you may want dnl to know which OS platform Python thinks this is. AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform], [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`]) AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform]) dnl Set up 4 directories: dnl pythondir -- where to install python scripts. This is the dnl site-packages directory, not the python standard library dnl directory like in previous automake betas. This behavior dnl is more consistent with lispdir.m4 for example. dnl Query distutils for this directory. AC_CACHE_CHECK([for $am_display_PYTHON script directory], [am_cv_python_pythondir], [if test "x$prefix" = xNONE then am_py_prefix=$ac_default_prefix else am_py_prefix=$prefix fi am_cv_python_pythondir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(0,0,prefix='$am_py_prefix'))" 2>/dev/null` case $am_cv_python_pythondir in $am_py_prefix*) am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"` ;; *) case $am_py_prefix in /usr|/System*) ;; *) am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages ;; esac ;; esac ]) AC_SUBST([pythondir], [$am_cv_python_pythondir]) dnl pkgpythondir -- $PACKAGE directory under pythondir. Was dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is dnl more consistent with the rest of automake. AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE]) dnl pyexecdir -- directory for installing python extension modules dnl (shared libraries) dnl Query distutils for this directory. AC_CACHE_CHECK([for $am_display_PYTHON extension module directory], [am_cv_python_pyexecdir], [if test "x$exec_prefix" = xNONE then am_py_exec_prefix=$am_py_prefix else am_py_exec_prefix=$exec_prefix fi am_cv_python_pyexecdir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(1,0,prefix='$am_py_exec_prefix'))" 2>/dev/null` case $am_cv_python_pyexecdir in $am_py_exec_prefix*) am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"` ;; *) case $am_py_exec_prefix in /usr|/System*) ;; *) am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages ;; esac ;; esac ]) AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir]) dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE) AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE]) dnl Run any user-specified action. $2 fi ]) # AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) # --------------------------------------------------------------------------- # Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION. # Run ACTION-IF-FALSE otherwise. # This test uses sys.hexversion instead of the string equivalent (first # word of sys.version), in order to cope with versions such as 2.2c1. # This supports Python 2.0 or higher. (2.0 was released on October 16, 2000). AC_DEFUN([AM_PYTHON_CHECK_VERSION], [prog="import sys # split strings by '.' and convert to numeric. Append some zeros # because we need at least 4 digits for the hex conversion. # map returns an iterator in Python 3.0 and a list in 2.x minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]] minverhex = 0 # xrange is not present in Python 3.0 and range returns an iterator for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]] sys.exit(sys.hexversion < minverhex)" AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])]) # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/abinit.m4]) m4_include([m4/ax_check_gl.m4]) m4_include([m4/ax_check_glu.m4]) m4_include([m4/ax_lang_compiler_ms.m4]) m4_include([m4/ax_lapack.m4]) m4_include([m4/bigdft.m4]) m4_include([m4/etsf_io.m4]) m4_include([m4/gtk-doc.m4]) m4_include([m4/intltool.m4]) m4_include([m4/libtool.m4]) m4_include([m4/libxc.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) m4_include([m4/netcdf.m4]) m4_include([m4/python.m4]) v_sim-3.7.0/Makefile.am0000644000353400050620000000054312215546214011621 00000000000000v_simlegal_DATA = \ ChangeLog.fr \ ChangeLog.en EXTRA_DIST = $(v_simlegal_DATA) \ autogen.sh \ configure \ bugs \ todo \ intltool-extract.in intltool-merge.in intltool-update.in ACLOCAL_AMFLAGS = -I m4 DISTCLEANFILES = intltool-extract intltool-merge intltool-update SUBDIRS = \ src \ lib \ etc \ po \ pixmaps \ examples \ Documentation v_sim-3.7.0/Makefile.in0000644000353400050620000007310712216330212011626 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ config.guess config.sub depcomp install-sh ltmain.sh missing \ py-compile ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/abinit.m4 \ $(top_srcdir)/m4/ax_check_gl.m4 \ $(top_srcdir)/m4/ax_check_glu.m4 \ $(top_srcdir)/m4/ax_lang_compiler_ms.m4 \ $(top_srcdir)/m4/ax_lapack.m4 $(top_srcdir)/m4/bigdft.m4 \ $(top_srcdir)/m4/etsf_io.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/libxc.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/netcdf.m4 \ $(top_srcdir)/m4/python.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(v_simlegaldir)" DATA = $(v_simlegal_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print AB_CPPFLAGS = @AB_CPPFLAGS@ AB_LIBS = @AB_LIBS@ ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIGDFT_CPPFLAGS = @BIGDFT_CPPFLAGS@ BIGDFT_LIBS = @BIGDFT_LIBS@ BLAS_LIBS = @BLAS_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETSF_IO_LIBS = @ETSF_IO_LIBS@ EXEEXT = @EXEEXT@ EXTRA_CFLAGS = @EXTRA_CFLAGS@ EXTRA_LDFLAGS = @EXTRA_LDFLAGS@ EXTRA_LIBS = @EXTRA_LIBS@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ FCLIBS = @FCLIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLIBS = @FLIBS@ FONT_BOLD = @FONT_BOLD@ FONT_NORMAL = @FONT_NORMAL@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_BIGDFT_CFLAGS = @GLIB_BIGDFT_CFLAGS@ GLIB_BIGDFT_LIBS = @GLIB_BIGDFT_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GOBJECT_INTROSPECTION_REQUIRED = @GOBJECT_INTROSPECTION_REQUIRED@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTKS_CFLAGS = @GTKS_CFLAGS@ GTKS_LIBS = @GTKS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_SCANNER = @G_IR_SCANNER@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LAPACK_LIBS = @LAPACK_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXC_LIBS = @LIBXC_LIBS@ LIB_ARCHIVE_CFLAGS = @LIB_ARCHIVE_CFLAGS@ LIB_ARCHIVE_LIBS = @LIB_ARCHIVE_LIBS@ LIB_YAML_CFLAGS = @LIB_YAML_CFLAGS@ LIB_YAML_LIBS = @LIB_YAML_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NC_CPPFLAGS = @NC_CPPFLAGS@ NC_LDFLAGS = @NC_LDFLAGS@ NC_LIBS = @NC_LIBS@ NC_NETCDF_3_CPPFLAG = @NC_NETCDF_3_CPPFLAG@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBABEL_CFLAGS = @OPENBABEL_CFLAGS@ OPENBABEL_LIBS = @OPENBABEL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PYGOBJECT_CFLAGS = @PYGOBJECT_CFLAGS@ PYGOBJECT_LIBS = @PYGOBJECT_LIBS@ PYGOBJECT_REQUIRED = @PYGOBJECT_REQUIRED@ PYGTK_CFLAGS = @PYGTK_CFLAGS@ PYGTK_LIBS = @PYGTK_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_INCLUDES = @PYTHON_INCLUDES@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ V_SIM_MAJOR_VERSION = @V_SIM_MAJOR_VERSION@ V_SIM_MICRO_VERSION = @V_SIM_MICRO_VERSION@ V_SIM_MINOR_VERSION = @V_SIM_MINOR_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ girdir = @girdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ lib_v_sim_version = @lib_v_sim_version@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typelibsdir = @typelibsdir@ v_simexamplesdir = @v_simexamplesdir@ v_simexedir = @v_simexedir@ v_simiconsdir = @v_simiconsdir@ v_simlegaldir = @v_simlegaldir@ v_simpixmapsdir = @v_simpixmapsdir@ v_simpluginsdir = @v_simpluginsdir@ v_simresourcesdir = @v_simresourcesdir@ visupyexecdir = @visupyexecdir@ visutypelibsdir = @visutypelibsdir@ v_simlegal_DATA = \ ChangeLog.fr \ ChangeLog.en EXTRA_DIST = $(v_simlegal_DATA) \ autogen.sh \ configure \ bugs \ todo \ intltool-extract.in intltool-merge.in intltool-update.in ACLOCAL_AMFLAGS = -I m4 DISTCLEANFILES = intltool-extract intltool-merge intltool-update SUBDIRS = \ src \ lib \ etc \ po \ pixmaps \ examples \ Documentation all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then rm -f stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt install-v_simlegalDATA: $(v_simlegal_DATA) @$(NORMAL_INSTALL) test -z "$(v_simlegaldir)" || $(MKDIR_P) "$(DESTDIR)$(v_simlegaldir)" @list='$(v_simlegal_DATA)'; test -n "$(v_simlegaldir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(v_simlegaldir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(v_simlegaldir)" || exit $$?; \ done uninstall-v_simlegalDATA: @$(NORMAL_UNINSTALL) @list='$(v_simlegal_DATA)'; test -n "$(v_simlegaldir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(v_simlegaldir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(DATA) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(v_simlegaldir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr \ distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-v_simlegalDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-v_simlegalDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ ctags-recursive install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-lzma dist-shar dist-tarZ dist-xz \ dist-zip distcheck distclean distclean-generic distclean-hdr \ distclean-libtool distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip install-v_simlegalDATA installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-v_simlegalDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: v_sim-3.7.0/config.h.in0000644000353400050620000001070312216330236011603 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Compile V_Sim in debug mode, very verbose. */ #undef DEBUG /* always defined to indicate that i18n is enabled */ #undef ENABLE_NLS /* Define to dummy `main' function (if any) required to link to the Fortran libraries. */ #undef F77_DUMMY_MAIN /* Define to dummy `main' function (if any) required to link to the Fortran libraries. */ #undef FC_DUMMY_MAIN /* Define if F77 and FC dummy `main' functions are identical. */ #undef FC_DUMMY_MAIN_EQ_F77 /* Define to a macro mangling the given C identifier (in lower and upper case), which must not contain underscores, for linking with Fortran. */ #undef FC_FUNC /* As FC_FUNC, but for C identifiers containing underscores. */ #undef FC_FUNC_ /* Gettext package. */ #undef GETTEXT_PACKAGE /* Export directory with system .typelib files. */ #undef GI_TYPELIBS_DIR /* Compile the ABINIT parser part for static linking. */ #undef HAVE_ABINIT_PARSER /* Compile the ABINIT symmetry part for static linking. */ #undef HAVE_ABINIT_SYMMETRY /* Use the Apple OpenGL framework. */ #undef HAVE_APPLE_OPENGL_FRAMEWORK /* Define to 1 if you have the `bind_textdomain_codeset' function. */ #undef HAVE_BIND_TEXTDOMAIN_CODESET /* Define if you have a BLAS library. */ #undef HAVE_BLAS /* If set, we can call cairo.h */ #undef HAVE_CAIRO /* Define to 1 if you have the `dcgettext' function. */ #undef HAVE_DCGETTEXT /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* If set, we can call FTGL.h */ #undef HAVE_FTGL /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define to 1 if you have the `glXChooseFBConfig' function. */ #undef HAVE_GLXCHOOSEFBCONFIG /* Define to 1 if you have the `glXCreatePbuffer' function. */ #undef HAVE_GLXCREATEPBUFFER /* Define to 1 if you have the `glXGetVisualFromFBConfig' function. */ #undef HAVE_GLXGETVISUALFROMFBCONFIG /* If set, we can call gtkgl.h */ #undef HAVE_GTKGLEXT /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define if you have LAPACK library. */ #undef HAVE_LAPACK /* Define if your file defines LC_MESSAGES. */ #undef HAVE_LC_MESSAGES /* libarchive is linkable. */ #undef HAVE_LIB_ARCHIVE /* Define to 1 if you have the header file. */ #undef HAVE_LOCALE_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* If set, we can call ab6_invars_new_from_file_with_pseudo() */ #undef HAVE_NEW_WITH_PSEUDO /* "Will use Pbuffer from GLX 1.3 for pixmap rendering." */ #undef HAVE_PBUFFER /* If set, we can call pygtk.h */ #undef HAVE_PYGTK /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* If set, we can call ab6_symmetry_get_type() */ #undef HAVE_SYM_GET_TYPE /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the header file. */ #undef HAVE_WINDOWS_H /* If set, we can call yaml.h */ #undef HAVE_YAML /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Export directory with Python gi module. */ #undef PYGI_EXEC_DIR /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Target platform. */ #undef SYSTEM_WIN32 /* Target platform. */ #undef SYSTEM_X11 /* Version number of package */ #undef VERSION /* Date of version release. */ #undef V_SIM_RELEASE_DATE /* enable GObject introspection support */ #undef WITH_GOBJECT_INTROSPECTION /* Tag this parameter as unused. */ #undef _U_ v_sim-3.7.0/configure0000754000353400050620000377630512216330213011505 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.68 for V_Sim stable branch 3.7.0. # # Report bugs to . # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software # Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and damien D caliste $0: AT cea D fr about your system, including any error $0: possibly output before this message. Then install a $0: modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='V_Sim stable branch' PACKAGE_TARNAME='v_sim' PACKAGE_VERSION='3.7.0' PACKAGE_STRING='V_Sim stable branch 3.7.0' PACKAGE_BUGREPORT='damien D caliste AT cea D fr' PACKAGE_URL='' ac_default_prefix=/usr/local # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS v_simpluginsdir v_simexamplesdir v_simlegaldir v_simiconsdir v_simpixmapsdir v_simresourcesdir v_simexedir WITH_GOBJECT_INTROSPECTION_FALSE WITH_GOBJECT_INTROSPECTION_TRUE visupyexecdir PYTHON_LIBS G_IR_COMPILER G_IR_SCANNER visutypelibsdir typelibsdir girdir PYGOBJECT_LIBS PYGOBJECT_CFLAGS GOBJECT_INTROSPECTION_LIBS GOBJECT_INTROSPECTION_CFLAGS PYGOBJECT_REQUIRED GOBJECT_INTROSPECTION_REQUIRED HAVE_BIGDFT_FALSE HAVE_BIGDFT_TRUE BIGDFT_LIBS BIGDFT_CPPFLAGS GLIB_BIGDFT_LIBS GLIB_BIGDFT_CFLAGS HAVE_LIB_ARCHIVE_FALSE HAVE_LIB_ARCHIVE_TRUE LIB_ARCHIVE_LIBS LIB_ARCHIVE_CFLAGS HAVE_ABINIT_FALSE HAVE_ABINIT_TRUE AB_LIBS AB_CPPFLAGS HAVE_ABINIT_SYMMETRY_FALSE HAVE_ABINIT_SYMMETRY_TRUE HAVE_ABINIT_PARSER_FALSE HAVE_ABINIT_PARSER_TRUE FCLIBS LIBXC_LIBS ETSF_IO_LIBS FCFLAGS_f90 LAPACK_LIBS BLAS_LIBS FLIBS HAVE_CUBE_FALSE HAVE_CUBE_TRUE HAVE_XSF_FALSE HAVE_XSF_TRUE HAVE_OPENBABEL_FALSE HAVE_OPENBABEL_TRUE OPENBABEL_LIBS OPENBABEL_CFLAGS HAVE_ETSF_FALSE HAVE_ETSF_TRUE NC_CPPFLAGS NC_NETCDF_3_CPPFLAG NC_LIBS NC_LDFLAGS GTK_DOC_USE_REBASE_FALSE GTK_DOC_USE_REBASE_TRUE GTK_DOC_USE_LIBTOOL_FALSE GTK_DOC_USE_LIBTOOL_TRUE GTK_DOC_BUILD_PDF_FALSE GTK_DOC_BUILD_PDF_TRUE GTK_DOC_BUILD_HTML_FALSE GTK_DOC_BUILD_HTML_TRUE ENABLE_GTK_DOC_FALSE ENABLE_GTK_DOC_TRUE GTKDOC_DEPS_LIBS GTKDOC_DEPS_CFLAGS HTML_DIR GTKDOC_MKPDF GTKDOC_REBASE GTKDOC_CHECK PYTHON_MODULE_FALSE PYTHON_MODULE_TRUE PYGTK_LIBS PYGTK_CFLAGS PYTHON_INCLUDES pkgpyexecdir pyexecdir pkgpythondir pythondir PYTHON_PLATFORM PYTHON_EXEC_PREFIX PYTHON_PREFIX PYTHON_VERSION PYTHON LIB_YAML_LIBS LIB_YAML_CFLAGS OPENGL_GTKGLEXT_FALSE OPENGL_GTKGLEXT_TRUE OPENGL_BUILTIN_X11_FALSE OPENGL_BUILTIN_X11_TRUE OPENGL_BUILTIN_WIN32_FALSE OPENGL_BUILTIN_WIN32_TRUE GTKS_LIBS GTKS_CFLAGS CAIRO_LIBS CAIRO_CFLAGS GLIB_LIBS GLIB_CFLAGS MKINSTALLDIRS POSUB POFILES PO_IN_DATADIR_FALSE PO_IN_DATADIR_TRUE INTLLIBS INSTOBJEXT GMOFILES CATOBJEXT CATALOGS MSGFMT_OPTS GETTEXT_PACKAGE DATADIRNAME ALL_LINGUAS INTLTOOL_PERL GMSGFMT MSGFMT MSGMERGE XGETTEXT INTLTOOL_POLICY_RULE INTLTOOL_SERVICE_RULE INTLTOOL_THEME_RULE INTLTOOL_SCHEMAS_RULE INTLTOOL_CAVES_RULE INTLTOOL_XML_NOMERGE_RULE INTLTOOL_XML_RULE INTLTOOL_KBD_RULE INTLTOOL_XAM_RULE INTLTOOL_UI_RULE INTLTOOL_SOUNDLIST_RULE INTLTOOL_SHEET_RULE INTLTOOL_SERVER_RULE INTLTOOL_PONG_RULE INTLTOOL_OAF_RULE INTLTOOL_PROP_RULE INTLTOOL_KEYS_RULE INTLTOOL_DIRECTORY_RULE INTLTOOL_DESKTOP_RULE intltool__v_merge_options_0 intltool__v_merge_options_ INTLTOOL_V_MERGE_OPTIONS INTLTOOL__v_MERGE_0 INTLTOOL__v_MERGE_ INTLTOOL_V_MERGE AM_DEFAULT_VERBOSITY INTLTOOL_EXTRACT INTLTOOL_MERGE INTLTOOL_UPDATE USE_NLS FTGL_LIBS FTGL_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG GLU_LIBS GLU_CFLAGS GL_LIBS GL_CFLAGS XMKMF BUILD_SHARED_BINARY_FALSE BUILD_SHARED_BINARY_TRUE BUILD_STATIC_BINARY_FALSE BUILD_STATIC_BINARY_TRUE PLATFORM_WIN32_FALSE PLATFORM_WIN32_TRUE PLATFORM_X11_FALSE PLATFORM_X11_TRUE EXTRA_LIBS EXTRA_CFLAGS EXTRA_LDFLAGS FONT_BOLD FONT_NORMAL CXXCPP CPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED OBJDUMP DLLTOOL AS host_os host_vendor host_cpu host build_os build_vendor build_cpu build LIBTOOL ac_ct_FC FCFLAGS FC ac_ct_F77 FFLAGS F77 am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM lib_v_sim_version V_SIM_MICRO_VERSION V_SIM_MINOR_VERSION V_SIM_MAJOR_VERSION target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_dependency_tracking enable_shared enable_static with_pic enable_fast_install with_gnu_ld with_sysroot enable_libtool_lock with_x with_apple_opengl_framework enable_nls with_gtk3 with_gtkglext with_yaml with_yaml_path enable_python_module enable_debug_messages with_html_dir enable_gtk_doc enable_gtk_doc_html enable_gtk_doc_pdf with_etsf_file_format with_nanoquanta with_netcdf with_netcdf_include with_netcdf_libdir with_openbabel with_xsf with_cube with_abinit with_abinit_include with_abinit_libdir with_blas with_lapack with_etsf_io with_etsf_io_include with_etsf_io_libdir with_libxc with_libxc_include with_libxc_libdir with_archives with_bigdft with_bigdft_include with_bigdft_libdir enable_introspection with_strict_cflags ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC F77 FFLAGS FC FCFLAGS CPP CXXCPP XMKMF PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR FTGL_CFLAGS FTGL_LIBS GLIB_CFLAGS GLIB_LIBS CAIRO_CFLAGS CAIRO_LIBS GTKS_CFLAGS GTKS_LIBS PYTHON PYGTK_CFLAGS PYGTK_LIBS GTKDOC_DEPS_CFLAGS GTKDOC_DEPS_LIBS OPENBABEL_CFLAGS OPENBABEL_LIBS LIB_ARCHIVE_CFLAGS LIB_ARCHIVE_LIBS GLIB_BIGDFT_CFLAGS GLIB_BIGDFT_LIBS GOBJECT_INTROSPECTION_CFLAGS GOBJECT_INTROSPECTION_LIBS PYGOBJECT_CFLAGS PYGOBJECT_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures V_Sim stable branch 3.7.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/v_sim] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of V_Sim stable branch 3.7.0:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --disable-nls do not use Native Language Support --enable-python-module create a Python module. --enable-debug-messages compile V_Sim with all the debug strings, it is very verbose (default=no). --enable-gtk-doc use gtk-doc to build documentation [[default=no]] --enable-gtk-doc-html build documentation in html format [[default=yes]] --enable-gtk-doc-pdf build documentation in pdf format [[default=no]] --enable-introspection enable GObject introspection Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-x use the X Window System --with-apple-opengl-framework use Apple OpenGL framework (Mac OS X only) --with-gtk3 use Gtk3 instead of Gtk2. --with-gtkglext use GtkGlExt as rendering surface for OpenGl. --without-yaml add support of YAML for input files (default = yes). --with-yaml-path give a path to find libyaml. --with-html-dir=PATH path to installed docs --with-etsf-file-format compile plug-in support for files that follow the ETSF specifications for structural positions and densities (default=no). --with-nanoquanta deprecated, use --with-etsf-file-format instead (default=no). --with-netcdf=ARG netcdf directory --with-netcdf-include=ARG netcdf include directory --with-netcdf-libdir=ARG netcdf library directory --with-openbabel compile plug-in support for a wrapper around the OpenBabel library (default=no). --with-xsf compile plug-in support for files that follow the XCrysDen format for structural positions and densities (default=no). --with-cube compile plug-in support for Cube files (densities and structures) (default=no). --with-abinit=ARG ABINIT directory (with include and lib subdirs) --with-abinit-include=ARG specific ABINIT include directory --with-abinit-libdir=ARG specific ABINIT library directory --with-blas=<lib> use BLAS library <lib> --with-lapack=<lib> use LAPACK library <lib> --with-etsf-io=ARG etsf_io directory --with-etsf-io-include=ARG etsf_io include directory --with-etsf-io-libdir=ARG etsf_io library directory --with-libxc=ARG libxc directory --with-libxc-include=ARG libxc include directory --with-libxc-libdir=ARG libxc library directory --with-archives add support of archives for input files. --with-bigdft=ARG BigDFT directory (with include and lib subdirs) --with-bigdft-include=ARG specific BigDFT include directory --with-bigdft-libdir=ARG specific BigDFT library directory --with-strict-cflags if set or absent some correctness cflags are appended to the CFLAGS variable. Appended values dependent on the platform and code branch (default on Unix for development is Wall Wno-unused W Werror ansi pedantic-errors). Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags F77 Fortran 77 compiler command FFLAGS Fortran 77 compiler flags FC Fortran compiler command FCFLAGS Fortran compiler flags CPP C preprocessor CXXCPP C++ preprocessor XMKMF Path to xmkmf, Makefile generator for X Window System PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path FTGL_CFLAGS C compiler flags for FTGL, overriding pkg-config FTGL_LIBS linker flags for FTGL, overriding pkg-config GLIB_CFLAGS C compiler flags for GLIB, overriding pkg-config GLIB_LIBS linker flags for GLIB, overriding pkg-config CAIRO_CFLAGS C compiler flags for CAIRO, overriding pkg-config CAIRO_LIBS linker flags for CAIRO, overriding pkg-config GTKS_CFLAGS C compiler flags for GTKS, overriding pkg-config GTKS_LIBS linker flags for GTKS, overriding pkg-config PYTHON the Python interpreter PYGTK_CFLAGS C compiler flags for PYGTK, overriding pkg-config PYGTK_LIBS linker flags for PYGTK, overriding pkg-config GTKDOC_DEPS_CFLAGS C compiler flags for GTKDOC_DEPS, overriding pkg-config GTKDOC_DEPS_LIBS linker flags for GTKDOC_DEPS, overriding pkg-config OPENBABEL_CFLAGS C compiler flags for OPENBABEL, overriding pkg-config OPENBABEL_LIBS linker flags for OPENBABEL, overriding pkg-config LIB_ARCHIVE_CFLAGS C compiler flags for LIB_ARCHIVE, overriding pkg-config LIB_ARCHIVE_LIBS linker flags for LIB_ARCHIVE, overriding pkg-config GLIB_BIGDFT_CFLAGS C compiler flags for GLIB_BIGDFT, overriding pkg-config GLIB_BIGDFT_LIBS linker flags for GLIB_BIGDFT, overriding pkg-config GOBJECT_INTROSPECTION_CFLAGS C compiler flags for GOBJECT_INTROSPECTION, overriding pkg-config GOBJECT_INTROSPECTION_LIBS linker flags for GOBJECT_INTROSPECTION, overriding pkg-config PYGOBJECT_CFLAGS C compiler flags for PYGOBJECT, overriding pkg-config PYGOBJECT_LIBS linker flags for PYGOBJECT, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF V_Sim stable branch configure 3.7.0 generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_f77_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_f77_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_f77_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_f77_try_compile # ac_fn_fc_try_compile LINENO # --------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_fc_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_fc_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_fc_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_f77_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_f77_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_f77_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_f77_try_link # ac_fn_fc_try_link LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_fc_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_fc_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_fc_try_link # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------------------- ## ## Report this to damien D caliste AT cea D fr ## ## ------------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by V_Sim stable branch $as_me 3.7.0, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu V_SIM_MAJOR_VERSION=$(echo $PACKAGE_VERSION | cut -d'.' -f1) V_SIM_MINOR_VERSION=$(echo $PACKAGE_VERSION | cut -d'.' -f2) V_SIM_MICRO_VERSION=$(echo $PACKAGE_VERSION | cut -d'.' -f3) case "x$V_SIM_MICRO_VERSION" in x99*) V_SIM_MINOR_VERSION=$(($V_SIM_MINOR_VERSION + 1));; esac lib_v_sim_version=$V_SIM_MINOR_VERSION":0" need_cpp_compiler="no" cflags_set=${CFLAGS} cxxflags_set=${CXXFLAGS} am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE=$PACKAGE_TARNAME VERSION=$PACKAGE_VERSION cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' ac_config_headers="$ac_config_headers config.h" date="2013-09-16" { $as_echo "$as_me:${as_lineno-$LINENO}: Compiling $PACKAGE_NAME" >&5 $as_echo "$as_me: Compiling $PACKAGE_NAME" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: $PACKAGE_TARNAME $PACKAGE_VERSION $date" >&5 $as_echo "$as_me: $PACKAGE_TARNAME $PACKAGE_VERSION $date" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for instalation directory" >&5 $as_echo_n "checking for instalation directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $prefix" >&5 $as_echo "$prefix" >&6; } ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_F77+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$F77"; then ac_cv_prog_F77="$F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_F77="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi F77=$ac_cv_prog_F77 if test -n "$F77"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $F77" >&5 $as_echo "$F77" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$F77" && break done fi if test -z "$F77"; then ac_ct_F77=$F77 for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_F77+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_F77"; then ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_F77="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_F77=$ac_cv_prog_ac_ct_F77 if test -n "$ac_ct_F77"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_F77" >&5 $as_echo "$ac_ct_F77" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_F77" && break done if test "x$ac_ct_F77" = x; then F77="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac F77=$ac_ct_F77 fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done rm -f a.out # If we don't use `.F' as extension, the preprocessor is not run on the # input file. (Note that this only needs to work for GNU compilers.) ac_save_ext=$ac_ext ac_ext=F { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran 77 compiler" >&5 $as_echo_n "checking whether we are using the GNU Fortran 77 compiler... " >&6; } if ${ac_cv_f77_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF program main #ifndef __GNUC__ choke me #endif end _ACEOF if ac_fn_f77_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_f77_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_compiler_gnu" >&5 $as_echo "$ac_cv_f77_compiler_gnu" >&6; } ac_ext=$ac_save_ext ac_test_FFLAGS=${FFLAGS+set} ac_save_FFLAGS=$FFLAGS FFLAGS= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $F77 accepts -g" >&5 $as_echo_n "checking whether $F77 accepts -g... " >&6; } if ${ac_cv_prog_f77_g+:} false; then : $as_echo_n "(cached) " >&6 else FFLAGS=-g cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_compile "$LINENO"; then : ac_cv_prog_f77_g=yes else ac_cv_prog_f77_g=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_f77_g" >&5 $as_echo "$ac_cv_prog_f77_g" >&6; } if test "$ac_test_FFLAGS" = set; then FFLAGS=$ac_save_FFLAGS elif test $ac_cv_prog_f77_g = yes; then if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-g -O2" else FFLAGS="-g" fi else if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-O2" else FFLAGS= fi fi if test $ac_compiler_gnu = yes; then G77=yes else G77= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn xlf90 f90 pgf90 pghpf epcf90 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_FC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$FC"; then ac_cv_prog_FC="$FC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_FC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi FC=$ac_cv_prog_FC if test -n "$FC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FC" >&5 $as_echo "$FC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$FC" && break done fi if test -z "$FC"; then ac_ct_FC=$FC for ac_prog in gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn xlf90 f90 pgf90 pghpf epcf90 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_FC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_FC"; then ac_cv_prog_ac_ct_FC="$ac_ct_FC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_FC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_FC=$ac_cv_prog_ac_ct_FC if test -n "$ac_ct_FC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FC" >&5 $as_echo "$ac_ct_FC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_FC" && break done if test "x$ac_ct_FC" = x; then FC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac FC=$ac_ct_FC fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done rm -f a.out # If we don't use `.F' as extension, the preprocessor is not run on the # input file. (Note that this only needs to work for GNU compilers.) ac_save_ext=$ac_ext ac_ext=F { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran compiler" >&5 $as_echo_n "checking whether we are using the GNU Fortran compiler... " >&6; } if ${ac_cv_fc_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF program main #ifndef __GNUC__ choke me #endif end _ACEOF if ac_fn_fc_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_fc_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_compiler_gnu" >&5 $as_echo "$ac_cv_fc_compiler_gnu" >&6; } ac_ext=$ac_save_ext ac_test_FCFLAGS=${FCFLAGS+set} ac_save_FCFLAGS=$FCFLAGS FCFLAGS= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $FC accepts -g" >&5 $as_echo_n "checking whether $FC accepts -g... " >&6; } if ${ac_cv_prog_fc_g+:} false; then : $as_echo_n "(cached) " >&6 else FCFLAGS=-g cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_fc_try_compile "$LINENO"; then : ac_cv_prog_fc_g=yes else ac_cv_prog_fc_g=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_fc_g" >&5 $as_echo "$ac_cv_prog_fc_g" >&6; } if test "$ac_test_FCFLAGS" = set; then FCFLAGS=$ac_save_FCFLAGS elif test $ac_cv_prog_fc_g = yes; then if test "x$ac_cv_fc_compiler_gnu" = xyes; then FCFLAGS="-g -O2" else FCFLAGS="-g" fi else if test "x$ac_cv_fc_compiler_gnu" = xyes; then FCFLAGS="-O2" else FCFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test "$GCC" = "yes" ; then $as_echo "#define _U_ __attribute((unused))" >>confdefs.h fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}libtool", so it can be a program name with args. set dummy ${ac_tool_prefix}libtool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIBTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIBTOOL"; then ac_cv_prog_LIBTOOL="$LIBTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_LIBTOOL="${ac_tool_prefix}libtool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIBTOOL=$ac_cv_prog_LIBTOOL if test -n "$LIBTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBTOOL" >&5 $as_echo "$LIBTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIBTOOL"; then ac_ct_LIBTOOL=$LIBTOOL # Extract the first word of "libtool", so it can be a program name with args. set dummy libtool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIBTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIBTOOL"; then ac_cv_prog_ac_ct_LIBTOOL="$ac_ct_LIBTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_LIBTOOL="libtool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIBTOOL=$ac_cv_prog_ac_ct_LIBTOOL if test -n "$ac_ct_LIBTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIBTOOL" >&5 $as_echo "$ac_ct_LIBTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIBTOOL" = x; then LIBTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIBTOOL=$ac_ct_LIBTOOL fi else LIBTOOL="$ac_cv_prog_LIBTOOL" fi if test "$libtool" = ":" ; then as_fn_error $? "\"No 'libtool' program found.\"" "$LINENO" 5 fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AS"; then ac_cv_prog_AS="$AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AS="${ac_tool_prefix}as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AS=$ac_cv_prog_AS if test -n "$AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 $as_echo "$AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AS"; then ac_ct_AS=$AS # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AS"; then ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_AS="as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AS=$ac_cv_prog_ac_ct_AS if test -n "$ac_ct_AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 $as_echo "$ac_ct_AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AS" = x; then AS="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AS=$ac_ct_AS fi else AS="$ac_cv_prog_AS" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi ;; esac test -z "$AS" && AS=as test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$OBJDUMP" && OBJDUMP=objdump case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf # Set options enable_dlopen=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi link_all_deplibs=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_CXX='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty # executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared # libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else ld_shlibs_CXX=no fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; gnu*) ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs_CXX=no ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink || test "$inherit_rpath_CXX" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi archive_cmds_need_lc_F77=no allow_undefined_flag_F77= always_export_symbols_F77=no archive_expsym_cmds_F77= export_dynamic_flag_spec_F77= hardcode_direct_F77=no hardcode_direct_absolute_F77=no hardcode_libdir_flag_spec_F77= hardcode_libdir_separator_F77= hardcode_minus_L_F77=no hardcode_automatic_F77=no inherit_rpath_F77=no module_cmds_F77= module_expsym_cmds_F77= link_all_deplibs_F77=unknown old_archive_cmds_F77=$old_archive_cmds reload_flag_F77=$reload_flag reload_cmds_F77=$reload_cmds no_undefined_flag_F77= whole_archive_flag_spec_F77= enable_shared_with_static_runtimes_F77=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o objext_F77=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC compiler_F77=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` GCC=$G77 if test -n "$compiler"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } GCC_F77="$G77" LD_F77="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... lt_prog_compiler_wl_F77= lt_prog_compiler_pic_F77= lt_prog_compiler_static_F77= if test "$GCC" = yes; then lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_static_F77='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_F77='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_F77='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_F77='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_F77= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_F77=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_F77='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_F77=-Kconform_pic fi ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl_F77='-Xlinker ' if test -n "$lt_prog_compiler_pic_F77"; then lt_prog_compiler_pic_F77="-Xcompiler $lt_prog_compiler_pic_F77" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_F77='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' else lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_F77='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_F77='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_F77='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_F77='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_F77='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fPIC' lt_prog_compiler_static_F77='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='--shared' lt_prog_compiler_static_F77='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl_F77='-Wl,-Wl,,' lt_prog_compiler_pic_F77='-PIC' lt_prog_compiler_static_F77='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fpic' lt_prog_compiler_static_F77='-Bstatic' ;; ccc*) lt_prog_compiler_wl_F77='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-qpic' lt_prog_compiler_static_F77='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' lt_prog_compiler_wl_F77='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' lt_prog_compiler_wl_F77='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' lt_prog_compiler_wl_F77='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fPIC' lt_prog_compiler_static_F77='-static' ;; *Portland\ Group*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fpic' lt_prog_compiler_static_F77='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_F77='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_F77='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; rdos*) lt_prog_compiler_static_F77='-non_shared' ;; solaris*) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl_F77='-Qoption ld ';; *) lt_prog_compiler_wl_F77='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl_F77='-Qoption ld ' lt_prog_compiler_pic_F77='-PIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic_F77='-Kconform_pic' lt_prog_compiler_static_F77='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; unicos*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_can_build_shared_F77=no ;; uts4*) lt_prog_compiler_pic_F77='-pic' lt_prog_compiler_static_F77='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_F77=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_F77= ;; *) lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_F77+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_F77=$lt_prog_compiler_pic_F77 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_F77" >&5 $as_echo "$lt_cv_prog_compiler_pic_F77" >&6; } lt_prog_compiler_pic_F77=$lt_cv_prog_compiler_pic_F77 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_F77"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... " >&6; } if ${lt_cv_prog_compiler_pic_works_F77+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_F77=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_F77" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_F77=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_F77" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_F77" >&6; } if test x"$lt_cv_prog_compiler_pic_works_F77" = xyes; then case $lt_prog_compiler_pic_F77 in "" | " "*) ;; *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; esac else lt_prog_compiler_pic_F77= lt_prog_compiler_can_build_shared_F77=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_F77+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_F77=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_F77=yes fi else lt_cv_prog_compiler_static_works_F77=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_F77" >&5 $as_echo "$lt_cv_prog_compiler_static_works_F77" >&6; } if test x"$lt_cv_prog_compiler_static_works_F77" = xyes; then : else lt_prog_compiler_static_F77= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_F77+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_F77=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_F77=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_F77" >&5 $as_echo "$lt_cv_prog_compiler_c_o_F77" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_F77+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_F77=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_F77=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_F77" >&5 $as_echo "$lt_cv_prog_compiler_c_o_F77" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag_F77= always_export_symbols_F77=no archive_cmds_F77= archive_expsym_cmds_F77= compiler_needs_object_F77=no enable_shared_with_static_runtimes_F77=no export_dynamic_flag_spec_F77= export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic_F77=no hardcode_direct_F77=no hardcode_direct_absolute_F77=no hardcode_libdir_flag_spec_F77= hardcode_libdir_separator_F77= hardcode_minus_L_F77=no hardcode_shlibpath_var_F77=unsupported inherit_rpath_F77=no link_all_deplibs_F77=unknown module_cmds_F77= module_expsym_cmds_F77= old_archive_from_new_cmds_F77= old_archive_from_expsyms_cmds_F77= thread_safe_flag_spec_F77= whole_archive_flag_spec_F77= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_F77= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms_F77='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs_F77=no ;; esac ld_shlibs_F77=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_F77='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_F77= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs_F77=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='' ;; m68k) archive_cmds_F77='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_F77=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_F77=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_F77='-L$libdir' export_dynamic_flag_spec_F77='${wl}--export-all-symbols' allow_undefined_flag_F77=unsupported always_export_symbols_F77=no enable_shared_with_static_runtimes_F77=yes export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_F77='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_F77=no fi ;; haiku*) archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_F77=yes ;; interix[3-9]*) hardcode_direct_F77=no hardcode_shlibpath_var_F77=no hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' export_dynamic_flag_spec_F77='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec_F77= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_F77=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec_F77='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_F77=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds_F77='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_F77='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec_F77='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_F77='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs_F77=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs_F77=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs_F77=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; esac ;; sunos4*) archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; esac if test "$ld_shlibs_F77" = no; then runpath_var= hardcode_libdir_flag_spec_F77= export_dynamic_flag_spec_F77= whole_archive_flag_spec_F77= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_F77=unsupported always_export_symbols_F77=yes archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_F77=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_F77=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_F77='' hardcode_direct_F77=yes hardcode_direct_absolute_F77=yes hardcode_libdir_separator_F77=':' link_all_deplibs_F77=yes file_list_spec_F77='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_F77=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_F77=yes hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_libdir_separator_F77= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi link_all_deplibs_F77=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_F77='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_F77=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_F77='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__F77+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__F77=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__F77"; then lt_cv_aix_libpath__F77=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__F77"; then lt_cv_aix_libpath__F77="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__F77 fi hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_F77='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_F77="-z nodefs" archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__F77+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__F77=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__F77"; then lt_cv_aix_libpath__F77=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__F77"; then lt_cv_aix_libpath__F77="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__F77 fi hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_F77=' ${wl}-bernotok' allow_undefined_flag_F77=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_F77='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_F77='$convenience' fi archive_cmds_need_lc_F77=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='' ;; m68k) archive_cmds_F77='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec_F77=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec_F77=' ' allow_undefined_flag_F77=unsupported always_export_symbols_F77=yes file_list_spec_F77='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_F77='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, F77)='true' enable_shared_with_static_runtimes_F77=yes exclude_expsyms_F77='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds_F77='chmod 644 $oldlib' postlink_cmds_F77='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec_F77=' ' allow_undefined_flag_F77=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds_F77='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_F77='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes_F77=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_F77=no hardcode_direct_F77=no hardcode_automatic_F77=yes hardcode_shlibpath_var_F77=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_F77='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' compiler_needs_object_F77=yes else whole_archive_flag_spec_F77='' fi link_all_deplibs_F77=yes allow_undefined_flag_F77="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_F77="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_F77="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_F77="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_F77="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs_F77=no fi ;; dgux*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds_F77='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds_F77='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes export_dynamic_flag_spec_F77='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds_F77='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes hardcode_direct_absolute_F77=yes export_dynamic_flag_spec_F77='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_F77='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_F77='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: case $host_cpu in hppa*64*|ia64*) hardcode_direct_F77=no hardcode_shlibpath_var_F77=no ;; *) hardcode_direct_F77=yes hardcode_direct_absolute_F77=yes export_dynamic_flag_spec_F77='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat > conftest.$ac_ext <<_ACEOF subroutine foo end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc_F77='no' hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: inherit_rpath_F77=yes link_all_deplibs_F77=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; newsos6) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_shlibpath_var_F77=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no hardcode_direct_absolute_F77=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' export_dynamic_flag_spec_F77='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-R$libdir' ;; *) archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs_F77=no fi ;; os2*) hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes allow_undefined_flag_F77=unsupported archive_cmds_F77='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc_F77='no' hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_F77='-rpath $libdir' fi archive_cmds_need_lc_F77='no' hardcode_libdir_separator_F77=: ;; solaris*) no_undefined_flag_F77=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds_F77='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds_F77='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_shlibpath_var_F77=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec_F77='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs_F77=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; sysv4) case $host_vendor in sni) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_F77='$CC -r -o $output$reload_objs' hardcode_direct_F77=no ;; motorola) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_F77=no ;; sysv4.3*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no export_dynamic_flag_spec_F77='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_F77=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_F77='${wl}-z,text' archive_cmds_need_lc_F77=no hardcode_shlibpath_var_F77=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_F77='${wl}-z,text' allow_undefined_flag_F77='${wl}-z,nodefs' archive_cmds_need_lc_F77=no hardcode_shlibpath_var_F77=no hardcode_libdir_flag_spec_F77='${wl}-R,$libdir' hardcode_libdir_separator_F77=':' link_all_deplibs_F77=yes export_dynamic_flag_spec_F77='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; *) ld_shlibs_F77=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec_F77='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_F77" >&5 $as_echo "$ld_shlibs_F77" >&6; } test "$ld_shlibs_F77" = no && can_build_shared=no with_gnu_ld_F77=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_F77" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_F77=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_F77 in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_F77+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_F77 pic_flag=$lt_prog_compiler_pic_F77 compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_F77 allow_undefined_flag_F77= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_F77 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_F77 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_F77=no else lt_cv_archive_cmds_need_lc_F77=yes fi allow_undefined_flag_F77=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_F77" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_F77" >&6; } archive_cmds_need_lc_F77=$lt_cv_archive_cmds_need_lc_F77 ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_F77\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_F77\"" cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_F77= if test -n "$hardcode_libdir_flag_spec_F77" || test -n "$runpath_var_F77" || test "X$hardcode_automatic_F77" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_F77" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, F77)" != no && test "$hardcode_minus_L_F77" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_F77=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_F77=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_F77=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_F77" >&5 $as_echo "$hardcode_action_F77" >&6; } if test "$hardcode_action_F77" = relink || test "$inherit_rpath_F77" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi archive_cmds_need_lc_FC=no allow_undefined_flag_FC= always_export_symbols_FC=no archive_expsym_cmds_FC= export_dynamic_flag_spec_FC= hardcode_direct_FC=no hardcode_direct_absolute_FC=no hardcode_libdir_flag_spec_FC= hardcode_libdir_separator_FC= hardcode_minus_L_FC=no hardcode_automatic_FC=no inherit_rpath_FC=no module_cmds_FC= module_expsym_cmds_FC= link_all_deplibs_FC=unknown old_archive_cmds_FC=$old_archive_cmds reload_flag_FC=$reload_flag reload_cmds_FC=$reload_cmds no_undefined_flag_FC= whole_archive_flag_spec_FC= enable_shared_with_static_runtimes_FC=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o objext_FC=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu compiler_FC=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` if test -n "$compiler"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } GCC_FC="$ac_cv_fc_compiler_gnu" LD_FC="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_FC= postdep_objects_FC= predeps_FC= postdeps_FC= compiler_lib_search_path_FC= cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_FC"; then compiler_lib_search_path_FC="${prev}${p}" else compiler_lib_search_path_FC="${compiler_lib_search_path_FC} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_FC"; then postdeps_FC="${prev}${p}" else postdeps_FC="${postdeps_FC} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_FC"; then predep_objects_FC="$p" else predep_objects_FC="$predep_objects_FC $p" fi else if test -z "$postdep_objects_FC"; then postdep_objects_FC="$p" else postdep_objects_FC="$postdep_objects_FC $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling FC test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case " $postdeps_FC " in *" -lc "*) archive_cmds_need_lc_FC=no ;; esac compiler_lib_search_dirs_FC= if test -n "${compiler_lib_search_path_FC}"; then compiler_lib_search_dirs_FC=`echo " ${compiler_lib_search_path_FC}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_FC= lt_prog_compiler_pic_FC= lt_prog_compiler_static_FC= if test "$GCC" = yes; then lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_static_FC='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_FC='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_FC='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_FC='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_FC='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_FC='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_FC= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic_FC='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_FC=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_FC='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_FC=-Kconform_pic fi ;; *) lt_prog_compiler_pic_FC='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl_FC='-Xlinker ' if test -n "$lt_prog_compiler_pic_FC"; then lt_prog_compiler_pic_FC="-Xcompiler $lt_prog_compiler_pic_FC" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_FC='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_FC='-Bstatic' else lt_prog_compiler_static_FC='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_FC='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_FC='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_FC='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_FC='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_FC='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_FC='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fPIC' lt_prog_compiler_static_FC='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='--shared' lt_prog_compiler_static_FC='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl_FC='-Wl,-Wl,,' lt_prog_compiler_pic_FC='-PIC' lt_prog_compiler_static_FC='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fpic' lt_prog_compiler_static_FC='-Bstatic' ;; ccc*) lt_prog_compiler_wl_FC='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_FC='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-qpic' lt_prog_compiler_static_FC='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' lt_prog_compiler_wl_FC='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' lt_prog_compiler_wl_FC='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' lt_prog_compiler_wl_FC='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fPIC' lt_prog_compiler_static_FC='-static' ;; *Portland\ Group*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fpic' lt_prog_compiler_static_FC='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_FC='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_FC='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_FC='-non_shared' ;; rdos*) lt_prog_compiler_static_FC='-non_shared' ;; solaris*) lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl_FC='-Qoption ld ';; *) lt_prog_compiler_wl_FC='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl_FC='-Qoption ld ' lt_prog_compiler_pic_FC='-PIC' lt_prog_compiler_static_FC='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic_FC='-Kconform_pic' lt_prog_compiler_static_FC='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' ;; unicos*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_can_build_shared_FC=no ;; uts4*) lt_prog_compiler_pic_FC='-pic' lt_prog_compiler_static_FC='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_FC=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_FC= ;; *) lt_prog_compiler_pic_FC="$lt_prog_compiler_pic_FC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_FC+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_FC=$lt_prog_compiler_pic_FC fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_FC" >&5 $as_echo "$lt_cv_prog_compiler_pic_FC" >&6; } lt_prog_compiler_pic_FC=$lt_cv_prog_compiler_pic_FC # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_FC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_FC works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_FC works... " >&6; } if ${lt_cv_prog_compiler_pic_works_FC+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_FC=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_FC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_FC=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_FC" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_FC" >&6; } if test x"$lt_cv_prog_compiler_pic_works_FC" = xyes; then case $lt_prog_compiler_pic_FC in "" | " "*) ;; *) lt_prog_compiler_pic_FC=" $lt_prog_compiler_pic_FC" ;; esac else lt_prog_compiler_pic_FC= lt_prog_compiler_can_build_shared_FC=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_FC eval lt_tmp_static_flag=\"$lt_prog_compiler_static_FC\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_FC+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_FC=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_FC=yes fi else lt_cv_prog_compiler_static_works_FC=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_FC" >&5 $as_echo "$lt_cv_prog_compiler_static_works_FC" >&6; } if test x"$lt_cv_prog_compiler_static_works_FC" = xyes; then : else lt_prog_compiler_static_FC= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_FC+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_FC=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_FC=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_FC" >&5 $as_echo "$lt_cv_prog_compiler_c_o_FC" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_FC+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_FC=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_FC=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_FC" >&5 $as_echo "$lt_cv_prog_compiler_c_o_FC" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_FC" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag_FC= always_export_symbols_FC=no archive_cmds_FC= archive_expsym_cmds_FC= compiler_needs_object_FC=no enable_shared_with_static_runtimes_FC=no export_dynamic_flag_spec_FC= export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic_FC=no hardcode_direct_FC=no hardcode_direct_absolute_FC=no hardcode_libdir_flag_spec_FC= hardcode_libdir_separator_FC= hardcode_minus_L_FC=no hardcode_shlibpath_var_FC=unsupported inherit_rpath_FC=no link_all_deplibs_FC=unknown module_cmds_FC= module_expsym_cmds_FC= old_archive_from_new_cmds_FC= old_archive_from_expsyms_cmds_FC= thread_safe_flag_spec_FC= whole_archive_flag_spec_FC= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_FC= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms_FC='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs_FC=no ;; esac ld_shlibs_FC=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_FC='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_FC="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_FC= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs_FC=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_FC='' ;; m68k) archive_cmds_FC='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_minus_L_FC=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_FC=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_FC='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_FC=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, FC) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_FC='-L$libdir' export_dynamic_flag_spec_FC='${wl}--export-all-symbols' allow_undefined_flag_FC=unsupported always_export_symbols_FC=no enable_shared_with_static_runtimes_FC=yes export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_FC='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_FC='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_FC=no fi ;; haiku*) archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_FC=yes ;; interix[3-9]*) hardcode_direct_FC=no hardcode_shlibpath_var_FC=no hardcode_libdir_flag_spec_FC='${wl}-rpath,$libdir' export_dynamic_flag_spec_FC='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_FC='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec_FC='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec_FC='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec_FC= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec_FC='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_FC=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec_FC='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_FC=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds_FC='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_FC='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec_FC='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' archive_cmds_FC='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_FC='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs_FC=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_FC='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs_FC=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_FC=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs_FC=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_FC=no fi ;; esac ;; sunos4*) archive_cmds_FC='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_FC=yes hardcode_shlibpath_var_FC=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_FC=no fi ;; esac if test "$ld_shlibs_FC" = no; then runpath_var= hardcode_libdir_flag_spec_FC= export_dynamic_flag_spec_FC= whole_archive_flag_spec_FC= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_FC=unsupported always_export_symbols_FC=yes archive_expsym_cmds_FC='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_FC=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_FC=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_FC='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_FC='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_FC='' hardcode_direct_FC=yes hardcode_direct_absolute_FC=yes hardcode_libdir_separator_FC=':' link_all_deplibs_FC=yes file_list_spec_FC='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_FC=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_FC=yes hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_libdir_separator_FC= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi link_all_deplibs_FC=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_FC='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_FC=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_FC='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__FC+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_fc_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__FC=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__FC"; then lt_cv_aix_libpath__FC=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__FC"; then lt_cv_aix_libpath__FC="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__FC fi hardcode_libdir_flag_spec_FC='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_FC='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_FC='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_FC="-z nodefs" archive_expsym_cmds_FC="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__FC+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_fc_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__FC=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__FC"; then lt_cv_aix_libpath__FC=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__FC"; then lt_cv_aix_libpath__FC="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__FC fi hardcode_libdir_flag_spec_FC='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_FC=' ${wl}-bernotok' allow_undefined_flag_FC=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_FC='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_FC='$convenience' fi archive_cmds_need_lc_FC=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds_FC="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_FC='' ;; m68k) archive_cmds_FC='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_minus_L_FC=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec_FC=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec_FC=' ' allow_undefined_flag_FC=unsupported always_export_symbols_FC=yes file_list_spec_FC='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_FC='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_FC='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, FC)='true' enable_shared_with_static_runtimes_FC=yes exclude_expsyms_FC='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds_FC='chmod 644 $oldlib' postlink_cmds_FC='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec_FC=' ' allow_undefined_flag_FC=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_FC='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds_FC='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_FC='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes_FC=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_FC=no hardcode_direct_FC=no hardcode_automatic_FC=yes hardcode_shlibpath_var_FC=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_FC='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' compiler_needs_object_FC=yes else whole_archive_flag_spec_FC='' fi link_all_deplibs_FC=yes allow_undefined_flag_FC="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_FC="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_FC="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_FC="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_FC="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs_FC=no fi ;; dgux*) archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_shlibpath_var_FC=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_FC='-R$libdir' hardcode_direct_FC=yes hardcode_shlibpath_var_FC=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_FC=yes hardcode_minus_L_FC=yes hardcode_shlibpath_var_FC=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_FC='-R$libdir' hardcode_direct_FC=yes hardcode_shlibpath_var_FC=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds_FC='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds_FC='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec_FC='${wl}+b ${wl}$libdir' hardcode_libdir_separator_FC=: hardcode_direct_FC=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_FC=yes export_dynamic_flag_spec_FC='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds_FC='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_FC='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_FC='${wl}+b ${wl}$libdir' hardcode_libdir_separator_FC=: hardcode_direct_FC=yes hardcode_direct_absolute_FC=yes export_dynamic_flag_spec_FC='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_FC=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds_FC='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_FC='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_FC='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds_FC='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_FC='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_FC='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_FC='${wl}+b ${wl}$libdir' hardcode_libdir_separator_FC=: case $host_cpu in hppa*64*|ia64*) hardcode_direct_FC=no hardcode_shlibpath_var_FC=no ;; *) hardcode_direct_FC=yes hardcode_direct_absolute_FC=yes export_dynamic_flag_spec_FC='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_FC=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat > conftest.$ac_ext <<_ACEOF subroutine foo end _ACEOF if ac_fn_fc_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc_FC='no' hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_FC=: inherit_rpath_FC=yes link_all_deplibs_FC=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_FC='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_FC='-R$libdir' hardcode_direct_FC=yes hardcode_shlibpath_var_FC=no ;; newsos6) archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_FC=yes hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_FC=: hardcode_shlibpath_var_FC=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_FC=yes hardcode_shlibpath_var_FC=no hardcode_direct_absolute_FC=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec_FC='${wl}-rpath,$libdir' export_dynamic_flag_spec_FC='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_FC='-R$libdir' ;; *) archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_FC='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs_FC=no fi ;; os2*) hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_minus_L_FC=yes allow_undefined_flag_FC=unsupported archive_cmds_FC='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds_FC='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag_FC=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_FC='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag_FC=' -expect_unresolved \*' archive_cmds_FC='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc_FC='no' hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_FC=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag_FC=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_FC='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' else allow_undefined_flag_FC=' -expect_unresolved \*' archive_cmds_FC='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_FC='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_FC='-rpath $libdir' fi archive_cmds_need_lc_FC='no' hardcode_libdir_separator_FC=: ;; solaris*) no_undefined_flag_FC=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds_FC='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds_FC='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds_FC='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec_FC='-R$libdir' hardcode_shlibpath_var_FC=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec_FC='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec_FC='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs_FC=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds_FC='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_FC='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_direct_FC=yes hardcode_minus_L_FC=yes hardcode_shlibpath_var_FC=no ;; sysv4) case $host_vendor in sni) archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_FC=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_FC='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_FC='$CC -r -o $output$reload_objs' hardcode_direct_FC=no ;; motorola) archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_FC=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_FC=no ;; sysv4.3*) archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_FC=no export_dynamic_flag_spec_FC='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_FC=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_FC=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_FC='${wl}-z,text' archive_cmds_need_lc_FC=no hardcode_shlibpath_var_FC=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_FC='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_FC='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_FC='${wl}-z,text' allow_undefined_flag_FC='${wl}-z,nodefs' archive_cmds_need_lc_FC=no hardcode_shlibpath_var_FC=no hardcode_libdir_flag_spec_FC='${wl}-R,$libdir' hardcode_libdir_separator_FC=':' link_all_deplibs_FC=yes export_dynamic_flag_spec_FC='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_FC='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_FC='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_shlibpath_var_FC=no ;; *) ld_shlibs_FC=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec_FC='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_FC" >&5 $as_echo "$ld_shlibs_FC" >&6; } test "$ld_shlibs_FC" = no && can_build_shared=no with_gnu_ld_FC=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_FC" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_FC=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_FC in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_FC+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_FC pic_flag=$lt_prog_compiler_pic_FC compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_FC allow_undefined_flag_FC= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_FC 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_FC 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_FC=no else lt_cv_archive_cmds_need_lc_FC=yes fi allow_undefined_flag_FC=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_FC" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_FC" >&6; } archive_cmds_need_lc_FC=$lt_cv_archive_cmds_need_lc_FC ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_FC\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_FC\"" cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_fc_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_FC= if test -n "$hardcode_libdir_flag_spec_FC" || test -n "$runpath_var_FC" || test "X$hardcode_automatic_FC" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_FC" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, FC)" != no && test "$hardcode_minus_L_FC" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_FC=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_FC=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_FC=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_FC" >&5 $as_echo "$hardcode_action_FC" >&6; } if test "$hardcode_action_FC" = relink || test "$inherit_rpath_FC" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_commands="$ac_config_commands libtool" # Only expand once: { $as_echo "$as_me:${as_lineno-$LINENO}: checking for target architecture" >&5 $as_echo_n "checking for target architecture... " >&6; } case x"$target" in xNONE | x) target_or_host="$host" ;; *) target_or_host="$target" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: '$target_or_host'" >&5 $as_echo "'$target_or_host'" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for platform" >&5 $as_echo_n "checking for platform... " >&6; } define_win32=0 define_X11=1 case "$target_or_host" in i686-w64-mingw32) platform=win32 define_win32=1 define_X11=0 EXEEXT=.exe FONT_NORMAL="Sans" FONT_BOLD="Sans bold" EXTRA_LDFLAGS="-no-undefined" EXTRA_CFLAGS="-mms-bitfields" EXTRA_LIBS="-lintl" ;; *-mingw* | *-*-cygwin*) platform=win32 define_win32=1 define_X11=0 EXEEXT=.exe FONT_NORMAL="Sans" FONT_BOLD="Sans bold" EXTRA_LDFLAGS="-no-undefined" EXTRA_CFLAGS="-mms-bitfields -mno-cygwin" EXTRA_LIBS="-lintl" ;; *-apple-darwin*) platform=Apple define_X11=1 define_win32=0 EXEEXT= FONT_NORMAL="Nimbus normal" FONT_BOLD="Nimbus bold" EXTRA_LDFLAGS= EXTRA_LIBS="-dylib_file /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib:/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib" EXTRA_CFLAGS= ;; *) platform=X11 define_X11=1 define_win32=0 EXEEXT= FONT_NORMAL="Nimbus normal" FONT_BOLD="Nimbus bold" EXTRA_LDFLAGS= EXTRA_CFLAGS= ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $platform" >&5 $as_echo "$platform" >&6; } if test "$define_X11" = "1"; then PLATFORM_X11_TRUE= PLATFORM_X11_FALSE='#' else PLATFORM_X11_TRUE='#' PLATFORM_X11_FALSE= fi if test "$define_win32" = "1"; then PLATFORM_WIN32_TRUE= PLATFORM_WIN32_FALSE='#' else PLATFORM_WIN32_TRUE='#' PLATFORM_WIN32_FALSE= fi if test "$define_X11" = "1"; then BUILD_STATIC_BINARY_TRUE= BUILD_STATIC_BINARY_FALSE='#' else BUILD_STATIC_BINARY_TRUE='#' BUILD_STATIC_BINARY_FALSE= fi if test "$define_win32" = "1"; then BUILD_SHARED_BINARY_TRUE= BUILD_SHARED_BINARY_FALSE='#' else BUILD_SHARED_BINARY_TRUE='#' BUILD_SHARED_BINARY_FALSE= fi if test x"$platform" = x"Apple" ; then LIBS_SVG="$LIBS" LIBS="$EXTRA_LIBS $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.i conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi #AC_REQUIRE([ACX_PTHREAD])dnl # # There isn't a reliable way to know we should use the Apple OpenGL framework # without a configure option. A Mac OS X user may have installed an # alternative GL implementation (e.g., Mesa), which may or may not depend on X. # # Check whether --with-apple-opengl-framework was given. if test "${with_apple_opengl_framework+set}" = set; then : withval=$with_apple_opengl_framework; fi if test "X$with_apple_opengl_framework" = "Xyes"; then $as_echo "#define HAVE_APPLE_OPENGL_FRAMEWORK 1" >>confdefs.h GL_LIBS="-framework OpenGL" else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the Microsoft C compiler" >&5 $as_echo_n "checking whether we are using the Microsoft C compiler... " >&6; } if ${ax_cv_c_compiler_ms+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef _MSC_VER choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_compiler_ms=yes else ax_compiler_ms=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ax_cv_c_compiler_ms=$ax_compiler_ms fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_compiler_ms" >&5 $as_echo "$ax_cv_c_compiler_ms" >&6; } if test X$ax_compiler_ms = Xno; then GL_CFLAGS="${PTHREAD_CFLAGS}" GL_LIBS="${PTHREAD_LIBS} -lm" fi # # Use x_includes and x_libraries if they have been set (presumably by # AC_PATH_X). # if test "X$no_x" != "Xyes"; then if test -n "$x_includes"; then GL_CFLAGS="-I${x_includes} ${GL_CFLAGS}" fi if test -n "$x_libraries"; then GL_LIBS="-L${x_libraries} -lX11 ${GL_LIBS}" fi fi for ac_header in windows.h do : ac_fn_c_check_header_mongrel "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default" if test "x$ac_cv_header_windows_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINDOWS_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenGL library" >&5 $as_echo_n "checking for OpenGL library... " >&6; } if ${ax_cv_check_gl_libgl+:} false; then : $as_echo_n "(cached) " >&6 else ax_cv_check_gl_libgl="no" ax_save_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${GL_CFLAGS} ${CPPFLAGS}" ax_save_LIBS="${LIBS}" LIBS="" ax_check_libs="-lopengl32 -lGL" for ax_lib in ${ax_check_libs}; do if test X$ax_compiler_ms = Xyes; then ax_try_lib=`echo $ax_lib | sed -e 's/^-l//' -e 's/$/.lib/'` else ax_try_lib="${ax_lib}" fi LIBS="${ax_try_lib} ${GL_LIBS} ${ax_save_LIBS}" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # if HAVE_WINDOWS_H && defined(_WIN32) # include # endif # include int main () { glBegin(0) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_check_gl_libgl="${ax_try_lib}"; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done LIBS=${ax_save_LIBS} CPPFLAGS=${ax_save_CPPFLAGS} fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_gl_libgl" >&5 $as_echo "$ax_cv_check_gl_libgl" >&6; } if test "X${ax_cv_check_gl_libgl}" = "Xno"; then no_gl="yes" GL_CFLAGS="" GL_LIBS="" else GL_LIBS="${ax_cv_check_gl_libgl} ${GL_LIBS}" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi if test x"$no_gl" = x"yes" ; then as_fn_error $? "\"No GL implementation (header or library issues).\"" "$LINENO" 5 fi GLU_CFLAGS="${GL_CFLAGS}" if test "X${with_apple_opengl_framework}" != "Xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenGL Utility library" >&5 $as_echo_n "checking for OpenGL Utility library... " >&6; } if ${ax_cv_check_glu_libglu+:} false; then : $as_echo_n "(cached) " >&6 else ax_cv_check_glu_libglu="no" ax_save_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${GL_CFLAGS} ${CPPFLAGS}" ax_save_LIBS="${LIBS}" LIBS="" ax_check_libs="-lglu32 -lGLU" for ax_lib in ${ax_check_libs}; do if test X$ax_compiler_ms = Xyes; then ax_try_lib=`echo $ax_lib | sed -e 's/^-l//' -e 's/$/.lib/'` else ax_try_lib="${ax_lib}" fi LIBS="${ax_try_lib} ${GL_LIBS} ${ax_save_LIBS}" # # libGLU typically links with libstdc++ on POSIX platforms. However, # setting the language to C++ means that test program source is named # "conftest.cc"; and Microsoft cl doesn't know what to do with such a # file. # ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test X$ax_compiler_ms = Xyes; then ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # if HAVE_WINDOWS_H && defined(_WIN32) # include # endif # include int main () { gluBeginCurve(0) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_check_glu_libglu="${ax_try_lib}"; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test X$ax_compiler_ms = Xyes; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu done LIBS=${ax_save_LIBS} CPPFLAGS=${ax_save_CPPFLAGS} fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_glu_libglu" >&5 $as_echo "$ax_cv_check_glu_libglu" >&6; } if test "X${ax_cv_check_glu_libglu}" = "Xno"; then no_glu="yes" GLU_CFLAGS="" GLU_LIBS="" else GLU_LIBS="${ax_cv_check_glu_libglu} ${GL_LIBS}" fi fi if test x"$no_glu" = x"yes" ; then as_fn_error $? "\"No GLU implementation (header or library issues).\"" "$LINENO" 5 fi if test x"$platform" = x"Apple" ; then LIBS="$LIBS_SVG" fi if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FTGL" >&5 $as_echo_n "checking for FTGL... " >&6; } if test -n "$FTGL_CFLAGS"; then pkg_cv_FTGL_CFLAGS="$FTGL_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ftgl\""; } >&5 ($PKG_CONFIG --exists --print-errors "ftgl") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FTGL_CFLAGS=`$PKG_CONFIG --cflags "ftgl" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$FTGL_LIBS"; then pkg_cv_FTGL_LIBS="$FTGL_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ftgl\""; } >&5 ($PKG_CONFIG --exists --print-errors "ftgl") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FTGL_LIBS=`$PKG_CONFIG --libs "ftgl" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FTGL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "ftgl" 2>&1` else FTGL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "ftgl" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$FTGL_PKG_ERRORS" >&5 have_ftgl=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } have_ftgl=no else FTGL_CFLAGS=$pkg_cv_FTGL_CFLAGS FTGL_LIBS=$pkg_cv_FTGL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } have_ftgl=yes fi if test x"$have_ftgl" = x"yes" ; then $as_echo "#define HAVE_FTGL /**/" >>confdefs.h fi if test x"$platform" != x"win32" ; then ac_save_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${GL_CFLAGS} ${CPPFLAGS}" ac_fn_c_check_header_mongrel "$LINENO" "GL/glx.h" "ac_cv_header_GL_glx_h" "$ac_includes_default" if test "x$ac_cv_header_GL_glx_h" = xyes; then : glxh="yes" else glxh="no" fi CPPFLAGS="${ac_save_CPPFLAGS}" if test "$glxh" = "no" ; then as_fn_error $? "\"No 'GL/glx.h' header file.\"" "$LINENO" 5 fi LIBS_SVG="$LIBS" LIBS="$LIBS $GLU_LIBS" for ac_func in glXChooseFBConfig glXGetVisualFromFBConfig glXCreatePbuffer do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF else ac_have_pbuffer=no fi done LIBS="$LIBS_SVG" if test x"$ac_have_pbuffer" != x"no" ; then $as_echo "#define HAVE_PBUFFER 1" >>confdefs.h fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then : enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } case "$am__api_version" in 1.01234) as_fn_error $? "Automake 1.5 or newer is required to use intltool" "$LINENO" 5 ;; *) ;; esac INTLTOOL_REQUIRED_VERSION_AS_INT=`echo 0.35.0 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` if test -n "0.35.0"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for intltool >= 0.35.0" >&5 $as_echo_n "checking for intltool >= 0.35.0... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_APPLIED_VERSION found" >&5 $as_echo "$INTLTOOL_APPLIED_VERSION found" >&6; } test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || as_fn_error $? "Your intltool is too old. You need intltool 0.35.0 or later." "$LINENO" 5 fi # Extract the first word of "intltool-update", so it can be a program name with args. set dummy intltool-update; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_UPDATE+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_UPDATE in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_UPDATE="$INTLTOOL_UPDATE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_INTLTOOL_UPDATE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_UPDATE=$ac_cv_path_INTLTOOL_UPDATE if test -n "$INTLTOOL_UPDATE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_UPDATE" >&5 $as_echo "$INTLTOOL_UPDATE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "intltool-merge", so it can be a program name with args. set dummy intltool-merge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_MERGE+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_MERGE in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_MERGE="$INTLTOOL_MERGE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_INTLTOOL_MERGE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_MERGE=$ac_cv_path_INTLTOOL_MERGE if test -n "$INTLTOOL_MERGE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_MERGE" >&5 $as_echo "$INTLTOOL_MERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "intltool-extract", so it can be a program name with args. set dummy intltool-extract; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_EXTRACT+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_EXTRACT in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_EXTRACT="$INTLTOOL_EXTRACT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_INTLTOOL_EXTRACT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_EXTRACT=$ac_cv_path_INTLTOOL_EXTRACT if test -n "$INTLTOOL_EXTRACT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_EXTRACT" >&5 $as_echo "$INTLTOOL_EXTRACT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then as_fn_error $? "The intltool scripts were not found. Please install intltool." "$LINENO" 5 fi if test -z "$AM_DEFAULT_VERBOSITY"; then AM_DEFAULT_VERBOSITY=1 fi INTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))' INTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))' INTLTOOL__v_MERGE_0='@echo " ITMRG " $@;' INTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))' intltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))' intltool__v_merge_options_0='-q' INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -p $(top_srcdir)/po $< $@' INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' if test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge 5000; then INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u --no-translations $< $@' else INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)_it_tmp_dir=tmp.intltool.$$RANDOM && mkdir $$_it_tmp_dir && LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u $$_it_tmp_dir $< $@ && rmdir $$_it_tmp_dir' fi INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' # Check the gettext tools to make sure they are GNU # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case $XGETTEXT in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_XGETTEXT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi XGETTEXT=$ac_cv_path_XGETTEXT if test -n "$XGETTEXT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGMERGE+:} false; then : $as_echo_n "(cached) " >&6 else case $MSGMERGE in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_MSGMERGE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MSGMERGE=$ac_cv_path_MSGMERGE if test -n "$MSGMERGE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 $as_echo "$MSGMERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $MSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_MSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MSGFMT=$ac_cv_path_MSGFMT if test -n "$MSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then as_fn_error $? "GNU gettext tools not found; required for intltool" "$LINENO" 5 fi xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then as_fn_error $? "GNU gettext tools not found; required for intltool" "$LINENO" 5 fi # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_PERL+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_PERL in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_PERL="$INTLTOOL_PERL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_INTLTOOL_PERL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_PERL=$ac_cv_path_INTLTOOL_PERL if test -n "$INTLTOOL_PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_PERL" >&5 $as_echo "$INTLTOOL_PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$INTLTOOL_PERL"; then as_fn_error $? "perl not found" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for perl >= 5.8.1" >&5 $as_echo_n "checking for perl >= 5.8.1... " >&6; } $INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 if test $? -ne 0; then as_fn_error $? "perl 5.8.1 is required for intltool" "$LINENO" 5 else IT_PERL_VERSION=`$INTLTOOL_PERL -e "printf '%vd', $^V"` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $IT_PERL_VERSION" >&5 $as_echo "$IT_PERL_VERSION" >&6; } fi if test "x" != "xno-xml"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML::Parser" >&5 $as_echo_n "checking for XML::Parser... " >&6; } if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } else as_fn_error $? "XML::Parser perl module is required for intltool" "$LINENO" 5 fi fi # Substitute ALL_LINGUAS so we can use it in po/Makefile # Set DATADIRNAME correctly if it is not set yet # (copied from glib-gettext.m4) if test -z "$DATADIRNAME"; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : DATADIRNAME=share else case $host in *-*-solaris*) ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : DATADIRNAME=share else DATADIRNAME=lib fi ;; *) DATADIRNAME=lib ;; esac fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi GETTEXT_PACKAGE=$PACKAGE_TARNAME cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE "$GETTEXT_PACKAGE" _ACEOF for ac_header in locale.h do : ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" if test "x$ac_cv_header_locale_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LOCALE_H 1 _ACEOF fi done if test $ac_cv_header_locale_h = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LC_MESSAGES" >&5 $as_echo_n "checking for LC_MESSAGES... " >&6; } if ${am_cv_val_LC_MESSAGES+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return LC_MESSAGES ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_val_LC_MESSAGES=yes else am_cv_val_LC_MESSAGES=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_val_LC_MESSAGES" >&5 $as_echo "$am_cv_val_LC_MESSAGES" >&6; } if test $am_cv_val_LC_MESSAGES = yes; then $as_echo "#define HAVE_LC_MESSAGES 1" >>confdefs.h fi fi USE_NLS=yes gt_cv_have_gettext=no CATOBJEXT=NONE XGETTEXT=: INTLLIBS= ac_fn_c_check_header_mongrel "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default" if test "x$ac_cv_header_libintl_h" = xyes; then : gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" # # First check in libc # { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in libc" >&5 $as_echo_n "checking for ngettext in libc... " >&6; } if ${gt_cv_func_ngettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return !ngettext ("","", 1) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_ngettext_libc=yes else gt_cv_func_ngettext_libc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_ngettext_libc" >&5 $as_echo "$gt_cv_func_ngettext_libc" >&6; } if test "$gt_cv_func_ngettext_libc" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in libc" >&5 $as_echo_n "checking for dgettext in libc... " >&6; } if ${gt_cv_func_dgettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return !dgettext ("","") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_dgettext_libc=yes else gt_cv_func_dgettext_libc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_dgettext_libc" >&5 $as_echo "$gt_cv_func_dgettext_libc" >&6; } fi if test "$gt_cv_func_ngettext_libc" = "yes" ; then for ac_func in bind_textdomain_codeset do : ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BIND_TEXTDOMAIN_CODESET 1 _ACEOF fi done fi # # If we don't have everything we want, check in libintl # if test "$gt_cv_func_dgettext_libc" != "yes" \ || test "$gt_cv_func_ngettext_libc" != "yes" \ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bindtextdomain in -lintl" >&5 $as_echo_n "checking for bindtextdomain in -lintl... " >&6; } if ${ac_cv_lib_intl_bindtextdomain+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char bindtextdomain (); int main () { return bindtextdomain (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_bindtextdomain=yes else ac_cv_lib_intl_bindtextdomain=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_bindtextdomain" >&5 $as_echo "$ac_cv_lib_intl_bindtextdomain" >&6; } if test "x$ac_cv_lib_intl_bindtextdomain" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 $as_echo_n "checking for ngettext in -lintl... " >&6; } if ${ac_cv_lib_intl_ngettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ngettext (); int main () { return ngettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_ngettext=yes else ac_cv_lib_intl_ngettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5 $as_echo "$ac_cv_lib_intl_ngettext" >&6; } if test "x$ac_cv_lib_intl_ngettext" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in -lintl" >&5 $as_echo_n "checking for dgettext in -lintl... " >&6; } if ${ac_cv_lib_intl_dgettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dgettext (); int main () { return dgettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_dgettext=yes else ac_cv_lib_intl_dgettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dgettext" >&5 $as_echo "$ac_cv_lib_intl_dgettext" >&6; } if test "x$ac_cv_lib_intl_dgettext" = xyes; then : gt_cv_func_dgettext_libintl=yes fi fi fi if test "$gt_cv_func_dgettext_libintl" != "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if -liconv is needed to use gettext" >&5 $as_echo_n "checking if -liconv is needed to use gettext... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 $as_echo_n "checking for ngettext in -lintl... " >&6; } if ${ac_cv_lib_intl_ngettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl -liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ngettext (); int main () { return ngettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_ngettext=yes else ac_cv_lib_intl_ngettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5 $as_echo "$ac_cv_lib_intl_ngettext" >&6; } if test "x$ac_cv_lib_intl_ngettext" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dcgettext in -lintl" >&5 $as_echo_n "checking for dcgettext in -lintl... " >&6; } if ${ac_cv_lib_intl_dcgettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl -liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dcgettext (); int main () { return dcgettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_dcgettext=yes else ac_cv_lib_intl_dcgettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dcgettext" >&5 $as_echo "$ac_cv_lib_intl_dcgettext" >&6; } if test "x$ac_cv_lib_intl_dcgettext" = xyes; then : gt_cv_func_dgettext_libintl=yes libintl_extra_libs=-liconv else : fi else : fi fi # # If we found libintl, then check in it for bind_textdomain_codeset(); # we'll prefer libc if neither have bind_textdomain_codeset(), # and both have dgettext and ngettext # if test "$gt_cv_func_dgettext_libintl" = "yes" ; then glib_save_LIBS="$LIBS" LIBS="$LIBS -lintl $libintl_extra_libs" unset ac_cv_func_bind_textdomain_codeset for ac_func in bind_textdomain_codeset do : ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BIND_TEXTDOMAIN_CODESET 1 _ACEOF fi done LIBS="$glib_save_LIBS" if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then gt_cv_func_dgettext_libc=no else if test "$gt_cv_func_dgettext_libc" = "yes" \ && test "$gt_cv_func_ngettext_libc" = "yes"; then gt_cv_func_dgettext_libintl=no fi fi fi fi if test "$gt_cv_func_dgettext_libc" = "yes" \ || test "$gt_cv_func_dgettext_libintl" = "yes"; then gt_cv_have_gettext=yes fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then INTLLIBS="-lintl $libintl_extra_libs" fi if test "$gt_cv_have_gettext" = "yes"; then $as_echo "#define HAVE_GETTEXT 1" >>confdefs.h # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGFMT" in /*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then ac_cv_path_MSGFMT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$MSGFMT" != "no"; then glib_save_LIBS="$LIBS" LIBS="$LIBS $INTLLIBS" for ac_func in dcgettext do : ac_fn_c_check_func "$LINENO" "dcgettext" "ac_cv_func_dcgettext" if test "x$ac_cv_func_dcgettext" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DCGETTEXT 1 _ACEOF fi done MSGFMT_OPTS= { $as_echo "$as_me:${as_lineno-$LINENO}: checking if msgfmt accepts -c" >&5 $as_echo_n "checking if msgfmt accepts -c... " >&6; } cat >conftest.foo <<_ACEOF msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Project-Id-Version: test 1.0\n" "PO-Revision-Date: 2007-02-15 12:01+0100\n" "Last-Translator: test \n" "Language-Team: C \n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" _ACEOF if { { $as_echo "$as_me:${as_lineno-$LINENO}: \$MSGFMT -c -o /dev/null conftest.foo"; } >&5 ($MSGFMT -c -o /dev/null conftest.foo) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then MSGFMT_OPTS=-c; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } echo "$as_me: failed input was:" >&5 sed 's/^/| /' conftest.foo >&5 fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case "$XGETTEXT" in /*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then ac_cv_path_XGETTEXT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : CATOBJEXT=.gmo DATADIRNAME=share else case $host in *-*-solaris*) ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : CATOBJEXT=.gmo DATADIRNAME=share else CATOBJEXT=.mo DATADIRNAME=lib fi ;; *-*-openbsd*) CATOBJEXT=.mo DATADIRNAME=share ;; *) CATOBJEXT=.mo DATADIRNAME=lib ;; esac fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$glib_save_LIBS" INSTOBJEXT=.mo else gt_cv_have_gettext=no fi fi fi if test "$gt_cv_have_gettext" = "yes" ; then $as_echo "#define ENABLE_NLS 1" >>confdefs.h fi if test "$XGETTEXT" != ":"; then if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else { $as_echo "$as_me:${as_lineno-$LINENO}: result: found xgettext program is not GNU xgettext; ignore it" >&5 $as_echo "found xgettext program is not GNU xgettext; ignore it" >&6; } XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po ac_config_commands="$ac_config_commands default-1" for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done if test "$gt_cv_have_gettext" = "yes"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for catalogs to be installed" >&5 $as_echo_n "checking for catalogs to be installed... " >&6; } NEW_LINGUAS= for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then NEW_LINGUAS="$NEW_LINGUAS $presentlang" fi done LINGUAS=$NEW_LINGUAS { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LINGUAS" >&5 $as_echo "$LINGUAS" >&6; } fi if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES if test x"$platform" = x"win32" ; then if test -z "$PKG_CONFIG_PATH" ; then export PKG_CONFIG_PATH=/usr/i686-w64-mingw32/lib/pkgconfig/ fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB" >&5 $as_echo_n "checking for GLIB... " >&6; } if test -n "$GLIB_CFLAGS"; then pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.2.0 gmodule-2.0 gobject-2.0 gthread-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.2.0 gmodule-2.0 gobject-2.0 gthread-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.2.0 gmodule-2.0 gobject-2.0 gthread-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GLIB_LIBS"; then pkg_cv_GLIB_LIBS="$GLIB_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.2.0 gmodule-2.0 gobject-2.0 gthread-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.2.0 gmodule-2.0 gobject-2.0 gthread-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.2.0 gmodule-2.0 gobject-2.0 gthread-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= 2.2.0 gmodule-2.0 gobject-2.0 gthread-2.0" 2>&1` else GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= 2.2.0 gmodule-2.0 gobject-2.0 gthread-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GLIB_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (glib-2.0 >= 2.2.0 gmodule-2.0 gobject-2.0 gthread-2.0) were not met: $GLIB_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GLIB_CFLAGS and GLIB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GLIB_CFLAGS and GLIB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GLIB_CFLAGS=$pkg_cv_GLIB_CFLAGS GLIB_LIBS=$pkg_cv_GLIB_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CAIRO" >&5 $as_echo_n "checking for CAIRO... " >&6; } if test -n "$CAIRO_CFLAGS"; then pkg_cv_CAIRO_CFLAGS="$CAIRO_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo\""; } >&5 ($PKG_CONFIG --exists --print-errors "cairo") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CAIRO_CFLAGS=`$PKG_CONFIG --cflags "cairo" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$CAIRO_LIBS"; then pkg_cv_CAIRO_LIBS="$CAIRO_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo\""; } >&5 ($PKG_CONFIG --exists --print-errors "cairo") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CAIRO_LIBS=`$PKG_CONFIG --libs "cairo" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then CAIRO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "cairo" 2>&1` else CAIRO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "cairo" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$CAIRO_PKG_ERRORS" >&5 have_cairo=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } have_cairo=no else CAIRO_CFLAGS=$pkg_cv_CAIRO_CFLAGS CAIRO_LIBS=$pkg_cv_CAIRO_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } have_cairo=yes fi if test x"$have_cairo" = x"yes" ; then $as_echo "#define HAVE_CAIRO /**/" >>confdefs.h fi # Check whether --with-gtk3 was given. if test "${with_gtk3+set}" = set; then : withval=$with_gtk3; ac_required_gtk="gtk+-3.0 >= 3.0.2" else ac_required_gtk="gtk+-2.0 >= 2.4.0" fi opengl="built-in" # Check whether --with-gtkglext was given. if test "${with_gtkglext+set}" = set; then : withval=$with_gtkglext; WITH_GTK_GL_EXT=$withval else WITH_GTK_GL_EXT="" fi if test -n "$WITH_GTK_GL_EXT" -a "$WITH_GTK_GL_EXT" != "no" ; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTKS" >&5 $as_echo_n "checking for GTKS... " >&6; } if test -n "$GTKS_CFLAGS"; then pkg_cv_GTKS_CFLAGS="$GTKS_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtkglext-1.0 >= 1.0.0 glib-2.0 >= 2.2.0 \${ac_required_gtk} gmodule-2.0 gobject-2.0 gthread-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtkglext-1.0 >= 1.0.0 glib-2.0 >= 2.2.0 ${ac_required_gtk} gmodule-2.0 gobject-2.0 gthread-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKS_CFLAGS=`$PKG_CONFIG --cflags "gtkglext-1.0 >= 1.0.0 glib-2.0 >= 2.2.0 ${ac_required_gtk} gmodule-2.0 gobject-2.0 gthread-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTKS_LIBS"; then pkg_cv_GTKS_LIBS="$GTKS_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtkglext-1.0 >= 1.0.0 glib-2.0 >= 2.2.0 \${ac_required_gtk} gmodule-2.0 gobject-2.0 gthread-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtkglext-1.0 >= 1.0.0 glib-2.0 >= 2.2.0 ${ac_required_gtk} gmodule-2.0 gobject-2.0 gthread-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKS_LIBS=`$PKG_CONFIG --libs "gtkglext-1.0 >= 1.0.0 glib-2.0 >= 2.2.0 ${ac_required_gtk} gmodule-2.0 gobject-2.0 gthread-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTKS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtkglext-1.0 >= 1.0.0 glib-2.0 >= 2.2.0 ${ac_required_gtk} gmodule-2.0 gobject-2.0 gthread-2.0" 2>&1` else GTKS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtkglext-1.0 >= 1.0.0 glib-2.0 >= 2.2.0 ${ac_required_gtk} gmodule-2.0 gobject-2.0 gthread-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTKS_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (gtkglext-1.0 >= 1.0.0 glib-2.0 >= 2.2.0 ${ac_required_gtk} gmodule-2.0 gobject-2.0 gthread-2.0) were not met: $GTKS_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GTKS_CFLAGS and GTKS_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GTKS_CFLAGS and GTKS_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GTKS_CFLAGS=$pkg_cv_GTKS_CFLAGS GTKS_LIBS=$pkg_cv_GTKS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi opengl="GtkGlExt" $as_echo "#define HAVE_GTKGLEXT /**/" >>confdefs.h fi if test "$define_win32" = "1"; then OPENGL_BUILTIN_WIN32_TRUE= OPENGL_BUILTIN_WIN32_FALSE='#' else OPENGL_BUILTIN_WIN32_TRUE='#' OPENGL_BUILTIN_WIN32_FALSE= fi if test "$define_X11" = "1" -a "$opengl" = "built-in"; then OPENGL_BUILTIN_X11_TRUE= OPENGL_BUILTIN_X11_FALSE='#' else OPENGL_BUILTIN_X11_TRUE='#' OPENGL_BUILTIN_X11_FALSE= fi if test "$define_X11" = "1" -a "$opengl" = "GtkGlExt"; then OPENGL_GTKGLEXT_TRUE= OPENGL_GTKGLEXT_FALSE='#' else OPENGL_GTKGLEXT_TRUE='#' OPENGL_GTKGLEXT_FALSE= fi if test "$opengl" != "GtkGlExt" ; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTKS" >&5 $as_echo_n "checking for GTKS... " >&6; } if test -n "$GTKS_CFLAGS"; then pkg_cv_GTKS_CFLAGS="$GTKS_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.2.0 \${ac_required_gtk} gmodule-2.0 gobject-2.0 gthread-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.2.0 ${ac_required_gtk} gmodule-2.0 gobject-2.0 gthread-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKS_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.2.0 ${ac_required_gtk} gmodule-2.0 gobject-2.0 gthread-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTKS_LIBS"; then pkg_cv_GTKS_LIBS="$GTKS_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.2.0 \${ac_required_gtk} gmodule-2.0 gobject-2.0 gthread-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.2.0 ${ac_required_gtk} gmodule-2.0 gobject-2.0 gthread-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKS_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.2.0 ${ac_required_gtk} gmodule-2.0 gobject-2.0 gthread-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTKS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= 2.2.0 ${ac_required_gtk} gmodule-2.0 gobject-2.0 gthread-2.0" 2>&1` else GTKS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= 2.2.0 ${ac_required_gtk} gmodule-2.0 gobject-2.0 gthread-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTKS_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (glib-2.0 >= 2.2.0 ${ac_required_gtk} gmodule-2.0 gobject-2.0 gthread-2.0) were not met: $GTKS_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GTKS_CFLAGS and GTKS_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GTKS_CFLAGS and GTKS_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GTKS_CFLAGS=$pkg_cv_GTKS_CFLAGS GTKS_LIBS=$pkg_cv_GTKS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi if test "$define_X11" = "1" ; then lx="False" for fl in $GLU_LIBS ; do if test x"$fl" = x"-lX11" ; then lx="True" fi done if test x"$lx" = x"False" ; then GLU_LIBS=$GLU_LIBS" -lX11" fi fi fi ac_use_libyaml="yes" # Check whether --with-yaml was given. if test "${with_yaml+set}" = set; then : withval=$with_yaml; ac_use_libyaml=$withval else ac_use_libyaml=yes fi # Check whether --with-yaml-path was given. if test "${with_yaml_path+set}" = set; then : withval=$with_yaml_path; ac_path_yaml=$withval fi if test x"$ac_use_libyaml" != x"no" ; then if test x"$ac_path_yaml" == x"" ; then ac_path_yaml="/usr" fi LDFLAGS_SVG="$LDFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu LDFLAGS="-L$ac_path_yaml/lib" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for yaml_parser_parse in -lyaml" >&5 $as_echo_n "checking for yaml_parser_parse in -lyaml... " >&6; } if ${ac_cv_lib_yaml_yaml_parser_parse+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lyaml $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char yaml_parser_parse (); int main () { return yaml_parser_parse (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_yaml_yaml_parser_parse=yes else ac_cv_lib_yaml_yaml_parser_parse=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_yaml_yaml_parser_parse" >&5 $as_echo "$ac_cv_lib_yaml_yaml_parser_parse" >&6; } if test "x$ac_cv_lib_yaml_yaml_parser_parse" = xyes; then : ac_use_libyaml=yes else ac_use_libyaml=warn fi if test x"$ac_use_libyaml" = x"yes"; then if test x"$ac_path_yaml" != x"/usr" ; then LIB_YAML_CFLAGS="-I$ac_path_yaml/include" LIB_YAML_LIBS="-L$ac_path_yaml/lib " fi LIB_YAML_LIBS=$LIB_YAML_LIBS"-lyaml" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu LDFLAGS="$LDFLAGS_SVG" if test x"$ac_use_libyaml" != x"yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: libyaml is not available." >&5 $as_echo "$as_me: WARNING: libyaml is not available." >&2;} else $as_echo "#define HAVE_YAML /**/" >>confdefs.h fi fi # Check whether --enable-python-module was given. if test "${enable_python_module+set}" = set; then : enableval=$enable_python_module; enable_python=$enableval else enable_python="no" fi if test -n "$enable_python" -a "$enable_python" != "no" ; then if test -n "$PYTHON"; then # If the user set $PYTHON, use it and don't search something else. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $PYTHON version >= 2.3.5" >&5 $as_echo_n "checking whether $PYTHON version >= 2.3.5... " >&6; } prog="import sys # split strings by '.' and convert to numeric. Append some zeros # because we need at least 4 digits for the hex conversion. # map returns an iterator in Python 3.0 and a list in 2.x minver = list(map(int, '2.3.5'.split('.'))) + [0, 0, 0] minverhex = 0 # xrange is not present in Python 3.0 and range returns an iterator for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i] sys.exit(sys.hexversion < minverhex)" if { echo "$as_me:$LINENO: $PYTHON -c "$prog"" >&5 ($PYTHON -c "$prog") >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else as_fn_error $? "too old" "$LINENO" 5 fi am_display_PYTHON=$PYTHON else # Otherwise, try each interpreter until we find one that satisfies # VERSION. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a Python interpreter with version >= 2.3.5" >&5 $as_echo_n "checking for a Python interpreter with version >= 2.3.5... " >&6; } if ${am_cv_pathless_PYTHON+:} false; then : $as_echo_n "(cached) " >&6 else for am_cv_pathless_PYTHON in python python2 python3 python3.2 python3.1 python3.0 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 none; do test "$am_cv_pathless_PYTHON" = none && break prog="import sys # split strings by '.' and convert to numeric. Append some zeros # because we need at least 4 digits for the hex conversion. # map returns an iterator in Python 3.0 and a list in 2.x minver = list(map(int, '2.3.5'.split('.'))) + [0, 0, 0] minverhex = 0 # xrange is not present in Python 3.0 and range returns an iterator for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i] sys.exit(sys.hexversion < minverhex)" if { echo "$as_me:$LINENO: $am_cv_pathless_PYTHON -c "$prog"" >&5 ($am_cv_pathless_PYTHON -c "$prog") >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then : break fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_pathless_PYTHON" >&5 $as_echo "$am_cv_pathless_PYTHON" >&6; } # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. if test "$am_cv_pathless_PYTHON" = none; then PYTHON=: else # Extract the first word of "$am_cv_pathless_PYTHON", so it can be a program name with args. set dummy $am_cv_pathless_PYTHON; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PYTHON+:} false; then : $as_echo_n "(cached) " >&6 else case $PYTHON in [\\/]* | ?:[\\/]*) ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PYTHON=$ac_cv_path_PYTHON if test -n "$PYTHON"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 $as_echo "$PYTHON" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi am_display_PYTHON=$am_cv_pathless_PYTHON fi if test "$PYTHON" = :; then as_fn_error $? "no suitable Python interpreter found" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON version" >&5 $as_echo_n "checking for $am_display_PYTHON version... " >&6; } if ${am_cv_python_version+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[:3])"` fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_version" >&5 $as_echo "$am_cv_python_version" >&6; } PYTHON_VERSION=$am_cv_python_version PYTHON_PREFIX='${prefix}' PYTHON_EXEC_PREFIX='${exec_prefix}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON platform" >&5 $as_echo_n "checking for $am_display_PYTHON platform... " >&6; } if ${am_cv_python_platform+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"` fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_platform" >&5 $as_echo "$am_cv_python_platform" >&6; } PYTHON_PLATFORM=$am_cv_python_platform { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON script directory" >&5 $as_echo_n "checking for $am_display_PYTHON script directory... " >&6; } if ${am_cv_python_pythondir+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$prefix" = xNONE then am_py_prefix=$ac_default_prefix else am_py_prefix=$prefix fi am_cv_python_pythondir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(0,0,prefix='$am_py_prefix'))" 2>/dev/null` case $am_cv_python_pythondir in $am_py_prefix*) am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"` ;; *) case $am_py_prefix in /usr|/System*) ;; *) am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages ;; esac ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pythondir" >&5 $as_echo "$am_cv_python_pythondir" >&6; } pythondir=$am_cv_python_pythondir pkgpythondir=\${pythondir}/$PACKAGE { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON extension module directory" >&5 $as_echo_n "checking for $am_display_PYTHON extension module directory... " >&6; } if ${am_cv_python_pyexecdir+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$exec_prefix" = xNONE then am_py_exec_prefix=$am_py_prefix else am_py_exec_prefix=$exec_prefix fi am_cv_python_pyexecdir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(1,0,prefix='$am_py_exec_prefix'))" 2>/dev/null` case $am_cv_python_pyexecdir in $am_py_exec_prefix*) am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"` ;; *) case $am_py_exec_prefix in /usr|/System*) ;; *) am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages ;; esac ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pyexecdir" >&5 $as_echo "$am_cv_python_pyexecdir" >&6; } pyexecdir=$am_cv_python_pyexecdir pkgpyexecdir=\${pyexecdir}/$PACKAGE fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for headers required to compile python extensions" >&5 $as_echo_n "checking for headers required to compile python extensions... " >&6; } py_prefix=`$PYTHON -c "import sys; print sys.prefix"` py_exec_prefix=`$PYTHON -c "import sys; print sys.exec_prefix"` if test -x "$PYTHON-config"; then PYTHON_INCLUDES=`$PYTHON-config --includes 2>/dev/null` else PYTHON_INCLUDES="-I${py_prefix}/include/python${PYTHON_VERSION}" if test "$py_prefix" != "$py_exec_prefix"; then PYTHON_INCLUDES="$PYTHON_INCLUDES -I${py_exec_prefix}/include/python${PYTHON_VERSION}" fi fi save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $PYTHON_INCLUDES" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } as_fn_error $? "could not find Python headers" "$LINENO" 5 fi rm -f conftest.err conftest.i conftest.$ac_ext CPPFLAGS="$save_CPPFLAGS" py_prefix=`$PYTHON -c "import sys; print sys.prefix"` PYTHON_INCLUDES="-I${py_prefix}/include/python${PYTHON_VERSION}" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PYGTK" >&5 $as_echo_n "checking for PYGTK... " >&6; } if test -n "$PYGTK_CFLAGS"; then pkg_cv_PYGTK_CFLAGS="$PYGTK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"pygobject-2.0 pygtk-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "pygobject-2.0 pygtk-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PYGTK_CFLAGS=`$PKG_CONFIG --cflags "pygobject-2.0 pygtk-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$PYGTK_LIBS"; then pkg_cv_PYGTK_LIBS="$PYGTK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"pygobject-2.0 pygtk-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "pygobject-2.0 pygtk-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PYGTK_LIBS=`$PKG_CONFIG --libs "pygobject-2.0 pygtk-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PYGTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "pygobject-2.0 pygtk-2.0" 2>&1` else PYGTK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "pygobject-2.0 pygtk-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$PYGTK_PKG_ERRORS" >&5 have_pygtk=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } have_pygtk=no else PYGTK_CFLAGS=$pkg_cv_PYGTK_CFLAGS PYGTK_LIBS=$pkg_cv_PYGTK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } have_pygtk=yes fi if test x"$have_pygtk" = x"yes" ; then $as_echo "#define HAVE_PYGTK /**/" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: header files for pygtk not installed." >&5 $as_echo "$as_me: WARNING: header files for pygtk not installed." >&2;} enable_python="no" fi fi if test x"$enable_python" = x"yes"; then PYTHON_MODULE_TRUE= PYTHON_MODULE_FALSE='#' else PYTHON_MODULE_TRUE='#' PYTHON_MODULE_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for debug message" >&5 $as_echo_n "checking for debug message... " >&6; } with_debug_messages=no define_debug=0 # Check whether --enable-debug-messages was given. if test "${enable_debug_messages+set}" = set; then : enableval=$enable_debug_messages; with_debug_messages=$enableval else with_debug_messages=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_debug_messages" >&5 $as_echo "$with_debug_messages" >&6; } if test "$with_debug_messages" = "yes" ; then define_debug=1 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --enable-debug-messages... are you sure, this is very verbose?" >&5 $as_echo "$as_me: WARNING: --enable-debug-messages... are you sure, this is very verbose?" >&2;} fi # Extract the first word of "gtkdoc-check", so it can be a program name with args. set dummy gtkdoc-check; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GTKDOC_CHECK+:} false; then : $as_echo_n "(cached) " >&6 else case $GTKDOC_CHECK in [\\/]* | ?:[\\/]*) ac_cv_path_GTKDOC_CHECK="$GTKDOC_CHECK" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GTKDOC_CHECK="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GTKDOC_CHECK=$ac_cv_path_GTKDOC_CHECK if test -n "$GTKDOC_CHECK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_CHECK" >&5 $as_echo "$GTKDOC_CHECK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi for ac_prog in gtkdoc-rebase do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GTKDOC_REBASE+:} false; then : $as_echo_n "(cached) " >&6 else case $GTKDOC_REBASE in [\\/]* | ?:[\\/]*) ac_cv_path_GTKDOC_REBASE="$GTKDOC_REBASE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GTKDOC_REBASE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GTKDOC_REBASE=$ac_cv_path_GTKDOC_REBASE if test -n "$GTKDOC_REBASE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_REBASE" >&5 $as_echo "$GTKDOC_REBASE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$GTKDOC_REBASE" && break done test -n "$GTKDOC_REBASE" || GTKDOC_REBASE="true" # Extract the first word of "gtkdoc-mkpdf", so it can be a program name with args. set dummy gtkdoc-mkpdf; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GTKDOC_MKPDF+:} false; then : $as_echo_n "(cached) " >&6 else case $GTKDOC_MKPDF in [\\/]* | ?:[\\/]*) ac_cv_path_GTKDOC_MKPDF="$GTKDOC_MKPDF" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GTKDOC_MKPDF="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GTKDOC_MKPDF=$ac_cv_path_GTKDOC_MKPDF if test -n "$GTKDOC_MKPDF"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_MKPDF" >&5 $as_echo "$GTKDOC_MKPDF" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Check whether --with-html-dir was given. if test "${with_html_dir+set}" = set; then : withval=$with_html_dir; else with_html_dir='${datadir}/gtk-doc/html' fi HTML_DIR="$with_html_dir" # Check whether --enable-gtk-doc was given. if test "${enable_gtk_doc+set}" = set; then : enableval=$enable_gtk_doc; else enable_gtk_doc=no fi if test x$enable_gtk_doc = xyes; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-doc >= 1.3\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk-doc >= 1.3") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : else as_fn_error $? "You need to have gtk-doc >= 1.3 installed to build $PACKAGE_NAME" "$LINENO" 5 fi if test "x$PACKAGE_NAME" != "xglib"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTKDOC_DEPS" >&5 $as_echo_n "checking for GTKDOC_DEPS... " >&6; } if test -n "$GTKDOC_DEPS_CFLAGS"; then pkg_cv_GTKDOC_DEPS_CFLAGS="$GTKDOC_DEPS_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKDOC_DEPS_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTKDOC_DEPS_LIBS"; then pkg_cv_GTKDOC_DEPS_LIBS="$GTKDOC_DEPS_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKDOC_DEPS_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>&1` else GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTKDOC_DEPS_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0) were not met: $GTKDOC_DEPS_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GTKDOC_DEPS_CFLAGS and GTKDOC_DEPS_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GTKDOC_DEPS_CFLAGS and GTKDOC_DEPS_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GTKDOC_DEPS_CFLAGS=$pkg_cv_GTKDOC_DEPS_CFLAGS GTKDOC_DEPS_LIBS=$pkg_cv_GTKDOC_DEPS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build gtk-doc documentation" >&5 $as_echo_n "checking whether to build gtk-doc documentation... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_gtk_doc" >&5 $as_echo "$enable_gtk_doc" >&6; } # Check whether --enable-gtk-doc-html was given. if test "${enable_gtk_doc_html+set}" = set; then : enableval=$enable_gtk_doc_html; else enable_gtk_doc_html=yes fi # Check whether --enable-gtk-doc-pdf was given. if test "${enable_gtk_doc_pdf+set}" = set; then : enableval=$enable_gtk_doc_pdf; else enable_gtk_doc_pdf=no fi if test -z "$GTKDOC_MKPDF"; then enable_gtk_doc_pdf=no fi if test x$enable_gtk_doc = xyes; then ENABLE_GTK_DOC_TRUE= ENABLE_GTK_DOC_FALSE='#' else ENABLE_GTK_DOC_TRUE='#' ENABLE_GTK_DOC_FALSE= fi if test x$enable_gtk_doc_html = xyes; then GTK_DOC_BUILD_HTML_TRUE= GTK_DOC_BUILD_HTML_FALSE='#' else GTK_DOC_BUILD_HTML_TRUE='#' GTK_DOC_BUILD_HTML_FALSE= fi if test x$enable_gtk_doc_pdf = xyes; then GTK_DOC_BUILD_PDF_TRUE= GTK_DOC_BUILD_PDF_FALSE='#' else GTK_DOC_BUILD_PDF_TRUE='#' GTK_DOC_BUILD_PDF_FALSE= fi if test -n "$LIBTOOL"; then GTK_DOC_USE_LIBTOOL_TRUE= GTK_DOC_USE_LIBTOOL_FALSE='#' else GTK_DOC_USE_LIBTOOL_TRUE='#' GTK_DOC_USE_LIBTOOL_FALSE= fi if test -n "$GTKDOC_REBASE"; then GTK_DOC_USE_REBASE_TRUE= GTK_DOC_USE_REBASE_FALSE='#' else GTK_DOC_USE_REBASE_TRUE='#' GTK_DOC_USE_REBASE_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ETSF file format support" >&5 $as_echo_n "checking for ETSF file format support... " >&6; } # Check whether --with-etsf_file_format was given. if test "${with_etsf_file_format+set}" = set; then : withval=$with_etsf_file_format; have_etsf=yes else have_etsf=no fi # Check whether --with-nanoquanta was given. if test "${with_nanoquanta+set}" = set; then : withval=$with_nanoquanta; have_nanoquanta=yes else have_nanoquanta=no fi if test x"$have_nanoquanta" = x"yes" ; then have_etsf="yes" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_etsf" >&5 $as_echo "$have_etsf" >&6; } if test x"$have_nanoquanta" = x"yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \"--with-nanoquanta is deprecated, use --with-etsf-file-format instead.\"" >&5 $as_echo "$as_me: WARNING: \"--with-nanoquanta is deprecated, use --with-etsf-file-format instead.\"" >&2;} fi if test "$have_etsf" = "yes" ; then # Check whether --with-netcdf was given. if test "${with_netcdf+set}" = set; then : withval=$with_netcdf; NC_PATH=$withval else NC_PATH="" fi # Check whether --with-netcdf_include was given. if test "${with_netcdf_include+set}" = set; then : withval=$with_netcdf_include; NC_PATH_INC=$withval else NC_PATH_INC="" fi # Check whether --with-netcdf_libdir was given. if test "${with_netcdf_libdir+set}" = set; then : withval=$with_netcdf_libdir; NC_PATH_LIBDIR=$withval else NC_PATH_LIBDIR="" fi if test "z$NC_PATH" != "z"; then : if test "z$NC_PATH_LIBDIR" = "z"; then : NC_PATH_LIBDIR="$NC_PATH/lib" fi if test "z$NC_PATH_INC" = "z"; then : NC_PATH_INC="$NC_PATH/include" fi fi ac_netcdf_ok='no' NC_LIBS= NC_LDFLAGS= ac_nc_save_LDFLAGS=$LDFLAGS ac_nc_save_LIBS=$LIBS ac_check_nc_func_checked='ncopen' ac_check_nc_interface= ac_check_nc_interface=3 if test "z$ac_check_nc_interface" = 'z3'; then : ac_check_nc_func_checked='nc_open' fi if test "z$NC_PATH_LIBDIR" != "z"; then : NC_LDFLAGS="-L$NC_PATH_LIBDIR" LDFLAGS="$LDFLAGS $NC_LDFLAGS" as_ac_Lib=`$as_echo "ac_cv_lib_netcdf_$ac_check_nc_func_checked" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_check_nc_func_checked in -lnetcdf" >&5 $as_echo_n "checking for $ac_check_nc_func_checked in -lnetcdf... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnetcdf $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_check_nc_func_checked (); int main () { return $ac_check_nc_func_checked (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : NC_LIBS='-lnetcdf' ac_netcdf_ok='yes' fi else for ac_netcdf_libdir in "" \ /usr/local/netcdf-${ac_check_nc_interface}/lib \ /opt/netcdf-${ac_check_nc_interface}/lib \ /usr/netcdf-${ac_check_nc_interface}/lib \ /usr/local/lib/netcdf-${ac_check_nc_interface} \ /opt/lib/netcdf-${ac_check_nc_interface} \ /usr/lib/netcdf-${ac_check_nc_interface} \ /usr/local/netcdf/lib /opt/netcdf/lib \ /usr/netcdf/lib /usr/local/lib/netcdf /opt/lib/netcdf \ /usr/lib/netcdf ; do if test "z$ac_netcdf_libdir" = 'z'; then : NC_LDFLAGS= else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for netcdf libraries in $ac_netcdf_libdir" >&5 $as_echo_n "checking for netcdf libraries in $ac_netcdf_libdir... " >&6; } NC_LDFLAGS="-L$ac_netcdf_libdir" fi LDFLAGS="$LDFLAGS $NC_LDFLAGS" LIBS="$LIBS -lnetcdf" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_check_nc_func_checked (); int main () { return $ac_check_nc_func_checked (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : NC_LIBS='-lnetcdf' ac_netcdf_ok='yes' if test "z$ac_netcdf_libdir" != 'z'; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi else if test "z$ac_netcdf_libdir" != 'z'; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $ac_netcdf_ok = 'yes'; then : break fi LDFLAGS=$ac_nc_save_LDFLAGS LIBS=$ac_nc_save_LIBS done fi LDFLAGS=$ac_nc_save_LDFLAGS LIBS=$ac_nc_save_LIBS ac_netcdf_header='no' if test "z$NC_PATH_INC" != "z"; then : NC_CPPFLAGS= ac_netcdf_h='no' ac_netcdf_h_compile='no' ac_netcdf_h_preproc='no' ac_nc_include_dir= ac_nc_header_interface= ac_nc_save_CPPFLAGS=$CPPFLAGS ac_nc_include_dir="$NC_PATH_INC" if test "z$ac_nc_include_dir" != "z"; then : CPPFLAGS="$CPPFLAGS -I$ac_nc_include_dir" fi ac_nc_header_interface=$ac_check_nc_interface { $as_echo "$as_me:${as_lineno-$LINENO}: checking for netcdf.h with compiler" >&5 $as_echo_n "checking for netcdf.h with compiler... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_netcdf_h_compile='yes' else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_netcdf_h_compile='no' fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking for netcdf.h with preprocessor" >&5 $as_echo_n "checking for netcdf.h with preprocessor... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_netcdf_h_preproc='yes' else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_netcdf_h_preproc='no' fi rm -f conftest.err conftest.i conftest.$ac_ext CPPFLAGS="$ac_nc_save_CPPFLAGS" if test $ac_netcdf_h_compile = 'yes'; then : ac_netcdf_h='yes' if test "z$ac_nc_header_interface" = 'z3'; then : NC_NETCDF_3_CPPFLAG= ac_check_netcdf_3_include= ac_check_netcdf_3_header='no' ac_nc_save_CPPFLAGS=$CPPFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for netcdf 3 interface" >&5 $as_echo_n "checking for netcdf 3 interface... " >&6; } ac_check_netcdf_3_include="$NC_PATH_INC" if test "z$ac_check_netcdf_3_include" != "z"; then : CPPFLAGS="$CPPFLAGS -I$ac_check_netcdf_3_include" fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int status; int ncid; status = nc_open("foo.nc", 0, &ncid); char vernum; vernum = *nc_inq_libvers(); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if test "z$ac_check_netcdf_3_include" != "z"; then : NC_NETCDF_3_CPPFLAG="-I$ac_check_netcdf_3_include" fi ac_check_netcdf_3_header='yes' else ac_check_netcdf_3_header='no' fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS=$ac_nc_save_CPPFLAGS if test "$ac_check_netcdf_3_header" = 'yes'; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_netcdf_h='yes' else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_netcdf_h='no' fi fi fi if test "$ac_netcdf_h" = 'yes'; then : if test "z$ac_nc_include_dir" != "z"; then : NC_CPPFLAGS="-I$ac_nc_include_dir" fi ac_netcdf_header='yes' else ac_netcdf_header='no' fi else for ac_netcdf_incdir in "" \ /usr/local/netcdf-${ac_check_nc_interface}/include \ /opt/netcdf-${ac_check_nc_interface}/include \ /usr/netcdf-${ac_check_nc_interface}/include \ /usr/local/include/netcdf-${ac_check_nc_interface} \ /opt/include/netcdf-${ac_check_nc_interface} \ /usr/include/netcdf-${ac_check_nc_interface} \ /usr/local/netcdf/include \ /opt/netcdf/include /usr/netcdf/include /usr/local/include/netcdf \ /opt/include/netcdf /usr/include/netcdf ; do { $as_echo "$as_me:${as_lineno-$LINENO}: searching netcdf includes in $ac_netcdf_incdir" >&5 $as_echo "$as_me: searching netcdf includes in $ac_netcdf_incdir" >&6;} NC_CPPFLAGS= ac_netcdf_h='no' ac_netcdf_h_compile='no' ac_netcdf_h_preproc='no' ac_nc_include_dir= ac_nc_header_interface= ac_nc_save_CPPFLAGS=$CPPFLAGS ac_nc_include_dir="$ac_netcdf_incdir" if test "z$ac_nc_include_dir" != "z"; then : CPPFLAGS="$CPPFLAGS -I$ac_nc_include_dir" fi ac_nc_header_interface=$ac_check_nc_interface { $as_echo "$as_me:${as_lineno-$LINENO}: checking for netcdf.h with compiler" >&5 $as_echo_n "checking for netcdf.h with compiler... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_netcdf_h_compile='yes' else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_netcdf_h_compile='no' fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking for netcdf.h with preprocessor" >&5 $as_echo_n "checking for netcdf.h with preprocessor... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_netcdf_h_preproc='yes' else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_netcdf_h_preproc='no' fi rm -f conftest.err conftest.i conftest.$ac_ext CPPFLAGS="$ac_nc_save_CPPFLAGS" if test $ac_netcdf_h_compile = 'yes'; then : ac_netcdf_h='yes' if test "z$ac_nc_header_interface" = 'z3'; then : NC_NETCDF_3_CPPFLAG= ac_check_netcdf_3_include= ac_check_netcdf_3_header='no' ac_nc_save_CPPFLAGS=$CPPFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for netcdf 3 interface" >&5 $as_echo_n "checking for netcdf 3 interface... " >&6; } ac_check_netcdf_3_include="$ac_netcdf_incdir" if test "z$ac_check_netcdf_3_include" != "z"; then : CPPFLAGS="$CPPFLAGS -I$ac_check_netcdf_3_include" fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int status; int ncid; status = nc_open("foo.nc", 0, &ncid); char vernum; vernum = *nc_inq_libvers(); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if test "z$ac_check_netcdf_3_include" != "z"; then : NC_NETCDF_3_CPPFLAG="-I$ac_check_netcdf_3_include" fi ac_check_netcdf_3_header='yes' else ac_check_netcdf_3_header='no' fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS=$ac_nc_save_CPPFLAGS if test "$ac_check_netcdf_3_header" = 'yes'; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_netcdf_h='yes' else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_netcdf_h='no' fi fi fi if test "$ac_netcdf_h" = 'yes'; then : if test "z$ac_nc_include_dir" != "z"; then : NC_CPPFLAGS="-I$ac_nc_include_dir" fi ac_netcdf_header='yes' else ac_netcdf_header='no' fi if test $ac_netcdf_header = 'yes'; then : break fi done fi if test "$ac_netcdf_ok" = 'no' -o "$ac_netcdf_header" = 'no'; then : netcdf="no" else netcdf="yes" fi if test "$netcdf" = "yes" ; then have_etsf="yes" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \"No 'netcdf.h' header file, libetsf.so will not be built.\"" >&5 $as_echo "$as_me: WARNING: \"No 'netcdf.h' header file, libetsf.so will not be built.\"" >&2;} have_etsf="no" fi fi if test x"$have_etsf" = x"yes"; then HAVE_ETSF_TRUE= HAVE_ETSF_FALSE='#' else HAVE_ETSF_TRUE='#' HAVE_ETSF_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenBabel support" >&5 $as_echo_n "checking for OpenBabel support... " >&6; } # Check whether --with-openbabel was given. if test "${with_openbabel+set}" = set; then : withval=$with_openbabel; have_openbabel=yes else have_openbabel=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_openbabel" >&5 $as_echo "$have_openbabel" >&6; } if test "$have_openbabel" = "yes" ; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OPENBABEL" >&5 $as_echo_n "checking for OPENBABEL... " >&6; } if test -n "$OPENBABEL_CFLAGS"; then pkg_cv_OPENBABEL_CFLAGS="$OPENBABEL_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"openbabel-2.0 >= 2.0.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "openbabel-2.0 >= 2.0.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_OPENBABEL_CFLAGS=`$PKG_CONFIG --cflags "openbabel-2.0 >= 2.0.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$OPENBABEL_LIBS"; then pkg_cv_OPENBABEL_LIBS="$OPENBABEL_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"openbabel-2.0 >= 2.0.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "openbabel-2.0 >= 2.0.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_OPENBABEL_LIBS=`$PKG_CONFIG --libs "openbabel-2.0 >= 2.0.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then OPENBABEL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "openbabel-2.0 >= 2.0.0" 2>&1` else OPENBABEL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "openbabel-2.0 >= 2.0.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$OPENBABEL_PKG_ERRORS" >&5 ob=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ob=no else OPENBABEL_CFLAGS=$pkg_cv_OPENBABEL_CFLAGS OPENBABEL_LIBS=$pkg_cv_OPENBABEL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ob=yes fi if test "$ob" = "yes" ; then have_openbabel="yes" need_cpp_compiler="yes" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \"No OpenBabel lib/header file found, libobloader.so will not be built.\"" >&5 $as_echo "$as_me: WARNING: \"No OpenBabel lib/header file found, libobloader.so will not be built.\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \"Maybe OpenBabel is not installed or version is to old (>=2.0 required).\"" >&5 $as_echo "$as_me: WARNING: \"Maybe OpenBabel is not installed or version is to old (>=2.0 required).\"" >&2;} have_openbabel="no" fi fi if test x"$have_openbabel" = x"yes"; then HAVE_OPENBABEL_TRUE= HAVE_OPENBABEL_FALSE='#' else HAVE_OPENBABEL_TRUE='#' HAVE_OPENBABEL_FALSE= fi have_xsf="no" # Check whether --with-xsf was given. if test "${with_xsf+set}" = set; then : withval=$with_xsf; have_xsf=yes else have_xsf=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XCrysDen file support" >&5 $as_echo_n "checking for XCrysDen file support... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_xsf" >&5 $as_echo "$have_xsf" >&6; } if test x"$have_xsf" = x"yes"; then HAVE_XSF_TRUE= HAVE_XSF_FALSE='#' else HAVE_XSF_TRUE='#' HAVE_XSF_FALSE= fi have_cube="no" # Check whether --with-cube was given. if test "${with_cube+set}" = set; then : withval=$with_cube; have_cube=yes else have_cube=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Cube file support" >&5 $as_echo_n "checking for Cube file support... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_cube" >&5 $as_echo "$have_cube" >&6; } if test x"$have_cube" = x"yes"; then HAVE_CUBE_TRUE= HAVE_CUBE_FALSE='#' else HAVE_CUBE_TRUE='#' HAVE_CUBE_FALSE= fi ac_abinit="no" ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to get verbose linking output from $F77" >&5 $as_echo_n "checking how to get verbose linking output from $F77... " >&6; } if ${ac_cv_prog_f77_v+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_compile "$LINENO"; then : ac_cv_prog_f77_v= # Try some options frequently used verbose output for ac_verb in -v -verbose --verbose -V -\#\#\#; do cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF # Compile and link our simple test program by passing a flag (argument # 1 to this macro) to the Fortran compiler in order to get # "verbose" output that we can then parse for the Fortran linker # flags. ac_save_FFLAGS=$FFLAGS FFLAGS="$FFLAGS $ac_verb" eval "set x $ac_link" shift $as_echo "$as_me:${as_lineno-$LINENO}: $*" >&5 # gfortran 4.3 outputs lines setting COLLECT_GCC_OPTIONS, COMPILER_PATH, # LIBRARY_PATH; skip all such settings. ac_f77_v_output=`eval $ac_link 5>&1 2>&1 | sed '/^Driving:/d; /^Configured with:/d; '"/^[_$as_cr_Letters][_$as_cr_alnum]*=/d"` $as_echo "$ac_f77_v_output" >&5 FFLAGS=$ac_save_FFLAGS rm -rf conftest* # On HP/UX there is a line like: "LPATH is: /foo:/bar:/baz" where # /foo, /bar, and /baz are search directories for the Fortran linker. # Here, we change these into -L/foo -L/bar -L/baz (and put it first): ac_f77_v_output="`echo $ac_f77_v_output | grep 'LPATH is:' | sed 's|.*LPATH is\(: *[^ ]*\).*|\1|;s|: */| -L/|g'` $ac_f77_v_output" # FIXME: we keep getting bitten by quoted arguments; a more general fix # that detects unbalanced quotes in FLIBS should be implemented # and (ugh) tested at some point. case $ac_f77_v_output in # If we are using xlf then replace all the commas with spaces. *xlfentry*) ac_f77_v_output=`echo $ac_f77_v_output | sed 's/,/ /g'` ;; # With Intel ifc, ignore the quoted -mGLOB_options_string stuff (quoted # $LIBS confuse us, and the libraries appear later in the output anyway). *mGLOB_options_string*) ac_f77_v_output=`echo $ac_f77_v_output | sed 's/"-mGLOB[^"]*"/ /g'` ;; # Portland Group compiler has singly- or doubly-quoted -cmdline argument # Singly-quoted arguments were reported for versions 5.2-4 and 6.0-4. # Doubly-quoted arguments were reported for "PGF90/x86 Linux/x86 5.0-2". *-cmdline\ * | *-ignore\ * | *-def\ *) ac_f77_v_output=`echo $ac_f77_v_output | sed "\ s/-cmdline *'[^']*'/ /g; s/-cmdline *\"[^\"]*\"/ /g s/-ignore *'[^']*'/ /g; s/-ignore *\"[^\"]*\"/ /g s/-def *'[^']*'/ /g; s/-def *\"[^\"]*\"/ /g"` ;; # If we are using Cray Fortran then delete quotes. *cft90*) ac_f77_v_output=`echo $ac_f77_v_output | sed 's/"//g'` ;; esac # look for -l* and *.a constructs in the output for ac_arg in $ac_f77_v_output; do case $ac_arg in [\\/]*.a | ?:[\\/]*.a | -[lLRu]*) ac_cv_prog_f77_v=$ac_verb break 2 ;; esac done done if test -z "$ac_cv_prog_f77_v"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot determine how to obtain linking information from $F77" >&5 $as_echo "$as_me: WARNING: cannot determine how to obtain linking information from $F77" >&2;} fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: compilation failed" >&5 $as_echo "$as_me: WARNING: compilation failed" >&2;} fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_f77_v" >&5 $as_echo "$ac_cv_prog_f77_v" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 libraries of $F77" >&5 $as_echo_n "checking for Fortran 77 libraries of $F77... " >&6; } if ${ac_cv_f77_libs+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$FLIBS" != "x"; then ac_cv_f77_libs="$FLIBS" # Let the user override the test. else cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF # Compile and link our simple test program by passing a flag (argument # 1 to this macro) to the Fortran compiler in order to get # "verbose" output that we can then parse for the Fortran linker # flags. ac_save_FFLAGS=$FFLAGS FFLAGS="$FFLAGS $ac_cv_prog_f77_v" eval "set x $ac_link" shift $as_echo "$as_me:${as_lineno-$LINENO}: $*" >&5 # gfortran 4.3 outputs lines setting COLLECT_GCC_OPTIONS, COMPILER_PATH, # LIBRARY_PATH; skip all such settings. ac_f77_v_output=`eval $ac_link 5>&1 2>&1 | sed '/^Driving:/d; /^Configured with:/d; '"/^[_$as_cr_Letters][_$as_cr_alnum]*=/d"` $as_echo "$ac_f77_v_output" >&5 FFLAGS=$ac_save_FFLAGS rm -rf conftest* # On HP/UX there is a line like: "LPATH is: /foo:/bar:/baz" where # /foo, /bar, and /baz are search directories for the Fortran linker. # Here, we change these into -L/foo -L/bar -L/baz (and put it first): ac_f77_v_output="`echo $ac_f77_v_output | grep 'LPATH is:' | sed 's|.*LPATH is\(: *[^ ]*\).*|\1|;s|: */| -L/|g'` $ac_f77_v_output" # FIXME: we keep getting bitten by quoted arguments; a more general fix # that detects unbalanced quotes in FLIBS should be implemented # and (ugh) tested at some point. case $ac_f77_v_output in # If we are using xlf then replace all the commas with spaces. *xlfentry*) ac_f77_v_output=`echo $ac_f77_v_output | sed 's/,/ /g'` ;; # With Intel ifc, ignore the quoted -mGLOB_options_string stuff (quoted # $LIBS confuse us, and the libraries appear later in the output anyway). *mGLOB_options_string*) ac_f77_v_output=`echo $ac_f77_v_output | sed 's/"-mGLOB[^"]*"/ /g'` ;; # Portland Group compiler has singly- or doubly-quoted -cmdline argument # Singly-quoted arguments were reported for versions 5.2-4 and 6.0-4. # Doubly-quoted arguments were reported for "PGF90/x86 Linux/x86 5.0-2". *-cmdline\ * | *-ignore\ * | *-def\ *) ac_f77_v_output=`echo $ac_f77_v_output | sed "\ s/-cmdline *'[^']*'/ /g; s/-cmdline *\"[^\"]*\"/ /g s/-ignore *'[^']*'/ /g; s/-ignore *\"[^\"]*\"/ /g s/-def *'[^']*'/ /g; s/-def *\"[^\"]*\"/ /g"` ;; # If we are using Cray Fortran then delete quotes. *cft90*) ac_f77_v_output=`echo $ac_f77_v_output | sed 's/"//g'` ;; esac ac_cv_f77_libs= # Save positional arguments (if any) ac_save_positional="$@" set X $ac_f77_v_output while test $# != 1; do shift ac_arg=$1 case $ac_arg in [\\/]*.a | ?:[\\/]*.a) ac_exists=false for ac_i in $ac_cv_f77_libs; do if test x"$ac_arg" = x"$ac_i"; then ac_exists=true break fi done if test x"$ac_exists" = xtrue; then : else ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" fi ;; -bI:*) ac_exists=false for ac_i in $ac_cv_f77_libs; do if test x"$ac_arg" = x"$ac_i"; then ac_exists=true break fi done if test x"$ac_exists" = xtrue; then : else if test "$ac_compiler_gnu" = yes; then for ac_link_opt in $ac_arg; do ac_cv_f77_libs="$ac_cv_f77_libs -Xlinker $ac_link_opt" done else ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" fi fi ;; # Ignore these flags. -lang* | -lcrt*.o | -lc | -lgcc* | -lSystem | -libmil | -little \ |-LANG:=* | -LIST:* | -LNO:* | -link) ;; -lkernel32) test x"$CYGWIN" != xyes && ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" ;; -[LRuYz]) # These flags, when seen by themselves, take an argument. # We remove the space between option and argument and re-iterate # unless we find an empty arg or a new option (starting with -) case $2 in "" | -*);; *) ac_arg="$ac_arg$2" shift; shift set X $ac_arg "$@" ;; esac ;; -YP,*) for ac_j in `$as_echo "$ac_arg" | sed -e 's/-YP,/-L/;s/:/ -L/g'`; do ac_exists=false for ac_i in $ac_cv_f77_libs; do if test x"$ac_j" = x"$ac_i"; then ac_exists=true break fi done if test x"$ac_exists" = xtrue; then : else ac_arg="$ac_arg $ac_j" ac_cv_f77_libs="$ac_cv_f77_libs $ac_j" fi done ;; -[lLR]*) ac_exists=false for ac_i in $ac_cv_f77_libs; do if test x"$ac_arg" = x"$ac_i"; then ac_exists=true break fi done if test x"$ac_exists" = xtrue; then : else ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" fi ;; -zallextract*| -zdefaultextract) ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" ;; # Ignore everything else. esac done # restore positional arguments set X $ac_save_positional; shift # We only consider "LD_RUN_PATH" on Solaris systems. If this is seen, # then we insist that the "run path" must be an absolute path (i.e. it # must begin with a "/"). case `(uname -sr) 2>/dev/null` in "SunOS 5"*) ac_ld_run_path=`$as_echo "$ac_f77_v_output" | sed -n 's,^.*LD_RUN_PATH *= *\(/[^ ]*\).*$,-R\1,p'` test "x$ac_ld_run_path" != x && if test "$ac_compiler_gnu" = yes; then for ac_link_opt in $ac_ld_run_path; do ac_cv_f77_libs="$ac_cv_f77_libs -Xlinker $ac_link_opt" done else ac_cv_f77_libs="$ac_cv_f77_libs $ac_ld_run_path" fi ;; esac fi # test "x$[]_AC_LANG_PREFIX[]LIBS" = "x" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_libs" >&5 $as_echo "$ac_cv_f77_libs" >&6; } FLIBS="$ac_cv_f77_libs" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dummy main to link with Fortran 77 libraries" >&5 $as_echo_n "checking for dummy main to link with Fortran 77 libraries... " >&6; } if ${ac_cv_f77_dummy_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_f77_dm_save_LIBS=$LIBS LIBS="$LIBS $FLIBS" ac_fortran_dm_var=F77_DUMMY_MAIN ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # First, try linking without a dummy main: cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_fortran_dummy_main=none else ac_cv_fortran_dummy_main=unknown fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $ac_cv_fortran_dummy_main = unknown; then for ac_func in MAIN__ MAIN_ __main MAIN _MAIN __MAIN main_ main__ _main; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define $ac_fortran_dm_var $ac_func #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_fortran_dummy_main=$ac_func; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done fi ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu ac_cv_f77_dummy_main=$ac_cv_fortran_dummy_main rm -rf conftest* LIBS=$ac_f77_dm_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_dummy_main" >&5 $as_echo "$ac_cv_f77_dummy_main" >&6; } F77_DUMMY_MAIN=$ac_cv_f77_dummy_main if test "$F77_DUMMY_MAIN" != unknown; then : if test $F77_DUMMY_MAIN != none; then cat >>confdefs.h <<_ACEOF #define F77_DUMMY_MAIN $F77_DUMMY_MAIN _ACEOF if test "x$ac_cv_fc_dummy_main" = "x$ac_cv_f77_dummy_main"; then $as_echo "#define FC_DUMMY_MAIN_EQ_F77 1" >>confdefs.h fi fi else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "linking to Fortran libraries from C fails See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 name-mangling scheme" >&5 $as_echo_n "checking for Fortran 77 name-mangling scheme... " >&6; } if ${ac_cv_f77_mangling+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF subroutine foobar() return end subroutine foo_bar() return end _ACEOF if ac_fn_f77_try_compile "$LINENO"; then : mv conftest.$ac_objext cfortran_test.$ac_objext ac_save_LIBS=$LIBS LIBS="cfortran_test.$ac_objext $LIBS $FLIBS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_success=no for ac_foobar in foobar FOOBAR; do for ac_underscore in "" "_"; do ac_func="$ac_foobar$ac_underscore" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return $ac_func (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_success=yes; break 2 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done done ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test "$ac_success" = "yes"; then case $ac_foobar in foobar) ac_case=lower ac_foo_bar=foo_bar ;; FOOBAR) ac_case=upper ac_foo_bar=FOO_BAR ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_success_extra=no for ac_extra in "" "_"; do ac_func="$ac_foo_bar$ac_underscore$ac_extra" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return $ac_func (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_success_extra=yes; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test "$ac_success_extra" = "yes"; then ac_cv_f77_mangling="$ac_case case" if test -z "$ac_underscore"; then ac_cv_f77_mangling="$ac_cv_f77_mangling, no underscore" else ac_cv_f77_mangling="$ac_cv_f77_mangling, underscore" fi if test -z "$ac_extra"; then ac_cv_f77_mangling="$ac_cv_f77_mangling, no extra underscore" else ac_cv_f77_mangling="$ac_cv_f77_mangling, extra underscore" fi else ac_cv_f77_mangling="unknown" fi else ac_cv_f77_mangling="unknown" fi LIBS=$ac_save_LIBS rm -rf conftest* rm -f cfortran_test* else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compile a simple Fortran program See \`config.log' for more details" "$LINENO" 5; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_mangling" >&5 $as_echo "$ac_cv_f77_mangling" >&6; } ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu acx_blas_ok=no # Check whether --with-blas was given. if test "${with_blas+set}" = set; then : withval=$with_blas; fi case $with_blas in yes | "") ;; no) acx_blas_ok=disable ;; -* | */* | *.a | *.so | *.so.* | *.o) BLAS_LIBS="$with_blas" ;; *) BLAS_LIBS="-l$with_blas" ;; esac # Get fortran linker names of BLAS functions to check for. ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu case $ac_cv_f77_mangling in upper*) ac_val="SGEMM" ;; lower*) ac_val="sgemm" ;; *) ac_val="unknown" ;; esac case $ac_cv_f77_mangling in *," underscore"*) ac_val="$ac_val"_ ;; esac sgemm="$ac_val" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu case $ac_cv_f77_mangling in upper*) ac_val="DGEMM" ;; lower*) ac_val="dgemm" ;; *) ac_val="unknown" ;; esac case $ac_cv_f77_mangling in *," underscore"*) ac_val="$ac_val"_ ;; esac dgemm="$ac_val" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu acx_blas_save_LIBS="$LIBS" LIBS="$LIBS $FLIBS" # First, check BLAS_LIBS environment variable if test $acx_blas_ok = no; then if test "x$BLAS_LIBS" != x; then save_LIBS="$LIBS"; LIBS="$BLAS_LIBS $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in $BLAS_LIBS" >&5 $as_echo_n "checking for $sgemm in $BLAS_LIBS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $sgemm (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return $sgemm (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : acx_blas_ok=yes else BLAS_LIBS="" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_blas_ok" >&5 $as_echo "$acx_blas_ok" >&6; } LIBS="$save_LIBS" fi fi # BLAS linked to by default? (happens on some supercomputers) if test $acx_blas_ok = no; then save_LIBS="$LIBS"; LIBS="$LIBS" as_ac_var=`$as_echo "ac_cv_func_$sgemm" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$sgemm" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : acx_blas_ok=yes fi LIBS="$save_LIBS" fi # BLAS in ATLAS library? (http://math-atlas.sourceforge.net/) if test $acx_blas_ok = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ATL_xerbla in -latlas" >&5 $as_echo_n "checking for ATL_xerbla in -latlas... " >&6; } if ${ac_cv_lib_atlas_ATL_xerbla+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-latlas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ATL_xerbla (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return ATL_xerbla (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_atlas_ATL_xerbla=yes else ac_cv_lib_atlas_ATL_xerbla=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_atlas_ATL_xerbla" >&5 $as_echo "$ac_cv_lib_atlas_ATL_xerbla" >&6; } if test "x$ac_cv_lib_atlas_ATL_xerbla" = xyes; then : as_ac_Lib=`$as_echo "ac_cv_lib_f77blas_$sgemm" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lf77blas" >&5 $as_echo_n "checking for $sgemm in -lf77blas... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lf77blas -latlas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $sgemm (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return $sgemm (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cblas_dgemm in -lcblas" >&5 $as_echo_n "checking for cblas_dgemm in -lcblas... " >&6; } if ${ac_cv_lib_cblas_cblas_dgemm+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcblas -lf77blas -latlas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cblas_dgemm (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return cblas_dgemm (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cblas_cblas_dgemm=yes else ac_cv_lib_cblas_cblas_dgemm=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cblas_cblas_dgemm" >&5 $as_echo "$ac_cv_lib_cblas_cblas_dgemm" >&6; } if test "x$ac_cv_lib_cblas_cblas_dgemm" = xyes; then : acx_blas_ok=yes BLAS_LIBS="-lcblas -lf77blas -latlas" fi fi fi fi # BLAS in PhiPACK libraries? (requires generic BLAS lib, too) if test $acx_blas_ok = no; then as_ac_Lib=`$as_echo "ac_cv_lib_blas_$sgemm" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lblas" >&5 $as_echo_n "checking for $sgemm in -lblas... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lblas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $sgemm (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return $sgemm (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : as_ac_Lib=`$as_echo "ac_cv_lib_dgemm_$dgemm" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $dgemm in -ldgemm" >&5 $as_echo_n "checking for $dgemm in -ldgemm... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldgemm -lblas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $dgemm (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return $dgemm (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : as_ac_Lib=`$as_echo "ac_cv_lib_sgemm_$sgemm" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lsgemm" >&5 $as_echo_n "checking for $sgemm in -lsgemm... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsgemm -lblas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $sgemm (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return $sgemm (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : acx_blas_ok=yes; BLAS_LIBS="-lsgemm -ldgemm -lblas" fi fi fi fi # BLAS in Alpha CXML library? if test $acx_blas_ok = no; then as_ac_Lib=`$as_echo "ac_cv_lib_cxml_$sgemm" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lcxml" >&5 $as_echo_n "checking for $sgemm in -lcxml... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcxml $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $sgemm (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return $sgemm (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : acx_blas_ok=yes;BLAS_LIBS="-lcxml" fi fi # BLAS in Alpha DXML library? (now called CXML, see above) if test $acx_blas_ok = no; then as_ac_Lib=`$as_echo "ac_cv_lib_dxml_$sgemm" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -ldxml" >&5 $as_echo_n "checking for $sgemm in -ldxml... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldxml $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $sgemm (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return $sgemm (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : acx_blas_ok=yes;BLAS_LIBS="-ldxml" fi fi # BLAS in Sun Performance library? if test $acx_blas_ok = no; then if test "x$GCC" != xyes; then # only works with Sun CC { $as_echo "$as_me:${as_lineno-$LINENO}: checking for acosp in -lsunmath" >&5 $as_echo_n "checking for acosp in -lsunmath... " >&6; } if ${ac_cv_lib_sunmath_acosp+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsunmath $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char acosp (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return acosp (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_sunmath_acosp=yes else ac_cv_lib_sunmath_acosp=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sunmath_acosp" >&5 $as_echo "$ac_cv_lib_sunmath_acosp" >&6; } if test "x$ac_cv_lib_sunmath_acosp" = xyes; then : as_ac_Lib=`$as_echo "ac_cv_lib_sunperf_$sgemm" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lsunperf" >&5 $as_echo_n "checking for $sgemm in -lsunperf... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsunperf -lsunmath $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $sgemm (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return $sgemm (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : BLAS_LIBS="-xlic_lib=sunperf -lsunmath" acx_blas_ok=yes fi fi fi fi # BLAS in SCSL library? (SGI/Cray Scientific Library) if test $acx_blas_ok = no; then as_ac_Lib=`$as_echo "ac_cv_lib_scs_$sgemm" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lscs" >&5 $as_echo_n "checking for $sgemm in -lscs... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lscs $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $sgemm (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return $sgemm (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : acx_blas_ok=yes; BLAS_LIBS="-lscs" fi fi # BLAS in SGIMATH library? if test $acx_blas_ok = no; then as_ac_Lib=`$as_echo "ac_cv_lib_complib.sgimath_$sgemm" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lcomplib.sgimath" >&5 $as_echo_n "checking for $sgemm in -lcomplib.sgimath... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcomplib.sgimath $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $sgemm (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return $sgemm (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : acx_blas_ok=yes; BLAS_LIBS="-lcomplib.sgimath" fi fi # BLAS in IBM ESSL library? (requires generic BLAS lib, too) if test $acx_blas_ok = no; then as_ac_Lib=`$as_echo "ac_cv_lib_blas_$sgemm" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lblas" >&5 $as_echo_n "checking for $sgemm in -lblas... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lblas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $sgemm (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return $sgemm (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : as_ac_Lib=`$as_echo "ac_cv_lib_essl_$sgemm" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lessl" >&5 $as_echo_n "checking for $sgemm in -lessl... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lessl -lblas $FLIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $sgemm (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return $sgemm (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : acx_blas_ok=yes; BLAS_LIBS="-lessl -lblas" fi fi fi # Generic BLAS library? if test $acx_blas_ok = no; then as_ac_Lib=`$as_echo "ac_cv_lib_blas_$sgemm" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $sgemm in -lblas" >&5 $as_echo_n "checking for $sgemm in -lblas... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lblas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $sgemm (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return $sgemm (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : acx_blas_ok=yes; BLAS_LIBS="-lblas" fi fi LIBS="$acx_blas_save_LIBS" # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$acx_blas_ok" = xyes; then $as_echo "#define HAVE_BLAS 1" >>confdefs.h : else acx_blas_ok=no fi acx_lapack_ok=no # Check whether --with-lapack was given. if test "${with_lapack+set}" = set; then : withval=$with_lapack; fi case $with_lapack in yes | "") ;; no) acx_lapack_ok=disable ;; -* | */* | *.a | *.so | *.so.* | *.o) LAPACK_LIBS="$with_lapack" ;; *) LAPACK_LIBS="-l$with_lapack" ;; esac # Get fortran linker name of LAPACK function to check for. ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu case $ac_cv_f77_mangling in upper*) ac_val="CHEEV" ;; lower*) ac_val="cheev" ;; *) ac_val="unknown" ;; esac case $ac_cv_f77_mangling in *," underscore"*) ac_val="$ac_val"_ ;; esac cheev="$ac_val" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # We cannot use LAPACK if BLAS is not found if test "x$acx_blas_ok" != xyes; then acx_lapack_ok=noblas fi # First, check LAPACK_LIBS environment variable if test "x$LAPACK_LIBS" != x; then save_LIBS="$LIBS"; LIBS="$LAPACK_LIBS $BLAS_LIBS $LIBS $FLIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $cheev in $LAPACK_LIBS" >&5 $as_echo_n "checking for $cheev in $LAPACK_LIBS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $cheev (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return $cheev (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : acx_lapack_ok=yes else LAPACK_LIBS="" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_lapack_ok" >&5 $as_echo "$acx_lapack_ok" >&6; } LIBS="$save_LIBS" if test acx_lapack_ok = no; then LAPACK_LIBS="" fi fi # LAPACK linked to by default? (is sometimes included in BLAS lib) if test $acx_lapack_ok = no; then save_LIBS="$LIBS"; LIBS="$LIBS $BLAS_LIBS $FLIBS" as_ac_var=`$as_echo "ac_cv_func_$cheev" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$cheev" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : acx_lapack_ok=yes fi LIBS="$save_LIBS" fi # Generic LAPACK library? for lapack in lapack lapack_rs6k; do if test $acx_lapack_ok = no; then save_LIBS="$LIBS"; LIBS="$BLAS_LIBS $LIBS" as_ac_Lib=`$as_echo "ac_cv_lib_$lapack''_$cheev" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $cheev in -l$lapack" >&5 $as_echo_n "checking for $cheev in -l$lapack... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$lapack $FLIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $cheev (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main () { return $cheev (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : acx_lapack_ok=yes; LAPACK_LIBS="-l$lapack" fi LIBS="$save_LIBS" fi done # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$acx_lapack_ok" = xyes; then $as_echo "#define HAVE_LAPACK 1" >>confdefs.h : else acx_lapack_ok=no fi # Check whether --with-etsf_io was given. if test "${with_etsf_io+set}" = set; then : withval=$with_etsf_io; ETSF_IO_PATH=$withval else ETSF_IO_PATH="" fi # Check whether --with-etsf_io_include was given. if test "${with_etsf_io_include+set}" = set; then : withval=$with_etsf_io_include; ETSF_IO_PATH_INC=$withval else ETSF_IO_PATH_INC="" fi # Check whether --with-etsf_io_libdir was given. if test "${with_etsf_io_libdir+set}" = set; then : withval=$with_etsf_io_libdir; ETSF_IO_PATH_LIBDIR=$withval else ETSF_IO_PATH_LIBDIR="" fi if test "z$ETSF_IO_PATH" != "z"; then : if test "z$ETSF_IO_PATH_LIBDIR" = "z"; then : ETSF_IO_PATH_LIBDIR="$ETSF_IO_PATH/lib" fi if test "z$ETSF_IO_PATH_INC" = "z"; then : ETSF_IO_PATH_INC="$ETSF_IO_PATH/include" fi fi ac_etsf_io_ok='no' ETSF_IO_LIBS= ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran flag to compile .f90 files" >&5 $as_echo_n "checking for Fortran flag to compile .f90 files... " >&6; } if ${ac_cv_fc_srcext_f90+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=f90 ac_fcflags_srcext_save=$ac_fcflags_srcext ac_fcflags_srcext= ac_cv_fc_srcext_f90=unknown for ac_flag in none -qsuffix=f=f90 -Tf; do test "x$ac_flag" != xnone && ac_fcflags_srcext="$ac_flag" cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_fc_try_compile "$LINENO"; then : ac_cv_fc_srcext_f90=$ac_flag; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest.$ac_objext conftest.f90 ac_fcflags_srcext=$ac_fcflags_srcext_save fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_srcext_f90" >&5 $as_echo "$ac_cv_fc_srcext_f90" >&6; } if test "x$ac_cv_fc_srcext_f90" = xunknown; then as_fn_error $? "Fortran could not compile .f90 files" "$LINENO" 5 else ac_fc_srcext=f90 if test "x$ac_cv_fc_srcext_f90" = xnone; then ac_fcflags_srcext="" FCFLAGS_f90="" else ac_fcflags_srcext=$ac_cv_fc_srcext_f90 FCFLAGS_f90=$ac_cv_fc_srcext_f90 fi fi ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu LDFLAGS_SVG="$LDFLAGS" LIBS_SVG="$LIBS" FCFLAGS_SVG="$FCFLAGS" if test -n "$ETSF_IO_PATH_LIBDIR"; then : LDFLAGS="$LDFLAGS -L$ETSF_IO_PATH_LIBDIR" fi if test -n "$ETSF_IO_PATH_INC"; then : FCFLAGS="$FCFLAGS -I$ETSF_IO_PATH_INC" fi if test -n "$NC_LDFLAGS"; then : LDFLAGS="$LDFLAGS $NC_LDFLAGS" fi if test -n "$NC_CPPFLAGS"; then : FCFLAGS="$FCFLAGS $NC_CPPFLAGS" fi LIBS="$LIBS -letsf_io -lnetcdff $NC_LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ETSF_IO library" >&5 $as_echo_n "checking for ETSF_IO library... " >&6; } cat > conftest.$ac_ext <<_ACEOF program main use etsf_io type(etsf_groups_flags) :: groups type(etsf_dims) :: dims logical :: lstat type(etsf_io_low_error) :: error_data call etsf_io_data_init("test", groups, dims, "test", "", lstat, error_data) end _ACEOF if ac_fn_fc_try_link "$LINENO"; then : ac_etsf_io_ok=yes else ac_etsf_io_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_etsf_io_ok" >&5 $as_echo "$ac_etsf_io_ok" >&6; } LIBS="$LIBS_SVG" LDFLAGS="$LDFLAGS_SVG" FCFLAGS="$FCFLAGS_SVG" if test "$ac_etsf_io_ok" = "yes"; then ETSF_IO_LIBS="-letsf_io_utils -letsf_io -lnetcdff $NC_LIBS" if test -n "$ETSF_IO_PATH_LIBDIR"; then : ETSF_IO_LIBS="-L$ETSF_IO_PATH_LIBDIR $ETSF_IO_LIBS" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Check whether --with-libxc was given. if test "${with_libxc+set}" = set; then : withval=$with_libxc; LIBXC_PATH=$withval else LIBXC_PATH="" fi # Check whether --with-libxc_include was given. if test "${with_libxc_include+set}" = set; then : withval=$with_libxc_include; LIBXC_PATH_INC=$withval else LIBXC_PATH_INC="" fi # Check whether --with-libxc_libdir was given. if test "${with_libxc_libdir+set}" = set; then : withval=$with_libxc_libdir; LIBXC_PATH_LIBDIR=$withval else LIBXC_PATH_LIBDIR="" fi if test "z$LIBXC_PATH" != "z"; then : if test "z$LIBXC_PATH_LIBDIR" = "z"; then : LIBXC_PATH_LIBDIR="$LIBXC_PATH/lib" fi if test "z$LIBXC_PATH_INC" = "z"; then : LIBXC_PATH_INC="$LIBXC_PATH/include" fi fi ac_libxc_ok='no' LIBXC_LIBS= ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran flag to compile .f90 files" >&5 $as_echo_n "checking for Fortran flag to compile .f90 files... " >&6; } if ${ac_cv_fc_srcext_f90+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=f90 ac_fcflags_srcext_save=$ac_fcflags_srcext ac_fcflags_srcext= ac_cv_fc_srcext_f90=unknown for ac_flag in none -qsuffix=f=f90 -Tf; do test "x$ac_flag" != xnone && ac_fcflags_srcext="$ac_flag" cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_fc_try_compile "$LINENO"; then : ac_cv_fc_srcext_f90=$ac_flag; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest.$ac_objext conftest.f90 ac_fcflags_srcext=$ac_fcflags_srcext_save fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_srcext_f90" >&5 $as_echo "$ac_cv_fc_srcext_f90" >&6; } if test "x$ac_cv_fc_srcext_f90" = xunknown; then as_fn_error $? "Fortran could not compile .f90 files" "$LINENO" 5 else ac_fc_srcext=f90 if test "x$ac_cv_fc_srcext_f90" = xnone; then ac_fcflags_srcext="" FCFLAGS_f90="" else ac_fcflags_srcext=$ac_cv_fc_srcext_f90 FCFLAGS_f90=$ac_cv_fc_srcext_f90 fi fi ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu LDFLAGS_SVG="$LDFLAGS" LIBS_SVG="$LIBS" FCFLAGS_SVG="$FCFLAGS" if test -n "$LIBXC_PATH_LIBDIR"; then : LDFLAGS="$LDFLAGS -L$LIBXC_PATH_LIBDIR" fi if test -n "$LIBXC_PATH_INC"; then : FCFLAGS="$FCFLAGS -I$LIBXC_PATH_INC" fi if test -n "$NC_LDFLAGS"; then : LDFLAGS="$LDFLAGS $NC_LDFLAGS" fi if test -n "$NC_CPPFLAGS"; then : FCFLAGS="$FCFLAGS $NC_CPPFLAGS" fi LIBS="$LIBS -lxc" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBXC library" >&5 $as_echo_n "checking for LIBXC library... " >&6; } cat > conftest.$ac_ext <<_ACEOF program main call xc_f90_family_from_id() end _ACEOF if ac_fn_fc_try_link "$LINENO"; then : ac_libxc_ok=yes else ac_libxc_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_libxc_ok" >&5 $as_echo "$ac_libxc_ok" >&6; } LIBS="$LIBS_SVG" LDFLAGS="$LDFLAGS_SVG" FCFLAGS="$FCFLAGS_SVG" if test "$ac_libxc_ok" = "yes"; then LIBXC_LIBS="-lxc" if test -n "$LIBXC_PATH_LIBDIR"; then : LIBXC_LIBS="-L$LIBXC_PATH_LIBDIR $LIBXC_LIBS" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to get verbose linking output from $FC" >&5 $as_echo_n "checking how to get verbose linking output from $FC... " >&6; } if ${ac_cv_prog_fc_v+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_fc_try_compile "$LINENO"; then : ac_cv_prog_fc_v= # Try some options frequently used verbose output for ac_verb in -v -verbose --verbose -V -\#\#\#; do cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF # Compile and link our simple test program by passing a flag (argument # 1 to this macro) to the Fortran compiler in order to get # "verbose" output that we can then parse for the Fortran linker # flags. ac_save_FCFLAGS=$FCFLAGS FCFLAGS="$FCFLAGS $ac_verb" eval "set x $ac_link" shift $as_echo "$as_me:${as_lineno-$LINENO}: $*" >&5 # gfortran 4.3 outputs lines setting COLLECT_GCC_OPTIONS, COMPILER_PATH, # LIBRARY_PATH; skip all such settings. ac_fc_v_output=`eval $ac_link 5>&1 2>&1 | sed '/^Driving:/d; /^Configured with:/d; '"/^[_$as_cr_Letters][_$as_cr_alnum]*=/d"` $as_echo "$ac_fc_v_output" >&5 FCFLAGS=$ac_save_FCFLAGS rm -rf conftest* # On HP/UX there is a line like: "LPATH is: /foo:/bar:/baz" where # /foo, /bar, and /baz are search directories for the Fortran linker. # Here, we change these into -L/foo -L/bar -L/baz (and put it first): ac_fc_v_output="`echo $ac_fc_v_output | grep 'LPATH is:' | sed 's|.*LPATH is\(: *[^ ]*\).*|\1|;s|: */| -L/|g'` $ac_fc_v_output" # FIXME: we keep getting bitten by quoted arguments; a more general fix # that detects unbalanced quotes in FLIBS should be implemented # and (ugh) tested at some point. case $ac_fc_v_output in # If we are using xlf then replace all the commas with spaces. *xlfentry*) ac_fc_v_output=`echo $ac_fc_v_output | sed 's/,/ /g'` ;; # With Intel ifc, ignore the quoted -mGLOB_options_string stuff (quoted # $LIBS confuse us, and the libraries appear later in the output anyway). *mGLOB_options_string*) ac_fc_v_output=`echo $ac_fc_v_output | sed 's/"-mGLOB[^"]*"/ /g'` ;; # Portland Group compiler has singly- or doubly-quoted -cmdline argument # Singly-quoted arguments were reported for versions 5.2-4 and 6.0-4. # Doubly-quoted arguments were reported for "PGF90/x86 Linux/x86 5.0-2". *-cmdline\ * | *-ignore\ * | *-def\ *) ac_fc_v_output=`echo $ac_fc_v_output | sed "\ s/-cmdline *'[^']*'/ /g; s/-cmdline *\"[^\"]*\"/ /g s/-ignore *'[^']*'/ /g; s/-ignore *\"[^\"]*\"/ /g s/-def *'[^']*'/ /g; s/-def *\"[^\"]*\"/ /g"` ;; # If we are using Cray Fortran then delete quotes. *cft90*) ac_fc_v_output=`echo $ac_fc_v_output | sed 's/"//g'` ;; esac # look for -l* and *.a constructs in the output for ac_arg in $ac_fc_v_output; do case $ac_arg in [\\/]*.a | ?:[\\/]*.a | -[lLRu]*) ac_cv_prog_fc_v=$ac_verb break 2 ;; esac done done if test -z "$ac_cv_prog_fc_v"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot determine how to obtain linking information from $FC" >&5 $as_echo "$as_me: WARNING: cannot determine how to obtain linking information from $FC" >&2;} fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: compilation failed" >&5 $as_echo "$as_me: WARNING: compilation failed" >&2;} fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_fc_v" >&5 $as_echo "$ac_cv_prog_fc_v" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran libraries of $FC" >&5 $as_echo_n "checking for Fortran libraries of $FC... " >&6; } if ${ac_cv_fc_libs+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$FCLIBS" != "x"; then ac_cv_fc_libs="$FCLIBS" # Let the user override the test. else cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF # Compile and link our simple test program by passing a flag (argument # 1 to this macro) to the Fortran compiler in order to get # "verbose" output that we can then parse for the Fortran linker # flags. ac_save_FCFLAGS=$FCFLAGS FCFLAGS="$FCFLAGS $ac_cv_prog_fc_v" eval "set x $ac_link" shift $as_echo "$as_me:${as_lineno-$LINENO}: $*" >&5 # gfortran 4.3 outputs lines setting COLLECT_GCC_OPTIONS, COMPILER_PATH, # LIBRARY_PATH; skip all such settings. ac_fc_v_output=`eval $ac_link 5>&1 2>&1 | sed '/^Driving:/d; /^Configured with:/d; '"/^[_$as_cr_Letters][_$as_cr_alnum]*=/d"` $as_echo "$ac_fc_v_output" >&5 FCFLAGS=$ac_save_FCFLAGS rm -rf conftest* # On HP/UX there is a line like: "LPATH is: /foo:/bar:/baz" where # /foo, /bar, and /baz are search directories for the Fortran linker. # Here, we change these into -L/foo -L/bar -L/baz (and put it first): ac_fc_v_output="`echo $ac_fc_v_output | grep 'LPATH is:' | sed 's|.*LPATH is\(: *[^ ]*\).*|\1|;s|: */| -L/|g'` $ac_fc_v_output" # FIXME: we keep getting bitten by quoted arguments; a more general fix # that detects unbalanced quotes in FLIBS should be implemented # and (ugh) tested at some point. case $ac_fc_v_output in # If we are using xlf then replace all the commas with spaces. *xlfentry*) ac_fc_v_output=`echo $ac_fc_v_output | sed 's/,/ /g'` ;; # With Intel ifc, ignore the quoted -mGLOB_options_string stuff (quoted # $LIBS confuse us, and the libraries appear later in the output anyway). *mGLOB_options_string*) ac_fc_v_output=`echo $ac_fc_v_output | sed 's/"-mGLOB[^"]*"/ /g'` ;; # Portland Group compiler has singly- or doubly-quoted -cmdline argument # Singly-quoted arguments were reported for versions 5.2-4 and 6.0-4. # Doubly-quoted arguments were reported for "PGF90/x86 Linux/x86 5.0-2". *-cmdline\ * | *-ignore\ * | *-def\ *) ac_fc_v_output=`echo $ac_fc_v_output | sed "\ s/-cmdline *'[^']*'/ /g; s/-cmdline *\"[^\"]*\"/ /g s/-ignore *'[^']*'/ /g; s/-ignore *\"[^\"]*\"/ /g s/-def *'[^']*'/ /g; s/-def *\"[^\"]*\"/ /g"` ;; # If we are using Cray Fortran then delete quotes. *cft90*) ac_fc_v_output=`echo $ac_fc_v_output | sed 's/"//g'` ;; esac ac_cv_fc_libs= # Save positional arguments (if any) ac_save_positional="$@" set X $ac_fc_v_output while test $# != 1; do shift ac_arg=$1 case $ac_arg in [\\/]*.a | ?:[\\/]*.a) ac_exists=false for ac_i in $ac_cv_fc_libs; do if test x"$ac_arg" = x"$ac_i"; then ac_exists=true break fi done if test x"$ac_exists" = xtrue; then : else ac_cv_fc_libs="$ac_cv_fc_libs $ac_arg" fi ;; -bI:*) ac_exists=false for ac_i in $ac_cv_fc_libs; do if test x"$ac_arg" = x"$ac_i"; then ac_exists=true break fi done if test x"$ac_exists" = xtrue; then : else if test "$ac_compiler_gnu" = yes; then for ac_link_opt in $ac_arg; do ac_cv_fc_libs="$ac_cv_fc_libs -Xlinker $ac_link_opt" done else ac_cv_fc_libs="$ac_cv_fc_libs $ac_arg" fi fi ;; # Ignore these flags. -lang* | -lcrt*.o | -lc | -lgcc* | -lSystem | -libmil | -little \ |-LANG:=* | -LIST:* | -LNO:* | -link) ;; -lkernel32) test x"$CYGWIN" != xyes && ac_cv_fc_libs="$ac_cv_fc_libs $ac_arg" ;; -[LRuYz]) # These flags, when seen by themselves, take an argument. # We remove the space between option and argument and re-iterate # unless we find an empty arg or a new option (starting with -) case $2 in "" | -*);; *) ac_arg="$ac_arg$2" shift; shift set X $ac_arg "$@" ;; esac ;; -YP,*) for ac_j in `$as_echo "$ac_arg" | sed -e 's/-YP,/-L/;s/:/ -L/g'`; do ac_exists=false for ac_i in $ac_cv_fc_libs; do if test x"$ac_j" = x"$ac_i"; then ac_exists=true break fi done if test x"$ac_exists" = xtrue; then : else ac_arg="$ac_arg $ac_j" ac_cv_fc_libs="$ac_cv_fc_libs $ac_j" fi done ;; -[lLR]*) ac_exists=false for ac_i in $ac_cv_fc_libs; do if test x"$ac_arg" = x"$ac_i"; then ac_exists=true break fi done if test x"$ac_exists" = xtrue; then : else ac_cv_fc_libs="$ac_cv_fc_libs $ac_arg" fi ;; -zallextract*| -zdefaultextract) ac_cv_fc_libs="$ac_cv_fc_libs $ac_arg" ;; # Ignore everything else. esac done # restore positional arguments set X $ac_save_positional; shift # We only consider "LD_RUN_PATH" on Solaris systems. If this is seen, # then we insist that the "run path" must be an absolute path (i.e. it # must begin with a "/"). case `(uname -sr) 2>/dev/null` in "SunOS 5"*) ac_ld_run_path=`$as_echo "$ac_fc_v_output" | sed -n 's,^.*LD_RUN_PATH *= *\(/[^ ]*\).*$,-R\1,p'` test "x$ac_ld_run_path" != x && if test "$ac_compiler_gnu" = yes; then for ac_link_opt in $ac_ld_run_path; do ac_cv_fc_libs="$ac_cv_fc_libs -Xlinker $ac_link_opt" done else ac_cv_fc_libs="$ac_cv_fc_libs $ac_ld_run_path" fi ;; esac fi # test "x$[]_AC_LANG_PREFIX[]LIBS" = "x" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_libs" >&5 $as_echo "$ac_cv_fc_libs" >&6; } FCLIBS="$ac_cv_fc_libs" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dummy main to link with Fortran libraries" >&5 $as_echo_n "checking for dummy main to link with Fortran libraries... " >&6; } if ${ac_cv_fc_dummy_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_fc_dm_save_LIBS=$LIBS LIBS="$LIBS $FCLIBS" ac_fortran_dm_var=FC_DUMMY_MAIN ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # First, try linking without a dummy main: cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif #ifdef FC_DUMMY_MAIN #ifndef FC_DUMMY_MAIN_EQ_F77 # ifdef __cplusplus extern "C" # endif int FC_DUMMY_MAIN() { return 1; } #endif #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_fortran_dummy_main=none else ac_cv_fortran_dummy_main=unknown fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $ac_cv_fortran_dummy_main = unknown; then for ac_func in MAIN__ MAIN_ __main MAIN _MAIN __MAIN main_ main__ _main; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define $ac_fortran_dm_var $ac_func #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif #ifdef FC_DUMMY_MAIN #ifndef FC_DUMMY_MAIN_EQ_F77 # ifdef __cplusplus extern "C" # endif int FC_DUMMY_MAIN() { return 1; } #endif #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_fortran_dummy_main=$ac_func; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done fi ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu ac_cv_fc_dummy_main=$ac_cv_fortran_dummy_main rm -rf conftest* LIBS=$ac_fc_dm_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_dummy_main" >&5 $as_echo "$ac_cv_fc_dummy_main" >&6; } FC_DUMMY_MAIN=$ac_cv_fc_dummy_main if test "$FC_DUMMY_MAIN" != unknown; then : if test $FC_DUMMY_MAIN != none; then cat >>confdefs.h <<_ACEOF #define FC_DUMMY_MAIN $FC_DUMMY_MAIN _ACEOF if test "x$ac_cv_fc_dummy_main" = "x$ac_cv_f77_dummy_main"; then $as_echo "#define FC_DUMMY_MAIN_EQ_F77 1" >>confdefs.h fi fi else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "linking to Fortran libraries from C fails See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran name-mangling scheme" >&5 $as_echo_n "checking for Fortran name-mangling scheme... " >&6; } if ${ac_cv_fc_mangling+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF subroutine foobar() return end subroutine foo_bar() return end _ACEOF if ac_fn_fc_try_compile "$LINENO"; then : mv conftest.$ac_objext cfortran_test.$ac_objext ac_save_LIBS=$LIBS LIBS="cfortran_test.$ac_objext $LIBS $FCLIBS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_success=no for ac_foobar in foobar FOOBAR; do for ac_underscore in "" "_"; do ac_func="$ac_foobar$ac_underscore" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif #ifdef FC_DUMMY_MAIN #ifndef FC_DUMMY_MAIN_EQ_F77 # ifdef __cplusplus extern "C" # endif int FC_DUMMY_MAIN() { return 1; } #endif #endif int main () { return $ac_func (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_success=yes; break 2 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done done ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu if test "$ac_success" = "yes"; then case $ac_foobar in foobar) ac_case=lower ac_foo_bar=foo_bar ;; FOOBAR) ac_case=upper ac_foo_bar=FOO_BAR ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_success_extra=no for ac_extra in "" "_"; do ac_func="$ac_foo_bar$ac_underscore$ac_extra" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif #ifdef FC_DUMMY_MAIN #ifndef FC_DUMMY_MAIN_EQ_F77 # ifdef __cplusplus extern "C" # endif int FC_DUMMY_MAIN() { return 1; } #endif #endif int main () { return $ac_func (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_success_extra=yes; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu if test "$ac_success_extra" = "yes"; then ac_cv_fc_mangling="$ac_case case" if test -z "$ac_underscore"; then ac_cv_fc_mangling="$ac_cv_fc_mangling, no underscore" else ac_cv_fc_mangling="$ac_cv_fc_mangling, underscore" fi if test -z "$ac_extra"; then ac_cv_fc_mangling="$ac_cv_fc_mangling, no extra underscore" else ac_cv_fc_mangling="$ac_cv_fc_mangling, extra underscore" fi else ac_cv_fc_mangling="unknown" fi else ac_cv_fc_mangling="unknown" fi LIBS=$ac_save_LIBS rm -rf conftest* rm -f cfortran_test* else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compile a simple Fortran program See \`config.log' for more details" "$LINENO" 5; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_mangling" >&5 $as_echo "$ac_cv_fc_mangling" >&6; } ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Abinit support" >&5 $as_echo_n "checking for Abinit support... " >&6; } # Check whether --with-abinit was given. if test "${with_abinit+set}" = set; then : withval=$with_abinit; AB_PATH=$withval else AB_PATH="no" fi # Check whether --with-abinit_include was given. if test "${with_abinit_include+set}" = set; then : withval=$with_abinit_include; AB_PATH_INC=$withval else AB_PATH_INC="" fi # Check whether --with-abinit_libdir was given. if test "${with_abinit_libdir+set}" = set; then : withval=$with_abinit_libdir; AB_PATH_LIBDIR=$withval else AB_PATH_LIBDIR="" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AB_PATH" >&5 $as_echo "$AB_PATH" >&6; } if test "z$AB_PATH" != "zno" ; then if test x"$acx_lapack_ok" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ABINIT support has been disabled since Lapack is not available." >&5 $as_echo "$as_me: WARNING: ABINIT support has been disabled since Lapack is not available." >&2;} AB_PATH="no" fi fi if test "z$AB_PATH" != "zno" ; then if test x"$ac_etsf_io_ok" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ABINIT support has been disabled since ETSF_IO is not available." >&5 $as_echo "$as_me: WARNING: ABINIT support has been disabled since ETSF_IO is not available." >&2;} AB_PATH="no" fi fi if test "z$AB_PATH" != "zno" ; then if test x"$ac_libxc_ok" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ABINIT support has been disabled since LibXC is not available." >&5 $as_echo "$as_me: WARNING: ABINIT support has been disabled since LibXC is not available." >&2;} AB_PATH="no" fi fi if test "z$AB_PATH" != "zno" ; then if test "z$AB_PATH" = "zyes"; then : AB_PATH="/opt/etsf/abinit" fi if test "z$AB_PATH_LIBDIR" = "z"; then : AB_PATH_LIBDIR="$AB_PATH/lib" fi if test "z$AB_PATH_INC" = "z"; then : AB_PATH_INC="$AB_PATH/include" fi CPPFLAGS_SVG=$CPPFLAGS CPPFLAGS="$CPPFLAGS -I$AB_PATH_INC" ac_fn_c_check_header_mongrel "$LINENO" "ab6_invars.h" "ac_cv_header_ab6_invars_h" "$ac_includes_default" if test "x$ac_cv_header_ab6_invars_h" = xyes; then : ac_abinit_parser_header="yes" else ac_abinit_parser_header="no" fi ac_fn_c_check_header_mongrel "$LINENO" "ab6_symmetry.h" "ac_cv_header_ab6_symmetry_h" "$ac_includes_default" if test "x$ac_cv_header_ab6_symmetry_h" = xyes; then : ac_abinit_symmetry_header="yes" else ac_abinit_symmetry_header="no" fi CPPFLAGS=$CPPFLAGS_SVG AB_LIBRARY="abinis" if test -f $AB_PATH_LIBDIR/libabinit6.a ; then AB_LIBRARY="abinit6" fi ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu case $ac_cv_fc_mangling in "lower case, no underscore, no extra underscore") $as_echo "#define FC_FUNC(name,NAME) name" >>confdefs.h $as_echo "#define FC_FUNC_(name,NAME) name" >>confdefs.h ;; "lower case, no underscore, extra underscore") $as_echo "#define FC_FUNC(name,NAME) name" >>confdefs.h $as_echo "#define FC_FUNC_(name,NAME) name ## _" >>confdefs.h ;; "lower case, underscore, no extra underscore") $as_echo "#define FC_FUNC(name,NAME) name ## _" >>confdefs.h $as_echo "#define FC_FUNC_(name,NAME) name ## _" >>confdefs.h ;; "lower case, underscore, extra underscore") $as_echo "#define FC_FUNC(name,NAME) name ## _" >>confdefs.h $as_echo "#define FC_FUNC_(name,NAME) name ## __" >>confdefs.h ;; "upper case, no underscore, no extra underscore") $as_echo "#define FC_FUNC(name,NAME) NAME" >>confdefs.h $as_echo "#define FC_FUNC_(name,NAME) NAME" >>confdefs.h ;; "upper case, no underscore, extra underscore") $as_echo "#define FC_FUNC(name,NAME) NAME" >>confdefs.h $as_echo "#define FC_FUNC_(name,NAME) NAME ## _" >>confdefs.h ;; "upper case, underscore, no extra underscore") $as_echo "#define FC_FUNC(name,NAME) NAME ## _" >>confdefs.h $as_echo "#define FC_FUNC_(name,NAME) NAME ## _" >>confdefs.h ;; "upper case, underscore, extra underscore") $as_echo "#define FC_FUNC(name,NAME) NAME ## _" >>confdefs.h $as_echo "#define FC_FUNC_(name,NAME) NAME ## __" >>confdefs.h ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unknown Fortran name-mangling scheme" >&5 $as_echo "$as_me: WARNING: unknown Fortran name-mangling scheme" >&2;} ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu case $ac_cv_fc_mangling in upper*) ac_val="WRTOUT" ;; lower*) ac_val="wrtout" ;; *) ac_val="unknown" ;; esac case $ac_cv_fc_mangling in *," underscore"*) ac_val="$ac_val"_ ;; esac wrtout="$ac_val" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu case $ac_cv_fc_mangling in upper*) ac_val="LEAVE_NEW" ;; lower*) ac_val="leave_new" ;; *) ac_val="unknown" ;; esac case $ac_cv_fc_mangling in *," underscore"*) ac_val="$ac_val"_ ;; esac case $ac_cv_fc_mangling in *," extra underscore"*) ac_val="$ac_val"_ ;; esac leave_new="$ac_val" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu case $ac_cv_fc_mangling in upper*) ac_val="TIMAB" ;; lower*) ac_val="timab" ;; *) ac_val="unknown" ;; esac case $ac_cv_fc_mangling in *," underscore"*) ac_val="$ac_val"_ ;; esac timab="$ac_val" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu case $ac_cv_fc_mangling in upper*) ac_val="PSP_FROM_DATA" ;; lower*) ac_val="psp_from_data" ;; *) ac_val="unknown" ;; esac case $ac_cv_fc_mangling in *," underscore"*) ac_val="$ac_val"_ ;; esac case $ac_cv_fc_mangling in *," extra underscore"*) ac_val="$ac_val"_ ;; esac psp_from_data="$ac_val" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu LIBS_SVG=$LIBS LIBS="$LIBS_SVG -L$AB_PATH_LIBDIR -l$AB_LIBRARY $ETSF_IO_LIBS $LIBXC_LIBS $LAPACK_LIBS $BLAS_LIBS $FCLIBS" CFLAGS_SVG=$CFLAGS CFLAGS="$CFLAGS -Wno-error" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for parser capabilities in lib$AB_LIBRARY.a from $AB_PATH_LIBDIR" >&5 $as_echo_n "checking for parser capabilities in lib$AB_LIBRARY.a from $AB_PATH_LIBDIR... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ void $wrtout() { } void $leave_new() { } void $timab() { } void $psp_from_data() { } int main(int argc, const char **argv) { ab6_invars_new_from_file(); return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_abinit_parser_ok=yes else ac_abinit_parser_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_abinit_parser_ok" >&5 $as_echo "$ac_abinit_parser_ok" >&6; } if test $ac_abinit_parser_ok = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for invars.new_from_file_with_pseudo() routine in lib$AB_LIBRARY.a" >&5 $as_echo_n "checking for invars.new_from_file_with_pseudo() routine in lib$AB_LIBRARY.a... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ void $wrtout() { } void $leave_new() { } void $timab() { } void $psp_from_data() { } int main(int argc, const char **argv) { ab6_invars_new_from_file_with_pseudo(); return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_abinit_invars_has_new_with_pseudo=yes else ac_abinit_invars_has_new_with_pseudo=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_abinit_invars_has_new_with_pseudo" >&5 $as_echo "$ac_abinit_invars_has_new_with_pseudo" >&6; } $as_echo "#define HAVE_NEW_WITH_PSEUDO /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for symmetry capabilities in lib$AB_LIBRARY.a from $AB_PATH_LIBDIR" >&5 $as_echo_n "checking for symmetry capabilities in lib$AB_LIBRARY.a from $AB_PATH_LIBDIR... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ void $wrtout() { } void $leave_new() { } void $timab() { } int main(int argc, const char **argv) { ab6_symmetry_new(); return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_abinit_symmetry_ok=yes else ac_abinit_symmetry_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_abinit_symmetry_ok" >&5 $as_echo "$ac_abinit_symmetry_ok" >&6; } if test $ac_abinit_symmetry_ok = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for symmetry.get_type() routine in lib$AB_LIBRARY.a" >&5 $as_echo_n "checking for symmetry.get_type() routine in lib$AB_LIBRARY.a... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ void $wrtout() { } void $leave_new() { } void $timab() { } int main(int argc, const char **argv) { ab6_symmetry_get_type(); return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_abinit_symmetry_has_get_type=yes else ac_abinit_symmetry_has_get_type=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_abinit_symmetry_has_get_type" >&5 $as_echo "$ac_abinit_symmetry_has_get_type" >&6; } $as_echo "#define HAVE_SYM_GET_TYPE /**/" >>confdefs.h fi LIBS=$LIBS_SVG CFLAGS=$CFLAGS_SVG ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test "z$ac_abinit_parser_header" = "zyes" -a "z$ac_abinit_parser_ok" = "zyes"; then : ac_abinit_parser=yes else ac_abinit_parser=no fi if test "z$ac_abinit_symmetry_header" = "zyes" -a "z$ac_abinit_symmetry_ok" = "zyes"; then : ac_abinit_symmetry=yes else ac_abinit_symmetry=no fi if test "z$ac_abinit_symmetry" = "zyes" -o "z$ac_abinit_parser" = "zyes"; then : ac_abinit="yes"; AB_LIBS="-L$AB_PATH_LIBDIR -l$AB_LIBRARY $LIBXC_LIBS $ETSF_IO_LIBS $LAPACK_LIBS $BLAS_LIBS"; AB_CPPFLAGS="-I$AB_PATH_INC" else ac_abinit=no fi else ac_abinit=no fi if test x"$ac_abinit_parser" = x"yes" ; then cat >>confdefs.h <<_ACEOF #define HAVE_ABINIT_PARSER "$ac_abinit_parser" _ACEOF fi if test x"$ac_abinit_parser" = x"yes"; then HAVE_ABINIT_PARSER_TRUE= HAVE_ABINIT_PARSER_FALSE='#' else HAVE_ABINIT_PARSER_TRUE='#' HAVE_ABINIT_PARSER_FALSE= fi if test x"$ac_abinit_symmetry" = x"yes" ; then cat >>confdefs.h <<_ACEOF #define HAVE_ABINIT_SYMMETRY "$ac_abinit_symmetry" _ACEOF fi if test x"$ac_abinit_symmetry" = x"yes"; then HAVE_ABINIT_SYMMETRY_TRUE= HAVE_ABINIT_SYMMETRY_FALSE='#' else HAVE_ABINIT_SYMMETRY_TRUE='#' HAVE_ABINIT_SYMMETRY_FALSE= fi if test x"$ac_abinit_symmetry" = x"yes" -o x"$ac_abinit_parser" = x"yes"; then HAVE_ABINIT_TRUE= HAVE_ABINIT_FALSE='#' else HAVE_ABINIT_TRUE='#' HAVE_ABINIT_FALSE= fi ac_archives="no" # Check whether --with-archives was given. if test "${with_archives+set}" = set; then : withval=$with_archives; ac_archives=yes else ac_archives=no fi if test x"$ac_archives" = x"yes" ; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIB_ARCHIVE" >&5 $as_echo_n "checking for LIB_ARCHIVE... " >&6; } if test -n "$LIB_ARCHIVE_CFLAGS"; then pkg_cv_LIB_ARCHIVE_CFLAGS="$LIB_ARCHIVE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libarchive >= 2.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "libarchive >= 2.4") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIB_ARCHIVE_CFLAGS=`$PKG_CONFIG --cflags "libarchive >= 2.4" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIB_ARCHIVE_LIBS"; then pkg_cv_LIB_ARCHIVE_LIBS="$LIB_ARCHIVE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libarchive >= 2.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "libarchive >= 2.4") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIB_ARCHIVE_LIBS=`$PKG_CONFIG --libs "libarchive >= 2.4" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIB_ARCHIVE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libarchive >= 2.4" 2>&1` else LIB_ARCHIVE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libarchive >= 2.4" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIB_ARCHIVE_PKG_ERRORS" >&5 ac_archives=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_archives=no else LIB_ARCHIVE_CFLAGS=$pkg_cv_LIB_ARCHIVE_CFLAGS LIB_ARCHIVE_LIBS=$pkg_cv_LIB_ARCHIVE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_archives=yes fi if test x"$ac_archives" = x"yes" ; then $as_echo "#define HAVE_LIB_ARCHIVE 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: libarchive is not available" >&5 $as_echo "$as_me: WARNING: libarchive is not available" >&2;} fi fi if test x"$ac_archives" = x"yes"; then HAVE_LIB_ARCHIVE_TRUE= HAVE_LIB_ARCHIVE_FALSE='#' else HAVE_LIB_ARCHIVE_TRUE='#' HAVE_LIB_ARCHIVE_FALSE= fi ac_bigdft="no" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BigDFT support" >&5 $as_echo_n "checking for BigDFT support... " >&6; } # Check whether --with-bigdft was given. if test "${with_bigdft+set}" = set; then : withval=$with_bigdft; BIGDFT_PATH=$withval else BIGDFT_PATH="no" fi # Check whether --with-bigdft_include was given. if test "${with_bigdft_include+set}" = set; then : withval=$with_bigdft_include; BIGDFT_PATH_INC=$withval else BIGDFT_PATH_INC="" fi # Check whether --with-bigdft_libdir was given. if test "${with_bigdft_libdir+set}" = set; then : withval=$with_bigdft_libdir; BIGDFT_PATH_LIBDIR=$withval else BIGDFT_PATH_LIBDIR="" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BIGDFT_PATH" >&5 $as_echo "$BIGDFT_PATH" >&6; } if test "z$BIGDFT_PATH" != "zno" ; then if test "z$BIGDFT_PATH" = "zyes"; then : BIGDFT_PATH="/opt/etsf/bigdft" fi if test "z$BIGDFT_PATH_LIBDIR" = "z"; then : BIGDFT_PATH_LIBDIR="$BIGDFT_PATH/lib" fi if test "z$BIGDFT_PATH_INC" = "z"; then : BIGDFT_PATH_INC="$BIGDFT_PATH/include" fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB_BIGDFT" >&5 $as_echo_n "checking for GLIB_BIGDFT... " >&6; } if test -n "$GLIB_BIGDFT_CFLAGS"; then pkg_cv_GLIB_BIGDFT_CFLAGS="$GLIB_BIGDFT_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 gobject-2.0 gthread-2.0 gio-2.0 >= 2.22\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 gobject-2.0 gthread-2.0 gio-2.0 >= 2.22") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_BIGDFT_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 gobject-2.0 gthread-2.0 gio-2.0 >= 2.22" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GLIB_BIGDFT_LIBS"; then pkg_cv_GLIB_BIGDFT_LIBS="$GLIB_BIGDFT_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 gobject-2.0 gthread-2.0 gio-2.0 >= 2.22\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 gobject-2.0 gthread-2.0 gio-2.0 >= 2.22") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_BIGDFT_LIBS=`$PKG_CONFIG --libs "glib-2.0 gobject-2.0 gthread-2.0 gio-2.0 >= 2.22" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GLIB_BIGDFT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 gobject-2.0 gthread-2.0 gio-2.0 >= 2.22" 2>&1` else GLIB_BIGDFT_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 gobject-2.0 gthread-2.0 gio-2.0 >= 2.22" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GLIB_BIGDFT_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (glib-2.0 gobject-2.0 gthread-2.0 gio-2.0 >= 2.22) were not met: $GLIB_BIGDFT_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GLIB_BIGDFT_CFLAGS and GLIB_BIGDFT_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GLIB_BIGDFT_CFLAGS and GLIB_BIGDFT_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GLIB_BIGDFT_CFLAGS=$pkg_cv_GLIB_BIGDFT_CFLAGS GLIB_BIGDFT_LIBS=$pkg_cv_GLIB_BIGDFT_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi CPPFLAGS_SVG=$CPPFLAGS CPPFLAGS="$CPPFLAGS -I$BIGDFT_PATH_INC $GLIB_BIGDFT_CFLAGS" ac_fn_c_check_header_mongrel "$LINENO" "bigdft.h" "ac_cv_header_bigdft_h" "$ac_includes_default" if test "x$ac_cv_header_bigdft_h" = xyes; then : ac_bigdft_header="yes" else ac_bigdft_header="no" fi CPPFLAGS=$CPPFLAGS_SVG ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu case $ac_cv_fc_mangling in "lower case, no underscore, no extra underscore") $as_echo "#define FC_FUNC(name,NAME) name" >>confdefs.h $as_echo "#define FC_FUNC_(name,NAME) name" >>confdefs.h ;; "lower case, no underscore, extra underscore") $as_echo "#define FC_FUNC(name,NAME) name" >>confdefs.h $as_echo "#define FC_FUNC_(name,NAME) name ## _" >>confdefs.h ;; "lower case, underscore, no extra underscore") $as_echo "#define FC_FUNC(name,NAME) name ## _" >>confdefs.h $as_echo "#define FC_FUNC_(name,NAME) name ## _" >>confdefs.h ;; "lower case, underscore, extra underscore") $as_echo "#define FC_FUNC(name,NAME) name ## _" >>confdefs.h $as_echo "#define FC_FUNC_(name,NAME) name ## __" >>confdefs.h ;; "upper case, no underscore, no extra underscore") $as_echo "#define FC_FUNC(name,NAME) NAME" >>confdefs.h $as_echo "#define FC_FUNC_(name,NAME) NAME" >>confdefs.h ;; "upper case, no underscore, extra underscore") $as_echo "#define FC_FUNC(name,NAME) NAME" >>confdefs.h $as_echo "#define FC_FUNC_(name,NAME) NAME ## _" >>confdefs.h ;; "upper case, underscore, no extra underscore") $as_echo "#define FC_FUNC(name,NAME) NAME ## _" >>confdefs.h $as_echo "#define FC_FUNC_(name,NAME) NAME ## _" >>confdefs.h ;; "upper case, underscore, extra underscore") $as_echo "#define FC_FUNC(name,NAME) NAME ## _" >>confdefs.h $as_echo "#define FC_FUNC_(name,NAME) NAME ## __" >>confdefs.h ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unknown Fortran name-mangling scheme" >&5 $as_echo "$as_me: WARNING: unknown Fortran name-mangling scheme" >&2;} ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wavefunctions in libbigdft-1.so from $BIGDFT_PATH_LIBDIR" >&5 $as_echo_n "checking for wavefunctions in libbigdft-1.so from $BIGDFT_PATH_LIBDIR... " >&6; } CFLAGS_SVG=$CFLAGS CFLAGS="$CFLAGS -Wno-error" LIBS_SVG=$LIBS BIGDFT_LIBS="-L$BIGDFT_PATH_LIBDIR -lbigdft-1" LIBS="$LIBS_SVG $BIGDFT_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(int argc, const char **argv) { bigdft_read_wave_descr(); return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_bigdft_ok=yes else ac_bigdft_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$LIBS_SVG CFLAGS=$CFLAGS_SVG { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_bigdft_ok" >&5 $as_echo "$ac_bigdft_ok" >&6; } ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test "z$ac_bigdft_header" = "zyes" -a "z$ac_bigdft_ok" = "zyes"; then : ac_bigdft=yes; BIGDFT_CPPFLAGS="-I$BIGDFT_PATH_INC" else ac_bigdft=no; BIGDFT_LIBS="" fi else ac_bigdft=no fi if test x"$ac_bigdft" = x"yes"; then HAVE_BIGDFT_TRUE= HAVE_BIGDFT_FALSE='#' else HAVE_BIGDFT_TRUE='#' HAVE_BIGDFT_FALSE= fi GOBJECT_INTROSPECTION_REQUIRED=0.9.0 PYGOBJECT_REQUIRED=2.21.0 # Check whether --enable-introspection was given. if test "${enable_introspection+set}" = set; then : enableval=$enable_introspection; else enable_introspection=no fi if test "x$enable_introspection" != "xno" ; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GOBJECT_INTROSPECTION" >&5 $as_echo_n "checking for GOBJECT_INTROSPECTION... " >&6; } if test -n "$GOBJECT_INTROSPECTION_CFLAGS"; then pkg_cv_GOBJECT_INTROSPECTION_CFLAGS="$GOBJECT_INTROSPECTION_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0 >= \$GOBJECT_INTROSPECTION_REQUIRED\""; } >&5 ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_REQUIRED") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GOBJECT_INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags "gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_REQUIRED" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GOBJECT_INTROSPECTION_LIBS"; then pkg_cv_GOBJECT_INTROSPECTION_LIBS="$GOBJECT_INTROSPECTION_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0 >= \$GOBJECT_INTROSPECTION_REQUIRED\""; } >&5 ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_REQUIRED") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GOBJECT_INTROSPECTION_LIBS=`$PKG_CONFIG --libs "gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_REQUIRED" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GOBJECT_INTROSPECTION_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_REQUIRED" 2>&1` else GOBJECT_INTROSPECTION_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_REQUIRED" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GOBJECT_INTROSPECTION_PKG_ERRORS" >&5 if test "x$enable_introspection" = "xcheck"; then enable_introspection=no else as_fn_error $? "gobject-introspection is not available" "$LINENO" 5 fi elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "x$enable_introspection" = "xcheck"; then enable_introspection=no else as_fn_error $? "gobject-introspection is not available" "$LINENO" 5 fi else GOBJECT_INTROSPECTION_CFLAGS=$pkg_cv_GOBJECT_INTROSPECTION_CFLAGS GOBJECT_INTROSPECTION_LIBS=$pkg_cv_GOBJECT_INTROSPECTION_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } enable_introspection=yes fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PYGOBJECT" >&5 $as_echo_n "checking for PYGOBJECT... " >&6; } if test -n "$PYGOBJECT_CFLAGS"; then pkg_cv_PYGOBJECT_CFLAGS="$PYGOBJECT_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"pygobject-2.0 >= \$PYGOBJECT_REQUIRED\""; } >&5 ($PKG_CONFIG --exists --print-errors "pygobject-2.0 >= $PYGOBJECT_REQUIRED") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PYGOBJECT_CFLAGS=`$PKG_CONFIG --cflags "pygobject-2.0 >= $PYGOBJECT_REQUIRED" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$PYGOBJECT_LIBS"; then pkg_cv_PYGOBJECT_LIBS="$PYGOBJECT_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"pygobject-2.0 >= \$PYGOBJECT_REQUIRED\""; } >&5 ($PKG_CONFIG --exists --print-errors "pygobject-2.0 >= $PYGOBJECT_REQUIRED") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PYGOBJECT_LIBS=`$PKG_CONFIG --libs "pygobject-2.0 >= $PYGOBJECT_REQUIRED" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PYGOBJECT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "pygobject-2.0 >= $PYGOBJECT_REQUIRED" 2>&1` else PYGOBJECT_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "pygobject-2.0 >= $PYGOBJECT_REQUIRED" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$PYGOBJECT_PKG_ERRORS" >&5 if test "x$enable_introspection" = "xcheck"; then enable_introspection=no else as_fn_error $? "pygobject is not available" "$LINENO" 5 fi elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "x$enable_introspection" = "xcheck"; then enable_introspection=no else as_fn_error $? "pygobject is not available" "$LINENO" 5 fi else PYGOBJECT_CFLAGS=$pkg_cv_PYGOBJECT_CFLAGS PYGOBJECT_LIBS=$pkg_cv_PYGOBJECT_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } enable_introspection=yes fi fi if test "x$enable_introspection" = "xyes" ; then girdir="$datadir/gir-1.0" typelibsdir=$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0) visutypelibsdir="$libdir/girepository-1.0" $as_echo "#define WITH_GOBJECT_INTROSPECTION 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define GI_TYPELIBS_DIR "$typelibsdir" _ACEOF G_IR_SCANNER=$($PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0) G_IR_COMPILER=$($PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0) if test -n "$PYTHON"; then # If the user set $PYTHON, use it and don't search something else. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $PYTHON version >= 2.3" >&5 $as_echo_n "checking whether $PYTHON version >= 2.3... " >&6; } prog="import sys # split strings by '.' and convert to numeric. Append some zeros # because we need at least 4 digits for the hex conversion. # map returns an iterator in Python 3.0 and a list in 2.x minver = list(map(int, '2.3'.split('.'))) + [0, 0, 0] minverhex = 0 # xrange is not present in Python 3.0 and range returns an iterator for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i] sys.exit(sys.hexversion < minverhex)" if { echo "$as_me:$LINENO: $PYTHON -c "$prog"" >&5 ($PYTHON -c "$prog") >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else as_fn_error $? "too old" "$LINENO" 5 fi am_display_PYTHON=$PYTHON else # Otherwise, try each interpreter until we find one that satisfies # VERSION. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a Python interpreter with version >= 2.3" >&5 $as_echo_n "checking for a Python interpreter with version >= 2.3... " >&6; } if ${am_cv_pathless_PYTHON+:} false; then : $as_echo_n "(cached) " >&6 else for am_cv_pathless_PYTHON in python python2 python3 python3.2 python3.1 python3.0 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 none; do test "$am_cv_pathless_PYTHON" = none && break prog="import sys # split strings by '.' and convert to numeric. Append some zeros # because we need at least 4 digits for the hex conversion. # map returns an iterator in Python 3.0 and a list in 2.x minver = list(map(int, '2.3'.split('.'))) + [0, 0, 0] minverhex = 0 # xrange is not present in Python 3.0 and range returns an iterator for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i] sys.exit(sys.hexversion < minverhex)" if { echo "$as_me:$LINENO: $am_cv_pathless_PYTHON -c "$prog"" >&5 ($am_cv_pathless_PYTHON -c "$prog") >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then : break fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_pathless_PYTHON" >&5 $as_echo "$am_cv_pathless_PYTHON" >&6; } # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. if test "$am_cv_pathless_PYTHON" = none; then PYTHON=: else # Extract the first word of "$am_cv_pathless_PYTHON", so it can be a program name with args. set dummy $am_cv_pathless_PYTHON; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PYTHON+:} false; then : $as_echo_n "(cached) " >&6 else case $PYTHON in [\\/]* | ?:[\\/]*) ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PYTHON=$ac_cv_path_PYTHON if test -n "$PYTHON"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 $as_echo "$PYTHON" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi am_display_PYTHON=$am_cv_pathless_PYTHON fi if test "$PYTHON" = :; then as_fn_error $? "no suitable Python interpreter found" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON version" >&5 $as_echo_n "checking for $am_display_PYTHON version... " >&6; } if ${am_cv_python_version+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[:3])"` fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_version" >&5 $as_echo "$am_cv_python_version" >&6; } PYTHON_VERSION=$am_cv_python_version PYTHON_PREFIX='${prefix}' PYTHON_EXEC_PREFIX='${exec_prefix}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON platform" >&5 $as_echo_n "checking for $am_display_PYTHON platform... " >&6; } if ${am_cv_python_platform+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"` fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_platform" >&5 $as_echo "$am_cv_python_platform" >&6; } PYTHON_PLATFORM=$am_cv_python_platform { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON script directory" >&5 $as_echo_n "checking for $am_display_PYTHON script directory... " >&6; } if ${am_cv_python_pythondir+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$prefix" = xNONE then am_py_prefix=$ac_default_prefix else am_py_prefix=$prefix fi am_cv_python_pythondir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(0,0,prefix='$am_py_prefix'))" 2>/dev/null` case $am_cv_python_pythondir in $am_py_prefix*) am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"` ;; *) case $am_py_prefix in /usr|/System*) ;; *) am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages ;; esac ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pythondir" >&5 $as_echo "$am_cv_python_pythondir" >&6; } pythondir=$am_cv_python_pythondir pkgpythondir=\${pythondir}/$PACKAGE { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON extension module directory" >&5 $as_echo_n "checking for $am_display_PYTHON extension module directory... " >&6; } if ${am_cv_python_pyexecdir+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$exec_prefix" = xNONE then am_py_exec_prefix=$am_py_prefix else am_py_exec_prefix=$exec_prefix fi am_cv_python_pyexecdir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(1,0,prefix='$am_py_exec_prefix'))" 2>/dev/null` case $am_cv_python_pyexecdir in $am_py_exec_prefix*) am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"` ;; *) case $am_py_exec_prefix in /usr|/System*) ;; *) am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages ;; esac ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pyexecdir" >&5 $as_echo "$am_cv_python_pyexecdir" >&6; } pyexecdir=$am_cv_python_pyexecdir pkgpyexecdir=\${pyexecdir}/$PACKAGE fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for headers required to compile python extensions" >&5 $as_echo_n "checking for headers required to compile python extensions... " >&6; } py_prefix=`$PYTHON -c "import sys; print sys.prefix"` py_exec_prefix=`$PYTHON -c "import sys; print sys.exec_prefix"` if test -x "$PYTHON-config"; then PYTHON_INCLUDES=`$PYTHON-config --includes 2>/dev/null` else PYTHON_INCLUDES="-I${py_prefix}/include/python${PYTHON_VERSION}" if test "$py_prefix" != "$py_exec_prefix"; then PYTHON_INCLUDES="$PYTHON_INCLUDES -I${py_exec_prefix}/include/python${PYTHON_VERSION}" fi fi save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $PYTHON_INCLUDES" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } as_fn_error $? "could not find Python headers" "$LINENO" 5 fi rm -f conftest.err conftest.i conftest.$ac_ext CPPFLAGS="$save_CPPFLAGS" PYTHON_INCLUDES="`python-config --cflags`" PYTHON_LIBS="`python-config --libs`" pyexecdir=$($PKG_CONFIG --variable=libdir pygobject-2.0)"/python"$PYTHON_VERSION"/site-packages" visupyexecdir="$libdir/python$PYTHON_VERSION/site-packages" cat >>confdefs.h <<_ACEOF #define PYGI_EXEC_DIR "$pyexecdir/gtk-2.0" _ACEOF else visupyexecdir=$libdir"/python/site-packages" fi if test "x$enable_introspection" = "xyes"; then WITH_GOBJECT_INTROSPECTION_TRUE= WITH_GOBJECT_INTROSPECTION_FALSE='#' else WITH_GOBJECT_INTROSPECTION_TRUE='#' WITH_GOBJECT_INTROSPECTION_FALSE= fi if test x"$cflags_set" = "x" ; then CFLAGS="-O2" fi if test x"$cxxflags_set" = "x" ; then CXXFLAGS="-O2" fi # Check whether --with-strict-cflags was given. if test "${with_strict_cflags+set}" = set; then : withval=$with_strict_cflags; STRICT_CFLAGS=$withval else STRICT_CFLAGS="yes" fi flags='Wall W ansi' flags_cpp='Wall W ansi' if test "$GCC" = "yes" -a "$STRICT_CFLAGS" = "yes"; then if test "$PACKAGE" = "v_sim-dev" ; then if test x"$platform" != x"win32" -a x"$platform" != x"Apple" ; then flags=$flags' Werror pedantic-errors std=c99 g' flags_cpp=$flags_cpp' Werror pedantic-errors std=c99 g' fi fi fi for fl in $flags ; do case " $CFLAGS " in *\ \ -$fl\ \ *) ;; *) CFLAGS="$CFLAGS -$fl" ;; esac done for fl in $flags_cpp ; do case " $CXXFLAGS " in *\ \ -$fl\ \ *) ;; *) CXXFLAGS="$CXXFLAGS -$fl" ;; esac done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLAGS used" >&5 $as_echo_n "checking for CFLAGS used... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CFLAGS" >&5 $as_echo "$CFLAGS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CXXFLAGS used" >&5 $as_echo_n "checking for CXXFLAGS used... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXFLAGS" >&5 $as_echo "$CXXFLAGS" >&6; } if test -z "$docdir" ; then docdir="$datadir/doc/$PACKAGE" fi v_simexedir="$bindir" v_simresourcesdir="$datadir/$PACKAGE" v_simpixmapsdir="$datadir/$PACKAGE/pixmaps" v_simiconsdir="$datadir/pixmaps" v_simlegaldir="${docdir}" v_simexamplesdir="${docdir}/examples" v_simpluginsdir="$libdir/$PACKAGE/plug-ins" cat >>confdefs.h <<_ACEOF #define DEBUG $define_debug _ACEOF cat >>confdefs.h <<_ACEOF #define SYSTEM_WIN32 $define_win32 _ACEOF cat >>confdefs.h <<_ACEOF #define SYSTEM_X11 $define_X11 _ACEOF cat >>confdefs.h <<_ACEOF #define V_SIM_RELEASE_DATE "$date" _ACEOF ac_config_files="$ac_config_files Makefile src/Makefile lib/plug-ins/Makefile lib/plug-ins/nanoquanta-netcdf/Makefile lib/plug-ins/OpenBabel-wrapper/Makefile lib/plug-ins/xsf/Makefile lib/plug-ins/cube/Makefile lib/plug-ins/abinit/Makefile lib/plug-ins/python-gi/Makefile lib/plug-ins/archives/Makefile lib/plug-ins/bigdft/Makefile lib/python/Makefile lib/Makefile etc/Makefile etc/v_sim.rc etc/v_sim.ini etc/v_sim-dev.ini pixmaps/Makefile examples/Makefile po/Makefile.in Documentation/Makefile Documentation/reference/Makefile Documentation/reference/version" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${PLATFORM_X11_TRUE}" && test -z "${PLATFORM_X11_FALSE}"; then as_fn_error $? "conditional \"PLATFORM_X11\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${PLATFORM_WIN32_TRUE}" && test -z "${PLATFORM_WIN32_FALSE}"; then as_fn_error $? "conditional \"PLATFORM_WIN32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_STATIC_BINARY_TRUE}" && test -z "${BUILD_STATIC_BINARY_FALSE}"; then as_fn_error $? "conditional \"BUILD_STATIC_BINARY\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_SHARED_BINARY_TRUE}" && test -z "${BUILD_SHARED_BINARY_FALSE}"; then as_fn_error $? "conditional \"BUILD_SHARED_BINARY\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi ac_config_commands="$ac_config_commands po/stamp-it" if test -z "${OPENGL_BUILTIN_WIN32_TRUE}" && test -z "${OPENGL_BUILTIN_WIN32_FALSE}"; then as_fn_error $? "conditional \"OPENGL_BUILTIN_WIN32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${OPENGL_BUILTIN_X11_TRUE}" && test -z "${OPENGL_BUILTIN_X11_FALSE}"; then as_fn_error $? "conditional \"OPENGL_BUILTIN_X11\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${OPENGL_GTKGLEXT_TRUE}" && test -z "${OPENGL_GTKGLEXT_FALSE}"; then as_fn_error $? "conditional \"OPENGL_GTKGLEXT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${PYTHON_MODULE_TRUE}" && test -z "${PYTHON_MODULE_FALSE}"; then as_fn_error $? "conditional \"PYTHON_MODULE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_GTK_DOC_TRUE}" && test -z "${ENABLE_GTK_DOC_FALSE}"; then as_fn_error $? "conditional \"ENABLE_GTK_DOC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GTK_DOC_BUILD_HTML_TRUE}" && test -z "${GTK_DOC_BUILD_HTML_FALSE}"; then as_fn_error $? "conditional \"GTK_DOC_BUILD_HTML\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GTK_DOC_BUILD_PDF_TRUE}" && test -z "${GTK_DOC_BUILD_PDF_FALSE}"; then as_fn_error $? "conditional \"GTK_DOC_BUILD_PDF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GTK_DOC_USE_LIBTOOL_TRUE}" && test -z "${GTK_DOC_USE_LIBTOOL_FALSE}"; then as_fn_error $? "conditional \"GTK_DOC_USE_LIBTOOL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GTK_DOC_USE_REBASE_TRUE}" && test -z "${GTK_DOC_USE_REBASE_FALSE}"; then as_fn_error $? "conditional \"GTK_DOC_USE_REBASE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ETSF_TRUE}" && test -z "${HAVE_ETSF_FALSE}"; then as_fn_error $? "conditional \"HAVE_ETSF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_OPENBABEL_TRUE}" && test -z "${HAVE_OPENBABEL_FALSE}"; then as_fn_error $? "conditional \"HAVE_OPENBABEL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_XSF_TRUE}" && test -z "${HAVE_XSF_FALSE}"; then as_fn_error $? "conditional \"HAVE_XSF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_CUBE_TRUE}" && test -z "${HAVE_CUBE_FALSE}"; then as_fn_error $? "conditional \"HAVE_CUBE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ABINIT_PARSER_TRUE}" && test -z "${HAVE_ABINIT_PARSER_FALSE}"; then as_fn_error $? "conditional \"HAVE_ABINIT_PARSER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ABINIT_SYMMETRY_TRUE}" && test -z "${HAVE_ABINIT_SYMMETRY_FALSE}"; then as_fn_error $? "conditional \"HAVE_ABINIT_SYMMETRY\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ABINIT_TRUE}" && test -z "${HAVE_ABINIT_FALSE}"; then as_fn_error $? "conditional \"HAVE_ABINIT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_LIB_ARCHIVE_TRUE}" && test -z "${HAVE_LIB_ARCHIVE_FALSE}"; then as_fn_error $? "conditional \"HAVE_LIB_ARCHIVE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_BIGDFT_TRUE}" && test -z "${HAVE_BIGDFT_FALSE}"; then as_fn_error $? "conditional \"HAVE_BIGDFT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_GOBJECT_INTROSPECTION_TRUE}" && test -z "${WITH_GOBJECT_INTROSPECTION_FALSE}"; then as_fn_error $? "conditional \"WITH_GOBJECT_INTROSPECTION\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by V_Sim stable branch $as_me 3.7.0, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ V_Sim stable branch config.status 3.7.0 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' LD_F77='`$ECHO "$LD_F77" | $SED "$delay_single_quote_subst"`' LD_FC='`$ECHO "$LD_FC" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_F77='`$ECHO "$reload_flag_F77" | $SED "$delay_single_quote_subst"`' reload_flag_FC='`$ECHO "$reload_flag_FC" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_F77='`$ECHO "$reload_cmds_F77" | $SED "$delay_single_quote_subst"`' reload_cmds_FC='`$ECHO "$reload_cmds_FC" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_F77='`$ECHO "$old_archive_cmds_F77" | $SED "$delay_single_quote_subst"`' old_archive_cmds_FC='`$ECHO "$old_archive_cmds_FC" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' compiler_F77='`$ECHO "$compiler_F77" | $SED "$delay_single_quote_subst"`' compiler_FC='`$ECHO "$compiler_FC" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' GCC_F77='`$ECHO "$GCC_F77" | $SED "$delay_single_quote_subst"`' GCC_FC='`$ECHO "$GCC_FC" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_F77='`$ECHO "$lt_prog_compiler_no_builtin_flag_F77" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_FC='`$ECHO "$lt_prog_compiler_no_builtin_flag_FC" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_F77='`$ECHO "$lt_prog_compiler_pic_F77" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_FC='`$ECHO "$lt_prog_compiler_pic_FC" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_F77='`$ECHO "$lt_prog_compiler_wl_F77" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_FC='`$ECHO "$lt_prog_compiler_wl_FC" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_F77='`$ECHO "$lt_prog_compiler_static_F77" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_FC='`$ECHO "$lt_prog_compiler_static_FC" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_F77='`$ECHO "$lt_cv_prog_compiler_c_o_F77" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_FC='`$ECHO "$lt_cv_prog_compiler_c_o_FC" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_F77='`$ECHO "$archive_cmds_need_lc_F77" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_FC='`$ECHO "$archive_cmds_need_lc_FC" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_F77='`$ECHO "$enable_shared_with_static_runtimes_F77" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_FC='`$ECHO "$enable_shared_with_static_runtimes_FC" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_F77='`$ECHO "$export_dynamic_flag_spec_F77" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_FC='`$ECHO "$export_dynamic_flag_spec_FC" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_F77='`$ECHO "$whole_archive_flag_spec_F77" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_FC='`$ECHO "$whole_archive_flag_spec_FC" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_F77='`$ECHO "$compiler_needs_object_F77" | $SED "$delay_single_quote_subst"`' compiler_needs_object_FC='`$ECHO "$compiler_needs_object_FC" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_F77='`$ECHO "$old_archive_from_new_cmds_F77" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_FC='`$ECHO "$old_archive_from_new_cmds_FC" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_F77='`$ECHO "$old_archive_from_expsyms_cmds_F77" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_FC='`$ECHO "$old_archive_from_expsyms_cmds_FC" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_F77='`$ECHO "$archive_cmds_F77" | $SED "$delay_single_quote_subst"`' archive_cmds_FC='`$ECHO "$archive_cmds_FC" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_F77='`$ECHO "$archive_expsym_cmds_F77" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_FC='`$ECHO "$archive_expsym_cmds_FC" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_F77='`$ECHO "$module_cmds_F77" | $SED "$delay_single_quote_subst"`' module_cmds_FC='`$ECHO "$module_cmds_FC" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_F77='`$ECHO "$module_expsym_cmds_F77" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_FC='`$ECHO "$module_expsym_cmds_FC" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_F77='`$ECHO "$with_gnu_ld_F77" | $SED "$delay_single_quote_subst"`' with_gnu_ld_FC='`$ECHO "$with_gnu_ld_FC" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_F77='`$ECHO "$allow_undefined_flag_F77" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_FC='`$ECHO "$allow_undefined_flag_FC" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_F77='`$ECHO "$no_undefined_flag_F77" | $SED "$delay_single_quote_subst"`' no_undefined_flag_FC='`$ECHO "$no_undefined_flag_FC" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_F77='`$ECHO "$hardcode_libdir_flag_spec_F77" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_FC='`$ECHO "$hardcode_libdir_flag_spec_FC" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_F77='`$ECHO "$hardcode_libdir_separator_F77" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_FC='`$ECHO "$hardcode_libdir_separator_FC" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_F77='`$ECHO "$hardcode_direct_F77" | $SED "$delay_single_quote_subst"`' hardcode_direct_FC='`$ECHO "$hardcode_direct_FC" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_F77='`$ECHO "$hardcode_direct_absolute_F77" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_FC='`$ECHO "$hardcode_direct_absolute_FC" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_F77='`$ECHO "$hardcode_minus_L_F77" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_FC='`$ECHO "$hardcode_minus_L_FC" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_F77='`$ECHO "$hardcode_shlibpath_var_F77" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_FC='`$ECHO "$hardcode_shlibpath_var_FC" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_F77='`$ECHO "$hardcode_automatic_F77" | $SED "$delay_single_quote_subst"`' hardcode_automatic_FC='`$ECHO "$hardcode_automatic_FC" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_F77='`$ECHO "$inherit_rpath_F77" | $SED "$delay_single_quote_subst"`' inherit_rpath_FC='`$ECHO "$inherit_rpath_FC" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_F77='`$ECHO "$link_all_deplibs_F77" | $SED "$delay_single_quote_subst"`' link_all_deplibs_FC='`$ECHO "$link_all_deplibs_FC" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_F77='`$ECHO "$always_export_symbols_F77" | $SED "$delay_single_quote_subst"`' always_export_symbols_FC='`$ECHO "$always_export_symbols_FC" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_F77='`$ECHO "$export_symbols_cmds_F77" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_FC='`$ECHO "$export_symbols_cmds_FC" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_F77='`$ECHO "$exclude_expsyms_F77" | $SED "$delay_single_quote_subst"`' exclude_expsyms_FC='`$ECHO "$exclude_expsyms_FC" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_F77='`$ECHO "$include_expsyms_F77" | $SED "$delay_single_quote_subst"`' include_expsyms_FC='`$ECHO "$include_expsyms_FC" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_F77='`$ECHO "$prelink_cmds_F77" | $SED "$delay_single_quote_subst"`' prelink_cmds_FC='`$ECHO "$prelink_cmds_FC" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_F77='`$ECHO "$postlink_cmds_F77" | $SED "$delay_single_quote_subst"`' postlink_cmds_FC='`$ECHO "$postlink_cmds_FC" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_F77='`$ECHO "$file_list_spec_F77" | $SED "$delay_single_quote_subst"`' file_list_spec_FC='`$ECHO "$file_list_spec_FC" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_F77='`$ECHO "$hardcode_action_F77" | $SED "$delay_single_quote_subst"`' hardcode_action_FC='`$ECHO "$hardcode_action_FC" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_F77='`$ECHO "$compiler_lib_search_dirs_F77" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_FC='`$ECHO "$compiler_lib_search_dirs_FC" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_F77='`$ECHO "$predep_objects_F77" | $SED "$delay_single_quote_subst"`' predep_objects_FC='`$ECHO "$predep_objects_FC" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_F77='`$ECHO "$postdep_objects_F77" | $SED "$delay_single_quote_subst"`' postdep_objects_FC='`$ECHO "$postdep_objects_FC" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' predeps_F77='`$ECHO "$predeps_F77" | $SED "$delay_single_quote_subst"`' predeps_FC='`$ECHO "$predeps_FC" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_F77='`$ECHO "$postdeps_F77" | $SED "$delay_single_quote_subst"`' postdeps_FC='`$ECHO "$postdeps_FC" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_F77='`$ECHO "$compiler_lib_search_path_F77" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_FC='`$ECHO "$compiler_lib_search_path_FC" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in AS \ DLLTOOL \ OBJDUMP \ SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ LD_F77 \ LD_FC \ reload_flag_CXX \ reload_flag_F77 \ reload_flag_FC \ compiler_CXX \ compiler_F77 \ compiler_FC \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_no_builtin_flag_F77 \ lt_prog_compiler_no_builtin_flag_FC \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_pic_F77 \ lt_prog_compiler_pic_FC \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_wl_F77 \ lt_prog_compiler_wl_FC \ lt_prog_compiler_static_CXX \ lt_prog_compiler_static_F77 \ lt_prog_compiler_static_FC \ lt_cv_prog_compiler_c_o_CXX \ lt_cv_prog_compiler_c_o_F77 \ lt_cv_prog_compiler_c_o_FC \ export_dynamic_flag_spec_CXX \ export_dynamic_flag_spec_F77 \ export_dynamic_flag_spec_FC \ whole_archive_flag_spec_CXX \ whole_archive_flag_spec_F77 \ whole_archive_flag_spec_FC \ compiler_needs_object_CXX \ compiler_needs_object_F77 \ compiler_needs_object_FC \ with_gnu_ld_CXX \ with_gnu_ld_F77 \ with_gnu_ld_FC \ allow_undefined_flag_CXX \ allow_undefined_flag_F77 \ allow_undefined_flag_FC \ no_undefined_flag_CXX \ no_undefined_flag_F77 \ no_undefined_flag_FC \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_flag_spec_F77 \ hardcode_libdir_flag_spec_FC \ hardcode_libdir_separator_CXX \ hardcode_libdir_separator_F77 \ hardcode_libdir_separator_FC \ exclude_expsyms_CXX \ exclude_expsyms_F77 \ exclude_expsyms_FC \ include_expsyms_CXX \ include_expsyms_F77 \ include_expsyms_FC \ file_list_spec_CXX \ file_list_spec_F77 \ file_list_spec_FC \ compiler_lib_search_dirs_CXX \ compiler_lib_search_dirs_F77 \ compiler_lib_search_dirs_FC \ predep_objects_CXX \ predep_objects_F77 \ predep_objects_FC \ postdep_objects_CXX \ postdep_objects_F77 \ postdep_objects_FC \ predeps_CXX \ predeps_F77 \ predeps_FC \ postdeps_CXX \ postdeps_F77 \ postdeps_FC \ compiler_lib_search_path_CXX \ compiler_lib_search_path_F77 \ compiler_lib_search_path_FC; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec \ reload_cmds_CXX \ reload_cmds_F77 \ reload_cmds_FC \ old_archive_cmds_CXX \ old_archive_cmds_F77 \ old_archive_cmds_FC \ old_archive_from_new_cmds_CXX \ old_archive_from_new_cmds_F77 \ old_archive_from_new_cmds_FC \ old_archive_from_expsyms_cmds_CXX \ old_archive_from_expsyms_cmds_F77 \ old_archive_from_expsyms_cmds_FC \ archive_cmds_CXX \ archive_cmds_F77 \ archive_cmds_FC \ archive_expsym_cmds_CXX \ archive_expsym_cmds_F77 \ archive_expsym_cmds_FC \ module_cmds_CXX \ module_cmds_F77 \ module_cmds_FC \ module_expsym_cmds_CXX \ module_expsym_cmds_F77 \ module_expsym_cmds_FC \ export_symbols_cmds_CXX \ export_symbols_cmds_F77 \ export_symbols_cmds_FC \ prelink_cmds_CXX \ prelink_cmds_F77 \ prelink_cmds_FC \ postlink_cmds_CXX \ postlink_cmds_F77 \ postlink_cmds_FC; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "lib/plug-ins/Makefile") CONFIG_FILES="$CONFIG_FILES lib/plug-ins/Makefile" ;; "lib/plug-ins/nanoquanta-netcdf/Makefile") CONFIG_FILES="$CONFIG_FILES lib/plug-ins/nanoquanta-netcdf/Makefile" ;; "lib/plug-ins/OpenBabel-wrapper/Makefile") CONFIG_FILES="$CONFIG_FILES lib/plug-ins/OpenBabel-wrapper/Makefile" ;; "lib/plug-ins/xsf/Makefile") CONFIG_FILES="$CONFIG_FILES lib/plug-ins/xsf/Makefile" ;; "lib/plug-ins/cube/Makefile") CONFIG_FILES="$CONFIG_FILES lib/plug-ins/cube/Makefile" ;; "lib/plug-ins/abinit/Makefile") CONFIG_FILES="$CONFIG_FILES lib/plug-ins/abinit/Makefile" ;; "lib/plug-ins/python-gi/Makefile") CONFIG_FILES="$CONFIG_FILES lib/plug-ins/python-gi/Makefile" ;; "lib/plug-ins/archives/Makefile") CONFIG_FILES="$CONFIG_FILES lib/plug-ins/archives/Makefile" ;; "lib/plug-ins/bigdft/Makefile") CONFIG_FILES="$CONFIG_FILES lib/plug-ins/bigdft/Makefile" ;; "lib/python/Makefile") CONFIG_FILES="$CONFIG_FILES lib/python/Makefile" ;; "lib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;; "etc/Makefile") CONFIG_FILES="$CONFIG_FILES etc/Makefile" ;; "etc/v_sim.rc") CONFIG_FILES="$CONFIG_FILES etc/v_sim.rc" ;; "etc/v_sim.ini") CONFIG_FILES="$CONFIG_FILES etc/v_sim.ini" ;; "etc/v_sim-dev.ini") CONFIG_FILES="$CONFIG_FILES etc/v_sim-dev.ini" ;; "pixmaps/Makefile") CONFIG_FILES="$CONFIG_FILES pixmaps/Makefile" ;; "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "Documentation/Makefile") CONFIG_FILES="$CONFIG_FILES Documentation/Makefile" ;; "Documentation/reference/Makefile") CONFIG_FILES="$CONFIG_FILES Documentation/reference/Makefile" ;; "Documentation/reference/version") CONFIG_FILES="$CONFIG_FILES Documentation/reference/version" ;; "po/stamp-it") CONFIG_COMMANDS="$CONFIG_COMMANDS po/stamp-it" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="CXX F77 FC " # ### BEGIN LIBTOOL CONFIG # Assembler program. AS=$lt_AS # DLL creation program. DLLTOOL=$lt_DLLTOOL # Object dumper program. OBJDUMP=$lt_OBJDUMP # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: F77 # The linker used to build libraries. LD=$lt_LD_F77 # How to create reloadable object files. reload_flag=$lt_reload_flag_F77 reload_cmds=$lt_reload_cmds_F77 # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_F77 # A language specific compiler. CC=$lt_compiler_F77 # Is the compiler the GNU compiler? with_gcc=$GCC_F77 # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_F77 # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_F77 # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_F77 # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_F77 # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_F77 # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_F77 archive_expsym_cmds=$lt_archive_expsym_cmds_F77 # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_F77 module_expsym_cmds=$lt_module_expsym_cmds_F77 # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_F77 # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_F77 # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_F77 # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_F77 # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_F77 # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_F77 # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_F77 # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_F77 # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_F77 # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_F77 # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_F77 # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_F77 # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_F77 # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_F77 # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_F77 # Specify filename containing input files. file_list_spec=$lt_file_list_spec_F77 # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_F77 # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_F77 # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_F77 postdep_objects=$lt_postdep_objects_F77 predeps=$lt_predeps_F77 postdeps=$lt_postdeps_F77 # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_F77 # ### END LIBTOOL TAG CONFIG: F77 _LT_EOF cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: FC # The linker used to build libraries. LD=$lt_LD_FC # How to create reloadable object files. reload_flag=$lt_reload_flag_FC reload_cmds=$lt_reload_cmds_FC # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_FC # A language specific compiler. CC=$lt_compiler_FC # Is the compiler the GNU compiler? with_gcc=$GCC_FC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_FC # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_FC # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_FC # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_FC # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_FC # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_FC # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_FC # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_FC # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_FC # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_FC # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_FC # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_FC # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_FC archive_expsym_cmds=$lt_archive_expsym_cmds_FC # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_FC module_expsym_cmds=$lt_module_expsym_cmds_FC # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_FC # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_FC # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_FC # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_FC # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_FC # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_FC # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_FC # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_FC # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_FC # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_FC # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_FC # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_FC # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_FC # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_FC # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_FC # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_FC # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_FC # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_FC # Specify filename containing input files. file_list_spec=$lt_file_list_spec_FC # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_FC # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_FC # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_FC postdep_objects=$lt_postdep_objects_FC predeps=$lt_predeps_FC postdeps=$lt_postdeps_FC # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_FC # ### END LIBTOOL TAG CONFIG: FC _LT_EOF ;; "default-1":C) case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac ;; "po/stamp-it":C) if ! grep "^# INTLTOOL_MAKEFILE$" "po/Makefile.in" > /dev/null ; then as_fn_error $? "po/Makefile.in.in was not created by intltoolize." "$LINENO" 5 fi rm -f "po/stamp-it" "po/stamp-it.tmp" "po/POTFILES" "po/Makefile.tmp" >"po/stamp-it.tmp" sed '/^#/d s/^[[].*] *// /^[ ]*$/d '"s|^| $ac_top_srcdir/|" \ "$srcdir/po/POTFILES.in" | sed '$!s/$/ \\/' >"po/POTFILES" sed '/^POTFILES =/,/[^\\]$/ { /^POTFILES =/!d r po/POTFILES } ' "po/Makefile.in" >"po/Makefile" rm -f "po/Makefile.tmp" mv "po/stamp-it.tmp" "po/stamp-it" ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo " Configuration: Source code location: ${srcdir} Destination path prefix: ${prefix} Compiler: ${CC} CFLAGS: ${CFLAGS} LDFLAGS: ${LDFLAGS} GLIB-part CFLAGS: ${GLIB_CFLAGS} GLIB-part LIBS: ${GLIB_LIBS} GTKS-part CFLAGS: ${GTKS_CFLAGS} GTKS-part LIBS: ${GTKS_LIBS} OpenGL: ${opengl} | CFLAGS: ${GLU_CFLAGS} | LIBS: ${GLU_LIBS} | FTGL LIBS: ${FTGL_LIBS} Enable debug messages: ${with_debug_messages} Enable gtk-doc: ${enable_gtk_doc} Enable Python bindings: ${enable_python} Enable introspection: ${enable_introspection} Plug-ins: With Nanoquanta support: ${have_etsf}" if test "$have_etsf" = "yes" ; then echo \ " | CFLAGS: ${NC_CFLAGS} | LDFLAGS LIBS: ${NC_LDFLAGS} ${NC_LIBS}" fi echo " With OpenBabel support: ${have_openbabel}" if test "$have_openbabel" = "yes" ; then echo \ " | CFLAGS: ${OPENBABEL_CFLAGS} | LDFLAGS LIBS: ${OPENBABEL_LIBS}" fi echo " With ABINIT support: ${ac_abinit}" if test "$ac_abinit" = "yes" ; then echo \ " | Input file support ${ac_abinit_parser} | Symmetry analyser ${ac_abinit_symmetry} | CFLAGS: ${AB_CPPFLAGS} | LDFLAGS LIBS: ${AB_LIBS}" fi echo " With XCrysDen support: ${have_xsf} With Cube support: ${have_cube} With Python scripting: ${enable_introspection}" if test "${enable_introspection}" = "yes" ; then echo \ " | CFLAGS: ${PYTHON_INCLUDES} | LDFLAGS LIBS: ${PYTHON_LIBS}" fi echo " With archive support : ${ac_archives}" if test "${ac_archives}" = "yes" ; then echo \ " | CFLAGS: ${LIB_ARCHIVE_CFLAGS} | LDFLAGS LIBS: ${LIB_ARCHIVE_LIBS}" fi echo " With BigDFT support : ${ac_bigdft}" if test "${ac_bigdft}" = "yes" ; then echo \ " | CFLAGS: ${BIGDFT_CPPFLAGS} | LDFLAGS LIBS: ${BIGDFT_LIBS}" fi echo \ " Plug-ins options: Need a C++ compiler: ${need_cpp_compiler}" if test "$need_cpp_compiler" = "yes" ; then echo \ " | compiler: ${CXX} | CXXFLAGS: ${CXXFLAGS} " fi v_sim-3.7.0/AUTHORS0000644000353400050620000000166112215546176010646 00000000000000*Luc Billard* Now on retirement Creator (all versions until 2.2) *Damien Caliste* damien.caliste (AT) cea.fr Developer and maintainer *Olivier D'Astier* dastier (AT) iie.cnam.fr Contributor (spin rendering method, portage of isosurfaces code from an older version) *Aurlien Lherbier* aurelien.lherbier (AT) cea.fr Contributor (non-linear mesh grid for densities, isolines) *Jrmy Blanc* Jeremy.Blanc (AT) bvra.etu.upmf-grenoble.fr Contributor (phonon visualisation) *Simon Plans* simon.planes (AT) laposte.net Contributor (loop selection visualisation) *Thomas Jourdan* Thomas.Jourdan (AT) cea.fr Contributor (torus representation) *Yoann Ratao* Ratao.yoann (AT) hotmail.fr Contributor (scale drawing) *Tristan Berthelot* tristan.berthelot (AT) isen.fr Contributor (GI integration) *Trung Vu* trungvp2000 (AT) yahoo.fr Contributor (adaptive colour map) v_sim-3.7.0/COPYING0000644000353400050620000005431112215546176010631 00000000000000 FREE SOFTWARE LICENSING AGREEMENT CeCILL ======================================== Notice ------ This Agreement is a free software license that is the result of discussions between its authors in order to ensure compliance with the two main principles guiding its drafting: - firstly, its conformity with French law, both as regards the law of torts and intellectual property law, and the protection that it offers to authors and the holders of economic rights over software. - secondly, compliance with the principles for the distribution of free software: access to source codes, extended user-rights. The following bodies are the authors of this license CeCILL (Ce : CEA, C : CNRS, I : INRIA, LL : Logiciel Libre): Commissariat l'Energie Atomique - CEA, a public scientific, technical and industrial establishment, having its principal place of business at 31-33 rue de la Fdration, 75752 PARIS cedex 15, France. Centre National de la Recherche Scientifique - CNRS, a public scientific and technological establishment, having its principal place of business at 3 rue Michel-Ange 75794 Paris cedex 16, France. Institut National de Recherche en Informatique et en Automatique - INRIA, a public scientific and technological establishment, having its principal place of business at Domaine de Voluceau, Rocquencourt, BP 105, 78153 Le Chesnay cedex. PREAMBLE -------- The purpose of this Free Software Licensing Agreement is to grant users the right to modify and redistribute the software governed by this license within the framework of an "open source" distribution model. The exercising of these rights is conditional upon certain obligations for users so as to ensure that this status is retained for subsequent redistribution operations. As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the successive licensors only have limited liability. In this respect, it is brought to the user's attention that the risks associated with loading, using, modifying and/or developing or reproducing the software by the user given its nature of Free Software, that may mean that it is complicated to manipulate, and that also therefore means that it is reserved for developers and experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the Software's suitability as regards their requirements in conditions enabling the security of their systems and/or data to be ensured and, more generally, to use and operate it in the same conditions of security. This Agreement may be freely reproduced and published, provided it is not altered, and that no Articles are either added or removed herefrom. This Agreement may apply to any or all software for which the holder of the economic rights decides to submit the operation thereof to its provisions. Article 1 - DEFINITIONS ------------------------ For the purposes of this Agreement, when the following expressions commence with a capital letter, they shall have the following meaning: Agreement: means this Licensing Agreement, and any or all of its subsequent versions. Software: means the software in its Object Code and/or Source Code form and, where applicable, its documentation, "as is" at the time when the Licensee accepts the Agreement. Initial Software: means the Software in its Source Code and/or Object Code form and, where applicable, its documentation, "as is" at the time when it is distributed for the first time under the terms and conditions of the Agreement. Modified Software: means the Software modified by at least one Contribution. Source Code: means all the Software's instructions and program lines to which access is required so as to modify the Software. Object Code: means the binary files originating from the compilation of the Source Code. Holder: means the holder of the economic rights over the Initial Software. Licensee(s): mean(s) the Software user(s) having accepted the Agreement. Contributor: means a Licensee having made at least one Contribution. Licensor: means the Holder, or any or all other individual or legal entity, that distributes the Software under the Agreement. Contributions: mean any or all modifications, corrections, translations, adaptations and/or new functionalities integrated into the Software by any or all Contributor, and the Static Modules. Module: means a set of sources files including their documentation that, once compiled in executable form, enables supplementary functionalities or services to be developed in addition to those offered by the Software. Dynamic Module: means any or all module, created by the Contributor, that is independent of the Software, so that this module and the Software are in two different executable forms that are run in separate address spaces, with one calling the other when they are run. Static Module: means any or all module, created by the Contributor and connected to the Software by a static link that makes their object codes interdependent. This module and the Software to which it is connected, are combined in a single executable. Parties: mean both the Licensee and the Licensor. These expressions may be used both in singular and plural form. Article 2 - PURPOSE ------------------- The purpose of the Agreement is to enable the Licensor to grant the Licensee a free, non-exclusive, transferable and worldwide License for the Software as set forth in Article 5 hereinafter for the whole term of protection of the rights over said Software. Article 3 - ACCEPTANCE ---------------------- 3.1. The Licensee shall be deemed as having accepted the terms and conditions of this Agreement by the occurrence of the first of the following events: - (i) loading the Software by any or all means, notably, by downloading from a remote server, or by loading from a physical medium; - (ii) the first time the Licensee exercises any of the rights granted hereunder. 3.2. One copy of the Agreement, containing a notice relating to the specific nature of the Software, to the limited warranty, and to the limitation to use by experienced users has been provided to the Licensee prior to its acceptance as set forth in Article 3.1 hereinabove, and the Licensee hereby acknowledges that it is aware thereof. Article 4 - EFFECTIVE DATE AND TERM ----------------------------------- 4.1. EFFECTIVE DATE The Agreement shall become effective on the date when it is accepted by the Licensee as set forth in Article 3.1. 4.2. TERM The Agreement shall remain in force during the whole legal term of protection of the economic rights over the Software. Article 5 - SCOPE OF THE RIGHTS GRANTED --------------------------------------- The Licensor hereby grants to the Licensee, that accepts such, the following rights as regards the Software for any or all use, and for the term of the Agreement, on the basis of the terms and conditions set forth hereinafter. Otherwise, the Licensor grants to the Licensee free of charge exploitation rights on the patents he holds on whole or part of the inventions implemented in the Software. 5.1. RIGHTS OF USE The Licensee is authorized to use the Software, unrestrictedly, as regards the fields of application, with it being hereinafter specified that this relates to: - permanent or temporary reproduction of all or part of the Software by any or all means and in any or all form. - loading, displaying, running, or storing the Software on any or all medium. - entitlement to observe, study or test the operation thereof so as to establish the ideas and principles that form the basis for any or all constituent elements of said Software. This shall apply when the Licensee carries out any or all loading, displaying, running, transmission or storage operation as regards the Software, that it is entitled to carry out hereunder. 5.2. entitlement to make CONTRIBUTIONS The right to make Contributions includes the right to translate, adapt, arrange, or make any or all modification to the Software, and the right to reproduce the resulting Software. The Licensee is authorized to make any or all Contribution to the Software provided that it explicitly mentions its name as the author of said Contribution and the date of the development thereof. 5.3. DISTRIBUTION AND PUBLICATION RIGHTS In particular, the right of distribution and publication includes the right to transmit and communicate the Software to the general public on any or all medium, and by any or all means, and the right to market, either in consideration of a fee, or free of charge, a copy or copies of the Software by means of any or all process. The Licensee is further authorized to redistribute copies of the modified or unmodified Software to third parties according to the terms and conditions set forth hereinafter. 5.3.1. REDISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION The Licensee is authorized to redistribute true copies of the Software in Source Code or Object Code form, provided that said redistribution complies with all the provisions of the Agreement and is accompanied by: - a copy of the Agreement, - a notice relating to the limitation of both the Licensor's warranty and liability as set forth in Articles 8 and 9, and that, in the event that only the Software's Object Code is redistributed, the Licensee allows future Licensees unhindered access to the Software's full Source Code by providing them with the terms and conditions for access thereto, it being understood that the additional cost of acquiring the Source Code shall not exceed the cost of transferring the data. 5.3.2. REDISTRIBUTION OF MODIFIED SOFTWARE When the Licensee makes a Contribution to the Software, the terms and conditions for the redistribution of the Modified Software shall then be subject to all the provisions hereof. The Licensee is authorized to redistribute the Modified Software, in Source Code or Object Code form, provided that said redistribution complies with all the provisions of the Agreement and is accompanied by: - a copy of the Agreement, - a notice relating to the limitation of both the Licensor's warranty and liability as set forth in Articles 8 and 9, and that, in the event that only the Modified Software's Object Code is redistributed, the Licensee allows future Licensees unhindered access to the Modified Software's full Source Code by providing them with the terms and conditions for access thereto, it being understood that the additional cost of acquiring the Source Code shall not exceed the cost of transferring the data. 5.3.3. redistribution OF DYNAMIC MODULES When the Licensee has developed a Dynamic Module, the terms and conditions hereof do not apply to said Dynamic Module, that may be distributed under a separate Licensing Agreement. 5.3.4. COMPATIBILITY WITH THE GPL LICENSE In the event that the Modified or unmodified Software is included in a code that is subject to the provisions of the GPL License, the Licensee is authorized to redistribute the whole under the GPL License. In the event that the Modified Software includes a code that is subject to the provisions of the GPL License, the Licensee is authorized to redistribute the Modified Software under the GPL License. Article 6 - INTELLECTUAL PROPERTY ---------------------------------- 6.1. OVER THE INITIAL SOFTWARE The Holder owns the economic rights over the Initial Software. Any or all use of the Initial Software is subject to compliance with the terms and conditions under which the Holder has elected to distribute its work and no one shall be entitled to and it shall have sole entitlement to modify the terms and conditions for the distribution of said Initial Software. The Holder undertakes to maintain the distribution of the Initial Software under the conditions of the Agreement, for the duration set forth in article 4.2.. 6.2. OVER THE CONTRIBUTIONS The intellectual property rights over the Contributions belong to the holder of the economic rights as designated by effective legislation. 6.3. OVER THE DYNAMIC MODULES The Licensee having developed a Dynamic Module is the holder of the intellectual property rights over said Dynamic Module and is free to choose the agreement that shall govern its distribution. 6.4. JOINT PROVISIONS 6.4.1. The Licensee expressly undertakes: - not to remove, or modify, in any or all manner, the intellectual property notices affixed to the Software; - to reproduce said notices, in an identical manner, in the copies of the Software. 6.4.2. The Licensee undertakes not to directly or indirectly infringe the intellectual property rights of the Holder and/or Contributors and to take, where applicable, vis--vis its staff, any or all measures required to ensure respect for said intellectual property rights of the Holder and/or Contributors. Article 7 - RELATED SERVICES ----------------------------- 7.1. Under no circumstances shall the Agreement oblige the Licensor to provide technical assistance or maintenance services for the Software. However, the Licensor is entitled to offer this type of service. The terms and conditions of such technical assistance, and/or such maintenance, shall then be set forth in a separate instrument. Only the Licensor offering said maintenance and/or technical assistance services shall incur liability therefor. 7.2. Similarly, any or all Licensor shall be entitled to offer to its Licensees, under its own responsibility, a warranty, that shall only be binding upon itself, for the redistribution of the Software and/or the Modified Software, under terms and conditions that it shall decide upon itself. Said warranty, and the financial terms and conditions of its application, shall be subject to a separate instrument executed between the Licensor and the Licensee. Article 8 - LIABILITY ---------------------- 8.1. Subject to the provisions of Article 8.2, should the Licensor fail to fulfill all or part of its obligations hereunder, the Licensee shall be entitled to claim compensation for the direct loss suffered as a result of a fault on the part of the Licensor, subject to providing evidence of it. 8.2. The Licensor's liability is limited to the commitments made under this Licensing Agreement and shall not be incurred as a result , in particular: (i) of loss due the Licensee's total or partial failure to fulfill its obligations, (ii) direct or consequential loss due to the Software's use or performance that is suffered by the Licensee, when the latter is a professional using said Software for professional purposes and (iii) consequential loss due to the Software's use or performance. The Parties expressly agree that any or all pecuniary or business loss (i.e. loss of data, loss of profits, operating loss, loss of customers or orders, opportunity cost, any disturbance to business activities) or any or all legal proceedings instituted against the Licensee by a third party, shall constitute consequential loss and shall not provide entitlement to any or all compensation from the Licensor. Article 9 - WARRANTY --------------------- 9.1. The Licensee acknowledges that the current situation as regards scientific and technical know-how at the time when the Software was distributed did not enable all possible uses to be tested and verified, nor for the presence of any or all faults to be detected. In this respect, the Licensee's attention has been drawn to the risks associated with loading, using, modifying and/or developing and reproducing the Software that are reserved for experienced users. The Licensee shall be responsible for verifying, by any or all means, the product's suitability for its requirements, its due and proper functioning, and for ensuring that it shall not cause damage to either persons or property. 9.2. The Licensor hereby represents, in good faith, that it is entitled to grant all the rights on the Software (including in particular the rights set forth in Article 5 hereof over the Software). 9.3. The Licensee acknowledges that the Software is supplied "as is" by the Licensor without any or all other express or tacit warranty, other than that provided for in Article 9.2 and, in particular, without any or all warranty as to its market value, its secured, innovative or relevant nature. Specifically, the Licensor does not warrant that the Software is free from any or all error, that it shall operate continuously, that it shall be compatible with the Licensee's own equipment and its software configuration, nor that it shall meet the Licensee's requirements. 9.4. The Licensor does not either expressly or tacitly warrant that the Software does not infringe any or all third party intellectual right relating to a patent, software or to any or all other property right. Moreover, the Licensor shall not hold the Licensee harmless against any or all proceedings for infringement that may be instituted in respect of the use, modification and redistribution of the Software. Nevertheless, should such proceedings be instituted against the Licensee, the Licensor shall provide it with technical and legal assistance for its defense. Such technical and legal assistance shall be decided upon on a case-by-case basis between the relevant Licensor and the Licensee pursuant to a memorandum of understanding. The Licensor disclaims any or all liability as regards the Licensee's use of the Software's name. No warranty shall be provided as regards the existence of prior rights over the name of the Software and as regards the existence of a trademark. Article 10 - TERMINATION ------------------------- 10.1. In the event of a breach by the Licensee of its obligations hereunder, the Licensor may automatically terminate this Agreement thirty (30) days after notice has been sent to the Licensee and has remained ineffective. 10.2. The Licensee whose Agreement is terminated shall no longer be authorized to use, modify or distribute the Software. However, any or all licenses that it may have granted prior to termination of the Agreement shall remain valid subject to their having been granted in compliance with the terms and conditions hereof. Article 11 - MISCELLANEOUS PROVISIONS -------------------------------------- 11.1. EXCUSABLE EVENTS Neither Party shall be liable for any or all delay, or failure to perform the Agreement, that may be attributable to an event of force majeure, an act of God or an outside cause, such as, notably, defective functioning, or interruptions affecting the electricity or telecommunications networks, blocking of the network following a virus attack, the intervention of the government authorities, natural disasters, water damage, earthquakes, fire, explosions, strikes and labor unrest, war, etc. 11.2. The fact that either Party may fail, on one or several occasions, to invoke one or several of the provisions hereof, shall under no circumstances be interpreted as being a waiver by the interested Party of its entitlement to invoke said provision(s) subsequently. 11.3. The Agreement cancels and replaces any or all previous agreement, whether written or oral, between the Parties and having the same purpose, and constitutes the entirety of the agreement between said Parties concerning said purpose. No supplement or modification to the terms and conditions hereof shall be effective as regards the Parties unless it is made in writing and signed by their duly authorized representatives. 11.4. In the event that one or several of the provisions hereof were to conflict with a current or future applicable act or legislative text, said act or legislative text shall take precedence, and the Parties shall make the necessary amendments so as to be in compliance with said act or legislative text. All the other provisions shall remain effective. Similarly, the fact that a provision of the Agreement may be null and void, for any reason whatsoever, shall not cause the Agreement as a whole to be null and void. 11.5. LANGUAGE The Agreement is drafted in both French and English. In the event of a conflict as regards construction, the French version shall be deemed authentic. Article 12 - NEW VERSIONS OF THE AGREEMENT ------------------------------------------- 12.1. Any or all person is authorized to duplicate and distribute copies of this Agreement. 12.2. So as to ensure coherence, the wording of this Agreement is protected and may only be modified by the authors of the License, that reserve the right to periodically publish updates or new versions of the Agreement, each with a separate number. These subsequent versions may address new issues encountered by Free Software. 12.3. Any or all Software distributed under a given version of the Agreement may only be subsequently distributed under the same version of the Agreement, or a subsequent version, subject to the provisions of article 5.3.4. Article 13 - GOVERNING LAW AND JURISDICTION ------------------------------------------- 13.1. The Agreement is governed by French law. The Parties agree to endeavor to settle the disagreements or disputes that may arise during the performance of the Agreement out-of-court. 13.2. In the absence of an out-of-court settlement within two (2) months as from their occurrence, and unless emergency proceedings are necessary, the disagreements or disputes shall be referred to the Paris Courts having jurisdiction, by the first Party to take action. Version 1.1 of 10/26/2004 v_sim-3.7.0/ChangeLog0000644000353400050620000011042512216003502011325 00000000000000 All changes leading to 3.7.x series.
  • Draw black line around planes and at intersections.
  • Axes can be used to render the box basis-set and can be positioned anywhere.
  • Add a colour legend for the colourisation.
  • SVG output now clips its surface so that nodes partially inside are correctly rendered.
  • Add user defined shades in the resource file.
  • Resource file can be saved as XML file and merged with other XML files handled by V_Sim, like plane definitions…
  • The save resources dialog now propose the available .res files of the current directory as possibilities in the path completion.
  • The PythonGI plug-in logs stdout and stderr of the Python output.
  • Make the wire colouring depending on length applied only to the selected link and not to all.
  • Add a way to use other function than "lower than" to hide nodes on colourisation data.
  • Full support of the introspection for the core of V_Sim and for some parts of the GUI.
  • The PythonGI plug-in adds a panel to plot scalar field values along lines in the box using Matplotlib as rendering widget for curves.
  • Using GObject-Introspection, add a parser for CNT files from VASP.
  • The new BigDFT plug-in adds a panel to control and visualise parameters specific to BigDFT like the wavelet grids, the memory consumption, the pseudo-potential parameters... This plug-in is compatible with the linear version of the code. It can also be used to start or monitor a distant BigDFT run, retrieving density, potentials and wavefunctions.
  • Add natively a YAML parser, following the specifications from BigDFT.
  • Add key bindings ('Ctrl+v') on the rendering window to popup the orientation chooser.
  • Save prefered cameras in the resource file.
  • Add a search bar in the rendering window (Ctrl+f) to highlight nodes from their number.
  • Partial support of a possibility to scale the background image with camera settings.
  • Add resource entries to position the legend of the coloured maps.
  • Make the manual range of colourisation working per column and not for all as before.
  • Support the wavefunction file format of BigDFT thanks to a dedicated plug-in.
  • Add the possibility to draw arrows for forces directly in the atomic rendering mode without switching to the spin mode.
  • Implement a support for forces in ASCII and xyz file format.
  • Add a plug-in to handle compressed files (tar.gz, tar.bz2, ...).
  • Add key bindings ('n' and 'p') to load next or previous file from the browser list.
  • Add an option in the interactive dialog to hide highlighted or non-highlighted nodes.
  • Add support for recent files. Opened and saved files now appear in the recent list of Gtk file chooser.
  • Add an option to colourise nodes only if being in the manual range.
  • All changes leading to 3.6.x series.
  • Correct the missing texts in bitmap exportations.
  • Modify preview loading in open dialog to avoid grabbing of current file in case of long loading times.
  • Correct the id of nodes in measurement history and restrain to 6 values only.
  • Correct the not working spin modulus scaling.
  • Upgrade ABINIT plug-in for version 6.8.x.
  • Correct a crashing bug after several reload of a file with measurements when changing the colour.
  • Correct a memory corruption in the distance curve widget.
  • Make the drag action work again.
  • Correct pair build when using translations on command line.
  • Correct browser exportation of multi dataset files.
  • Correct the exportation crash with ATI proprietary drivers.
  • Display coordinates either in cartesian or reduced (see the configure panel).
  • Keep zoom adjustment between two files of different box size (see option in the geometry panel).
  • Modify the coloured map rendering to use adaptive mesh. The legend displays also the isoline values.
  • Add keybindings for the camera settings in the rendering window.
  • Add partial support for densities in XSF file format.
  • Add an exportation in ABINIT file format for the crystal part.
  • Add a transparency option for the coloured maps.
  • Begin to implement a support of GObject-Introspection, to allow scripting (Python, Javascript, ...).
  • The ABINIT interactive dialog now support different tolsym values and output the list of symmetries with their names.
  • Add a progress bar for file loading when the loading is too long. Add also the possibility to abort loading process.
  • V_Sim respects now the icon theme specification of FreeDesktop.
  • Demonstrate the Python scripting with the implementation of CNT file format of VASP.
  • Add keybindings for the rendering area (save, reload and open).
  • Add the possibility to export to any OpenBabel fileformats in command-line.
  • Modify the pair drawing to be able to use a per pair drawing method. Now, cylinder and wire pairs are available at the same time.
  • Add a calculation of g(r) and add a tab in the pair dialog to display it. Linear or log scale are available and filtering between kind of neighbours is also possible.
  • Sort pairs by distance.
  • Export a geometry difference in ASCII files as a keyword.
  • Add a keyword in ASCII files to store the total energy value of a system. This energy can be used to colourise paths.
  • Expand the XML file format generated by V_Sim to store the paths.
  • Use nicer message in the file browser when the loading is too long.
  • Add a command-line option to clamp coloured map values.
  • Add a full vectorial PDF export with Cairo.
  • Add the fog support in exportation in vectorial formats.
  • Add data colourisation support in exportation in vectorial formats.
  • Add a resource for the radius of the highlight mark.
  • Implement a legend showing the box lengths.
  • Implement an exportation in CIF (from OpenBabel) file format.
  • Implement a way to add two surfaces in one click, with good ressources for scalar fileds describing a wavefunction.
  • Remove the deprecated GTK curve in the pair dialog and replace it with the combobox for shades.
  • Add a path drawing tool.
  • Rename the panel "box" to "geometry" and store all geometry-related functions there, i.e. translation, expansion, units, paths...
  • All changes leading to 3.5.x series.
  • Correct a bug after changing the basis set with the upper limit of node id selectors.
  • Correct the position of the atom in case of spin rendering.
  • Correct compilation issues with GCC >= 4.4 (thanks to Thierry Thomas for his patch).
  • Correct a crashing bug in cube file format, when loading a file with a wrong atomic number.
  • Correct missing information on nodes after an image dump.
  • Correct a mistake in the legend when loading a new file with a varying number of nodes per element.
  • Correct a crash with the command line exportation.
  • Correct a wrong sort in the browser panel for multiset files.
  • Improve the output of the changelog in the about dialog window.
  • Correct mispositioned atoms in case of non-orthorhombic boxes in XSF files.
  • Add the reduced coordinates in case of peridic XYZ files.
  • Give a good position to the duplicated atoms for free BC.
  • Correct a blocking loop in the export dialog in case of wrong type detection.
  • Correctly associate colorisation to nodes in case of not sorted node in input file.
  • Correct several warnings, for the color selector widget, the rendering of text in the OpenGL area or the loading of XML value file.
  • Correct a wrong exportation of wire width greater than 10.
  • Avoid useless dialog when loading a value file with partial data.
  • Correct a masking bug for surfaces when the plane usage is unchecked.
  • Allow to parse XYZ files with additionnal columns different from a vibration file.
  • Correct a bug not showing the warning dialog box in case of error when exporting in image.
  • Correct a bug affecting the positions of atoms in Cube files when boxes are non-orthorombic.
  • Correct a crashing bug when pressing 'r' key without any saved camera.
  • Correct a bug for non orthorombic boxes using OpenBabel plug-in, thanks to patch sent by Atz Togo.
  • Correct a bug in ASCII file parsing when the files come from Macintosh or Windows.
  • Make the 'open with' action works under Windows.
  • Add a support for angles in the XML value files.
  • The tooltips in the browser now show the name of previous and next directories.
  • Draw a legend in SVG dump.
  • Add a way to change the basis set by pointing nodes as new vertices.
  • Declare in the resource file all parameters for the geometry diff (shape and size of the arrows, thresholds...).
  • Take into acount the boundary conditions when choosing the "up" direction. In case of surface, the y axis becomes the up axis.
  • Add a tab in the interactive dialog to show symmetry information, as calculated by ABINIT (space group, equivalent atoms...).
  • Add a key shortcut to switch between windows, mapped on "home" key.
  • Correct the visuals glitches when drawing cylindrical pairs.
  • Add phonons to ASCII file format.
  • Implement the phonon properties for solid, taking into account the imaginary parts of displacements and the q.r phase shift.
  • Add a clickable icon in the rendering window to access the saved cameras.
  • Implement a visualisation for the difference in positions using small arrows on nodes.
  • Add a phonon representation with vibration or arrows.
  • Add labels to nodes. These labels can be rendered as for the type or the node id for instance. They can be modified in the interactive dialog.
  • Implement the colourisation according to the coordinates.
  • Add a visualisation for the angles.
  • Add the support for labels for nodes in ASCII files.
  • Add a boundary condition keyword for ASCII files.
  • Parse a phonon column in the XYZ files.
  • Add 'previous' and 'next' buttons into the browser.
  • Add a tab for the phonon representation, listing available modes and displaying some parameters.
  • Modify the pick mouse buttons to easily access the measuring tool. Add also some button in the rendering window to set or unset measurements.
  • Add a scaling factor as post-process for the colourise tab.
  • Implement a legend displaying a frame with the atom names, number and representation.
  • Add a torus representation, in addition to existing ellipsoid and so on.
  • Add a hiding capability to the highlighted nodes.
  • Implement the support for several coloured maps.
  • Make the edges of the map planes smooth and highlight with a black line.
  • Add a drag and drop capability for file loading on the OpenGL area.
  • Modify the ASCII format to allow reduced coordinates and box definition based on vector lengths and angles.
  • Create a PDF/SVG exportation for the coloured maps.
  • Change the keys 's' and 'r' as a ring to save and restore the camera position, instead of saving only one value.
  • Add an exportation to XYZ file format.
  • Implement in the box subpanel a way to quickly switch distances between common units (bohr, angstroems...).
  • In the geometry modification panel, add a duplication possibility for the listed nodes.
  • Start the implementation of Python bindings for V_Sim. It is possible to open a rendering window and to load a file in it. It is also psossible to create a VisuData from scratch, creating elements and nodes by hand. The planes capability has also been ported to Python.
  • Code a plug-in for cube file support, commonly used by SIESTA and introduced by Gaussian.
  • Suppress the "highlight" tab in the interactive dialog. Move this capability to the pick tab using the control key to toggle highlight. Rework the relations between highlighted nodes and selected nodes. The highlight status can be changed in the listed nodes.
  • Add a column to print the date of files in the browser.
  • Extend the XML plane file to support various value fields in V_Sim. It is possible now to store in this XML file, the picked distances, the highlighted nodes, the values of created iso-surfaces.
  • Add the support for D3 posi files (concatenation of D3 files, adapted for movies).
  • Add non linear shades, logarithmic scale for zero-centred data and add the possibility to choose the isoline colour.
  • Reorganise a bit the pair dialog layout (the filter is now over the treeview and the management of links has been moved on the right).
  • All changes leading to 3.4.x series.
  • Correct the not working -d command line option when used in conjonction of the -u option.
  • Correct different memory leaks in the reading of input files or in the drawing routines.
  • Make the 'r' and 's' keys work again after the opening of a dialog from the rendering window.
  • Correct a crashing bug when nodes with persistent distances are removed.
  • Correct the automatic reload function that was broken in 3.4 series.
  • Correct wrong pathes in the browser when UTF8 characters are used.
  • Correct a jump of the camera in the interactive session when leaving pick mode with a right click and a drag.
  • Stop the interactive session also when the interactive dialog is closed by the window manager.
  • Disconnect signals for orientation chooser when the dialog is destroyed..
  • Solve a loading problem when using the filechooser in spin mode.
  • Correct a lack of cylinder pair drawing under specific conditions.
  • Correct some "assertion fails" error when loading new files.
  • Make the behaviour of "all elements" selection in the element tab works for atomic parameters in spin rendering.
  • Correct the tab character problem in ASCII files.
  • Correct a bug in the pair dialog when the sort is used. Modifications in the treeview are then inconsistent.
  • Correct a bug that makes the rendering disappear in the walker mode.
  • Correct a bug when expanding the nodes that could create several nodes at one place.
  • Correct a bug when the selection is zero pixel wide.
  • Correct a bug in the move interactive dialog that prints a wrong number of selected nodes.
  • Correct the error while reading the resources of cylinder pairs with the minimum value.
  • Add the missing exportation of the stipple pattern for the wire pairs.
  • Correct several Critical Warnings in drawDataOnNode() in the interactive dialog window.
  • Correct a crash in the interactive window when the current VisuData is deleted.
  • Correct wrong permissions on the directory created in the quit dialog.
  • Correct a bug in the subpanel menu.
  • Change the way to find a module name from its file name.
  • Correct a linking problem with variable in .h on MacOS.
  • Avoid V_Sim crash when a pixmap exportation is required on X server using AIGLX and a version of GLX prior to 1.3.
  • 3.4.0.1: correct a segfault in the Abinit plugin.
  • 3.4.0.2: correct a possible segfault when a VisuData object is freed.
  • 3.4.0.2: add an XML filter to the plane file dialog.
  • 3.4.0.2: correct a bug in the colour selection of surfaces.
  • 3.4.0.2: import the debian directory from official repository and update it for 3.4.0 (made for 3.3.3 by Debian).
  • 3.4.0.3: change the location of legal dir to data dir.
  • 3.4.0.3: only install the plugins related files when plugins are compiled. Also move the images to the pixmap dir.
  • Add the axes in the SVG output.
  • Correct bugs (preview widget, ABINIT bindings) and complete translation.
  • Add the capability to draw bitmap pictures on the background.
  • Change the zoom behaviour to none when the box is expanded.
  • Add a rectangular selection in the pick window and enable group moving in the move window.
  • Add iso-lines for the coloured map.
  • Add the support of vectors (for forces or spin) in the XSF plug-in.
  • Add a possibility to link with the ABINIT parser to read its input file. This depends on modifications not yet in ABINIT official releases. They may enter in ABINIT 5.6 series. The data sets are supported and when the geometry builder is used, the created box is shown. Current limitation is when nband must be computed since no pseudo-potential files are loaded and thus nelect is not known.
  • Add a tool to automatically compute range distance for first neighbours.
  • Implement the possibility to draw pattern wires for pairs and box.
  • Early implementation of a plug-in adding XSF reading capabilities. Atomic positions are only available yet.
  • The coloured map can now be drawn in logarithmic scale.
  • The XYZ parser has been modified to allow to read animation files. The browser panel has been modified accordingly to show the different node sets in one file.
  • Activate once again the stereo rendering (was disabled from version 3.0.0 because of lack of hardware for testing). The stereo parameters, like the eyes distance, can be tuned in the OpenGL panel.
  • Add keyboard support in the rendering window in observe mode. Page-Up and Page-Down keys are used for zoom and perspective. Also add the 's' key for 'save current camera position'. Key 'r' is now used to restore this saved position.
  • Add the possibility of a non-uniform mesh for the scalar-field representation.
  • Basic support for SVG exportation of box and nodes.
  • Allow changes of coordinates in the pick table (as for spin characteristics or colour data). Add a possibility to write information on selected or all nodes.
  • Better integration of OpenBabel library, with the use of the atom symbol instead of the atom labels, also use the OpenBabel colour and radius when the atom is not known by V_Sim. Try to reproduce as much as possible the handling of pairs as described in the OpenBabel input files.
  • Add a filter in the pairs dialog to show only pairs of interest (i.e. pairs containing one given element).
  • Implement a way to duplicate the box following a fractional ratio in the case of periodic boxes. Adapt all capabilities to take that extension into account (extend planes and coloured maps, duplicate colourisation data, draw box extension...).
  • Separate the box & axes subpanel into two subpanels and move the translations from the interactive window to the new box subpanel. Also add in this subpanel the gestion of box duplication.
  • Enable the box duplication on command-line and also the coloured map.
  • Modify the geometry tab in the interactive window to allow to add or remove nodes.
  • Add a support for GtkGlExt as an alternative to the built-in OpenGL widget.
  • Add a preview in the open dialog box, displaying the box and the elements with the current camera position.
  • Implement the 'smooth and edge' rendering mode, displaying a line around polygons.
  • Make the hiding of surfaces by planes smooth, adding polygons to avoid edgy borders.
  • Improve the parse speed of the browser and add a multiple matching for rendering method with several type files (spin and positions can be loaded in one clic).
  • Use the XDG specification for the location of the home config directory. The old $HOME/.v_sim is still supported.
  • Change the surface resources in the panel: each surfaces can has a name or not. In the latter case, the resources of the surface are private to this surface (all changes do not affect the other surfaces). Merge the two property dialogs into one (previously change current and change all). Add a special add button in the panel to add several surfaces at once (use the same than in the build dialog). Make the remove button remove all surfaces of a scalar field file before removing the file itself.
  • Implement the masking effect of planes on surfaces with a simple implementation (not smooth borders).
  • Make the masking effect of planes selective per surface or per element (see the new masking column in surface panel and the check box in the element panel).
  • Add a capability to print all distance of a pair (see the pair dialog and the 'length column). Distance values are now editable in the treeview.
  • Add an option in the browser panel to read the directories recursively. Also makes the double-click check the file entry in the list and implement the capability to browse several directories at one time.
  • Add a new widget to choose the orientation, using an orthogonal basis set, the box coordinates or the spherical basis set.
  • All changes leading to 3.3.x series.
  • Correct the implementation of the translation inside windows with a non-unitary ratio aspect.
  • Correct a memory leak during image exportation with the XLib.
  • Correct a memory leak in the save dialog window.
  • Add a man page.
  • Use a correct format for the v_sim.ini file in Windows.
  • Correct a bug making D3 file read impossible on Windows.
  • Correct a bug when selected the root directory.
  • Correct a crashing bug on MacOSX and Intel cards on Linux.
  • Make the normalisation of the colorisation stay during automatic reloading.
  • Correct a bug in the coordinate conversion for non-orthogonal boxes (both in structure and scalar field).
  • Correct a bug in D3 file parsing.
  • Correct an internal error dealing with to much signal connection to the VisuData objects.
  • Add a rendering shape as points for atoms to be able to plot grid position or to increase speed when a huge quantities of elements is drawn.
  • Implement a binary format for the spin rendering.
  • Some improvements in windows handling: it is possible to raise the command panel from the rendering window for instance.
  • Small improvements and redesign in the save parameters and resources window: it is possible to export resources related to rendered object only.
  • End of implemntation of separable subpanels. Their size and positions are now changeable and can be exported to the parameter file.
  • Upgrade the build system to be able to build plugins for Windows.
  • Change the transparency handling of isosurfaces to avoid to compute the order of them when the camera is moving.
  • Several bug corrections, including error on reading resources related to isosurfaces, wrong computation of normal vector of isosurfaces, automatic reload of file...
  • Improvements done on the gestion of the properties of isosurfaces. Names are editable and can be passed on command line when option -v is used. Change also the behavior of selecting buttons in that subpanel to be able to change properties of all surfaces of one unique file.
  • Save in the plane file in XML the rendering state of each plane.
  • Upgrade translation file for future version 3.3.
  • Implementation for the reading of scalar fields encoding with the Nanoquanta specification v1.3. Only real scalar fields (i.e. densities) without spin informations are currently supported. From this point basic support for specification v1.3 is operational.
  • Addition of a subpanel to draw colored planes representing the variations of a given scalar field. A colored scale is also available.
  • Density files and surface files can be automatically loaded and all drawing capabilities are available from the command line.
  • Colors and material values are more coherent between elements and surfaces.
  • Commandline capabilities for new fonctionalities associated to iso-surfaces.
  • Support of density/potential files directly in the isosurfaces panel, without need to use the convert tool. Implementation also of the merge of several surfaces directly in this panel.
  • Adding remove and add of surfaces on the fly in the isosurfaces panel. The add action is available only for density/potential files.
  • Complete support for detaching panels and associate them in several dialogs.
  • Implementation of the modulus handling in spin rendering. Spin shapes can be scaled according to the modulus read in the spin input file.
  • Total implementation of OpenBabel support. All format readable with OpenBabel are loadable in V_Sim.
  • Creation of a tool to retrieve values attached to nodes, such as colorisation informations or orientation and modulus for spin rendering. In this former rendering mode, these value are editable on the fly.
  • Some changements in the saving of resources of spin rendering. It is recommended to overwrite resources files since three keywords are now obsolete.
  • Some interface enhancements.
  • Adding a basic support for plugins. Shared libraries that matched the interfaces required by V_Sim located in the installation directory and in the user one (${HOME}/.v_sim) are automatically loaded on startup.
  • Partial implemntation of NANOQUANTA v1.2 specifications for atomic positions (plugin).
  • Usage of OpenBabel library for file loading (plugin), but nothing is actually functional.
  • Basic fuunctionnality to detach tabs from the command panel.
  • Creation of a simple OpenGL widget to avoid the hack used since v3.0 version to render OpenGL surfaces. Doing it, the backing store support has been removed and replaced by a complete gestion of the 'expose' events.
  • Improvements in the spin rendering mode where it is now possible to choose between, always spin, hide spin with a null modulus or draw atomic shapes instead.
  • Support of the atomic rendering within the spin one.
  • Addition of an elipsoid shape for both spin and atomic rendering.
  • Support for distance measurements in the default mode (restricted before to the pick / observe window).
  • All changes leading to 3.2.x series.
  • Correct a reading bug in the convert dialog for isosurfaces, when a potential/density file is read.
  • Correct a crashing bug using box and axes when no file is rendered.
  • Correct a crashing bug in the isosurface panel, when playing a list with only one entry.
  • Correct a crashing bug in the colorization panel.
  • Correct a bug with 64bits machines that disables the camera rotation in the observe window.
  • Correct a mispel in the French translation.
  • A warning message dialog has been added when the quit button is clicked. This message is optional and can be hidden with a key in the config file named 'v_sim.par' or by checking a button in this window.
  • Adding a functionnality to save or open informations about planes. The data type used is simple XML. The geometry, the hidden state and the color of each plane are stored. Only the drawn options is not saved.
  • Implement the constrained movements along x, y and z axis in the geometry builder.
  • Choose automatically the action associated to a tab when one is selected in the interactive window.
  • Implementing a new action to move the nodes. Using drag and drop, it is possible to move nodes in the plane of the screen.
  • Adding a ascii export with the option to output or not hidden nodes.
  • A new tab has been added in the planes subpanel to allow to change automatically the distance from origin (as it is done in the browser subpanel to chow several files one after an other).
  • Creating a new action to mark atoms. It draws some frame around clicked nodes to easily follow some.
  • Internal modifications to suppress global pointers (especially in opengl.c and visu_data.c).
  • VisuData is switched to a GObject and signals about OpenGL, Nodes and Elements are moved from visu_object to it.
  • Through the selection dialog, distances that are picked are label on screen and stay printed as long as required.
  • Add a possibility to hide some nodes in the colorization subpanel, depending on values in the associated data file.
  • Enable the choice of rendering mode per drawn elements, e.g. atoms are drawn smoothly wereas isosurfaces are rendered through wireframe (requires GTK+2.6).
  • Add a custom value to tune the power of used lights and two preset values for lights : one with the defaukt light and another with four lights, customized for spin rendering.
  • Adding a cycling mode in the browser. It is now possible to cycle once, to go on and back and still the classic cycle in loop.
  • Rebuild of the configuration files dialog: switching to GtkComboBoxes and adding auto-completion.
  • Improve French translation.
  • Extend minimal pick behavior (i.e. default mode) to allow distance measurements.
  • In pick/observe session, the little marks that identify references in pick mode, are now persistant during observe mode until the pick/observe session is closed.
  • Correct bugs 2 and 75.
  • The X11 backend mixed with the GTK interface is not supported anymore.
  • Modify the main interface : buttons related to the rendered file moved to the bottom bar on the rendering window.
  • Switch to a GtkComboBox for the list to select subpanel.
  • Update French translation.
  • Adding a status bar in the rendering window. This allows to show some basic informations as the description of the rendered file, the number of drawn nodes... This is only working if the rendering backend of this window is GTK (not X11).
  • Adding a minimal pick function on the third button as a default mode.
  • GUI improvements in the browser sub-panel and display of currently browse directory.
  • Adding JPG and PNG export image format, using GdkPixbuf.
  • GUI changings of the dump dialog to allow to tune some parameters for different file formats (e.g. the compression ratio in JPEG format). Adding the possibility to choose the export size for images and to add automatically the file extension if not is specified.
  • Changing default behavior (previously no action) to observe mode.
  • Adding a check box in the dataFile sub-panel to automatically load data file with the same name than the one of the rendered file.
  • Adding some preset shades in the dataFile sub-panel.
  • Allowing the possibility to use dataFile methods through the command line.
  • Displaying the color scale (in the dataFile sub-panel) even when several channels are changing if only one column is read.
  • Adding the choice of masquing algorithm in the plane sub-panel (using union or intersection).
  • Adding the possibility to specify in the command line some box translation.
  • Not translated in english. Not translated in english.
    v_sim-3.7.0/INSTALL0000644000353400050620000003660012216275134010622 00000000000000Installation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2011 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. HP-UX `make' updates targets which have the same time stamps as their prerequisites, which makes it generally unusable when shipped generated files such as `configure' are involved. Use GNU `make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. v_sim-3.7.0/NEWS0000644000353400050620000000036212215546214010263 00000000000000New features in version 3.5 =========================== - Vibrations and phonons representation. - Multi coloured maps. - Geometry diff, highlighting moving atoms. - Physical units. - Experimental Python module. - Visual angle measurements. v_sim-3.7.0/config.guess0000754000353400050620000012743212216275132012112 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-02-10' # This file 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, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner. Please send patches (context # diff format) to and include a ChangeLog # entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-gnueabi else echo ${UNAME_MACHINE}-unknown-linux-gnueabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) LIBC=gnu eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in i386) eval $set_cc_for_build if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then UNAME_PROCESSOR="x86_64" fi fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: v_sim-3.7.0/config.sub0000754000353400050620000010517612216275132011556 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-02-10' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file 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, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted GNU ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 \ | ns16k | ns32k \ | open8 \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze) basic_machine=microblaze-xilinx ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: v_sim-3.7.0/depcomp0000754000353400050620000004755612216275133011160 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2011-12-04.11; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, # 2011 Free Software Foundation, Inc. # 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, 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add `dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test "$stat" = 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/ \1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/ / G p }' >> "$depfile" rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: v_sim-3.7.0/install-sh0000754000353400050620000003325612216275132011576 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-01-19.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for `test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: v_sim-3.7.0/ltmain.sh0000644000353400050620000105204012215546512011406 00000000000000 # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1ubuntu1 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION="2.4.2 Debian-2.4.2-1ubuntu1" TIMESTAMP="" package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS%" test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; *) func_fatal_configuration "$modename: unknown library version type \`$version_type'" ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 v_sim-3.7.0/missing0000754000353400050620000002415212216275132011164 00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2012-01-06.13; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # 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, 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: v_sim-3.7.0/py-compile0000754000353400050620000001040012216275133011561 00000000000000#!/bin/sh # py-compile - Compile a Python program scriptversion=2011-06-08.12; # UTC # Copyright (C) 2000, 2001, 2003, 2004, 2005, 2008, 2009, 2011 Free # Software Foundation, Inc. # 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, 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . if [ -z "$PYTHON" ]; then PYTHON=python fi me=py-compile usage_error () { echo "$me: $*" >&2 echo "Try \`$me --help' for more information." >&2 exit 1 } basedir= destdir= while test $# -ne 0; do case "$1" in --basedir) if test $# -lt 2; then usage_error "option '--basedir' requires an argument" else basedir=$2 fi shift ;; --destdir) if test $# -lt 2; then usage_error "option '--destdir' requires an argument" else destdir=$2 fi shift ;; -h|--help) cat <<\EOF Usage: py-compile [--help] [--version] [--basedir DIR] [--destdir DIR] FILES..." Byte compile some python scripts FILES. Use --destdir to specify any leading directory path to the FILES that you don't want to include in the byte compiled file. Specify --basedir for any additional path information you do want to be shown in the byte compiled file. Example: py-compile --destdir /tmp/pkg-root --basedir /usr/share/test test.py test2.py Report bugs to . EOF exit $? ;; -v|--version) echo "$me $scriptversion" exit $? ;; --) shift break ;; -*) usage_error "unrecognized option '$1'" ;; *) break ;; esac shift done files=$* if test -z "$files"; then usage_error "no files given" fi # if basedir was given, then it should be prepended to filenames before # byte compilation. if [ -z "$basedir" ]; then pathtrans="path = file" else pathtrans="path = os.path.join('$basedir', file)" fi # if destdir was given, then it needs to be prepended to the filename to # byte compile but not go into the compiled file. if [ -z "$destdir" ]; then filetrans="filepath = path" else filetrans="filepath = os.path.normpath('$destdir' + os.sep + path)" fi $PYTHON -c " import sys, os, py_compile files = '''$files''' sys.stdout.write('Byte-compiling python modules...\n') for file in files.split(): $pathtrans $filetrans if not os.path.exists(filepath) or not (len(filepath) >= 3 and filepath[-3:] == '.py'): continue sys.stdout.write(file) sys.stdout.flush() py_compile.compile(filepath, filepath + 'c', path) sys.stdout.write('\n')" || exit $? # this will fail for python < 1.5, but that doesn't matter ... $PYTHON -O -c " import sys, os, py_compile files = '''$files''' sys.stdout.write('Byte-compiling python modules (optimized versions) ...\n') for file in files.split(): $pathtrans $filetrans if not os.path.exists(filepath) or not (len(filepath) >= 3 and filepath[-3:] == '.py'): continue sys.stdout.write(file) sys.stdout.flush() py_compile.compile(filepath, filepath + 'o', path) sys.stdout.write('\n')" 2>/dev/null || : # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: v_sim-3.7.0/ChangeLog.fr0000644000353400050620000015421212216004361011741 00000000000000 Ensemble des changements amenant à la branche 3.7.x.
  • Dessine des lignes noires autour des plans et à leurs intersections.
  • Les axes peuvent maintenant aussi représenter la base de la boîte et être positionnés n'importe où dans la fenêtre de rendu.
  • Ajoute une légende des couleurs pour la colorisation.
  • L'exportation SVG prend correctement en charge les nœuds partiellement visible aux bords de la zone de rendu.
  • Permet l'ajout de définition de dégradés dans le fichier ressource.
  • Les ressources peuvent maintenant être enregistrées dans un fichier XML qui peut être identique aux autres fichiers XML générés par V_Sim (comme les plans…).
  • La fenêtre pour sauvegarder les ressources propose désormais aussi les fichiers en .res du répertoire courant dans la liste déroulante de propositions.
  • Le greffon de scriptage Python affiche la sortie d'erreur et la sortie standard des scripts python.
  • La coloration des liaisons en fonction de la distance est maintenant effectué par lien et non plus pour tous les liens en même temps.
  • Ajout de la possibilité de définir des fonctions pour le masquage des noeuds en fonction des données de colorisation.
  • Support complet de la partie moteur et rendu de V_Sim pour l'introspection, ainsi qu'un support partiel de l'interface utilisateur.
  • Le greffon PythonGI ajoute un nouvel onglet permettant de tracer les valeurs d'un champ scalaire suivant une ligne. Le rendu du graphe est fait par Matplotlib.
  • En utilisant l'introspection, les fichier CNT de VASP deviennent lisibles.
  • Le nouveau greffon BigDFT ajoute un onglet permettant de contrôler et de visualiser les paramètres spécifiques à BigDFT comme les grilles ondelettes, la consommation mémoire, les paramètres des pseudo-potentiels... Ce greffon est compatible avec la version linéaire du code. Il permet aussi de démarrer ou de superviser un calcul distant de BigDFT, tout en rapatriant la densité, les potentiels, les fonctions d'ondes...
  • Ajoute un parser natif YAML en suivant le format définit par BigDFT.
  • Ajoute des raccoursis clavier ('Ctrl+v') à la fenêtre de rendu permettant d'ouvrir le sélecteur d'orientation.
  • Sauve les préférences liés aux caméras dans le fichier ressources.
  • Ajoute une barre de recherche à la fenêtre de rendu (Ctrl+f) permettant de mettre en évidence les noeuds à partir de leur numéro.
  • Support partiel de la possibilité pour l'image de fond de suivre la caméra de visualisation (zoom).
  • Ajoute des entrées dans le fichier ressources permettant de positionner et de mettre à l'échelle la légende des cartes colorées.
  • Rend le choix de normalisation manuelle effectif par colonne dans l'onglet de colorisation.
  • Support du format de fichier de fonctions d'ondes de BigDFT par un greffon dédié.
  • Ajoute la possibilité de tracer des flèches pour les forces directement dans le rendu atomique sans passer par le rendu spin.
  • Implémente le support des forces dans les formats ASCII ou xyz.
  • Ajoute un greffon prenant en charge les formats compressés (comme tar.gz ou tar.bz2).
  • Ajoute des raccoursis claviers (« n » et « p ») pour charger les fichiers suivants ou précédent dans la liste du navigateur.
  • Ajoute la possibilité de choisir entre les noeuds mis en évidence ou ceux non mis en évidence lors du masquage dans la fenêtre interactive.
  • Implémente le support des fichiers récents. Les fichiers ouverts et les exportations sont maintenant listés dans la partie fichiers récents du navigateur de fichiers.
  • Ajoute la possibilité de ne coloriser les noeuds que si leur valeur se trouve dans la plage de valeurs choisies.
  • Ensemble des changements amenant à la branche 3.6.x.
  • Corrige l'absence de texte lors d'exportation en image.
  • Modifie l'affichage de la prévisualisation dans la fenêtre d'ouverture pour éviter de prendre le fichier courant quand le chargement est long.
  • Corrige la numérotation des noeuds dans l'historique de mesure et limite la liste à 6 valeurs seulement.
  • Corrige le fonctionnement de la mise à l'évchelle des spins en fonction du module.
  • Corrige un bug crashant dans la gestion du rendu couleur après plusieurs rechargement d'un fichier avec des mesures.
  • Mise à niveau du greffon ABINIT pour être compatible avec les versions 6.8.x.
  • Corrige une corruption mémoire dans le widget de dessin des distribution de longeurs de liaisons.
  • Rétablit le fonctionnement de la fonction de glisser-déposer.
  • Corrige le dessin des liaisons lorsque des translations sont utilisées sur la ligne de commande.
  • Corrige l'exportation dans le navigateur de fichiers pour les fichiers à multiple jeu de données.
  • Corrige le problème de crash lors de l'exportation en image avec les drivers ATI propriétaires.
  • Affiche les coordonnées en valeurs cartésiennes ou en valeurs réduites dans la fenêtre de rendu (cf. le panneau de configuration).
  • Conserve le niveau de zoom entre deux fichiers si la boîte change de taille (cf. l'option du panneau de géométrie).
  • Modifie les cartes colorées pour utiliser un maillage adaptatif. La légende affiche aussi désormais des repères pour les valeurs d'isoligne..
  • Ajoute des raccoursis claviers pour les paramètres de la caméra de la zone de rendu..
  • Ajoute un support partiel des densités aux format XSF.
  • Ajoute une exportation au format ABINIT pour la partie cristal.
  • Ajoute une option de transparence pour le rendu des cartes colorées.
  • Début de support de GObject-Introspection, permettant le scriptage (en Python, Javascript, ...).
  • La fenêtre relative à ABINIT propose maintenant de choisir différentes valeurs de tolsym et liste l'ensemble des symétries du système avec leur nom.
  • Ajoute une barre de progression lors du chargement d'un fichier trop long ainsi qu'un moyen d'annuler un chargement en cours.
  • V_Sim respecte maintenant la spécification FreeDesktop relative aux icônes.
  • Démonstration des possibilités de scriptage Python au travers du support des fichiers CNT de VASP.
  • Ajoute des raccoursis claviers à la fenêtre de rendu (exporter, recharger et ouvrir).
  • Ajoute la possibilité en ligne de commande d'exporter dans les formats connus d'OpenBabel.
  • Modifie la fenêtre de dialogue des liaisons pour permettre la dénition liaison par liaison des méthodes de rendu. On peut maintenant utiliser en même temps les liaisons filaires et les liaisons cylindriques.
  • Ajoute le calcul d'un g(r) et ajoute une interface pour la visualiser dans la fenêtre des liaisons. Les échelles liénaire et logarithmique sont disponibles, ainsi qu'un filtrage sur les types de liaisons.
  • Trie les liaisons par longueur.
  • Exporte les différences de géométrie dans le format ASCII en temps que mot-clef.
  • Ajoute un mot-clef dans le format ASCII pour stocker une valeur d'énergie. Cette valeur est utilisée pour coloriser les chemins.
  • Étend le format XML de V_Sim en ajoutant les chemins.
  • Montre un message plus clair dans le navigateur de fichiers lorsque le parcours du disque est trop long.
  • Ajoute une option de ligne de commande pour borner les valeurs pour la carte de coleurs.
  • Ajoute un format d'exportation purement vectoriel en PDF grâce à Cairo.
  • Ajoute le support du brouillard dans les exportations vectorielles.
  • Ajoute la colorisation par fichier de données lors d'une exportation vectorielle.
  • Ajoute une ressource pour modifier le rayon de la sphère de mise en valeur.
  • Implémente une légende donnant la taille de la boîte.
  • Implémente une exportation au format CIF au travers d'OpenBabel.
  • Implémente l'ajout automatique de deux surfaces en un clic dans le cas d'un fichier de fonctions d'ondes. La colorisation est aussi choisie astucieusement.
  • Utilise les dégradés pour la colorisation des liaisons en fonction de la longueur.
  • Ajoute une fonction de visualisation de chemins.
  • Renomme l'onglet « boîte » en « géométrie » pour y mettre toutes les actions relatives à la géométrie, i.e. les translations, l'expansion, les unités, les chemins...
  • Ensemble des changements autour de la branche 3.5.x.
  • Corrige un bug affectant la borne supérieur des sélecteur d'identifiants de noeuds après un changement de base.
  • Corrige la position des atomes en mode de rendu spin.
  • Corrige les erreurs de compilation signalées par GCC >= 4.4 (merci à Thierry Thomas pour son patch).
  • Corrige un crash lors du chargement d'un fichier cube avec des numéros atomiques hors limites.
  • Corrige l'absence d'affichage des informations sur les noeuds après une exportation en image.
  • Corrige un problème de mise à jour de la légende lors du chargement d'un fichier avec un nombre variable de noeuds par éléments.
  • Corrige un crash lors d'une exportation en ligne de commande.
  • Corrige une erreur de classement dans le navigateur de fichiers pour les fichiers à multiple jeu de données.
  • Améliore l'affichage des modifications dans la fenêtre à propos.
  • Corrige le positionnement des atomes dans le cas de boîtes non ortho-rhombic dans des fichiers XSF.
  • Ajoute les coordonnées réduites dans le cas des fichiers XYZ périodiques.
  • Positionne correctement les atomes dupliqués en conditions aux bords libres.
  • Corrige une boucle bloquante dans la fenêtre de dialogue d'exportation dans le cas d'un choix erronée de format de fichier.
  • Associe correctement la colorisation aux noeuds dans le cas où ceux-ci ne sont aps triés dans le fichier d'entrée.
  • Corrige plusieurs messages d'avertissement concernant en vrac, le sélecteur de couleur, l'affichage de textes dans la zone de rendu OpenGL ou le chargement de fixhiers XML de données.
  • Empêche l'exportation de largeurs de liaison supérieures à 10.
  • Évite d'afficher des avertissements au chargement d'un fichier de données contenant des informations partielles.
  • Réaffiche correctement les surfaces masquées lorsque les plans ne sont plus utilisés.
  • Permet le chargement de fichiers XYZ ayant des colonnes supplémentaires dans un format différent de celui d'un fichier de vibration.
  • Corrige une erreur empêchant l'ouverture d'une fenêtre de dialogue lors d'une erreur d'exportation.
  • Corrige une erreur dans la lecture des fichiers cube, sur la position des atomes, lorsque les boîtes ne sont pas orthorombiques.
  • Corrige une erreur de segmentation déclenchée par la touche « r » alors qu'aucune caméra n'a été sauvegardée.
  • Corrige la définition des super-cellules dans le cas non-orthorombic pour le greffon OpenBabel. Merci à Atz Togo pour son patch.
  • Corrige une mauvaise lecture des fichiers ASCII sous Macintosh et Windows.
  • Corrige les problèmes de fichiers liés à l'utilisation de l'action « ouvrir avec » sous Windows.
  • Ajoute le support des angles dans les fichiers de valeurs XML.
  • Les bulles d'aide du navigateur montrent les répertoires précédents et suivants.
  • Dessine une légende lors de l'exportation SVG.
  • Ajoute un moyen de changer la base en pointant des atomes comme nouveaux sommets.
  • Déclare dans le fichier ressources tous les paramètres de réglage du diff géométrique (forme et longueur des flèches, seuils...).
  • Prend en compte les conditions aux bords pour choisir correctement le « haut » de la boîte (l'axe y est l'axe du nord dans les fichiers surface).
  • Ajoute un onglet dans la fenêtre interactive donnant accès aux informations de symétries, calculées par ABINIT (groupe d'espace, atomes équivalents...).
  • Ajoute un raccoursis clavier utilisant la touche « home » pour passer d'une fenêtre à l'autre.
  • Corrige les défauts visuels sur le rendu des liaisons cylindriques.
  • Ajoute un support des phonons dans le format ASCII.
  • Implémente l'animation des phonons dans les solides, en prenant en compte la partie imaginaire des déplacements atomiques et la phase introduite par the produit q.r.
  • Apparition d'une icône cliquable dans la fenêtre de rendu donnant accès aux positions sauvegardées de la caméra.
  • Implémente une façon de visualiser les différences de positions entre deux fichiers en affichant des petites flèches sur les noeuds..
  • Ajoute le support d'étiquettes associées aux noeuds. Ces étiquettes peuvent être affichées comme sont affichés les types ou les numéros des noeuds. On peut modifier ces étiquettes dans la fenêtre de dialogue de sélection.
  • Modifie le format pour permettre l'ajout d'étiquettes sur les noeuds.
  • Ajoute des boutons « précédent » et « suivant » dans le navigateur.
  • Ajoute une représentation des phonons grâce à une visualisation des vibrations ou grâce à des petites flèches.
  • Implémente la colorisation en fonction des coordonnées.
  • Ajoute une représentation des angles.
  • Ajoute le support des étiquettes dans les fichiers ASCII.
  • Ajoute un mot clef de condition aux bords pour les fichiers ASCII.
  • Lit une colonne pour les phonons dans les fichiers XYZ.
  • Ajoute un onglet pour la repésentation des phonons, la liste des modes disponibles et quelques paramètres de réglage.
  • Change la sélection à la souris pour faciliter l'accès à l'outil de mesure. Ajoute aussi quelques boutons dans la fenêtre de rendu pour mesurer ou annuler.
  • Ajoute un facteur d'échelle à la représentation des noeuds dans l'onglet de colorisation.
  • Implémente une légende affichant un cadre avec le nom des éléments, leur nombre et leur représentation.
  • Ajoute une repésentation torique en plus des représentations existantes (ellipse, cube...).
  • Ajoute une possibilité de masquer les noeuds non mis en évidence.
  • Implémente le support pour plusieurs carte colorées en même temps.
  • Dessine les bords des plans colorés de façon lisses avec un surlignage noir.
  • Ajoute une capacité de glisser-déposer à la zone de rendu OpenGL pour charger un fichier.
  • Modifie le format de fichier ASCII pour permettre de rentrer les coordonnées en unités réduites et de définir la boîte en suivant la longueur. des vecteurs de base et leurs angles.
  • Crée une exportation pour les plans de coupe colorés, soit au format PDF, soit au format SVG.
  • Modifie le comportement des touches 's' et 'r' pour sauvegarder ou restaurer la position de la camera pour fonctionner comme un anneau à la place de ne conserver qu'une unique position.
  • Ajoute une exportation au format XYZ.
  • Implémente dans l'onglet « boîte » la possibilité de changer rapidement les distances entre les noeuds suivant des unités habituelles (bohr, angströms...).
  • Dans l'onglet de modification de géométrie, ajoute une possibilité de duplication des noeuds listés.
  • Début d'écriture de fichiers de liaison pour l'appel de V_Sim depuis Python. Il est possible de créer une fenêtre de rendu, d'y charger un fichier ou encore de construire directement des éléments, des noeuds ou un système atomique. Les plans sont aussi fonctionnels.
  • Implémentation d'un greffon pour le support des fichiers Cube de Gaussian, utilisés entre autre aussi dans SIESTA.
  • Extension du format de fichier XML gérant les plans. Celui-ci peut maintenant stocker d'autre valeur interne à V_Sim, comme les noeuds mis en évidence, les valeurs des iso-surfaces crées ou les distances mesurées.
  • Ajout du support des fichiers D3 posi (concaténation de fichiers D3, utilisé par exemple pour la réalisation de films).
  • Suppression de l'onglet des « mises en évidences », fonction transférée dans l'onglet de sélection grâce à l'ajout de la touche Control. Meilleure interaction entre les noeuds sélectionnés et les noeuds mis en évidence (possibilité de passer de l'un à l'autre).
  • Ajout d'une possibilité de tri dans la liste des noeuds sélectionnés (tri sur l'identifiant ou sur le genre).
  • Ajout d'une colonne affichant la date des fichiers dans le navigateur.
  • Ajout des dégradés non linéaires, d'une échelle logarithmique adaptée aux données centrées autour de zéro et ajout de la possibilité de choisir la couleur des isolignes.
  • Réorganisation partielle de la fenêtre de dialogue des liaisons (le filtre a été déplacé en haut et les boutons d'ajout et de suppression sont maintenant à droite de la liste des liaisons).
  • Ensemble des changements autour de la branche 3.4.x.
  • Corrige le disfonctionnement de l'option -d lorsqu'elle est utilisée en même temps que l'option -u.
  • Corrige plusieurs fuites mémoires intervenant durant la lecture de fichiers d'entrée ou dans certaines routines de dessin.
  • Rend les touches 's' et 'r' à nouveau opérantes après l'ouverture d'une fenêtre de dialogue depuis la fenêtre de rendu.
  • Corrige un crash quand on supprime des noeuds avec des marques de distances.
  • Corrige la fonction de rechargement automatique, cassée dans les versions 3.4.x.
  • Corrige l'affichage des chemins dans le navigateur quand des caractères UTF-8 sont utilisés.
  • Corrige un saut de la caméra dans le mode interactif lors d'un clic droit avec déplacement.
  • Termine aussi une session interactive lorsque la fenêtre de dialogue est fermée par l'intermédiaire du gestionnaire de fenêtre.
  • Déconnecte les signaux dans le dialogue de choix de l'orientation lorsque l'object est détruit.
  • Modifie la fenêtre de sélection de spin pour corriger un problème de validation.
  • Corrige un problème de dessin des liaisons cylindriques sous certaines conditions.
  • Supprime plusieurs "assertion fails" au chargement d'un nouveau fichier.
  • Rend fonctionnel le choix « tous les éléments » dans l'onglet « éléments » pour les paramètres atomiques en mode rendu de spins.
  • Corrige le problè du caractè tabulation dans les fichiers ASCII.
  • Corrige un disfonctionnement dans la fenêtre des liaisons lorsque la fonction de trie est utilisée. Les modifications effectuées dans le treeview sont alors incohérentes..
  • Corrige un problème dans le mode marcheur pour la visualisation où la boîte disparaît parfois.
  • Corrige l'expansion des noeuds qui amène dans certains cas à dupliquer le même noeud plusieurs fois au même endroit.
  • Corrige le comportement inattendu quand on sélectionne une zone de 0 pixel de côté.
  • Corrige le nombre affiché de noeuds sélectionnés dans l'onglet de modification de la géométrie.
  • Corrige l'erreur à la lecture du fichier de ressources quand le rayon des liaisons cylindrique est égal au rayon minimum.
  • Implémente l'exportation des motifs pour les liaisons filaires.
  • Corrige plusieurs Critical Warnings dans la routine drawDataOnNode() dans la fenêtre d'interaction.
  • Corrige un crash quand les données courantes disparaissent dans la fenêtre de dialogue interactive.
  • Corrige les permissions lors de la création du répertoire de cionfiguration de V_Sim.
  • Corrige un bug dans l'affichage du menu des onglets.
  • Change la façon de trouver le nom d'un module depuis son nom de fichier pour prendre en charge les modules du type toto.1.0.1.so.
  • Corrige un problème à l'édition des liens sous MacOS à cause de variables dans les .h.
  • Contourne le crash lors de l'exportation en image pour les serveur X fonctionnant avec AIGLX et une version de GLX antérieure à la 1.3.
  • 3.4.0.1 : corrige une erreur de segmentation dans le greffon pour ABINIT.
  • 3.4.0.2 : corrige une erreur de segmentation lorsqu'un objet VisuData est détruit.
  • 3.4.0.2 : ajoute un filtre XML sur les fichiers dans le sélecteur pour les plans.
  • 3.4.0.2 : corrige un bug dans le sélecteur de coleurs pour les surfaces.
  • 3.4.0.2 : importe le répertoire debian depuis l'archive officielle et le modifie pour l'adapter à la version 3.4.0 (fait à l'origine pour la 3.3.3).
  • 3.4.0.3 : fait pointer le répertoire legaldir sur datadir.
  • 3.4.0.3 : modifie l'installation des greffons pour éviter de copier des fichiers quand les greffons ne sont pas compilés. Déplace aussi les images dans le répertoire pixmapsdir.
  • Ajoute les axes dans l'export SVG.
  • Corrige quelques bugs (la vignette de prévisualisation, le chargeur d'ABINIT) et termine la traduction.
  • Implémente la possibilité d'afficher des images en fond de la zone de rendu.
  • Modifie le fonctionnement du zoom lors de l'extension d'une boîte, la vue reste maintenant la même.
  • Ajoute le tracé de lignes d'iso-valeurs sur la carte de couleurs.
  • Implémentation d'une sélection de groupe ainsi que d'un déplacement de groupe dans la fenêtre d'actions interactives.
  • Amélioration du greffon XSF. Il est maintenant possible de lire les vecteurs associés aux n~uds (pour dessiner les forces ou des spins).
  • Il est possible de compiler V_Sim avec le parser d'ABINIT, permettant ainsi de lire directement les fichiers d'entrée de celui-ci. Pour cela, il faut une version modifiée du code ABINIT qui devrait être publiquement disponible à partir des versions 5.6.x. Les datasets sont pris en compte ainsi que le système de construction de géométrie. Dans ce cas, la boîte résultante est affichée. La limitation actuelle est quand nband doit être calculé. Comme les fichiers de pseudo-potentiels ne sont pas chargés, il n'est pas possible alors de connaître nelect.
  • Ajoute un système permettant d'estimer un encadrement pour les liaisons premiers voisins d'un système.
  • Possibilité de dessiner des liaisons filaires et la boîte avec un motif.
  • Implémentation minimale d'un greffon lisant les fichiers de position XSF.
  • Ajout d'une possibilité de tracé des plans colorés en utilisant une échelle logarithmique.
  • Modification du parseur XYZ pour lire les fichiers d'animation. Le navigateur a été modifié en conséquence pour afficher les différentes positions dans un même fichier.
  • Ré-implémentation de la vision stéréo (supprimée depuis la version 3.0.0). Les paramètres, comme l'écartement des yeux, sont réglables dans le panneau OpenGL.
  • Ajoute le support du déplacement de la caméra au clavier dans le mode d'observation de la fenêtre de rendu. Les touches Page-Suivante et Page-Précédente servent pour le zoom. La touche « s » permet de « sauvegarder en mémoire la position courante de la caméra ». En contre-partie, la touche « r » permet de revenir dans la dernière position sauvegardée.
  • Implémentation d'un maillage non uniforme pour la grille d'un champ scalaire.
  • Support minimal de l'exportation en SVG. Pour le moment, la boîte et les n~uds seulement sont dessinés.
  • Modification possible des coordonnées dans le tableaux des n~uds sélectionnés (comme ça l'était pour les informations de spin ou les données de colorisation). Ajoute la possibilité d'afficher sur les atomes des informations.
  • Meilleure intégration de la bibliothèque OpenBabel, grâce à l'utilisation du symbole atomique à la place de son étiquette. Utilisation aussi des couleurs et du rayon atomique d'OpenBabel quand l'élément n'est pas déjà connu de V_Sim. Enfin, les liaisons sont tracées dans la mesure du possible en suivant les indications du fichier d'entrée.
  • Ajout d'un filtre dans la fenêtre des liaisons permettant de n'afficher que celles contenant une espèce chimique particulière.
  • Implémentation d'une façon de répliquer la boîte dans le cas de systèmes périodiques. Adaptation des autres fonctionnalités de V_Sim à la duplication (agrandissement des plans et des cartes de couleurs, réplication des informations de colorisation, tracé pointillé des boîtes répliquées...).
  • Séparation de l'onglet boîte & axe en deux onglets séparés. Déplacement aussi de la gestion des translations périodiques dans le nouvel onglet boîte. Ajout enfin dans ce nouvel onglet de la gestion de la réplication.
  • Ajoute la capacité d'utiliser en ligne de commande la duplication ainsi que les cartes de couleur.
  • Modification de l'onglet de géométrie dans la fenêtre d'actions de la souris pour permettre l'ajout ou la suppression de n~uds.
  • Support de GtkGlExt comme alternive à l'utilisation du widget interne OpenGL.
  • Ajoute une prévisualisation dans la fenêtre d'ouverture d'un fichier. La boîte et les éléments sont simplement dessinés dans l'état courant de la caméra.
  • Implémentation d'un mode de rendu « lisse souligné » affichant un trait autour des polygones.
  • Rend lisse le masquage par les plans des surfaces en ajoutant des polygones où nécessaire pour éviter d'avoir des bords en dentelles.
  • Améliore la vitesse de chargement du navigateur et ajoute une possibilité de chargement en un clic pour les méthodes de rendu à multiple fichiers comme le rendu de spin.
  • Utilise maintenant la spécification XDG pour l'emplacement des fichiers de configuration personnels. Le précédent repertoire $HOME/.v_sim est toujours lu néanmoins.
  • Modifie la gestion des ressources des surfaces dans l'onglet : chaque surface peut maintenant ne plus avoir de nom. Dans ce cas, ses propriétés ne sont pas partagées avec d'autres surfaces. Les deux fenêtres de dialogue permettant de changer les ressources (anciennement « modifier la surface courante » et « modifier toutes ») ont été fusionnées. Un boutton particulier a été ajouté dans l'onglet pour permettre l'ajout de plusieurs surfaces en même temps (comme dans le dialogue de construction). Le boutton supprimer commence maintenant par retirer toutes les surfaces d'un champ scalaire avant de retirer le champ lui-même.
  • Première implémentation de l'effet de masquage des plans sur les surfaces.
  • Rend l'effet masquant des plans sélectif par surface et par élément (voir la colonne ad hoc de l'onglet surface ou la case à cocher de l'onglet élément).
  • Les distances sont modifiables directement dans la liste dans la fenêtre de gestion des liaisons. Une colonne a été ajoutée permettant d'afficher par type de liaison les distances.
  • Ajout d'une option dans l'onglet de navigation permettant de visualiser récursivement le contenu d'un répertoire. Ajout aussi de la capacité de naviguer dans plusieurs répertoires en même temps.
  • Implémentation d'un nouveau dialogue permettant de choisir l'orientation de trois façons différentes : l'une dans un repère orthonormal, une autre dans le repère de la boîte ou enfin en suivant les coordonnées sphériques.
  • Ensemble des changements ayant aboutis à la branche 3.3.x.
  • Correction de la position de la caméra quand la fenêtre n'a pas un rapport d'aspect unitaire.
  • Correction d'une fuite de mémoire lors de l'exportation en image avec la XLib.
  • Correction d'une fuite mémoire dans le dialogue de sauvegarde des préférences.
  • Ajout d'une page de manuel.
  • Utilisation d'un format correct pour le fichier v_sim.ini sous Windows.
  • Correction d'un bug empêchant la lecture des fichiers D3 sous Windows.
  • Correction d'un bug lorsque le répertoire racine est choisi (dans le navigateur par exemple).
  • Correction d'un bug empêchant le lancement de V_Sim sur MacOSX et sur Linux avec carte Intel.
  • Correction d'un bug dans l'outil de colorisation où le choix de la normalisation n'était pas conservé lors d'un chargement automatique.
  • Correction d'un bug affectant les boîtes non orthogonales (aussi bien la structure atomique que les champs scalaires).
  • Correction d'un bug dans la lecture des fichiers D3.
  • Corrige un erreur interne impliquant un surnombre d'association de signaux aux objects VisuData.
  • Ajout d'un rendu sous forme de points des éléments en mode atomique pour afficher une grille ou obtenir un rendu plus rapide.
  • Utilisation d'un format binaire pour la description de l'orientation des spins.
  • Meilleure gestion des fenêtres entre elles : la fenêtre de commande est mise peut être placée au-dessus à partir de la fenêtre de rendu par exemple.
  • Légère refonte de la fenêtre de sauvegarde des ressources : on peut maintenant sauvegarder uniquement les ressources en rapport avec l'objet dessiné.
  • Fin de l'implémentation de la fonction de détachement des onglets. Leur position et leur taille sont maintenant modifiables et enregistrées dans le fichier de paramètres.
  • Modification des scripts de construction pour permettre la compilation des greffons sous Windows.
  • Modification de la gestion de la transparence des iso-surfaces, possibilité de ne recalculer celle-ci qu'à la fin d'un mouvement et non tout le long.
  • Plusieurs corrections de bug (lecture des ressources des iso-surfaces, calcul des normales aux surfaces, rechargement automatique d'un fichier).
  • Amélioration de la gestion du nom des surfaces et des propriétés de couleurs associées (passage en ligne de commande du nom des surfaces à créer dans l'option -v). Modification dans ce même onglet du comportement des boutons de sélection pour permettre d'appliquer les changements à l'ensemble des surfaces d'un même fichier.
  • Enregistrement de l'option de rendu d'un plan dans le fichier XML.
  • Mise à jour des fichiers de traduction pour la future version 3.3. La traduction française est complète (ou suposée).
  • Implémentation du support des champs scalaires encodés selon le format de fichier défini par Nanoquanta. Pour le moment, seul les champs scalaires réels (densités) sans information de spin sont chargeables. La lecture de fichiers Nanoquanta v1.3 est désormais possible.
  • Ajout d'un onglet permettant le dessin de plans colorés en fonction d'un champ scalaire chargé. Une légende de l'échelle de couleur est aussi dessinée.
  • Chargement automatique de fichiers de densité ou de surface et passage des options de dessin des surfaces en ligne de commande.
  • Gestion plus centralisée et uniforme des couleurs et des informations sur la lumière.
  • Support des fonctionnalités en rapport avec les iso-surfaces par la ligne de commande.
  • Ajout du support des fichiers de potentiel et de densité directement dans l'onglet de gestion des isosurfaces. Le passage par l'outil de conversion n'est plus nécessaire. Implémentation aussi de la fonction permettant d'afficher plusieurs surfaces de fichiers/sources différents, directement dans l'onglet.
  • Ajout de la fonction d'ajout/suppression d'isosurfaces à la volée dans l'onglet surfaces. La fonction d'ajout ne fonctionne que pour les fichiers de densité/potentiel.
  • Support complet des onglets détachables et associables.
  • Prise en charge du module dans le mode de rendu spin permettant de tracer des champs vectoriels avec toutes leurs informations (direction et norme). Les objets dessinés en mode spin sont alors mis à l'échelle en fonction de la valeur du module lue dans le fichier d'entrée de spin.
  • Fin de l'implémentation du la couche d'interface avec la bibliothèque OpenBabel. Tous les formats supportés en lecture par OpenBabel sont maintenant lisible dans V_Sim.
  • Création d'un outils pour visualiser et manipuler les données associées aux noeuds comme les informations de colorisation ou encore la direction et le module en mode spin. Dans ce mode, ces valeurs sont modifiables à la volée.
  • Changement dans l'enregistrement des ressources liées au mode de spin. Il est conseillé de réenregistrer ses fichiers de ressources car trois mots-clefs sont devenus obsolètes.
  • Quelques améliorations de l'interface.
  • Ajout du support de greffons. Ceux-ci se chargent automatiquement dès qu'ils se trouvent dans le répertoire d'installation ou dans le répertoire utilisateur ${HOME}/.v_sim.
  • Implémentation partielle de la norme NANOQUANTA v1.2 permettant le chargement de positions atomiques (greffon).
  • Interfaçage avec la bibliothèque OpenBabel, mais rien n'est chargé pour le moment (greffon).
  • Début d'implémentation de la fonctionnalité de détachement des onglets.
  • Remplacement du hack de la zone de rendu OpenGL par une implémentation minimale d'un widget OpenGL. Ceci à pour conséquence la suppression du support du backingstore, remplacé par une gestion des événements « expose ».
  • Amélioration de l'option de rendu spin « hiding-mode », permettant de choisir entre l'affichage permanent des spins, le masquage des spins de moment nul ou le rendu atomique pour ces derniers.
  • Support du rendu atomique en plus du rendu spin.
  • Ajout en mode spin et en mode atomique d'une forme élipsoïdale.
  • Support continu de la mesure de distances (aussi bien en mode courant que dans la fenêtre d'observation).
  • Ensemble des changements ayant donné lieu à la branche 3.2.x.
  • Correction d'un bug de lecture dans la fenêtre de dialogue de convertion des isosurfaces, lorsqu'un fichier de densité/potentiel est chargé.
  • Correction d'un plantage lors de l'utilisation des données liées à la boîte et aux axes alors qu'aucun fichier n'est chargé.
  • Correction d'un plantage dans l'onglet des isosurfaces lorsqu'on fait défiler la liste alors qu'elle n'a qu'une unique entrée.
  • Correction d'un plantage dans l'onglet de colorisation.
  • Correction d'un bug des machines 64bits empêchant la rotation de la caméra dans la fenêtre d'observation.
  • Correction d'une faute d'orthographe dans la traduction française.
  • Implémentation d'une fenêtre de dialogue d'avertissment au moment de quitter. Cette fenêtre est désactivable par une préférence du fichier « v_sim.par » ou en cochant une case dans cette fenêtre.
  • Ajout d'un fonction d'import-export des données de plans. Le format retenu est un XML simple contenant la définition de la géométrie du plan (normale et distance à l'origine), son état de masquage et sa couleur. Elle contient pas toutefois si le plan est affiché ou non.
  • Implémentation des mouvements contraints selon les axes x, y ou z dans l'outils de déplacement des noeuds.
  • Choix automatique de l'action associée à un onglet quand celui-ci est sélectionné dans la denêtre d'actions interactives.
  • Création d'une nouvelle action permettant de déplacer les noeuds. On peut déplacer les noeuds en glisser-déposer dans le plan de l'écran.
  • Ajout d'une exportation an ASCII avec le choix de sortir ou non les noeuds visibles.
  • Addition d'une interface dans l'onglet des plans permettant le déplacement automatique du plan sélectionné (à la manière du défilement automatique dans l'onglet navigateur).
  • Création d'une nouvelle action pour marquer les noeuds (que l'on souhaite suivre...). Cette action dessine des cadres autours des éléments.
  • Modifications internes supprimant les pointers globaux, notamment dans opengl.c et visu_data.c.
  • VisuData est maintenant un GObject et héberge les signaux OpenGL, Nodes et Elements ; signaux auparavant déclarés dans visu_object.
  • Dans la fenêtre de sélecion, les distances repérées restent affichées sur la fenêtre de rendu et ce aussi longtemps que désiré.
  • Ajout d'une action de masquage des éléments dans l'onglet de colorisation. Ce masquage est piloté par les valeurs lues dans une colonne du fichier de données associé.
  • Possibilité de choisir par élément dessiné le type de rendu (lisse, « fil de fer »...). Par exemple, on peut choisir de dessiner les atomes de façon lisse alors que les iso-surfaces sont affichées en fil de fer (nécessite GTK+2.6).
  • Ajout d'une valeur permettant d'ajuster la puissance des lumières utilisées dans l'onglet OpenGL. De plus, deux éclairages prédéfinis sont proposés : celui, classique, de la lumière unique et un nouveau, plus adapté au mode de rendu de spins, composé de quatre lumières.
  • Ajout d'un mode de parcours de la liste des fichiers dans le navigateur. On peut désormais ne lire la liste qu'une fois, en boucle aller-retour ou classiquement en boucle simple.
  • Refonte de la boîte de dialogue des fichiers de configuration : passage à des GtkComboBox et ajout de la complétion automatique.
  • Mise à jour de la traduction française.
  • Amélioration du mode minimal de sélection (c'est-à-dire le mode par défaut) en permettant les mesures de distances.
  • Lors d'une session de sélection/observation, les petites marques servant à identifier les références (en mode sélection), sont maintenant persistantes durant le mode d'observation et ce jusqu'à ce que la session soit terminée.
  • Correction des bugs 2 et 75.
  • Le support en X11 de la fenêtre de rendue en même temps que l'interface principale en GTK n'est plus supporté.
  • Modifications de l'interface principale : les boutons en rapport avec le fichier rendu ont été déplacés dans la la barre de la fenêtre OpenGL.
  • Passage à une GtkComboBox pour la gestion de la liste des onglets accessibles.
  • Amélioration de la traduction française.
  • Ajout d'une barre d'état dans la fenêtre de rendu, permettant d'afficher des informations diverses dont le commentaire associé au fichier rendu par exemple. Ceci ne fonctionne qu'avec un rendu GTK.
  • Ajout d'un mode pick minimal sur le troisième bouton comme comportement par défaut.
  • Modification de l'interface dans l'onglet de navigation, et ajout du répertoire courant affiché.
  • Ajout de l'exportation en JPEG et PNG via l'utilisation des GdkPixbuf.
  • Modification de l'interface d'exportation pour permettre le choix d'options selon les formats de fichiers (qualité JPEG...), une case à cocher permettant d'ajouter automatiquement l'extension si besoin et une réglage possible de la taille de l'image à exporter.
  • Passage au mode « observe » par défaut et de façon continue.
  • Ajout d'une option de chargement automatique des fichiers de colorisation.
  • Ajout de dégradés de couleurs prédéfinis dans l'onglet de colorisation.
  • Passage en ligne de commande des options de colorisation (fichier, colonne de données, dégradé prédéfini...).
  • Affichage de l'échelle de couleurs (onglet colorisation), même si plusieurs canaux varient tant que cette variable ne fait intervenir qu'une seule colonne.
  • Ajout du choix du masquage pour dans l'onglet des plans : union ou intersection. Ceci permet d'obtenir des volumes convexes.
  • Passage des options de translation en ligne de commande.
  • Ce fichier répertorie les changements introduits lors des versions permettant d'aboutir à la version 3.1. Cette version est marquée par l'incorporation du tracé d'isosurfaces à partir du code de Luc Billard VISUALIZE.
  • Correction des bugs 68, 69, 70, 71, 72, 73 et 74.
  • Passage par défaut du bouton « enregistrer » dans l'exportation.
  • Correction des bugs 61, 62, 63, 64, 65, 66 et 67.
  • Ajout d'un bouton qui recharge le répertoire courant dans l'onglet de navigation.
  • Changement du texte du bouton de fermeture de la fenêtre d'observation.
  • Amélioration de la traduction fr.
  • Autres modifications mineures.
  • Support de multiples fichiers en entrée (exemple : un fichier de position et un fichier d'orientation des spins).
  • Affichage dans la fenêtre de sélection des atomes des coordonnées du fichier d'entrée et non des coordonnées utilisées par V_Sim pour le rendu.
  • Ajout d'une fonctionnalité de tracé de plans. Les plans permettent de masquer les noeuds des zones de la boîte.
  • Transfert des paramètres qui ont une tête de ressources vers le fichier de ressources.
  • Améliorer le système de lecture et d'écriture des fichiers de paramètres et de ressources.
  • Ajout du rendu de spin (représentation de flèches), lecture des fichiers d'entrée au travers de l'interface GTK ou sur la ligne de commande. le rendu des spins est effectué par des flèches (cylindriques ou cubiques), les modifications de la géométrie des flèches sont possibles. Il y a aussi une coloration des spins en fonction de l'orientation.
  • Incorporation du tracé d'isosurfaces. Ces isosurfaces peuvent être obtenues à partir de fichier décrivant un champ scalaire par l'intégration de l'outil pot2surf.
  • Ajout d'une lecture des chemins au démarrage sous Windows : lecture d'un fichier v_sim.ii dans le répetoire courant ou dans le répertoire c:\windows.
  • Les ressources des liaisons (couleurs, taille...) sont gérées par type de liaisons et non plus de façon globale (avec tout de même une valeur par défaut).
  • Passage à une vue GtkTreeView pour la liste des liaisons (permet la sélection multiple pour appliquer des changements à plusieurs types de liaisons en même temps, permet le tri...).
  • Gestion de la couleur des liaisons au travers d'une liste déroulante qui permet le stockage des couleurs déjà rencontrées.
  • Support de la translation des noeuds à l'intérieur de la boîte pour les boîtes périodiques.
  • Ajout d'une zone pour stocker des informations liées à la méthode de rendu.
  • Onglet « éléments », support des couleurs déjà rencontrées au travers d'une liste déroulante.
  • Onglet « éléments », passage à une GtkComboBox pour la sélection des éléments et nettoyage du code en rapport avec la sélection des éléments par nom et non par pointeur.
  • Onglet « éléments », ajout d'une ressources permettant de masquer ou non tous noeuds d'un même élément.
  • Onglet « navigateur », ajout d'un filtre des fichiers affichés.
  • Onglet « coloration extérieure », affichage de la valeur min et de la valeur max associée au fichier chargé.
  • Onglet « plans », création d'un onglet pour gérer la création, la modification et les opérations sur les plans.
  • Onglet « configuration », ajout d'un facteur multiplicatif sur les GtkSpinButtons travaillant sur une grandeur physique.
  • Cette version a pour entry le support complet de la documentation pour l'API des fonctions basiques de V_Sim ; ainsi que la mise à jour du site web : VisuObject, visu_tools, visu_commandLine, visu_basic, visu_elements, visu_data, opengl, visu_rendering, visu_configFile, visu_extension, visu_pairs, visu_dump, visu_pickMesure.
  • Ce fichier répertorie les changements introduits lors des versions permettant d'aboutir à la version 3.0.
  • Correction dans le code d'écriture des fichiers tiff et gif sous Windows : les fichiers étaient ouverts en écriture seule (comprendre ascii simple) et la libc échappait tous les caractères 0x0a en rajoutant le caractère 0x0d devant. Il fallait ouvrir ces fichiers avec le flag 'b' pour demander une écriture en binaire (merci aux lecteurs de LinuxFR pour cette explication).
  • Corrections dans la partie d'initialisation d'OpenGL dépendant de la plateforme pour permettre le fonctionnement en ligne de commande sous Windows.
  • Correction des bugs 25, 26 et 28.
  • Ajout des entêtes de licence en tête des fichiers *.c et *.h.
  • Déplacement du fichier v_sim.par dans $(prefix)/etc/v_sim.
  • Mise en place d'une documentation automatique de l'API grâce à gtk-doc, 20% environ des fonctions sont documentées.
  • Internationalisation de toutes les chaînes de V_Sim (sauf les chaînes de débuggage) et traduction d'une petite partie de l'interface en français.
  • Passage à un système géré par automake/autoconf et conformation aux recommendations GNU pour le contenu des packages.
  • Modification mineur du logo : la barre verticale qui entoure « SIM » est remplacée par un arc de cercle.
  • Découpage du fichier opengl.c et isolement des fonctions dépendant du système d'exploitation et du serveur graphique (principalement les appels GLX ou des événements graphiques). Une interface simplifiée de la gestion des événements X est implémentée dans visu_windowInterface.h ainsi qu'une interface nécessaire pour l'initialisation d'OpenGL dans visu_OSInterface.h.
  • Ajout d'un support GTK pour la fenêtre de rendu.
  • L'exportation en image se fait maintenant par un changement de contexte OpenGL vers un rendu indirect en mémoire et non plus par l'intermédiaire d'une fenêtre. Ainsi le problème de recouvrement qui nécessitait d'avoir la fenêtre non masquée pour l'exportation est résolu.
  • Portage sous systèmes Win32 et mise à jour du fichier readme. Le support du backingstore ne fonctionne pas sous Windows. Le dessin du nom des axes est aussi cassé sur cette plateforme.
  • Correction des bugs 1, 21 et 22.
  • Ajout d'une fonction de coloration des atomes en fonction de valeurs passées dans un autre fichier.
  • Ajout d'une fonction expérimentale de rotation de la caméra sur elle-même (modifications dans le fichier de ressources de la clef opengl_theta_phi qui devient opengl_theta_phi_omega).
  • Ajout d'un format de fichier pour le rendu atomique noté « xyz ». Il n'y a pas de définition de la boîte et le nom des atomes vient avant les trois coordonnées.
  • Affichage de la licence et des auteurs en police monospace dans la fenêtre « à propos ».
  • Correction des bugs 7, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20.
  • Ajout des textes pour les auteurs et le readme dans la fenêtre de dialogue d'information et réorganisation de l'ordre des onglets.
  • Ajout d'une partie install et uninstall dans le Makefile.
  • Passage des variables de configuration par l'intermédiaire du Makefile.
  • Changement des répertoires des fichiers par défaut : la licence, les exemples et autre documentation sont dans $(prefix)/share/doc/v_sim, les fichiers de configurations et les images dans $(prefix)/share/v_sim.
  • Implémentation complète des liaisons cylindriques et remise de leur choix possible dans l'interface graphique.
  • Correction d'un manque de rafraîchissement de l'interface des liaisons lorsqu'un nouveau fichier de resources est lu.
  • Correction des bugs 3, 4 et 5.
  • Ajout d'icônes spécifiques pour l'ensemble des fenêtres de l'application.
  • Ajout d'une aide textuelle quand on tape v_sim --help.
  • Suppression des entrées de développement dans l'interface graphique (méthode de rendu des spins et liaison cylindriques).
  • Suppression de la gestion de la liste des raccoursis vers les fichiers de resources dans l'onglet de configuration.
  • Changement de tout les noms de visu_gl_gtk vers v_sim.
  • v_sim-3.7.0/ChangeLog.en0000644000353400050620000011042512216003502011726 00000000000000 All changes leading to 3.7.x series.
  • Draw black line around planes and at intersections.
  • Axes can be used to render the box basis-set and can be positioned anywhere.
  • Add a colour legend for the colourisation.
  • SVG output now clips its surface so that nodes partially inside are correctly rendered.
  • Add user defined shades in the resource file.
  • Resource file can be saved as XML file and merged with other XML files handled by V_Sim, like plane definitions…
  • The save resources dialog now propose the available .res files of the current directory as possibilities in the path completion.
  • The PythonGI plug-in logs stdout and stderr of the Python output.
  • Make the wire colouring depending on length applied only to the selected link and not to all.
  • Add a way to use other function than "lower than" to hide nodes on colourisation data.
  • Full support of the introspection for the core of V_Sim and for some parts of the GUI.
  • The PythonGI plug-in adds a panel to plot scalar field values along lines in the box using Matplotlib as rendering widget for curves.
  • Using GObject-Introspection, add a parser for CNT files from VASP.
  • The new BigDFT plug-in adds a panel to control and visualise parameters specific to BigDFT like the wavelet grids, the memory consumption, the pseudo-potential parameters... This plug-in is compatible with the linear version of the code. It can also be used to start or monitor a distant BigDFT run, retrieving density, potentials and wavefunctions.
  • Add natively a YAML parser, following the specifications from BigDFT.
  • Add key bindings ('Ctrl+v') on the rendering window to popup the orientation chooser.
  • Save prefered cameras in the resource file.
  • Add a search bar in the rendering window (Ctrl+f) to highlight nodes from their number.
  • Partial support of a possibility to scale the background image with camera settings.
  • Add resource entries to position the legend of the coloured maps.
  • Make the manual range of colourisation working per column and not for all as before.
  • Support the wavefunction file format of BigDFT thanks to a dedicated plug-in.
  • Add the possibility to draw arrows for forces directly in the atomic rendering mode without switching to the spin mode.
  • Implement a support for forces in ASCII and xyz file format.
  • Add a plug-in to handle compressed files (tar.gz, tar.bz2, ...).
  • Add key bindings ('n' and 'p') to load next or previous file from the browser list.
  • Add an option in the interactive dialog to hide highlighted or non-highlighted nodes.
  • Add support for recent files. Opened and saved files now appear in the recent list of Gtk file chooser.
  • Add an option to colourise nodes only if being in the manual range.
  • All changes leading to 3.6.x series.
  • Correct the missing texts in bitmap exportations.
  • Modify preview loading in open dialog to avoid grabbing of current file in case of long loading times.
  • Correct the id of nodes in measurement history and restrain to 6 values only.
  • Correct the not working spin modulus scaling.
  • Upgrade ABINIT plug-in for version 6.8.x.
  • Correct a crashing bug after several reload of a file with measurements when changing the colour.
  • Correct a memory corruption in the distance curve widget.
  • Make the drag action work again.
  • Correct pair build when using translations on command line.
  • Correct browser exportation of multi dataset files.
  • Correct the exportation crash with ATI proprietary drivers.
  • Display coordinates either in cartesian or reduced (see the configure panel).
  • Keep zoom adjustment between two files of different box size (see option in the geometry panel).
  • Modify the coloured map rendering to use adaptive mesh. The legend displays also the isoline values.
  • Add keybindings for the camera settings in the rendering window.
  • Add partial support for densities in XSF file format.
  • Add an exportation in ABINIT file format for the crystal part.
  • Add a transparency option for the coloured maps.
  • Begin to implement a support of GObject-Introspection, to allow scripting (Python, Javascript, ...).
  • The ABINIT interactive dialog now support different tolsym values and output the list of symmetries with their names.
  • Add a progress bar for file loading when the loading is too long. Add also the possibility to abort loading process.
  • V_Sim respects now the icon theme specification of FreeDesktop.
  • Demonstrate the Python scripting with the implementation of CNT file format of VASP.
  • Add keybindings for the rendering area (save, reload and open).
  • Add the possibility to export to any OpenBabel fileformats in command-line.
  • Modify the pair drawing to be able to use a per pair drawing method. Now, cylinder and wire pairs are available at the same time.
  • Add a calculation of g(r) and add a tab in the pair dialog to display it. Linear or log scale are available and filtering between kind of neighbours is also possible.
  • Sort pairs by distance.
  • Export a geometry difference in ASCII files as a keyword.
  • Add a keyword in ASCII files to store the total energy value of a system. This energy can be used to colourise paths.
  • Expand the XML file format generated by V_Sim to store the paths.
  • Use nicer message in the file browser when the loading is too long.
  • Add a command-line option to clamp coloured map values.
  • Add a full vectorial PDF export with Cairo.
  • Add the fog support in exportation in vectorial formats.
  • Add data colourisation support in exportation in vectorial formats.
  • Add a resource for the radius of the highlight mark.
  • Implement a legend showing the box lengths.
  • Implement an exportation in CIF (from OpenBabel) file format.
  • Implement a way to add two surfaces in one click, with good ressources for scalar fileds describing a wavefunction.
  • Remove the deprecated GTK curve in the pair dialog and replace it with the combobox for shades.
  • Add a path drawing tool.
  • Rename the panel "box" to "geometry" and store all geometry-related functions there, i.e. translation, expansion, units, paths...
  • All changes leading to 3.5.x series.
  • Correct a bug after changing the basis set with the upper limit of node id selectors.
  • Correct the position of the atom in case of spin rendering.
  • Correct compilation issues with GCC >= 4.4 (thanks to Thierry Thomas for his patch).
  • Correct a crashing bug in cube file format, when loading a file with a wrong atomic number.
  • Correct missing information on nodes after an image dump.
  • Correct a mistake in the legend when loading a new file with a varying number of nodes per element.
  • Correct a crash with the command line exportation.
  • Correct a wrong sort in the browser panel for multiset files.
  • Improve the output of the changelog in the about dialog window.
  • Correct mispositioned atoms in case of non-orthorhombic boxes in XSF files.
  • Add the reduced coordinates in case of peridic XYZ files.
  • Give a good position to the duplicated atoms for free BC.
  • Correct a blocking loop in the export dialog in case of wrong type detection.
  • Correctly associate colorisation to nodes in case of not sorted node in input file.
  • Correct several warnings, for the color selector widget, the rendering of text in the OpenGL area or the loading of XML value file.
  • Correct a wrong exportation of wire width greater than 10.
  • Avoid useless dialog when loading a value file with partial data.
  • Correct a masking bug for surfaces when the plane usage is unchecked.
  • Allow to parse XYZ files with additionnal columns different from a vibration file.
  • Correct a bug not showing the warning dialog box in case of error when exporting in image.
  • Correct a bug affecting the positions of atoms in Cube files when boxes are non-orthorombic.
  • Correct a crashing bug when pressing 'r' key without any saved camera.
  • Correct a bug for non orthorombic boxes using OpenBabel plug-in, thanks to patch sent by Atz Togo.
  • Correct a bug in ASCII file parsing when the files come from Macintosh or Windows.
  • Make the 'open with' action works under Windows.
  • Add a support for angles in the XML value files.
  • The tooltips in the browser now show the name of previous and next directories.
  • Draw a legend in SVG dump.
  • Add a way to change the basis set by pointing nodes as new vertices.
  • Declare in the resource file all parameters for the geometry diff (shape and size of the arrows, thresholds...).
  • Take into acount the boundary conditions when choosing the "up" direction. In case of surface, the y axis becomes the up axis.
  • Add a tab in the interactive dialog to show symmetry information, as calculated by ABINIT (space group, equivalent atoms...).
  • Add a key shortcut to switch between windows, mapped on "home" key.
  • Correct the visuals glitches when drawing cylindrical pairs.
  • Add phonons to ASCII file format.
  • Implement the phonon properties for solid, taking into account the imaginary parts of displacements and the q.r phase shift.
  • Add a clickable icon in the rendering window to access the saved cameras.
  • Implement a visualisation for the difference in positions using small arrows on nodes.
  • Add a phonon representation with vibration or arrows.
  • Add labels to nodes. These labels can be rendered as for the type or the node id for instance. They can be modified in the interactive dialog.
  • Implement the colourisation according to the coordinates.
  • Add a visualisation for the angles.
  • Add the support for labels for nodes in ASCII files.
  • Add a boundary condition keyword for ASCII files.
  • Parse a phonon column in the XYZ files.
  • Add 'previous' and 'next' buttons into the browser.
  • Add a tab for the phonon representation, listing available modes and displaying some parameters.
  • Modify the pick mouse buttons to easily access the measuring tool. Add also some button in the rendering window to set or unset measurements.
  • Add a scaling factor as post-process for the colourise tab.
  • Implement a legend displaying a frame with the atom names, number and representation.
  • Add a torus representation, in addition to existing ellipsoid and so on.
  • Add a hiding capability to the highlighted nodes.
  • Implement the support for several coloured maps.
  • Make the edges of the map planes smooth and highlight with a black line.
  • Add a drag and drop capability for file loading on the OpenGL area.
  • Modify the ASCII format to allow reduced coordinates and box definition based on vector lengths and angles.
  • Create a PDF/SVG exportation for the coloured maps.
  • Change the keys 's' and 'r' as a ring to save and restore the camera position, instead of saving only one value.
  • Add an exportation to XYZ file format.
  • Implement in the box subpanel a way to quickly switch distances between common units (bohr, angstroems...).
  • In the geometry modification panel, add a duplication possibility for the listed nodes.
  • Start the implementation of Python bindings for V_Sim. It is possible to open a rendering window and to load a file in it. It is also psossible to create a VisuData from scratch, creating elements and nodes by hand. The planes capability has also been ported to Python.
  • Code a plug-in for cube file support, commonly used by SIESTA and introduced by Gaussian.
  • Suppress the "highlight" tab in the interactive dialog. Move this capability to the pick tab using the control key to toggle highlight. Rework the relations between highlighted nodes and selected nodes. The highlight status can be changed in the listed nodes.
  • Add a column to print the date of files in the browser.
  • Extend the XML plane file to support various value fields in V_Sim. It is possible now to store in this XML file, the picked distances, the highlighted nodes, the values of created iso-surfaces.
  • Add the support for D3 posi files (concatenation of D3 files, adapted for movies).
  • Add non linear shades, logarithmic scale for zero-centred data and add the possibility to choose the isoline colour.
  • Reorganise a bit the pair dialog layout (the filter is now over the treeview and the management of links has been moved on the right).
  • All changes leading to 3.4.x series.
  • Correct the not working -d command line option when used in conjonction of the -u option.
  • Correct different memory leaks in the reading of input files or in the drawing routines.
  • Make the 'r' and 's' keys work again after the opening of a dialog from the rendering window.
  • Correct a crashing bug when nodes with persistent distances are removed.
  • Correct the automatic reload function that was broken in 3.4 series.
  • Correct wrong pathes in the browser when UTF8 characters are used.
  • Correct a jump of the camera in the interactive session when leaving pick mode with a right click and a drag.
  • Stop the interactive session also when the interactive dialog is closed by the window manager.
  • Disconnect signals for orientation chooser when the dialog is destroyed..
  • Solve a loading problem when using the filechooser in spin mode.
  • Correct a lack of cylinder pair drawing under specific conditions.
  • Correct some "assertion fails" error when loading new files.
  • Make the behaviour of "all elements" selection in the element tab works for atomic parameters in spin rendering.
  • Correct the tab character problem in ASCII files.
  • Correct a bug in the pair dialog when the sort is used. Modifications in the treeview are then inconsistent.
  • Correct a bug that makes the rendering disappear in the walker mode.
  • Correct a bug when expanding the nodes that could create several nodes at one place.
  • Correct a bug when the selection is zero pixel wide.
  • Correct a bug in the move interactive dialog that prints a wrong number of selected nodes.
  • Correct the error while reading the resources of cylinder pairs with the minimum value.
  • Add the missing exportation of the stipple pattern for the wire pairs.
  • Correct several Critical Warnings in drawDataOnNode() in the interactive dialog window.
  • Correct a crash in the interactive window when the current VisuData is deleted.
  • Correct wrong permissions on the directory created in the quit dialog.
  • Correct a bug in the subpanel menu.
  • Change the way to find a module name from its file name.
  • Correct a linking problem with variable in .h on MacOS.
  • Avoid V_Sim crash when a pixmap exportation is required on X server using AIGLX and a version of GLX prior to 1.3.
  • 3.4.0.1: correct a segfault in the Abinit plugin.
  • 3.4.0.2: correct a possible segfault when a VisuData object is freed.
  • 3.4.0.2: add an XML filter to the plane file dialog.
  • 3.4.0.2: correct a bug in the colour selection of surfaces.
  • 3.4.0.2: import the debian directory from official repository and update it for 3.4.0 (made for 3.3.3 by Debian).
  • 3.4.0.3: change the location of legal dir to data dir.
  • 3.4.0.3: only install the plugins related files when plugins are compiled. Also move the images to the pixmap dir.
  • Add the axes in the SVG output.
  • Correct bugs (preview widget, ABINIT bindings) and complete translation.
  • Add the capability to draw bitmap pictures on the background.
  • Change the zoom behaviour to none when the box is expanded.
  • Add a rectangular selection in the pick window and enable group moving in the move window.
  • Add iso-lines for the coloured map.
  • Add the support of vectors (for forces or spin) in the XSF plug-in.
  • Add a possibility to link with the ABINIT parser to read its input file. This depends on modifications not yet in ABINIT official releases. They may enter in ABINIT 5.6 series. The data sets are supported and when the geometry builder is used, the created box is shown. Current limitation is when nband must be computed since no pseudo-potential files are loaded and thus nelect is not known.
  • Add a tool to automatically compute range distance for first neighbours.
  • Implement the possibility to draw pattern wires for pairs and box.
  • Early implementation of a plug-in adding XSF reading capabilities. Atomic positions are only available yet.
  • The coloured map can now be drawn in logarithmic scale.
  • The XYZ parser has been modified to allow to read animation files. The browser panel has been modified accordingly to show the different node sets in one file.
  • Activate once again the stereo rendering (was disabled from version 3.0.0 because of lack of hardware for testing). The stereo parameters, like the eyes distance, can be tuned in the OpenGL panel.
  • Add keyboard support in the rendering window in observe mode. Page-Up and Page-Down keys are used for zoom and perspective. Also add the 's' key for 'save current camera position'. Key 'r' is now used to restore this saved position.
  • Add the possibility of a non-uniform mesh for the scalar-field representation.
  • Basic support for SVG exportation of box and nodes.
  • Allow changes of coordinates in the pick table (as for spin characteristics or colour data). Add a possibility to write information on selected or all nodes.
  • Better integration of OpenBabel library, with the use of the atom symbol instead of the atom labels, also use the OpenBabel colour and radius when the atom is not known by V_Sim. Try to reproduce as much as possible the handling of pairs as described in the OpenBabel input files.
  • Add a filter in the pairs dialog to show only pairs of interest (i.e. pairs containing one given element).
  • Implement a way to duplicate the box following a fractional ratio in the case of periodic boxes. Adapt all capabilities to take that extension into account (extend planes and coloured maps, duplicate colourisation data, draw box extension...).
  • Separate the box & axes subpanel into two subpanels and move the translations from the interactive window to the new box subpanel. Also add in this subpanel the gestion of box duplication.
  • Enable the box duplication on command-line and also the coloured map.
  • Modify the geometry tab in the interactive window to allow to add or remove nodes.
  • Add a support for GtkGlExt as an alternative to the built-in OpenGL widget.
  • Add a preview in the open dialog box, displaying the box and the elements with the current camera position.
  • Implement the 'smooth and edge' rendering mode, displaying a line around polygons.
  • Make the hiding of surfaces by planes smooth, adding polygons to avoid edgy borders.
  • Improve the parse speed of the browser and add a multiple matching for rendering method with several type files (spin and positions can be loaded in one clic).
  • Use the XDG specification for the location of the home config directory. The old $HOME/.v_sim is still supported.
  • Change the surface resources in the panel: each surfaces can has a name or not. In the latter case, the resources of the surface are private to this surface (all changes do not affect the other surfaces). Merge the two property dialogs into one (previously change current and change all). Add a special add button in the panel to add several surfaces at once (use the same than in the build dialog). Make the remove button remove all surfaces of a scalar field file before removing the file itself.
  • Implement the masking effect of planes on surfaces with a simple implementation (not smooth borders).
  • Make the masking effect of planes selective per surface or per element (see the new masking column in surface panel and the check box in the element panel).
  • Add a capability to print all distance of a pair (see the pair dialog and the 'length column). Distance values are now editable in the treeview.
  • Add an option in the browser panel to read the directories recursively. Also makes the double-click check the file entry in the list and implement the capability to browse several directories at one time.
  • Add a new widget to choose the orientation, using an orthogonal basis set, the box coordinates or the spherical basis set.
  • All changes leading to 3.3.x series.
  • Correct the implementation of the translation inside windows with a non-unitary ratio aspect.
  • Correct a memory leak during image exportation with the XLib.
  • Correct a memory leak in the save dialog window.
  • Add a man page.
  • Use a correct format for the v_sim.ini file in Windows.
  • Correct a bug making D3 file read impossible on Windows.
  • Correct a bug when selected the root directory.
  • Correct a crashing bug on MacOSX and Intel cards on Linux.
  • Make the normalisation of the colorisation stay during automatic reloading.
  • Correct a bug in the coordinate conversion for non-orthogonal boxes (both in structure and scalar field).
  • Correct a bug in D3 file parsing.
  • Correct an internal error dealing with to much signal connection to the VisuData objects.
  • Add a rendering shape as points for atoms to be able to plot grid position or to increase speed when a huge quantities of elements is drawn.
  • Implement a binary format for the spin rendering.
  • Some improvements in windows handling: it is possible to raise the command panel from the rendering window for instance.
  • Small improvements and redesign in the save parameters and resources window: it is possible to export resources related to rendered object only.
  • End of implemntation of separable subpanels. Their size and positions are now changeable and can be exported to the parameter file.
  • Upgrade the build system to be able to build plugins for Windows.
  • Change the transparency handling of isosurfaces to avoid to compute the order of them when the camera is moving.
  • Several bug corrections, including error on reading resources related to isosurfaces, wrong computation of normal vector of isosurfaces, automatic reload of file...
  • Improvements done on the gestion of the properties of isosurfaces. Names are editable and can be passed on command line when option -v is used. Change also the behavior of selecting buttons in that subpanel to be able to change properties of all surfaces of one unique file.
  • Save in the plane file in XML the rendering state of each plane.
  • Upgrade translation file for future version 3.3.
  • Implementation for the reading of scalar fields encoding with the Nanoquanta specification v1.3. Only real scalar fields (i.e. densities) without spin informations are currently supported. From this point basic support for specification v1.3 is operational.
  • Addition of a subpanel to draw colored planes representing the variations of a given scalar field. A colored scale is also available.
  • Density files and surface files can be automatically loaded and all drawing capabilities are available from the command line.
  • Colors and material values are more coherent between elements and surfaces.
  • Commandline capabilities for new fonctionalities associated to iso-surfaces.
  • Support of density/potential files directly in the isosurfaces panel, without need to use the convert tool. Implementation also of the merge of several surfaces directly in this panel.
  • Adding remove and add of surfaces on the fly in the isosurfaces panel. The add action is available only for density/potential files.
  • Complete support for detaching panels and associate them in several dialogs.
  • Implementation of the modulus handling in spin rendering. Spin shapes can be scaled according to the modulus read in the spin input file.
  • Total implementation of OpenBabel support. All format readable with OpenBabel are loadable in V_Sim.
  • Creation of a tool to retrieve values attached to nodes, such as colorisation informations or orientation and modulus for spin rendering. In this former rendering mode, these value are editable on the fly.
  • Some changements in the saving of resources of spin rendering. It is recommended to overwrite resources files since three keywords are now obsolete.
  • Some interface enhancements.
  • Adding a basic support for plugins. Shared libraries that matched the interfaces required by V_Sim located in the installation directory and in the user one (${HOME}/.v_sim) are automatically loaded on startup.
  • Partial implemntation of NANOQUANTA v1.2 specifications for atomic positions (plugin).
  • Usage of OpenBabel library for file loading (plugin), but nothing is actually functional.
  • Basic fuunctionnality to detach tabs from the command panel.
  • Creation of a simple OpenGL widget to avoid the hack used since v3.0 version to render OpenGL surfaces. Doing it, the backing store support has been removed and replaced by a complete gestion of the 'expose' events.
  • Improvements in the spin rendering mode where it is now possible to choose between, always spin, hide spin with a null modulus or draw atomic shapes instead.
  • Support of the atomic rendering within the spin one.
  • Addition of an elipsoid shape for both spin and atomic rendering.
  • Support for distance measurements in the default mode (restricted before to the pick / observe window).
  • All changes leading to 3.2.x series.
  • Correct a reading bug in the convert dialog for isosurfaces, when a potential/density file is read.
  • Correct a crashing bug using box and axes when no file is rendered.
  • Correct a crashing bug in the isosurface panel, when playing a list with only one entry.
  • Correct a crashing bug in the colorization panel.
  • Correct a bug with 64bits machines that disables the camera rotation in the observe window.
  • Correct a mispel in the French translation.
  • A warning message dialog has been added when the quit button is clicked. This message is optional and can be hidden with a key in the config file named 'v_sim.par' or by checking a button in this window.
  • Adding a functionnality to save or open informations about planes. The data type used is simple XML. The geometry, the hidden state and the color of each plane are stored. Only the drawn options is not saved.
  • Implement the constrained movements along x, y and z axis in the geometry builder.
  • Choose automatically the action associated to a tab when one is selected in the interactive window.
  • Implementing a new action to move the nodes. Using drag and drop, it is possible to move nodes in the plane of the screen.
  • Adding a ascii export with the option to output or not hidden nodes.
  • A new tab has been added in the planes subpanel to allow to change automatically the distance from origin (as it is done in the browser subpanel to chow several files one after an other).
  • Creating a new action to mark atoms. It draws some frame around clicked nodes to easily follow some.
  • Internal modifications to suppress global pointers (especially in opengl.c and visu_data.c).
  • VisuData is switched to a GObject and signals about OpenGL, Nodes and Elements are moved from visu_object to it.
  • Through the selection dialog, distances that are picked are label on screen and stay printed as long as required.
  • Add a possibility to hide some nodes in the colorization subpanel, depending on values in the associated data file.
  • Enable the choice of rendering mode per drawn elements, e.g. atoms are drawn smoothly wereas isosurfaces are rendered through wireframe (requires GTK+2.6).
  • Add a custom value to tune the power of used lights and two preset values for lights : one with the defaukt light and another with four lights, customized for spin rendering.
  • Adding a cycling mode in the browser. It is now possible to cycle once, to go on and back and still the classic cycle in loop.
  • Rebuild of the configuration files dialog: switching to GtkComboBoxes and adding auto-completion.
  • Improve French translation.
  • Extend minimal pick behavior (i.e. default mode) to allow distance measurements.
  • In pick/observe session, the little marks that identify references in pick mode, are now persistant during observe mode until the pick/observe session is closed.
  • Correct bugs 2 and 75.
  • The X11 backend mixed with the GTK interface is not supported anymore.
  • Modify the main interface : buttons related to the rendered file moved to the bottom bar on the rendering window.
  • Switch to a GtkComboBox for the list to select subpanel.
  • Update French translation.
  • Adding a status bar in the rendering window. This allows to show some basic informations as the description of the rendered file, the number of drawn nodes... This is only working if the rendering backend of this window is GTK (not X11).
  • Adding a minimal pick function on the third button as a default mode.
  • GUI improvements in the browser sub-panel and display of currently browse directory.
  • Adding JPG and PNG export image format, using GdkPixbuf.
  • GUI changings of the dump dialog to allow to tune some parameters for different file formats (e.g. the compression ratio in JPEG format). Adding the possibility to choose the export size for images and to add automatically the file extension if not is specified.
  • Changing default behavior (previously no action) to observe mode.
  • Adding a check box in the dataFile sub-panel to automatically load data file with the same name than the one of the rendered file.
  • Adding some preset shades in the dataFile sub-panel.
  • Allowing the possibility to use dataFile methods through the command line.
  • Displaying the color scale (in the dataFile sub-panel) even when several channels are changing if only one column is read.
  • Adding the choice of masquing algorithm in the plane sub-panel (using union or intersection).
  • Adding the possibility to specify in the command line some box translation.
  • Not translated in english. Not translated in english.
    v_sim-3.7.0/autogen.sh0000754000353400050620000000056112215546214011565 00000000000000#!/bin/sh echo "internationalisation" intltoolize --force --copy echo "libtoolize" libtoolize --copy --force echo "aclocal" aclocal -I m4 echo "gtkdocize --flavour=no-tmpl" gtkdocize --docdir Documentation/reference --flavour no-tmpl --copy || exit 1 echo "autoheader" autoheader echo "automake" automake --add-missing --copy --force-missing echo "autoconf" autoconf v_sim-3.7.0/bugs0000644000353400050620000010240312215546214010446 00000000000000 Si aucun fichier n'est charg, le fait de changer dans l'onglet configuration la valeur du facteur multiplicatif fait crasher l'application. Quand le choix d'un rpertoire est fait en le slectionnant dans la bote de dialogue, et non en double-cliquant dessus, c'est le rpertoire un niveau en dessous qui est stock, mme si c'est le bon rpertoire qui est parcourru. Le redimensionnement des axes n'est pas ralis lors du chargement d'un fichier avec une gomtrie de bote diffrente (par exemple entre 'diff.ascii' et 'aluminium.d3'). Les axes ne sont pas mis jour au chargement des ressources. Lors du chargement des ressources, un changement sur l'utilisation des liaisons n'affecte pas la case cocher de l'interface. Quand les liaisons sont cylindriques, charger des ressources fait crasher V_Sim. Lors du chargement d'un fichier de ressources, un changement de la taille des atomes n'est pas rpercut l'cran. Quand plusieurs fichiers sont spcifis sur la ligne de commande, V_Sim passe en mode spin, mme si ces fichiers sont des fichiers de position. Le rglage des couleurs des axes n'a plus d'effet la vole sur celle qui est effectivement dessine. Dans l'onglet d'outils de colorisation, les spins boutons pour rgler les valeurs min et max la main n'ont pas assez de dcimales pour tre pratiques. Quand on choisit une couleur dans l'onglet lment pour un type d'atome, cette couleur ne reste pas quand on choisit un autre atome et qu'on revient au premier. Quand on clique sur une liaison, la taille du cylindre dans le spin bouton ne change pas pour se mettre la bonne valeur. Avec le rechargement automatique d'un fichier, si celui-ci contient de nouveaux atomes, la liste des lments dans l'onglet adquat n'est pas toujours mise jour. Quand un nouveau fichier est charg, d'un rpertoire diffrent du premier, le navigateur ne change pas son rpertoire courant. Si aucun fichier n'est charg, le fait d'ouvrir un fichier de surface fait crasher le programme. Mme si la case use planes n'est pas coche, le chargement d'un nouveau fichier fait appliquer le masquage par les plans. Dans la fentre d'outils des liaisons, le cadre de texte est inexact. Dans le navigateur, alors qu'aucun fichier n'est rendu, pour les mthodes ncessitant plusieurs fichiers d'entre, le message d'erreur n'est pas correct quand on essaye de rendre un fichier. Quand on choisit la mthode de rendu 'None', des Warnings apparaissent cause de l'onglet 'navigateur'. Lorsque des plans sont dessins et qu'ils masquent une partie de la bote, quand un nouveau fichier est charg, le masquage ne fonctionne pas. Lorsqu'un lment est masqu et qu'on applique des translations priodique sur la bote, le fait d'afficher nouveau lment ne le fait pas rapparatre, il faut modifier un paramtre de translation pour que a soit pris en compte. Au dmarrage de V_sim, le message WARNING! 'visuData_createAllElements' has been called with a null 'data' argument. apparat sans raison. l'ouverture d'un nouveau fichier, le dessin des liaisons ne tient pas compte des translations existantes. On peut fermer la fentre pick/observe sans pour autant revenir la fentre principale, V_Sim fini ensuite par mettre une erreur de segmentation. La liste d'onglets de la fentre propos n'est pas dans les tons verts comme le reste des lments des fentres annexes. De plus les boutons cocher dans la bote de dialogue d'ouverture d'un fichier en mode spin ne sont pas mauves. La fentre d'dition des proprits des surfaces partir du bouton Edit selected surface fait 1071 points de large. Lorsque Use isosurfaces n'est pas coch, chaque changement, la vue est tout de mme redessine. Les widgets permettant le rglage des paramtres spcifiques une mthode de rendu des liaisons disparat parfois. Un changement sur les spins boutons dans l'onglet de configuration alors qu'aucun fichier n'est charg entraine une erreur de segmentation. Il faudrait pouvoir compiler V_Sim sans certaines parties (en particulier certains onglets et proprits lies). Dans la fentre d'exportation en image, le fait de drouler la combobox de l'emplacement juste avant la destruction de la fentre la fin de l'enregistrement fait planter GTK. Il faudrait rendre tout le widget insensible pendant l'enregistrement, sauf la barre de progession et le bouton annuler . Lorsqu'un nouveau fichier est charg, les translations si elles sont actives, ne sont pas appliques. Lorsqu'aucun fichier n'est affich, et que l'option Automatic refresh est coch, le programme cherche charger un fichier n'existant pas et sort des warnings la pelle. Il faudrait un bouton permettant d'amener la vue dans une position normale au plan slectionn. Il pourrait y avoir une fonction qui permet de marquer d'une faon ou d'une autre les atomes de la bote (en chageant leur couleur par exemple). Lors d'une session pick , si les translations sont actives, les distances et les angles affiches ne sont pas bons. Lorsque les translations sont actives, le masquage par les plans ne fonctionne pas. Un plan avec une couleur transparente n'est pas transparent si l'antialiasing n'est pas activ. Quand un fichier est charg, la liste droulante de l'onglet des lments change pour son premier choix. C'est droutant quand on a par exemple le rechargement automatique d'un fichier qui marche : chaque fois que le fichier est modifi, la liste revient au dbut. Lorsqu'un fichier est charge avec la ligne de commande, le chemin connu de V_Sim (celui o sont ouvert les bote de dialogue de fichiers) peut contenir des ./ et des ../, ce qui fait parfois planter le slecteur de fichier. Le choix des fichiers cochs ou non dans le navigateur de fichiers est impossible quand un filtre est prsent (a slectionne/dslectionne n'importe quoi). Le refresh automatique ne fonctionne plus. Il faudrait rajouter un champ filtre o l'utilisateur pourrait spcifier un motif pour la liste des fichiers afficher. Le choix d'une nouvelle couleur pour les liaisons donne la possibilit de choisir le niveau alpha, alors qu'il n'est pas utile. De mme, les couleurs avec alpha apparassent avec un aperu montrant la composante alpha dans les menus n'ayant pas de composante alpha. Il serait souhaitable de pouvoir rgler la gamme de variation des rayons atomiques ainsi que les longueurs accessibles pour les liaisons. En effet pour une bote dont la taille caractristique est en 1e-5, les bornes par dfauts sont inadaptes par exemple. Lorsqu'on utilise le navigateur alors que le panneau de liaisons est affich, aprs un ou deux chagement de fichiers on obtient un crash et parfois des erreurs lors d'appels la fonction free . Dans le panneau data color , il n'y a pas de conversion de la locale du systme de fichier vers l'UTF-8 pour l'affichage du nom du fichier dans la barre d'tat. Les valeurs des paramtres des liaisons ne sont pas mis jour lorsque des ressources sont recharges. La partie spcifique dans la fentre des liaisons, n'est pas remise jour non plus. Quand la valeur de la perspective est trs lev, la zone de variation du brouillard semble contracte par rapport une valeur plus classique de la perspective. Quand on charge un fichier de ressources posteriori, les atomes du fichier visualis disparaissent et on ne peut plus les afficher mme en changeant leur rayon, il faut recharger le fichier. Aprs une exportation en image, le nom des axes disparat (pas toujours du premier coup). Il faut recharger d'autres fichiers pour faire apparatre ce bug. Tout est dans le titre. Sous Windows uniquement, le nom des axes ne s'affiche pas, ni l'cran, ni l'exportation. Il n'y a pas d'ascenseur horizontal dans la fentre sur les liaisons ce qui rend le bouton de couleur difficilement cliquable quand les noms des espces sont plutt grands. Lors d'une session observe, le clic droit ne permet plus de passer une session pick : il ne se passe plus rien. Lors de l'initialisation de la fentre X et du processus OpenGL, les messages d'erreur d'initialisation indiquent une erreur note INTERNAL ERROR , ce qui est incorrect. Il serait plus adapt de mettre un message sur l'incompatibilit du serveur X et de V_Sim en dtaillant que l'extension GLX n'est pas active par exemple. Idem. Dans le navigateur de fichier la bulle d'aide de la liste des fichiers a une faute d'orthographe sur le mot selected. Il existe encore une chane visu_gl_gtk dans la bulle d'aide de la fentre enregistrer pour la case cocher du fichier de paramtre. Lorsque quelques fichiers seulement sont slectionns dans le navigateur et qu'on clique sur le bouton exporter en image tous les fichiers slectionns , le systme exporte bien l'ensemble des fichiers slectionns mais il les exporte autant de fois qu'il y a de fichier en tout dans la liste. Si on baisse le rayon avec le bouton spin en laissant appuy la souris, quand on arrive zro le programme affiche un warning comme quoi on a essay de mettre une valeur ngative. Le nombre de dcimales (2) pour spcifier les distances min et max des paires traces me parat trop petit pour distinguer les variations de longueurs dans Si avec 1 Ge... Il serait pratique que la case cocher pour tracer ou non les paires existe aussi sur le panneau de contrle du trac des dtes paires. Les chanes de caractres passes aux fentres d'alerte ne sont pas UTF8 cause des noms de fichiers. Avec la mise jour automatique, si on ramne un fichier zro atome, v_sim sort sur un chec d'allocation. Mettre des raccoursis claviers sur l'ensembles des options cocher et faire qu'elles soient accessibles mme sur la fentre de rendu. Pouvoir dtecter automatiquement si les fichiers d3 sont en little ou en big endian. Si on dmarre V_Sim avec l'option rechargement automatique, la case dans le panel de configuration est bien coch mais le chargement automatique ne se fait pas, il faut dcocher et recocher pour que a fonctionne. On ne peut pas spcifier en ligne de commande la taille de la fentre de rendu. Lors d'une observation, il serait souhaitable de pouvoir faire tourner la bote aussi selon des directions propres l'cran et non seulement propres la bote. Mettre une explication permettant de comprendre qu'il faut double cliquer sur un nom de fichier dans le navigateur pour le faire afficher. Le fait d'utiliser les valeurs HSV comme coefficients pour chaque couleur de liaison dfinie par l'utilisateur n'est pas claire et devrait tre remplac par les valeurs HSV seules. L'option --export n'est pas reconnue. Des carrs en vido inverse (comme ceux permettant de reprer les rfrences) apparaissent dans une session pick quand la vue change suite une action extrieure comme le rechargement automatique du fichier par exemple. Cliquer sur le bouton rafrachir alors qu'on vient de quitter une session pick positionne les atomes n'importe o. v_sim-3.7.0/todo0000644000353400050620000002430412215546214010456 00000000000000 Ajouter une possibilit de scripts internes. Permettre l'exportation dans d'autres formats que les images : des fichiers Povray, des fichiers SVG (en utilisant Cairo?). Rajouter les ombres dans le rendu OpenGL. Ajouter un motif pour le dessin des lignes. Ajouter un mode de rendu Wireframe + Smooth pour souligner les facettes. Permettre de faire varier le nombre de n~uds. Implmenter la duplication priodique de la bote. Divers actions sur les surfaces, dont la possibilit de simplifier (suppression de points) et de lisser (moyenner les points entre eux) les surfaces exitantes. Autre possibilit : pouvoir couper les surfaces avec les plans. Enfin, pouvoir exporter des surfaces. Utiliser un widget GtkRange la place d'un GtkSpin pour rgler la distance dans l'onglet plans. Permettre d'ajouter plusieurs lgendes et de pouvoir modifier leur forme et le texte. Modifier la mthode de rendu des spins pour crer une nouvelle mthode de rendu pour les champs de vecteur en gnral. Permettre la lecture des fichiers Nanoquanta (positions et densits). Utiliser OpenBabel pour permettre la lecture de nombreux formats d'entre. Mieux intgrer le chargement et l'affichage de champs scalaires grce aux iso-surfaces. Possibilit de rajouter / supprimer des iso-surfaces la vole. Ajout d'un plan de coupe color quand un champ scalaire est charg. Amliorer la mthode de rendu des spins en permettant le rendu des noeuds en mode atomique en plus du mode spin. Sparer visu_tools en plusieurs entit (couleurs, format de fichiers...) et mettre le tout dans un rpertoire part. Avoir un mode de rotation en conditions OpenGL dgrades. Permettre de dtacher les onglets et de les regrouper comme dans Gimp. Sauvegarder la position des onglets et leur contenu. Permettre l'exportation en PNG et JPEG, en utilisant les GdkPixbuf. Passer des paramtres de colorisation en ligne de commande. Passer des informations de plans en ligne de commande. Passer des translations en ligne de commande. Rajouter une configuration possible de la gestion des lumires. Passer le mode observe simple comme mode par dfaut. Transformer VisuData_struct en GObject et lui associer les signaux appropris pour le moment prsents dans l'object VisuObject. Ajouter une gestion du mode de rendu par OpenGlExtension. Ajouter une extension permettant de marquer les noeuds. Ajouter des fonctions permettant de dplacer les noeuds. Ajouter une gestion de chargement automatique de la colorisation quand un nouveau fichier rendu est charg. Ajouter une fonction de masquage des lments dans l'onglet de colorisation pour les lments dont les donnes sont infrieures un critre. Permettre de choisir le mode de masquage par des plans multiples : union, intersection... Unifier les boutons charger des ressources et enregistrer pour en faire un bouton gestion des ressources permettant de sauver ou de charger des ressources. Ajouter une confirmation pour quitter (optionnelle et configuarble). Raliser une interface pour le marquage des noeuds. Raliser une interface pour le dplacement des lments. Dans l'onglet des outils, il faudrait proposer des schmas de couleurs pr-enregistrs comme du bleu vers le rouge, un dgrad de gris... Modifier l'interface de colorisation pour rajouter une case cocher permettant le rechargement automatique. Correction du bug (rcurrent) des fentres de dialogue qui n'en sont pas. Support de multiples fichiers en entre (exemple : un fichier de position et un fichier d'orientation des spins). Affichage dans la fentre de slection des atomes des coordonnes du fichier d'entre et non des coordonnes utilises par V_Sim pour le rendu. Ajout d'une fonctionnalit de trac de plans. Les plans permettent de masquer les noeuds des zones de la bote. Transfert des paramtres qui ont une tte de ressources vers le fichier de ressources. Amliorer le systme de lecture et d'criture des fichiers de paramtres et de ressources. Les ressources des liaisons (couleurs, taille...) sont gres par type de liaisons et non plus de faon globale (avec tout de mme une valeur par dfaut). Passage une vue GtkTreeView pour la liste des liaisons (permet la slection multiple pour appliquer des changements plusieurs types de liaisons en mme temps, permet le tri...). Gestion de la couleur des liaisons au travers d'une liste droulante qui permet le stockage des couleurs dj rencontres. Support de la translation des noeuds l'intrieur de la bote pour les botes priodiques. Ajout d'une zone pour stocker des informations lies la mthode de rendu. Onglet lments , support des couleurs dj rencontres au travers d'une liste droulante. Onglet lments , passage une GtkComboBox pour la slection des lments et nettoyage du code en rapport avec la slection des lments par nom et non par pointeur. Onglet lments , ajout d'une ressources permettant de masquer ou non tous n~uds d'un mme lment. Onglet navigateur , ajout d'un filtre des fichiers affichs. Onglet coloration extrieure , affichage de la valeur min et de la valeur max associe au fichier charg. Onglet plans , cration d'un onglet pour grer la cration, la modification et les oprations sur les plans. Onglet configuration , ajout d'un facteur multiplicatif sur les GtkSpinButtons travaillant sur une grandeur physique. Cette version a pour objectif le support complet de la documentation pour l'API des fonctions basiques de V_Sim ; ainsi que la mise jour du site web. Documentation pour VisuObject. Documentation pour visu_tools. Documentation pour visu_commandLine. Documentation pour visu_basic. Documentation pour visu_elements. Documentation pour visu_data. Documentation pour opengl. Documentation pour visu_rendering. Documentation pour visu_configFile. Documentation pour visu_extension. Documentation pour visu_pairs. Documentation pour visu_dump. Documentation pour visu_pickMesure. Mise jour du site web avec les fonctionalits de la nouvelle version et corriger les manques prcdents. Les fichiers de spins sont reprsents par des flches dfinies par leur position et leur orientation. Lecture des fichiers d'entre au travers de l'interface GTK. Lecture des fichiers d'entre sur la ligne de commande. Rendu des spins par des flches (cylindriques ou cubiques). Modifications possibles de la gomtrie des flches. Coloration des spins en fonction de l'orientation. Enregistrement des ressources lies au spin. v_sim-3.7.0/intltool-extract.in0000644000353400050620000000000012215546512013416 00000000000000v_sim-3.7.0/intltool-merge.in0000644000353400050620000000000012215546512013043 00000000000000v_sim-3.7.0/intltool-update.in0000644000353400050620000000000012215546512013226 00000000000000v_sim-3.7.0/src/0000755000353400050620000000000012216331346010431 500000000000000v_sim-3.7.0/src/coreTools/0000755000353400050620000000000012216331341012375 500000000000000v_sim-3.7.0/src/coreTools/toolShade.c0000644000353400050620000007274612215546101014424 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "toolShade.h" #include #include #include #include #include #include "toolConfigFile.h" #include "toolColor.h" /** * SECTION:toolShade * @short_description: ToolShades are color gradients. * * This module allow V_Sim to deal with color gradients. Such a * gradient is defined by a linear transformation of color space. This * space can be RBG or HSV (see the enum #ToolShadeColorMode). This linear * transformation can be written [resulting color vector] = [vectB] + * lambda.[vectA], where lambda denotes the input variable of the * gradient (ranging from 0 to 1). Resulting color vector are clamped * to [0;1] if needed. * Use tool_shade_new() to create a new shade, giving the arguments as * defined above. A shade can be linked to an image to represent it, * use shadeSet_pathToImage() to do it. * * To share color gradients between modules in V_Sim, you can * add new shade to the global list of stored shades using * tool_shade_appendList() and get this list with a call to * tool_shade_getList(). */ #define SHADE_LEGEND_WIDTH 0.05 #define SHADE_LEGEND_HEIGHT 0.3 #define SHADE_LEGEND_N_QUADS 20 #define FLAG_SHADE "shade_palette" #define DESC_SHADE "Define a new shade by giving colours to points ; label (val [name|#rgb|#rrggbb|...], ...)" static void exportParameters(GString *data, VisuData *dataObj, VisuGlView *view); static gboolean readShade(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines,int position, VisuData *dataObj, VisuGlView *view, GError **error); static gboolean parseValue(gchar *line, float *index, float rgb[3], GError **error); static GList* _buildPresetList(void); struct _ToolShade { gchar* labelUTF8; ToolShadeColorMode colorMode; ToolShadeMode mode; /* The linear storage. */ float vectA[3], vectB[3]; /* The array storage. */ float *index; float *vectCh[3]; guint nVals; /* Some user defined values. */ gboolean userDefined; gchar *steps; }; static GList *toolShadeList = (GList*)0; /** * tool_shade_get_type: * * Create and retrieve a #GType for a #ToolShade object. * * Since: 3.7 * * Returns: a new type for #ToolShade structures. */ GType tool_shade_get_type(void) { static GType g_define_type_id = 0; VisuConfigFileEntry *entry; if (g_define_type_id == 0) { g_define_type_id = g_boxed_type_register_static("ToolShade", (GBoxedCopyFunc)tool_shade_copy, (GBoxedFreeFunc)tool_shade_free); /* Set private variables. */ entry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_SHADE, DESC_SHADE, 1, readShade); visu_config_file_entry_setVersion(entry, 3.7f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_RESOURCE, exportParameters); } return g_define_type_id; } /** * tool_shade_new: * @labelUTF8: a UTF8 string that shortly named this new shade ; * @vectA: an array of three floating point values ; * @vectB: an array of three floating point values ; * @colorMode: an integer that describes the color code (see #ToolShadeColorMode enumeration). * * Create a linear shade. Its profile is given by an AX+B formula, * dealing on three channels. These channels are defined by the * @colorMode parameter. All given values are copied when the new * shade is created. * * Returns: the newly created ToolShade. */ ToolShade* tool_shade_new(const gchar* labelUTF8, float vectA[3], float vectB[3], ToolShadeColorMode colorMode) { ToolShade *shade; int i; g_return_val_if_fail(labelUTF8 && vectA && vectB && colorMode < TOOL_SHADE_COLOR_MODE_N_VALUES, (ToolShade*)0); DBG_fprintf(stderr, "Tool ToolShade: create a new ToolShade object (linear):"); shade = g_malloc(sizeof(ToolShade)); shade->labelUTF8 = g_strdup(labelUTF8); for (i = 0; i < 3; i++) { shade->vectA[i] = vectA[i]; shade->vectB[i] = vectB[i]; } shade->index = (float*)0; shade->vectCh[0] = (float*)0; shade->vectCh[1] = (float*)0; shade->vectCh[2] = (float*)0; shade->colorMode = colorMode; shade->mode = TOOL_SHADE_MODE_LINEAR; shade->userDefined = TRUE; shade->steps = (gchar*)0; DBG_fprintf(stderr, " %p.\n", (gpointer)shade); return shade; } /** * tool_shade_newFromData: * @labelUTF8: a UTF8 string that shortly named this new shade ; * @len: the size of arguments @vectCh1, @vectCh2 and @vectCh3 ; * @vectCh1: an array of floating point values for the first channel ; * @vectCh2: an array of floating point values for the second channel ; * @vectCh3: an array of floating point values for the third channel ; * @colorMode: an integer that describes the color code (see * #ToolShadeColorMode enumeration). * * Create a #ToolShade from direct data for three channels. These channels * are defined by the @colorMode parameter. All given values are * copied when the new shade is created. * * Returns: the newly created ToolShade. */ ToolShade* tool_shade_newFromData(const gchar* labelUTF8, guint len, float *vectCh1, float *vectCh2, float *vectCh3, ToolShadeColorMode colorMode) { ToolShade *shade; guint i; g_return_val_if_fail(labelUTF8 && vectCh1 && vectCh2 && vectCh3 && colorMode < TOOL_SHADE_COLOR_MODE_N_VALUES && len > 0, (ToolShade*)0); DBG_fprintf(stderr, "Tool ToolShade: create a new ToolShade object (array):"); shade = g_malloc(sizeof(ToolShade)); shade->labelUTF8 = g_strdup(labelUTF8); shade->colorMode = colorMode; shade->mode = TOOL_SHADE_MODE_ARRAY; shade->nVals = len; shade->index = g_malloc(sizeof(float) * len); shade->vectCh[0] = g_malloc(sizeof(float) * len); shade->vectCh[1] = g_malloc(sizeof(float) * len); shade->vectCh[2] = g_malloc(sizeof(float) * len); for (i = 0; i < len; i++) shade->index[i] = (float)i / (float)(len - 1); memcpy(shade->vectCh[0], vectCh1, sizeof(float) * len); memcpy(shade->vectCh[1], vectCh2, sizeof(float) * len); memcpy(shade->vectCh[2], vectCh3, sizeof(float) * len); shade->userDefined = TRUE; shade->steps = (gchar*)0; DBG_fprintf(stderr, " %p.\n", (gpointer)shade); return shade; } /** * tool_shade_newFromSteps: * @labelUTF8: a UTF8 string that shortly named this new shade ; * @lst: (transfer none) (element-type ToolShadeStep*): a list of * color steps. * @colorMode: a #ToolShadeColorMode mode. * * Create a #ToolShade from a set of steps defining colours at given * indexes. These channels are defined by the @colorMode * parameter. All given values are copied when the new shade is * created. The values of indexes will be normalised by this call to * range in [0;1]. Colour channel values must be in [0;1] for each step. * * Since: 3.7 * * Returns: (transfer full): the newly created ToolShade. */ ToolShade* tool_shade_newFromSteps(const gchar* labelUTF8, GList *lst, ToolShadeColorMode colorMode) { ToolShade *shade; float minVal, maxVal, f; GList *tmp; ToolShadeStep *step; guint i; g_return_val_if_fail(labelUTF8 && lst && (g_list_length(lst) > 1), (ToolShade*)0); DBG_fprintf(stderr, "Tool ToolShade: create a new ToolShade object (array):\n"); shade = g_malloc(sizeof(ToolShade)); shade->labelUTF8 = g_strdup(labelUTF8); shade->nVals = g_list_length(lst); shade->index = g_malloc(sizeof(float) * shade->nVals); shade->vectCh[0] = g_malloc(sizeof(float) * shade->nVals); shade->vectCh[1] = g_malloc(sizeof(float) * shade->nVals); shade->vectCh[2] = g_malloc(sizeof(float) * shade->nVals); shade->colorMode = colorMode; shade->mode = TOOL_SHADE_MODE_ARRAY; shade->userDefined = TRUE; shade->steps = (gchar*)0; /* Normalise entry. */ minVal = G_MAXFLOAT; maxVal = -G_MAXFLOAT; for (tmp = lst; tmp; tmp = g_list_next(tmp)) { minVal = MIN(minVal, ((ToolShadeStep*)tmp->data)->index); maxVal = MAX(maxVal, ((ToolShadeStep*)tmp->data)->index); } f = 1.f / (maxVal - minVal); DBG_fprintf(stderr, " | applying factor %g to index\n", f); for (tmp = lst, i = 0; tmp; tmp = g_list_next(tmp), i++) { step = (ToolShadeStep*)tmp->data; shade->index[i] = (step->index - minVal) * f; shade->vectCh[0][i] = CLAMP(step->channels[0], 0.f, 1.f); shade->vectCh[1][i] = CLAMP(step->channels[1], 0.f, 1.f); shade->vectCh[2][i] = CLAMP(step->channels[2], 0.f, 1.f); } DBG_fprintf(stderr, " | done %p.\n", (gpointer)shade); return shade; } /** * tool_shade_newFromString: * @labelUTF8: a UTF8 string that shortly named this new shade ; * @descr: a string with the shade description. * @colorMode: a #ToolShadeColorMode mode. * @error: (allow-none): a location for an error. * * As tool_shade_newFromSteps() routine, but it takes an unparsed * string describing the steps in @descr. * * Since: 3.7 * * Returns: (transfer full): the newly created ToolShade. */ ToolShade* tool_shade_newFromString(const gchar* labelUTF8, const gchar *descr, ToolShadeColorMode colorMode, GError **error) { ToolShade *shade; gchar **tokens; guint i; GList *lst; ToolShadeStep *step; g_return_val_if_fail(labelUTF8 && descr && error, (ToolShade*)0); DBG_fprintf(stderr, "Tool ToolShade: create a new ToolShade object (string): %s\n", descr); /* Read @size boolean values from @line. */ lst = (GList*)0; tokens = g_strsplit_set(descr, ",", TOOL_MAX_LINE_LENGTH); for (i = 0; tokens[i]; i++) if (tokens[i][0]) { step = g_malloc(sizeof(ToolShadeStep)); lst = g_list_append(lst, step); if (!parseValue(tokens[i], &(step->index), step->channels, error)) { g_strfreev(tokens); g_list_free_full(lst, g_free); return FALSE; } } shade = tool_shade_newFromSteps(labelUTF8, lst, colorMode); if (shade) shade->steps = g_strdup(descr); g_strfreev(tokens); g_list_free_full(lst, g_free); return shade; } /** * tool_shade_free: * @shade: a #ToolShade. * * Free all dynamic memory from @shade and free @shade itself. */ void tool_shade_free(ToolShade *shade) { if (shade) { g_free(shade->labelUTF8); g_free(shade->index); g_free(shade->vectCh[0]); g_free(shade->vectCh[1]); g_free(shade->vectCh[2]); g_free(shade->steps); g_free(shade); } } /** * tool_shade_copy: * @shade: a #ToolShade. * * Create a new shade deep copy of the first. * * Returns: a newly created shade. */ ToolShade* tool_shade_copy(ToolShade *shade) { ToolShade *out; if (!shade) return (ToolShade*)0; out = g_malloc(sizeof(ToolShade)); out->labelUTF8 = g_strdup(shade->labelUTF8); out->colorMode = shade->colorMode; out->mode = shade->mode; out->nVals = shade->nVals; out->vectA[0] = shade->vectA[0]; out->vectA[1] = shade->vectA[1]; out->vectA[2] = shade->vectA[2]; out->vectB[0] = shade->vectB[0]; out->vectB[1] = shade->vectB[1]; out->vectB[2] = shade->vectB[2]; out->index = g_memdup(shade->index, sizeof(float) * out->nVals); out->vectCh[0] = g_memdup(shade->vectCh[0], sizeof(float) * out->nVals); out->vectCh[1] = g_memdup(shade->vectCh[1], sizeof(float) * out->nVals); out->vectCh[2] = g_memdup(shade->vectCh[2], sizeof(float) * out->nVals); out->userDefined = shade->userDefined; out->steps = g_strdup(shade->steps); return out; } /** * tool_shade_compare: * @sh1: a #ToolShade ; * @sh2: a #ToolShade. * * Compare if the two shade are identical (first, smae mode, then same * values). * * Returns: TRUE if @shade1 is equivalent to @shade2. */ gboolean tool_shade_compare(ToolShade* sh1, ToolShade *sh2) { guint i; gboolean equal; g_return_val_if_fail(sh1 && sh2, FALSE); if (sh1->mode != sh2->mode) return FALSE; if (sh1->colorMode != sh2->colorMode) return FALSE; if (sh1->mode == TOOL_SHADE_MODE_LINEAR) return (sh1->vectA[0] == sh2->vectA[0] && sh1->vectA[1] == sh2->vectA[1] && sh1->vectA[2] == sh2->vectA[2] && sh1->vectB[0] == sh2->vectB[0] && sh1->vectB[1] == sh2->vectB[1] && sh1->vectB[2] == sh2->vectB[2]); else { if (sh1->nVals != sh2->nVals) return FALSE; equal = TRUE; for (i = 0; i < sh1->nVals && equal; i++) equal = equal && (sh1->index[i] == sh2->index[i]) && (sh1->vectCh[0][i] == sh2->vectCh[0][i]) && (sh1->vectCh[1][i] == sh2->vectCh[1][i]) && (sh1->vectCh[2][i] == sh2->vectCh[2][i]); return equal; } } /** * tool_shade_getLabel: * @shade: a valid #ToolShade object. * * Get the name (in UTF8) of the shade. * * Returns: a string naming the shade. */ gchar* tool_shade_getLabel(ToolShade *shade) { g_return_val_if_fail(shade, (gchar*)0); return shade->labelUTF8; } /** * tool_shade_getColorMode: * @shade: a valid #ToolShade object. * * Get the color mode of the shade (RGB or HSV). * * Returns: the color mode. */ ToolShadeColorMode tool_shade_getColorMode(ToolShade *shade) { g_return_val_if_fail(shade, (int)0); return shade->colorMode; } /** * tool_shade_getMode: * @shade: a valid #ToolShade object. * * Get the mode of the shade (linear, array...). * * Returns: the mode. */ ToolShadeMode tool_shade_getMode(ToolShade *shade) { g_return_val_if_fail(shade, (int)0); return shade->mode; } /** * tool_shade_setColorMode: * @shade: a #ToolShade ; * @mode: a new mode for the shade. * * Change the mode of the shade, see #ToolShadeColorMode. * * Returns: TRUE if @mode is different from previous @shade mode. */ gboolean tool_shade_setColorMode(ToolShade *shade, ToolShadeColorMode mode) { g_return_val_if_fail(shade, FALSE); if (shade->colorMode == mode) return FALSE; shade->colorMode = mode; return TRUE; } /** * tool_shade_getLinearCoeff: * @shade: a valid #ToolShade object ; * @vectA: a pointer to a floating point values array to store vect in AX+B ; * @vectB: a pointer to a floating point values array to store vect in AX+B. * * This methods can get the linear color transformation. The given * arrays (@vectA, @vectB) are read-only. This method return * FALSE if the @shade is not in a #TOOL_SHADE_MODE_LINEAR state. * * Returns: TRUE if @vectA, @vectB and @vectX have been set correctly. */ gboolean tool_shade_getLinearCoeff(ToolShade *shade, float **vectA, float **vectB) { g_return_val_if_fail(shade, FALSE); g_return_val_if_fail(shade->mode == TOOL_SHADE_MODE_LINEAR, FALSE); g_return_val_if_fail(vectA && vectB, FALSE); *vectA = shade->vectA; *vectB = shade->vectB; return TRUE; } /** * tool_shade_setLinearCoeff: * @shade: a #ToolShade ; * @coeff: a new value ; * @channel: either RGBA (from 0 to 3) ; * @order: the order in the linear approx (0 means constant and 1 is * the linear coeeficient). * * Change one value @coeff of the linear mode for the given @shade. * * Returns: TRUE if the new value changes anything. */ gboolean tool_shade_setLinearCoeff(ToolShade *shade, float coeff, int channel, int order) { float *pt; g_return_val_if_fail(shade, FALSE); g_return_val_if_fail(channel >= 0 && channel < 3 && order >= 0 && order < 2, FALSE); if (order == 0) pt = shade->vectB + channel; else pt = shade->vectA + channel; DBG_fprintf(stderr, "Tool ToolShade: set the %d value of vect[%d]" " to %f (previuosly %f).\n", channel, order, coeff, *pt); if (*pt == coeff) return FALSE; *pt = coeff; return TRUE; } /** * tool_shade_channelToRGB: * @shade: a #ToolShade ; * @rgba: a location to store the result of the colour transformation ; * @values: inout values. * * Like tool_shade_valueToRGB() but here, the three values * are applied respectivly for the Red, the Green and the Blue * channel. */ void tool_shade_channelToRGB(const ToolShade *shade, float rgba[4], float values[3]) { guint i; g_return_if_fail(shade); /* DBG_fprintf(stderr, "Tool Shade: get RGB from (%g ; %g ; %g).\n", */ /* values[0], values[1], values[2]); */ if (shade->mode == TOOL_SHADE_MODE_LINEAR) { rgba[0] = CLAMP(shade->vectA[0] * values[0] + shade->vectB[0], 0.f, 1.f); rgba[1] = CLAMP(shade->vectA[1] * values[1] + shade->vectB[1], 0.f, 1.f); rgba[2] = CLAMP(shade->vectA[2] * values[2] + shade->vectB[2], 0.f, 1.f); } else { for (i = 1; i < shade->nVals - 1; i++) if (values[0] < shade->index[i]) break; rgba[0] = CLAMP(shade->vectCh[0][i - 1] + (shade->vectCh[0][i] - shade->vectCh[0][i - 1]) * (values[0] - shade->index[i - 1]) / (shade->index[i] - shade->index[i - 1]), 0.f, 1.f); for (i = 1; i < shade->nVals - 1; i++) if (values[1] < shade->index[i]) break; rgba[1] = CLAMP(shade->vectCh[1][i - 1] + (shade->vectCh[1][i] - shade->vectCh[1][i - 1]) * (values[1] - shade->index[i - 1]) / (shade->index[i] - shade->index[i - 1]), 0.f, 1.f); for (i = 1; i < shade->nVals - 1; i++) if (values[2] < shade->index[i]) break; rgba[2] = CLAMP(shade->vectCh[2][i - 1] + (shade->vectCh[2][i] - shade->vectCh[2][i - 1]) * (values[2] - shade->index[i - 1]) / (shade->index[i] - shade->index[i - 1]), 0.f, 1.f); } /* Don't use alpha channel at present time. */ rgba[3] = 1.; /* Transform if required. */ if (shade->colorMode == TOOL_SHADE_COLOR_MODE_HSV) tool_color_convertHSVtoRGB(rgba, rgba); } /** * tool_shade_valueToRGB: * @shade: a valid #ToolShade object ; * @rgba: an array of size [4] ; * @value: the value ranged in [0;1]. * * Give a RGBA vector for the given value. */ void tool_shade_valueToRGB(const ToolShade *shade, float rgba[4], float value) { float vals[3]; vals[0] = value; vals[1] = value; vals[2] = value; tool_shade_channelToRGB(shade, rgba, vals); } /*********************************************/ /* Methods to deal with internal shade list. */ /*********************************************/ /** * tool_shade_getList: * * It returns a read-only pointer to the internal shade list. Use tool_shade_appendList() * to add new shades to this list. * * Returns: (transfer none) (element-type ToolShade*): a pointer to the internal shade list. */ GList* tool_shade_getList(void) { if (!toolShadeList) toolShadeList = _buildPresetList(); return toolShadeList; } /** * tool_shade_appendList: * @shade: a #ToolShade object. * @unique: a boolean. * * Add a shape to the internal list. Use the return value or tool_shade_getList() method * to look into this list. If @unique is TRUE, the internal list is * read and @shade is added only if it is not already existing in the list. * * Returns: (transfer none) (element-type ToolShade*): a read-only * pointer to the internal shade list. */ GList* tool_shade_appendList(ToolShade *shade, gboolean unique) { GList *lst; gboolean add; g_return_val_if_fail(shade, (GList*)0); DBG_fprintf(stderr, "Tool Shade: appending shade %p to %p.\n", (gpointer)shade, (gpointer)toolShadeList); if (!toolShadeList) toolShadeList = _buildPresetList(); add = TRUE; if (unique) for (lst = toolShadeList; lst && add; lst = g_list_next(lst)) if (tool_shade_compare(shade, (ToolShade*)lst->data)) add = FALSE; if (add) { toolShadeList = g_list_append(toolShadeList, (gpointer)shade); g_signal_emit_by_name(VISU_OBJECT_INSTANCE, "shadeNewAvailable", (gpointer)shade, NULL); } return toolShadeList; } static GList* _buildPresetList(void) { ToolShade *shade; float vectA[3], vectB[3]; /* Zero Centred Colored. */ #define zccLn 3 float zccH[zccLn] = {0.f, 0.333f, 0.667f}; float zccS[zccLn] = {1.0f, 0.0f, 1.0f}; float zccV[zccLn] = {1.f, 1.f, 1.f}; /* Zero Centred Light. */ #define zclLn 3 float zclR[zclLn] = {1.f, 1.f, 0.f}; float zclG[zclLn] = {0.0f, 1.0f, 0.0f}; float zclB[zclLn] = {0.f, 1.f, 1.f}; /* Jet colour shade. */ #define jetn 9 float jetR[jetn] = {0.f, 0.f, 0.f, 0.f, 0.5f, 1.f, 1.f, 1.f, 0.5f}; float jetG[jetn] = {0.f, 0.f, 0.5f, 1.f, 1.f, 1.f, 0.5f, 0.f, 0.f}; float jetB[jetn] = {0.5f, 1.f, 1.f, 1.f, 0.5f, 0.f, 0.f, 0.f, 0.f}; /* Create a blue to red color range. */ vectA[0] = -0.66667; vectA[1] = 0.; vectA[2] = 0.; vectB[0] = 0.66667; vectB[1] = 1.; vectB[2] = 1.; shade = tool_shade_new(_("blue to red"), vectA, vectB, TOOL_SHADE_COLOR_MODE_HSV); shade->userDefined = FALSE; toolShadeList = g_list_append(toolShadeList, (gpointer)shade); /* Create a black to white (through yellow and red) color range. */ vectA[0] = 2.66667; vectA[1] = 2.66667; vectA[2] = 4.; vectB[0] = 0.; vectB[1] = -1.; vectB[2] = -3.; shade = tool_shade_new(_("hot color"), vectA, vectB, TOOL_SHADE_COLOR_MODE_RGB); shade->userDefined = FALSE; toolShadeList = g_list_append(toolShadeList, (gpointer)shade); /* Create a blue to yellow (through dark purple) color range. */ vectA[0] = 1.33333; vectA[1] = 2.; vectA[2] = -2; vectB[0] = 0.; vectB[1] = -1.; vectB[2] = 1.; shade = tool_shade_new(_("blue to yellow"), vectA, vectB, TOOL_SHADE_COLOR_MODE_RGB); shade->userDefined = FALSE; toolShadeList = g_list_append(toolShadeList, (gpointer)shade); /* Create a blue and red shade with black zero centred. */ vectA[0] = -2.; vectA[1] = 0.; vectA[2] = 2.; vectB[0] = 1.; vectB[1] = 0.; vectB[2] = -1.; shade = tool_shade_new(_("zero centred dark"), vectA, vectB, TOOL_SHADE_COLOR_MODE_RGB); shade->userDefined = FALSE; toolShadeList = g_list_append(toolShadeList, (gpointer)shade); /* Create a blue and red shade with withe zero centred. */ shade = tool_shade_newFromData(_("zero centred light"), zclLn, zclR, zclG, zclB, TOOL_SHADE_COLOR_MODE_RGB); shade->userDefined = FALSE; toolShadeList = g_list_append(toolShadeList, (gpointer)shade); shade = tool_shade_newFromData(_("zero centred coloured"), zccLn, zccH, zccS, zccV, TOOL_SHADE_COLOR_MODE_HSV); shade->userDefined = FALSE; toolShadeList = g_list_append(toolShadeList, (gpointer)shade); /* Create a green to red color range. */ vectA[0] = -.3333; vectA[1] = 0.; vectA[2] = 0.; vectB[0] = 0.3333; vectB[1] = 1.; vectB[2] = 1.; shade = tool_shade_new(_("green to red"), vectA, vectB, TOOL_SHADE_COLOR_MODE_HSV); shade->userDefined = FALSE; toolShadeList = g_list_append(toolShadeList, (gpointer)shade); /* Create a white to red color range. */ vectA[0] = -.3333; vectA[1] = 0.8; vectA[2] = 0.; vectB[0] = 0.3333; vectB[1] = 0.1; vectB[2] = 1.; shade = tool_shade_new(_("light green to red"), vectA, vectB, TOOL_SHADE_COLOR_MODE_HSV); shade->userDefined = FALSE; toolShadeList = g_list_append(toolShadeList, (gpointer)shade); /* Create a black to white color range. */ vectA[0] = 0.; vectA[1] = 0.; vectA[2] = 1.; vectB[0] = 0.; vectB[1] = 0.; vectB[2] = 0.; shade = tool_shade_new(_("black to white"), vectA, vectB, TOOL_SHADE_COLOR_MODE_HSV); shade->userDefined = FALSE; toolShadeList = g_list_append(toolShadeList, (gpointer)shade); /* Create a black to white color range. */ vectA[0] = 0.; vectA[1] = 0.; vectA[2] = -1.; vectB[0] = 0.; vectB[1] = 0.; vectB[2] = 1.; shade = tool_shade_new(_("white to black"), vectA, vectB, TOOL_SHADE_COLOR_MODE_HSV); shade->userDefined = FALSE; toolShadeList = g_list_append(toolShadeList, (gpointer)shade); /* Create a black to red (through purple) color range. */ vectA[0] = 1.; vectA[1] = 1.; vectA[2] = 1.; vectB[0] = 0.; vectB[1] = 0.; vectB[2] = 0.; shade = tool_shade_new(_("purple color"), vectA, vectB, TOOL_SHADE_COLOR_MODE_HSV); shade->userDefined = FALSE; toolShadeList = g_list_append(toolShadeList, (gpointer)shade); /* Create the so-called Jet colour map. */ shade = tool_shade_newFromData(_("Jet map"), jetn, jetR, jetG, jetB, TOOL_SHADE_COLOR_MODE_RGB); shade->userDefined = FALSE; toolShadeList = g_list_append(toolShadeList, (gpointer)shade); return toolShadeList; } static gboolean parseValue(gchar *line, float *index, float rgb[3], GError **error) { gchar *name; PangoColor color; double index_; DBG_fprintf(stderr, "Tool Shade: parse step from '%s'\n", line); index_ = g_ascii_strtod(line, &name); if (errno != 0 || name == line) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_READ, _("1 floating point value should start a step '%s'.\n"), line); return FALSE; } *index = (float)index_; DBG_fprintf(stderr, " | index %g\n", *index); name += 1; g_strdelimit(name, "\"'", ' '); g_strstrip(name); if (!pango_color_parse(&color, name)) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_READ, _("cannot read a color from '%s' (name, #rgb, #rrggbb ... awaited).\n"), name); return FALSE; } rgb[0] = (float)color.red / (float)G_MAXUINT16; rgb[1] = (float)color.green / (float)G_MAXUINT16; rgb[2] = (float)color.blue / (float)G_MAXUINT16; DBG_fprintf(stderr, " | color %fx%fx%f\n", rgb[0], rgb[1], rgb[2]); return TRUE; } static void exportParameters(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { GList *lst; ToolShade *shade; guint i; PangoColor pcolor; gchar *color; GString *buf; visu_config_file_exportComment(data, DESC_SHADE); for (lst = toolShadeList; lst; lst = g_list_next(lst)) if (((ToolShade*)lst->data)->userDefined) { shade = (ToolShade*)lst->data; buf = g_string_new("("); if (shade->userDefined) g_string_append(buf, shade->steps); else for (i = 0; i < shade->nVals ; i++) { if (i != 0) g_string_append_printf(buf, ", "); pcolor.red = (guint16)(shade->vectCh[0][i] * (gfloat)G_MAXUINT16); pcolor.green = (guint16)(shade->vectCh[1][i] * (gfloat)G_MAXUINT16); pcolor.blue = (guint16)(shade->vectCh[2][i] * (gfloat)G_MAXUINT16); color = pango_color_to_string(&pcolor); g_string_append_printf(buf, "%g %s", shade->index[i], color); g_free(color); } g_string_append_printf(buf, ")"); visu_config_file_exportEntry(data, FLAG_SHADE, shade->labelUTF8, "%s", buf->str); g_string_free(buf, TRUE); } visu_config_file_exportComment(data, ""); } static gboolean readShade(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines _U_, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { gchar *name, *descr; char *startDef, *endDef; ToolShade *shade; startDef = strchr(lines[0], '('); endDef = strchr(lines[0], ')'); if (!startDef || !endDef) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_MISSING, _("Parse error at line %d, cannot find parenthesis" " containing the description of a shade.\n"), position); return FALSE; } name = g_strndup(lines[0], startDef - lines[0] - 1); descr = g_strndup(startDef + 1, endDef - startDef - 1); shade = tool_shade_newFromString(g_strstrip(name), descr, TOOL_SHADE_COLOR_MODE_RGB, error); g_free(name); g_free(descr); if (!shade) return FALSE; tool_shade_appendList(shade, TRUE); return TRUE; } v_sim-3.7.0/src/coreTools/toolShade.h0000644000353400050620000001135412215546101014415 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef TOOLSHADE_H #define TOOLSHADE_H #include #include #include /** * _ToolShade * * Opaque structure to store linear shade informations. */ struct _ToolShade; /** * ToolShade: * * Short name to address _ToolShade objects. */ typedef struct _ToolShade ToolShade; /** * ToolShadeColorMode: * @TOOL_SHADE_COLOR_MODE_RGB: variation described in the shade are applied to RGB coding colors ; * @TOOL_SHADE_COLOR_MODE_HSV: variation described in the shade are applied to HSV coding colors ; * @TOOL_SHADE_COLOR_MODE_N_VALUES: number of modes available. * * Defines color mode : Red-Green-Blue or Hue-Saturation-Value. */ typedef enum { TOOL_SHADE_COLOR_MODE_RGB, TOOL_SHADE_COLOR_MODE_HSV, TOOL_SHADE_COLOR_MODE_N_VALUES } ToolShadeColorMode; /** * ToolShadeMode: * @TOOL_SHADE_MODE_LINEAR: all channels are defined by a linear variation * Ax+B ; * @TOOL_SHADE_MODE_ARRAY: all channels are defined by a given array of * values ; * @TOOL_SHADE_MODE_N_VALUES: the number of different shade mode. * * Defines the storage of the shade mode. */ typedef enum { TOOL_SHADE_MODE_LINEAR, TOOL_SHADE_MODE_ARRAY, TOOL_SHADE_MODE_N_VALUES } ToolShadeMode; /** * ToolShadeStep: * @index: a value. * @channels: (array fixed-size=3): three values in [0;1] for RGB or * HSV channels. * * Stores a step in the definition of a shade. * * Since: 3.7 **/ typedef struct _ToolShadeStep ToolShadeStep; struct _ToolShadeStep { float index; float channels[3]; }; GType tool_shade_get_type(void); #define TOOL_TYPE_SHADE (tool_shade_get_type()) ToolShade* tool_shade_new(const gchar* labelUTF8, float vectA[3], float vectB[3], ToolShadeColorMode colorMode); ToolShade* tool_shade_newFromData(const gchar* labelUTF8, guint len, float *vectCh1, float *vectCh2, float *vectCh3, ToolShadeColorMode colorMode); ToolShade* tool_shade_newFromSteps(const gchar* labelUTF8, GList *lst, ToolShadeColorMode colorMode); ToolShade* tool_shade_newFromString(const gchar* labelUTF8, const gchar *descr, ToolShadeColorMode colorMode, GError **error); void tool_shade_free(ToolShade *shade); ToolShade* tool_shade_copy(ToolShade *shade); gboolean tool_shade_compare(ToolShade* sh1, ToolShade *sh2); gchar* tool_shade_getLabel(ToolShade *shade); ToolShadeColorMode tool_shade_getColorMode(ToolShade *shade); gboolean tool_shade_setColorMode(ToolShade *shade, ToolShadeColorMode mode); ToolShadeMode tool_shade_getMode(ToolShade *shade); gboolean tool_shade_getLinearCoeff(ToolShade *shade, float **vectA, float **vectB); gboolean tool_shade_setLinearCoeff(ToolShade *shade, float coeff, int channel, int order); void tool_shade_valueToRGB(const ToolShade *shade, float rgba[4], float value); void tool_shade_channelToRGB(const ToolShade *shade, float rgba[4], float values[3]); GList* tool_shade_getList(void); GList* tool_shade_appendList(ToolShade *shade, gboolean unique); #endif v_sim-3.7.0/src/coreTools/toolFileFormat.c0000644000353400050620000005546112215546101015423 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "toolFileFormat.h" #include #include #include /** * SECTION:toolFileFormat * @short_description: Describes file format objects (name patterns, * description, properties...). * * When dealing with files, it is convenient to class then by * formats, one format for JPEG files, one other for * postscript... Such file formats are characterized by their * description, explaining what they are, one or more name pattern * (e.g. "*.jpg") and some properties (e.g. compression level for JPEG * file). * This module describes objects that can store all these * informations and deals with them. To create a new file format, use * tool_file_format_new(). A #ToolFileFormat object can be used in a * GtkFileChooser object, using a GtkFileFilter. tool_file_format_getLabel() * will return directly the label to give to the GtkFileFilter and the * name patterns can be passed to it also. * A file format property is a #ToolOption value. There are some * convenient routines to add common boolean or integer * properties. For instance, use tool_file_format_addPropertyBoolean() * to add a boolean property to a given #ToolFileFormat object. Then the stored * properties can be iterated on using a #ToolFileFormatIter iterator. */ /** * ToolFileFormatIter: * @lst: internal pointer. * @name: name of the current iterated property (read only). * @label: label of the current iterated property (read only). * @val: its value (read only). * * Iterator on #ToolFileFormat object properties. See * tool_file_format_iterNextProperty(). * * Since: 3.6 */ GQuark tool_file_format_getQuark(void) { return g_quark_from_static_string("ToolFileFormat"); } /** * ToolFileFormatPrivate: * * Private attributes of #ToolFileFormat objects. **/ struct _ToolFileFormatPrivate { /* This is the list of file patterns, for example (*.jpg; *.jpeg; *.jpe). */ GList *fileType; gboolean ignoreFileType; /* This is a short text to describe this file format. It should not be bigger than 30 characters. */ gchar *name; /* This is a private field, it is a concatenation of "name ({patterns},)". */ gchar *labelString; /* A vlidating routine for this file format. */ ToolFileFormatValidate validate; /* This is a private field. It enables to add some properties to a file format. See fileFormatAdd_property*() and tool_file_format_property_get*() to control them. */ GList *properties; gboolean dispose_has_run; }; enum { PROP_0, NAME_PROP, LABEL_PROP, IGNORE_PROP }; static void tool_file_format_dispose (GObject *obj); static void tool_file_format_finalize(GObject *obj); static void tool_file_format_get_property(GObject* obj, guint property_id, GValue *value, GParamSpec *pspec); static void tool_file_format_set_property(GObject* obj, guint property_id, const GValue *value, GParamSpec *pspec); G_DEFINE_TYPE(ToolFileFormat, tool_file_format, G_TYPE_OBJECT) static void tool_file_format_class_init(ToolFileFormatClass *klass) { DBG_fprintf(stderr, "Tool FileFormat: creating the class of the object.\n"); G_OBJECT_CLASS(klass)->dispose = tool_file_format_dispose; G_OBJECT_CLASS(klass)->finalize = tool_file_format_finalize; G_OBJECT_CLASS(klass)->set_property = tool_file_format_set_property; G_OBJECT_CLASS(klass)->get_property = tool_file_format_get_property; /** * ToolFileFormat::name: * * The name identifying one file format, can be translate and used in a UI. * * Since: 3.7 */ g_object_class_install_property (G_OBJECT_CLASS(klass), NAME_PROP, g_param_spec_string("name", _("Name"), _("File format description."), "", G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE | G_PARAM_READABLE)); /** * ToolFileFormat::label: * * The label giving the file pattern, can be translate and used in a UI. * * Since: 3.7 */ g_object_class_install_property (G_OBJECT_CLASS(klass), LABEL_PROP, g_param_spec_string("label", _("Label"), _("Label used to show the file pattern."), "", G_PARAM_READABLE)); /** * ToolFileFormat::ignore-type: * * Store if the patterns of format descibes all possible patterns * for the file format. * * Since: 3.7 */ g_object_class_install_property (G_OBJECT_CLASS(klass), IGNORE_PROP, g_param_spec_boolean("ignore-type", _("Ignore file patterns"), _("Don't restrict file matching to the given patterns."), FALSE, G_PARAM_WRITABLE | G_PARAM_READABLE)); g_type_class_add_private(klass, sizeof(ToolFileFormatPrivate)); } static void tool_file_format_init(ToolFileFormat *fmt) { DBG_fprintf(stderr, "Tool FileFormat: initializing new object (%p).\n", (gpointer)fmt); fmt->priv = G_TYPE_INSTANCE_GET_PRIVATE(fmt, TOOL_TYPE_FILE_FORMAT, ToolFileFormatPrivate); fmt->priv->name = (gchar*)0; fmt->priv->fileType = (GList*)0; fmt->priv->labelString = (gchar*)0; fmt->priv->validate = (ToolFileFormatValidate)0; fmt->priv->properties = (GList*)0; fmt->priv->ignoreFileType = FALSE; } static void tool_file_format_dispose(GObject *obj) { DBG_fprintf(stderr, "Tool FileFormat: dispose object %p.\n", (gpointer)obj); if (TOOL_FILE_FORMAT(obj)->priv->dispose_has_run) return; TOOL_FILE_FORMAT(obj)->priv->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS(tool_file_format_parent_class)->dispose(obj); } static void tool_file_format_finalize(GObject *obj) { ToolFileFormatPrivate *format; GList *tmpLst; DBG_fprintf(stderr, "Tool FileFormat: finalize object %p.\n", (gpointer)obj); format = TOOL_FILE_FORMAT(obj)->priv; if (format->name) g_free(format->name); if (format->labelString) g_free(format->labelString); for (tmpLst = format->fileType; tmpLst; tmpLst = g_list_next(tmpLst)) g_free(tmpLst->data); g_list_free(format->fileType); for (tmpLst = format->properties; tmpLst; tmpLst = g_list_next(tmpLst)) tool_option_free(tmpLst->data); g_list_free(format->properties); /* Chain up to the parent class */ G_OBJECT_CLASS(tool_file_format_parent_class)->finalize(obj); DBG_fprintf(stderr, "Tool FileFormat: freeing ... OK.\n"); } static void tool_file_format_get_property(GObject* obj, guint property_id, GValue *value, GParamSpec *pspec) { ToolFileFormatPrivate *self = TOOL_FILE_FORMAT(obj)->priv; DBG_fprintf(stderr, "Tool FileFormat: get property '%s' -> ", g_param_spec_get_name(pspec)); switch (property_id) { case NAME_PROP: g_value_set_string(value, self->name); DBG_fprintf(stderr, "%s.\n", self->name); break; case LABEL_PROP: g_value_set_string(value, self->labelString); DBG_fprintf(stderr, "%s.\n", self->labelString); break; case IGNORE_PROP: g_value_set_boolean(value, self->ignoreFileType); DBG_fprintf(stderr, "%d.\n", self->ignoreFileType); break; default: /* We don't have any other property... */ G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, property_id, pspec); break; } } static void tool_file_format_set_property(GObject* obj, guint property_id, const GValue *value, GParamSpec *pspec) { ToolFileFormatPrivate *self = TOOL_FILE_FORMAT(obj)->priv; gint nbCharacterMax = 45, lg; DBG_fprintf(stderr, "Tool FileFormat: set property '%s' -> ", g_param_spec_get_name(pspec)); switch (property_id) { case NAME_PROP: lg = strlen(g_value_get_string(value)); if (lg > nbCharacterMax) { g_warning("The label property is bigger than" " %d characters and it will be truncated.", nbCharacterMax); lg = nbCharacterMax; } self->name = g_strndup(g_value_get_string(value), lg); DBG_fprintf(stderr, "%s.\n", self->name); break; case IGNORE_PROP: self->ignoreFileType = g_value_get_boolean(value); DBG_fprintf(stderr, "%d.\n", self->ignoreFileType); break; default: /* We don't have any other property... */ G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, property_id, pspec); break; } } static void _buildLabel(ToolFileFormat *format) { GList *lst; GString *tmpStr; tmpStr = g_string_new(format->priv->name); g_string_append_printf(tmpStr, " ("); for (lst = format->priv->fileType; lst; lst = g_list_next(lst)) { g_string_append_printf(tmpStr, "%s", (gchar*) lst->data); if (lst->next) g_string_append_printf(tmpStr, ", "); } if (!format->priv->fileType) g_string_append_printf(tmpStr, "no filter"); if (format->priv->fileType && format->priv->ignoreFileType) g_string_append_printf(tmpStr, ", ..."); g_string_append_printf(tmpStr, ")"); if (format->priv->labelString) g_free(format->priv->labelString); format->priv->labelString = tmpStr->str; g_string_free(tmpStr, FALSE); } /** * tool_file_format_newRestricted: * @descr: a short string to label a new file format. * @patterns: a set of patterns to identify files of this format. * * Allocate a new #ToolFileFormat. The @patterns argument is copied in * the #ToolFileFormat object and can be freed safely after the call to this method. * The @patterns list is not all the patterns supported by the format. * * Returns: (transfer none): a newly allocated ToolFileFormat, * or NULL if something goes wrong. */ ToolFileFormat* tool_file_format_newRestricted(const gchar* descr, const gchar** patterns) { ToolFileFormat *format; g_return_val_if_fail(descr && descr[0] && patterns, (ToolFileFormat*)0); format = TOOL_FILE_FORMAT(g_object_new(TOOL_TYPE_FILE_FORMAT, "name", descr, "ignore-type", TRUE, NULL)); tool_file_format_addPatterns(format, patterns); return format; } /** * tool_file_format_new: * @descr: a short string to label a new file format. * @patterns: (array zero-terminated=1) (element-type utf8): a set of patterns to identify files of this format. * * Allocate a new #ToolFileFormat. The @patterns argument is copied in * the #ToolFileFormat object and can be freed safely after the call to this method. * * Returns: (transfer none): a newly allocated ToolFileFormat, * or NULL if something goes wrong. */ ToolFileFormat* tool_file_format_new(const gchar* descr, const gchar** patterns) { ToolFileFormat *format; g_return_val_if_fail(descr && descr[0] && patterns, (ToolFileFormat*)0); format = TOOL_FILE_FORMAT(g_object_new(TOOL_TYPE_FILE_FORMAT, "name", descr, "ignore-type", FALSE, NULL)); tool_file_format_addPatterns(format, patterns); return format; } /** * tool_file_format_addPatterns: * @fmt: a #ToolFileFormat object. * @patterns: (array zero-terminated=1): a list of matching patterns. * * A file format may have pattern for the naming scheme of files, like * "*.jpg" and "*.jpeg" for JPEG files. It's not mandatory for a file * format to match its own pattern anyway. * * Since: 3.7 **/ void tool_file_format_addPatterns(ToolFileFormat *fmt, const gchar **patterns) { gint n; g_return_if_fail(IS_TOOL_FILE_FORMAT(fmt)); for (n = 0; patterns[n]; n++) fmt->priv->fileType = g_list_append(fmt->priv->fileType, g_strdup(patterns[n])); _buildLabel(fmt); } /** * tool_file_format_copy: * @from: a #ToolFileFormat object. * * Copy the given file format @from a create a new one. * * Since: 3.6 * * Returns: (transfer full): a newly created #ToolFileFormat. Should * be freed with g_object_unref(). */ ToolFileFormat* tool_file_format_copy(const ToolFileFormat *from) { ToolFileFormat *to; GList *lst; g_return_val_if_fail(from, (ToolFileFormat*)0); to = TOOL_FILE_FORMAT(g_object_new(TOOL_TYPE_FILE_FORMAT, "name", from->priv->name, "ignore-type", from->priv->ignoreFileType, NULL)); DBG_fprintf(stderr, "Tool ToolFileFormat: copy to file format %p.\n", (gpointer)to); to->priv->fileType = (GList*)0; for (lst = from->priv->fileType; lst; lst = g_list_next(lst)) to->priv->fileType = g_list_append(to->priv->fileType, g_strdup((gchar*)lst->data)); _buildLabel(to); to->priv->properties = (GList*)0; for (lst = from->priv->properties; lst; lst = g_list_next(lst)) to->priv->properties = g_list_append(to->priv->properties, tool_option_copy((ToolOption*)lst->data)); return to; } /** * tool_file_format_getName: * @format: a #ToolFileFormat. * * This method gives the name describing the file format. * * Returns: (transfer none): a string with the name. This string * should not be freed. */ const gchar* tool_file_format_getName(ToolFileFormat *format) { DBG_fprintf(stderr, "Tool ToolFileFormat: get the name of format '%p'.\n", (gpointer)format); g_return_val_if_fail(format, (gchar*)0); return format->priv->name; } /** * tool_file_format_getLabel: * @format: a #ToolFileFormat. * * This method gives a label describing the file format. * * Returns: (transfer none): a string made by the name and all * the paterns of the given format, given in parentethis. This string * should not be freed. */ const gchar* tool_file_format_getLabel(ToolFileFormat *format) { DBG_fprintf(stderr, "Tool ToolFileFormat: get the label of format '%p'.\n", (gpointer)format); g_return_val_if_fail(format, (gchar*)0); return format->priv->labelString; } /** * tool_file_format_getFilePatterns: * @format: a #ToolFileFormat. * * This method gives a list with the file patterns. * * Returns: (transfer none) (element-type utf8): a list with the file * patterns. This list should not be freed. * * Since: 3.6 */ const GList* tool_file_format_getFilePatterns(ToolFileFormat *format) { DBG_fprintf(stderr, "Tool ToolFileFormat: get the file patterns of format '%p'.\n", (gpointer)format); g_return_val_if_fail(format, (GList*)0); return format->priv->fileType; } /** * tool_file_format_canMatch: * @format: a #ToolFileFormat. * * This method is used to know if the file pattern list can be used * to match a given filename with tool_file_format_match(). * * Returns: TRUE if a call to tool_file_format_match() is safe. * * Since: 3.6 */ gboolean tool_file_format_canMatch(ToolFileFormat* format) { g_return_val_if_fail(format, FALSE); return !format->priv->ignoreFileType; } /** * tool_file_format_match: * @format: a #ToolFileFormat ; * @filename: a string to match. * * This method try to match the given string to one of the patterns of * the #ToolFileFormat @format. * * Returns: the matching pattern, if any. */ const gchar* tool_file_format_match(ToolFileFormat *format, const gchar *filename) { GList *tmpLst; g_return_val_if_fail(format, FALSE); DBG_fprintf(stderr, "Tool FileFormat: try to match '%s' with '%s' -> ", filename, format->priv->name); tmpLst = format->priv->fileType; while(tmpLst && !g_pattern_match_simple(tmpLst->data, filename)) tmpLst = g_list_next(tmpLst); DBG_fprintf(stderr, "%d.\n", (tmpLst != (GList*)0)); return (tmpLst)?(const gchar*)tmpLst->data:(const gchar*)0; } /** * tool_file_format_validate: * @format: a #ToolFileFormat ; * @filename: a string to match. * * This method runs a minimal parsing routine set with * tool_file_format_setValidator() to check if the provided filename * correspond to this file format. * * Since: 3.7 * * Returns: TRUE, if the file (after minimal parsing) is of this file * format. If there is no validator routine, it returns FALSE anyway. */ gboolean tool_file_format_validate(ToolFileFormat *format, const gchar *filename) { gboolean res; g_return_val_if_fail(format, FALSE); DBG_fprintf(stderr, "Tool FileFormat: try to validate '%s' with '%s' -> ", filename, format->priv->name); if (format->priv->validate) res = format->priv->validate(filename); else res = FALSE; DBG_fprintf(stderr, "%d.\n", res); return res; } /** * tool_file_format_setValidator: * @format: a #ToolFileFormat ; * @validate: (scope call): a pointer to a validator routine. * * Set up a validating routine that do a minimal parsing to check that * a provided file corresponds to this file format. * * Since: 3.7 */ void tool_file_format_setValidator(ToolFileFormat *format, ToolFileFormatValidate validate) { g_return_if_fail(format); format->priv->validate = validate; } /** * tool_file_format_addOption: * @format: a #ToolFileFormat object. * @opt: a #ToolOption object. * * File format may have options, like pseudo-potential pparameters in * case of BigDFT calculations. * * Since: 3.7 **/ void tool_file_format_addOption(ToolFileFormat *format, ToolOption *opt) { g_return_if_fail(IS_TOOL_FILE_FORMAT(format)); format->priv->properties = g_list_append(format->priv->properties, (gpointer)opt); } /** * tool_file_format_addPropertyBoolean: * @format: the #ToolFileFormat object. * @name: a name ; * @label: a description ; * @defaultVal: a default value. * * Add a new boolean property to the file format @format. * * Returns: (transfer none): a newly created #ToolOption, free with tool_option_free(). */ ToolOption* tool_file_format_addPropertyBoolean(ToolFileFormat *format, const gchar *name, const gchar *label, gboolean defaultVal) { ToolOption *opt; GValue *val; opt = tool_file_format_getPropertyByName(format, name); if (!opt) { opt = tool_option_new(name, label, G_TYPE_BOOLEAN); format->priv->properties = g_list_append(format->priv->properties, (gpointer)opt); } val = tool_option_getValue(opt); g_value_set_boolean(val, defaultVal); return opt; } /** * tool_file_format_addPropertyInt: * @format: the #ToolFileFormat object. * @name: a name ; * @label: a description ; * @defaultVal: a default value. * * Add a new integer property to the file format @format. * * Returns: (transfer none): a newly created #ToolOption, free with tool_option_free(). */ ToolOption* tool_file_format_addPropertyInt(ToolFileFormat *format, const gchar *name, const gchar *label, gint defaultVal) { ToolOption *opt; GValue *val; opt = tool_file_format_getPropertyByName(format, name); if (!opt) { opt = tool_option_new(name, label, G_TYPE_INT); format->priv->properties = g_list_append(format->priv->properties, (gpointer)opt); } val = tool_option_getValue(opt); g_value_set_int(val, defaultVal); return opt; } /** * tool_file_format_addPropertyDouble: * @format: the #ToolFileFormat object. * @name: a name ; * @label: a description ; * @defaultVal: a default value. * * Add a new integer property to the file format @format. * * Since: 3.7 * * Returns: (transfer none): a newly created #ToolOption, free with tool_option_free(). */ ToolOption* tool_file_format_addPropertyDouble(ToolFileFormat *format, const gchar *name, const gchar *label, gdouble defaultVal) { ToolOption *opt; GValue *val; opt = tool_file_format_getPropertyByName(format, name); if (!opt) { opt = tool_option_new(name, label, G_TYPE_DOUBLE); format->priv->properties = g_list_append(format->priv->properties, (gpointer)opt); } val = tool_option_getValue(opt); g_value_set_double(val, defaultVal); return opt; } /** * tool_file_format_iterNextProperty: * @format: a #ToolFileFormat object. * @iter: an iterator. * * Run to the next property of the file format @format. The iterator * attributes are updated so it's convenient to access the property * values and details, see #ToolFileFormatIter. * * Since: 3.6 * * Returns: TRUE if any. */ gboolean tool_file_format_iterNextProperty(ToolFileFormat *format, ToolFileFormatIter *iter) { if (!iter->lst) iter->lst = format->priv->properties; else iter->lst = g_list_next(iter->lst); if (!iter->lst) return FALSE; iter->name = (gchar*)tool_option_getName ((ToolOption*)iter->lst->data); iter->label = (gchar*)tool_option_getLabel((ToolOption*)iter->lst->data); iter->val = tool_option_getValue((ToolOption*)iter->lst->data); return TRUE; } /** * tool_file_format_getPropertyByName: * @format: a #ToolFileFormat. * @name: the name of a property. * * Retrieve the corresponding property to @name from the biven * @format. * * Since: 3.5 * * Returns: (transfer none): the found #ToolOption or NULL. */ ToolOption* tool_file_format_getPropertyByName(ToolFileFormat *format, const gchar *name) { GList *lst; g_return_val_if_fail(format && name, (ToolOption*)0); DBG_fprintf(stderr, "Tool FileFormat: grep property '%s' from file format %p.\n", name, (gpointer)format); for (lst = format->priv->properties; lst; lst = g_list_next(lst)) if (!strcmp(name, tool_option_getName((ToolOption*)lst->data))) return (ToolOption*)lst->data; return (ToolOption*)0; } v_sim-3.7.0/src/coreTools/toolFileFormat.h0000644000353400050620000001605512215546101015424 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse m�l : BILLARD, non joignable par m�l ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant � visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est r�gi par la licence CeCILL soumise au droit fran�ais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffus�e par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez acc�der � cet en-t�te signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept� les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef TOOLTOOL_FILE_FORMAT_H #define TOOLTOOL_FILE_FORMAT_H #include #include "toolOptions.h" G_BEGIN_DECLS /** * TOOL_TYPE_FILE_FORMAT: * * Return the associated #GType to the ToolFileFormat objects. */ #define TOOL_TYPE_FILE_FORMAT (tool_file_format_get_type ()) /** * TOOL_FILE_FORMAT: * @obj: the widget to cast. * * Cast the given object to a #ToolFileFormat object. */ #define TOOL_FILE_FORMAT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TOOL_TYPE_FILE_FORMAT, ToolFileFormat)) /** * TOOL_FILE_FORMAT_CLASS: * @klass: the class to cast. * * Cast the given class to a #ToolFileFormatClass object. */ #define TOOL_FILE_FORMAT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TOOL_TYPE_FILE_FORMAT, ToolFileFormatClass)) /** * IS_TOOL_FILE_FORMAT: * @obj: the object to test. * * Return if the given object is a valid #ToolFileFormat object. */ #define IS_TOOL_FILE_FORMAT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TOOL_TYPE_FILE_FORMAT)) /** * IS_TOOL_FILE_FORMAT_CLASS: * @klass: the class to test. * * Return if the given class is a valid #ToolFileFormatClass class. */ #define IS_TOOL_FILE_FORMAT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TOOL_TYPE_FILE_FORMAT)) /** * TOOL_FILE_FORMAT_GET_CLASS: * @obj: the widget to get the class of. * * Get the class of the given object. */ #define TOOL_FILE_FORMAT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, TOOL_TYPE_FILE_FORMAT, ToolFileFormatClass)) typedef struct _ToolFileFormatPrivate ToolFileFormatPrivate; /** * ToolFileFormat: * * An opaque structure. */ typedef struct _ToolFileFormat ToolFileFormat; struct _ToolFileFormat { GObject parent; ToolFileFormatPrivate *priv; }; /** * ToolFileFormatClass: * @parent: the parent. * * An opaque structure. */ typedef struct _ToolFileFormatClass ToolFileFormatClass; struct _ToolFileFormatClass { GObjectClass parent; }; /** * tool_file_format_get_type * * #GType are unique numbers to identify objects. * * Returns: the #GType associated with #ToolFileFormat objects. */ GType tool_file_format_get_type(void); typedef struct _ToolFileFormatIter ToolFileFormatIter; struct _ToolFileFormatIter { GList *lst; gchar *name; gchar *label; GValue *val; }; /** * TOOL_FILE_FORMAT_ERROR: (skip) * * Internal function for error handling. */ #define TOOL_FILE_FORMAT_ERROR tool_file_format_getQuark() /** * tool_file_format_getQuark: (skip) * * Internal routine to get the #GQuark to handle error related to file formats. */ GQuark tool_file_format_getQuark(void); /** * ToolFileFormatErrorFlag: * @TOOL_FILE_FORMAT_ERROR_METHOD: Error from the loading method. * @TOOL_FILE_FORMAT_ERROR_FILE: Error when opening. * @TOOL_FILE_FORMAT_ERROR_FORMAT: Wrongness in format. * @TOOL_FILE_FORMAT_ERROR_UNKNOWN_FORMAT: the file is not recognised. * * These are flags used when reading a file with a loading method associated to a file format. */ typedef enum { TOOL_FILE_FORMAT_ERROR_METHOD, /* Error from the rendering method. */ TOOL_FILE_FORMAT_ERROR_FILE, /* Error when opening. */ TOOL_FILE_FORMAT_ERROR_FORMAT, /* Wrongness in format. */ TOOL_FILE_FORMAT_ERROR_UNKNOWN_FORMAT } ToolFileFormatErrorFlag; /** * ToolFileFormatValidate: * @filename: (type filename): a path. * * Function to match a given @filename for a file format. See * tool_file_format_setValidator(). * * Since: 3.7 * * Returns: TRUE if @filename is a valid name for a file format. */ typedef gboolean (*ToolFileFormatValidate)(const gchar *filename); ToolFileFormat* tool_file_format_new(const gchar* descr, const gchar** patterns); ToolFileFormat* tool_file_format_newRestricted(const gchar* descr, const gchar** patterns); ToolFileFormat* tool_file_format_copy(const ToolFileFormat *from); void tool_file_format_addPatterns(ToolFileFormat *fmt, const gchar **patterns); const gchar* tool_file_format_getName(ToolFileFormat *format); const gchar* tool_file_format_getLabel(ToolFileFormat *format); const GList* tool_file_format_getFilePatterns(ToolFileFormat *format); gboolean tool_file_format_canMatch(ToolFileFormat* format); const gchar* tool_file_format_match(ToolFileFormat *format, const gchar*filename); gboolean tool_file_format_validate(ToolFileFormat *format, const gchar *filename); void tool_file_format_setValidator(ToolFileFormat *format, ToolFileFormatValidate validate); void tool_file_format_addOption(ToolFileFormat *format, ToolOption *opt); ToolOption* tool_file_format_addPropertyBoolean(ToolFileFormat *format, const gchar *name, const gchar *label, gboolean defaultVal); ToolOption* tool_file_format_addPropertyInt(ToolFileFormat *format, const gchar *name, const gchar *label, gint defaultVal); ToolOption* tool_file_format_addPropertyDouble(ToolFileFormat *format, const gchar *name, const gchar *label, gdouble defaultVal); ToolOption* tool_file_format_getPropertyByName(ToolFileFormat *format, const gchar *name); gboolean tool_file_format_iterNextProperty(ToolFileFormat *format, ToolFileFormatIter *iter); G_END_DECLS #endif v_sim-3.7.0/src/coreTools/toolMatrix.c0000644000353400050620000004725612215546101014642 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "toolMatrix.h" #include #include #include #include "toolConfigFile.h" /** * SECTION:toolMatrix * @short_description: Defines basic handlings on matrix. * * Some very basic linear algebra are redefined here. It also * gives access to coordinates conversion, essentially between * cartesian and spherical. */ /** * VisuBoxVertices: * @vertices: (array fixed-size=8) (element-type ToolVector): * * Structure used for bindings. * * Since: 3.7 */ /** * VisuBoxCell: * @box: (array fixed-size=6) (element-type gdouble): * * Structure used for bindings. * * Since: 3.7 */ /** * ToolVector: * @vect: (array fixed-size=3) (element-type gfloat): * * Structure used for bindings. * * Since: 3.7 */ /** * ToolGridSize: * @grid: (array fixed-size=3) (element-type guint): * * Structure used for bindings. * * Since: 3.7 */ /** * tool_matrix_reducePrimitiveVectors: * @reduced: (out caller-allocates) (array fixed-size=6): a storage for 6 floating point values ; * @full: (in) (array fixed-size=9): a full 3x3 matrix to be transformed. * * This routine transforms the given matrix @full into a reduced array * used by V_Sim to store box definition. * * Returns: FALSE if the given matrix is planar. */ gboolean tool_matrix_reducePrimitiveVectors(double reduced[6], double full[3][3]) { double X[3]; double Y[3]; double Z[3]; double u[3], x[3]; int i, j, k; double deltaIJ; double norm; g_return_val_if_fail(reduced && full, FALSE); DBG_fprintf(stderr, "Matrix: transform full to reduced matrix.\n"); DBG_fprintf(stderr, "Matrix: full is %8g %8g %8g\n" " %8g %8g %8g\n" " %8g %8g %8g\n", full[0][0], full[0][1], full[0][2], full[1][0], full[1][1], full[1][2], full[2][0], full[2][1], full[2][2]); /* Compute the X vector of the new basis, colinear with old x. */ for (i = 0; i < 3; i++) { X[i] = full[0][i]; x[i] = full[0][i]; } /* Compute the Y vector of the new basis, orthogonal to X and coplanar with X and old y vector. */ u[0] = full[0][1] * full[1][2] - full[0][2] * full[1][1]; u[1] = full[0][2] * full[1][0] - full[0][0] * full[1][2]; u[2] = full[0][0] * full[1][1] - full[0][1] * full[1][0]; /* DBG_fprintf(stderr, "x : %f %f %f\n", x[0], x[1], x[2]); */ /* DBG_fprintf(stderr, "x vect y : %f %f %f\n", u[0], u[1], u[2]); */ deltaIJ = x[0] * u[1] - x[1] * u[0]; if (deltaIJ != 0.) { i = 0; j = 1; k = 2; DBG_fprintf(stderr, " Using deltaIJ scheme with (i, j, k)" " = (%d, %d, %d)\n", i, j, k); } else { deltaIJ = x[0] * u[2] - x[2] * u[0]; if (deltaIJ != 0.) { i = 0; j = 2; k = 1; DBG_fprintf(stderr, " Using deltaIJ scheme with (i, j, k)" " = (%d, %d, %d)\n", i, j, k); } else { deltaIJ = x[1] * u[2] - x[2] * u[1]; if (deltaIJ != 0.) { i = 1; j = 2; k = 0; DBG_fprintf(stderr, " Using deltaIJ scheme with (i, j, k)" " = (%d, %d, %d)\n", i, j, k); } else { g_warning("The input axes are not in 3D."); return FALSE; } } } Y[k] = -1.; Y[i] = (x[k] * u[j] - x[j] * u[k]) / deltaIJ; Y[j] = (x[i] * u[k] - x[k] * u[i]) / deltaIJ; /* We need to turn Y if y.Y is negative. */ norm = 0.; for (i = 0; i < 3; i++) norm += full[1][i] * Y[i]; if (norm < 0.) for (i = 0; i < 3; i++) Y[i] *= -1.; /* Compute the new Z vector in order to form a direct orthogonal basis with X and Y. */ Z[0] = X[1] * Y[2] - X[2] * Y[1]; Z[1] = X[2] * Y[0] - X[0] * Y[2]; Z[2] = X[0] * Y[1] - X[1] * Y[0]; /* Normalise the new basis (X, Y, Z). */ norm = 0.; for (i = 0; i < 3; i++) norm += X[i] * X[i]; norm = sqrt(norm); for (i = 0; i < 3; i++) X[i] /= norm; norm = 0.; for (i = 0; i < 3; i++) norm += Y[i] * Y[i]; norm = sqrt(norm); for (i = 0; i < 3; i++) Y[i] /= norm; norm = 0.; for (i = 0; i < 3; i++) norm += Z[i] * Z[i]; norm = sqrt(norm); for (i = 0; i < 3; i++) Z[i] /= norm; /* DBG_fprintf(stderr, "X : %f %f %f\n", X[0], X[1], X[2]); */ /* DBG_fprintf(stderr, "Y : %f %f %f\n", Y[0], Y[1], Y[2]); */ /* DBG_fprintf(stderr, "Z : %f %f %f\n", Z[0], Z[1], Z[2]); */ /* Compute the reduce value for the basis. */ DBG_fprintf(stderr, " Write to reduced (%p).\n", (gpointer)reduced); reduced[0] = 0.; for (i = 0; i < 3; i++) reduced[0] += X[i] * full[0][i]; reduced[1] = 0.; for (i = 0; i < 3; i++) reduced[1] += X[i] * full[1][i]; reduced[2] = 0.; for (i = 0; i < 3; i++) reduced[2] += Y[i] * full[1][i]; reduced[3] = 0.; for (i = 0; i < 3; i++) reduced[3] += X[i] * full[2][i]; reduced[4] = 0.; for (i = 0; i < 3; i++) reduced[4] += Y[i] * full[2][i]; reduced[5] = 0.; for (i = 0; i < 3; i++) reduced[5] += Z[i] * full[2][i]; DBG_fprintf(stderr, " Write OK.\n"); return TRUE; } /** * tool_matrix_dtof: * @mf: a matrix in single precision. * @md: a matrix in double precision. * * Cast @md into @mf. * * Since: 3.7 **/ void tool_matrix_dtof(float mf[3][3], double md[3][3]) { int i, j; for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) mf[i][j] = md[i][j]; } /** * tool_matrix_setIdentity: * @mat: (array fixed-size=9): a matrix location. * * Initialise @mat with the identity. * * Since: 3.7 **/ void tool_matrix_setIdentity(float mat[3][3]) { mat[0][0] = 1.f; mat[0][1] = 0.f; mat[0][2] = 0.f; mat[1][0] = 0.f; mat[1][1] = 1.f; mat[1][2] = 0.f; mat[2][0] = 0.f; mat[2][1] = 0.f; mat[2][2] = 1.f; } /** * tool_matrix_productMatrix: * @matRes: an array of floating point values of size 3x3 ; * @matA: an array of floating point values of size 3x3 ; * @matB: an array of floating point values of size 3x3. * * Compute the mathematical product between @matA and @matB and * put the result matrix in @matRes. * * Since: 3.2 */ void tool_matrix_productMatrix(float matRes[3][3], float matA[3][3], float matB[3][3]) { int i, j, k; for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) { matRes[i][j] = 0.; for (k = 0; k < 3; k++) matRes[i][j] += matA[i][k] * matB[k][j]; } } /** * tool_matrix_productVector: * @vectRes: an array of floating point values of size 3 ; * @mat: an array of floating point values of size 3x3 ; * @vect: an array of floating point values of size 3. * * Compute the mathematical product between @matA and @vect and * put the result vector in @vectRes. * * Since: 3.2 */ void tool_matrix_productVector(float vectRes[3], float mat[3][3], float vect[3]) { int i, j; for (i = 0; i < 3; i++) { vectRes[i] = 0.; for (j = 0; j < 3; j++) vectRes[i] += mat[i][j] * vect[j]; } } /** * tool_matrix_determinant: * @mat: a matrix. * * Calculate the determinant of matrix @mat. * * Since: 3.6 * * Returns: the determinant value. */ float tool_matrix_determinant(float mat[3][3]) { DBG_fprintf(stderr, "Tool Matrix: %g is det( %8g %8g %8g\n" " %8g %8g %8g\n" " %8g %8g %8g )\n", mat[0][0] * (mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1]) - mat[0][1] * (mat[1][0] * mat[2][2] - mat[1][2] * mat[2][0]) + mat[0][2] * (mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0]), mat[0][0], mat[0][1], mat[0][2], mat[1][0], mat[1][1], mat[1][2], mat[2][0], mat[2][1], mat[2][2]); return mat[0][0] * (mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1]) - mat[0][1] * (mat[1][0] * mat[2][2] - mat[1][2] * mat[2][0]) + mat[0][2] * (mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0]); } /** * tool_matrix_invert: * @inv: a matrix (out values). * @mat: a matrix. * * Calculate the inverse matrix of matrix @mat and store it in @inv. * * Since: 3.6 * * Returns: FALSE if @mat is singular. */ gboolean tool_matrix_invert(float inv[3][3], float mat[3][3]) { float det; det = tool_matrix_determinant(mat); if (det == 0.f) return FALSE; det = 1.f / det; inv[0][0] = det * (mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1]); inv[0][1] = det * (mat[0][2] * mat[2][1] - mat[0][1] * mat[2][2]); inv[0][2] = det * (mat[0][1] * mat[1][2] - mat[0][2] * mat[1][1]); inv[1][0] = det * (mat[1][2] * mat[2][0] - mat[1][0] * mat[2][2]); inv[1][1] = det * (mat[0][0] * mat[2][2] - mat[0][2] * mat[2][0]); inv[1][2] = det * (mat[0][2] * mat[1][0] - mat[0][0] * mat[1][2]); inv[2][0] = det * (mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0]); inv[2][1] = det * (mat[0][1] * mat[2][0] - mat[0][0] * mat[2][1]); inv[2][2] = det * (mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0]); return TRUE; } /** * tool_matrix_getRotationFromFull: * @rot: a rotation matrix (out values). * @full: the description of basis set in full development. * @box: the description of basis set in align X axis. * * There is a rotation matrix to transform from full cartesian * coordinates into reduced box cartesian coordinates. * * Since: 3.6 * * Returns: TRUE if @full does not describe properly a 3D box. */ gboolean tool_matrix_getRotationFromFull(float rot[3][3], double full[3][3], double box[6]) { float boxMat[3][3], fileMat[3][3], fileMatInv[3][3]; /* We create the rotation matrix that pass from the cartesian coordinates of the file to the cartesian coordinates of the box. */ boxMat[0][0] = box[0]; boxMat[0][1] = box[1]; boxMat[0][2] = box[3]; boxMat[1][0] = 0.f; boxMat[1][1] = box[2]; boxMat[1][2] = box[4]; boxMat[2][0] = 0.f; boxMat[2][1] = 0.f; boxMat[2][2] = box[5]; fileMat[0][0] = (float)full[0][0]; fileMat[0][1] = (float)full[1][0]; fileMat[0][2] = (float)full[2][0]; fileMat[1][0] = (float)full[0][1]; fileMat[1][1] = (float)full[1][1]; fileMat[1][2] = (float)full[2][1]; fileMat[2][0] = (float)full[0][2]; fileMat[2][1] = (float)full[1][2]; fileMat[2][2] = (float)full[2][2]; if (!tool_matrix_invert(fileMatInv, fileMat)) return FALSE; tool_matrix_productMatrix(rot, boxMat, fileMatInv); DBG_fprintf(stderr, "Tool Matrix: rotation matrix %8g %8g %8g\n" " %8g %8g %8g\n" " %8g %8g %8g\n", rot[0][0], rot[0][1], rot[0][2], rot[1][0], rot[1][1], rot[1][2], rot[2][0], rot[2][1], rot[2][2]); return TRUE; } #ifndef RAD2DEG #define RAD2DEG(x) (57.29577951308232311 * x) #endif #ifndef DEG2RAD #define DEG2RAD(x) (0.01745329251994329509 * x) #endif /** * tool_matrix_cartesianToSpherical: * @spherical: an allocated array of 3 floating point values to store the result ; * @cartesian: an allocated array of 3 floating point values to read the input. * * A method to transform cartesian coordinates in spherical * coordinates (radius, phi and theta). * * Since: 3.3 */ void tool_matrix_cartesianToSpherical(float *spherical, float *cartesian) { /* s[0] = rho, s[1] = theta, s[2] = phi c[0] = x, c[1] = y, c[2] = z */ const float *c = cartesian; float *s = spherical; double rho; double theta; double phi; if(c[0] == 0 && c[1] == 0 && c[2] == 0) { s[0] = 0; s[1] = 0; s[2] = 0; return; } rho = sqrt(c[0]*c[0] + c[1]*c[1] + c[2]*c[2]); if(c[0] == 0 && c[1] == 0) theta = (c[2] > 0) ? 0 : G_PI; else theta = acos(CLAMP(c[2]/rho, -1., 1.)); if(c[0] != 0) { phi = atan(c[1]/c[0]) + G_PI*((c[0] < 0) ? 1 : 0); } else { if(c[1] == 0) /* facultatif*/ phi = 0; /* facultatif*/ else if(c[1] > 0) phi = G_PI_2; else phi = -G_PI_2; } s[0] = rho; s[1] = /*tool_modulo_float(RAD2DEG(theta), 180);*/ RAD2DEG(theta); s[2] = tool_modulo_float(RAD2DEG(phi), 360); } /** * tool_matrix_sphericalToCartesian: * @cartesian: an allocated array of 3 floating point values to store the result ; * @spherical: an allocated array of 3 floating point values to read the input. * * A method to transform spherical coordinates (radius, phi and theta) * to cartesian coordinates. * * Since: 3.3 */ void tool_matrix_sphericalToCartesian(float *cartesian, float *spherical) { cartesian[0] = spherical[0] * sin(DEG2RAD(spherical[1]))*cos(DEG2RAD(spherical[2])); cartesian[1] = spherical[0] * sin(DEG2RAD(spherical[1]))*sin(DEG2RAD(spherical[2])); cartesian[2] = spherical[0] * cos(DEG2RAD(spherical[1])); } /** * tool_matrix_getInter2D: * @lambda: a location to store a float. * @a: a point. * @b: another point. * @A: a point. * @B: another point. * * Get the intersection coeeficient of lines [ab] and [AB]. * * Returns: TRUE if [ab] and [AB] have an intersection. */ gboolean tool_matrix_getInter2D(float *lambda, float a[2], float b[2], float A[2], float B[2]) { float denom; denom = (b[0] - a[0]) * (B[1] - A[1]) - (b[1] - a[1]) * (B[0] - A[0]); if (denom == 0.f) return FALSE; *lambda = (A[0] - a[0]) * (B[1] - A[1]) - (A[1] - a[1]) * (B[0] - A[0]); *lambda /= denom; /* fprintf(stderr, "%g\n", *lambda); */ return TRUE; } /** * tool_matrix_getInter2DFromList: (skip) * @i: a location to store a point. * @lambda: a location to store a float. * @a: a point. * @b: another point. * @set: a list of points. * * Same as tool_matrix_getInter2D(), but from a list of points. * * Returns: TRUE if an intersection exists. */ gboolean tool_matrix_getInter2DFromList(float i[2], float *lambda, float a[2], float b[2], GList *set) { float *pt1, *pt2; float l, min; i[0] = a[0]; i[1] = a[1]; min = 1.2f; for (pt1 = (float*)(g_list_last(set)->data); set; set = g_list_next(set)) { pt2 = (float*)set->data; if (tool_matrix_getInter2D(&l, a, b, pt1, pt2)) min = (l >= 0.f)?MIN(min, l):min; pt1 = pt2; } if (min > 1.00001f) return FALSE; if (lambda) *lambda = min; i[0] = (b[0] - a[0]) * min + a[0]; i[1] = (b[1] - a[1]) * min + a[1]; /* fprintf(stderr, "%g -> %gx%g\n", min, i[0], i[1]); */ return TRUE; } #define FLAG_PARAMETER_THRESHOLD "scale_log_threshold" #define DESC_PARAMETER_THRESHOLD "Value of the threshold used in the zero centred TOOL_MATRIX_SCALING_LOG scaling function ; a positive float (1e-3)" static float threshold = 1e-3; static void exportParameters(GString *data, VisuData *dataObj, VisuGlView *view); /** * tool_matrix_getScaledLinear: * @x: the initial value ; * @minmax: the boundaries for the @x argument ; * * Transform @x into [0;1] with a linear scale. * * Returns: a value into [0;1]. * * Since: 3.5 */ double tool_matrix_getScaledLinear(double x, double minmax[2]) { return ((CLAMP(x, minmax[0], minmax[1]) - minmax[0]) / (minmax[1] - minmax[0])); } /** * tool_matrix_getScaledLog: * @x: the initial value ; * @minmax: the boundaries for the @x argument. * * Transform @x into [0;1] with a log scale. * * Returns: a value into [0;1]. * * Since: 3.5 */ double tool_matrix_getScaledLog(double x, double minmax[2]) { /* double v; */ double lMinMax[2]; lMinMax[0] = log10(MAX(1e-12, minmax[0])); lMinMax[1] = log10(MAX(1e-12, minmax[1])); return tool_matrix_getScaledLinear(log10(MAX(1e-12, x)), lMinMax); /* return (v == 0.)?0.: - (log10(v) - param) / param; */ } /** * tool_matrix_getScaledZeroCentredLog: * @x: the initial value ; * @minmax: the boundaries for the @x argument. * * Transform @x into [0;1] with a log scale with zero centred values. * * Returns: a value into [0;1]. * * Since: 3.5 */ double tool_matrix_getScaledZeroCentredLog(double x, double minmax[2]) { double v, m; m = MAX(minmax[1], -minmax[0]); v = CLAMP(x, -m, m); return 0.5 + (v < 0.?-1.:1.) * (log(m * threshold) - log(MAX(ABS(v), m * threshold))) / (2. * log(threshold)); } /** * tool_matrix_getScaledLinearInv: * @x: the initial value ; * @minmax: the boundaries for the @x argument. * * Reverse function for tool_matrix_getScaledLinear(). * * Returns: a value into [0;1]. * * Since: 3.5 */ double tool_matrix_getScaledLinearInv(double x, double minmax[2]) { return (minmax[0] + CLAMP(x, 0., 1.) * (minmax[1] - minmax[0])); } /** * tool_matrix_getScaledLogInv: * @x: the initial value ; * @minmax: the boundaries for the @x argument. * * Reverse function for tool_matrix_getScaledLog(). * * Returns: a value into [0;1]. * * Since: 3.5 */ double tool_matrix_getScaledLogInv(double x, double minmax[2]) { return MAX(1e-12, minmax[0]) * pow(MAX(1e-12, minmax[1]) / MAX(1e-12, minmax[0]), CLAMP(x, 0., 1.)); /* return (minmax[0] + (minmax[1] - minmax[0]) * exp((1. - CLAMP(x, 0., 1.)) * param)); */ } /** * tool_matrix_getScaledZeroCentredLogInv: * @x: the initial value ; * @minmax: the boundaries for the @x argument. * * Reverse function for tool_matrix_getScaledZeroCentredLog(). * * Returns: a value into [0;1]. * * Since: 3.5 */ double tool_matrix_getScaledZeroCentredLogInv(double x, double minmax[2]) { double s, m, out; DBG_fprintf(stderr, "Matrix: get inv ZCL %g (%g-%g).\n", x, minmax[0], minmax[1]); s = (x < 0.5)?-1.:1.; m = MAX(minmax[1], -minmax[0]); out = s * m * threshold * exp(s * (1. - 2. * CLAMP(x, 0., 1.)) * log(threshold)); DBG_fprintf(stderr, " | %g (%g)\n", out, tool_matrix_getScaledZeroCentredLog(out, minmax)); return out; } static void exportParameters(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { g_string_append_printf(data, "# %s\n", DESC_PARAMETER_THRESHOLD); g_string_append_printf(data, "%s: %f\n\n", FLAG_PARAMETER_THRESHOLD, threshold); } /** * tool_matrix_init: (skip) * * This method is used by V_Sim internally and should not be called. * * Since: 3.5 */ void tool_matrix_init(void) { float rg[2] = {G_MINFLOAT, G_MAXFLOAT}; VisuConfigFileEntry *entry; /* Set private variables. */ entry = visu_config_file_addFloatArrayEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_THRESHOLD, DESC_PARAMETER_THRESHOLD, 1, &threshold, rg); visu_config_file_entry_setVersion(entry, 3.5f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_PARAMETER, exportParameters); } v_sim-3.7.0/src/coreTools/toolMatrix.h0000644000353400050620000001412012215546101014627 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef TOOLMATRIX_H #define TOOLMATRIX_H #include G_BEGIN_DECLS /** * TOOL_XYZ_MASK_X: * * This value can be used to create a mask for methods that * require one for reading xyz coordinates array. This value actually * correspond to the x direction. * * Since: 3.3 */ #define TOOL_XYZ_MASK_X (1 << 0) /** * TOOL_XYZ_MASK_Y: * * This value can be used to create a mask for methods that * require one for reading xyz coordinates array. This value actually * correspond to the y direction. * * Since: 3.3 */ #define TOOL_XYZ_MASK_Y (1 << 1) /** * TOOL_XYZ_MASK_Z: * * This value can be used to create a mask for methods that * require one for reading xyz coordinates array. This value actually * correspond to the z direction. * * Since: 3.3 */ #define TOOL_XYZ_MASK_Z (1 << 2) /** * TOOL_XYZ_MASK_ALL: * * This value can be used to create a mask for methods that * require one for reading xyz coordinates array. This value is a * shortcut for #TOOL_XYZ_MASK_X | #TOOL_XYZ_MASK_Y | #TOOL_XYZ_MASK_Z. * * Since: 3.3 */ #define TOOL_XYZ_MASK_ALL (7) void tool_matrix_setIdentity(float mat[3][3]); void tool_matrix_dtof(float mf[3][3], double md[3][3]); void tool_matrix_productMatrix(float matRes[3][3], float matA[3][3], float matB[3][3]); void tool_matrix_productVector(float vectRes[3], float mat[3][3], float vect[3]); gboolean tool_matrix_invert(float inv[3][3], float mat[3][3]); float tool_matrix_determinant(float mat[3][3]); gboolean tool_matrix_reducePrimitiveVectors(double reduced[6], double full[3][3]); gboolean tool_matrix_getRotationFromFull(float rot[3][3], double full[3][3], double box[6]); /** * ToolMatrixSphericalCoord: * @TOOL_MATRIX_SPHERICAL_MODULUS: the modulus of a spherical vector. * @TOOL_MATRIX_SPHERICAL_THETA: the theta angle of a spherical vector. * @TOOL_MATRIX_SPHERICAL_PHI: the phi angle of a spherical vector. * * This is used to access the ordering of the vectors with * tool_matrix_cartesianToSpherical() or with * tool_matrix_sphericalToCartesian(). * * Since: 3.6 */ typedef enum { TOOL_MATRIX_SPHERICAL_MODULUS, TOOL_MATRIX_SPHERICAL_THETA, TOOL_MATRIX_SPHERICAL_PHI } ToolMatrixSphericalCoord; void tool_matrix_cartesianToSpherical(float *spherical, float *cartesian); void tool_matrix_sphericalToCartesian(float *cartesian, float *spherical); /** * ToolMatrixScalingFlag: * @TOOL_MATRIX_SCALING_LINEAR: a linear convertion from [min,max] to [0,1] ; * @TOOL_MATRIX_SCALING_LOG: a TOOL_MATRIX_SCALING_LOGic transformation from [min,max] to [0,1], the * formula is -(f(x) - f(m) / f(m) where f(x) = * ln((x-xmin)/(xmax-xmin)) ; * @TOOL_MATRIX_SCALING_ZERO_CENTRED_LOG: a TOOL_MATRIX_SCALING_LOGic transformation for data that are * zero centred, the formula is * 0.5+s*(log(MAX*SEUIL)-log(max(abs(x),MAX*SEUIL)))/(2*log(SEUIL)) * where s is the sign, max=max(xmax,-xmin) and seuil a parameter * (1e-5). * @TOOL_MATRIX_SCALING_N_VALUES: number of available scale functions. * * Flag used to specify the transformation for scalarFieldDraw_map() * routine. * * Since: 3.4 */ typedef enum { TOOL_MATRIX_SCALING_LINEAR, TOOL_MATRIX_SCALING_LOG, TOOL_MATRIX_SCALING_ZERO_CENTRED_LOG, TOOL_MATRIX_SCALING_N_VALUES } ToolMatrixScalingFlag; /** * tool_matrix_getScaledValue: * @x: the initial value ; * @minmax: the boundaries for the @x argument. * * Transform @x into [0;1] using the given @minmax values. * * Returns: a value into [0;1]. * * Since: 3.4 */ typedef double (*tool_matrix_getScaledValue)(double x, double minmax[2]); double tool_matrix_getScaledLinear(double x, double minmax[2]); double tool_matrix_getScaledLog(double x, double minmax[2]); double tool_matrix_getScaledZeroCentredLog(double x, double minmax[2]); double tool_matrix_getScaledLinearInv(double x, double minmax[2]); double tool_matrix_getScaledLogInv(double x, double minmax[2]); double tool_matrix_getScaledZeroCentredLogInv(double x, double minmax[2]); gboolean tool_matrix_getInter2D(float *lambda, float a[2], float b[2], float A[2], float B[2]); gboolean tool_matrix_getInter2DFromList(float i[2], float *lambda, float a[2], float b[2], GList *set); /* These structures are used for bindings. */ typedef struct _ToolVector ToolVector; struct _ToolVector { float vect[3]; }; typedef struct _ToolGridSize ToolGridSize; struct _ToolGridSize { guint grid[3]; }; void tool_matrix_init(void); G_END_DECLS #endif v_sim-3.7.0/src/coreTools/toolColor.c0000644000353400050620000003656112215546101014451 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "toolColor.h" #include #include #include #include /** * SECTION:toolColor * @short_description: Simple handling and storage of RGBA colours. * * This file defines a basic structure to store colours (not * using the GDK one beca use V_Sim core should not rely on GDK and * GTK): #ToolColor. Several transformations are possible on a colour, * going from and to RGB encoding. Use tool_color_convertHSVtoRGB() and * tool_color_convertHSLtoRGB() to do that. * * This file gives also the capability to store known colours in * a list. Use methods such as tool_color_addColor() or * tool_color_addFloatRGBA(). Them, one can access to stored colours, using * tool_color_getByValues() or tool_color_getByColor(). */ static ToolColor* color_copy(ToolColor *boxed); /******************/ /* Storing colors */ /******************/ #define COLOR_NB_MAX 10 GList *color_storageArray = (GList*)0; #define N_BRIGHT_COLORS 20 static ToolColor brightColors[N_BRIGHT_COLORS] = {{{1,0,0, 1.f}, (gpointer)0}, {{0,1,0, 1.f}, (gpointer)0}, {{0,0,1, 1.f}, (gpointer)0}, {{1,0,1, 1.f}, (gpointer)0}, {{0,1,1, 1.f}, (gpointer)0}, {{1,1,0, 1.f}, (gpointer)0}, {{1,0.5,0, 1.f}, (gpointer)0}, {{0.5,0,0.5, 1.f}, (gpointer)0}, {{0,0.5,0.5, 1.f}, (gpointer)0}, {{0.5,0.5,0, 1.f}, (gpointer)0}, {{0.5,0,0, 1.f}, (gpointer)0}, {{0,0.5,0, 1.f}, (gpointer)0}, {{0,0,0.5, 1.f}, (gpointer)0}, {{0.5,0.5,0.5, 1.f}, (gpointer)0}, {{1,0,0.5, 1.f}, (gpointer)0}, {{0.5,1,0, 1.f}, (gpointer)0}, {{0.5,0,1, 1.f}, (gpointer)0}, {{0,1,0.5, 1.f}, (gpointer)0}, {{0,0.5,1, 1.f}, (gpointer)0}, {{0,0,0, 1.f}, (gpointer)0}}; /******************/ /* Storing colors */ /******************/ /** * tool_color_freeAll: * * Remove all previously stored colours. */ void tool_color_freeAll(void) { GList *lst; for (lst = color_storageArray; lst; lst = g_list_next(lst)) g_free(lst->data); if (lst) g_list_free(lst); } /** * tool_color_new_bright: * @id: an index * * V_Sim has a list of 20 bright colors. One can get one by calling * this routine. The @id is taken modulo the number of available colors. * * Since: 3.7 * * Returns: (transfer none): a bright color. **/ const ToolColor* tool_color_new_bright(guint id) { return brightColors + (id % N_BRIGHT_COLORS); } /** * tool_color_get_type: * * Create and retrieve a #GType for a #ToolColor object. * * Since: 3.7 * * Returns: a new type for #ToolColor structures. */ GType tool_color_get_type(void) { static GType g_define_type_id = 0; if (g_define_type_id == 0) g_define_type_id = g_boxed_type_register_static("ToolColor", (GBoxedCopyFunc)color_copy, (GBoxedFreeFunc)g_free); return g_define_type_id; } /** * tool_color_new: * @rgba: four values between 0. and 1. that represent [Red, Green, Blue, Alpha]. * * Create a new color with initial values given as arguments. * * Returns: (transfer none): a new allocated #ToolColor (use g_free() to free it). */ ToolColor* tool_color_new(float rgba[4]) { ToolColor *color; int i; color = g_malloc(sizeof(ToolColor)); for (i = 0; i< 4; i++) { if (rgba[i] < 0.) color->rgba[i] = 0.; else if (rgba[i] > 1.) color->rgba[i] = 1.; else color->rgba[i] = rgba[i]; } color->userData = (gpointer)0; return color; } /** * tool_color_equal: * @color1: a #ToolColor ; * @color2: an other #ToolColor. * * Test if the two colours are the same. * * Returns: TRUE if the @rgba attributes are the same. */ gboolean tool_color_equal(ToolColor *color1, ToolColor *color2) { return (color1->rgba[0] == color2->rgba[0] && color1->rgba[1] == color2->rgba[1] && color1->rgba[2] == color2->rgba[2]); } /** * tool_color_getById: * @num: an integer (>0). * * This function retrieves the nth stored color. Number 0, is the last * added color. * * Returns: (transfer none): the corresponding color, or NULL if none has been found. */ ToolColor* tool_color_getById(int num) { GList *tmpLst; tmpLst = g_list_nth(color_storageArray, num); if (tmpLst) return (ToolColor*)tmpLst->data; else return (ToolColor*)0; } /** * tool_color_getByColor: * @color: a pointer to a stored color. * * This function retrieves the number (begining at 0) of the specified color. * * Returns: the position of the specified color or -1 if not found. */ int tool_color_getByColor(ToolColor *color) { int pos; if (color) tool_color_getByValues(&pos, color->rgba[0], color->rgba[1], color->rgba[2], color->rgba[3]); else pos = -1; return pos; } /** * tool_color_getByValues: * @pos: (out caller-allocates): an allocated int to store the position of the found color ; * @red: a value between 0. and 1. ; * @green: a value between 0. and 1. ; * @blue: a value between 0. and 1. ; * @alpha: a value between 0. and 1.. * * This method is used to look for a specific color in the stored list. The argument @pos * is -1 if nothing is found or stores the position (beginning at 0) of the found color. * * Returns: (transfer none): the found color, or NULL if none exists. */ ToolColor* tool_color_getByValues(int *pos, float red, float green, float blue, float alpha) { GList *tmpLst; int found; tmpLst = color_storageArray; found = 0; if (pos) *pos = -1; while (tmpLst && !found) { found = (red == ((ToolColor*)tmpLst->data)->rgba[0]) && (green == ((ToolColor*)tmpLst->data)->rgba[1]) && (blue == ((ToolColor*)tmpLst->data)->rgba[2]) && (alpha == ((ToolColor*)tmpLst->data)->rgba[3]); if (pos) *pos += 1; if (!found) tmpLst = g_list_next(tmpLst); } if (found) return (ToolColor*)tmpLst->data; else { if (pos) *pos = -1; return (ToolColor*)0; } } /** * tool_color_getStoredColors: * * Use this method to get a pointeur to the list of stored colors. * * Returns: (transfer none) (element-type ToolColor): * a GList pointer to the stored colors. */ GList* tool_color_getStoredColors(void) { return color_storageArray; } static ToolColor* color_copy(ToolColor *boxed) { ToolColor *color; if (!boxed) return (ToolColor*)0; color = g_malloc(sizeof(ToolColor)); tool_color_copy(color, boxed); return color; } /** * tool_color_copy: * @color: an allocated #ToolColor object to receive values ; * @color_old: a #ToolColor to read the values from. * * This method copies all values from @color_old to @color. */ void tool_color_copy(ToolColor *color, ToolColor *color_old) { g_return_if_fail(color && color_old); memcpy(color->rgba, color_old->rgba, sizeof(float) * 4); color->userData = color_old->userData; } /** * tool_color_addColor: * @color: a #ToolColor. * * This method copies color informations from @color to the list of stored colors. * * Returns: (transfer none): the newly created #ToolColor. */ ToolColor* tool_color_addColor(ToolColor* color) { int pos; g_return_val_if_fail(color, (ToolColor*)0); if (!tool_color_getByValues(&pos, color->rgba[0], color->rgba[1], color->rgba[2], color->rgba[3])) { color_storageArray = g_list_append(color_storageArray, (gpointer)color); DBG_fprintf(stderr, "Visu Tools : adding a new color at %p (%d).\n", (gpointer)color_storageArray, g_list_length(color_storageArray)); g_signal_emit_by_name(VISU_OBJECT_INSTANCE, "colorNewAvailable", (gpointer)color, NULL); } return color; } /** * tool_color_addFloatRGBA: * @rgba: four values between 0. and 1. that represent [Red, Green, Blue, Alpha] ; * @position: (out caller-allocates) (allow-none): an int pointer to store the position * of the returned colour. * * This method adds a new color in the list of stored colors with the given values. * If it already exits it returns the pointer of that color. * * Returns: (transfer none): a newly created #ToolColor or the already existing one. */ ToolColor* tool_color_addFloatRGBA(float rgba[4], int *position) { ToolColor *color; int i; for (i = 0; i < 4; i++) g_return_val_if_fail(rgba[i] >= 0. && rgba[i] <= 1., (ToolColor*)0); color = tool_color_getByValues(position, rgba[0], rgba[1], rgba[2], rgba[3]); if (color) { DBG_fprintf(stderr, "Visu Tools : color already exist, no color added.\n"); return color; } color = tool_color_new(rgba); color_storageArray = g_list_append(color_storageArray, (gpointer)color); if (position) *position = g_list_length(color_storageArray); DBG_fprintf(stderr, "Visu Tools : adding a new color at %p (%d).\n", (gpointer)color_storageArray, g_list_length(color_storageArray)); g_signal_emit_by_name(VISU_OBJECT_INSTANCE, "colorNewAvailable", (gpointer)color, NULL); return color; } /** * tool_color_addIntRGBA: * @rgba: four values between 0 and 255 that represent [Red, Green, Blue, Alpha]. * * This method adds a new color in the list of stored colors with the given values. * * Returns: (transfer none): a newly created #ToolColor or the already existing one. */ ToolColor* tool_color_addIntRGBA(int rgba[4]) { ToolColor *color; float rgbaf[4]; int pos, i; for (i = 0; i < 4; i++) g_return_val_if_fail(rgba[i] >= 0 && rgba[i] < 256, (ToolColor*)0); for (i = 0; i < 4; i++) rgbaf[i] = (float)rgba[i] / 255.; color = tool_color_getByValues(&pos, rgbaf[0], rgbaf[1], rgbaf[2], rgbaf[3]); if (color) { DBG_fprintf(stderr, "Visu Tools : color already exist, no color added.\n"); return color; } color = tool_color_new(rgbaf); color_storageArray = g_list_append(color_storageArray, (gpointer)color); DBG_fprintf(stderr, "Visu Tools : adding a new color at %p (%d).\n", (gpointer)color_storageArray, g_list_length(color_storageArray)); g_signal_emit_by_name(VISU_OBJECT_INSTANCE, "colorNewAvailable", (gpointer)color, NULL); return color; } /** * tool_color_getLastStored: * * This method is typiccally called after a client has catched * the colorNewAvailable signal. * * Returns: (transfer none): the last added color, NULL if no color exists. */ ToolColor* tool_color_getLastStored(void) { return (ToolColor*)g_list_last(color_storageArray)->data; } /** * tool_color_convertHSVtoRGB: * @rgb: an allocated 3 elements array to receive the RGB values ; * @hsv: a 3 elements array to retrieve the HSV values from. * * This methods convert a HSV color to a RGB one. */ void tool_color_convertHSVtoRGB(float* rgb, float* hsv) { float var_h, var_0, var_1, var_2, var_3; int var_i; g_return_if_fail(rgb && hsv); if (hsv[1] == 0) { rgb[0] = hsv[2]; rgb[1] = hsv[2]; rgb[2] = hsv[2]; } else { var_h = hsv[0] * 6.; var_i = (int)var_h; var_0 = hsv[2]; var_1 = hsv[2] * (1. - hsv[1]); var_2 = hsv[2] * (1. - hsv[1] * (var_h - (float)var_i)); var_3 = hsv[2] * (1. - hsv[1] * (1. - (var_h - (float)var_i))); switch (var_i % 6) { case 0: rgb[0] = var_0; rgb[1] = var_3; rgb[2] = var_1; break; case 1: rgb[0] = var_2; rgb[1] = var_0; rgb[2] = var_1; break; case 2: rgb[0] = var_1; rgb[1] = var_0; rgb[2] = var_3; break; case 3: rgb[0] = var_1; rgb[1] = var_2; rgb[2] = var_0; break; case 4: rgb[0] = var_3; rgb[1] = var_1; rgb[2] = var_0; break; case 5: rgb[0] = var_0; rgb[1] = var_1; rgb[2] = var_2; break; } } } float Hue_2_RGB(float v1, float v2, float vH) { /* from www.easyrgb.com */ if (vH < 0) vH += 1; if (vH > 1) vH -= 1; if ((6*vH) < 1) return (v1+(v2-v1)*6*vH); if ((2*vH) < 1) return v2; if ((3*vH) < 2) return (v1+(v2-v1)*((2./3.)-vH)*6); return v1; } /** * tool_color_convertHSLtoRGB: * @rgb: an allocated 3 elements array to receive the RGB values ; * @hsl: a 3 elements array to retrieve the HSL values from. * * This methods convert a HSL color to a RGB one. */ void tool_color_convertHSLtoRGB(float *rgb, float *hsl) { /* from www.easyrgb.com */ if (hsl[1] == 0) /*HSL values = 0 1*/ { rgb[0] = hsl[2]; /*RGB results = 0 255*/ rgb[1] = hsl[2]; rgb[2] = hsl[2]; } else { float var_1, var_2; if (hsl[2] < 0.5) var_2 = hsl[2] * (1 + hsl[1]); else var_2 = (hsl[2] + hsl[1]) - (hsl[1] * hsl[2]); var_1 = 2 * hsl[2] - var_2; rgb[0] = Hue_2_RGB( var_1, var_2, hsl[0] + ( 1. / 3. ) ); rgb[1] = Hue_2_RGB( var_1, var_2, hsl[0] ); rgb[2] = Hue_2_RGB( var_1, var_2, hsl[0] - ( 1. / 3. ) ); } } /** * tool_color_convertRGBtoHSL: * @hsl: three float to store the HSL value ; * @rgb: three floats giving the RGB values. * * Convert a RGB colour into a HSL one. */ void tool_color_convertRGBtoHSL(float *hsl, float *rgb) { float var_Min, var_Max, del_Max, del_R, del_G, del_B; var_Min = MIN(MIN( rgb[0], rgb[1]), rgb[2] ); var_Max = MAX(MAX( rgb[0], rgb[1]), rgb[2] ); del_Max = var_Max - var_Min; hsl[2] = ( var_Max + var_Min ) / 2; if ( del_Max == 0 ) { hsl[0] = 0.f; hsl[1] = 0.f; } else { if ( hsl[2] < 0.5f ) hsl[1] = del_Max / ( var_Max + var_Min ); else hsl[1] = del_Max / ( 2.f - var_Max - var_Min ); del_R = ( ( ( var_Max - rgb[0] ) / 6 ) + ( del_Max / 2 ) ) / del_Max; del_G = ( ( ( var_Max - rgb[1] ) / 6 ) + ( del_Max / 2 ) ) / del_Max; del_B = ( ( ( var_Max - rgb[2] ) / 6 ) + ( del_Max / 2 ) ) / del_Max; if ( rgb[0] == var_Max ) hsl[0] = del_B - del_G; else if ( rgb[1] == var_Max ) hsl[0] = ( 1.f / 3.f ) + del_R - del_B; else if ( rgb[2] == var_Max ) hsl[0] = ( 2.f / 3.f ) + del_G - del_R; if ( hsl[0] < 0.f ) hsl[0] += 1; if ( hsl[0] > 1.f ) hsl[0] -= 1; } } v_sim-3.7.0/src/coreTools/toolColor.h0000644000353400050620000001043012215546101014441 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef TOOLCOLOR_H #define TOOLCOLOR_H #include #include G_BEGIN_DECLS /** * TOOL_COLOR_MASK_R: * * This value can be used to create a mask for methods that * require one for reading rgb color array. This value actually * correspond to red. */ #define TOOL_COLOR_MASK_R (1 << 0) /** * TOOL_COLOR_MASK_G: * * This value can be used to create a mask for methods that * require one for reading rgb color array. This value actually * correspond to green. */ #define TOOL_COLOR_MASK_G (1 << 1) /** * TOOL_COLOR_MASK_B: * * This value can be used to create a mask for methods that * require one for reading rgb color array. This value actually * correspond to blue. */ #define TOOL_COLOR_MASK_B (1 << 2) /** * TOOL_COLOR_MASK_A: * * This value can be used to create a mask for methods that * require one for reading rgb color array. This value actually * correspond to the alpha channel. */ #define TOOL_COLOR_MASK_A (1 << 3) /** * TOOL_COLOR_MASK_RGBA: * * This value can be used to create a mask for methods that * require one for reading rgb color array. This value is a * shortcut for #TOOL_COLOR_MASK_R | #TOOL_COLOR_MASK_G | #TOOL_COLOR_MASK_B. */ #define TOOL_COLOR_MASK_RGBA (15) /******************/ /* Storing colors */ /******************/ /** * ToolColor: * @rgba: the coding of color in Red, Green, Blue, Alpha format, * floating point numbers between 0 and 1 ; * @userData: a pointer to store some data (should be used with care). * * A structure to store colors. */ typedef struct _ToolColor ToolColor; struct _ToolColor { float rgba[4]; gpointer userData; }; #define TOOL_TYPE_COLOR (tool_color_get_type()) GType tool_color_get_type(void); ToolColor* tool_color_new(float rgba[4]); const ToolColor* tool_color_new_bright(guint id); gboolean tool_color_equal(ToolColor *color1, ToolColor *color2); void tool_color_copy(ToolColor *color, ToolColor *color_old); void tool_color_freeAll(void); ToolColor* tool_color_getById(int num); ToolColor* tool_color_getLastStored(void); int tool_color_getByColor(ToolColor *color); ToolColor* tool_color_getByValues(int *pos, float red, float green, float blue, float alpha); GList* tool_color_getStoredColors(void); ToolColor* tool_color_addColor(ToolColor* color); ToolColor* tool_color_addFloatRGBA(float rgba[4], int *position); ToolColor* tool_color_addIntRGBA(int rgba[4]); void tool_color_convertHSVtoRGB(float* rgb, float* hsv); void tool_color_convertHSLtoRGB(float *rgb, float *hsl); void tool_color_convertRGBtoHSL(float *hsl, float *rgb); G_END_DECLS #endif v_sim-3.7.0/src/coreTools/toolConfigFile.c0000644000353400050620000004771412215546101015402 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "toolConfigFile.h" #include /** * SECTION:toolConfigFile * @short_description: Generic read methods of the configuration files * are defined here. * * These methods give generic tools to read common data in the * configuration files, such as arrays of float values or one * #VisuElement... It also defines a enumeration of detailed errors * (see #ToolConfigFileError) when reading a file. All read elements * are either from tokens (given g_strsplit()) or strings. */ /** * tool_config_file_getQuark: * * Internal routine for error handling. * * Returns: the #GQuark associated to errors related to configuration * files. */ GQuark tool_config_file_getQuark() { return g_quark_from_static_string("visu_configFile"); } /** * tool_config_file_readFloatFromTokens: * @tokens: array of tokens resulting from a call to g_strsplit() with " " as separator ; * @position: IN, the position of the beginning in @tokens ; OUT, one token * after the last read ; * @values: allocated area to store read values ; * @size: the number of floating point values to be read ; * @lineId: the number of the line of the config * file which the @line argument is taken from ; * @error: a location to store a possible reading error. * * Read @size floating point values from @tokens, store them in @values and returns * the new head in @tokens. * * Returns: TRUE if no error occured. */ gboolean tool_config_file_readFloatFromTokens(gchar **tokens, int *position, float *values, guint size, int lineId, GError **error) { int res; guint i, nb; g_return_val_if_fail(error && (*error == (GError*)0), FALSE); g_return_val_if_fail(values, FALSE); g_return_val_if_fail(tokens && position, FALSE); /* Read @size floating point values from tokens. */ nb = 0; for (i = *position; tokens[i] && nb < size; i++) { if (tokens[i][0] != '\0') { res = sscanf(tokens[i], "%f", values + nb); if (res != 1) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_READ, _("Parse error at line %d, %d floating point" " values should appear here.\n"), lineId, size); *position = i; return FALSE; } nb += 1; } } *position = i; if (nb != size) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_MISSING, _("Parse error at line %d, %d floating point value(s)" " should appear here but %d has been found.\n"), lineId, size, nb); return FALSE; } return TRUE; } /** * tool_config_file_readFloat: * @line: string where values are read from ; * @position: the number of the line of the config * file which the @line argument is taken from ; * @values: allocated area to store read values ; * @size: the number of floating point values to be read ; * @error: a location to store a possible reading error. * * Read @size floating point values from @line and store them in @values. * * Returns: TRUE if no error occured. */ gboolean tool_config_file_readFloat(gchar *line, int position, float *values, guint size, GError **error) { int id; gboolean res; gchar **tokens; /* Read @size floating point values from @line. */ tokens = g_strsplit_set(line, " \n", TOOL_MAX_LINE_LENGTH); id = 0; res = tool_config_file_readFloatFromTokens(tokens, &id, values, size, position, error); g_strfreev(tokens); return res; } /** * tool_config_file_readBooleanFromTokens: * @tokens: array of tokens resulting from a call to g_strsplit() with " " as separator ; * @position: IN, the position of the beginning in @tokens ; OUT, one token * after the last read ; * @values: allocated area to store read values ; * @size: the number of floating point values to be read ; * @lineId: the number of the line of the config * file which the @line argument is taken from ; * @error: a location to store a possible reading error. * * Read @size boolean values from @tokens, store them in @values and returns * the new head in @tokens. * * Returns: TRUE if no error occured. */ gboolean tool_config_file_readBooleanFromTokens(gchar **tokens, int *position, gboolean *values, guint size, int lineId, GError **error) { int res; guint i, nb; g_return_val_if_fail(error && (*error == (GError*)0), FALSE); g_return_val_if_fail(values, FALSE); g_return_val_if_fail(tokens && position, FALSE); /* Read @size floating point values from @line. */ nb = 0; for (i = *position; tokens[i] && nb < size; i++) { if (tokens[i][0] != '\0') { res = sscanf(tokens[i], "%d", values + nb); if (res != 1) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_READ, _("Parse error at line %d, %d boolean" " values should appear here.\n"), lineId, size); *position = i; return FALSE; } nb += 1; } } *position = i; if (nb != size) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_MISSING, _("Parse error at line %d, %d boolean(s)" " values should appear here but %d has been found.\n"), lineId, size, nb); return FALSE; } return TRUE; } /** * tool_config_file_readBoolean: * @line: string where values are read from ; * @position: the number of the line of the config * file which the @line argument is taken from ; * @values: allocated area to store read values ; * @size: the number of boolean values to be read ; * @error: a location to store a possible reading error. * * Read @size boolean values from @line and store them in @values. * * Returns: TRUE if no error occured. */ gboolean tool_config_file_readBoolean(gchar *line, int position, gboolean *values, guint size, GError **error) { int id; gboolean res; gchar **tokens; /* Read @size boolean values from @line. */ tokens = g_strsplit_set(line, " \n", TOOL_MAX_LINE_LENGTH); id = 0; res = tool_config_file_readBooleanFromTokens(tokens, &id, values, size, position, error); g_strfreev(tokens); return res; } /** * tool_config_file_readStringFromTokens: * @tokens: array of tokens resulting from a call to g_strsplit() with " " as separator ; * @position: IN, the position of the beginning in @tokens ; OUT, one token * after the last read ; * @values: a location to point on a gchar** ; * @size: the number of floating point values to be read ; * @lineId: the number of the line of the config * file which the @line argument is taken from ; * @error: a location to store a possible reading error. * * Read @size strings from @tokens, store them in @values and returns * the new head in @tokens. * * Returns: TRUE if no error occured. */ gboolean tool_config_file_readStringFromTokens(gchar **tokens, int *position, gchar ***values, guint size, int lineId, GError **error) { guint i, nb; g_return_val_if_fail(error && (*error == (GError*)0), FALSE); g_return_val_if_fail(values, FALSE); g_return_val_if_fail(tokens && position, FALSE); /* Read @size floating point values from @line. */ *values = g_malloc(sizeof(gchar**) * (size + 1)); nb = 0; for (i = *position; tokens[i] && nb < size; i++) if (tokens[i][0] != '\0') (*values)[nb++] = g_strdup(tokens[i]); *position = i; (*values)[nb] = (gchar*)0; if (nb != size) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_MISSING, _("Parse error at line %d, %d string(s)" " should appear here but %d has been found.\n"), lineId, size, nb); g_strfreev(*values); *values = (gchar**)0; return FALSE; } return TRUE; } /** * tool_config_file_readString: * @line: string where values are read from ; * @position: the number of the line of the config * file which the @line argument is taken from ; * @values: a location to point on a gchar** ; * @size: the number of strings to be read ; * @join: a boolean ; * @error: a location to store a possible reading error. * * Read @size strings from @line and @values points on them. If more * strings than @size are available, an error is raised ; except if * @join is TRUE. In that case, the method return @size tokens, * joining all remaining ones. * * Returns: TRUE if no error occured, then @values point on an allocated * memory area that is NULL terminated and that must be freed * with g_strfreev(). */ gboolean tool_config_file_readString(gchar *line, int position, gchar ***values, guint size, gboolean join, GError **error) { guint i, nb; gchar *tmp; g_return_val_if_fail(error && (*error == (GError*)0), FALSE); g_return_val_if_fail(values, FALSE); /* Read @size floating point values from @line. */ *values = g_strsplit_set(line, " \n", TOOL_MAX_LINE_LENGTH); nb = 0; for (i = 0; (*values)[i]; i++) if ((*values)[i][0] != '\0') { tmp = (*values)[i]; (*values)[i] = (*values)[nb]; (*values)[nb] = tmp; nb += 1; } if (!join) { if (nb != size) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_MISSING, _("Parse error at line %d, %d string(s)" " should appear here but %d has been found.\n"), position, size, nb); g_strfreev(*values); return FALSE; } } else { tmp = g_strjoinv(" ", (*values) + (size - 1)); for (i = size - 1; (*values)[i]; i++) g_free((*values)[i]); (*values)[size - 1] = tmp; (*values)[size] = (gchar*)0; } return TRUE; } /** * tool_config_file_readFloatWithElement: * @line: string where values are read from ; * @position: the number of the line of the config * file which the @line argument is taken from ; * @values: allocated area to store read values ; * @size: the number of floating point values to be read ; * @ele: a pointer to a #VisuElement location ; * @error: a location to store a possible reading error. * * Same as tool_config_file_readFloat() but begins by reading an element * at the begining of the line. * * Returns: TRUE if no error occured. */ gboolean tool_config_file_readFloatWithElement(gchar *line, int position, float *values, guint size, VisuElement **ele, GError **error) { int id; gboolean res; gchar **tokens; /* Read @size boolean values from @line. */ tokens = g_strsplit_set(line, " \n", TOOL_MAX_LINE_LENGTH); id = 0; res = tool_config_file_readElementFromTokens(tokens, &id, ele, 1, position, error); if (!res) { g_strfreev(tokens); return FALSE; } res = tool_config_file_readFloatFromTokens(tokens, &id, values, size, position, error); g_strfreev(tokens); return res; } /** * tool_config_file_readBooleanWithElement: * @line: string where values are read from ; * @position: the number of the line of the config * file which the @line argument is taken from ; * @values: allocated area to store read values ; * @size: the number of boolean values to be read ; * @ele: a pointer to a #VisuElement location ; * @error: a location to store a possible reading error. * * Same as tool_config_file_readBoolean() but begins by reading an element * at the begining of the line. * * Returns: TRUE if no error occured. */ gboolean tool_config_file_readBooleanWithElement(gchar *line, int position, gboolean *values, guint size, VisuElement **ele, GError **error) { int id; gboolean res; gchar **tokens; /* Read @size boolean values from @line. */ tokens = g_strsplit_set(line, " \n", TOOL_MAX_LINE_LENGTH); id = 0; res = tool_config_file_readElementFromTokens(tokens, &id, ele, 1, position, error); if (!res) { g_strfreev(tokens); return FALSE; } res = tool_config_file_readBooleanFromTokens(tokens, &id, values, size, position, error); g_strfreev(tokens); return res; } /** * tool_config_file_readStringWithElement: * @line: string where values are read from ; * @position: the number of the line of the config * file which the @line argument is taken from ; * @values: a location to point on a gchar** ; * @size: the number of strings to be read ; * @ele: a pointer to a #VisuElement location ; * @error: a location to store a possible reading error. * * Same as tool_config_file_readString() but begins by reading an element * at the begining of the line. * * Returns: TRUE if no error occured, then @values point on an allocated * memory area that is NULL terminated and that must be freed * with g_strfreev(). */ gboolean tool_config_file_readStringWithElement(gchar *line, int position, gchar ***values, guint size, VisuElement **ele, GError **error) { int id; gboolean res; gchar **tokens; /* Read @size boolean values from @line. */ tokens = g_strsplit_set(line, " \n", TOOL_MAX_LINE_LENGTH); id = 0; res = tool_config_file_readElementFromTokens(tokens, &id, ele, 1, position, error); if (!res) { g_strfreev(tokens); return FALSE; } res = tool_config_file_readStringFromTokens(tokens, &id, values, size, position, error); g_strfreev(tokens); return res; } /** * tool_config_file_readElementFromTokens: * @tokens: array of tokens resulting from a call to g_strsplit() with " " as separator ; * @position: IN, the position of the beginning in @tokens ; OUT, one token * after the last read ; * @values: allocated area to store read values ; * @size: the number of #VisuElement to be read ; * @lineId: the number of the line of the config * file which the @line argument is taken from ; * @error: a location to store a possible reading error. * * Read @size #VisuElement from @tokens, store them in @values and returns * the new head in @tokens. * * Returns: TRUE if no error occured. */ gboolean tool_config_file_readElementFromTokens(gchar **tokens, int *position, VisuElement **values, guint size, int lineId, GError **error) { guint i, nb; g_return_val_if_fail(error && (*error == (GError*)0), FALSE); g_return_val_if_fail(values, FALSE); g_return_val_if_fail(tokens && position, FALSE); /* Read @size VisuElement from @tokens. */ nb = 0; for (i = *position; tokens[i] && nb < size; i++) { if (tokens[i][0] != '\0') { values[nb] = visu_element_retrieveFromName(tokens[i], (gboolean*)0); if (!values[nb]) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_BAD_ELEMENT_NAME, _("Parse error at line %d, '%s' wrong" " element name.\n"), lineId, tokens[i]); *position = i; return FALSE; } nb += 1; } } *position = i; if (nb != size) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_MISSING, _("Parse error at line %d, %d elements" " should appear here but %d has been found.\n"), lineId, size, nb); return FALSE; } return TRUE; } /** * tool_config_file_readIntegerFromTokens: * @tokens: array of tokens resulting from a call to g_strsplit() with " " as separator ; * @position: IN, the position of the beginning in @tokens ; OUT, one token * after the last read ; * @values: allocated area to store read values ; * @size: the number of floating point values to be read ; * @lineId: the number of the line of the config * file which the @line argument is taken from ; * @error: a location to store a possible reading error. * * Read @size integer values from @tokens, store them in @values and returns * the new head in @tokens. * * Returns: TRUE if no error occured. */ gboolean tool_config_file_readIntegerFromTokens(gchar **tokens, int *position, int *values, guint size, int lineId, GError **error) { int res; guint i, nb; g_return_val_if_fail(error && (*error == (GError*)0), FALSE); g_return_val_if_fail(values, FALSE); g_return_val_if_fail(tokens && position, FALSE); /* Read @size floating point values from @line. */ nb = 0; for (i = *position; tokens[i] && nb < size; i++) { if (tokens[i][0] != '\0') { res = sscanf(tokens[i], "%d", values + nb); if (res != 1) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_READ, _("Parse error at line %d, %d integer" " values should appear here.\n"), lineId, size); *position = i; return FALSE; } nb += 1; } } *position = i; if (nb != size) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_MISSING, _("Parse error at line %d, %d integer(s)" " values should appear here but %d has been found.\n"), lineId, size, nb); return FALSE; } return TRUE; } /** * tool_config_file_readInteger: * @line: string where values are read from ; * @position: the number of the line of the config * file which the @line argument is taken from ; * @values: allocated area to store read values ; * @size: the number of floating point values to be read ; * @error: a location to store a possible reading error. * * Read @size integers from @line and store them in @values. * * Returns: TRUE if no error occured. */ gboolean tool_config_file_readInteger(gchar *line, int position, int *values, guint size, GError **error) { int id; gboolean res; gchar **tokens; /* Read @size floating point values from @line. */ tokens = g_strsplit_set(line, " \n", TOOL_MAX_LINE_LENGTH); id = 0; res = tool_config_file_readIntegerFromTokens(tokens, &id, values, size, position, error); g_strfreev(tokens); return res; } /** * tool_config_file_clampFloat: * @variable: a pointer to a storage for the value ; * @value: the value to put in the storage ; * @min: a lower bound ; * @max: a upper bound. * * It puts value in a variable if value is in min and max * or put min or max in if not. It return true if value * is out of bounds. Min and max are inclusive values. * If there is no max bounds then put max at a lower * value than min and if there is no min bound, put min * at a higher value than max. * * Returns: TRUE if the value is out of bounds. */ gboolean tool_config_file_clampFloat(float *variable, float value, float min, float max) { g_return_val_if_fail(variable, FALSE); if (max > min && value > max) { *variable = max; return TRUE; } if (min < max && value < min) { *variable = min; return TRUE; } *variable = value; return FALSE; } v_sim-3.7.0/src/coreTools/toolConfigFile.h0000644000353400050620000001327612215546101015403 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef TOOLCONFIGFILE_H #define TOOLCONFIGFILE_H #include /** * TOOL_CONFIG_FILE_ERROR: * * Domain used to parse config files. */ #define TOOL_CONFIG_FILE_ERROR tool_config_file_getQuark() GQuark tool_config_file_getQuark(); /** * ToolConfigFileError: * @TOOL_CONFIG_FILE_ERROR_EMPTY_LINE: error when reading the file, found an empty line, * where something should have been. * @TOOL_CONFIG_FILE_ERROR_BAD_ELEMENT_NAME: error when reading a #VisuElement name. * @TOOL_CONFIG_FILE_ERROR_MAX_ELEMENT: error because too much #VisuElement have been created. * @TOOL_CONFIG_FILE_ERROR_CREATED_ELEMENT: error when creating a new #VisuElement. * @TOOL_CONFIG_FILE_ERROR_VALUE: error of file format, values read are out of bounds. * @TOOL_CONFIG_FILE_ERROR_READ: error of file format (can't read variables...). * @TOOL_CONFIG_FILE_ERROR_MISSING: error of file format (missing * variables...). * @TOOL_CONFIG_FILE_ERROR_TAG: error dealing with a tag. * @TOOL_CONFIG_FILE_ERROR_MARKUP: error dealing with a markup (unkown * one...). * @TOOL_CONFIG_FILE_ERROR_NO_FILE: no valid file found on disk. * * Possible errors when parsing a config file. */ typedef enum { TOOL_CONFIG_FILE_ERROR_EMPTY_LINE, TOOL_CONFIG_FILE_ERROR_BAD_ELEMENT_NAME, TOOL_CONFIG_FILE_ERROR_MAX_ELEMENT, TOOL_CONFIG_FILE_ERROR_CREATED_ELEMENT, TOOL_CONFIG_FILE_ERROR_VALUE, TOOL_CONFIG_FILE_ERROR_READ, TOOL_CONFIG_FILE_ERROR_MISSING, TOOL_CONFIG_FILE_ERROR_TAG, TOOL_CONFIG_FILE_ERROR_MARKUP, TOOL_CONFIG_FILE_ERROR_NO_FILE } ToolConfigFileError; gboolean tool_config_file_readFloatFromTokens(gchar **tokens, int *position, float *values, guint size, int lineId, GError **error); gboolean tool_config_file_readFloat(gchar *line, int position, float *values, guint size, GError **error); gboolean tool_config_file_readFloatWithElement(gchar *line, int position, float *values, guint size, VisuElement **ele, GError **error); gboolean tool_config_file_readIntegerFromTokens(gchar **tokens, int *position, int *values, guint size, int lineId, GError **error); gboolean tool_config_file_readInteger(gchar *line, int position, int *values, guint size, GError **error); gboolean tool_config_file_readBooleanFromTokens(gchar **tokens, int *position, gboolean *values, guint size, int lineId, GError **error); gboolean tool_config_file_readBoolean(gchar *line, int position, gboolean *values, guint size, GError **error); gboolean tool_config_file_readBooleanWithElement(gchar *line, int position, gboolean *values, guint size, VisuElement **ele, GError **error); gboolean tool_config_file_readStringFromTokens(gchar **tokens, int *position, gchar ***values, guint size, int lineId, GError **error); gboolean tool_config_file_readString(gchar *line, int position, gchar ***values, guint size, gboolean join, GError **error); gboolean tool_config_file_readStringWithElement(gchar *line, int position, gchar ***values, guint size, VisuElement **ele, GError **error); gboolean tool_config_file_readElementFromTokens(gchar **tokens, int *position, VisuElement **values, guint size, int lineId, GError **error); gboolean tool_config_file_clampFloat(float *variable, float value, float min, float max); #endif v_sim-3.7.0/src/coreTools/toolOptions.c0000644000353400050620000001315212215546101015015 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "toolOptions.h" #include /** * SECTION:toolOptions * @short_description: A convienent wrapper around GHashTable that can support types. * * This wrapper is a simple way to store integers, floating * point values or booleans in a table, accessing with a string key * and remembering their types. */ struct _ToolOption { /* The name of the option, copied on creation and used as key in a table of options. */ gchar *name; /* A short description of the option. */ gchar *label; /* Value. */ GValue *value; }; /** * tool_option_new: * @name: a string identifying the option ; * @label: a string describing shortly the option (must be in UTF-8). * @g_type: the type of option to create. * * Create a new #Option using the name as identifier. * * Returns: (transfer none): a newly created option, use tool_option_free() to free it. */ ToolOption* tool_option_new(const gchar *name, const gchar *label, GType g_type) { ToolOption *option; g_return_val_if_fail(name && name[0] && label, (ToolOption*)0); g_return_val_if_fail(G_TYPE_IS_VALUE(g_type), (ToolOption*)0); option = g_malloc(sizeof(ToolOption)); option->name = g_strdup(name); option->label = g_strdup(label); option->value = g_slice_new0(GValue); g_value_init(option->value, g_type); return option; } /** * tool_option_free: * @option: the #Option to free. * * Free the memory used by the @data. */ void tool_option_free(ToolOption *option) { g_return_if_fail(option); g_free(option->name); g_free(option->label); g_value_unset(option->value); g_slice_free(GValue, option->value); g_free(option); } /** * tool_option_copy: * @from: an existing #ToolOption. * * Create a new #ToolOption using the values from option @from. * * Returns: (transfer none): a newly created option, use tool_option_free() to free it. */ ToolOption* tool_option_copy(const ToolOption *from) { ToolOption *to; g_return_val_if_fail(from, (ToolOption*)0); to = tool_option_new(from->name, from->label, G_VALUE_TYPE(from->value)); g_value_copy(from->value, to->value); return to; } /** * tool_option_getName: * @option: the #Option to get the name of. * * Get the name of the option. * * Returns: a string owned by V_Sim, should not be freed. */ const gchar* tool_option_getName(ToolOption *option) { g_return_val_if_fail(option, (gchar*)0); return option->name; } /** * tool_option_getLabel: * @option: the #Option to get the label of. * * Get the label of the option. * * Returns: a string owned by V_Sim, should not be freed. */ const gchar* tool_option_getLabel(ToolOption *option) { g_return_val_if_fail(option, (gchar*)0); return option->label; } /** * tool_option_getType: * @option: the #Option to get the type of. * * Get the type of the option. * * Returns: a #OptionTypes value. */ GType tool_option_getType(ToolOption *option) { g_return_val_if_fail(option, 0); return G_VALUE_TYPE(option->value); } /** * tool_option_getValue: * @option: a #Option object. * * Get the location of the storage for the option. * * Returns: the #GValue storing the option value. */ GValue* tool_option_getValue(ToolOption *option) { g_return_val_if_fail(option, (GValue*)0); return option->value; } /** * tool_option_getValueAndLabel: * @option: the #Option to get the value from. * * This method returns a string with the value followed by the label in parenthesis * and with Pango markup for smaller font. * * Returns: a newly created markup string. */ gchar* tool_option_getValueAndLabel(ToolOption *option) { gchar *markup, *tmp; g_return_val_if_fail(option, (gchar*)0); if (G_VALUE_TYPE(option->value) != G_TYPE_NONE) { tmp = g_strdup_value_contents(option->value); markup = g_markup_printf_escaped("%s (%s)", tmp, option->label); g_free(tmp); } else markup = (gchar*)0; return markup; } v_sim-3.7.0/src/coreTools/toolOptions.h0000644000353400050620000000464712215546101015033 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef TOOLOPTIONS_H #define TOOLOPTIONS_H #include #include /** * ToolOption: * * An opaque structure to store values. It is equivalent to #GValue * but with a name and a label. */ typedef struct _ToolOption ToolOption; struct _ToolOption; ToolOption* tool_option_new(const gchar *name, const gchar *label, GType g_type); void tool_option_free(ToolOption *option); ToolOption* tool_option_copy(const ToolOption *from); const gchar* tool_option_getName(ToolOption *option); const gchar* tool_option_getLabel(ToolOption *option); GType tool_option_getType(ToolOption *option); GValue* tool_option_getValue(ToolOption *option); gchar* tool_option_getValueAndLabel(ToolOption *option); #endif v_sim-3.7.0/src/coreTools/toolFortran.c0000644000353400050620000002433012215546101014775 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD, Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2005) Adresses ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD and Damien CALISTE and Olivier D'Astier, laboratoire L_Sim, (2001-2005) E-mail addresses : BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "toolFortran.h" #include /** * SECTION:toolFortran * @short_description: Introduces routines to read the binary Fortran data format. * * In Fortran binary data are written inside tags. These tags * give the size to the data that are between. The routines in this * module can read these tags and the data inside. One must know the * endianness of the file and the kind of data to be read (integer, * float, double...). If the first tag is known, one can test the * endianness of the file calling tool_fortran_testEndianness(). * The size of the tag (32 bits or 64 bits) is not modifiable * for the moment and is fixed at 32 bits. This may be changed in the * futur with the same kind of things that for endianness. */ gboolean tool_fortran_readFlag(guint *nb, FILE *flux, GError **error, ToolFortranEndianId endianness) { char c[sizeof(int)]; guint *val; register guint ks, l; if (fread(nb, sizeof(int), 1, flux) != 1) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("impossible to read Fortran flag, '%s' error.\n"), "tool_fortran_readFlag"); return FALSE; } if (endianness == TOOL_FORTRAN_ENDIAN_CHANGE) { ks = sizeof(int) - 1; for(l=0; l #include /** * ToolFortranEndianId: * @TOOL_FORTRAN_ENDIAN_KEEP: read a file without inverting records. * @TOOL_FORTRAN_ENDIAN_CHANGE: read a file inverting records. * * Thiese ids are used when reading a multi-bytes information from a binary file. */ typedef enum { TOOL_FORTRAN_ENDIAN_KEEP, TOOL_FORTRAN_ENDIAN_CHANGE } ToolFortranEndianId; /** * tool_fortran_readCharacter: * @var: an allocated array of char ; * @nb: the size of the array @var ; * @flux: a pointer on an opened file ; * @error: a pointer to an error location ; * @endianness: reverse or not the order of multi-bytes ; * @testFlag: if TRUE, read start and stop flags and test their values * ; * @store: a boolean. * * Read an array of characters from a fortran record. The endianness is required * to read the Fortran flag. If argument @store is FALSE, then the * file is read and consistency checked but no data is stored. In that * case, @var can be not allocated. * * Returns: TRUE if everything went right. */ gboolean tool_fortran_readCharacter(char *var, guint nb, FILE *flux, GError **error, ToolFortranEndianId endianness, gboolean testFlag, gboolean store); /** * tool_fortran_readInteger: * @var: an allocated array of int ; * @nb: the size of the array @var ; * @flux: a pointer on an opened file ; * @error: a pointer to an error location ; * @endianness: reverse or not the order of multi-bytes ; * @testFlag: if TRUE, read start and stop flags and test their * values ; * @store: a boolean. * * Read an array of integers from a fortran record. If argument @store * is FALSE, then the file is read and consistency checked but no data * is stored. In that case, @var can be not allocated. * * Returns: TRUE if everything went right. */ gboolean tool_fortran_readInteger(guint *var, guint nb, FILE *flux, GError **error, ToolFortranEndianId endianness, gboolean testFlag, gboolean store); /** * tool_fortran_readReal: * @var: an allocated array of float ; * @nb: the size of the array @var ; * @flux: a pointer on an opened file ; * @error: a pointer to an error location ; * @endianness: reverse or not the order of multi-bytes ; * @testFlag: if TRUE, read start and stop flags and test their * values ; * @store: a boolean. * * Read an array of reals from a fortran record. If argument @store is FALSE, then the * file is read and consistency checked but no data is stored. In that * case, @var can be not allocated. * * Returns: TRUE if everything went right. */ gboolean tool_fortran_readReal(float *var, guint nb, FILE *flux, GError **error, ToolFortranEndianId endianness, gboolean testFlag, gboolean store); /** * tool_fortran_readDouble: * @var: an allocated array of double ; * @nb: the size of the array @var ; * @flux: a pointer on an opened file ; * @error: a pointer to an error location ; * @endianness: reverse or not the order of multi-bytes ; * @testFlag: if TRUE, read start and stop flags and test their values * ; * @store: a boolean. * * Read an array of doubles from a fortran record. If argument @store * is FALSE, then the file is read and consistency checked but no data * is stored. In that case, @var can be not allocated. * * Returns: TRUE if everything went right. */ gboolean tool_fortran_readDouble(double *var, guint nb, FILE *flux, GError **error, ToolFortranEndianId endianness, gboolean testFlag, gboolean store); /** * tool_fortran_readFlag: * @nb: a location t store the value of the flag ; * @flux: a pointer on an opened file ; * @error: a pointer to an error location ; * @endianness: reverse or not the order of multi-bytes. * * Read the flag of a record (a 32bits integer). * * Returns: TRUE if everything went right. */ gboolean tool_fortran_readFlag(guint *nb, FILE *flux, GError **error, ToolFortranEndianId endianness); /** * tool_fortran_testEndianness: * @nb: the value of the flag to read ; * @flux: a pointer on an opened file ; * @error: a pointer to an error location ; * @endianness: a location to store the endianness. * * Read a flag and compare the value with @nb for little and big endian. * It return the value of endianness to be used after. The file is rewind after the * call. * * Returns: TRUE if everything went right. */ gboolean tool_fortran_testEndianness(guint nb, FILE *flux, GError **error, ToolFortranEndianId *endianness); #endif v_sim-3.7.0/src/coreTools/toolPhysic.c0000644000353400050620000001560012215546101014621 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include "toolPhysic.h" #include /** * SECTION:toolPhysic * @short_description: introduce physical values for the chemical species. * * This is a data base associating symbol names and atomic * numbers. One can also get the covalent radius of chemical * species. It is convenient to plot bindings. * * Since: 3.4 */ struct periodic_table { gchar *name; float radcov; }; #define NUMBER_OF_ELEMENTS 103 static struct periodic_table eles[NUMBER_OF_ELEMENTS] = { {"H", 0.32}, {"He", 0.93}, {"Li", 1.23}, {"Be", 0.90}, {"B", 0.80}, {"C", 0.77}, {"N", 0.74}, {"O", 0.73}, {"F", 0.72}, {"Ne", 0.71}, {"Na", 1.54}, {"Mg", 1.36}, {"Al", 1.18}, {"Si", 1.11}, {"P", 1.06}, {"S", 1.02}, {"Cl", 0.99}, {"Ar", 0.98}, {"K", 2.03}, {"Ca", 1.74}, {"Sc", 1.44}, {"Ti", 1.32}, {"V", 1.22}, {"Cr", 1.18}, {"Mn", 1.17}, {"Fe", 1.17}, {"Co", 1.16}, {"Ni", 1.15}, {"Cu", 1.17}, {"Zn", 1.25}, {"Ga", 1.26}, {"Ge", 1.22}, {"As", 1.20}, {"Se", 1.16}, {"Br", 1.14}, {"Kr", 1.12}, {"Rb", 2.16}, {"Sr", 1.91}, {"Y", 1.62}, {"Zr", 1.45}, {"Nb", 1.34}, {"Mo", 1.30}, {"Tc", 1.27}, {"Ru", 1.25}, {"Rh", 1.25}, {"Pd", 1.28}, {"Ag", 1.34}, {"Cd", 1.48}, {"In", 1.44}, {"Sn", 1.41}, {"Sb", 1.40}, {"Te", 1.36}, {"I", 1.33}, {"Xe", 1.31}, {"Cs", 2.35}, {"Ba", 1.98}, {"La", 1.69}, {"Ce", 1.65}, {"Pr", 1.65}, {"Nd", 1.64}, {"Pm", 1.64}, {"Sm", 1.62}, {"Eu", 1.85}, {"Gd", 1.61}, {"Tb", 1.59}, {"Dy", 1.59}, {"Ho", 1.57}, {"Er", 1.57}, {"Tm", 1.56}, {"Yb", 1.70}, {"Lu", 1.56}, {"Hf", 1.44}, {"Ta", 1.34}, {"W", 1.30}, {"Re", 1.28}, {"Os", 1.26}, {"Ir", 1.27}, {"Pt", 1.30}, {"Au", 1.34}, {"Hg", 1.49}, {"Tl", 1.48}, {"Pb", 1.47}, {"Bi", 1.46}, {"Po", 1.46}, {"At", 1.45}, {"Rn", 1.45}, {"Fr", 2.50}, {"Ra", 2.10}, {"Ac", 1.85}, {"Th", 1.65}, {"Pa", 1.50}, {"U", 1.42}, {"Np", 1.42}, {"Pu", 1.42}, {"Am", 1.42}, {"Cm", 1.42}, {"Bk", 1.42}, {"Cf", 1.42}, {"Es", 1.42}, {"Fm", 1.42}, {"Md", 1.42}, {"No", 1.42}, {"Lr", 1.42} }; /** * tool_physic_getSymbolFromZ: * @name: (out) (allow-none): a pointer on an unallocated string (can be NULL) ; * @radcov: (out) (allow-none): a pointer on a float (can be NULL) ; * @zele: the atomic number. * * Get the symbol or the covalence radius of the argument @zele. * * Returns: TRUE if zele is known in the atomic built-in list. */ gboolean tool_physic_getSymbolFromZ(gchar **name, float *radcov, int zele) { g_return_val_if_fail(zele > 0 && zele < NUMBER_OF_ELEMENTS + 1, FALSE); if (name) *name = eles[zele - 1].name; if (radcov) *radcov = eles[zele - 1].radcov; return TRUE; } /** * tool_physic_getZFromSymbol: * @zele: (out) (allow-none): a pointer on an integer (can be NULL) ; * @radcov: (out) (allow-none): a pointer on a float (can be NULL) ; * @symbol: the symbol of an atom. * * Get the the covalence radius or the atomic number of a given atomic * @symbol. * * Returns: TRUE if @symbol is known in the atomic built-in list. */ gboolean tool_physic_getZFromSymbol(int *zele, float *radcov, gchar *symbol) { int i; for (i = 0; i < NUMBER_OF_ELEMENTS; i++) { if (!strcmp(symbol, eles[i].name)) { if (radcov) *radcov = eles[i].radcov; if (zele) *zele = i + 1; return TRUE; } } return FALSE; } static const gchar* unitNames[TOOL_UNITS_N_VALUES + 1] = {"undefined", "bohr", "angstroem", "nanometer", NULL}; static const gchar* unitNamesAll[TOOL_UNITS_N_VALUES + 1][8] = {{"undefined", NULL, NULL, NULL, NULL, NULL, NULL, NULL}, {"bohr", "Bohr", "bohrd0", "Bohrd0", "atomic", "Atomic", "atomicd0", "Atomicd0"}, {"angstroem", "Angstroem", "angstroemd0", "Angstroemd0", "angstrom", "Angstrom", NULL, NULL}, {"nanometer", "Nanometer", "nanometerd0", "Nanometerd0", NULL, NULL, NULL, NULL}, {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}}; /** * tool_physic_getUnitNames: * * It provides the names corresponding to each units. * * Since: 3.5 * * Returns: (transfer none) (array zero-terminated=1): an array, null * terminated of strings. It is owned by V_Sim. */ const gchar** tool_physic_getUnitNames(void) { return unitNames; } static float unitValues[TOOL_UNITS_N_VALUES] = {-1.f, 5.291772108e-11f, 1e-10f, 1e-9f}; /** * tool_physic_getUnitValueInMeter: * @unit: a #ToolUnits. * * It provides the factor used to transform @unit into meters. * * Since: 3.5 * * Returns: a factor. */ float tool_physic_getUnitValueInMeter(ToolUnits unit) { g_return_val_if_fail(unit != TOOL_UNITS_UNDEFINED && unit != TOOL_UNITS_N_VALUES, -1.f); DBG_fprintf(stderr, "Visu Tools: get unit (%d) length.\n", unit); return unitValues[unit]; } /** * tool_physic_getUnitFromName: * @name: a unit name. * * Find the unit corresponding to the @name. If none is found, * #TOOL_UNITS_UNDEFINED is returned. * * Since: 3.5 * * Returns: a #ToolUnits. */ ToolUnits tool_physic_getUnitFromName(const gchar *name) { int i, j; for (i = 0; i < TOOL_UNITS_N_VALUES; i++) for (j = 0; j < 8 && unitNamesAll[i][j]; j++) if (!strcmp(name, unitNamesAll[i][j])) return i; return TOOL_UNITS_UNDEFINED; } v_sim-3.7.0/src/coreTools/toolPhysic.h0000644000353400050620000000534312215546101014631 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef TOOLELEMENTS_H #define TOOLELEMENTS_H gboolean tool_physic_getSymbolFromZ(gchar **name, float *radcov, int zele); gboolean tool_physic_getZFromSymbol(int *zele, float *radcov, gchar *symbol); /** * ToolUnits: * @TOOL_UNITS_UNDEFINED: the units are undefined. * @TOOL_UNITS_BOHR: the length are given in Bohr (1ang = 0.529177Bohr); * @TOOL_UNITS_ANGSTROEM: the length are given in angstroems ; * @TOOL_UNITS_NANOMETER: the length are given in nanometers. * @TOOL_UNITS_N_VALUES: private. * * The possible length units defined in V_Sim. The special case * @TOOL_UNITS_UNDEFINED means that a unit must be defined before any * conversion operations may be done. * * Since: 3.5 */ typedef enum { TOOL_UNITS_UNDEFINED, TOOL_UNITS_BOHR, TOOL_UNITS_ANGSTROEM, TOOL_UNITS_NANOMETER, /*< private >*/ TOOL_UNITS_N_VALUES } ToolUnits; const gchar** tool_physic_getUnitNames(void); float tool_physic_getUnitValueInMeter(ToolUnits unit); ToolUnits tool_physic_getUnitFromName(const gchar *name); #endif v_sim-3.7.0/src/coreTools/atoms_yaml.c0000644000353400050620000011017712216265263014646 00000000000000#define _ISOC99_SOURCE #include "config.h" #ifdef HAVE_YAML #include #endif #include #include #include #include #include #include "atoms_yaml.h" #ifndef FC_FUNC_ #define FC_FUNC_(A,B) A ## _ #endif #ifdef HAVE_YAML static const char *UnitsPositions_keys[] = {"bohr", "angstroem", "reduced", "atomic", NULL}; static const char *BC_keys[] = {"free", "wire", "surface", "periodic", NULL}; static const char *Units_keys[] = {"bohr", "angstroem", "atomic", NULL}; static const char *funits_keys[] = {"Ha/Bohr", "eV/Ang", NULL}; static const char *eunits_keys[] = {"Ha", "eV", "Ry", NULL}; static const char *frozen_keys[] = {"No", "Yes", "fy", "fxz", "N", "Y", "", "", "false", "true", "", "", "off", "on", "", "", NULL}; static const char *bool_keys[] = {"No", "Yes", "N", "Y", "false", "true", "off", "on", NULL}; static PosinpAtoms* posinp_atoms_new() { PosinpAtoms *atoms; atoms = malloc(sizeof(PosinpAtoms)); memset(atoms, 0, sizeof(PosinpAtoms)); /* Default values. */ atoms->BC = POSINP_BC_FREE; atoms->Units = POSINP_CELL_UNITS_BOHR; atoms->angdeg[0] = 90.; atoms->angdeg[1] = 90.; atoms->angdeg[2] = 90.; /* Default values. */ atoms->units = POSINP_COORD_UNITS_BOHR; /* Default values. */ atoms->funits = POSINP_FORCE_UNITS_HARTREE_PER_BOHR; /* Default values. */ atoms->energy = NAN; atoms->eunits = POSINP_ENERG_UNITS_HARTREE; atoms->gnrm_wfn = NAN; return atoms; } #endif static void posinp_atoms_free(PosinpAtoms *atoms) { unsigned int i; /* Freeing. */ if (atoms->comment) free(atoms->comment); if (atoms->rxyz) free(atoms->rxyz); if (atoms->atomnames) { for (i = 0; i < atoms->ntypes; i++) if (atoms->atomnames[i]) free(atoms->atomnames[i]); free(atoms->atomnames); } if (atoms->iatype) free(atoms->iatype); if (atoms->ifrztyp) free(atoms->ifrztyp); if (atoms->igspin) free(atoms->igspin); if (atoms->igchg) free(atoms->igchg); if (atoms->fxyz) free(atoms->fxyz); free(atoms); } #ifdef TEST_ME static void posinp_atoms_trace(PosinpAtoms *atoms) { unsigned int i; fprintf(stdout, "'%s'.\n", atoms->comment); if (!isnan(atoms->gnrm_wfn)) fprintf(stdout, "Converged %d (%g).\n", atoms->converged, atoms->gnrm_wfn); if (!isnan(atoms->energy)) fprintf(stdout, "Energy is %g %s (%d).\n", atoms->energy, eunits_keys[atoms->eunits], atoms->eunits); fprintf(stdout, "BC is %d (%s).\n", atoms->BC, BC_keys[atoms->BC]); fprintf(stdout, "Units are %d (%s).\n", atoms->Units, Units_keys[atoms->Units]); fprintf(stdout, "acell is %g %g %g.\n", atoms->acell[0], atoms->acell[1], atoms->acell[2]); fprintf(stdout, "angdeg is %g %g %g.\n", atoms->angdeg[0], atoms->angdeg[1], atoms->angdeg[2]); fprintf(stdout, "Position units are %d (%s).\n", atoms->units, UnitsPositions_keys[atoms->units]); for (i = 0; i < atoms->nat; i++) fprintf(stdout, "Atom '%s' at %g %g %g (%d) f:%d s:%d c:%d.\n", atoms->atomnames[atoms->iatype[i]], atoms->rxyz[3 * i + 0], atoms->rxyz[3 * i + 1], atoms->rxyz[3 * i + 2], atoms->iatype[i], atoms->ifrztyp[i], atoms->igspin[i], atoms->igchg[i]); if (atoms->fxyz) { fprintf(stdout, "Forces units are %d (%s).\n", atoms->funits, funits_keys[atoms->funits]); fprintf(stdout, "fnrm is %g, maxval is %g.\n", atoms->fnrm, atoms->maxval); for (i = 0; i < atoms->nat; i++) fprintf(stdout, "Force on '%s' is %g %g %g.\n", atoms->atomnames[atoms->iatype[i]], atoms->fxyz[3 * i + 0], atoms->fxyz[3 * i + 1], atoms->fxyz[3 * i + 2]); } } #endif #define set_error(...) \ if (message && !*message) \ { \ ln = snprintf(NULL, 0, __VA_ARGS__); \ *message = malloc(sizeof(char) * ln); \ sprintf(*message, __VA_ARGS__); \ } \ else \ fprintf(stderr, __VA_ARGS__) #ifdef HAVE_YAML static void _yaml_parser_error(const yaml_parser_t *parser, char **message) { size_t ln; switch (parser->error) { case YAML_MEMORY_ERROR: set_error("Memory error: Not enough memory for parsing\n"); return; case YAML_READER_ERROR: if (parser->problem_value != -1) { set_error("Reader error: %s: #%X at %ld\n", parser->problem, parser->problem_value, parser->problem_offset); } else { set_error("Reader error: %s at %ld\n", parser->problem, parser->problem_offset); } return; case YAML_SCANNER_ERROR: if (parser->context) { set_error("Scanner error: %s at line %ld, column %ld\n" "%s at line %ld, column %ld\n", parser->context, parser->context_mark.line+1, parser->context_mark.column+1, parser->problem, parser->problem_mark.line+1, parser->problem_mark.column+1); } else { set_error("Scanner error: %s at line %ld, column %ld\n", parser->problem, parser->problem_mark.line+1, parser->problem_mark.column+1); } return; case YAML_PARSER_ERROR: if (parser->context) { set_error("Parser error: %s at line %ld, column %ld\n" "%s at line %ld, column %ld\n", parser->context, parser->context_mark.line+1, parser->context_mark.column+1, parser->problem, parser->problem_mark.line+1, parser->problem_mark.column+1); } else { set_error("Parser error: %s at line %ld, column %ld\n", parser->problem, parser->problem_mark.line+1, parser->problem_mark.column+1); } return; default: /* Couldn't happen. */ set_error("Internal error\n"); return; } } static int _yaml_parser_copy_str(yaml_parser_t *parser, char **val, char **message) { yaml_event_t event; int done; size_t ln; /* Read the value. */ done = 0; if (yaml_parser_parse(parser, &event)) { if (event.type == YAML_SCALAR_EVENT) { ln = strlen((const char*)event.data.scalar.value); *val = malloc(sizeof(char) * (ln + 1)); memcpy(*val, event.data.scalar.value, sizeof(char) * ln); done = 0; } else { set_error("Parser error: value awaited.\n"); done = (event.type == YAML_STREAM_END_EVENT)?1:-1; } /* The application is responsible for destroying the event object. */ yaml_event_delete(&event); } else { /* Error treatment. */ _yaml_parser_error(parser, message); done = -1; } return done; } static int _yaml_parser_read_int(yaml_parser_t *parser, int *val, char **message) { yaml_event_t event; int done; char *end; size_t ln; /* Read the value. */ done = 0; if (yaml_parser_parse(parser, &event)) { if (event.type == YAML_SCALAR_EVENT) { *val = (int)strtol((const char*)event.data.scalar.value, &end, 10); if (end == (char*)event.data.scalar.value) { set_error("Parser error: cannot convert '%s' to an int.\n", end); done = -1; } else done = 0; } else { set_error("Parser error: value awaited.\n"); done = (event.type == YAML_STREAM_END_EVENT)?1:-1; } /* The application is responsible for destroying the event object. */ yaml_event_delete(&event); } else { /* Error treatment. */ _yaml_parser_error(parser, message); done = -1; } return done; } static int _yaml_parser_read_double(yaml_parser_t *parser, double *val, char **message) { yaml_event_t event; int done; char *end; size_t ln; /* Read the value. */ done = 0; if (yaml_parser_parse(parser, &event)) { if (event.type == YAML_SCALAR_EVENT) { if (!event.data.scalar.value[0]) *val = strtod("NaN", &end); else if (!strcasecmp((const char*)event.data.scalar.value, ".inf")) *val = strtod((const char*)event.data.scalar.value + 1, &end); else *val = strtod((const char*)event.data.scalar.value, &end); if (end == (char*)event.data.scalar.value) { set_error("Parser error: cannot convert '%s' to a double.\n", end); done = -1; } else done = 0; } else { set_error("Parser error: value awaited.\n"); done = (event.type == YAML_STREAM_END_EVENT)?1:-1; } /* The application is responsible for destroying the event object. */ yaml_event_delete(&event); } else { /* Error treatment. */ _yaml_parser_error(parser, message); done = -1; } return done; } static int _yaml_parser_read_double_array(yaml_parser_t *parser, const char *key, double *vals, unsigned int n, char **message) { yaml_event_t event; int done; unsigned int i; size_t ln; /* Read the value. */ done = 0; if (yaml_parser_parse(parser, &event)) { if (event.type == YAML_SEQUENCE_START_EVENT) { for (i = 0; i < n && done == 0; i++) done = _yaml_parser_read_double(parser, vals + i, message); yaml_event_delete(&event); if (yaml_parser_parse(parser, &event)) { if (event.type != YAML_SEQUENCE_END_EVENT) { set_error("Parser error: end sequence missing for key '%s' after %d values.\n", key, n); done = -1; } } else { /* Error treatment. */ _yaml_parser_error(parser, message); done = -1; } } else { set_error("Parser error: sequence awaited after key '%s'.\n", key); done = -1; } /* The application is responsible for destroying the event object. */ yaml_event_delete(&event); } else { /* Error treatment. */ _yaml_parser_error(parser, message); done = -1; } return done; } static int _find_keyword(const char *keys[], const char *value, unsigned int *id, unsigned int modulo, char **message) { int done; size_t ln; for (*id = 0; keys[*id]; *id += 1) if (!strcasecmp(value, keys[*id])) break; if (keys[*id]) { *id = *id % modulo; done = 0; } else { *id = 0; set_error("Parser error: cannot find key value '%s'.\n", value); done = -1; } return done; } static int _find_units(const char *keys[], const char *value, unsigned int *id, unsigned int modulo, char **message) { int done; size_t ln; char *start, *end, *unit; *id = 0; start = strchr(value, '('); if (!start) /* No unit specified, no error. */ return 0; end = strchr(start, ')'); if (!start) { /* Parentethis not closed, error. */ set_error("Parser error: unit not properly written in '%s'.\n", value); return -1; } ln = end - start - 1; unit = malloc(sizeof(char) * (ln + 1)); memcpy(unit, start + 1, ln); unit[ln] = '\0'; done = _find_keyword(keys, unit, id, modulo, message); free(unit); return done; } static int _yaml_parser_read_keyword(yaml_parser_t *parser, const char *key, const char *keys[], unsigned int *id, unsigned int modulo, char **message) { yaml_event_t event; int done; size_t ln; /* Read the value. */ done = 0; if (yaml_parser_parse(parser, &event)) { if (event.type == YAML_SCALAR_EVENT) done = _find_keyword(keys, (const char*)event.data.scalar.value, id, modulo, message); else { set_error("Parser error: value awaited after key '%s'.\n", key); done = -1; } /* The application is responsible for destroying the event object. */ yaml_event_delete(&event); } else { /* Error treatment. */ _yaml_parser_error(parser, message); done = -1; } return done; } static int posinp_yaml_cell(yaml_parser_t *parser, PosinpAtoms *atoms, char **message) { yaml_event_t event; int done, count; /* Read the event sequence. */ done = 0; count = 0; while (!done) /* Get the next event. */ if (yaml_parser_parse(parser, &event)) { switch(event.type) { case YAML_SEQUENCE_START_EVENT: case YAML_MAPPING_START_EVENT: count += 1; done = 0; break; case YAML_SEQUENCE_END_EVENT: case YAML_MAPPING_END_EVENT: count -= 1; done = 0; break; case YAML_SCALAR_EVENT: if (!strcmp((const char*)event.data.scalar.value, "BC")) done = _yaml_parser_read_keyword(parser, "BC", BC_keys, &atoms->BC, POSINP_N_BC, message); else if (!strcmp((const char*)event.data.scalar.value, "Units")) done = _yaml_parser_read_keyword(parser, "Units", Units_keys, &atoms->Units, POSINP_CELL_N_UNITS, message); else if (!strcmp((const char*)event.data.scalar.value, "acell")) done = _yaml_parser_read_double_array(parser, "acell", atoms->acell, 3, message); else if (!strcmp((const char*)event.data.scalar.value, "angdeg")) done = _yaml_parser_read_double_array(parser, "angdeg", atoms->angdeg, 3, message); else done = 0; break; default: done = (event.type == YAML_STREAM_END_EVENT); break; } /* Are we finished? */ if (count == 0) done = 2; /* The application is responsible for destroying the event object. */ yaml_event_delete(&event); } else { /* Error treatment. */ _yaml_parser_error(parser, message); done = -1; } if (done == 2) done = 0; return done; } static int posinp_yaml_coord(yaml_parser_t *parser, double coords[3], char **names, unsigned int *iat, char **message) { yaml_event_t event; unsigned int ln; int done; /* Read the value. */ done = 0; *iat = 0; if (yaml_parser_parse(parser, &event)) { if (event.type == YAML_SCALAR_EVENT) { /* Here parse the name... */ for (*iat = 0; names[*iat] && strcmp((const char*)names[*iat], (const char*)event.data.scalar.value); *iat += 1); if (!names[*iat]) { ln = strlen((const char*)event.data.scalar.value); names[*iat] = malloc(sizeof(char*) * (ln + 1)); memcpy(names[*iat], (const char*)event.data.scalar.value, sizeof(char*) * ln); names[*iat][ln] = '\0'; } /* Then the coordinates. */ done = _yaml_parser_read_double_array(parser, names[*iat], coords, 3, message); } else { set_error("Parser error: atom name awaited.\n"); done = -1; } /* The application is responsible for destroying the event object. */ yaml_event_delete(&event); } else { /* Error treatment. */ _yaml_parser_error(parser, message); done = -1; } return done; } static int posinp_yaml_coords(yaml_parser_t *parser, PosinpAtoms *atoms, char **message) { yaml_event_t event; int done; unsigned int count, atom_size; #define ATOM_INC 100 /* Read the event sequence. */ done = 0; count = 0; atom_size = ATOM_INC; atoms->rxyz = malloc(sizeof(double) * atom_size * 3); atoms->atomnames = malloc(sizeof(char*) * atom_size); memset(atoms->atomnames, 0, sizeof(char*) * atom_size); atoms->iatype = malloc(sizeof(unsigned int) * atom_size); atoms->ifrztyp = malloc(sizeof(unsigned int) * atom_size); memset(atoms->ifrztyp, 0, sizeof(unsigned int) * atom_size); atoms->igspin = malloc(sizeof(int) * atom_size); memset(atoms->igspin, 0, sizeof(int) * atom_size); atoms->igchg = malloc(sizeof(int) * atom_size); memset(atoms->igchg, 0, sizeof(int) * atom_size); while (!done) /* Get the next event. */ if (yaml_parser_parse(parser, &event)) { switch(event.type) { case YAML_MAPPING_START_EVENT: /* Each mapping is one atom. */ done = posinp_yaml_coord(parser, atoms->rxyz + 3 * count, atoms->atomnames, atoms->iatype + count, message); count += 1; if (count >= atom_size) { atom_size += ATOM_INC; atoms->rxyz = realloc(atoms->rxyz, sizeof(double) * 3 * atom_size); atoms->atomnames = realloc(atoms->atomnames, sizeof(char*) * atom_size); memset(atoms->atomnames + atom_size - ATOM_INC, 0, sizeof(char*) * ATOM_INC); atoms->iatype = realloc(atoms->iatype, sizeof(unsigned int) * atom_size); atoms->ifrztyp = realloc(atoms->ifrztyp, sizeof(unsigned int) * atom_size); memset(atoms->ifrztyp + atom_size - ATOM_INC, 0, sizeof(unsigned int) * ATOM_INC); atoms->igspin = realloc(atoms->igspin, sizeof(int) * atom_size); memset(atoms->igspin + atom_size - ATOM_INC, 0, sizeof(int) * ATOM_INC); atoms->igchg = realloc(atoms->igchg, sizeof(int) * atom_size); memset(atoms->igchg + atom_size - ATOM_INC, 0, sizeof(int) * ATOM_INC); } break; case YAML_SEQUENCE_END_EVENT: done = 2; break; case YAML_SCALAR_EVENT: if (!strcmp((const char*)event.data.scalar.value, "IGSpin")) done = _yaml_parser_read_int(parser, atoms->igspin + count - 1, message); else if (!strcmp((const char*)event.data.scalar.value, "IGChg")) done = _yaml_parser_read_int(parser, atoms->igchg + count - 1, message); else if (!strcmp((const char*)event.data.scalar.value, "Frozen")) done = _yaml_parser_read_keyword(parser, "Frozen", frozen_keys, atoms->ifrztyp + count - 1, POSINP_N_FROZEN, message); else done = 0; break; default: done = (event.type == YAML_STREAM_END_EVENT); break; } /* The application is responsible for destroying the event object. */ yaml_event_delete(&event); } else { /* Error treatment. */ _yaml_parser_error(parser, message); done = -1; } if (done == 2) done = 0; atoms->nat = count; atoms->rxyz = realloc(atoms->rxyz, sizeof(double) * 3 * atoms->nat); atoms->iatype = realloc(atoms->iatype, sizeof(unsigned int) * atoms->nat); atoms->ifrztyp = realloc(atoms->ifrztyp, sizeof(unsigned int) * atoms->nat); atoms->igspin = realloc(atoms->igspin, sizeof(int) * atoms->nat); atoms->igchg = realloc(atoms->igchg, sizeof(int) * atoms->nat); for (atoms->ntypes = 0; atoms->atomnames[atoms->ntypes]; atoms->ntypes++); atoms->atomnames = realloc(atoms->atomnames, sizeof(char*) * atoms->ntypes); return done; } static int posinp_yaml_position(yaml_parser_t *parser, PosinpAtoms *atoms, char **message) { yaml_event_t event; int done, count; /* Read the event sequence. */ done = 0; count = 0; while (!done) /* Get the next event. */ if (yaml_parser_parse(parser, &event)) { switch(event.type) { case YAML_SEQUENCE_START_EVENT: if (count == 0) { done = posinp_yaml_coords(parser, atoms, message); break; } case YAML_MAPPING_START_EVENT: count += 1; done = 0; break; case YAML_SEQUENCE_END_EVENT: case YAML_MAPPING_END_EVENT: count -= 1; done = 0; break; case YAML_SCALAR_EVENT: if (!strcmp((const char*)event.data.scalar.value, "Units")) done = _yaml_parser_read_keyword(parser, "Units", UnitsPositions_keys, &atoms->units, POSINP_COORD_N_UNITS, message); else if (!strcmp((const char*)event.data.scalar.value, "Values")) done = posinp_yaml_coords(parser, atoms, message); else done = 0; break; default: done = (event.type == YAML_STREAM_END_EVENT); break; } /* Are we finished? */ if (count == 0) done = 2; /* The application is responsible for destroying the event object. */ yaml_event_delete(&event); } else { /* Error treatment. */ _yaml_parser_error(parser, message); done = -1; } if (done == 2) done = 0; return done; } static int posinp_yaml_force(yaml_parser_t *parser, PosinpAtoms *atoms, char **message) { yaml_event_t event, event2; int done; unsigned int count; size_t ln; if (atoms->nat < 1) { set_error("Parser error: forces are defined before atoms.\n"); done = -1; } /* Read the event sequence. */ done = 0; count = 0; atoms->fxyz = malloc(sizeof(double) * atoms->nat * 3); memset(atoms->fxyz, 0, sizeof(double) * atoms->nat * 3); while (!done) /* Get the next event. */ if (yaml_parser_parse(parser, &event)) { switch(event.type) { case YAML_MAPPING_START_EVENT: /* Each mapping is one atom. */ if (count >= atoms->nat) { set_error("Parser error: there are more forces than actual atoms.\n"); done = -1; break; } if (yaml_parser_parse(parser, &event2)) { if (event2.type == YAML_SCALAR_EVENT) { /* Here parse the name... */ if (!strcmp(atoms->atomnames[atoms->iatype[count]], (const char*)event2.data.scalar.value)) /* Then the coordinates. */ done = _yaml_parser_read_double_array(parser, atoms->atomnames[atoms->iatype[count]], atoms->fxyz + 3 * count, 3, message); else { set_error("Parser error: force %d is applied on atom '%s' while atom" " %d is named '%s'.\n", count, (const char*)event2.data.scalar.value, count, atoms->atomnames[atoms->iatype[count]]); done = -1; } } else { set_error("Parser error: atom name awaited.\n"); done = -1; } } else { /* Error treatment. */ _yaml_parser_error(parser, message); done = -1; } yaml_event_delete(&event2); count += 1; break; case YAML_SEQUENCE_END_EVENT: done = 2; break; case YAML_SCALAR_EVENT: done = 0; break; default: done = (event.type == YAML_STREAM_END_EVENT); break; } /* The application is responsible for destroying the event object. */ yaml_event_delete(&event); } else { /* Error treatment. */ _yaml_parser_error(parser, message); done = -1; } if (done == 2) done = 0; return done; } static int posinp_yaml_forces(yaml_parser_t *parser, PosinpAtoms *atoms, char **message) { yaml_event_t event; int done, count; /* Read the event sequence. */ done = 0; count = 0; while (!done) /* Get the next event. */ if (yaml_parser_parse(parser, &event)) { switch(event.type) { case YAML_SEQUENCE_START_EVENT: if (count == 0) { done = posinp_yaml_force(parser, atoms, message); break; } case YAML_MAPPING_START_EVENT: count += 1; done = 0; break; case YAML_SEQUENCE_END_EVENT: case YAML_MAPPING_END_EVENT: count -= 1; done = 0; break; case YAML_SCALAR_EVENT: if (!strcmp((const char*)event.data.scalar.value, "Units")) done = _yaml_parser_read_keyword(parser, "Units", funits_keys, &atoms->funits, POSINP_FORCE_N_UNITS, message); else if (!strcmp((const char*)event.data.scalar.value, "Values")) done = posinp_yaml_force(parser, atoms, message); else if (!strcmp((const char*)event.data.scalar.value, "Fnrm")) done = _yaml_parser_read_double(parser, &atoms->fnrm, message); else if (!strcmp((const char*)event.data.scalar.value, "MaxVal")) done = _yaml_parser_read_double(parser, &atoms->maxval, message); else done = 0; break; default: done = (event.type == YAML_STREAM_END_EVENT); break; } /* Are we finished? */ if (count == 0) done = 2; /* The application is responsible for destroying the event object. */ yaml_event_delete(&event); } else { /* Error treatment. */ _yaml_parser_error(parser, message); done = -1; } if (done == 2) done = 0; return done; } static int posinp_yaml_properties(yaml_parser_t *parser, PosinpAtoms *atoms, char **message) { yaml_event_t event; int done, count; /* Read the event sequence. */ done = 0; count = 0; while (!done) /* Get the next event. */ if (yaml_parser_parse(parser, &event)) { switch(event.type) { case YAML_SEQUENCE_START_EVENT: case YAML_MAPPING_START_EVENT: count += 1; done = 0; break; case YAML_SEQUENCE_END_EVENT: case YAML_MAPPING_END_EVENT: count -= 1; done = 0; break; case YAML_SCALAR_EVENT: if (!strcmp((const char*)event.data.scalar.value, "Converged")) done = _yaml_parser_read_keyword(parser, "Converged", bool_keys, &atoms->converged, 2, message); else if (!strcmp((const char*)event.data.scalar.value, "Gnrm_wfn")) done = _yaml_parser_read_double(parser, &atoms->gnrm_wfn, message); else if (!strncmp((const char*)event.data.scalar.value, "Energy", 6)) { done = _find_units(eunits_keys, (const char*)event.data.scalar.value, &atoms->eunits, POSINP_ENERG_N_UNITS, message); done = (!done)?_yaml_parser_read_double(parser, &atoms->energy, message):done; } else done = 0; break; default: done = (event.type == YAML_STREAM_END_EVENT); break; } /* Are we finished? */ if (count == 0) done = 2; /* The application is responsible for destroying the event object. */ yaml_event_delete(&event); } else { /* Error treatment. */ _yaml_parser_error(parser, message); done = -1; } if (done == 2) done = 0; return done; } #endif PosinpList* posinp_yaml_parse(const char *filename, char **message) { PosinpList *list; #ifdef HAVE_YAML PosinpList *tmp, *tmp2; FILE *input; yaml_parser_t parser; yaml_event_t event; int done; list = tmp = (PosinpList*)0; input = fopen(filename, "rb"); if (!input) return list; /* Create the Parser object. */ yaml_parser_initialize(&parser); yaml_parser_set_input_file(&parser, input); /* Read the event sequence. */ done = 0; while (!done) /* Get the next event. */ if (yaml_parser_parse(&parser, &event)) { if (event.type == YAML_DOCUMENT_START_EVENT) { tmp2 = malloc(sizeof(PosinpList)); memset(tmp2, 0, sizeof(PosinpList)); tmp2->data = posinp_atoms_new(); if (!tmp) list = tmp = tmp2; else { tmp->next = tmp2; tmp = tmp2; } } else if (event.type == YAML_SCALAR_EVENT && !strcmp((const char*)event.data.scalar.value, "Cell")) done = posinp_yaml_cell(&parser, tmp->data, message); else if (event.type == YAML_SCALAR_EVENT && !strcmp((const char*)event.data.scalar.value, "Positions")) done = posinp_yaml_position(&parser, tmp->data, message); else if (event.type == YAML_SCALAR_EVENT && !strcmp((const char*)event.data.scalar.value, "Forces")) done = posinp_yaml_forces(&parser, tmp->data, message); else if (event.type == YAML_SCALAR_EVENT && !strcmp((const char*)event.data.scalar.value, "Properties")) done = posinp_yaml_properties(&parser, tmp->data, message); else if (event.type == YAML_SCALAR_EVENT && !strcmp((const char*)event.data.scalar.value, "Comment")) done = _yaml_parser_copy_str(&parser, &tmp->data->comment, message); else done = (event.type == YAML_STREAM_END_EVENT); /* The application is responsible for destroying the event object. */ yaml_event_delete(&event); } else { /* Error treatment. */ _yaml_parser_error(&parser, message); done = -1; } /* Destroy the Parser object. */ yaml_parser_delete(&parser); fclose(input); #else size_t ln; set_error("No YAML support, cannot read file '%s'.\n", filename); list = (PosinpList*)0; #endif return list; } void FC_FUNC_(posinp_yaml_parse, POSINP_YAML_PARSE)(PosinpList **self, const char *filename, unsigned int *ln) { char *name; name = malloc(sizeof(char) * (*ln + 1)); memcpy(name, filename, sizeof(char) * *ln); name[*ln] = '\0'; *self = posinp_yaml_parse(name, NULL); free(name); } void posinp_yaml_free_list(PosinpList *lst) { PosinpList *tmp; while(lst) { posinp_atoms_free(lst->data); tmp = lst; lst = lst->next; free(tmp); } } void FC_FUNC_(posinp_yaml_free_list, POSINP_YAML_FREE_LIST)(PosinpList **self) { posinp_yaml_free_list(*self); } void FC_FUNC_(posinp_yaml_get_cell, POSINP_YAML_GET_CELL)(PosinpList **self, unsigned int *i, unsigned int *BC, unsigned int *Units, double acell[3], double angdeg[3]) { PosinpList *lst; unsigned int j; for (lst = *self, j = 0; j < *i; j++) if (lst) lst = lst->next; if (lst) { *BC = lst->data->BC; *Units = lst->data->Units; acell[0] = lst->data->acell[0]; acell[1] = lst->data->acell[1]; acell[2] = lst->data->acell[2]; angdeg[0] = lst->data->angdeg[0]; angdeg[1] = lst->data->angdeg[1]; angdeg[2] = lst->data->angdeg[2]; } else { angdeg[0] = 90.; angdeg[1] = 90.; angdeg[2] = 90.; } } void FC_FUNC_(posinp_yaml_get_dims, POSINP_YAML_GET_DIMS)(PosinpList **self, unsigned int *i, unsigned int *nat, unsigned int *ntypes) { PosinpList *lst; unsigned int j; for (lst = *self, j = 0; j < *i; j++) if (lst) lst = lst->next; if (lst) { *nat = lst->data->nat; *ntypes = lst->data->ntypes; } } void FC_FUNC_(posinp_yaml_get_atoms, POSINP_YAML_GET_ATOMS)(PosinpList **self, unsigned int *i, unsigned int *units, double *rxyz, unsigned int *iatype, unsigned int *ifrztyp, int *igspin, int *igchg) { PosinpList *lst; unsigned int j; for (lst = *self, j = 0; j < *i; j++) if (lst) lst = lst->next; if (lst) { *units = lst->data->units; memcpy(iatype, lst->data->iatype, sizeof(unsigned int) * lst->data->nat); memcpy(ifrztyp, lst->data->ifrztyp, sizeof(unsigned int) * lst->data->nat); memcpy(igspin, lst->data->igspin, sizeof(int) * lst->data->nat); memcpy(igchg, lst->data->igchg, sizeof(int) * lst->data->nat); memcpy(rxyz, lst->data->rxyz, sizeof(double) * lst->data->nat * 3); for (j = 0; j < lst->data->nat; j++) iatype[j] += 1; } } void FC_FUNC_(posinp_yaml_get_atomname, POSINP_YAML_GET_ATOMNAME)(PosinpList **self, unsigned int *i, unsigned int *ityp, char name[20]) { PosinpList *lst; unsigned int j, ln; for (lst = *self, j = 0; j < *i; j++) if (lst) lst = lst->next; if (lst) { memset(name, ' ', sizeof(char) * 20); ln = strlen(lst->data->atomnames[*ityp]); memcpy(name, lst->data->atomnames[*ityp], sizeof(char) * ((ln > 20)?20:ln)); } } void FC_FUNC_(posinp_yaml_has_forces, POSINP_YAML_HAS_FORCES)(PosinpList **self, unsigned int *i, unsigned int *has_forces) { PosinpList *lst; unsigned int j; for (lst = *self, j = 0; j < *i; j++) if (lst) lst = lst->next; if (lst) *has_forces = (lst->data->fxyz != (double*)0); } void FC_FUNC_(posinp_yaml_get_forces, POSINP_YAML_GET_FORCES)(PosinpList **self, unsigned int *i, unsigned int *units, double *fnrm, double *maxval, double *fxyz) { PosinpList *lst; unsigned int j; for (lst = *self, j = 0; j < *i; j++) if (lst) lst = lst->next; if (lst) { if (lst->data->fxyz) memcpy(fxyz, lst->data->fxyz, sizeof(double) * lst->data->nat * 3); *units = lst->data->funits; *fnrm = lst->data->fnrm; *maxval = lst->data->maxval; } } void FC_FUNC_(posinp_yaml_get_properties, POSINP_YAML_GET_PROPERTIES) (PosinpList **self, unsigned int *i, unsigned int *eunits, double *energy, double *gnrm, int *converged) { PosinpList *lst; unsigned int j; for (lst = *self, j = 0; j < *i; j++) if (lst) lst = lst->next; if (lst) { *eunits = lst->data->eunits; *energy = lst->data->energy; *converged = lst->data->converged; *gnrm = lst->data->gnrm_wfn; } } void FC_FUNC_(posinp_yaml_get_comment, POSINP_YAML_GET_COMMENT) (PosinpList **self, unsigned int *i, char *comment, unsigned int *len) { PosinpList *lst; unsigned int j, ln; for (lst = *self, j = 0; j < *i; j++) if (lst) lst = lst->next; if (lst) { memset(comment, ' ', sizeof(char) * *len); if (lst->data->comment) { ln = strlen(lst->data->comment); memcpy(comment, lst->data->comment, sizeof(char) * ((ln <= (*len))?ln:*len)); } } } #ifdef TEST_ME int main(int argc, const char **argv) { PosinpList *lst, *tmp; lst = posinp_yaml_parse(argv[1], NULL); for (tmp = lst; tmp; tmp = tmp->next) { fprintf(stdout, "---\n"); posinp_atoms_trace(tmp->data); } posinp_yaml_free_list(lst); return 0; } #endif v_sim-3.7.0/src/coreTools/atoms_yaml.h0000644000353400050620000000370212215546101014636 00000000000000/* !> @file !! Routines to read YAML position files. !! @author !! Copyright (C) 2007-2012 BigDFT group !! This file is distributed under the terms of the !! GNU General Public License, see ~/COPYING file !! or http://www.gnu.org/copyleft/gpl.txt . !! For the list of contributors, see ~/AUTHORS */ #ifndef ATOMS_YAML_H #define ATOMS_YAML_H typedef enum { POSINP_BC_FREE, POSINP_BC_WIRE_Z, POSINP_BC_SURFACE_XZ, POSINP_BC_PERIODIC, POSINP_N_BC } PosinpBC; typedef enum { POSINP_CELL_UNITS_BOHR, POSINP_CELL_UNITS_ANGSTROEM, POSINP_CELL_N_UNITS } PosinpCellUnits; typedef enum { POSINP_COORD_UNITS_BOHR, POSINP_COORD_UNITS_ANGSTROEM, POSINP_COORD_UNITS_REDUCED, POSINP_COORD_N_UNITS } PosinpCoordUnits; typedef enum { POSINP_FORCE_UNITS_HARTREE_PER_BOHR, POSINP_FORCE_UNITS_EV_PER_ANGSTROEM, POSINP_FORCE_N_UNITS } PosinpForceUnits; typedef enum { POSINP_ENERG_UNITS_HARTREE, POSINP_ENERG_UNITS_EV, POSINP_ENERG_UNITS_RYDBERG, POSINP_ENERG_N_UNITS } PosinpEnergUnits; typedef enum { POSINP_FROZEN_FREE, POSINP_FROZEN_FULL, POSINP_FROZEN_Y, POSINP_FROZEN_XZ, POSINP_N_FROZEN } PosinpFrozenType; typedef struct _PosinpAtoms { /* The cell. */ PosinpBC BC; PosinpCellUnits Units; double acell[3], angdeg[3]; /* The positions. */ unsigned int nat, ntypes; PosinpCoordUnits units; double *rxyz; char **atomnames; unsigned int *iatype, *ifrztyp; int *igspin, *igchg; /* The forces. */ PosinpForceUnits funits; double fnrm, maxval; double *fxyz; /* Additional data. */ char *comment; PosinpEnergUnits eunits; double energy; unsigned int converged; double gnrm_wfn; } PosinpAtoms; typedef struct _PosinpList PosinpList; struct _PosinpList { PosinpList *next; PosinpAtoms *data; }; PosinpList* posinp_yaml_parse(const char *filename, char **message); void posinp_yaml_free_list(PosinpList *lst); #endif v_sim-3.7.0/src/dumpModules/0000755000353400050620000000000012216331340012721 500000000000000v_sim-3.7.0/src/dumpModules/externalDumpModules.h0000644000353400050620000000472112215546075017033 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef EXTERNALDUMPMODULES_H #define EXTERNALDUMPMODULES_H #include "../visu_dump.h" #include "dumpToTiff.h" #include "dumpToGif.h" #include "dumpToPsAndPdf.h" #include "dumpThroughGdkPixbuf.h" #include "dumpToAscii.h" #include "dumpToXyz.h" #include "dumpToABINIT.h" #ifdef HAVE_CAIRO #include "dumpToSVG.h" #endif static VisuDumpInitFunc listInitDumpModuleFunc[] = { visu_dump_ascii_getStatic, visu_dump_xyz_getStatic, visu_dump_abinit_getStatic, visu_dump_jpeg_getStatic, visu_dump_png_getStatic, visu_dump_tiff_getStatic, #ifdef HAVE_CAIRO visu_dump_cairo_svg_getStatic, visu_dump_cairo_pdf_getStatic, #endif visu_dump_bitmap_pdf_getStatic, visu_dump_bitmap_ps_getStatic, (VisuDumpInitFunc)dumpToGif_init, (VisuDumpInitFunc)0}; #endif v_sim-3.7.0/src/dumpModules/dumpToTiff.c0000644000353400050620000003754612215546075015121 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "dumpToTiff.h" #include "stdlib.h" #include "stdio.h" #include "string.h" #include #include /** * SECTION:dumpToTiff * @short_description: add an export capability into TIFF files. * * This provides a write routine to export V_Sim views into TIFF * files. */ static FILE *output; static unsigned char *image; static int TIFFwidth, TIFFheight; static gboolean writeViewInTiffFormat(ToolFileFormat *format, const char* filename, int width, int height, VisuData *dataObj, guchar* imageData, GError **error, ToolVoidDataFunc functionWait, gpointer data); static gpointer waitData; static ToolVoidDataFunc waitFunc; static VisuDump *tiff; const VisuDump* visu_dump_tiff_getStatic() { const gchar *typeTIF[] = {"*.tif", "*.tiff", (char*)0}; #define descrTIF _("Tiff file") if (tiff) return tiff; tiff = visu_dump_new(descrTIF, typeTIF, writeViewInTiffFormat, TRUE); visu_dump_setHasAlpha(tiff, FALSE); waitData = (gpointer)0; waitFunc = (ToolVoidDataFunc)0; return tiff; } /******************************************************************************/ /******************************************************************************/ static void encode(); /******************************************************************************/ static void OutputData() { encode(); } /******************************************************************************/ static void OutHeader(guint value, guint bytes) { unsigned char str[4]; register guint k; register int is = 4 - bytes; for (k=0; k> 24; (void)fwrite(str, sizeof(unsigned char), bytes, output); } /******************************************************************************/ static void WriteTif() { char ImageDescription[1024] = "Image dump from V_Sim"; char Software[] = "V_Sim (L. BILLARD)"; /* RGB FullColor */ guint PhotometricInterpretation = 2; guint BitsPerSample[3] = {8, 8, 8}; guint SamplesPerPixel = 3; /* LZW compression */ guint Compression = 5; unsigned char str[4]; guint offset; guint nb_entries; guint tag, type, count; guint offset_bits; guint ImageDescription_length; guint offset_imagedescription; guint StripOffsets_nbr; guint offset_posi; guint RowsPerStrip; guint StripByteCounts_nbr; guint data_written; guint XResolution[2]; guint x_posi; guint YResolution[2]; guint y_posi; guint ResolutionUnit; guint Software_length; guint offset_software; /********************* 12 octets en tte ****************************/ /* big_endian */ str[0] = 77; str[1] = 77; (void)fwrite(str, sizeof(unsigned char), 2, output); /* caractristique TIFF 42 */ str[0] = 0; str[1] = 42; (void)fwrite(str, sizeof(unsigned char), 2, output); /* offset = 8 pour IFD (temporaire) */ offset = 8; OutHeader(offset, 4); /******************** Champs 'trop longs ' *************************/ StripOffsets_nbr = 1; XResolution[0] = 72; XResolution[1] = 1; YResolution[0] = 72; YResolution[1] = 1; ResolutionUnit = 2; offset_bits = ftell(output); OutHeader(BitsPerSample[0], 2); OutHeader(BitsPerSample[1], 2); OutHeader(BitsPerSample[2], 2); ImageDescription_length = 1 + strlen(ImageDescription); switch (ImageDescription_length) { case 1: offset_imagedescription = 0; break; case 2: offset_imagedescription = 65536*ImageDescription[0]; break; default: offset_imagedescription = ftell(output); (void)fwrite(ImageDescription, sizeof(char), ImageDescription_length, output); break; } offset_posi = ftell(output); OutputData(); data_written = ftell(output) - offset_posi; RowsPerStrip = TIFFheight; StripByteCounts_nbr = StripOffsets_nbr; x_posi = ftell(output); OutHeader(XResolution[0], 4); OutHeader(XResolution[1], 4); y_posi = ftell(output); OutHeader(YResolution[0], 4); OutHeader(YResolution[1], 4); Software_length = 1 + strlen(Software); switch (Software_length) { case 1: offset_software = 0; break; case 2: offset_software = 65536*Software[0]; break; default: offset_software = ftell(output); (void)fwrite(Software, sizeof(char), Software_length, output); break; } /******************** IFD ******************************************/ /* je stocke la position */ offset = ftell(output); /* provisoire */ nb_entries = 0; OutHeader(nb_entries, 2); tag = 256; OutHeader(tag, 2); type = 4; OutHeader(type, 2); count = 1; OutHeader(count, 4); OutHeader(TIFFwidth, 4); nb_entries++; tag = 257; OutHeader(tag, 2); type = 4; OutHeader(type, 2); count = 1; OutHeader(count, 4); OutHeader(TIFFheight, 4); nb_entries++; tag = 258; OutHeader(tag, 2); type = 3; OutHeader(type, 2); count = SamplesPerPixel; OutHeader(count, 4); OutHeader(offset_bits, 4); nb_entries++; tag = 259; OutHeader(tag, 2); type = 3; OutHeader(type, 2); count = 1; OutHeader(count, 4); OutHeader(Compression, 2); OutHeader(0, 2); nb_entries++; tag = 262; OutHeader(tag, 2); type = 3; OutHeader(type, 2); count = 1; OutHeader(count, 4); OutHeader(PhotometricInterpretation, 2); OutHeader(0, 2); nb_entries++; tag = 270; OutHeader(tag, 2); type = 2; OutHeader(type, 2); count = ImageDescription_length; OutHeader(count, 4); OutHeader(offset_imagedescription, 4); nb_entries++; tag = 273; OutHeader(tag, 2); type = 4; OutHeader(type, 2); count = StripOffsets_nbr; OutHeader(count, 4); OutHeader(offset_posi, 4); nb_entries++; tag = 277; OutHeader(tag, 2); type = 3; OutHeader(type, 2); count = 1; OutHeader(count, 4); OutHeader(SamplesPerPixel, 2); OutHeader(0, 2); nb_entries++; tag = 278; OutHeader(tag, 2); type = 4; OutHeader(type, 2); count = 1; OutHeader(count, 4); OutHeader(RowsPerStrip, 4); nb_entries++; tag = 279; OutHeader(tag, 2); type = 4; OutHeader(type, 2); count = StripByteCounts_nbr; OutHeader(count, 4); OutHeader(data_written, 4); nb_entries++; tag = 282; OutHeader(tag, 2); type = 5; OutHeader(type, 2); count = 1; OutHeader(count, 4); OutHeader(x_posi, 4); nb_entries++; tag = 283; OutHeader(tag, 2); type = 5; OutHeader(type, 2); count = 1; OutHeader(count, 4); OutHeader(y_posi, 4); nb_entries++; tag = 296; OutHeader(tag, 2); type = 3; OutHeader(type, 2); count = 1; OutHeader(count, 4); OutHeader(ResolutionUnit, 2); OutHeader(0, 2); nb_entries++; tag = 305; OutHeader(tag, 2); type = 2; OutHeader(type, 2); count = Software_length; OutHeader(count, 4); OutHeader(offset_software, 4); nb_entries++; /* pas d'autre IFD */ OutHeader(0, 4); /* je r-cris proprement nb_entries */ if (fseek(output, offset, SEEK_SET)) { g_error("INTERNAL ERROR! I cannot go at requested position\n"); } OutHeader(nb_entries, 2); /* je r-cris proprement la position de l'IFD */ if (fseek(output, 4, SEEK_SET)) { g_error("INTERNAL ERROR! I cannot go at requested position\n"); } OutHeader(offset, 4); } /******************************************************************************/ /******************************************************************************/ /* Encodage LZW pp. 57 et suivantes */ #define CLEAR 256 #define EOI 257 static struct { int previous; unsigned char value; } table[4096]; static guint table_next; static guint length_bit; static guint stock; static guint remain; /******************************************************************************/ static struct { guint nbr; guint *table_index; guint *table_previous; } related[256]; /* related[i] donne la liste de toutes les tables dont table[].value = i; savoir: pour k = 0; k < related[i].nbr on a: (related[i].table_index)[k] (related[i].table_previous)[k] table[(related[i].table_index)[k]].previous = (related[i].table_previous)[k]; table[(related[i].table_index)[k]].value = i; */ static int search(unsigned char value, guint previous) { /* chercher la table telle que: table[which].previous = previous; table[which].value = value; retourne -1, si pas trouve */ register guint k; int which = -1; for (k=0; k= 8) { guint k = (stock >> 24); fputc(k, output); stock <<= 8; remain -= 8; } } /******************************************************************************/ static void Flush() { /* je sors ce qui reste (< 8 bits) */ if (remain) { guint k = (stock >> 24); fputc(k, output); } } /******************************************************************************/ static void AddTableEntry(guint last, unsigned char c) { guint nbr; table[table_next].previous = last; table[table_next].value = c; nbr = related[c].nbr + 1; related[c].table_index = g_realloc(related[c].table_index, nbr * sizeof(guint)); related[c].table_previous = g_realloc(related[c].table_previous, nbr * sizeof(guint)); (related[c].table_index)[related[c].nbr] = table_next; (related[c].table_previous)[related[c].nbr] = last; related[c].nbr = nbr; table_next++; if (table_next == 512) length_bit = 10; else if (table_next == 1024) length_bit = 11; else if (table_next == 2048) length_bit = 12; } /******************************************************************************/ static void encode() { register guint n; int it_is; unsigned char k; int which; guint image_length; /*(void)printf("Be patient: LZW encoding!...\n");*/ image_length = 3*TIFFwidth*TIFFheight; stock = 0; remain = 0; InitializeStringTable(); WriteCode(CLEAR); k = image[0]; it_is = k; for (n=1; n /** * visu_dump_tiff_getStatic: * * This routine returns the dump object in TIFF format. * * Returns: a newly created dump object to create TIFF files. */ const VisuDump* visu_dump_tiff_getStatic(); #endif v_sim-3.7.0/src/dumpModules/dumpToGif.c0000644000353400050620000006576512215546075014742 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "dumpToGif.h" #include "stdlib.h" #include "stdio.h" #include "string.h" #include #include /* #include */ #include /** * SECTION:dumpToGif * @short_description: add an export capability into GIF files. * * This provides a write routine to export V_Sim views into GIF * files. * * Most of the routines used there have been modified by * L. Billard (1997 - 2001) from the original ones taken from the * ImageMagick package of cristy@dupont.com. * * The goal of this is to reduce the colour span into 256 to be * able to output as GIF file. * * * Copyright 1994 E. I. du Pont de Nemours & Company * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in all * copies and that both that copyright notice and this permission * notice appear in supporting documentation, and that the name of * E. I. du Pont de Nemours & Company not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. E. I. du Pont de Nemours & * Company makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express * or implied warranty. * E. I. du Pont de Nemours & Company disclaims all warranties * with regard to this software, including all implied warranties of * merchantability and fitness, in no event shall E. I. du Pont de * Nemours & Company be liable for any special, indirect or * consequential damages or any damages whatsoever resulting from loss * of use, data or profits, whether in an action of contract, * negligence or other tortious action, arising out of or in * connection with the use or performance of this software. * */ static unsigned char *image; #define _XOPEN_SOURCE_EXTENDED static Image *img; static FILE *file; #define False 0 #define True 1 #define Max(x,y) (((x) > (y)) ? (x) : (y)) #define Min(x,y) (((x) < (y)) ? (x) : (y)) #define MaxMapSize 65535 #define MaxRGB 255 #define color_number number_colors #define MaxNodes 266817 #define MaxTreeDepth 8 /* Log2(MaxRGB) */ #define NodesInAList 2048 static gpointer waitData; static ToolVoidDataFunc waitFunc; typedef struct _Node { struct _Node *parent, *child[8]; unsigned char id, level, children, mid_red, mid_green, mid_blue; unsigned long number_colors, number_unique, total_red, total_green, total_blue; } Node; typedef struct _Nodes { Node nodes[NodesInAList]; struct _Nodes *next; } Nodes; typedef struct _Cube{ Node *root; ColorPacket color, *colormap; guint depth; unsigned long colors, pruning_threshold, next_pruning_threshold, distance, squares[MaxRGB+MaxRGB+1]; guint shift[MaxTreeDepth+1], nodes, free_nodes, color_number; Node *next_node; Nodes *node_queue; } Cube; static Cube cube; static guint tree_depth = 8; static guint Assignment(); static guint Classification(GError **error); static void ClosestColor(register Node *node); static void Map(register Node *node); static guint DitherImage(); static guint InitializeCube(guint number_pixels, GError **error); static Node *InitializeNode( guint id,guint level,Node *parent, guint mid_red,guint mid_green,guint mid_blue); static void PruneChild(register Node *node); static void PruneLevel(register Node *node); static void Reduce(register Node *node); static void Reduction(guint number_colors); static guint LZWEncodeImage(guint data_size); static void LSBFirstWriteShort(guint value); static gboolean writeViewInGifFormat(ToolFileFormat *format, const char* filename, int width, int height, VisuData *dataObj, guchar* imageData, GError **error, ToolVoidDataFunc functionWait, gpointer data); /******************************************************************************/ /******************************************************************************/ void dumpToGif_setImage(Image *data) { img = data; } /******************************************************************************/ guint Assignment() { img->colormap=g_malloc(cube.colors*sizeof(ColorPacket)); cube.colormap=img->colormap; cube.colors=0; Map(cube.root); img->colors=(guint) cube.colors; if (DitherImage()) return 1; return 0; } /******************************************************************************/ guint Classification(GError **error) { register guint i; register Node *node; register ColorPacket *p; register guint bisect, id, level; p=img->pixels; for (i=0; i < img->packets; i++) { if (cube.nodes > MaxNodes) { /* Prune one level if the color tree is too large. */ PruneLevel(cube.root); cube.depth--; } /* Start at the root and descend the color cube tree. */ node=cube.root; for (level=1; level <= cube.depth; level++) { id=(p->red > node->mid_red ? 1 : 0) | (p->green > node->mid_green ? 1 : 0) << 1 | (p->blue > node->mid_blue ? 1 : 0) << 2; if (node->child[id] == (Node *) NULL) { /* Set colors of new node to contain pixel. */ node->children|=1 << id; bisect=(guint) (1 << (MaxTreeDepth-level)) >> 1; node->child[id]=InitializeNode(id,level,node, node->mid_red+(id & 1 ? bisect : -bisect), node->mid_green+(id & 2 ? bisect : -bisect), node->mid_blue+(id & 4 ? bisect : -bisect)); if (node->child[id] == (Node *) NULL) { *error = g_error_new(VISU_ERROR_DUMP, DUMP_ERROR_ENCODE, _("Unable to quantize image, " "initialisation failed for node child %d."), id); return 1; } if (level == cube.depth) cube.colors++; } /* Record the number of colors represented by this node. Shift by level in the color description tree. */ node=node->child[id]; node->number_colors+=1 << cube.shift[level]; } /* Increment unique color count and sum RGB values for this leaf for later derivation of the mean cube color. */ node->number_unique+=1; node->total_red+=p->red; node->total_green+=p->green; node->total_blue+=p->blue; p++; } return 0; } /******************************************************************************/ void ClosestColor(register Node *node) { register guint id; /* Traverse any children. */ if (node->children != 0) for (id=0; id < 8; id++) if (node->children & (1 << id)) ClosestColor(node->child[id]); if (node->number_unique != 0) { register ColorPacket *color; register guint blue_distance, green_distance, red_distance; register unsigned long distance; /* Determine if this color is "closest". */ color=cube.colormap+node->color_number; red_distance=(int) color->red-(int) cube.color.red+MaxRGB; green_distance=(int) color->green-(int) cube.color.green+MaxRGB; blue_distance=(int) color->blue-(int) cube.color.blue+MaxRGB; distance=cube.squares[red_distance]+ cube.squares[green_distance]+ cube.squares[blue_distance]; if (distance < cube.distance) { cube.distance=distance; cube.color_number=(unsigned short) node->color_number; } } } /******************************************************************************/ void Map(register Node *node) { register guint id; /* Traverse any children*/ if (node->children != 0) for (id=0; id < 8; id++) if (node->children & (1 << id)) Map(node->child[id]); if (node->number_unique > 0) { /* Map entry is defined by the mean color in this cube. */ cube.colormap[cube.colors].red=(unsigned char) ((node->total_red+(node->number_unique >> 1))/node->number_unique); cube.colormap[cube.colors].green=(unsigned char) ((node->total_green+(node->number_unique >> 1))/node->number_unique); cube.colormap[cube.colors].blue=(unsigned char) ((node->total_blue+(node->number_unique >> 1))/node->number_unique); node->color_number=cube.colors++; } } /******************************************************************************/ guint DitherImage() { #define MaxError 16 typedef struct { int red, green, blue; } ErrorPacket; ErrorPacket *error; int *cache; register int blue_error, green_error, red_error, step; register Node *node; register ColorPacket *q; register ErrorPacket *cs, *ns; register unsigned char *range_limit; register guint id; unsigned char blue, green, *range_table, red; guint i, x, y; unsigned short index; cache=g_malloc((1 << 18)*sizeof(int)); error=g_malloc(((img->columns+2) << 1)*sizeof(ErrorPacket)); range_table=g_malloc(3*(MaxRGB+1)*sizeof(unsigned char)); for (i=0; i < (1 << 18); i++) cache[i]=(-1); for (i=0; i < ((img->columns+2) << 1); i++) { error[i].red=0; error[i].green=0; error[i].blue=0; } for (i=0; i <= MaxRGB; i++) { range_table[i]=0; range_table[i+(MaxRGB+1)]=(unsigned char) i; range_table[i+(MaxRGB+1)*2]=MaxRGB; } range_limit=range_table+(MaxRGB+1); for (y=0; y < img->rows; y++) { q=img->pixels+img->columns*y; cs=error+1; ns=error+(img->columns+2)+1; step=1; if (y & 0x01) { /* Distribute error right-to-left for odd scanlines. */ q+=(img->columns-1); cs=error+(img->columns+2)+(img->columns-1)+1; ns=error+(img->columns-1)+1; step=(-1); } for (x=0; x < img->columns; x++) { red_error=(cs->red+8)/16; if (red_error > MaxError) red_error=MaxError; else if (red_error < -MaxError) red_error=(-MaxError); green_error=(cs->green+8)/16; if (green_error > MaxError) green_error=MaxError; else if (green_error < -MaxError) green_error=(-MaxError); blue_error=(cs->blue+8)/16; if (blue_error > MaxError) blue_error=MaxError; else if (blue_error < -MaxError) blue_error=(-MaxError); red=range_limit[q->red+red_error]; green=range_limit[q->green+green_error]; blue=range_limit[q->blue+blue_error]; i=(red >> 2) << 12 | (green >> 2) << 6 | blue >> 2; if (cache[i] < 0) { /* Identify the deepest node containing the pixel's color. */ node=cube.root; for ( ; ; ) { id=(red > node->mid_red ? 1 : 0) | (green > node->mid_green ? 1 : 0) << 1 | (blue > node->mid_blue ? 1 : 0) << 2; if ((node->children & (1 << id)) == 0) break; node=node->child[id]; } /* Find closest color among siblings and their children. */ cube.color.red=red; cube.color.green=green; cube.color.blue=blue; cube.distance=(unsigned long) (~0); ClosestColor(node->parent); cache[i]=cube.color_number; } index=(unsigned short) cache[i]; red_error=(int) red-(int) cube.colormap[index].red; green_error=(int) green-(int) cube.colormap[index].green; blue_error=(int) blue-(int) cube.colormap[index].blue; q->index=index; q+=step; /* Propagate the error in these proportions: Q 7/16 3/16 5/16 1/16 */ cs->red=0; cs->green=0; cs->blue=0; cs+=step; cs->red+=7*red_error; cs->green+=7*green_error; cs->blue+=7*blue_error; ns-=step; ns->red+=3*red_error; ns->green+=3*green_error; ns->blue+=3*blue_error; ns+=step; ns->red+=5*red_error; ns->green+=5*green_error; ns->blue+=5*blue_error; ns+=step; ns->red+=red_error; ns->green+=green_error; ns->blue+=blue_error; } } g_free(range_table); g_free(error); g_free(cache); return 0; } /******************************************************************************/ guint InitializeCube(guint number_pixels, GError **error) { char c; register int i; guint bits, level, max_shift; cube.node_queue=(Nodes *) NULL; cube.nodes=0; cube.free_nodes=0; cube.depth=Min(tree_depth,8); /* Initialize the shift values. */ c=1; for (bits=0; c != (char) 0; bits++) c<<=1; for (max_shift=sizeof(guint)*bits; number_pixels != 0; max_shift--) number_pixels>>=1; for (level=0; level <= cube.depth; level++) { cube.shift[level]=max_shift; if (max_shift != 0) max_shift--; } /* Initialize root node. */ cube.root=InitializeNode(0,0,(Node *) NULL, (MaxRGB+1) >> 1,(MaxRGB+1) >> 1, (MaxRGB+1) >> 1); if (cube.root == (Node *) NULL) { *error = g_error_new(VISU_ERROR_DUMP, DUMP_ERROR_ENCODE, _("Unable to quantize image, initialisation failed.")); return 1; } cube.root->parent=cube.root; cube.root->number_colors=(unsigned long) (~0); cube.colors=0; /* Initialize the square values. */ for (i=(-MaxRGB); i <= MaxRGB; i++) cube.squares[i+MaxRGB]=i*i; return 0; } /******************************************************************************/ Node *InitializeNode( guint id,guint level,Node *parent, guint mid_red,guint mid_green,guint mid_blue) { register int i; register Node *node; if (cube.free_nodes == 0) { register Nodes *nodes; /* Allocate a new nodes of nodes. */ nodes=(Nodes *) malloc(sizeof(Nodes)); if (nodes == (Nodes *) NULL) return((Node *) NULL); nodes->next=cube.node_queue; cube.node_queue=nodes; cube.next_node=nodes->nodes; cube.free_nodes=NodesInAList; } cube.nodes++; cube.free_nodes--; node=cube.next_node++; node->parent=parent; for (i=0; i < 8; i++) node->child[i]=(Node *) NULL; node->id=id; node->level=level; node->children=0; node->mid_red=mid_red; node->mid_green=mid_green; node->mid_blue=mid_blue; node->number_colors=0; node->number_unique=0; node->total_red=0; node->total_green=0; node->total_blue=0; return(node); } /******************************************************************************/ void PruneChild(register Node *node) { register Node *parent; /* Merge color statistics into parent. */ parent=node->parent; parent->children&=~(1 << node->id); parent->number_unique+=node->number_unique; parent->total_red+=node->total_red; parent->total_green+=node->total_green; parent->total_blue+=node->total_blue; cube.nodes--; } /******************************************************************************/ void PruneLevel(register Node *node) { register int id; /* Traverse any children. */ if (node->children != 0) for (id=0; id < 8; id++) if (node->children & (1 << id)) PruneLevel(node->child[id]); if (node->level == cube.depth) PruneChild(node); } /******************************************************************************/ void Reduce(register Node *node) { register guint id; /* Traverse any children. */ if (node->children != 0) for (id=0; id < 8; id++) if (node->children & (1 << id)) Reduce(node->child[id]); /* Node is a colormap entry if it has unique colors. */ if (node->number_unique > 0) cube.colors++; /* Find minimum pruning threshold. */ if (node->number_colors < cube.next_pruning_threshold) cube.next_pruning_threshold=node->number_colors; if (node->number_colors <= cube.pruning_threshold) PruneChild(node); /* Node has a sub-threshold color count */ } /******************************************************************************/ void Reduction(guint number_colors) { float i; i = 0.; cube.next_pruning_threshold=1; while (cube.colors > number_colors) { cube.pruning_threshold=cube.next_pruning_threshold; cube.next_pruning_threshold=cube.root->number_colors-1; cube.colors=0; i += 0.025; if (waitFunc && (int)(i * 100.) % 100 == 0 && i < 50.) waitFunc(waitData); Reduce(cube.root); } while (waitFunc && i<50.) { i = i + 1.; waitFunc(waitData); } } /******************************************************************************/ guint dumpToGif_quantizeImage(guint number_colors, GError **error, ToolVoidDataFunc functionWait, gpointer data) { Nodes *nodes; waitFunc = functionWait; waitData = data; /* Reduce the number of colors in the continuous tone image. */ if (number_colors > MaxMapSize) number_colors=MaxMapSize; if(InitializeCube(img->columns*img->rows, error)) return 1; if(Classification(error)) return 1; Reduction(number_colors); if(Assignment(error)) return 1; do { nodes=cube.node_queue->next; (void)free(cube.node_queue); cube.node_queue=nodes; } while (cube.node_queue != (Nodes *) NULL); return 0; } /******************************************************************************/ /******************************************************************************/ /* Function LZWEncodeImage compresses an image via LZW-coding. */ guint LZWEncodeImage(guint data_size) { #define MaxCode(number_bits) ((1 << (number_bits))-1) #define MaxHashTable 5003 #define MaxLZWBits 12 #define MaxLZWTable (1 << MaxLZWBits) #define LZWOutputCode(code) \ { \ if (bits > 0) datum|=((long) code << bits); \ else datum=(long) code; \ bits+=number_bits; \ while (bits >= 8) { \ packet[byte_count++]=(unsigned char) (datum & 0xff); \ if (byte_count >= 254) { \ (void) fputc(byte_count,file); \ (void) fwrite((char *) packet,1,byte_count,file); \ byte_count=0; \ } \ datum>>=8; \ bits-=8; \ } \ if (free_code > max_code) { \ number_bits++; \ if (number_bits == MaxLZWBits) max_code=MaxLZWTable; \ else max_code=MaxCode(number_bits); \ } \ } int bits, byte_count, next_pixel, number_bits; long datum; register unsigned i; register int displacement, j; register ColorPacket *p; short clear_code, end_of_information_code; short free_code, *hash_code, *hash_prefix, index, max_code, waiting_code; unsigned char *packet, *hash_suffix; packet=g_malloc(256*sizeof(unsigned char)); hash_code=g_malloc(MaxHashTable*sizeof(short)); hash_prefix=g_malloc(MaxHashTable*sizeof(short)); hash_suffix=g_malloc(MaxHashTable*sizeof(unsigned char)); number_bits=data_size; max_code=MaxCode(number_bits); clear_code=((short) 1 << (data_size-1)); end_of_information_code=clear_code+1; free_code=clear_code+2; byte_count=0; datum=0; bits=0; for (i=0; i < MaxHashTable; i++) hash_code[i]=0; LZWOutputCode(clear_code); p=img->pixels; waiting_code=p->index; for (i=1; i < (img->columns*img->rows); i++) { if (waitFunc && i % (img->columns*img->rows / 50) == 0) waitFunc(waitData); p++; index=p->index & 0xff; j=(int) ((int) index << (MaxLZWBits-8))+waiting_code; if (j >= MaxHashTable) j-=MaxHashTable; if (hash_code[j] > 0) { if ((hash_prefix[j] == waiting_code) && (hash_suffix[j] == index)) { waiting_code=hash_code[j]; continue; } if (j == 0) displacement=1; else displacement=MaxHashTable-j; next_pixel=False; for ( ; ; ) { j-=displacement; if (j < 0) j+=MaxHashTable; if (hash_code[j] == 0) break; if ((hash_prefix[j] == waiting_code) && (hash_suffix[j] == index)) { waiting_code=hash_code[j]; next_pixel=True; break; } } if (next_pixel == True) continue; } LZWOutputCode(waiting_code); if (free_code < MaxLZWTable) { hash_code[j]=free_code++; hash_prefix[j]=waiting_code; hash_suffix[j]=(unsigned char)index; } else { for (j=0; j < MaxHashTable; j++) hash_code[j]=0; free_code=clear_code+2; LZWOutputCode(clear_code); number_bits=data_size; max_code=MaxCode(number_bits); } waiting_code=index; } LZWOutputCode(waiting_code); LZWOutputCode(end_of_information_code); if (bits > 0) { /* Add a character to current packet. */ packet[byte_count++]=(unsigned char) (datum & 0xff); if (byte_count >= 254) { (void) fputc(byte_count,file); (void) fwrite((char *) packet,1,byte_count,file); byte_count=0; } } if (byte_count > 0) { (void) fputc(byte_count,file); (void) fwrite((char *) packet,1,byte_count,file); } g_free(hash_suffix); g_free(hash_prefix); g_free(hash_code); g_free(packet); if (i < img->packets) return(False); return(True); } /******************************************************************************/ /* LSBFirstWriteShort writes a long value as a 16 bit quantity in least-significant byte first order. */ void LSBFirstWriteShort(guint value) { unsigned char buffer[2]; buffer[0]=(unsigned char) (value); buffer[1]=(unsigned char) ((value) >> 8); (void) fwrite((char *) buffer,1,2,file); } /******************************************************************************/ void dumpToGif_syncImage(void) { register guint i; register ColorPacket *p; register unsigned short index; p=img->pixels; for (i=0; i < img->packets; i++) { index=p->index; p->red=img->colormap[index].red; p->green=img->colormap[index].green; p->blue=img->colormap[index].blue; p++; } } /******************************************************************************/ static void write_comment_comm(unsigned char comm[]) { size_t size; unsigned char c[256]; /* Extension Introducer */ c[0] = 0x21; (void)fwrite(c, sizeof(unsigned char), 1, file); /* Comment Label */ c[0] = 0xFE; (void)fwrite(c, sizeof(unsigned char), 1, file); /* Data Size ( entre 1 et 255 ) */ size = strlen((char *)comm); c[0] = (unsigned char)size; (void)fwrite(c, sizeof(unsigned char), 1, file); /* Data */ (void)fwrite(comm, sizeof(unsigned char), size, file); /* Block Terminator */ c[0] = '\0'; (void)fwrite(c, sizeof(unsigned char), 1, file); } /******************************************************************************/ VisuDump* dumpToGif_init() { VisuDump *gif; const gchar *typeGIF[] = {"*.gif", (char*)0}; #define descrGIF _("Gif (256 colors) file") gif = visu_dump_new(descrGIF, typeGIF, writeViewInGifFormat, TRUE); visu_dump_setHasAlpha(gif, FALSE); waitData = (gpointer)0; waitFunc = (ToolVoidDataFunc)0; return gif; } static gboolean writeViewInGifFormat(ToolFileFormat *format _U_, const char* filename, int width, int height, VisuData *dataObj _U_, guchar* imageData, GError **error, ToolVoidDataFunc functionWait, gpointer data) { register guint i; register ColorPacket *q; register unsigned char *p; unsigned char bits_per_pixel, c; guint status; g_return_val_if_fail(error && !*error, FALSE); g_return_val_if_fail(imageData, FALSE); waitData = data; waitFunc = functionWait; image = imageData; DBG_fprintf(stderr, "Dump Gif : begin export in %dx%d...\n", width, height); file = fopen(filename, "wb"); if(!file) { *error = g_error_new(VISU_ERROR_DUMP, DUMP_ERROR_FILE, _("Cannot open file (to write in).")); return FALSE; } img=g_malloc(sizeof(Image)); img->colormap = (ColorPacket*)0; img->columns = width; img->rows = height; img->packets=img->columns*img->rows; img->pixels=g_malloc(img->packets*sizeof(ColorPacket)); q=img->pixels; p=image; for (i=0; i < img->packets; i++) { q->red=(*p++); q->green=(*p++); q->blue=(*p++); q->index=0; q++; } if(dumpToGif_quantizeImage(256, error, waitFunc, data)) { g_free(img->pixels); if (img->colormap) g_free(img->colormap); g_free(img); return FALSE; } dumpToGif_syncImage(); for (bits_per_pixel=1; bits_per_pixel < 8; bits_per_pixel++) if ((1 << bits_per_pixel) >= (int)img->colors) break; (void) fwrite("GIF89a",1,6,file); LSBFirstWriteShort(img->columns); LSBFirstWriteShort(img->rows); c=0x80; /* global colormap */ c|=(8-1) << 4; /* color resolution */ c|=(bits_per_pixel-1); /* size of global colormap */ (void) fputc((int)(char) c,file); (void) fputc(0x0,file); /* background color */ (void) fputc(0x0,file); /* reserved */ for (i=0; i < img->colors; i++) { (void) fputc((int)(char) img->colormap[i].red,file); (void) fputc((int)(char) img->colormap[i].green,file); (void) fputc((int)(char) img->colormap[i].blue,file); } for ( ; i < (guint)(1 << bits_per_pixel) ; i++) { (void) fputc(0x0,file); (void) fputc(0x0,file); (void) fputc(0x0,file); } /* criture du commentaire */ write_comment_comm((unsigned char *)"Image cre par le programme V_Sim\n" "Auteur : L. BILLARD"); (void) fputc(',',file); /* image separator */ LSBFirstWriteShort(0); LSBFirstWriteShort(0); LSBFirstWriteShort(img->columns); LSBFirstWriteShort(img->rows); (void) fputc(0x0,file); c=Max(bits_per_pixel,2); (void) fputc((int)(char) c,file); status=LZWEncodeImage(Max(bits_per_pixel,2)+1); if (status == False) { *error = g_error_new(VISU_ERROR_DUMP, DUMP_ERROR_ENCODE, _("Fail to compress the GIF file.")); g_free(img->pixels); g_free(img->colormap); g_free(img); return FALSE; } (void) fputc(0x0,file); (void) fputc(';',file); /* terminator */ (void) fclose(file); g_free(img->pixels); g_free(img->colormap); g_free(img); return TRUE; } v_sim-3.7.0/src/dumpModules/dumpToGif.h0000644000353400050620000000725512215546075014735 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse m�l : BILLARD, non joignable par m�l ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant � visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est r�gi par la licence CeCILL soumise au droit fran�ais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffus�e par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez acc�der � cet en-t�te signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept� les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef DUMPTOGIF_H #define DUMPTOGIF_H #include #include /** * dumpToGif_init: * * This routine should not be used since it inialised the module * and is already called when V_Sim is launched. * * Returns: (transfer none): a newly created dump object to create GIF files. */ VisuDump* dumpToGif_init(); /** * ColorPacket: * @red: red value ; * @green: green value ; * @blue: blue value ; * @index: ??. * * A private structure used by the GIF conversion. It is usefull for all * convertion from RGB to color table. */ typedef struct _ColorPacket { unsigned char red, green, blue; unsigned short index; } ColorPacket; /** * Image: * @columns: number of columns ; * @rows: number of rows ; * @colors: number of colours ; * @colormap: an array of colours ; * @pixels: the definition for each pixels ; * @packet: ?? ; * @packets: ??. * * A private structure used by the GIF conversion. It is usefull for all * convertion from RGB to color table. */ typedef struct _Image { guint columns, rows, colors; ColorPacket *colormap, *pixels, *packet; unsigned long packets; } Image; /** * dumpToGif_quantizeImage: * @number_colors: the number of desired colours ; * @error: an error location ; * @functionWait: a method that will be called during the quantize process ; * @data: an argument to give to the wait function. * * This routine transform an RGB image to an indexed colours image. To set the image * to quantize, use setImage(). * * Returns: 0 if everithing went right. */ guint dumpToGif_quantizeImage(guint number_colors, GError **error, ToolVoidDataFunc functionWait, gpointer data); /** * dumpToGif_syncImage: * * Do something in the GIF exoprt process. */ void dumpToGif_syncImage(void); /** * dumpToGif_setImage: * @data: a #Image structure. * * Set the image to be manipulated by the GIF convertor (see * dumpToGif_quantizeImage()). */ void dumpToGif_setImage(Image *data); #endif v_sim-3.7.0/src/dumpModules/dumpToPsAndPdf.c0000644000353400050620000005211512215546076015656 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "dumpToPsAndPdf.h" #include "dumpToGif.h" #define _XOPEN_SOURCE_EXTENDED #include #include #include #include /* #include */ #include #include #include /** * SECTION:dumpToPsAndPdf * @short_description: add an export capability into PS and PDF files * (encapsulating bitmaps). * * This provides a write routine to export V_Sim views into bitmaps * encapsulated into PS or PDF files. The PostScript file can be * either in 256 colours or in full True Color. For a vectorial * export, see #dumpToSVG. */ static void PrintByte(unsigned long lcode); static void OutputCode(int code); static unsigned long accumulator; static int cnt, code_width, bits; static FILE *out; static unsigned char *image; static Image *img; static int PSwidth, PSheight; static gpointer waitData; static ToolVoidDataFunc waitFunc; static gboolean writeViewInPsFormat(ToolFileFormat *format, const char* filename, int width, int height, VisuData *dataObj, guchar* imageData, GError **error, ToolVoidDataFunc functionWait, gpointer data); static gboolean writeViewInPs256Format(const char* filename, int width, int height, VisuData *dataObj, guchar* imageData, GError **error, ToolVoidDataFunc functionWait, gpointer data); static gboolean writePsTrueColor(const char* filename, int width, int height, VisuData *dataObj, guchar* imageData, GError **error, ToolVoidDataFunc functionWait, gpointer data); static gboolean writeViewInPdfFormat(ToolFileFormat *format, const char* filename, int width, int height, VisuData *dataObj, guchar* imageData, GError **error, ToolVoidDataFunc functionWait, gpointer data); static VisuDump *ps; const VisuDump* visu_dump_bitmap_ps_getStatic() { const gchar *typePS[] = {"*.ps", (char*)0}; #define descrPS _("Bitmap in a postscript (v3.0) file") if (ps) return ps; ps = visu_dump_new(descrPS, typePS, writeViewInPsFormat, TRUE); visu_dump_setHasAlpha(ps, FALSE); waitFunc = (ToolVoidDataFunc)0; waitData = (gpointer)0; tool_file_format_addPropertyBoolean(TOOL_FILE_FORMAT(ps), "reduced_colormap", _("Use a reduced colormap (256 colors)"), FALSE); return ps; } static VisuDump *pdf; const VisuDump* visu_dump_bitmap_pdf_getStatic() { const gchar *typePDF[] = {"*.pdf", (char*)0}; #define descrPDF _("Bitmap in a PDF (v. 1.2)") if (pdf) return pdf; pdf = visu_dump_new(descrPDF, typePDF, writeViewInPdfFormat, TRUE); visu_dump_setHasAlpha(pdf, FALSE); waitFunc = (ToolVoidDataFunc)0; waitData = (gpointer)0; return pdf; } /******************************************************************************/ static void PrintByte(unsigned long lcode) { int ii; ii = lcode%256ul; (void)fprintf(out, "%02x", ii); cnt = cnt + 2; if(cnt == 78) { (void)fprintf(out, "\n"); cnt = 0; } } /******************************************************************************/ static void OutputCode(int code) { unsigned long lcode; lcode = code; accumulator = accumulator + (lcode << (32 - code_width - bits)); bits = bits + code_width; for(;;) { if(bits < 8) { break; } PrintByte(accumulator >> 24); accumulator = accumulator << 8; bits = bits - 8; } } /******************************************************************************/ static void OutputData() { #define LZWClr 256 #define LZWEod 257 int prefix[4096], suffix[4096], next[4096]; int idx, next_idx, last_code; int i; accumulator = 0ul; cnt = 0; code_width = 9; bits = 0; OutputCode(LZWClr); for(idx = 0; idx < 256; idx++) { prefix[idx] = -1; suffix[idx] = idx; next[idx] = -1; } next_idx = LZWEod + 1; code_width = 9; last_code = image[0]; for(i = 1; i<3*PSwidth*PSheight; i++) { if (waitFunc && i % (3*PSwidth*PSheight / 100) == 0) waitFunc(waitData); idx = last_code; for(;;) { if(idx == -1) { break; } if ( (prefix[idx] != last_code) || (suffix[idx] != image[i]) ) { idx = next[idx]; } else { last_code = idx; break; } } if ( last_code != idx ) { OutputCode(last_code); prefix[next_idx] = last_code; suffix[next_idx] = image[i]; next[next_idx] = next[last_code]; next[last_code] = next_idx; next_idx = next_idx + 1; if ( (next_idx >> code_width) != 0 ) { code_width = code_width + 1; if ( code_width > 12 ) { code_width = code_width - 1; OutputCode(LZWClr); for(idx = 0; idx < 256; idx++) { prefix[idx] = -1; suffix[idx] = idx; next[idx] = -1; } next_idx = LZWEod + 1; code_width = 9; } } last_code = image[i]; } } OutputCode(last_code); OutputCode(LZWEod); if ( bits != 0 ) { PrintByte(accumulator >> 24); } } /******************************************************************************/ static void OutputDataPS256() { #define LZWClr 256 #define LZWEod 257 int prefix[4096], suffix[4096], next[4096]; int idx, next_idx, last_code; guint i; accumulator = 0ul; cnt = 0; code_width = 9; bits = 0; OutputCode(LZWClr); for(idx = 0; idx < 256; idx++) { prefix[idx] = -1; suffix[idx] = idx; next[idx] = -1; } next_idx = LZWEod + 1; code_width = 9; last_code = (img->pixels[0]).index; for(i = 1; icolumns*img->rows; i++) { if (waitFunc && i % (img->columns*img->rows / 100) == 0) waitFunc(waitData); idx = last_code; for(;;) { if(idx == -1) { break; } if ( (prefix[idx] != last_code) || (suffix[idx] != (img->pixels[i]).index) ) { idx = next[idx]; } else { last_code = idx; break; } } if ( last_code != idx ) { OutputCode(last_code); prefix[next_idx] = last_code; suffix[next_idx] = (img->pixels[i]).index; next[next_idx] = next[last_code]; next[last_code] = next_idx; next_idx = next_idx + 1; if ( (next_idx >> code_width) != 0 ) { code_width = code_width + 1; if ( code_width > 12 ) { code_width = code_width - 1; OutputCode(LZWClr); for(idx = 0; idx < 256; idx++) { prefix[idx] = -1; suffix[idx] = idx; next[idx] = -1; } next_idx = LZWEod + 1; code_width = 9; } } last_code = (img->pixels[i]).index; } } OutputCode(last_code); OutputCode(LZWEod); if ( bits != 0 ) { PrintByte(accumulator >> 24); } } /******************************************************************************/ static gboolean writeViewInPsFormat(ToolFileFormat *format, const char* filename, int width, int height, VisuData *dataObj, guchar* imageData, GError **error, ToolVoidDataFunc functionWait, gpointer data) { ToolOption *prop; GValue *val; prop = tool_file_format_getPropertyByName(format, "reduced_colormap"); g_return_val_if_fail(prop, FALSE); val = tool_option_getValue(prop); if (g_value_get_boolean(val)) return writeViewInPs256Format(filename, width, height, dataObj, imageData, error, functionWait, data); else return writePsTrueColor(filename, width, height, dataObj, imageData, error, functionWait, data); } /******************************************************************************/ static gboolean writePsTrueColor(const char* filename, int width, int height, VisuData *dataObj _U_, guchar* imageData, GError **error, ToolVoidDataFunc functionWait _U_, gpointer data _U_) { static int x = 10, y = 10; time_t timer; float facx, facy, fac; int wu, hu; g_return_val_if_fail(error && !*error, FALSE); g_return_val_if_fail(imageData, FALSE); image = imageData; PSwidth = width; PSheight = height; DBG_fprintf(stderr, "Dump PS & PDF : begin PS True ToolColor export in %dx%d : %s.\n", width, height, filename); out = fopen(filename, "w"); if(!out) { *error = g_error_new(VISU_ERROR_DUMP, DUMP_ERROR_FILE, _("Cannot open file (to write in).")); return FALSE; } facx = (552.0f - x - 5)/PSwidth; facy = (796.0f - y - 5)/PSheight; if(facx < facy) { fac = facx; } else { fac = facy; } if(fac < 1.0f) { wu = PSwidth*fac + 1; hu = PSheight*fac + 1; } else { wu = PSwidth; hu = PSheight; } (void)fprintf(out, "%%!PS-Adobe-3.0\n"); (void)fprintf(out, "%%%%Title: %s\n", filename); (void)fprintf(out, "%%%%Creator: v_sim (L. BILLARD)\n"); timer = time((time_t *) NULL); (void)localtime(&timer); (void)fprintf(out, "%%%%CreationDate: %s",ctime(&timer)); (void)fprintf(out, "%%%%For: %s\n", g_get_user_name()); (void)fprintf(out, "%%%%LanguageLevel: 2\n"); (void)fprintf(out, "%%%%DocumentData: Clean7Bit\n"); (void)fprintf(out, "%%%%Orientation: Portrait\n"); (void)fprintf(out, "%%%%BoundingBox: %d %d %d %d\n", x - 1, y - 1, x + wu + 1, y + hu + 1); (void)fprintf(out, "%%%%Pages: 1\n"); (void)fprintf(out, "%%%%EndComments\n"); (void)fprintf(out, "%%%%BeginProlog\n"); (void)fprintf(out, "/ASCLZW {\n"); (void)fprintf(out, " /DeviceRGB setcolorspace\n"); (void)fprintf(out, " <>image\n"); (void)fprintf(out, "} bind def\n"); (void)fprintf(out, "%%%%EndProlog\n"); (void)fprintf(out, "%%%%Page: un 1\n"); (void)fprintf(out, "gsave\n"); (void)fprintf(out, "%d %d translate\n", x, y); (void)fprintf(out, "%f %f scale\n", 1.0*PSwidth, 1.0*PSheight); if(fac < 1.0f) { (void)fprintf(out, "%%Supplementary scaling to remain A4\n"); (void)fprintf(out, "%f %f scale\n", fac, fac); } (void)fprintf(out, "ASCLZW\n"); OutputData(); (void)fprintf(out, ">\n"); (void)fprintf(out, "grestore\n"); (void)fprintf(out, "showpage\n"); (void)fprintf(out, "%%%%PageTrailer\n"); (void)fprintf(out, "%%%%Trailer\n"); (void)fprintf(out, "%%%%EOF\n"); (void)fclose(out); return TRUE; } /******************************************************************************/ static gboolean writeViewInPdfFormat(ToolFileFormat *format _U_, const char* filename, int width, int height, VisuData *dataObj _U_, guchar* imageData, GError **error, ToolVoidDataFunc functionWait _U_, gpointer data _U_) { time_t timer; struct tm *ltm; long int longueur; long int sz[10]; int i; g_return_val_if_fail(error && !*error, FALSE); g_return_val_if_fail(imageData, FALSE); image = imageData; PSwidth = width; PSheight = height; DBG_fprintf(stderr, "Dump PS & PDF : begin PDF export in %dx%d : %s.\n", width, height, filename); out = fopen(filename, "w"); if(!out) { *error = g_error_new(VISU_ERROR_DUMP, DUMP_ERROR_FILE, _("Cannot open file (to write in).")); return FALSE; } timer = time((time_t *) NULL); ltm = localtime(&timer); (void)fprintf(out, "%%PDF-1.2\n"); (void)fprintf(out, "%c%c%c%c\n", 202, 203, 204, 205); sz[1] = ftell(out); (void)fprintf(out, "1 0 obj\n"); (void)fprintf(out, "<<\n"); (void)fprintf(out, "/CreationDate (D:%04d%02d%02d%02d%02d%02d)\n", ltm->tm_year+1900, ltm->tm_mon+1, ltm->tm_mday, ltm->tm_hour, ltm->tm_min, ltm->tm_sec); (void)fprintf(out, "/Producer (v_sim \\(L. BILLARD\\))\n"); (void)fprintf(out, "/Author (%s)\n", g_get_real_name()); (void)fprintf(out, "/Title (%s)\n", filename); (void)fprintf(out, ">>\n"); (void)fprintf(out, "endobj\n"); sz[2] = ftell(out); (void)fprintf(out, "2 0 obj\n"); (void)fprintf(out, "<>\n"); (void)fprintf(out, "endobj\n"); sz[3] = ftell(out); (void)fprintf(out, "3 0 obj\n"); (void)fprintf(out, "<>\n"); (void)fprintf(out, "endobj\n"); sz[4] = ftell(out); (void)fprintf(out, "4 0 obj\n"); (void)fprintf(out, "<<\n"); (void)fprintf(out, "/Type/Page/MediaBox[0 0 %d %d]/Parent 3 0 R/Contents 5 0 R\n", PSwidth, PSheight); (void)fprintf(out, "/Resources<>>>\n"); (void)fprintf(out, ">>\n"); (void)fprintf(out, "endobj\n"); sz[5] = ftell(out); (void)fprintf(out, "5 0 obj\n"); (void)fprintf(out, "<>\n"); (void)fprintf(out, "stream\n"); longueur = ftell(out); (void)fprintf(out, "q\n"); (void)fprintf(out, "%4d 0 0 %4d 0 0 cm\n", PSwidth, PSheight); (void)fprintf(out, "/IMG Do\n"); (void)fprintf(out, "Q\n"); longueur = ftell(out) - longueur; (void)fprintf(out, "endstream\n"); (void)fprintf(out, "endobj\n"); sz[6] = ftell(out); (void)fprintf(out, "6 0 obj\n"); (void)fprintf(out, "%ld\n", longueur); (void)fprintf(out, "endobj\n"); sz[7] = ftell(out); (void)fprintf(out, "7 0 obj\n"); (void)fprintf(out, "<<\n"); (void)fprintf(out, "/Type/XObject/Subtype/Image/Name/IMG/Length" " 8 0 R/ToolColorSpace /DeviceRGB\n"); (void)fprintf(out, "/Width %d/Height %d/BitsPerComponent" " 8/Filter[/ASCIIHexDecode/LZWDecode]\n", PSwidth, PSheight); (void)fprintf(out, ">>\n"); (void)fprintf(out, "stream\n"); longueur = ftell(out); OutputData(); (void)fprintf(out, ">\n"); longueur = ftell(out) - longueur; (void)fprintf(out, "endstream\n"); (void)fprintf(out, "endobj\n"); sz[8] = ftell(out); (void)fprintf(out, "8 0 obj\n"); (void)fprintf(out, "%ld\n", longueur); (void)fprintf(out, "endobj\n"); sz[9] = ftell(out); (void)fprintf(out, "xref\n"); (void)fprintf(out, "0 9\n"); (void)fprintf(out, "%010d %05d f \n", 0, 65535); for(i=1; i<= 8; i++) (void)fprintf(out, "%010ld %05d n \n", sz[i], 0); (void)fprintf(out, "trailer\n"); (void)fprintf(out, "<>\n"); (void)fprintf(out, "startxref\n"); (void)fprintf(out, "%ld\n", sz[9]); (void)fprintf(out, "%%%%EOF\n"); (void)fclose(out); return TRUE; } /******************************************************************************/ static gboolean writeViewInPs256Format(const char* filename, int width, int height, VisuData *dataObj _U_, guchar* imageData, GError **error, ToolVoidDataFunc functionWait, gpointer data) { static int x = 10, y = 10; time_t timer; float facx, facy, fac; int wu, hu; register guint i; register ColorPacket *q; register unsigned char *p; g_return_val_if_fail(error && !*error, FALSE); g_return_val_if_fail(imageData, FALSE); image = imageData; PSwidth = width; PSheight = height; DBG_fprintf(stderr, "Dump PS & PDF : begin PS 256c. export in %dx%d : %s.\n", width, height, filename); img=g_malloc(sizeof(Image)); img->colormap = (ColorPacket*)0; img->columns = PSwidth; img->rows = PSheight; img->packets=img->columns*img->rows; img->pixels=g_malloc(img->packets*sizeof(ColorPacket)); q=img->pixels; p=image; for (i=0; i < img->packets; i++) { q->red=(*p++); q->green=(*p++); q->blue=(*p++); q->index=0; q++; } dumpToGif_setImage(img); if(dumpToGif_quantizeImage(256, error, functionWait, data)) { g_free(img->pixels); if (img->colormap) g_free(img->colormap); g_free(img); return FALSE; } dumpToGif_syncImage(); out = fopen(filename, "w"); if(!out) { *error = g_error_new(VISU_ERROR_DUMP, DUMP_ERROR_FILE, _("Cannot open file (to write in).")); g_free(img->pixels); g_free(img->colormap); g_free(img); return FALSE; } facx = (552.0f - x - 5)/img->columns; facy = (796.0f - y - 5)/img->rows; if(facx < facy) { fac = facx; } else { fac = facy; } if(fac < 1.0f) { wu = img->columns*fac + 1; hu = img->rows*fac + 1; } else { wu = img->columns; hu = img->rows; } (void)fprintf(out, "%%!PS-Adobe-3.0\n"); (void)fprintf(out, "%%%%Title: %s\n", filename); (void)fprintf(out, "%%%%Creator: v_sim (L. BILLARD)\n"); timer = time((time_t *) NULL); (void)localtime(&timer); (void)fprintf(out, "%%%%CreationDate: %s",ctime(&timer)); (void)fprintf(out, "%%%%For: %s\n", g_get_user_name()); (void)fprintf(out, "%%%%LanguageLevel: 2\n"); (void)fprintf(out, "%%%%DocumentData: Clean7Bit\n"); (void)fprintf(out, "%%%%Orientation: Portrait\n"); (void)fprintf(out, "%%%%BoundingBox: %d %d %d %d\n", x - 1, y - 1, x + wu + 1, y + hu + 1); (void)fprintf(out, "%%%%Pages: 1\n"); (void)fprintf(out, "%%%%EndComments\n"); (void)fprintf(out, "%%%%BeginProlog\n"); (void)fprintf(out, "/ASCLZWI {\n"); (void)fprintf(out, " /table currentfile %d string readhexstring pop " "def\n", 3 * img->colors); (void)fprintf(out, " [/Indexed /DeviceRGB %d table] setcolorspace\n", img->colors - 1); (void)fprintf(out, " <columns, img->rows); (void)fprintf(out, " /Decode [0 255] " "/ImageMatrix [%d 0 0 %d 0 %d]\n", img->columns, -img->rows, img->rows); (void)fprintf(out, " /DataSource currentfile /ASCIIHexDecode filter " "/LZWDecode filter\n"); (void)fprintf(out, " >>image\n"); (void)fprintf(out, "} bind def\n"); (void)fprintf(out, "%%%%EndProlog\n"); (void)fprintf(out, "%%%%Page: un 1\n"); (void)fprintf(out, "gsave\n"); (void)fprintf(out, "%d %d translate\n", x, y); (void)fprintf(out, "%f %f scale\n", 1.0*img->columns, 1.0*img->rows); if(fac < 1.0f) { (void)fprintf(out, "%%Supplementary scaling to remain A4\n"); (void)fprintf(out, "%f %f scale\n", fac, fac); } (void)fprintf(out, "ASCLZWI\n"); for ( i = 0; i < img->colors; i++ ) (void)fprintf(out, "%02x%02x%02x\n", (unsigned char) img->colormap[i].red, (unsigned char) img->colormap[i].green, (unsigned char) img->colormap[i].blue); OutputDataPS256(); (void)fprintf(out, ">\n"); (void)fprintf(out, "grestore\n"); (void)fprintf(out, "showpage\n"); (void)fprintf(out, "%%%%PageTrailer\n"); (void)fprintf(out, "%%%%Trailer\n"); (void)fprintf(out, "%%%%EOF\n"); (void)fclose(out); g_free(img->pixels); g_free(img->colormap); g_free(img); return TRUE; } v_sim-3.7.0/src/dumpModules/dumpToPsAndPdf.h0000644000353400050620000000440712215546076015664 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse m�l : BILLARD, non joignable par m�l ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant � visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est r�gi par la licence CeCILL soumise au droit fran�ais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffus�e par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez acc�der � cet en-t�te signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept� les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef DUMPTOPSANDPDF_H #define DUMPTOPSANDPDF_H #include /** * visu_dump_bitmap_ps_getStatic: * * This routine returns the dump object to PS (bitmap). * * Returns: (transfer none): a newly created dump object to create PS files. */ const VisuDump* visu_dump_bitmap_ps_getStatic(); /** * visu_dump_bitmap_pdf_getStatic: * * This routine returns the dump object to PDF (bitmap). * * Returns: (transfer none): a newly created dump object to create PDF files. */ const VisuDump* visu_dump_bitmap_pdf_getStatic(); #endif v_sim-3.7.0/src/dumpModules/dumpToAscii.c0000644000353400050620000003152712215546075015252 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "dumpToAscii.h" #include #include #include #include #include #include #include static VisuDump *ascii = NULL; /** * SECTION:dumpToAscii * @short_description: add an export capability of current positions. * * This provides a write routine to export V_Sim current * coordinates. It has several options to output or not hiddden nodes * or replicated nodes. */ static gboolean writeDataInAscii(ToolFileFormat *format, const char* filename, int width, int height, VisuData *dataObj, guchar* imageData, GError **error, ToolVoidDataFunc functionWait, gpointer data); static gpointer waitData; static ToolVoidDataFunc waitFunc; const VisuDump* visu_dump_ascii_getStatic() { const gchar *typeASCII[] = {"*.ascii", (char*)0}; #define descrASCII _("ASCII file (current positions)") if (ascii) return ascii; ascii = visu_dump_new(descrASCII, typeASCII, writeDataInAscii, FALSE); tool_file_format_addPropertyBoolean(TOOL_FILE_FORMAT(ascii), "delete_hidden_nodes", _("Don't output hidden nodes"), FALSE); tool_file_format_addPropertyBoolean(TOOL_FILE_FORMAT(ascii), "comment_hidden_nodes", _("Comment hidden nodes (if output)"), TRUE); tool_file_format_addPropertyBoolean(TOOL_FILE_FORMAT(ascii), "expand_box", _("Keep primitive box (in case of node expansion)"), FALSE); tool_file_format_addPropertyBoolean(TOOL_FILE_FORMAT(ascii), "reduced_coordinates", _("Export positions in reduced coordinates"), FALSE); tool_file_format_addPropertyBoolean(TOOL_FILE_FORMAT(ascii), "angdeg_box", _("Export box as lengths and angles"), FALSE); tool_file_format_addPropertyBoolean(TOOL_FILE_FORMAT(ascii), "type_alignment", _("Export nodes sorted by elements"), FALSE); waitData = (gpointer)0; waitFunc = (ToolVoidDataFunc)0; return ascii; } static gboolean writeDataInAscii(ToolFileFormat *format, const char* filename, int width _U_, int height _U_, VisuData *dataObj, guchar* imageData _U_, GError **error, ToolVoidDataFunc functionWait, gpointer data) { const gchar *nom; gchar *prevFile; char tmpChr; gchar *diff; gboolean suppr, comment, expand, reduced, angdeg, eleSort; float xyz[3], ext[3], uvw[3], vertices[8][3], box[6]; double ene; VisuNodeArrayIter iter; GString *output; const gchar *nodeComment; ToolFileFormatIter it; VisuBox *boxObj; g_return_val_if_fail(error && !*error, FALSE); comment = TRUE; expand = FALSE; suppr = FALSE; reduced = FALSE; angdeg = FALSE; eleSort = FALSE; it.lst = (GList*)0; for (tool_file_format_iterNextProperty(format, &it); it.lst; tool_file_format_iterNextProperty(format, &it)) { DBG_fprintf(stderr, "Dump ASCII: test property '%s'.\n", it.name); if (strcmp(it.name, "comment_hidden_nodes") == 0) comment = g_value_get_boolean(it.val); else if (strcmp(it.name, "expand_box") == 0) expand = !g_value_get_boolean(it.val); else if (strcmp(it.name, "delete_hidden_nodes") == 0) suppr = g_value_get_boolean(it.val); else if (strcmp(it.name, "reduced_coordinates") == 0) reduced = g_value_get_boolean(it.val); else if (strcmp(it.name, "angdeg_box") == 0) angdeg = g_value_get_boolean(it.val); else if (strcmp(it.name, "type_alignment") == 0) eleSort = g_value_get_boolean(it.val); } waitData = data; waitFunc = functionWait; DBG_fprintf(stderr, "Dump ASCII: begin export of current positions...\n"); DBG_fprintf(stderr, " | comment %d ;\n", comment); DBG_fprintf(stderr, " | expand %d ;\n", expand); DBG_fprintf(stderr, " | suppr %d ;\n", suppr); DBG_fprintf(stderr, " | reduced %d ;\n", reduced); DBG_fprintf(stderr, " | angdeg %d ;\n", angdeg); DBG_fprintf(stderr, " | eleSort %d ;\n", eleSort); output = g_string_new(""); nom = visu_data_getFile(dataObj, 0, (ToolFileFormat**)0); if (nom) { prevFile = g_path_get_basename(nom); g_string_append_printf(output, "# V_Sim export to ascii from '%s'\n", prevFile); g_free(prevFile); } else { g_warning("Can't get the name of the file to export."); g_string_append(output, "# V_Sim export to ascii\n"); } boxObj = visu_boxed_getBox(VISU_BOXED(dataObj)); visu_box_getVertices(boxObj, vertices, expand); if (angdeg) { box[0] = sqrt((vertices[1][0] - vertices[0][0]) * (vertices[1][0] - vertices[0][0]) + (vertices[1][1] - vertices[0][1]) * (vertices[1][1] - vertices[0][1]) + (vertices[1][2] - vertices[0][2]) * (vertices[1][2] - vertices[0][2])); box[1] = sqrt((vertices[3][0] - vertices[0][0]) * (vertices[3][0] - vertices[0][0]) + (vertices[3][1] - vertices[0][1]) * (vertices[3][1] - vertices[0][1]) + (vertices[3][2] - vertices[0][2]) * (vertices[3][2] - vertices[0][2])); box[2] = sqrt((vertices[4][0] - vertices[0][0]) * (vertices[4][0] - vertices[0][0]) + (vertices[4][1] - vertices[0][1]) * (vertices[4][1] - vertices[0][1]) + (vertices[4][2] - vertices[0][2]) * (vertices[4][2] - vertices[0][2])); box[3] = acos(CLAMP(((vertices[3][0] - vertices[0][0]) * (vertices[4][0] - vertices[0][0]) + (vertices[3][1] - vertices[0][1]) * (vertices[4][1] - vertices[0][1]) + (vertices[3][2] - vertices[0][2]) * (vertices[4][2] - vertices[0][2])) / box[1] / box[2], -1.f, 1.f)) * 180.f / G_PI; box[4] = acos(CLAMP(((vertices[1][0] - vertices[0][0]) * (vertices[4][0] - vertices[0][0]) + (vertices[1][1] - vertices[0][1]) * (vertices[4][1] - vertices[0][1]) + (vertices[1][2] - vertices[0][2]) * (vertices[4][2] - vertices[0][2])) / box[0] / box[2], -1.f, 1.f)) * 180.f / G_PI; box[4] *= (vertices[4][2] < 0.)?-1.:+1.; box[5] = acos(CLAMP(((vertices[3][0] - vertices[0][0]) * (vertices[1][0] - vertices[0][0]) + (vertices[3][1] - vertices[0][1]) * (vertices[1][1] - vertices[0][1]) + (vertices[3][2] - vertices[0][2]) * (vertices[1][2] - vertices[0][2])) / box[0] / box[1], -1.f, 1.f)) * 180.f / G_PI; } else { box[0] = vertices[1][0] - vertices[0][0]; box[1] = vertices[3][0] - vertices[0][0]; box[2] = vertices[3][1] - vertices[0][1]; box[3] = vertices[4][0] - vertices[0][0]; box[4] = vertices[4][1] - vertices[0][1]; box[5] = vertices[4][2] - vertices[0][2]; } g_string_append_printf(output, "%17.8g %17.8g %17.8g\n", box[0], box[1], box[2]); g_string_append_printf(output, "%17.8g %17.8g %17.8g\n", box[3], box[4], box[5]); if (angdeg) g_string_append(output, "#keyword: angdeg\n"); if (reduced) g_string_append(output, "#keyword: reduced\n"); switch (visu_box_getUnit(boxObj)) { case TOOL_UNITS_ANGSTROEM: g_string_append(output, "#keyword: angstroem\n"); break; case TOOL_UNITS_BOHR: g_string_append(output, "#keyword: atomic\n"); break; default: break; } switch (visu_box_getBoundary(boxObj)) { case VISU_BOX_SURFACE_XY: g_string_append(output, "#keyword: surfaceXY\n"); break; case VISU_BOX_SURFACE_YZ: g_string_append(output, "#keyword: surfaceYZ\n"); break; case VISU_BOX_SURFACE_ZX: g_string_append(output, "#keyword: surface\n"); break; case VISU_BOX_FREE: if (reduced) g_warning("Using reduced coordinates in free boundary conditions" " is possible but not not adviced. The given box will be" " used to obtain the real coordinates."); g_string_append(output, "#keyword: freeBC\n"); break; default: break; } g_object_get(G_OBJECT(dataObj), "totalEnergy", &ene, NULL); if (ene != G_MAXFLOAT) g_string_append_printf(output, "#metaData: totalEnergy=%22.16feV\n", ene); visu_box_getVertices(boxObj, vertices, FALSE); if (expand) visu_box_getExtension(boxObj, ext); else { ext[0] = 0.; ext[1] = 0.; ext[2] = 0.; } if (ext[0] != 0. || ext[1] != 0. || ext[2] != 0.) { g_string_append(output, "# Box is expanded, previous box size:\n"); g_string_append_printf(output, "# %15g %15g %15g\n", vertices[1][0], vertices[3][0], vertices[3][1]); g_string_append_printf(output, "# %15g %15g %15g\n", vertices[4][0], vertices[4][1], vertices[4][2]); g_string_append(output, "# and box extension:\n"); g_string_append_printf(output, "# %15g %15g %15g\n", ext[0], ext[1], ext[2]); } if (comment) { g_string_append(output, "# Statistics are valid for all nodes (hidden or not).\n"); g_string_append(output, "# Hidden nodes are printed, but commented.\n"); } visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter); g_string_append_printf(output, "# Box contains %d element(s).\n", iter.nElements); g_string_append_printf(output, "# Box contains %d nodes.\n", iter.nAllStoredNodes); for (visu_node_array_iterStart(VISU_NODE_ARRAY(dataObj), &iter); iter.element; visu_node_array_iterNextElement(VISU_NODE_ARRAY(dataObj), &iter)) g_string_append_printf(output, "# | %d nodes for element '%s'.\n", iter.nStoredNodes, iter.element->name); if (suppr) g_string_append(output, "# Hidden nodes have been suppressed.\n"); if (visu_geodiff_hasData(dataObj)) { diff = visu_geodiff_export(dataObj); g_string_append(output, diff); g_free(diff); } for ((eleSort)?visu_node_array_iterStart(VISU_NODE_ARRAY(dataObj), &iter): visu_node_array_iterStartNumber(VISU_NODE_ARRAY(dataObj), &iter); iter.node && iter.element; (eleSort)?visu_node_array_iterNext(VISU_NODE_ARRAY(dataObj), &iter): visu_node_array_iterNextNodeNumber(VISU_NODE_ARRAY(dataObj), &iter)) { if ((iter.element->rendered && iter.node->rendered) || !comment) tmpChr = ' '; else tmpChr = '#'; visu_data_getNodePosition(dataObj, iter.node, xyz); if ((iter.element->rendered && iter.node->rendered) || !suppr) { /*g_message("ext : %f, vertices : %f, ext : %f, vertices : %f, ext : %f, vertice : %f\n",ext[0],vertices[1][0],ext[1],vertices[3][0], ext[2],vertices[4][0]);*/ xyz[0] += ext[0] * vertices[1][0] + ext[1] * vertices[3][0] + ext[2] * vertices[4][0]; xyz[1] += ext[1] * vertices[3][1] + ext[2] * vertices[4][1]; xyz[2] += ext[2] * vertices[4][2]; if (reduced) { visu_box_convertXYZtoBoxCoordinates(boxObj, uvw, xyz); uvw[0] /= (1.f + 2.f * ext[0]); uvw[1] /= (1.f + 2.f * ext[1]); uvw[2] /= (1.f + 2.f * ext[2]); } else { uvw[0] = xyz[0]; uvw[1] = xyz[1]; uvw[2] = xyz[2]; } g_string_append_printf(output, "%c%17.8g %17.8g %17.8g %c%s", tmpChr, uvw[0], uvw[1], uvw[2], (visu_element_getPhysical(iter.element))?' ':'%', iter.element->name); nodeComment = visu_extra_node_getLabel(dataObj, iter.node); if (nodeComment) g_string_append_printf(output, " %s", nodeComment); g_string_append(output, "\n"); } } g_file_set_contents(filename, output->str, -1, error); g_string_free(output, TRUE); if (*error) return FALSE; else return TRUE; } v_sim-3.7.0/src/dumpModules/dumpToAscii.h0000644000353400050620000000402312215546075015246 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef DUMPTOASCII_H #define DUMPTOASCII_H #include /** * visu_dump_ascii_getStatic: * * This routine is used to get the static #VisuDump object for ASCII exportation. * * Returns: (transfer none): the static dump object to create ASCII files. */ const VisuDump* visu_dump_ascii_getStatic(); #endif v_sim-3.7.0/src/dumpModules/dumpToSVG.c0000644000353400050620000012101012215546076014645 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse m�l : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant � visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est r�gi par la licence CeCILL soumise au droit fran�ais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffus�e par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez acc�der � cet en-t�te signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept� les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "dumpToSVG.h" #ifdef HAVE_CAIRO #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if CAIRO_VERSION_MINOR > 1 #include #include #define DEBUG_USE_FOG 0 /** * SECTION:dumpToSVG * @short_description: add an export capability into SVG files. * @include: extensions/box.h, extensions/axes.h, visu_pairs.h and visu_data.h * * This provides a write routine to export V_Sim views into SVG * files. Currently, this is an experimental feature. Not all V_Sim * elements are rendered, only the nodes, the box, the pairs and the * axes. All the characteristics are not used (no line stipple for * instance). In spin mode, nodes are only atomic. * * Since: 3.4 */ #define FONT_SIZE 16. #define FONT_SMALL 12. #define NVERT 2 #define NVALS 8 #define NPASS 2 #define NBUFF (NVERT * NVALS + NPASS * 2) #define PAIRS_NVERT 2 #define PAIRS_NVALS 4 #define PAIRS_XBUFF (PAIRS_NVERT * PAIRS_NVALS) #define PAIRS_NPASS 7 #define PAIRS_NBUFF (PAIRS_XBUFF + PAIRS_NPASS * 2) #define PAIRS_NCMPT (4 + 1 + PAIRS_NPASS) struct _pairs { VisuPairLink *data; VisuNode *node1, *node2; VisuElement *ele1, *ele2; float alpha; }; static gboolean writeViewInSvgFormat(ToolFileFormat *format, const char* filename, int width, int height, VisuData *dataObj, guchar* imageData, GError **error, ToolVoidDataFunc functionWait, gpointer data); static gboolean writeViewInPdfFormat(ToolFileFormat *format, const char* filename, int width, int height, VisuData *dataObj, guchar* imageData, GError **error, ToolVoidDataFunc functionWait, gpointer data); static void svgGet_fogRGBA(float rgba[4]); static cairo_pattern_t** svgSetup_patterns(VisuNodeArray *array, gboolean flat); static GList* svgSetup_pairs(VisuData *dataObj); static void svgSetup_scale(cairo_t *cr, VisuData *dataObj); static GLfloat* svgCompute_pairs(VisuData *dataObj, int *nPairs_out); static GLfloat* svgCompute_coordinates(VisuData *dataObj, int *nNodes_out); static GLfloat* svgCompute_box(int *nBox_out); static gboolean svgDraw_line(cairo_t *cr, float x0, float y0, float x1, float y1, float z0, float z1, float *rgb, float *fog); static void svgDraw_boxBack(cairo_t *cr, GLfloat *box, int nValuesBox, GLfloat val); static void svgDraw_boxFront(cairo_t *cr, GLfloat *box, int nValuesBox, GLfloat val); static void svgDraw_nodesAndPairs(cairo_t *cr, GLfloat *coordinates, int nNodes, GLfloat *pairs, int nPairs, cairo_pattern_t **pat, gboolean flat); static void svgDraw_legend(cairo_t *cr, VisuData *dataObj, cairo_pattern_t **pat); static void svgDraw_axes(cairo_t *cr); static void svgDraw_pairs(cairo_t *cr, GLfloat *pairs, int nPairs, int *iPairs, GLfloat val); static void svgDraw_node(cairo_t *cr, VisuRenderingAtomicShapeId shape, float radius); static VisuDump *svg; static double g_width, g_height; static double zoomLevel = 1.; static VisuDumpCairoAdd postFunc = NULL; /** * visu_dump_cairo_setPostFunc: * @func: (allow-none) (scope call): a #VisuDumpCairoAdd function or %NULL. * * Allow to add a function that will be called on every Cairo * exportation after V_Sim rendering to allow post-processing. * * Since: 3.7 **/ void visu_dump_cairo_setPostFunc(VisuDumpCairoAdd func) { DBG_fprintf(stderr, "Visu DumpCairo: set a new post-processing method.\n"); postFunc = func; } const VisuDump* visu_dump_cairo_svg_getStatic() { const gchar *typeSVG[] = {"*.svg", (char*)0}; #define descrSVG _("Scalar Vector Graphic (SVG) file") if (svg) return svg; svg = visu_dump_new(descrSVG, typeSVG, writeViewInSvgFormat, FALSE); visu_dump_setGl(svg, TRUE); tool_file_format_addPropertyBoolean(TOOL_FILE_FORMAT(svg), "use_flat_rendering", _("Use flat colours for scheme rendering"), FALSE); return svg; } static VisuDump *pdf; const VisuDump* visu_dump_cairo_pdf_getStatic() { const gchar *typePDF[] = {"*.pdf", (char*)0}; #define descrPDF _("Portable Document Format (PDF) file") if (pdf) return pdf; pdf = visu_dump_new(descrPDF, typePDF, writeViewInPdfFormat, FALSE); visu_dump_setGl(pdf, TRUE); tool_file_format_addPropertyBoolean(TOOL_FILE_FORMAT(pdf), "use_flat_rendering", _("Use flat colours for scheme rendering"), FALSE); return pdf; } static void sort_by_z(float *coordinates, float *buffer, int n, int z, int begin, int end) { int i; int middle; if( begin >= end ) return; memcpy(buffer, coordinates + begin * n, sizeof(float) * n); memcpy(coordinates + begin * n, coordinates + (end + begin) / 2 * n, sizeof(float) * n); memcpy(coordinates + (end + begin) / 2 * n, buffer, sizeof(float) * n); middle = begin; for(i = begin + 1; i <= end; i++) { if ( coordinates[i * n + z] > coordinates[begin * n + z] ) { middle += 1; memcpy(buffer, coordinates + i * n, sizeof(float) * n); memcpy(coordinates + i * n, coordinates + middle * n, sizeof(float) * n); memcpy(coordinates + middle * n, buffer, sizeof(float) * n); } } memcpy(buffer, coordinates + begin * n, sizeof(float) * n); memcpy(coordinates + begin * n, coordinates + middle * n, sizeof(float) * n); memcpy(coordinates + middle * n, buffer, sizeof(float) * n); sort_by_z(coordinates, buffer, n, z, begin, middle - 1); sort_by_z(coordinates, buffer, n, z, middle + 1, end); } gboolean writeDataToCairoSurface(cairo_surface_t *cairo_surf, guint width, guint height, ToolFileFormat *format, VisuData *dataObj, GError **error, ToolVoidDataFunc functionWait, gpointer user_data) { cairo_t *cr; cairo_status_t status; cairo_pattern_t **pat; guint i; int nNodes, nPairs; float rgbaBg[4], centre[3]; GLfloat *coordinates, *box, *pairs; int nValuesBox; ToolOption *prop; gboolean flat; VisuNodeArrayIter iter; cairo_matrix_t scale = {1., 0., 0., 1., 0., 0.}; DBG_fprintf(stderr, "Dump SVG: begin OpenGL buffer writing.\n"); /* We get the properties related to SVG output. */ prop = tool_file_format_getPropertyByName(format, "use_flat_rendering"); flat = g_value_get_boolean(tool_option_getValue(prop)); /* We setup the cairo output. */ cr = cairo_create(cairo_surf); status = cairo_status(cr); if (status != CAIRO_STATUS_SUCCESS) { *error = g_error_new(VISU_ERROR_DUMP, DUMP_ERROR_FILE, "%s", cairo_status_to_string(status)); cairo_destroy(cr); return FALSE; } cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND); DBG_fprintf(stderr, "Dump SVG: setup scale and patterns.\n"); svgSetup_scale(cr, dataObj); pat = svgSetup_patterns(VISU_NODE_ARRAY(dataObj), flat); DBG_fprintf(stderr, " | OK.\n"); glPushMatrix(); visu_box_getCentre(visu_boxed_getBox(VISU_BOXED(dataObj)), centre); glTranslated(-centre[0], -centre[1], -centre[2]); /* We calculate the node positions. */ DBG_fprintf(stderr, "Dump SVG: compute coordinates.\n"); coordinates = svgCompute_coordinates(dataObj, &nNodes); if (functionWait) functionWait(user_data); /* Calculate the pair positions. */ nPairs = -1; pairs = (GLfloat*)0; if (visu_gl_ext_getActive(VISU_GL_EXT(visu_gl_ext_pairs_getDefault()))) pairs = svgCompute_pairs(dataObj, &nPairs); if (functionWait) functionWait(user_data); /* We draw the background colour. */ visu_gl_ext_bg_getRGBA(visu_gl_ext_bg_getDefault(), rgbaBg); cairo_set_source_rgba(cr, rgbaBg[0], rgbaBg[1], rgbaBg[2], rgbaBg[3]); cairo_paint(cr); /* Experimental. */ zoomLevel = *(double*)g_object_get_data(G_OBJECT(format), "zoomLevel"); g_width = width; g_height = height; cairo_save(cr); cairo_scale(cr, zoomLevel, zoomLevel); cairo_translate(cr, g_width * (1. / zoomLevel - 1.) * 0.5, g_height * (1. / zoomLevel - 1.) * 0.5); cairo_rectangle(cr, -g_width * (1. / zoomLevel - 1.) * 0.5, -g_height * (1. / zoomLevel - 1.) * 0.5, (g_width - 0.5) / zoomLevel, (g_height - 0.5) / zoomLevel); cairo_clip(cr); /* Draw the back box. */ nValuesBox = -1; box = (GLfloat*)0; if (visu_gl_ext_getActive(VISU_GL_EXT(visu_gl_ext_box_getDefault()))) { box = svgCompute_box(&nValuesBox); svgDraw_boxBack(cr, box, nValuesBox, coordinates[nNodes - NBUFF + 3]); } if (functionWait) functionWait(user_data); DBG_fprintf(stderr, "Dump SVG: begin main SVG exportation.\n"); /* We draw nodes and pairs. */ svgDraw_nodesAndPairs(cr, coordinates, nNodes, pairs, nPairs, (!visu_data_hasUserColorFunc(dataObj))? pat:(cairo_pattern_t**)0, flat); if (pairs) g_free(pairs); if (functionWait) functionWait(user_data); /* Draw the front box. */ if (visu_gl_ext_getActive(VISU_GL_EXT(visu_gl_ext_box_getDefault()))) svgDraw_boxFront(cr, box, nValuesBox, coordinates[nNodes - NBUFF + 3]); if (box) g_free(box); if (functionWait) functionWait(user_data); cairo_restore(cr); g_free(coordinates); /* We draw the axes. */ if (visu_gl_ext_getActive(VISU_GL_EXT(visu_gl_ext_axes_getDefault()))) svgDraw_axes(cr); if (functionWait) functionWait(user_data); glPopMatrix(); /* We draw a legend, if required. */ if (visu_gl_ext_getActive(VISU_GL_EXT(visu_gl_ext_legend_getDefault()))) svgDraw_legend(cr, dataObj, pat); if (functionWait) functionWait(user_data); visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter); for (i = 0; i < iter.nElements; i++) cairo_pattern_destroy(pat[i]); g_free(pat); if (postFunc) { DBG_fprintf(stderr, "Visu DumpCairo: call the post-processing method.\n"); cairo_set_matrix(cr, &scale); postFunc(cr, width, height); } cairo_show_page(cr); cairo_destroy(cr); return TRUE; } static gboolean writeViewInSvgFormat(ToolFileFormat *format, const char* filename, int width, int height, VisuData *dataObj, guchar* imageData _U_, GError **error, ToolVoidDataFunc functionWait, gpointer data) { cairo_surface_t *svg_surface; cairo_status_t status; g_return_val_if_fail(error && !*error, FALSE); DBG_fprintf(stderr, "Dump Cairo: begin export to SVG.\n"); svg_surface = cairo_svg_surface_create(filename, (double)width, (double)height); status = cairo_surface_status(svg_surface); if (status != CAIRO_STATUS_SUCCESS) { *error = g_error_new(VISU_ERROR_DUMP, DUMP_ERROR_FILE, "%s", cairo_status_to_string(status)); cairo_surface_destroy(svg_surface); return FALSE; } writeDataToCairoSurface(svg_surface, width, height, format, dataObj, error, functionWait, data); cairo_surface_destroy(svg_surface); return TRUE; } static gboolean writeViewInPdfFormat(ToolFileFormat *format, const char* filename, int width, int height, VisuData *dataObj, guchar* imageData _U_, GError **error, ToolVoidDataFunc functionWait, gpointer data) { cairo_surface_t *pdf_surface; cairo_status_t status; g_return_val_if_fail(error && !*error, FALSE); DBG_fprintf(stderr, "Dump Cairo: begin export to PDF.\n"); pdf_surface = cairo_pdf_surface_create(filename, (double)width, (double)height); status = cairo_surface_status(pdf_surface); if (status != CAIRO_STATUS_SUCCESS) { *error = g_error_new(VISU_ERROR_DUMP, DUMP_ERROR_FILE, "%s", cairo_status_to_string(status)); cairo_surface_destroy(pdf_surface); return FALSE; } writeDataToCairoSurface(pdf_surface, width, height, format, dataObj, error, functionWait, data); cairo_surface_destroy(pdf_surface); return TRUE; } static void svgDraw_legend(cairo_t *cr, VisuData *dataObj, cairo_pattern_t **pat) { cairo_matrix_t scaleFont = {FONT_SIZE, 0., 0., -FONT_SIZE, 0., 0.}; GLfloat *legend; GLint nValuesLegend; float lgWidth, lgHeight, max; int i, nEle; gchar *lbl; float radius; VisuRendering *method; VisuNodeArrayIter iter; method = visu_object_getRendering(VISU_OBJECT_INSTANCE); legend = g_malloc(sizeof(GLfloat) * 70000); glFeedbackBuffer(70000, GL_3D, legend); glRenderMode(GL_FEEDBACK); visu_gl_ext_call(visu_gl_ext_getFromName(VISU_GL_EXT_LEGEND_ID), TRUE); nValuesLegend = glRenderMode(GL_RENDER); cairo_select_font_face(cr, "Serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); cairo_set_font_size(cr, 12.0); /* The two first polygons are the white frame. */ if (nValuesLegend >= 22) { cairo_set_source_rgba(cr, 1.f, 1.f, 1.f, 0.4f); lgWidth = legend[5] - legend[2]; lgHeight = legend[9] - legend[3]; cairo_rectangle(cr, legend[2], legend[3], lgWidth, lgHeight); cairo_fill(cr); /* Run to the names and the elements... */ nEle = 0; visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter); visu_node_array_iterStart(VISU_NODE_ARRAY(dataObj), &iter); max = visu_node_array_getMaxElementSize(VISU_NODE_ARRAY(dataObj)); for (i = 0; i < nValuesLegend; i++) if (legend[i] == GL_BITMAP_TOKEN) { /* Write the name. */ cairo_move_to(cr, legend[i + 1], legend[i + 2]); lbl = g_strdup_printf("%s (%d)", iter.element->name, iter.nStoredNodes); cairo_set_source_rgb(cr, 0.f, 0.f, 0.f); cairo_set_font_matrix(cr, &scaleFont); cairo_show_text(cr, lbl); g_free(lbl); /* Draw the element. */ radius = 0.4f * lgHeight * visu_rendering_getSizeOfElement(method, iter.element) / max; cairo_new_path(cr); cairo_save(cr); cairo_translate(cr, legend[i + 1] - 0.6f * lgHeight, legend[3] + 0.5f * lgHeight); svgDraw_node(cr, visu_rendering_atomic_getShape(iter.element), radius); cairo_save(cr); cairo_scale(cr, radius, radius); cairo_set_source(cr, pat[nEle]); cairo_fill_preserve(cr); cairo_restore(cr); cairo_set_source_rgb(cr, 0.f, 0.f, 0.f); cairo_stroke(cr); cairo_restore(cr); nEle += 1; visu_node_array_iterNextElement(VISU_NODE_ARRAY(dataObj), &iter); do i += 4; while (legend[i] == GL_BITMAP_TOKEN && i < nValuesLegend); } } g_free(legend); } static void svgDraw_axes(cairo_t *cr) { cairo_matrix_t scaleFont = {FONT_SIZE, 0., 0., -FONT_SIZE, 0., 0.}; GLfloat *axes; GLint nValuesAxes; float *rgb; /* We create the feedback for the axes. */ axes = g_malloc(sizeof(GLfloat) * 7000); glFeedbackBuffer(7000, GL_3D, axes); glRenderMode(GL_FEEDBACK); visu_gl_ext_call(visu_gl_ext_getFromName(VISU_GL_EXT_AXES_ID), TRUE); nValuesAxes = glRenderMode(GL_RENDER); DBG_fprintf(stderr, "Dump Cairo: found %d axes output.\n", nValuesAxes); cairo_set_line_width(cr, (double)visu_gl_ext_axes_getLineWidth(visu_gl_ext_axes_getDefault())); rgb = visu_gl_ext_axes_getRGB(visu_gl_ext_axes_getDefault()); cairo_set_source_rgb(cr, rgb[0], rgb[1], rgb[2]); cairo_select_font_face(cr, "Serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); cairo_set_font_size(cr, 12.0); /* We draw the 3 lines of the axes. */ if (nValuesAxes >= 21 && axes[0] == GL_LINE_RESET_TOKEN && axes[7] == GL_LINE_RESET_TOKEN && axes[14] == GL_LINE_RESET_TOKEN) { DBG_fprintf(stderr, "Dump Cairo: output axes.\n"); cairo_move_to(cr, axes[0 + 1], axes[0 + 2]); cairo_line_to(cr, axes[0 + 4], axes[0 + 5]); cairo_stroke(cr); cairo_move_to(cr, axes[7 + 1], axes[7 + 2]); cairo_line_to(cr, axes[7 + 4], axes[7 + 5]); cairo_stroke(cr); cairo_move_to(cr, axes[14 + 1], axes[14 + 2]); cairo_line_to(cr, axes[14 + 4], axes[14 + 5]); cairo_stroke(cr); } cairo_set_source_rgb(cr, 1.f - rgb[0], 1.f - rgb[1], 1.f - rgb[2]); cairo_set_font_matrix(cr, &scaleFont); if (nValuesAxes >= 33 && axes[21] == GL_BITMAP_TOKEN && axes[25] == GL_BITMAP_TOKEN && axes[29] == GL_BITMAP_TOKEN) { DBG_fprintf(stderr, "Dump Cairo: output axes names.\n"); cairo_move_to(cr, axes[21 + 1], axes[21 + 2]); cairo_show_text(cr, "x"); cairo_move_to(cr, axes[25 + 1], axes[25 + 2]); cairo_show_text(cr, "y"); cairo_move_to(cr, axes[29 + 1], axes[29 + 2]); cairo_show_text(cr, "z"); } g_free(axes); } static GList* svgSetup_pairs(VisuData *dataObj) { GList *pairsLst; VisuNodeArrayIter iter1, iter2; GList *tmpLst; struct _pairs *pairData; VisuPairLink *data; float d2, d2min, d2max, d2min_buffered, d2max_buffered, l, mM[2]; float xyz1[3], xyz2[3], alpha; pairsLst = (GList*)0; visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter1); visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter2); for(visu_node_array_iterStart(VISU_NODE_ARRAY(dataObj), &iter1); iter1.element; visu_node_array_iterNextElement(VISU_NODE_ARRAY(dataObj), &iter1)) { if (!visu_element_getRendered(iter1.element)) continue; for(visu_node_array_iterStart(VISU_NODE_ARRAY(dataObj), &iter2); iter2.element && iter2.iElement <= iter1.iElement ; visu_node_array_iterNextElement(VISU_NODE_ARRAY(dataObj), &iter2)) { if (!visu_element_getRendered(iter2.element)) continue; for (tmpLst = visu_pair_link_getAll(iter1.element, iter2.element); tmpLst; tmpLst = g_list_next(tmpLst)) { data = (VisuPairLink*)tmpLst->data; if (!visu_pair_link_getDrawn(data)) continue; mM[0] = visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MIN); mM[1] = visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MAX); d2min = mM[0] * mM[0]; d2max = mM[1] * mM[1]; if(d2min >= d2max || d2max <= 0.) continue; l = mM[1] - mM[0]; d2min_buffered = (mM[0] - 0.15 * l); d2min_buffered *= d2min_buffered; d2max_buffered = (mM[1] + 0.15 * l); d2max_buffered *= d2max_buffered; for(visu_node_array_iterRestartNode(VISU_NODE_ARRAY(dataObj), &iter1); iter1.node; visu_node_array_iterNextNode(VISU_NODE_ARRAY(dataObj), &iter1)) { if (!iter1.node->rendered) continue; for(visu_node_array_iterRestartNode(VISU_NODE_ARRAY(dataObj), &iter2); iter2.node; visu_node_array_iterNextNode(VISU_NODE_ARRAY(dataObj), &iter2)) { if (!iter2.node->rendered) continue; /* Don't draw the inter element pairs two times. */ if (iter1.element == iter2.element && iter2.node >= iter1.node) break; visu_data_getNodePosition(dataObj, iter1.node, xyz1); visu_data_getNodePosition(dataObj, iter2.node, xyz2); d2 = (xyz1[0] - xyz2[0]) * (xyz1[0] - xyz2[0]) + (xyz1[1] - xyz2[1]) * (xyz1[1] - xyz2[1]) + (xyz1[2] - xyz2[2]) * (xyz1[2] - xyz2[2]); if(d2 <= 0. || d2 < d2min_buffered || d2 > d2max_buffered) continue; if (d2 < d2min) alpha = (d2 - d2min_buffered) / (d2min - d2min_buffered); else if (d2 > d2max) alpha = (d2max_buffered - d2) / (d2max_buffered - d2max); else alpha = 1.f; #if GLIB_MINOR_VERSION > 9 pairData = g_slice_alloc(sizeof(struct _pairs)); #else pairData = g_malloc(sizeof(struct _pairs)); #endif pairData->data = data; pairData->node1 = iter1.node; pairData->node2 = iter2.node; pairData->ele1 = iter1.element; pairData->ele2 = iter2.element; pairData->alpha = alpha; pairsLst = g_list_prepend(pairsLst, pairData); } } } } } return pairsLst; } static GLfloat* svgCompute_pairs(VisuData *dataObj, int *nPairs_out) { int nPairs, i; guint width; GLfloat *pairs; GLint nValues; GList *tmpLst; struct _pairs *pairData; float xyz1[3], xyz2[3], u[3], radius, norm; ToolColor *color; float tmpPairs[6]; VisuRendering *method; GList *pairsLst; VisuPairExtension *ext; pairsLst = svgSetup_pairs(dataObj); *nPairs_out = nPairs = g_list_length(pairsLst); if (nPairs <= 0) return (GLfloat*)0; method = visu_object_getRendering(VISU_OBJECT_INSTANCE); DBG_fprintf(stderr, "Dump Cairo: found %d pairs to draw.\n", nPairs); pairs = g_malloc(sizeof(GLfloat) * nPairs * PAIRS_NBUFF); glFeedbackBuffer(nPairs * PAIRS_NBUFF, GL_3D, pairs); glRenderMode(GL_FEEDBACK); glPushMatrix(); /* Render the list of pairs and free them each time. */ for (tmpLst = pairsLst; tmpLst; tmpLst = g_list_next(tmpLst)) { pairData = (struct _pairs*)tmpLst->data; visu_data_getNodePosition(dataObj, pairData->node1, xyz1); visu_data_getNodePosition(dataObj, pairData->node2, xyz2); u[0] = xyz2[0] - xyz1[0]; u[1] = xyz2[1] - xyz1[1]; u[2] = xyz2[2] - xyz1[2]; norm = sqrt(u[0] * u[0] + u[1] * u[1] + u[2] * u[2]); u[0] /= norm; u[1] /= norm; u[2] /= norm; radius = visu_rendering_getSizeOfElement(method, pairData->ele1); radius *= visu_data_getNodeScalingFactor(dataObj, pairData->node1); xyz1[0] += radius * u[0]; xyz1[1] += radius * u[1]; xyz1[2] += radius * u[2]; radius = visu_rendering_getSizeOfElement(method, pairData->ele2); radius *= visu_data_getNodeScalingFactor(dataObj, pairData->node2); xyz2[0] -= radius * u[0]; xyz2[1] -= radius * u[1]; xyz2[2] -= radius * u[2]; glBegin(GL_POINTS); glVertex3fv(xyz1); glVertex3fv(xyz2); glEnd(); /* We save colour channel as passthrough. */ color = visu_pair_link_getColor(pairData->data); glPassThrough(color->rgba[0]); glPassThrough(color->rgba[1]); glPassThrough(color->rgba[2]); glPassThrough(pairData->alpha); /* We save the width and the printLength in a passthrough. */ ext = visu_gl_ext_pairs_getDrawMethod(visu_gl_ext_pairs_getDefault(), pairData->data); if (ext == visu_gl_pairs_wire_getStatic()) width = visu_gl_pairs_wire_getWidth(pairData->data); else width = 10; glPassThrough((float)width); if (visu_pair_link_getPrintLength(pairData->data)) glPassThrough(norm); else glPassThrough(-1.f); glPassThrough((float)visu_gl_pairs_wire_getStipple(pairData->data)); /* Free the data. */ #if GLIB_MINOR_VERSION > 9 g_slice_free1(sizeof(struct _pairs), tmpLst->data); #else g_free(tmpLst->data); #endif } glPopMatrix(); /* Free the list itself. */ g_list_free(pairsLst); /* Analyse the OpenGL results. */ nValues = glRenderMode(GL_RENDER); DBG_fprintf(stderr, " | OpenGL returns %d.\n", nValues); i = 0; nPairs = 0; while (i < nValues) { if (pairs[i] == GL_POINT_TOKEN && pairs[i + PAIRS_NVALS] == GL_POINT_TOKEN && pairs[i + 2 * PAIRS_NVALS] == GL_PASS_THROUGH_TOKEN) { /* Copy all these values into the beginning of the pairs array. */ norm = (pairs[i + 3] + pairs[i + 7]) / 2.f; pairs[nPairs * PAIRS_NCMPT + 0] = pairs[i + 1]; /* x1 */ pairs[nPairs * PAIRS_NCMPT + 1] = pairs[i + 2]; /* y1 */ pairs[nPairs * PAIRS_NCMPT + 2] = pairs[i + 5]; /* x2 */ pairs[nPairs * PAIRS_NCMPT + 3] = pairs[i + 6]; /* y2 */ pairs[nPairs * PAIRS_NCMPT + 4] = norm; /* altitude */ pairs[nPairs * PAIRS_NCMPT + 5] = pairs[i + PAIRS_XBUFF + 7]; /* alpha */ pairs[nPairs * PAIRS_NCMPT + 6] = pairs[i + PAIRS_XBUFF + 1]; /* red */ pairs[nPairs * PAIRS_NCMPT + 7] = pairs[i + PAIRS_XBUFF + 3]; /* green */ pairs[nPairs * PAIRS_NCMPT + 8] = pairs[i + PAIRS_XBUFF + 5]; /* blue */ pairs[nPairs * PAIRS_NCMPT + 9] = pairs[i + PAIRS_XBUFF + 9]; /* width */ pairs[nPairs * PAIRS_NCMPT + 10] = pairs[i + PAIRS_XBUFF + 11]; /* prtLg */ pairs[nPairs * PAIRS_NCMPT + 11] = pairs[i + PAIRS_XBUFF + 13]; /* Stipp */ i += PAIRS_NBUFF; nPairs += 1; } else if (pairs[i] == GL_POINT_TOKEN && pairs[i + PAIRS_NVALS] == GL_PASS_THROUGH_TOKEN) { DBG_fprintf(stderr, "| uncomplete pair for i=%d\n", i); i += PAIRS_NVALS + 2 * PAIRS_NPASS; } else if (pairs[i] == GL_PASS_THROUGH_TOKEN) { DBG_fprintf(stderr, "| no pair for i=%d\n", i); i += 2 * PAIRS_NPASS; } } sort_by_z(pairs, tmpPairs, PAIRS_NCMPT, 4, 0, nPairs - 1); DBG_fprintf(stderr, " | will draw %d pairs.\n", nPairs); *nPairs_out = nPairs; return pairs; } static GLfloat* svgCompute_coordinates(VisuData *dataObj, int *nNodes_out) { VisuNodeArrayIter iter; VisuRendering *method; GLfloat *coordinates; GLint nValues; float tmpFloat[NBUFF]; float modelView[16]; float xyz[3], radius, rgba[4]; int i, nNodes; method = visu_object_getRendering(VISU_OBJECT_INSTANCE); visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter); /* We create a feedback mode to get node coordinates. */ coordinates = g_malloc(sizeof(GLfloat) * (iter.nAllStoredNodes * NBUFF)); glFeedbackBuffer((iter.nAllStoredNodes * NBUFF), GL_3D_COLOR, coordinates); glRenderMode(GL_FEEDBACK); glGetFloatv(GL_MODELVIEW_MATRIX, modelView); /* First thing is to order nodes along z axes. */ for (visu_node_array_iterStartVisible(VISU_NODE_ARRAY(dataObj), &iter); iter.node; visu_node_array_iterNextVisible(VISU_NODE_ARRAY(dataObj), &iter)) { glBegin(GL_POINTS); visu_data_getNodePosition(dataObj, iter.node, xyz); if (visu_data_getUserColor(dataObj, iter.element, iter.node, rgba)) visu_gl_setColor(iter.element->material, rgba); else if (visu_data_hasUserColorFunc(dataObj)) visu_gl_setColor(iter.element->material, iter.element->rgb); /* We compute the node position in the eyes coordinates. */ glVertex3fv(xyz); /* We compute the node apparent radius using the real radius in X direction in ModelView. */ radius = visu_rendering_getSizeOfElement(method, iter.element); radius *= visu_data_getNodeScalingFactor(dataObj, iter.node); glVertex3f(xyz[0] + modelView[0] * radius, xyz[1] + modelView[4] * radius, xyz[2] + modelView[8] * radius); glEnd(); /* We store the number of the VisuElement. */ glPassThrough(iter.iElement); /* We store the element shape. */ glPassThrough(visu_rendering_atomic_getShape(iter.element)); } /* We sort the coordinates along z. */ nValues = glRenderMode(GL_RENDER); /* We compact coordinates to keep complete vertex list. */ i = 0; nNodes = 0; while (i < nValues) { if (coordinates[i] == GL_POINT_TOKEN && coordinates[i + NVALS] == GL_POINT_TOKEN) { /* fprintf(stderr, "Found a complete node %d, at %gx%g.\n", */ /* i, coordinates[i + 1], coordinates[i + 2]); */ /* fprintf(stderr, " | move it from %d to %d.\n", i, nNodes); */ /* A complete set, copying it to nNodes location. */ if (nNodes != i) memcpy(coordinates + nNodes, coordinates + i, sizeof(GLfloat) * NBUFF); i += NBUFF; nNodes += NBUFF; } else { /* fprintf(stderr, "Found a uncomplete node at %d.\n", i); */ /* Incomplete set, go on till the GL_PASS_THROUGH_TOKEN. */ while (coordinates[i] != GL_PASS_THROUGH_TOKEN) i += 1; /* Remove the GL_POINT_TOKEN. */ i += 2; /* fprintf(stderr, " | jump to %d.\n", i); */ } } sort_by_z(coordinates, tmpFloat, NBUFF, 3, 0, nNodes / NBUFF - 1); *nNodes_out = nNodes; return coordinates; } static cairo_pattern_t* svgGet_pattern(gboolean flat, float rgba[4], float alpha) { cairo_pattern_t *pat; float hsl[3], rgb[3], lum; if (flat) pat = cairo_pattern_create_rgba(rgba[0], rgba[1], rgba[2], rgba[3] * alpha); else { pat = cairo_pattern_create_radial(.4f, .4f, .1f, 0.f, 0.f, 1.f); /* We get the Element colour in HSL. */ tool_color_convertRGBtoHSL(hsl, rgba); lum = hsl[2]; hsl[2] = CLAMP(lum + 0.2f, 0.f, 1.f); tool_color_convertHSLtoRGB(rgb, hsl); cairo_pattern_add_color_stop_rgba(pat, 0, rgb[0], rgb[1], rgb[2], alpha); hsl[2] = CLAMP(lum + 0.05f, 0.f, 1.f); tool_color_convertHSLtoRGB(rgb, hsl); cairo_pattern_add_color_stop_rgba(pat, 0.3, rgb[0], rgb[1], rgb[2], alpha); hsl[2] = CLAMP(lum - 0.05f, 0.f, 1.f); tool_color_convertHSLtoRGB(rgb, hsl); cairo_pattern_add_color_stop_rgba(pat, 0.7, rgb[0], rgb[1], rgb[2], alpha); hsl[2] = CLAMP(lum - 0.2f, 0.f, 1.f); tool_color_convertHSLtoRGB(rgb, hsl); cairo_pattern_add_color_stop_rgba(pat, 1, rgb[0], rgb[1], rgb[2], alpha); } return pat; } static cairo_pattern_t** svgSetup_patterns(VisuNodeArray *array, gboolean flat) { cairo_pattern_t **pat; VisuNodeArrayIter iter; guint i; pat = g_malloc(sizeof(cairo_pattern_t*) * visu_node_array_getNElements(array, FALSE)); visu_node_array_iterNew(array, &iter); for (visu_node_array_iterStart(array, &iter), i = 0; iter.element; visu_node_array_iterNextElement(array, &iter), i++) pat[i] = svgGet_pattern(flat, iter.element->rgb, 1.f); return pat; } static void svgSetup_scale(cairo_t *cr, VisuData *dataObj _U_) { int viewport[4]; cairo_matrix_t scale = {1., 0., 0., -1., 0., 0.}; glGetIntegerv(GL_VIEWPORT, viewport); scale.y0 = (double)viewport[3]; cairo_set_matrix(cr, &scale); } static GLfloat* svgCompute_box(int *nBox_out) { GLfloat *box; GLint nValuesBox; box = g_malloc(sizeof(GLfloat) * 7000); glFeedbackBuffer(7000, GL_3D, box); glRenderMode(GL_FEEDBACK); visu_gl_ext_call(visu_gl_ext_getFromName(VISU_GL_EXT_BOX_ID), FALSE); nValuesBox = glRenderMode(GL_RENDER); *nBox_out = (int)nValuesBox; return box; } static gboolean svgDraw_line(cairo_t *cr, float x0, float y0, float x1, float y1, float z0, float z1, float *rgb, float fog[4]) { float d[4], a; cairo_pattern_t *pat; double xm, ym; /* projection of surface centre on AB. */ double xo, yo /* surface centre. */; double alpha, beta, lambda; double xmin, xmax, ymin, ymax; alpha = x1 - x0; beta = y1 - y0; xo = g_width * 0.5; yo = g_height * 0.5; xm = alpha * alpha * xo - alpha * beta * (y0 - yo) + beta * beta * x0; ym = alpha * alpha * y0 - alpha * beta * (x0 - xo) + beta * beta * yo; xm /= alpha * alpha + beta * beta; ym /= alpha * alpha + beta * beta; lambda = (alpha * (xm - x0) + beta * (ym - y0)) / (alpha * alpha + beta * beta); xmin = g_width * (1. - 1. / zoomLevel) * 0.5; xmax = g_width * (1. + 1. / zoomLevel) * 0.5; ymin = g_height * (1. - 1. / zoomLevel) * 0.5; ymax = g_height * (1. + 1. / zoomLevel) * 0.5; /* The projection of AB is outside the box. */ if (xm < xmin || xm > xmax || ym < ymin || ym > ymax) return FALSE; /* The projection is outside AB and a and B are outside the box. */ if ((lambda < 0. || lambda > 1.) && (x0 < xmin || x0 > xmax || y0 < ymin || y0 > ymax) && (x1 < xmin || x1 > xmax || y1 < ymin || y1 > ymax)) return FALSE; pat = (cairo_pattern_t*)0; if (visu_gl_ext_fog_getOn()) { if (z0 != z1) { pat = cairo_pattern_create_linear(x0, y0, x1, y1); a = CLAMP(visu_gl_ext_fog_getStart() + (visu_gl_ext_fog_getEnd() - z0) / (visu_gl_ext_fog_getEnd() - visu_gl_ext_fog_getStart()), 0.f, 1.f); d[0] = a * rgb[0] + (1.f - a) * fog[0]; d[1] = a * rgb[1] + (1.f - a) * fog[1]; d[2] = a * rgb[2] + (1.f - a) * fog[2]; d[3] = a + (1.f - a) * fog[3]; cairo_pattern_add_color_stop_rgba(pat, 0, d[0], d[1], d[2], d[3]); a = CLAMP(visu_gl_ext_fog_getStart() + (visu_gl_ext_fog_getEnd() - z1) / (visu_gl_ext_fog_getEnd() - visu_gl_ext_fog_getStart()), 0.f, 1.f); d[0] = a * rgb[0] + (1.f - a) * fog[0]; d[1] = a * rgb[1] + (1.f - a) * fog[1]; d[2] = a * rgb[2] + (1.f - a) * fog[2]; d[3] = a + (1.f - a) * fog[3]; cairo_pattern_add_color_stop_rgba(pat, 1, d[0], d[1], d[2], d[3]); cairo_set_source(cr, pat); } else { a = CLAMP(visu_gl_ext_fog_getStart() + (visu_gl_ext_fog_getEnd() - z1) / (visu_gl_ext_fog_getEnd() - visu_gl_ext_fog_getStart()), 0.f, 1.f); d[0] = a * rgb[0] + (1.f - a) * fog[0]; d[1] = a * rgb[1] + (1.f - a) * fog[1]; d[2] = a * rgb[2] + (1.f - a) * fog[2]; d[3] = a + (1.f - a) * fog[3]; cairo_set_source_rgba(cr, d[0], d[1], d[2], d[3]); } } else cairo_set_source_rgb(cr, rgb[0], rgb[1], rgb[2]); cairo_move_to(cr, x0, y0); cairo_line_to(cr, x1, y1); cairo_stroke(cr); if (pat) cairo_pattern_destroy(pat); return TRUE; } static void svgDraw_boxBack(cairo_t *cr, GLfloat *box, int nValuesBox, GLfloat val) { int i; float *rgb, fog[4]; cairo_set_line_width(cr, (double)visu_gl_ext_box_getLineWidth(visu_gl_ext_box_getDefault()) / zoomLevel); rgb = visu_gl_ext_box_getRGB(visu_gl_ext_box_getDefault()); svgGet_fogRGBA(fog); /* We draw the lines that have a boundary hidden by elements. */ for (i = 0; i < nValuesBox; i += 7) if (box[i + 3] >= val && box[i + 6] >= val) svgDraw_line(cr, box[i + 1], box[i + 2], box[i + 4], box[i + 5], box[i + 3], box[i + 6], rgb, fog); } static void svgDraw_boxFront(cairo_t *cr, GLfloat *box, int nValuesBox, GLfloat val) { int i; float *rgb, fog[4]; cairo_set_line_width(cr, (double)visu_gl_ext_box_getLineWidth(visu_gl_ext_box_getDefault()) / zoomLevel); rgb = visu_gl_ext_box_getRGB(visu_gl_ext_box_getDefault()); svgGet_fogRGBA(fog); /* We draw the lines that have a boundary hidden by elements. */ for (i = 0; i < nValuesBox; i += 7) if (box[i + 3] < val || box[i + 6] < val) svgDraw_line(cr, box[i + 1], box[i + 2], box[i + 4], box[i + 5], box[i + 3], box[i + 6], rgb, fog); } static void svgGet_fogRGBA(float rgba[4]) { /* We get the fog color. */ if (visu_gl_ext_fog_getOn()) { if (visu_gl_ext_fog_getUseSpecificColor()) visu_gl_ext_fog_getValues(rgba); else visu_gl_ext_bg_getRGBA(visu_gl_ext_bg_getDefault(), rgba); } else { rgba[0] = 0.; rgba[1] = 0.; rgba[2] = 0.; rgba[3] = 0.; } } static void svgDraw_node(cairo_t *cr, VisuRenderingAtomicShapeId shape, float radius) { if (shape == VISU_RENDERING_ATOMIC_POINT) cairo_rectangle(cr, -radius / 4, -radius / 4, radius / 2, radius / 2); else cairo_arc(cr, 0.f, 0.f, radius, 0., 2 * G_PI); } static void svgDraw_nodesAndPairs(cairo_t *cr, GLfloat *coordinates, int nNodes, GLfloat *pairs, int nPairs, cairo_pattern_t **pat, gboolean flat) { int iPairs, i; float alpha, radius, rgbaFog[4]; cairo_matrix_t scaleFont = {FONT_SMALL / zoomLevel, 0., 0., -FONT_SMALL / zoomLevel, 0., 0.}; cairo_pattern_t *pat_; VisuRenderingAtomicShapeId shape; double xmin, xmax, ymin, ymax; svgGet_fogRGBA(rgbaFog); cairo_set_line_width(cr, 1. / zoomLevel); cairo_set_font_matrix(cr, &scaleFont); iPairs = 0; alpha = 1.f; xmin = g_width * (1. - 1. / zoomLevel) * 0.5; xmax = g_width * (1. + 1. / zoomLevel) * 0.5; ymin = g_height * (1. - 1. / zoomLevel) * 0.5; ymax = g_height * (1. + 1. / zoomLevel) * 0.5; for (i = 0; i < nNodes; i+= NBUFF) { /* We draw the pairs in between. */ svgDraw_pairs(cr, pairs, nPairs, &iPairs, coordinates[i + 3]); /* Compute the alpha for the fog. */ alpha = (visu_gl_ext_fog_getOn())?CLAMP(visu_gl_ext_fog_getStart() + (visu_gl_ext_fog_getEnd() - coordinates[i + 3]) / (visu_gl_ext_fog_getEnd() - visu_gl_ext_fog_getStart()), 0.f, 1.f):1.f; radius = (coordinates[i + NVALS + 1] - coordinates[i + 1]) * (coordinates[i + NVALS + 1] - coordinates[i + 1]) + (coordinates[i + NVALS + 2] - coordinates[i + 2]) * (coordinates[i + NVALS + 2] - coordinates[i + 2]); radius = sqrt(radius); /* fprintf(stderr, "%gx%g %g %g %g\n", coordinates[i + 1], coordinates[i + 2], */ /* radius, coordinates[i + 3], coordinates[i + NBUFF - 1]); */ if (alpha > 0.f && radius > 0.f && (coordinates[i + 1] + radius) >= xmin && (coordinates[i + 1] - radius) <= xmax && (coordinates[i + 2] + radius) >= ymin && (coordinates[i + 2] - radius) <= ymax ) { /* cairo_push_group(cr); */ cairo_new_path(cr); cairo_save(cr); shape = (VisuRenderingAtomicShapeId)coordinates[i + NVERT * NVALS + 3]; cairo_translate(cr, coordinates[i + 1], coordinates[i + 2]); svgDraw_node(cr, shape, radius); cairo_save(cr); cairo_scale(cr, radius, radius); if (pat) cairo_set_source(cr, pat[(int)coordinates[i + NVERT * NVALS + 1]]); else { pat_ = svgGet_pattern(flat, coordinates + i + 4, 1.f); cairo_set_source(cr, pat_); cairo_pattern_destroy(pat_); } cairo_fill_preserve(cr); if (alpha < 1.f) { cairo_set_source_rgba(cr, rgbaFog[0], rgbaFog[1], rgbaFog[2], 1.f - alpha); cairo_fill_preserve(cr); } cairo_restore(cr); cairo_set_source_rgb(cr, (1.f - alpha) * rgbaFog[0], (1.f - alpha) * rgbaFog[1], (1.f - alpha) * rgbaFog[2]); cairo_set_line_width(cr, 1. / zoomLevel); cairo_stroke(cr); cairo_restore(cr); /* cairo_pop_group_to_source(cr); */ /* cairo_paint_with_alpha (cr, alpha); */ } } /* We draw the remaining pairs. */ svgDraw_pairs(cr, pairs, nPairs, &iPairs, -1); } static int svgGet_stipple(guint16 stipple, double dashes[16]) { int n, i; gboolean status; n = 0; memset(dashes, '\0', sizeof(double) * 16); for (i = 0, status = (stipple & 1); i < 16; status = (stipple & (1 << i++))) { if (((stipple & (1 << i)) && !status) || (!(stipple & (1 << i)) && status)) n += 1; dashes[n] += 1; } DBG_fprintf(stderr, " | %d -> ", stipple); for (i = 0; i <= n; i++) DBG_fprintf(stderr, " %f", dashes[i]); DBG_fprintf(stderr, "\n"); return n + 1; } static void svgDraw_pairs(cairo_t *cr, GLfloat *pairs, int nPairs, int *iPairs, GLfloat val) { char distStr[8]; float fog[4]; double dashes[16]; int n; svgGet_fogRGBA(fog); if (pairs && *iPairs < PAIRS_NCMPT * nPairs) { while (pairs[*iPairs + 4] > val && *iPairs < PAIRS_NCMPT * nPairs) { n = svgGet_stipple((guint16)pairs[*iPairs + 11], dashes); DBG_fprintf(stderr, " | pair %d at (%f;%f) - (%f;%f) %g,%g %d -> %d\n", *iPairs / PAIRS_NCMPT, pairs[*iPairs + 0], pairs[*iPairs + 1], pairs[*iPairs + 2], pairs[*iPairs + 3], pairs[*iPairs + 4], pairs[*iPairs + 5], (guint16)pairs[*iPairs + 11], n); if (n > 1) cairo_set_dash(cr, dashes, n, 0); cairo_set_line_width(cr, pairs[*iPairs + 9] / zoomLevel); if (svgDraw_line(cr, pairs[*iPairs + 0], pairs[*iPairs + 1], pairs[*iPairs + 2], pairs[*iPairs + 3], pairs[*iPairs + 4], pairs[*iPairs + 4], pairs + *iPairs + 6, fog) && pairs[*iPairs + 10] > 0) { cairo_move_to(cr, (pairs[*iPairs + 0] + pairs[*iPairs + 2]) * 0.5, (pairs[*iPairs + 1] + pairs[*iPairs + 3]) * 0.5); sprintf(distStr, "%7.3f", pairs[*iPairs + 10]); cairo_show_text(cr, distStr); } cairo_set_dash(cr, dashes, 0, 0); *iPairs += PAIRS_NCMPT; } cairo_set_line_width(cr, 1. / zoomLevel); } } #endif #endif v_sim-3.7.0/src/dumpModules/dumpToSVG.h0000644000353400050620000000503312215546076014660 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse m�l : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant � visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est r�gi par la licence CeCILL soumise au droit fran�ais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffus�e par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez acc�der � cet en-t�te signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept� les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef DUMPTOSVG_H #define DUMPTOSVG_H #include #include #include /** * visu_dump_cairo_svg_getStatic: * * This routine returns the dump object to SVG format. * * Returns: (transfer none): a newly created dump object to create SVG files. */ const VisuDump* visu_dump_cairo_svg_getStatic(); /** * visu_dump_cairo_pdf_getStatic: * * This routine returns the dump object to PDF format. * * Returns: (transfer none): a newly created dump object to create SVG files. */ const VisuDump* visu_dump_cairo_pdf_getStatic(); /** * VisuDumpCairoAdd: * @cr: a #cairo_t context. * @width: width of the surface. * @height: height of the surface. * * A method to be called by V_Sim after exportation to allow post-processing. */ typedef void (*VisuDumpCairoAdd)(cairo_t *cr, guint width, guint height); void visu_dump_cairo_setPostFunc(VisuDumpCairoAdd func); #endif v_sim-3.7.0/src/dumpModules/dumpToXyz.c0000644000353400050620000001552612215546075015015 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "dumpToXyz.h" #include #include #include #include #include #include /** * SECTION:dumpToXyz * @short_description: add an export capability of current positions. * * This provides a write routine to export V_Sim current * coordinates. It has several options to output or not hiddden nodes * or replicated nodes. */ static gboolean writeDataInXyz(ToolFileFormat *format, const char* filename, int width, int height, VisuData *dataObj, guchar* imageData, GError **error, ToolVoidDataFunc functionWait, gpointer data); static gpointer waitData; static ToolVoidDataFunc waitFunc; static VisuDump *xyz; const VisuDump* visu_dump_xyz_getStatic() { const gchar *typeXYZ[] = {"*.xyz", (char*)0}; #define descrXYZ _("Xyz file (current positions)") if (xyz) return xyz; xyz = visu_dump_new(descrXYZ, typeXYZ, writeDataInXyz, FALSE); tool_file_format_addPropertyBoolean(TOOL_FILE_FORMAT(xyz), "expand_box", _("Expand the bounding box"), TRUE); tool_file_format_addPropertyBoolean(TOOL_FILE_FORMAT(xyz), "type_alignment", _("Export nodes sorted by elements"), FALSE); waitData = (gpointer)0; waitFunc = (ToolVoidDataFunc)0; return xyz; } static gboolean writeDataInXyz(ToolFileFormat *format, const char* filename, int width _U_, int height _U_, VisuData *dataObj, guchar* imageData _U_, GError **error, ToolVoidDataFunc functionWait, gpointer data) { const gchar *nom; gchar *prevFile; ToolOption *prop; gchar firstLine[256]; gboolean expand, eleSort; gint nb; float xyz[3], ext[3], vertices[8][3]; VisuNodeArrayIter iter; GString *output; VisuBoxBoundaries bc; gchar *bcStr[5] = {"periodic", "surface", "surface", "surface", "FreeBC"}; const gchar *nodeComment; double ene; VisuBox *boxObj; g_return_val_if_fail(error && !*error, FALSE); prop = tool_file_format_getPropertyByName(format, "expand_box"); expand = g_value_get_boolean(tool_option_getValue(prop)); prop = tool_file_format_getPropertyByName(format, "type_alignment"); eleSort = g_value_get_boolean(tool_option_getValue(prop)); waitData = data; waitFunc = functionWait; DBG_fprintf(stderr, "Dump XYZ: begin export of current positions...\n"); output = g_string_new(""); boxObj = visu_boxed_getBox(VISU_BOXED(dataObj)); visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter); /* The number of elements will be prepended later... */ /* The commentary line. */ bc = visu_box_getBoundary(boxObj); if (bc != VISU_BOX_FREE) { visu_box_getVertices(boxObj, vertices, expand); if (vertices[1][1] == 0.f && vertices[1][2] == 0.f && vertices[3][0] == 0.f && vertices[3][2] == 0.f && vertices[4][0] == 0.f && vertices[4][1] == 0.f) g_string_append_printf(output, "%s %17.8g %17.8g %17.8g ", bcStr[bc], vertices[1][0], vertices[3][1], vertices[4][2]); else g_warning("Can't export box, not orthogonal."); } nom = visu_data_getFile(dataObj, 0, (ToolFileFormat**)0); if (nom) { prevFile = g_path_get_basename(nom); g_string_append_printf(output, "# V_Sim export to xyz from '%s'", prevFile); g_free(prevFile); } else { g_warning("Can't get the name of the file to export."); g_string_append_printf(output, "# V_Sim export to xyz"); } g_string_append(output, "\n"); visu_box_getVertices(boxObj, vertices, FALSE); if (expand) visu_box_getExtension(boxObj, ext); else { ext[0] = 0.; ext[1] = 0.; ext[2] = 0.; } nb = 0; for (visu_node_array_iterStartNumber(VISU_NODE_ARRAY(dataObj), &iter); iter.node && iter.element; (eleSort)?visu_node_array_iterNext(VISU_NODE_ARRAY(dataObj), &iter): visu_node_array_iterNextNodeNumber(VISU_NODE_ARRAY(dataObj), &iter)) { visu_data_getNodePosition(dataObj, iter.node, xyz); if (iter.element->rendered && iter.node->rendered) { xyz[0] += ext[0] * vertices[1][0] + ext[1] * vertices[3][0] + ext[2] * vertices[4][0]; xyz[1] += ext[1] * vertices[3][1] + ext[2] * vertices[4][1]; xyz[2] += ext[2] * vertices[4][2]; nb += 1; g_string_append_printf(output, "%s %17.8g %17.8g %17.8g", iter.element->name, xyz[0], xyz[1], xyz[2]); nodeComment = visu_extra_node_getLabel(dataObj, iter.node); if (nodeComment) g_string_append_printf(output, " %s", nodeComment); g_string_append(output, "\n"); } } g_string_prepend(output, "\n"); g_object_get(G_OBJECT(dataObj), "totalEnergy", &ene, NULL); if (ene != G_MAXFLOAT) { sprintf(firstLine, " %22.16f", ene / 27.21138386); g_string_prepend(output, firstLine); } switch (visu_box_getUnit(boxObj)) { case TOOL_UNITS_ANGSTROEM: sprintf(firstLine, " %d angstroem", nb); break; case TOOL_UNITS_BOHR: sprintf(firstLine, " %d atomic", nb); break; default: sprintf(firstLine, " %d", nb); break; } g_string_prepend(output, firstLine); g_file_set_contents(filename, output->str, -1, error); g_string_free(output, TRUE); return TRUE; } v_sim-3.7.0/src/dumpModules/dumpToXyz.h0000644000353400050620000000401012215546076015005 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse m�l : BILLARD, non joignable par m�l ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant � visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est r�gi par la licence CeCILL soumise au droit fran�ais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffus�e par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez acc�der � cet en-t�te signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept� les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef DUMPTOXYZ_H #define DUMPTOXYZ_H #include /** * visu_dump_xyz_getStatic: * * This routine returns the dump object for XYZ format. * * Returns: (transfer none): a newly created dump object to create XYZ files. */ const VisuDump* visu_dump_xyz_getStatic(); #endif v_sim-3.7.0/src/dumpModules/dumpToABINIT.c0000644000353400050620000002346512215546075015172 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2011) Adresse ml : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2011) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "dumpToABINIT.h" #include #include #include #include #include #include #include #include /** * SECTION:dumpToABINIT * @short_description: add an export capability of current positions * in ABINIT format. * * This provides a write routine to export V_Sim current * coordinates. It has several options to output or not hiddden nodes * or replicated nodes. */ static gboolean writeDataInABINIT(ToolFileFormat *format, const char* filename, int width, int height, VisuData *dataObj, guchar* imageData, GError **error, ToolVoidDataFunc functionWait, gpointer data); static gpointer waitData; static ToolVoidDataFunc waitFunc; static VisuDump *ab; const VisuDump* visu_dump_abinit_getStatic() { const gchar *typeABINIT[] = {"*.in", (char*)0}; #define descrABINIT _("ABINIT file (crystal only)") if (ab) return ab; ab = visu_dump_new(descrABINIT, typeABINIT, writeDataInABINIT, FALSE); tool_file_format_addPropertyBoolean(TOOL_FILE_FORMAT(ab), "reduced_coordinates", _("Export positions in reduced coordinates"), FALSE); tool_file_format_addPropertyBoolean(TOOL_FILE_FORMAT(ab), "angdeg_box", _("Export box as lengths and angles"), FALSE); waitData = (gpointer)0; waitFunc = (ToolVoidDataFunc)0; return ab; } static gboolean writeDataInABINIT(ToolFileFormat *format, const char* filename, int width _U_, int height _U_, VisuData *dataObj, guchar* imageData _U_, GError **error, ToolVoidDataFunc functionWait, gpointer data) { const gchar *nom; gchar *prevFile; gchar unit[25], tag[25]; gboolean reduced, angdeg; float xyz[3], uvw[3], vertices[8][3], box[6]; VisuNodeArrayIter iter; GString *output; ToolFileFormatIter it; int znucl; VisuBox *boxObj; g_return_val_if_fail(error && !*error, FALSE); reduced = FALSE; angdeg = FALSE; it.lst = (GList*)0; for (tool_file_format_iterNextProperty(format, &it); it.lst; tool_file_format_iterNextProperty(format, &it)) { DBG_fprintf(stderr, "Dump ABINIT: test property '%s'.\n", it.name); if (strcmp(it.name, "reduced_coordinates") == 0) reduced = g_value_get_boolean(it.val); else if (strcmp(it.name, "angdeg_box") == 0) angdeg = g_value_get_boolean(it.val); } waitData = data; waitFunc = functionWait; DBG_fprintf(stderr, "Dump ABINIT: begin export of current positions...\n"); DBG_fprintf(stderr, " | reduced %d ;\n", reduced); DBG_fprintf(stderr, " | angdeg %d ;\n", angdeg); output = g_string_new(""); nom = visu_data_getFile(dataObj, 0, (ToolFileFormat**)0); if (nom) { prevFile = g_path_get_basename(nom); g_string_append_printf(output, "# V_Sim export to ABINIT from '%s'\n", prevFile); g_free(prevFile); } else { g_warning("Can't get the name of the file to export."); g_string_append(output, "# V_Sim export to ABINIT\n"); } boxObj = visu_boxed_getBox(VISU_BOXED(dataObj)); switch (visu_box_getUnit(boxObj)) { case TOOL_UNITS_ANGSTROEM: strcpy(unit, "angstroms"); strcpy(tag, "xangst"); break; default: g_warning("Unsupported unit for ABINIT."); case TOOL_UNITS_UNDEFINED: case TOOL_UNITS_BOHR: unit[0] = '\0'; strcpy(tag, "xcart"); break; } if (reduced) strcpy(tag, "xred"); visu_box_getVertices(boxObj, vertices, TRUE); box[0] = sqrt((vertices[1][0] - vertices[0][0]) * (vertices[1][0] - vertices[0][0]) + (vertices[1][1] - vertices[0][1]) * (vertices[1][1] - vertices[0][1]) + (vertices[1][2] - vertices[0][2]) * (vertices[1][2] - vertices[0][2])); box[1] = sqrt((vertices[3][0] - vertices[0][0]) * (vertices[3][0] - vertices[0][0]) + (vertices[3][1] - vertices[0][1]) * (vertices[3][1] - vertices[0][1]) + (vertices[3][2] - vertices[0][2]) * (vertices[3][2] - vertices[0][2])); box[2] = sqrt((vertices[4][0] - vertices[0][0]) * (vertices[4][0] - vertices[0][0]) + (vertices[4][1] - vertices[0][1]) * (vertices[4][1] - vertices[0][1]) + (vertices[4][2] - vertices[0][2]) * (vertices[4][2] - vertices[0][2])); g_string_append_printf(output, "acell %17.8g %17.8g %17.8g %s\n", box[0], box[1], box[2], unit); if (angdeg) { box[3] = acos(CLAMP(((vertices[3][0] - vertices[0][0]) * (vertices[4][0] - vertices[0][0]) + (vertices[3][1] - vertices[0][1]) * (vertices[4][1] - vertices[0][1]) + (vertices[3][2] - vertices[0][2]) * (vertices[4][2] - vertices[0][2])) / box[1] / box[2], -1.f, 1.f)) * 180.f / G_PI; box[4] = acos(CLAMP(((vertices[1][0] - vertices[0][0]) * (vertices[4][0] - vertices[0][0]) + (vertices[1][1] - vertices[0][1]) * (vertices[4][1] - vertices[0][1]) + (vertices[1][2] - vertices[0][2]) * (vertices[4][2] - vertices[0][2])) / box[0] / box[2], -1.f, 1.f)) * 180.f / G_PI; box[4] *= (vertices[4][2] < 0.)?-1.:+1.; box[5] = acos(CLAMP(((vertices[3][0] - vertices[0][0]) * (vertices[1][0] - vertices[0][0]) + (vertices[3][1] - vertices[0][1]) * (vertices[1][1] - vertices[0][1]) + (vertices[3][2] - vertices[0][2]) * (vertices[1][2] - vertices[0][2])) / box[0] / box[1], -1.f, 1.f)) * 180.f / G_PI; g_string_append_printf(output, "angdeg %17.8g %17.8g %17.8g\n", box[3], box[4], box[5]); } else { g_string_append_printf(output, "rprim %17.8g %17.8g %17.8g\n", (vertices[1][0] - vertices[0][0]) / box[0], (vertices[1][1] - vertices[0][1]) / box[0], (vertices[1][2] - vertices[0][2]) / box[0]); g_string_append_printf(output, " %17.8g %17.8g %17.8g\n", (vertices[3][0] - vertices[0][0]) / box[1], (vertices[3][1] - vertices[0][1]) / box[1], (vertices[3][2] - vertices[0][2]) / box[1]); g_string_append_printf(output, " %17.8g %17.8g %17.8g\n", (vertices[4][0] - vertices[0][0]) / box[2], (vertices[4][1] - vertices[0][1]) / box[2], (vertices[4][2] - vertices[0][2]) / box[2]); } visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter); g_string_append_printf(output, "ntypat %d\n", iter.nElements); g_string_append_printf(output, "natom %d\n", iter.nAllStoredNodes); g_string_append(output, "znucl"); for(visu_node_array_iterStart(VISU_NODE_ARRAY(dataObj), &iter); iter.element; visu_node_array_iterNextElement(VISU_NODE_ARRAY(dataObj), &iter)) { tool_physic_getZFromSymbol(&znucl, (float*)0, iter.element->name); g_string_append_printf(output, " %d", znucl); } g_string_append(output, "\n"); g_string_append(output, "typat"); for(visu_node_array_iterStart(VISU_NODE_ARRAY(dataObj), &iter); iter.node; visu_node_array_iterNext(VISU_NODE_ARRAY(dataObj), &iter)) if (iter.element->rendered && iter.node->rendered) { g_string_append_printf(output, " %d", iter.node->posElement + 1); if (iter.node->number % 10 == 9) g_string_append(output, "\n"); } g_string_append(output, "\n"); g_string_append(output, tag); for(visu_node_array_iterStart(VISU_NODE_ARRAY(dataObj), &iter); iter.node; visu_node_array_iterNext(VISU_NODE_ARRAY(dataObj), &iter)) { visu_data_getNodePosition(dataObj, iter.node, xyz); if (reduced) visu_box_convertXYZtoBoxCoordinates(boxObj, uvw, xyz); else { uvw[0] = xyz[0]; uvw[1] = xyz[1]; uvw[2] = xyz[2]; } if (iter.element->rendered && iter.node->rendered) g_string_append_printf(output, " %17.8g %17.8g %17.8g\n", uvw[0], uvw[1], uvw[2]); } g_string_append_printf(output, "\n"); g_file_set_contents(filename, output->str, -1, error); g_string_free(output, TRUE); if (*error) return FALSE; else return TRUE; } v_sim-3.7.0/src/dumpModules/dumpToABINIT.h0000644000353400050620000000365712215546075015200 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2011) Adresse ml : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2011) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef DUMPTOABINIT_H #define DUMPTOABINIT_H #include /** * visu_dump_abinit_getStatic: * * This routine returns the ABINIT dump object. * * Returns: (transfer none): a newly created dump object to create ABINIT files. */ const VisuDump* visu_dump_abinit_getStatic(); #endif v_sim-3.7.0/src/dumpModules/dumpThroughGdkPixbuf.c0000644000353400050620000001425212215546075017137 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeur : Damien CALISTE, laboratoire L_Sim, (2001-2006) Adresse ml : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2006) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include #include #include "dumpThroughGdkPixbuf.h" #include /** * SECTION:dumpThroughGdkPixbuf * @short_description: add an export capability into PNG and JPG files. * * This provides a write routine to export V_Sim views into PNG and JPG * files. It uses the GdkPixbuf to do it. */ static gpointer waitData; static ToolVoidDataFunc waitFunc; static gboolean writeViewInPngFormat(ToolFileFormat *format, const char* filename, int width, int height, VisuData *dataObj, guchar* imageData, GError **error, ToolVoidDataFunc functionWait, gpointer data); static gboolean writeViewInJpegFormat(ToolFileFormat *format, const char* filename, int width, int height, VisuData *dataObj, guchar* imageData, GError **error, ToolVoidDataFunc functionWait, gpointer data); static VisuDump *png = NULL; static VisuDump *jpeg = NULL; const VisuDump* visu_dump_png_getStatic() { const gchar *typePng[] = {"*.png", (char*)0}; if (png) return png; png = visu_dump_new(_("Png file"), typePng, writeViewInPngFormat, TRUE); waitFunc = (ToolVoidDataFunc)0; waitData = (gpointer)0; return png; } const VisuDump* visu_dump_jpeg_getStatic() { const gchar *typeJpeg[] = {"*.jpg", "*.jpeg", (char*)0}; if (jpeg) return jpeg; jpeg = visu_dump_new(_("Jpeg file"), typeJpeg, writeViewInJpegFormat, TRUE); visu_dump_setHasAlpha(jpeg, FALSE); tool_file_format_addPropertyInt(TOOL_FILE_FORMAT(jpeg), "quality", _("Compression ratio (given in percent)"), 85); waitFunc = (ToolVoidDataFunc)0; waitData = (gpointer)0; return jpeg; } static gboolean writeViewWithGdkPixbuf(ToolFileFormat *format, const char* filename, int width, int height, char *type, VisuData *dataObj _U_, guchar* imageData, GError **error) { GdkPixbuf *pixbuf; gboolean success, hasAlpha; GArray *propName, *propValues; int length; gchar *str; ToolFileFormatIter iter; g_return_val_if_fail(error && !*error, FALSE); g_return_val_if_fail(imageData, FALSE); DBG_fprintf(stderr, "Dump with GdkPixbuf: begin %s export in %dx%d : %s.\n", type, width, height, filename); if (strcmp(type, "png")) { length = 3; hasAlpha = FALSE; } else { length = 4; hasAlpha = TRUE; } pixbuf = gdk_pixbuf_new_from_data((guchar*)imageData, GDK_COLORSPACE_RGB, hasAlpha, 8, width, height, length * width, NULL, (gpointer)0); if (!pixbuf) { *error = g_error_new(VISU_ERROR_DUMP, DUMP_ERROR_FILE, _("Cannot convert pixmap to pixbuf.")); return FALSE; } propName = g_array_new(TRUE, FALSE, sizeof(gchar*)); propValues = g_array_new(TRUE, FALSE, sizeof(gchar*)); iter.lst = (GList*)0; for (tool_file_format_iterNextProperty(format, &iter); iter.lst; tool_file_format_iterNextProperty(format, &iter)) { str = g_strdup(iter.name); g_array_append_vals(propName, &str, 1); str = g_strdup_value_contents(iter.val); g_array_append_vals(propValues, &str, 1); } DBG_fprintf(stderr, "Dump with GdkPixbuf: transfer properties.\n"); success = gdk_pixbuf_savev(pixbuf, filename, type, (gchar**)propName->data, (gchar**)propValues->data, error); g_strfreev((gchar**)g_array_free(propName, FALSE)); g_strfreev((gchar**)g_array_free(propValues, FALSE)); g_object_unref(pixbuf); return success; } static gboolean writeViewInJpegFormat(ToolFileFormat *format, const char* filename, int width, int height, VisuData *dataObj, guchar* imageData, GError **error, ToolVoidDataFunc functionWait, gpointer data) { int i, res; res = writeViewWithGdkPixbuf(format, filename, width, height, "jpeg", dataObj, imageData, error); /* Must call 100 times functionWait if exists before leaving... */ if (functionWait) for (i = 0; i < 100; i++) functionWait(data); return res; } static gboolean writeViewInPngFormat(ToolFileFormat *format, const char* filename, int width, int height, VisuData *dataObj, guchar* imageData, GError **error, ToolVoidDataFunc functionWait, gpointer data) { int i, res; res = writeViewWithGdkPixbuf(format, filename, width, height, "png", dataObj, imageData, error); /* Must call 100 times functionWait if exists before leaving... */ if (functionWait) for (i = 0; i < 100; i++) functionWait(data); return res; } v_sim-3.7.0/src/dumpModules/dumpThroughGdkPixbuf.h0000644000353400050620000000415612215546075017146 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeur : Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef DUMPTHROUGHGDKPIXBUF_H #define DUMPTHROUGHGDKPIXBUF_H #include /** * visu_dump_png_getStatic: * * This routine returns the PNG dump object. * * Returns: (transfer none): a newly created dump object to create PNG files. */ const VisuDump* visu_dump_png_getStatic(); /** * visu_dump_jpeg_getStatic: * * This routine returns the JPG dump object. * * Returns: (transfer none): a newly created dump object to create JPEG files. */ const VisuDump* visu_dump_jpeg_getStatic(); #endif v_sim-3.7.0/src/extensions/0000755000353400050620000000000012216331341012623 500000000000000v_sim-3.7.0/src/extensions/nodes.c0000644000353400050620000006640412215550562014040 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2013-2013) Adresse mèl : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2013-2013) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "nodes.h" #include #include #include #include #include #include /** * SECTION:nodes * @short_description: Defines methods to draw a set of nodes. * * */ typedef struct _GlIds { GLuint material, element, nodes; } GlIds; /** * VisuGlExtNodesClass: * @parent: the parent class; * * A short way to identify #_VisuGlExtNodesClass structure. * * Since: 3.7 */ /** * VisuGlExtNodes: * * An opaque structure. * * Since: 3.7 */ /** * VisuGlExtNodesPrivate: * * Private fields for #VisuGlExtNodes objects. * * Since: 3.7 */ struct _VisuGlExtNodesPrivate { gboolean dispose_has_run; VisuGlExtNodesEffects effect; VisuRendering *method; guint nEle; GArray *glIds; VisuGlView *view; VisuData *dataObj; gulong popId, posId, popIncId, popDecId, visId, renId, eleId, precId; }; #define VISU_GL_EXT_NODES_ID "Nodes" /* Local routines. */ static void visu_gl_ext_nodes_dispose (GObject* obj); static void visu_gl_ext_nodes_finalize(GObject* obj); static void visu_gl_ext_nodes_rebuild (VisuGlExt *ext); static void compileElementMaterial(VisuGlExtNodes *ext, GLuint displayList, VisuElement *ele); static void compileElement(VisuGlExtNodes *ext, GLuint displayList, VisuElement *ele); static void callNode(VisuGlExtNodes *ext, VisuElement *ele, VisuNode *node, GLuint eleId); static void createGlLists(VisuGlExtNodes *ext, guint nEle); static void createAllElements(VisuGlExtNodes *ext); static void createNodes(VisuGlExtNodes *ext, VisuElement *ele); static void createAllNodes(VisuGlExtNodes *ext); /* Signal callbacks. */ static void onPopulationDefined(VisuNodeArray *array, guint nEle, gpointer data); static void onPopulationChanged(VisuData *dataObj, gint *ids, gpointer data); static void onPositionChanged(VisuData *dataObj, VisuElement *ele, gpointer data); static void onRenderingChanged(VisuData *dataObj, VisuElement *ele, gpointer data); static void onElementRenderingChanged(VisuData *dataObj, VisuElement *ele, gpointer data); static void onVisibilityChanged(VisuData *dataObj, gpointer data); static void onPrecisionChanged(VisuGlView *view, gpointer data); static void onRenderingMethodChanged(VisuGlExtNodes *nodes, VisuRendering *method, VisuObject *obj); G_DEFINE_TYPE(VisuGlExtNodes, visu_gl_ext_nodes, VISU_TYPE_GL_EXT) static void visu_gl_ext_nodes_class_init(VisuGlExtNodesClass *klass) { DBG_fprintf(stderr, "Extension Nodes: creating the class of the object.\n"); /* DBG_fprintf(stderr, " - adding new signals ;\n"); */ /* Connect the overloading methods. */ G_OBJECT_CLASS(klass)->dispose = visu_gl_ext_nodes_dispose; G_OBJECT_CLASS(klass)->finalize = visu_gl_ext_nodes_finalize; VISU_GL_EXT_CLASS(klass)->rebuild = visu_gl_ext_nodes_rebuild; g_type_class_add_private(klass, sizeof(VisuGlExtNodesPrivate)); } static void visu_gl_ext_nodes_init(VisuGlExtNodes *obj) { VisuGlExt *ext; DBG_fprintf(stderr, "Extension Nodes: initializing a new object (%p).\n", (gpointer)obj); obj->priv = G_TYPE_INSTANCE_GET_PRIVATE(obj, VISU_TYPE_GL_EXT_NODES, VisuGlExtNodesPrivate); obj->priv->dispose_has_run = FALSE; /* Private data. */ obj->priv->effect = VISU_GL_EXT_NODES_NO_EFFECT; obj->priv->glIds = g_array_new(FALSE, FALSE, sizeof(GlIds)); obj->priv->nEle = 0; obj->priv->method = (VisuRendering*)0; obj->priv->view = (VisuGlView*)0; obj->priv->dataObj = (VisuData*)0; obj->priv->popId = 0; obj->priv->posId = 0; obj->priv->popIncId = 0; obj->priv->popDecId = 0; obj->priv->visId = 0; obj->priv->renId = 0; obj->priv->eleId = 0; obj->priv->precId = 0; /* Parent data. */ ext = VISU_GL_EXT(obj); visu_gl_ext_setPriority(ext, VISU_GL_EXT_PRIORITY_NODES); visu_gl_ext_setSensitiveToRenderingMode(ext, TRUE); visu_gl_ext_nodes_setRendering(obj, visu_object_getRendering(VISU_OBJECT_INSTANCE)); g_signal_connect_object(VISU_OBJECT_INSTANCE, "renderingChanged", G_CALLBACK(onRenderingMethodChanged), (gpointer)obj, G_CONNECT_SWAPPED | G_CONNECT_AFTER); } /* This method can be called several times. It should unref all of its reference to GObjects. */ static void visu_gl_ext_nodes_dispose(GObject* obj) { VisuGlExtNodes *nodes; DBG_fprintf(stderr, "Extension Nodes: dispose object %p.\n", (gpointer)obj); nodes = VISU_GL_EXT_NODES(obj); if (nodes->priv->dispose_has_run) return; nodes->priv->dispose_has_run = TRUE; visu_gl_ext_nodes_setData(nodes, (VisuGlView*)0, (VisuData*)0); visu_gl_ext_nodes_setRendering(nodes, (VisuRendering*)0); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_gl_ext_nodes_parent_class)->dispose(obj); } /* This method is called once only. */ static void visu_gl_ext_nodes_finalize(GObject* obj) { VisuGlExtNodesPrivate *nodes; g_return_if_fail(obj); DBG_fprintf(stderr, "Extension Nodes: finalize object %p.\n", (gpointer)obj); nodes = VISU_GL_EXT_NODES(obj)->priv; /* Free privs elements. */ DBG_fprintf(stderr, "Extension Nodes: free private nodes.\n"); g_array_free(nodes->glIds, TRUE); /* Chain up to the parent class */ DBG_fprintf(stderr, "Extension Nodes: chain to parent.\n"); G_OBJECT_CLASS(visu_gl_ext_nodes_parent_class)->finalize(obj); DBG_fprintf(stderr, "Extension Nodes: freeing ... OK.\n"); } /** * visu_gl_ext_nodes_new: * * Creates a new #VisuGlExt to draw a set of nodes. It can be used * also for picking, see visu_gl_ext_nodes_getSelection(). * * Since: 3.7 * * Returns: a pointer to the VisuGlExt it created or * NULL otherwise. */ VisuGlExtNodes* visu_gl_ext_nodes_new() { char *name = VISU_GL_EXT_NODES_ID; char *description = _("Draw all the nodes."); VisuGlExtNodes *extensionNodes; DBG_fprintf(stderr,"Extension Nodes: new object.\n"); extensionNodes = VISU_GL_EXT_NODES(g_object_new(VISU_TYPE_GL_EXT_NODES, "name", name, "label", _(name), "description", description, "nGlObj", 1, NULL)); return extensionNodes; } static void visu_gl_ext_nodes_rebuild(VisuGlExt *ext) { VisuGlExtNodes *extNodes; VisuNodeArray *nodes; VisuNodeArrayIter iter; extNodes = VISU_GL_EXT_NODES(ext); DBG_fprintf(stderr, "Extension Nodes: rebuilding object list for visuData %p.\n", (gpointer)extNodes->priv->dataObj); if (!extNodes->priv->dataObj || !extNodes->priv->method) glDeleteLists(visu_gl_ext_getGlList(ext), 1); else { nodes = VISU_NODE_ARRAY(extNodes->priv->dataObj); visu_node_array_iterNew(nodes, &iter); for (visu_node_array_iterStart(nodes, &iter); iter.element; visu_node_array_iterNextElement(nodes, &iter)) visu_element_createMaterial(iter.element); createGlLists(extNodes, visu_node_array_getNElements(nodes, FALSE)); createAllElements(extNodes); createAllNodes(extNodes); } } /** * createAllElements: * @data: a #VisuData object. * @view: a #VisuGlView object. * * This method will call the visu_rendering_createElement() method of the * current #RenderingMethod on all the elements of the given #VisuData. */ static void createAllElements(VisuGlExtNodes *ext) { VisuNodeArray *array; VisuNodeArrayIter iter; GlIds *ids; g_return_if_fail(VISU_IS_GL_EXT_NODES(ext)); array = VISU_NODE_ARRAY(ext->priv->dataObj); DBG_fprintf(stderr, "Extension Nodes: create OpenGl elements for" " all VisuElement used in given VisuNodeArray %p.\n", (gpointer)array); visu_node_array_iterNew(array, &iter); g_return_if_fail(ext->priv->glIds->len >= iter.nElements); for (visu_node_array_iterStart(array, &iter); iter.element; visu_node_array_iterNextElement(array, &iter)) { ids = ((GlIds*)ext->priv->glIds->data) + iter.iElement; compileElementMaterial(ext, ids->material, iter.element); compileElement(ext, ids->element, iter.element); } DBG_fprintf(stderr, "Extension Nodes: creation done for all elements.\n"); } /** * createAllNodes: * @data: a #VisuData object. * * This create the glObjectList registered that contains all the * nodes. This glObjectList is made of all nodes of all element whose * attribute rendered is TRUE and translated to their own positions. */ static void createAllNodes(VisuGlExtNodes *ext) { VisuNodeArrayIter iter; guint i; #if DEBUG == 1 GTimer *timer; gulong fractionTimer; #endif g_return_if_fail(VISU_IS_GL_EXT_NODES(ext)); DBG_fprintf(stderr, "##### All node creation #####\n"); DBG_fprintf(stderr, "Extension Nodes: 'createAllNodes' called.\n"); #if DEBUG == 1 timer = g_timer_new(); g_timer_start(timer); #endif visu_node_array_iterNew(VISU_NODE_ARRAY(ext->priv->dataObj), &iter); DBG_fprintf(stderr, "Extension Nodes: loop on elements.\n"); for (visu_node_array_iterStart(VISU_NODE_ARRAY(ext->priv->dataObj), &iter); iter.element; visu_node_array_iterNextElement(VISU_NODE_ARRAY(ext->priv->dataObj), &iter)) createNodes(ext, iter.element); DBG_fprintf(stderr, "Extension Nodes: OK.\n"); glNewList(visu_gl_ext_getGlList(VISU_GL_EXT(ext)), GL_COMPILE); glLineWidth(1); DBG_fprintf(stderr, "Extension Nodes: create nodes for %d elements.\n", ext->priv->nEle); for (i = 0; i < ext->priv->nEle; i++) glCallList(g_array_index(ext->priv->glIds, GlIds, i).nodes); glEndList(); #if DEBUG == 1 g_timer_stop(timer); fprintf(stderr, "Extension Nodes: lists built in %g micro-s.\n", g_timer_elapsed(timer, &fractionTimer)/1e-6); g_timer_destroy(timer); #endif } static void compileElementMaterial(VisuGlExtNodes *ext, GLuint displayList, VisuElement *ele) { GLuint id; float rgba[4], hsl[3], mat[VISU_GL_LIGHT_MATERIAL_N_VALUES]; id = visu_element_getMaterialId(ele); glNewList(displayList, GL_COMPILE); if (ext->priv->effect == VISU_GL_EXT_NODES_FLATTEN || ext->priv->effect == VISU_GL_EXT_NODES_FLATTEN_DARK || ext->priv->effect == VISU_GL_EXT_NODES_FLATTEN_LIGHT) { switch (ext->priv->effect) { case (VISU_GL_EXT_NODES_FLATTEN_DARK): mat[VISU_GL_LIGHT_MATERIAL_AMB] = .2f; break; case (VISU_GL_EXT_NODES_FLATTEN): mat[VISU_GL_LIGHT_MATERIAL_AMB] = .75f; break; case (VISU_GL_EXT_NODES_FLATTEN_LIGHT): mat[VISU_GL_LIGHT_MATERIAL_AMB] = 1.f; break; default: break; } mat[VISU_GL_LIGHT_MATERIAL_DIF] = 0.f; mat[VISU_GL_LIGHT_MATERIAL_SHI] = 0.f; mat[VISU_GL_LIGHT_MATERIAL_SPE] = 0.f; mat[VISU_GL_LIGHT_MATERIAL_EMI] = 0.f; visu_gl_setColor(mat, ele->rgb); } else if (ext->priv->effect != VISU_GL_EXT_NODES_NO_EFFECT) { tool_color_convertRGBtoHSL(hsl, ele->rgb); switch (ext->priv->effect) { case (VISU_GL_EXT_NODES_DESATURATE): hsl[1] = 0.f; break; case (VISU_GL_EXT_NODES_SATURATE): hsl[1] = 1.f; break; case (VISU_GL_EXT_NODES_DARKEN): hsl[2] -= 0.2f; break; case (VISU_GL_EXT_NODES_LIGHTEN): hsl[2] += 0.2f; break; default: break; } tool_color_convertHSLtoRGB(rgba, hsl); rgba[3] = ele->rgb[3]; visu_gl_setColor(ele->material, rgba); } else glCallList(id); glEndList(); } static void compileElement(VisuGlExtNodes *ext, GLuint displayList, VisuElement *ele) { GLuint id; DBG_fprintf(stderr, "Extension Nodes: create element '%s' %p.\n", ele->name, (gpointer)ele); id = visu_rendering_createElement(ext->priv->method, ele, ext->priv->view); glNewList(displayList, GL_COMPILE); if (ext->priv->effect != VISU_GL_EXT_NODES_NO_EFFECT) glScalef(0.75f, 0.75f, 0.75f); glCallList(id); glEndList(); } static void callNode(VisuGlExtNodes *ext, VisuElement *ele, VisuNode *node, GLuint eleId) { visu_rendering_createNode(ext->priv->method, ext->priv->dataObj, node, ele, eleId); } /** * createNodes: * @data: a #VisuData object ; * @ele: a #VisuElement object. * * This creates the glObjectList that contains all the nodes of the given #VisuElement. */ static void createNodes(VisuGlExtNodes *ext, VisuElement *ele) { VisuNodeArrayIter iter; guint iElement; GlIds *ids; g_return_if_fail(VISU_IS_GL_EXT_NODES(ext) && VISU_IS_ELEMENT_TYPE(ele)); if (!ele->materialIsUpToDate) visu_element_createMaterial(ele); iElement = visu_node_array_getElementId(VISU_NODE_ARRAY(ext->priv->dataObj), ele); g_return_if_fail(iElement < ext->priv->glIds->len); DBG_fprintf(stderr, "Extension Nodes: create list of element '%s' (%d).\n", ele->name, iElement); ids = &g_array_index(ext->priv->glIds, GlIds, iElement); DBG_fprintf(stderr, " | list of nodes %d.\n", ids->nodes); glNewList(ids->nodes, GL_COMPILE); if (ele->rendered) { glCallList(ids->material); DBG_fprintf(stderr, "Extension Nodes: creating glObjectList of nodes for '%s' - %d.\n", ele->name, ids->material); visu_node_array_iterNew(VISU_NODE_ARRAY(ext->priv->dataObj), &iter); iter.element = ele; for(visu_node_array_iterRestartNode(VISU_NODE_ARRAY(ext->priv->dataObj), &iter); iter.node; visu_node_array_iterNextNode(VISU_NODE_ARRAY(ext->priv->dataObj), &iter)) if (iter.node->rendered) { glLoadName((GLuint)iter.node->number); callNode(ext, ele, iter.node, ids->element); } } else DBG_fprintf(stderr, "Extension Nodes: skipping glObjectList of nodes for '%s' - %d.\n", ele->name, ids->nodes); glEndList(); } static void createGlLists(VisuGlExtNodes *ext, guint nEle) { guint len; ext->priv->nEle = nEle; DBG_fprintf(stderr, "Extension Nodes: setup population at %d.\n", ext->priv->nEle); if (ext->priv->nEle > ext->priv->glIds->len) { DBG_fprintf(stderr, " | increase nodes gl ids (%d).\n", ext->priv->glIds->len); len = ext->priv->glIds->len; /* Change glIds size according to nEle. */ ext->priv->glIds = g_array_set_size(ext->priv->glIds, ext->priv->nEle); for (; len < ext->priv->nEle; len++) { ((GlIds*)ext->priv->glIds->data)[len].material = visu_gl_objectlist_new(1); ((GlIds*)ext->priv->glIds->data)[len].element = visu_gl_objectlist_new(1); ((GlIds*)ext->priv->glIds->data)[len].nodes = visu_gl_objectlist_new(1); } } } /** * visu_gl_ext_nodes_setRendering: * @nodes: a #VisuGlExtNodes object. * @method: (transfer full) (allow-none): a #VisuRendering method. * * Provide rendering method for nodes and elements. * * Since: 3.7 **/ void visu_gl_ext_nodes_setRendering(VisuGlExtNodes *nodes, VisuRendering *method) { g_return_if_fail(VISU_IS_GL_EXT_NODES(nodes)); if (nodes->priv->method) g_object_unref(nodes->priv->method); nodes->priv->method = method; if (method) g_object_ref(method); } /** * visu_gl_ext_nodes_setData: * @nodes: the #VisuGlExtNodes object that will render @dataObj nodes. * @view: the #VisuGlView to render to. * @dataObj: the nodes. * * This setup @nodes to render nodes of @dataObj on @view. Any changes * on @dataObj nodes will be automatically updated on the GL lists * representing the nodes. * * Since: 3.7 **/ void visu_gl_ext_nodes_setData(VisuGlExtNodes *nodes, VisuGlView *view, VisuData *dataObj) { g_return_if_fail(VISU_IS_GL_EXT_NODES(nodes)); if (nodes->priv->view) { g_signal_handler_disconnect(G_OBJECT(nodes->priv->view), nodes->priv->precId); g_object_unref(nodes->priv->view); } if (nodes->priv->dataObj) { g_signal_handler_disconnect(G_OBJECT(nodes->priv->dataObj), nodes->priv->eleId); g_signal_handler_disconnect(G_OBJECT(nodes->priv->dataObj), nodes->priv->popId); g_signal_handler_disconnect(G_OBJECT(nodes->priv->dataObj), nodes->priv->posId); g_signal_handler_disconnect(G_OBJECT(nodes->priv->dataObj), nodes->priv->popIncId); g_signal_handler_disconnect(G_OBJECT(nodes->priv->dataObj), nodes->priv->popDecId); g_signal_handler_disconnect(G_OBJECT(nodes->priv->dataObj), nodes->priv->visId); g_signal_handler_disconnect(G_OBJECT(nodes->priv->dataObj), nodes->priv->renId); g_object_unref(nodes->priv->dataObj); } if (dataObj && view) { g_object_ref(view); g_object_ref(dataObj); nodes->priv->view = view; nodes->priv->dataObj = dataObj; nodes->priv->eleId = g_signal_connect_after(G_OBJECT(dataObj), "ElementRenderingChanged", G_CALLBACK(onElementRenderingChanged), (gpointer)nodes); nodes->priv->popId = g_signal_connect(G_OBJECT(dataObj), "PopulationDefined", G_CALLBACK(onPopulationDefined), (gpointer)nodes); nodes->priv->posId = g_signal_connect_after(G_OBJECT(dataObj), "PositionChanged", G_CALLBACK(onPositionChanged), (gpointer)nodes); nodes->priv->popIncId = g_signal_connect_after(G_OBJECT(dataObj), "PopulationIncrease", G_CALLBACK(onPopulationChanged), (gpointer)nodes); nodes->priv->popDecId = g_signal_connect_after(G_OBJECT(dataObj), "PopulationDecrease", G_CALLBACK(onPopulationChanged), (gpointer)nodes); nodes->priv->visId = g_signal_connect_after(G_OBJECT(dataObj), "VisibilityChanged", G_CALLBACK(onVisibilityChanged), (gpointer)nodes); nodes->priv->renId = g_signal_connect_after(G_OBJECT(dataObj), "RenderingChanged", G_CALLBACK(onRenderingChanged), (gpointer)nodes); nodes->priv->precId = g_signal_connect(G_OBJECT(view), "DetailLevelChanged", G_CALLBACK(onPrecisionChanged), (gpointer)nodes); createGlLists(nodes, visu_node_array_getNElements(VISU_NODE_ARRAY(dataObj), FALSE)); } else { nodes->priv->eleId = 0; nodes->priv->popId = 0; nodes->priv->posId = 0; nodes->priv->popIncId = 0; nodes->priv->popDecId = 0; nodes->priv->visId = 0; nodes->priv->renId = 0; nodes->priv->precId = 0; nodes->priv->view = (VisuGlView*)0; nodes->priv->dataObj = (VisuData*)0; } } /** * visu_gl_ext_nodes_setMaterialEffect: * @nodes: a #VisuGlExtNodes object. * @effect: a #VisuGlExtNodesEffects id. * * Changes the effect applied on the color used to render #VisuElement. * * Since: 3.7 * * Returns: TRUE if the effect has been changed. **/ gboolean visu_gl_ext_nodes_setMaterialEffect(VisuGlExtNodes *nodes, VisuGlExtNodesEffects effect) { g_return_val_if_fail(VISU_IS_GL_EXT_NODES(nodes), FALSE); if (nodes->priv->effect == effect) return FALSE; nodes->priv->effect = effect; createAllElements(nodes); return TRUE; } /** * visu_gl_ext_nodes_getData: * @nodes: a #VisuGlExtNodes object. * * Retrieves the associated #VisuData of @nodes. * * Since: 3.7 * * Returns: (transfer none): a #VisuData object. **/ VisuData* visu_gl_ext_nodes_getData(VisuGlExtNodes *nodes) { g_return_val_if_fail(VISU_IS_GL_EXT_NODES(nodes), (VisuData*)0); return nodes->priv->dataObj; } /** * visu_gl_ext_nodes_draw: * @nodes: a #VisuGlExtNodes object. * * Create the OpenGL list that store nodes. * * Since: 3.7 **/ void visu_gl_ext_nodes_draw(VisuGlExtNodes *nodes) { g_return_if_fail(VISU_IS_GL_EXT_NODES(nodes)); /* Nothing to draw; */ if(!nodes->priv->dataObj || !nodes->priv->method || !visu_gl_ext_getActive(VISU_GL_EXT(nodes))) { glDeleteLists(visu_gl_ext_getGlList(VISU_GL_EXT(nodes)), 1); return; } createAllElements(nodes); createAllNodes(nodes); } /********************/ /* Signal handlers. */ /********************/ static void onRenderingMethodChanged(VisuGlExtNodes *nodes, VisuRendering *method, VisuObject *obj _U_) { visu_gl_ext_nodes_setRendering(nodes, method); visu_gl_ext_nodes_draw(nodes); } static void onPopulationDefined(VisuNodeArray *array _U_, guint nEle, gpointer data) { createGlLists(VISU_GL_EXT_NODES(data), nEle); } static void onPopulationChanged(VisuData *dataObj _U_, gint *ids _U_, gpointer data) { createAllNodes(VISU_GL_EXT_NODES(data)); } static void onPositionChanged(VisuData *dataObj _U_, VisuElement *ele, gpointer data) { VisuGlExtNodes *ext = VISU_GL_EXT_NODES(data); if (ele) createNodes(ext, ele); else createAllNodes(ext); } static void onVisibilityChanged(VisuData *dataObj _U_, gpointer data) { createAllNodes(VISU_GL_EXT_NODES(data)); } static void onRenderingChanged(VisuData *dataObj _U_, VisuElement *ele, gpointer data) { VisuGlExtNodes *ext = VISU_GL_EXT_NODES(data); if (ele) createNodes(ext, ele); else createAllNodes(ext); } static void onElementRenderingChanged(VisuData *dataObj _U_, VisuElement *ele, gpointer data) { VisuGlExtNodes *ext = VISU_GL_EXT_NODES(data); guint iElement; if (ele) { iElement = visu_node_array_getElementId(VISU_NODE_ARRAY(ext->priv->dataObj), ele); compileElementMaterial(ext, ((GlIds*)ext->priv->glIds->data)[iElement].material, ele); compileElement(ext, ((GlIds*)ext->priv->glIds->data)[iElement].element, ele); } else createAllElements(ext); } static void onPrecisionChanged(VisuGlView *view _U_, gpointer data) { createAllElements(VISU_GL_EXT_NODES(data)); } /****************/ /* OpenGL pick. */ /****************/ static int _getSelection(VisuGlExtNodes *ext, VisuGlView *view, GLfloat x0, GLfloat y0, GLfloat w, GLfloat h, GLuint *select_buf, GLsizei bufsize) { float centre[3]; GLint viewport[4] = {0, 0, 0, 0}; int hits; g_return_val_if_fail(VISU_IS_GL_EXT_NODES(ext), 0); DBG_fprintf(stderr, "Extension Nodes: get nodes in region %gx%g - %gx%g.\n", x0, x0, w, h); if ((w == 0) || (h == 0)) return 0; visu_box_getCentre(visu_boxed_getBox(VISU_BOXED(view)), centre); glSelectBuffer(bufsize, select_buf); hits = glRenderMode(GL_SELECT); glInitNames(); glPushName(-1); viewport[2] = view->window->width; viewport[3] = view->window->height; glNewList(10, GL_COMPILE); gluPickMatrix(x0 , y0, w, h, viewport); glEndList(); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glCallList(10); glFrustum(view->window->left, view->window->right, view->window->bottom, view->window->top, view->window->near, view->window->far); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glTranslated(-centre[0], -centre[1], -centre[2]); glCallList(visu_gl_ext_getGlList(VISU_GL_EXT(ext))); glFlush(); hits = glRenderMode(GL_RENDER); DBG_fprintf(stderr, "%d elements are on the z buffer %gx%g - %gx%g.\n", hits, x0, y0, w, h); /* return the buffer to normal */ glPopMatrix(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); return hits; } /** * visu_gl_ext_nodes_getSelectionByRegion: * @ext: a #VisuGlExtNodes object; * @view: a #VisuGlView object; * @x1: a window coordinate; * @y1: a window coordinate; * @x2: a window coordinate; * @y2: a window coordinate. * * Get the #VisuNode ids in the picked region defined by (x1, y1) - * (x2, y2). * * Since: 3.7 * * Returns: (transfer full) (element-type guint): an empty list if no * node found, or a newly created list of ids if any. **/ GList* visu_gl_ext_nodes_getSelectionByRegion(VisuGlExtNodes *ext, VisuGlView *view, int x1, int y1, int x2, int y2) { GList *lst; int i, hits, ptr, names; GLuint *select_buf; GLsizei bufsize; g_return_val_if_fail(VISU_IS_GL_EXT_NODES(ext) && ext->priv->dataObj, (GList*)0); bufsize = visu_node_array_getNNodes(VISU_NODE_ARRAY(ext->priv->dataObj)) * 4; select_buf = g_malloc(sizeof(GLuint) * bufsize); hits = _getSelection(ext, view, 0.5f * (x1 + x2), (float)view->window->height - 0.5f * (y1 + y2), (float)ABS(x2 - x1), (float)ABS(y2 - y1), select_buf, bufsize); lst = (GList*)0; ptr = 0; for(i = 0; i < hits; i++) { names = select_buf[ptr]; if (names != 1) { g_warning("OpenGL picking is not working???\n"); return (GList*)0; } ptr += 3; lst = g_list_prepend(lst, GINT_TO_POINTER((int)select_buf[ptr])); ptr += 1; } g_free(select_buf); return lst; } /** * visu_gl_ext_nodes_getSelection: * @ext: a #VisuGlExtNodes object; * @view: a #VisuGlView object; * @x: a window coordinate; * @y: a window coordinate. * * Get the id of a #VisuNode on top of the z-buffer. * * Since: 3.7 * * Returns: -1 if no node found, or its id. **/ int visu_gl_ext_nodes_getSelection(VisuGlExtNodes *ext, VisuGlView *view, int x, int y) { int i, hits, ptr, names, number; GLuint *select_buf; GLsizei bufsize; unsigned int z1; unsigned int z1_sauve = UINT_MAX; g_return_val_if_fail(VISU_IS_GL_EXT_NODES(ext) && ext->priv->dataObj, -1); bufsize = visu_node_array_getNNodes(VISU_NODE_ARRAY(ext->priv->dataObj)) * 4; select_buf = g_malloc(sizeof(GLuint) * bufsize); hits = _getSelection(ext, view, x, (float)view->window->height - y, 2.f, 2.f, select_buf, bufsize); ptr = 0; number = -1; for(i = 0; i < hits; i++) { names = select_buf[ptr]; if (names != 1) { g_warning("OpenGL picking is not working???\n"); return -1; } ptr = ptr + 1; z1 = select_buf[ptr]; DBG_fprintf(stderr, " | z position %f for %d\n", (float)z1/0x7fffffff, (int)select_buf[ptr + 2]); ptr = ptr + 2; if (z1 < z1_sauve) { z1_sauve = z1; number = (int)select_buf[ptr]; } ptr = ptr + 1; } return number; } v_sim-3.7.0/src/extensions/nodes.h0000644000353400050620000001260012215546077014040 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2013-2013) Adresse mèl : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2013-2013) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef NODES_H #define NODES_H #include #include #include #include G_BEGIN_DECLS /** * VisuGlExtNodesEffects: * @VISU_GL_EXT_NODES_NO_EFFECT: no effect (apply pristine element * color and material). * @VISU_GL_EXT_NODES_DESATURATE: desaturate colour. * @VISU_GL_EXT_NODES_SATURATE: saturate colour. * @VISU_GL_EXT_NODES_DARKEN: darken colour. * @VISU_GL_EXT_NODES_LIGHTEN: lighten colour. * @VISU_GL_EXT_NODES_FLATTEN_DARK: render darker without light efect. * @VISU_GL_EXT_NODES_FLATTEN: render without light efect. * @VISU_GL_EXT_NODES_FLATTEN_LIGHT: render lighter without light efect. * * The rendering done by #VisuGlExtNodes can alter the color and * material of rendered nodes. * * Since: 3.7 */ typedef enum { VISU_GL_EXT_NODES_NO_EFFECT, VISU_GL_EXT_NODES_DESATURATE, VISU_GL_EXT_NODES_SATURATE, VISU_GL_EXT_NODES_DARKEN, VISU_GL_EXT_NODES_LIGHTEN, VISU_GL_EXT_NODES_FLATTEN_DARK, VISU_GL_EXT_NODES_FLATTEN, VISU_GL_EXT_NODES_FLATTEN_LIGHT } VisuGlExtNodesEffects; /** * VISU_TYPE_GL_EXT_NODES: * * return the type of #VisuGlExtNodes. * * Since: 3.7 */ #define VISU_TYPE_GL_EXT_NODES (visu_gl_ext_nodes_get_type ()) /** * VISU_GL_EXT_NODES: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuGlExtNodes type. * * Since: 3.7 */ #define VISU_GL_EXT_NODES(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_GL_EXT_NODES, VisuGlExtNodes)) /** * VISU_GL_EXT_NODES_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuGlExtNodesClass. * * Since: 3.7 */ #define VISU_GL_EXT_NODES_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_GL_EXT_NODES, VisuGlExtNodesClass)) /** * VISU_IS_GL_EXT_NODES: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuGlExtNodes object. * * Since: 3.7 */ #define VISU_IS_GL_EXT_NODES(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_GL_EXT_NODES)) /** * VISU_IS_GL_EXT_NODES_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuGlExtNodesClass class. * * Since: 3.7 */ #define VISU_IS_GL_EXT_NODES_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_GL_EXT_NODES)) /** * VISU_GL_EXT_NODES_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. * * Since: 3.7 */ #define VISU_GL_EXT_NODES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_GL_EXT_NODES, VisuGlExtNodesClass)) typedef struct _VisuGlExtNodes VisuGlExtNodes; typedef struct _VisuGlExtNodesPrivate VisuGlExtNodesPrivate; typedef struct _VisuGlExtNodesClass VisuGlExtNodesClass; struct _VisuGlExtNodes { VisuGlExt parent; VisuGlExtNodesPrivate *priv; }; struct _VisuGlExtNodesClass { VisuGlExtClass parent; }; /** * visu_gl_ext_nodes_get_type: * * This method returns the type of #VisuGlExtNodes, use * VISU_TYPE_GL_EXT_NODES instead. * * Since: 3.7 * * Returns: the type of #VisuGlExtNodes. */ GType visu_gl_ext_nodes_get_type(void); VisuGlExtNodes* visu_gl_ext_nodes_new(); void visu_gl_ext_nodes_setData(VisuGlExtNodes *nodes, VisuGlView *view, VisuData *dataObj); void visu_gl_ext_nodes_setRendering(VisuGlExtNodes *nodes, VisuRendering *method); gboolean visu_gl_ext_nodes_setMaterialEffect(VisuGlExtNodes *nodes, VisuGlExtNodesEffects effect); void visu_gl_ext_nodes_draw(VisuGlExtNodes *nodes); VisuData* visu_gl_ext_nodes_getData(VisuGlExtNodes *nodes); GList* visu_gl_ext_nodes_getSelectionByRegion(VisuGlExtNodes *ext, VisuGlView *view, int x1, int y1, int x2, int y2); int visu_gl_ext_nodes_getSelection(VisuGlExtNodes *ext, VisuGlView *view, int x, int y); G_END_DECLS #endif v_sim-3.7.0/src/extensions/box.c0000644000353400050620000013251012215546077013516 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "box.h" #include #include #include #include #include #include #include #include #include #include #include #include #include /** * SECTION:box legend * @short_description: Draw a legend describing the box. * * This extension allows V_Sim to draw a small box with box * information like the box size. */ /* A resource to control the position to render the box lengths. */ #define FLAG_RESOURCE_LEGEND_POSITION "box_legend_position" #define DESC_RESOURCE_LEGEND_POSITION "Position of the legend area for the box ; two floating point values (0. <= v <= 1.)" static float POSITION_DEFAULT[2] = {.5f, 0.f}; /* A resource to control if the box lengths are printed. */ #define FLAG_RESOURCE_BOX_LENGTHS "box_show_lengths" #define DESC_RESOURCE_BOX_LENGTHS "Print the box lengths ; boolean (0 or 1)" static gboolean WITH_LENGTHS_DEFAULT = FALSE; static void exportResourcesBoxLegend(GString *data, VisuData *dataObj, VisuGlView *view); /** * VisuGlExtBoxLegendClass: * @parent: the parent class; * * A short way to identify #_VisuGlExtBoxLegendClass structure. * * Since: 3.7 */ /** * VisuGlExtBoxLegend: * * An opaque structure. * * Since: 3.7 */ /** * VisuGlExtBoxLegendPrivate: * * Private fields for #VisuGlExtBoxLegend objects. * * Since: 3.7 */ struct _VisuGlExtBoxLegendPrivate { gboolean dispose_has_run; /* Box definition. */ VisuBox *box; gulong box_signal; }; static VisuGlExtBoxLegend* defaultBoxLegend; static void visu_gl_ext_box_legend_finalize(GObject* obj); static void visu_gl_ext_box_legend_dispose(GObject* obj); static void visu_gl_ext_box_legend_rebuild(VisuGlExt *ext); static void visu_gl_ext_box_legend_draw(VisuGlExtFrame *frame); /* Callbacks. */ static void onBoxSizeChanged(VisuBox *box, gfloat extens, gpointer user_data); static void onEntryLgUsed(VisuGlExtBoxLegend *lg, gchar *key, VisuObject *obj); static void onEntryLgPosition(VisuGlExtBoxLegend *lg, gchar *key, VisuObject *obj); G_DEFINE_TYPE(VisuGlExtBoxLegend, visu_gl_ext_box_legend, VISU_TYPE_GL_EXT_FRAME) static void visu_gl_ext_box_legend_class_init(VisuGlExtBoxLegendClass *klass) { float rgPos[2] = {0.f, 1.f}; VisuConfigFileEntry *resourceEntry; DBG_fprintf(stderr, "Extension Box: creating the class of the object (legend).\n"); /* DBG_fprintf(stderr, " - adding new signals ;\n"); */ DBG_fprintf(stderr, " - adding new resources ;\n"); resourceEntry = visu_config_file_addBooleanEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_BOX_LENGTHS, DESC_RESOURCE_BOX_LENGTHS, &WITH_LENGTHS_DEFAULT); visu_config_file_entry_setVersion(resourceEntry, 3.6f); resourceEntry = visu_config_file_addFloatArrayEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_LEGEND_POSITION, DESC_RESOURCE_LEGEND_POSITION, 2, POSITION_DEFAULT, rgPos); visu_config_file_entry_setVersion(resourceEntry, 3.7f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_RESOURCE, exportResourcesBoxLegend); defaultBoxLegend = (VisuGlExtBoxLegend*)0; /* Connect the overloading methods. */ G_OBJECT_CLASS(klass)->dispose = visu_gl_ext_box_legend_dispose; G_OBJECT_CLASS(klass)->finalize = visu_gl_ext_box_legend_finalize; VISU_GL_EXT_CLASS(klass)->rebuild = visu_gl_ext_box_legend_rebuild; VISU_GL_EXT_FRAME_CLASS(klass)->draw = visu_gl_ext_box_legend_draw; } static void visu_gl_ext_box_legend_init(VisuGlExtBoxLegend *obj) { DBG_fprintf(stderr, "Extension Box: initializing a new legend object (%p).\n", (gpointer)obj); obj->priv = g_malloc(sizeof(VisuGlExtBoxLegendPrivate)); obj->priv->dispose_has_run = FALSE; /* Private data. */ obj->priv->box = (VisuBox*)0; obj->priv->box_signal = 0; g_signal_connect_object(VISU_OBJECT_INSTANCE, "entryParsed::" FLAG_RESOURCE_BOX_LENGTHS, G_CALLBACK(onEntryLgUsed), (gpointer)obj, G_CONNECT_SWAPPED); g_signal_connect_object(VISU_OBJECT_INSTANCE, "entryParsed::" FLAG_RESOURCE_LEGEND_POSITION, G_CALLBACK(onEntryLgPosition), (gpointer)obj, G_CONNECT_SWAPPED); } static void visu_gl_ext_box_legend_dispose(GObject* obj) { VisuGlExtBoxLegend *legend; DBG_fprintf(stderr, "Extension Box: dispose legend object %p.\n", (gpointer)obj); legend = VISU_GL_EXT_BOX_LEGEND(obj); if (legend->priv->dispose_has_run) return; legend->priv->dispose_has_run = TRUE; /* Disconnect signals. */ visu_gl_ext_box_legend_setBox(legend, (VisuBox*)0); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_gl_ext_box_legend_parent_class)->dispose(obj); } /* This method is called once only. */ static void visu_gl_ext_box_legend_finalize(GObject* obj) { VisuGlExtBoxLegend *legend; g_return_if_fail(obj); DBG_fprintf(stderr, "Extension Box: finalize legend object %p.\n", (gpointer)obj); legend = VISU_GL_EXT_BOX_LEGEND(obj); /* Free privs elements. */ if (legend->priv) { DBG_fprintf(stderr, "Extension Box: free private box.\n"); g_free(legend->priv); } /* The free is called by g_type_free_instance... */ /* g_free(box); */ /* Chain up to the parent class */ DBG_fprintf(stderr, "Extension Box: chain to parent.\n"); G_OBJECT_CLASS(visu_gl_ext_box_legend_parent_class)->finalize(obj); DBG_fprintf(stderr, "Extension Box: freeing ... OK.\n"); } /** * visu_gl_ext_box_legend_new: * @name: (allow-none): the name to give to the extension. * * Creates a new #VisuGlExt to draw a legend with the box size. * * Since: 3.7 * * Returns: a pointer to the #VisuGlExt it created or * NULL otherwise. */ VisuGlExtBoxLegend* visu_gl_ext_box_legend_new(const gchar *name) { char *name_ = VISU_GL_EXT_BOX_LEGEND_ID; char *description = _("Draw informations related to the box."); VisuGlExt *extensionBox; #define BOX_WIDTH 100 #define BOX_HEIGHT 55 DBG_fprintf(stderr,"Extension Box: new legend object.\n"); extensionBox = VISU_GL_EXT(g_object_new(VISU_TYPE_GL_EXT_BOX_LEGEND, "name", (name)?name:name_, "label", _(name), "description", description, "nGlObj", 1, NULL)); visu_gl_ext_setPriority(extensionBox, VISU_GL_EXT_PRIORITY_LAST); visu_gl_ext_setSaveState(extensionBox, TRUE); visu_gl_ext_frame_setTitle(VISU_GL_EXT_FRAME(extensionBox), _("Box lengths")); visu_gl_ext_frame_setPosition(VISU_GL_EXT_FRAME(extensionBox), POSITION_DEFAULT[0], POSITION_DEFAULT[1]); visu_gl_ext_frame_setRequisition(VISU_GL_EXT_FRAME(extensionBox), BOX_WIDTH, BOX_HEIGHT); return VISU_GL_EXT_BOX_LEGEND(extensionBox); } /** * visu_gl_ext_box_legend_setBox: * @legend: The #VisuGlExtBoxLegend to attached to. * @boxObj: the box to get the size of. * * Attach an #VisuGlView to render to and setup the box to get the * size of also. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_frame_draw() should be called and * then 'OpenGLAskForReDraw' signal be emitted. **/ gboolean visu_gl_ext_box_legend_setBox(VisuGlExtBoxLegend *legend, VisuBox *boxObj) { g_return_val_if_fail(VISU_IS_GL_EXT_BOX_LEGEND(legend), FALSE); if (legend->priv->box) { g_signal_handler_disconnect(G_OBJECT(legend->priv->box), legend->priv->box_signal); g_object_unref(legend->priv->box); } if (boxObj) { g_object_ref(boxObj); legend->priv->box_signal = g_signal_connect(G_OBJECT(boxObj), "SizeChanged", G_CALLBACK(onBoxSizeChanged), (gpointer)legend); } else legend->priv->box_signal = 0; legend->priv->box = boxObj; VISU_GL_EXT_FRAME(legend)->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(legend)); } /** * visu_gl_ext_box_legend_getDefault: * * V_Sim is using a default box object. * * Since: 3.7 * * Returns: (transfer none): a #VisuGlExtBoxLegend object used by default. **/ VisuGlExtBoxLegend* visu_gl_ext_box_legend_getDefault() { if (!defaultBoxLegend) { defaultBoxLegend = visu_gl_ext_box_legend_new((gchar*)0); visu_gl_ext_setActive(VISU_GL_EXT(defaultBoxLegend), WITH_LENGTHS_DEFAULT); } return defaultBoxLegend; } /****************/ /* Private part */ /****************/ static void visu_gl_ext_box_legend_rebuild(VisuGlExt *ext) { visu_gl_text_rebuildFontList(); /* Force redraw. */ VISU_GL_EXT_FRAME(ext)->isBuilt = FALSE; visu_gl_ext_frame_draw(VISU_GL_EXT_FRAME(ext)); } static void onBoxSizeChanged(VisuBox *boxObj _U_, gfloat extens _U_, gpointer user_data) { DBG_fprintf(stderr, "Extension Box: caught the 'SizeChanged' signal.\n"); VISU_GL_EXT_FRAME(user_data)->isBuilt = FALSE; visu_gl_ext_frame_draw(VISU_GL_EXT_FRAME(user_data)); } static void onEntryLgUsed(VisuGlExtBoxLegend *lg, gchar *key _U_, VisuObject *obj _U_) { visu_gl_ext_setActive(VISU_GL_EXT(lg), WITH_LENGTHS_DEFAULT); } static void onEntryLgPosition(VisuGlExtBoxLegend *lg, gchar *key _U_, VisuObject *obj _U_) { visu_gl_ext_frame_setPosition(VISU_GL_EXT_FRAME(lg), POSITION_DEFAULT[0], POSITION_DEFAULT[1]); } static void visu_gl_ext_box_legend_draw(VisuGlExtFrame *frame) { gchar strLg[64]; float vertices[8][3], box[3]; VisuGlExtBoxLegend *legend; g_return_if_fail(VISU_IS_GL_EXT_BOX_LEGEND(frame)); legend = VISU_GL_EXT_BOX_LEGEND(frame); /* Nothing to draw if no data is associated to the current rendering window. */ if (!legend->priv->box) return; visu_box_getVertices(legend->priv->box, vertices, FALSE); box[0] = sqrt((vertices[1][0] - vertices[0][0]) * (vertices[1][0] - vertices[0][0]) + (vertices[1][1] - vertices[0][1]) * (vertices[1][1] - vertices[0][1]) + (vertices[1][2] - vertices[0][2]) * (vertices[1][2] - vertices[0][2])); box[1] = sqrt((vertices[3][0] - vertices[0][0]) * (vertices[3][0] - vertices[0][0]) + (vertices[3][1] - vertices[0][1]) * (vertices[3][1] - vertices[0][1]) + (vertices[3][2] - vertices[0][2]) * (vertices[3][2] - vertices[0][2])); box[2] = sqrt((vertices[4][0] - vertices[0][0]) * (vertices[4][0] - vertices[0][0]) + (vertices[4][1] - vertices[0][1]) * (vertices[4][1] - vertices[0][1]) + (vertices[4][2] - vertices[0][2]) * (vertices[4][2] - vertices[0][2])); glColor3fv(frame->fontRGB); glRasterPos2f(0.f, frame->height * 2.f / 3.f); sprintf(strLg, " %s: %7.3f", "x", box[0]); visu_gl_text_drawChars(strLg, VISU_GL_TEXT_SMALL); glRasterPos2f(0.f, frame->height / 3.f); sprintf(strLg, " %s: %7.3f", "y", box[1]); visu_gl_text_drawChars(strLg, VISU_GL_TEXT_SMALL); glRasterPos2f(0.f, 0.f); sprintf(strLg, " %s: %7.3f", "z", box[2]); visu_gl_text_drawChars(strLg, VISU_GL_TEXT_SMALL); } /* Parameters & resources*/ /* Export function that is called by visu_module to write the values of resources to a file. */ static void exportResourcesBoxLegend(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { float xpos, ypos; if (!defaultBoxLegend) return; visu_config_file_exportComment(data, DESC_RESOURCE_BOX_LENGTHS); visu_config_file_exportEntry(data, FLAG_RESOURCE_BOX_LENGTHS, NULL, "%d", visu_gl_ext_getActive(VISU_GL_EXT(defaultBoxLegend))); visu_gl_ext_frame_getPosition(VISU_GL_EXT_FRAME(defaultBoxLegend), &xpos, &ypos); visu_config_file_exportComment(data, DESC_RESOURCE_LEGEND_POSITION); visu_config_file_exportEntry(data, FLAG_RESOURCE_LEGEND_POSITION, NULL, "%4.3f %4.3f", xpos, ypos); visu_config_file_exportComment(data, ""); } /** * SECTION:box * @short_description: Draw a bounding box around nodes. * * This extension allows V_Sim to draw a box around the * nodes. The box is defined in the #VisuBox structure and can be * retrieved with visu_box_getGeometry(). This box is not necessary * orthogonal. * It has several properties, namely, its colour, its line width * and its line pattern. It is represented in OpenGL with simple lines * and is affected by the antialiasing property. Defined resources: * * * box_is_on (boolean): controls if a box * is drawn around the rendering area (since 3.0). * * * box_color (RGB in [0;1]): defines the * color of the box(since 3.0). * * * box_line_width (integer in [1;10]): * defines the width of the lines of the box (since 3.0). * * * box_line_stipple (2 integers in * ]0;65535]): dot scheme detail for the lines of the box. The first * value is the pattern for the line of the main box and the second * is the pattern for the lines of the expanded areas (since 3.4). * * */ /* Parameters & resources*/ /* This is a boolean to control is the box is render or not. */ #define FLAG_RESOURCE_BOX_USED "box_is_on" #define DESC_RESOURCE_BOX_USED "Control if a box is drawn around the rendering area ; boolean (0 or 1)" static gboolean RESOURCE_BOX_USED_DEFAULT = FALSE; /* A resource to control the color used to render the lines of the box. */ #define FLAG_RESOURCE_BOX_COLOR "box_color" #define DESC_RESOURCE_BOX_COLOR "Define the color of the box ; three floating point values (0. <= v <= 1.)" static float rgbDefault[3] = {1.0, 0.5, 0.1}; /* A resource to control the width to render the lines of the box. */ #define FLAG_RESOURCE_BOX_LINE "box_line_width" #define DESC_RESOURCE_BOX_LINE "Define the width of the lines of the box ; one integer (1. <= v <= 10.)" static float LINE_WIDTH_DEFAULT = 1.; /* A resource to control the stipple to render the lines of the box. */ #define FLAG_RESOURCE_BOX_STIPPLE "box_line_stipple" #define DESC_RESOURCE_BOX_STIPPLE "Dot scheme detail for the lines of the box (main and expanded) ; 0 < 2 integers < 2^16" static guint16 BOX_STIPLLE_DEFAULT = 65535; static guint16 EXPAND_STIPPLE_DEFAULT = 65280; static gboolean readBoxLineStipple(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static float sideRGBDefault[4] = {0.f, 0.f, 0.f, 0.3333f}; #define RESOURCE_WITH_BASIS_DEFAULT FALSE /* static gboolean withBasis = FALSE; */ static float basisLength = 2.5f; /* Export function that is called by visu_module to write the values of resources to a file. */ static void exportResourcesBox(GString *data, VisuData *dataObj, VisuGlView *view); /** * VisuGlExtBoxClass: * @parent: the parent class; * * A short way to identify #_VisuGlExtBoxClass structure. * * Since: 3.7 */ /** * VisuGlExtBox: * * An opaque structure. * * Since: 3.7 */ /** * VisuGlExtBoxPrivate: * * Private fields for #VisuGlExtBox objects. * * Since: 3.7 */ struct _VisuGlExtBoxPrivate { gboolean dispose_has_run; gboolean isBuilt; /* Box definition. */ VisuBox *box; gulong box_signal; /* Matrix definition (to be merge later within box. */ float origin[3]; float matrix[3][3]; /* Rendenring parameters. */ float rgb[3], sideRGB[4]; float lineWidth; guint16 lineStipple[2]; }; static VisuGlExtBox* defaultBox; static void visu_gl_ext_box_finalize(GObject* obj); static void visu_gl_ext_box_dispose(GObject* obj); static void visu_gl_ext_box_rebuild(VisuGlExt *ext); /* Callbacks. */ static void onSizeChanged(VisuBox *box, gfloat extens, gpointer user_data); static void onEntryUsed(VisuGlExtBox *box, gchar *key, VisuObject *obj); static void onEntryColor(VisuGlExtBox *box, gchar *key, VisuObject *obj); static void onEntryWidth(VisuGlExtBox *box, gchar *key, VisuObject *obj); static void onEntryStipple(VisuGlExtBox *box, gchar *key, VisuObject *obj); G_DEFINE_TYPE(VisuGlExtBox, visu_gl_ext_box, VISU_TYPE_GL_EXT) static void visu_gl_ext_box_class_init(VisuGlExtBoxClass *klass) { float rgColor[2] = {0.f, 1.f}; float rgWidth[2] = {0.f, 10.f}; VisuConfigFileEntry *resourceEntry; DBG_fprintf(stderr, "Extension Box: creating the class of the object.\n"); /* DBG_fprintf(stderr, " - adding new signals ;\n"); */ DBG_fprintf(stderr, " - adding new resources ;\n"); resourceEntry = visu_config_file_addBooleanEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_BOX_USED, DESC_RESOURCE_BOX_USED, &RESOURCE_BOX_USED_DEFAULT); resourceEntry = visu_config_file_addFloatArrayEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_BOX_COLOR, DESC_RESOURCE_BOX_COLOR, 3, rgbDefault, rgColor); resourceEntry = visu_config_file_addFloatArrayEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_BOX_LINE, DESC_RESOURCE_BOX_LINE, 1, &LINE_WIDTH_DEFAULT, rgWidth); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_BOX_STIPPLE, DESC_RESOURCE_BOX_STIPPLE, 1, readBoxLineStipple); visu_config_file_entry_setVersion(resourceEntry, 3.4f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_RESOURCE, exportResourcesBox); defaultBox = (VisuGlExtBox*)0; /* Connect the overloading methods. */ G_OBJECT_CLASS(klass)->dispose = visu_gl_ext_box_dispose; G_OBJECT_CLASS(klass)->finalize = visu_gl_ext_box_finalize; VISU_GL_EXT_CLASS(klass)->rebuild = visu_gl_ext_box_rebuild; } static void visu_gl_ext_box_init(VisuGlExtBox *obj) { DBG_fprintf(stderr, "Extension Box: initializing a new object (%p).\n", (gpointer)obj); obj->priv = g_malloc(sizeof(VisuGlExtBoxPrivate)); obj->priv->dispose_has_run = FALSE; /* Private data. */ obj->priv->isBuilt = FALSE; obj->priv->origin[0] = 0.f; obj->priv->origin[1] = 0.f; obj->priv->origin[2] = 0.f; tool_matrix_setIdentity(obj->priv->matrix); obj->priv->rgb[0] = rgbDefault[0]; obj->priv->rgb[1] = rgbDefault[1]; obj->priv->rgb[2] = rgbDefault[2]; obj->priv->sideRGB[0] = sideRGBDefault[0]; obj->priv->sideRGB[1] = sideRGBDefault[1]; obj->priv->sideRGB[2] = sideRGBDefault[2]; obj->priv->sideRGB[3] = sideRGBDefault[3]; obj->priv->lineWidth = LINE_WIDTH_DEFAULT; obj->priv->lineStipple[0] = BOX_STIPLLE_DEFAULT; obj->priv->lineStipple[1] = EXPAND_STIPPLE_DEFAULT; obj->priv->box = (VisuBox*)0; obj->priv->box_signal = 0; /* withBasis = RESOURCE_WITH_BASIS_DEFAULT; */ g_signal_connect_object(VISU_OBJECT_INSTANCE, "entryParsed::" FLAG_RESOURCE_BOX_USED, G_CALLBACK(onEntryUsed), (gpointer)obj, G_CONNECT_SWAPPED); g_signal_connect_object(VISU_OBJECT_INSTANCE, "entryParsed::" FLAG_RESOURCE_BOX_COLOR, G_CALLBACK(onEntryColor), (gpointer)obj, G_CONNECT_SWAPPED); g_signal_connect_object(VISU_OBJECT_INSTANCE, "entryParsed::" FLAG_RESOURCE_BOX_LINE, G_CALLBACK(onEntryWidth), (gpointer)obj, G_CONNECT_SWAPPED); g_signal_connect_object(VISU_OBJECT_INSTANCE, "entryParsed::" FLAG_RESOURCE_BOX_STIPPLE, G_CALLBACK(onEntryStipple), (gpointer)obj, G_CONNECT_SWAPPED); } /* This method can be called several times. It should unref all of its reference to GObjects. */ static void visu_gl_ext_box_dispose(GObject* obj) { VisuGlExtBox *box; DBG_fprintf(stderr, "Extension Box: dispose object %p.\n", (gpointer)obj); box = VISU_GL_EXT_BOX(obj); if (box->priv->dispose_has_run) return; box->priv->dispose_has_run = TRUE; /* Disconnect signals. */ visu_gl_ext_box_setBox(box, (VisuBox*)0); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_gl_ext_box_parent_class)->dispose(obj); } /* This method is called once only. */ static void visu_gl_ext_box_finalize(GObject* obj) { VisuGlExtBox *box; g_return_if_fail(obj); DBG_fprintf(stderr, "Extension Box: finalize object %p.\n", (gpointer)obj); box = VISU_GL_EXT_BOX(obj); /* Free privs elements. */ if (box->priv) { DBG_fprintf(stderr, "Extension Box: free private box.\n"); g_free(box->priv); } /* The free is called by g_type_free_instance... */ /* g_free(box); */ /* Chain up to the parent class */ DBG_fprintf(stderr, "Extension Box: chain to parent.\n"); G_OBJECT_CLASS(visu_gl_ext_box_parent_class)->finalize(obj); DBG_fprintf(stderr, "Extension Box: freeing ... OK.\n"); } /** * visu_gl_ext_box_new: * @name: (allow-none): the name to give to the extension (default is #VISU_GL_EXT_BOX_ID). * * Creates a new #VisuGlExt to draw a box. * * Since: 3.7 * * Returns: a pointer to the #VisuGlExt it created or * NULL otherwise. */ VisuGlExtBox* visu_gl_ext_box_new(const gchar *name) { char *name_ = VISU_GL_EXT_BOX_ID; char *description = _("Draw a box representing the limit of the area."); VisuGlExt *extensionBox; DBG_fprintf(stderr,"Extension Box: new object.\n"); extensionBox = VISU_GL_EXT(g_object_new(VISU_TYPE_GL_EXT_BOX, "name", (name)?name:name_, "label", _(name), "description", description, "nGlObj", 1, NULL)); visu_gl_ext_setPriority(extensionBox, VISU_GL_EXT_PRIORITY_LOW); return VISU_GL_EXT_BOX(extensionBox); } /** * visu_gl_ext_box_setBox: * @box: the #VisuGlExtBox object to attach to. * @boxObj: the box to get the definition of. * * Attach the #VisuBox to draw the frame of. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_box_draw() should be called. **/ gboolean visu_gl_ext_box_setBox(VisuGlExtBox *box, VisuBox *boxObj) { g_return_val_if_fail(VISU_IS_GL_EXT_BOX(box), FALSE); if (box->priv->box) { g_signal_handler_disconnect(G_OBJECT(box->priv->box), box->priv->box_signal); g_object_unref(box->priv->box); } if (boxObj) { g_object_ref(boxObj); box->priv->box_signal = g_signal_connect(G_OBJECT(boxObj), "SizeChanged", G_CALLBACK(onSizeChanged), (gpointer)box); } else box->priv->box_signal = 0; box->priv->box = boxObj; box->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(box)); } /** * visu_gl_ext_box_setBasis: * @box: the #VisuGlExtBox object to attach to. * @orig: (array fixed-size=3): the origin. * @mat: (array fixed-size=9): the basis-set. * * Define the box to draw with a simple matrix basis-set and an origin. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_box_draw() should be called. **/ gboolean visu_gl_ext_box_setBasis(VisuGlExtBox *box, float orig[3], float mat[3][3]) { g_return_val_if_fail(VISU_IS_GL_EXT_BOX(box), FALSE); visu_gl_ext_box_setBox(box, (VisuBox*)0); box->priv->origin[0] = orig[0]; box->priv->origin[1] = orig[1]; box->priv->origin[2] = orig[2]; memcpy(box->priv->matrix, mat, sizeof(float) * 9); box->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(box)); } /** * visu_gl_ext_box_setRGB: * @box: the #VisuGlExtBox to update. * @rgb: (array fixed-size=3): a three floats array with values (0 <= * values <= 1) for the red, the green and the blue color. Only values * specified by the mask are really relevant. * @mask: use #TOOL_COLOR_MASK_R, #TOOL_COLOR_MASK_G, #TOOL_COLOR_MASK_B, #TOOL_COLOR_MASK_RGBA or a * combinaison to indicate what values in the rgb array must be taken * into account. * * Method used to change the value of the parameter box_color. * * Returns: TRUE if visu_gl_ext_box_draw() should be called. */ gboolean visu_gl_ext_box_setRGB(VisuGlExtBox *box, float rgb[3], int mask) { gboolean diff = FALSE; g_return_val_if_fail(VISU_IS_GL_EXT_BOX(box), FALSE); if (mask & TOOL_COLOR_MASK_R && box->priv->rgb[0] != rgb[0]) { box->priv->rgb[0] = rgb[0]; diff = TRUE; } if (mask & TOOL_COLOR_MASK_G && box->priv->rgb[1] != rgb[1]) { box->priv->rgb[1] = rgb[1]; diff = TRUE; } if (mask & TOOL_COLOR_MASK_B && box->priv->rgb[2] != rgb[2]) { box->priv->rgb[2] = rgb[2]; diff = TRUE; } if (!diff) return FALSE; box->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(box)); } /** * visu_gl_ext_box_setSideRGB: * @box: the #VisuGlExtBox to update. * @rgba: (array fixed-size=4): a four floats array with values (0 <= values <= 1) for the * red, the green, the blue color and the alpha channel. Only values * specified by the mask are really relevant. * @mask: use #TOOL_COLOR_MASK_R, #TOOL_COLOR_MASK_G, * #TOOL_COLOR_MASK_B, #TOOL_COLOR_MASK_A or a combinaison to indicate * what values in the @rgba array must be taken into account. * * Change the colour to represent the side of the super-cell. A * channel alpha of zero, means that the box is rendered as wire-frame * only. The sides are indeed drawn only if the box has expansion. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_box_draw() should be called. */ gboolean visu_gl_ext_box_setSideRGB(VisuGlExtBox *box, float rgba[4], int mask) { gboolean diff = FALSE; g_return_val_if_fail(VISU_IS_GL_EXT_BOX(box), FALSE); if (mask & TOOL_COLOR_MASK_R && box->priv->sideRGB[0] != rgba[0]) { box->priv->sideRGB[0] = rgba[0]; diff = TRUE; } if (mask & TOOL_COLOR_MASK_G && box->priv->sideRGB[1] != rgba[1]) { box->priv->sideRGB[1] = rgba[1]; diff = TRUE; } if (mask & TOOL_COLOR_MASK_B && box->priv->sideRGB[2] != rgba[2]) { box->priv->sideRGB[2] = rgba[2]; diff = TRUE; } if (mask & TOOL_COLOR_MASK_A && box->priv->sideRGB[3] != rgba[3]) { box->priv->sideRGB[3] = rgba[3]; diff = TRUE; } if (!diff) return FALSE; box->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(box)); } /** * visu_gl_ext_box_setLineWidth: * @box: the #VisuGlExtBox to update. * @width: value of the desired box line width. * * Method used to change the value of the parameter box_line_width. * * Returns: TRUE if visu_gl_ext_box_draw() should be called. */ gboolean visu_gl_ext_box_setLineWidth(VisuGlExtBox *box, float width) { g_return_val_if_fail(VISU_IS_GL_EXT_BOX(box), FALSE); if (width < 1. || width > 10. || width == box->priv->lineWidth) return FALSE; box->priv->lineWidth = width; box->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(box)); } /** * visu_gl_ext_box_setLineStipple: * @box: the #VisuGlExtBox to update. * @stipple: a pattern for line stipple in OpenGL. * * Method used to change the value of the parameter box_line_stipple * (main part). * * Returns: TRUE if visu_gl_ext_box_draw() should be called. */ gboolean visu_gl_ext_box_setLineStipple(VisuGlExtBox *box, guint16 stipple) { g_return_val_if_fail(VISU_IS_GL_EXT_BOX(box), FALSE); if (stipple == box->priv->lineStipple[0]) return FALSE; box->priv->lineStipple[0] = stipple; box->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(box)); } /** * visu_gl_ext_box_setExpandStipple: * @box: the #VisuGlExtBox to update. * @stipple: a pattern for line stipple in OpenGL. * * Method used to change the value of the parameter box_line_stipple * (expanded part). * * Returns: TRUE if visu_gl_ext_box_draw() should be called. */ gboolean visu_gl_ext_box_setExpandStipple(VisuGlExtBox *box, guint16 stipple) { g_return_val_if_fail(VISU_IS_GL_EXT_BOX(box), FALSE); if (stipple == box->priv->lineStipple[1]) return FALSE; box->priv->lineStipple[1] = stipple; box->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(box)); } /** * visu_gl_ext_box_setOrigin: * @box: the #VisuGlExtBox to update. * @origin: (array fixed-size=3): the new origin in cartesian * coordinates. * * Change the origin of the drawn box. This should be used with care * since the OpenGL rendering area is not changed by moving the box, * some parts may become unrendered. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_box_draw() should be called. **/ gboolean visu_gl_ext_box_setOrigin(VisuGlExtBox *box, float origin[3]) { g_return_val_if_fail(VISU_IS_GL_EXT_BOX(box), FALSE); if (origin[0] == box->priv->origin[0] && origin[1] == box->priv->origin[1] && origin[2] == box->priv->origin[2]) return FALSE; box->priv->origin[0] = origin[0]; box->priv->origin[1] = origin[1]; box->priv->origin[2] = origin[2]; box->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(box)); } /* Get methods. */ /** * visu_gl_ext_box_getRGB: * @box: the #VisuGlExtBox to inquire. * * Read the colour components of box (in [0;1]). * * Returns: all the colour values of the current box line. */ float* visu_gl_ext_box_getRGB(VisuGlExtBox *box) { g_return_val_if_fail(VISU_IS_GL_EXT_BOX(box), rgbDefault); return box->priv->rgb; } /** * visu_gl_ext_box_getSideRGB: * @box: the #VisuGlExtBox to inquire. * * Read the colour components of the sides of the box (in [0;1]). * * Returns: all the colour values of the current box line. */ float* visu_gl_ext_box_getSideRGB(VisuGlExtBox *box) { g_return_val_if_fail(VISU_IS_GL_EXT_BOX(box), rgbDefault); return box->priv->sideRGB; } /** * visu_gl_ext_box_getLineWidth: * @box: the #VisuGlExtBox to inquire. * * Read the line width used for box. * * Returns: the value of current box line width. */ float visu_gl_ext_box_getLineWidth(VisuGlExtBox *box) { g_return_val_if_fail(VISU_IS_GL_EXT_BOX(box), LINE_WIDTH_DEFAULT); return box->priv->lineWidth; } /** * visu_gl_ext_box_getLineStipple: * @box: the #VisuGlExtBox to inquire. * * Read the line stipple pattern used for box (main part). * * Returns: the value of current box line pattern. */ guint16 visu_gl_ext_box_getLineStipple(VisuGlExtBox *box) { g_return_val_if_fail(VISU_IS_GL_EXT_BOX(box), BOX_STIPLLE_DEFAULT); return box->priv->lineStipple[0]; } /** * visu_gl_ext_box_getExpandStipple: * @box: the #VisuGlExtBox to inquire. * * Read the line stipple pattern used for box (expanded part). * * Returns: the value of current box line pattern. */ guint16 visu_gl_ext_box_getExpandStipple(VisuGlExtBox *box) { g_return_val_if_fail(VISU_IS_GL_EXT_BOX(box), EXPAND_STIPPLE_DEFAULT); return box->priv->lineStipple[1]; } /** * visu_gl_ext_box_getDefault: * * V_Sim is using a default box object. * * Since: 3.7 * * Returns: (transfer none): a #VisuGlExtBox object used by default. **/ VisuGlExtBox* visu_gl_ext_box_getDefault() { if (!defaultBox) { defaultBox = visu_gl_ext_box_new((gchar*)0); visu_gl_ext_setActive(VISU_GL_EXT(defaultBox), RESOURCE_BOX_USED_DEFAULT); } return defaultBox; } /****************/ /* Private part */ /****************/ static void visu_gl_ext_box_rebuild(VisuGlExt *ext) { VisuGlExtBox *box = VISU_GL_EXT_BOX(ext); /* Force redraw. */ box->priv->isBuilt = FALSE; visu_gl_ext_box_draw(box); } static void onSizeChanged(VisuBox *boxObj _U_, gfloat extens _U_, gpointer user_data) { VisuGlExtBox *box = VISU_GL_EXT_BOX(user_data); DBG_fprintf(stderr, "Extension Box: caught the 'SizeChanged' signal.\n"); box->priv->isBuilt = FALSE; visu_gl_ext_box_draw(box); } static void onEntryUsed(VisuGlExtBox *box, gchar *key _U_, VisuObject *obj _U_) { visu_gl_ext_setActive(VISU_GL_EXT(box), RESOURCE_BOX_USED_DEFAULT); } static void onEntryColor(VisuGlExtBox *box, gchar *key _U_, VisuObject *obj _U_) { visu_gl_ext_box_setRGB(box, rgbDefault, TOOL_COLOR_MASK_RGBA); } static void onEntryWidth(VisuGlExtBox *box, gchar *key _U_, VisuObject *obj _U_) { visu_gl_ext_box_setLineWidth(box, LINE_WIDTH_DEFAULT); } static void onEntryStipple(VisuGlExtBox *box, gchar *key _U_, VisuObject *obj _U_) { visu_gl_ext_box_setLineStipple(box, BOX_STIPLLE_DEFAULT); visu_gl_ext_box_setExpandStipple(box, EXPAND_STIPPLE_DEFAULT); } static void drawSides(float ext[3], float v[8][3], float rgba[4]) { glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDisable(GL_CULL_FACE); glColor4fv(rgba); if (ext[0] > 0.) { glBegin(GL_POLYGON); glVertex3fv(v[0]); glVertex3fv(v[3]); glVertex3fv(v[7]); glVertex3fv(v[4]); glEnd(); glBegin(GL_POLYGON); glVertex3fv(v[6]); glVertex3fv(v[5]); glVertex3fv(v[1]); glVertex3fv(v[2]); glEnd(); } if (ext[1] > 0.) { glBegin(GL_POLYGON); glVertex3fv(v[0]); glVertex3fv(v[1]); glVertex3fv(v[5]); glVertex3fv(v[4]); glEnd(); glBegin(GL_POLYGON); glVertex3fv(v[6]); glVertex3fv(v[7]); glVertex3fv(v[3]); glVertex3fv(v[2]); glEnd(); } if (ext[2] > 0.) { glBegin(GL_POLYGON); glVertex3fv(v[0]); glVertex3fv(v[1]); glVertex3fv(v[2]); glVertex3fv(v[3]); glEnd(); glBegin(GL_POLYGON); glVertex3fv(v[4]); glVertex3fv(v[5]); glVertex3fv(v[6]); glVertex3fv(v[7]); glEnd(); } glEnable(GL_CULL_FACE); glCullFace(GL_BACK); } /** * visu_gl_ext_box_draw: * @box: a #VisuBox object. * * This method create a compile list that draw a box for the given @box. */ void visu_gl_ext_box_draw(VisuGlExtBox *box) { int i, j, k; float v[8][3]; float ext[3], centre[3]; float material[5] = {.5f, .5f, .2f, .5f, .0f}; GLUquadricObj *obj; gchar strLg[64]; /* Nothing to draw; */ g_return_if_fail(VISU_IS_GL_EXT_BOX(box)); if(!visu_gl_ext_getActive(VISU_GL_EXT(box)) || box->priv->isBuilt) return; DBG_fprintf(stderr, "Extension box: creating box for" " VisuBox %p.\n", (gpointer)box->priv->box); if (box->priv->box) { visu_box_getVertices(box->priv->box, v, FALSE); visu_box_getExtension(box->priv->box, ext); } else { /* We build the vertex array. */ v[0][0] = 0.f; v[0][1] = 0.f; v[0][2] = 0.f; v[1][0] = box->priv->matrix[0][0]; v[1][1] = box->priv->matrix[1][0]; v[1][2] = box->priv->matrix[2][0]; v[2][0] = box->priv->matrix[0][0] + box->priv->matrix[0][1]; v[2][1] = box->priv->matrix[1][0] + box->priv->matrix[1][1]; v[2][2] = box->priv->matrix[2][0] + box->priv->matrix[2][1]; v[3][0] = box->priv->matrix[0][1]; v[3][1] = box->priv->matrix[1][1]; v[3][2] = box->priv->matrix[2][1]; v[4][0] = box->priv->matrix[0][2]; v[4][1] = box->priv->matrix[1][2]; v[4][2] = box->priv->matrix[2][2]; v[5][0] = box->priv->matrix[0][0] + box->priv->matrix[0][2]; v[5][1] = box->priv->matrix[1][0] + box->priv->matrix[1][2]; v[5][2] = box->priv->matrix[2][0] + box->priv->matrix[2][2]; v[6][0] = box->priv->matrix[0][0] + box->priv->matrix[0][1] + box->priv->matrix[0][2]; v[6][1] = box->priv->matrix[1][0] + box->priv->matrix[1][1] + box->priv->matrix[1][2]; v[6][2] = box->priv->matrix[2][0] + box->priv->matrix[2][1] + box->priv->matrix[2][2]; v[7][0] = box->priv->matrix[0][1] + box->priv->matrix[0][2]; v[7][1] = box->priv->matrix[1][1] + box->priv->matrix[1][2]; v[7][2] = box->priv->matrix[2][1] + box->priv->matrix[2][2]; ext[0] = 1.f; ext[1] = 1.f; ext[2] = 1.f; } glDeleteLists(visu_gl_ext_getGlList(VISU_GL_EXT(box)), 1); glNewList(visu_gl_ext_getGlList(VISU_GL_EXT(box)), GL_COMPILE); glDisable(GL_LIGHTING); glDisable(GL_DITHER); glLineWidth(box->priv->lineWidth); glTranslatef(box->priv->origin[0], box->priv->origin[1], box->priv->origin[2]); /* We draw sides of the box, if specified. */ if ((ext[0] > 0. || ext[1] > 0. || ext[2] > 0.) && box->priv->sideRGB[3] == 1.f) drawSides(ext, v, box->priv->sideRGB); /* Draw the basic lines. */ glColor3fv(box->priv->rgb); if (box->priv->lineStipple[0] != 65535) { glEnable(GL_LINE_STIPPLE); glLineStipple(1, box->priv->lineStipple[0]); } glBegin(GL_LINES); glVertex3fv(v[0]); glVertex3fv(v[1]); glVertex3fv(v[1]); glVertex3fv(v[2]); glVertex3fv(v[2]); glVertex3fv(v[3]); glVertex3fv(v[3]); glVertex3fv(v[0]); glVertex3fv(v[4]); glVertex3fv(v[5]); glVertex3fv(v[5]); glVertex3fv(v[6]); glVertex3fv(v[6]); glVertex3fv(v[7]); glVertex3fv(v[7]); glVertex3fv(v[4]); glVertex3fv(v[0]); glVertex3fv(v[4]); glVertex3fv(v[1]); glVertex3fv(v[5]); glVertex3fv(v[2]); glVertex3fv(v[6]); glVertex3fv(v[3]); glVertex3fv(v[7]); glEnd(); if (box->priv->lineStipple[0] != 65535) glDisable(GL_LINE_STIPPLE); /* Draw the extension lines. */ if (ext[0] > 0. || ext[1] > 0. || ext[2] > 0.) { glColor3fv(box->priv->rgb); /* We draw then the expansion lines. */ if (box->priv->lineStipple[1] != 65535) { glEnable(GL_LINE_STIPPLE); glLineStipple(1, box->priv->lineStipple[1]); } glBegin(GL_LINES); /* X coordinate. */ for (j = -(int)ext[1]; j < 2 + (int)ext[1]; j++) for (k = -(int)ext[2]; k < 2 + (int)ext[2]; k++) { glVertex3f(-ext[0] * v[1][0] + v[3][0] * j + v[4][0] * k, -ext[0] * v[1][1] + v[3][1] * j + v[4][1] * k, -ext[0] * v[1][2] + v[3][2] * j + v[4][2] * k); if ((j == 0 || j == 1) && (k == 0 || k == 1)) { glVertex3f(v[3][0] * j + v[4][0] * k, v[3][1] * j + v[4][1] * k, v[3][2] * j + v[4][2] * k); glVertex3f(v[1][0] + v[3][0] * j + v[4][0] * k, v[1][1] + v[3][1] * j + v[4][1] * k, v[1][2] + v[3][2] * j + v[4][2] * k); } glVertex3f((1. + ext[0]) * v[1][0] + v[3][0] * j + v[4][0] * k, (1. + ext[0]) * v[1][1] + v[3][1] * j + v[4][1] * k, (1. + ext[0]) * v[1][2] + v[3][2] * j + v[4][2] * k); } /* Y coordinate. */ for (i = -(int)ext[0]; i < 2 + (int)ext[0]; i++) for (k = -(int)ext[2]; k < 2 + (int)ext[2]; k++) { glVertex3f(-ext[1] * v[3][0] + v[1][0] * i + v[4][0] * k, -ext[1] * v[3][1] + v[1][1] * i + v[4][1] * k, -ext[1] * v[3][2] + v[1][2] * i + v[4][2] * k); if ((i == 0 || i == 1) && (k == 0 || k == 1)) { glVertex3f(v[1][0] * i + v[4][0] * k, v[1][1] * i + v[4][1] * k, v[1][2] * i + v[4][2] * k); glVertex3f(v[3][0] + v[1][0] * i + v[4][0] * k, v[3][1] + v[1][1] * i + v[4][1] * k, v[3][2] + v[1][2] * i + v[4][2] * k); } glVertex3f((1. + ext[1]) * v[3][0] + v[1][0] * i + v[4][0] * k, (1. + ext[1]) * v[3][1] + v[1][1] * i + v[4][1] * k, (1. + ext[1]) * v[3][2] + v[1][2] * i + v[4][2] * k); } /* Z coordinate. */ for (i = -(int)ext[0]; i < 2 + (int)ext[0]; i++) for (j = -(int)ext[1]; j < 2 + (int)ext[1]; j++) { glVertex3f(-ext[2] * v[4][0] + v[1][0] * i + v[3][0] * j, -ext[2] * v[4][1] + v[1][1] * i + v[3][1] * j, -ext[2] * v[4][2] + v[1][2] * i + v[3][2] * j); if ((j == 0 || j == 1) && (i == 0 || i == 1)) { glVertex3f(v[1][0] * i + v[3][0] * j, v[1][1] * i + v[3][1] * j, v[1][2] * i + v[3][2] * j); glVertex3f(v[4][0] + v[1][0] * i + v[3][0] * j, v[4][1] + v[1][1] * i + v[3][1] * j, v[4][2] + v[1][2] * i + v[3][2] * j); } glVertex3f((1. + ext[2]) * v[4][0] + v[1][0] * i + v[3][0] * j, (1. + ext[2]) * v[4][1] + v[1][1] * i + v[3][1] * j, (1. + ext[2]) * v[4][2] + v[1][2] * i + v[3][2] * j); } glEnd(); if (box->priv->lineStipple[1] != 65535) glDisable(GL_LINE_STIPPLE); } /* We draw sides of the box, if specified. */ if ((ext[0] > 0. || ext[1] > 0. || ext[2] > 0.) && box->priv->sideRGB[3] > 0.f && box->priv->sideRGB[3] < 1.f) drawSides(ext, v, box->priv->sideRGB); glEnable(GL_LIGHTING); glEnable(GL_DITHER); /* WARNING: it is the default! */ /* Draw the basis set if needed. */ if (FALSE) { visu_box_getCentre(box->priv->box, centre); obj = gluNewQuadric(); visu_gl_setHighlightColor(material, box->priv->rgb, 1.f); /* Draw the basis set. */ glPushMatrix(); glTranslated(0., 0., 0.); glRotated(90., 0, 1, 0); visu_gl_drawSmoothArrow(obj, -1, VISU_GL_ARROW_BOTTOM_CENTERED, basisLength - 0.3f, 0.1f, 10, FALSE, 0.3f, 0.2f, 10, FALSE); glRasterPos3f(0.0f, 0.0f, basisLength); sprintf(strLg, _("x: %7.3f"), centre[0]); visu_gl_text_drawChars(strLg, VISU_GL_TEXT_SMALL); glPopMatrix(); glPushMatrix(); glTranslated(0., 0., 0.); glRotated(-90., 1, 0, 0); visu_gl_drawSmoothArrow(obj, -1, VISU_GL_ARROW_BOTTOM_CENTERED, basisLength - 0.3f, 0.1f, 10, FALSE, 0.3f, 0.2f, 10, FALSE); glRasterPos3f(0.0f, 0.0f, basisLength); sprintf(strLg, _("y: %7.3f"), centre[1]); visu_gl_text_drawChars(strLg, VISU_GL_TEXT_SMALL); glPopMatrix(); glPushMatrix(); glTranslated(0., 0., 0.); visu_gl_drawSmoothArrow(obj, -1, VISU_GL_ARROW_BOTTOM_CENTERED, basisLength - 0.3f, 0.1f, 10, FALSE, 0.3f, 0.2f, 10, FALSE); glRasterPos3f(0.0f, 0.0f, basisLength); sprintf(strLg, _("z: %7.3f"), centre[2]); visu_gl_text_drawChars(strLg, VISU_GL_TEXT_SMALL); glPopMatrix(); gluDeleteQuadric(obj); } glLineWidth(1.); glEndList(); box->priv->isBuilt = TRUE; } /* Parameters & resources*/ /* This is a boolean to control is the box is render or not. */ static gboolean readBoxLineStipple(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { int stipple[2]; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readInteger(lines[0], position, stipple, 2, error)) return FALSE; BOX_STIPLLE_DEFAULT = (guint16)stipple[0]; EXPAND_STIPPLE_DEFAULT = (guint16)stipple[1]; return TRUE; } /* Export function that is called by visu_module to write the values of resources to a file. */ static void exportResourcesBox(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { if (!defaultBox) return; visu_config_file_exportComment(data, DESC_RESOURCE_BOX_USED); visu_config_file_exportEntry(data, FLAG_RESOURCE_BOX_USED, NULL, "%d", visu_gl_ext_getActive(VISU_GL_EXT(defaultBox))); visu_config_file_exportComment(data, DESC_RESOURCE_BOX_COLOR); visu_config_file_exportEntry(data, FLAG_RESOURCE_BOX_COLOR, NULL, "%4.3f %4.3f %4.3f", defaultBox->priv->rgb[0], defaultBox->priv->rgb[1], defaultBox->priv->rgb[2]); visu_config_file_exportComment(data, DESC_RESOURCE_BOX_LINE); visu_config_file_exportEntry(data, FLAG_RESOURCE_BOX_LINE, NULL, "%4.0f", defaultBox->priv->lineWidth); visu_config_file_exportComment(data, DESC_RESOURCE_BOX_STIPPLE); visu_config_file_exportEntry(data, FLAG_RESOURCE_BOX_STIPPLE, NULL, "%d %d", defaultBox->priv->lineStipple[0], defaultBox->priv->lineStipple[1]); visu_config_file_exportComment(data, ""); } v_sim-3.7.0/src/extensions/box.h0000644000353400050620000001661012215546077013525 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef BOX_H #define BOX_H #include "frame.h" #include #include #include /** * VISU_TYPE_GL_EXT_BOX: * * return the type of #VisuGlExtBox. * * Since: 3.7 */ #define VISU_TYPE_GL_EXT_BOX (visu_gl_ext_box_get_type ()) /** * VISU_GL_EXT_BOX: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuGlExtBox type. * * Since: 3.7 */ #define VISU_GL_EXT_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_GL_EXT_BOX, VisuGlExtBox)) /** * VISU_GL_EXT_BOX_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuGlExtBoxClass. * * Since: 3.7 */ #define VISU_GL_EXT_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_GL_EXT_BOX, VisuGlExtBoxClass)) /** * VISU_IS_GL_EXT_BOX: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuGlExtBox object. * * Since: 3.7 */ #define VISU_IS_GL_EXT_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_GL_EXT_BOX)) /** * VISU_IS_GL_EXT_BOX_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuGlExtBoxClass class. * * Since: 3.7 */ #define VISU_IS_GL_EXT_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_GL_EXT_BOX)) /** * VISU_GL_EXT_BOX_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. * * Since: 3.7 */ #define VISU_GL_EXT_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_GL_EXT_BOX, VisuGlExtBoxClass)) typedef struct _VisuGlExtBox VisuGlExtBox; typedef struct _VisuGlExtBoxPrivate VisuGlExtBoxPrivate; typedef struct _VisuGlExtBoxClass VisuGlExtBoxClass; struct _VisuGlExtBox { VisuGlExt parent; VisuGlExtBoxPrivate *priv; }; struct _VisuGlExtBoxClass { VisuGlExtClass parent; }; /** * visu_gl_ext_box_get_type: * * This method returns the type of #VisuGlExtBox, use * VISU_TYPE_GL_EXT_BOX instead. * * Since: 3.7 * * Returns: the type of #VisuGlExtBox. */ GType visu_gl_ext_box_get_type(void); /** * VISU_GL_EXT_BOX_ID: * * The id used to identify this extension, see * visu_gl_ext_rebuild() for instance. */ #define VISU_GL_EXT_BOX_ID "Box" VisuGlExtBox* visu_gl_ext_box_new(const gchar *name); gboolean visu_gl_ext_box_setBox(VisuGlExtBox *box, VisuBox *boxObj); gboolean visu_gl_ext_box_setBasis(VisuGlExtBox *box, float orig[3], float mat[3][3]); void visu_gl_ext_box_draw(VisuGlExtBox *box); gboolean visu_gl_ext_box_setRGB(VisuGlExtBox *box, float rgb[3], int mask); gboolean visu_gl_ext_box_setSideRGB(VisuGlExtBox *box, float rgba[4], int mask); gboolean visu_gl_ext_box_setLineWidth(VisuGlExtBox *box, float width); gboolean visu_gl_ext_box_setLineStipple(VisuGlExtBox *box, guint16 stipple); gboolean visu_gl_ext_box_setExpandStipple(VisuGlExtBox *box, guint16 stipple); gboolean visu_gl_ext_box_setOrigin(VisuGlExtBox *box, float origin[3]); float* visu_gl_ext_box_getRGB(VisuGlExtBox *box); float* visu_gl_ext_box_getSideRGB(VisuGlExtBox *box); float visu_gl_ext_box_getLineWidth(VisuGlExtBox *box); guint16 visu_gl_ext_box_getLineStipple(VisuGlExtBox *box); guint16 visu_gl_ext_box_getExpandStipple(VisuGlExtBox *box); VisuGlExtBox* visu_gl_ext_box_getDefault(); /** * VISU_TYPE_GL_EXT_BOX_LEGEND: * * return the type of #VisuGlExtBoxLegend. * * Since: 3.7 */ #define VISU_TYPE_GL_EXT_BOX_LEGEND (visu_gl_ext_box_legend_get_type ()) /** * VISU_GL_EXT_BOX_LEGEND: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuGlExtBoxLegend type. * * Since: 3.7 */ #define VISU_GL_EXT_BOX_LEGEND(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_GL_EXT_BOX_LEGEND, VisuGlExtBoxLegend)) /** * VISU_GL_EXT_BOX_LEGEND_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuGlExtBoxLegendClass. * * Since: 3.7 */ #define VISU_GL_EXT_BOX_LEGEND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_GL_EXT_BOX_LEGEND, VisuGlExtBoxLegendClass)) /** * VISU_IS_GL_EXT_BOX_LEGEND: * @obj: a #GObject to test. * * Test if the given @obj is of the type of #VisuGlExtBoxLegend object. * * Since: 3.7 */ #define VISU_IS_GL_EXT_BOX_LEGEND(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_GL_EXT_BOX_LEGEND)) /** * VISU_IS_GL_EXT_BOX_LEGEND_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuGlExtBoxLegendClass class. * * Since: 3.7 */ #define VISU_IS_GL_EXT_BOX_LEGEND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_GL_EXT_BOX_LEGEND)) /** * VISU_GL_EXT_BOX_LEGEND_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. * * Since: 3.7 */ #define VISU_GL_EXT_BOX_LEGEND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_GL_EXT_BOX_LEGEND, VisuGlExtBoxLegendClass)) typedef struct _VisuGlExtBoxLegend VisuGlExtBoxLegend; typedef struct _VisuGlExtBoxLegendPrivate VisuGlExtBoxLegendPrivate; typedef struct _VisuGlExtBoxLegendClass VisuGlExtBoxLegendClass; struct _VisuGlExtBoxLegend { VisuGlExtFrame parent; VisuGlExtBoxLegendPrivate *priv; }; struct _VisuGlExtBoxLegendClass { VisuGlExtFrameClass parent; }; /** * visu_gl_ext_box_legend_get_type: * * This method returns the type of #VisuGlExtBoxLegend, use * VISU_TYPE_GL_EXT_BOX_LEGEND instead. * * Since: 3.7 * * Returns: the type of #VisuGlExtBoxLegend. */ GType visu_gl_ext_box_legend_get_type(void); /** * VISU_GL_EXT_BOX_LEGEND_ID: * * The id used to identify this extension, see * visu_gl_ext_rebuild() for instance. */ #define VISU_GL_EXT_BOX_LEGEND_ID "Box legend" VisuGlExtBoxLegend* visu_gl_ext_box_legend_new(const gchar *name); gboolean visu_gl_ext_box_legend_setBox(VisuGlExtBoxLegend *legend, VisuBox *boxObj); VisuGlExtBoxLegend* visu_gl_ext_box_legend_getDefault(); #endif v_sim-3.7.0/src/extensions/axes.c0000644000353400050620000011023012215546077013661 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "axes.h" #include "../renderingMethods/renderingAtomic.h" #include "../renderingMethods/renderingSpin.h" #include #include #include #include #include #include #include #include #include #include #include #include /** * SECTION:axes * @short_description: Defines methods to draw axes. * * The axes are the X, Y and Z lines drawn on the bottom right of the * screen defining a given orthogonal basis set in which the box is * projected. * The axis may be different, depending on the rendering method * currently used. For instance, when the spin is used, a projection * of the colour scheme is added to the simple lines of the basis * set. Besides that, axes are defined by their width (see * visu_gl_ext_axes_setLineWidth()) and their colour (see * visu_gl_ext_axes_setRGB()). */ /* Parameters & resources*/ /* This is a boolean to control is the axes is render or not. */ #define FLAG_RESOURCE_AXES_USED "axes_are_on" #define DESC_RESOURCE_AXES_USED "Control if the axes are drawn ; boolean (0 or 1)" static gboolean RESOURCE_AXES_USED_DEFAULT = FALSE; /* A resource to control the color used to render the lines of the axes. */ #define FLAG_RESOURCE_AXES_COLOR "axes_color" #define DESC_RESOURCE_AXES_COLOR "Define the color of the axes ; three floating point values (0. <= v <= 1.)" static float rgbDefault[3] = {1.0, 0.5, 0.1}; /* A resource to control the width to render the lines of the axes. */ #define FLAG_RESOURCE_AXES_LINE "axes_line_width" #define DESC_RESOURCE_AXES_LINE "Define the width of the lines of the axes ; one floating point values (1. <= v <= 10.)" static float LINE_WIDTH_DEFAULT = 1.f; /* A resource to control the stipple to render the lines of the axes. */ #define FLAG_RESOURCE_AXES_STIPPLE "axes_line_stipple" #define DESC_RESOURCE_AXES_STIPPLE "Dot scheme detail for the lines of the axes ; 0 < integer < 2^16" static guint16 LINE_STIPPLE_DEFAULT = 65535; static gboolean readAxesLineStipple(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); /* A resource to control the position to render the axes. */ #define FLAG_RESOURCE_AXES_POSITION "axes_position" #define DESC_RESOURCE_AXES_POSITION "Position of the representation of the axes ; two floating point values (0. <= v <= 1.)" static float POSITION_DEFAULT[2] = {1.f, 1.f}; /* Export function that is called by visu_module to write the values of resources to a file. */ static void exportResourcesAxes(GString *data, VisuData *dataObj, VisuGlView *view); /** * VisuGlExtAxesClass: * @parent: the parent class; * * A short way to identify #_VisuGlExtAxesClass structure. * * Since: 3.7 */ /** * VisuGlExtAxes: * * An opaque structure. * * Since: 3.7 */ /** * VisuGlExtAxesPrivate: * * Private fields for #VisuGlExtAxes objects. * * Since: 3.7 */ struct _VisuGlExtAxesPrivate { gboolean dispose_has_run; gboolean areBuilt; /* Basis definition. */ double matrix[3][3]; VisuBox *box; gulong box_signal; /* Rendenring parameters. */ float xpos, ypos; float rgb[3]; float lineWidth; guint16 lineStipple; /* Signals for the current view. */ VisuGlView *view; gulong widthHeight_signal, nearFar_signal, refLength_signal, color_signal; }; static VisuGlExtAxes* defaultAxes; static void visu_gl_ext_axes_finalize(GObject* obj); static void visu_gl_ext_axes_dispose(GObject* obj); static void visu_gl_ext_axes_rebuild(VisuGlExt *ext); static void _setBox(VisuGlExtAxes *axes, VisuBox *box); /* Local callbacks */ static void onAxesParametersChange(VisuGlView *view, gpointer data); static void onAxesConfigChange(VisuRenderingSpin *render, gpointer data); static void onBoxChange(VisuBox *box, float extens, gpointer data); static void onEntryUsed(VisuGlExtAxes *axes, gchar *key, VisuObject *obj); static void onEntryColor(VisuGlExtAxes *axes, gchar *key, VisuObject *obj); static void onEntryWidth(VisuGlExtAxes *axes, gchar *key, VisuObject *obj); static void onEntryStipple(VisuGlExtAxes *axes, gchar *key, VisuObject *obj); static void onEntryPosition(VisuGlExtAxes *axes, gchar *key, VisuObject *obj); G_DEFINE_TYPE(VisuGlExtAxes, visu_gl_ext_axes, VISU_TYPE_GL_EXT) static void visu_gl_ext_axes_class_init(VisuGlExtAxesClass *klass) { float rgColor[2] = {0.f, 1.f}; float rgWidth[2] = {0.f, 10.f}; VisuConfigFileEntry *resourceEntry; DBG_fprintf(stderr, "Extension Axes: creating the class of the object.\n"); /* DBG_fprintf(stderr, " - adding new signals ;\n"); */ DBG_fprintf(stderr, " - adding new resources ;\n"); resourceEntry = visu_config_file_addBooleanEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_AXES_USED, DESC_RESOURCE_AXES_USED, &RESOURCE_AXES_USED_DEFAULT); resourceEntry = visu_config_file_addFloatArrayEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_AXES_COLOR, DESC_RESOURCE_AXES_COLOR, 3, rgbDefault, rgColor); resourceEntry = visu_config_file_addFloatArrayEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_AXES_LINE, DESC_RESOURCE_AXES_LINE, 1, &LINE_WIDTH_DEFAULT, rgWidth); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_AXES_STIPPLE, DESC_RESOURCE_AXES_STIPPLE, 1, readAxesLineStipple); visu_config_file_entry_setVersion(resourceEntry, 3.4f); resourceEntry = visu_config_file_addFloatArrayEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_AXES_POSITION, DESC_RESOURCE_AXES_POSITION, 2, POSITION_DEFAULT, rgColor); visu_config_file_entry_setVersion(resourceEntry, 3.7f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_RESOURCE, exportResourcesAxes); defaultAxes = (VisuGlExtAxes*)0; /* Connect the overloading methods. */ G_OBJECT_CLASS(klass)->dispose = visu_gl_ext_axes_dispose; G_OBJECT_CLASS(klass)->finalize = visu_gl_ext_axes_finalize; VISU_GL_EXT_CLASS(klass)->rebuild = visu_gl_ext_axes_rebuild; } static void visu_gl_ext_axes_init(VisuGlExtAxes *obj) { DBG_fprintf(stderr, "Extension Axes: initializing a new object (%p).\n", (gpointer)obj); obj->priv = g_malloc(sizeof(VisuGlExtAxesPrivate)); obj->priv->dispose_has_run = FALSE; /* Private data. */ obj->priv->areBuilt = FALSE; obj->priv->rgb[0] = rgbDefault[0]; obj->priv->rgb[1] = rgbDefault[1]; obj->priv->rgb[2] = rgbDefault[2]; obj->priv->lineWidth = LINE_WIDTH_DEFAULT; obj->priv->lineStipple = LINE_STIPPLE_DEFAULT; obj->priv->xpos = POSITION_DEFAULT[0]; obj->priv->ypos = POSITION_DEFAULT[1]; obj->priv->view = (VisuGlView*)0; obj->priv->widthHeight_signal = 0; obj->priv->nearFar_signal = 0; obj->priv->refLength_signal = 0; obj->priv->color_signal = 0; obj->priv->matrix[0][0] = 1.; obj->priv->matrix[0][1] = 0.; obj->priv->matrix[0][2] = 0.; obj->priv->matrix[1][0] = 0.; obj->priv->matrix[1][1] = 1.; obj->priv->matrix[1][2] = 0.; obj->priv->matrix[2][0] = 0.; obj->priv->matrix[2][1] = 0.; obj->priv->matrix[2][2] = 1.; obj->priv->box = (VisuBox*)0; obj->priv->box_signal = 0; g_signal_connect_object(VISU_OBJECT_INSTANCE, "entryParsed::" FLAG_RESOURCE_AXES_USED, G_CALLBACK(onEntryUsed), (gpointer)obj, G_CONNECT_SWAPPED); g_signal_connect_object(VISU_OBJECT_INSTANCE, "entryParsed::" FLAG_RESOURCE_AXES_COLOR, G_CALLBACK(onEntryColor), (gpointer)obj, G_CONNECT_SWAPPED); g_signal_connect_object(VISU_OBJECT_INSTANCE, "entryParsed::" FLAG_RESOURCE_AXES_LINE, G_CALLBACK(onEntryWidth), (gpointer)obj, G_CONNECT_SWAPPED); g_signal_connect_object(VISU_OBJECT_INSTANCE, "entryParsed::" FLAG_RESOURCE_AXES_STIPPLE, G_CALLBACK(onEntryStipple), (gpointer)obj, G_CONNECT_SWAPPED); g_signal_connect_object(VISU_OBJECT_INSTANCE, "entryParsed::" FLAG_RESOURCE_AXES_POSITION, G_CALLBACK(onEntryPosition), (gpointer)obj, G_CONNECT_SWAPPED); } /* This method can be called several times. It should unref all of its reference to GObjects. */ static void visu_gl_ext_axes_dispose(GObject* obj) { VisuGlExtAxes *axes; DBG_fprintf(stderr, "Extension Axes: dispose object %p.\n", (gpointer)obj); axes = VISU_GL_EXT_AXES(obj); if (axes->priv->dispose_has_run) return; axes->priv->dispose_has_run = TRUE; /* Disconnect signals. */ visu_gl_ext_axes_setGlView(axes, (VisuGlView*)0); _setBox(axes, (VisuBox*)0); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_gl_ext_axes_parent_class)->dispose(obj); } /* This method is called once only. */ static void visu_gl_ext_axes_finalize(GObject* obj) { VisuGlExtAxes *axes; g_return_if_fail(obj); DBG_fprintf(stderr, "Extension Axes: finalize object %p.\n", (gpointer)obj); axes = VISU_GL_EXT_AXES(obj); /* Free privs elements. */ if (axes->priv) { DBG_fprintf(stderr, "Extension Axes: free private axes.\n"); g_free(axes->priv); } /* The free is called by g_type_free_instance... */ /* g_free(axes); */ /* Chain up to the parent class */ DBG_fprintf(stderr, "Extension Axes: chain to parent.\n"); G_OBJECT_CLASS(visu_gl_ext_axes_parent_class)->finalize(obj); DBG_fprintf(stderr, "Extension Axes: freeing ... OK.\n"); } static void _setBox(VisuGlExtAxes *axes, VisuBox *box) { if (axes->priv->box) { g_signal_handler_disconnect(G_OBJECT(axes->priv->box), axes->priv->box_signal); g_object_unref(axes->priv->box); } if (box) { g_object_ref(box); axes->priv->box_signal = g_signal_connect(G_OBJECT(box), "SizeChanged", G_CALLBACK(onBoxChange), (gpointer)axes); } else axes->priv->box_signal = 0; axes->priv->box = box; } /** * visu_gl_ext_axes_new: * @name: (allow-none): the name to give to the extension (default is #VISU_GL_EXT_AXES_ID). * * Creates a new #VisuGlExt to draw axes. * * Since: 3.7 * * Returns: a pointer to the #VisuGlExt it created or * NULL otherwise. */ VisuGlExtAxes* visu_gl_ext_axes_new(const gchar *name) { char *name_ = VISU_GL_EXT_AXES_ID; char *description = _("Draw {x,y,z} axes."); VisuGlExt *extensionAxes; DBG_fprintf(stderr,"Extension Axes: new object.\n"); extensionAxes = VISU_GL_EXT(g_object_new(VISU_TYPE_GL_EXT_AXES, "name", (name)?name:name_, "label", _(name), "description", description, "nGlObj", 1, "priority", VISU_GL_EXT_PRIORITY_LAST, "saveState", TRUE, NULL)); return VISU_GL_EXT_AXES(extensionAxes); } /** * visu_gl_ext_axes_setRGB: * @axes: the #VisuGlExtAxes object to modify. * @rgb: a three floats array with values (0 <= values <= 1) for the * red, the green and the blue color. Only values specified by the mask * are really relevant. * @mask: use #TOOL_COLOR_MASK_R, #TOOL_COLOR_MASK_G, #TOOL_COLOR_MASK_B, #TOOL_COLOR_MASK_RGBA or a * combinaison to indicate what values in the rgb array must be taken * into account. * * Method used to change the value of the parameter axes_color. * * Returns: TRUE if visu_gl_ext_axes_draw() should be called and then 'OpenGLAskForReDraw' * signal be emitted. */ gboolean visu_gl_ext_axes_setRGB(VisuGlExtAxes *axes, float rgb[3], int mask) { gboolean diff; g_return_val_if_fail(VISU_IS_GL_EXT_AXES(axes), FALSE); diff = FALSE; if (mask & TOOL_COLOR_MASK_R && axes->priv->rgb[0] != rgb[0]) { axes->priv->rgb[0] = rgb[0]; diff = TRUE; } if (mask & TOOL_COLOR_MASK_G && axes->priv->rgb[1] != rgb[1]) { axes->priv->rgb[1] = rgb[1]; diff = TRUE; } if (mask & TOOL_COLOR_MASK_B && axes->priv->rgb[2] != rgb[2]) { axes->priv->rgb[2] = rgb[2]; diff = TRUE; } if (!diff) return FALSE; axes->priv->areBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(axes)); } /** * visu_gl_ext_axes_setLineWidth: * @axes: the #VisuGlExtAxes object to modify. * @width: value of the desired axe width. * * Method used to change the value of the parameter axes_line_width. * * Returns: TRUE if visu_gl_ext_axes_draw() should be called and then 'OpenGLAskForReDraw' * signal be emitted. */ gboolean visu_gl_ext_axes_setLineWidth(VisuGlExtAxes *axes, float width) { g_return_val_if_fail(VISU_IS_GL_EXT_AXES(axes), FALSE); if (width < 1. || width > 10. || width == axes->priv->lineWidth) return FALSE; axes->priv->lineWidth = width; axes->priv->areBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(axes)); } /** * visu_gl_ext_axes_setLineStipple: * @axes: the #VisuGlExtAxes object to modify. * @stipple: value of the desired pattern. * * Method used to change the value of the parameter axes_line_stipple. * * Returns: TRUE if visu_gl_ext_axes_draw() should be called and then 'OpenGLAskForReDraw' * signal be emitted. */ gboolean visu_gl_ext_axes_setLineStipple(VisuGlExtAxes *axes, guint16 stipple) { g_return_val_if_fail(VISU_IS_GL_EXT_AXES(axes), FALSE); if (stipple == axes->priv->lineStipple) return FALSE; axes->priv->lineStipple = stipple; axes->priv->areBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(axes)); } static void _setBasis(VisuGlExtAxes *axes, double matrix[3][3]) { double sum2; DBG_fprintf(stderr, "Extension Axes: %8g %8g %8g\n" " %8g %8g %8g\n" " %8g %8g %8g\n", matrix[0][0], matrix[0][1], matrix[0][2], matrix[1][0], matrix[1][1], matrix[1][2], matrix[2][0], matrix[2][1], matrix[2][2]); /* We normalise it and copy it. */ sum2 = 1. / sqrt(matrix[0][0] * matrix[0][0] + matrix[1][0] * matrix[1][0] + matrix[2][0] * matrix[2][0]); axes->priv->matrix[0][0] = matrix[0][0] * sum2; axes->priv->matrix[0][1] = matrix[1][0] * sum2; axes->priv->matrix[0][2] = matrix[2][0] * sum2; sum2 = 1. / sqrt(matrix[0][1] * matrix[0][1] + matrix[1][1] * matrix[1][1] + matrix[2][1] * matrix[2][1]); axes->priv->matrix[1][0] = matrix[0][1] * sum2; axes->priv->matrix[1][1] = matrix[1][1] * sum2; axes->priv->matrix[1][2] = matrix[2][1] * sum2; sum2 = 1. / sqrt(matrix[0][2] * matrix[0][2] + matrix[1][2] * matrix[1][2] + matrix[2][2] * matrix[2][2]); axes->priv->matrix[2][0] = matrix[0][2] * sum2; axes->priv->matrix[2][1] = matrix[1][2] * sum2; axes->priv->matrix[2][2] = matrix[2][2] * sum2; axes->priv->areBuilt = FALSE; } /** * visu_gl_ext_axes_setBasis: * @axes: the #VisuGlExtAxes object to modify. * @matrix: the definition of the three basis axis. * * The @axes can represent an arbitrary basis-set, provided by * @matrix. @matrix[{0,1,2}] represents the {x,y,z} axis vector in a * cartesian basis-set. See visu_gl_ext_axes_setBasisFromBox() if the * basis-set should follow the one of a given #VisuBox. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_axes_draw() should be called and then 'OpenGLAskForReDraw' * signal be emitted. **/ gboolean visu_gl_ext_axes_setBasis(VisuGlExtAxes *axes, double matrix[3][3]) { g_return_val_if_fail(VISU_IS_GL_EXT_AXES(axes), FALSE); _setBox(axes, (VisuBox*)0); _setBasis(axes, matrix); return visu_gl_ext_getActive(VISU_GL_EXT(axes)); } /** * visu_gl_ext_axes_setBasisFromBox: * @axes: the #VisuGlExtAxes object to modify. * @box: (allow-none): the #VisuBox to use as basis-set. * * The @axes can follow the basis-set defined by @box. If NULL is * passed, then the orthorombic default basis-set is used. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_axes_draw() should be called and then 'OpenGLAskForReDraw' * signal be emitted. **/ gboolean visu_gl_ext_axes_setBasisFromBox(VisuGlExtAxes *axes, VisuBox *box) { double m[3][3]; g_return_val_if_fail(VISU_IS_GL_EXT_AXES(axes), FALSE); if (box) visu_box_getCellMatrix(box, m); else { memset(m, '\0', sizeof(double) * 9); m[0][0] = 1.; m[1][1] = 1.; m[2][2] = 1.; } _setBox(axes, box); _setBasis(axes, m); return visu_gl_ext_getActive(VISU_GL_EXT(axes)); } /** * visu_gl_ext_axes_setPosition: * @axes: the #VisuGlExtAxes object to modify. * @xpos: the reduced x position (1 to the right). * @ypos: the reduced y position (1 to the bottom). * * Change the position of the axes representation. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_axes_draw() should be called and then 'OpenGLAskForReDraw' * signal be emitted. **/ gboolean visu_gl_ext_axes_setPosition(VisuGlExtAxes *axes, float xpos, float ypos) { g_return_val_if_fail(VISU_IS_GL_EXT_AXES(axes), FALSE); if (xpos == axes->priv->xpos && ypos == axes->priv->ypos) return FALSE; axes->priv->xpos = CLAMP(xpos, 0.f, 1.f); axes->priv->ypos = CLAMP(ypos, 0.f, 1.f); axes->priv->areBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(axes)); } /** * visu_gl_ext_axes_setGlView: * @axes: the #VisuGlExtAxes object to attached to rendering view. * @view: (transfer full) (allow-none): a #VisuGlView object. * * Attach @axes to @view, so it can be rendered there. See visu_gl_ext_axes_draw(). * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_axes_draw() should be called and then 'OpenGLAskForReDraw' * signal be emitted. **/ gboolean visu_gl_ext_axes_setGlView(VisuGlExtAxes *axes, VisuGlView *view) { VisuRendering *spin; g_return_val_if_fail(VISU_IS_GL_EXT_AXES(axes), FALSE); /* No change to be done. */ if (view == axes->priv->view) return FALSE; spin = visu_rendering_getByName(VISU_RENDERING_SPIN_NAME); if (axes->priv->view) { g_signal_handler_disconnect(G_OBJECT(axes->priv->view), axes->priv->nearFar_signal); g_signal_handler_disconnect(G_OBJECT(axes->priv->view), axes->priv->refLength_signal); g_signal_handler_disconnect(G_OBJECT(axes->priv->view), axes->priv->widthHeight_signal); if (spin) g_signal_handler_disconnect(G_OBJECT(spin), axes->priv->color_signal); g_object_unref(axes->priv->view); } if (view) { g_object_ref(view); axes->priv->nearFar_signal = g_signal_connect(G_OBJECT(view), "NearFarChanged", G_CALLBACK(onAxesParametersChange), (gpointer)axes); axes->priv->refLength_signal = g_signal_connect(G_OBJECT(view), "RefLengthChanged", G_CALLBACK(onAxesParametersChange), (gpointer)axes); axes->priv->widthHeight_signal = g_signal_connect(G_OBJECT(view), "WidthHeightChanged", G_CALLBACK(onAxesParametersChange), (gpointer)axes); if (spin) axes->priv->color_signal = g_signal_connect(G_OBJECT(spin), "colorisationChange", G_CALLBACK(onAxesConfigChange), (gpointer)axes); else axes->priv->color_signal = 0; } else { axes->priv->nearFar_signal = 0; axes->priv->widthHeight_signal = 0; axes->priv->color_signal = 0; } axes->priv->view = view; return TRUE; } /* Get methods. */ /** * visu_gl_ext_axes_getRGB: * @axes: the #VisuGlExtAxes object to inquire. * * Read all the colour components of axes (in [0;1]). * * Returns: (array fixed-size=3) (transfer none): three RGB values, * private from V_Sim, read only. */ float* visu_gl_ext_axes_getRGB(VisuGlExtAxes *axes) { g_return_val_if_fail(VISU_IS_GL_EXT_AXES(axes), rgbDefault); return axes->priv->rgb; } /** * visu_gl_ext_axes_getLineWidth: * @axes: the #VisuGlExtAxes object to inquire. * * Read the line width used to draw axes. * * Returns: the value of current axes width. */ float visu_gl_ext_axes_getLineWidth(VisuGlExtAxes *axes) { g_return_val_if_fail(VISU_IS_GL_EXT_AXES(axes), LINE_WIDTH_DEFAULT); return axes->priv->lineWidth; } /** * visu_gl_ext_axes_getLineStipple: * @axes: the #VisuGlExtAxes object to inquire. * * Read the line pattern used to draw axes. * * Returns: the value of current axes pattern. */ guint16 visu_gl_ext_axes_getLineStipple(VisuGlExtAxes *axes) { g_return_val_if_fail(VISU_IS_GL_EXT_AXES(axes), LINE_STIPPLE_DEFAULT); return axes->priv->lineStipple; } /** * visu_gl_ext_axes_getPosition: * @axes: the #VisuGlExtAxes object to inquire. * @xpos: (out) (allow-none): a location to store the x position. * @ypos: (out) (allow-none): a location to store the y position. * * Inquire the position of the representation of tha axes. * * Since: 3.7 **/ void visu_gl_ext_axes_getPosition(VisuGlExtAxes *axes, float *xpos, float *ypos) { g_return_if_fail(VISU_IS_GL_EXT_AXES(axes)); if (xpos) *xpos = axes->priv->xpos; if (ypos) *ypos = axes->priv->ypos; } /** * visu_gl_ext_axes_getDefault: * * V_Sim is using a default axes object. * * Since: 3.7 * * Returns: (transfer none): a #VisuGlExtAxes object used by default. **/ VisuGlExtAxes* visu_gl_ext_axes_getDefault() { if (!defaultAxes) { defaultAxes = visu_gl_ext_axes_new((gchar*)0); visu_gl_ext_setActive(VISU_GL_EXT(defaultAxes), RESOURCE_AXES_USED_DEFAULT); } return defaultAxes; } /****************/ /* Private part */ /****************/ static void visu_gl_ext_axes_rebuild(VisuGlExt *ext) { VisuGlExtAxes *axes = VISU_GL_EXT_AXES(ext); visu_gl_text_rebuildFontList(); axes->priv->areBuilt = FALSE; visu_gl_ext_axes_draw(axes); } static void onAxesConfigChange(VisuRenderingSpin *render _U_, gpointer data) { VisuGlExtAxes *axes = VISU_GL_EXT_AXES(data); DBG_fprintf(stderr, "Extension Axes: caught change on axes config.\n"); axes->priv->areBuilt = FALSE; visu_gl_ext_axes_draw(axes); } static void onAxesParametersChange(VisuGlView *view _U_, gpointer data) { VisuGlExtAxes *axes = VISU_GL_EXT_AXES(data); DBG_fprintf(stderr, "Extension Axes: caught change on view.\n"); axes->priv->areBuilt = FALSE; visu_gl_ext_axes_draw(axes); } static void onBoxChange(VisuBox *box, float extens _U_, gpointer data) { VisuGlExtAxes *axes = VISU_GL_EXT_AXES(data); double m[3][3]; /* We copy the definition of the box. */ visu_box_getCellMatrix(box, m); _setBasis(axes, m); visu_gl_ext_axes_draw(axes); } static void onEntryUsed(VisuGlExtAxes *axes, gchar *key _U_, VisuObject *obj _U_) { visu_gl_ext_setActive(VISU_GL_EXT(axes), RESOURCE_AXES_USED_DEFAULT); } static void onEntryColor(VisuGlExtAxes *axes, gchar *key _U_, VisuObject *obj _U_) { visu_gl_ext_axes_setRGB(axes, rgbDefault, TOOL_COLOR_MASK_RGBA); } static void onEntryWidth(VisuGlExtAxes *axes, gchar *key _U_, VisuObject *obj _U_) { visu_gl_ext_axes_setLineWidth(axes, LINE_WIDTH_DEFAULT); } static void onEntryStipple(VisuGlExtAxes *axes, gchar *key _U_, VisuObject *obj _U_) { visu_gl_ext_axes_setLineStipple(axes, LINE_STIPPLE_DEFAULT); } static void onEntryPosition(VisuGlExtAxes *axes, gchar *key _U_, VisuObject *obj _U_) { visu_gl_ext_axes_setPosition(axes, POSITION_DEFAULT[0], POSITION_DEFAULT[1]); } static void drawAxes(float length, double matrix[3][3], GLsizei w, GLsizei h, float width, float rgb[3], char *legend, gboolean long_axes) { double orig[3][3]; if (long_axes) { orig[0][0] = -matrix[0][0]; orig[0][1] = -matrix[0][1]; orig[0][2] = -matrix[0][2]; orig[1][0] = -matrix[1][0]; orig[1][1] = -matrix[1][1]; orig[1][2] = -matrix[1][2]; orig[2][0] = -matrix[2][0]; orig[2][1] = -matrix[2][1]; orig[2][2] = -matrix[2][2]; } else memset(orig, '\0', sizeof(double) * 9); glLineWidth(width); glColor3fv(rgb); glPushMatrix(); glScalef(length, length, length); glBegin(GL_LINES); glVertex3dv(orig[0]); glVertex3dv(matrix[0]); glVertex3dv(orig[1]); glVertex3dv(matrix[1]); glVertex3dv(orig[2]); glVertex3dv(matrix[2]); glEnd(); glRasterPos3dv(matrix[0]); visu_gl_text_drawChars("x", VISU_GL_TEXT_NORMAL); glRasterPos3dv(matrix[1]); visu_gl_text_drawChars("y", VISU_GL_TEXT_NORMAL); glRasterPos3dv(matrix[2]); visu_gl_text_drawChars("z", VISU_GL_TEXT_NORMAL); glPopMatrix(); if(legend != NULL) { glMatrixMode (GL_PROJECTION); glPushMatrix(); glLoadIdentity (); gluOrtho2D (0, MIN(w,h), 0, MIN(h,w)); glMatrixMode (GL_MODELVIEW); glPushMatrix(); glLoadIdentity (); glRasterPos3f(20., 5., 0.9); visu_gl_text_drawChars(legend, VISU_GL_TEXT_NORMAL); glPopMatrix(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); } } /** * draw_coloured_cone: * @r: the radius of the cone * @h: the semi-height of the cone * @n: the precision used to draw the sphere * * Draws a coloured double cone at the given position. */ static void draw_coloured_cone(double r, double h, int n, float phi_prime_zero) { float hsv[3], rgb[3]; int i,j; double theta1,theta2,theta3; float e_x, e_y, e_z, p_x, p_y, p_z; g_return_if_fail(r >= 0 && n >= 0); if (n < 4 || r <= 0) { glBegin(GL_POINTS); glVertex3f(0,0,0); glEnd(); return; } glFrontFace(GL_CW); glPushMatrix(); glRotatef(phi_prime_zero, 0, 0, 1); glRotatef(-90, 1, 0, 0); hsv[1] = 0; hsv[2] = 1; for (j=0;j 1) hsv[1] = 1; hsv[2] = 2-2*(float)(1+j)/(float)(n/2); if(hsv[2] > 1) hsv[2] = 1; e_x = /*cos(theta2) **/hsv[1]*hsv[2]* cos(theta3); e_y = sin(theta2); e_z = /*cos(theta2) **/hsv[1]*hsv[2]* sin(theta3); p_x = r * e_x; p_y = /*r * e_y*/h*(hsv[1] - hsv[2]); p_z = r * e_z; tool_color_convertHSVtoRGB(rgb, hsv); glColor3f(rgb[0], rgb[1], rgb[2]); glNormal3f(e_x,e_y,e_z); glVertex3f(p_x,p_y,p_z); hsv[0] = /*1-*/(float)i/(float)n; hsv[1] = 2*(float)j/(float)(n/2); if(hsv[1] > 1) hsv[1] = 1; hsv[2] = 2-2*(float)j/(float)(n/2); if(hsv[2] > 1) hsv[2] = 1; e_x = /*cos(theta1) **/hsv[1]*hsv[2]* cos(theta3); e_y = sin(theta1); e_z = /*cos(theta1) **/hsv[1]*hsv[2]* sin(theta3); p_x = r * e_x; p_y = /*r * e_y*/h*(hsv[1] - hsv[2]); p_z = r * e_z; tool_color_convertHSVtoRGB(rgb, hsv); glColor3f(rgb[0], rgb[1], rgb[2]); glNormal3f(e_x,e_y,e_z); glVertex3f(p_x,p_y,p_z); } glEnd(); } glPopMatrix(); glFrontFace(GL_CCW); } /* void drawConeCircle(/\*XYZ c,*\/ double r, int n) */ /* { */ /* /\* XYZ e,p;*\/ */ /* GLboolean antialiasing_was_on; */ /* GLUquadric* trash = gluNewQuadric(); */ /* int i; */ /* double theta, height = 1; */ /* /\* glEnable (GL_POLYGON_SMOOTH); *\/ */ /* /\* glDisable (GL_DEPTH_TEST); *\/ */ /* antialiasing_was_on = enableGlFeature(GL_LINE_SMOOTH); */ /* glPushMatrix(); */ /* glRotatef(90, 1, 0, 0); */ /* glTranslatef(0, 0, -height/2); */ /* glLineWidth(lineWidth); */ /* glColor3f(0, 0, 0); */ /* gluQuadricOrientation(trash, GLU_INSIDE); */ /* gluCylinder(trash, 0.95*r, 0.95*r, height, n, 1); */ /* /\* glBegin(GL_LINE_LOOP); *\/ */ /* /\* for (i=0;i<=n;i++) *\/ */ /* /\* { *\/ */ /* /\* theta = i * TWOPI / n; *\/ */ /* /\* e.x = cos(theta); *\/ */ /* /\* e.z = sin(theta); *\/ */ /* /\* p.x = 0.8*(c.x + r * e.x); *\/ */ /* /\* p.z = 0.8*(c.z + r * e.z); *\/ */ /* /\* glVertex3f(p.x, -0.6, p.z); *\/ */ /* /\* glVertex3f(p.x, 0.6, p.z); *\/ */ /* /\* } *\/ */ /* /\* glEnd(); *\/ */ /* glPopMatrix(); */ /* restoreGlFeature(GL_LINE_SMOOTH, antialiasing_was_on); */ /* /\* glEnable (GL_DEPTH_TEST); *\/ */ /* /\* glDisable(GL_POLYGON_SMOOTH); *\/ */ /* } */ /** * visu_gl_ext_axes_draw: * @axes: the #VisuBox object to build axes for. * * This method creates a compiled list that draws axes. */ void visu_gl_ext_axes_draw(VisuGlExtAxes *axes) { float length; GLsizei w, h; GLint xx, yy; double mini, maxi, near, far; float length0; VisuRendering *spin; g_return_if_fail(VISU_IS_GL_EXT_AXES(axes)); /* Nothing to draw; */ if(!axes->priv->view || !visu_gl_ext_getActive(VISU_GL_EXT(axes)) || axes->priv->areBuilt) return; DBG_fprintf(stderr, "Extension axes: creating axes in (%dx%d).\n", axes->priv->view->window->width, axes->priv->view->window->height); length0 = visu_gl_camera_getRefLength(axes->priv->view->camera, (ToolUnits*)0); DBG_fprintf(stderr, " | refLength = %g\n", length0); DBG_fprintf(stderr, " | window = %dx%d\n", axes->priv->view->window->width, axes->priv->view->window->height); w = 0.16f * MIN(axes->priv->view->window->width, axes->priv->view->window->height); h = w; xx = (axes->priv->view->window->width - w) * axes->priv->xpos; yy = (axes->priv->view->window->height - h) * (1.f - axes->priv->ypos); mini = -0.5f * length0 * (axes->priv->view->camera->d_red - 1.f) / axes->priv->view->camera->d_red; maxi = -mini; near = far = axes->priv->view->camera->d_red * length0; near -= length0; far += length0; DBG_fprintf(stderr, " | near/far = %g %g\n", near, far); visu_gl_text_initFontList(); glDeleteLists(visu_gl_ext_getGlList(VISU_GL_EXT(axes)), 1); glNewList(visu_gl_ext_getGlList(VISU_GL_EXT(axes)), GL_COMPILE); /* Dsactivation de la lumire et du brouillard et activation du culling. */ glEnable(GL_CULL_FACE); glDisable(GL_LIGHTING); glDisable(GL_FOG); if (axes->priv->lineStipple != 65535) { glEnable(GL_LINE_STIPPLE); glLineStipple(1, axes->priv->lineStipple); } glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); DBG_fprintf(stderr, "Extension axes: frustum is %fx%f %fx%f %fx%f.\n", mini, maxi, mini, maxi, near, far); glFrustum(mini, maxi, mini, maxi, near, far); glMatrixMode(GL_MODELVIEW); glPopMatrix(); DBG_fprintf(stderr, "Extension Axes: new view port at %dx%d, size %dx%d.\n", xx, yy, w, h); glViewport(xx, yy, w, h); length = 0.33 * length0; spin = visu_rendering_getByName(VISU_RENDERING_SPIN_NAME); if(visu_object_getRendering(VISU_OBJECT_INSTANCE) == spin) { float phi_prime_zero, phi_a, theta_a; g_object_get(G_OBJECT(spin), "cone-omega", &phi_prime_zero, "cone-phi", &phi_a, "cone-theta", &theta_a, NULL); /* Resetting the depth buffer. */ glClear(GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); /* Draw the first color cone */ glPushMatrix(); glRotatef(phi_a, 0, 0, 1); glRotatef(theta_a, 0, 1, 0); draw_coloured_cone(length, 1.2*length, 16, phi_prime_zero); glPopMatrix(); drawAxes(1.5*length, axes->priv->matrix, w, h, axes->priv->lineWidth, axes->priv->rgb, _("front"), TRUE); glViewport(xx, yy+h, w, h); /* Enabling front culling and drawing the second color cone */ glPushMatrix(); glRotatef(phi_a, 0, 0, 1); glRotatef(theta_a, 0, 1, 0); glCullFace(GL_FRONT); draw_coloured_cone(length, 1.2*length, 16, phi_prime_zero); glCullFace(GL_BACK); glPopMatrix(); drawAxes(1.5*length, axes->priv->matrix, w, h, axes->priv->lineWidth, axes->priv->rgb, _("back"), TRUE); } else if(visu_object_getRendering(VISU_OBJECT_INSTANCE) == visu_rendering_getByName(VISU_RENDERING_ATOMIC_NAME)) { glDisable(GL_DEPTH_TEST); drawAxes(length, axes->priv->matrix, w, h, axes->priv->lineWidth, axes->priv->rgb, NULL, FALSE); glEnable(GL_DEPTH_TEST); } glPushMatrix(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); /* Back to the main viewport. */ glViewport(0, 0, axes->priv->view->window->width, axes->priv->view->window->height); glEndList(); axes->priv->areBuilt = TRUE; } /*************************/ /* Parameters & resources*/ /*************************/ /* A resource to control the width to render the lines of the axes. */ static gboolean readAxesLineStipple(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { gint stipple; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readInteger(lines[0], position, &stipple, 1, error)) return FALSE; LINE_STIPPLE_DEFAULT = (guint16)stipple; return TRUE; } /* Export function that is called by visu_module to write the values of resources to a file. */ static void exportResourcesAxes(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { if (!defaultAxes) return; visu_config_file_exportComment(data, DESC_RESOURCE_AXES_USED); visu_config_file_exportEntry(data, FLAG_RESOURCE_AXES_USED, NULL, "%d", visu_gl_ext_getActive(VISU_GL_EXT(defaultAxes))); visu_config_file_exportComment(data, DESC_RESOURCE_AXES_COLOR); visu_config_file_exportEntry(data, FLAG_RESOURCE_AXES_COLOR, NULL, "%4.3f %4.3f %4.3f", defaultAxes->priv->rgb[0], defaultAxes->priv->rgb[1], defaultAxes->priv->rgb[2]); visu_config_file_exportComment(data, DESC_RESOURCE_AXES_LINE); visu_config_file_exportEntry(data, FLAG_RESOURCE_AXES_LINE, NULL, "%4.0f", defaultAxes->priv->lineWidth); visu_config_file_exportComment(data, DESC_RESOURCE_AXES_STIPPLE); visu_config_file_exportEntry(data, FLAG_RESOURCE_AXES_STIPPLE, NULL, "%d", defaultAxes->priv->lineStipple); visu_config_file_exportComment(data, DESC_RESOURCE_AXES_POSITION); visu_config_file_exportEntry(data, FLAG_RESOURCE_AXES_POSITION, NULL, "%4.3f %4.3f", defaultAxes->priv->xpos, defaultAxes->priv->ypos); visu_config_file_exportComment(data, ""); } v_sim-3.7.0/src/extensions/axes.h0000644000353400050620000001151312215546077013672 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef AXES_H #define AXES_H #include #include #include /** * VISU_TYPE_GL_EXT_AXES: * * return the type of #VisuGlExtAxes. * * Since: 3.7 */ #define VISU_TYPE_GL_EXT_AXES (visu_gl_ext_axes_get_type ()) /** * VISU_GL_EXT_AXES: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuGlExtAxes type. * * Since: 3.7 */ #define VISU_GL_EXT_AXES(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_GL_EXT_AXES, VisuGlExtAxes)) /** * VISU_GL_EXT_AXES_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuGlExtAxesClass. * * Since: 3.7 */ #define VISU_GL_EXT_AXES_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_GL_EXT_AXES, VisuGlExtAxesClass)) /** * VISU_IS_GL_EXT_AXES: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuGlExtAxes object. * * Since: 3.7 */ #define VISU_IS_GL_EXT_AXES(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_GL_EXT_AXES)) /** * VISU_IS_GL_EXT_AXES_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuGlExtAxesClass class. * * Since: 3.7 */ #define VISU_IS_GL_EXT_AXES_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_GL_EXT_AXES)) /** * VISU_GL_EXT_AXES_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. * * Since: 3.7 */ #define VISU_GL_EXT_AXES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_GL_EXT_AXES, VisuGlExtAxesClass)) typedef struct _VisuGlExtAxes VisuGlExtAxes; typedef struct _VisuGlExtAxesPrivate VisuGlExtAxesPrivate; typedef struct _VisuGlExtAxesClass VisuGlExtAxesClass; struct _VisuGlExtAxes { VisuGlExt parent; VisuGlExtAxesPrivate *priv; }; struct _VisuGlExtAxesClass { VisuGlExtClass parent; }; /** * VISU_GL_EXT_AXES_ID: * * The id used to identify this extension, see * visu_gl_ext_rebuild() for instance. */ #define VISU_GL_EXT_AXES_ID "Axes" /** * visu_gl_ext_axes_get_type: * * This method returns the type of #VisuGlExtAxes, use * VISU_TYPE_GL_EXT_AXES instead. * * Since: 3.7 * * Returns: the type of #VisuGlExtAxes. */ GType visu_gl_ext_axes_get_type(void); VisuGlExtAxes* visu_gl_ext_axes_new(const gchar *name); gboolean visu_gl_ext_axes_setRGB(VisuGlExtAxes *axes, float rgb[3], int mask); gboolean visu_gl_ext_axes_setLineWidth(VisuGlExtAxes *axes, float width); gboolean visu_gl_ext_axes_setLineStipple(VisuGlExtAxes *axes, guint16 stipple); gboolean visu_gl_ext_axes_setBasisFromBox(VisuGlExtAxes *axes, VisuBox *box); gboolean visu_gl_ext_axes_setBasis(VisuGlExtAxes *axes, double matrix[3][3]); gboolean visu_gl_ext_axes_setPosition(VisuGlExtAxes *axes, float xpos, float ypos); float* visu_gl_ext_axes_getRGB(VisuGlExtAxes *axes); float visu_gl_ext_axes_getLineWidth(VisuGlExtAxes *axes); guint16 visu_gl_ext_axes_getLineStipple(VisuGlExtAxes *axes); void visu_gl_ext_axes_getPosition(VisuGlExtAxes *axes, float *xpos, float *ypos); VisuGlExtAxes* visu_gl_ext_axes_getDefault(); gboolean visu_gl_ext_axes_setGlView(VisuGlExtAxes *axes, VisuGlView *view); void visu_gl_ext_axes_draw(VisuGlExtAxes *axes); #endif v_sim-3.7.0/src/extensions/fogAndBGColor.c0000644000353400050620000010577312215550511015333 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "fogAndBGColor.h" #include #include #include #include #include #include #include #include #include #include #include /** * SECTION:fogAndBGColor * @short_description: Handle the background colour and the fog. * * This module is used to support a background colour and to tune the * fog. This last one can be turn on or off and its colour can be * either a user defined one or the one of the background. The fog is * a linear blending into the fog colour. It starts at a given z * position (in the camera basis set) and ends at a lower z. */ /* Parameters & resources*/ /* A resource to control the color of the background. */ #define FLAG_RESOURCE_BG_COLOR "backgroundColor_color" #define DESC_RESOURCE_BG_COLOR "Set the background of the background ; four floating point values (0. <= v <= 1.)" static float bgRGBDefault[4] = {0., 0., 0., 1.}; static void exportResourcesBg(GString *data, VisuData *dataObj, VisuGlView *view); /** * VisuGlExtBgClass: * @parent: the parent class; * * A short way to identify #_VisuGlExtBgClass structure. * * Since: 3.7 */ /** * VisuGlExtBg: * * An opaque structure. * * Since: 3.7 */ /** * VisuGlExtBgPrivate: * * Private fields for #VisuGlExtBg objects. * * Since: 3.7 */ struct _VisuGlExtBgPrivate { gboolean dispose_has_run; gboolean isBuilt; /* Handling the background color. */ float bgRGB[4]; /* Handling the background image. */ guchar *bgImage; gboolean bgImageAlpha, bgImageFit, bgImageFollowZoom; guint bgImageW, bgImageH; gchar *bgImageTitle; float bgImageZoomInit, bgImageZoom, bgImageZoomRatioInit; float bgImageXsInit, bgImageXs, bgImageXs0; float bgImageYsInit, bgImageYs, bgImageYs0; /* Signals for the current view. */ VisuGlView *view; gulong widthHeight_signal; }; static GLuint texName = 0; static VisuGlExtBg* defaultBg; static void visu_gl_ext_bg_finalize(GObject* obj); static void visu_gl_ext_bg_dispose(GObject* obj); static void visu_gl_ext_bg_rebuild(VisuGlExt *ext); /* Local callbacks */ static void onBgImageRescale(VisuGlView *view, gpointer data); static void onEntryColor(VisuGlExtBg *bg, gchar *key, VisuObject *obj); /* Local methods */ static void createBgImage(VisuGlExtBg *bg); static void createBgChess(VisuGlExtBg *bg); G_DEFINE_TYPE(VisuGlExtBg, visu_gl_ext_bg, VISU_TYPE_GL_EXT) static void visu_gl_ext_bg_class_init(VisuGlExtBgClass *klass) { float rgColor[2] = {0.f, 1.f}; DBG_fprintf(stderr, "Extension Bg: creating the class of the object.\n"); /* DBG_fprintf(stderr, " - adding new signals ;\n"); */ DBG_fprintf(stderr, " - adding new resources ;\n"); visu_config_file_addFloatArrayEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_BG_COLOR, DESC_RESOURCE_BG_COLOR, 4, bgRGBDefault, rgColor); visu_config_file_addExportFunction(VISU_CONFIG_FILE_RESOURCE, exportResourcesBg); defaultBg = (VisuGlExtBg*)0; /* Connect the overloading methods. */ G_OBJECT_CLASS(klass)->dispose = visu_gl_ext_bg_dispose; G_OBJECT_CLASS(klass)->finalize = visu_gl_ext_bg_finalize; VISU_GL_EXT_CLASS(klass)->rebuild = visu_gl_ext_bg_rebuild; } static void visu_gl_ext_bg_init(VisuGlExtBg *obj) { DBG_fprintf(stderr, "Extension Bg: initializing a new object (%p).\n", (gpointer)obj); obj->priv = g_malloc(sizeof(VisuGlExtBgPrivate)); obj->priv->dispose_has_run = FALSE; /* Private data. */ obj->priv->isBuilt = FALSE; obj->priv->bgRGB[0] = bgRGBDefault[0]; obj->priv->bgRGB[1] = bgRGBDefault[1]; obj->priv->bgRGB[2] = bgRGBDefault[2]; obj->priv->bgRGB[3] = bgRGBDefault[3]; obj->priv->bgImage = (guchar*)0; obj->priv->bgImageTitle = (gchar*)0; obj->priv->bgImageFollowZoom = FALSE; obj->priv->bgImageZoomInit = obj->priv->bgImageZoom = -1.f; obj->priv->bgImageZoomRatioInit = 1.f; obj->priv->bgImageXsInit = obj->priv->bgImageXs = 0.5f; obj->priv->bgImageXs0 = 0.f; obj->priv->bgImageYsInit = obj->priv->bgImageYs = 0.5f; obj->priv->bgImageYs0 = 0.f; obj->priv->view = (VisuGlView*)0; obj->priv->widthHeight_signal = 0; g_signal_connect_object(VISU_OBJECT_INSTANCE, "entryParsed::" FLAG_RESOURCE_BG_COLOR, G_CALLBACK(onEntryColor), (gpointer)obj, G_CONNECT_SWAPPED); } static void visu_gl_ext_bg_dispose(GObject* obj) { VisuGlExtBg *bg; DBG_fprintf(stderr, "Extension Bg: dispose object %p.\n", (gpointer)obj); bg = VISU_GL_EXT_BG(obj); if (bg->priv->dispose_has_run) return; bg->priv->dispose_has_run = TRUE; /* Disconnect signals. */ visu_gl_ext_bg_setGlView(bg, (VisuGlView*)0); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_gl_ext_bg_parent_class)->dispose(obj); } static void visu_gl_ext_bg_finalize(GObject* obj) { VisuGlExtBg *bg; g_return_if_fail(obj); DBG_fprintf(stderr, "Extension Bg: finalize object %p.\n", (gpointer)obj); bg = VISU_GL_EXT_BG(obj); /* Free privs elements. */ if (bg->priv) { DBG_fprintf(stderr, "Extension Bg: free private bg.\n"); g_free(bg->priv->bgImage); g_free(bg->priv->bgImageTitle); g_free(bg->priv); } /* Chain up to the parent class */ DBG_fprintf(stderr, "Extension Bg: chain to parent.\n"); G_OBJECT_CLASS(visu_gl_ext_bg_parent_class)->finalize(obj); DBG_fprintf(stderr, "Extension Bg: freeing ... OK.\n"); } /** * visu_gl_ext_bg_new: * @name: (allow-none): the name to give to the extension (default is #VISU_GL_EXT_BG_ID). * * Creates a new #VisuGlExt to draw bg. * * Since: 3.7 * * Returns: a pointer to the #VisuGlExt it created or * NULL otherwise. */ VisuGlExtBg* visu_gl_ext_bg_new(const gchar *name) { char *name_ = VISU_GL_EXT_BG_ID; char *description = _("Set the color of the background."); VisuGlExt *extensionBg; DBG_fprintf(stderr,"Extension Bg: new object.\n"); extensionBg = VISU_GL_EXT(g_object_new(VISU_TYPE_GL_EXT_BG, "name", (name)?name:name_, "label", _(name), "description", description, "nGlObj", 3, "priority", VISU_GL_EXT_PRIORITY_BACKGROUND, "saveState", TRUE, NULL)); return VISU_GL_EXT_BG(extensionBg); } /** * visu_gl_ext_bg_setGlView: * @bg: a #VisuGlExtBg object. * @view: (transfer full) (allow-none): a #VisuGlView object. * * Set the @view @bg is drawn to. It is necessary if @bg has a * background image or is using transparency background colour. * * Since: 3.7 * * Returns: TRUE is @view is new. **/ gboolean visu_gl_ext_bg_setGlView(VisuGlExtBg *bg, VisuGlView *view) { g_return_val_if_fail(VISU_IS_GL_EXT_BG(bg), FALSE); /* No change to be done. */ if (view == bg->priv->view) return FALSE; if (bg->priv->view) { g_signal_handler_disconnect(G_OBJECT(bg->priv->view), bg->priv->widthHeight_signal); g_object_unref(bg->priv->view); } if (view) { g_object_ref(view); bg->priv->widthHeight_signal = g_signal_connect(G_OBJECT(view), "WidthHeightChanged", G_CALLBACK(onBgImageRescale), (gpointer)bg); } else { bg->priv->widthHeight_signal = 0; } bg->priv->view = view; /* Set the bg color for this view. */ glClearColor(bg->priv->bgRGB[0], bg->priv->bgRGB[1], bg->priv->bgRGB[2], bg->priv->bgRGB[3]); bg->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(bg)); } /* Method used to change the value of the parameter backgroundColor. */ /** * visu_gl_ext_bg_setRGBA: * @bg: a #VisuGlExtBg object. * @rgba: a three floats array with values (0 <= values <= 1) for the * red, the green and the blue color. Only values specified by the mask * are really relevant. * @mask: use #TOOL_COLOR_MASK_R, #TOOL_COLOR_MASK_G, #TOOL_COLOR_MASK_B, #TOOL_COLOR_MASK_RGBA or a * combinaison to indicate what values in the rgb array must be taken * into account. * * Method used to change the value of the parameter background_color. * * Returns: TRUE if visu_gl_ext_bg_draw() should be aclled. */ gboolean visu_gl_ext_bg_setRGBA(VisuGlExtBg *bg, float rgba[4], int mask) { gboolean diff; g_return_val_if_fail(VISU_IS_GL_EXT_BG(bg), FALSE); if (mask & TOOL_COLOR_MASK_R && bg->priv->bgRGB[0] != rgba[0]) { bg->priv->bgRGB[0] = rgba[0]; diff = TRUE; } if (mask & TOOL_COLOR_MASK_G && bg->priv->bgRGB[1] != rgba[1]) { bg->priv->bgRGB[1] = rgba[1]; diff = TRUE; } if (mask & TOOL_COLOR_MASK_B && bg->priv->bgRGB[2] != rgba[2]) { bg->priv->bgRGB[2] = rgba[2]; diff = TRUE; } if (mask & TOOL_COLOR_MASK_A && bg->priv->bgRGB[3] != rgba[3]) { bg->priv->bgRGB[3] = rgba[3]; diff = TRUE; } if (!diff) return FALSE; if (bg->priv->view) glClearColor(bg->priv->bgRGB[0], bg->priv->bgRGB[1], bg->priv->bgRGB[2], bg->priv->bgRGB[3]); /* Update the fog color */ visu_gl_ext_fog_create_color(); bg->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(bg)); } /* Get methods. */ /** * visu_gl_ext_bg_getRGBA: * @bg: a #VisuGlExtBg object. * @rgba: (array fixed-size=4) (out): a storage for four values. * * Read the RGBA value of the specific background colour (in [0;1]). */ void visu_gl_ext_bg_getRGBA(VisuGlExtBg *bg, float rgba[4]) { g_return_if_fail(VISU_IS_GL_EXT_BG(bg)); memcpy(rgba, bg->priv->bgRGB, sizeof(float) * 4); } /** * visu_gl_ext_bg_setImage: * @bg: a #VisuGlExtBg object. * @imageData: (allow-none): raw image data in RGB or RGBA format ; * @width: the width ; * @height: the height ; * @alpha: TRUE if the image is RGBA ; * @title: (allow-none): an optional title (can be NULL). * @fit: a boolean (default is TRUE). * * Draw the @imageData on the background. The image is scaled to the * viewport dimensions, keeping the width/height ratio, if @fit is set * to TRUE. If @title is not NULL, the title is also printed on the * background. The image data are copied and can be free after this * call. */ void visu_gl_ext_bg_setImage(VisuGlExtBg *bg, const guchar *imageData, guint width, guint height, gboolean alpha, const gchar *title, gboolean fit) { guint n; g_return_if_fail(VISU_IS_GL_EXT_BG(bg)); g_free(bg->priv->bgImage); bg->priv->bgImage = (guchar*)0; g_free(bg->priv->bgImageTitle); bg->priv->bgImageTitle = (gchar*)0; bg->priv->isBuilt = FALSE; if (!imageData) return; DBG_fprintf(stderr, "Extension bg: copy image to memory buffer.\n"); /* We copy the image to some correct size buffer. */ bg->priv->bgImageW = width; bg->priv->bgImageH = height; n = (alpha)?4:3; bg->priv->bgImage = g_memdup(imageData, sizeof(guchar) * bg->priv->bgImageW * bg->priv->bgImageH * n); bg->priv->bgImageAlpha = alpha; if (title) bg->priv->bgImageTitle = g_strdup_printf(_("Background: %s"), title); bg->priv->bgImageFit = fit; bg->priv->bgImageZoomInit = bg->priv->bgImageZoom = -1.f; bg->priv->bgImageZoomRatioInit = 1.f; bg->priv->bgImageXsInit = bg->priv->bgImageXs = 0.5f; bg->priv->bgImageXs0 = 0.f; bg->priv->bgImageYsInit = bg->priv->bgImageYs = 0.5f; bg->priv->bgImageYs0 = 0.f; } /** * visu_gl_ext_bg_setFollowCamera: * @bg: a #VisuGlExtBg object. * @follow: a boolean. * @zoomInit: a floating point value. * @xs: a floating point value. * @ys: a floating point value. * * When @follow is TRUE, the size and the position of the background * image is adjusted with every camera change. * * Since: 3.7 * * Returns: TRUE if the following status has been changed. */ gboolean visu_gl_ext_bg_setFollowCamera(VisuGlExtBg *bg, gboolean follow, float zoomInit, float xs, float ys) { g_return_val_if_fail(VISU_IS_GL_EXT_BG(bg), FALSE); if (follow == bg->priv->bgImageFollowZoom) return FALSE; bg->priv->bgImageFollowZoom = follow; if (follow) { bg->priv->bgImageZoomInit = bg->priv->bgImageZoom = zoomInit; bg->priv->bgImageXsInit = bg->priv->bgImageXs = xs; bg->priv->bgImageYsInit = bg->priv->bgImageYs = ys; } else { bg->priv->bgImageZoomRatioInit *= bg->priv->bgImageZoom / bg->priv->bgImageZoomInit; bg->priv->bgImageXs0 -= bg->priv->bgImageXs - bg->priv->bgImageXsInit; bg->priv->bgImageYs0 -= bg->priv->bgImageYs - bg->priv->bgImageYsInit; } bg->priv->isBuilt = FALSE; return TRUE; } /** * visu_gl_ext_bg_setCamera: * @bg: a #VisuGlExtBg object. * @zoom: a floating point value. * @xs: a floating point value. * @ys: a floating point value. * * If the background image is in follow mode, see * visu_gl_ext_bg_setFollowCamera(), this routine is used to update * the current camera settings of the background image. * * Since: 3.7 * * Returns: TRUE if the settings are indeed changed. */ gboolean visu_gl_ext_bg_setCamera(VisuGlExtBg *bg, float zoom, float xs, float ys) { g_return_val_if_fail(VISU_IS_GL_EXT_BG(bg), FALSE); if (zoom == bg->priv->bgImageZoom && xs == bg->priv->bgImageXs && ys == bg->priv->bgImageYs) return FALSE; if (bg->priv->bgImageFollowZoom) { bg->priv->bgImageZoom = zoom; bg->priv->bgImageXs = xs; bg->priv->bgImageYs = ys; } return bg->priv->bgImageFollowZoom; } /** * visu_gl_ext_bg_draw: * @bg: a #VisuGlExtBg object. * * Creates the OpenGL lists used by @bg (like the background image). * * Since: 3.7 **/ void visu_gl_ext_bg_draw(VisuGlExtBg *bg) { g_return_if_fail(VISU_IS_GL_EXT_BG(bg)); /* Nothing to draw; */ if(!bg->priv->view || !visu_gl_ext_getActive(VISU_GL_EXT(bg)) || bg->priv->isBuilt) return; if (bg->priv->bgRGB[3] < 1.f) createBgChess(bg); else glDeleteLists(visu_gl_ext_getGlList(VISU_GL_EXT(bg)) + 1, 1); if (bg->priv->bgImage) createBgImage(bg); else glDeleteLists(visu_gl_ext_getGlList(VISU_GL_EXT(bg)) + 2, 1); glNewList(visu_gl_ext_getGlList(VISU_GL_EXT(bg)), GL_COMPILE); glCallList(visu_gl_ext_getGlList(VISU_GL_EXT(bg)) + 1); glCallList(visu_gl_ext_getGlList(VISU_GL_EXT(bg)) + 2); glEndList(); } /** * visu_gl_ext_bg_getDefault: * * V_Sim is using a default bg object. * * Since: 3.7 * * Returns: (transfer none): a #VisuGlExtBg object used by default. **/ VisuGlExtBg* visu_gl_ext_bg_getDefault() { if (!defaultBg) defaultBg = visu_gl_ext_bg_new((gchar*)0); return defaultBg; } /****************/ /* Private part */ /****************/ static void visu_gl_ext_bg_rebuild(VisuGlExt *ext) { VisuGlExtBg *bg = VISU_GL_EXT_BG(ext); DBG_fprintf(stderr, "Fog & Bg: rebuild extension.\n"); glClearColor(bg->priv->bgRGB[0], bg->priv->bgRGB[1], bg->priv->bgRGB[2], bg->priv->bgRGB[3]); visu_gl_ext_bg_draw(bg); /* To be moved... */ if (bg->priv->view && visu_gl_ext_fog_getOn()) { glEnable(GL_FOG); glFogi(GL_FOG_MODE, GL_LINEAR); visu_gl_ext_fog_create_color(); visu_gl_ext_fog_create(bg->priv->view, visu_boxed_getBox(VISU_BOXED(bg->priv->view))); } } static void onBgImageRescale(VisuGlView *view _U_, gpointer data) { DBG_fprintf(stderr, "Extension Bg: caught the 'WidthHeightChanged' signal.\n"); if (VISU_GL_EXT_BG(data)->priv->bgImage) createBgImage(VISU_GL_EXT_BG(data)); if (VISU_GL_EXT_BG(data)->priv->bgRGB[3] < 1.f) createBgChess(VISU_GL_EXT_BG(data)); } static void onEntryColor(VisuGlExtBg *bg, gchar *key _U_, VisuObject *obj _U_) { visu_gl_ext_bg_setRGBA(bg, bgRGBDefault, TOOL_COLOR_MASK_RGBA); } static void createBgImage(VisuGlExtBg *bg) { int viewport[4]; float x, y; float zoom; DBG_fprintf(stderr, "Extension bg: set background image.\n"); g_return_if_fail(VISU_IS_GL_EXT_BG(bg) && bg->priv->bgImage); visu_gl_text_initFontList(); glGetIntegerv(GL_VIEWPORT, viewport); if (bg->priv->bgImageFit) { x = (float)viewport[2] / (float)bg->priv->bgImageW; y = (float)viewport[3] / (float)bg->priv->bgImageH; } else { x = y = 1.f; } DBG_fprintf(stderr, "Extension bg: use follow zoom %d (%g / %g).\n", bg->priv->bgImageFollowZoom, bg->priv->bgImageZoom, bg->priv->bgImageZoomInit); zoom = MIN(x, y) * bg->priv->bgImageZoomRatioInit * bg->priv->bgImageZoom / bg->priv->bgImageZoomInit; x = ((float)viewport[2] - zoom * (float)bg->priv->bgImageW) / 2.f; x += (float)viewport[2] * (bg->priv->bgImageXs - bg->priv->bgImageXsInit - bg->priv->bgImageXs0); y = ((float)viewport[3] - zoom * (float)bg->priv->bgImageH) / 2.f; y -= (float)viewport[3] * (bg->priv->bgImageYs - bg->priv->bgImageYsInit - bg->priv->bgImageYs0); glNewList(visu_gl_ext_getGlList(VISU_GL_EXT(bg)) + 2, GL_COMPILE); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluOrtho2D(0., (float)viewport[2], 0., (float)viewport[3]); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glDepthMask(0); glRasterPos2i(0, 0); glBitmap(0, 0, 0, 0, x, viewport[3] - y, NULL); glPixelZoom(zoom, -zoom); if (bg->priv->bgImageAlpha) glDrawPixels(bg->priv->bgImageW, bg->priv->bgImageH, GL_RGBA, GL_UNSIGNED_BYTE, bg->priv->bgImage); else glDrawPixels(bg->priv->bgImageW, bg->priv->bgImageH, GL_RGB, GL_UNSIGNED_BYTE, bg->priv->bgImage); glPixelZoom(1., 1.); if (bg->priv->bgImageTitle) { glDisable(GL_LIGHTING); glColor4f(1.f - bg->priv->bgRGB[0], 1.f - bg->priv->bgRGB[1], 1.f - bg->priv->bgRGB[2], 1.f); glRasterPos2f(5.f, 5.f); visu_gl_text_drawChars(bg->priv->bgImageTitle, VISU_GL_TEXT_NORMAL); } glDepthMask(1); glPopMatrix(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glEndList(); } static void createBgChess(VisuGlExtBg *bg) { GLubyte chessboard[32][32][3]; int viewport[4]; int i, j, c; DBG_fprintf(stderr, "Extension bg: set background chess board (alpha = %g).\n", bg->priv->bgRGB[3]); if (texName == 0) glGenTextures(1, &texName); /* We create the chessboard texture with the right colour. */ for (i = 0; i < 32; i++) for (j = 0; j < 32; j++) { c = 128 + ( ((i&0x10)==0) ^ ((j&0x10) == 0) ) * 64; chessboard[i][j][0] = (GLubyte)(255.f * bg->priv->bgRGB[0] * bg->priv->bgRGB[3] + (1.f - bg->priv->bgRGB[3]) * c); chessboard[i][j][1] = (GLubyte)(255.f * bg->priv->bgRGB[1] * bg->priv->bgRGB[3] + (1.f - bg->priv->bgRGB[3]) * c); chessboard[i][j][2] = (GLubyte)(255.f * bg->priv->bgRGB[2] * bg->priv->bgRGB[3] + (1.f - bg->priv->bgRGB[3]) * c); } /* We bind the texture. */ glBindTexture(GL_TEXTURE_2D, texName); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, chessboard); glGetIntegerv(GL_VIEWPORT, viewport); glNewList(visu_gl_ext_getGlList(VISU_GL_EXT(bg)) + 1, GL_COMPILE); glDisable(GL_CULL_FACE); glDisable(GL_LIGHTING); glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glBindTexture(GL_TEXTURE_2D, texName); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluOrtho2D(0., (float)viewport[2], 0., (float)viewport[3]); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glDepthMask(0); glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.0, 0.0); glTexCoord2f(0.0, (float)viewport[3] / 32.f); glVertex3f(0.0, (float)viewport[3], 0.0); glTexCoord2f((float)viewport[2] / 32.f, (float)viewport[3] / 32.f); glVertex3f((float)viewport[2], (float)viewport[3], 0.0); glTexCoord2f((float)viewport[2] / 32.f, 0.0); glVertex3f((float)viewport[2], 0.0, 0.0); glEnd(); glDepthMask(1); glPopMatrix(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glDisable(GL_TEXTURE_2D); glEndList(); } /* Export function that is called by visu_module to write the values of resources to a file. */ static void exportResourcesBg(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { if (!defaultBg) return; visu_config_file_exportComment(data, DESC_RESOURCE_BG_COLOR); visu_config_file_exportEntry(data, FLAG_RESOURCE_BG_COLOR, NULL, "%4.3f %4.3f %4.3f %4.3f", defaultBg->priv->bgRGB[0], defaultBg->priv->bgRGB[1], defaultBg->priv->bgRGB[2], defaultBg->priv->bgRGB[3]); visu_config_file_exportComment(data, ""); } /*********************/ /* Dealing with fog. */ /*********************/ /* This is a boolean to control is the axes is render or not. */ #define FLAG_RESOURCE_FOG_USED "fog_is_on" #define DESC_RESOURCE_FOG_USED "Control if the fog is used ; boolean (0 or 1)" #define RESOURCE_FOG_USED_DEFAULT 0 static gboolean readFogIsOn(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); #define FLAG_RESOURCE_FOG_SPECIFIC "fog_color_is_specific" #define DESC_RESOURCE_FOG_SPECIFIC "Control if the fog uses a specific color ; boolean (0 or 1)" #define RESOURCE_FOG_SPECIFIC_DEFAULT 0 static int fogColorSpecific; static gboolean readFogSpecific(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); /* A resource to control the color used to render the lines of the axes. */ #define FLAG_RESOURCE_FOG_COLOR "fog_specific_color" #define DESC_RESOURCE_FOG_COLOR "Define the color of the fog ; four floating point values (0. <= v <= 1.)" static float fogRGB[4]; static gboolean readFogColor(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); #define FLAG_RESOURCE_FOG_STARTEND "fog_start_end" #define DESC_RESOURCE_FOG_STARTEND "Define the position of the fog ; two floating point values (0. <= v <= 1.)" static float fog_start, fog_end; static gboolean readFogStartEnd(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); /* Export function that is called by visu_module to write the values of resources to a file. */ static void exportResourcesFog(GString *data, VisuData *dataObj, VisuGlView *view); /* Local variables. */ static float fogRGBDefault[4] = {0., 0., 0., 1.}; static float fogStartEndDefault[2] = {0.3, 0.7}; static gboolean fogIsOn; static gboolean fogHasBeenBuilt; static gulong nearFar_signal; /* Callbacks. */ static void rebuildFogOnResources(GObject *obj, VisuData *dataObj, gpointer data); static void onDataReadySignal(GObject *visu, VisuData *dataObj, VisuGlView *view, gpointer data); static void onDataNotReadySignal(GObject *visu, VisuData *dataObj, VisuGlView *view, gpointer data); static void onFogParameterChanged(VisuGlView *view, gpointer data); void visu_gl_ext_fog_init() { visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_FOG_USED, DESC_RESOURCE_FOG_USED, 1, readFogIsOn); visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_FOG_SPECIFIC, DESC_RESOURCE_FOG_SPECIFIC, 1, readFogSpecific); visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_FOG_COLOR, DESC_RESOURCE_FOG_COLOR, 1, readFogColor); visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_FOG_STARTEND, DESC_RESOURCE_FOG_STARTEND, 1, readFogStartEnd); visu_config_file_addExportFunction(VISU_CONFIG_FILE_RESOURCE, exportResourcesFog); /* Initialisation des valeurs par dfaut. */ fogIsOn = FALSE; fogHasBeenBuilt = FALSE; fogColorSpecific = RESOURCE_FOG_SPECIFIC_DEFAULT; memcpy(fogRGB, fogRGBDefault, 4 * sizeof(float)); fog_start = fogStartEndDefault[0]; fog_end = fogStartEndDefault[1]; g_signal_connect(VISU_OBJECT_INSTANCE, "resourcesLoaded", G_CALLBACK(rebuildFogOnResources), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "dataRendered", G_CALLBACK(onDataReadySignal), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "dataUnRendered", G_CALLBACK(onDataNotReadySignal), (gpointer)0); } /* Method used to change the value of the parameter fog. */ int visu_gl_ext_fog_setValues(float rgba[4], int mask) { int diff = 0; if (mask & TOOL_COLOR_MASK_R && fogRGB[0] != rgba[0]) { fogRGB[0] = rgba[0]; diff = 1; } if (mask & TOOL_COLOR_MASK_G && fogRGB[1] != rgba[1]) { fogRGB[1] = rgba[1]; diff = 1; } if (mask & TOOL_COLOR_MASK_B && fogRGB[2] != rgba[2]) { fogRGB[2] = rgba[2]; diff = 1; } if (mask & TOOL_COLOR_MASK_A && fogRGB[3] != rgba[3]) { fogRGB[3] = rgba[3]; diff = 1; } if (!diff) return 0; /* The method which calls the set method should ask for redraw. */ if (fogColorSpecific) glFogfv(GL_FOG_COLOR, fogRGB); return (fogColorSpecific && fogIsOn); } /* Get methods. */ void visu_gl_ext_fog_getValues(float rgba[4]) { memcpy(rgba, fogRGB, sizeof(float) * 4); } /* Method used to change the value of the parameter axes_is_on. */ gboolean visu_gl_ext_fog_setOn(gboolean value) { if (value == fogIsOn) return FALSE; fogIsOn = value; if (value) { glEnable(GL_FOG); glFogi(GL_FOG_MODE, GL_LINEAR); /* glFogi(GL_FOG_MODE, GL_EXP); */ /* glFogf(GL_FOG_DENSITY, 0.03f); */ } else glDisable(GL_FOG); return (value && !fogHasBeenBuilt); } gboolean visu_gl_ext_fog_getOn() { return fogIsOn; } gboolean visu_gl_ext_fog_setUseSpecificColor(gboolean value) { if (value == fogColorSpecific) return FALSE; fogColorSpecific = value; visu_gl_ext_fog_create_color(); return fogIsOn; } gboolean visu_gl_ext_fog_getUseSpecificColor() { return fogColorSpecific; } gboolean visu_gl_ext_fog_setStartEndValues(float startEnd[2], int mask) { int diff = 0; if (mask & VISU_GL_EXT_FOG_MASK_START && fog_start != startEnd[0]) { fog_start = CLAMP(startEnd[0], 0., 1.); if (mask & VISU_GL_EXT_FOG_MASK_END) { if (fog_start >= startEnd[1]) fog_start = startEnd[1] - 0.001; } else if (fog_start >= fog_end) fog_start = fog_end - 0.001; diff = 1; } if (mask & VISU_GL_EXT_FOG_MASK_END && fog_end != startEnd[1]) { fog_end = CLAMP(startEnd[1], 0., 1.); if (fog_end <= fog_start) fog_end = fog_start + 0.001; diff = 1; } if (!diff) return FALSE; /* The method which calls the set method should ask for redraw. */ /* visu_gl_ext_fog_create((GObject*)0, (gpointer)0); */ fogHasBeenBuilt = FALSE; return (fogIsOn); } float visu_gl_ext_fog_getStart() { return fog_start; } float visu_gl_ext_fog_getEnd() { return fog_end; } /** * visu_gl_ext_fog_create: * @view: the #VisuGlView object the fog apply to. * @box: the #VisuBox object to delimit the area start and end. * * Call the OpenGL routine to enable and initialise the fog. The fog * is created in the not duplicated cell of @box. */ void visu_gl_ext_fog_create(VisuGlView *view, VisuBox *box) { float start, stop, bSize, centre; g_return_if_fail(view); bSize = visu_box_getGlobalSize(box, FALSE); centre = ((view->camera->d_red > 100.f)?100.f:view->camera->d_red) * view->camera->length0; start = centre - bSize + 2.f * bSize * fog_start; stop = centre - bSize + 2.f * bSize * fog_end; /* start = visuBox->extens * visuCamera->d_red * (1. - fog_start); */ /* stop = visuBox->extens * visuCamera->d_red * (1. + fog_end); */ /* start = visuBox->extens * visuCamera->d_red * (1. - 1 / 1.1); */ /* stop = visuBox->extens * visuCamera->d_red * (1. + 1 / 1.1); */ /* fprintf(stderr, "----------> %f %f %f %f\n", (float)(view->window->near + */ /* (view->window->far - view->window->near) * fog_start), (float)(view->window->near + */ /* (view->window->far - view->window->near) * fog_end), start, stop); */ glFogf(GL_FOG_START, start); glFogf(GL_FOG_END, stop); fogHasBeenBuilt = TRUE; } void visu_gl_ext_fog_create_color() { float bgRGB[4]; if (fogColorSpecific) glFogfv(GL_FOG_COLOR, fogRGB); else { visu_gl_ext_bg_getRGBA(visu_gl_ext_bg_getDefault(), bgRGB); glFogfv(GL_FOG_COLOR, bgRGB); } } /* Callbacks. */ static void rebuildFogOnResources(GObject *obj _U_, VisuData *dataObj _U_, gpointer data _U_) { DBG_fprintf(stderr, "Extension Fog: caught the 'resourcesLoaded' signal, rebuilding" " fog.\n"); /* g_message("TODO: add a way to update fog when loading resources.\n"); */ } static void onDataReadySignal(GObject *visu _U_, VisuData *dataObj, VisuGlView *view, gpointer data _U_) { if (dataObj && view) { visu_gl_ext_fog_create(view, visu_boxed_getBox(VISU_BOXED(dataObj))); nearFar_signal = g_signal_connect(G_OBJECT(view), "NearFarChanged", G_CALLBACK(onFogParameterChanged), (gpointer)dataObj); } } static void onDataNotReadySignal(GObject *visu _U_, VisuData *dataObj _U_, VisuGlView *view, gpointer data _U_) { g_signal_handler_disconnect(G_OBJECT(view), nearFar_signal); } static void onFogParameterChanged(VisuGlView *view, gpointer data) { DBG_fprintf(stderr, "Extension Fog: caught the 'NearFarChanged' signal, rebuilding" " fog.\n"); visu_gl_ext_fog_create(view, visu_boxed_getBox(VISU_BOXED(data))); } /* Resources. */ /* This is a boolean to control is the fog is render or not. */ static gboolean readFogIsOn(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { gboolean val; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readBoolean(lines[0], position, &val, 1, error)) return FALSE; visu_gl_ext_fog_setOn(val); return TRUE; } /* This is a boolean to control the color used by the fog : a specific one or the background color. */ static gboolean readFogSpecific(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { gboolean val; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readBoolean(lines[0], position, &val, 1, error)) return FALSE; visu_gl_ext_fog_setUseSpecificColor(val); return TRUE; } /* A resource to control the color used for the background. */ static gboolean readFogColor(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { float val[4]; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readFloat(lines[0], position, val, 4, error)) { if (*error) g_error_free(*error); *error = (GError*)0; /* Read old 3 values. */ if (!tool_config_file_readFloat(lines[0], position, val, 3, error)) return FALSE; val[3] = 0.f; } visu_gl_ext_fog_setValues(val, TOOL_COLOR_MASK_RGBA); return TRUE; } /* A resource to control the color used for the background. */ static gboolean readFogStartEnd(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { float val[2]; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readFloat(lines[0], position, val, 2, error)) return FALSE; visu_gl_ext_fog_setStartEndValues(val, VISU_GL_EXT_FOG_MASK_START | VISU_GL_EXT_FOG_MASK_END); return TRUE; } /* Export function that is called by visu_module to write the values of resources to a file. */ static void exportResourcesFog(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { visu_config_file_exportComment(data, DESC_RESOURCE_FOG_USED); visu_config_file_exportEntry(data, FLAG_RESOURCE_FOG_USED, NULL, "%d", fogIsOn); visu_config_file_exportComment(data, DESC_RESOURCE_FOG_SPECIFIC); visu_config_file_exportEntry(data, FLAG_RESOURCE_FOG_SPECIFIC, NULL, "%d", fogColorSpecific); visu_config_file_exportComment(data, DESC_RESOURCE_FOG_COLOR); visu_config_file_exportEntry(data, FLAG_RESOURCE_FOG_COLOR, NULL, "%4.3f %4.3f %4.3f %4.3f", fogRGB[0], fogRGB[1], fogRGB[2], fogRGB[3]); visu_config_file_exportComment(data, DESC_RESOURCE_FOG_STARTEND); visu_config_file_exportEntry(data, FLAG_RESOURCE_FOG_STARTEND, NULL, "%4.3f %4.3f", fog_start, fog_end); visu_config_file_exportComment(data, ""); } v_sim-3.7.0/src/extensions/fogAndBGColor.h0000644000353400050620000002124412215546077015342 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef FOG_H #define FOG_H #include #include #include /** * visu_gl_ext_fog_init: (skip) * * It initialises all variables of the OpenGL extension. * It creates all resources and parameters introduced by * this extension. * * Returns: a pointer to the VisuGlExt it created or * NULL otherwise. */ void visu_gl_ext_fog_init(); /** * visu_gl_ext_fog_setValues: * @rgba: a three floats array with values (0 <= values <= 1) for the * red, the green and the blue color. Only values specified by the mask * are really relevant. * @mask: use #TOOL_COLOR_MASK_R, #TOOL_COLOR_MASK_G, #TOOL_COLOR_MASK_B, #TOOL_COLOR_MASK_RGBA or a * combinaison to indicate what values in the rgb array must be taken * into account. * * Method used to change the value of the parameter fog_specific_color. * This color is actually used only if fog_color_is_specific is set to 1, * use setFogColorSpecific() to do that. * * Returns: 0 if redrawing is not necessary. * 1 if the rendering window must be redrawn. */ int visu_gl_ext_fog_setValues(float rgba[4], int mask); /** * visu_gl_ext_fog_setOn: * @value: TRUE if fog must be rendered, FALSE otherwise. * * Method used to change the value of the parameter fog_is_on. * * Returns: FALSE if redrawing is not necessary. * TRUE if the rendering window must be redrawn. */ gboolean visu_gl_ext_fog_setOn(gboolean value); /** * visu_gl_ext_fog_setUseSpecificColor: * @value: TRUE if fog is rendered with its own color specified * by setFogRGBValues() or FALSE if the fog uses the background * color. * * Method used to change the value of the parameter fog_color_is_specific. * * Returns: TRUE if visu_gl_ext_fog_create() should be called. In all cases, 'OpenGLAskForReDraw' * signal should then be emitted. */ gboolean visu_gl_ext_fog_setUseSpecificColor(gboolean value); /** * VISU_GL_EXT_FOG_MASK_START: * * Value used by the second parameter of setFogStartEndValues() to * specified the value that must be changed. This actually changes * the fog_start value. */ #define VISU_GL_EXT_FOG_MASK_START (1 << 0) /** * VISU_GL_EXT_FOG_MASK_END: * * Value used by the second parameter of setFogStartEndValues() to * specified the value that must be changed. This actually changes * the fog_end value. */ #define VISU_GL_EXT_FOG_MASK_END (1 << 1) /** * visu_gl_ext_fog_setStartEndValues: * @startEnd: a two floats array with values (0 <= values <= 1) for the * beging and the ending of the fog position. Only values specified by the mask * are really relevant. * @mask: use #VISU_GL_EXT_FOG_MASK_START, #VISU_GL_EXT_FOG_MASK_END to indicate what values in * the startEnd array must be taken into account. * * Method used to change the value of the parameters fog_start and * fog_end. * * Returns: TRUE if visu_gl_ext_fog_create() should be called and then 'OpenGLAskForReDraw' * signal be emitted. */ gboolean visu_gl_ext_fog_setStartEndValues(float startEnd[2], int mask); /** * visu_gl_ext_fog_getValues: * @rgba: a storage for four values. * * Read the RGBA value of the specific fog colour (in [0;1]). */ void visu_gl_ext_fog_getValues(float rgba[4]); /** * visu_gl_ext_fog_getOn: * * Read if fog is used or not. * * Returns: TRUE if the fog is rendered, FALSE otherwise. */ gboolean visu_gl_ext_fog_getOn(); /** * visu_gl_ext_fog_getUseSpecificColor: * * Read if fog uses a specific colour or not. * * Returns: TRUE if the fog uses its own color or FALSE if it uses * the color of the background. */ gboolean visu_gl_ext_fog_getUseSpecificColor(); /** * visu_gl_ext_fog_getStart: * * Read the starting value of the fog (in [0;1]). * * Returns: the position where the fog starts. */ float visu_gl_ext_fog_getStart(); /** * visu_gl_ext_fog_getEnd: * * Read the ending value of the fog (in [0;1]). * * Returns: the position where the fog ends. */ float visu_gl_ext_fog_getEnd(); void visu_gl_ext_fog_create(VisuGlView *view, VisuBox *box); /** * visu_gl_ext_fog_create_color: * * Call the OpenGL routines that change the colour of the fog. */ void visu_gl_ext_fog_create_color(); /** * VISU_TYPE_GL_EXT_BG: * * return the type of #VisuGlExtBg. * * Since: 3.7 */ #define VISU_TYPE_GL_EXT_BG (visu_gl_ext_bg_get_type ()) /** * VISU_GL_EXT_BG: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuGlExtBg type. * * Since: 3.7 */ #define VISU_GL_EXT_BG(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_GL_EXT_BG, VisuGlExtBg)) /** * VISU_GL_EXT_BG_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuGlExtBgClass. * * Since: 3.7 */ #define VISU_GL_EXT_BG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_GL_EXT_BG, VisuGlExtBgClass)) /** * VISU_IS_GL_EXT_BG: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuGlExtBg object. * * Since: 3.7 */ #define VISU_IS_GL_EXT_BG(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_GL_EXT_BG)) /** * VISU_IS_GL_EXT_BG_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuGlExtBgClass class. * * Since: 3.7 */ #define VISU_IS_GL_EXT_BG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_GL_EXT_BG)) /** * VISU_GL_EXT_BG_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. * * Since: 3.7 */ #define VISU_GL_EXT_BG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_GL_EXT_BG, VisuGlExtBgClass)) typedef struct _VisuGlExtBg VisuGlExtBg; typedef struct _VisuGlExtBgPrivate VisuGlExtBgPrivate; typedef struct _VisuGlExtBgClass VisuGlExtBgClass; struct _VisuGlExtBg { VisuGlExt parent; VisuGlExtBgPrivate *priv; }; struct _VisuGlExtBgClass { VisuGlExtClass parent; }; /** * VISU_GL_EXT_BG_ID: * * The id used to identify this extension, see * visu_gl_ext_rebuild() for instance. */ #define VISU_GL_EXT_BG_ID "Background" /** * visu_gl_ext_bg_get_type: * * This method returns the type of #VisuGlExtBg, use * VISU_TYPE_GL_EXT_BG instead. * * Since: 3.7 * * Returns: the type of #VisuGlExtBg. */ GType visu_gl_ext_bg_get_type(void); VisuGlExtBg* visu_gl_ext_bg_new(const gchar *name); int visu_gl_ext_bg_setRGBA(VisuGlExtBg *bg, float rgba[3], int mask); void visu_gl_ext_bg_getRGBA(VisuGlExtBg *bg, float rgba[4]); void visu_gl_ext_bg_setImage(VisuGlExtBg *bg, const guchar *imageData, guint width, guint height, gboolean alpha, const gchar *title, gboolean fit); gboolean visu_gl_ext_bg_setFollowCamera(VisuGlExtBg *bg, gboolean follow, float zoomInit, float xs, float ys); gboolean visu_gl_ext_bg_setCamera(VisuGlExtBg *bg, float zoom, float xs, float ys); VisuGlExtBg* visu_gl_ext_bg_getDefault(); gboolean visu_gl_ext_bg_setGlView(VisuGlExtBg *bg, VisuGlView *view); void visu_gl_ext_bg_draw(VisuGlExtBg *bg); #endif v_sim-3.7.0/src/extensions/scale.c0000644000353400050620000010172312215546077014017 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "scale.h" #include #include #include #include #include #include #include #include #include #include #include #include #include /** * SECTION:scale * @short_description: Draw an arrow with a label. * * This little extension is used to draw an arrow at a given position * displaying a given length. * * Since: 3.3 */ /** * VisuGlExtScaleClass: * @parent: parent structure. * * An opaque structure. * * Since: 3.3 */ /** * VisuGlExtScale: * * All fields are private, use the access routines. * * Since: 3.3 */ /** * VisuGlExtScalePrivate: * * All fields are private, use the access routines. * * Since: 3.3 */ /* Parameters & resources*/ /* This is a boolean to control is the axes is render or not. */ #define FLAG_RESOURCE_SCALE_USED "scales_are_on" #define DESC_RESOURCE_SCALE_USED "Control if scales are drawn ; boolean (0 or 1)" #define SCALE_USED_DEFAULT 0 static gboolean readScaleIsOn(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); /* A resource to control the color used to render the lines of the Scale. */ #define FLAG_RESOURCE_SCALE_COLOR "scales_color" #define DESC_RESOURCE_SCALE_COLOR "Define the color RGBA of all scales ; four floating point values (0. <= v <= 1.)" static gboolean readScaleColor(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); /* A resource to control the width to render the lines of the Scale. */ #define FLAG_RESOURCE_SCALE_LINE "scales_line_width" #define DESC_RESOURCE_SCALE_LINE "Define the width of the lines of all scales ; one floating point value (1. <= v <= 10.)" static gboolean readScaleLineWidth(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); /* A resource to control the width to render the lines of the Scale. */ #define FLAG_RESOURCE_SCALE_STIPPLE "scales_line_stipple" #define DESC_RESOURCE_SCALE_STIPPLE "Define the stipple pattern of the lines of all scales ; one integer value (0 <= v <= 65535)" static gboolean readScaleLineStipple(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); /* A resource to control the elements of a scale (origin, direction, length... */ #define FLAG_RESOURCE_SCALE_DEFINITION "scale_definition" #define DESC_RESOURCE_SCALE_DEFINITION "Define the position, the direction, the length and the legend of a scale ; position[3] direction[3] length legend" #define SCALE_LEGEND_DEFAULT _("Length: %6.2f") static gboolean readScaleDefinition(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); /* Export function that is called by visu_module to write the values of resources to a file. */ static void exportResourcesScale(GString *data, VisuData *dataObj, VisuGlView *view); #define SCALE_AUTO_LEGEND "[auto]" typedef struct _Arrow { /* Definition of the scale. */ float origin[3]; float direction[3]; float length; /* Characteristics. */ gboolean drawn; gchar *legendPattern; GString *legend; } Arrow; struct _VisuGlExtScalePrivate { /* Internal object gestion. */ gboolean dispose_has_run; gboolean isBuilt; /* A list of arrows. */ GList *arrows; /* Related objects. */ VisuGlView *view; gulong widthHeight_signal, nearFar_signal, angles_signal; }; static VisuGlExtScale * defaultScale = NULL; /* Some global modifiers. */ static float _width = 1.f; static float _rgba[4] = {0.f, 0.f, 0.f, 1.f}; static guint16 _stipple = 65535; /* Object gestion methods. */ static void scale_dispose (GObject* obj); static void scale_finalize(GObject* obj); static void scale_rebuild (VisuGlExt *ext); /* Local methods. */ static void _freeArrow(Arrow *arr); static void _drawArrow(Arrow *arr, guint nlat); /* Local callbacks */ static void onScaleParametersChange(VisuGlView *view, gpointer data); G_DEFINE_TYPE(VisuGlExtScale, visu_gl_ext_scale, VISU_TYPE_GL_EXT) static void visu_gl_ext_scale_class_init(VisuGlExtScaleClass *klass) { VisuConfigFileEntry *resourceEntry; DBG_fprintf(stderr, "Scale: creating the class of the object.\n"); /* Connect freeing methods. */ G_OBJECT_CLASS(klass)->dispose = scale_dispose; G_OBJECT_CLASS(klass)->finalize = scale_finalize; VISU_GL_EXT_CLASS(klass)->rebuild = scale_rebuild; /* Create the entries in config files. */ DBG_fprintf(stderr," - create entries for config file.\n"); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_SCALE_USED, DESC_RESOURCE_SCALE_USED, 1, readScaleIsOn); visu_config_file_entry_setVersion(resourceEntry, 3.3f); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_SCALE_COLOR, DESC_RESOURCE_SCALE_COLOR, 1, readScaleColor); visu_config_file_entry_setVersion(resourceEntry, 3.3f); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_SCALE_LINE, DESC_RESOURCE_SCALE_LINE, 1, readScaleLineWidth); visu_config_file_entry_setVersion(resourceEntry, 3.3f); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_SCALE_DEFINITION, DESC_RESOURCE_SCALE_DEFINITION, 1, readScaleDefinition); visu_config_file_entry_setVersion(resourceEntry, 3.3f); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_SCALE_STIPPLE, DESC_RESOURCE_SCALE_STIPPLE, 1, readScaleLineStipple); visu_config_file_entry_setVersion(resourceEntry, 3.4f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_RESOURCE, exportResourcesScale); g_type_class_add_private(klass, sizeof(VisuGlExtScalePrivate)); } static void visu_gl_ext_scale_init(VisuGlExtScale *obj) { DBG_fprintf(stderr, "Scale: creating a new scale (%p).\n", (gpointer)obj); obj->priv = G_TYPE_INSTANCE_GET_PRIVATE(obj, VISU_TYPE_GL_EXT_SCALE, VisuGlExtScalePrivate); obj->priv->dispose_has_run = FALSE; obj->priv->isBuilt = FALSE; obj->priv->arrows = (GList*)0; obj->priv->view = (VisuGlView*)0; obj->priv->widthHeight_signal = 0; obj->priv->nearFar_signal = 0; obj->priv->angles_signal = 0; } /* This method can be called several times. It should unref all of its reference to GObjects. */ static void scale_dispose(GObject* obj) { DBG_fprintf(stderr, "Scale: dispose object %p.\n", (gpointer)obj); if (VISU_GL_EXT_SCALE(obj)->priv->dispose_has_run) return; VISU_GL_EXT_SCALE(obj)->priv->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS(visu_gl_ext_scale_parent_class)->dispose(obj); } /* This method is called once only. */ static void scale_finalize(GObject* obj) { VisuGlExtScale *scale = VISU_GL_EXT_SCALE(obj); GList *lst; g_return_if_fail(obj); DBG_fprintf(stderr, "Scale: finalize object %p.\n", (gpointer)obj); /* Free my memory. */ for (lst = scale->priv->arrows; lst; lst = g_list_next(lst)) _freeArrow((Arrow*)lst->data); g_list_free(scale->priv->arrows); visu_gl_ext_scale_setGlView(scale, (VisuGlView*)0); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_gl_ext_scale_parent_class)->finalize(obj); } /** * visu_gl_ext_scale_new: * @name: (allow-none): a name for the #VisuGlExt. * * Create a new arrow set without any elements. Add arrows with visu_gl_ext_scale_add(). * * Returns: a newly created #VisuGlExtScale object. * * Since: 3.3 */ VisuGlExtScale* visu_gl_ext_scale_new(const gchar *name) { char *name_ = "Scale"; char *description = _("Draw scales in the rendering area."); VisuGlExt *scale; scale = VISU_GL_EXT(g_object_new(VISU_TYPE_GL_EXT_SCALE, "name", (name)?name:name_, "label", _(name), "description", description, "nGlObj", 1, "saveState", TRUE, NULL)); return VISU_GL_EXT_SCALE(scale); } /** * visu_gl_ext_scale_setGlView: * @scale: a #VisuGlExtScale object. * @view: (transfer full): a #VisuGlView object. * * Attach @view to @scale, so rendering is updated when @view is * modified. * * Since: 3.7 * * Returns: TRUE if @view is changed. **/ gboolean visu_gl_ext_scale_setGlView(VisuGlExtScale *scale, VisuGlView *view) { g_return_val_if_fail(VISU_IS_GL_EXT_SCALE(scale), FALSE); if (view == scale->priv->view) return FALSE; if (scale->priv->view) { g_signal_handler_disconnect(G_OBJECT(scale->priv->view), scale->priv->widthHeight_signal); g_signal_handler_disconnect(G_OBJECT(scale->priv->view), scale->priv->nearFar_signal); g_signal_handler_disconnect(G_OBJECT(scale->priv->view), scale->priv->angles_signal); g_object_unref(scale->priv->view); } if (view) { g_object_ref(view); scale->priv->nearFar_signal = g_signal_connect(G_OBJECT(view), "NearFarChanged", G_CALLBACK(onScaleParametersChange), (gpointer)scale); scale->priv->widthHeight_signal = g_signal_connect(G_OBJECT(view), "WidthHeightChanged", G_CALLBACK(onScaleParametersChange), (gpointer)scale); scale->priv->angles_signal = g_signal_connect(G_OBJECT(view), "ThetaPhiOmegaChanged", G_CALLBACK(onScaleParametersChange), (gpointer)scale); } else { scale->priv->nearFar_signal = 0; scale->priv->widthHeight_signal = 0; scale->priv->angles_signal = 0; } scale->priv->view = view; scale->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(scale)); } /** * visu_gl_ext_scale_add: * @scale: the #VisuGlExtScale object to add to. * @origin: (array fixed-size=3): the origin ; * @orientation: (array fixed-size=3): the orientation in cartesian coordinates ; * @length: the length of the arrow ; * @legend: (allow-none): the text going with the arrow (can be NULL). * * Create a new arrow pointing somewhere in the box with a label. * If @legend is NULL, then the label will be the value of the length. * * Since: 3.7 * * Returns: the id of the newly added arrow. */ guint visu_gl_ext_scale_add(VisuGlExtScale *scale, float origin[3], float orientation[3], float length, const gchar *legend) { Arrow *arr; g_return_val_if_fail(length > 0.f && VISU_IS_GL_EXT_SCALE(scale), 0); arr = g_malloc(sizeof(Arrow)); arr->drawn = TRUE; arr->origin[0] = origin[0]; arr->origin[1] = origin[1]; arr->origin[2] = origin[2]; arr->direction[0] = orientation[0]; arr->direction[1] = orientation[1]; arr->direction[2] = orientation[2]; arr->length = length; if (legend) arr->legendPattern = g_strdup(legend); else arr->legendPattern = (gchar*)0; arr->legend = g_string_new(""); if (legend) g_string_assign(arr->legend, legend); else g_string_printf(arr->legend, SCALE_LEGEND_DEFAULT, arr->length); scale->priv->arrows = g_list_append(scale->priv->arrows, arr); return g_list_length(scale->priv->arrows) - 1; } static void _freeArrow(Arrow *arr) { if (arr->legendPattern) g_free(arr->legendPattern); g_string_free(arr->legend, TRUE); g_free(arr); } /** * visu_gl_ext_scale_setDefaultRGB: * @rgba: a four floats array with values (0 <= values <= 1) for the * red, the green, the blue and the alpha color. Only values specified by the mask * are really relevant. * @mask: use #TOOL_COLOR_MASK_R, #TOOL_COLOR_MASK_G, #TOOL_COLOR_MASK_B, #TOOL_COLOR_MASK_RGBA or a * combinaison to indicate what values in the rgb array must be taken * into account. * * Method used to change the value of the private parameter * scales_color. This affects all the drawn scales. * * Since: 3.3 * * Returns: TRUE if scaleDraw() should be called and then 'OpenGLAskForReDraw' * signal be emitted. */ gboolean visu_gl_ext_scale_setDefaultRGB(float rgba[4], int mask) { gboolean diff; diff = FALSE; if (mask & TOOL_COLOR_MASK_R && _rgba[0] != rgba[0]) { _rgba[0] = rgba[0]; diff = TRUE; } if (mask & TOOL_COLOR_MASK_G && _rgba[1] != rgba[1]) { _rgba[1] = rgba[1]; diff = TRUE; } if (mask & TOOL_COLOR_MASK_B && _rgba[2] != rgba[2]) { _rgba[2] = rgba[2]; diff = TRUE; } if (mask & TOOL_COLOR_MASK_A && _rgba[3] != rgba[3]) { _rgba[3] = rgba[3]; diff = TRUE; } if (defaultScale) defaultScale->priv->isBuilt = FALSE; return diff; } /** * visu_gl_ext_scale_setDefaultLineWidth: * @width: value of the desired width. * * Method used to change the value of the parameter * scale_line_width. This affects all the drawn scales. * * Since: 3.3 * * Returns: TRUE if scaleDraw() should be called and then 'OpenGLAskForReDraw' * signal be emitted. */ gboolean visu_gl_ext_scale_setDefaultLineWidth(float width) { if (width == _width) return FALSE; _width = CLAMP(width, 0.f, 10.f); if (defaultScale) defaultScale->priv->isBuilt = FALSE; return TRUE; } /** * visu_gl_ext_scale_setDefaultStipple: * @stipple: a pattern for line. * * The scales share a line pattern for the stick of the arrow. * * Since: 3.3 * * Returns: TRUE if scale are drawn, FALSE otherwise. */ gboolean visu_gl_ext_scale_setDefaultStipple(guint16 stipple) { if (stipple == _stipple) return FALSE; _stipple = stipple; if (defaultScale) defaultScale->priv->isBuilt = FALSE; return TRUE; } /* Get methods. */ /** * visu_gl_ext_scale_getDefaultRGB: * * All the scales shared a common colour. * * Since: 3.3 * * Returns: (array fixed-size=4) (transfer none): a four component array. */ float* visu_gl_ext_scale_getDefaultRGB() { return _rgba; } /** * visu_gl_ext_scale_getDefaultLineWidth: * * The scales share a line width for the stick of the arrow. * * Since: 3.3 * * Returns: the value of current width. */ float visu_gl_ext_scale_getDefaultLineWidth() { return _width; } /** * visu_gl_ext_scale_getDefaultStipple: * * The scales share a line pattern for the stick of the arrow. * * Since: 3.3 * * Returns: the value of current stipple pattern. */ guint16 visu_gl_ext_scale_getDefaultStipple() { return _stipple; } /** * visu_gl_ext_scale_getNArrows: * @scale: the #VisuGlExtScale to poll. * * A #VisuGlExtScale is characterised by a set of arrows. * * Since: 3.7 * * Returns: the number of stored arrows. */ guint visu_gl_ext_scale_getNArrows(VisuGlExtScale *scale) { g_return_val_if_fail(VISU_IS_GL_EXT_SCALE(scale), 0); return g_list_length(scale->priv->arrows); } /** * visu_gl_ext_scale_getLength: * @scale: the #VisuGlExtScale to poll. * @i: the ith arrow. * * A #VisuGlExtScale is characterised by its length. * * Since: 3.3 * * Returns: a positive floating point value or a negative value if @i * is not in the arrow list. */ float visu_gl_ext_scale_getLength(VisuGlExtScale *scale, guint i) { GList *lst; g_return_val_if_fail(VISU_IS_GL_EXT_SCALE(scale), -1.f); lst = g_list_nth(scale->priv->arrows, i); if (lst) return ((Arrow*)lst->data)->length; else return -1.f; } /** * visu_gl_ext_scale_getOrigin: * @scale: the #VisuGlExtScale to poll. * @i: the ith arrow. * * A #VisuGlExtScale is characterised by its origin in cartesian coordinates. * * Since: 3.3 * * Returns: (array fixed-size=3) (transfer none) (allow-none): three * floating point values. */ float* visu_gl_ext_scale_getOrigin(VisuGlExtScale *scale, guint i) { GList *lst; g_return_val_if_fail(VISU_IS_GL_EXT_SCALE(scale), (float*)0); lst = g_list_nth(scale->priv->arrows, i); if (lst) return ((Arrow*)lst->data)->origin; else return (float*)0; } /** * visu_gl_ext_scale_getOrientation: * @scale: the #VisuGlExtScale to poll. * @i: the ith arrow. * * A #VisuGlExtScale is characterised by its orientation in cartesian coordinates. * * Since: 3.3 * * Returns: (array fixed-size=3) (transfer none) (allow-none): three * floating point values. */ float* visu_gl_ext_scale_getOrientation(VisuGlExtScale *scale, guint i) { GList *lst; g_return_val_if_fail(VISU_IS_GL_EXT_SCALE(scale), (float*)0); lst = g_list_nth(scale->priv->arrows, i); if (lst) return ((Arrow*)lst->data)->direction; else return (float*)0; } /** * visu_gl_ext_scale_getLegend: * @scale: the #VisuGlExtScale to poll. * @i: the ith arrow. * * A #VisuGlExtScale can have a legend. This is not actualy the string printed * on screen but the one used to generate it. * * Since: 3.3 * * Returns: (allow-none): a string (private, do not free it). */ const gchar* visu_gl_ext_scale_getLegend(VisuGlExtScale *scale, guint i) { GList *lst; g_return_val_if_fail(VISU_IS_GL_EXT_SCALE(scale), (const gchar*)0); lst = g_list_nth(scale->priv->arrows, i); if (lst) return ((Arrow*)lst->data)->legendPattern; else return (const gchar*)0; } /** * visu_gl_ext_scale_setOrigin: * @scale: the #VisuGlExtScale to modify ; * @i: the ith arrow ; * @xyz: (array fixed-size=3): a vector in cartesian coordinates ; * @mask: relevant values in @xyz, see #TOOL_XYZ_MASK_X... * * Routine that changes the origin of the scale. * * Since: 3.3 * * Returns: TRUE if visu_gl_ext_scale_draw() should be called. */ gboolean visu_gl_ext_scale_setOrigin(VisuGlExtScale *scale, guint i, float xyz[3], int mask) { GList *lst; Arrow *arr; gboolean difference; g_return_val_if_fail(VISU_IS_GL_EXT_SCALE(scale), FALSE); lst = g_list_nth(scale->priv->arrows, i); if (!lst) return FALSE; arr = (Arrow*)lst->data; difference = FALSE; if (mask & TOOL_XYZ_MASK_X && arr->origin[0] != xyz[0]) { arr->origin[0] = xyz[0]; difference = TRUE; } if (mask & TOOL_XYZ_MASK_Y && arr->origin[1] != xyz[1]) { arr->origin[1] = xyz[1]; difference = TRUE; } if (mask & TOOL_XYZ_MASK_Z && arr->origin[2] != xyz[2]) { arr->origin[2] = xyz[2]; difference = TRUE; } if (!difference) return FALSE; scale->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(scale)); } /** * visu_gl_ext_scale_setOrientation: * @scale: the #VisuGlExtScale to modify ; * @i: the ith arrow ; * @xyz: (array fixed-size=3): a vector in cartesian coordinates ; * @mask: relevant values in @xyz, see #TOOL_XYZ_MASK_X... * * Routine that changes the direction of the scale. * * Since: 3.3 * * Returns: TRUE if visu_gl_ext_scale_draw() should be called. */ gboolean visu_gl_ext_scale_setOrientation(VisuGlExtScale *scale, guint i, float xyz[3], int mask) { GList *lst; Arrow *arr; gboolean difference; g_return_val_if_fail(VISU_IS_GL_EXT_SCALE(scale), FALSE); lst = g_list_nth(scale->priv->arrows, i); if (!lst) return FALSE; arr = (Arrow*)lst->data; difference = FALSE; if (mask & TOOL_XYZ_MASK_X && arr->direction[0] != xyz[0]) { arr->direction[0] = xyz[0]; difference = TRUE; } if (mask & TOOL_XYZ_MASK_Y && arr->direction[1] != xyz[1]) { arr->direction[1] = xyz[1]; difference = TRUE; } if (mask & TOOL_XYZ_MASK_Z && arr->direction[2] != xyz[2]) { arr->direction[2] = xyz[2]; difference = TRUE; } if (!difference) return FALSE; scale->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(scale)); } /** * visu_gl_ext_scale_setLength: * @scale: the #VisuGlExtScale to modify ; * @i: the ith arrow ; * @lg: a positive length. * * Routine that changes the length of the scale. * * Since: 3.3 * * Returns: TRUE if visu_gl_ext_scale_draw() should be called. */ gboolean visu_gl_ext_scale_setLength(VisuGlExtScale *scale, guint i, float lg) { GList *lst; Arrow *arr; g_return_val_if_fail(VISU_IS_GL_EXT_SCALE(scale), FALSE); lst = g_list_nth(scale->priv->arrows, i); if (!lst) return FALSE; arr = (Arrow*)lst->data; if (lg == arr->length) return FALSE; arr->length = lg; scale->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(scale)); } /** * visu_gl_ext_scale_setLegend: * @scale: the #VisuGlExtScale to modify ; * @i: the ith arrow ; * @value: (allow-none): a string (can be NULL). * * Routine that changes the legend of the scale. If @value is NULL * then the length of the scale is printed. * * Since: 3.3 * * Returns: TRUE if visu_gl_ext_scale_draw() should be called. */ gboolean visu_gl_ext_scale_setLegend(VisuGlExtScale *scale, guint i, const gchar *value) { GList *lst; Arrow *arr; g_return_val_if_fail(VISU_IS_GL_EXT_SCALE(scale), FALSE); lst = g_list_nth(scale->priv->arrows, i); if (!lst) return FALSE; arr = (Arrow*)lst->data; g_free(arr->legendPattern); if (value && *g_strstrip((gchar*)value)) arr->legendPattern = g_strdup(value); else arr->legendPattern = (gchar*)0; if (arr->legendPattern) g_string_assign(arr->legend, arr->legendPattern); else g_string_printf(arr->legend, SCALE_LEGEND_DEFAULT, arr->length); scale->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(scale)); } /** * visu_gl_ext_scale_getDefault: * * The default #VisuGlExtScale object used by V_Sim. * * Since: 3.7 * * Returns: (transfer none): a #VisuGlExtScale object. */ VisuGlExtScale* visu_gl_ext_scale_getDefault() { if (!defaultScale) { defaultScale = visu_gl_ext_scale_new(NULL); visu_gl_ext_setActive(VISU_GL_EXT(defaultScale), SCALE_USED_DEFAULT); } return defaultScale; } /****************/ /* Private part */ /****************/ static void scale_rebuild(VisuGlExt *ext) { visu_gl_text_rebuildFontList(); VISU_GL_EXT_SCALE(ext)->priv->isBuilt = FALSE; visu_gl_ext_scale_draw(VISU_GL_EXT_SCALE(ext)); } static void onScaleParametersChange(VisuGlView *view _U_, gpointer data) { VISU_GL_EXT_SCALE(data)->priv->isBuilt = FALSE; visu_gl_ext_scale_draw(VISU_GL_EXT_SCALE(data)); } /** * visu_gl_ext_scale_draw: * @scale: the #VisuGlExtScale object to draw. * * This method creates a compile list that draw all arrow of a scale. * * Since: 3.3 */ void visu_gl_ext_scale_draw(VisuGlExtScale *scale) { GList *tmpLst; int nlat; float radius = 0.3; g_return_if_fail(VISU_IS_GL_EXT_SCALE(scale)); /* Nothing to draw; */ if(!scale->priv->view || !visu_gl_ext_getActive(VISU_GL_EXT(scale)) || scale->priv->isBuilt) return; DBG_fprintf(stderr, "Extension Scale: creating scales.\n"); visu_gl_text_initFontList(); nlat = visu_gl_view_getDetailLevel(scale->priv->view, radius); glDeleteLists(visu_gl_ext_getGlList(VISU_GL_EXT(scale)), 1); glNewList(visu_gl_ext_getGlList(VISU_GL_EXT(scale)), GL_COMPILE); /* Deactivate light and fog. */ glDisable(GL_LIGHTING); glDisable(GL_FOG); glLineWidth(_width); glColor4fv(_rgba); if (_stipple != 65535) { glEnable(GL_LINE_STIPPLE); glLineStipple(1, _stipple); } for (tmpLst = scale->priv->arrows; tmpLst; tmpLst = g_list_next(tmpLst)) _drawArrow((Arrow*)tmpLst->data, nlat); glEndList(); scale->priv->isBuilt = TRUE; } /* fonction qui dessine la legende*/ static void _drawArrow(Arrow *arr, guint nlat) { float x2,y2,z2, norm; float angles[3]; /*declaration des tableaux angles et coordonnées a 3 cellules*/ float coord[3], u, v, s; float radius = 0.3 * (0.25f * log(_width) + 1.f); float tl = 1.f; GLUquadricObj *obj; float modelView[16]; obj = gluNewQuadric(); norm = arr->length / sqrt(arr->direction[0] * arr->direction[0] + arr->direction[1] * arr->direction[1] + arr->direction[2] * arr->direction[2]) - tl; x2 = arr->origin[0] + arr->direction[0] * norm; y2 = arr->origin[1] + arr->direction[1] * norm; z2 = arr->origin[2] + arr->direction[2] * norm; coord[0] = x2 - arr->origin[0]; coord[1] = y2 - arr->origin[1]; coord[2] = z2 - arr->origin[2]; tool_matrix_cartesianToSpherical(angles, coord); glPushMatrix(); glTranslated(arr->origin[0], arr->origin[1], arr->origin[2]); glRotated(angles[2], 0., 0., 1.); glRotated(angles[1], 0., 1., 0.); glTranslated(0., 0., angles[0]); gluCylinder(obj, radius, 0., tl, nlat, 1); glRotated(180., 1., 0., 0.); gluDisk(obj, 0, radius, nlat, 1); glPopMatrix(); glBegin (GL_LINES); glVertex3fv(arr->origin); glVertex3f(x2, y2, z2); glEnd(); glGetFloatv(GL_MODELVIEW_MATRIX, modelView); v = -(coord[0] * modelView[0] + coord[1] * modelView[4] + coord[2] * modelView[8]); u = +(coord[0] * modelView[1] + coord[1] * modelView[5] + coord[2] * modelView[9]); s = (v < 0.f)?0.25f:0.75f; if (v > 0.f) { u *= -1.f; v *= -1.f; } coord[0] = arr->origin[0] + s * arr->direction[0] * norm; coord[1] = arr->origin[1] + s * arr->direction[1] * norm; coord[2] = arr->origin[2] + s * arr->direction[2] * norm; norm = 1.f / sqrt(u * u + v * v) * radius * 2.f; coord[0] += (u * modelView[0] + v * modelView[1]) * norm; coord[1] += (u * modelView[4] + v * modelView[5]) * norm; coord[2] += (u * modelView[8] + v * modelView[9]) * norm; glRasterPos3fv(coord); visu_gl_text_drawChars(arr->legend->str, VISU_GL_TEXT_NORMAL); gluDeleteQuadric(obj); } /* Parameters & resources*/ /* This is a boolean to control is the Scale is render or not. */ static gboolean readScaleIsOn(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { gboolean val; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readBoolean(lines[0], position, &val, 1, error)) return FALSE; visu_gl_ext_setActive(VISU_GL_EXT(visu_gl_ext_scale_getDefault()), val); return TRUE; } /* A resource to control the color used to render the lines of the Scale. */ static gboolean readScaleColor(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { float rgb[4]; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readFloat(lines[0], position, rgb, 4, error)) { if (*error) g_error_free(*error); *error = (GError*)0; if (!tool_config_file_readFloat(lines[0], position, rgb, 3, error)) return FALSE; rgb[3] = 1.f; } if (tool_config_file_clampFloat(&rgb[0], rgb[0], 0., 1.) || tool_config_file_clampFloat(&rgb[1], rgb[1], 0., 1.) || tool_config_file_clampFloat(&rgb[2], rgb[2], 0., 1.) || tool_config_file_clampFloat(&rgb[3], rgb[3], 0., 1.)) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d: 4 floating points" "(0 <= v <= 1) must appear after the %s markup.\n"), position, FLAG_RESOURCE_SCALE_COLOR); return FALSE; } visu_gl_ext_scale_setDefaultRGB(rgb, TOOL_COLOR_MASK_RGBA); return TRUE; } /* A resource to control the width to render the lines of the Scale. */ static gboolean readScaleLineWidth(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { float width; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readFloat(lines[0], position, &width, 1, error)) return FALSE; if (tool_config_file_clampFloat(&width, width, 1., 10.)) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d: 1 floating point" "(1 <= v <= 10) must appear after the %s markup.\n"), position, FLAG_RESOURCE_SCALE_LINE); return FALSE; } visu_gl_ext_scale_setDefaultLineWidth(width); return TRUE; } static gboolean readScaleLineStipple(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { int stipple; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readInteger(lines[0], position, &stipple, 1, error)) return FALSE; visu_gl_ext_scale_setDefaultStipple((guint16)stipple); return TRUE; } static gboolean readScaleDefinition(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { float xyz[3], orientation[3], len; gchar **tokens, *remains, *legend; int pos; g_return_val_if_fail(nbLines == 1, FALSE); tokens = g_strsplit(g_strchug(lines[0]), " ", 0); pos = 0; if (!tool_config_file_readFloatFromTokens(tokens, &pos, xyz, 3, position, error)) { g_strfreev(tokens); return FALSE; } if (!tool_config_file_readFloatFromTokens(tokens, &pos, orientation, 3, position, error)) { g_strfreev(tokens); return FALSE; } if (!tool_config_file_readFloatFromTokens(tokens, &pos, &len, 1, position, error)) { g_strfreev(tokens); return FALSE; } if (tokens[pos]) remains = g_strjoinv(" ", &tokens[pos]); else remains = g_strdup(SCALE_LEGEND_DEFAULT); g_strfreev(tokens); legend = g_strstrip(remains); if (legend && !strcmp(legend, SCALE_AUTO_LEGEND)) legend = (gchar*)0; visu_gl_ext_scale_add(visu_gl_ext_scale_getDefault(), xyz, orientation, len, legend); g_free(remains); return TRUE; } /* Export function that is called by visu_module to write the values of resources to a file. */ static void exportResourcesScale(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { GList *tmpLst; Arrow *arr; gchar *legend; if (!defaultScale) return; visu_config_file_exportComment(data, DESC_RESOURCE_SCALE_USED); visu_config_file_exportEntry(data, FLAG_RESOURCE_SCALE_USED, NULL, "%d", visu_gl_ext_getActive(VISU_GL_EXT(defaultScale))); visu_config_file_exportComment(data, DESC_RESOURCE_SCALE_COLOR); visu_config_file_exportEntry(data, FLAG_RESOURCE_SCALE_COLOR, NULL, "%4.3f %4.3f %4.3f %4.3f", _rgba[0], _rgba[1], _rgba[2], _rgba[3]); visu_config_file_exportComment(data, DESC_RESOURCE_SCALE_LINE); visu_config_file_exportEntry(data, FLAG_RESOURCE_SCALE_LINE, NULL, "%4.0f", _width); visu_config_file_exportComment(data, DESC_RESOURCE_SCALE_STIPPLE); visu_config_file_exportEntry(data, FLAG_RESOURCE_SCALE_STIPPLE, NULL, "%d", _stipple); visu_config_file_exportComment(data, DESC_RESOURCE_SCALE_DEFINITION); for (tmpLst = defaultScale->priv->arrows; tmpLst; tmpLst = g_list_next(tmpLst)) { arr = (Arrow*)tmpLst->data; if (arr->legendPattern) legend = arr->legendPattern; else legend = SCALE_AUTO_LEGEND; visu_config_file_exportEntry(data, FLAG_RESOURCE_SCALE_DEFINITION, NULL, "%g %g %g %g %g %g %g %s", arr->origin[0], arr->origin[1], arr->origin[2], arr->direction[0], arr->direction[1], arr->direction[2], arr->length, legend); } visu_config_file_exportComment(data, ""); } v_sim-3.7.0/src/extensions/scale.h0000644000353400050620000001212512215546077014021 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef SCALE_H #define SCALE_H #include #include /** * VISU_TYPE_GL_EXT_SCALE: * * return the type of #VisuGlExtScale. * * Since: 3.3 */ #define VISU_TYPE_GL_EXT_SCALE (visu_gl_ext_scale_get_type ()) /** * VISU_GL_EXT_SCALE: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuGlExtScale type. * * Since: 3.3 */ #define VISU_GL_EXT_SCALE(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_GL_EXT_SCALE, VisuGlExtScale)) /** * VISU_GL_EXT_SCALE_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuGlExtScaleClass. * * Since: 3.3 */ #define VISU_GL_EXT_SCALE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_GL_EXT_SCALE, VisuGlExtScaleClass)) /** * VISU_IS_GL_EXT_SCALE: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuGlExtScale object. * * Since: 3.3 */ #define VISU_IS_GL_EXT_SCALE(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_GL_EXT_SCALE)) /** * VISU_IS_GL_EXT_SCALE_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuGlExtScaleClass class. * * Since: 3.3 */ #define VISU_IS_GL_EXT_SCALE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_GL_EXT_SCALE)) /** * VISU_GL_EXT_SCALE_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. * * Since: 3.3 */ #define VISU_GL_EXT_SCALE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_GL_EXT_SCALE, VisuGlExtScaleClass)) typedef struct _VisuGlExtScale VisuGlExtScale; typedef struct _VisuGlExtScalePrivate VisuGlExtScalePrivate; typedef struct _VisuGlExtScaleClass VisuGlExtScaleClass; struct _VisuGlExtScale { VisuGlExt parent; VisuGlExtScalePrivate *priv; }; struct _VisuGlExtScaleClass { VisuGlExtClass parent; }; /** * visu_gl_ext_scale_get_type: * * This method returns the type of #VisuGlExtScale, use %VISU_TYPE_GL_EXT_SCALE instead. * * Returns: the type of #VisuGlExtScale. * * Since: 3.3 */ GType visu_gl_ext_scale_get_type(void); VisuGlExtScale* visu_gl_ext_scale_getDefault(); gboolean visu_gl_ext_scale_setDefaultRGB(float rgba[4], int mask); gboolean visu_gl_ext_scale_setDefaultLineWidth(float width); gboolean visu_gl_ext_scale_setDefaultStipple(guint16 stipple); float* visu_gl_ext_scale_getDefaultRGB(); float visu_gl_ext_scale_getDefaultLineWidth(); guint16 visu_gl_ext_scale_getDefaultStipple(); gboolean visu_gl_ext_scale_setGlView(VisuGlExtScale *scale, VisuGlView *view); guint visu_gl_ext_scale_add(VisuGlExtScale *scale, float origin[3], float orientation[3], float length, const gchar *legend); gboolean visu_gl_ext_scale_setOrigin(VisuGlExtScale *scale, guint i, float xyz[3], int mask); gboolean visu_gl_ext_scale_setOrientation(VisuGlExtScale *scale, guint i, float xyz[3], int mask); gboolean visu_gl_ext_scale_setLength(VisuGlExtScale *scale, guint i, float lg); gboolean visu_gl_ext_scale_setLegend(VisuGlExtScale *scale, guint i, const gchar *value); guint visu_gl_ext_scale_getNArrows(VisuGlExtScale *scale); const gchar* visu_gl_ext_scale_getLegend(VisuGlExtScale *scale, guint i); float visu_gl_ext_scale_getLength(VisuGlExtScale *scale, guint i); float* visu_gl_ext_scale_getOrigin(VisuGlExtScale *scale, guint i); float* visu_gl_ext_scale_getOrientation(VisuGlExtScale *scale, guint i); void visu_gl_ext_scale_draw(VisuGlExtScale *scale); #endif v_sim-3.7.0/src/extensions/infos.h0000644000353400050620000001253612215546077014056 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef EXTINFOS_H #define EXTINFOS_H #include #include #include #include #include /** * VisuGlExtInfosDrawId: * @DRAW_NEVER: don't draw any information on nodes ; * @DRAW_SELECTED: draw information only on a list of nodes ; * @DRAW_ALWAYS: draw information on all nodes. * * This enum represents the possibilities for the information drawing. */ typedef enum { DRAW_NEVER, DRAW_SELECTED, DRAW_ALWAYS } VisuGlExtInfosDrawId; /** * VisuGlExtInfosDrawMethod: * @EXT_DRAW_METH_NONE: draw nothing ; * @EXT_DRAW_METH_ID: draw the id of nodes ; * @EXT_DRAW_METH_TYPE: draw the name of node element ; * @EXT_DRAW_METH_OTHER: other possible draw rendering method. * * This enum represents the method for information drawing. */ typedef enum { EXT_DRAW_METH_NONE, EXT_DRAW_METH_ID, EXT_DRAW_METH_TYPE, EXT_DRAW_METH_OTHER } VisuGlExtInfosDrawMethod; /** * VISU_TYPE_GL_EXT_INFOS: * * return the type of #VisuGlExtInfos. * * Since: 3.7 */ #define VISU_TYPE_GL_EXT_INFOS (visu_gl_ext_infos_get_type ()) /** * VISU_GL_EXT_INFOS: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuGlExtInfos type. * * Since: 3.7 */ #define VISU_GL_EXT_INFOS(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_GL_EXT_INFOS, VisuGlExtInfos)) /** * VISU_GL_EXT_INFOS_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuGlExtInfosClass. * * Since: 3.7 */ #define VISU_GL_EXT_INFOS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_GL_EXT_INFOS, VisuGlExtInfosClass)) /** * VISU_IS_GL_EXT_INFOS: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuGlExtInfos object. * * Since: 3.7 */ #define VISU_IS_GL_EXT_INFOS(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_GL_EXT_INFOS)) /** * VISU_IS_GL_EXT_INFOS_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuGlExtInfosClass class. * * Since: 3.7 */ #define VISU_IS_GL_EXT_INFOS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_GL_EXT_INFOS)) /** * VISU_GL_EXT_INFOS_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. * * Since: 3.7 */ #define VISU_GL_EXT_INFOS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_GL_EXT_INFOS, VisuGlExtInfosClass)) typedef struct _VisuGlExtInfos VisuGlExtInfos; typedef struct _VisuGlExtInfosPrivate VisuGlExtInfosPrivate; typedef struct _VisuGlExtInfosClass VisuGlExtInfosClass; struct _VisuGlExtInfos { VisuGlExt parent; VisuGlExtInfosPrivate *priv; }; struct _VisuGlExtInfosClass { VisuGlExtClass parent; }; /** * VISU_GL_EXT_INFOS_ID: * * The id used to identify this extension, see * visu_gl_ext_rebuild() for instance. */ #define VISU_GL_EXT_INFOS_ID "Node information" /** * visu_gl_ext_infos_get_type: * * This method returns the type of #VisuGlExtInfos, use * VISU_TYPE_GL_EXT_INFOS instead. * * Since: 3.7 * * Returns: the type of #VisuGlExtInfos. */ GType visu_gl_ext_infos_get_type(void); VisuGlExtInfos* visu_gl_ext_infos_new(const gchar *name); gboolean visu_gl_ext_infos_setGlView(VisuGlExtInfos *infos, VisuGlView *view); gboolean visu_gl_ext_infos_setData(VisuGlExtInfos *infos, VisuData *data); gboolean visu_gl_ext_infos_drawIds(VisuGlExtInfos *infos, int *nodes); gboolean visu_gl_ext_infos_drawElements(VisuGlExtInfos *infos, int *nodes); gboolean visu_gl_ext_infos_drawData(VisuGlExtInfos *infos, VisuDataNode *dataNode, int *nodes); void visu_gl_ext_infos_draw(VisuGlExtInfos *infos); VisuGlExtInfos* visu_gl_ext_infos_getDefault(); #endif v_sim-3.7.0/src/extensions/infos.c0000644000353400050620000005505512215546077014054 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2013) Adresse ml : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2013) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at COPYING. */ #include "infos.h" #include #include #include #include #include /** * SECTION:infos * @short_description: give the capability to draw some information * near each node. * * This part is used to draw some information near the * nodes. This information can be the one of a #VisuNodeProperty or * something else. When read from a #VisuNodeProperty, just giving the * name will produce the right output. In other cases a print routine * must be given. */ /* Interface for a routine to draw the informations into a label. */ typedef void (*DrawInfosFunc)(VisuData *data, VisuElement *element, VisuNode *node, VisuDataNode *dataNode); static void drawNumber(VisuData *data, VisuElement *element, VisuNode *node, VisuDataNode *dataNode); static void drawElement(VisuData *data, VisuElement *element, VisuNode *node, VisuDataNode *dataNode); static void drawInfos(VisuData *data, VisuElement *element, VisuNode *node, VisuDataNode *dataNode); /** * VisuGlExtInfosClass: * @parent: the parent class; * * A short way to identify #_VisuGlExtInfosClass structure. * * Since: 3.7 */ /** * VisuGlExtInfos: * * An opaque structure. * * Since: 3.7 */ /** * VisuGlExtInfosPrivate: * * Private fields for #VisuGlExtInfos objects. * * Since: 3.7 */ struct _VisuGlExtInfosPrivate { gboolean dispose_has_run; gboolean isBuilt; /* What to draw. */ int *nodes; DrawInfosFunc draw; /* Object signals. */ VisuData *dataObj; gulong popDec, popInc, posChg, rndChg, matChg; VisuGlView *view; gulong angChg; VisuDataNode *dataNode; gulong propUsed, propUnsd, propChgd; }; static VisuGlExtInfos *defaultInfos = NULL; static void visu_gl_ext_infos_finalize(GObject* obj); static void visu_gl_ext_infos_dispose(GObject* obj); static void visu_gl_ext_infos_rebuild(VisuGlExt *ext); /* Callbacks. */ static void onPopulationIncrease(VisuData *data, int *newNodes, gpointer user_data); static void onPopulationDecrease(VisuData *data, int *oldNodes, gpointer user_data); static void onPositionChanged(VisuData *data, VisuElement *ele, gpointer user_data); static void onNodeChanged(VisuData *data, gpointer user_data); static void onCameraMoved(VisuGlView *view, gpointer user_data); static void onProperty(VisuDataNode *dataNode, VisuData *dataObj, gpointer user_data); static void onPropertyChanged(VisuDataNode *dataNode, VisuData *dataObj, gpointer user_data); static void _setDataNode(VisuGlExtInfos *infos, VisuDataNode *dataNode); G_DEFINE_TYPE(VisuGlExtInfos, visu_gl_ext_infos, VISU_TYPE_GL_EXT) static void visu_gl_ext_infos_class_init(VisuGlExtInfosClass *klass) { DBG_fprintf(stderr, "Extension Infos: creating the class of the object.\n"); /* DBG_fprintf(stderr, " - adding new signals ;\n"); */ /* DBG_fprintf(stderr, " - adding new resources ;\n"); */ /* Connect the overloading methods. */ G_OBJECT_CLASS(klass)->dispose = visu_gl_ext_infos_dispose; G_OBJECT_CLASS(klass)->finalize = visu_gl_ext_infos_finalize; VISU_GL_EXT_CLASS(klass)->rebuild = visu_gl_ext_infos_rebuild; } static void visu_gl_ext_infos_init(VisuGlExtInfos *obj) { DBG_fprintf(stderr, "Extension Infos: initializing a new object (%p).\n", (gpointer)obj); obj->priv = g_malloc(sizeof(VisuGlExtInfosPrivate)); obj->priv->dispose_has_run = FALSE; obj->priv->isBuilt = FALSE; /* Private data. */ obj->priv->nodes = (int*)0; obj->priv->draw = (DrawInfosFunc)0; obj->priv->dataNode = (VisuDataNode*)0; obj->priv->dataObj = (VisuData*)0; obj->priv->view = (VisuGlView*)0; obj->priv->popDec = 0; obj->priv->popInc = 0; obj->priv->rndChg = 0; obj->priv->posChg = 0; obj->priv->matChg = 0; obj->priv->angChg = 0; } /* This method can be called several times. It should unref all of its reference to GObjects. */ static void visu_gl_ext_infos_dispose(GObject* obj) { VisuGlExtInfos *infos; DBG_fprintf(stderr, "Extension Infos: dispose object %p.\n", (gpointer)obj); infos = VISU_GL_EXT_INFOS(obj); if (infos->priv->dispose_has_run) return; infos->priv->dispose_has_run = TRUE; /* Disconnect signals. */ visu_gl_ext_infos_setGlView(infos, (VisuGlView*)0); visu_gl_ext_infos_setData(infos, (VisuData*)0); _setDataNode(infos, (VisuDataNode*)0); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_gl_ext_infos_parent_class)->dispose(obj); } /* This method is called once only. */ static void visu_gl_ext_infos_finalize(GObject* obj) { VisuGlExtInfos *infos; g_return_if_fail(obj); DBG_fprintf(stderr, "Extension Infos: finalize object %p.\n", (gpointer)obj); infos = VISU_GL_EXT_INFOS(obj); /* Free privs elements. */ if (infos->priv) { DBG_fprintf(stderr, "Extension Infos: free private infos.\n"); g_free(infos->priv->nodes); g_free(infos->priv); } /* Chain up to the parent class */ DBG_fprintf(stderr, "Extension Infos: chain to parent.\n"); G_OBJECT_CLASS(visu_gl_ext_infos_parent_class)->finalize(obj); DBG_fprintf(stderr, "Extension Infos: freeing ... OK.\n"); } /** * visu_gl_ext_infos_new: * @name: (allow-none): the name of the #VisuGlExt. * * Create a new #VisuGlExt to represent information on nodes. * * Since: 3.7 * * Returns: a new #VisuGlExtInfos object. **/ VisuGlExtInfos* visu_gl_ext_infos_new(const gchar *name) { char *name_ = VISU_GL_EXT_INFOS_ID; char *description = _("Draw informations on nodes."); VisuGlExt *ext; DBG_fprintf(stderr,"Extension Infos: new object.\n"); ext = VISU_GL_EXT(g_object_new(VISU_TYPE_GL_EXT_INFOS, "name", (name)?name:name_, "label", _(name), "description", description, "nGlObj", 1, NULL)); visu_gl_ext_setPriority(ext, VISU_GL_EXT_PRIORITY_HIGH); return VISU_GL_EXT_INFOS(ext); } /********************/ /* Public routines. */ /********************/ /** * visu_gl_ext_infos_setGlView: * @infos: The #VisuGlExtInfos to attached to. * @view: the nodes to get the population of. * * Attach an #VisuGlView to render to and setup the infos. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_infos_draw() should be called and * then 'OpenGLAskForReDraw' signal be emitted. **/ gboolean visu_gl_ext_infos_setGlView(VisuGlExtInfos *infos, VisuGlView *view) { g_return_val_if_fail(VISU_IS_GL_EXT_INFOS(infos), FALSE); if (view == infos->priv->view) return FALSE; if (infos->priv->view) { g_signal_handler_disconnect(G_OBJECT(infos->priv->view), infos->priv->angChg); g_object_unref(infos->priv->view); } if (view) { g_object_ref(view); infos->priv->angChg = g_signal_connect(G_OBJECT(view), "ThetaPhiOmegaChanged", G_CALLBACK(onCameraMoved), (gpointer)infos); } else infos->priv->angChg = 0; infos->priv->view = view; infos->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(infos)); } /** * visu_gl_ext_infos_setData: * @infos: The #VisuGlExtInfos to attached to. * @data: the nodes to get the population of. * * Attach an #VisuData to render to and setup the infos. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_infos_draw() should be called and * then 'OpenGLAskForReDraw' signal be emitted. **/ gboolean visu_gl_ext_infos_setData(VisuGlExtInfos *infos, VisuData *data) { g_return_val_if_fail(VISU_IS_GL_EXT_INFOS(infos), FALSE); if (data == infos->priv->dataObj) return FALSE; if (infos->priv->dataObj) { g_signal_handler_disconnect(G_OBJECT(infos->priv->dataObj), infos->priv->popDec); g_signal_handler_disconnect(G_OBJECT(infos->priv->dataObj), infos->priv->popInc); g_signal_handler_disconnect(G_OBJECT(infos->priv->dataObj), infos->priv->posChg); g_signal_handler_disconnect(G_OBJECT(infos->priv->dataObj), infos->priv->rndChg); g_signal_handler_disconnect(G_OBJECT(infos->priv->dataObj), infos->priv->matChg); g_object_unref(infos->priv->dataObj); } if (data) { g_object_ref(data); infos->priv->popDec = g_signal_connect(G_OBJECT(data), "PopulationDecrease", G_CALLBACK(onPopulationDecrease), (gpointer)infos); infos->priv->popInc = g_signal_connect(G_OBJECT(data), "PopulationIncrease", G_CALLBACK(onPopulationIncrease), (gpointer)infos); infos->priv->posChg = g_signal_connect(G_OBJECT(data), "PositionChanged", G_CALLBACK(onPositionChanged), (gpointer)infos); infos->priv->rndChg = g_signal_connect(G_OBJECT(data), "VisibilityChanged", G_CALLBACK(onNodeChanged), (gpointer)infos); infos->priv->matChg = g_signal_connect(G_OBJECT(data), "MaterialChanged", G_CALLBACK(onNodeChanged), (gpointer)infos); } else { infos->priv->popDec = 0; infos->priv->popInc = 0; infos->priv->posChg = 0; infos->priv->rndChg = 0; infos->priv->matChg = 0; } infos->priv->dataObj = data; infos->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(infos)); } static void _setDataNode(VisuGlExtInfos *infos, VisuDataNode *dataNode) { g_return_if_fail(VISU_IS_GL_EXT_INFOS(infos)); if (dataNode == infos->priv->dataNode) return; if (infos->priv->dataNode) { g_signal_handler_disconnect(G_OBJECT(infos->priv->dataNode), infos->priv->propUsed); g_signal_handler_disconnect(G_OBJECT(infos->priv->dataNode), infos->priv->propUnsd); g_signal_handler_disconnect(G_OBJECT(infos->priv->dataNode), infos->priv->propChgd); g_object_unref(infos->priv->dataNode); } if (dataNode) { g_object_ref(dataNode); infos->priv->propUsed = g_signal_connect(G_OBJECT(dataNode), "propertyUsed", G_CALLBACK(onProperty), (gpointer)infos); infos->priv->propUnsd = g_signal_connect(G_OBJECT(dataNode), "propertyUnused", G_CALLBACK(onProperty), (gpointer)infos); infos->priv->propChgd = g_signal_connect(G_OBJECT(dataNode), "valueChanged", G_CALLBACK(onPropertyChanged), (gpointer)infos); } else { infos->priv->propUsed = 0; infos->priv->propUnsd = 0; infos->priv->propChgd = 0; } infos->priv->dataNode = dataNode; } /** * visu_gl_ext_infos_drawIds: * @infos: the #VisuGlExtInfos object to update. * @nodes: (array zero-terminated=1) (transfer full): an integer list, * terminated with a negative number. * * With this extension, * some the number of nodes will be drawn on them. Numbers can be drawn and * all nodes (set @nodes to a NULL pointer), or to a restricted list of nodes * represented by their numbers. In this case, @nodes can have whatever length * but must be terminated by a negative integer. This array is then owned by the * extension and should not be freed. * * Returns: TRUE if a call to visu_gl_ext_infos_draw() is needed. */ gboolean visu_gl_ext_infos_drawIds(VisuGlExtInfos *infos, int *nodes) { g_return_val_if_fail(VISU_IS_GL_EXT_INFOS(infos), FALSE); g_free(infos->priv->nodes); infos->priv->nodes = nodes; infos->priv->draw = drawNumber; _setDataNode(infos, (VisuDataNode*)0); infos->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(infos)); } /** * visu_gl_ext_infos_drawElements: * @infos: the #VisuGlExtInfos object to update. * @nodes: (array zero-terminated=1) (transfer full): an integer list, * terminated with a negative number. * * As visu_gl_ext_infos_drawIds(), but draw the names of elements instead of their * numbers. * * Returns: TRUE if a call to visu_gl_ext_infos_draw() is needed. */ gboolean visu_gl_ext_infos_drawElements(VisuGlExtInfos *infos, int *nodes) { g_return_val_if_fail(VISU_IS_GL_EXT_INFOS(infos), FALSE); g_free(infos->priv->nodes); infos->priv->nodes = nodes; infos->priv->draw = drawElement; _setDataNode(infos, (VisuDataNode*)0); infos->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(infos)); } /** * visu_gl_ext_infos_drawData: * @infos: the #VisuGlExtInfos object to update. * @dataNode: a #VisuDataNode object ; * @nodes: (array zero-terminated=1) (transfer full): an integer list, * terminated with a negative number. * * As visu_gl_ext_infos_drawIds(), but draw some informations instead of their * numbers. The informations are defined by the @dataNode argument. * * Returns: TRUE if a call to visu_gl_ext_infos_draw() is needed. */ gboolean visu_gl_ext_infos_drawData(VisuGlExtInfos *infos, VisuDataNode *dataNode, int *nodes) { g_return_val_if_fail(VISU_IS_GL_EXT_INFOS(infos) && VISU_IS_DATA_NODE_TYPE(dataNode), FALSE); g_free(infos->priv->nodes); infos->priv->nodes = nodes; infos->priv->draw = drawInfos; _setDataNode(infos, dataNode); infos->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(infos)); } /** * visu_gl_ext_infos_draw: * @infos: a #VisuGlExtInfos object. * * Compile the list representing information displayed on nodes. * * Since: 3.7 **/ void visu_gl_ext_infos_draw(VisuGlExtInfos *infos) { VisuRendering *currentRenderingMethod; float modelView[16]; float delta[3], xyz[3], size, rgba[4]; VisuNodeArray *nodes; VisuNodeArrayIter iter; int i; g_return_if_fail(VISU_IS_GL_EXT_INFOS(infos)); /* Nothing to draw; */ if(!infos->priv->view || !infos->priv->dataObj || !visu_gl_ext_getActive(VISU_GL_EXT(infos)) || infos->priv->isBuilt) return; currentRenderingMethod = visu_object_getRendering(VISU_OBJECT_INSTANCE); g_return_if_fail(currentRenderingMethod); /* Get the camera orientation. */ glGetFloatv(GL_MODELVIEW_MATRIX, modelView); visu_gl_text_initFontList(); glNewList(visu_gl_ext_getGlList(VISU_GL_EXT(infos)), GL_COMPILE); glPushAttrib(GL_ENABLE_BIT); glDisable(GL_LIGHTING); /* If infos->nodes is NULL, we draw for all nodes. */ nodes = VISU_NODE_ARRAY(infos->priv->dataObj); if (!infos->priv->nodes) { DBG_fprintf(stderr, " | use all the nodes.\n"); visu_node_array_iterNew(nodes, &iter); for (visu_node_array_iterStart(nodes, &iter); iter.element; visu_node_array_iterNextElement(nodes, &iter)) { if (iter.element->rendered) { DBG_fprintf(stderr, "Extension Infos: creating glObjectList of node" " names for '%s'.\n", iter.element->name); rgba[0] = 1.f - iter.element->rgb[0]; rgba[1] = 1.f - iter.element->rgb[1]; rgba[2] = 1.f - iter.element->rgb[2]; rgba[3] = iter.element->rgb[3]; glColor4fv(rgba); size = visu_rendering_getSizeOfElement(currentRenderingMethod, iter.element); delta[0] = size * modelView[2]; delta[1] = size * modelView[6]; delta[2] = size * modelView[10]; for(visu_node_array_iterRestartNode(nodes, &iter); iter.node; visu_node_array_iterNextNode(nodes, &iter)) { if (iter.node->rendered) { visu_data_getNodePosition(infos->priv->dataObj, iter.node, xyz); glRasterPos3f(xyz[0] + delta[0], xyz[1] + delta[1], xyz[2] + delta[2]); infos->priv->draw(infos->priv->dataObj, iter.element, iter.node, infos->priv->dataNode); } } } } } else { DBG_fprintf(stderr, " | use a restricted list of nodes.\n"); /* infos->nodes is not NULL, we draw for the given infos->nodes only. */ for (i = 0; infos->priv->nodes[i] >= 0; i++) { DBG_fprintf(stderr, " | %d\n", infos->priv->nodes[i]); iter.node = visu_node_array_getFromId(nodes, infos->priv->nodes[i]); g_return_if_fail(iter.node); iter.element = visu_node_array_getElement(nodes, iter.node); if (iter.element->rendered && iter.node->rendered) { rgba[0] = 1.f - iter.element->rgb[0]; rgba[1] = 1.f - iter.element->rgb[1]; rgba[2] = 1.f - iter.element->rgb[2]; rgba[3] = iter.element->rgb[3]; glColor4fv(rgba); size = visu_rendering_getSizeOfElement(currentRenderingMethod, iter.element); delta[0] = size * modelView[2]; delta[1] = size * modelView[6]; delta[2] = size * modelView[10]; visu_data_getNodePosition(infos->priv->dataObj, iter.node, xyz); glRasterPos3f(xyz[0] + delta[0], xyz[1] + delta[1], xyz[2] + delta[2]); infos->priv->draw(infos->priv->dataObj, iter.element, iter.node, infos->priv->dataNode); } } } glPopAttrib(); glEndList(); infos->priv->isBuilt = TRUE; } /** * visu_gl_ext_infos_getDefault: * * V_Sim is using a default infos object. * * Since: 3.7 * * Returns: (transfer none): a #VisuGlExtInfos object used by default. **/ VisuGlExtInfos* visu_gl_ext_infos_getDefault() { if (!defaultInfos) { defaultInfos = visu_gl_ext_infos_new((gchar*)0); visu_gl_ext_setActive(VISU_GL_EXT(defaultInfos), FALSE); } return defaultInfos; } /*********************/ /* Private routines. */ /*********************/ static void visu_gl_ext_infos_rebuild(VisuGlExt *ext) { VisuGlExtInfos *infos = VISU_GL_EXT_INFOS(ext); visu_gl_text_rebuildFontList(); infos->priv->isBuilt = FALSE; visu_gl_ext_infos_draw(infos); } static void drawNumber(VisuData *data _U_, VisuElement *element _U_, VisuNode *node, VisuDataNode *dataNode _U_) { gchar str[10]; sprintf(str, "%d", node->number + 1); visu_gl_text_drawChars(str, VISU_GL_TEXT_NORMAL); } static void drawElement(VisuData *data _U_, VisuElement *element, VisuNode *node _U_, VisuDataNode *dataNode _U_) { visu_gl_text_drawChars(element->name, VISU_GL_TEXT_NORMAL); } static void drawInfos(VisuData *data, VisuElement *element _U_, VisuNode *node, VisuDataNode *dataNode) { gchar *label; label = visu_data_node_getValueAsString(dataNode, data, node); visu_gl_text_drawChars(label, VISU_GL_TEXT_NORMAL); g_free(label); } /*************/ /* Callbacks */ /*************/ static void onPopulationIncrease(VisuData *data _U_, int *newNodes _U_, gpointer user_data) { VisuGlExtInfos *infos = VISU_GL_EXT_INFOS(user_data); /* If we draw all nodes, then we must redraw. */ infos->priv->isBuilt = (infos->priv->nodes != (int*)0); visu_gl_ext_infos_draw(infos); } static void onPopulationDecrease(VisuData *data _U_, int *oldNodes, gpointer user_data) { VisuGlExtInfos *infos = VISU_GL_EXT_INFOS(user_data); gboolean redraw; int i, j, size; DBG_fprintf(stderr, "Extension Informations: caught the 'PopulationDecrease'" " signal, update and rebuild in list nodes case.\n"); /* If we draw a list of nodes, then we must remove some and redraw. */ redraw = FALSE; /* We remove all old nodes. */ if (infos->priv->nodes) { for (size = 0; infos->priv->nodes[size] >= 0; size++); for (i = 0; oldNodes[i] >= 0; i++) { /* We look for oldNodes[i] in infos->nodes. */ for (j = 0; infos->priv->nodes[j] >= 0 && infos->priv->nodes[j] != oldNodes[i]; j++); if (infos->priv->nodes[j] >= 0) { /* OK, found. */ redraw = TRUE; size -= 1; infos->priv->nodes[j] = infos->priv->nodes[size]; infos->priv->nodes[size] = -1; } } } else redraw = TRUE; infos->priv->isBuilt = !redraw; visu_gl_ext_infos_draw(infos); } static void onNodeChanged(VisuData *data _U_, gpointer user_data) { VisuGlExtInfos *infos = VISU_GL_EXT_INFOS(user_data); DBG_fprintf(stderr, "Extension Informations: caught the 'VisibilityChanged' or " "'MaterialChanged' signal, rebuild.\n"); infos->priv->isBuilt = FALSE; visu_gl_ext_infos_draw(infos); } static void onPositionChanged(VisuData *data _U_, VisuElement *ele _U_, gpointer user_data) { VisuGlExtInfos *infos = VISU_GL_EXT_INFOS(user_data); DBG_fprintf(stderr, "Extension Informations: caught the 'PositionChanged'" " signal, rebuild.\n"); infos->priv->isBuilt = FALSE; visu_gl_ext_infos_draw(infos); } static void onCameraMoved(VisuGlView *view _U_, gpointer user_data) { VisuGlExtInfos *infos = VISU_GL_EXT_INFOS(user_data); DBG_fprintf(stderr, "Extension Informations: caught the 'ThetaPhiOmegaChanged'" " signal, rebuild.\n"); infos->priv->isBuilt = FALSE; visu_gl_ext_infos_draw(infos); } static void onProperty(VisuDataNode *dataNode, VisuData *dataObj, gpointer user_data) { VisuGlExtInfos *infos = VISU_GL_EXT_INFOS(user_data); if (dataObj != infos->priv->dataObj) return; visu_gl_ext_setActive(VISU_GL_EXT(infos), visu_data_node_getUsed(dataNode, dataObj)); } static void onPropertyChanged(VisuDataNode *dataNode _U_, VisuData *dataObj, gpointer user_data) { VisuGlExtInfos *infos = VISU_GL_EXT_INFOS(user_data); if (dataObj != infos->priv->dataObj) return; infos->priv->isBuilt = FALSE; visu_gl_ext_infos_draw(infos); } v_sim-3.7.0/src/extensions/legend.h0000644000353400050620000001012112215546077014162 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2009) Adresse ml : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2009) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at COPYING. */ #ifndef LEGEND_H #define LEGEND_H #include "frame.h" #include #include #include /** * VISU_TYPE_GL_EXT_LEGEND: * * return the type of #VisuGlExtLegend. * * Since: 3.7 */ #define VISU_TYPE_GL_EXT_LEGEND (visu_gl_ext_legend_get_type ()) /** * VISU_GL_EXT_LEGEND: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuGlExtLegend type. * * Since: 3.7 */ #define VISU_GL_EXT_LEGEND(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_GL_EXT_LEGEND, VisuGlExtLegend)) /** * VISU_GL_EXT_LEGEND_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuGlExtLegendClass. * * Since: 3.7 */ #define VISU_GL_EXT_LEGEND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_GL_EXT_LEGEND, VisuGlExtLegendClass)) /** * VISU_IS_GL_EXT_LEGEND: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuGlExtLegend object. * * Since: 3.7 */ #define VISU_IS_GL_EXT_LEGEND(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_GL_EXT_LEGEND)) /** * VISU_IS_GL_EXT_LEGEND_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuGlExtLegendClass class. * * Since: 3.7 */ #define VISU_IS_GL_EXT_LEGEND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_GL_EXT_LEGEND)) /** * VISU_GL_EXT_LEGEND_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. * * Since: 3.7 */ #define VISU_GL_EXT_LEGEND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_GL_EXT_LEGEND, VisuGlExtLegendClass)) typedef struct _VisuGlExtLegend VisuGlExtLegend; typedef struct _VisuGlExtLegendPrivate VisuGlExtLegendPrivate; typedef struct _VisuGlExtLegendClass VisuGlExtLegendClass; struct _VisuGlExtLegend { VisuGlExtFrame parent; VisuGlExtLegendPrivate *priv; }; struct _VisuGlExtLegendClass { VisuGlExtFrameClass parent; }; /** * visu_gl_ext_legend_get_type: * * This method returns the type of #VisuGlExtLegend, use * VISU_TYPE_GL_EXT_LEGEND instead. * * Since: 3.7 * * Returns: the type of #VisuGlExtLegend. */ GType visu_gl_ext_legend_get_type(void); /** * VISU_GL_EXT_LEGEND_ID: * * The id used to identify this extension, see * visu_gl_ext_rebuild() for instance. */ #define VISU_GL_EXT_LEGEND_ID "Legend" VisuGlExtLegend* visu_gl_ext_legend_new(const gchar *name); gboolean visu_gl_ext_legend_setNodes(VisuGlExtLegend *legend, VisuNodeArray *nodes); VisuGlExtLegend* visu_gl_ext_legend_getDefault(); #endif v_sim-3.7.0/src/extensions/legend.c0000644000353400050620000003156412215546077014173 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2009) Adresse ml : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2009) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at COPYING. */ #include "legend.h" #include #include #include #include #include #include /** * SECTION:legend * @short_description: Draw a frame with the representation of each * atom species, its name and the number of elements. * * This extension draws a frame on top of the rendering area with an * item per #VisuElement currently rendered. For each #VisuElement, a * small representation of its OpenGL shape is drawn, its label is * printed and the number of #VisuNode associated to this * element. * This extension defines one resource entry labeled * "legend_is_on" to control if the legend is printed or not. * * Since: 3.5 */ #define FLAG_RESOURCE_LEGEND_USED "legend_is_on" #define DESC_RESOURCE_LEGEND_USED "Control if the legend is drawn ; boolean (0 or 1)" static gboolean DEFAULT_LEGEND_USED = FALSE; /** * VisuGlExtLegendClass: * @parent: the parent class; * * A short way to identify #_VisuGlExtLegendClass structure. * * Since: 3.7 */ /** * VisuGlExtLegend: * * An opaque structure. * * Since: 3.7 */ /** * VisuGlExtLegendPrivate: * * Private fields for #VisuGlExtLegend objects. * * Since: 3.7 */ struct _VisuGlExtLegendPrivate { gboolean dispose_has_run; /* Legend definition. */ VisuNodeArray *nodes; gulong popInc_signal, popDec_signal, eleSize_hook; }; static VisuGlExtLegend* defaultLegend; static void visu_gl_ext_legend_finalize(GObject* obj); static void visu_gl_ext_legend_dispose(GObject* obj); static void visu_gl_ext_legend_draw(VisuGlExtFrame *legend); static void visu_gl_ext_legend_rebuild(VisuGlExt *ext); /* Local callbacks. */ static void onNodePopulationChanged(VisuNodeArray *array, int *nodes, gpointer data); static gboolean onElementSize(GSignalInvocationHint *ihint, guint nvalues, const GValue *param_values, gpointer data); static void onEntryUsed(VisuGlExtLegend *lg, gchar *key, VisuObject *obj); /* Local routines. */ static void exportResources(GString *data, VisuData *dataObj, VisuGlView *view); G_DEFINE_TYPE(VisuGlExtLegend, visu_gl_ext_legend, VISU_TYPE_GL_EXT_FRAME) static void visu_gl_ext_legend_class_init(VisuGlExtLegendClass *klass) { VisuConfigFileEntry *resourceEntry; DBG_fprintf(stderr, "Extension Legend: creating the class of the object.\n"); /* DBG_fprintf(stderr, " - adding new signals ;\n"); */ DBG_fprintf(stderr, " - adding new resources ;\n"); resourceEntry = visu_config_file_addBooleanEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_LEGEND_USED, DESC_RESOURCE_LEGEND_USED, &DEFAULT_LEGEND_USED); visu_config_file_entry_setVersion(resourceEntry, 3.5f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_RESOURCE, exportResources); defaultLegend = (VisuGlExtLegend*)0; /* Connect the overloading methods. */ G_OBJECT_CLASS(klass)->dispose = visu_gl_ext_legend_dispose; G_OBJECT_CLASS(klass)->finalize = visu_gl_ext_legend_finalize; VISU_GL_EXT_CLASS(klass)->rebuild = visu_gl_ext_legend_rebuild; VISU_GL_EXT_FRAME_CLASS(klass)->draw = visu_gl_ext_legend_draw; } static void visu_gl_ext_legend_init(VisuGlExtLegend *obj) { DBG_fprintf(stderr, "Extension Legend: initializing a new object (%p).\n", (gpointer)obj); obj->priv = g_malloc(sizeof(VisuGlExtLegendPrivate)); obj->priv->dispose_has_run = FALSE; /* Private data. */ obj->priv->nodes = (VisuNodeArray*)0; obj->priv->popInc_signal = 0; obj->priv->popDec_signal = 0; g_signal_connect_object(VISU_OBJECT_INSTANCE, "entryParsed::" FLAG_RESOURCE_LEGEND_USED, G_CALLBACK(onEntryUsed), (gpointer)obj, G_CONNECT_SWAPPED); obj->priv->eleSize_hook = g_signal_add_emission_hook(g_signal_lookup("elementSizeChanged", VISU_TYPE_RENDERING), 0, onElementSize, (gpointer)obj, (GDestroyNotify)0); } /* This method can be called several times. It should unref all of its reference to GObjects. */ static void visu_gl_ext_legend_dispose(GObject* obj) { VisuGlExtLegend *legend; DBG_fprintf(stderr, "Extension Legend: dispose object %p.\n", (gpointer)obj); legend = VISU_GL_EXT_LEGEND(obj); if (legend->priv->dispose_has_run) return; legend->priv->dispose_has_run = TRUE; /* Disconnect signals. */ visu_gl_ext_legend_setNodes(legend, (VisuNodeArray*)0); g_signal_remove_emission_hook(g_signal_lookup("elementSizeChanged", VISU_TYPE_RENDERING), legend->priv->eleSize_hook); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_gl_ext_legend_parent_class)->dispose(obj); } /* This method is called once only. */ static void visu_gl_ext_legend_finalize(GObject* obj) { VisuGlExtLegend *legend; g_return_if_fail(obj); DBG_fprintf(stderr, "Extension Legend: finalize object %p.\n", (gpointer)obj); legend = VISU_GL_EXT_LEGEND(obj); /* Free privs elements. */ if (legend->priv) { DBG_fprintf(stderr, "Extension Legend: free private legend.\n"); g_free(legend->priv); } /* Chain up to the parent class */ DBG_fprintf(stderr, "Extension Legend: chain to parent.\n"); G_OBJECT_CLASS(visu_gl_ext_legend_parent_class)->finalize(obj); DBG_fprintf(stderr, "Extension Legend: freeing ... OK.\n"); } /** * visu_gl_ext_legend_new: * @name: (allow-none): the name to give to the extension (default is #VISU_GL_EXT_LEGEND_ID). * * Creates a new #VisuGlExt to draw a legend. * * Since: 3.7 * * Returns: a pointer to the #VisuGlExt it created or * NULL otherwise. */ VisuGlExtLegend* visu_gl_ext_legend_new(const gchar *name) { char *name_ = VISU_GL_EXT_LEGEND_ID; char *description = _("Draw the name and the shape of available elements on screen."); VisuGlExt *legend; #define LEGEND_HEIGHT 30 DBG_fprintf(stderr,"Extension Legend: new object.\n"); legend = VISU_GL_EXT(g_object_new(VISU_TYPE_GL_EXT_LEGEND, "name", (name)?name:name_, "label", _(name), "description", description, "nGlObj", 1, NULL)); visu_gl_ext_setSaveState(legend, TRUE); visu_gl_ext_setPriority(legend, VISU_GL_EXT_PRIORITY_LAST); visu_gl_ext_frame_setPosition(VISU_GL_EXT_FRAME(legend), 0.f, 1.f); visu_gl_ext_frame_setRequisition(VISU_GL_EXT_FRAME(legend), G_MAXUINT / 2, LEGEND_HEIGHT); return VISU_GL_EXT_LEGEND(legend); } /** * visu_gl_ext_legend_setNodes: * @legend: The #VisuGlExtLegend to attached to. * @nodes: the nodes to get the population of. * * Attach an #VisuGlView to render to and setup the legend to get the * node population also. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_frame_draw() should be called and * then 'OpenGLAskForReDraw' signal be emitted. **/ gboolean visu_gl_ext_legend_setNodes(VisuGlExtLegend *legend, VisuNodeArray *nodes) { g_return_val_if_fail(VISU_IS_GL_EXT_LEGEND(legend), FALSE); if (legend->priv->nodes) { g_signal_handler_disconnect(G_OBJECT(legend->priv->nodes), legend->priv->popInc_signal); g_signal_handler_disconnect(G_OBJECT(legend->priv->nodes), legend->priv->popDec_signal); g_object_unref(legend->priv->nodes); } if (nodes) { g_object_ref(nodes); legend->priv->popInc_signal = g_signal_connect(G_OBJECT(nodes), "PopulationIncrease", G_CALLBACK(onNodePopulationChanged), (gpointer)legend); legend->priv->popDec_signal = g_signal_connect(G_OBJECT(nodes), "PopulationDecrease", G_CALLBACK(onNodePopulationChanged), (gpointer)legend); } else { legend->priv->popInc_signal = 0; legend->priv->popDec_signal = 0; } legend->priv->nodes = nodes; VISU_GL_EXT_FRAME(legend)->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(legend)); } /** * visu_gl_ext_legend_getDefault: * * V_Sim is using a default legend object. * * Since: 3.7 * * Returns: (transfer none): a #VisuGlExtLegend object used by default. **/ VisuGlExtLegend* visu_gl_ext_legend_getDefault() { if (!defaultLegend) defaultLegend = visu_gl_ext_legend_new((gchar*)0); return defaultLegend; } static void onEntryUsed(VisuGlExtLegend *lg, gchar *key _U_, VisuObject *obj _U_) { visu_gl_ext_setActive(VISU_GL_EXT(lg), DEFAULT_LEGEND_USED); } static void onNodePopulationChanged(VisuNodeArray *array _U_, int *nodes _U_, gpointer data) { VISU_GL_EXT_FRAME(data)->isBuilt = FALSE; visu_gl_ext_frame_draw(VISU_GL_EXT_FRAME(data)); } static gboolean onElementSize(GSignalInvocationHint *ihint _U_, guint nvalues _U_, const GValue *param_values _U_, gpointer data) { VISU_GL_EXT_FRAME(data)->isBuilt = FALSE; visu_gl_ext_frame_draw(VISU_GL_EXT_FRAME(data)); return TRUE; } static void visu_gl_ext_legend_rebuild(VisuGlExt *ext) { visu_gl_text_rebuildFontList(); VISU_GL_EXT_FRAME(ext)->isBuilt = FALSE; visu_gl_ext_frame_draw(VISU_GL_EXT_FRAME(ext)); } static void visu_gl_ext_legend_draw(VisuGlExtFrame *frame) { guint dw; guint i; float scale; GString *str; VisuNodeArrayIter iter; VisuRendering *method; VisuGlExtLegend *legend; g_return_if_fail(VISU_IS_GL_EXT_LEGEND(frame)); legend = VISU_GL_EXT_LEGEND(frame); if (!legend->priv->nodes) return; method = visu_object_getRendering(VISU_OBJECT_INSTANCE); g_return_if_fail(method); /* We draw the legend. */ str = g_string_new(""); scale = 0.5f * frame->height / visu_node_array_getMaxElementSize(legend->priv->nodes); visu_node_array_iterNew(legend->priv->nodes, &iter); dw = MAX(frame->width / visu_node_array_getNElements(legend->priv->nodes, TRUE), frame->height + 10 + 60); for (visu_node_array_iterStart(legend->priv->nodes, &iter), i = 0; iter.element; visu_node_array_iterNextElement(legend->priv->nodes, &iter), i+= 1) { if (!visu_element_getPhysical(iter.element)) { i -= 1; continue; } /* The element. */ glEnable(GL_LIGHTING); glCallList(visu_element_getMaterialId(iter.element)); glPushMatrix(); glTranslated(i * dw + 5 + frame->height / 2, frame->height / 2, 0.f); glRotated(45., 0, 0, 1); glRotated(60., 0, 1, 0); glScalef(scale, scale, scale); glCallList(visu_rendering_getElementGlId(method, iter.element)); glPopMatrix(); glDisable(GL_LIGHTING); /* The label. */ glColor3fv(VISU_GL_EXT_FRAME(legend)->fontRGB); g_string_printf(str, "%s (%d)", iter.element->name, iter.nStoredNodes); glRasterPos2i(i * dw + 5 + frame->height + 5, (frame->height - 20) / 2 + 5); visu_gl_text_drawChars(str->str, VISU_GL_TEXT_SMALL); } g_string_free(str, TRUE); } static void exportResources(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { if (!defaultLegend) return; visu_config_file_exportComment(data, DESC_RESOURCE_LEGEND_USED); visu_config_file_exportEntry(data, FLAG_RESOURCE_LEGEND_USED, NULL, "%d", visu_gl_ext_getActive(VISU_GL_EXT(defaultLegend))); visu_config_file_exportComment(data, ""); } v_sim-3.7.0/src/extensions/rings.h0000644000353400050620000000505112215546077014054 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2009) David WAROQUIERS, PCPM UC Louvain la Neuve (2009) Adresse m�l : CALISTE, damien P caliste AT cea P fr WAROQUIERS, david P waroquiers AT uclouvain P be Ce logiciel est un programme informatique servant � visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est r�gi par la licence CeCILL soumise au droit fran�ais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffus�e par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez acc�der � cet en-t�te signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept� les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2009) David WAROQUIERS, PCPM UC Louvain la Neuve (2009) E-mail address: CALISTE, damien P caliste AT cea P fr WAROQUIERS, david P waroquiers AT uclouvain P be This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at COPYING. */ #ifndef RINGS_H #define RINGS_H #include #include /** * EXT_RINGS_ID: * * The id of the ring extension. */ #define EXT_RINGS_ID "Rings" VisuGlExt* initExtRings(); gboolean extRingsSet_isOn(gboolean value); gboolean extRingsGet_isOn(); /** * setVisuPlaneFromBoxChange: * @dataObj: a #VisuData object ; * @boxChange: the boxchange associated to the plane ; * @point: a point through which the plane passes ; * @plane: a VisuPlane declared in which to store the plane properties. * * A method to set a plane corresponding to a box change */ /* void setVisuPlaneFromBoxChange(VisuData *dataObj, float boxChange[3], float point[3], VisuPlane *plane); */ void extRingsDraw(VisuData *dataObj); #endif v_sim-3.7.0/src/extensions/rings.c0000644000353400050620000010141312215546077014046 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2009) David WAROQUIERS, PCPM UC Louvain la Neuve (2009) Adresse m�l : CALISTE, damien P caliste AT cea P fr WAROQUIERS, david P waroquiers AT uclouvain P be Ce logiciel est un programme informatique servant � visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est r�gi par la licence CeCILL soumise au droit fran�ais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffus�e par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez acc�der � cet en-t�te signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept� les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2009) David WAROQUIERS, PCPM UC Louvain la Neuve (2009) E-mail address: CALISTE, damien P caliste AT cea P fr WAROQUIERS, david P waroquiers AT uclouvain P be This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at COPYING. */ #include "rings.h" #include #include #include #include #include #include /** * SECTION: rings * @short_description: an extension to highlight closed rings in a structure. * * TODO */ static VisuGlExt* extRings; static gboolean extRingsIsBuilt; static gulong popInc_signal, popDec_signal, popChg_signal; /* Local callbacks. */ static void onDataReadySignal(GObject *obj, VisuData *dataObj, VisuGlView *view, gpointer data); static void onDataNotReadySignal(GObject *obj, VisuData *dataObj, VisuGlView *view, gpointer data); static void onNodePopulationChanged(VisuData *dataObj, int *nodes, gpointer data); static void onPositionChanged(VisuData *dataObj, gpointer data _U_); /* Local routines. */ /* static void rebuildRings(VisuGlExt *ext, VisuData *dataObj, */ /* VisuGlView *view, gpointer data); */ void changeCoordfromBoxChange(VisuData *dataObj, float *coord, float boxChange[3], float *newcoord); #define RADTODEG 57.29577951 /* Some test rings that are relevant */ #define NB_NODES8 8 #define NB_NODES16 16 #define NB_NODES10 10 #define NB_NODES5 5 #define NB_NODES NB_NODES16 int testring_1[NB_NODES8] = {30,69,14,60,2,55,31,71}; /* NB_NODES 8*/ int testring_2[NB_NODES8] = {10,53,15,50,22,71,11,67}; /* NB_NODES 8*/ int testring_3[NB_NODES16] = {2,55,46,64,4,67,11,71,30,69,45,56,6,65,3,60}; /* NB_NODES 16*/ int testring_4[NB_NODES16] = {6,56,45,69,30,71,11,67,10,53,43,63,23,51,35,65}; /* NB_NODES 16*/ int testring[NB_NODES16] = {22,50,9,68,36,63,23,51,35,65,3,60,14,69,30,71}; /* NB_NODES 16*/ int testring_6[NB_NODES10] = {26,54,47,69,30,71,31,55,21,66}; /* NB_NODES 10*/ int testring_7[NB_NODES5] = {60,39,8,61,14}; /* NB_NODES 10*/ typedef struct { int drawSpheres; int drawCylinders; int drawTrianglePlanars; float sphereRadius; float sphereColor[4]; float cylinderRadius; float cylinderColor[4]; float trianglePlanarsColor[4]; } ringVisualisation; /** * initExtRings: (skip) * * Initialise the ring extension, internal routine, do not use. * * Since: 3.5 * * Returns: a newly allocated #VisuGlExt. */ VisuGlExt* initExtRings() { /* char *name = EXT_RINGS_ID; */ /* char *description = _("Draw a representation for the rings in an atomic structures."); */ DBG_fprintf(stderr,"Ext Rings: initialising the rings OpenGL extension...\n"); /* extRings = visu_gl_ext_new(name, _(name), description, */ /* 1, rebuildRings, (gpointer)0); */ /* visu_gl_ext_setActive(extRings, FALSE); */ extRings = (VisuGlExt*)0; /* Initialisation des valeurs par d�faut. */ extRingsIsBuilt = FALSE; /* Disable rings extension for now. */ return extRings; g_signal_connect(VISU_OBJECT_INSTANCE, "dataRendered", G_CALLBACK(onDataReadySignal), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "dataUnRendered", G_CALLBACK(onDataNotReadySignal), (gpointer)0); return extRings; } /** * extRingsSet_isOn: * @value: a boolean. * * Set if rings are drawn or not. * * Since: 3.5 * * Returns: TRUE is status is changed. */ gboolean extRingsSet_isOn(gboolean value) { if (!visu_gl_ext_setActive(extRings, value)) return FALSE; return (value && !extRingsIsBuilt); } /** * extRingsGet_isOn: * * Retrieves if the ring extension is used. * * Since: 3.5 * * Returns: TRUE if ring extension is used. */ gboolean extRingsGet_isOn() { return visu_gl_ext_getActive(extRings); } static void onDataReadySignal(GObject *obj _U_, VisuData *dataObj, VisuGlView *view, gpointer data _U_) { DBG_fprintf(stderr, "Ext Rings: catch 'dataRendered' signal.\n"); if (dataObj && visu_gl_ext_getActive(extRings)) { if (visu_data_getChangeElementFlag(dataObj)) { DBG_fprintf(stderr,"Ext Rings: elements not changed, keep it.\n"); return; } extRingsIsBuilt = FALSE; extRingsDraw(dataObj); } if (dataObj && view) { popInc_signal = g_signal_connect(G_OBJECT(dataObj), "PopulationIncrease", G_CALLBACK(onNodePopulationChanged), (gpointer)0); popDec_signal = g_signal_connect(G_OBJECT(dataObj), "PopulationDecrease", G_CALLBACK(onNodePopulationChanged), (gpointer)0); popChg_signal = g_signal_connect(G_OBJECT(dataObj), "PositionChanged", G_CALLBACK(onPositionChanged), (gpointer)0); } } static void onDataNotReadySignal(GObject *obj _U_, VisuData *dataObj, VisuGlView *view _U_, gpointer data _U_) { g_signal_handler_disconnect(G_OBJECT(dataObj), popInc_signal); g_signal_handler_disconnect(G_OBJECT(dataObj), popDec_signal); g_signal_handler_disconnect(G_OBJECT(dataObj), popChg_signal); } static void onNodePopulationChanged(VisuData *dataObj, int *nodes _U_, gpointer data _U_) { if (visu_gl_ext_getActive(extRings)) { extRingsIsBuilt = FALSE; extRingsDraw(dataObj); } } static void onPositionChanged(VisuData *dataObj, gpointer data _U_) { if (visu_gl_ext_getActive(extRings)) { extRingsIsBuilt = FALSE; extRingsDraw(dataObj); } } /* static void rebuildRings(VisuGlExt *ext _U_, VisuData *dataObj, */ /* VisuGlView *view _U_, gpointer data _U_) */ /* { */ /* extRingsIsBuilt = FALSE; */ /* extRingsDraw(dataObj); */ /* } */ void drawCylinder(float x1, float y1, float z1, float x2, float y2, float z2, float cylRad, int nFaces) { double vNorm[3]; double vDest[3]; double cosAlpha; double alpha; double distsq; GLUquadricObj *obj; DBG_fprintf(stderr, "Drawing Cylinder between points (%.4f,%.4f,%.4f) and (%.4f,%.4f,%.4f)\n",x1 , y1 , z1, x2, y2, z2); vDest[0] = x2 - x1; vDest[1] = y2 - y1; vDest[2] = z2 - z1; distsq = (vDest[0]*vDest[0])+(vDest[1]*vDest[1])+(vDest[2]*vDest[2]); if (vDest[0] != 0 || vDest[1] != 0) { vNorm[0] = - vDest[1]; vNorm[1] = vDest[0]; vNorm[2] = 0.; cosAlpha = sqrt((vDest[2] * vDest[2]) / distsq); if (vDest[2] < 0.) cosAlpha = - cosAlpha; cosAlpha = CLAMP(cosAlpha, -1., 1.); alpha = acos(cosAlpha) * RADTODEG; } else { vNorm[0] = 1.; vNorm[1] = 0.; vNorm[2] = 0.; if (vDest[2] < 0.) alpha = 180.; else alpha = 0.; } obj = gluNewQuadric(); glPushMatrix(); glTranslated(x1, y1, z1); glRotated(alpha, vNorm[0], vNorm[1], vNorm[2]); gluCylinder(obj, (GLdouble)cylRad, (GLdouble)cylRad, (GLdouble)sqrt(distsq), (GLint)nFaces, (GLint)1); glPopMatrix(); gluDeleteQuadric(obj); } void drawSphere(float x1, float y1, float z1, float sphRad, int longit, int latit) { GLUquadricObj *obj; DBG_fprintf(stderr, "Drawing Sphere at point (%.4f,%.4f,%.4f)\n",x1 , y1 , z1); obj = gluNewQuadric(); glPushMatrix(); glTranslated(x1, y1, z1); gluSphere(obj, sphRad, longit, latit); glPopMatrix(); gluDeleteQuadric(obj); } void drawRingPlanar(int ringSize, float *xyzPts, float *boxRing, float bary[3], float baryBox[3]) { int i; glBegin(GL_TRIANGLES); for (i = 0; i < ringSize-1; i++) { if (baryBox[0] == *(boxRing + i*3) && baryBox[1] == *(boxRing + i*3 + 1) && baryBox[2] == *(boxRing + i*3 + 2)) { if (baryBox[0] == *(boxRing + i*3 + 3) && baryBox[1] == *(boxRing + i*3 + 4) && baryBox[2] == *(boxRing + i*3 + 5)) { glVertex3fv(bary); glVertex3fv(xyzPts + i*3); glVertex3fv(xyzPts + i*3 + 3); } } } if (baryBox[0] == *(boxRing + (ringSize-1)*3) && baryBox[1] == *(boxRing + (ringSize-1)*3 + 1) && baryBox[2] == *(boxRing + (ringSize-1)*3 + 2)) { if (baryBox[0] == *(boxRing) && baryBox[1] == *(boxRing + 1) && baryBox[2] == *(boxRing + 2)) { glVertex3fv(bary); glVertex3fv(xyzPts + (ringSize-1)*3); glVertex3fv(xyzPts); } } glEnd(); } void computeBaryCenter(VisuData *dataObj, int ringSize, float *xyz, float *boxRing, float *baryCoord, float *baryBox) { int i; int bBox[3]; float sum[3] = {0.0,0.0,0.0}; float tmp[3]; float tmp2[3]; DBG_fprintf(stderr, "Computing barycenter of the ring\n"); for (i = 0; i < ringSize; i++) { tmp[0] = *(boxRing + 3*i); tmp[1] = *(boxRing + 3*i + 1); tmp[2] = *(boxRing + 3*i + 2); tmp2[0] = *(xyz + 3*i); tmp2[1] = *(xyz + 3*i + 1); tmp2[2] = *(xyz + 3*i + 2); changeCoordfromBoxChange(dataObj, tmp2, tmp, baryCoord); sum[0] = sum[0] + *(baryCoord); sum[1] = sum[1] + *(baryCoord + 1); sum[2] = sum[2] + *(baryCoord + 2); } *(baryCoord) = sum[0]/ringSize; *(baryCoord + 1) = sum[1]/ringSize; *(baryCoord + 2) = sum[2]/ringSize; visu_data_getNodeBoxFromCoord(dataObj, baryCoord, bBox); *(baryBox) = (float)bBox[0]; *(baryBox + 1) = (float)bBox[1]; *(baryBox + 2) = (float)bBox[2]; tmp[0] = -*(baryBox); tmp[1] = -*(baryBox + 1); tmp[2] = -*(baryBox + 2); tmp2[0] = *(baryCoord); tmp2[1] = *(baryCoord + 1); tmp2[2] = *(baryCoord + 2); changeCoordfromBoxChange(dataObj, tmp2, tmp, baryCoord); DBG_fprintf(stderr, "Barycenter of the ring :\n - coordinates (in center box) : %f %f %f \n - box associated : %f %f %f \n", *(baryCoord), *(baryCoord + 1), *(baryCoord + 2), *(baryBox), *(baryBox + 1), *(baryBox + 2)); } void drawRingCylinder(int nbOfPairs, float *xyzPts) { float radius = 0.3; int nFaces = 10; int i; for (i = 0; i < nbOfPairs; i++) { drawCylinder((xyzPts + i*6)[0], (xyzPts + i*6)[1], (xyzPts + i*6)[2], (xyzPts + i*6 + 3)[0],(xyzPts + i*6 + 3)[1], (xyzPts + i*6 + 3)[2], radius, nFaces); } } void drawRingSpheres(int nbOfPairs, float *xyzPts, int *atomInd) { int i; for (i = 0; i < 2*nbOfPairs; i++) { if (*(atomInd + i)) drawSphere(*(xyzPts + 3*i), *(xyzPts + 3*i + 1), *(xyzPts + 3*i + 2), 0.4, 10, 10); } } void drawRingLine(int nbOfPairs, float *xyzPts) { int i; glBegin(GL_LINES); for (i = 0; i < nbOfPairs; i++) { glVertex3fv(xyzPts + i * 6); glVertex3fv(xyzPts + i * 6 + 3); } glEnd(); } void initTranslationForBoxAndCoord(VisuData *dataObj, int ringSize, float *xyz, float *boxRing) { float xyzTrans[3]; float* boxTrans = visu_data_getXYZtranslation(dataObj); int i, j, nodeBox[3]; DBG_fprintf(stderr, "Initializing translation for the box indices and coordinates of the ring : \n"); DBG_fprintf(stderr, " with a box translation of %f %f %f\n", boxTrans[0], boxTrans[1], boxTrans[2]); DBG_fprintf(stderr, "Initializing translation for the box indices and coordinates of the ring : \n"); for (i = 0; i < ringSize; i++) /* Get the coordinates of the nodes */ { for (j = 0; j < 3; j++) { xyzTrans[j] = *(xyz + 3*i + j) + boxTrans[j]; /* *(boxRing + 3*i + j) = *(boxRing + 3*i + j);*/ } visu_data_getNodeBoxFromCoord(dataObj, xyzTrans, nodeBox); for (j = 0; j < 3; j++) { DBG_fprintf(stderr, " %d", nodeBox[j]); *(boxRing + 3*i + j) = *(boxRing + 3*i + j) + nodeBox[j]; } DBG_fprintf(stderr, "\n"); } g_free(boxTrans); } void initRing(VisuData *dataObj _U_, int ringSize, float *xyz _U_, float *boxRing, float *boxChange, int *totNbPts) { int i, j; /* float initBoxChange[ringSize][3]; */ *totNbPts = ringSize; DBG_fprintf(stderr, "Initializing boxChange of a ring : \n"); for (i = 0; i < ringSize-1; i++) { for (j = 0; j < 3; j++) { *(boxChange + 3*i + j) = *(boxRing + 3*(i+1) + j) - *(boxRing + 3*i + j); DBG_fprintf(stderr, " %.1f", *(boxChange + 3*i + j)); } DBG_fprintf(stderr, "\n"); } for (j = 0; j < 3; j++) { *(boxChange + 3*(ringSize-1) + j) = *(boxRing + j) - *(boxRing + 3*(ringSize-1) + j); DBG_fprintf(stderr, " %.1f", *(boxChange + 3*(ringSize-1) + j)); } DBG_fprintf(stderr, "\n"); for (i = 0; i < ringSize; i++) /* Calculate the total number of points needed to draw the rings */ { for (j = 0; j < 3; j++) { *totNbPts = *totNbPts + ABS(*(boxChange + 3*i + j)); } } *totNbPts = *totNbPts * 2; DBG_fprintf(stderr, "Total number of points for this ring (including intersections with the box) : %d \n",*totNbPts); } void changeCoordfromBoxChange(VisuData *dataObj, float *coord, float boxChange[3], float *newcoord) { float xyz[3], bxyz[3]; int i; xyz[0] = *(coord); xyz[1] = *(coord + 1); xyz[2] = *(coord + 2); visu_box_convertXYZtoBoxCoordinates(visu_boxed_getBox(VISU_BOXED(dataObj)), bxyz, xyz); for (i = 0; i < 3; i++) { bxyz[i] = bxyz[i] + boxChange[i]; } visu_box_convertBoxCoordinatestoXYZ(visu_boxed_getBox(VISU_BOXED(dataObj)), (float*)newcoord, bxyz); DBG_fprintf(stderr, "Changing coordinate (%f %f %f) from box change (%.1f %.1f %.1f) to (%f %f %f)\n", xyz[0],xyz[1],xyz[2],boxChange[0],boxChange[1],boxChange[2],*(newcoord),*(newcoord + 1),*(newcoord + 2)); } void setVisuPlaneFromBoxChange(VisuData *dataObj, float boxChange[3], VisuPlane *plane) { float tmpCoord[3], norm, distToOrigin = 0; float boxMatrix[3][3]; float boxToOrtho[3][3]; float normal[3]; float bC[3]; float point[3]; /* float xyz[3];*/ int i, j; /* Change the transformation matrix. */ DBG_fprintf(stderr, "Setting a new plane from boxchange %.1f %.1f %.1f :\n", boxChange[0], boxChange[1], boxChange[2]); for (j = 0; j < 3; j++) { if (boxChange[j] < 0.) bC[j] = boxChange[j] + 1.; else bC[j] = boxChange[j]; tmpCoord[0] = (j == 0)?1.:0.; tmpCoord[1] = (j == 1)?1.:0.; tmpCoord[2] = (j == 2)?1.:0.; visu_box_convertBoxCoordinatestoXYZ(visu_boxed_getBox(VISU_BOXED(dataObj)), boxMatrix[j], tmpCoord); } /* We create a matrix to transform the box coordinates to cartesian values keeping the orthogonality. */ for (i = 0; i < 3; i++) { norm = 0.; for (j = 0; j < 3; j++) { boxToOrtho[j][i] = boxMatrix[(i + 1)%3][(j + 1)%3] * boxMatrix[(i + 2)%3][(j + 2)%3] - boxMatrix[(i + 1)%3][(j + 2)%3] * boxMatrix[(i + 2)%3][(j + 1)%3]; norm += boxToOrtho[j][i] * boxToOrtho[j][i]; } /* We normalise the tranformation matrix. */ norm = sqrt(norm); for (j = 0; j < 3; j++) boxToOrtho[j][i] /= norm; } tool_matrix_productVector(normal, boxToOrtho, boxChange); DBG_fprintf(stderr, " - normal vector : %f %f %f\n", normal[0], normal[1], normal[2]); visu_plane_setNormalVector(plane,normal); visu_plane_getNVect(plane,normal); DBG_fprintf(stderr, " - normal vector (normalized) : %f %f %f\n", normal[0], normal[1], normal[2]); visu_box_convertBoxCoordinatestoXYZ(visu_boxed_getBox(VISU_BOXED(dataObj)), point, bC); for (i = 0; i < 3; i++) { distToOrigin += normal[i]*point[i]; } DBG_fprintf(stderr, " - distance to origin : %f\n", distToOrigin); visu_plane_setDistanceFromOrigin(plane, distToOrigin); } void initDrawCoord(VisuData *dataObj, int ringSize, int *atomInd, float *xyz, float *boxChange, float *drawCoord, int totalNumberOfPoints _U_) {/* Initialize the drawCoordinates : for a given ring size RS and a give number of intersected planes NP, the number of coordinates is 2*(RS + NP), ie one pair of coordinates for each element to draw. */ int i, j, k = 0; int np; int l, p; float A[3], B[3], xrB[3], bC[3], tBC[3] = {0.,0.,0.}; float *inter; float *change; int *index; VisuPlane **listOfVisuPlanes; /* Number of planes + 1 (in order to get a NULL at the end and stop)*/ for (j = 0; j < 3; j++) { *(drawCoord + j) = *(xyz + j); *(atomInd) = 1; } DBG_fprintf(stderr, "Point added (first point) to drawCoord %f %f %f from box (0 0 0)\n", *(drawCoord + 3*k), *(drawCoord + 3*k + 1), *(drawCoord + 3*k + 2)); k++; for (i = 0; i < ringSize-1; i++) { if ( (*(boxChange + 3*i) == 0.) && (*(boxChange + 3*i + 1) == 0.) && (*(boxChange + 3*i + 2) == 0.) ) { *(drawCoord + 3*k) = *(xyz + 3*(i+1)); *(drawCoord + 3*k + 1) = *(xyz + 3*(i+1) + 1); *(drawCoord + 3*k + 2) = *(xyz + 3*(i+1) + 2); DBG_fprintf(stderr, "Point added to drawCoord %f %f %f from box (0 0 0)\n", *(drawCoord + 3*k), *(drawCoord + 3*k + 1), *(drawCoord + 3*k + 2)); *(atomInd + k) = 1; k++; *(drawCoord + 3*k) = *(xyz + 3*(i+1)); *(drawCoord + 3*k + 1) = *(xyz + 3*(i+1) + 1); *(drawCoord + 3*k + 2) = *(xyz + 3*(i+1) + 2); DBG_fprintf(stderr, "Point added to drawCoord %f %f %f from box (0 0 0)\n", *(drawCoord + 3*k), *(drawCoord + 3*k + 1), *(drawCoord + 3*k + 2)); *(atomInd + k) = 1; k++; } else { np = ABS(*(boxChange + 3*i)) + ABS(*(boxChange + 3*i + 1)) + ABS(*(boxChange + 3*i + 2)); inter = g_malloc(sizeof(float) * np * 3); change = g_malloc(sizeof(float) * np * 3); index = g_malloc(sizeof(float) * np); for (j = 0; j < 3; j++) { A[j] = *(xyz + 3*i + j); B[j] = *(xyz + 3*(i+1) + j); } DBG_fprintf(stderr, "Point A : %f %f %f\nPoint B : %f %f %f\n", A[0],A[1],A[2],B[0],B[1],B[2]); DBG_fprintf(stderr, "BoxChange for B : %.1f %.1f %.1f\n", *(boxChange + 3*i),*(boxChange + 3*i + 1),*(boxChange + 3*i + 2)); visu_box_convertXYZtoBoxCoordinates(visu_boxed_getBox(VISU_BOXED(dataObj)), xrB, B); xrB[0] = xrB[0] + *(boxChange + 3*i); xrB[1] = xrB[1] + *(boxChange + 3*i + 1); xrB[2] = xrB[2] + *(boxChange + 3*i + 2); visu_box_convertBoxCoordinatestoXYZ(visu_boxed_getBox(VISU_BOXED(dataObj)), B, xrB); DBG_fprintf(stderr, "Point B after BoxChange : %f %f %f\n",B[0],B[1],B[2]); listOfVisuPlanes = g_malloc(sizeof(VisuPlane*) * (np + 1)); listOfVisuPlanes[np] = (VisuPlane*)0; p = 0; for (j = 0; j < 3; j++) { bC[0] = 0.; bC[1] = 0.; bC[2] = 0.; for (l = 0; l < ABS(*(boxChange + 3*i + j)); l++) { if (*(boxChange + 3*i + j) > 0.) { bC[j] = (float)(+l+1); } else if (*(boxChange + 3*i + j) < 0.) { bC[j] = (float)(-l-1); } listOfVisuPlanes[p] = visu_plane_newUndefined(); setVisuPlaneFromBoxChange(dataObj, bC, listOfVisuPlanes[p]); change[3 * p + 0] = bC[0]; change[3 * p + 1] = bC[1]; change[3 * p + 2] = bC[2]; p++; } } if (visu_plane_class_getOrderedIntersections(np, listOfVisuPlanes, A, B, (float*)inter, (int*)index)) { tBC[0] = 0.; tBC[1] = 0.; tBC[2] = 0.; for (p = 0; p < np; p++) { A[0] = inter[3 * p + 0]; A[1] = inter[3 * p + 1]; A[2] = inter[3 * p + 2]; changeCoordfromBoxChange(dataObj, A, tBC, B); *(drawCoord + 3*k) = B[0]; *(drawCoord + 3*k + 1) = B[1]; *(drawCoord + 3*k + 2) = B[2]; /* *(drawCoord + 3*k) = inter[p][0]; *(drawCoord + 3*k + 1) = inter[p][1]; *(drawCoord + 3*k + 2) = inter[p][2];*/ DBG_fprintf(stderr, "Point added to drawCoord %f %f %f for a plane\n", *(drawCoord + 3*k), *(drawCoord + 3*k + 1), *(drawCoord + 3*k + 2)); *(atomInd + k) = 0; k++; if (change[index[p] * 3 + 0] < 0.) tBC[0] = tBC[0] + 1.; else if (change[index[p] * 3 + 0] > 0.) tBC[0] = tBC[0] - 1.; if (change[index[p] * 3 + 1] < 0.) tBC[1] = tBC[1] + 1.; else if (change[index[p] * 3 + 1] > 0.) tBC[1] = tBC[1] - 1.; if (change[index[p] * 3 + 2] < 0.) tBC[2] = tBC[2] + 1.; else if (change[index[p] * 3 + 2] > 0.) tBC[2] = tBC[2] - 1.; DBG_fprintf(stderr, "Change of box needed for the next point : %f %f %f\n", tBC[0],tBC[1],tBC[2]); A[0] = inter[p * 3 + 0]; A[1] = inter[p * 3 + 1]; A[2] = inter[p * 3 + 2]; changeCoordfromBoxChange(dataObj, A, tBC, B); *(drawCoord + 3*k) = B[0]; *(drawCoord + 3*k + 1) = B[1]; *(drawCoord + 3*k + 2) = B[2]; DBG_fprintf(stderr, "Point added to drawCoord %f %f %f for a plane\n", *(drawCoord + 3*k), *(drawCoord + 3*k + 1), *(drawCoord + 3*k + 2)); *(atomInd + k) = 0; k++; } *(drawCoord + 3*k) = *(xyz + 3*(i+1)); *(drawCoord + 3*k + 1) = *(xyz + 3*(i+1) + 1); *(drawCoord + 3*k + 2) = *(xyz + 3*(i+1) + 2); DBG_fprintf(stderr, "Point added to drawCoord %f %f %f after planes\n", *(drawCoord + 3*k), *(drawCoord + 3*k + 1), *(drawCoord + 3*k + 2)); *(atomInd + k) = 1; k++; *(drawCoord + 3*k) = *(xyz + 3*(i+1)); *(drawCoord + 3*k + 1) = *(xyz + 3*(i+1) + 1); *(drawCoord + 3*k + 2) = *(xyz + 3*(i+1) + 2); DBG_fprintf(stderr, "Point added to drawCoord %f %f %f after planes\n", *(drawCoord + 3*k), *(drawCoord + 3*k + 1), *(drawCoord + 3*k + 2)); *(atomInd + k) = 1; k++; } else { DBG_fprintf(stderr, "WARNING : visu_plane_class_getOrderedIntersections did not find any plane !!!\n"); } g_free(listOfVisuPlanes); g_free(inter); g_free(change); g_free(index); } } if ( (*(boxChange + 3*(ringSize-1)) == 0.) && (*(boxChange + 3*(ringSize-1) + 1) == 0.) && (*(boxChange + 3*(ringSize-1) + 2) == 0.) ) { *(drawCoord + 3*k) = *(xyz); *(drawCoord + 3*k + 1) = *(xyz + 1); *(drawCoord + 3*k + 2) = *(xyz + 2); DBG_fprintf(stderr, "Point added to drawCoord %f %f %f from box (0 0 0)\n", *(drawCoord + 3*k), *(drawCoord + 3*k + 1), *(drawCoord + 3*k + 2)); *(atomInd + k) = 1; k++; } else { np = ABS(*(boxChange + 3*(ringSize-1))) + ABS(*(boxChange + 3*(ringSize-1) + 1)) + ABS(*(boxChange + 3*(ringSize-1) + 2)); inter = g_malloc(sizeof(float) * np * 3); change = g_malloc(sizeof(float) * np * 3); index = g_malloc(sizeof(float) * np); for (j = 0; j < 3; j++) { A[j] = *(xyz + 3*(ringSize-1) + j); B[j] = *(xyz + j); } DBG_fprintf(stderr, "Point A : %f %f %f\nPoint B : %f %f %f\n", A[0],A[1],A[2],B[0],B[1],B[2]); DBG_fprintf(stderr, "BoxChange for B : %.1f %.1f %.1f\n", *(boxChange + 3*(ringSize-1)),*(boxChange + 3*(ringSize-1) + 1), *(boxChange + 3*(ringSize-1) + 2)); visu_box_convertXYZtoBoxCoordinates(visu_boxed_getBox(VISU_BOXED(dataObj)), xrB, B); xrB[0] = xrB[0] + *(boxChange + 3*(ringSize-1)); xrB[1] = xrB[1] + *(boxChange + 3*(ringSize-1) + 1); xrB[2] = xrB[2] + *(boxChange + 3*(ringSize-1) + 2); visu_box_convertBoxCoordinatestoXYZ(visu_boxed_getBox(VISU_BOXED(dataObj)), B, xrB); DBG_fprintf(stderr, "Point B after BoxChange : %f %f %f\n",B[0],B[1],B[2]); listOfVisuPlanes = g_malloc(sizeof(VisuPlane*) * (np + 1)); listOfVisuPlanes[np] = (VisuPlane*)0; p = 0; for (j = 0; j < 3; j++) { bC[0] = 0.; bC[1] = 0.; bC[2] = 0.; for (l = 0; l < ABS(*(boxChange + 3*(ringSize-1) + j)); l++) { if (*(boxChange + 3*(ringSize-1) + j) > 0.) { bC[j] = (float)(+l+1); } else if (*(boxChange + 3*(ringSize-1) + j) < 0.) { bC[j] = (float)(-l-1); } listOfVisuPlanes[p] = visu_plane_newUndefined(); setVisuPlaneFromBoxChange(dataObj, bC, listOfVisuPlanes[p]); change[p * 3 + 0] = bC[0]; change[p * 3 + 1] = bC[1]; change[p * 3 + 2] = bC[2]; p++; } } if (visu_plane_class_getOrderedIntersections(np, listOfVisuPlanes, A, B, (float*)inter, (int*)index)) { tBC[0] = 0.; tBC[1] = 0.; tBC[2] = 0.; for (p = 0; p < np; p++) { A[0] = inter[3 * p + 0]; A[1] = inter[3 * p + 1]; A[2] = inter[3 * p + 2]; changeCoordfromBoxChange(dataObj, A, tBC, B); *(drawCoord + 3*k) = B[0]; *(drawCoord + 3*k + 1) = B[1]; *(drawCoord + 3*k + 2) = B[2]; /* *(drawCoord + 3*k) = inter[p][0]; *(drawCoord + 3*k + 1) = inter[p][1]; *(drawCoord + 3*k + 2) = inter[p][2];*/ DBG_fprintf(stderr, "Point added to drawCoord %f %f %f for a plane\n", *(drawCoord + 3*k), *(drawCoord + 3*k + 1), *(drawCoord + 3*k + 2)); *(atomInd + k) = 0; k++; if (change[index[p] * 3 + 0] < 0.) tBC[0] = tBC[0] + 1.; else if (change[index[p] * 3 + 0] > 0.) tBC[0] = tBC[0] - 1.; if (change[index[p] * 3 + 1] < 0.) tBC[1] = tBC[1] + 1.; else if (change[index[p] * 3 + 1] > 0.) tBC[1] = tBC[1] - 1.; if (change[index[p] * 3 + 2] < 0.) tBC[2] = tBC[2] + 1.; else if (change[index[p] * 3 + 2] > 0.) tBC[2] = tBC[2] - 1.; DBG_fprintf(stderr, "Change of box needed for the next point : %f %f %f\n", tBC[0],tBC[1],tBC[2]); A[0] = inter[p * 3 + 0]; A[1] = inter[p * 3 + 1]; A[2] = inter[p * 3 + 2]; changeCoordfromBoxChange(dataObj, A, tBC, B); *(drawCoord + 3*k) = B[0]; *(drawCoord + 3*k + 1) = B[1]; *(drawCoord + 3*k + 2) = B[2]; DBG_fprintf(stderr, "Point added to drawCoord %f %f %f for a plane\n", *(drawCoord + 3*k), *(drawCoord + 3*k + 1), *(drawCoord + 3*k + 2)); *(atomInd + k) = 0; k++; } *(drawCoord + 3*k) = *(xyz); *(drawCoord + 3*k + 1) = *(xyz + 1); *(drawCoord + 3*k + 2) = *(xyz + 2); DBG_fprintf(stderr, "Point added to drawCoord %f %f %f after planes\n", *(drawCoord + 3*k), *(drawCoord + 3*k + 1), *(drawCoord + 3*k + 2)); *(atomInd + k) = 1; k++; } else { DBG_fprintf(stderr, "WARNING : visu_plane_class_getOrderedIntersections did not find any plane !!!\n"); } g_free(listOfVisuPlanes); g_free(inter); g_free(change); g_free(index); } } /** * extRingsDraw: * @dataObj: a #VisuData object. * * Draw the rings (if any). * * Since: 3.5 */ void extRingsDraw(VisuData *dataObj) { /* float boxring_1[NB_NODES8][3] = {0.,0.,0.,0.,0.,0.,1.,0.,0.,1.,0.,0.,1.,0.,0.,1.,0.,0.,1.,0.,0.,0.,0.,0.}; */ /* float boxring_2[NB_NODES8][3] = {0.,0.,0.}; */ /* float boxring_3[NB_NODES16][3] = {0.}; */ /* float boxring_4[NB_NODES16][3] = {0.,0.,0.}; */ /* float boxring[NB_NODES16][3] = {0.,0.,0.,0.,0.,0.,1.,0.,0.,1.,0.,0.,1.,0.,0.,1.,0.,0.,1.,0.,0.,1.,0.,0.,1.,0.,0.,1.,0.,0.,1.,0.,0.,1.,0.,0.,1.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.}; */ /* float boxring_6[NB_NODES10][3] = {0.,0.,0.,0.,0.,1.,0.,0.,1.,0.,0.,1.,0.,0.,1.,0.,0.,1.,1.,0.,1.,1.,0.,1.,1.,0.,0.,1.,0.,0.}; */ float boxring_7[NB_NODES5][3] = {{0.,0.,0.},{0.,0.,0.},{-1.,-1.,-1.},{-1.,-1.,-1.},{0.,0.,0.}}; /* int bleh; */ float rgba[4] = {1., 0., 0., 0.5}; int *my_test = testring; int i, j; VisuNode *vtmp; float sum[3] = {0.0,0.0,0.0}; float xyz[NB_NODES][3]; /* The initial coordinates */ /* float XYZ[NB_NODES][3]; */ /* The translated coordinates */ /* float nodeTrans[NB_NODES][3]; */ /* float bary[3]; */ int totalNumberOfPoints; float *drawCoord; int *atomIndices; float boxChange[NB_NODES][3]; /* float newBoxChange[NB_NODES][3]; */ float baryCoord[3]; float baryBox[3]; if (extRingsIsBuilt || !dataObj) return; DBG_fprintf(stderr, "Ext Rings: drawing the rings.\n"); extRingsIsBuilt = TRUE; glNewList(visu_gl_ext_getGlList(extRings), GL_COMPILE); /* for (i = 0; i < 6; i++) */ /* box[i] = visu_data_getBoxGeometry(dataObj, i); */ /* Put the drawing primitives here. */ DBG_fprintf(stderr, "Coordinates in initial box :\n"); for (i = 0; i < NB_NODES; i++) /* Get the coordinates of the nodes */ { vtmp = visu_node_array_getFromId(VISU_NODE_ARRAY(dataObj), my_test[i]); xyz[i][0] = vtmp->xyz[0]; xyz[i][1] = vtmp->xyz[1]; xyz[i][2] = vtmp->xyz[2]; for (j = 0; j < 3; j++) { DBG_fprintf(stderr, " %f",xyz[i][j]); sum[j] = sum[j] + xyz[i][j]; } DBG_fprintf(stderr, "\n"); } /* bary[0] = sum[0]/NB_NODES; /\* Get the barycentre *\/ */ /* bary[1] = sum[1]/NB_NODES; */ /* bary[2] = sum[2]/NB_NODES; */ /* INITIALIZING THE BOXRINGS AND COORDINATES */ initTranslationForBoxAndCoord(dataObj, NB_NODES, (float*)xyz, (float*)boxring_7); for (i = 0; i < NB_NODES; i++) /* Get the coordinates of the nodes */ { vtmp = visu_node_array_getFromId(VISU_NODE_ARRAY(dataObj), my_test[i]); visu_data_getNodePosition(dataObj, vtmp, xyz[i]); } /* INITIALIZING THE RINGS*/ initRing(dataObj, NB_NODES, (float*)xyz, (float*)boxring_7, (float*)boxChange, &totalNumberOfPoints); /*COMPUTE BARYCENTER OF THE RING*/ computeBaryCenter(dataObj, NB_NODES, (float*)xyz, (float*)boxring_7, (float*)baryCoord, (float*)baryBox); /*INITIALIZING THE DRAW COORDINATES*/ atomIndices = g_malloc(sizeof(int) * totalNumberOfPoints); drawCoord = g_malloc(sizeof(float) * 3 * totalNumberOfPoints); initDrawCoord(dataObj, NB_NODES, (int*)atomIndices, (float*)xyz, (float*)boxChange, (float*)drawCoord, totalNumberOfPoints); glDisable(GL_LIGHTING); glDisable(GL_CULL_FACE); glColor4fv(rgba); /* float radius = 0.5; */ rgba[0] = 0.; rgba[1] = 1.; rgba[2] = 0.; rgba[3] = 0.5; glColor4fv(rgba); /* bleh = totalNumberOfPoints/2; */ drawRingPlanar(NB_NODES,(float*)xyz, (float*)boxring_7, baryCoord, baryBox); rgba[0] = 0.; rgba[1] = 1.; rgba[2] = 0.; rgba[3] = 1.; glColor4fv(rgba); /* drawRingCylinder(bleh,(float*)drawCoord);*/ rgba[0] = 0.; rgba[1] = 0.; rgba[2] = 1.; rgba[3] = 1.; /* glColor4fv(rgba); drawSphere(baryCoord[0], baryCoord[1], baryCoord[2], 0.5, 10, 10);*/ rgba[0] = 1.; rgba[1] = 0.; rgba[2] = 0.; rgba[3] = 1.; glColor4fv(rgba); /* drawRingSpheres(bleh, (float*)drawCoord, (int*)atomIndices);*/ /* drawRingLine(bleh,(float*)drawCoord);*/ g_free(atomIndices); g_free(drawCoord); glEnable(GL_CULL_FACE); glEnable(GL_LIGHTING); glEndList(); } v_sim-3.7.0/src/extensions/marks.c0000644000353400050620000021067312215546077014052 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include #include #include "marks.h" #include #include #include #include #include #include #include #include #include #include #include /** * SECTION:marks * @short_description: Draw features on nodes, like measurement marks * or highlights. * * #VisuGlExtMarks is used to store a set of mark on a list of * nodes. A mark can be a distance measurement, an angle measurement * or an highlight. The measurement marks are automatically updated by * listening to the #VisuInteractive::node-selection signal. On the * contrary, highlights are set, unset or toggled using * visu_gl_ext_marks_setHighlightedList(). * In addition, #VisuGlExtMarks can be export to or loaded from an * XML file thanks to visu_gl_ext_marks_exportXMLFile() and visu_gl_ext_marks_parseXMLFile(). * * Since: 3.6 */ typedef enum { MARK_BIG_SQUARE, MARK_SMALL_SQUARE, MARK_HIGHLIGHT, MARK_DISTANCE, MARK_ANGLE, MARK_LINE } VisuMarkType; struct MarkInfo_struct { /* Mark type. */ VisuMarkType type; /* Id used to address the VisuNode when the pointer node1 has changed, for example when a new VisuData is loaded with the same geometry and we want to apply this mark. */ guint idNode1; /* Idem for a second node. */ guint idNode2; /* Idem for a third node. */ guint idNode3; /* List of nodes */ GList *nodes; guint size; GLfloat *coord; guint *nIds; }; struct _VisuGlExtMarks { VisuGlExt parent; gboolean dispose_has_run; VisuGlExt *extNode; /* A reference on the #VisuData and #VisuGlView it refers to. */ VisuData *data; VisuGlView *view; gulong cameraAngles, cameraPosition, cameraZoom, cameraPersp; gulong nodePosition, nodeRender, nodeMaterial, nodePopulation; /* Interactive object to get measurement signals. */ VisuInteractive *inter; gulong nodeSelection; /* Some global hooks. */ gulong elementSize; /* A list of MarkInfo_struct elements. */ GList *storedMarks; guint hasCameraMarks; gboolean drawValues; /* Miscellaneous. */ float infoRange; }; /** * VisuGlExtMarksClass: * * An opaque structure defining the class of a #VisuGlExtMarks objects. * * Since: 3.6 */ struct _VisuGlExtMarksClass { VisuGlExtClass parent_class; }; enum { HIGHLIGHT_CHANGE_SIGNAL, MEASUREMENT_CHANGE_SIGNAL, NB_SIGNAL }; static guint signals[NB_SIGNAL]; /* Local variables. */ #define MARK_BIG_SQUARE_SIZE 8 #define MARK_SMALL_SQUARE_SIZE 4 static guchar markBigSquare[MARK_BIG_SQUARE_SIZE * MARK_BIG_SQUARE_SIZE * 4]; static guchar markSmallSquare[MARK_SMALL_SQUARE_SIZE * MARK_SMALL_SQUARE_SIZE * 4]; static float highlightFactor = 1.25f; /* Local methods. */ static struct MarkInfo_struct* markNew(VisuMarkType type); static void markFree(struct MarkInfo_struct *mark); static void markRemove(VisuGlExtMarks *marks, GList *rmList); static void marksDraw(VisuGlExtMarks *marks, int listType); static void removeDot(VisuGlExtMarks *marks, guint nodeId, VisuMarkType type); static void addDot(VisuGlExtMarks *marks, guint nodeId, VisuMarkType type); static gboolean toggleDistance(VisuGlExtMarks *marks, guint nodeRefId, guint nodeId, gboolean set); static gboolean toggleAngle(VisuGlExtMarks *marks, guint nodeRefId, guint nodeRef2Id, guint nodeId, gboolean set); static gboolean toggleHighlight(VisuGlExtMarks *marks, guint nodeId, VisuGlExtMarksStatus status, gboolean *finalStatus); static gboolean setInformation(VisuGlExtMarks *marks, guint node); static void putMark(VisuData *data, VisuGlView *view, guint nodeRefId, guint nodeId, VisuMarkType type); static void drawMarkDot(VisuData *data, VisuGlView *view, guint nodeId, VisuMarkType type); static void drawMarkDistance(VisuData *data, guint nodeRefId, guint nodeId, VisuMarkType type); static void drawMarkAngle(VisuData *data, guint nodeRefId, guint nodeRef2Id, guint nodeId, guint id); static void drawMarkLine(VisuData *data _U_, GLfloat *coord, guint size); static void visu_gl_ext_marks_dispose(GObject *obj); static void visu_gl_ext_marks_finalize(GObject *obj); static void visu_gl_ext_marks_rebuild(VisuGlExt *ext); /* Local callbacks. */ static void updateListOnPopulationChange(VisuData *dataObj, int *nodes, gpointer data); static void updateListOnNodeChange(VisuData *dataObj, gpointer data); static void onPositionChanged(VisuData *dataObj, VisuElement *ele, gpointer data); static void updateListOnCameraChange(VisuGlView *view, gpointer data); static gboolean onNodeSelection(VisuInteractive *inter, VisuInteractivePick kind, VisuNode *node1, VisuNode *node2, VisuNode *node3, gpointer data); static gboolean onNodeSizeHook(GSignalInvocationHint *ihint, guint nvalues, const GValue *param_values, gpointer data); /* V_Sim resources and paramaters. */ #define FLAG_RESOURCE_FACTOR "highlight_radiusFactor" #define DESC_RESOURCE_FACTOR "Give the factor for the highlight radius ; one float (> 1.)" static void exportResources(GString *data, VisuData *dataObj, VisuGlView *view); G_DEFINE_TYPE (VisuGlExtMarks, visu_gl_ext_marks, VISU_TYPE_GL_EXT) static void visu_gl_ext_marks_class_init(VisuGlExtMarksClass *class) { int i; float rg[2] = {1.01f, G_MAXFLOAT}; VisuConfigFileEntry *conf; G_OBJECT_CLASS(class)->dispose = visu_gl_ext_marks_dispose; G_OBJECT_CLASS(class)->finalize = visu_gl_ext_marks_finalize; VISU_GL_EXT_CLASS(class)->rebuild = visu_gl_ext_marks_rebuild; DBG_fprintf(stderr, "Visu Marks: installing signals.\n"); /** * VisuGlExtMarks::highlightChanged: * @marks: the object emitting the signal. * @lst: a list of node ids (starting from 0). * * The list of highlighted nodes has been modified. * * Since: 3.6 */ signals[HIGHLIGHT_CHANGE_SIGNAL] = g_signal_new("highlightChanged", G_TYPE_FROM_CLASS(class), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); /** * VisuGlExtMarks::measurementChanged: * @marks: the object emitting the signal. * * The list of measurements has been changed. * * Since: 3.6 */ signals[MEASUREMENT_CHANGE_SIGNAL] = g_signal_new("measurementChanged", G_TYPE_FROM_CLASS(class), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /* Create the marks. */ for (i = 0; i < MARK_BIG_SQUARE_SIZE * MARK_BIG_SQUARE_SIZE * 4 ; i++) markBigSquare[i] = 0xff; for (i = 0; i < MARK_SMALL_SQUARE_SIZE * MARK_SMALL_SQUARE_SIZE * 4; i++) markSmallSquare[i] = 0xff; conf = visu_config_file_addFloatArrayEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_FACTOR, DESC_RESOURCE_FACTOR, 1, &highlightFactor, rg); visu_config_file_entry_setVersion(conf, 3.6f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_RESOURCE, exportResources); } static void visu_gl_ext_marks_init(VisuGlExtMarks *marks) { DBG_fprintf(stderr, "Visu Marks: create a new object, %p.\n", (gpointer)marks); marks->dispose_has_run = FALSE; marks->data = (VisuData*)0; marks->view = (VisuGlView*)0; marks->storedMarks = (GList*)0; marks->hasCameraMarks = 0; marks->drawValues = TRUE; marks->infoRange = 1.44f; marks->extNode = (VisuGlExt*)0; marks->inter = (VisuInteractive*)0; marks->nodeSelection = 0; marks->elementSize = g_signal_add_emission_hook(g_signal_lookup("elementSizeChanged", VISU_TYPE_RENDERING), 0, onNodeSizeHook, (gpointer)marks, (GDestroyNotify)0); } static void visu_gl_ext_marks_dispose(GObject *obj) { VisuGlExtMarks *marks; DBG_fprintf(stderr, "Visu Marks: dispose object %p.\n", (gpointer)obj); marks = VISU_GL_EXT_MARKS(obj); if (marks->dispose_has_run) return; marks->dispose_has_run = TRUE; DBG_fprintf(stderr, " | release VisuData.\n"); visu_gl_ext_marks_setData(marks, (VisuData*)0); DBG_fprintf(stderr, " | release VisuGlView.\n"); visu_gl_ext_marks_setGlView(marks, (VisuGlView*)0); DBG_fprintf(stderr, " | free internal VisuGlExt.\n"); g_object_unref(G_OBJECT(marks->extNode)); DBG_fprintf(stderr, " | unconnect signals.\n"); visu_gl_ext_marks_setInteractive(marks, (VisuInteractive*)0); g_signal_remove_emission_hook(g_signal_lookup("elementSizeChanged", VISU_TYPE_RENDERING), marks->elementSize); /* Chain up to the parent class */ DBG_fprintf(stderr, " | chain up.\n"); G_OBJECT_CLASS(visu_gl_ext_marks_parent_class)->dispose(obj); DBG_fprintf(stderr, " | OK.\n"); } static void visu_gl_ext_marks_finalize(GObject *obj) { g_return_if_fail(obj); DBG_fprintf(stderr, "Visu Marks: finalize object %p.\n", (gpointer)obj); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_gl_ext_marks_parent_class)->finalize(obj); DBG_fprintf(stderr, " | freeing ... OK.\n"); } /** * visu_gl_ext_marks_new: * @name: (allow-none): a possible name for the #VisuGlExt. * * Create a new #VisuGlExtMarks object. Make it listen to * #VisuInteractive::node-selection signal to update itself * automatically. * * Returns: the newly created object. */ VisuGlExtMarks* visu_gl_ext_marks_new(const gchar *name) { char *name_ = "MarksInv"; char *description = _("Draw some marks on element in video inverse."); VisuGlExtMarks *marks; marks = VISU_GL_EXT_MARKS(g_object_new(VISU_TYPE_GL_EXT_MARKS, "name", (name)?name:name_, "label", _(name), "description", description, "nGlObj", 1, "priority", VISU_GL_EXT_PRIORITY_LAST - 1, "saveState", TRUE, NULL)); marks->extNode = VISU_GL_EXT(g_object_new(VISU_TYPE_GL_EXT, "name", "Marks", "label", _("Marks - classical"), "description", _("Draw some marks on element."), "nGlObj", 1, "priority", VISU_GL_EXT_PRIORITY_LOW, NULL)); return marks; } /** * visu_gl_ext_marks_getInternalList: * @marks: a #VisuGlExtMarks object. * * Return an additional list used internaly. * * Since: 3.7 * * Returns: (transfer none): a #VisuGlExt object. **/ VisuGlExt* visu_gl_ext_marks_getInternalList(VisuGlExtMarks *marks) { g_return_val_if_fail(VISU_IS_GL_EXT_MARKS(marks), (VisuGlExt*)0); return marks->extNode; } static struct MarkInfo_struct* markNew(VisuMarkType type) { struct MarkInfo_struct *mark; mark = g_malloc(sizeof(struct MarkInfo_struct)); mark->type = type; mark->idNode1 = -1; mark->idNode2 = -1; mark->idNode3 = -1; mark->nodes = (GList*)0; mark->size = 0; mark->coord = (GLfloat*)0; mark->nIds = (guint*)0; return (struct MarkInfo_struct*)mark; } static void markFree(struct MarkInfo_struct *mark) { if (mark->nodes) g_list_free(mark->nodes); if (mark->coord) g_free(mark->coord); if (mark->nIds) g_free(mark->nIds); g_free(mark); } static void markRemove(VisuGlExtMarks *marks, GList *rmList) { struct MarkInfo_struct *mark; gboolean hasCameraMarks; mark = (struct MarkInfo_struct*)rmList->data; DBG_fprintf(stderr, "Visu Marks: remove mark (%d %d %d).\n", mark->idNode1, mark->idNode2, mark->idNode3); hasCameraMarks = (marks->hasCameraMarks > 0); if (mark->type == MARK_LINE) marks->hasCameraMarks -= 1; markFree(mark); marks->storedMarks = g_list_delete_link(marks->storedMarks, rmList); if (hasCameraMarks && marks->hasCameraMarks == 0) { g_signal_handler_disconnect(G_OBJECT(marks->data), marks->cameraAngles); g_signal_handler_disconnect(G_OBJECT(marks->data), marks->cameraPosition); g_signal_handler_disconnect(G_OBJECT(marks->data), marks->cameraZoom); g_signal_handler_disconnect(G_OBJECT(marks->data), marks->cameraPersp); } } /** * visu_gl_ext_marks_setInteractive: * @marks: a #VisuGlExtMarks object. * @inter: (transfer full) (allow-none): a #VisuInteractive object. * * Listen to #VisuInteractive::node-selection signal to update @marks. * * Since: 3.7 **/ void visu_gl_ext_marks_setInteractive(VisuGlExtMarks *marks, VisuInteractive *inter) { g_return_if_fail(VISU_IS_GL_EXT_MARKS(marks)); if (marks->inter) { g_signal_handler_disconnect(G_OBJECT(marks->inter), marks->nodeSelection); g_object_unref(marks->inter); } if (inter) { g_object_ref(inter); marks->nodeSelection = g_signal_connect(G_OBJECT(inter), "node-selection", G_CALLBACK(onNodeSelection), (gpointer)marks); } else marks->nodeSelection = 0; marks->inter = inter; } /** * visu_gl_ext_marks_setGlView: * @marks: a #VisuGlExtMarks object. * @view: a #VisuGlView object. * * Use the given @view to render @marks. * * Since: 3.7 **/ void visu_gl_ext_marks_setGlView(VisuGlExtMarks *marks, VisuGlView *view) { GObject *obj; g_return_if_fail(VISU_IS_GL_EXT_MARKS(marks)); /* We attach a new VisuGlView object. */ if (marks->view != view) { /* We unref the previous VisuView and disconnect signals. */ if (marks->view) { obj = G_OBJECT(marks->view); if (marks->hasCameraMarks > 0) { g_signal_handler_disconnect(obj, marks->cameraAngles); g_signal_handler_disconnect(obj, marks->cameraPosition); g_signal_handler_disconnect(obj, marks->cameraZoom); g_signal_handler_disconnect(obj, marks->cameraPersp); } g_object_unref(obj); } marks->view = view; if (marks->view) { obj = G_OBJECT(marks->view); if (marks->hasCameraMarks > 0) { marks->cameraAngles = g_signal_connect(obj, "ThetaPhiOmegaChanged", G_CALLBACK(updateListOnCameraChange), (gpointer)marks); marks->cameraPosition = g_signal_connect(obj, "XsYsChanged", G_CALLBACK(updateListOnCameraChange), (gpointer)marks); marks->cameraZoom = g_signal_connect(obj, "GrossChanged", G_CALLBACK(updateListOnCameraChange), (gpointer)marks); marks->cameraPersp = g_signal_connect(obj, "PerspChanged", G_CALLBACK(updateListOnCameraChange), (gpointer)marks); } /* We ref the new given view. */ g_object_ref(obj); } } } /** * visu_gl_ext_marks_setData: * @marks: a #VisuGlExtMarks object. * @data: a #VisuData object. * * Attach the given @marks to @data. @marks will be updated if @data * is changed and internal list of marks is updated with the new nodes * of @data. */ void visu_gl_ext_marks_setData(VisuGlExtMarks *marks, VisuData *data) { GList *list, *rmList; GObject *obj; struct MarkInfo_struct*mark; gboolean remove; DBG_fprintf(stderr, "Visu Marks: set new VisuData %p (%p).\n", (gpointer)data, (gpointer)marks->data); /* We update the list of nodes with marks. */ if (data) { /* Try to match previous marks on new VisuData. */ list = marks->storedMarks; while(list) { mark = (struct MarkInfo_struct*)list->data; DBG_fprintf(stderr, " | old mark %p of type %d.\n", (gpointer)mark, mark->type); remove = FALSE; rmList = list; /* We remove mark if one of the node can't be matched. */ switch (mark->type) { case MARK_BIG_SQUARE: case MARK_SMALL_SQUARE: case MARK_HIGHLIGHT: remove = remove || !visu_node_array_getFromId(VISU_NODE_ARRAY(data), mark->idNode1); break; case MARK_DISTANCE: remove = remove || !visu_node_array_getFromId(VISU_NODE_ARRAY(data), mark->idNode1) || !visu_node_array_getFromId(VISU_NODE_ARRAY(data), mark->idNode2); break; case MARK_ANGLE: remove = remove || !visu_node_array_getFromId(VISU_NODE_ARRAY(data), mark->idNode1) || !visu_node_array_getFromId(VISU_NODE_ARRAY(data), mark->idNode2) || !visu_node_array_getFromId(VISU_NODE_ARRAY(data), mark->idNode3); break; default: g_warning("TODO implementation required."); } list = g_list_next(list); if (remove) { DBG_fprintf(stderr, " | delete old mark %p of type %d.\n", (gpointer)mark, mark->type); markRemove(marks, rmList); } } } else { for (list = marks->storedMarks; list; list = g_list_next(list)) markFree((struct MarkInfo_struct*)list->data); g_list_free(marks->storedMarks); marks->storedMarks = (GList*)0; } DBG_fprintf(stderr, " | New mark list is pointing to %p.\n", (gpointer)marks->storedMarks); /* We attach a new VisuData object. */ if (marks->data != data) { /* We unref the previous VisuData and disconnect signals. */ if (marks->data) { obj = G_OBJECT(marks->data); g_signal_handler_disconnect(obj, marks->nodePosition); g_signal_handler_disconnect(obj, marks->nodeRender); g_signal_handler_disconnect(obj, marks->nodeMaterial); g_signal_handler_disconnect(obj, marks->nodePopulation); g_object_unref(obj); } marks->data = data; if (marks->data) { obj = G_OBJECT(marks->data); /* We ref the new given data. */ g_object_ref(obj); /* Connect a signal on file change to remove everything. */ marks->nodePopulation = g_signal_connect(obj, "PopulationDecrease", G_CALLBACK(updateListOnPopulationChange), (gpointer)marks); marks->nodePosition = g_signal_connect(obj, "PositionChanged", G_CALLBACK(onPositionChanged), (gpointer)marks); marks->nodeRender = g_signal_connect(obj, "VisibilityChanged", G_CALLBACK(updateListOnNodeChange), (gpointer)marks); marks->nodeMaterial = g_signal_connect(obj, "MaterialChanged", G_CALLBACK(updateListOnNodeChange), (gpointer)marks); } } g_signal_emit(G_OBJECT(marks), signals[MEASUREMENT_CHANGE_SIGNAL], 0, NULL); marksDraw(marks, -1); } static void updateListOnPopulationChange(VisuData *dataObj, int *nodes, gpointer data) { int i; GList *list, *rmList; struct MarkInfo_struct*mark; gboolean remove; VisuGlExtMarks *marks; marks = (VisuGlExtMarks*)data; g_return_if_fail(marks); if (dataObj != marks->data) return; DBG_fprintf(stderr, "Visu Marks: caught 'PopulationDecrease'" " signal (%p).\n", data); /* Run through the mark list to get all nodeId and look into nodes to find if mark must be removed or not. */ DBG_fprintf(stderr, " | list contains %d elements\n", g_list_length(marks->storedMarks)); list = marks->storedMarks; while(list) { mark = (struct MarkInfo_struct*)list->data; DBG_fprintf(stderr, " | mark %p of type %d.\n", (gpointer)mark, mark->type); /* We remove mark if one of the node is in the list. */ remove = FALSE; rmList = list; for (i = 0; !remove && nodes[i] >= 0; i++) remove = remove || ((guint)nodes[i] == mark->idNode1) || ((guint)nodes[i] == mark->idNode2) || ((guint)nodes[i] == mark->idNode3); list = g_list_next(list); if (remove) { DBG_fprintf(stderr, " | delete mark %p of type %d.\n", (gpointer)mark, mark->type); markRemove(marks, rmList); } } marksDraw(marks, -1); } static void updateListOnNodeChange(VisuData *dataObj, gpointer data) { VisuGlExtMarks *marks; DBG_fprintf(stderr, "Visu Marks: caught a node rendering" " changing signal (%p).\n", data); marks = (VisuGlExtMarks*)data; g_return_if_fail(data); if (dataObj != marks->data) return; marksDraw(marks, -1); } static void onPositionChanged(VisuData *dataObj, VisuElement *ele _U_, gpointer data) { VisuGlExtMarks *marks; DBG_fprintf(stderr, "Visu Marks: caught a node position" " changing signal (%p).\n", data); marks = (VisuGlExtMarks*)data; g_return_if_fail(data); if (dataObj != marks->data) return; marksDraw(marks, -1); } static void updateListOnCameraChange(VisuGlView *view _U_, gpointer data _U_) { /* GList *tmpLst; */ /* struct MarkInfo_struct* mark; */ /* VisuGlExtMarks *marks; */ /* marks = (VisuGlExtMarks*)data; */ /* g_return_if_fail(data); */ /* for (tmpLst = mesureData->storedMarks; tmpLst; tmpLst = g_list_next(tmpLst)) */ /* { */ /* mark = (struct MarkInfo_struct*)(tmpLst->data); */ /* if (mark->type == PICK_MESURE_MARK_LINE) */ /* visu_interactive_class_getNodes2DCoordinates(mesureData->data, mark->nIds, g_list_length(mark->nodes), mark->coord, &mark->size); */ /* } */ /* marksDraw(marks, 0); */ } static gboolean onNodeSizeHook(GSignalInvocationHint *ihint _U_, guint nvalues _U_, const GValue *param_values, gpointer data) { VisuRendering *render; VisuGlExtMarks *marks; DBG_fprintf(stderr, "Visu Marks: get a 'elementSizeChanged' signals at %f.\n", g_value_get_float(param_values + 1)); render = VISU_RENDERING(g_value_get_object(param_values)); if (render != visu_object_getRendering(VISU_OBJECT_INSTANCE)) return TRUE; marks = (VisuGlExtMarks*)data; marksDraw(marks, 1); return TRUE; } static gboolean onNodeSelection(VisuInteractive *inter _U_, VisuInteractivePick pick, VisuNode *node0, VisuNode *node1, VisuNode *node2, gpointer data) { gint nodeId; VisuMarkType type; gboolean set, status; GList *list; VisuGlExtMarks *marks = VISU_GL_EXT_MARKS(data); DBG_fprintf(stderr, "Visu Marks: get a 'node-selection' signals -> %d.\n", pick); switch (pick) { case PICK_DISTANCE: if (marks->drawValues) { toggleDistance(marks, node1->number, node0->number, FALSE); putMark(marks->data, marks->view, node1->number, node0->number, MARK_DISTANCE); g_signal_emit(G_OBJECT(marks), signals[MEASUREMENT_CHANGE_SIGNAL], 0, NULL); marksDraw(marks, 0); } return TRUE; case PICK_ANGLE: if (marks->drawValues) { toggleAngle(marks, node1->number, node2->number, node0->number, FALSE); g_signal_emit(G_OBJECT(marks), signals[MEASUREMENT_CHANGE_SIGNAL], 0, NULL); marksDraw(marks, 0); VISU_REDRAW_FORCE; } return TRUE; case PICK_UNREFERENCE_1: case PICK_UNREFERENCE_2: case PICK_REFERENCE_1: case PICK_REFERENCE_2: type = (pick == PICK_REFERENCE_1 || pick == PICK_UNREFERENCE_1)? MARK_BIG_SQUARE:MARK_SMALL_SQUARE; nodeId = -1; for (list = marks->storedMarks; list; list = g_list_next(list)) if (((struct MarkInfo_struct*)list->data)->type == type) nodeId = ((struct MarkInfo_struct*)list->data)->idNode1; /* Erase previous one. */ if (nodeId >= 0) { removeDot(marks, nodeId, type); putMark(marks->data, marks->view, -1, nodeId, type); } /* Add new one. */ if (pick == PICK_REFERENCE_1 || pick == PICK_REFERENCE_2) { addDot(marks, node0->number, type); putMark(marks->data, marks->view, -1, node0->number, type); } marksDraw(marks, 0); return TRUE; case PICK_HIGHLIGHT: set = toggleHighlight(marks, node0->number, MARKS_STATUS_TOGGLE, &status); if (set) { list = visu_gl_ext_marks_getHighlightedList(marks); g_signal_emit(G_OBJECT(marks), signals[HIGHLIGHT_CHANGE_SIGNAL], 0, list, NULL); g_list_free(list); marksDraw(marks, 1); VISU_REDRAW_FORCE; } return TRUE; case PICK_INFORMATION: set = setInformation(marks, node0->number); if (set) { g_signal_emit(G_OBJECT(marks), signals[MEASUREMENT_CHANGE_SIGNAL], 0, NULL); marksDraw(marks, 0); VISU_REDRAW_FORCE; } return TRUE; case PICK_SELECTED: default: return TRUE; } } /* Method that add/remove mark to the list of drawn marks. */ static void removeDot(VisuGlExtMarks *marks, guint nodeId, VisuMarkType type) { struct MarkInfo_struct *mark; GList *tmpLst; g_return_if_fail(marks); /* Look for the mark. */ for (tmpLst = marks->storedMarks; tmpLst; tmpLst = g_list_next(tmpLst)) { mark = (struct MarkInfo_struct*)tmpLst->data; if (mark->type == type && mark->idNode1 == nodeId) { DBG_fprintf(stderr, "Visu Marks: found a dot mark.\n"); markRemove(marks, tmpLst); return; } } } static void addDot(VisuGlExtMarks *marks, guint nodeId, VisuMarkType type) { struct MarkInfo_struct *mark; g_return_if_fail((type == MARK_BIG_SQUARE || type == MARK_SMALL_SQUARE || type == MARK_HIGHLIGHT)); DBG_fprintf(stderr, "Visu Marks: add a new mark of type %d.\n", type); mark = markNew(type); mark->idNode1 = nodeId; marks->storedMarks = g_list_prepend(marks->storedMarks, (gpointer)mark); return; } static gboolean toggleDistance(VisuGlExtMarks *marks, guint nodeRefId, guint nodeId, gboolean set) { struct MarkInfo_struct *mark; GList *tmpLst; g_return_val_if_fail(marks, FALSE); /* Look for the mark. */ for (tmpLst = marks->storedMarks; tmpLst; tmpLst = g_list_next(tmpLst)) { mark = (struct MarkInfo_struct*)tmpLst->data; if (mark->type == MARK_DISTANCE && ((mark->idNode1 == nodeRefId && mark->idNode2 == nodeId) || (mark->idNode2 == nodeRefId && mark->idNode1 == nodeId))) { DBG_fprintf(stderr, "Visu Marks: found a distance mark.\n"); if (!set) markRemove(marks, tmpLst); return set; } } /* Found none, create a new one. */ mark = markNew(MARK_DISTANCE); mark->idNode1 = nodeRefId; mark->idNode2 = nodeId; DBG_fprintf(stderr, "Visu Marks: add a distance mark.\n"); marks->storedMarks = g_list_prepend(marks->storedMarks, (gpointer)mark); return TRUE; } static gboolean toggleAngle(VisuGlExtMarks *marks, guint nodeRefId, guint nodeRef2Id, guint nodeId, gboolean set) { struct MarkInfo_struct *mark; GList *tmpLst; g_return_val_if_fail(marks, FALSE); /* Look for the mark. */ for (tmpLst = marks->storedMarks; tmpLst; tmpLst = g_list_next(tmpLst)) { mark = (struct MarkInfo_struct*)tmpLst->data; if (mark->type == MARK_ANGLE && mark->idNode1 == nodeRefId && ((mark->idNode2 == nodeRef2Id && mark->idNode3 == nodeId) || (mark->idNode3 == nodeRef2Id && mark->idNode2 == nodeId))) { DBG_fprintf(stderr, "Visu Marks: found an angle mark.\n"); if (!set) markRemove(marks, tmpLst); return set; } } /* Found none, create a new one. */ mark = markNew(MARK_ANGLE); mark->idNode1 = nodeRefId; mark->idNode2 = nodeRef2Id; mark->idNode3 = nodeId; DBG_fprintf(stderr, "Visu Marks: add an angle mark.\n"); marks->storedMarks = g_list_prepend(marks->storedMarks, (gpointer)mark); return TRUE; } static gboolean toggleHighlight(VisuGlExtMarks *marks, guint nodeId, VisuGlExtMarksStatus status, gboolean *finalStatus) { struct MarkInfo_struct *mark; GList *tmpLst; g_return_val_if_fail(marks, FALSE); /* Look for the mark. */ for (tmpLst = marks->storedMarks; tmpLst; tmpLst = g_list_next(tmpLst)) { mark = (struct MarkInfo_struct*)tmpLst->data; if (mark->type == MARK_HIGHLIGHT && mark->idNode1 == nodeId) { DBG_fprintf(stderr, "Visu Marks: found a highlight mark (%d).\n", nodeId); if (status == MARKS_STATUS_TOGGLE || status == MARKS_STATUS_UNSET) markRemove(marks, tmpLst); if (finalStatus) *finalStatus = (status != MARKS_STATUS_TOGGLE && status != MARKS_STATUS_UNSET); /* Return if it has been changed. */ return (status == MARKS_STATUS_TOGGLE || status == MARKS_STATUS_UNSET); } } if (status == MARKS_STATUS_TOGGLE || status == MARKS_STATUS_SET) /* Found none, create a new one. */ addDot(marks, nodeId, MARK_HIGHLIGHT); if (finalStatus) *finalStatus = (status == MARKS_STATUS_TOGGLE || status == MARKS_STATUS_SET); /* Return if it has been changed. */ return (status == MARKS_STATUS_TOGGLE || status == MARKS_STATUS_SET); } static gboolean setInformation(VisuGlExtMarks *marks, guint node) { VisuNodeInfo *infos; float min; GList *lst, *tmpLst, *tmpLst2; int i, n; gboolean redraw; float *dists; guint *ids; float xyz1[3], xyz2[3]; g_return_val_if_fail(marks, FALSE); DBG_fprintf(stderr, "Visu Marks: compute and print distances" " and angles for %d.\n", node); infos = visu_data_getDistanceList(marks->data, node, &min); lst = (GList*)0; redraw = FALSE; for (i = 0; infos[i].id != node; i+= 1) if (infos[i].dist < marks->infoRange * min) { toggleDistance(marks, node, infos[i].id, TRUE); lst = g_list_prepend(lst, GINT_TO_POINTER(infos[i].id)); redraw = TRUE; } g_free(infos); n = g_list_length(lst); if (n > 1) { n = n * (n - 1 ) / 2; DBG_fprintf(stderr, "Visu Marks: there are %d angles at max.\n", n); ids = g_malloc(sizeof(guint) * n * 2); dists = g_malloc(sizeof(float) * n); i = 0; min = G_MAXFLOAT; for (tmpLst = lst; tmpLst; tmpLst = g_list_next(tmpLst)) for (tmpLst2 = tmpLst->next; tmpLst2; tmpLst2 = g_list_next(tmpLst2)) { ids[i * 2 + 0] = (guint)GPOINTER_TO_INT(tmpLst->data); ids[i * 2 + 1] = (guint)GPOINTER_TO_INT(tmpLst2->data); visu_data_getNodePosition(marks->data, visu_node_array_getFromId(VISU_NODE_ARRAY(marks->data), ids[i * 2 + 0]), xyz1); visu_data_getNodePosition(marks->data, visu_node_array_getFromId(VISU_NODE_ARRAY(marks->data), ids[i * 2 + 1]), xyz2); dists[i] = (xyz1[0] - xyz2[0]) * (xyz1[0] - xyz2[0]) + (xyz1[1] - xyz2[1]) * (xyz1[1] - xyz2[1]) + (xyz1[2] - xyz2[2]) * (xyz1[2] - xyz2[2]); DBG_fprintf(stderr, " | %d (%d %d) -> %g\n", i, ids[i * 2 + 0], ids[i * 2 + 1], dists[i]); min = MIN(min, dists[i]); i += 1; } for (i = 0; i < n; i++) if (dists[i] < (2.75f * min)) { DBG_fprintf(stderr, " | %d (%d %d) -> %g OK\n", i, ids[i * 2 + 0], ids[i * 2 + 1], dists[i]); toggleAngle(marks, node, ids[i * 2 + 0], ids[i * 2 + 1], TRUE); } g_free(ids); g_free(dists); } g_list_free(lst); return redraw; } /** * visu_gl_ext_marks_getActive: * @marks: a #VisuGlExtMarks object. * @nodeId: a node id. * * Retrieve if @nodeId is implied any measurement marks stored in @mark. * * Returns: TRUE if @nodeId participate to any mark (distance, * angle...). */ gboolean visu_gl_ext_marks_getActive(VisuGlExtMarks *marks, guint nodeId) { GList *list; struct MarkInfo_struct *mark; g_return_val_if_fail(marks, FALSE); for (list = marks->storedMarks; list; list = g_list_next(list)) { mark = (struct MarkInfo_struct*)list->data; if ((mark->type == MARK_DISTANCE && mark->idNode1 == nodeId) || (mark->type == MARK_ANGLE && mark->idNode1 == nodeId)) return TRUE; } return FALSE; } /** * visu_gl_ext_marks_getHighlightedList: * @marks: a #VisuGlExtMarks object ; * * @marks has a list of mark for some nodes. These marks are only * highlight marks. * * Returns: (element-type guint32) (transfer container): list of * highlighted nodes (starting from 0), should freed with g_list_free(). * * Since: 3.6 */ GList* visu_gl_ext_marks_getHighlightedList(VisuGlExtMarks *marks) { GList *lst, *tmpLst; struct MarkInfo_struct* mark; g_return_val_if_fail(marks, (GList*)0); lst = (GList*)0; for (tmpLst = marks->storedMarks; tmpLst; tmpLst = g_list_next(tmpLst)) { mark = (struct MarkInfo_struct*)(tmpLst->data); if (mark->type == MARK_HIGHLIGHT) lst = g_list_prepend(lst, GINT_TO_POINTER(mark->idNode1)); } return lst; } /** * visu_gl_ext_marks_getHighlightStatus: * @marks: a #VisuGlExtMarks object. * @nodeId: a node id (ranging from 0). * * Nodes can be highlighted. * * Since: 3.7 * * Returns: TRUE if @nodeId has an highlight. **/ gboolean visu_gl_ext_marks_getHighlightStatus(VisuGlExtMarks *marks, guint nodeId) { GList *tmpLst; struct MarkInfo_struct* mark; g_return_val_if_fail(marks, FALSE); for (tmpLst = marks->storedMarks; tmpLst; tmpLst = g_list_next(tmpLst)) { mark = (struct MarkInfo_struct*)(tmpLst->data); if (mark->type == MARK_HIGHLIGHT && mark->idNode1 == nodeId) return TRUE; } return FALSE; } /** * visu_gl_ext_marks_setHighlightedList: * @marks: a #VisuGlExtMarks object ; * @lst: (element-type guint32): a set of node ids (0 started) ; * @status: changing command. * * @marks has a list of mark for some nodes. These marks can be * highlight (or distance, angles...). Depending on @status values, * the mark may be switch on or off. * * Returns: TRUE if redraw needed. * * Since: 3.6 */ gboolean visu_gl_ext_marks_setHighlightedList(VisuGlExtMarks *marks, GList *lst, VisuGlExtMarksStatus status) { gboolean redraw, res; GList *tmpLst; DBG_fprintf(stderr, "Visu Marks: set highlight status of list to %d.\n", status); redraw = FALSE; for (; lst; lst = g_list_next(lst)) { res = toggleHighlight(marks, (guint)GPOINTER_TO_INT(lst->data), status, (gboolean*)0); DBG_fprintf(stderr, " | %d -> %d\n", GPOINTER_TO_INT(lst->data), res); redraw = redraw || res; } DBG_fprintf(stderr, "Visu Marks: resulting redraw %d.\n", redraw); if (redraw) { marksDraw(marks, 1); tmpLst = visu_gl_ext_marks_getHighlightedList(marks); g_signal_emit(G_OBJECT(marks), signals[HIGHLIGHT_CHANGE_SIGNAL], 0, tmpLst, NULL); g_list_free(tmpLst); } return redraw; } /** * visu_gl_ext_marks_setDrawValues: * @marks: a #VisuGlExtMarks object. * @status: a boolean. * * Change if the measurements are printed or not (distance length, or * angles...). * * Returns: TRUE if @marks is modified. */ gboolean visu_gl_ext_marks_setDrawValues(VisuGlExtMarks *marks, gboolean status) { g_return_val_if_fail(marks, FALSE); if (marks->drawValues == status) return FALSE; marks->drawValues = status; return TRUE; } /** * visu_gl_ext_marks_removeMeasures: * @marks: a #VisuGlExtMarks object. * @nodeId: a node id. * * This routine scans the @mark to remove all marks of distance or * angle where @nodeId is implied in. * * Returns: TRUE is @mark is changed. */ gboolean visu_gl_ext_marks_removeMeasures(VisuGlExtMarks *marks, gint nodeId) { gboolean redraw; GList *list, *tmpLst; struct MarkInfo_struct *mark; g_return_val_if_fail(marks, FALSE); DBG_fprintf(stderr, "Visu Marks: remove measures (%d).\n", nodeId); redraw = FALSE; for (list = marks->storedMarks; list; list = tmpLst) { tmpLst = g_list_next(list); mark = (struct MarkInfo_struct*)list->data; if ((mark->type == MARK_DISTANCE || mark->type == MARK_ANGLE) && (nodeId < 0 || mark->idNode1 == (guint)nodeId)) { markRemove(marks, list); redraw = TRUE; } } if (!redraw) return FALSE; marksDraw(marks, 0); return TRUE; } /** * visu_gl_ext_marks_setInfos: * @marks: a #VisuGlExtMarks object. * @nodeId: a node id. * @status: a boolean. * * Depending on @status, it removes all measurements from @nodeId or * it calculate all first neighbour relations of @nodeId. * * Return: TRUE if @marks is changed. */ gboolean visu_gl_ext_marks_setInfos(VisuGlExtMarks *marks, guint nodeId, gboolean status) { DBG_fprintf(stderr, "Visu Marks: set info for node %d.\n", nodeId); if (status) { if (setInformation(marks, nodeId)) { marksDraw(marks, 0); return TRUE; } } else return visu_gl_ext_marks_removeMeasures(marks, nodeId); return FALSE; } /****************************/ /* OpenGL drawing routines. */ /****************************/ static void marksDraw(VisuGlExtMarks *marks, int listType) { struct MarkInfo_struct *mark; GList *tmpLst; guint id; g_return_if_fail(marks); DBG_fprintf(stderr, "Visu Marks: update the list %p" " of all marks.\n", (gpointer)marks->storedMarks); if (listType == 0 || listType < 0) glDeleteLists(visu_gl_ext_getGlList(VISU_GL_EXT(marks)), 1); if (listType == 1 || listType < 0) glDeleteLists(visu_gl_ext_getGlList(marks->extNode), 1); if (!marks->storedMarks) return; if (listType == 0 || listType < 0) { visu_gl_text_initFontList(); id = 0; /* Draw the colour inverse list. */ glNewList(visu_gl_ext_getGlList(VISU_GL_EXT(marks)), GL_COMPILE); glEnable(GL_DEPTH_TEST); glClear(GL_DEPTH_BUFFER_BIT); /* glDisable(GL_DEPTH_TEST); */ glDisable(GL_LIGHTING); glDisable(GL_FOG); glDisable(GL_CULL_FACE); /* glDisable(GL_DITHER); */ glEnable(GL_BLEND); glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_SRC_COLOR); for (tmpLst = marks->storedMarks; tmpLst; tmpLst = g_list_next(tmpLst)) { mark = (struct MarkInfo_struct*)tmpLst->data; DBG_fprintf(stderr, " | draw mark of type %d.\n", mark->type); switch (mark->type) { case MARK_BIG_SQUARE: case MARK_SMALL_SQUARE: drawMarkDot(marks->data, marks->view, mark->idNode1, mark->type); break; case MARK_DISTANCE: drawMarkDistance(marks->data, mark->idNode1, mark->idNode2, mark->type); break; case MARK_LINE: drawMarkLine(marks->data, mark->coord, mark->size); break; case MARK_ANGLE: drawMarkAngle(marks->data, mark->idNode1, mark->idNode2, mark->idNode3, id); id += 1; break; default: break; } } glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEndList(); } if (listType == 1 || listType < 0) { /* Draw the classical list. */ glNewList(visu_gl_ext_getGlList(marks->extNode), GL_COMPILE); glEnable(GL_LIGHTING); for (tmpLst = marks->storedMarks; tmpLst; tmpLst = g_list_next(tmpLst)) { mark = (struct MarkInfo_struct*)tmpLst->data; if (mark->type == MARK_HIGHLIGHT) { DBG_fprintf(stderr, " | draw mark of type %d.\n", mark->type); drawMarkDot(marks->data, marks->view, mark->idNode1, mark->type); } } glEndList(); } } static void drawMarkDot(VisuData *data, VisuGlView *view, guint nodeId, VisuMarkType type) { VisuNode *node; float xyz[3], material[5] = {1.f, 1.f, 1.f, 0.f, 0.f}; VisuElement *ele; int nlat; float eleSize; GLUquadricObj *obj; node = visu_node_array_getFromId(VISU_NODE_ARRAY(data), nodeId); g_return_if_fail(node); /* If the node is masked, then we don't draw the dot. */ if (!node->rendered) return; /* If the element is masked, then we don't draw the dot. */ ele = visu_node_array_getElement(VISU_NODE_ARRAY(data), node); if (!ele->rendered) return; DBG_fprintf(stderr, "Visu Mark: draw a mark (%d) on node %d.\n", (int)type, node->number); visu_data_getNodePosition(data, node, xyz); switch (type) { case MARK_BIG_SQUARE: glRasterPos3f(xyz[0], xyz[1], xyz[2]); glDrawPixels(MARK_BIG_SQUARE_SIZE, MARK_BIG_SQUARE_SIZE, GL_RGBA, GL_UNSIGNED_BYTE, markBigSquare); break; case MARK_SMALL_SQUARE: glRasterPos3f(xyz[0], xyz[1], xyz[2]); glDrawPixels(MARK_SMALL_SQUARE_SIZE, MARK_SMALL_SQUARE_SIZE, GL_RGBA, GL_UNSIGNED_BYTE, markSmallSquare); break; case MARK_HIGHLIGHT: g_return_if_fail(view); obj = gluNewQuadric(); eleSize = visu_rendering_getSizeOfElement(visu_object_getRendering(VISU_OBJECT_INSTANCE), ele); visu_gl_setHighlightColor(material, ele->rgb, 0.5f); nlat = visu_gl_view_getDetailLevel(view, eleSize * highlightFactor); glPushMatrix(); glTranslated(xyz[0], xyz[1], xyz[2]); gluSphere(obj, (double)eleSize * highlightFactor, 2 * nlat, 2 * nlat); glPopMatrix(); gluDeleteQuadric(obj); break; default: break; } } static void drawMarkDistance(VisuData *data, guint nodeRefId, guint nodeId, VisuMarkType type _U_) { VisuNode *nodeRef; VisuNode *node; float xyzRef[3], xyz[3]; VisuElement *ele; nodeRef = visu_node_array_getFromId(VISU_NODE_ARRAY(data), nodeRefId); node = visu_node_array_getFromId(VISU_NODE_ARRAY(data), nodeId); g_return_if_fail(node && nodeRef); /* If one of the node is masked, then we don't draw the distance. */ if (!nodeRef->rendered || !node->rendered) return; /* If one of the element is masked, then we don't draw the distance. */ ele = visu_node_array_getElement(VISU_NODE_ARRAY(data), nodeRef); if (!ele->rendered) return; ele = visu_node_array_getElement(VISU_NODE_ARRAY(data), node); if (!ele->rendered) return; visu_data_getNodePosition(data, nodeRef, xyzRef); visu_data_getNodePosition(data, node, xyz); visu_gl_drawDistance(xyzRef, xyz, TRUE); } static void drawMarkAngle(VisuData *data, guint nodeRefId, guint nodeRef2Id, guint nodeId, guint id) { VisuNode *nodeRef, *nodeRef2, *node; float xyzRef[3], xyzRef2[3], xyz[3]; VisuElement *ele; nodeRef = visu_node_array_getFromId(VISU_NODE_ARRAY(data), nodeRefId); nodeRef2 = visu_node_array_getFromId(VISU_NODE_ARRAY(data), nodeRef2Id); node = visu_node_array_getFromId(VISU_NODE_ARRAY(data), nodeId); g_return_if_fail(node && nodeRef && nodeRef2); /* If one of the node is masked, then we don't draw the angle. */ if (!nodeRef->rendered || !nodeRef2->rendered || !node->rendered) return; /* If one of the element is masked, then we don't draw the angle. */ ele = visu_node_array_getElement(VISU_NODE_ARRAY(data), nodeRef); if (!ele->rendered) return; ele = visu_node_array_getElement(VISU_NODE_ARRAY(data), nodeRef2); if (!ele->rendered) return; ele = visu_node_array_getElement(VISU_NODE_ARRAY(data), node); if (!ele->rendered) return; visu_data_getNodePosition(data, nodeRef, xyzRef); visu_data_getNodePosition(data, nodeRef2, xyzRef2); visu_data_getNodePosition(data, node, xyz); DBG_fprintf(stderr, "Visu PickMesure: draw an angle mark on nodes %d/%d/%d.\n", nodeRef->number, nodeRef2->number, node->number); visu_gl_drawAngle(xyzRef, xyzRef2, xyz, id, TRUE); } /* Calculate the node vertices coordinates (contained in the array nodevertices), from node coordinates (xn,yn) */ static void defineNodeVertices(int nVert, double radius, double xn, double yn, double *nodeVertices) { int i; for (i = 0; i < nVert; i++) { nodeVertices[2 * i] = (xn + radius * (cos (((2 * G_PI * i) / nVert)))); nodeVertices[2 * i + 1] = (yn + radius * (sin (((2 * G_PI * i) / nVert)))); } } /* Add node vertices to vertices array, from position i+1 */ static void addVerticesToGlobalArray(int nVert, double *nodeVertices, double *vertices, int i) { int j; int k = 0; for (j = (i * 2) * nVert; j < (i * 2) * nVert + (nVert * 2); j += 2) { vertices[j] = nodeVertices[k]; vertices[j + 1] = nodeVertices[k + 1]; k += 2; } } static void drawMarkLine(VisuData *data _U_, GLfloat *coord, guint size) { #define NEWLINE 1 #define NEWNODE 2 int i = 0, j; int elem = 0; int nNodes, nTotalVert; /***********************************/ /* values must be selected by user */ int nVert = 30; double radius = 30; /***********************************/ double *vertices, *nodeVertices, *verticesKept; double link[2] = {0}; double distance; gboolean visible = TRUE; gboolean li = FALSE; nNodes = size / 2; nTotalVert = nNodes * nVert; glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluOrtho2D(0.0, 600, 0., 600); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); vertices = g_malloc(sizeof(double) * (nTotalVert * 2)); nodeVertices = g_malloc(sizeof(double) * (nVert * 2)); verticesKept = g_malloc(sizeof(double) * (nTotalVert * 2) + sizeof(int) * nTotalVert * 2); /* For each node, compute and add its vertices coordinates (nodeVertices) to the vertices global array (vertices) */ for (i = 0; i < nNodes; i++){ defineNodeVertices(nVert, radius, coord[2 * i], coord[2 * i + 1], nodeVertices); addVerticesToGlobalArray(nVert, nodeVertices, vertices, i); } g_free(nodeVertices); verticesKept[elem] = NEWNODE; elem++; /* For each vertex */ for (i = 0; i < nTotalVert; i++){ /* We notify with a marker each new node */ if (i / nVert != (i - 1) / nVert){ verticesKept[elem] = NEWNODE; elem++; } /* For each node */ for (j = 0; j < nNodes; j++){ /* If vertex i doesn't belong to node j */ if (j != i / nVert){ /* Distance between vertex i and node j */ distance = sqrt( (pow ((coord[2 * j + 1] - vertices[2 * i + 1]), 2)) + (pow ((coord[2 * j] - vertices[2 * i]), 2)) ); if (distance < radius) visible = FALSE; } } if (visible){ verticesKept[elem] = vertices[2 * i]; verticesKept[elem + 1] = vertices[2 * i + 1]; elem += 2; } else { if (verticesKept[elem - 1] != NEWLINE){ verticesKept[elem] = NEWLINE; elem++; } visible = TRUE; } } glLineWidth(4.0); glColor3f(1.0, 1.0, 1.0); i = 0; while (i < elem){ if (verticesKept[i] == NEWLINE) i++; else if (verticesKept[i] == NEWNODE){ i++; if (verticesKept[i] != NEWNODE && verticesKept[i] != NEWLINE){ link[0] = verticesKept[i]; link[1] = verticesKept[i + 1]; li = TRUE; } else { li = FALSE; while (verticesKept[i] == NEWNODE || verticesKept[i] == NEWLINE) i++; } } else { glBegin(GL_LINES); while (verticesKept[i + 2] != NEWNODE && verticesKept[i + 2] != NEWLINE && i + 2 < elem){ glVertex2f(verticesKept[i], verticesKept[i + 1]); glVertex2f(verticesKept[i + 2], verticesKept[i + 3]); i += 2; } if (i + 2 >= elem){ if (li){ glVertex2f(verticesKept[i], verticesKept[i + 1]); glVertex2f(link[0], link[1]); } i = elem; } else if (verticesKept[i + 2] == NEWLINE) i += 3; else if (verticesKept[i + 2] == NEWNODE){ if (li){ glVertex2f(verticesKept[i], verticesKept[i + 1]); glVertex2f(link[0], link[1]); } i += 2; } glEnd(); } } g_free(verticesKept); g_free(vertices); glPopMatrix(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); } static void putMark(VisuData *data, VisuGlView *view, guint nodeRefId, guint nodeId, VisuMarkType type) { float centre[3]; visu_box_getCentre(visu_boxed_getBox(VISU_BOXED(data)), centre); DBG_fprintf(stderr, "Visu Marks: draw directly a distance on front buffer.\n"); glDrawBuffer(GL_FRONT); glPushAttrib(GL_ENABLE_BIT); glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); glDisable(GL_FOG); glEnable(GL_BLEND); glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_SRC_COLOR); glPushMatrix(); glTranslated(-centre[0], -centre[1], -centre[2]); switch (type) { case MARK_BIG_SQUARE: case MARK_SMALL_SQUARE: drawMarkDot(data, view, nodeId, type); break; case MARK_DISTANCE: drawMarkDistance(data, nodeRefId, nodeId, type); break; default: g_warning("No direct drawing available for this type."); } glPopMatrix(); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glPopAttrib(); glDrawBuffer(GL_BACK); glFlush(); } /*************************/ /* Resources management. */ /*************************/ static void exportResources(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { visu_config_file_exportComment(data, DESC_RESOURCE_FACTOR); visu_config_file_exportEntry(data, FLAG_RESOURCE_FACTOR, NULL, "%f", highlightFactor); visu_config_file_exportComment(data, ""); } /****************************/ /* List drawing management. */ /****************************/ static void visu_gl_ext_marks_rebuild(VisuGlExt *ext) { visu_gl_text_rebuildFontList(); marksDraw(VISU_GL_EXT_MARKS(ext), -1); } /******************************************/ /* XML files for marks and other exports. */ /******************************************/ /** * visu_gl_ext_marks_getMeasurementLabels: * @marks: a #VisuGlExtMarks object. * * Exports as a string the ids of nodes for measurement marks. * * Since: 3.6 * * Returns: a newly allocated string. */ gchar* visu_gl_ext_marks_getMeasurementLabels(VisuGlExtMarks *marks) { GString *str; GList *tmpLst; struct MarkInfo_struct *mark; guint i; g_return_val_if_fail(VISU_IS_GL_EXT_MARKS(marks), (gchar*)0); str = g_string_new("#"); /* Look for the mark. */ for (tmpLst = marks->storedMarks, i = 0; tmpLst && i < 6; tmpLst = g_list_next(tmpLst), i += 1) { mark = (struct MarkInfo_struct*)tmpLst->data; if (mark->type == MARK_DISTANCE) g_string_append_printf(str, " %4d-%4d", mark->idNode1 + 1, mark->idNode2 + 1); else if (mark->type == MARK_ANGLE) g_string_append_printf(str, " %4d-%4d-%4d", mark->idNode3 + 1, mark->idNode1 + 1, mark->idNode2 + 1); } if (!tmpLst) g_string_append(str, "\n"); else g_string_append(str, " (truncated list)\n"); return g_string_free(str, FALSE); } /** * visu_gl_ext_marks_getMeasurementStrings: * @marks: a #VisuGlExtMarks object. * @dataObj: the #VisuData to apply the measurements to. * * Exports as a string all measurements stored in @marks. * * Since: 3.6 * * Returns: a newly allocated string. */ gchar* visu_gl_ext_marks_getMeasurementStrings(VisuGlExtMarks *marks, VisuData *dataObj) { GString *str; GList *tmpLst; struct MarkInfo_struct *mark; float posSelect[3], posRef1[3], posRef2[3], dx, dy, dz, dr; float dx1, dy1, dz1, dx2, dy2, dz2, dr1, dr2, ang; VisuNode *nodes[3]; gchar *lbl; gboolean export; guint i; g_return_val_if_fail(VISU_IS_GL_EXT_MARKS(marks), (gchar*)0); str = g_string_new(" "); export = FALSE; /* Look for the mark. */ for (tmpLst = marks->storedMarks, i = 0; tmpLst && i < 6; tmpLst = g_list_next(tmpLst), i += 1) { mark = (struct MarkInfo_struct*)tmpLst->data; nodes[0] = visu_node_array_getFromId(VISU_NODE_ARRAY(dataObj), mark->idNode1); nodes[1] = visu_node_array_getFromId(VISU_NODE_ARRAY(dataObj), mark->idNode2); nodes[2] = visu_node_array_getFromId(VISU_NODE_ARRAY(dataObj), mark->idNode3); if (mark->type == MARK_DISTANCE) { DBG_fprintf(stderr, "Visu Marks: export this distance.\n"); visu_data_getNodePosition(dataObj, nodes[0], posRef1); visu_data_getNodePosition(dataObj, nodes[1], posSelect); dx = posSelect[0] - posRef1[0]; dy = posSelect[1] - posRef1[1]; dz = posSelect[2] - posRef1[2]; dr = sqrt(dx*dx + dy*dy + dz*dz); g_string_append_printf(str, " %12.6g", dr); export = TRUE; } else if (mark->type == MARK_ANGLE) { DBG_fprintf(stderr, "Visu Marks: export this angle.\n"); visu_data_getNodePosition(dataObj, nodes[0], posRef1); visu_data_getNodePosition(dataObj, nodes[1], posRef2); visu_data_getNodePosition(dataObj, nodes[2], posSelect); dx1 = posSelect[0] - posRef1[0]; dy1 = posSelect[1] - posRef1[1]; dz1 = posSelect[2] - posRef1[2]; dx2 = posRef2[0] - posRef1[0]; dy2 = posRef2[1] - posRef1[1]; dz2 = posRef2[2] - posRef1[2]; dr1 = sqrt(dx1*dx1 + dy1*dy1 + dz1*dz1); dr2 = sqrt(dx2*dx2 + dy2*dy2 + dz2*dz2); ang = acos((dx2*dx1+dy2*dy1+dz2*dz1)/(dr2*dr1))/TOOL_PI180; g_string_append_printf(str, " %12.6g", ang); export = TRUE; } } if (!export) { g_string_free(str, TRUE); return (gchar*)0; } lbl = visu_data_getFilesAsLabel(dataObj); if (lbl) { g_string_append_printf(str, " # %s\n", lbl); g_free(lbl); } return g_string_free(str, FALSE); } /* */ /* Known elements. */ #define PICK_PARSER_ELEMENT_PICK "pick" #define PICK_PARSER_ELEMENT_NODE "node" #define PICK_PARSER_ELEMENT_DIST "distance" #define PICK_PARSER_ELEMENT_ANGL "angle" /* Known attributes. */ #define PICK_PARSER_ATTRIBUTES_MODE "info-mode" #define PICK_PARSER_ATTRIBUTES_INFO "info-data" #define PICK_PARSER_ATTRIBUTES_ID "id" #define PICK_PARSER_ATTRIBUTES_REF "ref" #define PICK_PARSER_ATTRIBUTES_REF2 "ref2" #define PICK_PARSER_ATTRIBUTES_HLT "highlight" static gboolean startPick; static VisuGlExtInfosDrawId mode; static guint info; /* This method is called for every element that is parsed. The user_data must be a GList of _pick_xml. When a 'surface' element, a new struct instance is created and prepend in the list. When 'hidden-by-planes' or other qualificative elements are found, the first surface of the list is modified accordingly. */ static void pickXML_element(GMarkupParseContext *context _U_, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer user_data, GError **error) { GList **pickList; int i, n; guint val, val2, val3; gboolean highlight; g_return_if_fail(user_data); pickList = (GList **)user_data; DBG_fprintf(stderr, "Pick parser: found '%s' element.\n", element_name); if (!strcmp(element_name, PICK_PARSER_ELEMENT_PICK)) { /* Initialise the pickList. */ if (*pickList) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("DTD error: element '%s' should appear only once."), PICK_PARSER_ELEMENT_PICK); return; } *pickList = (GList*)0; startPick = TRUE; /* Should have 2 mandatory attributes. */ for (i = 0; attribute_names[i]; i++) { if (!strcmp(attribute_names[i], PICK_PARSER_ATTRIBUTES_MODE)) { if (!strcmp(attribute_values[i], "never")) mode = DRAW_NEVER; else if (!strcmp(attribute_values[i], "selected")) mode = DRAW_SELECTED; else if (!strcmp(attribute_values[i], "always")) mode = DRAW_ALWAYS; else { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("DTD error: attribute '%s' has an unknown value '%s'."), PICK_PARSER_ATTRIBUTES_MODE, attribute_values[i]); return; } } else if (!strcmp(attribute_names[i], PICK_PARSER_ATTRIBUTES_INFO)) { n = sscanf(attribute_values[i], "%u", &info); if (n != 1 || info < 1) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("DTD error: attribute '%s' has an unknown value '%s'."), PICK_PARSER_ATTRIBUTES_INFO, attribute_values[i]); return; } } } } else if (!strcmp(element_name, PICK_PARSER_ELEMENT_NODE)) { if (!startPick) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("DTD error: parent element '%s' of element '%s' is missing."), PICK_PARSER_ELEMENT_PICK, PICK_PARSER_ELEMENT_NODE); return; } highlight = FALSE; /* We parse the attributes. */ for (i = 0; attribute_names[i]; i++) { if (!strcmp(attribute_names[i], PICK_PARSER_ATTRIBUTES_ID)) { n = sscanf(attribute_values[i], "%u", &val); if (n != 1) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("DTD error: attribute '%s' has an unknown value '%s'."), PICK_PARSER_ATTRIBUTES_ID, attribute_values[i]); return; } } else if (!strcmp(attribute_names[i], PICK_PARSER_ATTRIBUTES_HLT)) highlight = (!strcmp(attribute_values[i], "yes") || !strcmp(attribute_values[i], "Yes")); } if (highlight) *pickList = g_list_prepend(*pickList, GINT_TO_POINTER(PICK_HIGHLIGHT)); else *pickList = g_list_prepend(*pickList, GINT_TO_POINTER(PICK_SELECTED)); *pickList = g_list_prepend(*pickList, GINT_TO_POINTER(val)); } else if (!strcmp(element_name, PICK_PARSER_ELEMENT_DIST)) { if (!startPick) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("DTD error: parent element '%s' of element '%s' is missing."), PICK_PARSER_ELEMENT_PICK, PICK_PARSER_ELEMENT_DIST); return; } /* We parse the attributes. */ for (i = 0; attribute_names[i]; i++) { if (!strcmp(attribute_names[i], PICK_PARSER_ATTRIBUTES_ID)) { n = sscanf(attribute_values[i], "%u", &val); if (n != 1) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("DTD error: attribute '%s' has an unknown value '%s'."), PICK_PARSER_ATTRIBUTES_ID, attribute_values[i]); return; } } else if (!strcmp(attribute_names[i], PICK_PARSER_ATTRIBUTES_REF)) { n = sscanf(attribute_values[i], "%u", &val2); if (n != 1) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("DTD error: attribute '%s' has an unknown value '%s'."), PICK_PARSER_ATTRIBUTES_REF, attribute_values[i]); return; } } } *pickList = g_list_prepend(*pickList, GINT_TO_POINTER(PICK_DISTANCE)); *pickList = g_list_prepend(*pickList, GINT_TO_POINTER(val2)); *pickList = g_list_prepend(*pickList, GINT_TO_POINTER(val)); } else if (!strcmp(element_name, PICK_PARSER_ELEMENT_ANGL)) { if (!startPick) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("DTD error: parent element '%s' of element '%s' is missing."), PICK_PARSER_ELEMENT_PICK, PICK_PARSER_ELEMENT_ANGL); return; } /* We parse the attributes. */ for (i = 0; attribute_names[i]; i++) { if (!strcmp(attribute_names[i], PICK_PARSER_ATTRIBUTES_ID)) { n = sscanf(attribute_values[i], "%u", &val); if (n != 1) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("DTD error: attribute '%s' has an unknown value '%s'."), PICK_PARSER_ATTRIBUTES_ID, attribute_values[i]); return; } } else if (!strcmp(attribute_names[i], PICK_PARSER_ATTRIBUTES_REF)) { n = sscanf(attribute_values[i], "%u", &val2); if (n != 1) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("DTD error: attribute '%s' has an unknown value '%s'."), PICK_PARSER_ATTRIBUTES_REF, attribute_values[i]); return; } } else if (!strcmp(attribute_names[i], PICK_PARSER_ATTRIBUTES_REF2)) { n = sscanf(attribute_values[i], "%u", &val3); if (n != 1) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("DTD error: attribute '%s' has an unknown value '%s'."), PICK_PARSER_ATTRIBUTES_REF2, attribute_values[i]); return; } } } *pickList = g_list_prepend(*pickList, GINT_TO_POINTER(PICK_ANGLE)); *pickList = g_list_prepend(*pickList, GINT_TO_POINTER(val3)); *pickList = g_list_prepend(*pickList, GINT_TO_POINTER(val2)); *pickList = g_list_prepend(*pickList, GINT_TO_POINTER(val)); } else if (startPick) { /* We silently ignore the element if pickList is unset, but raise an error if pickList has been set. */ g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, _("Unexpected element '%s'."), element_name); } } /* Check when a element is closed that everything required has been set. */ static void pickXML_end(GMarkupParseContext *context _U_, const gchar *element_name, gpointer user_data _U_, GError **error _U_) { if (!strcmp(element_name, PICK_PARSER_ELEMENT_PICK)) startPick = FALSE; } /* What to do when an error is raised. */ static void pickXML_error(GMarkupParseContext *context _U_, GError *error, gpointer user_data) { DBG_fprintf(stderr, "Pick parser: error raised '%s'.\n", error->message); g_return_if_fail(user_data); /* We free the current list of pick. */ g_list_free(*(GList**)user_data); } /** * visu_gl_ext_marks_parseXMLFile: * @marks: a #VisuGlExtMarks object. * @filename: a location to save to. * @infos: (element-type guint32) (out): a location to a #GList. * @drawingMode: a location to a flag. * @drawingInfos: a location to a flag. * @error: a location to store an error. * * This routines read from an XML file the description of selected * nodes, @mark is updated accordingly. * * Since: 3.5 * * Returns: TRUE if no error. */ gboolean visu_gl_ext_marks_parseXMLFile(VisuGlExtMarks *marks, const gchar* filename, GList **infos, VisuGlExtInfosDrawId *drawingMode, guint *drawingInfos, GError **error) { GMarkupParseContext* xmlContext; GMarkupParser parser; gboolean status; gchar *buffer; gsize size; GList *tmpLst; guint id1, id2, id3; g_return_val_if_fail(filename, FALSE); g_return_val_if_fail(infos && drawingMode && drawingInfos, FALSE); buffer = (gchar*)0; if (!g_file_get_contents(filename, &buffer, &size, error)) return FALSE; /* Create context. */ *infos = (GList*)0; parser.start_element = pickXML_element; parser.end_element = pickXML_end; parser.text = NULL; parser.passthrough = NULL; parser.error = pickXML_error; xmlContext = g_markup_parse_context_new(&parser, 0, infos, NULL); /* Parse data. */ startPick = FALSE; status = g_markup_parse_context_parse(xmlContext, buffer, size, error); /* Free buffers. */ g_markup_parse_context_free(xmlContext); g_free(buffer); if (!status) return FALSE; if (!*infos) { *error = g_error_new(G_MARKUP_ERROR, G_MARKUP_ERROR_EMPTY, _("No picked node found.")); return FALSE; } /* Need to reverse the list since elements have been prepended. */ *infos = g_list_reverse(*infos); *drawingMode = mode; *drawingInfos = info; /* Update the current marks. */ if (marks) { tmpLst = *infos; while(tmpLst) { if (GPOINTER_TO_INT(tmpLst->data) == PICK_SELECTED) tmpLst = g_list_next(tmpLst); else if (GPOINTER_TO_INT(tmpLst->data) == PICK_HIGHLIGHT) { tmpLst = g_list_next(tmpLst); id1 = (guint)GPOINTER_TO_INT(tmpLst->data) - 1; /* We silently ignore out of bound values. */ if (visu_node_array_getFromId(VISU_NODE_ARRAY(marks->data), id1)) toggleHighlight(marks, id1, MARKS_STATUS_SET, (gboolean*)0); } else if (GPOINTER_TO_INT(tmpLst->data) == PICK_DISTANCE) { tmpLst = g_list_next(tmpLst); id1 = (guint)GPOINTER_TO_INT(tmpLst->data) - 1; tmpLst = g_list_next(tmpLst); id2 = (guint)GPOINTER_TO_INT(tmpLst->data) - 1; /* We silently ignore out of bound values. */ if (visu_node_array_getFromId(VISU_NODE_ARRAY(marks->data), id1) && visu_node_array_getFromId(VISU_NODE_ARRAY(marks->data), id2)) toggleDistance(marks, id1, id2, TRUE); } else if (GPOINTER_TO_INT(tmpLst->data) == PICK_ANGLE) { tmpLst = g_list_next(tmpLst); id1 = (guint)GPOINTER_TO_INT(tmpLst->data) - 1; tmpLst = g_list_next(tmpLst); id2 = (guint)GPOINTER_TO_INT(tmpLst->data) - 1; tmpLst = g_list_next(tmpLst); id3 = (guint)GPOINTER_TO_INT(tmpLst->data) - 1; /* We silently ignore out of bound values. */ if (visu_node_array_getFromId(VISU_NODE_ARRAY(marks->data), id1) && visu_node_array_getFromId(VISU_NODE_ARRAY(marks->data), id2) && visu_node_array_getFromId(VISU_NODE_ARRAY(marks->data), id3)) toggleAngle(marks, id2, id1, id3, TRUE); } else { g_error("Should not be here!"); } tmpLst = g_list_next(tmpLst); } marksDraw(marks, 0); marksDraw(marks, 1); } tmpLst = visu_gl_ext_marks_getHighlightedList(marks); g_signal_emit(G_OBJECT(marks), signals[HIGHLIGHT_CHANGE_SIGNAL], 0, tmpLst, NULL); g_list_free(tmpLst); g_signal_emit(G_OBJECT(marks), signals[MEASUREMENT_CHANGE_SIGNAL], 0, NULL); return TRUE; } /** * visu_gl_ext_marks_exportXMLFile: * @marks: a #VisuGlExtMarks object. * @filename: a location to save to. * @nodes: an array of nodes, -1 terminated (can be NULL). * @drawingMode: a flag. * @drawingInfos: a flag. * @error: a location to store an error. * * This routines export to an XML file a description of selected * @nodes. If @nodes is NULL, the nodes stored in the @mark will be * used instead. * * Since: 3.5 * * Returns: TRUE if no error. */ gboolean visu_gl_ext_marks_exportXMLFile(VisuGlExtMarks *marks, const gchar* filename, int *nodes, VisuGlExtInfosDrawId drawingMode, guint drawingInfos, GError **error) { gboolean valid, set; GString *output; int i; char *modes[] = {"never", "selected", "always"}; GList *tmpLst; struct MarkInfo_struct *mark; g_return_val_if_fail(marks && filename, FALSE); /* */ output = g_string_new(" \n", modes[drawingMode], drawingInfos); if (nodes) for (i = 0; nodes[i] >= 0; i++) { set = FALSE; /* We print them only if they are not part of marks. */ for (tmpLst = marks->storedMarks; tmpLst; tmpLst = g_list_next(tmpLst)) { mark = (struct MarkInfo_struct*)(tmpLst->data); set = set || ( (mark->type == MARK_DISTANCE && (guint)nodes[i] == mark->idNode2) || (mark->type == MARK_HIGHLIGHT && (guint)nodes[i] == mark->idNode1) ); } if (!set) g_string_append_printf(output, " \n", nodes[i] + 1); } for (tmpLst = marks->storedMarks; tmpLst; tmpLst = g_list_next(tmpLst)) { mark = (struct MarkInfo_struct*)(tmpLst->data); if (mark->type == MARK_DISTANCE) g_string_append_printf(output, " \n", mark->idNode1 + 1, mark->idNode2 + 1); else if (mark->type == MARK_ANGLE) g_string_append_printf(output, " \n", mark->idNode1 + 1, mark->idNode2 + 1, mark->idNode3 + 1); else if (mark->type == MARK_HIGHLIGHT) g_string_append_printf(output, " \n", mark->idNode1 + 1); } g_string_append(output, " "); valid = tool_XML_substitute(output, filename, "pick", error); if (!valid) { g_string_free(output, TRUE); return FALSE; } valid = g_file_set_contents(filename, output->str, -1, error); g_string_free(output, TRUE); return valid; } v_sim-3.7.0/src/extensions/marks.h0000644000353400050620000001302612215546077014050 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef MARKS_H #define MARKS_H #include "infos.h" #include #include /** * VisuGlExtMarksStatus: * @MARKS_STATUS_KEEP: do not change the status of the mark ; * @MARKS_STATUS_TOGGLE: change the status of the mark ; * @MARKS_STATUS_SET: set the mark on ; * @MARKS_STATUS_UNSET: unset a mark. * * Possible parameters to change mark status, see * visu_gl_ext_marks_setHighlightedList() for instance. * * Since: 3.6 */ typedef enum { MARKS_STATUS_KEEP, MARKS_STATUS_TOGGLE, MARKS_STATUS_SET, MARKS_STATUS_UNSET } VisuGlExtMarksStatus; /** * VISU_TYPE_GL_EXT_MARKS: * * Return the associated #GType to the #VisuGlExtMarks objects. * * Since: 3.6 */ #define VISU_TYPE_GL_EXT_MARKS (visu_gl_ext_marks_get_type()) /** * VISU_GL_EXT_MARKS: * @obj: the widget to cast. * * Cast the given object to a #VisuGlExtMarks object. * * Since: 3.6 */ #define VISU_GL_EXT_MARKS(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), VISU_TYPE_GL_EXT_MARKS, VisuGlExtMarks)) /** * VISU_GL_EXT_MARKS_CLASS: * @obj: the class to cast. * * Cast the given class to a #VisuGlExtMarks object. * * Since: 3.6 */ #define VISU_GL_EXT_MARKS_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST((obj), VISU_GL_EXT_MARKS, VisuGlExtMarksClass)) /** * VISU_IS_GL_EXT_MARKS: * @obj: the object to test. * * Return if the given object is a valid #VisuGlExtMarks object. * * Since: 3.6 */ #define VISU_IS_GL_EXT_MARKS(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), VISU_TYPE_GL_EXT_MARKS)) /** * VISU_IS_GL_EXT_MARKS_CLASS: * @obj: the class to test. * * Return if the given class is a valid #VisuGlExtMarksClass class. * * Since: 3.6 */ #define VISU_IS_GL_EXT_MARKS_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((obj), VISU_TYPE_GL_EXT_MARKS)) /** * VISU_GL_EXT_MARKS_GET_CLASS: * @obj: the widget to get the class of. * * Get the class of the given object. * * Since: 3.6 */ #define VISU_GL_EXT_MARKS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), VISU_TYPE_GL_EXT_MARKS, VisuGlExtMarksClass)) /** * VisuGlExtMarks: * * All fields are private. * * Since: 3.6 */ typedef struct _VisuGlExtMarks VisuGlExtMarks; typedef struct _VisuGlExtMarksClass VisuGlExtMarksClass; /** * visu_gl_ext_marks_get_type: * * Internal routine to get #VISU_TYPE_GL_EXT_MARKS value. * * Since: 3.6 */ GType visu_gl_ext_marks_get_type(void); VisuGlExtMarks* visu_gl_ext_marks_new(const gchar *name); void visu_gl_ext_marks_setData(VisuGlExtMarks *marks, VisuData *data); void visu_gl_ext_marks_setGlView(VisuGlExtMarks *marks, VisuGlView *view); void visu_gl_ext_marks_setInteractive(VisuGlExtMarks *marks, VisuInteractive *inter); gboolean visu_gl_ext_marks_setHighlightedList(VisuGlExtMarks *marks, GList *lst, VisuGlExtMarksStatus status); GList* visu_gl_ext_marks_getHighlightedList(VisuGlExtMarks *marks); gboolean visu_gl_ext_marks_setInfos(VisuGlExtMarks *marks, guint nodeId, gboolean status); gboolean visu_gl_ext_marks_getActive(VisuGlExtMarks *marks, guint nodeId); gboolean visu_gl_ext_marks_getHighlightStatus(VisuGlExtMarks *marks, guint nodeId); gboolean visu_gl_ext_marks_setDrawValues(VisuGlExtMarks *marks, gboolean status); gboolean visu_gl_ext_marks_removeMeasures(VisuGlExtMarks *marks, gint nodeId); gboolean visu_gl_ext_marks_parseXMLFile(VisuGlExtMarks *marks, const gchar* filename, GList **infos, VisuGlExtInfosDrawId *drawingMode, guint *drawingInfos, GError **error); gboolean visu_gl_ext_marks_exportXMLFile(VisuGlExtMarks *marks, const gchar* filename, int *nodes, VisuGlExtInfosDrawId drawingMode, guint drawingInfos, GError **error); gchar* visu_gl_ext_marks_getMeasurementStrings(VisuGlExtMarks *marks, VisuData *dataObj); gchar* visu_gl_ext_marks_getMeasurementLabels(VisuGlExtMarks *marks); VisuGlExt* visu_gl_ext_marks_getInternalList(VisuGlExtMarks *marks); #endif v_sim-3.7.0/src/extensions/pairs.c0000644000353400050620000012651312215546077014052 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2009) Adresse ml : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2009) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at COPYING. */ #include "pairs.h" #include #include #include #include #include #include #include #include #include /** * SECTION:pairs * @short_description: Draw links between nodes. * * This extension draws links between nodes, depending on * #VisuPairExtension drawing capabilities. * * Since: 3.7 */ /** * VisuGlExtPairsClass: * @parent: the parent class; * * A short way to identify #_VisuGlExtPairsClass structure. * * Since: 3.7 */ /** * VisuGlExtPairs: * * An opaque structure. * * Since: 3.7 */ /** * VisuGlExtPairsPrivate: * * Private fields for #VisuGlExtPairs objects. * * Since: 3.7 */ struct _VisuGlExtPairsPrivate { gboolean dispose_has_run; gboolean isBuilt; /* Pairs definition. */ VisuData *data; gulong popInc_signal, popDec_signal, visChg_signal, posChg_signal; VisuGlView *view; gulong detail_signal; gulong link_signal; /* Additional storage. */ GHashTable *pairData; }; typedef struct _PairDataProperties { VisuPairExtension *ext; GArray *drawnPairs; } PairDataProperties; /** * VisuPairExtension: * * An Opaque structure. */ struct _VisuPairExtension { /* Some variable to describe this OpenGL extension. The attribute name is mandatory since it is used to identify the method. */ char* name; char* printName; char* description; gboolean sensitiveToFacette; VisuPairDrawFuncs draw; /* Ref counter. */ guint refCount; }; static GList *availableVisuPairExtensions; static VisuPairExtension *defaultPairMethod; static guint sensitiveToFacette; static VisuGlExtPairs *defaultPairs = NULL; #define BONDNUMBER_ID "bondNumber_data" static VisuDataNode *dataNode; #define FLAG_RESOURCES_PAIRS "pairs_are_on" #define DESC_RESOURCES_PAIRS "Ask the opengl engine to draw pairs between elements ; boolean 0 or 1" static gboolean pairsAreOn = FALSE; #define FLAG_RESOURCES_FAV_PAIRS "pairs_favoriteMethod" #define DESC_RESOURCES_FAV_PAIRS "Favorite method used to render files ; chain" static gboolean readFavPairsMethod(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); #define FLAG_RESOURCES_PAIRS_DATA "pair_data" #define DESC_RESOURCES_PAIRS_DATA "Draw pairs between [ele1] [ele2] [0. <= dmin] [0. <= dmax] [0. <= RGB <= 1.]x3" static gboolean readPairsData(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); #define FLAG_RESOURCES_PAIR_LINK "pair_link" #define DESC1_RESOURCES_PAIR_LINK "Draw a link between [ele1] [ele2] [0. <= dmin] [0. <= dmax]" #define DESC2_RESOURCES_PAIR_LINK " [0. <= RGB <= 1.]x3 [bool: drawn] [bool: printLength] [string: method]" static gboolean readPairLink(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static void exportResourcesPairs(GString *data, VisuData *dataObj, VisuGlView *view); static void visu_gl_ext_pairs_finalize(GObject* obj); static void visu_gl_ext_pairs_dispose(GObject* obj); static void visu_gl_ext_pairs_rebuild(VisuGlExt *ext); /* Local callbacks. */ static void onPairsParametersChange(VisuGlView *view, gpointer data); static void onNodePopulationChanged(VisuNodeArray *array, int *nodes, gpointer data); static void onNodeVisibilityChanged(VisuNodeArray *array, gpointer data); static void onNodePositionChanged(VisuNodeArray *array, VisuElement *ele, gpointer data); static void onActiveChanged(VisuGlExtPairs *pairs, GParamSpec *pspec, gpointer data); static gboolean onPairDataHook(GSignalInvocationHint *ihint, guint nvalues, const GValue *param_values, gpointer data); static void onEntryUsed(VisuGlExtPairs *pairs, gchar *key, VisuObject *obj); /* Local routines. */ static PairDataProperties* _newPairDataProperties(VisuGlExtPairs *pairs, VisuPairLink *data); static void _freePairProperties(gpointer data); static void freeData(gpointer obj, gpointer data); static gpointer newOrCopyData(gconstpointer orig, gpointer user_data); G_DEFINE_TYPE(VisuGlExtPairs, visu_gl_ext_pairs, VISU_TYPE_GL_EXT) static void visu_gl_ext_pairs_class_init(VisuGlExtPairsClass *klass) { VisuConfigFileEntry *resourceEntry, *oldEntry; DBG_fprintf(stderr, "Extension Pairs: creating the class of the object.\n"); /* DBG_fprintf(stderr, " - adding new signals ;\n"); */ /* Register a new NodeData. */ dataNode = VISU_DATA_NODE(visu_data_node_new(BONDNUMBER_ID, G_TYPE_INT)); visu_data_node_setLabel(dataNode, _("Bonds")); /* Initialise the pairs extensions. */ availableVisuPairExtensions = (GList*)0; visu_gl_pairs_wire_init(); visu_gl_pairs_cylinder_init(); defaultPairMethod = (VisuPairExtension*)availableVisuPairExtensions->data; sensitiveToFacette = (defaultPairMethod->sensitiveToFacette)?1:0; /* Add resources. */ visu_config_file_addBooleanEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCES_PAIRS, DESC_RESOURCES_PAIRS, &pairsAreOn); visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCES_FAV_PAIRS, DESC_RESOURCES_FAV_PAIRS, 1, readFavPairsMethod); oldEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCES_PAIRS_DATA, DESC_RESOURCES_PAIRS_DATA, 1, readPairsData); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCES_PAIR_LINK, DESC1_RESOURCES_PAIR_LINK, 2, readPairLink); visu_config_file_entry_setVersion(resourceEntry, 3.4f); visu_config_file_entry_setReplace(resourceEntry, oldEntry); visu_config_file_addExportFunction(VISU_CONFIG_FILE_RESOURCE, exportResourcesPairs); /* Connect the overloading methods. */ G_OBJECT_CLASS(klass)->dispose = visu_gl_ext_pairs_dispose; G_OBJECT_CLASS(klass)->finalize = visu_gl_ext_pairs_finalize; VISU_GL_EXT_CLASS(klass)->rebuild = visu_gl_ext_pairs_rebuild; g_type_class_ref(VISU_TYPE_PAIR_LINK); } static void visu_gl_ext_pairs_init(VisuGlExtPairs *obj) { DBG_fprintf(stderr, "Extension Pairs: initializing a new object (%p).\n", (gpointer)obj); obj->priv = g_malloc(sizeof(VisuGlExtPairsPrivate)); obj->priv->dispose_has_run = FALSE; /* Private data. */ obj->priv->isBuilt = FALSE; obj->priv->data = (VisuData*)0; obj->priv->popInc_signal = 0; obj->priv->popDec_signal = 0; obj->priv->visChg_signal = 0; obj->priv->posChg_signal = 0; obj->priv->view = (VisuGlView*)0; obj->priv->detail_signal = 0; obj->priv->pairData = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, _freePairProperties); g_signal_connect(G_OBJECT(obj), "notify::active", G_CALLBACK(onActiveChanged), (gpointer)0); g_signal_connect_object(VISU_OBJECT_INSTANCE, "entryParsed::" FLAG_RESOURCES_PAIRS, G_CALLBACK(onEntryUsed), (gpointer)obj, G_CONNECT_SWAPPED); /* We listen for any VisuPairLink rendering changes. */ obj->priv->link_signal = g_signal_add_emission_hook(g_signal_lookup("ParameterChanged", VISU_TYPE_PAIR_LINK), 0, onPairDataHook, (gpointer)obj, (GDestroyNotify)0); } /* This method can be called several times. It should unref all of its reference to GObjects. */ static void visu_gl_ext_pairs_dispose(GObject* obj) { VisuGlExtPairs *pairs; DBG_fprintf(stderr, "Extension Pairs: dispose object %p.\n", (gpointer)obj); pairs = VISU_GL_EXT_PAIRS(obj); if (pairs->priv->dispose_has_run) return; pairs->priv->dispose_has_run = TRUE; /* Disconnect signals. */ visu_gl_ext_pairs_setData(pairs, (VisuGlView*)0, (VisuData*)0); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_gl_ext_pairs_parent_class)->dispose(obj); } /* This method is called once only. */ static void visu_gl_ext_pairs_finalize(GObject* obj) { VisuGlExtPairs *pairs; g_return_if_fail(obj); DBG_fprintf(stderr, "Extension Pairs: finalize object %p.\n", (gpointer)obj); pairs = VISU_GL_EXT_PAIRS(obj); /* Free privs elements. */ if (pairs->priv) { DBG_fprintf(stderr, "Extension Pairs: free private pairs.\n"); g_hash_table_destroy(pairs->priv->pairData); g_signal_remove_emission_hook(g_signal_lookup("ParameterChanged", VISU_TYPE_PAIR_LINK), pairs->priv->link_signal); g_free(pairs->priv); } /* Chain up to the parent class */ DBG_fprintf(stderr, "Extension Pairs: chain to parent.\n"); G_OBJECT_CLASS(visu_gl_ext_pairs_parent_class)->finalize(obj); DBG_fprintf(stderr, "Extension Pairs: freeing ... OK.\n"); } /** * visu_gl_ext_pairs_new: * @name: (allow-none): the name to give to the extension (default is #VISU_GL_EXT_PAIRS_ID). * * Creates a new #VisuGlExt to draw a pairs. * * Since: 3.7 * * Returns: a pointer to the #VisuGlExt it created or * NULL otherwise. */ VisuGlExtPairs* visu_gl_ext_pairs_new(const gchar *name) { char *name_ = VISU_GL_EXT_PAIRS_ID; char *description = _("Draw pairs between elements with a criterion of distance."); VisuGlExtPairs *pairs; DBG_fprintf(stderr,"Extension Pairs: new object.\n"); pairs = VISU_GL_EXT_PAIRS(g_object_new(VISU_TYPE_GL_EXT_PAIRS, "name", (name)?name:name_, "label", _(name), "description", description, "nGlObj", 1, NULL)); visu_gl_ext_setPriority(VISU_GL_EXT(pairs), VISU_GL_EXT_PRIORITY_NORMAL); visu_gl_ext_setSensitiveToRenderingMode(VISU_GL_EXT(pairs), TRUE); return pairs; } /** * visu_gl_ext_pairs_setData: * @pairs: The #VisuGlExtPairs to attached to. * @view: the view where to draw the pairs. * @data: the nodes to get the population of. * * Attach an #VisuGlView to render to and setup the pairs to get the * node population also. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_pairs_draw() should be called and * then 'OpenGLAskForReDraw' signal be emitted. **/ gboolean visu_gl_ext_pairs_setData(VisuGlExtPairs *pairs, VisuGlView *view, VisuData *data) { g_return_val_if_fail(VISU_IS_GL_EXT_PAIRS(pairs), FALSE); if (pairs->priv->data) { g_signal_handler_disconnect(G_OBJECT(pairs->priv->data), pairs->priv->popInc_signal); g_signal_handler_disconnect(G_OBJECT(pairs->priv->data), pairs->priv->popDec_signal); g_signal_handler_disconnect(G_OBJECT(pairs->priv->data), pairs->priv->visChg_signal); g_signal_handler_disconnect(G_OBJECT(pairs->priv->data), pairs->priv->posChg_signal); g_object_unref(pairs->priv->data); } if (data) { g_object_ref(data); pairs->priv->popInc_signal = g_signal_connect(G_OBJECT(data), "PopulationIncrease", G_CALLBACK(onNodePopulationChanged), (gpointer)pairs); pairs->priv->popDec_signal = g_signal_connect(G_OBJECT(data), "PopulationDecrease", G_CALLBACK(onNodePopulationChanged), (gpointer)pairs); pairs->priv->visChg_signal = g_signal_connect(G_OBJECT(data), "VisibilityChanged", G_CALLBACK(onNodeVisibilityChanged), (gpointer)pairs); pairs->priv->posChg_signal = g_signal_connect(G_OBJECT(data), "PositionChanged", G_CALLBACK(onNodePositionChanged), (gpointer)pairs); visu_data_node_setUsed(dataNode, data, (visu_gl_ext_getActive(VISU_GL_EXT(pairs)))?1:0); } else { pairs->priv->popInc_signal = 0; pairs->priv->popDec_signal = 0; pairs->priv->visChg_signal = 0; pairs->priv->posChg_signal = 0; } pairs->priv->data = data; if (pairs->priv->view) { g_signal_handler_disconnect(G_OBJECT(pairs->priv->view), pairs->priv->detail_signal); g_object_unref(pairs->priv->view); } if (view) { g_object_ref(view); pairs->priv->detail_signal = g_signal_connect(G_OBJECT(view), "DetailLevelChanged", G_CALLBACK(onPairsParametersChange), (gpointer)pairs); } else pairs->priv->detail_signal = 0; pairs->priv->view = view; pairs->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(pairs)); } /** * visu_gl_ext_pairs_setDrawMethod: * @pairs: the rendering #VisuGlExtPairs object. * @data: a #VisuPairLink object. * @ext: a #VisuPairExtension object. * * Set the drawing method of a pair. * * Since: 3.6 * * Returns: TRUE if drawing method is changed. */ gboolean visu_gl_ext_pairs_setDrawMethod(VisuGlExtPairs *pairs, VisuPairLink *data, VisuPairExtension *ext) { PairDataProperties *prop; g_return_val_if_fail(VISU_IS_GL_EXT_PAIRS(pairs) && data, FALSE); DBG_fprintf(stderr, "Visu Pairs: set method %p for %p.\n", (gpointer)ext, (gpointer)data); prop = _newPairDataProperties(pairs, data); if (prop->ext == ext) return FALSE; if (prop->ext && prop->ext->sensitiveToFacette) sensitiveToFacette -= 1; prop->ext = ext; if (prop->ext && prop->ext->sensitiveToFacette) sensitiveToFacette += 1; pairs->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(pairs)); } /** * visu_gl_ext_pairs_getNDrawn: * @pairs: the rendering #VisuGlExtPairs object. * @data: a #VisuPairLink object. * * This returns the number of pairs with characteristics of @data, * that have been drawn. * * Returns: the number of drawn pairs. * * Since: 3.7 */ guint visu_gl_ext_pairs_getNDrawn(VisuGlExtPairs *pairs, VisuPairLink *data) { PairDataProperties *prop; g_return_val_if_fail(VISU_IS_GL_EXT_PAIRS(pairs), FALSE); prop = (PairDataProperties*)g_hash_table_lookup(pairs->priv->pairData, (gpointer)data); if (!prop) return 0; else return prop->drawnPairs->len; } /** * visu_gl_ext_pairs_getDrawnPair: * @pairs: the rendering #VisuGlExtPairs object. * @data: a #VisuPairLink object ; * @node1: (out): a location to store a node id ; * @node2: (out): a location to store a node id ; * @id: an index value. * * After pairs have been drawn, the ids of nodes in between links have * been done can be retrieved with this routine. @id range in between * 0 and the value returned by visu_gl_ext_pairs_getNDrawn(). * * Returns: TRUE if @id is a valid number. * * Since: 3.7 */ gboolean visu_gl_ext_pairs_getDrawnPair(VisuGlExtPairs *pairs, VisuPairLink *data, guint *node1, guint *node2, guint id) { PairDataProperties *prop; guint *nodeIds; g_return_val_if_fail(VISU_IS_GL_EXT_PAIRS(pairs) && node1 && node2, FALSE); prop = (PairDataProperties*)g_hash_table_lookup(pairs->priv->pairData, (gpointer)data); if (!prop || id >= prop->drawnPairs->len) return FALSE; else { nodeIds = &g_array_index(prop->drawnPairs, guint, id); *node1 = nodeIds[0]; *node2 = nodeIds[1]; return TRUE; } } /** * visu_gl_ext_pairs_getDrawMethod: * @pairs: the rendering #VisuGlExtPairs object. * @data: a #VisuPairLink object. * * Get the drawing method of a pair. * * Since: 3.6 * * Returns: a drawing method. */ VisuPairExtension* visu_gl_ext_pairs_getDrawMethod(VisuGlExtPairs *pairs, VisuPairLink *data) { PairDataProperties *prop; g_return_val_if_fail(VISU_IS_GL_EXT_PAIRS(pairs) && data, defaultPairMethod); prop = (PairDataProperties*)g_hash_table_lookup(pairs->priv->pairData, (gpointer)data); return (prop && prop->ext)?prop->ext:defaultPairMethod; } /** * visu_gl_ext_pairs_getDefault: * * V_Sim is using a default pair object. * * Since: 3.7 * * Returns: (transfer none): a #VisuGlExtPairs object used by default. **/ VisuGlExtPairs* visu_gl_ext_pairs_getDefault() { if (!defaultPairs) { defaultPairs = visu_gl_ext_pairs_new((gchar*)0); visu_gl_ext_setActive(VISU_GL_EXT(defaultPairs), pairsAreOn); } return defaultPairs; } /************/ /* Signals. */ /************/ static void onPairsParametersChange(VisuGlView *view _U_, gpointer data) { VisuGlExtPairs *pairs = VISU_GL_EXT_PAIRS(data); if (FALSE) { pairs->priv->isBuilt = FALSE; visu_gl_ext_pairs_draw(pairs); } } static void onNodePopulationChanged(VisuNodeArray *array _U_, int *nodes _U_, gpointer data) { VisuGlExtPairs *pairs = VISU_GL_EXT_PAIRS(data); pairs->priv->isBuilt = FALSE; g_idle_add((GSourceFunc)visu_gl_ext_pairs_draw, (gpointer)pairs); } static void onNodeVisibilityChanged(VisuNodeArray *array _U_, gpointer data) { VisuGlExtPairs *pairs = VISU_GL_EXT_PAIRS(data); pairs->priv->isBuilt = FALSE; visu_gl_ext_pairs_draw(pairs); } static void onNodePositionChanged(VisuNodeArray *array _U_, VisuElement *ele _U_, gpointer data) { VisuGlExtPairs *pairs = VISU_GL_EXT_PAIRS(data); pairs->priv->isBuilt = FALSE; visu_gl_ext_pairs_draw(pairs); } static void onActiveChanged(VisuGlExtPairs *pairs, GParamSpec *pspec _U_, gpointer data _U_) { if (!pairs->priv->data || !dataNode) return; visu_data_node_setUsed(dataNode, pairs->priv->data, (visu_gl_ext_getActive(VISU_GL_EXT(pairs)))?1:0); } static void onEntryUsed(VisuGlExtPairs *pairs, gchar *key _U_, VisuObject *obj _U_) { visu_gl_ext_setActive(VISU_GL_EXT(pairs), pairsAreOn); } static gboolean onPairDataHook(GSignalInvocationHint *ihint _U_, guint nvalues _U_, const GValue *param_values, gpointer user_data) { VisuGlExtPairs *pairs; VisuElement *ele1, *ele2; pairs = VISU_GL_EXT_PAIRS(user_data); if (!pairs->priv->data) return TRUE; visu_pair_getElements (visu_pair_link_getPair(VISU_PAIR_LINK(g_value_get_object(param_values))), &ele1, &ele2); pairs->priv->isBuilt = pairs->priv->isBuilt && (visu_node_array_getElementId(VISU_NODE_ARRAY(pairs->priv->data), ele1) < 0 || visu_node_array_getElementId(VISU_NODE_ARRAY(pairs->priv->data), ele2) < 0); DBG_fprintf(stderr, "Visu GlExt Pairs: some pair has changed (%d).\n", pairs->priv->isBuilt); return TRUE; } static void visu_gl_ext_pairs_rebuild(VisuGlExt *ext) { VisuGlExtPairs *pairs = VISU_GL_EXT_PAIRS(ext); visu_gl_text_rebuildFontList(); pairs->priv->isBuilt = FALSE; visu_gl_ext_pairs_draw(pairs); } static PairDataProperties* _newPairDataProperties(VisuGlExtPairs *pairs, VisuPairLink *data) { PairDataProperties *prop; prop = (PairDataProperties*)g_hash_table_lookup(pairs->priv->pairData, (gpointer)data); if (!prop) { #if GLIB_MINOR_VERSION > 9 prop = g_slice_alloc(sizeof(PairDataProperties)); #else prop = g_malloc(sizeof(PairDataProperties)); #endif prop->drawnPairs = g_array_new(FALSE, FALSE, sizeof(guint) * 2); prop->ext = (VisuPairExtension*)0; g_hash_table_insert(pairs->priv->pairData, (gpointer)data, (gpointer)prop); } return prop; } static void _freePairProperties(gpointer data) { PairDataProperties *prop = (PairDataProperties*)data; g_array_free(prop->drawnPairs, TRUE); #if GLIB_MINOR_VERSION > 9 g_slice_free1(sizeof(PairDataProperties), data); #else g_free(data); #endif } static void freeData(gpointer obj, gpointer data _U_) { #if GLIB_MINOR_VERSION > 9 g_slice_free1(sizeof(int), obj); #else g_free(obj); #endif } static gpointer newOrCopyData(gconstpointer orig, gpointer user_data _U_) { int* data; #if GLIB_MINOR_VERSION > 9 data = g_slice_alloc(sizeof(int)); #else data = g_malloc(sizeof(int)); #endif if (orig) *data = *(int*)orig; else *data = 0; return (gpointer)data; } static int* getBond(VisuNodeArray *nodes, VisuNode *node) { int *bond; GValue val = {0, {{0}, {0}}}; g_value_init(&val, G_TYPE_POINTER); visu_node_array_getPropertyValue(nodes, node, BONDNUMBER_ID, &val); bond = (int*)g_value_get_pointer(&val); if (!bond) { bond = (int*)newOrCopyData((gconstpointer)0, (gpointer)0); g_value_set_pointer(&val, (gpointer)bond); visu_node_setpropertyValue(nodes, node, BONDNUMBER_ID, &val); } return bond; } /** * visu_gl_ext_pairs_draw: * @pairs: a #VisuGlExtPairs object. * * Draw the @pairs, see visu_gl_ext_pairs_setData() to attach * a #VisuData object to @pairs. * * Since: 3.7 */ void visu_gl_ext_pairs_draw(VisuGlExtPairs *pairs) { VisuNodeArray *nodes; VisuPairExtension *ext; VisuNodeArrayIter iter1, iter2; VisuPairLink *data; GList *tmpLst; gboolean useBond; int *bond1, *bond2; float mM[2]; PairDataProperties *prop; float d2, d2min, d2max, d2min_buffered, d2max_buffered, l; float xyz1[3], xyz2[3], alpha; guint nodeIds[2]; char distStr[8]; g_return_if_fail(VISU_IS_GL_EXT_PAIRS(pairs)); /* Nothing to draw if no data is associated to the current rendering window. */ if (!pairs->priv->data || !pairs->priv->view) return; /* Nothing to draw; */ if(!visu_gl_ext_getActive(VISU_GL_EXT(pairs)) || pairs->priv->isBuilt) return; nodes = VISU_NODE_ARRAY(pairs->priv->data); /* Cleans. */ glDeleteLists(visu_gl_ext_getGlList(VISU_GL_EXT(pairs)), 1); visu_gl_text_initFontList(); glNewList(visu_gl_ext_getGlList(VISU_GL_EXT(pairs)), GL_COMPILE); /* We get the counting array for bonds. */ if (!visu_node_array_getProperty(nodes, (const gchar*)BONDNUMBER_ID)) { /* Create the Node property to count the number of bonds. */ DBG_fprintf(stderr, "Visu GlExt Pairs: create the bond node property.\n"); visu_node_array_property_newPointer(nodes, BONDNUMBER_ID, freeData, newOrCopyData, (gpointer)0); } useBond = TRUE; DBG_fprintf(stderr, "Visu GlExt Pairs: creating pairs between elements.\n"); visu_node_array_iterNew(nodes, &iter1); visu_node_array_iterNew(nodes, &iter2); for(visu_node_array_iterStart(nodes, &iter1); iter1.element; visu_node_array_iterNextElement(nodes, &iter1)) { if (!visu_element_getRendered(iter1.element)) continue; /* Initialise the bond count. */ if (useBond) for(visu_node_array_iterRestartNode(nodes, &iter1); iter1.node; visu_node_array_iterNextNode(nodes, &iter1)) { bond1 = getBond(nodes, iter1.node); *bond1 = 0; } for(visu_node_array_iterStart(nodes, &iter2); iter2.element && iter2.iElement <= iter1.iElement ; visu_node_array_iterNextElement(nodes, &iter2)) { if (!visu_element_getRendered(iter2.element)) continue; DBG_fprintf(stderr, "Visu GlExt Pairs: draw pairs between '%s' and '%s'.\n", iter1.element->name, iter2.element->name); for (tmpLst = visu_pair_link_getAll(iter1.element, iter2.element); tmpLst; tmpLst = g_list_next(tmpLst)) { data = (VisuPairLink*)tmpLst->data; if (!visu_pair_link_isDrawn(data)) continue; mM[0] = visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MIN); mM[1] = visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MAX); d2min = mM[0] * mM[0]; d2max = mM[1] * mM[1]; l = mM[1] - mM[0]; d2min_buffered = (mM[0] - 0.15 * l); d2min_buffered *= d2min_buffered; d2max_buffered = (mM[1] + 0.15 * l); d2max_buffered *= d2max_buffered; prop = _newPairDataProperties(pairs, data); DBG_fprintf(stderr, " | having properties %p.\n", (gpointer)prop); ext = (prop && prop->ext)?prop->ext:defaultPairMethod; DBG_fprintf(stderr, " | using %p '%s' method.\n", (gpointer)ext, ext->name); if (ext->draw.start) ext->draw.start(iter1.element, iter2.element, data, pairs->priv->view); g_array_set_size(prop->drawnPairs, 0); for(visu_node_array_iterRestartNode(nodes, &iter1); iter1.node; visu_node_array_iterNextNode(nodes, &iter1)) { if (!iter1.node->rendered) continue; bond1 = (useBond)?getBond(nodes, iter1.node):(int*)0; for(visu_node_array_iterRestartNode(nodes, &iter2); iter2.node; visu_node_array_iterNextNode(nodes, &iter2)) { if (!iter2.node->rendered) continue; /* Don't draw the inter element pairs two times. */ if (iter1.element == iter2.element && iter2.node >= iter1.node) break; visu_data_getNodePosition(pairs->priv->data, iter1.node, xyz1); visu_data_getNodePosition(pairs->priv->data, iter2.node, xyz2); d2 = (xyz1[0] - xyz2[0]) * (xyz1[0] - xyz2[0]) + (xyz1[1] - xyz2[1]) * (xyz1[1] - xyz2[1]) + (xyz1[2] - xyz2[2]) * (xyz1[2] - xyz2[2]); if(d2 <= 0. || d2 < d2min_buffered || d2 > d2max_buffered) continue; if (d2 < d2min) alpha = (d2 - d2min_buffered) / (d2min - d2min_buffered); else if (d2 > d2max) alpha = (d2max_buffered - d2) / (d2max_buffered - d2max); else { alpha = 1.f; /* Update bond count. */ if (bond1) (*bond1) += 1; bond2 = (useBond)?getBond(nodes, iter2.node):(int*)0; if (bond2) (*bond2) += 1; } ext->draw.main(iter1.element, iter2.element, data, pairs->priv->view, xyz1[0], xyz1[1], xyz1[2], xyz2[0], xyz2[1], xyz2[2], d2, alpha); if (visu_pair_link_getPrintLength(data)) { glRasterPos3f((xyz1[0] + xyz2[0]) / 2., (xyz1[1] + xyz2[1]) / 2., (xyz1[2] + xyz2[2]) / 2.); sprintf(distStr, "%7.3f", sqrt(d2)); visu_gl_text_drawChars(distStr, VISU_GL_TEXT_NORMAL); } nodeIds[0] = iter1.node->number; nodeIds[1] = iter2.node->number; g_array_append_vals(prop->drawnPairs, nodeIds, 1); } } if (ext->draw.stop) ext->draw.stop(iter1.element, iter2.element, data, pairs->priv->view); DBG_fprintf(stderr, "Visu GlExt Pairs: have drawn %d pairs.\n", prop->drawnPairs->len); } } } glEndList(); /* Emit the valueChanged signal of dataNode. */ visu_data_node_emitValueChanged(dataNode, pairs->priv->data); pairs->priv->isBuilt = TRUE; } /**************/ /* Resources. */ /**************/ static gboolean readFavPairsMethod(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { VisuPairExtension *method; g_return_val_if_fail(nbLines == 1, FALSE); lines[0] = g_strstrip(lines[0]); if (!lines[0][0]) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d, 1 string value must appear" " after the %s markup.\n"), position, FLAG_RESOURCES_FAV_PAIRS); return FALSE; } else { method = visu_pair_extension_getByName(lines[0]); if (!method) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d, the method" " '%s' is unknown.\n"), position, lines[0]); return FALSE; } visu_pair_extension_setDefault(method); } return TRUE; } gboolean visu_pair_readLinkFromTokens(gchar **tokens, int *index, VisuPairLink **data, int lineId, GError **error) { VisuElement *ele[2]; float minMax[2]; gboolean res; g_return_val_if_fail(error && (*error == (GError*)0), FALSE); g_return_val_if_fail(data, FALSE); g_return_val_if_fail(tokens && index, FALSE); /* Read the two elements. */ res = tool_config_file_readElementFromTokens(tokens, index, ele, 2, lineId, error); if (!res) return FALSE; /* Read the two distances. */ res = tool_config_file_readFloatFromTokens(tokens, index, minMax, 2, lineId, error); if (!res) return FALSE; /* Check the values. */ res = FALSE; res = res || tool_config_file_clampFloat(&minMax[0], minMax[0], 0., -1.); res = res || tool_config_file_clampFloat(&minMax[1], minMax[1], 0., -1.); if (res) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d, given distance" " are out of bounds (should be positive).\n"), lineId); return FALSE; } /* Set the values. */ *data = visu_pair_link_new(ele[0], ele[1], minMax); g_return_val_if_fail(*data, FALSE); return TRUE; } static gboolean readPairLink(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { gchar **tokens; int id; gboolean flags[2], res; VisuPairLink *data; float rgb[4]; ToolColor *color; gchar *methodName; VisuPairExtension *method; g_return_val_if_fail(nbLines == 2, FALSE); tokens = g_strsplit_set(lines[0], " \t\n", TOOL_MAX_LINE_LENGTH); id = 0; if (!visu_pair_readLinkFromTokens(tokens, &id, &data, position, error)) { g_strfreev(tokens); return FALSE; } g_strfreev(tokens); /* Read second line with basic data. */ tokens = g_strsplit_set(lines[1], " \t\n", TOOL_MAX_LINE_LENGTH); id = 0; /* Read the color. */ if (!tool_config_file_readFloatFromTokens(tokens, &id, rgb, 3, position, error)) { g_strfreev(tokens); return FALSE; } /* Read the flags drawn and printLength. */ if (!tool_config_file_readBooleanFromTokens(tokens, &id, flags, 2, position, error)) { g_strfreev(tokens); return FALSE; } /* Read the specific method, if any. */ methodName = g_strjoinv(" ", tokens + id); if (methodName && methodName[0]) { method = visu_pair_extension_getByName(methodName); if (!method) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d, the method" " '%s' is unknown.\n"), position + 1, methodName); g_free(methodName); g_strfreev(tokens); return FALSE; } } else method = (VisuPairExtension*)0; if (methodName) g_free(methodName); /* Global free. */ g_strfreev(tokens); /* Check the values. */ res = tool_config_file_clampFloat(&rgb[0], rgb[0], 0., 1.) || tool_config_file_clampFloat(&rgb[1], rgb[1], 0., 1.) || tool_config_file_clampFloat(&rgb[2], rgb[2], 0., 1.); if (res) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d, 3 floating points" "(0 <= v <= 1) must appear after the %s markup.\n"), position, FLAG_RESOURCES_PAIRS_DATA); return FALSE; } /* Set the values. */ rgb[3] = 1.f; color = tool_color_getByValues((int*)0, rgb[0], rgb[1], rgb[2], rgb[3]); if (!color) color = tool_color_addFloatRGBA(rgb, (int*)0); visu_pair_link_setColor(data, color); visu_pair_link_setDrawn(data, flags[0]); visu_pair_link_setPrintLength(data, flags[1]); visu_gl_ext_pairs_setDrawMethod(visu_gl_ext_pairs_getDefault(), data, method); return TRUE; } static void exportLevel1(VisuElement *ele1, VisuElement *ele2, VisuPairLink *data, gpointer user_data) { PairDataProperties *prop; struct _VisuConfigFileForeachFuncExport *str; ToolColor *color; gchar *buf; str = (struct _VisuConfigFileForeachFuncExport*)user_data; /* We export only if the two elements of the pair are used in the given dataObj. */ if (str->dataObj && (!visu_node_array_getElementId(VISU_NODE_ARRAY(str->dataObj), ele1) >= 0 || !visu_node_array_getElementId(VISU_NODE_ARRAY(str->dataObj), ele2) >= 0)) return; color = visu_pair_link_getColor(data); buf = g_strdup_printf("%s %s %4.3f %4.3f", visu_element_getName(ele1), visu_element_getName(ele2), visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MIN), visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MAX)); prop = (PairDataProperties*)g_hash_table_lookup(visu_gl_ext_pairs_getDefault()->priv->pairData, (gpointer)data); visu_config_file_exportEntry(str->data, FLAG_RESOURCES_PAIR_LINK, buf, "%4.3f %4.3f %4.3f %d %d %s", color->rgba[0], color->rgba[1], color->rgba[2], visu_pair_link_getDrawn(data), visu_pair_link_getPrintLength(data), (prop && prop->ext)?prop->ext->name: defaultPairMethod->name); g_free(buf); } static void exportResourcesPairs(GString *data, VisuData *dataObj, VisuGlView *view _U_) { struct _VisuConfigFileForeachFuncExport str; GList *pairsMeth; GString *buf; visu_config_file_exportComment(data, DESC_RESOURCES_PAIRS); visu_config_file_exportEntry(data, FLAG_RESOURCES_PAIRS, NULL, "%i", (defaultPairs)?visu_gl_ext_getActive(VISU_GL_EXT(defaultPairs)):pairsAreOn); if (defaultPairMethod) { buf = g_string_new(""); g_string_append_printf(buf, "%s (", DESC_RESOURCES_FAV_PAIRS); for (pairsMeth = availableVisuPairExtensions; pairsMeth; pairsMeth = g_list_next(pairsMeth)) { g_string_append_printf(buf, "'%s'", ((VisuPairExtension*)pairsMeth->data)->name); if (pairsMeth->next) g_string_append_printf(buf, ", "); } g_string_append_printf(buf, ")"); visu_config_file_exportComment(data, buf->str); g_string_free(buf, TRUE); visu_config_file_exportEntry(data, FLAG_RESOURCES_FAV_PAIRS, NULL, "%s", defaultPairMethod->name); } visu_config_file_exportComment(data, DESC1_RESOURCES_PAIR_LINK); visu_config_file_exportComment(data, DESC2_RESOURCES_PAIR_LINK); str.data = data; str.dataObj = dataObj; visu_pair_foreach(exportLevel1, (gpointer)&str); visu_config_file_exportComment(data, ""); } /*****************************************/ /* Methods to organize pairs extensions. */ /*****************************************/ /** * visu_pair_extension_get_type: * * Create and retrieve a #GType for a #VisuPairExtension object. * * Since: 3.7 * * Returns: a new type for #VisuPairExtension structures. */ GType visu_pair_extension_get_type(void) { static GType g_define_type_id = 0; if (g_define_type_id == 0) g_define_type_id = g_boxed_type_register_static("VisuPairExtension", (GBoxedCopyFunc)visu_pair_extension_ref, (GBoxedFreeFunc)visu_pair_extension_unref); return g_define_type_id; } /** * visu_pair_extension_new: * @name: name of the extension (must be non null) ; * @printName: a string to label the method that can be safely translated ; * @description: a brief description of the extension (can be null) ; * @sensitive: a boolean 0 or 1 ; * @meth: a set of drawing methods. * * This creates a new pairs extension. Such an extension describes how to draw * links (called pairs) between elements. The @sensitive argument is to inform if * pairs must be redrawn when the OpenGL engine sends the OpenGLFacetteChanged signal. * * Returns: the new VisuPairExtension or null if something wrong happens. */ VisuPairExtension* visu_pair_extension_new(const char* name, const char* printName, const char* description, gboolean sensitive, const VisuPairDrawFuncs *meth) { VisuPairExtension *extension; g_return_val_if_fail(meth->main && name, (VisuPairExtension*)0); DBG_fprintf(stderr, "Visu Pairs: registering a new pairs extension ... "); extension = g_malloc(sizeof(VisuPairExtension)); extension->refCount = 1; extension->name = g_strdup(name); extension->printName = g_strdup(printName); extension->description = g_strdup(description); extension->sensitiveToFacette = sensitive; extension->draw = *meth; availableVisuPairExtensions = g_list_append(availableVisuPairExtensions, (gpointer)extension); DBG_fprintf(stderr, "'%s' (%p).\n", extension->name, (gpointer)extension); return extension; } /** * visu_pair_extension_ref: * @ext: a #VisuPairExtension object. * * Increase the ref counter. * * Since: 3.7 * * Returns: itself. **/ VisuPairExtension* visu_pair_extension_ref(VisuPairExtension *ext) { ext->refCount += 1; return ext; } /** * visu_pair_extension_unref: * @ext: a #VisuPairExtension object. * * Decrease the ref counter, free all memory if counter reachs zero. * * Since: 3.7 **/ void visu_pair_extension_unref(VisuPairExtension *ext) { ext->refCount -= 1; if (!ext->refCount) visu_pair_extension_free(ext); } /** * visu_pair_extension_free: * @extension: the extension to delete. * * Free all the allocated attributes of the specified method. */ void visu_pair_extension_free(VisuPairExtension* extension) { if (!extension) return; if (extension->name) g_free(extension->name); if (extension->printName) g_free(extension->printName); if (extension->description) g_free(extension->description); availableVisuPairExtensions = g_list_remove(availableVisuPairExtensions, (gpointer)extension); g_free(extension); } /** * visu_pair_extension_setDefault: * @extension: a #VisuPairExtension object. * * Choose the method used to draw pairs. * * Returns: TRUE if pairs should be rebuilt. */ gboolean visu_pair_extension_setDefault(VisuPairExtension *extension) { DBG_fprintf(stderr, "Visu Pairs: set pairs drawing method to '%s'" " (previous '%s').\n", extension->name, defaultPairMethod->name); if (extension == defaultPairMethod) return FALSE; if (defaultPairMethod && defaultPairMethod->sensitiveToFacette) sensitiveToFacette -= 1; defaultPairMethod = extension; if (defaultPairMethod && defaultPairMethod->sensitiveToFacette) sensitiveToFacette += 1; return TRUE; } /** * visu_pair_extension_getDefault: * * If some process need to know the current #VisuPairExtension. Such extension has * been set with setPairsMethod(). * * Returns: the current #VisuPairExtension, NULL if none has been set. */ VisuPairExtension* visu_pair_extension_getDefault() { return defaultPairMethod; } /** * visu_pair_extension_getAllMethods: * * Useful to know all #VisuPairExtension. * * Returns: (element-type VisuPairExtension*) (transfer none): a list * of all the known #VisuPairExtension. This list should be considered * read-only. */ GList* visu_pair_extension_getAllMethods() { return availableVisuPairExtensions; } /** * visu_pair_extension_getByName: * @name: a method name (untranslated). * * Useful to know a #VisuPairExtension when knowing its name. * * Returns: a #VisuPairExtension, or NULL if not any matchs. * * Since: 3.6 */ VisuPairExtension* visu_pair_extension_getByName(const gchar *name) { GList *pairsMethods; gchar *name_; name_ = g_strstrip(g_strdup(name)); pairsMethods = availableVisuPairExtensions; while (pairsMethods && g_ascii_strcasecmp(((VisuPairExtension*)pairsMethods->data)->name, name_)) pairsMethods = g_list_next(pairsMethods); g_free(name_); return (pairsMethods)?(VisuPairExtension*)pairsMethods->data:(VisuPairExtension*)0; } /** * visu_pair_extension_getName: * @extension: a #VisuPairExtension object ; * @UTF8: if name is provided for UI or not. * * A #VisuPairExtension has an internal name and a translated name for UI. * * Since: 3.7 * * Returns: a private label identifying this @extension. **/ const gchar* visu_pair_extension_getName(VisuPairExtension *extension, gboolean UTF8) { g_return_val_if_fail(extension, (const gchar*)0); if (UTF8) return extension->printName; else return extension->name; } /* OBSOLETE function, kept for backward compatibility. */ static gboolean readPairsData(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { VisuElement* ele[2]; int res, token; float rgb[4]; float minMax[2]; VisuPairLink *data; gchar **tokens; ToolColor *color; /* Tokenize the line of values. */ tokens = g_strsplit_set(g_strchug(lines[0]), " \n", TOOL_MAX_LINE_LENGTH); token = 0; /* Get the two elements. */ if (!tool_config_file_readElementFromTokens(tokens, &token, ele, 2, nbLines, error)) { g_strfreev(tokens); return FALSE; } /* Read 5 floats. */ if (!tool_config_file_readFloatFromTokens(tokens, &token, minMax, 2, nbLines, error)) { g_strfreev(tokens); return FALSE; } if (!tool_config_file_readFloatFromTokens(tokens, &token, rgb, 3, nbLines, error)) { g_strfreev(tokens); return FALSE; } g_strfreev(tokens); res = tool_config_file_clampFloat(&rgb[0], rgb[0], 0., 1.) || tool_config_file_clampFloat(&rgb[1], rgb[1], 0., 1.) || tool_config_file_clampFloat(&rgb[2], rgb[2], 0., 1.) || tool_config_file_clampFloat(&minMax[0], minMax[0], 0., -1.) || tool_config_file_clampFloat(&minMax[1], minMax[1], 0., -1.); if (res) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d, 5 floating points" " must appear after the %s markup.\n"), position, FLAG_RESOURCES_PAIRS_DATA); return FALSE; } data = visu_pair_link_new(ele[0], ele[1], minMax); g_return_val_if_fail(data, FALSE); rgb[3] = 1.f; color = tool_color_getByValues((int*)0, rgb[0], rgb[1], rgb[2], rgb[3]); if (!color) color = tool_color_addFloatRGBA(rgb, (int*)0); visu_pair_link_setColor(data, color); return TRUE; } v_sim-3.7.0/src/extensions/pairs.h0000644000353400050620000002042312215546077014050 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2009) Adresse mèl : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2009) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at COPYING. */ #ifndef PAIRS_H #define PAIRS_H #include #include #include #include #include #include G_BEGIN_DECLS typedef struct _VisuPairExtension VisuPairExtension; /** * VISU_TYPE_GL_EXT_PAIRS: * * return the type of #VisuGlExtPairs. * * Since: 3.7 */ #define VISU_TYPE_GL_EXT_PAIRS (visu_gl_ext_pairs_get_type ()) /** * VISU_GL_EXT_PAIRS: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuGlExtPairs type. * * Since: 3.7 */ #define VISU_GL_EXT_PAIRS(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_GL_EXT_PAIRS, VisuGlExtPairs)) /** * VISU_GL_EXT_PAIRS_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuGlExtPairsClass. * * Since: 3.7 */ #define VISU_GL_EXT_PAIRS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_GL_EXT_PAIRS, VisuGlExtPairsClass)) /** * VISU_IS_GL_EXT_PAIRS: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuGlExtPairs object. * * Since: 3.7 */ #define VISU_IS_GL_EXT_PAIRS(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_GL_EXT_PAIRS)) /** * VISU_IS_GL_EXT_PAIRS_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuGlExtPairsClass class. * * Since: 3.7 */ #define VISU_IS_GL_EXT_PAIRS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_GL_EXT_PAIRS)) /** * VISU_GL_EXT_PAIRS_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. * * Since: 3.7 */ #define VISU_GL_EXT_PAIRS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_GL_EXT_PAIRS, VisuGlExtPairsClass)) typedef struct _VisuGlExtPairs VisuGlExtPairs; typedef struct _VisuGlExtPairsPrivate VisuGlExtPairsPrivate; typedef struct _VisuGlExtPairsClass VisuGlExtPairsClass; struct _VisuGlExtPairs { VisuGlExt parent; VisuGlExtPairsPrivate *priv; }; struct _VisuGlExtPairsClass { VisuGlExtClass parent; }; /** * visu_gl_ext_pairs_get_type: * * This method returns the type of #VisuGlExtPairs, use * VISU_TYPE_GL_EXT_PAIRS instead. * * Since: 3.7 * * Returns: the type of #VisuGlExtPairs. */ GType visu_gl_ext_pairs_get_type(void); /** * VISU_GL_EXT_PAIRS_ID: * * The id used to identify this extension, see * visu_gl_ext_rebuild() for instance. */ #define VISU_GL_EXT_PAIRS_ID "Pairs" VisuGlExtPairs* visu_gl_ext_pairs_new(const gchar *name); VisuGlExtPairs* visu_gl_ext_pairs_getDefault(); gboolean visu_gl_ext_pairs_setData(VisuGlExtPairs *pairs, VisuGlView *view, VisuData *data); gboolean visu_gl_ext_pairs_setDrawMethod(VisuGlExtPairs *pairs, VisuPairLink *data, VisuPairExtension *ext); guint visu_gl_ext_pairs_getNDrawn(VisuGlExtPairs *pairs, VisuPairLink *data); gboolean visu_gl_ext_pairs_getDrawnPair(VisuGlExtPairs *pairs, VisuPairLink *data, guint *node1, guint *node2, guint id); VisuPairExtension* visu_gl_ext_pairs_getDrawMethod(VisuGlExtPairs *pairs, VisuPairLink *data); void visu_gl_ext_pairs_draw(VisuGlExtPairs *pairs); /** * VisuPairDrawFuncs: * @start: a method called before drawing a family of #VisuPairLink. * @stop: a method called after drawing a family of #VisuPairLink. * @main: a method used to draw each link of a #VisuPairLink. * * Drawing method for a #VisuPairLink. */ typedef struct _VisuPairDrawFuncs VisuPairDrawFuncs; struct _VisuPairDrawFuncs { /** * start: * @ele1: a #VisuElement object ; * @ele2: a #VisuElement object ; * @data: a #VisuPairLink object. * @view: a #VisuGlView object, giving some constants describing * the OpenGL scene ; * * Prototype of functions called at the beginning and * the end of drawing of each pairs types. @ele1 and @ele2 * arguments are the two elements between the pair defined by @data is drawn. * This is useful to set some OpenGL definition specific to each pair, such * as the color for example. */ void (*start)(VisuElement *ele1, VisuElement *ele2, VisuPairLink *data, VisuGlView *view); /** * stop: * @ele1: a #VisuElement object ; * @ele2: a #VisuElement object ; * @data: a #VisuPairLink object. * @view: a #VisuGlView object, giving some constants describing * the OpenGL scene ; * * Prototype of functions called at the beginning and * the end of drawing of each pairs types. @ele1 and @ele2 * arguments are the two elements between the pair defined by @data is drawn. * This is useful to set some OpenGL definition specific to each pair, such * as the color for example. */ void (*stop)(VisuElement *ele1, VisuElement *ele2, VisuPairLink *data, VisuGlView *view); /** * main: * @ele1: a #VisuElement object ; * @ele2: a #VisuElement object ; * @data: a #VisuPairLink object ; * @view: a #VisuGlView object, giving some constants describing * the OpenGL scene ; * @x1: a floating point value ; * @y1: a floating point value ; * @z1: a floating point value ; * @x2: a floating point value ; * @y2: a floating point value ; * @z2: a floating point value ; * @d2: a floating point value ; * @alpha: a floating point value. * * Prototype of function to draw a pair. Such function are called each time a pair * is drawn between the two points (@x1, @y1, @z1) and (@x2, @y2, @z2). The @d2 argument * is the square distance between the two points. The @alpha argument * is a proposed alpha colour from the main program, its value is in [0;1]. */ void (*main)(VisuElement *ele1, VisuElement *ele2, VisuPairLink *data, VisuGlView *view, double x1, double y1, double z1, double x2, double y2, double z2, float d2, float alpha); }; #define VISU_TYPE_PAIR_EXTENSION (visu_pair_extension_get_type()) GType visu_pair_extension_get_type(void); VisuPairExtension* visu_pair_extension_new(const char* name, const char* printName, const char* description, gboolean sensitive, const VisuPairDrawFuncs *meth); VisuPairExtension* visu_pair_extension_ref(VisuPairExtension *ext); VisuPairExtension* visu_pair_extension_getByName(const gchar *name); void visu_pair_extension_unref(VisuPairExtension *ext); void visu_pair_extension_free(VisuPairExtension* extension); gboolean visu_pair_extension_setDefault(VisuPairExtension *extension); GList* visu_pair_extension_getAllMethods(); const gchar* visu_pair_extension_getName(VisuPairExtension *extension, gboolean UTF8); VisuPairExtension* visu_pair_extension_getDefault(); G_END_DECLS #endif v_sim-3.7.0/src/extensions/shade.c0000644000353400050620000003142512215546077014015 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2009) Adresse mèl : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2009) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at COPYING. */ #include "shade.h" #include #include #include #include #include /** * SECTION:shade * @short_description: Draw a frame with the representation of a color shade. * * This extension draws a frame on top of the rendering area * with a color shade. One can setup printed values and draw * additional marks inside the shade. * * Since: 3.7 */ #define SHADE_LEGEND_N_QUADS 50 /** * VisuGlExtShadeClass: * @parent: the parent class; * * A short way to identify #_VisuGlExtShadeClass structure. * * Since: 3.7 */ /** * VisuGlExtShade: * * An opaque structure. * * Since: 3.7 */ /** * VisuGlExtShadePrivate: * * Private fields for #VisuGlExtShade objects. * * Since: 3.7 */ struct _VisuGlExtShadePrivate { gboolean dispose_has_run; /* Shade definition. */ ToolShade *shade; /* Parameters. */ float minMax[2]; ToolMatrixScalingFlag scaling; GArray *marks; }; static void visu_gl_ext_shade_finalize(GObject* obj); static void visu_gl_ext_shade_dispose(GObject* obj); static void visu_gl_ext_shade_draw(VisuGlExtFrame *frame); static void visu_gl_ext_shade_rebuild(VisuGlExt *ext); G_DEFINE_TYPE(VisuGlExtShade, visu_gl_ext_shade, VISU_TYPE_GL_EXT_FRAME) static void visu_gl_ext_shade_class_init(VisuGlExtShadeClass *klass) { DBG_fprintf(stderr, "Extension Shade: creating the class of the object.\n"); /* DBG_fprintf(stderr, " - adding new signals ;\n"); */ /* DBG_fprintf(stderr, " - adding new resources ;\n"); */ /* Connect the overloading methods. */ G_OBJECT_CLASS(klass)->dispose = visu_gl_ext_shade_dispose; G_OBJECT_CLASS(klass)->finalize = visu_gl_ext_shade_finalize; VISU_GL_EXT_CLASS(klass)->rebuild = visu_gl_ext_shade_rebuild; VISU_GL_EXT_FRAME_CLASS(klass)->draw = visu_gl_ext_shade_draw; } static void visu_gl_ext_shade_init(VisuGlExtShade *obj) { DBG_fprintf(stderr, "Extension Shade: initializing a new object (%p).\n", (gpointer)obj); obj->priv = g_malloc(sizeof(VisuGlExtShadePrivate)); obj->priv->dispose_has_run = FALSE; /* Private data. */ obj->priv->marks = g_array_new(FALSE, FALSE, sizeof(float)); obj->priv->scaling = TOOL_MATRIX_SCALING_LINEAR; obj->priv->minMax[0] = 0.f; obj->priv->minMax[1] = 1.f; obj->priv->shade = (ToolShade*)0; } /* This method can be called several times. It should unref all of its reference to GObjects. */ static void visu_gl_ext_shade_dispose(GObject* obj) { VisuGlExtShade *shade; DBG_fprintf(stderr, "Extension Shade: dispose object %p.\n", (gpointer)obj); shade = VISU_GL_EXT_SHADE(obj); if (shade->priv->dispose_has_run) return; shade->priv->dispose_has_run = TRUE; /* Disconnect signals. */ visu_gl_ext_shade_setShade(shade, (ToolShade*)0); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_gl_ext_shade_parent_class)->dispose(obj); } /* This method is called once only. */ static void visu_gl_ext_shade_finalize(GObject* obj) { VisuGlExtShade *shade; g_return_if_fail(obj); DBG_fprintf(stderr, "Extension Shade: finalize object %p.\n", (gpointer)obj); shade = VISU_GL_EXT_SHADE(obj); /* Free privs elements. */ if (shade->priv) { DBG_fprintf(stderr, "Extension Shade: free private shade.\n"); g_array_unref(shade->priv->marks); g_free(shade->priv); } /* Chain up to the parent class */ DBG_fprintf(stderr, "Extension Shade: chain to parent.\n"); G_OBJECT_CLASS(visu_gl_ext_shade_parent_class)->finalize(obj); DBG_fprintf(stderr, "Extension Shade: freeing ... OK.\n"); } /** * visu_gl_ext_shade_new: * @name: (allow-none): the name to give to the extension (default is #VISU_GL_EXT_SHADE_ID). * * Creates a new #VisuGlExt to draw a shade. * * Since: 3.7 * * Returns: a pointer to the #VisuGlExt it created or * NULL otherwise. */ VisuGlExtShade* visu_gl_ext_shade_new(const gchar *name) { char *name_ = VISU_GL_EXT_SHADE_ID; char *description = _("Draw the legend of a color shade."); VisuGlExt *shade; #define SHADE_LEGEND_WIDTH 20.f #define SHADE_LEGEND_HEIGHT 175.f DBG_fprintf(stderr,"Extension Shade: new object.\n"); shade = g_object_new(VISU_TYPE_GL_EXT_SHADE, "name", (name)?name:name_, "label", _(name), "description", description, "nGlObj", 1, NULL); visu_gl_ext_setSaveState(shade, TRUE); visu_gl_ext_setPriority(shade, VISU_GL_EXT_PRIORITY_LAST); visu_gl_ext_frame_setPosition(VISU_GL_EXT_FRAME(shade), 0.f, 0.f); visu_gl_ext_frame_setRequisition(VISU_GL_EXT_FRAME(shade), SHADE_LEGEND_WIDTH + 5 + 12 * 7, SHADE_LEGEND_HEIGHT); return VISU_GL_EXT_SHADE(shade); } /** * visu_gl_ext_shade_setShade: * @ext: The #VisuGlExtShade to attached to. * @shade: the shade to get the color of. * * Attach an #VisuGlView to render to and setup the shade. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_frame_draw() should be called and * then 'OpenGLAskForReDraw' signal be emitted. **/ gboolean visu_gl_ext_shade_setShade(VisuGlExtShade *ext, ToolShade *shade) { g_return_val_if_fail(VISU_IS_GL_EXT_SHADE(ext), FALSE); tool_shade_free(ext->priv->shade); ext->priv->shade = tool_shade_copy(shade); VISU_GL_EXT_FRAME(ext)->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(ext)); } /** * visu_gl_ext_shade_setMinMax: * @shade: the #VisuGlExtShade to update. * @minV: a value. * @maxV: another value. * * Change the minimum and maximum values used on the legend. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_frame_draw() should be called. **/ gboolean visu_gl_ext_shade_setMinMax(VisuGlExtShade *shade, float minV, float maxV) { g_return_val_if_fail(VISU_IS_GL_EXT_SHADE(shade), FALSE); if (shade->priv->minMax[0] == minV && shade->priv->minMax[1] == maxV) return FALSE; shade->priv->minMax[0] = minV; shade->priv->minMax[1] = maxV; VISU_GL_EXT_FRAME(shade)->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(shade)); } /** * visu_gl_ext_shade_setScaling: * @shade: the #VisuGlExtShade to update. * @scaling: a #ToolMatrixScalingFlag value. * * Change the scaling variation of the shade between the minimum and * the maximum values, see visu_gl_ext_shade_setMinMax(). * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_frame_draw() should be called. **/ gboolean visu_gl_ext_shade_setScaling(VisuGlExtShade *shade, ToolMatrixScalingFlag scaling) { g_return_val_if_fail(VISU_IS_GL_EXT_SHADE(shade), FALSE); if (shade->priv->scaling == scaling) return FALSE; shade->priv->scaling = scaling; VISU_GL_EXT_FRAME(shade)->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(shade)); } /** * visu_gl_ext_shade_setMarks: * @shade: the #VisuGlExtShade to update. * @marks: (array length=n): a list of float values in [0;1]. * @n: the length of @marks. * * The legend can draw additional marks in the shade. Setup these * marks with this routine. The first and the last marks of the list will be * rendered bigger than the next ones. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_frame_draw() should be called. **/ gboolean visu_gl_ext_shade_setMarks(VisuGlExtShade *shade, float *marks, guint n) { g_return_val_if_fail(VISU_IS_GL_EXT_SHADE(shade), FALSE); g_array_set_size(shade->priv->marks, n); memcpy(shade->priv->marks->data, marks, sizeof(float) * n); VISU_GL_EXT_FRAME(shade)->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(shade)); } static void visu_gl_ext_shade_rebuild(VisuGlExt *ext) { visu_gl_text_rebuildFontList(); VISU_GL_EXT_FRAME(ext)->isBuilt = FALSE; visu_gl_ext_frame_draw(VISU_GL_EXT_FRAME(ext)); } static void visu_gl_ext_shade_draw(VisuGlExtFrame *frame) { guint i; float yStep, xbuf, scale, sW; float rgba[4]; char value[16]; tool_matrix_getScaledValue get_inv; double minmax[2]; VisuGlExtShade *shade; g_return_if_fail(VISU_IS_GL_EXT_SHADE(frame)); shade = VISU_GL_EXT_SHADE(frame); scale = visu_gl_ext_frame_getScale(frame); sW = SHADE_LEGEND_WIDTH * scale; /* We draw the colored bar. */ tool_shade_valueToRGB(shade->priv->shade, rgba, 0.); glColor4fv(rgba); yStep = (float)frame->height / (float)SHADE_LEGEND_N_QUADS; glBegin(GL_QUAD_STRIP); for (i = 0; i <= SHADE_LEGEND_N_QUADS; i++) { glVertex2f(0, (float)i * yStep); glVertex2f(sW, (float)i * yStep); tool_shade_valueToRGB(shade->priv->shade, rgba, (float)i / (float)SHADE_LEGEND_N_QUADS); glColor4fv(rgba); } glEnd(); switch (shade->priv->scaling) { case TOOL_MATRIX_SCALING_LINEAR: get_inv = tool_matrix_getScaledLinearInv; break; case TOOL_MATRIX_SCALING_LOG: get_inv = tool_matrix_getScaledLogInv; break; case TOOL_MATRIX_SCALING_ZERO_CENTRED_LOG: get_inv = tool_matrix_getScaledZeroCentredLogInv; break; default: get_inv = (tool_matrix_getScaledValue)0; break; } g_return_if_fail(get_inv); glDisable(GL_LINE_SMOOTH); /* We draw some marks. */ if (shade->priv->marks) { xbuf = 0.f; for (i = 0; i < shade->priv->marks->len; i++) { if (i == 0 || i == shade->priv->marks->len - 1) { glLineWidth(2 * scale); xbuf = 3.f; } else if (i == 1) { glLineWidth(scale); xbuf = 8.f; } yStep = CLAMP(g_array_index(shade->priv->marks, float, i), 0., 1.); tool_shade_valueToRGB(shade->priv->shade, rgba, yStep); rgba[0] = 1. - rgba[0]; rgba[1] = 1. - rgba[1]; rgba[2] = 1. - rgba[2]; glColor4fv(rgba); yStep *= (float)frame->height; yStep = CLAMP(yStep, 2.f * scale, frame->height - scale); glBegin(GL_LINES); glVertex2f(xbuf, yStep); glVertex2f(sW - xbuf, yStep); glEnd(); } } glColor3fv(frame->fontRGB); glLineWidth(scale); /* We draw the frame around. */ DBG_fprintf(stderr, "Visu GlExt Frame: frame actual size is %dx%d.\n", frame->width, frame->height); glBegin(GL_LINE_STRIP); glVertex2i(0, 0); glVertex2i(sW, 0); glVertex2i(sW, frame->height); glVertex2i(0, frame->height); glVertex2i(0, 0); glEnd(); /* We draw the tics. */ glBegin(GL_LINES); glVertex2i(sW , 0); glVertex2i(sW + 3, 0); glVertex2i(sW , frame->height / 3); glVertex2i(sW + 3, frame->height / 3); glVertex2i(sW , 2 * frame->height / 3); glVertex2i(sW + 3, 2 * frame->height / 3); glVertex2i(sW , frame->height); glVertex2i(sW + 3, frame->height); glEnd(); /* We print the labels. */ minmax[0] = shade->priv->minMax[0]; minmax[1] = shade->priv->minMax[1]; sprintf(value, "%.3g", get_inv(0., minmax)); glRasterPos2i(sW + 5, 0); visu_gl_text_drawChars(value, VISU_GL_TEXT_NORMAL); sprintf(value, "%.3g", get_inv(0.33333, minmax)); glRasterPos2i(sW + 5, frame->height / 3 - 5); visu_gl_text_drawChars(value, VISU_GL_TEXT_NORMAL); sprintf(value, "%.3g", get_inv(0.66667, minmax)); glRasterPos2i(sW + 5, 2 * frame->height / 3 - 5); visu_gl_text_drawChars(value, VISU_GL_TEXT_NORMAL); sprintf(value, "%.3g", get_inv(1., minmax)); glRasterPos2i(sW + 5, frame->height - 10); visu_gl_text_drawChars(value, VISU_GL_TEXT_NORMAL); } v_sim-3.7.0/src/extensions/shade.h0000644000353400050620000001037512215546077014023 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2009) Adresse mèl : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2009) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at COPYING. */ #ifndef SHADE_H #define SHADE_H #include "frame.h" #include #include #include /** * VISU_TYPE_GL_EXT_SHADE: * * return the type of #VisuGlExtShade. * * Since: 3.7 */ #define VISU_TYPE_GL_EXT_SHADE (visu_gl_ext_shade_get_type ()) /** * VISU_GL_EXT_SHADE: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuGlExtShade type. * * Since: 3.7 */ #define VISU_GL_EXT_SHADE(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_GL_EXT_SHADE, VisuGlExtShade)) /** * VISU_GL_EXT_SHADE_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuGlExtShadeClass. * * Since: 3.7 */ #define VISU_GL_EXT_SHADE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_GL_EXT_SHADE, VisuGlExtShadeClass)) /** * VISU_IS_GL_EXT_SHADE: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuGlExtShade object. * * Since: 3.7 */ #define VISU_IS_GL_EXT_SHADE(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_GL_EXT_SHADE)) /** * VISU_IS_GL_EXT_SHADE_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuGlExtShadeClass class. * * Since: 3.7 */ #define VISU_IS_GL_EXT_SHADE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_GL_EXT_SHADE)) /** * VISU_GL_EXT_SHADE_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. * * Since: 3.7 */ #define VISU_GL_EXT_SHADE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_GL_EXT_SHADE, VisuGlExtShadeClass)) typedef struct _VisuGlExtShade VisuGlExtShade; typedef struct _VisuGlExtShadePrivate VisuGlExtShadePrivate; typedef struct _VisuGlExtShadeClass VisuGlExtShadeClass; struct _VisuGlExtShade { VisuGlExtFrame parent; VisuGlExtShadePrivate *priv; }; struct _VisuGlExtShadeClass { VisuGlExtFrameClass parent; }; /** * visu_gl_ext_shade_get_type: * * This method returns the type of #VisuGlExtShade, use * VISU_TYPE_GL_EXT_SHADE instead. * * Since: 3.7 * * Returns: the type of #VisuGlExtShade. */ GType visu_gl_ext_shade_get_type(void); /** * VISU_GL_EXT_SHADE_ID: * * The id used to identify this extension, see * visu_gl_ext_rebuild() for instance. */ #define VISU_GL_EXT_SHADE_ID "Shade" VisuGlExtShade* visu_gl_ext_shade_new(const gchar *name); gboolean visu_gl_ext_shade_setShade(VisuGlExtShade *ext, ToolShade *shade); gboolean visu_gl_ext_shade_setMinMax(VisuGlExtShade *shade, float minV, float maxV); gboolean visu_gl_ext_shade_setScaling(VisuGlExtShade *shade, ToolMatrixScalingFlag scaling); gboolean visu_gl_ext_shade_setMarks(VisuGlExtShade *shade, float *marks, guint n); #endif v_sim-3.7.0/src/extensions/frame.c0000644000353400050620000004216412215546077014025 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2013) Adresse mèl : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2013) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at COPYING. */ #include "frame.h" #include #include #include #include /** * SECTION:frame * @short_description: Draw a frame with the representation of a color frame. * * This extension draws a frame on top of the rendering area * with a color frame. One can setup printed values and draw * additional marks inside the frame. * * Since: 3.7 */ /** * VisuGlExtFrameClass: * @parent: the parent class; * @draw: the draw method for the content of this frame. * * A short way to identify #_VisuGlExtFrameClass structure. * * Since: 3.7 */ /** * VisuGlExtFrame: * * An opaque structure. * * Since: 3.7 */ /** * VisuGlExtFramePrivate: * * Private fields for #VisuGlExtFrame objects. * * Since: 3.7 */ struct _VisuGlExtFramePrivate { gboolean dispose_has_run; /* Rendering parameters. */ guint requisition[2]; float scale; float xpos, ypos, xmargin, ymargin, xpad, ypad; float bgRGBA[4]; gchar *title; /* Object dependencies. */ VisuGlView *view; gulong widthHeight_signal; }; static int refMask[4] = {TOOL_COLOR_MASK_R, TOOL_COLOR_MASK_G, TOOL_COLOR_MASK_B, TOOL_COLOR_MASK_A}; static float bgRGBADefault[4] = {1.f, 1.f, 1.f, 0.4f}; static float fontRGBDefault[4] = {0.f, 0.f, 0.f}; static float xmarginDefault = 10.f, ymarginDefault = 10.f; static float xpadDefault = 5.f, ypadDefault = 5.f; static void visu_gl_ext_frame_finalize(GObject* obj); static void visu_gl_ext_frame_dispose(GObject* obj); static void onViewChanged(VisuGlView *view, gpointer data); G_DEFINE_TYPE(VisuGlExtFrame, visu_gl_ext_frame, VISU_TYPE_GL_EXT) static void visu_gl_ext_frame_class_init(VisuGlExtFrameClass *klass) { DBG_fprintf(stderr, "Extension Frame: creating the class of the object.\n"); /* DBG_fprintf(stderr, " - adding new signals ;\n"); */ /* DBG_fprintf(stderr, " - adding new resources ;\n"); */ klass->draw = NULL; /* Connect the overloading methods. */ G_OBJECT_CLASS(klass)->dispose = visu_gl_ext_frame_dispose; G_OBJECT_CLASS(klass)->finalize = visu_gl_ext_frame_finalize; } static void visu_gl_ext_frame_init(VisuGlExtFrame *obj) { DBG_fprintf(stderr, "Extension Frame: initializing a new object (%p).\n", (gpointer)obj); obj->isBuilt = FALSE; obj->width = 0; obj->height = 0; obj->fontRGB[0] = fontRGBDefault[0]; obj->fontRGB[1] = fontRGBDefault[1]; obj->fontRGB[2] = fontRGBDefault[2]; obj->priv = g_malloc(sizeof(VisuGlExtFramePrivate)); obj->priv->dispose_has_run = FALSE; /* Private data. */ obj->priv->requisition[0] = 0; obj->priv->requisition[1] = 0; obj->priv->scale = 1.f; obj->priv->xpos = 0.f; obj->priv->ypos = 0.f; obj->priv->xmargin = xmarginDefault; obj->priv->ymargin = ymarginDefault; obj->priv->xpad = xpadDefault; obj->priv->ypad = ypadDefault; obj->priv->bgRGBA[0] = bgRGBADefault[0]; obj->priv->bgRGBA[1] = bgRGBADefault[1]; obj->priv->bgRGBA[2] = bgRGBADefault[2]; obj->priv->bgRGBA[3] = bgRGBADefault[3]; obj->priv->title = g_strdup(""); obj->priv->view = (VisuGlView*)0; obj->priv->widthHeight_signal = 0; } /* This method can be called several times. It should unref all of its reference to GObjects. */ static void visu_gl_ext_frame_dispose(GObject* obj) { VisuGlExtFrame *frame; DBG_fprintf(stderr, "Extension Frame: dispose object %p.\n", (gpointer)obj); frame = VISU_GL_EXT_FRAME(obj); if (frame->priv->dispose_has_run) return; frame->priv->dispose_has_run = TRUE; /* Disconnect signals. */ visu_gl_ext_frame_setGlView(frame, (VisuGlView*)0); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_gl_ext_frame_parent_class)->dispose(obj); } /* This method is called once only. */ static void visu_gl_ext_frame_finalize(GObject* obj) { VisuGlExtFrame *frame; g_return_if_fail(obj); DBG_fprintf(stderr, "Extension Frame: finalize object %p.\n", (gpointer)obj); frame = VISU_GL_EXT_FRAME(obj); /* Free privs elements. */ if (frame->priv) { DBG_fprintf(stderr, "Extension Frame: free private frame.\n"); g_free(frame->priv->title); g_free(frame->priv); } /* Chain up to the parent class */ DBG_fprintf(stderr, "Extension Frame: chain to parent.\n"); G_OBJECT_CLASS(visu_gl_ext_frame_parent_class)->finalize(obj); DBG_fprintf(stderr, "Extension Frame: freeing ... OK.\n"); } /** * visu_gl_ext_frame_setGlView: * @frame: The #VisuGlExtFrame to attached to. * @view: the nodes to get the population of. * * Attach an #VisuGlView to render to and setup the frame. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_frame_draw() should be called and * then 'OpenGLAskForReDraw' signal be emitted. **/ gboolean visu_gl_ext_frame_setGlView(VisuGlExtFrame *frame, VisuGlView *view) { g_return_val_if_fail(VISU_IS_GL_EXT_FRAME(frame), FALSE); if (frame->priv->view) { g_signal_handler_disconnect(G_OBJECT(frame->priv->view), frame->priv->widthHeight_signal); g_object_unref(frame->priv->view); } if (view) { g_object_ref(view); frame->priv->widthHeight_signal = g_signal_connect(G_OBJECT(view), "WidthHeightChanged", G_CALLBACK(onViewChanged), (gpointer)frame); } else frame->priv->widthHeight_signal = 0; frame->priv->view = view; frame->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(frame)); } /** * visu_gl_ext_frame_setPosition: * @frame: the #VisuGlExtFrame object to modify. * @xpos: the reduced y position (1 to the left). * @ypos: the reduced y position (1 to the bottom). * * Change the position of the frame representation. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_frame_draw() should be called and * then 'OpenGLAskForReDraw' signal be emitted. **/ gboolean visu_gl_ext_frame_setPosition(VisuGlExtFrame *frame, float xpos, float ypos) { g_return_val_if_fail(VISU_IS_GL_EXT_FRAME(frame), FALSE); if (xpos == frame->priv->xpos && ypos == frame->priv->ypos) return FALSE; frame->priv->xpos = CLAMP(xpos, 0.f, 1.f); frame->priv->ypos = CLAMP(ypos, 0.f, 1.f); frame->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(frame)); } #define SET_RGBA_I(S, I, V, M) {if (M & refMask[I] && S[I] != V[I]) \ {S[I] = V[I]; diff = TRUE;}} #define SET_RGBA(S, V, M) {SET_RGBA_I(S, 0, V, M); \ SET_RGBA_I(S, 1, V, M); SET_RGBA_I(S, 2, V, M); SET_RGBA_I(S, 3, V, M); } #define SET_RGB(S, V, M) {SET_RGBA_I(S, 0, V, M); \ SET_RGBA_I(S, 1, V, M); SET_RGBA_I(S, 2, V, M); } /** * visu_gl_ext_frame_setBgRGBA: * @frame: the #VisuGlExtFrame to update. * @rgba: (array fixed-size=4): a four floats array with values (0 <= values <= 1) for the * red, the green, the blue color and the alpha channel. Only values * specified by the @mask are really relevant. * @mask: use #TOOL_COLOR_MASK_R, #TOOL_COLOR_MASK_G, * #TOOL_COLOR_MASK_B, #TOOL_COLOR_MASK_A or a combinaison to indicate * what values in the @rgba array must be taken into account. * * Change the colour to represent the background of the frame. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_frame_draw() should be called. */ gboolean visu_gl_ext_frame_setBgRGBA(VisuGlExtFrame *frame, float rgba[4], int mask) { gboolean diff = FALSE; g_return_val_if_fail(VISU_IS_GL_EXT_FRAME(frame), FALSE); SET_RGBA(frame->priv->bgRGBA, rgba, mask); if (!diff) return FALSE; frame->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(frame)); } /** * visu_gl_ext_frame_setFontRGB: * @frame: the #VisuGlExtFrame to update. * @rgb: (array fixed-size=3): a four floats array with values (0 <= values <= 1) for the * red, the green, the blue color. Only values specified by the @mask * are really relevant. * @mask: use #TOOL_COLOR_MASK_R, #TOOL_COLOR_MASK_G, * #TOOL_COLOR_MASK_B or a combinaison to indicate what values in the * @rgb array must be taken into account. * * Change the colour to represent the font of the frame. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_frame_draw() should be called. */ gboolean visu_gl_ext_frame_setFontRGB(VisuGlExtFrame *frame, float rgb[3], int mask) { gboolean diff = FALSE; g_return_val_if_fail(VISU_IS_GL_EXT_FRAME(frame), FALSE); SET_RGB(frame->fontRGB, rgb, mask); if (!diff) return FALSE; frame->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(frame)); } /** * visu_gl_ext_frame_setScale: * @frame: the #VisuGlExtFrame to update. * @scale: a positive value. * * Change the zoom level for the rendering of the legend. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_frame_draw() should be called. **/ gboolean visu_gl_ext_frame_setScale(VisuGlExtFrame *frame, float scale) { g_return_val_if_fail(VISU_IS_GL_EXT_FRAME(frame), FALSE); if (frame->priv->scale == scale) return FALSE; frame->priv->scale = CLAMP(scale, 0.01f, 10.f); frame->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(frame)); } /** * visu_gl_ext_frame_setTitle: * @frame: the #VisuGlExtFrame object to modify. * @title: a title. * * Change the title of the box legend. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_frame_draw() should be called and * then 'OpenGLAskForReDraw' signal be emitted. **/ gboolean visu_gl_ext_frame_setTitle(VisuGlExtFrame *frame, const gchar *title) { g_return_val_if_fail(VISU_IS_GL_EXT_FRAME(frame) && title, FALSE); if (!strcmp(title, frame->priv->title)) return FALSE; g_free(frame->priv->title); frame->priv->title = g_strdup(title); frame->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(frame)); } /** * visu_gl_ext_frame_setRequisition: * @frame: the #VisuGlExtFrame object to modify. * @width: the desired width. * @height: the desired height. * * Set the size of the frame in pixels. Use * visu_gl_ext_frame_setScale() to adjust the size if necessary. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_frame_draw() should be called and * then 'OpenGLAskForReDraw' signal be emitted. **/ gboolean visu_gl_ext_frame_setRequisition(VisuGlExtFrame *frame, guint width, guint height) { g_return_val_if_fail(VISU_IS_GL_EXT_FRAME(frame), FALSE); if (frame->priv->requisition[0] == width && frame->priv->requisition[1] == height) return FALSE; frame->priv->requisition[0] = width; frame->priv->requisition[1] = height; frame->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(frame)); } /** * visu_gl_ext_frame_getScale: * @frame: a #VisuGlExtFrame object. * * Frames are rendered with a scaling factor of 1. by default. * * Since: 3.7 * * Returns: the scaling factor used to represent frames. **/ float visu_gl_ext_frame_getScale(VisuGlExtFrame *frame) { g_return_val_if_fail(VISU_IS_GL_EXT_FRAME(frame), 1.f); return frame->priv->scale; } /** * visu_gl_ext_frame_getPosition: * @frame: the #VisuGlExtFrame object to inquire. * @xpos: (out) (allow-none): a location to store the x position. * @ypos: (out) (allow-none): a location to store the y position. * * Inquire the position of the representation of the frame. * * Since: 3.7 **/ void visu_gl_ext_frame_getPosition(VisuGlExtFrame *frame, float *xpos, float *ypos) { g_return_if_fail(VISU_IS_GL_EXT_FRAME(frame)); if (xpos) *xpos = frame->priv->xpos; if (ypos) *ypos = frame->priv->ypos; } static void onViewChanged(VisuGlView *view _U_, gpointer data) { VISU_GL_EXT_FRAME(data)->isBuilt = FALSE; visu_gl_ext_frame_draw(VISU_GL_EXT_FRAME(data)); } /** * visu_gl_ext_frame_draw: * @frame: a #VisuGlExtFrame object. * * Render the@frame and its child. * * Since: 3.7 */ void visu_gl_ext_frame_draw(VisuGlExtFrame *frame) { int viewport[4]; float requisition[2]; VisuGlExtFrameClass *klass; int xpos, ypos; g_return_if_fail(VISU_IS_GL_EXT_FRAME(frame)); /* Nothing to draw; */ if(!visu_gl_ext_getActive(VISU_GL_EXT(frame)) || frame->isBuilt) return; DBG_fprintf(stderr, "Visu GlExt Frame: drawing the extension '%p'.\n", (gpointer)frame); visu_gl_text_initFontList(); glNewList(visu_gl_ext_getGlList(VISU_GL_EXT(frame)), GL_COMPILE); /* We get the size of the current viewport. */ glGetIntegerv(GL_VIEWPORT, viewport); DBG_fprintf(stderr, "Visu GlExt Frame: current viewport is %dx%d.\n", viewport[2], viewport[3]); /* We change the viewport. */ DBG_fprintf(stderr, "Visu GlExt Frame: requisition is %dx%d.\n", frame->priv->requisition[0], frame->priv->requisition[1]); requisition[0] = (float)frame->priv->requisition[0]; requisition[1] = (float)frame->priv->requisition[1] + ((frame->priv->title[0])?(frame->priv->ypad + 12.f):0.f); DBG_fprintf(stderr, "Visu GlExt Frame: requisition is %gx%g.\n", requisition[0], requisition[1]); frame->width = MIN((guint)(requisition[0] * frame->priv->scale), viewport[2] - (guint)(2.f * frame->priv->xmargin)); frame->height = MIN((guint)(requisition[1] * frame->priv->scale), viewport[3] - (guint)(2.f * frame->priv->ymargin)); xpos = frame->priv->xmargin + ((float)viewport[2] - 2.f * frame->priv->xmargin - frame->width) * frame->priv->xpos; ypos = frame->priv->ymargin + ((float)viewport[3] - 2.f * frame->priv->ymargin - frame->height) * frame->priv->ypos; glViewport(xpos, ypos, frame->width, frame->height); glDisable(GL_FOG); glDisable(GL_LIGHTING); glDisable(GL_DEPTH_TEST); /* glDisable(GL_ALPHA_TEST); */ glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); /* We change the projection for a 2D one. */ glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(0., (float)frame->width, 0., (float)frame->height, -50., +50.); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); /* We draw a big transparent square to do the back. */ if (frame->priv->bgRGBA[3] > 0.f) { glColor4fv(frame->priv->bgRGBA); glRecti(0, 0, frame->width, frame->height); } /* We draw the title, if any. */ if (frame->priv->title[0]) { glColor3fv(frame->fontRGB); glRasterPos2f(frame->priv->xpad * frame->priv->scale, frame->height - (frame->priv->ypad + 12.) * frame->priv->scale); visu_gl_text_drawChars(frame->priv->title, VISU_GL_TEXT_NORMAL); } /* We change again the viewport to adjust to padding. */ xpos += frame->priv->xpad * frame->priv->scale; ypos += frame->priv->ypad * frame->priv->scale; frame->width -= 2.f * frame->priv->xpad * frame->priv->scale; frame->height -= 2.f * frame->priv->ypad * frame->priv->scale; if (frame->priv->title[0]) frame->height -= (frame->priv->ypad + 12.) * frame->priv->scale; DBG_fprintf(stderr, "Visu GlExt Frame: frame actual size is %dx%d.\n", frame->width, frame->height); glViewport(xpos, ypos, frame->width + frame->priv->scale, frame->height + frame->priv->scale); glPopMatrix(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glPushMatrix(); glLoadIdentity(); glOrtho(0., (float)(frame->width + frame->priv->scale), 0., (float)(frame->height + frame->priv->scale), -50., +50.); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); klass = VISU_GL_EXT_FRAME_GET_CLASS(frame); if (klass->draw) klass->draw(frame); /* We change the projection back. */ glPopMatrix(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); /* We set viewport back. */ DBG_fprintf(stderr, "Visu GlExt Frame: put back viewport at %dx%d.\n", viewport[2], viewport[3]); glViewport(0, 0, viewport[2], viewport[3]); glEndList(); frame->isBuilt = TRUE; } v_sim-3.7.0/src/extensions/frame.h0000644000353400050620000001103612215546077014024 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2009) Adresse ml : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2009) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at COPYING. */ #ifndef FRAME_H #define FRAME_H #include #include #include /** * VISU_TYPE_GL_EXT_FRAME: * * return the type of #VisuGlExtFrame. * * Since: 3.7 */ #define VISU_TYPE_GL_EXT_FRAME (visu_gl_ext_frame_get_type ()) /** * VISU_GL_EXT_FRAME: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuGlExtFrame type. * * Since: 3.7 */ #define VISU_GL_EXT_FRAME(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_GL_EXT_FRAME, VisuGlExtFrame)) /** * VISU_GL_EXT_FRAME_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuGlExtFrameClass. * * Since: 3.7 */ #define VISU_GL_EXT_FRAME_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_GL_EXT_FRAME, VisuGlExtFrameClass)) /** * VISU_IS_GL_EXT_FRAME: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuGlExtFrame object. * * Since: 3.7 */ #define VISU_IS_GL_EXT_FRAME(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_GL_EXT_FRAME)) /** * VISU_IS_GL_EXT_FRAME_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuGlExtFrameClass class. * * Since: 3.7 */ #define VISU_IS_GL_EXT_FRAME_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_GL_EXT_FRAME)) /** * VISU_GL_EXT_FRAME_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. * * Since: 3.7 */ #define VISU_GL_EXT_FRAME_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_GL_EXT_FRAME, VisuGlExtFrameClass)) typedef struct _VisuGlExtFrame VisuGlExtFrame; typedef struct _VisuGlExtFramePrivate VisuGlExtFramePrivate; typedef struct _VisuGlExtFrameClass VisuGlExtFrameClass; struct _VisuGlExtFrame { VisuGlExt parent; gboolean isBuilt; guint width, height; float fontRGB[3]; VisuGlExtFramePrivate *priv; }; struct _VisuGlExtFrameClass { VisuGlExtClass parent; void (*draw) (VisuGlExtFrame* frame); }; /** * visu_gl_ext_frame_get_type: * * This method returns the type of #VisuGlExtFrame, use * VISU_TYPE_GL_EXT_FRAME instead. * * Since: 3.7 * * Returns: the type of #VisuGlExtFrame. */ GType visu_gl_ext_frame_get_type(void); gboolean visu_gl_ext_frame_setGlView(VisuGlExtFrame *frame, VisuGlView *view); gboolean visu_gl_ext_frame_setPosition(VisuGlExtFrame *frame, float xpos, float ypos); gboolean visu_gl_ext_frame_setBgRGBA(VisuGlExtFrame *frame, float rgba[4], int mask); gboolean visu_gl_ext_frame_setFontRGB(VisuGlExtFrame *frame, float rgb[3], int mask); gboolean visu_gl_ext_frame_setScale(VisuGlExtFrame *frame, float scale); gboolean visu_gl_ext_frame_setTitle(VisuGlExtFrame *frame, const gchar *title); gboolean visu_gl_ext_frame_setRequisition(VisuGlExtFrame *frame, guint width, guint height); void visu_gl_ext_frame_getPosition(VisuGlExtFrame *frame, float *xpos, float *ypos); float visu_gl_ext_frame_getScale(VisuGlExtFrame *frame); void visu_gl_ext_frame_draw(VisuGlExtFrame *frame); #endif v_sim-3.7.0/src/extensions/node_vectors.c0000644000353400050620000011114212215546077015416 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2011-2011) Adresse mèl : BILLARD, non joignable par mèl ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2011-2011) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "node_vectors.h" #include #include #include #include #include #include #include #include #include #define FLAG_RESOURCE_ARROW "nodeDisplacement_arrow" #define DESC_RESOURCE_ARROW "Describe the arrow to be drawn ; four floats (tail lg. tail rd. head lg. head rd., negative values means auto)" static gboolean readArrow(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); #define FLAG_RESOURCE_RATIO_MIN "nodeDisplacement_minThreshold" #define DESC_RESOURCE_RATIO_MIN "Choose the minimum value for drawn arrows in geometry differences ; float (ratio threshold if between -1 and 0)" #define DEFT_RESOURCE_RATIO_MIN -0.1f static gboolean readRatioMin(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); #define FLAG_RESOURCE_RATIO_STR "nodeDisplacement_lblThreshold" #define DESC_RESOURCE_RATIO_STR "Choose the minimum value for labels in geometry differences ; float (ratio threshold if between -1 and 0)" #define DEFT_RESOURCE_RATIO_STR -0.9f static gboolean readRatioStr(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); #define FLAG_RESOURCE_MULT "nodeDisplacement_factor" #define DESC_RESOURCE_MULT "Choose the factor to draw arrows in geometry differences ; float (negative means auto)" #define DEFT_RESOURCE_MULT -1.f static gboolean readMult(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); #define DEFT_RESOURCE_SCAL -4.f static void exportResourcesDiff(GString *data, VisuData *dataObj, VisuGlView *view); /** * SECTION:node_vectors * @short_description: Draw arrows at each node to represent forces, * displacements, vibrations... * * A generic #VisuGlExt to represent vectors on nodes. */ enum { TAIL_LENGTH, TAIL_RADIUS, TAIL_NLAT, HEAD_LENGTH, HEAD_RADIUS, HEAD_NLAT, N_ARROW_DEFS }; /** * VisuGlExtNodeVectorsClass: * @parent: the parent class; * * A short way to identify #_VisuGlExtNodeVectorsClass structure. * * Since: 3.7 */ /** * VisuGlExtNodeVectors: * * An opaque structure. * * Since: 3.7 */ /** * VisuGlExtNodeVectorsPrivate: * * Private fields for #VisuGlExtNodeVectors objects. * * Since: 3.7 */ struct _VisuGlExtNodeVectorsPrivate { gboolean dispose_has_run; gboolean isBuilt; gchar *propId; /* Node definitions. */ VisuData *dataObj; VisuNodeProperty *prop; gulong popInc_signal, popDec_signal, posChg_signal, visChg_signal, eleSize_hook; /* Rendering definitions. */ gboolean followElementColor; float arrow[N_ARROW_DEFS]; float normFactor, scale; VisuGlArrowCentering centering; guint nodeOrig; float translation, addLength; float ratioMin, ratioMinLabel; }; enum { PROP_0, PROPID_PROP, NGLOBJ_PROP }; static void visu_gl_ext_node_vectors_finalize(GObject* obj); static void visu_gl_ext_node_vectors_dispose(GObject* obj); static void visu_gl_ext_node_vectors_rebuild(VisuGlExt *ext); static void visu_gl_ext_node_vectors_get_property(GObject* obj, guint property_id, GValue *value, GParamSpec *pspec); static void visu_gl_ext_node_vectors_set_property(GObject* obj, guint property_id, const GValue *value, GParamSpec *pspec); /* Local callbacks. */ static void onNodePopulationChanged(VisuNodeArray *array, gint *ids, gpointer data); static void onNodePositionChanged(VisuNodeArray *array, VisuElement *ele, gpointer data); static void onNodeVisibilityChanged(VisuNodeArray *array, gpointer data); static gboolean onElementSize(GSignalInvocationHint *ihint, guint nvalues, const GValue *param_values, gpointer data); G_DEFINE_TYPE(VisuGlExtNodeVectors, visu_gl_ext_node_vectors, VISU_TYPE_GL_EXT) static void visu_gl_ext_node_vectors_class_init(VisuGlExtNodeVectorsClass *klass) { VisuConfigFileEntry *resourceEntry; DBG_fprintf(stderr, "Visu GlExt NodeVectors: creating the class of the object.\n"); /* DBG_fprintf(stderr, " - adding new signals ;\n"); */ /* Resources for geodiff extensions. */ resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_ARROW, DESC_RESOURCE_ARROW, 1, readArrow); visu_config_file_entry_setVersion(resourceEntry, 3.5f); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_RATIO_MIN, DESC_RESOURCE_RATIO_MIN, 1, readRatioMin); visu_config_file_entry_setVersion(resourceEntry, 3.5f); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_RATIO_STR, DESC_RESOURCE_RATIO_STR, 1, readRatioStr); visu_config_file_entry_setVersion(resourceEntry, 3.5f); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_MULT, DESC_RESOURCE_MULT, 1, readMult); visu_config_file_entry_setVersion(resourceEntry, 3.5f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_RESOURCE, exportResourcesDiff); /* Connect the overloading methods. */ G_OBJECT_CLASS(klass)->dispose = visu_gl_ext_node_vectors_dispose; G_OBJECT_CLASS(klass)->finalize = visu_gl_ext_node_vectors_finalize; G_OBJECT_CLASS(klass)->set_property = visu_gl_ext_node_vectors_set_property; G_OBJECT_CLASS(klass)->get_property = visu_gl_ext_node_vectors_get_property; VISU_GL_EXT_CLASS(klass)->rebuild = visu_gl_ext_node_vectors_rebuild; /** * VisuGlExtNodeVectors::propId: * * The name of the extension (used as an id). * * Since: 3.7 */ g_object_class_install_property (G_OBJECT_CLASS(klass), PROPID_PROP, g_param_spec_string("propId", "Property id", "property name to get vectors from", "", G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void visu_gl_ext_node_vectors_init(VisuGlExtNodeVectors *obj) { DBG_fprintf(stderr, "Visu GlExt NodeVectors: initializing a new object (%p).\n", (gpointer)obj); obj->priv = g_malloc(sizeof(VisuGlExtNodeVectorsPrivate)); obj->priv->dispose_has_run = FALSE; /* Overload parent data. */ visu_gl_ext_setPriority(VISU_GL_EXT(obj), VISU_GL_EXT_PRIORITY_NODE_DECORATIONS); /* Private data. */ obj->priv->isBuilt = FALSE; obj->priv->propId = (gchar*)0; obj->priv->dataObj = (VisuData*)0; obj->priv->popInc_signal = 0; obj->priv->popDec_signal = 0; obj->priv->posChg_signal = 0; obj->priv->visChg_signal = 0; obj->priv->followElementColor = TRUE; obj->priv->arrow[TAIL_LENGTH] = 0.7f; obj->priv->arrow[TAIL_RADIUS] = 0.1f; obj->priv->arrow[TAIL_NLAT] = 10.f; obj->priv->arrow[HEAD_LENGTH] = 0.3f; obj->priv->arrow[HEAD_RADIUS] = 0.15f; obj->priv->arrow[HEAD_NLAT] = 10.f; obj->priv->normFactor = -1.f; obj->priv->scale = -2.f; obj->priv->centering = VISU_GL_ARROW_BOTTOM_CENTERED; obj->priv->translation = 0.f; obj->priv->addLength = 0.f; obj->priv->ratioMin = 0.f; obj->priv->ratioMinLabel = G_MAXFLOAT; obj->priv->nodeOrig = 0; obj->priv->eleSize_hook = 0; } /* This method can be called several times. It should unref all of its reference to GObjects. */ static void visu_gl_ext_node_vectors_dispose(GObject* obj) { VisuGlExtNodeVectors *vect; DBG_fprintf(stderr, "Visu GlExt NodeVectors: dispose object %p.\n", (gpointer)obj); vect = VISU_GL_EXT_NODE_VECTORS(obj); if (vect->priv->dispose_has_run) return; vect->priv->dispose_has_run = TRUE; /* Disconnect signals. */ visu_gl_ext_node_vectors_setData(vect, (VisuData*)0); if (vect->priv->eleSize_hook) g_signal_remove_emission_hook(g_signal_lookup("elementSizeChanged", VISU_TYPE_RENDERING), vect->priv->eleSize_hook); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_gl_ext_node_vectors_parent_class)->dispose(obj); } /* This method is called once only. */ static void visu_gl_ext_node_vectors_finalize(GObject* obj) { VisuGlExtNodeVectors *vect; g_return_if_fail(obj); DBG_fprintf(stderr, "Visu GlExt NodeVectors: finalize object %p.\n", (gpointer)obj); vect = VISU_GL_EXT_NODE_VECTORS(obj); /* Free privs elements. */ if (vect->priv) { DBG_fprintf(stderr, "Visu GlExt NodeVectors: free private legend.\n"); g_free(vect->priv->propId); g_free(vect->priv); } /* Chain up to the parent class */ DBG_fprintf(stderr, "Visu GlExt NodeVectors: chain to parent.\n"); G_OBJECT_CLASS(visu_gl_ext_node_vectors_parent_class)->finalize(obj); DBG_fprintf(stderr, "Visu GlExt NodeVectors: freeing ... OK.\n"); } static void visu_gl_ext_node_vectors_get_property(GObject* obj, guint property_id, GValue *value, GParamSpec *pspec) { VisuGlExtNodeVectorsPrivate *self = VISU_GL_EXT_NODE_VECTORS(obj)->priv; DBG_fprintf(stderr, "Extension NodeVectors: get property '%s' -> ", g_param_spec_get_name(pspec)); switch (property_id) { case PROPID_PROP: g_value_set_string(value, self->propId); DBG_fprintf(stderr, "%s.\n", self->propId); break; default: /* We don't have any other property... */ G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, property_id, pspec); break; } } static void visu_gl_ext_node_vectors_set_property(GObject* obj, guint property_id, const GValue *value, GParamSpec *pspec) { VisuGlExtNodeVectorsPrivate *self = VISU_GL_EXT_NODE_VECTORS(obj)->priv; DBG_fprintf(stderr, "Extension NodeVectors: set property '%s' -> ", g_param_spec_get_name(pspec)); switch (property_id) { case PROPID_PROP: self->propId = g_value_dup_string(value); DBG_fprintf(stderr, "%s.\n", self->propId); break; default: /* We don't have any other property... */ G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, property_id, pspec); break; } } /** * visu_gl_ext_node_vectors_new: * @name: (allow-none): the name to give to the extension. * @propId: the name of the #VisuNodeProperty that stores the vector representation. * * Creates a new #VisuGlExt to draw a box. * * Since: 3.7 * * Returns: a pointer to the #VisuGlExt it created or * NULL otherwise. */ VisuGlExtNodeVectors* visu_gl_ext_node_vectors_new(const gchar *name, const gchar *propId) { char *name_ = "Node vectors"; char *description = _("Draw vectors on each nodes."); VisuGlExt *ext; DBG_fprintf(stderr,"Visu GlExt NodeVectors: new object.\n"); ext = VISU_GL_EXT(g_object_new(VISU_TYPE_GL_EXT_NODE_VECTORS, "name", (name)?name:name_, "label", _(name), "description", description, "nGlObj", 1, "propId", propId, NULL)); return VISU_GL_EXT_NODE_VECTORS(ext); } /** * visu_gl_ext_node_vectors_setData: * @vect: The #VisuGlExtNodeVectors to attached to. * @dataObj: the nodes to get the population of. * * Attach an #VisuGlView to render to and setup the legend to get the * node population also. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_node_vectors_draw() should be called and * then 'OpenGLAskForReDraw' signal be emitted. **/ gboolean visu_gl_ext_node_vectors_setData(VisuGlExtNodeVectors *vect, VisuData *dataObj) { g_return_val_if_fail(VISU_IS_GL_EXT_NODE_VECTORS(vect), FALSE); DBG_fprintf(stderr, "Extension Node Vectors: set VisuData %p.\n", (gpointer)dataObj); if (vect->priv->dataObj) { g_signal_handler_disconnect(G_OBJECT(vect->priv->dataObj), vect->priv->popInc_signal); g_signal_handler_disconnect(G_OBJECT(vect->priv->dataObj), vect->priv->popDec_signal); g_signal_handler_disconnect(G_OBJECT(vect->priv->dataObj), vect->priv->posChg_signal); g_signal_handler_disconnect(G_OBJECT(vect->priv->dataObj), vect->priv->visChg_signal); g_object_unref(vect->priv->dataObj); } vect->priv->prop = (dataObj)? visu_node_array_getProperty(VISU_NODE_ARRAY(dataObj), vect->priv->propId): (VisuNodeProperty*)0; if (dataObj && vect->priv->prop) { g_object_ref(dataObj); vect->priv->popInc_signal = g_signal_connect(G_OBJECT(dataObj), "PopulationIncrease", G_CALLBACK(onNodePopulationChanged), (gpointer)vect); vect->priv->popDec_signal = g_signal_connect(G_OBJECT(dataObj), "PopulationDecrease", G_CALLBACK(onNodePopulationChanged), (gpointer)vect); vect->priv->posChg_signal = g_signal_connect(G_OBJECT(dataObj), "PositionChanged", G_CALLBACK(onNodePositionChanged), (gpointer)vect); vect->priv->visChg_signal = g_signal_connect(G_OBJECT(dataObj), "VisibilityChanged", G_CALLBACK(onNodeVisibilityChanged), (gpointer)vect); vect->priv->dataObj = dataObj; } else { vect->priv->popInc_signal = 0; vect->priv->popDec_signal = 0; vect->priv->posChg_signal = 0; vect->priv->visChg_signal = 0; vect->priv->dataObj = (VisuData*)0; } vect->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(vect)); } /** * visu_gl_ext_node_vectors_getData: * @vect: a #VisuGlExtNodeVectors object. * * Retrieves associated #VisuData, if any. * * Since: 3.7 * * Returns: (transfer none): a #VisuData object. **/ VisuData* visu_gl_ext_node_vectors_getData(VisuGlExtNodeVectors *vect) { g_return_val_if_fail(VISU_IS_GL_EXT_NODE_VECTORS(vect), (VisuData*)0); return vect->priv->dataObj; } /** * visu_gl_ext_node_vectors_setRenderedSize: * @vect: the #VisuGlExtNodeVectors object to modify. * @scale: a floating point value. * * @scale governs how large the node vectors are drawn. For a positive * value, a vector with a normalised size of 1 (see * visu_gl_ext_node_vectors_setNormalisation()) will be drawn with the size of * @scale. For a negative value, a vector of normalised size of 1 will * be drawn with a size of -@scale times the maximum element size (see * visu_node_array_getMaxElementSize()). * * Since: 3.7 * * Returns: TRUE if setting has been changed. **/ gboolean visu_gl_ext_node_vectors_setRenderedSize(VisuGlExtNodeVectors *vect, gfloat scale) { g_return_val_if_fail(VISU_IS_GL_EXT_NODE_VECTORS(vect), FALSE); if (vect->priv->scale == scale) return FALSE; vect->priv->scale = scale; if (vect->priv->eleSize_hook) g_signal_remove_emission_hook(g_signal_lookup("elementSizeChanged", VISU_TYPE_RENDERING), vect->priv->eleSize_hook); if (vect->priv->scale <= 0.f) vect->priv->eleSize_hook = g_signal_add_emission_hook(g_signal_lookup("elementSizeChanged", VISU_TYPE_RENDERING), 0, onElementSize, (gpointer)vect, (GDestroyNotify)0); else vect->priv->eleSize_hook = 0; vect->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(vect)); } /** * visu_gl_ext_node_vectors_setNormalisation: * @vect: the #VisuGlExtNodeVectors object to modify. * @norm: a floating point value. * * @norm governs how the input node vector field is normalised. With a * positive value, all node vectors will be normalised by @norm. With * a negative value, all node vectors are normalised with respect to * the biggest one. * * Since: 3.7 * * Returns: TRUE if setting has been changed. **/ gboolean visu_gl_ext_node_vectors_setNormalisation(VisuGlExtNodeVectors *vect, float norm) { g_return_val_if_fail(VISU_IS_GL_EXT_NODE_VECTORS(vect), FALSE); if (vect->priv->normFactor == norm) return FALSE; vect->priv->normFactor = norm; vect->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(vect)); } /** * visu_gl_ext_node_vectors_setTranslation: * @vect: the #VisuGlExtNodeVectors object to modify. * @trans: a positive floating point value. * * Defines a translation with respect to the center of each node. The * vector is shifted outwards, following the vector direction by an * amount given by the product of @trans and the element size * currently drawn. * * Since: 3.7 * * Returns: TRUE if setting has been changed. **/ gboolean visu_gl_ext_node_vectors_setTranslation(VisuGlExtNodeVectors *vect, float trans) { g_return_val_if_fail(VISU_IS_GL_EXT_NODE_VECTORS(vect), FALSE); if (vect->priv->translation == trans) return FALSE; vect->priv->translation = MAX(0.f, trans); if (vect->priv->eleSize_hook) g_signal_remove_emission_hook(g_signal_lookup("elementSizeChanged", VISU_TYPE_RENDERING), vect->priv->eleSize_hook); if (vect->priv->translation > 0.f) vect->priv->eleSize_hook = g_signal_add_emission_hook(g_signal_lookup("elementSizeChanged", VISU_TYPE_RENDERING), 0, onElementSize, (gpointer)vect, (GDestroyNotify)0); else vect->priv->eleSize_hook = 0; vect->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(vect)); } /** * visu_gl_ext_node_vectors_setColor: * @vect: the #VisuGlExtNodeVectors object to modify. * @follow: a boolean. * * If @follow is TRUE, the vectors are drawn with the color of the * currently drawn #VisuElement. If FALSE, it is drawn with a * highlighted color. * * Since: 3.7 * * Returns: TRUE if setting has been changed. **/ gboolean visu_gl_ext_node_vectors_setColor(VisuGlExtNodeVectors *vect, gboolean follow) { g_return_val_if_fail(VISU_IS_GL_EXT_NODE_VECTORS(vect), FALSE); if (vect->priv->followElementColor == follow) return FALSE; vect->priv->followElementColor = follow; vect->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(vect)); } /** * visu_gl_ext_node_vectors_setCentering: * @vect: the #VisuGlExtNodeVectors object to modify. * @centering: a #VisuGlArrowCentering id. * * Change how vectors are position with respect to to center of each node. * * Since: 3.7 * * Returns: TRUE if setting has been changed. **/ gboolean visu_gl_ext_node_vectors_setCentering(VisuGlExtNodeVectors *vect, VisuGlArrowCentering centering) { g_return_val_if_fail(VISU_IS_GL_EXT_NODE_VECTORS(vect), FALSE); if (vect->priv->centering == centering) return FALSE; vect->priv->centering = centering; vect->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(vect)); } /** * visu_gl_ext_node_vectors_setVectorThreshold: * @vect: the #VisuGlExtNodeVectors object to modify. * @val: a value. * * Vectors are indeed drawn if a threshold value is reach. If @val is * strictly positive, the norm of each vector is compared to @val. If * @val is negative, the normalised [0;1] norm is compared to -@val. * * Since: 3.7 * * Returns: TRUE if setting has been changed. **/ gboolean visu_gl_ext_node_vectors_setVectorThreshold(VisuGlExtNodeVectors *vect, float val) { g_return_val_if_fail(VISU_IS_GL_EXT_NODE_VECTORS(vect), FALSE); if (vect->priv->ratioMin == val) return FALSE; vect->priv->ratioMin = val; vect->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(vect)); } /** * visu_gl_ext_node_vectors_setLabelThreshold: * @vect: the #VisuGlExtNodeVectors object to modify. * @val: a value. * * Vector norms can be drawn if a threshold value is reach. If @val is * strictly positive, the norm of each vector is compared to @val. If * @val is negative, the normalised [0;1] norm is compared to -@val. * * Since: 3.7 * * Returns: TRUE if setting has been changed. **/ gboolean visu_gl_ext_node_vectors_setLabelThreshold(VisuGlExtNodeVectors *vect, float val) { g_return_val_if_fail(VISU_IS_GL_EXT_NODE_VECTORS(vect), FALSE); if (vect->priv->ratioMinLabel == val) return FALSE; vect->priv->ratioMinLabel = val; vect->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(vect)); } /** * visu_gl_ext_node_vectors_setArrow: * @vect: the #VisuGlExtNodeVectors object to modify. * @tailLength: the length for the tail part of the vector. * @tailRadius: the radius for the tail part of the vector. * @tailN: the number of polygons to draw the tail part of the vector. * @headLength: the length for the head part of the vector. * @headRadius: the radius for the head part of the vector. * @headN: the number of polygons to draw the head part of the vector. * * Defines the profile of the arrows representing the vectors. * * Since: 3.7 * * Returns: TRUE if setting has been changed. **/ gboolean visu_gl_ext_node_vectors_setArrow(VisuGlExtNodeVectors *vect, float tailLength, float tailRadius, guint tailN, float headLength, float headRadius, guint headN) { gboolean diff; float fact; g_return_val_if_fail(VISU_IS_GL_EXT_NODE_VECTORS(vect), FALSE); diff = FALSE; diff = diff || (vect->priv->arrow[TAIL_LENGTH] != tailLength); diff = diff || (vect->priv->arrow[TAIL_RADIUS] != tailRadius); diff = diff || (vect->priv->arrow[TAIL_NLAT] != tailN); diff = diff || (vect->priv->arrow[HEAD_LENGTH] != headLength); diff = diff || (vect->priv->arrow[HEAD_RADIUS] != headRadius); diff = diff || (vect->priv->arrow[HEAD_NLAT] != headN); if (!diff) return FALSE; fact = 1.f / (tailLength + headLength); vect->priv->arrow[TAIL_LENGTH] = tailLength * fact; vect->priv->arrow[TAIL_RADIUS] = tailRadius * fact; vect->priv->arrow[TAIL_NLAT] = tailN; vect->priv->arrow[HEAD_LENGTH] = headLength * fact; vect->priv->arrow[HEAD_RADIUS] = headRadius * fact; vect->priv->arrow[HEAD_NLAT] = headN; vect->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(vect)); } /** * visu_gl_ext_node_vectors_getScale: * * The forces can be scaled manually or automatically, see * visu_gl_ext_forces_setScale() and visu_rendering_atomic_drawForces(). * * Since: 3.7 * * Returns: the scaling factor, -1 if automatic. **/ /* gfloat visu_gl_ext_forces_getScale() */ /* { */ /* return scale; */ /* } */ /** * visu_gl_ext_node_vectors_getNormalisation: * @vect: the #VisuGlExtNodeVectors object to inquire. * * Gets the normalisation factor, see visu_gl_ext_node_vectors_setNormalisation(). * * Since: 3.7 * * Returns: the normalisation factor used by @vact. **/ float visu_gl_ext_node_vectors_getNormalisation(VisuGlExtNodeVectors *vect) { g_return_val_if_fail(VISU_IS_GL_EXT_NODE_VECTORS(vect), -1.f); return vect->priv->normFactor; } /********************/ /* Local callbacks. */ /********************/ static void onNodePopulationChanged(VisuNodeArray *array _U_, gint *ids _U_, gpointer data) { VISU_GL_EXT_NODE_VECTORS(data)->priv->isBuilt = FALSE; visu_gl_ext_node_vectors_draw(VISU_GL_EXT_NODE_VECTORS(data)); } static void onNodePositionChanged(VisuNodeArray *array _U_, VisuElement *ele _U_, gpointer data) { VISU_GL_EXT_NODE_VECTORS(data)->priv->isBuilt = FALSE; visu_gl_ext_node_vectors_draw(VISU_GL_EXT_NODE_VECTORS(data)); } static void onNodeVisibilityChanged(VisuNodeArray *array _U_, gpointer data) { VISU_GL_EXT_NODE_VECTORS(data)->priv->isBuilt = FALSE; visu_gl_ext_node_vectors_draw(VISU_GL_EXT_NODE_VECTORS(data)); } static gboolean onElementSize(GSignalInvocationHint *ihint _U_, guint nvalues _U_, const GValue *param_values _U_, gpointer data) { VISU_GL_EXT_NODE_VECTORS(data)->priv->isBuilt = FALSE; visu_gl_ext_node_vectors_draw(VISU_GL_EXT_NODE_VECTORS(data)); return TRUE; } /***********/ /* OpenGL. */ /***********/ /** * visu_gl_ext_node_vectors_draw: * @vect: a #VisuGlExtNodeVectors object. * * Compile the OpenGL list that draw arrows on nodes. * * Since: 3.7 **/ void visu_gl_ext_node_vectors_draw(VisuGlExtNodeVectors *vect) { VisuRendering *method; VisuNodeArray *nodes; VisuNodeArrayIter iter; GValue val = {0, {{0}, {0}}}; GLUquadricObj *obj; float *values, fact, scale, eleSize; float rMult, r, sMult, s, l, headLength, tailLength; float xyz[3]; gchar *maxPropId; char distStr[10]; /* Nothing to draw; */ g_return_if_fail(VISU_IS_GL_EXT_NODE_VECTORS(vect)); if(!visu_gl_ext_getActive(VISU_GL_EXT(vect)) || vect->priv->isBuilt) return; glDeleteLists(visu_gl_ext_getGlList(VISU_GL_EXT(vect)), 1); vect->priv->isBuilt = TRUE; DBG_fprintf(stderr, "Extension Node Vectors: building for nodes %p.\n", (gpointer)vect->priv->dataObj); if (!vect->priv->dataObj) return; obj = gluNewQuadric(); method = visu_object_getRendering(VISU_OBJECT_INSTANCE); nodes = VISU_NODE_ARRAY(vect->priv->dataObj); /* Global min / max. */ maxPropId = g_strdup_printf("max_%s", vect->priv->propId); values = (float*)g_object_get_data(G_OBJECT(nodes), maxPropId); g_free(maxPropId); g_return_if_fail(values); /* Normalization factor. */ fact = vect->priv->normFactor; if (fact <= 0.f) fact = values[1]; fact = 1.f / fact; /* Drawing rule for vectors. */ rMult = 1.f; r = 1.f; if (vect->priv->ratioMin <= 0.f) { rMult = fact; r = -1.f; } /* Drawing rule for label. */ sMult = 1.f; s = 1.f; if (vect->priv->ratioMinLabel <= 0.f) { sMult = fact; s = -1.f; } /* Maximum representation size. */ scale = vect->priv->scale; if (scale <= 0.f) scale = visu_node_array_getMaxElementSize(nodes) * (-scale); glNewList(visu_gl_ext_getGlList(VISU_GL_EXT(vect)), GL_COMPILE); eleSize = 0.f; g_value_init(&val, G_TYPE_POINTER); visu_node_array_iterNew(nodes, &iter); for(visu_node_array_iterStart(nodes, &iter); iter.element; visu_node_array_iterNextElement(nodes, &iter)) { if (!visu_element_getRendered(iter.element)) continue; if (vect->priv->followElementColor) glCallList(visu_element_getMaterialId(iter.element)); else visu_gl_setHighlightColor(iter.element->material, iter.element->rgb, 1.f); eleSize = visu_rendering_getSizeOfElement(method, iter.element); for(visu_node_array_iterRestartNode(nodes, &iter); iter.node; visu_node_array_iterNextNode(nodes, &iter)) { if (!iter.node->rendered) continue; visu_node_property_getValue(vect->priv->prop, iter.node, &val); values = (float*)g_value_get_pointer(&val); if (values[3] * rMult <= vect->priv->ratioMin * r) continue; l = values[3] * fact; visu_data_getNodePosition(vect->priv->dataObj, iter.node, xyz); glPushMatrix(); glTranslatef(xyz[0] - ((vect->priv->nodeOrig)?values[vect->priv->nodeOrig + 0]:0.f), xyz[1] - ((vect->priv->nodeOrig)?values[vect->priv->nodeOrig + 1]:0.f), xyz[2] - ((vect->priv->nodeOrig)?values[vect->priv->nodeOrig + 2]:0.f)); glRotated(values[5], 0, 0, 1); glRotated(values[4], 0, 1, 0); glTranslated(0.f, 0.f, eleSize * vect->priv->translation); /* We draw the arrow. */ switch (vect->priv->centering) { case (VISU_GL_ARROW_CENTERED): glScalef(scale, scale, scale); tailLength = MAX(0.f, l - vect->priv->arrow[HEAD_LENGTH]); headLength = MIN(l, vect->priv->arrow[HEAD_LENGTH]); break; case (VISU_GL_ARROW_TAIL_CENTERED): glScalef(eleSize, eleSize, eleSize); tailLength = l * scale / eleSize + vect->priv->addLength; headLength = vect->priv->arrow[HEAD_LENGTH]; break; default: glScalef(l * scale, l * scale, l * scale); tailLength = vect->priv->arrow[TAIL_LENGTH]; headLength = vect->priv->arrow[HEAD_LENGTH]; } visu_gl_drawSmoothArrow(obj, -1, vect->priv->centering, tailLength, vect->priv->arrow[TAIL_RADIUS], (guint)vect->priv->arrow[TAIL_NLAT], FALSE, headLength, vect->priv->arrow[HEAD_RADIUS], (guint)vect->priv->arrow[HEAD_NLAT], FALSE); /* We draw the value. */ if (values[3] * sMult > vect->priv->ratioMinLabel * s) { glRasterPos3f(0.f, 0.f, 0.f); sprintf(distStr, "%6.3f", values[3]); visu_gl_text_drawChars(distStr, VISU_GL_TEXT_NORMAL); } glPopMatrix(); } } glEndList(); gluDeleteQuadric(obj); } static void visu_gl_ext_node_vectors_rebuild(VisuGlExt *ext) { DBG_fprintf(stderr, "Visu GlExt NodeVectors: rebuilding vectors %p.\n", (gpointer)ext); visu_gl_text_rebuildFontList(); VISU_GL_EXT_NODE_VECTORS(ext)->priv->isBuilt = FALSE; visu_gl_ext_node_vectors_draw(VISU_GL_EXT_NODE_VECTORS(ext)); } /**********************/ /* Geodiff extension. */ /**********************/ #include static float ratioMin = DEFT_RESOURCE_RATIO_MIN; static float ratioStr = DEFT_RESOURCE_RATIO_STR; static float mult = DEFT_RESOURCE_MULT; static float scal = DEFT_RESOURCE_SCAL; static float arrow[4] = {4.f, .2f, .5f, .3f}; static VisuGlExtNodeVectors *geoDiff = NULL; /** * visu_gl_ext_geodiff_getDefault: * * V_Sim has a private internal #VisuGlExtNodeVectors object to * represent geometry differences. * * Since: 3.7 * * Returns: (transfer none): the default #VisuGlExtNodeVectors object * used for geometry differences. **/ VisuGlExtNodeVectors* visu_gl_ext_geodiff_getDefault() { if (!geoDiff) { geoDiff = visu_gl_ext_node_vectors_new("Geometry", VISU_GEODIFF_ID); visu_gl_ext_node_vectors_setCentering(geoDiff, VISU_GL_ARROW_CENTERED); visu_gl_ext_node_vectors_setRenderedSize(geoDiff, scal); visu_gl_ext_node_vectors_setNormalisation(geoDiff, mult); visu_gl_ext_node_vectors_setColor(geoDiff, FALSE); visu_gl_ext_node_vectors_setArrow(geoDiff, arrow[0], arrow[1], 10, arrow[2], arrow[3], 10); } return geoDiff; } static gboolean readArrow(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { float vals[4]; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readFloat(lines[0], position, vals, 4, error)) return FALSE; arrow[0] = (vals[0] > 0.f)?vals[0]:4.f; arrow[1] = (vals[1] > 0.f)?vals[1]:.2f; arrow[2] = (vals[2] > 0.f)?vals[2]:.5f; arrow[3] = (vals[3] > 0.f)?vals[3]:.3f; visu_gl_ext_node_vectors_setArrow(visu_gl_ext_geodiff_getDefault(), arrow[0], arrow[1], 10, arrow[2], arrow[3], 10); visu_gl_ext_node_vectors_setRenderedSize(visu_gl_ext_geodiff_getDefault(), (vals[0] > 0.f)?vals[0]:-4.f); return TRUE; } static gboolean readRatioMin(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { float val; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readFloat(lines[0], position, &val, 1, error)) return FALSE; visu_gl_ext_node_vectors_setVectorThreshold(visu_gl_ext_geodiff_getDefault(), val); ratioMin = val; return TRUE; } static gboolean readRatioStr(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { float val; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readFloat(lines[0], position, &val, 1, error)) return FALSE; visu_gl_ext_node_vectors_setLabelThreshold(visu_gl_ext_geodiff_getDefault(), val); ratioStr = val; return TRUE; } static gboolean readMult(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { float val; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readFloat(lines[0], position, &val, 1, error)) return FALSE; visu_gl_ext_node_vectors_setNormalisation(visu_gl_ext_geodiff_getDefault(), val); mult = val; return TRUE; } static void exportResourcesDiff(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { visu_config_file_exportComment(data, DESC_RESOURCE_ARROW); visu_config_file_exportEntry(data, FLAG_RESOURCE_ARROW, NULL, "%f %f %f %f", arrow[0], arrow[1], arrow[2], arrow[3]); visu_config_file_exportComment(data, DESC_RESOURCE_MULT); visu_config_file_exportEntry(data, FLAG_RESOURCE_MULT, NULL, "%f", mult); visu_config_file_exportComment(data, DESC_RESOURCE_RATIO_MIN); visu_config_file_exportEntry(data, FLAG_RESOURCE_RATIO_MIN, NULL, "%f", ratioMin); visu_config_file_exportComment(data, DESC_RESOURCE_RATIO_STR); visu_config_file_exportEntry(data, FLAG_RESOURCE_RATIO_STR, NULL, "%f", ratioStr); visu_config_file_exportComment(data, ""); } /************************/ /* Vibration extension. */ /************************/ #include static VisuGlExtNodeVectors *vib = NULL; /** * visu_gl_ext_vibration_getDefault: * * V_Sim has a private internal #VisuGlExtNodeVectors object to * represent phonons with arrows. * * Since: 3.7 * * Returns: (transfer none): the default #VisuGlExtNodeVectors object * used for representing phonons with arrows. **/ VisuGlExtNodeVectors* visu_gl_ext_vibration_getDefault() { if (!vib) { vib = visu_gl_ext_node_vectors_new("Vibration", VISU_VIBRATION_ID); visu_gl_ext_setActive(VISU_GL_EXT(vib), FALSE); visu_gl_ext_node_vectors_setCentering(vib, VISU_GL_ARROW_TAIL_CENTERED); visu_gl_ext_node_vectors_setRenderedSize(vib, 1.f); visu_gl_ext_node_vectors_setNormalisation(vib, -1.f); visu_gl_ext_node_vectors_setColor(vib, FALSE); visu_gl_ext_node_vectors_setArrow(vib, 0.5f, 0.2f, 10, 0.5f, 0.3f, 10); visu_gl_ext_node_vectors_setVectorThreshold(vib, -0.05f); /* Value in percentage. */ vib->priv->addLength = 2.5f; vib->priv->nodeOrig = 9; } return vib; } v_sim-3.7.0/src/extensions/node_vectors.h0000644000353400050620000001257312215546077015433 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2013) Adresse ml : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2013) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at COPYING. */ #ifndef NODE_VECTORS_H #define NODE_VECTORS_H #include #include #include /** * VISU_TYPE_GL_EXT_NODE_VECTORS: * * return the type of #VisuGlExtNodeVectors. * * Since: 3.7 */ #define VISU_TYPE_GL_EXT_NODE_VECTORS (visu_gl_ext_node_vectors_get_type ()) /** * VISU_GL_EXT_NODE_VECTORS: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuGlExtNodeVectors type. * * Since: 3.7 */ #define VISU_GL_EXT_NODE_VECTORS(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_GL_EXT_NODE_VECTORS, VisuGlExtNodeVectors)) /** * VISU_GL_EXT_NODE_VECTORS_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuGlExtNodeVectorsClass. * * Since: 3.7 */ #define VISU_GL_EXT_NODE_VECTORS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_GL_EXT_NODE_VECTORS, VisuGlExtNodeVectorsClass)) /** * VISU_IS_GL_EXT_NODE_VECTORS: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuGlExtNodeVectors object. * * Since: 3.7 */ #define VISU_IS_GL_EXT_NODE_VECTORS(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_GL_EXT_NODE_VECTORS)) /** * VISU_IS_GL_EXT_NODE_VECTORS_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuGlExtNodeVectorsClass class. * * Since: 3.7 */ #define VISU_IS_GL_EXT_NODE_VECTORS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_GL_EXT_NODE_VECTORS)) /** * VISU_GL_EXT_NODE_VECTORS_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. * * Since: 3.7 */ #define VISU_GL_EXT_NODE_VECTORS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_GL_EXT_NODE_VECTORS, VisuGlExtNodeVectorsClass)) typedef struct _VisuGlExtNodeVectors VisuGlExtNodeVectors; typedef struct _VisuGlExtNodeVectorsPrivate VisuGlExtNodeVectorsPrivate; typedef struct _VisuGlExtNodeVectorsClass VisuGlExtNodeVectorsClass; struct _VisuGlExtNodeVectors { VisuGlExt parent; VisuGlExtNodeVectorsPrivate *priv; }; struct _VisuGlExtNodeVectorsClass { VisuGlExtClass parent; }; /** * visu_gl_ext_node_vectors_get_type: * * This method returns the type of #VisuGlExtNodeVectors, use * VISU_TYPE_GL_EXT_NODE_VECTORS instead. * * Since: 3.7 * * Returns: the type of #VisuGlExtNodeVectors. */ GType visu_gl_ext_node_vectors_get_type(void); VisuGlExtNodeVectors* visu_gl_ext_node_vectors_new(const gchar *name, const gchar *propId); void visu_gl_ext_node_vectors_draw(VisuGlExtNodeVectors *vect); gboolean visu_gl_ext_node_vectors_setData(VisuGlExtNodeVectors *vect, VisuData *dataObj); VisuData* visu_gl_ext_node_vectors_getData(VisuGlExtNodeVectors *vect); gboolean visu_gl_ext_node_vectors_setRenderedSize(VisuGlExtNodeVectors *vect, gfloat scale); gboolean visu_gl_ext_node_vectors_setNormalisation(VisuGlExtNodeVectors *vect, float norm); gboolean visu_gl_ext_node_vectors_setTranslation(VisuGlExtNodeVectors *vect, float trans); gboolean visu_gl_ext_node_vectors_setColor(VisuGlExtNodeVectors *vect, gboolean follow); gboolean visu_gl_ext_node_vectors_setCentering(VisuGlExtNodeVectors *vect, VisuGlArrowCentering centering); gboolean visu_gl_ext_node_vectors_setVectorThreshold(VisuGlExtNodeVectors *vect, float val); gboolean visu_gl_ext_node_vectors_setLabelThreshold(VisuGlExtNodeVectors *vect, float val); gboolean visu_gl_ext_node_vectors_setArrow(VisuGlExtNodeVectors *vect, float tailLength, float tailRadius, guint tailN, float headLength, float headRadius, guint headN); float visu_gl_ext_node_vectors_getNormalisation(VisuGlExtNodeVectors *vect); VisuGlExtNodeVectors* visu_gl_ext_geodiff_getDefault(); VisuGlExtNodeVectors* visu_gl_ext_vibration_getDefault(); #endif v_sim-3.7.0/src/extensions/planes.c0000644000353400050620000002772312215546077014221 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2009) Adresse mèl : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2009) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at COPYING. */ #include "planes.h" #include #include #include /** * SECTION:planes * @short_description: Draw a list of #VisuPlane. * * This extension draws a list of #VisuPlane. Planes are * outlined with a black line and also the intersections of planes. * * Since: 3.7 */ /** * VisuGlExtPlanesClass: * @parent: the parent class; * * A short way to identify #_VisuGlExtPlanesClass structure. * * Since: 3.7 */ /** * VisuGlExtPlanes: * * An opaque structure. * * Since: 3.7 */ /** * VisuGlExtPlanesPrivate: * * Private fields for #VisuGlExtPlanes objects. * * Since: 3.7 */ struct _VisuGlExtPlanesPrivate { gboolean dispose_has_run; gboolean isBuilt; /* Planes definition. */ GList *planes; }; static VisuGlExtPlanes* defaultPlanes; typedef struct _PlaneHandleStruct { VisuPlane *plane; gulong move_signal, rendering_signal; } _PlaneHandle; static void visu_gl_ext_planes_finalize(GObject* obj); static void visu_gl_ext_planes_dispose(GObject* obj); static void visu_gl_ext_planes_rebuild(VisuGlExt *ext); /* Local callbacks. */ static void onPlaneMoved(VisuPlane *plane, gpointer data); static void onPlaneRendering(VisuPlane *plane, gpointer data); /* Local routines. */ static void _freePlaneHandle(gpointer obj) { _PlaneHandle *phd; phd = (_PlaneHandle*)obj; g_signal_handler_disconnect(G_OBJECT(phd->plane), phd->move_signal); g_signal_handler_disconnect(G_OBJECT(phd->plane), phd->rendering_signal); g_object_unref(phd->plane); #if GLIB_MINOR_VERSION > 9 g_slice_free1(sizeof(_PlaneHandle), obj); #else g_free(obj); #endif } static gpointer _newPlaneHandle(VisuGlExtPlanes *planes, VisuPlane *plane) { _PlaneHandle *phd; g_object_ref(plane); #if GLIB_MINOR_VERSION > 9 phd = g_slice_alloc(sizeof(_PlaneHandle)); #else phd = g_malloc(sizeof(_PlaneHandle)); #endif phd->plane = plane; phd->move_signal = g_signal_connect(G_OBJECT(plane), "moved", G_CALLBACK(onPlaneMoved), (gpointer)planes); phd->rendering_signal = g_signal_connect(G_OBJECT(plane), "rendering", G_CALLBACK(onPlaneRendering), (gpointer)planes); return (gpointer)phd; } static gint _cmpPlaneHandle(gconstpointer a, gconstpointer b) { _PlaneHandle *phd_a = (_PlaneHandle*)a; if (phd_a->plane == b) return 0; return 1; } #define _getPlane(H) ((_PlaneHandle*)H)->plane G_DEFINE_TYPE(VisuGlExtPlanes, visu_gl_ext_planes, VISU_TYPE_GL_EXT) static void visu_gl_ext_planes_class_init(VisuGlExtPlanesClass *klass) { DBG_fprintf(stderr, "Extension Planes: creating the class of the object.\n"); /* DBG_fprintf(stderr, " - adding new signals ;\n"); */ defaultPlanes = (VisuGlExtPlanes*)0; /* Connect the overloading methods. */ G_OBJECT_CLASS(klass)->dispose = visu_gl_ext_planes_dispose; G_OBJECT_CLASS(klass)->finalize = visu_gl_ext_planes_finalize; VISU_GL_EXT_CLASS(klass)->rebuild = visu_gl_ext_planes_rebuild; } static void visu_gl_ext_planes_init(VisuGlExtPlanes *obj) { DBG_fprintf(stderr, "Extension Planes: initializing a new object (%p).\n", (gpointer)obj); obj->priv = g_malloc(sizeof(VisuGlExtPlanesPrivate)); obj->priv->dispose_has_run = FALSE; /* Private data. */ obj->priv->isBuilt = FALSE; obj->priv->planes = (GList*)0; } /* This method can be called several times. It should unref all of its reference to GObjects. */ static void visu_gl_ext_planes_dispose(GObject* obj) { VisuGlExtPlanes *planes; GList *lst; DBG_fprintf(stderr, "Extension Planes: dispose object %p.\n", (gpointer)obj); planes = VISU_GL_EXT_PLANES(obj); if (planes->priv->dispose_has_run) return; planes->priv->dispose_has_run = TRUE; /* Disconnect signals. */ for (lst = planes->priv->planes; lst; lst = g_list_next(lst)) _freePlaneHandle(lst->data); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_gl_ext_planes_parent_class)->dispose(obj); } /* This method is called once only. */ static void visu_gl_ext_planes_finalize(GObject* obj) { VisuGlExtPlanes *planes; g_return_if_fail(obj); DBG_fprintf(stderr, "Extension Planes: finalize object %p.\n", (gpointer)obj); planes = VISU_GL_EXT_PLANES(obj); /* Free privs elements. */ if (planes->priv) { DBG_fprintf(stderr, "Extension Planes: free private planes.\n"); g_list_free(planes->priv->planes); g_free(planes->priv); } /* Chain up to the parent class */ DBG_fprintf(stderr, "Extension Planes: chain to parent.\n"); G_OBJECT_CLASS(visu_gl_ext_planes_parent_class)->finalize(obj); DBG_fprintf(stderr, "Extension Planes: freeing ... OK.\n"); } /** * visu_gl_ext_planes_new: * @name: (allow-none): the name to give to the extension (default is #VISU_GL_EXT_PLANES_ID). * * Creates a new #VisuGlExt to draw a list of planes. * * Since: 3.7 * * Returns: a pointer to the #VisuGlExt it created or * NULL otherwise. */ VisuGlExtPlanes* visu_gl_ext_planes_new(const gchar *name) { char *name_ = VISU_GL_EXT_PLANES_ID; char *description = _("Draw some planes."); VisuGlExt *planes; #define PLANES_HEIGHT 30 DBG_fprintf(stderr,"Extension Planes: new object.\n"); planes = VISU_GL_EXT(g_object_new(VISU_TYPE_GL_EXT_PLANES, "name", (name)?name:name_, "label", _(name), "description", description, "nGlObj", 1, NULL)); visu_gl_ext_setPriority(planes, VISU_GL_EXT_PRIORITY_NORMAL + 1); visu_gl_ext_setSensitiveToRenderingMode(planes, TRUE); return VISU_GL_EXT_PLANES(planes); } /** * visu_gl_ext_planes_add: * @planes: a #VisuGlExtPlanes object. * @plane: (transfer full): a #VisuPlane object. * * Adds a @plane to the list of drawn planes. * * Since: 3.7 * * Returns: FALSE if @plane was already registered. **/ gboolean visu_gl_ext_planes_add(VisuGlExtPlanes *planes, VisuPlane *plane) { GList *lst; g_return_val_if_fail(VISU_IS_GL_EXT_PLANES(planes), FALSE); lst = g_list_find_custom(planes->priv->planes, plane, _cmpPlaneHandle); if (lst) return FALSE; planes->priv->planes = g_list_prepend(planes->priv->planes, _newPlaneHandle(planes, plane)); planes->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(planes)); } /** * visu_gl_ext_planes_remove: * @planes: a #VisuGlExtPlanes object. * @plane: a #VisuPlane object. * * Remove @plane from the list of drawn planes. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_planes_draw() should be called. **/ gboolean visu_gl_ext_planes_remove(VisuGlExtPlanes *planes, VisuPlane *plane) { GList *lst; g_return_val_if_fail(VISU_IS_GL_EXT_PLANES(planes), FALSE); lst = g_list_find_custom(planes->priv->planes, plane, _cmpPlaneHandle); if (!lst) return FALSE; _freePlaneHandle(lst->data); planes->priv->planes = g_list_delete_link(planes->priv->planes, lst); planes->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(planes)); } /** * visu_gl_ext_planes_getDefault: * * V_Sim is using a default planes object. * * Since: 3.7 * * Returns: (transfer none): a #VisuGlExtPlanes object used by default. **/ VisuGlExtPlanes* visu_gl_ext_planes_getDefault() { if (!defaultPlanes) { defaultPlanes = visu_gl_ext_planes_new((gchar*)0); visu_gl_ext_setActive(VISU_GL_EXT(defaultPlanes), FALSE); } return defaultPlanes; } static void visu_gl_ext_planes_rebuild(VisuGlExt *ext) { VISU_GL_EXT_PLANES(ext)->priv->isBuilt = FALSE; visu_gl_ext_planes_draw(VISU_GL_EXT_PLANES(ext)); } static void onPlaneMoved(VisuPlane *plane, gpointer data) { VisuGlExtPlanes *planes; planes = VISU_GL_EXT_PLANES(data); planes->priv->isBuilt = !visu_plane_getRendered(plane); visu_gl_ext_planes_draw(planes); } static void onPlaneRendering(VisuPlane *plane, gpointer data) { VisuGlExtPlanes *planes; planes = VISU_GL_EXT_PLANES(data); planes->priv->isBuilt = !visu_plane_getRendered(plane); visu_gl_ext_planes_draw(planes); } static void visu_plane_draw(VisuPlane* plane) { GList *inter, *tmpLst; inter = visu_plane_getIntersection(plane); if (inter && visu_plane_getRendered(plane)) { DBG_fprintf(stderr, " | plane %p\n", (gpointer)plane); glLineWidth(1.f); glColor3f(0.f, 0.f, 0.f); glBegin(GL_LINE_LOOP); for (tmpLst = inter; tmpLst; tmpLst = g_list_next(tmpLst)) glVertex3fv((float*)tmpLst->data); glEnd(); glDisable(GL_CULL_FACE); glColor4fv(visu_plane_getColor(plane)->rgba); glBegin(GL_POLYGON); for (tmpLst = inter; tmpLst; tmpLst = g_list_next(tmpLst)) glVertex3fv((float*)tmpLst->data); glEnd(); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); } } /** * visu_gl_ext_planes_draw: * @planes: a #VisuGlExtPlanes object. * * Compile the OpenGL list representing planes. * * Since: 3.7 **/ void visu_gl_ext_planes_draw(VisuGlExtPlanes *planes) { float A[3], B[3]; GList *lst1, *lst2; g_return_if_fail(VISU_IS_GL_EXT_PLANES(planes)); glDeleteLists(visu_gl_ext_getGlList(VISU_GL_EXT(planes)), 1); if (!planes->priv->planes) return; glNewList(visu_gl_ext_getGlList(VISU_GL_EXT(planes)), GL_COMPILE); /* Set blend if not present. */ glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDisable(GL_LIGHTING); glDisable(GL_DITHER); glLineWidth(1.f); glColor3f(0.f, 0.f, 0.f); glBegin(GL_LINES); for (lst1 = planes->priv->planes; lst1; lst1 = g_list_next(lst1)) for (lst2 = lst1->next; lst2; lst2 = g_list_next(lst2)) if (visu_plane_getRendered(_getPlane(lst1->data)) && visu_plane_getRendered(_getPlane(lst2->data)) && visu_plane_getPlaneIntersection(_getPlane(lst1->data), _getPlane(lst2->data), A, B)) { glVertex3fv(A); glVertex3fv(B); } glEnd(); DBG_fprintf(stderr, "VisuPlane: drawing list of planes.\n"); for (lst1 = planes->priv->planes; lst1; lst1 = g_list_next(lst1)) if (visu_plane_getColor(_getPlane(lst1->data))->rgba[3] == 1.f) visu_plane_draw(_getPlane(lst1->data)); for (lst1 = planes->priv->planes; lst1; lst1 = g_list_next(lst1)) if (visu_plane_getColor(_getPlane(lst1->data))->rgba[3] < 1.f) visu_plane_draw(_getPlane(lst1->data)); glEnable(GL_LIGHTING); glEnable(GL_DITHER); /* WARNING: it is the default! */ glEndList(); } v_sim-3.7.0/src/extensions/planes.h0000644000353400050620000001031512215546077014213 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2013) Adresse ml : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2013) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at COPYING. */ #ifndef PLANES_H #define PLANES_H #include "frame.h" #include #include #include /** * VISU_TYPE_GL_EXT_PLANES: * * return the type of #VisuGlExtPlanes. * * Since: 3.7 */ #define VISU_TYPE_GL_EXT_PLANES (visu_gl_ext_planes_get_type ()) /** * VISU_GL_EXT_PLANES: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuGlExtPlanes type. * * Since: 3.7 */ #define VISU_GL_EXT_PLANES(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_GL_EXT_PLANES, VisuGlExtPlanes)) /** * VISU_GL_EXT_PLANES_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuGlExtPlanesClass. * * Since: 3.7 */ #define VISU_GL_EXT_PLANES_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_GL_EXT_PLANES, VisuGlExtPlanesClass)) /** * VISU_IS_GL_EXT_PLANES: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuGlExtPlanes object. * * Since: 3.7 */ #define VISU_IS_GL_EXT_PLANES(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_GL_EXT_PLANES)) /** * VISU_IS_GL_EXT_PLANES_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuGlExtPlanesClass class. * * Since: 3.7 */ #define VISU_IS_GL_EXT_PLANES_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_GL_EXT_PLANES)) /** * VISU_GL_EXT_PLANES_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. * * Since: 3.7 */ #define VISU_GL_EXT_PLANES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_GL_EXT_PLANES, VisuGlExtPlanesClass)) typedef struct _VisuGlExtPlanes VisuGlExtPlanes; typedef struct _VisuGlExtPlanesPrivate VisuGlExtPlanesPrivate; typedef struct _VisuGlExtPlanesClass VisuGlExtPlanesClass; struct _VisuGlExtPlanes { VisuGlExtFrame parent; VisuGlExtPlanesPrivate *priv; }; struct _VisuGlExtPlanesClass { VisuGlExtFrameClass parent; }; /** * visu_gl_ext_planes_get_type: * * This method returns the type of #VisuGlExtPlanes, use * VISU_TYPE_GL_EXT_PLANES instead. * * Since: 3.7 * * Returns: the type of #VisuGlExtPlanes. */ GType visu_gl_ext_planes_get_type(void); /** * VISU_GL_EXT_PLANES_ID: * * The id used to identify this extension, see * visu_gl_ext_rebuild() for instance. */ #define VISU_GL_EXT_PLANES_ID "Planes" VisuGlExtPlanes* visu_gl_ext_planes_new(const gchar *name); gboolean visu_gl_ext_planes_add(VisuGlExtPlanes *planes, VisuPlane *plane); gboolean visu_gl_ext_planes_remove(VisuGlExtPlanes *planes, VisuPlane *plane); void visu_gl_ext_planes_draw(VisuGlExtPlanes *planes); VisuGlExtPlanes* visu_gl_ext_planes_getDefault(); #endif v_sim-3.7.0/src/extensions/surfs.c0000644000353400050620000010520512215546077014071 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2013) Adresse mèl : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2013) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at COPYING. */ #include "surfs.h" #include #include #include #include #include #include #include /** * SECTION:surfs * @short_description: Defines methods to draw surfaces. * * #VisuSurfaces object can be drawn with this class. Simply * create a new #VisuGlExtSurfaces object and add surfaces with * visu_gl_ext_surfaces_add(). It is better to add several surfaces to * a single #VisuGlExtSurfaces object since all vertices are reordered * when necessary to ensure proper transparency. */ #define DESC_RESOURCE_INTRA "Choose if the interior is drawn in color inverse ;"\ " a boolean (0 or 1)" #define FLAG_RESOURCE_INTRA "isosurfaces_drawIntra" static gboolean INTRA_DEFAULT = FALSE; typedef struct _VisuSurfacesOrder VisuSurfacesOrder; /** * VisuSurfacesOrder: * * Short name to adress #_VisuSurfacesOrder objects. */ struct _VisuSurfacesOrder { /* The size of the allocated arrays. */ guint allocatedSize; /* Any_pointer[i][0:1] gives the id for surfaces and id for poly i in the z sorted from back to front. */ int **any_pointer; /* Store the z value. The array is recomputed each time, but stored here to avoid constant malloc. */ double *any_z; /* Give for all poly the id for surfaces object and the id for poly in this object. any_pointer elements point to that array. */ int *polygon_number; }; VisuSurfacesOrder* visu_surfaces_order_new(void); void visu_surfaces_order_free(VisuSurfacesOrder *order); VisuSurfacesOrder* visu_surfaces_order_copy(VisuSurfacesOrder *order); void visu_surfaces_order_polygons(VisuSurfacesOrder *order, VisuSurfaces *surf[]); static double z_eye(float mat[16], float points[3]) { return (mat[ 2]*points[0]+ mat[ 6]*points[1]+ mat[10]*points[2]+ mat[14]*1.)/ (mat[ 3]*points[0]+ mat[ 7]*points[1]+ mat[11]*points[2]+ mat[15]*1.); } static void sort_by_z(int *pointer[], double *zs, int begin, int end) { int i; int middle; int *temp; if( begin >= end ) return; temp = pointer[begin]; pointer[begin] = pointer[(end+begin)/2]; pointer[(end+begin)/2] = temp; middle = begin; for(i = begin +1; i <= end; i++) { if ( zs[*pointer[i]] < zs[*pointer[begin]] ) { temp = pointer[i]; pointer[i] = pointer[++middle]; pointer[middle] = temp; } } temp = pointer[begin]; pointer[begin] = pointer[middle]; pointer[middle] = temp; sort_by_z(pointer, zs, begin, middle-1); sort_by_z(pointer, zs, middle+1, end); } /** * visu_surfaces_order_new: * * Create an object to hold the order in which the surfaces must be * drawn. See visu_surfaces_order_polygons() to set this object. * * Returns: a newly created #VisuSurfacesOrder object without any values. */ VisuSurfacesOrder* visu_surfaces_order_new(void) { VisuSurfacesOrder *order; order = g_malloc(sizeof(VisuSurfacesOrder)); order->allocatedSize = 0; order->any_pointer = (int**)0; order->any_z = (double*)0; order->polygon_number = (int*)0; return order; } /** * visu_surfaces_order_free: * @order: the object to be freed. * * Free memory used by a #VisuSurfacesOrder object. */ void visu_surfaces_order_free(VisuSurfacesOrder *order) { g_return_if_fail(order); if (order->any_pointer) g_free(order->any_pointer); if (order->any_z) g_free(order->any_z); if (order->polygon_number) g_free(order->polygon_number); g_free(order); } /** * visu_surfaces_order_copy: * @order: a #VisuSurfacesOrder object. * * Do a deep copy of @order. * * Since: 3.7 * * Returns: (transfer full): a new #VisuSurfacesOrder object, copied * from @order. **/ VisuSurfacesOrder* visu_surfaces_order_copy(VisuSurfacesOrder *order) { VisuSurfacesOrder *out; g_return_val_if_fail(order, (VisuSurfacesOrder*)0); out = visu_surfaces_order_new(); out->allocatedSize = order->allocatedSize; if (order->any_pointer) { out->any_pointer = g_malloc(sizeof(int*) * out->allocatedSize); memcpy(out->any_pointer, order->any_pointer, sizeof(int*) * out->allocatedSize); } if (order->any_z) { out->any_z = g_malloc(sizeof(double) * out->allocatedSize); memcpy(out->any_z, order->any_z, sizeof(double) * out->allocatedSize); } if (order->polygon_number) { out->polygon_number = g_malloc(sizeof(int) * out->allocatedSize); memcpy(out->polygon_number, order->polygon_number, sizeof(int) * out->allocatedSize); } return out; } /** * visu_surfaces_order_polygons: * @order: the description of the polygons order ; * @surf: an array of #VisuSurfaces object, must be NULL terminated. * * Re-orders the polygons in back to front order. * This function should be called everytime a redraw is needed. */ void visu_surfaces_order_polygons(VisuSurfacesOrder *order, VisuSurfaces *surf[]) { guint i,j, k, idSurf, nb; float mat[16]; VisuSurfacesPoints *points; g_return_if_fail(surf && order); DBG_fprintf(stderr, "Isosurfaces: re-ordering polygons in back to front order.\n"); /* We compute the number of visible polygons. */ nb = 0; for( idSurf = 0; surf[idSurf]; idSurf++) for ( i = 0; i < surf[idSurf]->nsurf; i++) { DBG_fprintf(stderr, " | - obj %d surface %d -> %d %d (%d).\n", idSurf, i, surf[idSurf]->basePoints.num_polys_surf[i], surf[idSurf]->volatilePlanes.num_polys_surf[i], surf[idSurf]->resources[i]->rendered); if (surf[idSurf]->resources[i]->rendered) { nb += surf[idSurf]->basePoints.num_polys_surf[i]; nb += surf[idSurf]->volatilePlanes.num_polys_surf[i]; } } DBG_fprintf(stderr, "Isosurfaces: found %d visible polygons.\n", nb); /* If the given order object need to be reallocated, we do it. */ if (nb != order->allocatedSize) { DBG_fprintf(stderr, "Isosurfaces: need to reallocate the order object(%d %d).\n", order->allocatedSize, nb); order->any_z = g_realloc(order->any_z, sizeof(double) * nb); order->any_pointer = g_realloc(order->any_pointer, sizeof(int*) * nb); order->polygon_number = g_realloc(order->polygon_number, sizeof(int) * nb * 4); order->allocatedSize = nb; } glGetFloatv(GL_MODELVIEW_MATRIX, mat); /* For all polygons, we compute the z position of the isobarycentre. */ DBG_fprintf(stderr, "Isosurfaces: compute z values.\n"); nb = 0; for( idSurf = 0; surf[idSurf]; idSurf++) { for (k = 0; k < 2; k++) { points = (k == 0)?&surf[idSurf]->basePoints:&surf[idSurf]->volatilePlanes; for( i = 0; i < points->num_polys; i++) { g_return_if_fail(points->poly_surf_index[i]); g_return_if_fail(surf[idSurf]); g_return_if_fail(points->poly_surf_index[i] < 0 || surf[idSurf]->resources[points->poly_surf_index[i] - 1]); if (points->poly_surf_index[i] > 0 && surf[idSurf]->resources[points->poly_surf_index[i] - 1]->rendered) { /* Ok, we handle polygon nb. */ order->polygon_number[4 * nb] = nb; /* We store the surfaces id of this polygon. */ order->polygon_number[4 * nb + 1] = idSurf; /* We store the id of this polygon. */ order->polygon_number[4 * nb + 2] = i; /* We store k to say that this polygon is from base or volatile. */ order->polygon_number[4 * nb + 3] = k; order->any_pointer[nb] = &(order->polygon_number[4 * nb]); order->any_z[nb] = 0.0; for(j = 0; j < points->poly_num_vertices[i]; j++) order->any_z[nb] += z_eye(mat, points->poly_points_data[points->poly_vertices[i][j]]); order->any_z[nb] /= points->poly_num_vertices[i]; nb += 1; } } } } if (nb != order->allocatedSize) { g_error("Incorrect checksum in ordering (%d | %d).", nb, order->allocatedSize); } DBG_fprintf(stderr, "Isosurfaces: sorting..."); sort_by_z(order->any_pointer, order->any_z, 0, nb - 1); DBG_fprintf(stderr, "OK\n"); } /** * VisuGlExtSurfacesClass: * @parent: the parent class; * * A short way to identify #_VisuGlExtSurfacesClass structure. * * Since: 3.7 */ /** * VisuGlExtSurfaces: * * An opaque structure. * * Since: 3.7 */ /** * VisuGlExtSurfacesPrivate: * * Private fields for #VisuGlExtSurfaces objects. * * Since: 3.7 */ struct _VisuGlExtSurfacesPrivate { gboolean dispose_has_run; gboolean isBuilt; /* Polygon ordering for alpha drawing. */ VisuSurfacesOrder *order; gboolean reorderingNeeded; /* Rendering characteristics. */ gboolean drawIntra; /* Signals for the attached objects. */ GList *surfs; VisuGlView *view; gulong angles_signal; VisuInteractive *inter; gulong observe_signal; }; typedef struct _SurfaceHandleStruct { VisuSurfaces *surface; gulong added_signal, removed_signal, masked_signal, rendering_signal, box_signal; } _SurfaceHandle; static VisuGlExtSurfaces* defaultSurfaces; static void visu_gl_ext_surfaces_finalize(GObject* obj); static void visu_gl_ext_surfaces_dispose(GObject* obj); static void visu_gl_ext_surfaces_rebuild(VisuGlExt *ext); /* Callbacks. */ static void onSurfaceAdded(VisuSurfaces *surfaces, gpointer data); static void onSurfaceMasked(VisuSurfaces *surfaces, gpointer data); static void onSurfaceBoxChanged(VisuSurfaces *surfaces, gpointer data); static void onSurfaceRemoved(VisuSurfaces *surfaces, guint idSurf, gpointer data); static void onSurfaceRendering(VisuSurfaces *surfaces, guint idSurf, gpointer data); static void onCameraChange(VisuGlView *view, gpointer data); static void onObserve(VisuInteractive *inter, gboolean start, gpointer data); static void onEntryIntra(VisuGlExtSurfaces *surfs, gchar *key, VisuObject *obj); /* Local methods. */ static void isosurfaces_export_resources(GString *data, VisuData *dataObj, VisuGlView *view); /* Local routines. */ static void _freeSurfaceHandle(gpointer obj) { _SurfaceHandle *shd; shd = (_SurfaceHandle*)obj; g_signal_handler_disconnect(G_OBJECT(shd->surface), shd->added_signal); g_signal_handler_disconnect(G_OBJECT(shd->surface), shd->removed_signal); g_signal_handler_disconnect(G_OBJECT(shd->surface), shd->rendering_signal); g_signal_handler_disconnect(G_OBJECT(shd->surface), shd->masked_signal); g_signal_handler_disconnect(G_OBJECT(shd->surface), shd->box_signal); g_object_unref(shd->surface); #if GLIB_MINOR_VERSION > 9 g_slice_free1(sizeof(_SurfaceHandle), obj); #else g_free(obj); #endif } static gpointer _newSurfaceHandle(VisuGlExtSurfaces *surfaces, VisuSurfaces *surface) { _SurfaceHandle *shd; g_object_ref(surface); #if GLIB_MINOR_VERSION > 9 shd = g_slice_alloc(sizeof(_SurfaceHandle)); #else shd = g_malloc(sizeof(_SurfaceHandle)); #endif DBG_fprintf(stderr, "Extension Surfaces: add listeners on surface %p.\n", (gpointer)surface); shd->surface = surface; shd->added_signal = g_signal_connect(G_OBJECT(surface), "added", G_CALLBACK(onSurfaceAdded), (gpointer)surfaces); shd->removed_signal = g_signal_connect(G_OBJECT(surface), "removed", G_CALLBACK(onSurfaceRemoved), (gpointer)surfaces); shd->masked_signal = g_signal_connect(G_OBJECT(surface), "masked", G_CALLBACK(onSurfaceMasked), (gpointer)surfaces); shd->rendering_signal = g_signal_connect(G_OBJECT(surface), "rendering", G_CALLBACK(onSurfaceRendering), (gpointer)surfaces); shd->box_signal = g_signal_connect(G_OBJECT(surface), "setBox", G_CALLBACK(onSurfaceBoxChanged), (gpointer)surfaces); return (gpointer)shd; } static gint _cmpSurfaceHandle(gconstpointer a, gconstpointer b) { _SurfaceHandle *shd_a = (_SurfaceHandle*)a; if (shd_a->surface == b) return 0; return 1; } #define _getSurface(H) ((_SurfaceHandle*)H)->surface G_DEFINE_TYPE(VisuGlExtSurfaces, visu_gl_ext_surfaces, VISU_TYPE_GL_EXT) static void visu_gl_ext_surfaces_class_init(VisuGlExtSurfacesClass *klass) { VisuConfigFileEntry *entry; DBG_fprintf(stderr, "Extension Surfaces: creating the class of the object.\n"); /* DBG_fprintf(stderr, " - adding new signals ;\n"); */ DBG_fprintf(stderr, " - adding new resources ;\n"); entry = visu_config_file_addBooleanEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_INTRA, DESC_RESOURCE_INTRA, &INTRA_DEFAULT); visu_config_file_entry_setVersion(entry, 3.4f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_RESOURCE, isosurfaces_export_resources); defaultSurfaces = (VisuGlExtSurfaces*)0; /* Connect the overloading methods. */ G_OBJECT_CLASS(klass)->dispose = visu_gl_ext_surfaces_dispose; G_OBJECT_CLASS(klass)->finalize = visu_gl_ext_surfaces_finalize; VISU_GL_EXT_CLASS(klass)->rebuild = visu_gl_ext_surfaces_rebuild; } static void visu_gl_ext_surfaces_init(VisuGlExtSurfaces *obj) { DBG_fprintf(stderr, "Extension Surfaces: initializing a new object (%p).\n", (gpointer)obj); obj->priv = g_malloc(sizeof(VisuGlExtSurfacesPrivate)); obj->priv->dispose_has_run = FALSE; /* Private data. */ obj->priv->isBuilt = FALSE; obj->priv->drawIntra = INTRA_DEFAULT; obj->priv->surfs = (GList*)0; obj->priv->view = (VisuGlView*)0; obj->priv->angles_signal = 0; obj->priv->inter = (VisuInteractive*)0; obj->priv->observe_signal = 0; obj->priv->reorderingNeeded = FALSE; obj->priv->order = visu_surfaces_order_new(); g_signal_connect_object(VISU_OBJECT_INSTANCE, "entryParsed::" FLAG_RESOURCE_INTRA, G_CALLBACK(onEntryIntra), (gpointer)obj, G_CONNECT_SWAPPED); } static void visu_gl_ext_surfaces_dispose(GObject* obj) { VisuGlExtSurfaces *surfaces; GList *lst; DBG_fprintf(stderr, "Extension Surfaces: dispose object %p.\n", (gpointer)obj); surfaces = VISU_GL_EXT_SURFACES(obj); if (surfaces->priv->dispose_has_run) return; surfaces->priv->dispose_has_run = TRUE; /* Disconnect signals. */ for (lst = surfaces->priv->surfs; lst; lst = g_list_next(lst)) _freeSurfaceHandle((_SurfaceHandle*)lst->data); visu_gl_ext_surfaces_setOnTheFlyOrdering(surfaces, (VisuGlView*)0); visu_gl_ext_surfaces_setOnObserveOrdering(surfaces, (VisuInteractive*)0); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_gl_ext_surfaces_parent_class)->dispose(obj); } static void visu_gl_ext_surfaces_finalize(GObject* obj) { VisuGlExtSurfaces *surfaces; g_return_if_fail(obj); DBG_fprintf(stderr, "Extension Surfaces: finalize object %p.\n", (gpointer)obj); surfaces = VISU_GL_EXT_SURFACES(obj); /* Free privs elements. */ if (surfaces->priv) { DBG_fprintf(stderr, "Extension Surfaces: free private surfaces.\n"); visu_surfaces_order_free(surfaces->priv->order); g_list_free(surfaces->priv->surfs); g_free(surfaces->priv); } /* Chain up to the parent class */ DBG_fprintf(stderr, "Extension Surfaces: chain to parent.\n"); G_OBJECT_CLASS(visu_gl_ext_surfaces_parent_class)->finalize(obj); DBG_fprintf(stderr, "Extension Surfaces: freeing ... OK.\n"); } /** * visu_gl_ext_surfaces_new: * @name: (allow-none): the name to give to the extension (default is #VISU_GL_EXT_SURFACES_ID). * * Creates a new #VisuGlExt to draw surfaces. * * Since: 3.7 * * Returns: a pointer to the #VisuGlExt it created or * NULL otherwise. */ VisuGlExtSurfaces* visu_gl_ext_surfaces_new(const gchar *name) { char *name_ = VISU_GL_EXT_SURFACES_ID; char *description = _("Drawing iso-surfaces"); VisuGlExt *extensionSurfaces; DBG_fprintf(stderr,"Extension Surfaces: new object.\n"); extensionSurfaces = VISU_GL_EXT(g_object_new(VISU_TYPE_GL_EXT_SURFACES, "name", (name)?name:name_, "label", _(name), "description", description, "nGlObj", 2, "priority", VISU_GL_EXT_PRIORITY_NORMAL + 2, "saveState", TRUE, NULL)); visu_gl_ext_setSensitiveToRenderingMode(extensionSurfaces, TRUE); return VISU_GL_EXT_SURFACES(extensionSurfaces); } /** * visu_gl_ext_surfaces_add: * @surfaces: a #VisuGlExtSurfaces object. * @surf: (transfer full): a #VisuSurfaces object. * * Add a new surface to the list of drawn surfaces. * * Since: 3.7 * * Returns: FALSE if @surf was already reguistered. **/ gboolean visu_gl_ext_surfaces_add(VisuGlExtSurfaces *surfaces, VisuSurfaces *surf) { GList *lst; g_return_val_if_fail(VISU_IS_GL_EXT_SURFACES(surfaces), FALSE); lst = g_list_find_custom(surfaces->priv->surfs, surf, _cmpSurfaceHandle); if (lst) return FALSE; surfaces->priv->surfs = g_list_prepend(surfaces->priv->surfs, _newSurfaceHandle(surfaces, surf)); surfaces->priv->reorderingNeeded = !visu_gl_getTrueTransparency(); surfaces->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(surfaces)); } /** * visu_gl_ext_surfaces_remove: * @surfaces: a #VisuGlExtSurfaces object. * @surf: a #VisuSurfaces object. * * Removes @surf from the list of drawn surfaces. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_surfaces_draw(à should be called. **/ gboolean visu_gl_ext_surfaces_remove(VisuGlExtSurfaces *surfaces, VisuSurfaces *surf) { GList *lst; g_return_val_if_fail(VISU_IS_GL_EXT_SURFACES(surfaces), FALSE); lst = g_list_find_custom(surfaces->priv->surfs, surf, _cmpSurfaceHandle); if (!lst) return FALSE; _freeSurfaceHandle(lst->data); surfaces->priv->surfs = g_list_delete_link(surfaces->priv->surfs, lst); surfaces->priv->reorderingNeeded = !visu_gl_getTrueTransparency(); surfaces->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(surfaces)); } /** * visu_gl_ext_surfaces_setOnTheFlyOrdering: * @surfaces: the #VisuGlExtSurfaces object to attached to rendering view. * @view: (transfer full) (allow-none): a #VisuGlView object. * * Attach @surfaces to @view, so it can be rendered there. See visu_gl_ext_surfaces_draw(). * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_surfaces_draw() should be called and then 'OpenGLAskForReDraw' * signal be emitted. **/ gboolean visu_gl_ext_surfaces_setOnTheFlyOrdering(VisuGlExtSurfaces *surfaces, VisuGlView *view) { g_return_val_if_fail(VISU_IS_GL_EXT_SURFACES(surfaces), FALSE); /* No change to be done. */ if (view == surfaces->priv->view) return FALSE; if (surfaces->priv->view) { g_signal_handler_disconnect(G_OBJECT(surfaces->priv->view), surfaces->priv->angles_signal); g_object_unref(surfaces->priv->view); } if (view) { g_object_ref(view); surfaces->priv->angles_signal = g_signal_connect(G_OBJECT(view), "ThetaPhiOmegaChanged", G_CALLBACK(onCameraChange), (gpointer)surfaces); } else { surfaces->priv->angles_signal = 0; } surfaces->priv->view = view; return TRUE; } /** * visu_gl_ext_surfaces_setOnObserveOrdering: * @surfaces: the #VisuGlExtSurfaces object to attached to rendering inter. * @inter: (transfer full) (allow-none): a #VisuInteractive object. * * Attach @surfaces to @inter, so it can be rendered there. See visu_gl_ext_surfaces_draw(). * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_surfaces_draw() should be called and then 'OpenGLAskForReDraw' * signal be emitted. **/ gboolean visu_gl_ext_surfaces_setOnObserveOrdering(VisuGlExtSurfaces *surfaces, VisuInteractive *inter) { g_return_val_if_fail(VISU_IS_GL_EXT_SURFACES(surfaces), FALSE); /* No change to be done. */ if (inter == surfaces->priv->inter) return FALSE; if (surfaces->priv->inter) { g_signal_handler_disconnect(G_OBJECT(surfaces->priv->inter), surfaces->priv->observe_signal); g_object_unref(surfaces->priv->inter); DBG_fprintf(stderr, "Extension Surfaces: inter %p has %d ref counts.\n", (gpointer)surfaces->priv->inter, G_OBJECT(surfaces->priv->inter)->ref_count); } if (inter) { g_object_ref(inter); surfaces->priv->observe_signal = g_signal_connect(G_OBJECT(inter), "observe", G_CALLBACK(onObserve), (gpointer)surfaces); DBG_fprintf(stderr, "Extension Surfaces: inter %p has %d ref counts.\n", (gpointer)inter, G_OBJECT(inter)->ref_count); } else { surfaces->priv->observe_signal = 0; } surfaces->priv->inter = inter; return TRUE; } /** * visu_gl_ext_surfaces_getDrawIntra: * @surfs: a #VisuGlExtSurfaces object. * * Retrieve if the interiors of surfaces are drawn with a colour inverse or not. * * Returns: TRUE if the interior is painted in colour inverse. */ gboolean visu_gl_ext_surfaces_getDrawIntra(VisuGlExtSurfaces *surfs) { g_return_val_if_fail(VISU_IS_GL_EXT_SURFACES(surfs), FALSE); return surfs->priv->drawIntra; } /** * visu_gl_ext_surfaces_setDrawIntra: * @surfs: a #VisuGlExtSurfaces object. * @status: a boolean. * * Set if the interiors of surfaces are drawn with a colour inverse or not. * * Returns: TRUE if calling routine should redraw the surfaces with * visu_gl_ext_surfaces_draw(). */ gboolean visu_gl_ext_surfaces_setDrawIntra(VisuGlExtSurfaces *surfs, gboolean status) { g_return_val_if_fail(VISU_IS_GL_EXT_SURFACES(surfs), FALSE); if (surfs->priv->drawIntra == status) return FALSE; surfs->priv->drawIntra = status; surfs->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(surfs)); } /** * visu_gl_ext_surfaces_getDefault: * * V_Sim is using a default surfaces object. * * Since: 3.7 * * Returns: (transfer none): a #VisuGlExtSurfaces object used by default. **/ VisuGlExtSurfaces* visu_gl_ext_surfaces_getDefault() { if (!defaultSurfaces) { defaultSurfaces = visu_gl_ext_surfaces_new((gchar*)0); visu_gl_ext_setActive(VISU_GL_EXT(defaultSurfaces), FALSE); } return defaultSurfaces; } static void sort_block_by_z(int *order, float *z, int begin, int end) { int i; int middle; int temp; if( begin >= end ) return; /* We make sure end + begin / 2 has found its place. */ temp = order[begin]; order[begin] = order[(end + begin) / 2]; order[(end + begin) / 2] = temp; middle = begin; for(i = begin + 1; i <= end; i++) { if ( z[order[i]] < z[order[begin]] ) { temp = order[i]; middle += 1; order[i] = order[middle]; order[middle] = temp; } } temp = order[begin]; order[begin] = order[middle]; order[middle] = temp; sort_block_by_z(order, z, begin, middle-1); sort_block_by_z(order, z, middle+1, end); } /** * visu_surfaces_duplicate: * @totalList: an OpenGL identifier for the global list to create ; * @simpleBlockList: an OpenGL identifier for the list with the * surfaces in the primitive cell ; * @box: the definition of the #VisuBox for extension ; * @reorder: if TRUE the blocks are drawn from back to front. * * Duplicate the list @simpleBlockList using the extension of the * given @box. */ static void _duplicate(int totalList, int simpleBlockList, VisuBox *box, gboolean reorder) { float ext[3], *xyzTrans, boxTrans[3], *z; int i, j, k, n, *order; float mat[16]; DBG_fprintf(stderr, "Isosurfaces: duplicate the primitive block.\n"); g_return_if_fail(VISU_IS_BOX(box)); /* Duplicate the surface according to the box extension. */ visu_box_getExtension(box, ext); if (reorder) glGetFloatv(GL_MODELVIEW_MATRIX, mat); n = (1 + 2 * (int)ext[0]) * (1 + 2 * (int)ext[1]) * (1 + 2 * (int)ext[2]); xyzTrans = g_malloc(sizeof(int) * 3 * n); z = (float*)0; if (reorder) z = g_malloc(sizeof(float) * n); order = g_malloc(sizeof(int) * n); n = 0; for (i = -(int)ext[0]; i < 1 + (int)ext[0]; i++) for (j = -(int)ext[1]; j < 1 + (int)ext[1]; j++) for (k = -(int)ext[2]; k < 1 + (int)ext[2]; k++) { boxTrans[0] = (float)i; boxTrans[1] = (float)j; boxTrans[2] = (float)k; visu_box_convertBoxCoordinatestoXYZ(box, xyzTrans + 3 * n, boxTrans); if (reorder) z[n] = (mat[ 2] * xyzTrans[3 * n + 0] + mat[ 6] * xyzTrans[3 * n + 1] + mat[10] * xyzTrans[3 * n + 2] + mat[14] * 1.) / (mat[ 3] * xyzTrans[3 * n + 0] + mat[ 7] * xyzTrans[3 * n + 1] + mat[11] * xyzTrans[3 * n + 2] + mat[15] * 1.); order[n] = n; n += 1; } if (reorder) /* we sort xyzTrans following z values. */ sort_block_by_z(order, z, 0, n - 1); glNewList(totalList, GL_COMPILE); for (i = 0; i < n; i++) { /* DBG_fprintf(stderr, "Isosurfaces: translate surfaces to box %d.\n", */ /* order[i]); */ glPushMatrix(); glTranslated(xyzTrans[3 * order[i] + 0], xyzTrans[3 * order[i] + 1], xyzTrans[3 * order[i] + 2]); glCallList(simpleBlockList); glPopMatrix(); } glEndList(); g_free(order); g_free(xyzTrans); if (reorder) g_free(z); } /** * visu_gl_ext_surfaces_draw: * @surfs: a #VisuGlExtSurfaces object. * * Rebuild each visible surface's list. The order in which to draw the surfaces * is given in the @order argument. If the resource 'isosurfaces_drawIntra' is TRUE * then, the interior of the surfaces is drawn as color inverse. * * Since: 3.7 */ void visu_gl_ext_surfaces_draw(VisuGlExtSurfaces *surfs) { GList *lst; guint i, ip; VisuSurfaces **surf; VisuSurfacesPoints *points; int j, itp, idSurf; VisuSurfacesResources *res, *res_old; float rgba[4]; VisuBox *box; g_return_if_fail(VISU_IS_GL_EXT_SURFACES(surfs)); /* Nothing to draw; */ if(!visu_gl_ext_getActive(VISU_GL_EXT(surfs)) || surfs->priv->isBuilt) return; DBG_fprintf(stderr, "Isosurfaces: rebuilding surfaces list\n"); surfs->priv->isBuilt = TRUE; glDeleteLists(visu_gl_ext_getGlList(VISU_GL_EXT(surfs)), 1); if (!surfs->priv->surfs) return; glNewList(visu_gl_ext_getGlList(VISU_GL_EXT(surfs)) + 1, GL_COMPILE); if (surfs->priv->drawIntra) glEnable(GL_CULL_FACE); else glDisable(GL_CULL_FACE); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); /* We create an array of VisuSurfaces for the list. */ surf = g_malloc(sizeof(VisuSurfaces*) * (g_list_length(surfs->priv->surfs) + 1)); for( lst = surfs->priv->surfs, idSurf = 0; lst; lst = g_list_next(lst), idSurf++) { surf[idSurf] = _getSurface((_SurfaceHandle*)lst->data); DBG_fprintf(stderr, " | %p\n", (gpointer)surf[idSurf]); } DBG_fprintf(stderr, "Extension Surfaces: %d stored surface objects.\n", idSurf); surf[idSurf] = (VisuSurfaces*)0; /* We compute the number of visible polygons. */ /* nb = 0; */ /* for(idSurf = 0; surf[idSurf] ; idSurf++) */ /* for ( i = 0; i < visu_surfaces_getN(surf[idSurf]); i++) */ /* { */ /* DBG_fprintf(stderr, " | - obj %d surface %d -> %d %d.\n", */ /* idSurf, i, surf[idSurf]->basePoints.num_polys_surf[i], */ /* surf[idSurf]->volatilePlanes.num_polys_surf[i]); */ /* if (visu_surfaces_resources_getRendered(visu_surfaces_getResource(surf[idSurf], i))) */ /* { */ /* nb += surf[idSurf]->basePoints.num_polys_surf[i]; */ /* nb += surf[idSurf]->volatilePlanes.num_polys_surf[i]; */ /* } */ /* } */ /* DBG_fprintf(stderr, " | found %d visible polygons.\n", nb); */ /* If order is out of date, we update. */ if (surfs->priv->reorderingNeeded || surfs->priv->order->allocatedSize == 0) { visu_surfaces_order_polygons(surfs->priv->order, surf); surfs->priv->reorderingNeeded = FALSE; } DBG_fprintf(stderr, " | draw polygons.\n"); res = res_old = (VisuSurfacesResources*)0; for(i = 0; i < surfs->priv->order->allocatedSize; i++) { idSurf = *(surfs->priv->order->any_pointer[i] + 1); /* ip is index of polygon in surf[idSurf]. */ ip = *(surfs->priv->order->any_pointer[i] + 2); points = (*(surfs->priv->order->any_pointer[i] + 3) == 0)? &surf[idSurf]->basePoints:&surf[idSurf]->volatilePlanes; /* itp is index of surface of polygon ip. */ itp = points->poly_surf_index[ip] - 1; /* if(surf_draw_flag[itp] == 0) continue; */ res = surf[idSurf]->resources[itp]; if (res != res_old) { /* if(res->rendered == FALSE) */ /* continue; */ if (surfs->priv->drawIntra) { rgba[0] = 1. - res->color->rgba[0]; rgba[1] = 1. - res->color->rgba[1]; rgba[2] = 1. - res->color->rgba[2]; rgba[3] = res->color->rgba[3]; } else visu_gl_setColor(res->material, res->color->rgba); /* glCallList(lists_location + itp); */ res_old = res; } /* This is where to find the points and the normals. */ glBegin(GL_POLYGON); if (surfs->priv->drawIntra) visu_gl_setColor(res->material, res->color->rgba); for(j = 0; j < (int)points->poly_num_vertices[ip]; j++ ) { glNormal3fv(points->poly_points_data[points->poly_vertices[ip][j]] + VISU_SURFACES_POINTS_OFFSET_NORMAL); glVertex3fv(points->poly_points_data[points->poly_vertices[ip][j]]); } glEnd(); if (surfs->priv->drawIntra) { glBegin(GL_POLYGON); visu_gl_setColor(res->material, rgba); for(j = points->poly_num_vertices[ip] - 1; j >= 0; j-- ) { glNormal3f(-points->poly_points_data[points->poly_vertices[ip][j]][VISU_SURFACES_POINTS_OFFSET_NORMAL + 0], -points->poly_points_data[points->poly_vertices[ip][j]][VISU_SURFACES_POINTS_OFFSET_NORMAL + 1], -points->poly_points_data[points->poly_vertices[ip][j]][VISU_SURFACES_POINTS_OFFSET_NORMAL + 2]); glVertex3fv(points->poly_points_data[points->poly_vertices[ip][j]]); } glEnd(); } } glEndList(); box = visu_boxed_getBox(VISU_BOXED(surf[0])); g_free(surf); /* Duplicate here. */ _duplicate(visu_gl_ext_getGlList(VISU_GL_EXT(surfs)), visu_gl_ext_getGlList(VISU_GL_EXT(surfs)) + 1, box, TRUE); } /**************/ /* Callbacks. */ /**************/ static void visu_gl_ext_surfaces_rebuild(VisuGlExt *ext) { VISU_GL_EXT_SURFACES(ext)->priv->isBuilt = FALSE; VISU_GL_EXT_SURFACES(ext)->priv->reorderingNeeded = TRUE; visu_gl_ext_surfaces_draw(VISU_GL_EXT_SURFACES(ext)); } static void onSurfaceAdded(VisuSurfaces *surfaces _U_, gpointer data) { VISU_GL_EXT_SURFACES(data)->priv->reorderingNeeded = !visu_gl_getTrueTransparency(); VISU_GL_EXT_SURFACES(data)->priv->isBuilt = FALSE; visu_gl_ext_surfaces_draw(VISU_GL_EXT_SURFACES(data)); } static void onSurfaceBoxChanged(VisuSurfaces *surfaces _U_, gpointer data) { VISU_GL_EXT_SURFACES(data)->priv->isBuilt = FALSE; visu_gl_ext_surfaces_draw(VISU_GL_EXT_SURFACES(data)); } static void onSurfaceRemoved(VisuSurfaces *surfaces _U_, guint idSurf _U_, gpointer data) { VISU_GL_EXT_SURFACES(data)->priv->reorderingNeeded = !visu_gl_getTrueTransparency(); VISU_GL_EXT_SURFACES(data)->priv->isBuilt = FALSE; visu_gl_ext_surfaces_draw(VISU_GL_EXT_SURFACES(data)); } static void onSurfaceMasked(VisuSurfaces *surfaces _U_, gpointer data) { VISU_GL_EXT_SURFACES(data)->priv->reorderingNeeded = !visu_gl_getTrueTransparency(); VISU_GL_EXT_SURFACES(data)->priv->isBuilt = FALSE; visu_gl_ext_surfaces_draw(VISU_GL_EXT_SURFACES(data)); } static void onSurfaceRendering(VisuSurfaces *surfaces _U_, guint idSurf _U_, gpointer data) { VISU_GL_EXT_SURFACES(data)->priv->reorderingNeeded = !visu_gl_getTrueTransparency(); VISU_GL_EXT_SURFACES(data)->priv->isBuilt = FALSE; } static void onCameraChange(VisuGlView *view _U_, gpointer data) { VISU_GL_EXT_SURFACES(data)->priv->reorderingNeeded = !visu_gl_getTrueTransparency(); VISU_GL_EXT_SURFACES(data)->priv->isBuilt = FALSE; visu_gl_ext_surfaces_draw(VISU_GL_EXT_SURFACES(data)); } static void onObserve(VisuInteractive *inter _U_, gboolean start, gpointer data) { if (!VISU_GL_EXT_SURFACES(data)->priv->view && !start) { VISU_GL_EXT_SURFACES(data)->priv->reorderingNeeded = !visu_gl_getTrueTransparency(); VISU_GL_EXT_SURFACES(data)->priv->isBuilt = FALSE; visu_gl_ext_surfaces_draw(VISU_GL_EXT_SURFACES(data)); } } static void onEntryIntra(VisuGlExtSurfaces *surfs, gchar *key _U_, VisuObject *obj _U_) { visu_gl_ext_surfaces_setDrawIntra(surfs, INTRA_DEFAULT); } /***************/ /* Properties. */ /***************/ static void isosurfaces_export_resources(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { if (!defaultSurfaces) return; visu_config_file_exportComment(data, DESC_RESOURCE_INTRA); visu_config_file_exportEntry(data, FLAG_RESOURCE_INTRA, NULL, "%d", defaultSurfaces->priv->drawIntra); visu_config_file_exportComment(data, ""); } v_sim-3.7.0/src/extensions/surfs.h0000644000353400050620000001162012215546077014073 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2013) Adresse mèl : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2013) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at COPYING. */ #ifndef SURFS_H #define SURFS_H #include #include #include #include /** * VISU_TYPE_GL_EXT_SURFACES: * * return the type of #VisuGlExtSurfaces. * * Since: 3.7 */ #define VISU_TYPE_GL_EXT_SURFACES (visu_gl_ext_surfaces_get_type ()) /** * VISU_GL_EXT_SURFACES: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuGlExtSurfaces type. * * Since: 3.7 */ #define VISU_GL_EXT_SURFACES(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_GL_EXT_SURFACES, VisuGlExtSurfaces)) /** * VISU_GL_EXT_SURFACES_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuGlExtSurfacesClass. * * Since: 3.7 */ #define VISU_GL_EXT_SURFACES_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_GL_EXT_SURFACES, VisuGlExtSurfacesClass)) /** * VISU_IS_GL_EXT_SURFACES: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuGlExtSurfaces object. * * Since: 3.7 */ #define VISU_IS_GL_EXT_SURFACES(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_GL_EXT_SURFACES)) /** * VISU_IS_GL_EXT_SURFACES_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuGlExtSurfacesClass class. * * Since: 3.7 */ #define VISU_IS_GL_EXT_SURFACES_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_GL_EXT_SURFACES)) /** * VISU_GL_EXT_SURFACES_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. * * Since: 3.7 */ #define VISU_GL_EXT_SURFACES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_GL_EXT_SURFACES, VisuGlExtSurfacesClass)) typedef struct _VisuGlExtSurfaces VisuGlExtSurfaces; typedef struct _VisuGlExtSurfacesPrivate VisuGlExtSurfacesPrivate; typedef struct _VisuGlExtSurfacesClass VisuGlExtSurfacesClass; struct _VisuGlExtSurfaces { VisuGlExt parent; VisuGlExtSurfacesPrivate *priv; }; struct _VisuGlExtSurfacesClass { VisuGlExtClass parent; }; /** * VISU_GL_EXT_SURFACES_ID: * * The id used to identify this extension, see * visu_gl_ext_rebuild() for instance. */ #define VISU_GL_EXT_SURFACES_ID "Surfaces" /** * visu_gl_ext_surfaces_get_type: * * This method returns the type of #VisuGlExtSurfaces, use * VISU_TYPE_GL_EXT_SURFACES instead. * * Since: 3.7 * * Returns: the type of #VisuGlExtSurfaces. */ GType visu_gl_ext_surfaces_get_type(void); VisuGlExtSurfaces* visu_gl_ext_surfaces_new(const gchar *name); gboolean visu_gl_ext_surfaces_add(VisuGlExtSurfaces *surfaces, VisuSurfaces *surf); gboolean visu_gl_ext_surfaces_remove(VisuGlExtSurfaces *surfaces, VisuSurfaces *surf); gboolean visu_gl_ext_surfaces_setOnTheFlyOrdering(VisuGlExtSurfaces *surfaces, VisuGlView *view); gboolean visu_gl_ext_surfaces_setOnObserveOrdering(VisuGlExtSurfaces *surfaces, VisuInteractive *inter); gboolean visu_gl_ext_surfaces_getDrawIntra(VisuGlExtSurfaces *surfs); gboolean visu_gl_ext_surfaces_setDrawIntra(VisuGlExtSurfaces *surfs, gboolean status); VisuGlExtSurfaces* visu_gl_ext_surfaces_getDefault(void); void visu_gl_ext_surfaces_draw(VisuGlExtSurfaces *surfs); /* void visu_surfaces_draw(int OpenGLId, VisuSurfaces *surf[], VisuSurfacesOrder *order); */ #endif v_sim-3.7.0/src/extensions/maps.c0000644000353400050620000004403612215552253013664 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2013) Adresse mèl : BILLARD, non joignable par mèl ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2013) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "maps.h" #include #include #include /** * SECTION:maps * @short_description: Defines methods to draw maps. * * Maps are coloured representation of a #VisuScalarField on a #VisuPlane. */ /** * VisuGlExtMapsClass: * @parent: the parent class; * * A short way to identify #_VisuGlExtMapsClass structure. * * Since: 3.7 */ /** * VisuGlExtMaps: * * An opaque structure. * * Since: 3.7 */ /** * VisuGlExtMapsPrivate: * * Private fields for #VisuGlExtMaps objects. * * Since: 3.7 */ struct _VisuGlExtMapsPrivate { gboolean dispose_has_run; gboolean isBuilt; GList *maps; /* Objects for rendering. */ VisuGlView *view; gulong gross_signal, detail_signal; }; typedef struct _MapHandleStruct { VisuMap *map; gboolean isBuilt; float prec; ToolShade *shade; ToolColor *color; gboolean alpha; /* The OpenGL list for this map. */ int glListId; } _MapHandle; static void visu_gl_ext_maps_finalize(GObject* obj); static void visu_gl_ext_maps_dispose(GObject* obj); static void visu_gl_ext_maps_rebuild(VisuGlExt *ext); /* Local callbacks */ static void onViewChange(VisuGlView *view, gpointer data); /* Local routines. */ static void _setZoomLevel(_MapHandle *mhd, VisuGlView *view); static void _freeMapHandle(gpointer obj) { _MapHandle *mhd; mhd = (_MapHandle*)obj; visu_map_unref(mhd->map); tool_shade_free(mhd->shade); g_free(mhd->color); glDeleteLists(mhd->glListId, 1); #if GLIB_MINOR_VERSION > 9 g_slice_free1(sizeof(_MapHandle), obj); #else g_free(obj); #endif } static gpointer _newMapHandle(VisuGlExtMaps *maps, VisuMap *map, float prec, ToolShade *shade, ToolColor *color, gboolean alpha) { _MapHandle *mhd; visu_map_ref(map); #if GLIB_MINOR_VERSION > 9 mhd = g_slice_alloc(sizeof(_MapHandle)); #else mhd = g_malloc(sizeof(_MapHandle)); #endif DBG_fprintf(stderr, "Extension Maps: add listeners on map %p.\n", (gpointer)map); mhd->map = map; mhd->isBuilt = FALSE; mhd->prec = prec; mhd->shade = tool_shade_copy(shade); mhd->color = g_boxed_copy(TOOL_TYPE_COLOR, color); mhd->alpha = alpha; mhd->glListId = visu_gl_objectlist_new(1); if (maps->priv->view) _setZoomLevel(mhd, maps->priv->view); return (gpointer)mhd; } static gint _cmpMapHandle(gconstpointer a, gconstpointer b) { _MapHandle *mhd_a = (_MapHandle*)a; if (mhd_a->map == b) return 0; return 1; } #define _getMap(H) ((_MapHandle*)H)->map G_DEFINE_TYPE(VisuGlExtMaps, visu_gl_ext_maps, VISU_TYPE_GL_EXT) static void visu_gl_ext_maps_class_init(VisuGlExtMapsClass *klass) { DBG_fprintf(stderr, "Extension Maps: creating the class of the object.\n"); /* DBG_fprintf(stderr, " - adding new signals ;\n"); */ /* Connect the overloading methods. */ G_OBJECT_CLASS(klass)->dispose = visu_gl_ext_maps_dispose; G_OBJECT_CLASS(klass)->finalize = visu_gl_ext_maps_finalize; VISU_GL_EXT_CLASS(klass)->rebuild = visu_gl_ext_maps_rebuild; } static void visu_gl_ext_maps_init(VisuGlExtMaps *obj) { DBG_fprintf(stderr, "Extension Maps: initializing a new object (%p).\n", (gpointer)obj); obj->priv = g_malloc(sizeof(VisuGlExtMapsPrivate)); obj->priv->dispose_has_run = FALSE; /* Private data. */ obj->priv->isBuilt = FALSE; obj->priv->maps = (GList*)0; obj->priv->view = (VisuGlView*)0; obj->priv->gross_signal = 0; obj->priv->detail_signal = 0; } static void visu_gl_ext_maps_dispose(GObject* obj) { VisuGlExtMaps *maps; GList *lst; DBG_fprintf(stderr, "Extension Maps: dispose object %p.\n", (gpointer)obj); maps = VISU_GL_EXT_MAPS(obj); if (maps->priv->dispose_has_run) return; maps->priv->dispose_has_run = TRUE; /* Disconnect signals. */ visu_gl_ext_maps_setGlView(maps, (VisuGlView*)0); for (lst = maps->priv->maps; lst; lst = g_list_next(lst)) _freeMapHandle(lst->data); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_gl_ext_maps_parent_class)->dispose(obj); } static void visu_gl_ext_maps_finalize(GObject* obj) { VisuGlExtMaps *maps; g_return_if_fail(obj); DBG_fprintf(stderr, "Extension Maps: finalize object %p.\n", (gpointer)obj); maps = VISU_GL_EXT_MAPS(obj); /* Free privs elements. */ if (maps->priv) { DBG_fprintf(stderr, "Extension Maps: free private maps.\n"); g_list_free(maps->priv->maps); g_free(maps->priv); } /* Chain up to the parent class */ DBG_fprintf(stderr, "Extension Maps: chain to parent.\n"); G_OBJECT_CLASS(visu_gl_ext_maps_parent_class)->finalize(obj); DBG_fprintf(stderr, "Extension Maps: freeing ... OK.\n"); } /** * visu_gl_ext_maps_new: * @name: (allow-none): the name to give to the extension (default is #VISU_GL_EXT_MAPS_ID). * * Creates a new #VisuGlExt to draw maps. * * Since: 3.7 * * Returns: a pointer to the #VisuGlExt it created or * NULL otherwise. */ VisuGlExtMaps* visu_gl_ext_maps_new(const gchar *name) { char *name_ = VISU_GL_EXT_MAPS_ID; char *description = _("Drawing extension for maps."); VisuGlExt *extensionMaps; DBG_fprintf(stderr,"Extension Maps: new object.\n"); extensionMaps = VISU_GL_EXT(g_object_new(VISU_TYPE_GL_EXT_MAPS, "name", (name)?name:name_, "label", _(name), "description", description, "nGlObj", 1, "priority", VISU_GL_EXT_PRIORITY_NORMAL - 1, "saveState", TRUE, NULL)); return VISU_GL_EXT_MAPS(extensionMaps); } /** * visu_gl_ext_maps_setGlView: * @maps: the #VisuGlExtMaps object to attached to rendering view. * @view: (transfer full) (allow-none): a #VisuGlView object. * * Attach @maps to @view, so it can be rendered there. See visu_gl_ext_maps_draw(). * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_maps_draw() should be called and then 'OpenGLAskForReDraw' * signal be emitted. **/ gboolean visu_gl_ext_maps_setGlView(VisuGlExtMaps *maps, VisuGlView *view) { GList *lst; g_return_val_if_fail(VISU_IS_GL_EXT_MAPS(maps), FALSE); /* No change to be done. */ if (view == maps->priv->view) return FALSE; if (maps->priv->view) { /* g_signal_handler_disconnect(G_OBJECT(maps->priv->view), maps->priv->gross_signal); */ g_signal_handler_disconnect(G_OBJECT(maps->priv->view), maps->priv->detail_signal); g_object_unref(maps->priv->view); } if (view) { g_object_ref(view); /* maps->priv->gross_signal = */ /* g_signal_connect(G_OBJECT(view), "GrossChanged", */ /* G_CALLBACK(onViewChange), (gpointer)maps); */ maps->priv->detail_signal = g_signal_connect(G_OBJECT(view), "DetailLevelChanged", G_CALLBACK(onViewChange), (gpointer)maps); } else { /* maps->priv->gross_signal = 0; */ maps->priv->detail_signal = 0; } maps->priv->view = view; /* Adjust zoom level for all maps. */ for (lst = maps->priv->maps; lst; lst = g_list_next(lst)) _setZoomLevel((_MapHandle*)lst->data, view); maps->priv->isBuilt = FALSE; return TRUE; } /** * visu_gl_ext_maps_add: * @maps: a #VisuGlExtMaps object. * @map: (transfer full): a #VisuMaps object. * @prec: rendering adaptivity level (default is 100). * @shade: (transfer full): a #ToolShade object. * @color: (transfer full) (allow-none): a #ToolColor object. * @alpha: a boolean. * * Add a new map to the list of drawn maps. If @color is %NULL, then * iso-lines will be drawn in inverse color. * * Since: 3.7 * * Returns: FALSE if @surf was already reguistered. **/ gboolean visu_gl_ext_maps_add(VisuGlExtMaps *maps, VisuMap *map, float prec, ToolShade *shade, ToolColor *color, gboolean alpha) { GList *lst; g_return_val_if_fail(VISU_IS_GL_EXT_MAPS(maps), FALSE); lst = g_list_find_custom(maps->priv->maps, map, _cmpMapHandle); if (lst) return FALSE; maps->priv->maps = g_list_prepend(maps->priv->maps, _newMapHandle(maps, map, prec, shade, color, alpha)); maps->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(maps)); } /** * visu_gl_ext_maps_remove: * @maps: a #VisuGlExtMaps object. * @map: a #VisuMaps object. * * Removes @map from the list of drawn maps. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_maps_draw(à should be called. **/ gboolean visu_gl_ext_maps_remove(VisuGlExtMaps *maps, VisuMap *map) { GList *lst; g_return_val_if_fail(VISU_IS_GL_EXT_MAPS(maps), FALSE); lst = g_list_find_custom(maps->priv->maps, map, _cmpMapHandle); if (!lst) return FALSE; _freeMapHandle(lst->data); maps->priv->maps = g_list_delete_link(maps->priv->maps, lst); maps->priv->isBuilt = FALSE; return visu_gl_ext_getActive(VISU_GL_EXT(maps)); } static gboolean _getMapIter(VisuGlExtMaps *maps, VisuMap *map, GList *iter) { GList *lst; if (map) { lst = g_list_find_custom(maps->priv->maps, map, _cmpMapHandle); if (!lst) return FALSE; iter->data = lst->data; iter->next = (GList*)0; } else { if (!maps->priv->maps) return FALSE; *iter = *maps->priv->maps; } return TRUE; } /** * visu_gl_ext_maps_setPrecision: * @maps: a #VisuGlExtMaps object. * @map: a #VisuMap object. * @prec: a floating point value (default is 100). * * Changes the adaptative mesh of @map. At a value of 200, there is no * adaptivity and all triangles are rendered. At a level of 100, a * variation of less than 3% on neighbouring triangles make them merged. * * Since: 3.7 * * Returns: TRUE if @prec of @map is changed. **/ gboolean visu_gl_ext_maps_setPrecision(VisuGlExtMaps *maps, VisuMap *map, float prec) { GList *lst, iter; _MapHandle *mhd; gboolean diff; g_return_val_if_fail(VISU_IS_GL_EXT_MAPS(maps), FALSE); if (!_getMapIter(maps, map, &iter)) return FALSE; diff = FALSE; for (lst = &iter; lst; lst = g_list_next(lst)) { mhd = (_MapHandle*)lst->data; if (mhd->prec != prec) { mhd->prec = prec; mhd->isBuilt = FALSE; diff = TRUE; } } maps->priv->isBuilt = !diff; return diff; } /** * visu_gl_ext_maps_setShade: * @maps: a #VisuGlExtMaps object. * @map: a #VisuMap object. * @shade: (allow-none) (transfer full): a #ToolShade object. * * Changes the #ToolShade used to render data variation on the @map. * * Since: 3.7 * * Returns: TRUE if @shade of @map is changed. **/ gboolean visu_gl_ext_maps_setShade(VisuGlExtMaps *maps, VisuMap *map, ToolShade *shade) { GList *lst, iter; _MapHandle *mhd; gboolean diff; g_return_val_if_fail(VISU_IS_GL_EXT_MAPS(maps), FALSE); DBG_fprintf(stderr, "Extension Maps: change shade (for maps %p).\n", (gpointer)map); if (!_getMapIter(maps, map, &iter)) return FALSE; diff = FALSE; for (lst = &iter; lst; lst = g_list_next(lst)) { mhd = (_MapHandle*)lst->data; DBG_fprintf(stderr, " | map %p, update %d.\n", (gpointer)mhd->map, !tool_shade_compare(mhd->shade, shade)); if (!tool_shade_compare(mhd->shade, shade)) { tool_shade_free(mhd->shade); mhd->shade = tool_shade_copy(shade); mhd->isBuilt = FALSE; diff = TRUE; } } maps->priv->isBuilt = !diff; return diff; } /** * visu_gl_ext_maps_setLineColor: * @maps: a #VisuGlExtMaps object. * @map: a #VisuMap object. * @color: (allow-none) (transfer full): a #ToolColor object. * * Changes the rendered isoline color of @map to @color. If @color is * %NULL, then the isolines will be color inversed to the #ToolShade * of @map (see visu_gl_ext_maps_setShade()). * * Since: 3.7 * * Returns: TRUE if @color of @map is changed. **/ gboolean visu_gl_ext_maps_setLineColor(VisuGlExtMaps *maps, VisuMap *map, ToolColor *color) { GList *lst, iter; _MapHandle *mhd; gboolean diff; g_return_val_if_fail(VISU_IS_GL_EXT_MAPS(maps), FALSE); if (!_getMapIter(maps, map, &iter)) return FALSE; diff = FALSE; for (lst = &iter; lst; lst = g_list_next(lst)) { mhd = (_MapHandle*)lst->data; if (!tool_color_equal(mhd->color, color)) { g_free(mhd->color); mhd->color = g_boxed_copy(TOOL_TYPE_COLOR, color); mhd->isBuilt = FALSE; diff = TRUE; } } maps->priv->isBuilt = !diff; return diff; } /** * visu_gl_ext_maps_setTransparent: * @maps: a #VisuGlExtMaps object. * @map: a #VisuMap object. * @alpha: a boolean. * * Sets if @map is rendered with transparency or not. If @alpha is * %TRUE, the lower the rendered value is, the more transparent the * colour will be. * * Since: 3.7 * * Returns: TRUE if transparency of @map is changed. **/ gboolean visu_gl_ext_maps_setTransparent(VisuGlExtMaps *maps, VisuMap *map, gboolean alpha) { GList *lst, iter; _MapHandle *mhd; gboolean diff; g_return_val_if_fail(VISU_IS_GL_EXT_MAPS(maps), FALSE); if (!_getMapIter(maps, map, &iter)) return FALSE; diff = FALSE; for (lst = &iter; lst; lst = g_list_next(lst)) { mhd = (_MapHandle*)lst->data; if (mhd->alpha != alpha) { mhd->alpha = alpha; mhd->isBuilt = FALSE; diff = TRUE; } } maps->priv->isBuilt = !diff; return diff; } /** * visu_gl_ext_maps_setDirty: * @maps: a #VisuGlExtMaps object. * @map: a #VisuMap object. * * Currently, #VisuMap are not objects, so @maps cannot react to a * change on them. Callers have to set by hand that @maps should be * redrawn with this routine. * * Since: 3.7 * * Returns: TRUE is @map is a drawn #VisuMap of @maps. **/ gboolean visu_gl_ext_maps_setDirty(VisuGlExtMaps *maps, VisuMap *map) { GList *lst, iter; g_return_val_if_fail(VISU_IS_GL_EXT_MAPS(maps), FALSE); if (!_getMapIter(maps, map, &iter)) return FALSE; for (lst = &iter; lst; lst = g_list_next(lst)) ((_MapHandle*)lst->data)->isBuilt = FALSE; maps->priv->isBuilt = FALSE; return TRUE; } /** * visu_gl_ext_maps_draw: * @maps: a #VisuGlExtMaps object. * * Render the OpenGL list of @maps. * * Since: 3.7 **/ void visu_gl_ext_maps_draw(VisuGlExtMaps *maps) { _MapHandle *mhd; GList *lst; #if DEBUG == 1 GTimer *timer; gulong fractionTimer; #endif g_return_if_fail(VISU_IS_GL_EXT_MAPS(maps)); /* Nothing to draw; */ if(!visu_gl_ext_getActive(VISU_GL_EXT(maps)) || maps->priv->isBuilt) return; DBG_fprintf(stderr, "Extension Maps: rebuilding map list.\n"); maps->priv->isBuilt = TRUE; glDeleteLists(visu_gl_ext_getGlList(VISU_GL_EXT(maps)), 1); if (!maps->priv->maps) return; #if DEBUG == 1 timer = g_timer_new(); g_timer_start(timer); #endif /* Rebuild maps if required. */ for (lst = maps->priv->maps; lst; lst = g_list_next(lst)) { mhd = (_MapHandle*)lst->data; if (!mhd->isBuilt) { glNewList(mhd->glListId, GL_COMPILE); visu_map_draw(_getMap(lst->data), mhd->prec, mhd->shade, (mhd->color)?mhd->color->rgba:(float*)0, mhd->alpha); glEndList(); } } /* Call the map one by one. */ glNewList(visu_gl_ext_getGlList(VISU_GL_EXT(maps)), GL_COMPILE); for (lst = maps->priv->maps; lst; lst = g_list_next(lst)) glCallList(((_MapHandle*)lst->data)->glListId); glEndList(); #if DEBUG == 1 g_timer_stop(timer); fprintf(stderr, "Extension Maps: draw map(s) in %g micro-s.\n", g_timer_elapsed(timer, &fractionTimer)/1e-6); g_timer_destroy(timer); #endif } static void _setZoomLevel(_MapHandle *mhd, VisuGlView *view) { mhd->isBuilt = FALSE; visu_map_setLevel(mhd->map, visu_gl_view_class_getPrecision(), view->camera->gross, visu_gl_camera_getRefLength(view->camera, (ToolUnits*)0)); } /* Callbacks. */ static void visu_gl_ext_maps_rebuild(VisuGlExt *ext) { VisuGlExtMaps *maps = VISU_GL_EXT_MAPS(ext); GList *lst; maps->priv->isBuilt = FALSE; for (lst = maps->priv->maps; lst; lst = g_list_next(lst)) ((_MapHandle*)lst->data)->isBuilt = FALSE; visu_gl_ext_maps_draw(maps); } static void onViewChange(VisuGlView *view, gpointer data) { VisuGlExtMaps *maps = VISU_GL_EXT_MAPS(data); GList *lst; maps->priv->isBuilt = FALSE; for (lst = maps->priv->maps; lst; lst = g_list_next(lst)) { _setZoomLevel((_MapHandle*)lst->data, view); visu_map_compute(((_MapHandle*)lst->data)->map); } visu_gl_ext_maps_draw(maps); } v_sim-3.7.0/src/extensions/maps.h0000644000353400050620000001115712215546077013676 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2013) Adresse mèl : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2013) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at COPYING. */ #ifndef MAPS_H #define MAPS_H #include "frame.h" #include #include /** * VISU_TYPE_GL_EXT_MAPS: * * return the type of #VisuGlExtMaps. * * Since: 3.7 */ #define VISU_TYPE_GL_EXT_MAPS (visu_gl_ext_maps_get_type ()) /** * VISU_GL_EXT_MAPS: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuGlExtMaps type. * * Since: 3.7 */ #define VISU_GL_EXT_MAPS(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_GL_EXT_MAPS, VisuGlExtMaps)) /** * VISU_GL_EXT_MAPS_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuGlExtMapsClass. * * Since: 3.7 */ #define VISU_GL_EXT_MAPS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_GL_EXT_MAPS, VisuGlExtMapsClass)) /** * VISU_IS_GL_EXT_MAPS: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuGlExtMaps object. * * Since: 3.7 */ #define VISU_IS_GL_EXT_MAPS(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_GL_EXT_MAPS)) /** * VISU_IS_GL_EXT_MAPS_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuGlExtMapsClass class. * * Since: 3.7 */ #define VISU_IS_GL_EXT_MAPS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_GL_EXT_MAPS)) /** * VISU_GL_EXT_MAPS_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. * * Since: 3.7 */ #define VISU_GL_EXT_MAPS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_GL_EXT_MAPS, VisuGlExtMapsClass)) typedef struct _VisuGlExtMaps VisuGlExtMaps; typedef struct _VisuGlExtMapsPrivate VisuGlExtMapsPrivate; typedef struct _VisuGlExtMapsClass VisuGlExtMapsClass; struct _VisuGlExtMaps { VisuGlExtFrame parent; VisuGlExtMapsPrivate *priv; }; struct _VisuGlExtMapsClass { VisuGlExtFrameClass parent; }; /** * visu_gl_ext_maps_get_type: * * This method returns the type of #VisuGlExtMaps, use * VISU_TYPE_GL_EXT_MAPS instead. * * Since: 3.7 * * Returns: the type of #VisuGlExtMaps. */ GType visu_gl_ext_maps_get_type(void); /** * VISU_GL_EXT_MAPS_ID: * * The id used to identify this extension, see * visu_gl_ext_rebuild() for instance. */ #define VISU_GL_EXT_MAPS_ID "Maps" VisuGlExtMaps* visu_gl_ext_maps_new(const gchar *name); gboolean visu_gl_ext_maps_setGlView(VisuGlExtMaps *maps, VisuGlView *view); gboolean visu_gl_ext_maps_add(VisuGlExtMaps *maps, VisuMap *map, float prec, ToolShade *shade, ToolColor *color, gboolean alpha); gboolean visu_gl_ext_maps_remove(VisuGlExtMaps *maps, VisuMap *map); gboolean visu_gl_ext_maps_setDirty(VisuGlExtMaps *maps, VisuMap *map); gboolean visu_gl_ext_maps_setPrecision(VisuGlExtMaps *maps, VisuMap *map, float prec); gboolean visu_gl_ext_maps_setShade(VisuGlExtMaps *maps, VisuMap *map, ToolShade *shade); gboolean visu_gl_ext_maps_setLineColor(VisuGlExtMaps *maps, VisuMap *map, ToolColor *color); gboolean visu_gl_ext_maps_setTransparent(VisuGlExtMaps *maps, VisuMap *map, gboolean alpha); void visu_gl_ext_maps_draw(VisuGlExtMaps *maps); #endif v_sim-3.7.0/src/extensions/paths.c0000644000353400050620000001614112215550701014033 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "paths.h" #include #include /** * SECTION:paths * @short_description: Defines methods to draw paths. * * Create a #VisuGlExt object to handle #VisuPaths drawing. */ /** * VisuGlExtPathsClass: * @parent: the parent class; * * A short way to identify #_VisuGlExtPathsClass structure. * * Since: 3.7 */ /** * VisuGlExtPaths: * * An opaque structure. * * Since: 3.7 */ /** * VisuGlExtPathsPrivate: * * Private fields for #VisuGlExtPaths objects. * * Since: 3.7 */ struct _VisuGlExtPathsPrivate { gboolean dispose_has_run; gboolean areBuilt; /* Related objects. */ VisuPaths *obj; }; static void visu_gl_ext_paths_finalize(GObject* obj); static void visu_gl_ext_paths_dispose(GObject* obj); static void visu_gl_ext_paths_rebuild(VisuGlExt *ext); /* Local callbacks */ G_DEFINE_TYPE(VisuGlExtPaths, visu_gl_ext_paths, VISU_TYPE_GL_EXT) static void visu_gl_ext_paths_class_init(VisuGlExtPathsClass *klass) { DBG_fprintf(stderr, "Extension Paths: creating the class of the object.\n"); /* DBG_fprintf(stderr, " - adding new signals ;\n"); */ /* Connect the overloading methods. */ G_OBJECT_CLASS(klass)->dispose = visu_gl_ext_paths_dispose; G_OBJECT_CLASS(klass)->finalize = visu_gl_ext_paths_finalize; VISU_GL_EXT_CLASS(klass)->rebuild = visu_gl_ext_paths_rebuild; } static void visu_gl_ext_paths_init(VisuGlExtPaths *obj) { DBG_fprintf(stderr, "Extension Paths: initializing a new object (%p).\n", (gpointer)obj); obj->priv = g_malloc(sizeof(VisuGlExtPathsPrivate)); obj->priv->dispose_has_run = FALSE; /* Private data. */ obj->priv->areBuilt = FALSE; obj->priv->obj = (VisuPaths*)0; } static void visu_gl_ext_paths_dispose(GObject* obj) { VisuGlExtPaths *paths; DBG_fprintf(stderr, "Extension Paths: dispose object %p.\n", (gpointer)obj); paths = VISU_GL_EXT_PATHS(obj); if (paths->priv->dispose_has_run) return; paths->priv->dispose_has_run = TRUE; /* Disconnect signals. */ visu_gl_ext_paths_set(paths, (VisuPaths*)0); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_gl_ext_paths_parent_class)->dispose(obj); } static void visu_gl_ext_paths_finalize(GObject* obj) { VisuGlExtPaths *paths; g_return_if_fail(obj); DBG_fprintf(stderr, "Extension Paths: finalize object %p.\n", (gpointer)obj); paths = VISU_GL_EXT_PATHS(obj); if (paths->priv) { DBG_fprintf(stderr, "Extension Paths: free private paths.\n"); g_free(paths->priv); } /* Chain up to the parent class */ DBG_fprintf(stderr, "Extension Paths: chain to parent.\n"); G_OBJECT_CLASS(visu_gl_ext_paths_parent_class)->finalize(obj); DBG_fprintf(stderr, "Extension Paths: freeing ... OK.\n"); } /** * visu_gl_ext_paths_new: * @name: (allow-none): the name to give to the extension (default is #VISU_GL_EXT_PATHS_ID). * * Creates a new #VisuGlExt to draw paths. * * Since: 3.7 * * Returns: a pointer to the #VisuGlExt it created or * NULL otherwise. */ VisuGlExtPaths* visu_gl_ext_paths_new(const gchar *name) { char *name_ = VISU_GL_EXT_PATHS_ID; char *description = _("Representation of paths."); VisuGlExt *extensionPaths; DBG_fprintf(stderr,"Extension Paths: new object.\n"); extensionPaths = VISU_GL_EXT(g_object_new(VISU_TYPE_GL_EXT_PATHS, "name", (name)?name:name_, "label", _(name), "description", description, "nGlObj", 1, "priority", VISU_GL_EXT_PRIORITY_LAST - 1, NULL)); return VISU_GL_EXT_PATHS(extensionPaths); } /** * visu_gl_ext_paths_set: * @paths: the #VisuGlExtPaths object to modify. * @obj: (allow-none): a #VisuPaths object. * * Set the #VisuPaths to be drawn. * * Since: 3.7 * * Returns: TRUE if visu_gl_ext_paths_draw() should be called and then 'OpenGLAskForReDraw' * signal be emitted. **/ gboolean visu_gl_ext_paths_set(VisuGlExtPaths *paths, VisuPaths *obj) { g_return_val_if_fail(VISU_IS_GL_EXT_PATHS(paths), FALSE); if (obj == paths->priv->obj) return FALSE; if (paths->priv->obj) visu_paths_unref(paths->priv->obj); paths->priv->obj = obj; visu_paths_ref(obj); paths->priv->areBuilt = FALSE; return TRUE; } /** * visu_gl_ext_paths_setDirty: * @paths: a #VisuGlExtPaths object. * * Currently, #VisuPath are not objects, so @paths cannot react to a * change on them. Callers have to set by hand that @paths should be * redrawn with this routine. * * Since: 3.7 **/ void visu_gl_ext_paths_setDirty(VisuGlExtPaths *paths) { g_return_if_fail(VISU_IS_GL_EXT_PATHS(paths)); paths->priv->areBuilt = FALSE; } /****************/ /* Private part */ /****************/ static void visu_gl_ext_paths_rebuild(VisuGlExt *ext) { VisuGlExtPaths *paths = VISU_GL_EXT_PATHS(ext); paths->priv->areBuilt = FALSE; visu_gl_ext_paths_draw(paths); } /** * visu_gl_ext_paths_draw: * @paths: the #VisuBox object to build paths for. * * This method creates a compiled list that draws paths. */ void visu_gl_ext_paths_draw(VisuGlExtPaths *paths) { g_return_if_fail(VISU_IS_GL_EXT_PATHS(paths)); /* Nothing to draw; */ if(!visu_gl_ext_getActive(VISU_GL_EXT(paths)) || paths->priv->areBuilt) return; glNewList(visu_gl_ext_getGlList(VISU_GL_EXT(paths)), GL_COMPILE); if (paths->priv->obj) visu_paths_draw(paths->priv->obj); glEndList(); paths->priv->areBuilt = TRUE; } v_sim-3.7.0/src/extensions/paths.h0000644000353400050620000001022312215546077014046 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef PATHS_H #define PATHS_H #include #include /** * VISU_TYPE_GL_EXT_PATHS: * * return the type of #VisuGlExtPaths. * * Since: 3.7 */ #define VISU_TYPE_GL_EXT_PATHS (visu_gl_ext_paths_get_type ()) /** * VISU_GL_EXT_PATHS: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuGlExtPaths type. * * Since: 3.7 */ #define VISU_GL_EXT_PATHS(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_GL_EXT_PATHS, VisuGlExtPaths)) /** * VISU_GL_EXT_PATHS_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuGlExtPathsClass. * * Since: 3.7 */ #define VISU_GL_EXT_PATHS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_GL_EXT_PATHS, VisuGlExtPathsClass)) /** * VISU_IS_GL_EXT_PATHS: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuGlExtPaths object. * * Since: 3.7 */ #define VISU_IS_GL_EXT_PATHS(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_GL_EXT_PATHS)) /** * VISU_IS_GL_EXT_PATHS_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuGlExtPathsClass class. * * Since: 3.7 */ #define VISU_IS_GL_EXT_PATHS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_GL_EXT_PATHS)) /** * VISU_GL_EXT_PATHS_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. * * Since: 3.7 */ #define VISU_GL_EXT_PATHS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_GL_EXT_PATHS, VisuGlExtPathsClass)) typedef struct _VisuGlExtPaths VisuGlExtPaths; typedef struct _VisuGlExtPathsPrivate VisuGlExtPathsPrivate; typedef struct _VisuGlExtPathsClass VisuGlExtPathsClass; struct _VisuGlExtPaths { VisuGlExt parent; VisuGlExtPathsPrivate *priv; }; struct _VisuGlExtPathsClass { VisuGlExtClass parent; }; /** * VISU_GL_EXT_PATHS_ID: * * The id used to identify this extension, see * visu_gl_ext_rebuild() for instance. */ #define VISU_GL_EXT_PATHS_ID "Paths" /** * visu_gl_ext_paths_get_type: * * This method returns the type of #VisuGlExtPaths, use * VISU_TYPE_GL_EXT_PATHS instead. * * Since: 3.7 * * Returns: the type of #VisuGlExtPaths. */ GType visu_gl_ext_paths_get_type(void); VisuGlExtPaths* visu_gl_ext_paths_new(const gchar *name); gboolean visu_gl_ext_paths_set(VisuGlExtPaths *paths, VisuPaths *obj); void visu_gl_ext_paths_setDirty(VisuGlExtPaths *paths); void visu_gl_ext_paths_draw(VisuGlExtPaths *paths); #endif v_sim-3.7.0/src/extensions/forces.c0000644000353400050620000002443012215546077014210 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2011-2013) Adresse mèl : BILLARD, non joignable par mèl ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2011-2013) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "forces.h" #include #include #include #include #include #define FLAG_RESOURCE_FORCES_USED "forces_are_on" #define DESC_RESOURCE_FORCES_USED "Control if the forces are drawn when available ; boolean (0 or 1)" static gboolean RESOURCE_FORCES_USED_DEFAULT = FALSE; #define FLAG_RESOURCE_FORCES_SCALE "forces_scale" #define DESC_RESOURCE_FORCES_SCALE "Scaling factor (or automatic) for the force rendering ; float (-1 for auto or a positive value)" static float RESOURCE_FORCES_SCALE_DEFAULT = -1.f; static void exportResourceForces(GString *data, VisuData *dataObj, VisuGlView *view); /** * SECTION:forces * @short_description: Draw arrows at each node to represent forces. * * A specialised #VisuGlExtNodeVectors to represent forces on nodes. */ /** * VisuGlExtForcesClass: * @parent: the parent class; * * A short way to identify #_VisuGlExtForcesClass structure. * * Since: 3.7 */ /** * VisuGlExtForces: * * An opaque structure. * * Since: 3.7 */ /** * VisuGlExtForcesPrivate: * * Private fields for #VisuGlExtForces objects. * * Since: 3.7 */ struct _VisuGlExtForcesPrivate { gboolean dispose_has_run; }; static VisuGlExtForces *defaultForces = NULL; static void visu_gl_ext_forces_finalize(GObject* obj); static void visu_gl_ext_forces_dispose(GObject* obj); /* Local callbacks. */ static gboolean onForcesHook(GSignalInvocationHint *ihint, guint nvalues, const GValue *param_values, gpointer data); static void onEntryUsed(VisuGlExtForces *forces, gchar *key, VisuObject *obj); static void onEntryNorm(VisuGlExtForces *forces, gchar *key, VisuObject *obj); static void onDataRendered(VisuObject *object, VisuData *dataObj, VisuGlView *view, gpointer data); G_DEFINE_TYPE(VisuGlExtForces, visu_gl_ext_forces, VISU_TYPE_GL_EXT_NODE_VECTORS) static void visu_gl_ext_forces_class_init(VisuGlExtForcesClass *klass) { float rg[2] = {-G_MAXFLOAT, G_MAXFLOAT}; VisuConfigFileEntry *resourceEntry; DBG_fprintf(stderr, "Visu GlExt Forces: creating the class of the object.\n"); /* DBG_fprintf(stderr, " - adding new signals ;\n"); */ /* Resources for forces extensions. */ resourceEntry = visu_config_file_addBooleanEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_FORCES_USED, DESC_RESOURCE_FORCES_USED, &RESOURCE_FORCES_USED_DEFAULT); visu_config_file_entry_setVersion(resourceEntry, 3.7f); resourceEntry = visu_config_file_addFloatArrayEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_FORCES_SCALE, DESC_RESOURCE_FORCES_SCALE, 1, &RESOURCE_FORCES_SCALE_DEFAULT, rg); visu_config_file_entry_setVersion(resourceEntry, 3.7f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_RESOURCE, exportResourceForces); /* Connect the overloading methods. */ G_OBJECT_CLASS(klass)->dispose = visu_gl_ext_forces_dispose; G_OBJECT_CLASS(klass)->finalize = visu_gl_ext_forces_finalize; } static void visu_gl_ext_forces_init(VisuGlExtForces *obj) { DBG_fprintf(stderr, "Visu GlExt Forces: initializing a new object (%p).\n", (gpointer)obj); obj->priv = g_malloc(sizeof(VisuGlExtForcesPrivate)); obj->priv->dispose_has_run = FALSE; /* Private data. */ g_signal_connect_object(VISU_OBJECT_INSTANCE, "entryParsed::" FLAG_RESOURCE_FORCES_USED, G_CALLBACK(onEntryUsed), (gpointer)obj, G_CONNECT_SWAPPED); g_signal_connect_object(VISU_OBJECT_INSTANCE, "entryParsed::" FLAG_RESOURCE_FORCES_SCALE, G_CALLBACK(onEntryNorm), (gpointer)obj, G_CONNECT_SWAPPED); } static void visu_gl_ext_forces_dispose(GObject* obj) { VisuGlExtForces *vect; DBG_fprintf(stderr, "Visu GlExt Forces: dispose object %p.\n", (gpointer)obj); vect = VISU_GL_EXT_FORCES(obj); if (vect->priv->dispose_has_run) return; vect->priv->dispose_has_run = TRUE; /* Disconnect signals. */ /* Chain up to the parent class */ G_OBJECT_CLASS(visu_gl_ext_forces_parent_class)->dispose(obj); } static void visu_gl_ext_forces_finalize(GObject* obj) { VisuGlExtForces *vect; g_return_if_fail(obj); DBG_fprintf(stderr, "Visu GlExt Forces: finalize object %p.\n", (gpointer)obj); vect = VISU_GL_EXT_FORCES(obj); /* Free privs elements. */ if (vect->priv) { DBG_fprintf(stderr, "Visu GlExt Forces: free private legend.\n"); g_free(vect->priv); } /* Chain up to the parent class */ DBG_fprintf(stderr, "Visu GlExt Forces: chain to parent.\n"); G_OBJECT_CLASS(visu_gl_ext_forces_parent_class)->finalize(obj); DBG_fprintf(stderr, "Visu GlExt Forces: freeing ... OK.\n"); } /** * visu_gl_ext_forces_new: * @name: (allow-none): the name to give to the extension. * * Creates a new #VisuGlExt to draw forces. * * Since: 3.7 * * Returns: a pointer to the #VisuGlExt it created or * NULL otherwise. */ VisuGlExtForces* visu_gl_ext_forces_new(const gchar *name) { char *name_ = "Forces"; char *description = _("Draw forces with vectors."); VisuGlExtNodeVectors *forces; DBG_fprintf(stderr,"Visu GlExt Forces: new object.\n"); forces = VISU_GL_EXT_NODE_VECTORS(g_object_new(VISU_TYPE_GL_EXT_FORCES, "name", (name)?name:name_, "label", _(name), "description", description, "nGlObj", 1, "propId", VISU_RENDERING_ATOMIC_FORCES, NULL)); visu_gl_ext_node_vectors_setTranslation(forces, 1.1f); visu_gl_ext_node_vectors_setRenderedSize(forces, -2.f); visu_gl_ext_node_vectors_setNormalisation(forces, RESOURCE_FORCES_SCALE_DEFAULT); g_signal_add_emission_hook(g_signal_lookup("ForcesChanged", VISU_TYPE_RENDERING_ATOMIC), 0, onForcesHook, (gpointer)forces, (GDestroyNotify)0); return VISU_GL_EXT_FORCES(forces); } /** * visu_gl_ext_forces_getDefault: * * V_Sim internally uses a default #VisuGlExtForces object to * represent forces. * * Since: 3.7 * * Returns: (transfer none): the default #VisuGlExtForces object. **/ VisuGlExtForces* visu_gl_ext_forces_getDefault(void) { if (!defaultForces) { defaultForces = visu_gl_ext_forces_new(NULL); visu_gl_ext_setActive(VISU_GL_EXT(defaultForces), RESOURCE_FORCES_USED_DEFAULT); g_signal_connect(VISU_OBJECT_INSTANCE, "dataRendered", G_CALLBACK(onDataRendered), (gpointer)defaultForces); } return defaultForces; } /* Callbacks. */ static gboolean onForcesHook(GSignalInvocationHint *ihint _U_, guint nvalues _U_, const GValue *param_values, gpointer data) { VisuGlExtNodeVectors *vect = VISU_GL_EXT_NODE_VECTORS(data); DBG_fprintf(stderr, "Visu GlExt Forces: new forces available.\n"); if (visu_gl_ext_node_vectors_getData(vect) == VISU_DATA(g_value_get_object(param_values + 1))) visu_gl_ext_node_vectors_draw(vect); return TRUE; } static void onDataRendered(VisuObject *object _U_, VisuData *dataObj, VisuGlView *view _U_, gpointer data) { visu_gl_ext_node_vectors_setData(VISU_GL_EXT_NODE_VECTORS(data), dataObj); visu_gl_ext_node_vectors_draw(VISU_GL_EXT_NODE_VECTORS(data)); } static void onEntryUsed(VisuGlExtForces *forces, gchar *key _U_, VisuObject *obj _U_) { visu_gl_ext_setActive(VISU_GL_EXT(forces), RESOURCE_FORCES_USED_DEFAULT); } static void onEntryNorm(VisuGlExtForces *forces, gchar *key _U_, VisuObject *obj _U_) { visu_gl_ext_node_vectors_setNormalisation(VISU_GL_EXT_NODE_VECTORS(forces), RESOURCE_FORCES_SCALE_DEFAULT); } /* Resources. */ static void exportResourceForces(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { visu_config_file_exportComment(data, DESC_RESOURCE_FORCES_USED); visu_config_file_exportEntry(data, FLAG_RESOURCE_FORCES_USED, NULL, "%d", RESOURCE_FORCES_USED_DEFAULT); visu_config_file_exportComment(data, DESC_RESOURCE_FORCES_SCALE); visu_config_file_exportEntry(data, FLAG_RESOURCE_FORCES_SCALE, NULL, "%f", RESOURCE_FORCES_SCALE_DEFAULT); visu_config_file_exportComment(data, ""); } v_sim-3.7.0/src/extensions/forces.h0000644000353400050620000000742412215546077014221 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2013) Adresse ml : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2013) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at COPYING. */ #ifndef FORCES_H #define FORCES_H #include "node_vectors.h" /** * VISU_TYPE_GL_EXT_FORCES: * * return the type of #VisuGlExtForces. * * Since: 3.7 */ #define VISU_TYPE_GL_EXT_FORCES (visu_gl_ext_forces_get_type ()) /** * VISU_GL_EXT_FORCES: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuGlExtForces type. * * Since: 3.7 */ #define VISU_GL_EXT_FORCES(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_GL_EXT_FORCES, VisuGlExtForces)) /** * VISU_GL_EXT_FORCES_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuGlExtForcesClass. * * Since: 3.7 */ #define VISU_GL_EXT_FORCES_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_GL_EXT_FORCES, VisuGlExtForcesClass)) /** * VISU_IS_GL_EXT_FORCES: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuGlExtForces object. * * Since: 3.7 */ #define VISU_IS_GL_EXT_FORCES(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_GL_EXT_FORCES)) /** * VISU_IS_GL_EXT_FORCES_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuGlExtForcesClass class. * * Since: 3.7 */ #define VISU_IS_GL_EXT_FORCES_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_GL_EXT_FORCES)) /** * VISU_GL_EXT_FORCES_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. * * Since: 3.7 */ #define VISU_GL_EXT_FORCES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_GL_EXT_FORCES, VisuGlExtForcesClass)) typedef struct _VisuGlExtForces VisuGlExtForces; typedef struct _VisuGlExtForcesPrivate VisuGlExtForcesPrivate; typedef struct _VisuGlExtForcesClass VisuGlExtForcesClass; struct _VisuGlExtForces { VisuGlExtNodeVectors parent; VisuGlExtForcesPrivate *priv; }; struct _VisuGlExtForcesClass { VisuGlExtNodeVectorsClass parent; }; /** * visu_gl_ext_forces_get_type: * * This method returns the type of #VisuGlExtForces, use * VISU_TYPE_GL_EXT_FORCES instead. * * Since: 3.7 * * Returns: the type of #VisuGlExtForces. */ GType visu_gl_ext_forces_get_type(void); VisuGlExtForces* visu_gl_ext_forces_new(const gchar *name); VisuGlExtForces* visu_gl_ext_forces_getDefault(); #endif v_sim-3.7.0/src/extraFunctions/0000755000353400050620000000000012216331346013445 500000000000000v_sim-3.7.0/src/extraFunctions/dataFile.c0000644000353400050620000013102412216254657015254 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "dataFile.h" #include #include "dataNode.h" #include #include #include #include #include #include /** * SECTION:dataFile * @short_description: Adds a possibility to colorize nodes depending * on data read in an input file. * * With this module, it is possible to colorize nodes depending * on data read in an input file. An input file can be associated to a * #VisuData object using visu_colorization_new_fromFile(). Doing this, the * rendering is changed and nodes are colorized following a scheme * describe later. To turn off colorization without removing the data * file (for temporary turn off for instance), use * visu_colorization_setUsed(). * The input file must have the same numbers of uncommented * lines as there are nodes in the #VisuData associated with. If less * data is given, missing data are treaded as min values data. The * input data file can has as much column as desired. The colorization * is based on a linear color transformation. This transformation is * applied on color channel in RGB mode or in HSV mode. Resulting * color is given by : [resulting color vect] = [vectB] + [input * data][vectA], where [input data] are input data scaled to [0;1]. It * is possible to choose which column multiplies which color * channel. * Using visu_colorization_applyHide(), it is possible to hide * some nodes depending on given input data. */ /** * VisuColorization: * * An opaque structure to store colorisation settings. * * Since: 3.7 */ struct _VisuColorization { /* Set to TRUE to colorize. */ gboolean used; guint refCount; gulong range_sig; ToolShade *shade; /* Columns to be used. */ int colUsed[3]; int scaleUsed; /* Scheme to scale : manual or auto. */ VisuColorizationInputScaleId scaleType; /* Number of read columns. */ guint nbColumns; /* Values min and max read for each column. */ float *readMinMax; /* Min and max values for manual scale, for each column. */ float *manualMinMax; /* Colourisation is applied only on values in range when FALSE. */ gboolean applyToAll; /* File where data has been read. */ gchar *file; /* Hiding function and data. */ VisuColorizationHidingFunc hidingFunc; gpointer hidingData; GDestroyNotify hidingDestroy; }; /* Cache pointers for data from currentVisuData. This cache is usefull to avoid too much g_object_get_data(). This cache is refresh as soon as currentVisuData is changed. */ VisuColorization *cacheVisuColorization; const VisuData *cacheVisuData; /* Default values */ #define DATAFILE_NB_COLUMN_DEFAULT -4 #define DATAFILE_COLUMN_X -3 #define DATAFILE_COLUMN_Y -2 #define DATAFILE_COLUMN_Z -1 #define DATAFILE_SCALE_TYPE_DEFAULT VISU_COLORIZATION_NORMALIZE #define DATAFILE_MIN_NORM_DEFAULT 0. #define DATAFILE_MAX_NORM_DEFAULT +1. #define DATAFILE_COLOR_TYPE_DEFAULT dataFile_hsv #define DATAFILE_ID "dataColor_data" #define RESOURCE_RANGE_NAME "colorization_restrictInRange" #define RESOURCE_RANGE_DESC "Apply colourisation only if in range." /* Internal variables. */ static VisuDataNode *dataNode; static GValue dataValue = {0, {{0}, {0}}}; static GQuark quark; static gboolean restrictInRange = FALSE; /* local methods. */ static void dataFileFree(gpointer data); static void dataFileAttach(VisuColorization *dt, VisuData *dataObj); static gboolean colorFromUserData(VisuData *visuData, float rgba[4], VisuElement *ele, VisuNode* node); static float radiusFromUserData(VisuData *visuData, VisuNode *node); static float valuesFromData(VisuData *visuData, int column, float fromVal, gboolean *out); static void freeData(gpointer obj, gpointer data); static gpointer newOrCopyData(gconstpointer orig, gpointer user_data); static void exportResources(GString *data, VisuData *dataObj, VisuGlView *view); static void onEntryRange(VisuObject *obj, const gchar *key, gpointer data); /** * visu_colorization_init: (skip) * * Called by V_Sim on startup, should not be called again. * * Returns: 1 if eveything goes right. */ int visu_colorization_init() { VisuConfigFileEntry *resourceEntry; cacheVisuColorization = (VisuColorization*)0; cacheVisuData = (VisuData*)0; quark = g_quark_from_static_string("data_file"); /* Register a new NodeData. */ dataNode = VISU_DATA_NODE(visu_data_node_new(DATAFILE_ID, G_TYPE_FLOAT)); visu_data_node_setLabel(dataNode, _("Colorisation data")); g_value_init(&dataValue, G_TYPE_POINTER); resourceEntry = visu_config_file_addBooleanEntry(VISU_CONFIG_FILE_RESOURCE, RESOURCE_RANGE_NAME, RESOURCE_RANGE_DESC, &restrictInRange); visu_config_file_entry_setVersion(resourceEntry, 3.7f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_RESOURCE, exportResources); return 1; } /** * visu_colorization_getErrorQuark: * * Internal routine for error handling. * * Returns: (transfer none): the #GQuark associated to errors related to colour data * files. */ GQuark visu_colorization_getErrorQuark() { return quark; } GType visu_colorization_get_type(void) { static GType g_define_type_id = 0; if (g_define_type_id == 0) g_define_type_id = g_boxed_type_register_static("VisuColorization", (GBoxedCopyFunc)visu_colorization_ref, (GBoxedFreeFunc)visu_colorization_unref); return g_define_type_id; } /** * visu_colorization_new: * * Create a new object to store colorisation data. * * Since: 3.7 * * Returns: (transfer full): a newly created #VisuColorization. **/ VisuColorization* visu_colorization_new() { VisuColorization *dataFile; GList *lst; DBG_fprintf(stderr, "Visu Colorization: creating new object.\n"); lst = tool_shade_getList(); dataFile = g_malloc(sizeof(VisuColorization)); dataFile->used = FALSE; dataFile->refCount = 1; dataFile->file = (gchar*)0; dataFile->readMinMax = (float*)0; dataFile->manualMinMax = g_malloc(sizeof(float) * 2 * 3); dataFile->manualMinMax[0] = DATAFILE_MIN_NORM_DEFAULT; dataFile->manualMinMax[1] = DATAFILE_MAX_NORM_DEFAULT; dataFile->manualMinMax[2] = DATAFILE_MIN_NORM_DEFAULT; dataFile->manualMinMax[3] = DATAFILE_MAX_NORM_DEFAULT; dataFile->manualMinMax[4] = DATAFILE_MIN_NORM_DEFAULT; dataFile->manualMinMax[5] = DATAFILE_MAX_NORM_DEFAULT; dataFile->nbColumns = 0; dataFile->scaleType = DATAFILE_SCALE_TYPE_DEFAULT; dataFile->shade = (lst)?tool_shade_copy((ToolShade*)lst->data):(ToolShade*)0; dataFile->colUsed[0] = DATAFILE_NB_COLUMN_DEFAULT; dataFile->colUsed[1] = DATAFILE_NB_COLUMN_DEFAULT; dataFile->colUsed[2] = DATAFILE_NB_COLUMN_DEFAULT; dataFile->scaleUsed = DATAFILE_NB_COLUMN_DEFAULT; dataFile->applyToAll = !restrictInRange; dataFile->hidingFunc = (VisuColorizationHidingFunc)0; dataFile->hidingData = 0; dataFile->hidingDestroy = (GDestroyNotify)0; dataFile->range_sig = g_signal_connect(VISU_OBJECT_INSTANCE, "entryParsed::" RESOURCE_RANGE_NAME, G_CALLBACK(onEntryRange), (gpointer)dataFile); return dataFile; } static void dataFileAttach(VisuColorization *dt, VisuData *visuData) { DBG_fprintf(stderr, "Visu Colorization: attach data informations for" " given VisuData object %p.\n", (gpointer)visuData); g_return_if_fail(visuData); g_object_set_data_full(G_OBJECT(visuData), "dataColor_parameters", (gpointer)dt, dataFileFree); DBG_fprintf(stderr, " | %p\n", (gpointer)dt); /* Set the cache. */ cacheVisuColorization = dt; cacheVisuData = visuData; } static void dataFileFree(gpointer data) { VisuColorization *dataFile; DBG_fprintf(stderr, "Visu Colorization: freeing dataFile.\n"); dataFile = (VisuColorization*)data; if (dataFile->readMinMax) g_free(dataFile->readMinMax); if (dataFile->file) g_free(dataFile->file); if (dataFile->manualMinMax) g_free(dataFile->manualMinMax); if (dataFile->shade) tool_shade_free(dataFile->shade); if (dataFile->hidingData && dataFile->hidingDestroy) dataFile->hidingDestroy(dataFile->hidingData); g_signal_handler_disconnect(VISU_OBJECT_INSTANCE, dataFile->range_sig); g_free(dataFile); /* Update the cache. */ if (dataFile == cacheVisuColorization) { cacheVisuColorization = (VisuColorization*)0; cacheVisuData = (VisuData*)0; } } /** * visu_colorization_ref: * @dt: a #VisuColorization object. * * Increase the ref counter. * * Since: 3.7 * * Returns: itself. **/ VisuColorization* visu_colorization_ref(VisuColorization *dt) { dt->refCount += 1; return dt; } /** * visu_colorization_unref: * @dt: a #VisuColorization object. * * Decrease the ref counter, free all memory if counter reachs zero. * * Since: 3.7 **/ void visu_colorization_unref(VisuColorization *dt) { dt->refCount -= 1; if (!dt->refCount) dataFileFree(dt); } static void dataFileActivate(VisuData *visuData, gboolean status) { g_return_if_fail(visuData); if (status) { visu_element_setUpdateNodesOnMaterialChange(); visu_data_setColorFunc(visuData, colorFromUserData); visu_data_setNodeScalingFunc(visuData, radiusFromUserData); } else { visu_element_unsetUpdateNodesOnMaterialChange(); visu_data_setColorFunc(visuData, (VisuDataColorFunc)0); visu_data_setNodeScalingFunc(visuData, (VisuDataScalingFunc)0); } } static void freeData(gpointer obj, gpointer data) { #if GLIB_MINOR_VERSION > 9 g_slice_free1(sizeof(float) * GPOINTER_TO_INT(data), obj); #else if (GPOINTER_TO_INT(data) > 0) g_free(obj); #endif } static gpointer newOrCopyData(gconstpointer orig, gpointer user_data) { float *data; int nb; nb = GPOINTER_TO_INT(user_data); #if GLIB_MINOR_VERSION > 9 data = g_slice_alloc(sizeof(float) * nb); #else data = g_malloc(sizeof(float) * nb); #endif if (orig) memcpy(data, orig, sizeof(float) * nb); else memset(data, 0, sizeof(float) * nb); return (gpointer)data; } static VisuNodeProperty* _initData(VisuColorization *dt, VisuData *dataObj, guint nbColumns) { guint i; VisuNodeProperty *prop; /* Update dataObj. */ visu_node_array_freeProperty(VISU_NODE_ARRAY(dataObj), DATAFILE_ID); if (nbColumns > 0) prop = visu_node_array_property_newPointer(VISU_NODE_ARRAY(dataObj), DATAFILE_ID, freeData, newOrCopyData, GINT_TO_POINTER(nbColumns)); else prop = (VisuNodeProperty*)0; /* Set the dimensions for the node property. */ visu_data_node_setUsed(dataNode, dataObj, nbColumns); if (dt->nbColumns == nbColumns) return prop; dt->nbColumns = nbColumns; if (nbColumns > 0) { dt->readMinMax = g_realloc(dt->readMinMax, sizeof(float) * 2 * (dt->nbColumns)); dt->manualMinMax = g_realloc(dt->manualMinMax, sizeof(float) * 2 * (dt->nbColumns + 3)); for (i = 0; i < dt->nbColumns; i++) { dt->readMinMax[2 * i + 0] = G_MAXFLOAT; dt->readMinMax[2 * i + 1] = -G_MAXFLOAT; dt->manualMinMax[2 * (i + 3) + 0] = DATAFILE_MIN_NORM_DEFAULT; dt->manualMinMax[2 * (i + 3) + 1] = DATAFILE_MAX_NORM_DEFAULT; } dt->colUsed[0] = (dt->colUsed[0] >= (int)dt->nbColumns)?0:dt->colUsed[0]; dt->colUsed[1] = (dt->colUsed[1] >= (int)dt->nbColumns)?0:dt->colUsed[1]; dt->colUsed[2] = (dt->colUsed[2] >= (int)dt->nbColumns)?0:dt->colUsed[2]; } else { if (dt->readMinMax) g_free(dt->readMinMax); dt->readMinMax = (float*)0; if (dt->file) g_free(dt->file); dt->file = (gchar*)0; } return prop; } static void _addDataForNode(VisuColorization *dataFile, VisuNodeProperty *prop, VisuNode *node, float *data) { guint i; g_value_set_pointer(&dataValue, data); visu_node_property_setValue(prop, node, &dataValue); /* Check for minMax values for each column. */ for (i = 0; i < dataFile->nbColumns; i++) { if (data[i] < dataFile->readMinMax[i * 2 + 0]) dataFile->readMinMax[i * 2 + 0] = data[i]; if (data[i] > dataFile->readMinMax[i * 2 + 1]) dataFile->readMinMax[i * 2 + 1] = data[i]; } } static void _finalizeData(VisuColorization *dataFile, VisuData *dataObj, const gchar *filename) { guint i; if (dataFile->file) g_free(dataFile->file); if (filename) dataFile->file = g_strdup(filename); else dataFile->file = (gchar*)0; /* Copy the read minMax into the manual minMax. */ for (i = 0; i < dataFile->nbColumns; i++) { dataFile->manualMinMax[2 * (i + 3) + 0] = dataFile->readMinMax[i * 2 + 0]; dataFile->manualMinMax[2 * (i + 3) + 1] = dataFile->readMinMax[i * 2 + 1]; } dataFileActivate(dataObj, dataFile->used); } /** * visu_colorization_new_fromData: * @dataObj: a #VisuData object. * @nbColumns: an integer. * @data: (element-type gfloat): the colorization data. * @new: (allow-none) (out caller-allocates): a location for a boolean. * * Add colourisation data to @dataObj. * * Since: 3.7 * * Returns: (transfer full): a newly created #VisuColorization or NULL. **/ VisuColorization* visu_colorization_new_fromData(VisuData *dataObj, guint nbColumns, GArray *data, gboolean *new) { VisuColorization *dt; VisuNodeProperty *prop; guint i; VisuNodeArrayIter iter; float *vals; g_return_val_if_fail(data && (data->len % nbColumns == 0), (VisuColorization*)0); dt = visu_colorization_get(dataObj, TRUE, new); prop = _initData(dt, dataObj, nbColumns); visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter); for (visu_node_array_iterStart(VISU_NODE_ARRAY(dataObj), &iter), i = 0; iter.node; visu_node_array_iterNextNodeNumber(VISU_NODE_ARRAY(dataObj), &iter), i += nbColumns) { vals = newOrCopyData(&g_array_index(data, float, i), GINT_TO_POINTER(nbColumns)); /* Associates the values to the node. */ _addDataForNode(dt, prop, iter.node, vals); } _finalizeData(dt, dataObj, (gchar*)0); return dt; } /** * visu_colorization_new_fromFile: * @data: a #VisuData object to attach the data file to ; * @filename: the path to find the data file on the disk ; * @new: (allow-none) (out caller-allocates): a location for a boolean. * @error: a location to a NULL #GError. * * Call this method to parse a data file and associate its values to the given #VisuData object. * * Returns: (transfer full): a newly created #VisuColorization or NULL. */ VisuColorization* visu_colorization_new_fromFile(VisuData *dataObj, const char* filename, gboolean *new, GError **error) { VisuColorization *dt; guint i, nb, nbColumns; GIOChannel *readFrom; GIOStatus status; GString *line; gsize term; float *data, fval; gchar **dataRead; VisuNodeArrayIter iter; gboolean voidLine; VisuNodeProperty *prop; #if DEBUG == 1 GTimer *timer; gulong fractionTimer; #endif DBG_fprintf(stderr, "Visu Colorization: set data file to '%s' for %p.\n", filename, (gpointer)dataObj); g_return_val_if_fail(dataObj && filename, FALSE); g_return_val_if_fail(error && (*error) == (GError*)0, FALSE); readFrom = g_io_channel_new_file(filename, "r", error); if (!readFrom) return (VisuColorization*)0; DBG_fprintf(stderr, "Visu VisuColorization: begin reading file.\n"); #if DEBUG == 1 timer = g_timer_new(); g_timer_start(timer); #endif dt = visu_colorization_get(dataObj, TRUE, new); line = g_string_new(""); nbColumns = 0; prop = (VisuNodeProperty*)0; visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter); for (visu_node_array_iterStart(VISU_NODE_ARRAY(dataObj), &iter); iter.node; visu_node_array_iterNextNodeNumber(VISU_NODE_ARRAY(dataObj), &iter)) { /* If the file is not finished, we read until a non-void line and return this line. */ voidLine = TRUE; do { status = g_io_channel_read_line_string(readFrom, line, &term, error); if (status == G_IO_STATUS_NORMAL) { g_strchug(line->str); voidLine = (line->str[0] == '#' || line->str[0] == '!' || line->str[0] == '\0'); } if (!voidLine) { voidLine = TRUE; dataRead = g_strsplit_set(line->str, " \t;:\n", TOOL_MAX_LINE_LENGTH); for (i = 0; dataRead[i]; i++) if (dataRead[i][0] && 1 == sscanf(dataRead[i], "%f", &fval)) voidLine = FALSE; g_strfreev(dataRead); } } while (status == G_IO_STATUS_NORMAL && voidLine); if (status == G_IO_STATUS_ERROR) { g_string_free(line, TRUE); dataFileActivate(dataObj, FALSE); dt->used = FALSE; _initData(dt, dataObj, 0); status = g_io_channel_shutdown(readFrom, FALSE, (GError**)0); g_io_channel_unref(readFrom); return (VisuColorization*)0; } /* If still not done, we test the number of columns. */ if (nbColumns == 0) { if (!voidLine) { dataRead = g_strsplit_set(line->str, " \t;:\n", TOOL_MAX_LINE_LENGTH); DBG_fprintf(stderr, "Visu dt: looking for number of columns.\n"); for (i = 0; dataRead[i]; i++) if (dataRead[i][0] && 1 == sscanf(dataRead[i], "%f", &fval)) { DBG_fprintf(stderr, " | one token : '%s'\n", dataRead[i]); nbColumns += 1; } g_strfreev(dataRead); DBG_fprintf(stderr, "Visu Colorization: detected number of columns : %d\n", dt->nbColumns); } if (nbColumns == 0 || voidLine) { *error = g_error_new(VISU_ERROR_COLORIZATION, VISU_COLORIZATION_ERROR_NO_COLUMN, _("Can't find any column of" " data in the given file.\n")); g_string_free(line, TRUE); dataFileActivate(dataObj, FALSE); dt->used = FALSE; _initData(dt, dataObj, 0); status = g_io_channel_shutdown(readFrom, FALSE, (GError**)0); g_io_channel_unref(readFrom); return (VisuColorization*)0; } prop = _initData(dt, dataObj, nbColumns); } /* We read the data from the line, if not void. */ data = newOrCopyData((gconstpointer)0, GINT_TO_POINTER(nbColumns)); if (!voidLine) { dataRead = g_strsplit_set(line->str, " \t;:\n", TOOL_MAX_LINE_LENGTH); nb = 0; for (i = 0; dataRead[i] && nb < nbColumns; i++) { if (1 == sscanf(dataRead[i], "%f", data + nb)) { DBG_fprintf(stderr, " '%s' - '%f'", dataRead[i], data[nb]); nb += 1; } } DBG_fprintf(stderr, "\n"); g_strfreev(dataRead); } else { if (!*error) *error = g_error_new(VISU_ERROR_COLORIZATION, VISU_COLORIZATION_ERROR_MISSING_DATA, _("There are more nodes than data.\n")); } /* Associates the values to the node. */ _addDataForNode(dt, prop, iter.node, data); } status = g_io_channel_shutdown(readFrom, FALSE, (GError**)0); g_io_channel_unref(readFrom); g_string_free(line, TRUE); if (dt->nbColumns == 0) { *error = g_error_new(VISU_ERROR_COLORIZATION, VISU_COLORIZATION_ERROR_NO_COLUMN, _("Can't find any columns with numbers.\n" "Valid format are as much numbers as desired, separated" " by any of the following characters : [ ;:\\t].\n")); dt->used = FALSE; _initData(dt, dataObj, 0); return (VisuColorization*)0; } if (DEBUG) { DBG_fprintf(stderr, "Visu dataFile : min/max values :\n"); for (i = 0; i < dt->nbColumns; i++) DBG_fprintf(stderr, "Visu dataFile : col %d -> %f (min) and %f (max).\n", i, dt->readMinMax[i * 2 + 0], dt->readMinMax[i * 2 + 1]); } _finalizeData(dt, dataObj, filename); cacheVisuColorization = dt; cacheVisuData = dataObj; #if DEBUG == 1 g_timer_stop(timer); fprintf(stderr, "Visu Colorization: data associated in %g micro-s.\n", g_timer_elapsed(timer, &fractionTimer)/1e-6); g_timer_destroy(timer); #endif return dt; } /** * visu_colorization_get: * @data: (allow-none): a #VisuData object. * @create: a boolean. * @new: (out) (allow-none): a boolean location * * Return an already associated #VisuColorization object to @data, or * create it if necessary. * * Since: 3.7 * * Returns: (transfer none): a #VisuColorization object. This object will * be automatically freed with @data. **/ VisuColorization* visu_colorization_get(VisuData *data, gboolean create, gboolean *new) { VisuColorization *dataFile; DBG_fprintf(stderr, "Visu VisuColorization: get data for %p (%p %p).\n", (gpointer)data, (gpointer)cacheVisuData, (gpointer)cacheVisuColorization); if (new) *new = FALSE; if (!data) return (VisuColorization*)0; if (data == cacheVisuData) dataFile = cacheVisuColorization; else { dataFile = (VisuColorization*)g_object_get_data(G_OBJECT(data), "dataColor_parameters"); cacheVisuColorization = dataFile; cacheVisuData = data; } if (!dataFile && create) { DBG_fprintf(stderr, "Visu VisuColorization: get data and create new.\n"); dataFile = visu_colorization_new(); dataFileAttach(dataFile, data); if (new) *new = TRUE; } return dataFile; } /** * visu_colorization_getFileSet: * @dt: (allow-none): a #VisuColorization object. * * A set of data per node can be associated to a #VisuData. This * routine retrieves if @visuData has it or not. * * Since: 3.6 * * Returns: TRUE if @visuData has colour data associated. */ gboolean visu_colorization_getFileSet(const VisuColorization *dt) { if (dt && dt->file) return TRUE; else return FALSE; } /** * visu_colorization_getFile: * @dt: (allow-none): a #VisuColorization object. * * If the given @dt has an input data file already loaded, it returns its name. * * Returns: (transfer full): the name of the input data file if * set. */ gchar* visu_colorization_getFile(const VisuColorization *dt) { if (dt) return g_strdup(dt->file); else return (gchar*)0; } /** * visu_colorization_setRestrictInRange: * @dt: a #VisuColorization object with some data file information. * @status: a boolean. * * The colourisation can be applied on all nodes or on nodes within * range. See visu_colorization_getRestrictInRange() and * visu_colorization_setMin() and visu_colorization_setMax(). * * Since: 3.7 * * Returns: TRUE if the status is changed indeed. */ gboolean visu_colorization_setRestrictInRange(VisuColorization *dt, gboolean status) { g_return_val_if_fail(dt, FALSE); if (dt->applyToAll != status) return FALSE; dt->applyToAll = !status; return TRUE; } /** * visu_colorization_getRestrictInRange: * @dt: a #VisuColorization object with some data file information. * * The colourisation can be applied on all nodes or on nodes within * range. See visu_colorization_setRestrictInRange(). * * Since: 3.7 * * Returns: TRUE if colourisation is done only if values are in range. */ gboolean visu_colorization_getRestrictInRange(const VisuColorization *dt) { if (dt) return !dt->applyToAll; else return TRUE; } /** * visu_colorization_getColumnMinMax: * @dt: the #VisuColorization object which the colour data are associated to ; * @minMax: an allocated array of two floating point values ; * @column: an integer. * * This method is used to retrieve the minimum and the maximum * values of the column designed by the @column argument. Column * are numbered beginning at 0. * * Returns: FALSE if @column < 0 or if @column is greater than the number * of read column or if no file has been set. */ gboolean visu_colorization_getColumnMinMax(const VisuColorization *dt, float minMax[2], guint column) { g_return_val_if_fail(dt, FALSE); g_return_val_if_fail(column < dt->nbColumns, FALSE); minMax[0] = dt->readMinMax[column * 2 + 0]; minMax[1] = dt->readMinMax[column * 2 + 1]; return TRUE; } /** * visu_colorization_setUsed: * @data: a #VisuData object to set the colorisation tool or not ; * @val: a boolean. * * When TRUE, rendering is modified by applying a colorization * method to normal nodes. The color used depend on input data. See * visu_colorization_new_fromFile() to choose them. * * Returns: TRUE if val is true and if a valid input file is already * in memory. */ gboolean visu_colorization_setUsed(VisuData *visuData, int val) { VisuColorization *dataFile; gboolean new; DBG_fprintf(stderr, "Visu Colorization: set using flag for" " dataFile module to %d .\n", val); dataFile = visu_colorization_get(visuData, TRUE, &new); g_return_val_if_fail(dataFile, FALSE); if (val == dataFile->used) return FALSE; dataFile->used = val; dataFileActivate(visuData, dataFile->used); return !new; } /** * visu_colorization_getUsed: * @dt: (allow-none): a #VisuColorization object to get if the * colorisation tool is set or not ; * * This method retrieve the used flag, see visu_colorization_setUsed() to set it. * * Returns: 1 if the used flag is set. */ gboolean visu_colorization_getUsed(const VisuColorization *dt) { if (!dt) return FALSE; else return dt->used; } /** * visu_colorization_setScaleType: * @dt: a #VisuColorization object ; * @scale: an integer. * * This method is used to change the scale method used on input data. * See #VisuColorizationInputScaleId for further informations. This method raises * a error if no input file has already been associated to the give @visuData. * * Returns: TRUE if VisuNodeArray::RenderingChanged should be emitted. */ gboolean visu_colorization_setScaleType(VisuColorization *dt, VisuColorizationInputScaleId scale) { g_return_val_if_fail(dt, FALSE); DBG_fprintf(stderr, "Visu Colorization: set the scale type to %d (previuosly %d).\n", scale, dt->scaleType); if (scale == dt->scaleType) return FALSE; dt->scaleType = scale; return dt->used; } /** * visu_colorization_getScaleType: * @dt: (allow-none): a #VisuColorization object. * * Retrieve the scaling method of input data associated to the given @dt. * * Returns: the scaling method if @dt is not NULL * or the default value if not. */ VisuColorizationInputScaleId visu_colorization_getScaleType(const VisuColorization *dt) { if (!dt) return DATAFILE_SCALE_TYPE_DEFAULT; else return dt->scaleType; } static gboolean _setManualMinMax(VisuColorization *dataFile, float val, int column, guint minmax) { g_return_val_if_fail(dataFile, FALSE); g_return_val_if_fail(column >= DATAFILE_COLUMN_X && column < (int)dataFile->nbColumns, FALSE); DBG_fprintf(stderr, "Visu Colorization: set the min/max (%d) value" " of column %d to %f (previuosly %f).\n", minmax, column, val, dataFile->manualMinMax[2 * (column + 3) + minmax]); if (dataFile->manualMinMax[2 * (column + 3) + minmax] == val) return FALSE; dataFile->manualMinMax[2 * (column + 3) + minmax] = val; return dataFile->used; } /** * visu_colorization_setMin: * @dt: a #VisuColorization object ; * @min: a floating point value. * @column: a column id. * * When the scaling method is #VISU_COLORIZATION_MINMAX (see #VisuColorizationInputScaleId) * min and max value for convert input data are user defined. Use this method * to choose the minimum bound. This method raises * a error if no input file has already been associated to the give @visuData. * * Returns: TRUE if VisuNodeArray::RenderingChanged should be emitted. */ gboolean visu_colorization_setMin(VisuColorization *dt, float min, int column) { return _setManualMinMax(dt, min, column, 0); } /** * visu_colorization_setMax: * @dt: a #VisuColorization object ; * @max: a floating point value. * @column: a column id. * * When the scaling method is #VISU_COLORIZATION_MINMAX (see #VisuColorizationInputScaleId) * min and max value for convert input data are user defined. Use this method * to choose the maximum bound. This method raises * a error if no input file has already been associated to the give @visuData. * * Returns: TRUE if VisuNodeArray::RenderingChanged should be emitted. **/ gboolean visu_colorization_setMax(VisuColorization *dt, float max, int column) { return _setManualMinMax(dt, max, column, 1); } static float _getManualMinMax(const VisuColorization *dt, int column, int minmax) { if (!dt) return (minmax == 0)?DATAFILE_MIN_NORM_DEFAULT:DATAFILE_MAX_NORM_DEFAULT; else return dt->manualMinMax[2 * (column + 3) + minmax]; } /** * visu_colorization_getMin: * @dt: (allow-none): a #VisuData object. * @column: a column id. * * Retrieve the minimum value used when scaling is user defined. * * Returns: the minimum bound if @dt is not NULL * or the default value if not. */ float visu_colorization_getMin(const VisuColorization *dt, int column) { return _getManualMinMax(dt, column, 0); } /** * visu_colorization_getMax: * @dt: (allow-none): a #VisuData object. * @column: a column id. * * Retrieve the maximum value used when scaling is user defined. * * Returns: the maximum bound if @dt is not NULL * or the default value if not. */ float visu_colorization_getMax(const VisuColorization *dt, int column) { return _getManualMinMax(dt, column, 1); } /** * visu_colorization_getNColumns: * @dt: a #VisuColorization object. * * This method is used to retrieve the number of columns of data read in * the loaded file. * * Returns: this number of columns. */ int visu_colorization_getNColumns(const VisuColorization *dt) { if (!dt) return DATAFILE_NB_COLUMN_DEFAULT; else return dt->nbColumns; } /** * visu_colorization_getSingleColumnId: * @dt: a #VisuColorization object. * @id: (out): a location to store a column id. * * The colourisation can be applied from values coming from several * columns. But, if only one column is used, this routine will give it * in @id. * * Returns: FALSE if several columns are used, or TRUE if a single * column is used for the colourisation. */ gboolean visu_colorization_getSingleColumnId(const VisuColorization *dt, gint *id) { float *vectA, *vectB; if (!dt) return FALSE; if (dt->shade && tool_shade_getMode(dt->shade) == TOOL_SHADE_MODE_LINEAR) tool_shade_getLinearCoeff(dt->shade, &vectA, &vectB); else vectA = (float*)0; if ((dt->colUsed[0] == DATAFILE_NB_COLUMN_DEFAULT || dt->colUsed[1] == DATAFILE_NB_COLUMN_DEFAULT || dt->colUsed[0] == dt->colUsed[1] || (vectA && (vectA[0] == 0.f || vectA[1] == 0.f))) && (dt->colUsed[1] == DATAFILE_NB_COLUMN_DEFAULT || dt->colUsed[2] == DATAFILE_NB_COLUMN_DEFAULT || dt->colUsed[1] == dt->colUsed[2] || (vectA && (vectA[1] == 0.f || vectA[2] == 0.f))) && (dt->colUsed[2] == DATAFILE_NB_COLUMN_DEFAULT || dt->colUsed[0] == DATAFILE_NB_COLUMN_DEFAULT || dt->colUsed[2] == dt->colUsed[0] || (vectA && (vectA[0] == 0.f || vectA[2] == 0.f))) && id) { if (dt->colUsed[0] != DATAFILE_NB_COLUMN_DEFAULT && (!vectA || vectA[0] != 0.f)) *id = dt->colUsed[0]; else if (dt->colUsed[1] != DATAFILE_NB_COLUMN_DEFAULT && (!vectA || vectA[1] != 0.f)) *id = dt->colUsed[1]; else *id = dt->colUsed[2]; } else return FALSE; return TRUE; } /** * visu_colorization_setColUsed: * @dt: a #VisuColorization object ; * @val: a column id a special value ; * @pos: an integer in [0;2]. * * Choose if the loaded value should change the given channel of the colour. * * Returns: TRUE if VisuNodeArray::RenderingChanged should be emitted. */ gboolean visu_colorization_setColUsed(VisuColorization *dt, int val, int pos) { g_return_val_if_fail(pos >= 0 && pos < 3, FALSE); g_return_val_if_fail(dt, FALSE); DBG_fprintf(stderr, "Visu Colorization: channel %d uses column %d (previuosly %d).\n", pos, val, dt->colUsed[pos]); g_return_val_if_fail(val < (int)dt->nbColumns && val >= DATAFILE_NB_COLUMN_DEFAULT, FALSE); if (dt->colUsed[pos] == val) return FALSE; dt->colUsed[pos] = val; return dt->used; } /** * visu_colorization_getColUsed: * @dt: (allow-none): a #VisuData object. * * This method is used to retrieve the vector used to adapt or not the colour * to the value of the loaded data. * * Returns: (transfer none) (array fixed-size=3): a three value array, * own by V_Sim. It should not be freed. */ const int* visu_colorization_getColUsed(const VisuColorization *dt) { if (!dt) return (const int*)0; else return dt->colUsed; } /** * visu_colorization_setScalingUsed: * @dt: a #VisuColorization object hosting the data values ; * @val: a column id. * * Give the column id to used to take the scaling values from. Set -1 * if no scaling used. The scaling is used to change the size of each * node, using an homothetic factor. * * Returns: TRUE if the status changed. */ gboolean visu_colorization_setScalingUsed(VisuColorization *dt, int val) { g_return_val_if_fail(dt, FALSE); DBG_fprintf(stderr, "Visu Colorization: scaling uses column %d (previuosly %d).\n", val, dt->scaleUsed); g_return_val_if_fail((val < (int)dt->nbColumns && val >= 0) || val == DATAFILE_NB_COLUMN_DEFAULT, FALSE); if (dt->scaleUsed == val) return FALSE; dt->scaleUsed = val; return dt->used; } /** * visu_colorization_getScalingUsed: * @dt: (allow-none): a #VisuColorization object hosting the data values. * * Retrieve if a column is used as entry to scale the nodes. * * Returns: -1 if no scaling is used. */ int visu_colorization_getScalingUsed(const VisuColorization *dt) { if (!dt) return DATAFILE_NB_COLUMN_DEFAULT; else return dt->scaleUsed; } /** * visu_colorization_setShade: * @dt: the #VisuColorization object which the colour data are associated to ; * @shade: a valid #ToolShade object. * * Apply all caracteristic of the given shade to the colorization the * the given #VisuObject. * * Returns: TRUE if VisuNodeArray::RenderingChanged should be emitted. */ gboolean visu_colorization_setShade(VisuColorization *dt, ToolShade *shade) { g_return_val_if_fail(dt, FALSE); DBG_fprintf(stderr, "Visu VisuColorization: set shade.\n"); tool_shade_free(dt->shade); dt->shade = tool_shade_copy(shade); return dt->used; } /** * visu_colorization_getShade: * @dt: (allow-none): the #VisuColorization object which the colour data are associated to. * * Return the shade used to colourise the nodes. * * Returns: (transfer none): the ToolShade used (own by V_Sim). */ ToolShade* visu_colorization_getShade(const VisuColorization *dt) { if (!dt) return (ToolShade*)0; else return dt->shade; } /** * visu_colorization_applyHide: * @dt: a #VisuColorization object. * @dataObj: a #VisuData object to apply hiding scheme on. * * From the hiding function of #dt (see * visu_colorization_setHidingFunc()), apply hiding property to nodes * of @dataObj. * * Since: 3.7 * * Returns: TRUE if "VisibilityChanged" signal should be emitted. **/ gboolean visu_colorization_applyHide(VisuColorization *dt, VisuData *dataObj) { gboolean redraw; VisuNodeArrayIter iter; VisuNodeProperty *prop; GValue data; VisuColorizationNodeData ct; g_return_val_if_fail(dt && dataObj, FALSE); if (!dt->used || dt->nbColumns == 0 || dt->hidingFunc == (VisuColorizationHidingFunc)0) return FALSE; memset(&data, '\0', sizeof(GValue)); g_value_init(&data, G_TYPE_POINTER); prop = visu_node_array_getProperty(VISU_NODE_ARRAY(dataObj), DATAFILE_ID); ct.dataObj = dataObj; ct.data = g_array_new(FALSE, FALSE, sizeof(float)); ct.data->len = dt->nbColumns; redraw = FALSE; visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter); for (visu_node_array_iterStartVisible(VISU_NODE_ARRAY(dataObj), &iter); iter.node; visu_node_array_iterNextVisible(VISU_NODE_ARRAY(dataObj), &iter)) { visu_node_property_getValue(prop, iter.node, &data); ct.data->data = (gchar*)g_value_get_pointer(&data); ct.node = iter.node; g_return_val_if_fail(ct.data->data, FALSE); if (dt->hidingFunc(dt, &ct, dt->hidingData)) redraw = visu_node_setVisibility(iter.node, FALSE) || redraw; } g_array_free(ct.data, FALSE); return redraw; } /** * visu_colorization_setHidingFunc: * @dt: a #VisuColorization object. * @func: (allow-none) (closure data): a #VisuColorizationHidingFunc function. * @data: (closure): some data. * @destroy: a destroy function for @data. * * Set the hiding function to be called when * visu_colorization_applyHide() is used. * * Since: 3.7 **/ void visu_colorization_setHidingFunc(VisuColorization *dt, VisuColorizationHidingFunc func, gpointer data, GDestroyNotify destroy) { g_return_if_fail(dt); /* Free previous association. */ if (dt->hidingData && dt->hidingDestroy) dt->hidingDestroy(dt->hidingData); DBG_fprintf(stderr, "Visu Colorization: set hiding function with data %p.\n", data); dt->hidingFunc = func; dt->hidingData = data; dt->hidingDestroy = destroy; } /*******************/ /* Drawing methods */ /*******************/ /* In these methods, vectA and vectB (and others) are not retrieve from the visuData object for speed reason. We use instead global pointers dataFile_vectA/B that are pointing to the right place in the visuData object that needs to be rendered. */ /* Normalization method */ static float valuesFromData(VisuData *visuData _U_, int column, float fromVal, gboolean *out) { float res; g_return_val_if_fail(cacheVisuColorization, 0.); if (out) *out = FALSE; switch (cacheVisuColorization->scaleType) { case VISU_COLORIZATION_NORMALIZE: g_return_val_if_fail(column >= 0 && column < (int)cacheVisuColorization->nbColumns, 0.); res = ( (fromVal - cacheVisuColorization->readMinMax[column * 2 + 0]) / (cacheVisuColorization->readMinMax[column * 2 + 1] - cacheVisuColorization->readMinMax[column * 2 + 0]) ); DBG_fprintf(stderr, "Visu VisuColorization: normalise %f -> %f.\n", fromVal, res); return res; case VISU_COLORIZATION_MINMAX: res = ( (fromVal - cacheVisuColorization->manualMinMax[2 * (column + 3) + 0]) / (cacheVisuColorization->manualMinMax[2 * (column + 3) + 1] - cacheVisuColorization->manualMinMax[2 * (column + 3) + 0]) ); DBG_fprintf(stderr, "Visu VisuColorization: normalise %f -> %f.\n", fromVal, CLAMP(res, 0., 1.)); if (out) *out = (res < 0. || res > 1.); return CLAMP(res, 0., 1.); } return 0.; } /*******************/ /* Color functions */ /*******************/ static gboolean colorFromUserData(VisuData *visuData, float rgba[4], VisuElement *ele _U_, VisuNode* node) { float val[3], red[3], coord[3]; int i; float *storedValues; gboolean useCoord, useData, status, out; g_return_val_if_fail(visuData && node && rgba, FALSE); useCoord = (cacheVisuColorization->colUsed[0] == DATAFILE_COLUMN_X || cacheVisuColorization->colUsed[0] == DATAFILE_COLUMN_Y || cacheVisuColorization->colUsed[0] == DATAFILE_COLUMN_Z || cacheVisuColorization->colUsed[1] == DATAFILE_COLUMN_X || cacheVisuColorization->colUsed[1] == DATAFILE_COLUMN_Y || cacheVisuColorization->colUsed[1] == DATAFILE_COLUMN_Z || cacheVisuColorization->colUsed[2] == DATAFILE_COLUMN_X || cacheVisuColorization->colUsed[2] == DATAFILE_COLUMN_Y || cacheVisuColorization->colUsed[2] == DATAFILE_COLUMN_Z); useData = (cacheVisuColorization->colUsed[0] >= 0 || cacheVisuColorization->colUsed[1] >= 0 || cacheVisuColorization->colUsed[2] >= 0); storedValues = (float*)0; if (useData) { visu_node_array_getPropertyValue(VISU_NODE_ARRAY(visuData), node, DATAFILE_ID, &dataValue); storedValues = (float*)g_value_get_pointer(&dataValue); g_return_val_if_fail(storedValues, FALSE); } if (useCoord) { visu_data_getNodePosition(visuData, node, coord); visu_box_convertXYZtoBoxCoordinates(visu_boxed_getBox(VISU_BOXED(visuData)), red, coord); if (cacheVisuColorization->scaleType == VISU_COLORIZATION_MINMAX) { red[0] = CLAMP((red[0] - cacheVisuColorization->manualMinMax[0]) / (cacheVisuColorization->manualMinMax[1] - cacheVisuColorization->manualMinMax[0]), 0.f, 1.f); red[1] = CLAMP((red[1] - cacheVisuColorization->manualMinMax[2]) / (cacheVisuColorization->manualMinMax[3] - cacheVisuColorization->manualMinMax[2]), 0.f, 1.f); red[2] = CLAMP((red[2] - cacheVisuColorization->manualMinMax[4]) / (cacheVisuColorization->manualMinMax[5] - cacheVisuColorization->manualMinMax[4]), 0.f, 1.f); } } status = TRUE; for (i = 0; i < 3; i++) if (cacheVisuColorization->colUsed[i] == DATAFILE_NB_COLUMN_DEFAULT) val[i] = 1.; else if (cacheVisuColorization->colUsed[i] == DATAFILE_COLUMN_X) val[i] = tool_modulo_float(red[0], 1); else if (cacheVisuColorization->colUsed[i] == DATAFILE_COLUMN_Y) val[i] = tool_modulo_float(red[1], 1); else if (cacheVisuColorization->colUsed[i] == DATAFILE_COLUMN_Z) val[i] = tool_modulo_float(red[2], 1); else { val[i] = valuesFromData(visuData, cacheVisuColorization->colUsed[i], storedValues[cacheVisuColorization->colUsed[i]], &out); status = status && !out; } if (cacheVisuColorization->applyToAll || status) tool_shade_channelToRGB(cacheVisuColorization->shade, rgba, val); /* fprintf(stderr, "%f %f %f -> %f %f %f %f\n", */ /* val[0], val[1], val[2], rgba[0], rgba[1], rgba[2], rgba[3]); */ return cacheVisuColorization->applyToAll || status; } static float radiusFromUserData(VisuData *visuData, VisuNode *node) { float *storedValues; if (cacheVisuColorization->scaleUsed == DATAFILE_NB_COLUMN_DEFAULT) return 1.f; storedValues = (float*)0; visu_node_array_getPropertyValue(VISU_NODE_ARRAY(visuData), node, DATAFILE_ID, &dataValue); storedValues = (float*)g_value_get_pointer(&dataValue); return valuesFromData(visuData, cacheVisuColorization->scaleUsed, storedValues[cacheVisuColorization->scaleUsed], (gboolean*)0); } static void exportResources(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { visu_config_file_exportComment(data, RESOURCE_RANGE_DESC); visu_config_file_exportEntry(data, RESOURCE_RANGE_NAME, NULL, "%d", restrictInRange); visu_config_file_exportComment(data, ""); } static void onEntryRange(VisuObject *obj _U_, const gchar *key _U_, gpointer data) { VisuColorization *dt = (VisuColorization*)data; dt->applyToAll = !restrictInRange; } v_sim-3.7.0/src/extraFunctions/dataFile.h0000644000353400050620000001461112215546074015257 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef VISU_DATAFILE_H #define VISU_DATAFILE_H #include #include #include /** * VisuColorizationInputScaleId: * @VISU_COLORIZATION_NORMALIZE: input data are converted into [0;1] using input min/max values. * @VISU_COLORIZATION_MINMAX: input data are converted into [0;1] using user defined min/max values. * * Control how input data are converted into [0;1], after conversion, * values are clamped if needed. */ typedef enum { VISU_COLORIZATION_NORMALIZE, VISU_COLORIZATION_MINMAX } VisuColorizationInputScaleId; /** * VISU_ERROR_COLORIZATION: (skip) * * Internal function for error handling. */ #define VISU_ERROR_COLORIZATION visu_colorization_getErrorQuark() GQuark visu_colorization_getErrorQuark(); /** * VisuColorizationErrorFlag: * @VISU_COLORIZATION_ERROR_NO_COLUMN: no column can be found in the file ; * @VISU_COLORIZATION_ERROR_MISSING_DATA: some data are missing to match the * number of nodes. * * Possible errors when reading a file with column data. */ typedef enum { VISU_COLORIZATION_ERROR_NO_COLUMN, VISU_COLORIZATION_ERROR_MISSING_DATA } VisuColorizationErrorFlag; #define VISU_TYPE_COLORIZATION (visu_colorization_get_type()) GType visu_colorization_get_type(void); typedef struct _VisuColorization VisuColorization; VisuColorization* visu_colorization_new(); VisuColorization* visu_colorization_new_fromData(VisuData *dataObj, guint nbColumns, GArray *data, gboolean *new); VisuColorization* visu_colorization_new_fromFile(VisuData *data, const char* filename, gboolean *new, GError **error); VisuColorization* visu_colorization_get(VisuData *data, gboolean create, gboolean *new); VisuColorization* visu_colorization_ref(VisuColorization *dt); void visu_colorization_unref(VisuColorization *dt); gboolean visu_colorization_setScaleType(VisuColorization *dt, VisuColorizationInputScaleId scale); VisuColorizationInputScaleId visu_colorization_getScaleType(const VisuColorization *dt); gboolean visu_colorization_setMin(VisuColorization *dt, float min, int column); gboolean visu_colorization_setMax(VisuColorization *dt, float max, int column); float visu_colorization_getMin(const VisuColorization *dt, int column); float visu_colorization_getMax(const VisuColorization *dt, int column); gboolean visu_colorization_setColUsed(VisuColorization *dt, int val, int pos); const int* visu_colorization_getColUsed(const VisuColorization *dt); int visu_colorization_getNColumns(const VisuColorization *dt); gboolean visu_colorization_getSingleColumnId(const VisuColorization *dt, gint *id); gboolean visu_colorization_setShade(VisuColorization *dt, ToolShade *shade); ToolShade* visu_colorization_getShade(const VisuColorization *dt); gboolean visu_colorization_setScalingUsed(VisuColorization *dt, int val); int visu_colorization_getScalingUsed(const VisuColorization *dt); gboolean visu_colorization_setRestrictInRange(VisuColorization *dt, gboolean status); gboolean visu_colorization_getRestrictInRange(const VisuColorization *dt); gboolean visu_colorization_getColumnMinMax(const VisuColorization *dt, float minMax[2], guint column); gboolean visu_colorization_getFileSet(const VisuColorization *dt); gchar* visu_colorization_getFile(const VisuColorization *dt); gboolean visu_colorization_getUsed(const VisuColorization *dt); typedef struct _VisuColorizationNodeData VisuColorizationNodeData; /** * VisuColorizationNodeData: * @dataObj: a #VisuData object. * @node: a #VisuNode object. * @data: (element-type float): the column values for @node. * * This structure holds the column value for a given node. It is * mainly intended for bindings... */ struct _VisuColorizationNodeData { const VisuData *dataObj; const VisuNode *node; GArray *data; }; /** * VisuColorizationHidingFunc: * @dt: a #VisuColorization object ; * @values: the column values. * @data: (closure): some data. * * Function to decide to hide a node or not. * * Returns: TRUE to hide a node depending on @values. * * Since: 3.7 */ typedef gboolean (*VisuColorizationHidingFunc)(VisuColorization *dt, const VisuColorizationNodeData *values, gpointer data); void visu_colorization_setHidingFunc(VisuColorization *dt, VisuColorizationHidingFunc func, gpointer data, GDestroyNotify destroy); gboolean visu_colorization_applyHide(VisuColorization *dt, VisuData *dataObj); int visu_colorization_init(); gboolean visu_colorization_setUsed(VisuData *data, int val); #endif v_sim-3.7.0/src/extraFunctions/plane.c0000644000353400050620000012665012215547556014655 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse m�l : BILLARD, non joignable par m�l ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant � visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est r�gi par la licence CeCILL soumise au droit fran�ais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffus�e par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez acc�der � cet en-t�te signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept� les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "plane.h" #include #include #include #include #include /** * SECTION:plane * @short_description: Adds capabilities to draw and handle planes. * * A #VisuPlane is a GObject. It is defined by its normal vector and * the distance of the plane with the origin (see * visu_plane_setNormalVector() and visu_plane_setDistanceFromOrigin()). When * these informations are given and an #VisuGlView is used to render * the plane, V_Sim computes the intersections of the plane with the * bounding box (see visu_plane_getIntersection()). * VisuPlanes can be used to hide nodes defining their * visu_plane_setHiddenState() and visu_plane_class_setHiddingMode(). A list of planes * can also be exported or imported from an XML file using * visu_plane_class_exportXMLFile() and visu_plane_class_parseXMLFile(). * VisuPlanes can have transparency but the support of it is limited * to one plane. If several planes are drawn with transparency, they * may hide each other because of the implementation of transparency * in OpenGL (planes are treated as single polygons). */ static VisuPlaneHidingMode plane_hidingMode = VISU_PLANE_HIDE_UNION; struct _VisuPlane { /* Internal object gestion. */ GObject parent; gboolean dispose_has_run; /* Normal vector, unitary. */ float nVect[3]; /* Normal vector, user given. */ float nVectUser[3]; /* Distance between origin and intersection of the plane and the line made by origin and normal vector. */ float dist; /* ToolColor of that plane. */ ToolColor *color; /* Internal variables */ VisuBox *box; gulong size_signal; /* Intersections with the bounding box. Consist of a GList of float[3], can be NULL if there is no interstection. */ GList *inter; /* Isobarycenter G of all intersection points, required to order these points to form a convex polygon. */ float pointG[3]; /* The plane can hide the nodes on one of its side. This variable can be VISU_PLANE_SIDE_PLUS or VISU_PLANE_SIDE_MINUS or VISU_PLANE_SIDE_NONE. It codes the side of the plane which hides the nodes. If VISU_PLANE_SIDE_NONE is selected all nodes are rendered. */ int hiddenSide; /* Store if the plane is rendered or not. Default is TRUE. */ gboolean rendered; }; enum { VISU_PLANE_MOVED_SIGNAL, VISU_PLANE_RENDERING_SIGNAL, VISU_PLANE_NB_SIGNAL }; struct _VisuPlaneClass { GObjectClass parent; }; /* Internal variables. */ static guint plane_signals[VISU_PLANE_NB_SIGNAL] = { 0 }; /* Object gestion methods. */ static void visu_plane_dispose (GObject* obj); static void visu_plane_finalize (GObject* obj); static void visu_boxed_interface_init(VisuBoxedInterface *iface); /* Local methods. */ static VisuBox* visu_plane_getBox(VisuBoxed *self); static gboolean visu_plane_setBox(VisuBoxed *self, VisuBox *box, gboolean update); static void onBoxSizeChanged(VisuBox *box, float extens, gpointer data); static int comparePolygonPoint(gconstpointer pointA, gconstpointer pointB, gpointer data); static void computeInter(VisuPlane* plane); G_DEFINE_TYPE_WITH_CODE(VisuPlane, visu_plane, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE(VISU_TYPE_BOXED, visu_boxed_interface_init)) static void visu_plane_class_init(VisuPlaneClass *klass) { DBG_fprintf(stderr, "VisuPlane : creating the class of the object.\n"); DBG_fprintf(stderr, " - adding new signals ;\n"); /** * VisuPlane::moved: * @plane: the object emitting the signal. * * This signal is emitted each time the plane position is changed * (either distance or normal). * * Since: 3.3 */ plane_signals[VISU_PLANE_MOVED_SIGNAL] = g_signal_newv("moved", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, NULL, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, NULL); /** * VisuPlane::rendering: * @plane: the object emitting the signal. * * This signal is emitted each time the rendering properties (color, * visibility...) are affected. * * Since: 3.7 */ plane_signals[VISU_PLANE_RENDERING_SIGNAL] = g_signal_newv("rendering", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, NULL, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, NULL); /* Connect freeing methods. */ G_OBJECT_CLASS(klass)->dispose = visu_plane_dispose; G_OBJECT_CLASS(klass)->finalize = visu_plane_finalize; } static void visu_boxed_interface_init(VisuBoxedInterface *iface) { iface->get_box = visu_plane_getBox; iface->set_box = visu_plane_setBox; } static void visu_plane_init(VisuPlane *obj) { obj->dispose_has_run = FALSE; DBG_fprintf(stderr, "VisuPlane : creating a new plane (%p).\n", (gpointer)obj); obj->inter = (GList*)0; obj->hiddenSide = VISU_PLANE_SIDE_NONE; obj->nVectUser[0] = 0.; obj->nVectUser[1] = 0.; obj->nVectUser[2] = 0.; obj->dist = 0.; obj->color = (ToolColor*)0; obj->box = (VisuBox*)0; obj->size_signal = 0; obj->rendered = TRUE; } /* This method can be called several times. It should unref all of its reference to GObjects. */ static void visu_plane_dispose(GObject* obj) { DBG_fprintf(stderr, "VisuPlane : dispose object %p.\n", (gpointer)obj); if (VISU_PLANE(obj)->dispose_has_run) return; visu_plane_setBox(VISU_BOXED(obj), (VisuBox*)0, FALSE); VISU_PLANE(obj)->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS(visu_plane_parent_class)->dispose(obj); } /* This method is called once only. */ static void visu_plane_finalize(GObject* obj) { GList *tmpLst; g_return_if_fail(obj); DBG_fprintf(stderr, "VisuPlane : finalize object %p.\n", (gpointer)obj); /* Deleting the intersection nodes if any. */ tmpLst = VISU_PLANE(obj)->inter; while (tmpLst) { g_free(tmpLst->data); tmpLst = g_list_next(tmpLst); } /* Chain up to the parent class */ G_OBJECT_CLASS(visu_plane_parent_class)->finalize(obj); } /** * visu_plane_newUndefined: * * Create a new plane with default values. This plane can't be * rendered directly and one needs to computes its intersection with * the bounding box before using planeComputeInter(). * * Returns: (transfer full): a newly allocated #VisuPlane structure. */ VisuPlane* visu_plane_newUndefined(void) { VisuPlane *plane; /* Create the object with default values. */ plane = VISU_PLANE(g_object_new(VISU_TYPE_PLANE, NULL)); g_return_val_if_fail(plane, (VisuPlane*)0); return plane; } /** * visu_plane_new: * @box: (transfer full): a box description ; * @vect: (array fixed-size=3): three values defining the normal * vector (unitary or not) ; * @dist: the distance between origin and intersection of the plane and the * line made by origin and normal vector ; * @color: a #ToolColor. * * Create a plane with the specified attributes. * * Returns: a newly allocated #VisuPlane structure. */ VisuPlane* visu_plane_new(VisuBox *box, float vect[3], float dist, ToolColor *color) { VisuPlane *plane; g_return_val_if_fail(color, (VisuPlane*)0); /* Create the object with defaulty values. */ plane = VISU_PLANE(g_object_new(VISU_TYPE_PLANE, NULL)); g_return_val_if_fail(plane, (VisuPlane*)0); visu_plane_setNormalVector(plane, vect); visu_plane_setDistanceFromOrigin(plane, dist); visu_plane_setBox(VISU_BOXED(plane), box, TRUE); visu_plane_setColor(plane, color); return plane; } gboolean visu_plane_setNormalVector(VisuPlane *plane, float vect[3]) { int i; float norm; g_return_val_if_fail(VISU_IS_PLANE_TYPE(plane), FALSE); if (vect[0] == plane->nVectUser[0] && vect[1] == plane->nVectUser[1] && vect[2] == plane->nVectUser[2]) return FALSE; g_return_val_if_fail(vect[0] * vect[0] + vect[1] * vect[1] + vect[2] * vect[2] != 0., FALSE); norm = 0.; for (i = 0; i < 3; i++) { norm += vect[i] * vect[i]; plane->nVect[i] = vect[i]; plane->nVectUser[i] = vect[i]; } norm = sqrt(norm); for (i = 0; i < 3; i++) plane->nVect[i] /= norm; DBG_fprintf(stderr, "Visu VisuPlane : set normal vector (%f,%f,%f) for plane %p.\n", plane->nVect[0], plane->nVect[1], plane->nVect[2], (gpointer)plane); DBG_fprintf(stderr, "Visu VisuPlane : set user vector (%f,%f,%f) for plane %p.\n", plane->nVectUser[0], plane->nVectUser[1], plane->nVectUser[2], (gpointer)plane); if (!plane->box) return TRUE; /* We recompute the intersection. */ computeInter(plane); return TRUE; } gboolean visu_plane_setDistanceFromOrigin(VisuPlane *plane, float dist) { g_return_val_if_fail(VISU_IS_PLANE_TYPE(plane), FALSE); if (plane->dist == dist) return FALSE; plane->dist = dist; DBG_fprintf(stderr, "Visu VisuPlane : set distance from origin %f for plane %p.\n", dist, (gpointer)plane); if (!plane->box) return TRUE; /* We recompute the intersection. */ computeInter(plane); return TRUE; } static gboolean visu_plane_setBox(VisuBoxed *self, VisuBox *box, gboolean update _U_) { VisuPlane *plane; g_return_val_if_fail(VISU_IS_PLANE_TYPE(self), FALSE); plane = VISU_PLANE(self); if (plane->box == box) return FALSE; if (plane->box) { g_signal_handler_disconnect(G_OBJECT(plane->box), plane->size_signal); g_object_unref(plane->box); } plane->box = box; if (!box) return TRUE; g_object_ref(box); plane->size_signal = g_signal_connect(G_OBJECT(box), "SizeChanged", G_CALLBACK(onBoxSizeChanged), (gpointer)plane); computeInter(plane); return TRUE; } static VisuBox* visu_plane_getBox(VisuBoxed *self) { g_return_val_if_fail(VISU_IS_PLANE_TYPE(self), (VisuBox*)0); return VISU_PLANE(self)->box; } gboolean visu_plane_setColor(VisuPlane *plane, ToolColor *color) { g_return_val_if_fail(VISU_IS_PLANE_TYPE(plane), FALSE); if (color == plane->color) return FALSE; plane->color = color; g_signal_emit(G_OBJECT(plane), plane_signals[VISU_PLANE_RENDERING_SIGNAL], 0, NULL); return TRUE; } /** * visu_plane_setRendered: * @plane: a #VisuPlane ; * @rendered: TRUE to make the plane drawable. * * Change the visibility of the plane. * * Returns: TRUE if visu_plane_class_showHideAll() should be called. */ gboolean visu_plane_setRendered(VisuPlane *plane, gboolean rendered) { g_return_val_if_fail(VISU_IS_PLANE_TYPE(plane), FALSE); if (rendered == plane->rendered) return FALSE; plane->rendered = rendered; g_signal_emit(G_OBJECT(plane), plane_signals[VISU_PLANE_RENDERING_SIGNAL], 0, NULL); return TRUE; } /** * visu_plane_getRendered: * @plane: a #VisuPlane. * * Get the visibility of a plane. * * Returns: TRUE if the plane is visible. */ gboolean visu_plane_getRendered(VisuPlane *plane) { g_return_val_if_fail(VISU_IS_PLANE_TYPE(plane), FALSE); return plane->rendered; } /** * visu_plane_getIntersection: * @plane: a #VisuPlane. * * The list of intersection between the plane and the box is made of * float[3]. The planeComputeInter() should have been called before. * * Returns: (transfer none) (element-type ToolVector): a list of float[3] * elements. This list is owned by V_Sim. */ GList* visu_plane_getIntersection(VisuPlane *plane) { g_return_val_if_fail(VISU_IS_PLANE_TYPE(plane) && plane->box, (GList*)0); return plane->inter; } /** * visu_plane_getBasis: * @plane: a #VisuPlane ; * @xyz: two vectors. * @center: a point in cartesian coordinates. * * Stores the coordinates of barycentre of the plane in @center and * provide coordinates of two orthogonal vector in the plane. The planeComputeInter() * should have been called before. */ void visu_plane_getBasis(VisuPlane *plane, float xyz[2][3], float center[3]) { float spherical[3]; g_return_if_fail(VISU_IS_PLANE_TYPE(plane)); tool_matrix_cartesianToSpherical(spherical, plane->nVectUser); xyz[0][0] = cos(spherical[1] * TOOL_PI180) * cos(spherical[2] * TOOL_PI180); xyz[0][1] = cos(spherical[1] * TOOL_PI180) * sin(spherical[2] * TOOL_PI180); xyz[0][2] = -sin(spherical[1] * TOOL_PI180); xyz[1][0] = -sin(spherical[2] * TOOL_PI180); xyz[1][1] = cos(spherical[2] * TOOL_PI180); xyz[1][2] = 0.; center[0] = plane->pointG[0]; center[1] = plane->pointG[1]; center[2] = plane->pointG[2]; } /** * visu_plane_getReducedIntersection: * @plane: a #VisuPlane object. * @nVals: a location for an integer. * * This routine returns the coordinates in the @plane basis set of its * intersections with a box (see visu_plane_setBox()). The coordinates are * appended in the return array which length is stored in @nVals. * * Since: 3.6 * * Returns: a newly allocated array of @nVals * 2 values. Free it with * g_free(). */ float* visu_plane_getReducedIntersection(VisuPlane *plane, guint *nVals) { float *out, basis[2][3], center[3], *xyz; GList *tmpLst; gint i; g_return_val_if_fail(VISU_IS_PLANE_TYPE(plane) && plane->box, (float*)0); g_return_val_if_fail(nVals, (float*)0); if (!plane->inter) return (float*)0; visu_plane_getBasis(plane, basis, center); i = 0; out = g_malloc(sizeof(float) * g_list_length(plane->inter) * 2); for (tmpLst = plane->inter; tmpLst; tmpLst = g_list_next(tmpLst)) { xyz = (float*)tmpLst->data; out[i * 2 + 0] = basis[0][0] * (xyz[0] - center[0]) + basis[0][1] * (xyz[1] - center[1]) + basis[0][2] * (xyz[2] - center[2]); out[i * 2 + 1] = basis[1][0] * (xyz[0] - center[0]) + basis[1][1] * (xyz[1] - center[1]) + basis[1][2] * (xyz[2] - center[2]); i += 1; } *nVals = i; return out; } /** * visu_plane_getLineIntersection: * @plane: a #VisuPlane object. * @A: (array fixed-size=3): coordinates of point A. * @B: (array fixed-size=3): coordinates of point B. * @lambda: (out caller-allocates) (allow-none): a location to store * the intersecting factor. * * If there is an intersection M between line (AB) and @plane, then this * function calculates M coordinates as M = A + lambda * AB. * * Since: 3.6 * * Returns: TRUE if there is an intersection between line (AB) and the plane. **/ gboolean visu_plane_getLineIntersection(const VisuPlane *plane, const float A[3], const float B[3], float *lambda) { float denom, lambda_; g_return_val_if_fail(VISU_IS_PLANE_TYPE(plane), FALSE); /* The plane is defined by n1x+n2y+n3z-d=0 with (n1,n2,n3) the normal vector (unitary) and d the algebric distance from the origin. A segment {P} of the box is defined by P=A+lambda.l with A a vertex, l a vector in the direction of the segment and lambda a real. If it exists a lambda that can solve P(lambda) in the plane equation, and this lambda is in [0;1] then this is the intersection. */ lambda_ = plane->dist; lambda_ -= plane->nVect[0] * A[0]; lambda_ -= plane->nVect[1] * A[1]; lambda_ -= plane->nVect[2] * A[2]; denom = plane->nVect[0] * (B[0] - A[0]); denom += plane->nVect[1] * (B[1] - A[1]); denom += plane->nVect[2] * (B[2] - A[2]); if (denom == 0.) { /* if A is in the plane, we put lambda to 0. */ if (lambda_ == 0.f) denom = 1.f; else return FALSE; } lambda_ /= denom; if (lambda) *lambda = lambda_; return TRUE; } static void computeInter(VisuPlane* plane) { float lambda; int a[12] = {0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 6, 7}; int b[12] = {1, 2, 3, 0, 4, 5, 6, 7, 5, 6, 7, 4}; int i, j, n; float *inter; GList *tmpLst; float vertices[8][3]; g_return_if_fail(VISU_IS_PLANE_TYPE(plane) && plane->box); /* RAZ old intersection list. */ if (plane->inter) { tmpLst = plane->inter; while(tmpLst) { g_free((float*)tmpLst->data); tmpLst = g_list_next(tmpLst); } g_list_free(plane->inter); plane->inter = (GList*)0; } /* Compute, vector and position for the box. */ n = 0; plane->pointG[0] = 0.; plane->pointG[1] = 0.; plane->pointG[2] = 0.; visu_box_getVertices(plane->box, vertices, TRUE); for (i = 0; i < 12; i++) if (visu_plane_getLineIntersection(plane, vertices[a[i]], vertices[b[i]], &lambda) && lambda >= 0. && lambda <= 1.) { inter = g_malloc(sizeof(float) * 3); for (j = 0; j < 3; j++) { inter[j] = vertices[a[i]][j] + lambda * (vertices[b[i]][j] - vertices[a[i]][j]); plane->pointG[j] += inter[j]; } n += 1; plane->inter = g_list_append(plane->inter, (gpointer)inter); DBG_fprintf(stderr, "Visu Plane: a new intersection (%f,%f,%f) for plane %p.\n", inter[0], inter[1], inter[2], (gpointer)plane); } if (n > 0) { for (i = 0; i < 3; i++) plane->pointG[i] /= (float)n; plane->inter = g_list_sort_with_data(plane->inter, comparePolygonPoint, (gpointer)plane); } g_signal_emit(G_OBJECT(plane), plane_signals[VISU_PLANE_MOVED_SIGNAL], 0, NULL); } /** * visu_plane_getPlaneIntersection: * @plane1: a #VisuPlane object. * @plane2: another #VisuPlane object. * @A: (out) (array fixed-size=3): the coordinates of the first point * of intersection. * @B: (out) (array fixed-size=3): the coordinates of the second point * of intersection. * * Calculates the intersection between @plane1 and @plane2, if it * exists. The intersection is returned in @A and @B as the * coordinates of the two points on the border of @plane1 that * intersect @plane2. * * Since: 3.7 * * Returns: TRUE if there is an intersection between @plane1 and @plane2. **/ gboolean visu_plane_getPlaneIntersection(const VisuPlane *plane1, const VisuPlane *plane2, float A[3], float B[3]) { float lambda, *I, *J; GList *inter; guint n; float M[6][3]; n = 0; for (inter = plane1->inter; inter; inter = g_list_next(inter)) { I = (float*)inter->data; J = (inter->next)?(float*)inter->next->data:(float*)plane1->inter->data; if (visu_plane_getLineIntersection(plane2, I, J, &lambda) && lambda >= 0.f && lambda <= 1.f) { M[n][0] = I[0] + lambda * (J[0] - I[0]); M[n][1] = I[1] + lambda * (J[1] - I[1]); M[n][2] = I[2] + lambda * (J[2] - I[2]); n += 1; } } if (n != 2) return FALSE; A[0] = M[0][0]; A[1] = M[0][1]; A[2] = M[0][2]; B[0] = M[1][0]; B[1] = M[1][1]; B[2] = M[1][2]; fprintf(stderr, "%g %g %g | %g %g %g\n", A[0], A[1], A[2], B[0], B[1], B[2]); return TRUE; } static int comparePolygonPoint(gconstpointer pointA, gconstpointer pointB, gpointer data) { VisuPlane *plane; float vectGA[3], vectGB[3]; int i; float det; plane = (VisuPlane*)data; for (i = 0; i < 3; i++) { vectGA[i] = ((float*)pointA)[i] - plane->pointG[i]; vectGB[i] = ((float*)pointB)[i] - plane->pointG[i]; } det = vectGA[0] * vectGB[1] * plane->nVect[2] + vectGB[0] * plane->nVect[1] * vectGA[2] + plane->nVect[0] * vectGA[1] * vectGB[2] - vectGA[2] * vectGB[1] * plane->nVect[0] - vectGA[1] * vectGB[0] * plane->nVect[2] - vectGA[0] * vectGB[2] * plane->nVect[1]; if (det < 0.) return -1; else if (det > 0.) return 1; else return 0; } void visu_plane_getNVectUser(VisuPlane *plane, float *vect) { int i; g_return_if_fail(VISU_IS_PLANE_TYPE(plane)); for (i = 0; i < 3; i++) vect[i] = plane->nVectUser[i]; } void visu_plane_getNVect(VisuPlane *plane, float *vect) { int i; g_return_if_fail(VISU_IS_PLANE_TYPE(plane)); for (i = 0; i < 3; i++) vect[i] = plane->nVect[i]; } /** * visu_plane_getColor: * @plane: a #VisuPlane ; * * Stores the color of the plane. * * Returns: (transfer none): a #ToolColor. */ ToolColor* visu_plane_getColor(VisuPlane *plane) { g_return_val_if_fail(VISU_IS_PLANE_TYPE(plane), (ToolColor*)0); return plane->color; } /** * visu_plane_getDistanceFromOrigin: * @plane: a #VisuPlane ; * * Stores the distance of the plane to the origin. * * Returns: a float value. */ gfloat visu_plane_getDistanceFromOrigin(VisuPlane *plane) { g_return_val_if_fail(VISU_IS_PLANE_TYPE(plane), 0.f); return plane->dist; } int visu_plane_setHiddenState(VisuPlane *plane, int side) { g_return_val_if_fail(VISU_IS_PLANE_TYPE(plane), 0); g_return_val_if_fail(side == VISU_PLANE_SIDE_NONE || side == VISU_PLANE_SIDE_PLUS || side == VISU_PLANE_SIDE_MINUS, 0); DBG_fprintf(stderr, "Visu VisuPlane : hide state (%d, old %d) for plane %p.\n", side, plane->hiddenSide, (gpointer)plane); if (plane->hiddenSide == side) return 0; plane->hiddenSide = side; return 1; } int visu_plane_getHiddenState(VisuPlane *plane) { g_return_val_if_fail(VISU_IS_PLANE_TYPE(plane), 0); return plane->hiddenSide; } static void onBoxSizeChanged(VisuBox *box _U_, float extens _U_, gpointer data) { VisuPlane *plane = VISU_PLANE(data); computeInter(plane); } /** * visu_plane_class_getVisibility: * @listOfVisuPlanes: an array of #VisuPlane, NULL terminated ; * @point: three cartesian coordinates. * * Compute the visibility of the given @point, following the masking scheme * of the given plane list. * * Returns: TRUE if the point is not masked. */ gboolean visu_plane_class_getVisibility(VisuPlane **listOfVisuPlanes, float point[3]) { int i; float pScal; gboolean visibility; visibility = (plane_hidingMode == VISU_PLANE_HIDE_UNION) || !listOfVisuPlanes[0]; for (i = 0; listOfVisuPlanes[i]; i++) { pScal = listOfVisuPlanes[i]->nVect[0] * point[0] + listOfVisuPlanes[i]->nVect[1] * point[1] + listOfVisuPlanes[i]->nVect[2] * point[2] - listOfVisuPlanes[i]->dist; switch (plane_hidingMode) { case VISU_PLANE_HIDE_UNION: visibility = visibility && (pScal * listOfVisuPlanes[i]->hiddenSide >= 0.); break; case VISU_PLANE_HIDE_INTER: visibility = visibility || (pScal * listOfVisuPlanes[i]->hiddenSide >= 0.); break; default: break; } } return visibility; } /** * visu_plane_class_getIntersection: * @listOfVisuPlanes: an array of #VisuPlane, NULL terminated ; * @pointA: three cartesian coordinates. * @pointB: three cartesian coordinates. * @inter: a location to store the intersection point. * @inside: a boolean. * * Compute the location of the intersection point of segment AB with list of * planes @listOfVisuPlanes. If there are several intersections, the closest to * point A is returned. If @inside is TRUE, then the intersection * point must be within the line [AB]. * * Returns: TRUE if there is an intersection. */ gboolean visu_plane_class_getIntersection(VisuPlane **listOfVisuPlanes, float pointA[3], float pointB[3], float inter[3], gboolean inside) { float lambda; int i; float lambdaMin; /* DBG_fprintf(stderr, "VisuPlane: intersection A(%g;%g;%g) B(%g;%g;%g).\n", */ /* pointA[0], pointA[1], pointA[2], pointB[0], pointB[1], pointB[2]); */ lambdaMin = 2.f; for (i = 0; listOfVisuPlanes[i]; i++) { if (!visu_plane_getLineIntersection(listOfVisuPlanes[i], pointA, pointB, &lambda)) lambda = 2.f; if (( inside && lambda >= 0. && lambda <= 1. && lambda < lambdaMin) || (!inside && ((lambda <= 0.f && lambda > lambdaMin) || (lambdaMin > 0.f && lambda < lambdaMin)))) lambdaMin = lambda; } if (lambdaMin == 2.f) return FALSE; inter[0] = pointA[0] + lambdaMin * (pointB[0] - pointA[0]); inter[1] = pointA[1] + lambdaMin * (pointB[1] - pointA[1]); inter[2] = pointA[2] + lambdaMin * (pointB[2] - pointA[2]); return TRUE; } static gint comparisonForSortingFloats(gconstpointer a, gconstpointer b, gpointer user_data _U_) { float c; c = *((float*)b) - *((float*)a); if (c < 0.f) return (gint)(1); else if (c > 0.f) return (gint)(-1); else return (gint)(0); } static gint comparisonForHavingIndices(gconstpointer a, gconstpointer b, gpointer user_data) { float c; float *array; array = (float*)user_data; /*DBG_fprintf(stderr, "INDICES : a %d b %d\n", *((int*)a), *((int*)b));*/ c = array[*(int*)b] - array[*(int*)a]; /*DBG_fprintf(stderr, "LAMBDA b (%f) - LAMBDA a (%f) : %f\n", vb, va,c);*/ if (c < 0.f) return (gint)(1); else if (c > 0.f) return (gint)(-1); else return (gint)(0); } gboolean visu_plane_class_getOrderedIntersections(int nVisuPlanes, VisuPlane **listOfVisuPlanes, float pointA[3], float pointB[3], float *inter, int *index) { float *lambda; int *indices; int i; lambda = g_malloc(sizeof(float) * nVisuPlanes); indices = g_malloc(sizeof(int) * nVisuPlanes); for (i = 0; listOfVisuPlanes[i]; i++) { indices[i] = i; if (!visu_plane_getLineIntersection(listOfVisuPlanes[i], pointA, pointB, lambda + i) || lambda[i] < 0. || lambda[i] > 1.) /* If lambda is not between 0 and 1, this means that the plane i is not intersected by the AB segment => return FALSE */ return FALSE; } /* Sort lambda */ DBG_fprintf(stderr, "Sorting planes by lambda :\n ... lambda unsorted : "); for (i = 0; i < nVisuPlanes; i++) DBG_fprintf(stderr, "%f ", lambda[i]); DBG_fprintf(stderr, "\n"); g_qsort_with_data(indices, nVisuPlanes, sizeof(int), comparisonForHavingIndices, (float*)lambda); g_qsort_with_data(lambda, nVisuPlanes, sizeof(float), comparisonForSortingFloats, NULL); DBG_fprintf(stderr, " ... lambda sorted : "); for (i = 0; i < nVisuPlanes; i++) DBG_fprintf(stderr, "%f ", lambda[i]); DBG_fprintf(stderr, "\n ... indices : "); for (i = 0; i < nVisuPlanes; i++) DBG_fprintf(stderr, "%d ", indices[i]); DBG_fprintf(stderr, "\n"); /* Put the intersections in inter in the right order. */ DBG_fprintf(stderr, " ... intersections sorted :\n"); for (i = 0; i < nVisuPlanes; i++) { *(inter + 3*i) = pointA[0] + lambda[i] * (pointB[0] - pointA[0]); *(inter + 3*i + 1) = pointA[1] + lambda[i] * (pointB[1] - pointA[1]); *(inter + 3*i + 2) = pointA[2] + lambda[i] * (pointB[2] - pointA[2]); DBG_fprintf(stderr, " %f %f %f\n", *(inter + 3*i), *(inter + 3*i + 1), *(inter + 3*i + 2)); *(index + i) = indices[i]; } g_free(lambda); g_free(indices); return TRUE; } /** * visu_plane_class_showHideAll: * @listOfVisuPlanes: (array zero-terminated=1) * (element-type VisuPlane*) (transfer none): an array of #VisuPlane, * NULL terminated. * @visuData: a #VisuData which show or hide nodes to; * * This method test for each node if it is hidden or not by the * combination of all the given planes. * * Returns: TRUE if VisuNodeArray::VisibilityChanged signal should be called. */ gboolean visu_plane_class_showHideAll(VisuPlane **listOfVisuPlanes, VisuData *visuData) { int i, n; int reDraw; float point[3]; gboolean visibility; VisuPlane **tmpLst; VisuNodeArrayIter iter; g_return_val_if_fail(visuData && listOfVisuPlanes, FALSE); DBG_fprintf(stderr, "VisuPlanes : applying masking properties of planes.\n"); /* Remove planes of the given list that doesn't have a masking action. */ for (n = 0; listOfVisuPlanes[n]; n++); tmpLst = g_malloc(sizeof(VisuPlane*) * (n + 1)); n = 0; for (i = 0; listOfVisuPlanes[i]; i++) { if (listOfVisuPlanes[i]->hiddenSide != VISU_PLANE_SIDE_NONE) { DBG_fprintf(stderr, " | plane %p has a masking property.\n", (gpointer)listOfVisuPlanes[i]); tmpLst[n] = listOfVisuPlanes[i]; n += 1; } else DBG_fprintf(stderr, " | plane %p has no masking property.\n", (gpointer)listOfVisuPlanes[i]); } tmpLst[n] = (VisuPlane*)0; reDraw = 0; /* We change the rendered attribute of all nodes, very expensive... */ if (tmpLst[0]) { visu_node_array_iterNew(VISU_NODE_ARRAY(visuData), &iter); for (visu_node_array_iterStart(VISU_NODE_ARRAY(visuData), &iter); iter.element; visu_node_array_iterNextElement(VISU_NODE_ARRAY(visuData), &iter)) if (iter.element->sensitiveToPlanes && iter.element->rendered) { DBG_fprintf(stderr, " | element '%s'\n", iter.element->name); for (visu_node_array_iterRestartNode(VISU_NODE_ARRAY(visuData), &iter); iter.node; visu_node_array_iterNextNode(VISU_NODE_ARRAY(visuData), &iter)) { /* If node is already hiden, well, we go to the next. */ if (!iter.node->rendered) continue; visu_data_getNodePosition(visuData, iter.node, point); visibility = visu_plane_class_getVisibility(tmpLst, point); if (!visibility) reDraw = visu_node_setVisibility(iter.node, FALSE) || reDraw; DBG_fprintf(stderr, " | node '%d' -> %d %d\n", iter.node->number, visibility, iter.node->rendered); } } } g_free(tmpLst); return reDraw; } int visu_plane_class_setHiddingMode(VisuPlaneHidingMode mode) { g_return_val_if_fail(mode < VISU_PLANE_HIDE_N_VALUES, 0); if (mode == plane_hidingMode) return 0; plane_hidingMode = mode; return 1; } /*************************************************** * Parsing of data files containing list of planes * ***************************************************/ /* Known elements. */ #define PLANES_PARSER_ELEMENT_PLANES "planes" #define PLANES_PARSER_ELEMENT_PLANE "plane" #define PLANES_PARSER_ELEMENT_GEOMETRY "geometry" #define PLANES_PARSER_ELEMENT_HIDE "hide" #define PLANES_PARSER_ELEMENT_COLOR "color" /* Known attributes. */ #define PLANES_PARSER_ATTRIBUTES_RENDERED "rendered" #define PLANES_PARSER_ATTRIBUTES_VECTOR "normal-vector" #define PLANES_PARSER_ATTRIBUTES_DISTANCE "distance" #define PLANES_PARSER_ATTRIBUTES_STATUS "status" #define PLANES_PARSER_ATTRIBUTES_INVERT "invert" #define PLANES_PARSER_ATTRIBUTES_RGBA "rgba" static gboolean planesStarted; /* This method is called for every element that is parsed. The user_data must be a GList of planes. When a 'plane' element, a new plane is created and prepend in the list. When 'geometry' or other qualificative elements are found, the first plane of the list is modified accordingly. */ void listOfVisuPlanes_element(GMarkupParseContext *context _U_, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer user_data, GError **error) { GList **planesList; VisuPlane *plane; float normalVector[3]; float distance; float colorRGBA[4]; ToolColor *color; int i, res; int side, set; gboolean rendered; g_return_if_fail(user_data); planesList = (GList **)user_data; DBG_fprintf(stderr, "VisuPlanes parser: found '%s' element.\n", element_name); if (!strcmp(element_name, PLANES_PARSER_ELEMENT_PLANES)) { /* Should have no attributes. */ if (attribute_names[0]) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, _("Unexpected attribute '%s' for element '%s'."), attribute_names[0], PLANES_PARSER_ELEMENT_PLANES); return; } /* Initialise planeList. */ if (*planesList) g_warning("Unexpected non null pointer as user_data for the " "plane parser."); planesStarted = TRUE; *planesList = (GList*)0; } else if (!strcmp(element_name, PLANES_PARSER_ELEMENT_PLANE)) { rendered = TRUE; /* May have one attribute. */ if (attribute_names[0]) { if (!strcmp(attribute_names[0], PLANES_PARSER_ATTRIBUTES_RENDERED) ) { if (!strcmp(attribute_values[0], "yes")) rendered = TRUE; else if (!strcmp(attribute_values[0], "no")) rendered = FALSE; else g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Invalid value '%s' for attribute '%s'."), attribute_values[0], PLANES_PARSER_ATTRIBUTES_RENDERED); } else { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, _("Unexpected attribute '%s' for element '%s'."), attribute_names[0], PLANES_PARSER_ELEMENT_PLANE); return; } } plane = visu_plane_newUndefined(); visu_plane_setRendered(plane, rendered); DBG_fprintf(stderr, "VisuPlanes parser: adding plane %p to list %p.\n", (gpointer)plane, (gpointer)(*planesList)); *planesList = g_list_prepend(*planesList, (gpointer)plane); DBG_fprintf(stderr, " | new plane list: %p.\n", (gpointer)(*planesList)); } else if (planesStarted && !strcmp(element_name, PLANES_PARSER_ELEMENT_GEOMETRY)) { if (!*planesList || !(*planesList)->data) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("DTD error : parent element '%s' of element '%s' is missing."), PLANES_PARSER_ELEMENT_PLANE, element_name); return; } DBG_fprintf(stderr, "VisuPlanes parser: associated plane : %p.\n", (*planesList)->data); for(i = 0; attribute_names[i]; i++) { if (!strcmp(attribute_names[i], PLANES_PARSER_ATTRIBUTES_VECTOR)) { res = sscanf(attribute_values[i], "%g %g %g", normalVector, normalVector + 1, normalVector + 2); if (res != 3) g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Invalid value '%s' for attribute '%s'."), attribute_values[i], PLANES_PARSER_ATTRIBUTES_VECTOR); visu_plane_setNormalVector((VisuPlane*)(*planesList)->data, normalVector); } else if (!strcmp(attribute_names[i], PLANES_PARSER_ATTRIBUTES_DISTANCE)) { res = sscanf(attribute_values[i], "%g", &distance); if (res != 1) g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Invalid value '%s' for attribute '%s'."), attribute_values[i], PLANES_PARSER_ATTRIBUTES_DISTANCE); visu_plane_setDistanceFromOrigin((VisuPlane*)(*planesList)->data, distance); } else g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, _("Unexpected attribute '%s' for element '%s'."), attribute_names[i], PLANES_PARSER_ELEMENT_GEOMETRY); } } else if (planesStarted && !strcmp(element_name, PLANES_PARSER_ELEMENT_HIDE)) { if (!*planesList || !(*planesList)->data) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("DTD error: parent element '%s' of element '%s' is missing."), PLANES_PARSER_ELEMENT_PLANE, element_name); return; } set = 0; side = 1; for(i = 0; attribute_names[i]; i++) { if (!strcmp(attribute_names[i], PLANES_PARSER_ATTRIBUTES_STATUS)) { if (!strcmp(attribute_values[i], "yes")) set = 1; else if (!strcmp(attribute_values[i], "no")) set = 0; else g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Invalid value '%s' for attribute '%s'."), attribute_values[i], PLANES_PARSER_ATTRIBUTES_STATUS); } else if (!strcmp(attribute_names[i], PLANES_PARSER_ATTRIBUTES_INVERT)) { if (!strcmp(attribute_values[i], "yes")) side = -1; else if (!strcmp(attribute_values[i], "no")) side = 1; else g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Invalid value '%s' for attribute '%s'."), attribute_values[i], PLANES_PARSER_ATTRIBUTES_INVERT); } else g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, _("Unexpected attribute '%s' for element '%s'."), attribute_names[i], PLANES_PARSER_ELEMENT_HIDE); } ((VisuPlane*)(*planesList)->data)->hiddenSide = side * set; } else if (planesStarted && !strcmp(element_name, PLANES_PARSER_ELEMENT_COLOR)) { if (!*planesList || !(*planesList)->data) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("DTD error: parent element '%s' of element '%s' is missing."), PLANES_PARSER_ELEMENT_PLANE, element_name); return; } for(i = 0; attribute_names[i]; i++) { if (!strcmp(attribute_names[i], PLANES_PARSER_ATTRIBUTES_RGBA)) { res = sscanf(attribute_values[i], "%g %g %g %g", colorRGBA, colorRGBA + 1, colorRGBA + 2, colorRGBA + 3); if (res != 4) g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Invalid value '%s' for attribute '%s'."), attribute_values[i], PLANES_PARSER_ATTRIBUTES_RGBA); color = tool_color_addFloatRGBA(colorRGBA, &res); visu_plane_setColor(((VisuPlane*)(*planesList)->data), color); } else g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, _("Unexpected attribute '%s' for element '%s'."), attribute_names[i], PLANES_PARSER_ELEMENT_COLOR); } } else if (planesStarted) g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, _("Unexpected element '%s'."), element_name); } /* Check when a element is closed that everything required has been set. */ void listOfVisuPlanes_end(GMarkupParseContext *context _U_, const gchar *element_name, gpointer user_data, GError **error) { GList **planesList; float *vect; g_return_if_fail(user_data); planesList = (GList**)user_data; if (!strcmp(element_name, PLANES_PARSER_ELEMENT_PLANE)) { g_return_if_fail(*planesList && (*planesList)->data); if (!((VisuPlane*)(*planesList)->data)->color) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, _("DTD error: missing or wrong child element '%s'."), PLANES_PARSER_ELEMENT_COLOR); return; } vect = ((VisuPlane*)(*planesList)->data)->nVectUser; if (vect[0] == 0. && vect[1] == 0. && vect[2] == 0.) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, _("DTD error: missing or wrong child element '%s'."), PLANES_PARSER_ELEMENT_GEOMETRY); return; } } else if (!strcmp(element_name, PLANES_PARSER_ELEMENT_PLANES)) planesStarted = FALSE; } /* What to do when an error is raised. */ void listOfVisuPlanes_error(GMarkupParseContext *context _U_, GError *error, gpointer user_data _U_) { DBG_fprintf(stderr, "VisuPlanes parser: error raised '%s'.\n", error->message); } /** * visu_plane_class_parseXMLFile: * @filename: (type filename): the file to parse ; * @planes: (out callee-allocates) (array zero-terminated=1):a pointer to store the * parsed list (will be allocated and %NULL terminated) ; * @error: a pointer to store the error (can be NULL). * * Read the given file (syntax in XML) and create a list of planes. This list is an * allocated array that should be deallocated with g_free(). This array has always * one argument, since it is NULL terminated. * * Returns: (skip): TRUE if everything goes right, if not and @error (if not NULL) * is set and contains the message of the error. */ gboolean visu_plane_class_parseXMLFile(gchar* filename, VisuPlane ***planes, GError **error) { GMarkupParseContext* xmlContext; GMarkupParser parser; gboolean res; gsize size; gchar *buffer; GList *list, *tmpLst; int i; g_return_val_if_fail(filename && planes && !*planes, FALSE); *planes = g_malloc(sizeof(VisuPlane*)); *planes[0] = (VisuPlane*)0; buffer = (gchar*)0; if (!g_file_get_contents(filename, &buffer, &size, error)) return FALSE; /* Create context. */ list = (GList*)0; parser.start_element = listOfVisuPlanes_element; parser.end_element = listOfVisuPlanes_end; parser.text = NULL; parser.passthrough = NULL; parser.error = listOfVisuPlanes_error; xmlContext = g_markup_parse_context_new(&parser, 0, &list, NULL); /* Parse data. */ planesStarted = FALSE; res = g_markup_parse_context_parse(xmlContext, buffer, size, error); /* Free buffers. */ g_markup_parse_context_free(xmlContext); g_free(buffer); /* Need to reverse the list since elements have been prepended. */ list = g_list_reverse(list); /* Convert the list to an array. */ DBG_fprintf(stderr, "VisuPlanes: create array of planes (%d).\n", g_list_length(list)); *planes = g_realloc(*planes, sizeof(VisuPlane*) * (g_list_length(list) + 1)); i = 0; tmpLst = list; while (tmpLst) { DBG_fprintf(stderr, " | %d -> %p\n", i, tmpLst->data); (*planes)[i] = (VisuPlane*)tmpLst->data; i += 1; tmpLst = g_list_next(tmpLst); } (*planes)[i] = (VisuPlane*)0; g_list_free(list); if ((*planes)[0] == (VisuPlane*)0 && !*error) { *error = g_error_new(G_MARKUP_ERROR, G_MARKUP_ERROR_EMPTY, _("The file contains no plane.\n")); res = FALSE; } return res; } gboolean visu_plane_class_exportXMLFile(const gchar* filename, VisuPlane **list, GError **error) { GString *buffer; int i; gboolean valid; g_return_val_if_fail(filename && list, FALSE); buffer = g_string_new(" \n"); for (i = 0; list[i]; i++) { g_string_append_printf(buffer, " \n", (list[i]->rendered)?"yes":"no"); g_string_append_printf(buffer, " \n", list[i]->nVectUser[0], list[i]->nVectUser[1], list[i]->nVectUser[2], list[i]->dist); switch (list[i]->hiddenSide) { case VISU_PLANE_SIDE_NONE: g_string_append(buffer, " \n"); break; case VISU_PLANE_SIDE_MINUS: g_string_append(buffer, " \n"); break; case VISU_PLANE_SIDE_PLUS: g_string_append(buffer, " \n"); break; default: g_warning("Unknown hiddenSide attribute ofr the given plane."); }; g_string_append_printf(buffer, " \n", list[i]->color->rgba[0], list[i]->color->rgba[1], list[i]->color->rgba[2], list[i]->color->rgba[3]); g_string_append(buffer, " \n"); } g_string_append(buffer, " "); valid = tool_XML_substitute(buffer, filename, "planes", error); if (!valid) { g_string_free(buffer, TRUE); return FALSE; } valid = g_file_set_contents(filename, buffer->str, -1, error); g_string_free(buffer, TRUE); return valid; } v_sim-3.7.0/src/extraFunctions/plane.h0000644000353400050620000002452612215546074014653 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse m�l : BILLARD, non joignable par m�l ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant � visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est r�gi par la licence CeCILL soumise au droit fran�ais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffus�e par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez acc�der � cet en-t�te signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept� les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef VISU_PLANE_H #define VISU_PLANE_H #include #include #include G_BEGIN_DECLS /** * VISU_TYPE_PLANE: * * return the type of #VisuPlane. */ #define VISU_TYPE_PLANE (visu_plane_get_type ()) /** * VISU_PLANE: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuPlane type. */ #define VISU_PLANE(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_PLANE, VisuPlane)) /** * VISU_PLANE_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuPlaneClass. */ #define VISU_PLANE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_PLANE, VisuPlaneClass)) /** * VISU_IS_PLANE_TYPE: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuPlane object. */ #define VISU_IS_PLANE_TYPE(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_PLANE)) /** * VISU_IS_PLANE_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuPlaneClass class. */ #define VISU_IS_PLANE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_PLANE)) /** * VISU_PLANE_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. */ #define VISU_PLANE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_PLANE, VisuPlaneClass)) /** * VisuPlaneClass: * * An opaque structure. */ typedef struct _VisuPlaneClass VisuPlaneClass; /** * VisuPlane: * * All fields are private, use the access routines. */ typedef struct _VisuPlane VisuPlane; /** * visu_plane_get_type: * * This method returns the type of #VisuPlane, use VISU_TYPE_PLANE instead. * * Returns: the type of #VisuPlane. */ GType visu_plane_get_type(void); /** * VisuPlaneHidingMode: * @VISU_PLANE_HIDE_UNION: element are masked if one plane at least mask it ; * @VISU_PLANE_HIDE_INTER: element are masked if all planes mask it ; * @VISU_PLANE_HIDE_N_VALUES: number of masking possibilities. * * Enum used to address different hiding modes. See visu_plane_class_setHiddingMode() for * further details. */ typedef enum { VISU_PLANE_HIDE_UNION, VISU_PLANE_HIDE_INTER, VISU_PLANE_HIDE_N_VALUES } VisuPlaneHidingMode; /** * VISU_PLANE_SIDE_PLUS * * This is a key that defines which side is hidden by the plane. For * this value, the side is the one pointed by the normal vector. */ #define VISU_PLANE_SIDE_PLUS +1 /** * VISU_PLANE_SIDE_MINUS * * This is a key that defines which side is hidden by the plane. For * this value, the side is the one at the opposite of the one pointed * by the normal vector. */ #define VISU_PLANE_SIDE_MINUS -1 /** * VISU_PLANE_SIDE_NONE * * This is a key that defines which side is hidden by the plane. For * this value, no node is hidden. */ #define VISU_PLANE_SIDE_NONE 0 VisuPlane* visu_plane_new(VisuBox *box, float vect[3], float dist, ToolColor *color); VisuPlane* visu_plane_newUndefined(void); /** * visu_plane_setNormalVector: * @plane: a #VisuPlane object ; * @vect: three values defining the normal vector (unitary or not). * * Change the normal vector defining the orientation of the plane. * * Returns: 1 if the intersections should be recalculated by * a call to planeComputeInter(), 0 if not. Or -1 if there is * an error. */ gboolean visu_plane_setNormalVector(VisuPlane *plane, float vect[3]); /** * visu_plane_setDistanceFromOrigin: * @plane: a #VisuPlane object ; * @dist: the distance between origin and intersection of the plane and the * line made by origin and normal vector. * * Change the position of the plane. * * Returns: 1 if the intersections should be recalculated by * a call to planeComputeInter(), 0 if not. Or -1 if there is * an error. */ gboolean visu_plane_setDistanceFromOrigin(VisuPlane *plane, float dist); /** * visu_plane_setColor: * @plane: a #VisuPlane object ; * @color: a #ToolColor. * * Change the color of the plane. * * Returns: 0 if everything went right. */ gboolean visu_plane_setColor(VisuPlane *plane, ToolColor *color); void visu_plane_getBasis(VisuPlane *plane, float xyz[2][3], float center[3]); GList* visu_plane_getIntersection(VisuPlane *plane); float* visu_plane_getReducedIntersection(VisuPlane *plane, guint *nVals); /** * visu_plane_getNVectUser: * @plane: a #VisuPlane. * @vect: an already alloacted (size 3) float array. * * Stores the coordinates of the normal vector in @vec of the plane. It returns the values * given by the user, not the normalized vaues. */ void visu_plane_getNVectUser(VisuPlane *plane, float *vect); /** * visu_plane_getNVect: * @plane: a #VisuPlane. * @vect: an already alloacted (size 3) float array. * * Stores the coordinates of the normal vector in @vect of the plane. * It returns the normalized values. */ void visu_plane_getNVect(VisuPlane *plane, float *vect); gfloat visu_plane_getDistanceFromOrigin(VisuPlane *plane); gboolean visu_plane_getLineIntersection(const VisuPlane *plane, const float A[3], const float B[3], float *lambda); gboolean visu_plane_getPlaneIntersection(const VisuPlane *plane1, const VisuPlane *plane2, float A[3], float B[3]); ToolColor* visu_plane_getColor(VisuPlane *plane); /** * visu_plane_setHiddenState: * @plane: a #VisuPlane ; * @side: a key, #VISU_PLANE_SIDE_NONE, #VISU_PLANE_SIDE_PLUS or #VISU_PLANE_SIDE_MINUS. * * The plane can hide the nodes on one of its side. * The @side argument can be VISU_PLANE_SIDE_PLUS or VISU_PLANE_SIDE_MINUS or * VISU_PLANE_SIDE_NONE. It codes the side of the plane which hides the nodes. * If VISU_PLANE_SIDE_NONE is selected all nodes are rendered. * * Returns: 1 if visu_plane_class_showHideAll() should be called. */ int visu_plane_setHiddenState(VisuPlane *plane, int side); /** * visu_plane_getHiddenState: * @plane: a #VisuPlane. * * The plane can hide the nodes on one of its side. this * method get the status for the given @plane. * * Returns: the state, defined by VISU_PLANE_SIDE_PLUS or VISU_PLANE_SIDE_MINUS or * VISU_PLANE_SIDE_NONE. */ int visu_plane_getHiddenState(VisuPlane *plane); gboolean visu_plane_setRendered(VisuPlane *plane, gboolean rendered); gboolean visu_plane_getRendered(VisuPlane *plane); /* No object method. */ gboolean visu_plane_class_showHideAll(VisuPlane **listOfVisuPlanes, VisuData *visuData); gboolean visu_plane_class_getVisibility(VisuPlane **listOfVisuPlanes, float point[3]); gboolean visu_plane_class_getIntersection(VisuPlane **listOfVisuPlanes, float pointA[3], float pointB[3], float inter[3], gboolean inside); /** * visu_plane_class_getOrderedIntersections: * @nVisuPlanes: the number of planes (must be consistent with the number of * planes in listOfVisuPlanes!) * @listOfVisuPlanes: an array of #VisuPlane, NULL terminated ; * @pointA: three cartesian coordinates. * @pointB: three cartesian coordinates. * @inter: a pointer to the location to store the intersection points. * Supposing you know the number of intersection points ! * @index: a pointer to the location to store the indices of ordering * of the planes. * * Compute the location of the intersection points of segment AB with list of * planes @listOfVisuPlanes. If there are several intersections, they are ordered * by the proximity to point A. * * Returns: TRUE if the intersections are found. */ gboolean visu_plane_class_getOrderedIntersections(int nVisuPlanes, VisuPlane **listOfVisuPlanes, float pointA[3], float pointB[3], float *inter, int *index); /** * visu_plane_class_setHiddingMode: * @mode: a value related to the hiding mode (look at the enum #VisuPlaneHidingMode). * * This method is used to set the hiding mode flag. In union mode, elements * are not drwn if they are hidden by one plane at least. In intersection mode, * elements are only hidden if masked by all planes. * * Returns: 1 if visu_plane_class_showHideAll() should be called. */ int visu_plane_class_setHiddingMode(VisuPlaneHidingMode mode); gboolean visu_plane_class_parseXMLFile(gchar* filename, VisuPlane ***planes, GError **error); /** * visu_plane_class_exportXMLFile: * @filename: the file to export to ; * @list: an array (NULL terminated) to export ; * @error: a pointer to store the error (can be NULL). * * Export in XML format the given list of planes to the given file. * * Returns: TRUE if everything goes right, if not and @error (if not NULL) * is set and contains the message of the error. */ gboolean visu_plane_class_exportXMLFile(const gchar* filename, VisuPlane **list, GError **error); G_END_DECLS #endif v_sim-3.7.0/src/extraFunctions/pot2surf.c0000644000353400050620000023552612215546074015337 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD, Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2005) Adresse m�l : BILLARD, non joignable par m�l ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. Ce logiciel est un programme informatique servant � visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est r�gi par la licence CeCILL soumise au droit fran�ais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffus�e par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez acc�der � cet en-t�te signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept� les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD and Damien CALISTE and Olivier D'Astier, laboratoire L_Sim, (2001-2005) E-mail addresses : BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include #include #include #include #include #include "surfaces.h" #include "pot2surf.h" /** * SECTION:pot2surf * @short_description: Creates surfaces from scalar fields. * * Originally written by Luc Billard for his program * VISUALISE. It has been since transformed to a single function and * integrated in V_Sim. .pot file are text files which specification * are the following : * * 1st line: full pathname of the potential file to * read * 2nd line: full pathname of the surface file to * build * 3rd line: an integer giving the nbr n of * isosurfaces to build * Each of the n following lines must match the * pattern [value name] where value is a real number for the isovalue * and name is the name given for the corresponding isosurface to * build. Each surface should be named surface_*. * * The function will fail if it finds no isosurface corresponding to * some of the given isovalues. The panelSurfacesTools * contains a frontend to build valid .instruc files. This panel is * originally integrated in V_Sim. You can access it through the * Convert tab in the Isosurfaces panel. */ #define ISOSURFACES_FLAG_POTENTIAL "# potentialValue" static int nx, ny, nz; static double dxx, dyx, dyy, dzx, dzy, dzz; static double exx, eyx, eyy, ezx, ezy, ezz; static int nxm1, nym1, nzm1; static int nz3, nyz3, nxyz3; static double dxx1, dyx1, dyy1, dzx1, dzy1, dzz1; static double ***f = NULL; static double isovalue; static FILE *in = NULL; static int *itab = NULL; static double *xs = NULL, *ys = NULL, *zs = NULL, *xns = NULL, *yns = NULL, *zns = NULL; static gboolean create_fromSF_uniform(VisuSurfaces **surf, VisuScalarField *field, double isoValue, int id, const gchar *name); static gboolean create_fromSF_nonuniform(VisuSurfaces **surf, VisuScalarField *field, double isoValue, int id, const gchar *name); static gboolean Create_surf(int id, int nelez3, int neleyz3, int nelexyz3, int nPoints, guint sizem1[3], int *iTab, double *xsurf , double *ysurf , double *zsurf , double *xnsurf, double *ynsurf, double *znsurf, double isoValue, double ***scalarData, double scalarBox[6], const gchar *name, gboolean per[3], VisuSurfaces **surf); /* Tables from : http://www.swin.edu.au/astronomy/pbourke/modelling/polygonise/index.html (valid link on February 25, 2002) YOU WILL FIND MANY VERY INTERESTING PAGES at Paul Bourke's site: http://astronomy.swin.edu.au/pbourke/ Other routines by Luc Billard, on March 1, 2002 */ static int edgeTable[256]={ 0x0 , 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c, 0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00, 0x190, 0x99 , 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c, 0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90, 0x230, 0x339, 0x33 , 0x13a, 0x636, 0x73f, 0x435, 0x53c, 0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30, 0x3a0, 0x2a9, 0x1a3, 0xaa , 0x7a6, 0x6af, 0x5a5, 0x4ac, 0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0, 0x460, 0x569, 0x663, 0x76a, 0x66 , 0x16f, 0x265, 0x36c, 0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60, 0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff , 0x3f5, 0x2fc, 0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0, 0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55 , 0x15c, 0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950, 0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc , 0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0, 0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc, 0xcc , 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0, 0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c, 0x15c, 0x55 , 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650, 0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc, 0x2fc, 0x3f5, 0xff , 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0, 0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c, 0x36c, 0x265, 0x16f, 0x66 , 0x76a, 0x663, 0x569, 0x460, 0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac, 0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa , 0x1a3, 0x2a9, 0x3a0, 0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c, 0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33 , 0x339, 0x230, 0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c, 0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99 , 0x190, 0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c, 0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x0 }; static int triTable[256][16] = {{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 8, 3, 9, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {9, 2, 10, 0, 2, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {2, 8, 3, 2, 10, 8, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1}, {3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 11, 2, 8, 11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 9, 0, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 11, 2, 1, 9, 11, 9, 8, 11, -1, -1, -1, -1, -1, -1, -1}, {3, 10, 1, 11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 10, 1, 0, 8, 10, 8, 11, 10, -1, -1, -1, -1, -1, -1, -1}, {3, 9, 0, 3, 11, 9, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1}, {9, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 3, 0, 7, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 1, 9, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 1, 9, 4, 7, 1, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 10, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {3, 4, 7, 3, 0, 4, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1}, {9, 2, 10, 9, 0, 2, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1}, {2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, -1, -1, -1, -1}, {8, 4, 7, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {11, 4, 7, 11, 2, 4, 2, 0, 4, -1, -1, -1, -1, -1, -1, -1}, {9, 0, 1, 8, 4, 7, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1}, {4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, -1, -1, -1, -1}, {3, 10, 1, 3, 11, 10, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1}, {1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1}, {4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1}, {4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1}, {9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1}, {5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1}, {2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1}, {9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1}, {0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1}, {2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1}, {10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1}, {4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1}, {5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1}, {5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1}, {9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1}, {0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1}, {1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1}, {10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1}, {8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1}, {2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1}, {7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1}, {9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1}, {2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1}, {11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1}, {9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1}, {5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1}, {11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1}, {11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1}, {1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 6, 5, 1, 2, 6, 3, 0, 8, -1, -1, -1, -1, -1, -1, -1}, {9, 6, 5, 9, 0, 6, 0, 2, 6, -1, -1, -1, -1, -1, -1, -1}, {5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8, -1, -1, -1, -1}, {2, 3, 11, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {11, 0, 8, 11, 2, 0, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1}, {0, 1, 9, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1}, {5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11, -1, -1, -1, -1}, {6, 3, 11, 6, 5, 3, 5, 1, 3, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6, -1, -1, -1, -1}, {3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9, -1, -1, -1, -1}, {6, 5, 9, 6, 9, 11, 11, 9, 8, -1, -1, -1, -1, -1, -1, -1}, {5, 10, 6, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 3, 0, 4, 7, 3, 6, 5, 10, -1, -1, -1, -1, -1, -1, -1}, {1, 9, 0, 5, 10, 6, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1}, {10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4, -1, -1, -1, -1}, {6, 1, 2, 6, 5, 1, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7, -1, -1, -1, -1}, {8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6, -1, -1, -1, -1}, {7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9, -1}, {3, 11, 2, 7, 8, 4, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1}, {5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11, -1, -1, -1, -1}, {0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1}, {9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6, -1}, {8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6, -1, -1, -1, -1}, {5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11, -1}, {0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7, -1}, {6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9, -1, -1, -1, -1}, {10, 4, 9, 6, 4, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 10, 6, 4, 9, 10, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1}, {10, 0, 1, 10, 6, 0, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1}, {8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10, -1, -1, -1, -1}, {1, 4, 9, 1, 2, 4, 2, 6, 4, -1, -1, -1, -1, -1, -1, -1}, {3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4, -1, -1, -1, -1}, {0, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {8, 3, 2, 8, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1}, {10, 4, 9, 10, 6, 4, 11, 2, 3, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6, -1, -1, -1, -1}, {3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10, -1, -1, -1, -1}, {6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1, -1}, {9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3, -1, -1, -1, -1}, {8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1, -1}, {3, 11, 6, 3, 6, 0, 0, 6, 4, -1, -1, -1, -1, -1, -1, -1}, {6, 4, 8, 11, 6, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {7, 10, 6, 7, 8, 10, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1}, {0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10, -1, -1, -1, -1}, {10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0, -1, -1, -1, -1}, {10, 6, 7, 10, 7, 1, 1, 7, 3, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7, -1, -1, -1, -1}, {2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, -1}, {7, 8, 0, 7, 0, 6, 6, 0, 2, -1, -1, -1, -1, -1, -1, -1}, {7, 3, 2, 6, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, -1, -1, -1, -1}, {2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, -1}, {1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, -1}, {11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, -1, -1, -1, -1}, {8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, -1}, {0, 9, 1, 11, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, -1, -1, -1, -1}, {7, 11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {3, 0, 8, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 1, 9, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {8, 1, 9, 8, 3, 1, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1}, {10, 1, 2, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 10, 3, 0, 8, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1}, {2, 9, 0, 2, 10, 9, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1}, {6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, -1, -1, -1, -1}, {7, 2, 3, 6, 2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {7, 0, 8, 7, 6, 0, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1}, {2, 7, 6, 2, 3, 7, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1}, {1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, -1, -1, -1, -1}, {10, 7, 6, 10, 1, 7, 1, 3, 7, -1, -1, -1, -1, -1, -1, -1}, {10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, -1, -1, -1, -1}, {0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, -1, -1, -1, -1}, {7, 6, 10, 7, 10, 8, 8, 10, 9, -1, -1, -1, -1, -1, -1, -1}, {6, 8, 4, 11, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {3, 6, 11, 3, 0, 6, 0, 4, 6, -1, -1, -1, -1, -1, -1, -1}, {8, 6, 11, 8, 4, 6, 9, 0, 1, -1, -1, -1, -1, -1, -1, -1}, {9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, -1, -1, -1, -1}, {6, 8, 4, 6, 11, 8, 2, 10, 1, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, -1, -1, -1, -1}, {4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, -1, -1, -1, -1}, {10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, -1}, {8, 2, 3, 8, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1}, {0, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, -1, -1, -1, -1}, {1, 9, 4, 1, 4, 2, 2, 4, 6, -1, -1, -1, -1, -1, -1, -1}, {8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, -1, -1, -1, -1}, {10, 1, 0, 10, 0, 6, 6, 0, 4, -1, -1, -1, -1, -1, -1, -1}, {4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, -1}, {10, 9, 4, 6, 10, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 9, 5, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 3, 4, 9, 5, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1}, {5, 0, 1, 5, 4, 0, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1}, {11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, -1, -1, -1, -1}, {9, 5, 4, 10, 1, 2, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1}, {6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, -1, -1, -1, -1}, {7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, -1, -1, -1, -1}, {3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, -1}, {7, 2, 3, 7, 6, 2, 5, 4, 9, -1, -1, -1, -1, -1, -1, -1}, {9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, -1, -1, -1, -1}, {3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, -1, -1, -1, -1}, {6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, -1}, {9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, -1, -1, -1, -1}, {1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, -1}, {4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, -1}, {7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, -1, -1, -1, -1}, {6, 9, 5, 6, 11, 9, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1}, {3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, -1, -1, -1, -1}, {0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, -1, -1, -1, -1}, {6, 11, 3, 6, 3, 5, 5, 3, 1, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, -1, -1, -1, -1}, {0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, -1}, {11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, -1}, {6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, -1, -1, -1, -1}, {5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, -1, -1, -1, -1}, {9, 5, 6, 9, 6, 0, 0, 6, 2, -1, -1, -1, -1, -1, -1, -1}, {1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, -1}, {1, 5, 6, 2, 1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, -1}, {10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, -1, -1, -1, -1}, {0, 3, 8, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {10, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {11, 5, 10, 7, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {11, 5, 10, 11, 7, 5, 8, 3, 0, -1, -1, -1, -1, -1, -1, -1}, {5, 11, 7, 5, 10, 11, 1, 9, 0, -1, -1, -1, -1, -1, -1, -1}, {10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, -1, -1, -1, -1}, {11, 1, 2, 11, 7, 1, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, -1, -1, -1, -1}, {9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, -1, -1, -1, -1}, {7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, -1}, {2, 5, 10, 2, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1}, {8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, -1, -1, -1, -1}, {9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, -1, -1, -1, -1}, {9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, -1}, {1, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 7, 0, 7, 1, 1, 7, 5, -1, -1, -1, -1, -1, -1, -1}, {9, 0, 3, 9, 3, 5, 5, 3, 7, -1, -1, -1, -1, -1, -1, -1}, {9, 8, 7, 5, 9, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {5, 8, 4, 5, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1}, {5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, -1, -1, -1, -1}, {0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, -1, -1, -1, -1}, {10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, -1}, {2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, -1, -1, -1, -1}, {0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, -1}, {0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, -1}, {9, 4, 5, 2, 11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, -1, -1, -1, -1}, {5, 10, 2, 5, 2, 4, 4, 2, 0, -1, -1, -1, -1, -1, -1, -1}, {3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, -1}, {5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, -1, -1, -1, -1}, {8, 4, 5, 8, 5, 3, 3, 5, 1, -1, -1, -1, -1, -1, -1, -1}, {0, 4, 5, 1, 0, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, -1, -1, -1, -1}, {9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 11, 7, 4, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, -1, -1, -1, -1}, {1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, -1, -1, -1, -1}, {3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, -1}, {4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, -1, -1, -1, -1}, {9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, -1}, {11, 7, 4, 11, 4, 2, 2, 4, 0, -1, -1, -1, -1, -1, -1, -1}, {11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, -1, -1, -1, -1}, {2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, -1, -1, -1, -1}, {9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, -1}, {3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, -1}, {1, 10, 2, 8, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 9, 1, 4, 1, 7, 7, 1, 3, -1, -1, -1, -1, -1, -1, -1}, {4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, -1, -1, -1, -1}, {4, 0, 3, 7, 4, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {9, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1}, {0, 1, 10, 0, 10, 8, 8, 10, 11, -1, -1, -1, -1, -1, -1, -1}, {3, 1, 10, 11, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 11, 1, 11, 9, 9, 11, 8, -1, -1, -1, -1, -1, -1, -1}, {3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, -1, -1, -1, -1}, {0, 2, 11, 8, 0, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {3, 2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {2, 3, 8, 2, 8, 10, 10, 8, 9, -1, -1, -1, -1, -1, -1, -1}, {9, 10, 2, 0, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, -1, -1, -1, -1}, {1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 3, 8, 9, 1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}}; /******************************************************************************/ static double gx(int i, int j, int k) { if(i > 0 && i < nxm1) { return (f[i+1][j][k]-f[i-1][j][k]) / 2.0; } else if(i == 0) { return (f[i+1][j][k]-f[i][j][k]); } else { return (f[i][j][k]-f[i-1][j][k]); } } /******************************************************************************/ static double gy(int i, int j, int k) { if(j > 0 && j < nym1) { return (f[i][j+1][k]-f[i][j-1][k]) / 2.0; } else if(j == 0) { return (f[i][j+1][k]-f[i][j][k]); } else { return (f[i][j][k]-f[i][j-1][k]); } } /******************************************************************************/ static double gz(int i, int j, int k) { if(k > 0 && k < nzm1) { return (f[i][j][k+1]-f[i][j][k-1]) / 2.0; } else if(k == 0) { return (f[i][j][k+1]-f[i][j][k]); } else { return (f[i][j][k]-f[i][j][k-1]); } } /******************************************************************************/ static GString* calc(guint *n1, guint *n2) { /* I label local cell vertices as in ref. above and assigns x y z names like this : y | 4----------5 /. /| 7----------6 | | . | | | . | | | 0........|.1 --x |/ |/ 3----------2 / z */ register int i, j, k; guint n; double fac; double xu, yu, zu, xui, xuij, yuj; int cubeindex; int e; int vertlist[12]; int m1, m2, m3; double ux, uy, uz, vx, vy, vz, wx, wy, wz, s; double xnu, ynu, znu; GString *out; /* edges are labelled from each corner: x+ then z+ then y+ for k varying fastest then j varying fastest then i varying fastest */ n = 0; for(i=0; i= 0) || (isovalue-f[i][j][k] >= 0.0 && isovalue-f[i+1][j][k] < 0)) { fac = (isovalue-f[i][j][k])/(f[i+1][j][k]-f[i][j][k]); itab[n] = *n2; xs[*n2] = xu + fac*dxx1; ys[*n2] = yu; zs[*n2] = zu; ux = xnu + fac*(gx(i+1, j, k) - xnu); uy = ynu + fac*(gy(i+1, j, k) - ynu); uz = znu + fac*(gz(i+1, j, k) - znu); ux = ux*exx+uy*eyx+uz*ezx; uy = uy*eyy+uz*ezy; uz = uz*ezz; s = sqrt(ux*ux+uy*uy+uz*uz); if(s <= 0.0) { g_warning("normal direction assumed"); xns[*n2] = 1.0; yns[*n2] = 0.0; zns[*n2] = 0.0; } else { xns[*n2] = ux/s; yns[*n2] = uy/s; zns[*n2] = uz/s; } *n2 += 1; } else { itab[n] = -1; } } else { itab[n] = -1; } n++; if(k= 0) || (isovalue-f[i][j][k] >= 0.0 && isovalue-f[i][j][k+1] < 0)) { fac = (isovalue-f[i][j][k])/(f[i][j][k+1]-f[i][j][k]); itab[n] = *n2; xs[*n2] = xu + fac*dzx1; ys[*n2] = yu + fac*dzy1; zs[*n2] = zu + fac*dzz1; ux = xnu + fac*(gx(i, j, k+1) - xnu); uy = ynu + fac*(gy(i, j, k+1) - ynu); uz = znu + fac*(gz(i, j, k+1) - znu); ux = ux*exx+uy*eyx+uz*ezx; uy = uy*eyy+uz*ezy; uz = uz*ezz; s = sqrt(ux*ux+uy*uy+uz*uz); if(s <= 0.0) { g_warning("normal direction assumed"); xns[*n2] = 1.0; yns[*n2] = 0.0; zns[*n2] = 0.0; } else { xns[*n2] = ux/s; yns[*n2] = uy/s; zns[*n2] = uz/s; } *n2 += 1; } else { itab[n] = -1; } } else { itab[n] = -1; } n++; if(j= 0) || (isovalue-f[i][j][k] >= 0.0 && isovalue-f[i][j+1][k] < 0)) { fac = (isovalue-f[i][j][k])/(f[i][j+1][k]-f[i][j][k]); itab[n] = *n2; xs[*n2] = xu + fac*dyx1; ys[*n2] = yu + fac*dyy1; zs[*n2] = zu; ux = xnu + fac*(gx(i, j+1, k) - xnu); uy = ynu + fac*(gy(i, j+1, k) - ynu); uz = znu + fac*(gz(i, j+1, k) - znu); ux = ux*exx+uy*eyx+uz*ezx; uy = uy*eyy+uz*ezy; uz = uz*ezz; s = sqrt(ux*ux+uy*uy+uz*uz); if(s <= 0.0) { g_warning("normal direction assumed"); xns[*n2] = 1.0; yns[*n2] = 0.0; zns[*n2] = 0.0; } else { xns[*n2] = ux/s; yns[*n2] = uy/s; zns[*n2] = uz/s; } *n2 += 1; } else { itab[n] = -1; } } else { itab[n] = -1; } n++; } } } if(*n2 == 0) { g_warning("no isosurfaces found."); return (GString*)0; } out = g_string_new(""); for(i=0; istr); g_string_free(local, TRUE); n1_tot += n1; n2_tot += n2; } local = g_string_new(comment); g_free(comment); g_string_append_printf(local, "%f %f %f\n", dxx, dyx, dyy); g_string_append_printf(local, "%f %f %f\n", dzx, dzy, dzz); g_string_append_printf(local, "%12d%12d%12d", nsurfs_to_build, n1_tot, n2_tot); g_string_prepend(out, local->str); g_string_free(local, TRUE); DBG_fprintf(stderr, "Found a total of %d facets and %d points\n", n1_tot, n2_tot); DBG_fprintf(stderr, "Done.\n"); for(i=0; istr, -1, &error)) { g_warning("%s", error->message); g_error_free(error); return 1; } g_string_free(out, TRUE); return 0; } #endif /******************************************************************************/ /******************************************************************************/ /* DEVELOPMENT AREA Methods are copied to be callable without all static stuff everywhere. */ static double getData(int i, int j, int k, double ***data, guint size[3], gboolean periodic[3]) { int x, y, z; if (periodic[0]) x = (i < 0)?i + size[0]:i%size[0]; else x = CLAMP(i, 0, (int)size[0]); if (periodic[1]) y = (j < 0)?j + size[1]:j%size[1]; else y = CLAMP(j, 0, (int)size[1]); if (periodic[2]) z = (k < 0)?k + size[2]:k%size[2]; else z = CLAMP(k, 0, (int)size[2]); return data[x][y][z]; } static double getDeltaMesh(int i, double *mesh, int size, gboolean periodic) { if (i >= size - 1) { if (periodic) return 1. + mesh[(i + 1)%size] - mesh[i%size]; else return (mesh[size] - mesh[size - 1]); } return (mesh[i + 1] - mesh[i]); } static double getGrad(int i, int j, int k, double ***data, guint size[3], guint dir, gboolean periodic[3]) { int prev[3], after[3]; prev[0] = i; prev[1] = j; prev[2] = k; prev[dir] -= 1; after[0] = i; after[1] = j; after[2] = k; after[dir] += 1; if (periodic[dir]) return (getData(after[0], after[1], after[2], data, size, periodic) - getData(prev[0], prev[1], prev[2], data, size, periodic)) / 2.; else { if (prev[dir] < 0 || after[dir] > (int)size[dir]) return (getData(after[0], after[1], after[2], data, size, periodic) - getData(prev[0], prev[1], prev[2], data, size, periodic)); else return (getData(after[0], after[1], after[2], data, size, periodic) - getData(prev[0], prev[1], prev[2], data, size, periodic)) / 2.; } } /** * visu_surfaces_createFromScalarField: * @surf: (inout) (allow-none): a location on a #VisuSurfaces pointer ; * @field: the scalar field to create the surface from ; * @isoValue: the value of the isosurface ; * @id: an integer identifying the surface ; * @name: (allow-none): the name of the surface to use (can be NULL). * * Create on the fly a surface from the scalar field @field. If * @name is given, the surface is created with it, if not, "Isosurface * @id + 1" is used. @surf can already contains several surfaces, in * that case, the new surface is added. If @surf is NULL, then a new * #VisuSurfaces object is created and returned. * * Returns: TRUE if the surface is created. */ gboolean visu_surfaces_createFromScalarField(VisuSurfaces **surf, VisuScalarField *field, double isoValue, int id, const gchar *name) { /* Local variables*/ gboolean status; /* Routine code*/ switch (visu_scalar_field_getMeshtype(field)) { case VISU_SCALAR_FIELD_MESH_UNIFORM: status = create_fromSF_uniform (surf, field, isoValue, id, name); break; case VISU_SCALAR_FIELD_MESH_NON_UNIFORM: status = create_fromSF_nonuniform(surf, field, isoValue, id, name); break; default: g_warning("Wrong value for 'meshtype'."); return FALSE; } return status; } /** * create_fromSF_uniform: * @surf: a location on a #VisuSurfaces pointer ; * @field: the scalar field to create the surface from ; * @isoValue: the value of the isosurface ; * @id: an integer identifying the surface ; * @name: the name of the surface to use (can be NULL). * * Create on the fly a surface from the scalar field @field. If @name is given, the surface * is created with it, if not, "Isosurface @id + 1" is used. @surf can already * contains several surfaces, in that case, the new surface is added. If @surf is * NULL, then a new #VisuSurfaces object is created and returned. * * Returns: TRUE if the surface is created. */ static gboolean create_fromSF_uniform(VisuSurfaces **surf, VisuScalarField *field, double isoValue, int id, const gchar *name) { /* I label local cell vertices as in ref. above and assigns x y z names like this : y | 4----------5 /. /| 7----------6 | | . | | | . | | | 0........|.1 --x |/ |/ 3----------2 / z */ /* Local variables */ register guint i, j, k; int n; int nelez3, neleyz3, nelexyz3; int nPoints; guint sizem1[3]; /*nx-1, ny-1 ,nz-1 : number of mesh intervals in the x,y and z direction*/ guint scalarGrid[3]; /*nx, ny ,nz : number of mesh nodes in the x,y and z direction*/ int *iTab; double fac; double xu, yu, zu, xui, xuij, yuj; double vux, vuy, vuz, s; double vxnu, vynu, vznu, v; double orthoBox[6]; /* inverse length of the box*/ double dBox[6]; /*step of the mesh*/ double *xsurf, *ysurf, *zsurf, *xnsurf, *ynsurf, *znsurf; double ***scalarData, val1, val2; VisuBox *box; double scalarBox[VISU_BOX_N_VECTORS]; /*define the box edges and topology*/ gboolean per[3], status; float scalarShift[3]; /* Routine code*/ /* Ensure that the pointer is not zero */ g_return_val_if_fail(surf, FALSE); /* edges are labelled from each corner: x+ then z+ then y+ for k varying fastest then j varying fastest then i varying fastest */ /* Get data from the field. */ box = visu_boxed_getBox(VISU_BOXED(field)); for (i = 0; i < VISU_BOX_N_VECTORS; i++) scalarBox[i] = visu_box_getGeometry(box, i); visu_box_getPeriodicity(box, per); scalarData = visu_scalar_field_getData(field); visu_scalar_field_getGridSize(field, scalarGrid); visu_scalar_field_getOriginShift(field, scalarShift); DBG_fprintf(stderr, "Pot2surf : compute isosurface at value %g from" " field %p.\n", isoValue, (gpointer)field); DBG_fprintf(stderr, " | periodic %d, %d, %d.\n", per[0], per[1], per[2]); DBG_fprintf(stderr, " | value %g.\n", isoValue); DBG_fprintf(stderr, " | size %d %d %d.\n", scalarGrid[0], scalarGrid[1], scalarGrid[2]); DBG_fprintf(stderr, " | box %g %g %g\n", scalarBox[0], scalarBox[1], scalarBox[2]); DBG_fprintf(stderr, " | %g %g %g.\n", scalarBox[3], scalarBox[4], scalarBox[5]); DBG_fprintf(stderr, " | shift %g %g %g\n", scalarShift[0], scalarShift[1], scalarShift[2]); /* Compute some local values. */ if (per[0]) scalarGrid[0] += 1; if (per[1]) scalarGrid[1] += 1; if (per[2]) scalarGrid[2] += 1; for (i = 0; i < 3; i++) sizem1[i] = scalarGrid[i] - 1; v = scalarBox[0] * scalarBox[2] * scalarBox[5]; /* volume of the box = Lx*Ly*Lz */ orthoBox[0] = scalarBox[2] * scalarBox[5] / v; /* 1/Lx */ orthoBox[1] = -scalarBox[1] * scalarBox[5] / v; orthoBox[2] = scalarBox[0] * scalarBox[5] / v; /* 1/Ly */ orthoBox[3] = (scalarBox[1] * scalarBox[4] - scalarBox[2] * scalarBox[3]) / v; orthoBox[4] = -scalarBox[0] * scalarBox[4] / v; orthoBox[5] = scalarBox[0] * scalarBox[2] / v; /* 1/Lz */ dBox[0] = scalarBox[0] / sizem1[0]; dBox[1] = scalarBox[1] / sizem1[1]; dBox[2] = scalarBox[2] / sizem1[1]; dBox[3] = scalarBox[3] / sizem1[2]; dBox[4] = scalarBox[4] / sizem1[2]; dBox[5] = scalarBox[5] / sizem1[2]; nelez3 = 3 * scalarGrid[2]; neleyz3 = scalarGrid[1] * nelez3; nelexyz3 = scalarGrid[0] * neleyz3; /* 3*nx*ny*nz */ nPoints = 0; /* Allocate buffers. */ /* Point values. */ xsurf = g_malloc(nelexyz3 * sizeof(double)); ysurf = g_malloc(nelexyz3 * sizeof(double)); zsurf = g_malloc(nelexyz3 * sizeof(double)); /* Normal values. */ xnsurf = g_malloc(nelexyz3 * sizeof(double)); ynsurf = g_malloc(nelexyz3 * sizeof(double)); znsurf = g_malloc(nelexyz3 * sizeof(double)); /* Indexes. */ iTab = g_malloc(nelexyz3 * sizeof(int)); n = 0; for(i=0; i= 0.0) || (isoValue - val1 >= 0.0 && isoValue - val2 < 0.0)) { fac = (isoValue - val1) / (val2 - val1); iTab[n] = nPoints; xsurf[nPoints] = xu + fac*dBox[0]; /* surface intersection coordinates*/ ysurf[nPoints] = yu; zsurf[nPoints] = zu; vux = vxnu + fac*(getGrad(i+1, j, k, scalarData, sizem1, 0, per) - vxnu); vuy = vynu + fac*(getGrad(i+1, j, k, scalarData, sizem1, 1, per) - vynu); vuz = vznu + fac*(getGrad(i+1, j, k, scalarData, sizem1, 2, per) - vznu); vux = vux*orthoBox[0]+vuy*orthoBox[1]+vuz*orthoBox[3]; vuy = vuy*orthoBox[2]+vuz*orthoBox[4]; vuz = vuz*orthoBox[5]; s = sqrt(vux*vux+vuy*vuy+vuz*vuz); if(s <= 0.0) { (void)fprintf(stderr, "\aWARNING: normal direction assumed\n"); xnsurf[nPoints] = 1.0; ynsurf[nPoints] = 0.0; znsurf[nPoints] = 0.0; } else { xnsurf[nPoints] = vux/s; ynsurf[nPoints] = vuy/s; znsurf[nPoints] = vuz/s; } nPoints++; } else { iTab[n] = -1; } } else { iTab[n] = -1; } n++; if(k= 0.0) || (isoValue - val1 >= 0.0 && isoValue - val2 < 0.0)) { fac = (isoValue - val1) / (val2 - val1); iTab[n] = nPoints; xsurf[nPoints] = xu + fac*dBox[3]; ysurf[nPoints] = yu + fac*dBox[4]; zsurf[nPoints] = zu + fac*dBox[5]; vux = vxnu + fac*(getGrad(i, j, k+1, scalarData, sizem1, 0, per) - vxnu); vuy = vynu + fac*(getGrad(i, j, k+1, scalarData, sizem1, 1, per) - vynu); vuz = vznu + fac*(getGrad(i, j, k+1, scalarData, sizem1, 2, per) - vznu); vux = vux*orthoBox[0]+vuy*orthoBox[1]+vuz*orthoBox[3]; vuy = vuy*orthoBox[2]+vuz*orthoBox[4]; vuz = vuz*orthoBox[5]; s = sqrt(vux*vux+vuy*vuy+vuz*vuz); if(s <= 0.0) { (void)fprintf(stderr, "\aWARNING: normal direction assumed\n"); xnsurf[nPoints] = 1.0; ynsurf[nPoints] = 0.0; znsurf[nPoints] = 0.0; } else { xnsurf[nPoints] = vux/s; ynsurf[nPoints] = vuy/s; znsurf[nPoints] = vuz/s; } nPoints++; } else { iTab[n] = -1; } } else { iTab[n] = -1; } n++; if(j= 0.0) || (isoValue - val1 >= 0.0 && isoValue - val2 < 0.0)) { fac = (isoValue - val1) / (val2 - val1); iTab[n] = nPoints; xsurf[nPoints] = xu + fac*dBox[1]; ysurf[nPoints] = yu + fac*dBox[2]; zsurf[nPoints] = zu; vux = vxnu + fac*(getGrad(i, j+1, k, scalarData, sizem1, 0, per) - vxnu); vuy = vynu + fac*(getGrad(i, j+1, k, scalarData, sizem1, 1, per) - vynu); vuz = vznu + fac*(getGrad(i, j+1, k, scalarData, sizem1, 2, per) - vznu); vux = vux*orthoBox[0]+vuy*orthoBox[1]+vuz*orthoBox[3]; vuy = vuy*orthoBox[2]+vuz*orthoBox[4]; vuz = vuz*orthoBox[5]; s = sqrt(vux*vux+vuy*vuy+vuz*vuz); if(s <= 0.0) { (void)fprintf(stderr, "\aWARNING: normal direction assumed\n"); xnsurf[nPoints] = 1.0; ynsurf[nPoints] = 0.0; znsurf[nPoints] = 0.0; } else { xnsurf[nPoints] = vux/s; ynsurf[nPoints] = vuy/s; znsurf[nPoints] = vuz/s; } nPoints++; } else { iTab[n] = -1; } } else { iTab[n] = -1; } n++; } } } DBG_fprintf(stderr, " | found %d points.\n", nPoints); if(nPoints == 0) { g_warning("no isosurface found."); g_free(xsurf); g_free(ysurf); g_free(zsurf); g_free(xnsurf); g_free(ynsurf); g_free(znsurf); g_free(iTab); return FALSE; } status = Create_surf(id, nelez3, neleyz3, nelexyz3, nPoints, sizem1, iTab, xsurf, ysurf, zsurf, xnsurf, ynsurf, znsurf, isoValue, scalarData, scalarBox, name, per, surf); DBG_fprintf(stderr, " | Surface successfully created.\n"); return status; } /** * create_fromSF_nonuniform: * @surf: a location on a #VisuSurfaces pointer ; * @field: the scalar field to create the surface from ; * @isoValue: the value of the isosurface ; * @id: an integer identifying the surface ; * @name: the name of the surface to use (can be NULL). * * Create on the fly a surface from the scalar field @field. If @name is given, the surface * is created with it, if not, "Isosurface @id + 1" is used. @surf can already * contains several surfaces, in that case, the new surface is added. If @surf is * NULL, then a new #VisuSurfaces object is created and returned. * * Returns: TRUE if the surface is created. */ static gboolean create_fromSF_nonuniform(VisuSurfaces **surf, VisuScalarField *field, double isoValue, int id, const gchar *name) { /* I label local cell vertices as in ref. above and assigns x y z names like this : y | 4---------------5 /. /| 7---------------6 | | . | | | . | | | 0.............|.1 --x |/ |/ 3---------------2 / z */ /* Local variables */ register guint i, j, k; int n; int nelez3, neleyz3, nelexyz3; int nPoints; guint sizem1[3]; /*nx-1, ny-1 ,nz-1 : number of mesh intervals in the x,y and z direction*/ guint scalarGrid[3]; /*nx, ny ,nz : number of mesh nodes in the x,y and z direction*/ int *iTab; double fac; double xu, yu, zu, xui, xuij, yuj, dmesh; double vux, vuy, vuz, s; double vxnu, vynu, vznu, v; double orthoBox[6]; /* inverse length of the box*/ double *xsurf, *ysurf, *zsurf, *xnsurf, *ynsurf, *znsurf; double *meshx, *meshy, *meshz; double ***scalarData, val1, val2; VisuBox *box; double scalarBox[6]; /*define the box edges and topology*/ gboolean per[3], status; /* Routine code*/ /* Ensure that the pointer is not zero */ g_return_val_if_fail(surf, FALSE); /* edges are labelled from each corner: x+ then z+ then y+ for k varying fastest then j varying fastest then i varying fastest */ /* Get data from the field. */ box = visu_boxed_getBox(VISU_BOXED(field)); for (i = 0; i < VISU_BOX_N_VECTORS; i++) scalarBox[i] = visu_box_getGeometry(box, i); visu_box_getPeriodicity(box, per); meshx = visu_scalar_field_getMeshx(field); meshy = visu_scalar_field_getMeshy(field); meshz = visu_scalar_field_getMeshz(field); scalarData = visu_scalar_field_getData(field); visu_scalar_field_getGridSize(field, scalarGrid); DBG_fprintf(stderr, "Pot2surf : compute isosurface at value %g from" " field %p.\n", isoValue, (gpointer)field); DBG_fprintf(stderr, " | periodic %d, %d, %d.\n", per[0], per[1], per[2]); DBG_fprintf(stderr, " | value %g.\n", isoValue); DBG_fprintf(stderr, " | size %d %d %d.\n", scalarGrid[0], scalarGrid[1], scalarGrid[2]); DBG_fprintf(stderr, " | box %g %g %g\n", scalarBox[0], scalarBox[1], scalarBox[2]); DBG_fprintf(stderr, " | %g %g %g.\n", scalarBox[3], scalarBox[4], scalarBox[5]); /* Compute some local values. */ if (per[0]) scalarGrid[0] += 1; if (per[1]) scalarGrid[1] += 1; if (per[2]) scalarGrid[2] += 1; for (i = 0; i < 3; i++) sizem1[i] = scalarGrid[i] - 1; v = scalarBox[0] * scalarBox[2] * scalarBox[5]; /* volume of the box = Lx*Ly*Lz */ orthoBox[0] = scalarBox[2] * scalarBox[5] / v; /* 1/Lx */ orthoBox[1] = -scalarBox[1] * scalarBox[5] / v; orthoBox[2] = scalarBox[0] * scalarBox[5] / v; /* 1/Ly */ orthoBox[3] = (scalarBox[1] * scalarBox[4] - scalarBox[2] * scalarBox[3]) / v; orthoBox[4] = -scalarBox[0] * scalarBox[4] / v; orthoBox[5] = scalarBox[0] * scalarBox[2] / v; /* 1/Lz */ nelez3 = 3 * scalarGrid[2]; neleyz3 = scalarGrid[1] * nelez3; nelexyz3 = scalarGrid[0] * neleyz3; /* 3*nx*ny*nz */ nPoints = 0; /* Allocate buffers. */ /* Point values. */ xsurf = g_malloc(nelexyz3 * sizeof(double)); ysurf = g_malloc(nelexyz3 * sizeof(double)); zsurf = g_malloc(nelexyz3 * sizeof(double)); /* Normal values. */ xnsurf = g_malloc(nelexyz3 * sizeof(double)); ynsurf = g_malloc(nelexyz3 * sizeof(double)); znsurf = g_malloc(nelexyz3 * sizeof(double)); /* Indexes. */ iTab = g_malloc(nelexyz3 * sizeof(int)); n = 0; for(i=0; i= 0.0) || (isoValue - val1 >= 0.0 && isoValue - val2 < 0.0)) { fac = (isoValue - val1) / (val2 - val1); iTab[n] = nPoints; dmesh = getDeltaMesh(i, meshx, sizem1[0], per[0]); xsurf[nPoints] = xu + fac * dmesh * scalarBox[0]; ysurf[nPoints] = yu; zsurf[nPoints] = zu; vux = vxnu + fac*(getGrad(i+1, j, k, scalarData, sizem1, 0, per) - vxnu); vuy = vynu + fac*(getGrad(i+1, j, k, scalarData, sizem1, 1, per) - vynu); vuz = vznu + fac*(getGrad(i+1, j, k, scalarData, sizem1, 2, per) - vznu); vux = vux*orthoBox[0]+vuy*orthoBox[1]+vuz*orthoBox[3]; vuy = vuy*orthoBox[2]+vuz*orthoBox[4]; vuz = vuz*orthoBox[5]; s = sqrt(vux*vux+vuy*vuy+vuz*vuz); if(s <= 0.0) { (void)fprintf(stderr, "\aWARNING: normal direction assumed\n"); xnsurf[nPoints] = 1.0; ynsurf[nPoints] = 0.0; znsurf[nPoints] = 0.0; } else { xnsurf[nPoints] = vux/s; ynsurf[nPoints] = vuy/s; znsurf[nPoints] = vuz/s; } nPoints++; } else { iTab[n] = -1; } } else { iTab[n] = -1; } n++; if(k= 0.0) || (isoValue - val1 >= 0.0 && isoValue - val2 < 0.0)) { fac = (isoValue - val1) / (val2 - val1); iTab[n] = nPoints; dmesh = getDeltaMesh(k, meshz, sizem1[2], per[2]); xsurf[nPoints] = xu + fac * dmesh * scalarBox[3]; ysurf[nPoints] = yu + fac * dmesh * scalarBox[4]; zsurf[nPoints] = zu + fac * dmesh * scalarBox[5]; vux = vxnu + fac*(getGrad(i, j, k+1, scalarData, sizem1, 0, per) - vxnu); vuy = vynu + fac*(getGrad(i, j, k+1, scalarData, sizem1, 1, per) - vynu); vuz = vznu + fac*(getGrad(i, j, k+1, scalarData, sizem1, 2, per) - vznu); vux = vux*orthoBox[0]+vuy*orthoBox[1]+vuz*orthoBox[3]; vuy = vuy*orthoBox[2]+vuz*orthoBox[4]; vuz = vuz*orthoBox[5]; s = sqrt(vux*vux+vuy*vuy+vuz*vuz); if(s <= 0.0) { (void)fprintf(stderr, "\aWARNING: normal direction assumed\n"); xnsurf[nPoints] = 1.0; ynsurf[nPoints] = 0.0; znsurf[nPoints] = 0.0; } else { xnsurf[nPoints] = vux/s; ynsurf[nPoints] = vuy/s; znsurf[nPoints] = vuz/s; } nPoints++; } else { iTab[n] = -1; } } else { iTab[n] = -1; } n++; if(j= 0.0) || (isoValue - val1 >= 0.0 && isoValue - val2 < 0.0)) { fac = (isoValue - val1) / (val2 - val1); iTab[n] = nPoints; dmesh = getDeltaMesh(j, meshy, sizem1[1], per[1]); xsurf[nPoints] = xu + fac * dmesh * scalarBox[1]; ysurf[nPoints] = yu + fac * dmesh * scalarBox[2]; zsurf[nPoints] = zu; vux = vxnu + fac*(getGrad(i, j+1, k, scalarData, sizem1, 0, per) - vxnu); vuy = vynu + fac*(getGrad(i, j+1, k, scalarData, sizem1, 1, per) - vynu); vuz = vznu + fac*(getGrad(i, j+1, k, scalarData, sizem1, 2, per) - vznu); vux = vux*orthoBox[0]+vuy*orthoBox[1]+vuz*orthoBox[3]; vuy = vuy*orthoBox[2]+vuz*orthoBox[4]; vuz = vuz*orthoBox[5]; s = sqrt(vux*vux+vuy*vuy+vuz*vuz); if(s <= 0.0) { (void)fprintf(stderr, "\aWARNING: normal direction assumed\n"); xnsurf[nPoints] = 1.0; ynsurf[nPoints] = 0.0; znsurf[nPoints] = 0.0; } else { xnsurf[nPoints] = vux/s; ynsurf[nPoints] = vuy/s; znsurf[nPoints] = vuz/s; } nPoints++; } else { iTab[n] = -1; } } else { iTab[n] = -1; } n++; } } } DBG_fprintf(stderr, " | found %d points.\n", nPoints); if(nPoints == 0) { g_warning("no isosurface found."); g_free(xsurf); g_free(ysurf); g_free(zsurf); g_free(xnsurf); g_free(ynsurf); g_free(znsurf); g_free(iTab); return FALSE; } status = Create_surf(id, nelez3, neleyz3, nelexyz3, nPoints, sizem1, iTab, xsurf, ysurf, zsurf, xnsurf, ynsurf, znsurf, isoValue, scalarData, scalarBox, name, per, surf); DBG_fprintf(stderr, " | Surface successfully created.\n"); return status; } /** * Create_surf: * @id: an integer identifying the surface ; * @nelez3: an integer giving the number of element times 3 along z; * @neleyz3: an integer giving the number of element times 3 in plane y by z; * @nelexyz3: an integer giving the number of element times 3 in volume x by y by z; * @nPoints: an integer giving the number points of the surface; * @sizem1: the number of intervals in each direction; * @iTab: table containing the number of surface points if surface exists at this place otherwise -1; * @xsurf: x coordinate of the surface points; * @ysurf: y coordinate of the surface points; * @zsurf: z coordinate of the surface points; * @xnsurf: normal value of the surface points; * @ynsurf: normal of the surface points; * @znsurf: normal of the surface points; * @isoValue: the value of the isosurface; * @scalarData: the potential values; * @scalarBox: the box parameters; * @name: the name of the surface to use (can be NULL). * @per: boolean for periodicity; * @surf: a location on a #VisuSurfaces pointer ; * * Create on the fly a surface from the scalar field @field. If @name is given, the surface * is created with it, if not, "Isosurface @id + 1" is used. @surf can already * contains several surfaces, in that case, the new surface is added. If @surf is * NULL, then a new #VisuSurfaces object is created and returned. * * Returns: TRUE if the surface is created. */ static gboolean Create_surf(int id, int nelez3, int neleyz3, int nelexyz3, int nPoints, guint sizem1[3], int *iTab, double *xsurf , double *ysurf , double *zsurf , double *xnsurf, double *ynsurf, double *znsurf, double isoValue, double ***scalarData, double scalarBox[6], const gchar *name, gboolean per[3], VisuSurfaces **surf) { /* Local variables */ register guint i, j, k; int cubeindex; int e, n; int m1, m2, m3; int nPolys, nPolys_old, nPoints_old; int vertlist[12]; int *vTab; double vx, vy, vz, wx, wy, wz; double ux, uy, uz, s; float* densityData, *fval; gchar *nameSurf; gboolean new; VisuBox *box; /* Routine code */ /* Ensure that the pointer is not zero */ g_return_val_if_fail(surf, FALSE); /* Allocate buffers. The 16 coefficient is for the maximum number of polygons per grid points. */ vTab = g_malloc(16 * nelexyz3 * sizeof(int)); nPolys = 0; /* Main loop */ for(i=0; ibasePoints.num_polys; nPoints_old = (*surf)->basePoints.num_points; visu_surfaces_add(*surf, 1, nPolys, nPoints); box = visu_boxed_getBox(VISU_BOXED(*surf)); g_object_ref(box); for (i = 0; i < 6; i++) if (ABS(visu_box_getGeometry(box, i) - scalarBox[i]) > 1e-6) g_warning("box inconstitency between field and surface at %d (%g /= %g).", i, visu_box_getGeometry(box, i), scalarBox[i]); densityData = visu_surfaces_getPropertyFloat(*surf, VISU_SURFACES_PROPERTY_POTENTIAL); } g_object_unref(box); DBG_fprintf(stderr, " | copy vertices.\n"); for(n = 0; n < nPoints; n++) { fval = (*surf)->basePoints.poly_points_data[nPoints_old + n]; fval[0] = xsurf[n]; fval[1] = ysurf[n]; fval[2] = zsurf[n]; fval[VISU_SURFACES_POINTS_OFFSET_NORMAL + 0] = -xnsurf[n]; fval[VISU_SURFACES_POINTS_OFFSET_NORMAL + 1] = -ynsurf[n]; fval[VISU_SURFACES_POINTS_OFFSET_NORMAL + 2] = -znsurf[n]; } for (n = 0; n < nPolys; n++) { (*surf)->basePoints.poly_surf_index[nPolys_old + n] = (*surf)->nsurf; (*surf)->basePoints.poly_num_vertices[nPolys_old + n] = 3; (*surf)->basePoints.poly_vertices[nPolys_old + n] = g_malloc(sizeof(int) * 3); for (i = 0; i < 3; i++) (*surf)->basePoints.poly_vertices[nPolys_old + n][2 - i] = vTab[3 * n + i] + nPoints_old; } (*surf)->basePoints.num_polys_surf[(*surf)->nsurf - 1] = nPolys; /* Additional stuff for the given surface. */ DBG_fprintf(stderr, " | finishing surfaces.\n"); if (name) nameSurf = g_strdup(name); else /* nameSurf = g_strdup_printf(_("Surface %d"), id + 1); */ nameSurf = (gchar*)0; (*surf)->resources[(*surf)->nsurf - 1] = visu_surfaces_resources_getFromName(nameSurf, &new); if (new) (*surf)->resources[(*surf)->nsurf - 1]->rendered = TRUE; densityData[(*surf)->nsurf - 1] = isoValue; (*surf)->ids[(*surf)->nsurf - 1] = id; #if DEBUG == 1 visu_surfaces_checkConsistency(*surf); #endif g_signal_emit_by_name(G_OBJECT(*surf), "added", NULL); g_free(xsurf); g_free(ysurf); g_free(zsurf); g_free(xnsurf); g_free(ynsurf); g_free(znsurf); g_free(iTab); g_free(vTab); return TRUE; } /*****************************/ /* XML files for iso-values. */ /*****************************/ /* */ /* Known elements. */ #define SURF_PARSER_ELEMENT_SURFACES "surfaces" #define SURF_PARSER_ELEMENT_SURFACE "surface" #define SURF_PARSER_ELEMENT_HIDE "hidden-by-planes" #define SURF_PARSER_ELEMENT_COLOR "color" /* Known attributes. */ #define SURF_PARSER_ATTRIBUTES_RENDERED "rendered" #define SURF_PARSER_ATTRIBUTES_VALUE "iso-value" #define SURF_PARSER_ATTRIBUTES_NAME "name" #define SURF_PARSER_ATTRIBUTES_STATUS "status" #define SURF_PARSER_ATTRIBUTES_RGBA "rgba" #define SURF_PARSER_ATTRIBUTES_MATERIAL "material" struct _surfaces_xml { gchar *name; float iso; gboolean rendered, masked; gboolean colorSet, materialSet; float color[4], material[5]; }; static gboolean startVisuSurfaces; /* This method is called for every element that is parsed. The user_data must be a GList of _surfaces_xml. When a 'surface' element, a new struct instance is created and prepend in the list. When 'hidden-by-planes' or other qualificative elements are found, the first surface of the list is modified accordingly. */ static void surfacesXML_element(GMarkupParseContext *context _U_, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer user_data, GError **error) { GList **surfacesList; struct _surfaces_xml *surf; int i; g_return_if_fail(user_data); surfacesList = (GList **)user_data; DBG_fprintf(stderr, "Surf parser: found '%s' element.\n", element_name); if (!strcmp(element_name, SURF_PARSER_ELEMENT_SURFACES)) { /* Should have no attributes. */ if (attribute_names[0]) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, _("Unexpected attribute '%s' for element '%s'."), attribute_names[0], SURF_PARSER_ELEMENT_SURFACES); return; } /* Initialise the surfacesList. */ if (*surfacesList) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("DTD error: element '%s' should appear only once."), SURF_PARSER_ELEMENT_SURFACES); return; } *surfacesList = (GList*)0; startVisuSurfaces = TRUE; } else if (!strcmp(element_name, SURF_PARSER_ELEMENT_SURFACE)) { surf = g_malloc(sizeof(struct _surfaces_xml)); surf->name = (gchar*)0; surf->rendered = TRUE; surf->masked = TRUE; surf->iso = 12345.6789f; surf->colorSet = FALSE; surf->materialSet = FALSE; /* We parse the attributes. */ for (i = 0; attribute_names[i]; i++) { if (!strcmp(attribute_names[i], SURF_PARSER_ATTRIBUTES_NAME)) surf->name = g_strdup(attribute_values[i]); else if (!strcmp(attribute_names[i], SURF_PARSER_ATTRIBUTES_RENDERED)) { if (!strcmp(attribute_values[i], "yes")) surf->rendered = TRUE; else if (!strcmp(attribute_values[i], "no")) surf->rendered = FALSE; else g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Invalid value '%s' for attribute '%s'."), attribute_values[i], SURF_PARSER_ATTRIBUTES_RENDERED); } else if (!strcmp(attribute_names[i], SURF_PARSER_ATTRIBUTES_VALUE)) { if (!sscanf(attribute_values[i], "%f", &surf->iso) == 1) g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Invalid value '%s' for attribute '%s'."), attribute_values[i], SURF_PARSER_ATTRIBUTES_VALUE); } else g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, _("Unexpected attribute '%s' for element '%s'."), attribute_names[i], SURF_PARSER_ELEMENT_SURFACE); if (*error) { g_free(surf->name); g_free(surf); return; } } /* We check the mandatory attribute. */ if (surf->iso == 12345.6789f) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("Missing attribute '%s' for element '%s'."), SURF_PARSER_ATTRIBUTES_VALUE, SURF_PARSER_ELEMENT_SURFACE); g_free(surf->name); g_free(surf); return; } DBG_fprintf(stderr, "Surf parser: add a new surface '%s' %f %d.\n", (surf->name)?surf->name:"None", surf->iso, surf->rendered); *surfacesList = g_list_prepend(*surfacesList, (gpointer)surf); } else if (startVisuSurfaces && !strcmp(element_name, SURF_PARSER_ELEMENT_HIDE)) { if (!*surfacesList) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("DTD error: parent element '%s' of element '%s' is missing."), SURF_PARSER_ELEMENT_SURFACE, SURF_PARSER_ELEMENT_HIDE); return; } surf = (struct _surfaces_xml*)((*surfacesList)->data); /* We read the mandatory attribute. */ if (attribute_names[0]) { if (!strcmp(attribute_names[0], SURF_PARSER_ATTRIBUTES_STATUS)) { if (!strcmp(attribute_values[0], "yes")) surf->masked = TRUE; else if (!strcmp(attribute_values[0], "no")) surf->masked = FALSE; else g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Invalid value '%s' for attribute '%s'."), attribute_values[0], SURF_PARSER_ATTRIBUTES_STATUS); } else g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, _("Unexpected attribute '%s' for element '%s'."), attribute_names[0], SURF_PARSER_ELEMENT_HIDE); } else g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("Missing attribute '%s' for element '%s'."), SURF_PARSER_ATTRIBUTES_VALUE, SURF_PARSER_ELEMENT_SURFACE); if (*error) return; } else if (startVisuSurfaces && !strcmp(element_name, SURF_PARSER_ELEMENT_COLOR)) { if (!*surfacesList) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("DTD error: parent element '%s' of element '%s' is missing."), SURF_PARSER_ELEMENT_SURFACE, SURF_PARSER_ELEMENT_COLOR); return; } surf = (struct _surfaces_xml*)((*surfacesList)->data); for(i = 0; attribute_names[i]; i++) { if (!strcmp(attribute_names[i], SURF_PARSER_ATTRIBUTES_RGBA)) { if (sscanf(attribute_values[i], "%g %g %g %g", surf->color, surf->color + 1, surf->color + 2, surf->color + 3) != 4) g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Invalid value '%s' for attribute '%s'."), attribute_values[i], SURF_PARSER_ATTRIBUTES_RGBA); else surf->colorSet = TRUE; } else if (!strcmp(attribute_names[i], SURF_PARSER_ATTRIBUTES_MATERIAL)) { if (sscanf(attribute_values[i], "%g %g %g %g %g", surf->material, surf->material + 1, surf->material + 2, surf->material + 3, surf->material + 4) != 5) g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Invalid value '%s' for attribute '%s'."), attribute_values[i], SURF_PARSER_ATTRIBUTES_MATERIAL); else surf->materialSet = TRUE; } else g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, _("Unexpected attribute '%s' for element '%s'."), attribute_names[i], SURF_PARSER_ELEMENT_COLOR); if (*error) return; } } else if (startVisuSurfaces) { /* We silently ignore the element if surfacesList is unset, but raise an error if surfacesList has been set. */ g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, _("Unexpected element '%s'."), element_name); } } /* Check when a element is closed that everything required has been set. */ void surfacesXML_end(GMarkupParseContext *context _U_, const gchar *element_name, gpointer user_data _U_, GError **error _U_) { if (!strcmp(element_name, SURF_PARSER_ELEMENT_SURFACES)) startVisuSurfaces = FALSE; } /* What to do when an error is raised. */ static void surfacesXML_error(GMarkupParseContext *context _U_, GError *error, gpointer user_data) { GList *tmpLst; DBG_fprintf(stderr, "Surf parser: error raised '%s'.\n", error->message); g_return_if_fail(user_data); /* We free the current list of surfaces. */ tmpLst = *(GList**)user_data; while (tmpLst) { g_free(((struct _surfaces_xml*)tmpLst->data)->name); g_free(tmpLst->data); tmpLst = g_list_next(tmpLst); } g_list_free(*(GList**)user_data); } /** * visu_surfaces_parseXMLFile: * @filename: a path to a file. * @surfaces: a location on a #VisuSurfaces pointer. * @field: the scalar field to create the surface from. * @error: a location to store a possible error. * * Parse the given XML file, looking for the <surfaces> tag and create * the given surfaces. * * Returns: FALSE if a error occured. */ gboolean visu_surfaces_parseXMLFile(const gchar* filename, VisuSurfaces **surfaces, VisuScalarField *field, GError **error) { GMarkupParseContext* xmlContext; GMarkupParser parser; gboolean status; gsize size; gchar *buffer; GList *list, *tmpLst; int position, nb; struct _surfaces_xml *surf; VisuSurfacesResources *res; ToolColor *color; g_return_val_if_fail(filename && surfaces && field, FALSE); buffer = (gchar*)0; if (!g_file_get_contents(filename, &buffer, &size, error)) return FALSE; /* Create context. */ list = (GList*)0; parser.start_element = surfacesXML_element; parser.end_element = surfacesXML_end; parser.text = NULL; parser.passthrough = NULL; parser.error = surfacesXML_error; xmlContext = g_markup_parse_context_new(&parser, 0, &list, NULL); /* Parse data. */ startVisuSurfaces = FALSE; status = g_markup_parse_context_parse(xmlContext, buffer, size, error); /* Free buffers. */ g_markup_parse_context_free(xmlContext); g_free(buffer); if (!status) return FALSE; if (!list) { *error = g_error_new(G_MARKUP_ERROR, G_MARKUP_ERROR_EMPTY, _("No iso-value found.")); return FALSE; } /* Need to reverse the list since elements have been prepended. */ list = g_list_reverse(list); /* Convert the list to new isosurfaces. */ DBG_fprintf(stderr, "Surf parser: create %d new surfaces for %p.\n", g_list_length(list), (gpointer)(*surfaces)); tmpLst = list; while(tmpLst) { surf = (struct _surfaces_xml*)tmpLst->data; nb = visu_surfaces_getNewId(*surfaces); if (visu_surfaces_createFromScalarField(surfaces, field, surf->iso, nb, surf->name)) { res = visu_surfaces_getResourceById(*surfaces, nb); res->rendered = surf->rendered; res->sensitiveToPlanes = surf->masked; if (surf->colorSet) { color = tool_color_addFloatRGBA(surf->color, &position); res->color->rgba[0] = color->rgba[0]; res->color->rgba[1] = color->rgba[1]; res->color->rgba[2] = color->rgba[2]; res->color->rgba[3] = color->rgba[3]; } if (surf->materialSet) { res->material[0] = surf->material[0]; res->material[1] = surf->material[1]; res->material[2] = surf->material[2]; res->material[3] = surf->material[3]; res->material[4] = surf->material[4]; } } g_free(surf->name); g_free(surf); tmpLst = g_list_next(tmpLst); } g_list_free(list); return TRUE; } /** * visu_surfaces_exportXMLFile: * @filename: a path to a file. * @values: an array of @n values. * @res: an array of @n #VisuSurfacesResources. * @n: number of surface resources to export. * @error: a location to store a possible error. * * Export the surface resources into an XML file. * * Returns: FALSE if a error occured. */ gboolean visu_surfaces_exportXMLFile(const gchar* filename, float *values, VisuSurfacesResources **res, int n, GError **error) { gboolean valid; GString *output; int i; /* We actually output the values. */ output = g_string_new(" \n"); for (i = 0; i < n; i++) { g_string_append_printf(output, " rendered)?"yes":"no", values[i]); if (res[i]->surfnom) g_string_append_printf(output, " name=\"%s\"", res[i]->surfnom); g_string_append(output, ">\n"); g_string_append_printf(output, " \n", (res[i]->sensitiveToPlanes)?"yes":"no"); g_string_append_printf(output, " \n", res[i]->color->rgba[0], res[i]->color->rgba[1], res[i]->color->rgba[2], res[i]->color->rgba[3], res[i]->material[0], res[i]->material[1], res[i]->material[2], res[i]->material[3], res[i]->material[4]); g_string_append(output, " \n"); } g_string_append(output, " "); valid = tool_XML_substitute(output, filename, "surfaces", error); if (!valid) { g_string_free(output, TRUE); return FALSE; } valid = g_file_set_contents(filename, output->str, -1, error); g_string_free(output, TRUE); return valid; } v_sim-3.7.0/src/extraFunctions/pot2surf.h0000644000353400050620000000533312215546074015333 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD, Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2005) Adresses m�l : BILLARD, non joignable par m�l ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. Ce logiciel est un programme informatique servant � visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est r�gi par la licence CeCILL soumise au droit fran�ais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffus�e par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez acc�der � cet en-t�te signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept� les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD and Damien CALISTE and Olivier D'Astier, laboratoire L_Sim, (2001-2005) E-mail addresses : BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef POT2SURF_H #define POT2SURF_H #include "surfaces.h" #include "scalarFields.h" #ifndef V_SIM_DISABLE_DEPRECATED int visu_surfaces_createFromPotentialFile(const gchar *surf_file_to_write, const gchar *pot_file_to_read, int nsurfs_to_build, const float *surf_value, const gchar **surf_name); #endif gboolean visu_surfaces_createFromScalarField(VisuSurfaces **surf, VisuScalarField *field, double isoValue, int id, const gchar *name); gboolean visu_surfaces_parseXMLFile(const gchar* filename, VisuSurfaces **surfaces, VisuScalarField *field, GError **error); gboolean visu_surfaces_exportXMLFile(const gchar* filename, float *values, VisuSurfacesResources **res, int n, GError **error); #endif v_sim-3.7.0/src/extraFunctions/surfaces_resources.c0000644000353400050620000003742512215546074017456 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD, Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD and Damien CALISTE and Olivier D'Astier, laboratoire L_Sim, (2001-2005) E-mail addresses : BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "surfaces_resources.h" #include #include #include #include /** * SECTION:surfaces_resources * @short_description: Define the rendering parameters of a surface. * * This structure stores all the rendering elements of a set of #VisuSurfaces. */ /** * VisuSurfacesResources: * @surfnom: the name of the surface (in UTF-8) ; * @color: a #ToolColor for the surface ; * @material: the lighting effects of the surface ; * @rendered: boolean for the visibility of the surface ; * @sensitiveToPlanes: boolean for the sensitivity of a surface * to the masking effect of planes. * * This structure defines some drawing properties of a set of #VisuSurfaces. */ #define DESC_RESOURCE_COLOR "Define the colour of one surface ;" \ " 4 floats (RGBA) 5 floats (material)" #define FLAG_RESOURCE_COLOR "isosurface_color" #define DESC_RESOURCE_PROPERTIES "Define some surface properties ;" \ " rendered (0 or 1) sensitive to planes (0 or 1)" #define FLAG_RESOURCE_PROPERTIES "isosurface_properties" /* Local variables. */ static GHashTable *isosurfaces_resources = NULL; /* Local methods. */ static void hash_free_resource(gpointer res); static VisuSurfacesResources* resources_copy(VisuSurfacesResources *res); static gboolean isosurfaces_read_resources(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static gboolean isosurfaces_read_colour(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static gboolean isosurfaces_read_properties(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static void isosurfaces_export_resources(GString *data, VisuData *dataObj, VisuGlView *view); /** * visu_surfaces_resources_get_type: * * Create and retrieve a #GType for a #VisuSurfacesResources object. * * Since: 3.7 * * Returns: a new type for #VisuSurfacesResources structures. */ GType visu_surfaces_resources_get_type(void) { static GType g_define_type_id = 0; if (g_define_type_id == 0) g_define_type_id = g_boxed_type_register_static("VisuSurfacesResources", (GBoxedCopyFunc)resources_copy, (GBoxedFreeFunc)visu_surfaces_resources_free); return g_define_type_id; } /** * visu_surfaces_resources_init: (skip) * * Internal routine called automatically on #VisuSurfacesClass creation. Do not use * it. */ void visu_surfaces_resources_init(void) { VisuConfigFileEntry *entry, *oldEntry; /* This entry is now obsolete but is kept for backward compatibility. */ oldEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, "isosurface_property", "Properties of a given isosurface", 1, isosurfaces_read_resources); visu_config_file_entry_setVersion(oldEntry, 3.3f); entry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_COLOR, "The color and material of a given surface", 1, isosurfaces_read_colour); visu_config_file_entry_setVersion(entry, 3.4f); visu_config_file_entry_setReplace(entry, oldEntry); entry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_PROPERTIES, "Properties of a given isosurface", 1, isosurfaces_read_properties); visu_config_file_entry_setVersion(entry, 3.4f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_RESOURCE, isosurfaces_export_resources); isosurfaces_resources = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, hash_free_resource); } /** * visu_surfaces_resources_free: * @res: an allocated #VisuSurfacesResources object to be freed. * * This method frees the memory used by the given resource. */ void visu_surfaces_resources_free(VisuSurfacesResources *res) { g_return_if_fail(res); DBG_fprintf(stderr, "Isosurfaces Resources: free resource %p (%s).\n", (gpointer)res, res->surfnom); if (res->surfnom) g_free(res->surfnom); g_free(res->color); g_free(res); } static VisuSurfacesResources* visu_surfaces_init_resource() { VisuSurfacesResources *res; float rgba[4]; int position; ToolColor *color; res = g_malloc(sizeof(VisuSurfacesResources)); rgba[0] = 1.0f; rgba[1] = 0.5f; rgba[2] = 0.5f; rgba[3] = 0.75f; color = tool_color_addFloatRGBA(rgba, &position); res->color = g_malloc(sizeof(ToolColor)); for (position = 0; position < 4; position++) res->color->rgba[position] = color->rgba[position]; res->material[0] = 0.2f; res->material[1] = 1.0f; res->material[2] = 0.5f; res->material[3] = 0.5f; res->material[4] = 0.0f; res->rendered = TRUE; res->surfnom = (gchar*)0; res->sensitiveToPlanes = TRUE; return res; } /** * visu_surfaces_resources_copy: * @res: an allocated #VisuSurfacesResources object to receive values ; * @res_old: a #VisuSurfacesResources to read the values from. * * This method copies all values from @res_old to @res. */ void visu_surfaces_resources_copy(VisuSurfacesResources *res, VisuSurfacesResources *res_old) { int i; g_return_if_fail(res && res_old); DBG_fprintf(stderr, "Isosurfaces Resources: copy resource from %p to %p.\n", (gpointer)res_old, (gpointer)res); tool_color_copy(res->color, res_old->color); for (i = 0; i < 5; i++) res->material[i] = res_old->material[i]; res->rendered = res_old->rendered; res->sensitiveToPlanes = res_old->sensitiveToPlanes; } static VisuSurfacesResources* resources_copy(VisuSurfacesResources *res) { VisuSurfacesResources *out; out = g_malloc(sizeof(VisuSurfacesResources)); visu_surfaces_resources_copy(out, res); return out; } /** * visu_surfaces_resources_getFromName: * @surf_name: the name of the surface (can be NULL) ; * @new_surf: a location to store a boolean value (can be NULL). * * This returns the resource information matching the given @surf_name. If * the resource doesn't exist, it is created and @new is set to TRUE. If the given * name (@surf_name) is NULL, then a new resource is created, but it is not stored * and will not be shared by surfaces. * * Returns: (transfer none): the resource (created or retrieved). */ VisuSurfacesResources* visu_surfaces_resources_getFromName(const gchar *surf_name, gboolean *nw) { VisuSurfacesResources *res; g_return_val_if_fail(isosurfaces_resources, (VisuSurfacesResources*)0); if (surf_name && surf_name[0]) res = g_hash_table_lookup(isosurfaces_resources, surf_name); else res = (VisuSurfacesResources*)0; if(!res) { res = visu_surfaces_init_resource(); if (surf_name && surf_name[0]) { res->surfnom = g_strdup(surf_name); DBG_fprintf(stderr, "Isosurfaces Resources: registering new resources" " for surface '%s'.\n", surf_name); g_hash_table_insert(isosurfaces_resources, res->surfnom, res); } if (nw) *nw = TRUE; } else { if (nw) *nw = FALSE; } return res; } /** * visu_surfaces_resources_getRendered: * @res: the resource storing rendering information of a surface. * * Retrieves the rendering status of a surface. * * Since: 3.7 * * Returns: TRUE, if the resource indicate a renedered surface. **/ gboolean visu_surfaces_resources_getRendered(const VisuSurfacesResources *res) { g_return_val_if_fail(res, FALSE); return res->rendered; } /******************/ /* Local methods. */ /******************/ static void hash_free_resource(gpointer res) { visu_surfaces_resources_free((VisuSurfacesResources*)res); } static gboolean isosurfaces_read_resources(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { VisuSurfacesResources *res; gboolean rendered; float rgba[4]; float material[5]; int k; gchar **tokens; g_return_val_if_fail(nbLines == 1, FALSE); tokens = g_strsplit(g_strchomp(lines[0]), "\"", 3); if (!tokens[0] || !tokens[1]) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Can't parse resource '%s' of" " iso-surfaces on line %d.\n"), "isosurface_property", position); g_strfreev(tokens); return FALSE; } if(sscanf(tokens[2], "%d %f %f %f %f %f %f %f %f %f\n", &rendered, &rgba[0], &rgba[1], &rgba[2], &rgba[3], &material[0], &material[1], &material[2], &material[3], &material[4]) != 10) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Can't parse resource '%s' of" " iso-surfaces on line %d.\n"), "isosurface_property", position); g_strfreev(tokens); return FALSE; } /* Read resources are always made public and added in the hashtable. */ res = visu_surfaces_resources_getFromName(tokens[1], (gboolean*)0); res->color = tool_color_addFloatRGBA(rgba, &k); res->rendered = rendered; for (k = 0; k < 5; k++) res->material[k] = material[k]; DBG_fprintf(stderr, "Isosurfaces Resources: resources found for surface '%s'\n", tokens[1]); g_strfreev(tokens); return TRUE; } static gboolean isosurfaces_read_colour(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { VisuSurfacesResources *res; float rgba[4]; float material[5]; int k; gchar **tokens; g_return_val_if_fail(nbLines == 1, FALSE); tokens = g_strsplit(g_strchomp(lines[0]), "\"", 3); if (!tokens[0] || !tokens[1]) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Can't parse resource '%s' of" " iso-surfaces on line %d.\n"), FLAG_RESOURCE_COLOR, position); g_strfreev(tokens); return FALSE; } if(sscanf(tokens[2], "%f %f %f %f %f %f %f %f %f", &rgba[0], &rgba[1], &rgba[2], &rgba[3], &material[0], &material[1], &material[2], &material[3], &material[4]) != 9) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Can't parse resource '%s' of" " iso-surfaces on line %d.\n"), FLAG_RESOURCE_COLOR, position); g_strfreev(tokens); return FALSE; } /* Read resources are always made public and added in the hashtable. */ res = visu_surfaces_resources_getFromName(tokens[1], (gboolean*)0); res->color = tool_color_addFloatRGBA(rgba, &k); for (k = 0; k < 5; k++) res->material[k] = material[k]; DBG_fprintf(stderr, "Isosurfaces Resources: resources '%s' found for surface '%s'\n", FLAG_RESOURCE_COLOR, tokens[1]); g_strfreev(tokens); return TRUE; } static gboolean isosurfaces_read_properties(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { VisuSurfacesResources *res; int rendered, sensitive; gchar **tokens; g_return_val_if_fail(nbLines == 1, FALSE); tokens = g_strsplit(g_strchomp(lines[0]), "\"", 3); if (!tokens[0] || !tokens[1]) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Can't parse resource '%s' of" " iso-surfaces on line %d.\n"), FLAG_RESOURCE_PROPERTIES, position); g_strfreev(tokens); return FALSE; } if(sscanf(tokens[2], "%d %d", &rendered, &sensitive) != 2) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Can't parse resource '%s' of" " iso-surfaces on line %d.\n"), FLAG_RESOURCE_PROPERTIES, position); g_strfreev(tokens); return FALSE; } /* Read resources are always made public and added in the hashtable. */ res = visu_surfaces_resources_getFromName(tokens[1], (gboolean*)0); res->rendered = rendered; res->sensitiveToPlanes = sensitive; DBG_fprintf(stderr, "Isosurfaces Resources: resources '%s' found for surface '%s'\n", FLAG_RESOURCE_PROPERTIES, tokens[1]); g_strfreev(tokens); return TRUE; } static void isosurfaces_export_one_surf_resources(gpointer key, gpointer value, gpointer user_data) { struct _VisuConfigFileForeachFuncExport *str; VisuSurfacesResources *res; res = (VisuSurfacesResources*)value; str = (struct _VisuConfigFileForeachFuncExport*)user_data; DBG_fprintf(stderr, "Isosurfaces Resources: exporting surface '%s' properties...", (char *)key); visu_config_file_exportEntry(str->data, FLAG_RESOURCE_COLOR, (gchar *)key, "%4.3f %4.3f %4.3f %4.3f %4.2f %4.2f %4.2f %4.2f %4.2f", res->color->rgba[0], res->color->rgba[1], res->color->rgba[2], res->color->rgba[3], res->material[0], res->material[1], res->material[2], res->material[3], res->material[4]); visu_config_file_exportEntry(str->data, FLAG_RESOURCE_PROPERTIES, (gchar *)key, "%d %d", res->rendered, res->sensitiveToPlanes); DBG_fprintf(stderr, "OK.\n"); } static void isosurfaces_export_resources(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { struct _VisuConfigFileForeachFuncExport str; if(isosurfaces_resources != NULL && g_hash_table_size(isosurfaces_resources) > 0) { visu_config_file_exportComment(data, DESC_RESOURCE_COLOR); visu_config_file_exportComment(data, DESC_RESOURCE_PROPERTIES); str.data = data; g_hash_table_foreach(isosurfaces_resources, isosurfaces_export_one_surf_resources, &str); visu_config_file_exportComment(data, ""); } DBG_fprintf(stderr, "Isosurfaces Resources: exporting OK.\n"); } v_sim-3.7.0/src/extraFunctions/surfaces_resources.h0000644000353400050620000000556712215546074017465 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD, Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD and Damien CALISTE and Olivier D'Astier, laboratoire L_Sim, (2001-2005) E-mail addresses : BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef SURFACES_RESOURCES_H #define SURFACES_RESOURCES_H #include #include #include G_BEGIN_DECLS typedef struct _VisuSurfacesResources VisuSurfacesResources; struct _VisuSurfacesResources { /* Name used to label the surface. */ gchar *surfnom; /* VisuGlLightMaterial used to draw a specific surface. */ ToolColor *color; float material[5]; /* Rendered or not */ gboolean rendered; /* Sensitive to masking properties of planes. */ gboolean sensitiveToPlanes; }; GType visu_surfaces_resources_get_type(void); #define VISU_TYPE_SURFACES_RESOURCES (visu_surfaces_resources_get_type()) VisuSurfacesResources* visu_surfaces_resources_getFromName(const gchar *surf_name, gboolean *new_surf); gboolean visu_surfaces_resources_getRendered(const VisuSurfacesResources *res); void visu_surfaces_resources_copy(VisuSurfacesResources *res, VisuSurfacesResources *res_old); void visu_surfaces_resources_free(VisuSurfacesResources *res); void visu_surfaces_resources_init(void); G_END_DECLS #endif v_sim-3.7.0/src/extraFunctions/surfaces_points.c0000644000353400050620000004013212215546074016745 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail addresses : CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "surfaces_points.h" #include #include #include /** * SECTION:surfaces_points * @short_description: Define a structure to store a set of triangles * defining a surface. * * This structure is used to store and draw polyedges as a set * of XYZ points and a set of link to them. */ /** * VisuSurfacesPoints: * @nsurf: number of surfaces encoded in this structure ; * @bufferSize: number of stored float in addition to coordinates and * normals ; * @num_polys: number of polygoins stored in this structure ; * @num_points: number of vertices stored in this structure ; * @num_polys_surf: number of visible polygons stored in this structure per surface ; * @poly_surf_index: gives the id of the surface for each polygon, * this value ranges from - nsurf to + nsurf. abs(id - 1) gives * the index of the surface the polygon is attached to. If values * are negative, then the polygon is currently not used ; * @poly_num_vertices: gives the number of vertices used by each polygons ; * @poly_vertices: returns the id j of the vertices of polygon i ; * @poly_points_data: vectors giving additional data of vertex i. * * This structure stores geometric description of surfaces. * Several surfaces are stored in a single structure for improved performances. */ /** * visu_surfaces_points_check: * @points: a set of points. * * A debug routines to check that all pointers and size are * relevant. It should not be used outside a debug area because it can * be slow. */ void visu_surfaces_points_check(VisuSurfacesPoints *points) { guint i, j; guint *nbPolys; /* Check the surface index. */ DBG_fprintf(stderr, " | check surface index for each polygons.\n"); for (i = 0; i < points->num_polys; i++) g_return_if_fail(ABS(points->poly_surf_index[i]) > 0 && ABS(points->poly_surf_index[i]) <= points->nsurf); /* Check vertice index. */ DBG_fprintf(stderr, " | check vertice index for each polygons.\n"); for (i = 0; i < points->num_polys; i++) for (j = 0; j < points->poly_num_vertices[i]; j++) g_return_if_fail(points->poly_vertices[i][j] < points->num_points); /* Check the number of polygons. */ nbPolys = g_malloc(sizeof(int) * points->nsurf); memset(nbPolys, 0, sizeof(int) * points->nsurf); for (i = 0; i < points->num_polys; i++) if (points->poly_surf_index[i] > 0) nbPolys[points->poly_surf_index[i] - 1] += 1; for (i = 0; i < points->nsurf; i++) { DBG_fprintf(stderr, " | %d counted %7d : stored %7d\n", i, nbPolys[i], points->num_polys_surf[i]); g_return_if_fail(nbPolys[i] == points->num_polys_surf[i]); } g_free(nbPolys); } /** * visu_surfaces_points_translate: * @points: a set of points. * @xyz: a given translation in cartesian coordinates. * * In devel... */ void visu_surfaces_points_translate(VisuSurfacesPoints *points, float xyz[3]) { gboolean *verticeStatus, visibility, boundary; guint i, j; int *boundaryPolys, nBounadryPolys; g_return_if_fail(points); DBG_fprintf(stderr, "IsosurfacesPoints: translate points %p of %gx%gx%g.\n", (gpointer)points, xyz[0], xyz[1], xyz[2]); /* As for surface hide: translate and reput in the box except if the triangle has some points that have been reput in the box. */ verticeStatus = g_malloc(sizeof(gboolean) * points->num_points); /* Apply the translation and compute a translation flag for each vertice. */ for (i = 0; i < points->num_points; i++) { /* Translations are given in cartesian coordinates. */ /* points->poly_points_data[j] += xyz[j]; */ /* verticeStatus[i] = visu_plane_class_getVisibility(planes, surf->basePoints.poly_points_data[i]); */ } /* We store the id of boundary polygons. */ boundaryPolys = g_malloc(sizeof(int) * points->num_polys); nBounadryPolys = 0; /* Hide polygons. */ for (i = 0; i < points->num_polys; i++) { visibility = TRUE; boundary = FALSE; /* if (surf->resources[ABS(points->poly_surf_index[i]) - 1]->sensitiveToPlanes) */ { for (j = 0; j < points->poly_num_vertices[i]; j++) { visibility = visibility && verticeStatus[points->poly_vertices[i][j]]; boundary = boundary || verticeStatus[points->poly_vertices[i][j]]; } boundary = !visibility && boundary; } if (!visibility && points->poly_surf_index[i] > 0) { /* Hide this polygon. */ points->num_polys_surf[points->poly_surf_index[i] - 1] -= 1; points->poly_surf_index[i] = -points->poly_surf_index[i]; } else if (visibility && points->poly_surf_index[i] < 0) { /* Show this polygon. */ points->poly_surf_index[i] = -points->poly_surf_index[i]; points->num_polys_surf[points->poly_surf_index[i] - 1] += 1; } if (boundary) boundaryPolys[nBounadryPolys++] = i; } /* if (DEBUG) */ /* for (i = 0; i < surf->nsurf; i++) */ /* fprintf(stderr, , " | surface %2d -> %7d polygons\n", i, points->num_polys_surf[i]); */ /* We count the number of boundaries per surface and allocate accordingly the volatile. */ } /** * visu_surfaces_points_transform: * @points: a set of points. * @trans: a matrix. * * Apply @trans matrix to all vertices coordinates stored by @points. * * Since: 3.7 **/ void visu_surfaces_points_transform(VisuSurfacesPoints *points, float trans[3][3]) { guint i; float old_poly_points[6]; g_return_if_fail(points); DBG_fprintf(stderr, " | apply change to %d points.\n", points->num_points); for (i = 0; i < points->num_points; i++) { old_poly_points[0] = points->poly_points_data[i][0]; old_poly_points[1] = points->poly_points_data[i][1]; old_poly_points[2] = points->poly_points_data[i][2]; old_poly_points[3] = points->poly_points_data[i][VISU_SURFACES_POINTS_OFFSET_NORMAL + 0]; old_poly_points[4] = points->poly_points_data[i][VISU_SURFACES_POINTS_OFFSET_NORMAL + 1]; old_poly_points[5] = points->poly_points_data[i][VISU_SURFACES_POINTS_OFFSET_NORMAL + 2]; tool_matrix_productVector(points->poly_points_data[i], trans, old_poly_points); tool_matrix_productVector(points->poly_points_data[i] + VISU_SURFACES_POINTS_OFFSET_NORMAL, trans, old_poly_points + 3); } } /** * visu_surfaces_points_remove: * @points: a set of points ; * @pos: an integer between 0 and points->nsurf. * * Remove the points belonging to surface number @pos. */ void visu_surfaces_points_remove(VisuSurfacesPoints *points, guint pos) { int nPoly, nPoint; guint i, j; int iPoly, iPoint; VisuSurfacesPoints tmpPoints; gboolean *usedPoints; int *switchArray; points->nsurf -= 1; if (!points->num_points) { points->num_polys_surf = g_realloc(points->num_polys_surf, points->nsurf * sizeof(int)); return; } DBG_fprintf(stderr, "IsosurfacesPoints: remove surface %d from points %p.\n", pos, (gpointer)points); g_return_if_fail(pos <= points->nsurf); /* Special case when there is only one remaining surface. */ if (points->nsurf == 0) { visu_surfaces_points_free(points); return; } /* Simple implementation is to create a new VisuSurfacesPoints object arrays, and to copy everything, except the polygons belonging to the given pos. */ /* Count number of poly and points to remove. */ usedPoints = g_malloc(sizeof(gboolean) * points->num_points); memset(usedPoints, 0, sizeof(gboolean) * points->num_points); /* We don't use num_polys_surf since it is restricted to visible surfaces. */ nPoly = 0; for (i = 0; i < points->num_polys; i++) if ((guint)(ABS(points->poly_surf_index[i]) - 1) != pos) { nPoly += 1; for (j = 0; j < points->poly_num_vertices[i]; j++) usedPoints[points->poly_vertices[i][j]] = TRUE; } nPoint = 0; for (i = 0; i < points->num_points; i++) if (usedPoints[i]) nPoint += 1; DBG_fprintf(stderr, " | remove %d polygons and %d points.\n", points->num_polys - nPoly, points->num_points - nPoint); visu_surfaces_points_init(&tmpPoints, points->bufferSize); visu_surfaces_points_allocate(&tmpPoints, points->nsurf, nPoly, nPoint); /* Copy from surf to tmpSurf. */ switchArray = g_malloc(sizeof(int) * points->num_points); iPoint = 0; for (i = 0; i < points->num_points; i++) if (usedPoints[i]) { memcpy(tmpPoints.poly_points_data[iPoint], points->poly_points_data[i], sizeof(float) * (VISU_SURFACES_POINTS_OFFSET_USER + points->bufferSize)); switchArray[i] = iPoint; iPoint += 1; if (iPoint > nPoint) { g_error("Incorrect point checksum."); } } iPoly = 0; for (i = 0; i < points->num_polys; i++) { if ((guint)(ABS(points->poly_surf_index[i]) - 1) != pos) { if (points->poly_surf_index[i] > (int)pos + 1) tmpPoints.poly_surf_index[iPoly] = points->poly_surf_index[i] - 1; else if (points->poly_surf_index[i] < -(int)pos - 1) tmpPoints.poly_surf_index[iPoly] = points->poly_surf_index[i] + 1; else tmpPoints.poly_surf_index[iPoly] = points->poly_surf_index[i]; tmpPoints.poly_num_vertices[iPoly] = points->poly_num_vertices[i]; tmpPoints.poly_vertices[iPoly] = g_malloc(sizeof(int) * tmpPoints.poly_num_vertices[iPoly]); for (j = 0; j < tmpPoints.poly_num_vertices[iPoly]; j++) tmpPoints.poly_vertices[iPoly][j] = switchArray[points->poly_vertices[i][j]]; iPoly += 1; if (iPoly > nPoly) { g_error("Incorrect polygon checksum."); } } } g_free(usedPoints); g_free(switchArray); /* Check sum. */ if (iPoly != nPoly || iPoint != nPoint) { g_error("Incorrect checksum (%d %d | %d %d).", iPoly, nPoly, iPoint, nPoint); } /* Move the number of polygons per surface. */ for (i = pos; i < points->nsurf; i++) points->num_polys_surf[i] = points->num_polys_surf[i + 1]; points->num_polys_surf = g_realloc(points->num_polys_surf, sizeof(int) * points->nsurf); g_free(tmpPoints.num_polys_surf); /* We replace the arrays between tmpSurf and surf. */ DBG_fprintf(stderr, " | switch and free arrays.\n"); g_free(points->poly_surf_index); points->poly_surf_index = tmpPoints.poly_surf_index; g_free(points->poly_num_vertices); points->poly_num_vertices = tmpPoints.poly_num_vertices; for (i = 0; i< points->num_polys; i++) g_free(points->poly_vertices[i]); g_free(points->poly_vertices); points->poly_vertices = tmpPoints.poly_vertices; g_free(points->poly_points_data[0]); g_free(points->poly_points_data); points->poly_points_data = tmpPoints.poly_points_data; /* additionnal tuning. */ points->num_polys = nPoly; points->num_points = nPoint; } /** * visu_surfaces_points_free: * @points: a set of points. * * Free all allocated arrays of the given set of points. The point * structure itself is not freed. */ void visu_surfaces_points_free(VisuSurfacesPoints *points) { guint i; if(points->num_polys == 0) return; if (points->num_polys_surf) g_free(points->num_polys_surf); if (points->poly_surf_index) g_free(points->poly_surf_index); if (points->poly_num_vertices) g_free(points->poly_num_vertices); if (points->poly_vertices) { for (i = 0; i < points->num_polys; i++) g_free(points->poly_vertices[i]); g_free(points->poly_vertices); } if (points->poly_points_data) { g_free(points->poly_points_data[0]); g_free(points->poly_points_data); } points->nsurf = 0; points->num_polys = 0; points->num_points = 0; points->num_polys_surf = (guint*)0; points->poly_surf_index = (int*)0; points->poly_num_vertices = (guint*)0; points->poly_vertices = (guint**)0; points->poly_points_data = (float **)0; } /** * visu_surfaces_points_init: * @points: a pointer on a set of points (not initialised) ; * @bufferSize: the number of additional data to coordinates and * normals. * * Initialise a VisuSurfacesPoints structure. It must be done before any use. */ void visu_surfaces_points_init(VisuSurfacesPoints *points, int bufferSize) { g_return_if_fail(bufferSize >= 0 && points); DBG_fprintf(stderr, "IsosurfacesPoints: initialise point definitions (%p-%d).\n", (gpointer)points, bufferSize); points->nsurf = 0; points->num_polys = 0; points->num_points = 0; points->bufferSize = bufferSize; points->num_polys_surf = (guint*)0; points->poly_surf_index = (int*)0; points->poly_num_vertices = (guint*)0; points->poly_vertices = (guint**)0; points->poly_points_data = (float **)0; } /** * visu_surfaces_points_allocate: * @points: a pointer on a set of points (not allocated) ; * @nsurf: the number of stored surfaces ; * @npolys: the number of stored polygons ; * @npoints: the corresponding number of points ; * * Allocate the arrays to store a set of points. */ void visu_surfaces_points_allocate(VisuSurfacesPoints *points, int nsurf, int npolys, int npoints) { int i; g_return_if_fail(nsurf > 0 && npolys >= 0 && npoints >= 0); DBG_fprintf(stderr, "IsosurfacesPoints: allocate point definitions (%d-%d).\n", npolys, npoints); points->nsurf = nsurf; points->num_polys = npolys; points->num_points = npoints; points->num_polys_surf = g_malloc(nsurf * sizeof(int)); memset(points->num_polys_surf, 0, sizeof(int) * nsurf); if (npolys == 0 || npoints == 0) { points->poly_surf_index = (int*)0; points->poly_num_vertices = (guint*)0; points->poly_vertices = (guint**)0; points->poly_points_data = (float **)0; return; } /* for each of the num_polys polygons will contain the surf value to which it belongs */ points->poly_surf_index = g_malloc(npolys * sizeof(int)); /* for each of the num_polys polygons will contain the number of vertices in it */ points->poly_num_vertices = g_malloc(npolys * sizeof(int)); /* for each of the num_polys polygons will contain the indices of vertices in it */ points->poly_vertices = g_malloc(npolys * sizeof(int*)); memset(points->poly_vertices, 0, npolys * sizeof(int*)); /* for each of the num_points, poly_points_data[][0] = x poly_points_data[][1] = y poly_points_data[][2] = z */ points->poly_points_data = g_malloc(npoints * sizeof(float *)); points->poly_points_data[0] = g_malloc((VISU_SURFACES_POINTS_OFFSET_USER + points->bufferSize) * npoints * sizeof(float)); for(i = 0; i < npoints; i++) points->poly_points_data[i] = points->poly_points_data[0] + i * (VISU_SURFACES_POINTS_OFFSET_USER + points->bufferSize); DBG_fprintf(stderr, " | OK.\n"); } v_sim-3.7.0/src/extraFunctions/surfaces_points.h0000644000353400050620000000705212215546074016756 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail addresses : CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef SURFACES_POINTS_H #define SURFACES_POINTS_H #include /** * VISU_SURFACES_POINTS_OFFSET_NORMAL: * * The offset to read the normal values in poly_points. */ #define VISU_SURFACES_POINTS_OFFSET_NORMAL 3 /** * VISU_SURFACES_POINTS_OFFSET_TRANSLATION: * * The offset to read the translation values in poly_points. */ #define VISU_SURFACES_POINTS_OFFSET_TRANSLATION 6 /** * VISU_SURFACES_POINTS_OFFSET_USER: * * The offset to read the user values in poly_points. */ #define VISU_SURFACES_POINTS_OFFSET_USER 9 typedef struct _VisuSurfacesPoints VisuSurfacesPoints; struct _VisuSurfacesPoints { /* Number of different surfaces. */ guint nsurf; /* This is the size of additional data on each points in addition to (x,y,z) coordinates, normal and translation. Then poly_points is allocated to (num_points * (9 + bufferSize)). */ guint bufferSize; /* Number of polygons */ guint num_polys, num_points; /* Number of polygons per surface. */ guint *num_polys_surf; /* Give the number of the surface when the number of the polygon is given. */ int *poly_surf_index; /* Return the number of vertices when the id of the polygon is given. */ guint *poly_num_vertices; /* Return the id in poly_points_data of the vertice j of polygon i. */ guint **poly_vertices; /* Vectors giving points and normal of the vertice i. */ float **poly_points_data; }; void visu_surfaces_points_init(VisuSurfacesPoints *points, int bufferSize); void visu_surfaces_points_allocate(VisuSurfacesPoints *points, int nsurf, int npolys, int npoints); void visu_surfaces_points_free(VisuSurfacesPoints *points); void visu_surfaces_points_remove(VisuSurfacesPoints *points, guint pos); void visu_surfaces_points_translate(VisuSurfacesPoints *points, float xyz[3]); void visu_surfaces_points_transform(VisuSurfacesPoints *points, float trans[3][3]); void visu_surfaces_points_check(VisuSurfacesPoints *points); #endif v_sim-3.7.0/src/extraFunctions/surfaces.c0000644000353400050620000014046312215547564015366 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD, Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD and Damien CALISTE and Olivier D'Astier, laboratoire L_Sim, (2001-2005) E-mail addresses : BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "surfaces.h" #include #include #include #include #include #include #include /** * SECTION:surfaces * @short_description: Supports loading of .surf files and drawing of * surfaces through OpenGL. * * Originally written by Luc Billard for his Visualize program. This * module allows loading of .surf files to draw scalar fields on top of * the current display scene. .surf files are text files which specs are * the following : * * * 1st line is arbitrary * * * 2nd line must contain 3 real (float) values: dxx dyx dyy * * * 3rd line must contain 3 real (float) values: dzx dzy dzz * * * 4th line must contain 3 positive integers which * represents respectively the number of surfaces, the total number of * polys, and the total number of points * * * Then, for each of these surfaces : * * * * next line must contain the name of the surface : it is a * string which should match the pattern surface_* * * * next line must contain 2 positive integer values: the number of polys * (num_polys) and * the number of points (num_points) used by the surface * * * each of the following num_polys lines must match the pattern * [n i_1 i_2 i_3 ... i_n] where n is the number of vertices in the poly (n >= 3) * and [i_1 i_2 i_3 ... i_n] are the numbering of these vertices (vertices numbered from 1 to num_points) * * * each of the following num_points lines must contain 6 real values for the * successive (1 to num_points) points : [x y z nx ny nz], where x y z are the coordinates of the point * and nx ny nz are the coordinates of the unit normal at the point * * * * * * * It is the responsibility of the user to guarantee that * dxx, dyx, dyy, dzx, dzy, dzz match the one currently loaded in V_Sim's * current context. Though if you use panelSurfaces you can ask * to resize the surfaces so that they fit in the current loaded box. * */ #define ISOSURFACES_FLAG_POTENTIAL "# potentialValue" static GQuark quark; typedef struct VisuSurfacesProperties_struct { gchar *name; /* The element (G_TYPE_INT...). */ guint type; /* A pointer to the surf it belongs to. */ VisuSurfaces *surf; /* The data. */ gpointer data; } VisuSurfacesProperties; static void freeVisuSurfacesProperties(gpointer data); static void propertiesRemoveSurf(gpointer key, gpointer value, gpointer data); static void propertiesReallocateSurf(gpointer key, gpointer value, gpointer data); /** * VisuSurfaces: * @refCount: ref counter. * @nsurf: number of surfaces encoded in this structure ; * @basePoints: the geometric description of surfaces. * @volatilePlanes: a storage for volatile polygons, . * @box: the description of the box where surfaces are drawn ; * @resources: for each surface points on a #VisuSurfacesResources ; * @ids: gives a list of ids used to index surfaces ; * @properties: an hashtable of properties. * * This structure stores surfaces. Several surfaces are stored in a single * structure for improved performences. */ enum { SURFACE_ADDED_SIGNAL, SURFACE_REMOVED_SIGNAL, SURFACE_MASKED_SIGNAL, SURFACE_RENDERING_SIGNAL, NB_SIGNAL }; struct _VisuSurfacesClass { GObjectClass parent; }; /* Internal variables. */ static guint surfaces_signals[NB_SIGNAL] = { 0 }; /* Object gestion methods. */ static void visu_surfaces_dispose (GObject* obj); static void visu_surfaces_finalize (GObject* obj); static void visu_boxed_interface_init(VisuBoxedInterface *iface); /* Local functions. */ static VisuBox* visu_surfaces_getBox(VisuBoxed *self); static gboolean visu_surfaces_setBox(VisuBoxed *self, VisuBox *box, gboolean fit); G_DEFINE_TYPE_WITH_CODE(VisuSurfaces, visu_surfaces, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE(VISU_TYPE_BOXED, visu_boxed_interface_init)) static void visu_surfaces_class_init(VisuSurfacesClass *klass) { DBG_fprintf(stderr, "VisuSurfaces: creating the class of the object.\n"); DBG_fprintf(stderr, " - adding new signals ;\n"); /** * VisuSurfaces::added: * @surf: the object which received the signal. * * Gets emitted when a new surface is added to the object. * * Since: 3.7 */ surfaces_signals[SURFACE_ADDED_SIGNAL] = g_signal_newv("added", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, NULL, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, NULL); /** * VisuSurfaces::removed: * @surf: the object which received the signal. * @idSurf: the id of the surface that has been removed. * * Gets emitted when a surface is removed from the object. * * Since: 3.7 */ surfaces_signals[SURFACE_REMOVED_SIGNAL] = g_signal_new("removed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * VisuSurfaces::masked: * @surf: the object which received the signal. * * Gets emitted when a surface is shown or hidden by a plane. * * Since: 3.7 */ surfaces_signals[SURFACE_MASKED_SIGNAL] = g_signal_new("masked", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * VisuSurfaces::rendering: * @surf: the object which received the signal. * @idSurf: the id of the surface that has been modified. * * Gets emitted when a rendering property of a surface is modified. * * Since: 3.7 */ surfaces_signals[SURFACE_RENDERING_SIGNAL] = g_signal_new("rendering", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /* Connect freeing methods. */ G_OBJECT_CLASS(klass)->dispose = visu_surfaces_dispose; G_OBJECT_CLASS(klass)->finalize = visu_surfaces_finalize; quark = g_quark_from_static_string("visu_isosurfaces"); visu_surfaces_resources_init(); } static void visu_boxed_interface_init(VisuBoxedInterface *iface) { iface->get_box = visu_surfaces_getBox; iface->set_box = visu_surfaces_setBox; } static void visu_surfaces_init(VisuSurfaces *obj) { obj->dispose_has_run = FALSE; DBG_fprintf(stderr, "VisuSurfaces: creating a new surfaces (%p).\n", (gpointer)obj); obj->nsurf = 0; obj->ids = (int*)0; obj->box = (VisuBox*)0; obj->resources = (VisuSurfacesResources**)0; obj->properties = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, freeVisuSurfacesProperties); } /* This method can be called several times. It should unref all of its reference to GObjects. */ static void visu_surfaces_dispose(GObject* obj) { DBG_fprintf(stderr, "VisuSurfaces: dispose object %p.\n", (gpointer)obj); if (VISU_SURFACES(obj)->dispose_has_run) return; visu_surfaces_setBox(VISU_BOXED(obj), (VisuBox*)0, FALSE); VISU_SURFACES(obj)->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS(visu_surfaces_parent_class)->dispose(obj); } /* This method is called once only. */ static void visu_surfaces_finalize(GObject* obj) { VisuSurfaces *surf = VISU_SURFACES(obj); guint i; DBG_fprintf(stderr, "VisuSurfaces: finalize object %p.\n", (gpointer)obj); visu_surfaces_points_free(&surf->basePoints); visu_surfaces_points_free(&surf->volatilePlanes); if (surf->ids) g_free(surf->ids); if (surf->resources) { /* We free all resource that has no name (i.e. that are not stored in the hashtable. */ for (i = 0; i < surf->nsurf; i++) if (surf->resources[i] && !surf->resources[i]->surfnom) visu_surfaces_resources_free(surf->resources[i]); g_free(surf->resources); } if (surf->properties) g_hash_table_destroy(surf->properties); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_surfaces_parent_class)->finalize(obj); } /** * visu_surfaces_getErrorQuark: * * Internal routine for error handling. * * Returns: the #GQuark associated to errors related to surface * files. */ GQuark visu_surfaces_getErrorQuark(void) { return quark; } /** * visu_surfaces_checkConsistency: * @surf: a #VisuSurfaces object. * * Check if all arrays in the structures are consistent (without * overflow). */ void visu_surfaces_checkConsistency(VisuSurfaces* surf) { DBG_fprintf(stderr, "Isosurfaces: Check consistency.\n"); DBG_fprintf(stderr, " | Base points\n"); visu_surfaces_points_check(&surf->basePoints); DBG_fprintf(stderr, " | Volatile planes\n"); visu_surfaces_points_check(&surf->volatilePlanes); } /** * visu_surfaces_remove: * @surf: a #VisuSurfaces object ; * @idSurf: the id of the surf to remove. * * Remove from memory all polygons from the given surface. * * Returns: TRUE if the surface list is reduced to zero (and @surf * to be freed). */ gboolean visu_surfaces_remove(VisuSurfaces *surf, int idSurf) { guint i; int pos; g_return_val_if_fail(surf, FALSE); pos = visu_surfaces_getPosition(surf, idSurf); g_return_val_if_fail(pos >= 0 && (guint)pos < surf->nsurf, FALSE); if (surf->nsurf == 1) return TRUE; DBG_fprintf(stderr, "Isosurfaces: remove surface %d from %p.\n", pos, (gpointer)surf); DBG_fprintf(stderr, "Isosurfaces: remove base points.\n"); visu_surfaces_points_remove(&surf->basePoints, pos); DBG_fprintf(stderr, "Isosurfaces: remove volatile planes.\n"); visu_surfaces_points_remove(&surf->volatilePlanes, pos); surf->nsurf -= 1; /* If the resource has no name, then we free it since it is not shared. */ DBG_fprintf(stderr, " | Additional removing.\n"); if (!surf->resources[pos]->surfnom) visu_surfaces_resources_free(surf->resources[pos]); for (i = pos; i < surf->nsurf; i++) { surf->ids[i] = surf->ids[i + 1]; /* Move resource pointers. */ surf->resources[i] = surf->resources[i + 1]; } surf->ids = g_realloc(surf->ids, sizeof(int) * surf->nsurf); surf->resources = g_realloc(surf->resources, sizeof(VisuSurfacesResources*) * surf->nsurf); g_hash_table_foreach(surf->properties, propertiesRemoveSurf, GINT_TO_POINTER(pos)); #if DEBUG == 1 visu_surfaces_checkConsistency(surf); #endif g_signal_emit(G_OBJECT(surf), surfaces_signals[SURFACE_REMOVED_SIGNAL], 0, idSurf, NULL); return FALSE; } /** * visu_surfaces_new: * @bufferSize: an integer. * * Create a new (with unallocated internal arrays) structure to store * surfaces. The buffer size is used to store other values than the position * and the normal on each point. * * Returns: a newly allocated #VisuSurfaces structure. */ VisuSurfaces* visu_surfaces_new(guint bufferSize) { VisuSurfaces *surf; surf = VISU_SURFACES(g_object_new(VISU_TYPE_SURFACES, NULL)); DBG_fprintf(stderr, "VisuSurfaces: new surfaces %p.\n", (gpointer)surf); visu_surfaces_points_init(&surf->basePoints, bufferSize); visu_surfaces_points_init(&surf->volatilePlanes, bufferSize); return surf; } /** * visu_surfaces_allocate: * @surf: a #VisuSurfaces structure ; * @nsurf: the number of surfaces to store ; * @npolys: the number of polygons (in total) ; * @npoints: the total number of vertices. * * Allocate internal arrays to store surfaces having the given description. */ void visu_surfaces_allocate(VisuSurfaces *surf, guint nsurf, guint npolys, guint npoints) { guint i; DBG_fprintf(stderr, "VisuSurfaces: allocate %p to %d %d %d.\n", (gpointer)surf, nsurf, npolys, npoints); surf->nsurf = nsurf; visu_surfaces_points_allocate(&surf->basePoints, nsurf, npolys, npoints); visu_surfaces_points_allocate(&surf->volatilePlanes, nsurf, 0, 0); DBG_fprintf(stderr, "VisuSurfaces: allocate complement.\n"); /* Allocating pointers. */ surf->ids = g_malloc(nsurf * sizeof(int)); surf->resources = g_malloc(nsurf * sizeof(VisuSurfacesResources*)); /* Set initial values. */ for(i = 0; i < surf->nsurf; i++) surf->resources[i] = (VisuSurfacesResources*)0; DBG_fprintf(stderr, " | OK.\n"); } /** * visu_surfaces_add: * @surf: a #VisuSurfaces structure ; * @nsurf: the number of surfaces to add ; * @npolys: the number of polygons to add ; * @npoints: the number of vertices to add. * * Change the allocation of internal arrays to store the additional surfaces * with the given description. */ void visu_surfaces_add(VisuSurfaces *surf, guint nsurf, guint npolys, guint npoints) { guint i, nsurf_old; gboolean alloc; g_return_if_fail(surf); nsurf_old = surf->nsurf; DBG_fprintf(stderr, "Isosurfaces: add surface(s) %d %d %d.\n", nsurf, npolys, npoints); surf->nsurf += nsurf; surf->basePoints.nsurf += nsurf; surf->volatilePlanes.nsurf += nsurf; surf->basePoints.num_polys += npolys; surf->basePoints.num_points += npoints; surf->basePoints.num_polys_surf = g_realloc(surf->basePoints.num_polys_surf, surf->nsurf * sizeof(int)); surf->volatilePlanes.num_polys_surf = g_realloc(surf->volatilePlanes.num_polys_surf, surf->nsurf * sizeof(int)); for (i = 0; i < nsurf; i++) { surf->basePoints.num_polys_surf[nsurf_old + i] = 0; surf->volatilePlanes.num_polys_surf[nsurf_old + i] = 0; } surf->basePoints.poly_surf_index = g_realloc(surf->basePoints.poly_surf_index, surf->basePoints.num_polys * sizeof(int)); surf->basePoints.poly_num_vertices = g_realloc(surf->basePoints.poly_num_vertices, surf->basePoints.num_polys * sizeof(int)); surf->basePoints.poly_vertices = g_realloc(surf->basePoints.poly_vertices, surf->basePoints.num_polys * sizeof(int*)); alloc = (surf->basePoints.poly_points_data == (float**)0); surf->basePoints.poly_points_data = g_realloc(surf->basePoints.poly_points_data, surf->basePoints.num_points * sizeof(float *)); if (alloc) surf->basePoints.poly_points_data[0] = (float*)0; surf->basePoints.poly_points_data[0] = g_realloc(surf->basePoints.poly_points_data[0], (VISU_SURFACES_POINTS_OFFSET_USER + surf->basePoints.bufferSize) * surf->basePoints.num_points * sizeof(float)); for(i = 0; i < surf->basePoints.num_points; i++) surf->basePoints.poly_points_data[i] = surf->basePoints.poly_points_data[0] + i * (VISU_SURFACES_POINTS_OFFSET_USER + surf->basePoints.bufferSize); surf->ids = g_realloc(surf->ids, surf->nsurf * sizeof(int)); surf->resources = g_realloc(surf->resources, surf->nsurf * sizeof(VisuSurfacesResources*)); /* Dealing with properties reallocation. */ g_hash_table_foreach(surf->properties, propertiesReallocateSurf, GINT_TO_POINTER(surf->nsurf)); } static gboolean visu_surfaces_setBox(VisuBoxed *self, VisuBox *box, gboolean fit) { VisuSurfaces *surf; float trans[3][3], boxToXYZ[3][3], XYZToOldBox[3][3]; double boxToXYZd[3][3], XYZToOldBoxd[3][3]; g_return_val_if_fail(VISU_IS_SURFACES_TYPE(self), FALSE); surf = VISU_SURFACES(self); DBG_fprintf(stderr, "Isosurfaces: change the current box to fit to %p.\n", (gpointer)box); if (surf->box == box) return FALSE; if (fit && surf->box) { visu_box_getInvMatrix(surf->box, XYZToOldBoxd); tool_matrix_dtof(XYZToOldBox, XYZToOldBoxd); visu_box_getCellMatrix(box, boxToXYZd); tool_matrix_dtof(boxToXYZ, boxToXYZd); tool_matrix_productMatrix(trans, boxToXYZ, XYZToOldBox); visu_surfaces_points_transform(&surf->basePoints, trans); visu_surfaces_points_transform(&surf->volatilePlanes, trans); } if (surf->box) g_object_unref(surf->box); surf->box = box; if (box) g_object_ref(box); return TRUE; } static VisuBox* visu_surfaces_getBox(VisuBoxed *self) { g_return_val_if_fail(VISU_IS_SURFACES_TYPE(self), (VisuBox*)0); DBG_fprintf(stderr, "VisuSurfaces: get box.\n"); return VISU_SURFACES(self)->box; } static void freeVisuSurfacesProperties(gpointer data) { VisuSurfacesProperties *prop; prop = (VisuSurfacesProperties*)data; g_free(prop->name); g_free(prop->data); g_free(prop); } static void propertiesRemoveSurf(gpointer key _U_, gpointer value, gpointer data) { guint idSurf, i; VisuSurfacesProperties *prop; idSurf = GPOINTER_TO_INT(data); prop = (VisuSurfacesProperties*)value; switch (prop->type) { case G_TYPE_FLOAT: for (i = idSurf; i < prop->surf->nsurf; i++) ((float*)prop->data)[i] = ((float*)prop->data)[i + 1]; prop->data = g_realloc(prop->data, prop->surf->nsurf * sizeof(float)); break; default: g_warning("Unimplemented format."); } } static void propertiesReallocateSurf(gpointer key _U_, gpointer value, gpointer data) { int nsurf; VisuSurfacesProperties *prop; nsurf = GPOINTER_TO_INT(data); prop = (VisuSurfacesProperties*)value; DBG_fprintf(stderr, "Visu Surfaces: reallocating for %d surfaces prop '%s'.\n", nsurf, (gchar*)key); switch (prop->type) { case G_TYPE_FLOAT: prop->data = g_realloc(prop->data, nsurf * sizeof(float)); break; default: g_warning("Unimplemented format."); } } /* Dealing with properties as floats. */ /** * visu_surfaces_addPropertyFloat: * @surf: a #VisuSurfaces object ; * @name: the name of the property to add. * * Some properties can be associated to the surfaces stored in @surf. * This method is add a new property. * * Returns: a newly allocated array that can be populated. */ float* visu_surfaces_addPropertyFloat(VisuSurfaces *surf, const gchar* name) { float *data; VisuSurfacesProperties *prop; g_return_val_if_fail(surf, (float*)0); g_return_val_if_fail(name && name[0], (float*)0); DBG_fprintf(stderr, "Visu Surfaces: add a new float prop '%s'.\n", name); prop = g_malloc(sizeof(VisuSurfacesProperties)); prop->name = g_strdup(name); prop->type = G_TYPE_FLOAT; prop->surf = surf; if (surf->nsurf > 0) data = g_malloc(sizeof(float) * surf->nsurf); else data = (gpointer)0; prop->data = (gpointer)data; g_hash_table_insert(surf->properties, (gpointer)prop->name, (gpointer)prop); return data; } gboolean visu_surfaces_addPropertyFloatValue(VisuSurfaces *surf, int idSurf, const gchar* name, float value) { float* data; int id; VisuSurfacesProperties *prop; g_return_val_if_fail(surf, FALSE); id = visu_surfaces_getPosition(surf, idSurf); g_return_val_if_fail(id >= 0 && (guint)id < surf->nsurf, FALSE); prop = (VisuSurfacesProperties*)g_hash_table_lookup(surf->properties, name); if (!prop) return FALSE; g_return_val_if_fail(prop->surf != surf, FALSE); data = (float*)prop->data; data[id] = value; return TRUE; } /** * visu_surfaces_getPropertyValueFloat: * @surf: a #VisuSurfaces object ; * @idSurf: a surface number ; * @name: the name of the property to get the value from ; * @value: a location to store the value. * * This method retrieves a float value stored as a property called @name for * the surface defined by its number @idSurf. * * Returns: TRUE if a value is indeed found. */ gboolean visu_surfaces_getPropertyValueFloat(VisuSurfaces *surf, int idSurf, const gchar *name, float *value) { float* data; int id; VisuSurfacesProperties *prop; g_return_val_if_fail(surf && value, FALSE); id = visu_surfaces_getPosition(surf, idSurf); g_return_val_if_fail(id >= 0 && (guint)id < surf->nsurf, FALSE); prop = (VisuSurfacesProperties*)g_hash_table_lookup(surf->properties, name); if (!prop) return FALSE; g_return_val_if_fail(prop->surf != surf, FALSE); data = (float*)prop->data; *value = data[id]; return TRUE; } /** * visu_surfaces_getPropertyFloat: * @surf: a #VisuSurfaces object ; * @name: the name of the property to look for. * * Some properties can be associated to the surfaces stored in @surf. * This method is used to retrieve floating point values properties. * * Returns: a table with the values if the property is found, NULL * otherwise. */ float* visu_surfaces_getPropertyFloat(VisuSurfaces *surf, const gchar *name) { VisuSurfacesProperties *prop; g_return_val_if_fail(surf, (float*)0); prop = (VisuSurfacesProperties*)g_hash_table_lookup(surf->properties, name); if (prop) return (float*)prop->data; else return (float*)0; } /** * visu_surfaces_loadFile: * @file: target file to load ; * @surf: (out) (transfer full): a set of surfaces (location) ; * @error: a location to store errors. * * This loads a surface file and set default material properties for it. * See surf file specifications. * * Returns: (skip): TRUE in case of success, FALSE otherwise. Even in case of success * @error may have been set. * */ gboolean visu_surfaces_loadFile(const char *file, VisuSurfaces **surf, GError **error) { GIOChannel* surf_file; int line_number = 0; double dxx=0, dyx=0, dyy=0; double dzx=0, dzy=0, dzz=0; double geometry[VISU_BOX_N_VECTORS]; int file_nsurfs=0, file_npolys=0, file_npoints=0; int npolys_loaded=0, npoints_loaded=0; guint i; int j,k, res; int sum_polys=0, sum_points=0; GIOStatus io_status; GString *current_line; float *densityData, densityValue, *fval; g_return_val_if_fail(surf, FALSE); g_return_val_if_fail(error, FALSE); DBG_fprintf(stderr, "Isosurfaces: trying to load %s file.\n", file); *surf = (VisuSurfaces*)0; current_line = g_string_new(""); *error = (GError*)0; surf_file = g_io_channel_new_file(file, "r", error); if(!surf_file) return FALSE; /* DBG_fprintf(stderr, "File opened\n"); */ *error = (GError*)0; io_status = g_io_channel_read_line_string(surf_file, current_line, NULL, error); if(io_status != G_IO_STATUS_NORMAL) { g_string_free(current_line, TRUE); g_io_channel_unref(surf_file); return FALSE; } line_number++; /* DBG_fprintf(stderr, "Line %d read successfully\n", line_number); */ *surf = visu_surfaces_new(0); *error = (GError*)0; io_status = g_io_channel_read_line_string(surf_file, current_line, NULL, error); if(io_status != G_IO_STATUS_NORMAL) { g_string_free(current_line, TRUE); g_io_channel_unref(surf_file); g_object_unref(*surf); *surf = (VisuSurfaces*)0; return FALSE; } line_number++; /* DBG_fprintf(stderr, "Line %d read successfully\n", line_number); */ if(sscanf(current_line->str, "%lf %lf %lf", &dxx, &dyx, &dyy) != 3) { *error = g_error_new(VISU_ERROR_ISOSURFACES, VISU_ERROR_FORMAT, _("Line %d doesn't match the [float, float, float]" " pattern."), line_number); g_string_free(current_line, TRUE); g_io_channel_unref(surf_file); g_object_unref(*surf); *surf = (VisuSurfaces*)0; return FALSE; } *error = (GError*)0; io_status = g_io_channel_read_line_string(surf_file, current_line, NULL, error); if(io_status != G_IO_STATUS_NORMAL) { g_string_free(current_line, TRUE); g_io_channel_unref(surf_file); g_object_unref(*surf); *surf = (VisuSurfaces*)0; return FALSE; } line_number++; /* DBG_fprintf(stderr, "Line %d read successfully\n", line_number); */ if(sscanf(current_line->str, "%lf %lf %lf", &dzx, &dzy, &dzz) != 3) { *error = g_error_new(VISU_ERROR_ISOSURFACES, VISU_ERROR_FORMAT, _("Line %d doesn't match the [float, float, float]" " pattern."), line_number); g_string_free(current_line, TRUE); g_io_channel_unref(surf_file); g_object_unref(*surf); *surf = (VisuSurfaces*)0; return FALSE; } *error = (GError*)0; io_status = g_io_channel_read_line_string(surf_file, current_line, NULL, error); if(io_status != G_IO_STATUS_NORMAL) { g_string_free(current_line, TRUE); g_io_channel_unref(surf_file); g_object_unref(*surf); *surf = (VisuSurfaces*)0; return FALSE; } line_number++; /* DBG_fprintf(stderr, "Line %d read successfully\n", line_number); */ res = sscanf(current_line->str, "%d %d %d", &file_nsurfs, &file_npolys, &file_npoints); if(res != 3 || file_nsurfs <= 0 || file_npolys <= 0 || file_npoints <= 0) { *error = g_error_new(VISU_ERROR_ISOSURFACES, VISU_ERROR_FORMAT, _("Line %d doesn't match the [int > 0, int > 0, int > 0]" " pattern."), line_number); g_string_free(current_line, TRUE); g_io_channel_unref(surf_file); g_object_unref(*surf); *surf = (VisuSurfaces*)0; return FALSE; } /* From now on, the file is supposed to be a valid surface file. */ (*surf)->nsurf = file_nsurfs; geometry[VISU_BOX_DXX] = dxx; geometry[VISU_BOX_DYX] = dyx; geometry[VISU_BOX_DYY] = dyy; geometry[VISU_BOX_DZX] = dzx; geometry[VISU_BOX_DZY] = dzy; geometry[VISU_BOX_DZZ] = dzz; (*surf)->box = visu_box_new(geometry, VISU_BOX_PERIODIC); visu_box_setMargin((*surf)->box, 0, FALSE); /* Allocate storage arrays. */ visu_surfaces_allocate(*surf, file_nsurfs, file_npolys, file_npoints); /* Create a table to store the density values. */ densityData = visu_surfaces_addPropertyFloat(*surf, VISU_SURFACES_PROPERTY_POTENTIAL); /* For each surf */ for(i = 0; i < (*surf)->nsurf; i++) { int surf_npolys=0, surf_npoints=0; densityData[i] = 0.; (*surf)->ids[i] = i; /* Allow some commentaries here begining with a '#' character. */ do { /* Get the first line that should contains current surf' name */ *error = (GError*)0; io_status = g_io_channel_read_line_string(surf_file, current_line, NULL, error); if(io_status != G_IO_STATUS_NORMAL) { g_string_free(current_line, TRUE); g_io_channel_unref(surf_file); g_object_unref(*surf); *surf = (VisuSurfaces*)0; return TRUE; } line_number++; /* If the line begins with a '#', then we try to find a density value. */ if (current_line->str[0] == '#') { res = sscanf(current_line->str, ISOSURFACES_FLAG_POTENTIAL" %f", &densityValue); if (res == 1) densityData[i] = densityValue; } } while (current_line->str[0] == '#'); g_strdelimit(current_line->str, "\n", ' '); g_strstrip(current_line->str); (*surf)->resources[i] = visu_surfaces_resources_getFromName(current_line->str, (gboolean*)0); DBG_fprintf(stderr, "Line %d ('%s' -> %p) read successfully %f\n", line_number, current_line->str, (gpointer)(*surf)->resources[i], densityData[i]); *error = (GError*)0; io_status = g_io_channel_read_line_string(surf_file, current_line, NULL, error); if(io_status != G_IO_STATUS_NORMAL) { g_string_free(current_line, TRUE); g_io_channel_unref(surf_file); g_object_unref(*surf); *surf = (VisuSurfaces*)0; return TRUE; } line_number++; /* DBG_fprintf(stderr, "Line %d read successfully\n", line_number); */ res = sscanf(current_line->str, "%d %d", &surf_npolys, &surf_npoints); if(res != 2 || surf_npolys <= 0 || surf_npoints <= 0) { *error = g_error_new(VISU_ERROR_ISOSURFACES, VISU_ERROR_FORMAT, _("Line %d doesn't match the [int > 0, int > 0]" " pattern."), line_number); g_string_free(current_line, TRUE); g_io_channel_unref(surf_file); g_object_unref(*surf); *surf = (VisuSurfaces*)0; return TRUE; } sum_polys += surf_npolys; if(sum_polys > file_npolys) { *error = g_error_new(VISU_ERROR_ISOSURFACES, VISU_ERROR_CHECKSUM, _("Error on line %d. Declared number of polygons" " reached."), line_number); g_string_free(current_line, TRUE); g_io_channel_unref(surf_file); g_object_unref(*surf); *surf = (VisuSurfaces*)0; return TRUE; } sum_points += surf_npoints; if(sum_points > file_npoints) { *error = g_error_new(VISU_ERROR_ISOSURFACES, VISU_ERROR_CHECKSUM, _("Error on line %d. Declared number of points" " reached."), line_number); g_string_free(current_line, TRUE); g_io_channel_unref(surf_file); g_object_unref(*surf); *surf = (VisuSurfaces*)0; return TRUE; } for(j = 0; j < surf_npolys; j++) { int nvertex=0, nvertex_i=0; gchar **split_line; *error = (GError*)0; io_status = g_io_channel_read_line_string(surf_file, current_line, NULL, error); if(io_status != G_IO_STATUS_NORMAL) { g_string_free(current_line, TRUE); g_io_channel_unref(surf_file); g_object_unref(*surf); *surf = (VisuSurfaces*)0; return TRUE; } line_number++; split_line = g_strsplit_set(current_line->str, " ", -1); for(k = 0; split_line[k] != NULL; k++) { if(g_ascii_strcasecmp(split_line[k], "") == 0) continue; if(nvertex == 0) { if(sscanf(split_line[k], "%d", &nvertex) != 1 || nvertex < 3) { *error = g_error_new(VISU_ERROR_ISOSURFACES, VISU_ERROR_FORMAT, _("Line %dmust begin by an int."), line_number); g_string_free(current_line, TRUE); g_io_channel_unref(surf_file); g_object_unref(*surf); *surf = (VisuSurfaces*)0; return TRUE; } (*surf)->basePoints.poly_num_vertices[npolys_loaded] = nvertex; (*surf)->basePoints.poly_vertices[npolys_loaded] = g_malloc(nvertex * sizeof(double)); (*surf)->basePoints.poly_surf_index[npolys_loaded] = i + 1; (*surf)->basePoints.num_polys_surf[i] += 1; npolys_loaded++; continue; } res = sscanf(split_line[k], "%u", &(*surf)->basePoints.poly_vertices[npolys_loaded-1][nvertex_i]); if(res != 1) { *error = g_error_new(VISU_ERROR_ISOSURFACES, VISU_ERROR_FORMAT, _("Line %d doesn't match the [int > 3, ...]" " required pattern."), line_number); g_string_free(current_line, TRUE); g_io_channel_unref(surf_file); g_object_unref(*surf); *surf = (VisuSurfaces*)0; return TRUE; } (*surf)->basePoints.poly_vertices[npolys_loaded-1][nvertex_i] += -1 + npoints_loaded; nvertex_i++; if(nvertex_i >= nvertex) break; } g_strfreev(split_line); } for(j = 0; j < surf_npoints; j++) { *error = (GError*)0; io_status = g_io_channel_read_line_string(surf_file, current_line, NULL, error); if(io_status != G_IO_STATUS_NORMAL) { g_string_free(current_line, TRUE); g_io_channel_unref(surf_file); g_object_unref(*surf); *surf = (VisuSurfaces*)0; return TRUE; } line_number++; fval = (*surf)->basePoints.poly_points_data[npoints_loaded]; if(sscanf(current_line->str, "%f %f %f %f %f %f", fval, fval + 1, fval + 2, fval + VISU_SURFACES_POINTS_OFFSET_NORMAL, fval + VISU_SURFACES_POINTS_OFFSET_NORMAL + 1, fval + VISU_SURFACES_POINTS_OFFSET_NORMAL + 2) != 6) { *error = g_error_new(VISU_ERROR_ISOSURFACES, VISU_ERROR_FORMAT, _("Line %d doesn't match the [float x 6]" " required pattern."), line_number); g_string_free(current_line, TRUE); g_io_channel_unref(surf_file); g_object_unref(*surf); *surf = (VisuSurfaces*)0; return TRUE; } npoints_loaded++; } } g_string_free(current_line, TRUE); g_io_channel_unref(surf_file); return TRUE; } /** * visu_surfaces_setShowAll: * @surf: a #VisuSurfaces object ; * @show: TRUE to show all surfaces, FALSE to hide them. * * Shows or hides all surfaces and check their "draw" status in the panel accordingly. */ void visu_surfaces_setShowAll(VisuSurfaces *surf, gboolean show) { guint i; g_return_if_fail(surf); for (i = 0; i < surf->nsurf; i++) surf->resources[i]->rendered = show; } /** * visu_surfaces_hide: * @surf: a #VisuSurfaces object ; * @planes: an array of planes (NULL terminated). * * Change the visibility of polygons stored in @surf, following the masking * scheme defined by the given list of @planes (see #VisuPlane). * * Returns: TRUE if the surfaces visibility status have been changed. */ gboolean visu_surfaces_hide(VisuSurfaces *surf, VisuPlane **planes) { guint i, j, iv; int k, iPoly, isurf, iVertice, n; gboolean *verticeStatus; gboolean visibility, redraw, boundary, valid; int *boundaryPolys; guint nBounadryPolys; int npolys, npoints; VisuSurfacesPoints *ptFr, *ptTo; g_return_val_if_fail(surf, FALSE); DBG_fprintf(stderr, "Isosurfaces: compute masked polygons" " for surface %p.\n", (gpointer)surf); /* Free previous volatile points. */ visu_surfaces_points_free(&surf->volatilePlanes); verticeStatus = g_malloc(sizeof(gboolean) * surf->basePoints.num_points); redraw = FALSE; /* Compute a visibility flag for each vertice. */ for (i = 0; i < surf->basePoints.num_points; i++) verticeStatus[i] = visu_plane_class_getVisibility(planes, surf->basePoints.poly_points_data[i]); /* We store the id of boundary polygons. */ boundaryPolys = g_malloc(sizeof(int) * surf->basePoints.num_polys); nBounadryPolys = 0; /* Hide polygons. */ for (i = 0; i < surf->basePoints.num_polys; i++) { visibility = TRUE; boundary = FALSE; if (surf->resources[ABS(surf->basePoints.poly_surf_index[i]) - 1]->sensitiveToPlanes) { for (j = 0; j < surf->basePoints.poly_num_vertices[i]; j++) { visibility = visibility && verticeStatus[surf->basePoints.poly_vertices[i][j]]; boundary = boundary || verticeStatus[surf->basePoints.poly_vertices[i][j]]; } boundary = !visibility && boundary; } if (!visibility && surf->basePoints.poly_surf_index[i] > 0) { /* Hide this polygon. */ surf->basePoints.num_polys_surf[surf->basePoints.poly_surf_index[i] - 1] -= 1; surf->basePoints.poly_surf_index[i] = -surf->basePoints.poly_surf_index[i]; redraw = TRUE; } else if (visibility && surf->basePoints.poly_surf_index[i] < 0) { /* Show this polygon. */ surf->basePoints.poly_surf_index[i] = -surf->basePoints.poly_surf_index[i]; surf->basePoints.num_polys_surf[surf->basePoints.poly_surf_index[i] - 1] += 1; redraw = TRUE; } if (boundary) boundaryPolys[nBounadryPolys++] = i; } if (DEBUG) for (i = 0; i < surf->nsurf; i++) fprintf(stderr, " | surface %2d -> %7d polygons\n", i, surf->basePoints.num_polys_surf[i]); /* We count the number of boundaries per surface and allocate accordingly the volatile. */ npolys = nBounadryPolys; npoints = 0; for (i = 0; i < nBounadryPolys; i++) { /* The number of points to add is the number of visible points plus 2. */ npoints += 2; for (j = 0; j < surf->basePoints.poly_num_vertices[boundaryPolys[i]]; j++) if (verticeStatus[surf->basePoints.poly_vertices[boundaryPolys[i]][j]]) npoints += 1; } DBG_fprintf(stderr, "Isosurfaces: volatile polygons.\n"); DBG_fprintf(stderr, " | polys %d, points %d\n", npolys, npoints); visu_surfaces_points_allocate(&surf->volatilePlanes, surf->nsurf, npolys, npoints); surf->volatilePlanes.num_polys = 0; surf->volatilePlanes.num_points = 0; /* We copy the polygons and the vertices in the volatile part. */ for (i = 0; i < nBounadryPolys; i++) { ptFr = &surf->basePoints; isurf = -ptFr->poly_surf_index[boundaryPolys[i]] - 1; ptTo = &surf->volatilePlanes; iPoly = ptTo->num_polys; iVertice = ptTo->num_points; ptTo->num_polys_surf[isurf] += 1; ptTo->poly_surf_index[iPoly] = (int)isurf + 1; n = 2; for (j = 0; j < ptFr->poly_num_vertices[boundaryPolys[i]]; j++) if (verticeStatus[ptFr->poly_vertices[boundaryPolys[i]][j]]) n += 1; ptTo->poly_num_vertices[iPoly] = n; ptTo->poly_vertices[iPoly] = g_malloc(sizeof(int) * n); n = ptFr->poly_num_vertices[boundaryPolys[i]]; /* Compute new vertex. */ iv = 0; for (k = 0; k < n; k++) { /* If vertex is visible, we put it. */ if (verticeStatus[ptFr->poly_vertices[boundaryPolys[i]][k]]) { memcpy(ptTo->poly_points_data[iVertice], ptFr->poly_points_data[ptFr->poly_vertices[boundaryPolys[i]][k]], sizeof(float) * (VISU_SURFACES_POINTS_OFFSET_USER + ptTo->bufferSize)); g_return_val_if_fail(iv < ptTo->poly_num_vertices[iPoly], redraw); ptTo->poly_vertices[iPoly][iv] = iVertice; iVertice += 1; iv += 1; } /* If next vertex brings a visibility change, we compute intersection. */ if ((!verticeStatus[ptFr->poly_vertices[boundaryPolys[i]][k]] && verticeStatus[ptFr->poly_vertices[boundaryPolys[i]][(k + 1)%n]])) { /* We take the previous and compute the intersection. */ valid = visu_plane_class_getIntersection (planes, ptFr->poly_points_data[ptFr->poly_vertices[boundaryPolys[i]][(k + 1)%n]], ptFr->poly_points_data[ptFr->poly_vertices[boundaryPolys[i]][k]], ptTo->poly_points_data[iVertice], TRUE); g_return_val_if_fail(valid, redraw); /* Other values than coordinates are copied. */ memcpy(ptTo->poly_points_data[iVertice] + 3, ptFr->poly_points_data[ptFr->poly_vertices[boundaryPolys[i]][(k + 1)%n]] + 3, sizeof(float) * (VISU_SURFACES_POINTS_OFFSET_USER + ptTo->bufferSize - 3)); g_return_val_if_fail(iv < ptTo->poly_num_vertices[iPoly], redraw); ptTo->poly_vertices[iPoly][iv] = iVertice; iVertice += 1; iv += 1; } if ((verticeStatus[ptFr->poly_vertices[boundaryPolys[i]][k]] && !verticeStatus[ptFr->poly_vertices[boundaryPolys[i]][(k + 1)%n]])) { /* We take the previous and compute the intersection. */ valid = visu_plane_class_getIntersection (planes, ptFr->poly_points_data[ptFr->poly_vertices[boundaryPolys[i]][k]], ptFr->poly_points_data[ptFr->poly_vertices[boundaryPolys[i]][(k + 1)%n]], ptTo->poly_points_data[iVertice], TRUE); g_return_val_if_fail(valid, redraw); memcpy(ptTo->poly_points_data[iVertice] + 3, ptFr->poly_points_data[ptFr->poly_vertices[boundaryPolys[i]][k]] + 3, sizeof(float) * (VISU_SURFACES_POINTS_OFFSET_USER + ptTo->bufferSize - 3)); g_return_val_if_fail(iv < ptTo->poly_num_vertices[iPoly], redraw); ptTo->poly_vertices[iPoly][iv] = iVertice; iVertice += 1; iv += 1; } } ptTo->num_polys += 1; ptTo->num_points = iVertice; } g_free(verticeStatus); g_free(boundaryPolys); #if DEBUG == 1 visu_surfaces_checkConsistency(surf); #endif if (redraw) g_signal_emit(G_OBJECT(surf), surfaces_signals[SURFACE_MASKED_SIGNAL], 0, NULL); return redraw; } /** * visu_surfaces_getN: * @surf: the surface object. * * Retrieves th number of surfaces stired in a given @surf object. * * Returns: number of surfaces. */ guint visu_surfaces_getN(VisuSurfaces *surf) { if (!surf) return 0; return surf->nsurf; } /** * visu_surfaces_getName: * @surf: the surface object ; * @surf_index: the number of the surface. * * This returns for the given @surf_index its name * (1 <= surf_index <= surfaces_number) * * Returns: the name of the surface or empty name or NULL, if @surf_index is invalid. */ const gchar* visu_surfaces_getName(VisuSurfaces *surf, int surf_index) { int id; g_return_val_if_fail(surf, (gchar*)0); id = visu_surfaces_getPosition(surf, surf_index); g_return_val_if_fail(id >= 0 && (guint)id < surf->nsurf, (gchar*)0); /* fprintf(stderr, "%d %d %p '%s'\n", surf_index, id, (gpointer)surf->resources[id], surf->resources[id]->surfnom); */ return surf->resources[id]->surfnom; } /** * visu_surfaces_getRendered: * @surf: the surface object ; * @surf_index: the number of the surface. * * This returns for the given @surf_index its visibility. * * Returns: the visibility of the surface or FALSE, if @surf_index is invalid. */ gboolean visu_surfaces_getRendered(VisuSurfaces *surf, int surf_index) { int id; g_return_val_if_fail(surf, FALSE); id = visu_surfaces_getPosition(surf, surf_index); g_return_val_if_fail(id >= 0 && (guint)id < surf->nsurf, FALSE); return surf->resources[id]->rendered; } /** * visu_surfaces_setRendered: * @surf: the surface object ; * @surf_index: the number of the surface. * @status: a boolean. * * Change the visibility status of surface @surf_index. * * Since: 3.7 * * Returns: TRUE if the visibility has been indeed changed. */ gboolean visu_surfaces_setRendered(VisuSurfaces *surf, int surf_index, gboolean status) { guint id; id = visu_surfaces_getPosition(surf, surf_index); g_return_val_if_fail(VISU_IS_SURFACES_TYPE(surf) && id < surf->nsurf, FALSE); if (surf->resources[id]->rendered == status) return FALSE; surf->resources[id]->rendered = status; g_signal_emit(G_OBJECT(surf), surfaces_signals[SURFACE_RENDERING_SIGNAL], 0, surf_index, NULL); return TRUE; } /** * visu_surfaces_setColorAndMaterial: * @surf: the surface object ; * @surf_index: the number of the surface. * @color: (transfer none): a #ToolColor object. * @material: (array fixed-size=5): the material values. * * Update the color and material property of given surface. * * Since: 3.7 * * Returns: TRUE if the values are differents. */ gboolean visu_surfaces_setColorAndMaterial(VisuSurfaces *surf, int surf_index, ToolColor *color, float material[VISU_GL_LIGHT_MATERIAL_N_VALUES]) { guint id, i; id = visu_surfaces_getPosition(surf, surf_index); g_return_val_if_fail(VISU_IS_SURFACES_TYPE(surf) && id < surf->nsurf, FALSE); if (tool_color_equal(surf->resources[id]->color, color) && surf->resources[id]->material[0] == material[0] && surf->resources[id]->material[1] == material[1] && surf->resources[id]->material[2] == material[2] && surf->resources[id]->material[3] == material[3] && surf->resources[id]->material[4] == material[4]) return FALSE; for (i = 0; i < 4; i++) surf->resources[id]->color->rgba[i] = color->rgba[i]; for (i = 0; i < VISU_GL_LIGHT_MATERIAL_N_VALUES; i++) surf->resources[id]->material[i] = material[i]; g_signal_emit(G_OBJECT(surf), surfaces_signals[SURFACE_RENDERING_SIGNAL], 0, surf_index, NULL); return TRUE; } /** * visu_surfaces_getResource: * @surf: the surface object ; * @i: the ith stored surface. * * This returns the resource of the ith stored surface. If the surface * is known by its id, use visu_surfaces_getResourceById() instead. * * Since: 3.7 * * Returns: (transfer none): the resource of the surface or NULL, if * @i is invalid. */ VisuSurfacesResources* visu_surfaces_getResource(VisuSurfaces *surf, guint i) { g_return_val_if_fail(VISU_IS_SURFACES_TYPE(surf), (VisuSurfacesResources*)0); g_return_val_if_fail(i < surf->nsurf, (VisuSurfacesResources*)0); return surf->resources[i]; } /** * visu_surfaces_getResourceById: * @surf: the surface object ; * @surf_index: the id of the surface. * * This returns for the given @surf_index its resource information. * * Returns: (transfer none): the resource of the surface or NULL, if * @surf_index is invalid. */ VisuSurfacesResources* visu_surfaces_getResourceById(VisuSurfaces *surf, int surf_index) { int id; g_return_val_if_fail(surf, (VisuSurfacesResources*)0); id = visu_surfaces_getPosition(surf, surf_index); g_return_val_if_fail(id >= 0 && (guint)id < surf->nsurf, (VisuSurfacesResources*)0); /* fprintf(stderr, "%d %p\n", id, (gpointer)surf->resources); */ return surf->resources[id]; } /** * visu_surfaces_setResource: * @surf: the surface object ; * @surf_index: the number of the surface ; * @res: the new resource. * * This method is used to change the resource of a surface. */ void visu_surfaces_setResource(VisuSurfaces *surf, int surf_index, VisuSurfacesResources *res) { int id; g_return_if_fail(surf && res); id = visu_surfaces_getPosition(surf, surf_index); g_return_if_fail(id >= 0 && (guint)id < surf->nsurf); if (!surf->resources[id]->surfnom) visu_surfaces_resources_free(surf->resources[id]); DBG_fprintf(stderr, "VisuSurfaces: set resource %p (%s) to surface %d (%d).\n", (gpointer)res, res->surfnom, surf_index, id); surf->resources[id] = res; g_signal_emit(G_OBJECT(surf), surfaces_signals[SURFACE_RENDERING_SIGNAL], 0, surf_index, NULL); } /** * visu_surfaces_getId: * @surf: the surface object ; * @i: the number of the surface. * * This returns for the given @i its id information. * * Returns: the id of the surface or 0, if @i is invalid. */ int visu_surfaces_getId(VisuSurfaces *surf, int i) { g_return_val_if_fail(i >= 0 && (guint)i < surf->nsurf, -1); return surf->ids[i]; } /** * visu_surfaces_getSortedById: * @surf: the surface object. * * This returns the surface numbers sorted using their ids. * * Returns: a newly allocated array with surface numbers. */ int* visu_surfaces_getSortedById(VisuSurfaces *surf) { int *ids, tmp; guint i, j; g_return_val_if_fail(surf, (int*)0); ids = g_malloc(sizeof(int) * surf->nsurf); for (i = 0; i < surf->nsurf; i++) ids[i] = surf->ids[i]; /* Idiotic algorithm to sort all surfaces. */ for (i = 0; i < surf->nsurf; i++) for (j = 0; j < surf->nsurf; j++) if (ids[j] > ids[i]) { tmp = ids[i]; ids[i] = ids[j]; ids[j] = tmp; } return ids; } /** * visu_surfaces_getNewId: * @surf: the surface object. * * This returns a unique id to create a new surface. * * Returns: a value suitable to create a new surface in this set of surfaces. */ int visu_surfaces_getNewId(VisuSurfaces *surf) { guint i; int id; if (!surf) return 0; id = -1; for (i = 0; i < surf->nsurf; i++) id = MAX(surf->ids[i], id); DBG_fprintf(stderr, "VisuSurfaces : get new id for surfaces %d.\n", id + 1); return id + 1; } /** * visu_surfaces_getPosition: * @surf: the surface object ; * @id: the id of the surface. * * This returns for the given @id its number. * * Returns: the number of the surface or 0, if @id is invalid. */ int visu_surfaces_getPosition(VisuSurfaces *surf, int id) { guint i; g_return_val_if_fail(surf, -1); for (i = 0; i < surf->nsurf; i++) if (surf->ids[i] == id) return i; g_warning("Unfound surface with id %d.", id); return -1; } v_sim-3.7.0/src/extraFunctions/surfaces.h0000644000353400050620000001500712215546074015361 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD, Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD and Damien CALISTE and Olivier D'Astier, laboratoire L_Sim, (2001-2005) E-mail addresses : BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef SURFACES_H #define SURFACES_H #include #include #include "surfaces_resources.h" #include "surfaces_points.h" #include #include #include #include /** * VISU_TYPE_SURFACES: * * return the type of #VisuSurfaces. */ #define VISU_TYPE_SURFACES (visu_surfaces_get_type ()) /** * SURFACES: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuSurfaces type. */ #define VISU_SURFACES(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_SURFACES, VisuSurfaces)) /** * VISU_SURFACES_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuSurfacesClass. */ #define VISU_SURFACES_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_SURFACES, VisuSurfacesClass)) /** * VISU_IS_SURFACES_TYPE: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuSurfaces object. */ #define VISU_IS_SURFACES_TYPE(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_SURFACES)) /** * VISU_IS_SURFACES_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuSurfacesClass class. */ #define VISU_IS_SURFACES_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_SURFACES)) /** * VISU_SURFACES_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. */ #define VISU_SURFACES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_SURFACES, VisuSurfacesClass)) /** * VisuSurfacesClass: * * An opaque structure. */ typedef struct _VisuSurfacesClass VisuSurfacesClass; /** * VisuSurfaces: * * All fields are private, use the access routines. */ typedef struct _VisuSurfaces VisuSurfaces; /** * visu_surfaces_get_type: * * This method returns the type of #VisuSurfaces, use VISU_TYPE_SURFACES instead. * * Returns: the type of #VisuSurfaces. */ GType visu_surfaces_get_type(void); /** * VISU_ERROR_ISOSURFACES: (skip) * * Internal function for error handling. */ #define VISU_ERROR_ISOSURFACES visu_surfaces_getErrorQuark() GQuark visu_surfaces_getErrorQuark(void); enum { VISU_ERROR_FORMAT, VISU_ERROR_CHECKSUM }; /** * VISU_SURFACES_PROPERTY_POTENTIAL * * Flag used in an ASCII surf file to give informations on the value * the surface is built from. */ #define VISU_SURFACES_PROPERTY_POTENTIAL "potential_values" /* Some constructors, destructors. */ VisuSurfaces* visu_surfaces_new(guint bufferSize); void visu_surfaces_allocate(VisuSurfaces *surf, guint nsurf, guint npolys, guint npoints); void visu_surfaces_add(VisuSurfaces *surf, guint nsurf, guint npolys, guint npoints); gboolean visu_surfaces_loadFile(const char *file, VisuSurfaces **surf, GError **error); guint visu_surfaces_getN(VisuSurfaces *surf); VisuSurfacesResources* visu_surfaces_getResource(VisuSurfaces *surf, guint i); int visu_surfaces_getId(VisuSurfaces *surf, int i); const gchar* visu_surfaces_getName(VisuSurfaces *surf, int surf_index); gboolean visu_surfaces_getRendered(VisuSurfaces *surf, int surf_index); gboolean visu_surfaces_setRendered(VisuSurfaces *surf, int surf_index, gboolean status); VisuSurfacesResources* visu_surfaces_getResourceById(VisuSurfaces *surf, int surf_index); void visu_surfaces_setResource(VisuSurfaces *surf, int surf_index, VisuSurfacesResources *res); int* visu_surfaces_getSortedById(VisuSurfaces *surf); int visu_surfaces_getNewId(VisuSurfaces *surf); int visu_surfaces_getPosition(VisuSurfaces *surf, int id); gboolean visu_surfaces_setColorAndMaterial(VisuSurfaces *surf, int surf_index, ToolColor *color, float material[VISU_GL_LIGHT_MATERIAL_N_VALUES]); float* visu_surfaces_getPropertyFloat(VisuSurfaces *surf, const gchar *name); float* visu_surfaces_addPropertyFloat(VisuSurfaces *surf, const gchar* name); gboolean visu_surfaces_getPropertyValueFloat(VisuSurfaces *surf, int idSurf, const gchar *name, float *value); gboolean visu_surfaces_hide(VisuSurfaces *surf, VisuPlane **planes); gboolean visu_surfaces_remove(VisuSurfaces *surf, int idSurf); void visu_surfaces_checkConsistency(VisuSurfaces* surf); void visu_surfaces_setShowAll(VisuSurfaces *surf, gboolean show); /* Private area. */ struct _VisuSurfaces { GObject parent; gboolean dispose_has_run; /* Number of different surfaces. */ guint nsurf; VisuSurfacesPoints basePoints; VisuSurfacesPoints volatilePlanes; /* The description of the box where surfaces are drawn. */ VisuBox *box; /* Resources for each surfaces. */ VisuSurfacesResources **resources; /* Id for each surfaces. */ int *ids; /* Table to add properties to surfaces. */ GHashTable *properties; }; #endif v_sim-3.7.0/src/extraFunctions/dataNode.c0000644000353400050620000006217312215546074015266 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "dataNode.h" #include #include /** * SECTION:dataNode * @short_description: Extends capabilities of node properties. * * This module is a wrapper around node properties from * #VisuData. It adds some capabilities, such as a translatable name, * a way to go from data to strings and reverse, callbacks when the * properties is changed... * When creating a node property calling * visu_node_array_property_newPointer() for instance, a #VisuDataNode can be created using * visu_data_node_new(). A #VisuDataNode may not be attached to a specific * #VisuData and is a global property found on each #VisuData (or * potentialy found). The advantage of doing this is to keep track of * available properties for #VisuData objects. To get all public * properties, call visu_data_node_class_getAll(). */ struct _VisuDataNodeClass { GObjectClass parent; }; struct internalUsedVisuData_struct { /* The #VisuData using this VisuDataNode. */ VisuData *dataObj; /* Its associated dimension. */ gint dimension; /* A handler on the signal emitted when the VisuData is freed. */ gulong freeingSignal; }; struct _VisuDataNode { GObject parent; /* Internal object gestion. */ gboolean dispose_has_run; /* The key used to store the node property. */ gchar *id; /* The type of stored data. */ GType type; /* These are the routines called when a string is get from values or values set from a string. */ VisuDataNodeToStringFunc getAsString; VisuDataNodeFromStringFunc setAsString; /* The label. */ const gchar *label; /* The dimension (must be set to use visu_data_node_setValueAsString() or visu_data_node_getValueAsString()), can vary. */ GList *lstVisuData; /* If TRUE the data are editable and signal may be emitted. */ gboolean editable; /* To be removed. */ /* Callbacks method and data associated. */ VisuDataNodeCallbackMethod callback; gpointer data; }; enum { VISU_DATA_NODE_USED_SIGNAL, VISU_DATA_NODE_UNUSED_SIGNAL, VISU_DATA_NODE_EDITED_SIGNAL, VISU_DATA_NODE_VALUE_CHANGED_SIGNAL, VISU_DATA_NODE_NB_SIGNAL }; /* Internal variables. */ static GList *storedData = (GList*)0; static GObjectClass *parent_class = NULL; static guint dataNode_signals[VISU_DATA_NODE_NB_SIGNAL] = { 0 }; /* Object gestion methods. */ static void data_node_dispose (GObject* obj); static void data_node_finalize (GObject* obj); /* Local routines. */ static gchar* valueAsString(VisuDataNode *data, VisuData *dataObj, VisuNode *node); static gboolean valueFromString(VisuDataNode *data, VisuData *dataObj, VisuNode *node, gchar *labelIn, gchar **labelOut, gboolean *modify); /* Local callbacks. */ static void onVisuDataFreed(VisuData *dataObj, gpointer data); G_DEFINE_TYPE(VisuDataNode, visu_data_node, G_TYPE_OBJECT) static void visu_data_node_class_init(VisuDataNodeClass *klass) { GType paramObj[1] = {G_TYPE_OBJECT}; DBG_fprintf(stderr, "Data Node: creating the class of the object.\n"); parent_class = g_type_class_peek_parent(klass); DBG_fprintf(stderr, " - adding new signals ;\n"); /** * VisuDataNode::propertyUsed: * @data: the #VisuDataNode emitting the signal. * @dataObj: the #VisuData its working on. * * The given property @data gets used by @dataObj. * * Since: 3.3 */ dataNode_signals[VISU_DATA_NODE_USED_SIGNAL] = g_signal_newv("propertyUsed", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, NULL, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, paramObj); /** * VisuDataNode::propertyUnused: * @data: the #VisuDataNode emitting the signal. * @dataObj: the #VisuData its working on. * * The given property @data gets unused by @dataObj. * * Since: 3.3 */ dataNode_signals[VISU_DATA_NODE_UNUSED_SIGNAL] = g_signal_newv("propertyUnused", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, NULL, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, paramObj); /** * VisuDataNode::valueChanged: * @data: the #VisuDataNode emitting the signal. * @dataObj: the #VisuData its working on. * * The given property @data used by @dataObj has its value changed. * * Since: 3.3 */ dataNode_signals[VISU_DATA_NODE_VALUE_CHANGED_SIGNAL] = g_signal_newv("valueChanged", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, NULL, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, paramObj); /* Connect freeing methods. */ G_OBJECT_CLASS(klass)->dispose = data_node_dispose; G_OBJECT_CLASS(klass)->finalize = data_node_finalize; } static void visu_data_node_init(VisuDataNode *obj) { #if DEBUG == 1 GList *tmpLst; #endif obj->dispose_has_run = FALSE; obj->id = (gchar*)0; obj->type = (GType)0; obj->setAsString = (VisuDataNodeFromStringFunc)0; obj->getAsString = (VisuDataNodeToStringFunc)0; obj->label = (gchar*)0; obj->lstVisuData = (GList*)0; obj->editable = FALSE; obj->callback = (VisuDataNodeCallbackMethod)0; obj->data = (gpointer)0; /* Add object from allObjects list. */ storedData = g_list_prepend(storedData, (gpointer)obj); DBG_fprintf(stderr, "Visu DataNode: add %p to the list of dataNode %p.\n", (gpointer)obj, (gpointer)storedData); #if DEBUG == 1 for (tmpLst = storedData; tmpLst; tmpLst = g_list_next(tmpLst)) g_return_if_fail(VISU_IS_DATA_NODE_TYPE(tmpLst->data)); #endif } /* This method can be called several times. It should unref all of its reference to GObjects. */ static void data_node_dispose(GObject* obj) { DBG_fprintf(stderr, "Data Node: dispose object %p.\n", (gpointer)obj); if (VISU_DATA_NODE(obj)->dispose_has_run) return; VISU_DATA_NODE(obj)->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS(parent_class)->dispose(obj); } /* This method is called once only. */ static void data_node_finalize(GObject* obj) { GList *lst; g_return_if_fail(obj); DBG_fprintf(stderr, "Data Node: finalize object %p.\n", (gpointer)obj); g_free(VISU_DATA_NODE(obj)->id); for (lst = VISU_DATA_NODE(obj)->lstVisuData; lst; lst = g_list_next(lst)) g_free(lst->data); g_list_free(VISU_DATA_NODE(obj)->lstVisuData); /* Remove object from allObjects list. */ storedData = g_list_remove(storedData, (gpointer)obj); /* Chain up to the parent class */ G_OBJECT_CLASS(parent_class)->finalize(obj); } /** * visu_data_node_new: * @name: a string used to store the data as a node property ; * @type: the type of data stored (array or not). * * This method creates a new #VisuDataNode and registers it. A #VisuDataNode is * characterised by a string used as a key to store it as a node property * (see visu_node_array_property_newPointer()). The stored data can be arrays or not. * Notice that @name is copied. * * Returns: (transfer full): a newly created #VisuDataNode. */ GObject* visu_data_node_new(const gchar *name, GType type) { VisuDataNode *data; g_return_val_if_fail(name, (GObject*)0); g_return_val_if_fail(type == G_TYPE_INT || type == G_TYPE_FLOAT || type == G_TYPE_BOOLEAN || type == G_TYPE_STRING, (GObject*)0); /* Create the object with defaulty values. */ data = VISU_DATA_NODE(g_object_new(VISU_DATA_NODE_TYPE, NULL)); g_return_val_if_fail(data, (GObject*)0); /* Set specific values. */ data->id = g_strdup(name); data->type = type; data->setAsString = valueFromString; data->getAsString = valueAsString; return G_OBJECT(data); } /** * visu_data_node_newWithCallbacks: * @name: a string used to store the data as a node property ; * @setAsString: (scope call): a custom routine to change node values from a string ; * @getAsString: (scope call): a custom routine to create a string from node values. * * As visu_data_node_new(), but with custom @setAsString and @getAsString routines. This * is used to allow to treat every node related values, not just node properties. * * Returns: (transfer full): a newly created #VisuDataNode. */ GObject* visu_data_node_newWithCallbacks(const gchar *name, VisuDataNodeFromStringFunc setAsString, VisuDataNodeToStringFunc getAsString) { VisuDataNode *data; g_return_val_if_fail(name, (GObject*)0); g_return_val_if_fail(setAsString && getAsString, (GObject*)0); /* Create the object with defaulty values. */ data = VISU_DATA_NODE(g_object_new(VISU_DATA_NODE_TYPE, NULL)); g_return_val_if_fail(data, (GObject*)0); /* Set specific values. */ data->id = g_strdup(name); data->type = (GType)0; data->setAsString = setAsString; data->getAsString = getAsString; return G_OBJECT(data); } /** * visu_data_node_class_getAll: * * All registered #VisuDataNode are stored in an intern list. This method is * used to retrieve it. * * Returns: (transfer none) (element-type VisuDataNode*): a #GList of * all registereed #VisuDataNode (this list is owned by V_Sim). */ GList* visu_data_node_class_getAll(void) { DBG_fprintf(stderr, "Visu DataNode: get list of DataNode properties (%p %d).\n", (gpointer)storedData, g_list_length(storedData)); return storedData; } /** * visu_data_node_setLabel: * @data: a #VisuDataNode ; * @label: an UTF8 string (may be translated). * * A #VisuDataNode can have a label, if not its name is used. * Notice that @label is not copied. */ void visu_data_node_setLabel(VisuDataNode *data, const gchar *label) { g_return_if_fail(VISU_IS_DATA_NODE_TYPE(data)); data->label = label; } /** * visu_data_node_getLabel: * @data: a #VisuDataNode ; * * A #VisuDataNode can have a label, if not its name is used. * * Returns: the label of the node (in UTF8), this string is owned by V_Sim. */ const gchar* visu_data_node_getLabel(VisuDataNode *data) { g_return_val_if_fail(VISU_IS_DATA_NODE_TYPE(data), (const gchar*)0); if (data->label) return data->label; else return data->id; } static struct internalUsedVisuData_struct *getInternalStorage(VisuDataNode *data, VisuData *dataObj) { struct internalUsedVisuData_struct *storage; GList *tmpLst; storage = (struct internalUsedVisuData_struct*)0; tmpLst = data->lstVisuData; while (!storage && tmpLst) { if (((struct internalUsedVisuData_struct*)tmpLst->data)->dataObj == dataObj) storage = (struct internalUsedVisuData_struct*)tmpLst->data; tmpLst = g_list_next(tmpLst); } return storage; } /** * visu_data_node_setUsed: * @data: a #VisuDataNode ; * @dataObj: a #VisuData object ; * @nb: a positive or null integer. * * A #VisuDataNode stores data for each node of a given #VisuData. The number of data stored for * each node is set with this method. When some part wants to set a new node property * and wants to make it public, this method can be called. It also can be called when * the node property is removed (using a null @nb argument). * If @nb is changed for a positive value, the "propertyUsed" * signal is emitted with @dataObj as argument, instead if the value is changed * for null, the "propertyUnused" signal is triggered also with @dataObj as argument. */ void visu_data_node_setUsed(VisuDataNode *data, VisuData *dataObj, gint nb) { struct internalUsedVisuData_struct *storage; g_return_if_fail(VISU_IS_DATA_NODE_TYPE(data) && VISU_IS_DATA(dataObj)); storage = getInternalStorage(data, dataObj); if (nb > 0) { DBG_fprintf(stderr, "Data Node: associating %p to the node property '%s' (%d).\n", (gpointer)dataObj, data->id, g_list_length(data->lstVisuData)); /* Add a new associated #VisuData or change an already associated one. */ if (!storage) { storage = g_malloc(sizeof(struct internalUsedVisuData_struct)); storage->dataObj = dataObj; storage->dimension = nb; storage->freeingSignal = g_signal_connect(G_OBJECT(dataObj), "objectFreed", G_CALLBACK(onVisuDataFreed), (gpointer)data); data->lstVisuData = g_list_prepend(data->lstVisuData, (gpointer)storage); DBG_fprintf(stderr, "Data Node: %p emit the 'propertyUsed'.\n", (gpointer)data); g_signal_emit(data, dataNode_signals[VISU_DATA_NODE_USED_SIGNAL], 0 , dataObj, NULL); } else storage->dimension = nb; } else { if (!storage) return; g_signal_handler_disconnect(storage->dataObj, storage->freeingSignal); data->lstVisuData = g_list_remove(data->lstVisuData, storage); g_free(storage); DBG_fprintf(stderr, "Data Node: removing association with %p of the" " node property '%s' (%d).\n", (gpointer)dataObj, data->id, g_list_length(data->lstVisuData)); DBG_fprintf(stderr, "Data Node: %p emit the 'propertyUnused'.\n", (gpointer)data); g_signal_emit(data, dataNode_signals[VISU_DATA_NODE_UNUSED_SIGNAL], 0 , dataObj, NULL); } } /** * visu_data_node_getUsed: * @data: a #VisuDataNode ; * @dataObj: a #VisuData object. * * Access method to know if the given @dataObj has a public node property of the type * @data. * * Returns: TRUE if @dataObj has a node property of the given type. */ gboolean visu_data_node_getUsed(VisuDataNode *data, VisuData *dataObj) { struct internalUsedVisuData_struct *storage; g_return_val_if_fail(VISU_IS_DATA_NODE_TYPE(data) && VISU_IS_DATA(dataObj), FALSE); storage = getInternalStorage(data, dataObj); return (storage != (struct internalUsedVisuData_struct *)0); } /** * visu_data_node_emitValueChanged: * @data: a #VisuDataNode ; * @dataObj: a #VisuData object. * * Emit the 'valueChanged' signal. This method should be called after * all changes have been done to a node property set of nodes. Then routines * using this property can update itself. */ void visu_data_node_emitValueChanged(VisuDataNode *data, VisuData *dataObj) { DBG_fprintf(stderr, "Data Node: %p emit the 'valueChanged'.\n", (gpointer)data); g_signal_emit(data, dataNode_signals[VISU_DATA_NODE_VALUE_CHANGED_SIGNAL], 0 , dataObj, NULL); } /** * visu_data_node_setValueAsString: * @data: a #VisuDataNode ; * @dataObj: a #VisuData object ; * @node: a #VisuNode ; * @labelIn: a formatted string ; * @labelOut: a pointer to store a string. * * If the string is correctly formatted (that means it has the same format as * the string returned by visu_data_node_getValueAsString()) the stored values are modified. * The resulting string is created and put into @labelOut. If the input string @labelIn * is unparsable, @labelOut will contain current values. Notice that this method is * callable only if the @data is editable (see visu_data_node_getEditable()). * * Returns: TRUE if the string was correctly parsed. */ gboolean visu_data_node_setValueAsString(VisuDataNode *data, VisuData *dataObj, VisuNode *node, gchar *labelIn, gchar **labelOut) { gboolean valid, modify; g_return_val_if_fail(VISU_IS_DATA_NODE_TYPE(data) && VISU_IS_DATA(dataObj) && node, FALSE); g_return_val_if_fail(labelIn && labelOut, FALSE); g_return_val_if_fail(data->setAsString, FALSE); DBG_fprintf(stderr, "Node Data: read value from '%s' for data '%s'.\n", labelIn, data->id); valid = data->setAsString(data, dataObj, node, labelIn, labelOut, &modify); DBG_fprintf(stderr, "Node Data: read %d to '%s' (%d).\n", valid, *labelOut, modify); /* Call the callback if values have been modified. */ if (valid && modify) { /* To be removed. */ if (data->callback) data->callback(dataObj, node, data->data); /* Emit the modified signal instead. */ } return valid; } /** * visu_data_node_getValueAsString: * @data: a #VisuDataNode ; * @dataObj: a #VisuData object ; * @node: a #VisuNode. * * For the given node, the values stored are printed into a string. * * Returns: a newly created string. */ gchar* visu_data_node_getValueAsString(VisuDataNode *data, VisuData *dataObj, VisuNode *node) { g_return_val_if_fail(VISU_IS_DATA_NODE_TYPE(data) && dataObj && node, (gchar*)0); g_return_val_if_fail(data->getAsString, (gchar*)0); return data->getAsString(data, dataObj, node); } /** * visu_data_node_setCallback: * @data: a #VisuDataNode ; * @callback: (scope call): a #VisuDataNodeCallbackMethod method ; * @user_data: a pointer to a location used to store some user data. * * When visu_data_node_setValueAsString(), values may be modified. If true, the given * callback method is called with @user_data as argument. */ void visu_data_node_setCallback(VisuDataNode *data, VisuDataNodeCallbackMethod callback, gpointer user_data) { g_return_if_fail(VISU_IS_DATA_NODE_TYPE(data)); data->editable = TRUE; data->callback = callback; data->data = user_data; } /** * visu_data_node_getEditable: * @data: a #VisuDataNode. * * If some callback method has been given with visu_data_node_setCallback(), then * the values are considered editable. * * Returns: TRUE if values are editable. */ gboolean visu_data_node_getEditable(VisuDataNode *data) { g_return_val_if_fail(VISU_IS_DATA_NODE_TYPE(data), FALSE); return data->editable; } /** * visu_data_node_setEditable: * @data: a #VisuDataNode ; * @status: a boolean value. * * Set if the values are modifiable. */ void visu_data_node_setEditable(VisuDataNode *data, gboolean status) { g_return_if_fail(VISU_IS_DATA_NODE_TYPE(data)); data->editable = status; } static void onVisuDataFreed(VisuData *dataObj, gpointer data) { /* The given visuData is to be freed, so we remove it from the list of associated VisuData. */ visu_data_node_setUsed(VISU_DATA_NODE(data), dataObj, 0); } /*********************/ /* Private routines. */ /*********************/ /* Internal fallback routines for the set and get as string when the types are integer, float or boolean node properties. */ static gchar* valueAsString(VisuDataNode *data, VisuData *dataObj, VisuNode *node) { GString *str; int i; gchar *value; gpointer dataValues; struct internalUsedVisuData_struct *storage; GValue val = {0, {{0}, {0}}}; g_return_val_if_fail(VISU_IS_DATA_NODE_TYPE(data) && dataObj && node, (gchar*)0); /* Check if the given property has an association with the given VisuData. */ DBG_fprintf(stderr, "Data Node: get label for node property '%s'.\n", data->id); storage = getInternalStorage(data, dataObj); if (!storage || storage->dimension <= 0) { DBG_fprintf(stderr, "Data Node: no associated data.\n"); return (gchar*)0; } g_value_init(&val, G_TYPE_POINTER); visu_node_array_getPropertyValue(VISU_NODE_ARRAY(dataObj), node, data->id, &val); dataValues = g_value_get_pointer(&val); if (!dataValues) { if (data->type != G_TYPE_STRING) return (gchar*)0; else return g_strdup(""); } /* Set the format attribute. */ str = g_string_new(""); if (storage->dimension > 1) g_string_append(str, "( "); for (i = 0; i < storage->dimension; i++) { switch (data->type) { case G_TYPE_INT: g_string_append_printf(str, "%d", ((int*)dataValues)[i]); break; case G_TYPE_FLOAT: g_string_append_printf(str, "%.3g", ((float*)dataValues)[i]); break; case G_TYPE_BOOLEAN: if (((gboolean*)dataValues)[i]) /* T for True. */ g_string_append(str, _("T")); else /* F for False. */ g_string_append(str, _("F")); break; case G_TYPE_STRING: g_string_append(str, (gchar*)dataValues); break; default: g_warning("Unsupported type for VisuDataNode"); } if (i < storage->dimension - 1) g_string_append(str, " ; "); } if (storage->dimension > 1) g_string_append(str, " )"); value = str->str; g_string_free(str, FALSE); DBG_fprintf(stderr, "Data Node: get values '%s'.\n", value); return value; } static gboolean valueFromString(VisuDataNode *data, VisuData *dataObj, VisuNode *node, gchar *labelIn, gchar **labelOut, gboolean *modify) { int res, ln, i, valueInt; gchar **datas, *str; gpointer dataValues; gboolean error; struct internalUsedVisuData_struct *storage; float valueFloat; GValue val = {0, {{0}, {0}}}; g_return_val_if_fail(VISU_IS_DATA_NODE_TYPE(data) && VISU_IS_DATA(dataObj) && node, FALSE); g_return_val_if_fail(labelIn && labelOut && modify, FALSE); if (!data->editable) { *labelOut = g_strdup(_("No data")); g_warning("Can't call 'visu_data_node_setValueAsString' since the property" " '%s' is not editable.", data->id); return FALSE; } /* Check if the given property has an association with the given VisuData. */ storage = getInternalStorage(data, dataObj); if (!storage) { *labelOut = g_strdup(_("No data")); g_warning("Can't call 'visu_data_node_setValueAsString' since the property" " '%s' has not been associated with the given VisuData.", data->id); return FALSE; } /* Grep the property from the low level storage in the VisuData. */ g_value_init(&val, G_TYPE_POINTER); visu_node_array_getPropertyValue(VISU_NODE_ARRAY(dataObj), node, data->id, &val); dataValues = g_value_get_pointer(&val); if (data->type != G_TYPE_STRING && !dataValues) { *labelOut = g_strdup(_("No data")); g_warning("Can't call 'visu_data_node_setValueAsString' since %p has no" " node property labelled '%s'", (gpointer)dataObj, data->id); return FALSE; } /* Parse the given labelIn. remove first and last parenthesis. */ if (labelIn[0] == '(') labelIn += 1; ln = strlen(labelIn); if (labelIn[ln - 1] == ')') labelIn[ln - 1] = '\0'; datas = g_strsplit(labelIn, ";", storage->dimension); *modify = FALSE; for (i = 0; datas[i]; i++) { DBG_fprintf(stderr, "Data Node: reading value '%s'.\n", datas[i]); error = FALSE; switch (data->type) { case G_TYPE_INT: res = sscanf(datas[i], "%d", &valueInt); if (res != 1) error = TRUE; else if (((int*)dataValues)[i] != valueInt) { ((int*)dataValues)[i] = valueInt; *modify = TRUE; } break; case G_TYPE_FLOAT: res = sscanf(datas[i], "%f", &valueFloat); if (res != 1) error = TRUE; else if (((float*)dataValues)[i] != valueFloat) { ((float*)dataValues)[i] = valueFloat; *modify = TRUE; } break; case G_TYPE_BOOLEAN: /* T for True. */ if (!strcmp(datas[i], _("T"))) { if (!((gboolean*)dataValues)[i]) { ((gboolean*)dataValues)[i] = TRUE; *modify = TRUE; } } /* F for False. */ else if (!strcmp(datas[i], _("F"))) { if (((gboolean*)dataValues)[i]) { ((gboolean*)dataValues)[i] = FALSE; *modify = TRUE; } } else error = TRUE; break; case G_TYPE_STRING: str = g_strdup(datas[i]); g_strstrip(str); g_value_set_pointer(&val, (gpointer)str); visu_node_setpropertyValue(VISU_NODE_ARRAY(dataObj), node, data->id, &val); break; default: g_warning("Unsupported type for VisuDataNode"); error = TRUE; } if (error) { *labelOut = valueAsString(data, dataObj, node); g_strfreev(datas); return FALSE; } } g_strfreev(datas); /* Special case of empty string. */ if (data->type == G_TYPE_STRING && i == 0) { g_value_set_pointer(&val, (gpointer)0); visu_node_setpropertyValue(VISU_NODE_ARRAY(dataObj), node, data->id, &val); i = 1; } if (i != storage->dimension) error = TRUE; else error = FALSE; *labelOut = valueAsString(data, dataObj, node); return !error; } v_sim-3.7.0/src/extraFunctions/dataNode.h0000644000353400050620000001473412215546074015273 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef DATANODE_H #define DATANODE_H #include #include /* This module is a wrapper around node properties from VisuData. It adds some capabilities, such as a translatable name, a way to go from data to strings and reverse, callbacks when the properties is changed... */ G_BEGIN_DECLS /** * VISU_DATA_NODE_TYPE: * * return the type of #VisuDataNode. */ #define VISU_DATA_NODE_TYPE (visu_data_node_get_type ()) /** * VISU_DATA_NODE: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuDataNode type. */ #define VISU_DATA_NODE(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_DATA_NODE_TYPE, VisuDataNode)) /** * VISU_DATA_NODE_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuDataNodeClass. */ #define VISU_DATA_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_DATA_NODE_TYPE, VisuDataNodeClass)) /** * VISU_IS_DATA_NODE_TYPE: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuDataNode object. */ #define VISU_IS_DATA_NODE_TYPE(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_DATA_NODE_TYPE)) /** * VISU_IS_DATA_NODE_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuDataNodeClass class. */ #define VISU_IS_DATA_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_DATA_NODE_TYPE)) /** * VISU_DATA_NODE_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. */ #define VISU_DATA_NODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_DATA_NODE_TYPE, VisuDataNodeClass)) /** * VisuDataNodeClass: * * An opaque structure. */ typedef struct _VisuDataNodeClass VisuDataNodeClass; /** * VisuDataNode: * * An opaque structure. */ typedef struct _VisuDataNode VisuDataNode; /** * VisuDataNodeFromStringFunc: * @data: a #VisuDataNode ; * @dataObj: a #VisuData object ; * @node: a #VisuNode ; * @labelIn: a formatted string ; * @labelOut: a pointer to store a string ; * @modify: TRUE if the values have been modified. * * If the string is correctly formatted (that means it has the same format as * the string returned by GetValueAsStringFunc()) the stored values are modified. * The resulting string is created and put into @labelOut. If the input string @labelIn * is unparsable, @labelOut will contain current values. * * Returns: TRUE if the string was correctly parsed (modified or not). */ typedef gboolean (*VisuDataNodeFromStringFunc)(VisuDataNode *data, VisuData *dataObj, VisuNode *node, gchar *labelIn, gchar **labelOut, gboolean *modify); /** * VisuDataNodeToStringFunc: * @data: a #VisuDataNode ; * @dataObj: a #VisuData object ; * @node: a #VisuNode. * * For the given node, the values stored are printed into a string. * * Returns: a newly created string (use g_free()). */ typedef gchar* (*VisuDataNodeToStringFunc)(VisuDataNode *data, VisuData *dataObj, VisuNode *node); /* Maybe removed if the stuff is converted to GObject. */ /** * VisuDataNodeCallbackMethod: * @dataObj: the #VisuData object on which the callback is done ; * @node: the #VisuNode on which the callback is done ; * @data: a user defined pointer. * * Interface for callbacks methods that are called whenever a data is changed * on a node. * * WARNING: it may be removed later. */ typedef void (*VisuDataNodeCallbackMethod)(VisuData *dataObj, VisuNode *node, gpointer data); /** * visu_data_node_get_type: * * This method returns the type of #VisuDataNode, use VISU_DATA_NODE_TYPE instead. * * Returns: the type of #VisuDataNode. */ GType visu_data_node_get_type(void); GObject* visu_data_node_new(const gchar *name, GType type); GObject* visu_data_node_newWithCallbacks(const gchar *name, VisuDataNodeFromStringFunc setAsString, VisuDataNodeToStringFunc getAsString); GList* visu_data_node_class_getAll(void); void visu_data_node_setLabel(VisuDataNode *data, const gchar *label); const gchar* visu_data_node_getLabel(VisuDataNode *data); void visu_data_node_setUsed(VisuDataNode *data, VisuData *dataObj, gint nb); gboolean visu_data_node_getUsed(VisuDataNode *data, VisuData *dataObj); gboolean visu_data_node_setValueAsString(VisuDataNode *data, VisuData *dataObj, VisuNode *node, gchar *labelIn, gchar **labelOut); gchar* visu_data_node_getValueAsString(VisuDataNode *data, VisuData *dataObj, VisuNode *node); void visu_data_node_setCallback(VisuDataNode *data, VisuDataNodeCallbackMethod callback, gpointer user_data); void visu_data_node_setEditable(VisuDataNode *data, gboolean status); gboolean visu_data_node_getEditable(VisuDataNode *data); void visu_data_node_emitValueChanged(VisuDataNode *data, VisuData *dataObj); G_END_DECLS #endif v_sim-3.7.0/src/extraFunctions/extraNode.c0000644000353400050620000001053412215546074015472 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2009) Adresse ml : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2009) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "extraNode.h" #include #include "dataNode.h" /** * SECTION:extraNode * @short_description: add further characteristics to the nodes. * * blabla */ #define LABEL_ID "extraNode_label" /* Local variables. */ static VisuDataNode *dataNodeLabel = NULL; static GValue dataLabel = {0, {{0}, {0}}}; static void freeLabel(gpointer obj, gpointer data _U_) { g_free(obj); } static gpointer newOrCopyLabel(gconstpointer orig, gpointer user_data _U_) { if (orig) return g_strdup(orig); else return (gpointer)0; } /** * visu_extra_node_addLabel: * @data: a #VisuData object. * * Add the possibility to store labels for nodes. */ void visu_extra_node_addLabel(VisuData *data) { VisuNodeProperty* nodeProp; /* Test if the property is already set or not. */ nodeProp = visu_node_array_getProperty(VISU_NODE_ARRAY(data), LABEL_ID); if (!nodeProp) /* If not, create it. */ visu_node_array_property_newPointer(VISU_NODE_ARRAY(data), LABEL_ID, freeLabel, newOrCopyLabel, (gpointer)0); /* Register a new NodeData, if not already. */ if (!dataNodeLabel) { dataNodeLabel = VISU_DATA_NODE(visu_data_node_new(LABEL_ID, G_TYPE_STRING)); visu_data_node_setLabel(dataNodeLabel, _("Label")); visu_data_node_setEditable(dataNodeLabel, TRUE); g_value_init(&dataLabel, G_TYPE_POINTER); } /* Make this property used. */ visu_data_node_setUsed(dataNodeLabel, data, 1); } /** * visu_extra_node_setLabel: * @data: a #VisuData object. * @nodeId: the id of a node. * @label: (allow-none): the label to set (will be copied). * * Set a @label to the node @nodeId. */ void visu_extra_node_setLabel(VisuData *data, guint nodeId, const gchar *label) { VisuNode *node; gchar *lbl; node = visu_node_array_getFromId(VISU_NODE_ARRAY(data), nodeId); g_return_if_fail(node); /* Associates the values to the node. */ if (label && label[0]) lbl = g_strdup(label); else lbl = (gchar*)0; g_value_set_pointer(&dataLabel, (gpointer)lbl); visu_node_setpropertyValue(VISU_NODE_ARRAY(data), node, LABEL_ID, &dataLabel); } /** * visu_extra_node_getLabel: * @data: a #VisuData object. * @node: a given node * * Retrieve the label of @node. If @node has no label, NULL is * returned. * * Returns: (transfer none): a label, private value, do not freed. */ const gchar* visu_extra_node_getLabel(VisuData *data, VisuNode *node) { VisuNodeProperty* nodeProp; gchar *lbl; nodeProp = visu_node_array_getProperty(VISU_NODE_ARRAY(data), LABEL_ID); if (!nodeProp) return (const gchar*)0; /* Read the value of the node. */ visu_node_property_getValue(nodeProp, node, &dataLabel); lbl = (gchar*)g_value_get_pointer(&dataLabel); return lbl; } v_sim-3.7.0/src/extraFunctions/extraNode.h0000644000353400050620000000357612215546074015507 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2009) Adresse ml : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2009) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef EXTRANODE_H #define EXTRANODE_H #include void visu_extra_node_addLabel(VisuData *data); void visu_extra_node_setLabel(VisuData *data, guint nodeId, const gchar *label); const gchar* visu_extra_node_getLabel(VisuData *data, VisuNode *node); #endif v_sim-3.7.0/src/extraFunctions/scalarFields.c0000644000353400050620000012142412215552363016134 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD, Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2005) Adresses mél : BILLARD, non joignable par mél ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD and Damien CALISTE and Olivier D'Astier, laboratoire L_Sim, (2001-2005) E-mail addresses : BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "scalarFields.h" #include #include #include #include #include #include /** * SECTION:scalarFields * @short_description:Gives capabilities to load a scalar field. * * A scalar field is represented by the given of datas on a * regular grid meshing the bounding box. Scalar field can be read * from several kind of files by adding load methods using * scalarFieldAdd_loadMethod(). The basic implementation gives access * to ASCII encoded files following a simple format. * * When the scalar field is periodic, the values on the border x = 1, * y = 1 or z = 1 can be obtained reading those of border x = 0, y = 0 * or z = 0. So if there are n values in one direction, the nth is at * position 1 - 1/n in box coordinates in that direction. On the * contrary, for non-periodic scalar field, the nth value is at * coordinate 1 in box system and can be different from value 0. * * In coordination with #VisuPlane and #ToolShade, scalar field can be * represented as coloured map calling scalarFieldDraw_map(). The * current implementation of interpolation is very limited since basic * linear approximation is used. * * If a structure file also contains a scalar field, when * loaded, it should add a #VisuData property called * VISU_SCALAR_FIELD_DEFINED_IN_STRUCT_FILE using * g_object_set_data(). Then V_Sim will be able to handle the * structure file as a density file also. */ #define MESH_FLAG "meshType" #define MESH_FLAG_UNIFORM "uniform" #define MESH_FLAG_NON_UNIFORM "nonuniform" /** * VisuScalarField: * * An opaque structure for the scalar field. */ /** * VisuScalarFieldClass: * @parent: the parent class. * * An opaque structure for the class. */ /* * _VisuScalarField: * @filename: the path to the file from which the scalar field * has been read ; * @commentary: a commentary read from the file (must be in UTF-8) ; * @box: description of the associated bounding box ; * @nElements: number of points in each direction ; * @data: the values ; * @min: the minimum value ; * @max: the maximum value ; * @options: a GList of #Option values. * * The structure used to store a scalar field. */ struct _VisuScalarFieldPrivate { gboolean dispose_has_run; /* The name of the file, where the data were read from. */ gchar *filename; /* An associated commentary. */ gchar *commentary; /* Description of the box. */ VisuBox *box; float shift[3]; /* Number of elements in each directions [x, y, z]. */ guint nElements[3]; /* Mesh. */ VisuScalarFieldMeshFlags mesh_type; double *meshx; double *meshy; double *meshz; /* Datas. */ double ***data; GArray *arr; /* Minimum and maximum values. */ double min, max; /* A GList to store some options (key, values) associated to the data. */ GList *options; }; /* Local variables. */ static GList *loadMethods; struct _VisuScalarFieldMethod { ToolFileFormat parent; VisuScalarFieldMethodLoadFunc load; int priority; gboolean dispose_has_run; }; struct _VisuScalarFieldMethodClass { ToolFileFormatClass parent; }; /* Object gestion methods. */ static void visu_scalar_field_dispose (GObject* obj); static void visu_scalar_field_finalize(GObject* obj); static void visu_boxed_interface_init (VisuBoxedInterface *iface); /* Local methods. */ static VisuBox* visu_scalar_field_getBox(VisuBoxed *boxed); static gboolean visu_scalar_field_setBox(VisuBoxed *self, VisuBox *box, gboolean update); static gboolean scalarFieldLoad_fromAscii(VisuScalarFieldMethod *meth, const gchar *filename, GList **fieldList, GError **error); static gint compareLoadPriority(gconstpointer a, gconstpointer b); G_DEFINE_TYPE_WITH_CODE(VisuScalarField, visu_scalar_field, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE(VISU_TYPE_BOXED, visu_boxed_interface_init)) static void visu_scalar_field_class_init(VisuScalarFieldClass *klass) { const gchar *type[] = {"*.pot", "*.dat", (char*)0}; const gchar *descr = _("Potential/density files"); DBG_fprintf(stderr, "VisuScalarField: creating the class of the object.\n"); /* DBG_fprintf(stderr, " - adding new signals ;\n"); */ /* Connect freeing methods. */ G_OBJECT_CLASS(klass)->dispose = visu_scalar_field_dispose; G_OBJECT_CLASS(klass)->finalize = visu_scalar_field_finalize; g_type_class_add_private(klass, sizeof(VisuScalarFieldPrivate)); visu_scalar_field_method_new(descr, type, scalarFieldLoad_fromAscii, G_PRIORITY_LOW); } static void visu_boxed_interface_init(VisuBoxedInterface *iface) { iface->get_box = visu_scalar_field_getBox; iface->set_box = visu_scalar_field_setBox; } static void visu_scalar_field_init(VisuScalarField *obj) { DBG_fprintf(stderr, "VisuScalarField: creating a new scalar_field (%p).\n", (gpointer)obj); obj->priv = G_TYPE_INSTANCE_GET_PRIVATE(obj, VISU_TYPE_SCALAR_FIELD, VisuScalarFieldPrivate); obj->priv->dispose_has_run = FALSE; obj->priv->nElements[0] = 0; obj->priv->nElements[1] = 0; obj->priv->nElements[2] = 0; obj->priv->filename = (gchar*)0; obj->priv->commentary = (gchar*)0; obj->priv->meshx = (double*)0; obj->priv->meshy = (double*)0; obj->priv->meshz = (double*)0; obj->priv->box = (VisuBox*)0; obj->priv->data = (double***)0; obj->priv->arr = (GArray*)0; obj->priv->min = G_MAXFLOAT; obj->priv->max = -G_MAXFLOAT; obj->priv->mesh_type = VISU_SCALAR_FIELD_MESH_UNIFORM; obj->priv->shift[0] = 0.f; obj->priv->shift[1] = 0.f; obj->priv->shift[2] = 0.f; obj->priv->options = (GList*)0; } static void visu_scalar_field_dispose(GObject* obj) { DBG_fprintf(stderr, "VisuScalarField: dispose object %p.\n", (gpointer)obj); if (VISU_SCALAR_FIELD(obj)->priv->dispose_has_run) return; VISU_SCALAR_FIELD(obj)->priv->dispose_has_run = TRUE; visu_scalar_field_setBox(VISU_BOXED(obj), (VisuBox*)0, FALSE); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_scalar_field_parent_class)->dispose(obj); } static void visu_scalar_field_finalize(GObject* obj) { VisuScalarFieldPrivate *field = VISU_SCALAR_FIELD(obj)->priv; guint i; GList *tmplst; DBG_fprintf(stderr, "VisuScalarField: finalize object %p.\n", (gpointer)obj); g_free(field->filename); g_free(field->commentary); g_free(field->meshx); g_free(field->meshy); g_free(field->meshz); if (field->data) { for (i = 0; i < field->nElements[0]; i++) g_free(field->data[i]); g_free(field->data); } if (field->arr) g_array_unref(field->arr); if (field->options) { for (tmplst = field->options; tmplst; tmplst = g_list_next(tmplst)) tool_option_free(tmplst->data); g_list_free(field->options); } /* Chain up to the parent class */ G_OBJECT_CLASS(visu_scalar_field_parent_class)->finalize(obj); } /** * visu_scalar_field_new: * @filename: (type filename): the path to the filename the field should be read from. * * Create a new #VisuScalarField object that is empty (all internal pointers * are set to NULL and no memory is allocated except for the object itself. * The @filename argument is copied. * * Returns: (transfer full): a newly created #VisuScalarField * object. */ VisuScalarField* visu_scalar_field_new(const gchar *filename) { VisuScalarField *field; g_return_val_if_fail(filename && filename[0], (VisuScalarField*)0); field = VISU_SCALAR_FIELD(g_object_new(VISU_TYPE_SCALAR_FIELD, NULL)); field->priv->filename = g_strdup(filename); return field; } static void setToolFileFormatOption(gpointer key, gpointer value, gpointer data) { DBG_fprintf(stderr, "Visu VisuScalarField: transfer option '%s' to file format.\n", (gchar*)key); tool_file_format_addOption(TOOL_FILE_FORMAT(data), tool_option_copy((ToolOption*)value)); } /** * visu_scalar_field_new_fromFile: * @filename: (type filename): the path to the file to be loaded ; * @fieldList: (transfer full) (out) (element-type VisuScalarField*): * a #GList to store read field(s) ; * @table: (allow-none): a set of different options (can be NULL). * @error: a location on a error pointer ; * * Read the given file and try to load it as a scalar field file. If succeed, * all read fields are appended to the @fieldList argument. If an error * occurs, it is stored into @error. When entering the routine, *@error must be NULL. * If @table is given, it means that the caller routine gives some options to the loader * routine. These options are a set of names and values. * * If the file contains several fields, they must be loaded and added to @fieldList. * * Returns: (skip): TRUE if everything goes with no error. */ gboolean visu_scalar_field_new_fromFile(const gchar *filename, GList **fieldList, GHashTable *table, GError **error) { gboolean validFormat; GList *tmpLst; g_return_val_if_fail(filename, FALSE); g_return_val_if_fail(*fieldList == (GList*)0, FALSE); g_return_val_if_fail(error && (*error == (GError*)0), FALSE); DBG_fprintf(stderr, "Visu VisuScalarField: try all known formats.\n"); /* Try all supported format. */ validFormat = FALSE; for (tmpLst = loadMethods; tmpLst && !validFormat; tmpLst = g_list_next(tmpLst)) { /* Transfer option from table to ToolFileFormat. */ if (table) g_hash_table_foreach(table, setToolFileFormatOption, tmpLst->data); DBG_fprintf(stderr, " | try format '%s'.\n", tool_file_format_getName(TOOL_FILE_FORMAT(tmpLst->data))); validFormat = visu_scalar_field_method_load(VISU_SCALAR_FIELD_METHOD(tmpLst->data), filename, fieldList, error); } if (!validFormat) g_set_error(error, TOOL_FILE_FORMAT_ERROR, TOOL_FILE_FORMAT_ERROR_UNKNOWN_FORMAT, _("unknown density/potential format.\n")); DBG_fprintf(stderr, "Visu VisuScalarField: found %d field(s).\n", g_list_length(*fieldList)); return validFormat; } static gboolean scalarFieldLoad_fromAscii(VisuScalarFieldMethod *meth _U_, const gchar *filename, GList **fieldList, GError **error) { FILE *in; char rep[TOOL_MAX_LINE_LENGTH], flag[TOOL_MAX_LINE_LENGTH]; char format[TOOL_MAX_LINE_LENGTH], period[TOOL_MAX_LINE_LENGTH]; char *feed; gchar *comment; int res; guint i, j, k; guint size[3]; double box[6]; VisuScalarField *field; VisuBox *boxObj; gboolean periodic; VisuScalarFieldMeshFlags meshtype; g_return_val_if_fail(filename, FALSE); g_return_val_if_fail(*fieldList == (GList*)0, FALSE); g_return_val_if_fail(error && (*error == (GError*)0), FALSE); DBG_fprintf(stderr, "VisuScalarField : try to read '%s' as a ASCII scalar" " field data file.\n", filename); in = fopen(filename, "r"); if (!in) { g_set_error(error, G_FILE_ERROR, G_FILE_ERROR_ACCES, _("impossible to open the file.\n")); return FALSE; } /* 1st line (comment) */ if (!fgets(rep, TOOL_MAX_LINE_LENGTH, in)) { fclose(in); return FALSE; } rep[strlen(rep)-1] = 0; /* skipping \n */ comment = g_locale_to_utf8(rep, -1, NULL, NULL, NULL); if (!comment) comment = g_strdup(""); if (!fgets(rep, TOOL_MAX_LINE_LENGTH, in) || sscanf(rep, "%u %u %u", size, size + 1, size + 2) != 3) { /* Not a valid ASCII format. */ g_free(comment); fclose(in); return FALSE; } if (!fgets(rep, TOOL_MAX_LINE_LENGTH, in) || sscanf(rep, "%lf %lf %lf", box, box + 1, box + 2) != 3) { /* Not a valid ASCII format. */ g_free(comment); fclose(in); return FALSE; } if (!fgets(rep, TOOL_MAX_LINE_LENGTH, in) || sscanf(rep, "%lf %lf %lf", box + 3, box + 4, box + 5) != 3) { /* Not a valid ASCII format. */ g_free(comment); fclose(in); return FALSE; } if (!fgets(rep, TOOL_MAX_LINE_LENGTH, in) || sscanf(rep, "%s %s", format, period) < 1 || (strcmp(format, "xyz") && strcmp(format, "zyx"))) { /* Not a valid ASCII format. */ g_free(comment); fclose(in); return FALSE; } periodic = !strcmp(period, "periodic"); /* OK, from now on, the format is supposed to be ASCII. */ field = visu_scalar_field_new(filename); if (!field) { g_warning("impossible to create a VisuScalarField object."); g_free(comment); fclose(in); return FALSE; } /* by default the meshtype is set to uniform to keep working previous version.*/ meshtype = VISU_SCALAR_FIELD_MESH_UNIFORM; feed = fgets(rep, TOOL_MAX_LINE_LENGTH, in); while (feed && rep[0] == '#') { if (strncmp(rep + 2, MESH_FLAG, strlen(MESH_FLAG)) == 0) { DBG_fprintf(stderr, "VisuScalarField: found flag '%s'.\n", MESH_FLAG); res = sscanf(rep + 2 + strlen(MESH_FLAG) + 1, "%s", flag); if (res == 1 && strcmp(flag, MESH_FLAG_UNIFORM) == 0) meshtype = VISU_SCALAR_FIELD_MESH_UNIFORM; else if (res == 1 && strcmp(flag, MESH_FLAG_NON_UNIFORM) == 0) meshtype = VISU_SCALAR_FIELD_MESH_NON_UNIFORM; else if (res == 1) { g_set_error(error, TOOL_FILE_FORMAT_ERROR, TOOL_FILE_FORMAT_ERROR_FORMAT, _("wrong '%s' value for flag '%s'.\n"), flag, MESH_FLAG); fclose(in); return TRUE; } } feed = fgets(rep, TOOL_MAX_LINE_LENGTH, in); } visu_scalar_field_setCommentary(field, comment); visu_scalar_field_setMeshtype(field, meshtype); visu_scalar_field_setGridSize(field, size); boxObj = visu_box_new(box, (periodic)?VISU_BOX_PERIODIC:VISU_BOX_FREE); visu_box_setMargin(boxObj, 0.f, FALSE); visu_boxed_setBox(VISU_BOXED(field), VISU_BOXED(boxObj), FALSE); g_object_unref(boxObj); *fieldList = g_list_append(*fieldList, (gpointer)field); if (meshtype == VISU_SCALAR_FIELD_MESH_NON_UNIFORM) { DBG_fprintf(stderr, "VisuScalarField : Start to read meshx.\n"); for ( i = 0; i < size[0]; i++ ) { if (!feed) { g_set_error(error, TOOL_FILE_FORMAT_ERROR, TOOL_FILE_FORMAT_ERROR_FORMAT, _("not enough meshx values.\n")); fclose(in); return TRUE; } res = sscanf(rep, "%lf", &field->priv->meshx[i]); do feed = fgets(rep, TOOL_MAX_LINE_LENGTH, in); while (rep[0] == '#' && feed); if (res != 1) { g_set_error(error, TOOL_FILE_FORMAT_ERROR, TOOL_FILE_FORMAT_ERROR_FORMAT, _("impossible to read meshx values.\n")); fclose(in); return TRUE; } } DBG_fprintf(stderr, "VisuScalarField : Start to read meshy.\n"); for ( j = 0; j < size[1]; j++ ) { if (!feed) { g_set_error(error, TOOL_FILE_FORMAT_ERROR, TOOL_FILE_FORMAT_ERROR_FORMAT, _("not enough meshy values.\n")); fclose(in); return TRUE; } res = sscanf(rep, "%lf", &field->priv->meshy[j]); do feed = fgets(rep, TOOL_MAX_LINE_LENGTH, in); while (rep[0] == '#' && feed); if (res != 1) { g_set_error(error, TOOL_FILE_FORMAT_ERROR, TOOL_FILE_FORMAT_ERROR_FORMAT, _("impossible to read meshy values.\n")); fclose(in); return TRUE; } } DBG_fprintf(stderr, "VisuScalarField : Start to read meshz.\n"); for ( k = 0; k < size[2]; k++ ) { if (!feed) { g_set_error(error, TOOL_FILE_FORMAT_ERROR, TOOL_FILE_FORMAT_ERROR_FORMAT, _("not enough meshz values.\n")); fclose(in); return TRUE; } res = sscanf(rep, "%lf", &field->priv->meshz[k]); do feed = fgets(rep, TOOL_MAX_LINE_LENGTH, in); while (rep[0] == '#' && feed); if (res != 1) { g_set_error(error, TOOL_FILE_FORMAT_ERROR, TOOL_FILE_FORMAT_ERROR_FORMAT, _("impossible to read meshz values.\n")); fclose(in); return TRUE; } } } DBG_fprintf(stderr, "VisuScalarField : Start to read data.\n"); field->priv->min = G_MAXFLOAT; field->priv->max = G_MINFLOAT; if(!strcmp(format, "xyz")) { for ( k = 0; k < size[2]; k++ ) for ( j = 0; j < size[1]; j++ ) for ( i = 0; i < size[0]; i++ ) { if (!feed) { g_set_error(error, TOOL_FILE_FORMAT_ERROR, TOOL_FILE_FORMAT_ERROR_FORMAT, _("not enough density values.\n")); fclose(in); return TRUE; } res = sscanf(rep, "%lf", &field->priv->data[i][j][k]); do feed = fgets(rep, TOOL_MAX_LINE_LENGTH, in); while (rep[0] == '#' && feed); if (res != 1) { g_set_error(error, TOOL_FILE_FORMAT_ERROR, TOOL_FILE_FORMAT_ERROR_FORMAT, _("impossible to read density values.\n")); fclose(in); return TRUE; } field->priv->min = MIN(field->priv->data[i][j][k], field->priv->min); field->priv->max = MAX(field->priv->data[i][j][k], field->priv->max); } } else { for ( i = 0; i < size[0]; i++ ) for ( j = 0; j < size[1]; j++ ) for ( k = 0; k < size[2]; k++ ) { if (!feed) { g_set_error(error, TOOL_FILE_FORMAT_ERROR, TOOL_FILE_FORMAT_ERROR_FORMAT, _("not enough density values.\n")); fclose(in); return TRUE; } res = sscanf(rep, "%lf", &field->priv->data[i][j][k]); do feed = fgets(rep, TOOL_MAX_LINE_LENGTH, in); while (rep[0] == '#' && feed); if (res != 1) { g_set_error(error, TOOL_FILE_FORMAT_ERROR, TOOL_FILE_FORMAT_ERROR_FORMAT, _("impossible to read density values.\n")); fclose(in); return TRUE; } field->priv->min = MIN(field->priv->data[i][j][k], field->priv->min); field->priv->max = MAX(field->priv->data[i][j][k], field->priv->max); } } DBG_fprintf(stderr, " | done.\n"); fclose(in); return TRUE; } /** * visu_scalar_field_getCommentary: * @field: a #VisuScalarField object. * * If the file format support a commentary, this is a good method to get it. * * Returns: a pointer on the commentary (it should not be freed), can be NULL. */ const gchar* visu_scalar_field_getCommentary(VisuScalarField *field) { g_return_val_if_fail(field, (gchar*)0); return field->priv->commentary; } /** * visu_scalar_field_setCommentary: * @field: a #VisuScalarField object ; * @comment: an UTF-8 string to store as a commentary. * * A commentary can be associated to a #VisuScalarField, use this method to set it. * The value of @comment is NOT copied. */ void visu_scalar_field_setCommentary(VisuScalarField *field, const gchar* comment) { g_return_if_fail(field); field->priv->commentary = g_strdup(comment); } /** * visu_scalar_field_getMeshtype: * @field: a #VisuScalarField object ; * to be added * * The vertex may be distributed linearly along the different * directions or customily distributed. * * Returns: a #VisuScalarFieldMeshFlags (uniform or nonuniform). */ VisuScalarFieldMeshFlags visu_scalar_field_getMeshtype(VisuScalarField *field) { g_return_val_if_fail(field, VISU_SCALAR_FIELD_MESH_UNIFORM); return field->priv->mesh_type; } /** * visu_scalar_field_setMeshtype: * @field: a #VisuScalarField object ; * @meshtype: a #VisuScalarFieldMeshFlags object. * * Change the distribution of the vertex of the scalarfield between * regular or custom. */ void visu_scalar_field_setMeshtype(VisuScalarField *field, VisuScalarFieldMeshFlags meshtype) { g_return_if_fail(field); field->priv->mesh_type = meshtype; } /** * visu_scalar_field_getFilename: * @field: a #VisuScalarField object. * * The data are read from a file. * * Returns: a pointer on the filename (it should not be freed). */ const gchar* visu_scalar_field_getFilename(VisuScalarField *field) { g_return_val_if_fail(field, (gchar*)0); return field->priv->filename; } /** * visu_scalar_field_setGridSize: * @field: a #VisuScalarField object ; * @grid: (array fixed-size=3): 3 integers. * * This method is used to set the division in x, y, and z directions. * If the size of internal array for data is changed, it is reallocated and * previous data are erased. Use visu_scalar_field_getData() to get a pointer on this * data array. */ void visu_scalar_field_setGridSize(VisuScalarField *field, const guint grid[3]) { guint i, j; g_return_if_fail(field); if (field->priv->nElements[0] == grid[0] && field->priv->nElements[1] == grid[1] && field->priv->nElements[2] == grid[2]) return; DBG_fprintf(stderr, "VisuScalarField: changing size from (%d ; %d ; %d)" " to (%d ; %d ; %d).\n", field->priv->nElements[0], field->priv->nElements[1], field->priv->nElements[2], grid[0], grid[1], grid[2]); if (field->priv->mesh_type == VISU_SCALAR_FIELD_MESH_NON_UNIFORM) { DBG_fprintf(stderr, " |�free the previous mesh allocation.\n"); /* If mesh was already allocated, we free it. */ if (field->priv->meshx) g_free(field->priv->meshx); if (field->priv->meshy) g_free(field->priv->meshy); if (field->priv->meshz) g_free(field->priv->meshz); } /* If data was already allocated, we free it. */ if (field->priv->data) { DBG_fprintf(stderr, " |�free the previous data allocation.\n"); for (i = 0; i < field->priv->nElements[0]; i++) g_free(field->priv->data[i]); g_free(field->priv->data); } if (field->priv->arr) g_array_unref(field->priv->arr); /* We change the size and reallocate mesh and data. */ field->priv->nElements[0] = grid[0]; field->priv->nElements[1] = grid[1]; field->priv->nElements[2] = grid[2]; if (field->priv->mesh_type == VISU_SCALAR_FIELD_MESH_NON_UNIFORM) { DBG_fprintf(stderr, "VisuScalarField: allocating meshx array.\n"); field->priv->meshx = g_malloc(sizeof(double) * grid[0]); DBG_fprintf(stderr, "VisuScalarField: allocating meshy array.\n"); field->priv->meshy = g_malloc(sizeof(double) * grid[1]); DBG_fprintf(stderr, "VisuScalarField: allocating meshz array.\n"); field->priv->meshz = g_malloc(sizeof(double) * grid[2]); } DBG_fprintf(stderr, "VisuScalarField: allocating data array.\n"); field->priv->arr = g_array_sized_new(FALSE, FALSE, sizeof(double), grid[0] * grid[1] * grid[2]); g_array_set_size(field->priv->arr, grid[0] * grid[1] * grid[2]); field->priv->data = g_malloc(sizeof(double **) * grid[0]); for(i = 0; i < grid[0]; i++) { field->priv->data[i] = g_malloc(sizeof(double *) * grid[1]); for(j = 0; j < grid[1]; j++) field->priv->data[i][j] = &g_array_index(field->priv->arr, double, ((i * grid[1] + j) * grid[2])); } DBG_fprintf(stderr, " | allocation done.\n"); } /** * visu_scalar_field_setOriginShift: * @field: a #VisuScalarField object. * @shift: (array fixed-size=3): a shift to apply to. * * The scalar field can be shifted with respect to the origin of the * #VisuData box. Use this routine to set this @shift. * * Since: 3.7 **/ void visu_scalar_field_setOriginShift(VisuScalarField *field, const float shift[3]) { g_return_if_fail(field); DBG_fprintf(stderr, "VisuScalarField: set origin shift to %g,%g,%g.\n", shift[0], shift[1], shift[2]); field->priv->shift[0] = shift[0]; field->priv->shift[1] = shift[1]; field->priv->shift[2] = shift[2]; } /** * visu_scalar_field_getOriginShift: * @field: a #VisuScalarField object. * @shift: (out caller-allocates) (type ToolVector): a location to store the shift * of @field. * * The scalar field can be shifted with respect to the origin of the * #VisuData box. Use this routine to get this @shift. * * Since: 3.7 **/ void visu_scalar_field_getOriginShift(VisuScalarField *field, float shift[3]) { g_return_if_fail(field); shift[0] = field->priv->shift[0]; shift[1] = field->priv->shift[1]; shift[2] = field->priv->shift[2]; DBG_fprintf(stderr, "VisuScalarField: get origin shift %g,%g,%g.\n", shift[0], shift[1], shift[2]); } /** * visu_scalar_field_getMinMax: * @field: a #VisuScalarField object ; * @minmax: (array fixed-size=2): two double values. * * Get the minimum and the maximum values of the given @field. */ void visu_scalar_field_getMinMax(VisuScalarField *field, double minmax[2]) { g_return_if_fail(field); minmax[0] = field->priv->min; minmax[1] = field->priv->max; } /** * visu_scalar_field_setData: * @field: a #VisuScalarField object ; * @data: (element-type double): an array containing data to be copied ; * @xyzOrder: a boolean. * * Set the data of the given @field. The array @data should be stored in z direction * first, followed by y and x if @xyzOrder is FALSE, or in the other * order when TRUE. The number of elements in the x, y and z directions * are read from field->priv->nElements. Then use visu_scalar_field_setGridSize() * before using this method. */ void visu_scalar_field_setData(VisuScalarField *field, GArray *data, gboolean xyzOrder) { guint i, j, k, ii; g_return_if_fail(field && data); g_return_if_fail(data->len == field->priv->nElements[0] * field->priv->nElements[1] * field->priv->nElements[2]); DBG_fprintf(stderr, "VisuScalarField: set data from array %p (%d ele.).\n", (gpointer)data, data->len); field->priv->min = G_MAXFLOAT; field->priv->max = -G_MAXFLOAT; ii = 0; if (xyzOrder) for (k = 0 ; k < field->priv->nElements[2] ; k++) for (j = 0 ; j < field->priv->nElements[1] ; j++) for (i = 0 ; i < field->priv->nElements[0] ; i++) { field->priv->data[i][j][k] = ((double*)data->data)[ii]; field->priv->min = MIN(field->priv->data[i][j][k], field->priv->min); field->priv->max = MAX(field->priv->data[i][j][k], field->priv->max); ii += 1; } else for (i = 0 ; i < field->priv->nElements[0] ; i++) for (j = 0 ; j < field->priv->nElements[1] ; j++) for (k = 0 ; k < field->priv->nElements[2] ; k++) { field->priv->data[i][j][k] = ((double*)data->data)[ii]; field->priv->min = MIN(field->priv->data[i][j][k], field->priv->min); field->priv->max = MAX(field->priv->data[i][j][k], field->priv->max); ii += 1; } DBG_fprintf(stderr, " | done.\n"); } /** * visu_scalar_field_getValue: * @field: a #VisuScalarField object ; * @xyz: (array fixed-size=3): a point coordinate (in real space) ; * @value: (out caller-allocates): a location to store the value ; * @extension: (array fixed-size=3): a possible extension in box coordinates. * * Knowing the point coordinates, it interpolate a value from the * scalar field. If the scalar field is periodic, then it allow the * coordinates to extend inside the given @extension. * * Returns: TRUE if the value can be interpolate, FALSE otherwise, for instance, * when the point @xyz is out of bounds. */ gboolean visu_scalar_field_getValue(VisuScalarField *field, float xyz[3], double *value, float extension[3]) { float redXyz[3], factor[3], pos; int l, m, n, ijk[3], dijk[3], nMax; int nval1, nval2; double *mesh; float xyz_[3]; gboolean periodic[3]; VisuScalarFieldMeshFlags meshtype; /* Taken from ABINIT */ float x1,x2,x3; g_return_val_if_fail(field, FALSE); meshtype = visu_scalar_field_getMeshtype(field); /* First, we transform the coordinates into reduced coordinates. */ xyz_[0] = xyz[0] + field->priv->shift[0]; xyz_[1] = xyz[1] + field->priv->shift[1]; xyz_[2] = xyz[2] + field->priv->shift[2]; visu_box_convertXYZtoBoxCoordinates(field->priv->box, redXyz, xyz_); visu_box_getPeriodicity(field->priv->box, periodic); /* We compute i, j, k. */ for (l = 0; l < 3; l++) { /* If we are periodic and inside the extension, we put back in the box. */ if (periodic[l] && redXyz[l] > -extension[l] && redXyz[l] < 1. + extension[l]) redXyz[l] = tool_modulo_float(redXyz[l], 1); if (periodic[l]) nMax = field->priv->nElements[l]; else nMax = field->priv->nElements[l] - 1; switch (meshtype) { case VISU_SCALAR_FIELD_MESH_UNIFORM: pos = (float)nMax * redXyz[l]; ijk[l] = (int)pos; factor[l] = pos - (float)ijk[l]; break; case VISU_SCALAR_FIELD_MESH_NON_UNIFORM: mesh = (double*)0; switch (l) { case 0: mesh = visu_scalar_field_getMeshx(field); break; case 1: mesh = visu_scalar_field_getMeshy(field); break; case 2: mesh = visu_scalar_field_getMeshz(field); break; } nval1 = 0; nval2 = nMax-1; n = 0; for (m = 0; m < nMax/2; m++) { n = (int)((nval2-nval1)/2); if (n == 0) { n = nval1; break; } else n = nval1+n; if (redXyz[l] > mesh[n]) nval1 = n; else nval2 = n; } ijk[l] = n; factor[l] = (redXyz[l]-mesh[n])/(mesh[n+1]-mesh[n]); break; default: g_warning("Wrong value for 'meshtype'."); return FALSE; } if (ijk[l] < 0 || redXyz[l] < 0.) return FALSE; if (ijk[l] >= nMax) return FALSE; } /* lower left is ijk. */ /* upper right is dijk. */ dijk[0] = (ijk[0] + 1) % field->priv->nElements[0]; dijk[1] = (ijk[1] + 1) % field->priv->nElements[1]; dijk[2] = (ijk[2] + 1) % field->priv->nElements[2]; /* weight is factor. */ x1 = factor[0]; x2 = factor[1]; x3 = factor[2]; /* calculation of the density value */ *value = 0.f; *value += field->priv->data[ ijk[0]][ ijk[1]][ ijk[2]] * (1.f - x1) * (1.f - x2) * (1.f - x3); *value += field->priv->data[dijk[0]][ ijk[1]][ ijk[2]] * x1 * (1.f - x2) * (1.f - x3); *value += field->priv->data[ ijk[0]][dijk[1]][ ijk[2]] * (1.f - x1) * x2 * (1.f - x3); *value += field->priv->data[ ijk[0]][ ijk[1]][dijk[2]] * (1.f - x1) * (1.f - x2) * x3; *value += field->priv->data[dijk[0]][dijk[1]][ ijk[2]] * x1 * x2 * (1.f - x3); *value += field->priv->data[ ijk[0]][dijk[1]][dijk[2]] * (1.f -x1) * x2 * x3; *value += field->priv->data[dijk[0]][ ijk[1]][dijk[2]] * x1 * (1.f - x2) * x3; *value += field->priv->data[dijk[0]][dijk[1]][dijk[2]] * x1 * x2 * x3; return TRUE; } static gboolean visu_scalar_field_setBox(VisuBoxed *self, VisuBox *box, gboolean update _U_) { VisuScalarField *field; g_return_val_if_fail(VISU_IS_SCALAR_FIELD_TYPE(self), FALSE); field = VISU_SCALAR_FIELD(self); DBG_fprintf(stderr, "VisuScalarField: set the bounding box to %p.\n", (gpointer)box); if (field->priv->box == box) return FALSE; if (field->priv->box) g_object_unref(field->priv->box); if (box) g_object_ref(box); field->priv->box = box; return TRUE; } static VisuBox* visu_scalar_field_getBox(VisuBoxed *boxed) { g_return_val_if_fail(VISU_IS_SCALAR_FIELD_TYPE(boxed), (VisuBox*)0); return VISU_SCALAR_FIELD(boxed)->priv->box; } /** * visu_scalar_field_getGridSize: * @field: a #VisuScalarField object ; * @grid: (out caller-allocates) (type ToolGridSize): 3 integer locations. * * This method is used to get the division in x, y, and z directions. */ void visu_scalar_field_getGridSize(VisuScalarField *field, guint grid[3]) { int i; g_return_if_fail(field); DBG_fprintf(stderr, "Visu ScalarField: get grid size.\n"); for (i = 0; i < 3; i++) grid[i] = field->priv->nElements[i]; DBG_fprintf(stderr, " | done.\n"); } /** * visu_scalar_field_getMeshx: * @field: a #VisuScalarField object. * * The mesh along x is stored as an array in x increasing. * * Returns: a pointer on the allocated meshx array (it should not be freed). */ double* visu_scalar_field_getMeshx(VisuScalarField *field) { g_return_val_if_fail(field, (double*)0); return field->priv->meshx; } /** * visu_scalar_field_getMeshy: * @field: a #VisuScalarField object. * * The mesh along y is stored as an array in y increasing. * * Returns: a pointer on the allocated meshy array (it should not be freed). */ double* visu_scalar_field_getMeshy(VisuScalarField *field) { g_return_val_if_fail(field, (double*)0); return field->priv->meshy; } /** * visu_scalar_field_getMeshz: * @field: a #VisuScalarField object. * * The mesh along z is stored as an array in z increasing. * * Returns: a pointer on the allocated meshz array (it should not be freed). */ double* visu_scalar_field_getMeshz(VisuScalarField *field) { g_return_val_if_fail(field, (double*)0); return field->priv->meshz; } /** * visu_scalar_field_getData: * @field: a #VisuScalarField object. * * The data are stored as a 3 indexes array in x, y and z increasing. * * Returns: a pointer on the allocated data array (it should not be freed). */ double*** visu_scalar_field_getData(VisuScalarField *field) { g_return_val_if_fail(field, (double***)0); return field->priv->data; } /** * visu_scalar_field_getDataArray: * @field: a #VisuScalarField object. * * The data are stored z first in a flatten array. * * Since: 3.7 * * Returns: (transfer none) (element-type double): a pointer on the allocated data array. */ const GArray* visu_scalar_field_getDataArray(const VisuScalarField *field) { g_return_val_if_fail(field, (const GArray*)0); return field->priv->arr; } /** * visu_scalar_field_getAllOptions: * @field: a #VisuScalarField object. * * Some #Option can be stored in association to the values of the scalar field. * These options are usually values associated to the read data, such as * a spin direction when dealing with density of spin... * * Returns: (transfer container) (element-type ToolOption*): a newly * created GList that should be freed after use with * g_list_free(). But data of the list are owned by V_Sim and should * not be modified or freed. */ GList* visu_scalar_field_getAllOptions(VisuScalarField *field) { g_return_val_if_fail(field, (GList*)0); return g_list_copy(field->priv->options); } /** * visu_scalar_field_addOption: * @field: a #VisuScalarField object ; * @option: a newly allocated option. * * This method adds an option to the list of #Option associated to the data. The given * @option will not be duplicated and should not be used elsewhere because it will be freed * when the @field will be freed. */ void visu_scalar_field_addOption(VisuScalarField *field, ToolOption *option) { g_return_if_fail(field && option); field->priv->options = g_list_append(field->priv->options, (gpointer)option); } /* Load method handling. */ static void visu_scalar_field_method_dispose(GObject* obj); static void visu_scalar_field_method_finalize(GObject* obj); G_DEFINE_TYPE(VisuScalarFieldMethod, visu_scalar_field_method, TOOL_TYPE_FILE_FORMAT) static void visu_scalar_field_method_class_init(VisuScalarFieldMethodClass *klass) { DBG_fprintf(stderr, "Visu VisuScalarField: creating the class of the object.\n"); /* Connect freeing methods. */ G_OBJECT_CLASS(klass)->dispose = visu_scalar_field_method_dispose; G_OBJECT_CLASS(klass)->finalize = visu_scalar_field_method_finalize; loadMethods = (GList*)0; } static void visu_scalar_field_method_dispose(GObject* obj) { DBG_fprintf(stderr, "Visu VisuScalarField: dispose object %p.\n", (gpointer)obj); if (VISU_SCALAR_FIELD_METHOD(obj)->dispose_has_run) return; VISU_SCALAR_FIELD_METHOD(obj)->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS(visu_scalar_field_method_parent_class)->dispose(obj); } static void visu_scalar_field_method_finalize(GObject* obj) { DBG_fprintf(stderr, "Visu VisuScalarField: finalize object %p.\n", (gpointer)obj); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_scalar_field_method_parent_class)->finalize(obj); } static void visu_scalar_field_method_init(VisuScalarFieldMethod *obj) { DBG_fprintf(stderr, "Visu VisuScalarField: initializing a new object (%p).\n", (gpointer)obj); obj->dispose_has_run = FALSE; obj->load = (VisuScalarFieldMethodLoadFunc)0; obj->priority = G_PRIORITY_LOW; loadMethods = g_list_prepend(loadMethods, obj); } /** * visu_scalar_field_method_new: * @descr: the name of the method ; * @patterns: (array zero-terminated=1): a NULL terminated list of strings ; * @method: (scope call): a #VisuScalarFieldMethodLoadFunc method ; * @priority: a priority value (the lower value, the higher priority). * * This routine is used to add a new method to load scalar field. The priority uses * the scale of the GLib (G_PRIORITY_DEFAULT is 0, G_PRIORITY_LOW is * 300 for instance). * * Returns: (transfer full): a newly create method to load scalar fields. */ VisuScalarFieldMethod* visu_scalar_field_method_new(const gchar* descr, const gchar** patterns, VisuScalarFieldMethodLoadFunc method, int priority) { VisuScalarFieldMethod *meth; g_return_val_if_fail(descr && method && patterns, (VisuScalarFieldMethod*)0); meth = VISU_SCALAR_FIELD_METHOD(g_object_new(VISU_TYPE_SCALAR_FIELD_METHOD, "name", descr, "ignore-type", FALSE, NULL)); tool_file_format_addPatterns(TOOL_FILE_FORMAT(meth), patterns); meth->load = method; meth->priority = priority; loadMethods = g_list_sort(loadMethods, compareLoadPriority); return meth; } /** * visu_scalar_field_method_load: * @fmt: a #VisuScalarFieldMethod object ; * @filename: (type filename): a path ; * @fieldList: (out) (element-type VisuScalarField*): a location to * store a list ; * @error: a location to an error. * * Call the load routine of the given scalar field file format @fmt. * * Since: 3.7 * * Returns: TRUE on success. */ gboolean visu_scalar_field_method_load(VisuScalarFieldMethod *fmt, const gchar *filename, GList **fieldList, GError **error) { gboolean res; g_return_val_if_fail(filename, FALSE); g_return_val_if_fail(VISU_IS_SCALAR_FIELD_METHOD(fmt), FALSE); g_return_val_if_fail(*fieldList == (GList*)0, FALSE); g_return_val_if_fail(error && (*error == (GError*)0), FALSE); DBG_fprintf(stderr, "Scalar Fields: try to open the file as a '%s'.\n", tool_file_format_getName(TOOL_FILE_FORMAT(fmt))); res = fmt->load(fmt, filename, fieldList, error); if (!res && *error) { g_error_free(*error); *error = (GError*)0; } return res; } static gint compareLoadPriority(gconstpointer a, gconstpointer b) { if (VISU_SCALAR_FIELD_METHOD(a)->priority < VISU_SCALAR_FIELD_METHOD(b)->priority) return (gint)-1; else if (VISU_SCALAR_FIELD_METHOD(a)->priority > VISU_SCALAR_FIELD_METHOD(b)->priority) return (gint)+1; else return (gint)0; } /** * visu_scalar_field_method_getAll: * * This routine gives access to all the registered load method for scamlar fields. * * Returns: (transfer none) (element-type VisuScalarFieldMethod*): * returns a list of V_Sim owned #VisuScalarFieldMethod objects. */ GList* visu_scalar_field_method_getAll(void) { return loadMethods; } v_sim-3.7.0/src/extraFunctions/scalarFields.h0000644000353400050620000002402512215546074016142 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD, Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2005) Adresses ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD and Damien CALISTE and Olivier D'Astier, laboratoire L_Sim, (2001-2005) E-mail addresses : BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef SCALARFIELDS_H #define SCALARFIELDS_H #include #include #include #include /** * VisuScalarFieldMeshFlags: * @VISU_SCALAR_FIELD_MESH_UNIFORM: the mesh has constant divisions along x, y and z axis ; * @VISU_SCALAR_FIELD_MESH_NON_UNIFORM: the mesh has non linear divisions along x, y or z axis. * * flag (comment) standing at the begining of a Scalar field file, * that gives informations concerning the mesh. */ typedef enum { VISU_SCALAR_FIELD_MESH_UNIFORM, VISU_SCALAR_FIELD_MESH_NON_UNIFORM } VisuScalarFieldMeshFlags; /** * VISU_TYPE_SCALAR_FIELD: * * return the type of #VisuScalarField. */ #define VISU_TYPE_SCALAR_FIELD (visu_scalar_field_get_type ()) /** * SCALAR_FIELD: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuScalarField type. */ #define VISU_SCALAR_FIELD(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_SCALAR_FIELD, VisuScalarField)) /** * VISU_SCALAR_FIELD_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuScalarFieldClass. */ #define VISU_SCALAR_FIELD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_SCALAR_FIELD, VisuScalarFieldClass)) /** * VISU_IS_SCALAR_FIELD_TYPE: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuScalarField object. */ #define VISU_IS_SCALAR_FIELD_TYPE(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_SCALAR_FIELD)) /** * VISU_IS_SCALAR_FIELD_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuScalarFieldClass class. */ #define VISU_IS_SCALAR_FIELD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_SCALAR_FIELD)) /** * VISU_SCALAR_FIELD_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. */ #define VISU_SCALAR_FIELD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_SCALAR_FIELD, VisuScalarFieldClass)) typedef struct _VisuScalarField VisuScalarField; typedef struct _VisuScalarFieldPrivate VisuScalarFieldPrivate; typedef struct _VisuScalarFieldClass VisuScalarFieldClass; struct _VisuScalarField { GObject parent; VisuScalarFieldPrivate *priv; }; struct _VisuScalarFieldClass { GObjectClass parent; }; /** * visu_scalar_field_get_type: * * This method returns the type of #VisuScalarField, use VISU_TYPE_SCALAR_FIELD instead. * * Returns: the type of #VisuScalarField. */ GType visu_scalar_field_get_type(void); /** * VISU_SCALAR_FIELD_DEFINED_IN_STRUCT_FILE: * * Flag used to registered a gboolean property in a #VisuData object. * If this flag is TRUE, the file used to read the structure can be used to * read a density or a potential. */ #define VISU_SCALAR_FIELD_DEFINED_IN_STRUCT_FILE "fileFormat_hasPotentialOrDensity" VisuScalarField* visu_scalar_field_new(const gchar *filename); gboolean visu_scalar_field_new_fromFile(const gchar *filename, GList **fieldList, GHashTable *table, GError **error); void visu_scalar_field_setCommentary(VisuScalarField *field, const gchar* comment); void visu_scalar_field_setData(VisuScalarField *field, GArray *data, gboolean xyzOrder); void visu_scalar_field_getGridSize(VisuScalarField *field, guint grid[3]); void visu_scalar_field_setGridSize(VisuScalarField *field, const guint grid[3]); void visu_scalar_field_setOriginShift(VisuScalarField *field, const float shift[3]); void visu_scalar_field_getOriginShift(VisuScalarField *field, float shift[3]); void visu_scalar_field_setMeshtype(VisuScalarField *field, VisuScalarFieldMeshFlags meshtype); void visu_scalar_field_addOption(VisuScalarField *field, ToolOption *option); void visu_scalar_field_getMinMax(VisuScalarField *field, double minmax[2]); VisuScalarFieldMeshFlags visu_scalar_field_getMeshtype(VisuScalarField *field); double* visu_scalar_field_getMeshx(VisuScalarField *field); double* visu_scalar_field_getMeshy(VisuScalarField *field); double* visu_scalar_field_getMeshz(VisuScalarField *field); double*** visu_scalar_field_getData(VisuScalarField *field); const GArray* visu_scalar_field_getDataArray(const VisuScalarField *field); const gchar* visu_scalar_field_getFilename(VisuScalarField *field); const gchar* visu_scalar_field_getCommentary(VisuScalarField *field); GList* visu_scalar_field_getAllOptions(VisuScalarField *field); gboolean visu_scalar_field_getValue(VisuScalarField *field, float xyz[3], double *value, float extension[3]); /* Handling load methos. */ /** * VISU_TYPE_SCALAR_FIELD_METHOD: * * Return the associated #GType to the VisuScalarFieldMethod objects. */ #define VISU_TYPE_SCALAR_FIELD_METHOD (visu_scalar_field_method_get_type ()) /** * VISU_SCALAR_FIELD_METHOD: * @obj: the widget to cast. * * Cast the given object to a #VisuScalarFieldMethod object. */ #define VISU_SCALAR_FIELD_METHOD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VISU_TYPE_SCALAR_FIELD_METHOD, VisuScalarFieldMethod)) /** * VISU_SCALAR_FIELD_METHOD_CLASS: * @klass: the class to cast. * * Cast the given class to a #VisuScalarFieldMethodClass object. */ #define VISU_SCALAR_FIELD_METHOD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VISU_TYPE_SCALAR_FIELD_METHOD, VisuScalarFieldMethodClass)) /** * VISU_IS_SCALAR_FIELD_METHOD: * @obj: the object to test. * * Return if the given object is a valid #VisuScalarFieldMethod object. */ #define VISU_IS_SCALAR_FIELD_METHOD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VISU_TYPE_SCALAR_FIELD_METHOD)) /** * VISU_IS_SCALAR_FIELD_METHOD_CLASS: * @klass: the class to test. * * Return if the given class is a valid #VisuScalarFieldMethodClass class. */ #define VISU_IS_SCALAR_FIELD_METHOD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VISU_TYPE_SCALAR_FIELD_METHOD)) /** * VISU_SCALAR_FIELD_METHOD_GET_CLASS: * @obj: the widget to get the class of. * * Get the class of the given object. */ #define VISU_SCALAR_FIELD_METHOD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_SCALAR_FIELD_METHOD, VisuScalarFieldMethodClass)) /** * VisuScalarFieldMethod: * * An opaque structure. */ typedef struct _VisuScalarFieldMethod VisuScalarFieldMethod; /** * VisuScalarFieldMethodClass: * * An opaque structure. */ typedef struct _VisuScalarFieldMethodClass VisuScalarFieldMethodClass; /** * visu_scalar_field_method_get_type * * #GType are unique numbers to identify objects. * * Returns: the #GType associated with #VisuScalarFieldMethod objects. */ GType visu_scalar_field_method_get_type(void); /** * VisuScalarFieldMethodLoadFunc: * @meth: a #VisuScalarFieldMethod object ; * @filename: (type filename): the filename (path) the field should be loaded from ; * @fieldList: (out) (element-type VisuScalarField): a #GList to store read field(s) ; * @error: a location on a error pointer. * * Read the given file try to load it as a scalar field file. * If succeed (i.e. with none fatal errors) the method should return TRUE, but if not * @fieldList must be unchanged and the method should return TRUE. If an error * occurs, it is stored into @error. When entering the routine, *@error must be NULL. * If @table is given, it means that the caller routine gives some options to the loader * routine. These options are a set of names and values. * * If the file contains several fields, they must be loaded and added to @fieldList. * * * Returns: TRUE if the read file is in a valid format (even with minor * errors), FALSE otherwise. */ typedef gboolean (*VisuScalarFieldMethodLoadFunc)(VisuScalarFieldMethod *meth, const gchar *filename, GList **fieldList, GError **error); VisuScalarFieldMethod* visu_scalar_field_method_new(const gchar* descr, const gchar** patterns, VisuScalarFieldMethodLoadFunc method, int priority); gboolean visu_scalar_field_method_load(VisuScalarFieldMethod *fmt, const gchar *filename, GList **fieldList, GError **error); GList* visu_scalar_field_method_getAll(void); #endif v_sim-3.7.0/src/extraFunctions/map.c0000644000353400050620000010702712215550266014320 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD, Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2005) Adresses mèl : BILLARD, non joignable par mèl ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD and Damien CALISTE and Olivier D'Astier, laboratoire L_Sim, (2001-2005) E-mail addresses : BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "map.h" #include "isoline.h" #include #include #include #include #include #include #ifdef HAVE_CAIRO #include #include #include #endif /** * SECTION:map * @short_description: Describe how to handle and draw coloured map on * a plane from a density field. * * A map is a coloured representation of a scalar field on a * plane. To define a new map, use visu_map_newFromPlane() and use * visu_map_setField() to associate a scalarfield to it. * The representation of the map is done by an adaptive mesh of * triangles. One can adjust the size of the smaller resolution by * using visu_map_setLevel(). Finally the level of adaptiveness is * chosen at rendering time by choosing a more or less crude precision * argument to visu_map_draw(). * In adition to the colour representation, isolines can be * drawn at given iso-values, see visu_map_setLines(). * An additionnal capability allows to export #VisuMap into SVG * or PDF vector files. * * Since: 3.6 */ /** * Triangle : * @triangle_ABC :a location to store coordinates of tree vertexs * @value_scalarfield: a location to store the value of scalarfideld * @min_node : the minimum value * @max_node : the maximum value * @rgba: a color,can be NULL; * @flag:return TRUE if the triangle has the least one vertex is out of bounds,return FALSE ifnot * * The structure is used to store informations about coordinates,color,position of each vertex and * the maximum and minimum value of scalarfield */ typedef struct _Triangle { float vertices[3][3]; float minmax[2]; float value[3]; guint level; struct _Triangle *children[4]; } Triangle; struct _VisuMap { guint refCount; /* Pointers to building objects. */ VisuPlane *plane; glong moved_signal; VisuScalarField *field; /* Transformation values. */ tool_matrix_getScaledValue get_val; tool_matrix_getScaledValue get_inv; double scaleminmax[2]; float extension[3]; /* Triangle structure. */ guint level; GList *triangles; /* The min/max valuess in [0;1] after colour transformation. */ float minmax[2]; /* The min/max values in scalarfield unit. */ float valMinMax[2]; guint nLines; VisuLine **lines; }; #define FLAG_RESOURCE_LEG_SCALE "map_legendScale" #define DESC_RESOURCE_LEG_SCALE "Choose the scale to draw the legend for coloured maps ; float (positive)" #define DEFT_RESOURCE_LEG_SCALE 1.f #define FLAG_RESOURCE_LEG_POS "map_legendPosition" #define DESC_RESOURCE_LEG_POS "Choose the legend position ; two floats (between 0 and 1)" #define DEFT_RESOURCE_LEG_POS 0.f static void exportResources(GString *data, VisuData *dataObj, VisuGlView *view); static Triangle* triangle_new(float ABC[3][3], guint level); static void triangle_free(Triangle *T); static void triangle_getDataAtLevel(Triangle *T, guint level, float **data, guint *pos); static void triangle_setValues(Triangle *T, VisuScalarField *field, tool_matrix_getScaledValue get_val, double minmax[2], float extension[3]); static void triangle_draw(Triangle *T, float thresh, const ToolShade *shade); static void triangle_drawWithAlpha(Triangle *T, float thresh, const ToolShade *shade); #ifdef HAVE_CAIRO static void triangle_drawToCairo(Triangle *T, cairo_t *cr, float thresh, const ToolShade *shade, float basis[2][3], float center[3]); #endif static void onPlaneMoved(VisuPlane *plane, gpointer data); static Triangle* triangle_new(float ABC[3][3], guint level) { Triangle *T; T = g_malloc(sizeof(Triangle)); T->children[0] = (Triangle*)0; T->children[1] = (Triangle*)0; T->children[2] = (Triangle*)0; T->children[3] = (Triangle*)0; T->minmax[0] = G_MAXFLOAT; T->minmax[1] = -G_MAXFLOAT; T->level = level; memcpy(T->vertices, ABC, sizeof(float) * 9); /* DBG_fprintf(stderr, "VisuScalarField: create Triangle %p (%d).\n", (gpointer)T, level); */ return T; } static void triangle_free(Triangle *T) { if (T->children[0]) triangle_free(T->children[0]); if (T->children[1]) triangle_free(T->children[1]); if (T->children[2]) triangle_free(T->children[2]); if (T->children[3]) triangle_free(T->children[3]); g_free(T); } static void triangle_getDataAtLevel(Triangle *T, guint level, float **data, guint *pos) { if (T->level == level) { (data + (*pos))[0] = (float*)T->vertices; (data + (*pos))[1] = (float*)T->value; *pos += 2; return; } if (T->children[0]) triangle_getDataAtLevel(T->children[0], level, data, pos); if (T->children[1]) triangle_getDataAtLevel(T->children[1], level, data, pos); if (T->children[2]) triangle_getDataAtLevel(T->children[2], level, data, pos); if (T->children[3]) triangle_getDataAtLevel(T->children[3], level, data, pos); } static void _3DToVisuPlane(float uv[2], float xyz[3], float basis[2][3], float origin[3]) { uv[0] = basis[0][0] * (xyz[0] - origin[0]) + basis[0][1] * (xyz[1] - origin[1]) + basis[0][2] * (xyz[2] - origin[2]); uv[1] = basis[1][0] * (xyz[0] - origin[0]) + basis[1][1] * (xyz[1] - origin[1]) + basis[1][2] * (xyz[2] - origin[2]); } static void triangle_setValues(Triangle *T, VisuScalarField *field, tool_matrix_getScaledValue get_val, double minmax[2], float extension[3]) { double value; int i; g_return_if_fail(T); T->minmax[0] = G_MAXFLOAT; T->minmax[1] = -G_MAXFLOAT; if (field) for (i = 0; i < 3; i++) { if (!visu_scalar_field_getValue(field, T->vertices[i], &value, extension)) if (!visu_scalar_field_getValue(field, T->vertices[(i + 1) % 3], &value, extension)) visu_scalar_field_getValue(field, T->vertices[(i + 2) % 3], &value, extension); T->value[i] = (float)get_val(value, minmax); T->minmax[0] = MIN(T->minmax[0], T->value[i]); T->minmax[1] = MAX(T->minmax[1], T->value[i]); } } static void triangle_draw(Triangle *T, float thresh, const ToolShade *shade) { /* gchar str[32]; */ float rgba[4]; if ((T->minmax[1] - T->minmax[0]) <= thresh || (!T->children[0] && !T->children[1] && !T->children[2] && !T->children[3])) { glBegin(GL_TRIANGLE_STRIP); tool_shade_valueToRGB(shade, rgba, T->value[0]); glColor3fv(rgba); glVertex3fv(T->vertices[0]); tool_shade_valueToRGB(shade, rgba, T->value[1]); glColor3fv(rgba); glVertex3fv(T->vertices[1]); tool_shade_valueToRGB(shade, rgba, T->value[2]); glColor3fv(rgba); glVertex3fv(T->vertices[2]); glEnd(); /* sprintf(str, "%6.5f", T->value[0]); */ /* glColor3fv(T->rgba[0]); */ /* glRasterPos3fv(T->vertices[0]); visu_gl_text_drawChars(str, VISU_GL_TEXT_SMALL); */ /* sprintf(str, "%6.5f", T->value[1]); */ /* glColor3fv(T->rgba[1]); */ /* glRasterPos3fv(T->vertices[1]); visu_gl_text_drawChars(str, VISU_GL_TEXT_SMALL); */ /* sprintf(str, "%6.5f", T->value[2]); */ /* glColor3fv(T->rgba[2]); */ /* glRasterPos3fv(T->vertices[2]); visu_gl_text_drawChars(str, VISU_GL_TEXT_SMALL); */ return; } if (T->children[0]) triangle_draw(T->children[0], thresh, shade); if (T->children[1]) triangle_draw(T->children[1], thresh, shade); if (T->children[2]) triangle_draw(T->children[2], thresh, shade); if (T->children[3]) triangle_draw(T->children[3], thresh, shade); } static void triangle_drawWithAlpha(Triangle *T, float thresh, const ToolShade *shade) { /* gchar str[32]; */ float rgba[4]; if ((T->minmax[1] - T->minmax[0]) <= thresh || (!T->children[0] && !T->children[1] && !T->children[2] && !T->children[3])) { glBegin(GL_TRIANGLE_STRIP); tool_shade_valueToRGB(shade, rgba, T->value[0]); rgba[3] = T->value[0]; glColor4fv(rgba); glVertex3fv(T->vertices[0]); tool_shade_valueToRGB(shade, rgba, T->value[1]); rgba[3] = T->value[1]; glColor4fv(rgba); glVertex3fv(T->vertices[1]); tool_shade_valueToRGB(shade, rgba, T->value[2]); rgba[3] = T->value[2]; glColor4fv(rgba); glVertex3fv(T->vertices[2]); glEnd(); return; } if (T->children[0]) triangle_drawWithAlpha(T->children[0], thresh, shade); if (T->children[1]) triangle_drawWithAlpha(T->children[1], thresh, shade); if (T->children[2]) triangle_drawWithAlpha(T->children[2], thresh, shade); if (T->children[3]) triangle_drawWithAlpha(T->children[3], thresh, shade); } #ifdef HAVE_CAIRO static void triangle_drawToCairo(Triangle *T, cairo_t *cr, float thresh, const ToolShade *shade, float basis[2][3], float center[3]) { float uv[2]; float v, rgba[4]; if ((T->minmax[1] - T->minmax[0]) <= thresh || (!T->children[0] && !T->children[1] && !T->children[2] && !T->children[3])) { v = (T->value[0] + T->value[1] + T->value[2]) / 3.f; tool_shade_valueToRGB(shade, rgba, v); cairo_set_source_rgba(cr, rgba[0], rgba[1], rgba[2], 1.f); _3DToVisuPlane(uv, T->vertices[0], basis, center); cairo_move_to(cr, uv[0], uv[1]); _3DToVisuPlane(uv, T->vertices[1], basis, center); cairo_line_to(cr, uv[0], uv[1]); _3DToVisuPlane(uv, T->vertices[2], basis, center); cairo_line_to(cr, uv[0], uv[1]); _3DToVisuPlane(uv, T->vertices[0], basis, center); cairo_line_to(cr, uv[0], uv[1]); cairo_fill_preserve(cr); /* cairo_set_source_rgb(cr, 0., 0., 0.); */ cairo_stroke(cr); return; } if (T->children[0]) triangle_drawToCairo(T->children[0], cr, thresh, shade, basis, center); if (T->children[1]) triangle_drawToCairo(T->children[1], cr, thresh, shade, basis, center); if (T->children[2]) triangle_drawToCairo(T->children[2], cr, thresh, shade, basis, center); if (T->children[3]) triangle_drawToCairo(T->children[3], cr, thresh, shade, basis, center); } #endif /**************************/ /* The Map object itself. */ /**************************/ /** * visu_map_get_type: * @void: * * Create and retrieve a #GType for a #VisuMap object. * * Since: 3.7 * * Returns: a new type for #VisuMap structures. **/ GType visu_map_get_type(void) { static GType g_define_type_id = 0; if (g_define_type_id == 0) g_define_type_id = g_boxed_type_register_static("VisuMap", (GBoxedCopyFunc)visu_map_ref, (GBoxedFreeFunc)visu_map_unref); return g_define_type_id; } /** * visu_map_ref: * @map: a #VisuMap object. * * Increase the ref counter. * * Since: 3.7 * * Returns: itself. **/ VisuMap* visu_map_ref(VisuMap *map) { map->refCount += 1; return map; } /** * visu_map_unref: * @map: a #VisuMap object. * * Decrease the ref counter, free all memory if counter reachs zero. * * Since: 3.7 **/ void visu_map_unref(VisuMap *map) { map->refCount -= 1; if (!map->refCount) visu_map_free(map); } /** * visu_map_new: * * Creates a new #VisuMap object. * * Since: 3.6 * * Returns: (transfer full): a newly created #VisuMap object. */ VisuMap* visu_map_new() { VisuMap *map; map = g_malloc(sizeof(VisuMap)); map->plane = (VisuPlane*)0; map->moved_signal = 0; map->field = (VisuScalarField*)0; map->level = 0; map->minmax[0] = G_MAXFLOAT; map->minmax[1] = -G_MAXFLOAT; map->triangles = (GList*)0; map->nLines = 0; map->lines = (VisuLine**)0; DBG_fprintf(stderr, "Map: create a new map object at %p.\n", (gpointer)map); return map; } /** * visu_map_newFromPlane: * @plane: a #VisuPlane object. * * Creates a new #VisuMap object, projected on @plane. * * Since: 3.6 * * Returns: a newly created #VisuMap object. */ VisuMap* visu_map_newFromPlane(VisuPlane *plane) { VisuMap *map; map = visu_map_new(); visu_map_setPlane(map, plane); return map; } /** * visu_map_free: * @map: a #VisuMap object. * * Deallocate all memory related to @map. * * Since: 3.6 */ void visu_map_free(VisuMap *map) { DBG_fprintf(stderr, "Map: free object %p.\n", (gpointer)map); visu_map_setPlane(map, (VisuPlane*)0); visu_map_setField(map, (VisuScalarField*)0, 0, (float*)0); g_free(map); } static float** map_getDataAtLevel(VisuMap *map, guint level, guint *n) { float **data; guint i, m; GList *lst; g_return_val_if_fail(map && map->triangles, (float**)0); g_return_val_if_fail(level < 13, (float**)0); m = pow(4, level) * g_list_length(map->triangles); data = g_malloc(sizeof(float*) * m * 2); if (n) *n = m; DBG_fprintf(stderr, "VisuScalarField: generate the triangle data for %d triangles.\n", m); i = 0; for (lst = map->triangles; lst; lst = g_list_next(lst)) triangle_getDataAtLevel((Triangle*)lst->data, level, data, &i); return data; } /** * visu_map_setPlane: * @map: a #VisuMap object. * @plane: (transfer full) (allow-none): a #VisuPlane object. * * Set the internal #VisuPlane of @map to @plane. All changed to * @plane will be automatically propagated to @map. Use * visu_map_setField() to choose the field to take values from, set * the level precision with visu_map_setLevel() and finally call * visu_map_compute() to get the map. * * Since: 3.7 * * Returns: TRUE if internal plane is changed. **/ gboolean visu_map_setPlane(VisuMap *map, VisuPlane *plane) { GList *inter, *lst; float xyz[2][3], ABC[3][3]; guint i; g_return_val_if_fail(map, FALSE); /* Free currently allocated triangles. */ for (lst = map->triangles; lst; lst = g_list_next(lst)) triangle_free((Triangle*)lst->data); g_list_free(map->triangles); map->triangles = (GList*)0; for (i = 0; i < map->nLines; i++) visu_line_free(map->lines[i]); if (map->lines) g_free(map->lines); map->lines = (VisuLine**)0; map->nLines = 0; /* Free previous handle on plane. */ if (map->plane) { g_signal_handler_disconnect(G_OBJECT(map->plane), map->moved_signal); g_object_unref(map->plane); } map->plane = plane; if (!plane) return TRUE; /* Reallocate everyone. */ g_object_ref(plane); map->moved_signal = g_signal_connect(G_OBJECT(plane), "moved", G_CALLBACK(onPlaneMoved), (gpointer)map); inter = visu_plane_getIntersection(plane); visu_plane_getBasis(plane, xyz, ABC[0]); if (!inter) return TRUE; i = 1; ABC[i][0] = ((float*)inter->data)[0]; ABC[i][1] = ((float*)inter->data)[1]; ABC[i][2] = ((float*)inter->data)[2]; for (inter = g_list_next(inter); inter; inter = g_list_next(inter)) { i = i % 2 + 1; ABC[i][0] = ((float*)inter->data)[0]; ABC[i][1] = ((float*)inter->data)[1]; ABC[i][2] = ((float*)inter->data)[2]; map->triangles = g_list_append(map->triangles, triangle_new(ABC, 0)); } inter = visu_plane_getIntersection(plane); i = i % 2 + 1; ABC[i][0] = ((float*)inter->data)[0]; ABC[i][1] = ((float*)inter->data)[1]; ABC[i][2] = ((float*)inter->data)[2]; map->triangles = g_list_append(map->triangles, triangle_new(ABC, 0)); visu_box_getExtension(visu_boxed_getBox(VISU_BOXED(map->plane)), map->extension); return TRUE; } /** * visu_map_setField: * @map: a #VisuMap object. * @field: a #VisuScalarField object. * @scale: a flag. * @inputMinMax: two floats or NULL. * * It associates the values of @field to @map. The calculation is not * directly done, and a call to visu_map_compute() is necessary. If * @inputMinMax is provided, these values are used to scale the values * of @field to [0;1], otherwise the minMax values of the field itself * are used. The scaling algorithm is defined by @scale. * * Since: 3.6 * * Returns: TRUE if @field is changed. */ gboolean visu_map_setField(VisuMap *map, VisuScalarField *field, ToolMatrixScalingFlag scale, float *inputMinMax) { g_return_val_if_fail(map, FALSE); if (map->field) g_object_unref(G_OBJECT(map->field)); map->field = field; map->minmax[0] = G_MAXFLOAT; map->minmax[1] = -G_MAXFLOAT; if (!field) return TRUE; g_object_ref(G_OBJECT(field)); if (!inputMinMax) visu_scalar_field_getMinMax(field, map->scaleminmax); else { map->scaleminmax[0] = inputMinMax[0]; map->scaleminmax[1] = inputMinMax[1]; } /* In log scale, we need the second minimum value. */ switch (scale) { case TOOL_MATRIX_SCALING_LINEAR: map->get_val = tool_matrix_getScaledLinear; map->get_inv = tool_matrix_getScaledLinearInv; break; case TOOL_MATRIX_SCALING_LOG: map->get_val = tool_matrix_getScaledLog; map->get_inv = tool_matrix_getScaledLogInv; break; case TOOL_MATRIX_SCALING_ZERO_CENTRED_LOG: map->get_val = tool_matrix_getScaledZeroCentredLog; map->get_inv = tool_matrix_getScaledZeroCentredLogInv; break; default: map->get_val = tool_matrix_getScaledLinear; map->get_inv = tool_matrix_getScaledLinearInv; break; } return TRUE; } /** * visu_map_setLevel: * @map: a #VisuMap object. * @glPrec: the global OpenGL precision for drawing (default is 1.). * @gross: current zoom level. * @refLength: a reference length (see visu_gl_camera_getRefLength()). * * Setup the level of recursivity in triangle calculation, depending * on the current zoom level. * * Since: 3.6 * * Returns: TRUE if the level is actually changed. */ gboolean visu_map_setLevel(VisuMap *map, float glPrec, float gross, float refLength) { float length, mLength, *xyz, basis[2][3], center[3]; GList *inter; guint level; g_return_val_if_fail(map && map->plane, FALSE); visu_plane_getBasis(map->plane, basis, center); mLength = 0.f; /* In case of no intersections, we build an empty list. */ for (inter = visu_plane_getIntersection(map->plane); inter; inter = g_list_next(inter)) { xyz = (float*)inter->data; mLength = MAX(mLength, (xyz[0] - center[0]) * (xyz[0] - center[0]) + (xyz[1] - center[1]) * (xyz[1] - center[1]) + (xyz[2] - center[2]) * (xyz[2] - center[2])); } /* We put by default (precision and gross = 1) 300 triangles along the longest line. */ length = refLength / (300. * glPrec * (gross * .5 + .5)); level = MIN(12, MAX((guint)(log(sqrt(mLength) / length) / log(2)), 1) - 1); DBG_fprintf(stderr, "Map: number of division %d for map %p.\n", level, (gpointer)map); if (level == map->level) return FALSE; map->level = level; if (level > 20) g_warning("Important level for triangle refining in maps."); return TRUE; } /** * visu_map_setLines: * @map: a #VisuMap object. * @nIsoLines: number of required isolines. * @minmax: span for isoline values. * * Calculate @nIsoLines equally distributed in @minmax. * * Since: 3.6 * * Returns: TRUE if lines are successfully calculated. */ gboolean visu_map_setLines(VisuMap *map, guint nIsoLines, float minmax[2]) { float v, **data; guint i, j, n; g_return_val_if_fail(map, FALSE); DBG_fprintf(stderr, "Map: free old lines (%d).\n", map->nLines); for (i = 0; i < map->nLines; i++) visu_line_free(map->lines[i]); if (map->lines) g_free(map->lines); map->nLines = 0; map->lines = (VisuLine**)0; DBG_fprintf(stderr, "Map: create %d new lines for map %p.\n", nIsoLines, (gpointer)0); if (nIsoLines > 0) { n = 0; data = map_getDataAtLevel(map, map->level, &n); map->lines = g_malloc(sizeof(VisuLine*) * nIsoLines); j = 0; for (i = 1; i <= nIsoLines; i++) { v = minmax[0] + (minmax[1] - minmax[0]) * (float)i / (float)(nIsoLines + 1); DBG_fprintf(stderr, "Map: compute line %d at value %f.\n", j, v); map->lines[j] = visu_line_newFromTriangles(data, n, v); if (map->lines[j]) j += 1; DBG_fprintf(stderr, " | Ok %p.\n", (gpointer)map->lines[j]); } map->nLines = j; g_free(data); if (!map->nLines) { g_free(map->lines); map->lines = (VisuLine**)0; } } return TRUE; } static void map_refine(VisuMap *map, Triangle *T) { float ABC[3][3]; g_return_if_fail(T && map && T->level < 100); /* We update the values of this triangle. */ triangle_setValues(T, map->field, map->get_val, map->scaleminmax, map->extension); if (T->level >= map->level) return; if (!T->children[0]) { ABC[0][0] = T->vertices[0][0]; ABC[0][1] = T->vertices[0][1]; ABC[0][2] = T->vertices[0][2]; ABC[1][0] = 0.5f * (ABC[0][0] + T->vertices[1][0]); ABC[1][1] = 0.5f * (ABC[0][1] + T->vertices[1][1]); ABC[1][2] = 0.5f * (ABC[0][2] + T->vertices[1][2]); ABC[2][0] = 0.5f * (ABC[0][0] + T->vertices[2][0]); ABC[2][1] = 0.5f * (ABC[0][1] + T->vertices[2][1]); ABC[2][2] = 0.5f * (ABC[0][2] + T->vertices[2][2]); T->children[0] = triangle_new(ABC, T->level + 1); } map_refine(map, T->children[0]); T->minmax[0] = MIN(T->minmax[0], T->children[0]->minmax[0]); T->minmax[1] = MAX(T->minmax[1], T->children[0]->minmax[1]); if (!T->children[1]) { ABC[0][0] = 0.5f * (T->vertices[2][0] + T->vertices[1][0]); ABC[0][1] = 0.5f * (T->vertices[2][1] + T->vertices[1][1]); ABC[0][2] = 0.5f * (T->vertices[2][2] + T->vertices[1][2]); T->children[1] = triangle_new(ABC, T->level + 1); } map_refine(map, T->children[1]); T->minmax[0] = MIN(T->minmax[0], T->children[1]->minmax[0]); T->minmax[1] = MAX(T->minmax[1], T->children[1]->minmax[1]); if (!T->children[2]) { ABC[2][0] = T->vertices[1][0]; ABC[2][1] = T->vertices[1][1]; ABC[2][2] = T->vertices[1][2]; T->children[2] = triangle_new(ABC, T->level + 1); } map_refine(map, T->children[2]); T->minmax[0] = MIN(T->minmax[0], T->children[2]->minmax[0]); T->minmax[1] = MAX(T->minmax[1], T->children[2]->minmax[1]); if (!T->children[3]) { ABC[1][0] = 0.5f * (T->vertices[0][0] + T->vertices[2][0]); ABC[1][1] = 0.5f * (T->vertices[0][1] + T->vertices[2][1]); ABC[1][2] = 0.5f * (T->vertices[0][2] + T->vertices[2][2]); ABC[2][0] = T->vertices[2][0]; ABC[2][1] = T->vertices[2][1]; ABC[2][2] = T->vertices[2][2]; T->children[3] = triangle_new(ABC, T->level + 1); } map_refine(map, T->children[3]); T->minmax[0] = MIN(T->minmax[0], T->children[3]->minmax[0]); T->minmax[1] = MAX(T->minmax[1], T->children[3]->minmax[1]); } /** * visu_map_compute: * @map: a #VisuMap object. * * After a #VisuPlane and a #VisuScalarField has been defined (see * visu_map_newFromPlane() and visu_map_setField()), the map is * computed by refining a triangle approximation up to level defined * by visu_map_setLevel(). The evaluation is lazy and calculation is * indeed done, only if required level is lower than actual * level. Calculation is done only for missing levels anyway. * * Since: 3.6 */ void visu_map_compute(VisuMap *map) { GList *inter; g_return_if_fail(map && map->plane && map->field); DBG_fprintf(stderr, "Map: refine all triangles of map %p (%d).\n", (gpointer)map, g_list_length(map->triangles)); for (inter = map->triangles; inter; inter = g_list_next(inter)) { map_refine(map, (Triangle*)inter->data); DBG_fprintf(stderr, " | %p done.\n", inter->data); map->minmax[0] = MIN(map->minmax[0], ((Triangle*)inter->data)->minmax[0]); map->minmax[1] = MAX(map->minmax[1], ((Triangle*)inter->data)->minmax[1]); } DBG_fprintf(stderr, " | minmax is %g %g.\n", map->minmax[0], map->minmax[1]); map->valMinMax[0] = map->get_inv(map->minmax[0], map->scaleminmax); map->valMinMax[1] = map->get_inv(map->minmax[1], map->scaleminmax); DBG_fprintf(stderr, " | memory usage is %gko\n", g_list_length(map->triangles) * pow(4, map->level) * sizeof(Triangle) / 1024.f); DBG_fprintf(stderr, " | %d lines.\n", map->nLines); } static void onPlaneMoved(VisuPlane *plane, gpointer data) { VisuMap *map = (VisuMap*)data; /* We reset the plane. */ visu_map_setPlane(map, plane); /* We recompute. */ if (map->field) visu_map_compute(map); } /** * visu_map_draw: * @map: a #VisuMap object. * @prec: a pourcentage value. * @shade: a #ToolShade object. * @rgb: a colour or NULL. * @alpha: a boolean. * * It draws the @map with the given @shade. @prec give the level of * refinement used to draw the map, 100 means normal and 200 means * twice smaller level. If @rgb is present, this colour is used for * possible isolines. If @alpha is TRUE, an alpha channel is added as * a linear variation of the value of each vertex. * * Since: 3.6 */ void visu_map_draw(VisuMap *map, float prec, ToolShade *shade, float *rgb, gboolean alpha) { GList *inter; float thresh; guint i; float rgba[4]; if (!map->plane || !map->field) return; glDisable(GL_CULL_FACE); glDisable(GL_LIGHTING); prec = (.06f - prec * 0.0003f); DBG_fprintf(stderr, "Map: plot triangles.\n"); thresh = (map->minmax[1] - map->minmax[0]) * prec; if (alpha) for (inter = map->triangles; inter; inter = g_list_next(inter)) triangle_drawWithAlpha((Triangle*)inter->data, thresh, shade); else for (inter = map->triangles; inter; inter = g_list_next(inter)) triangle_draw((Triangle*)inter->data, thresh, shade); DBG_fprintf(stderr, "Map: plot lines.\n"); for (i = 0; i < map->nLines; i++) { if (!rgb) { tool_shade_valueToRGB(shade, rgba, visu_line_getValue(map->lines[i])); rgba[0] = 1.f - rgba[0]; rgba[1] = 1.f - rgba[1]; rgba[2] = 1.f - rgba[2]; rgb = rgba; } visu_line_draw(map->lines[i], rgb); } if (!alpha) { DBG_fprintf(stderr, "Map: plot box.\n"); glLineWidth(1.f); glColor3f(0.f, 0.f, 0.f); glBegin(GL_LINE_LOOP); for (inter = visu_plane_getIntersection(map->plane); inter; inter = g_list_next(inter)) glVertex3fv((float*)inter->data); glEnd(); } glEnable(GL_CULL_FACE); glEnable(GL_LIGHTING); } /** * visu_map_getPlane: * @map: a #VisuMap object. * * Retrieves the plane @map is based on. * * Since: 3.7 * * Returns: (transfer none) (allow-none): a #VisuPlane or %NULL. **/ VisuPlane* visu_map_getPlane(VisuMap *map) { g_return_val_if_fail(map, (VisuPlane*)0); return map->plane; } /** * visu_map_getScaledMinMax: * @map: a #VisuMap object. * * After @map has been computed by visu_map_compute(), one can access * the scaled min and max values represented in the map. For * field values, see visu_map_getFieldMinMax(). * * Since: 3.6 * * Returns: two floats being the min and the max in [0;1]. */ float* visu_map_getScaledMinMax(VisuMap *map) { g_return_val_if_fail(map, (float*)0); return map->minmax; } /** * visu_map_getFieldMinMax: * @map: a #VisuMap object. * * After @map has been computed by visu_map_compute(), one can access * the min and max values of the field as represented in the map. For * scaled values, see visu_map_getScaledMinMax(). * * Since: 3.6 * * Returns: two floats being the min and the max. */ float* visu_map_getFieldMinMax(VisuMap *map) { g_return_val_if_fail(map, (float*)0); return map->valMinMax; } /** * visu_map_export: * @map: a #VisuMap object. * @shade: a #ToolShade object. * @rgb: a colour (can be NULL). * @precision: a pourcentage for rendering quality. * @filename: the location to export to. * @format: the kind of format. * @error: a location to store an error. * * Export the given map to the @format, using the @shade color. If * @rgb is provided and @map has some isolines, they will be drawn * with this colour, otherwise an inverse colour is used. * * Since: 3.6 * * Returns: TRUE if no error. */ gboolean visu_map_export(VisuMap *map, ToolShade *shade, float *rgb, float precision, gchar *filename, VisuMapExportFormat format, GError **error) { #ifdef HAVE_CAIRO #define fact 25.f float viewport[4]; guint i, j; float *uvs; guint nVals; cairo_surface_t *surface; cairo_t *cr; cairo_status_t status; cairo_matrix_t mat = {fact, 0., 0., fact, 0., 0.}; float basis[2][3], center[3], uv[2], rgba[4]; GList *lst; g_return_val_if_fail(error && *error == (GError*)0, FALSE); viewport[0] = viewport[2] = G_MAXFLOAT; viewport[1] = viewport[3] = -G_MAXFLOAT; visu_plane_getBasis(map->plane, basis, center); for (lst = visu_plane_getIntersection(map->plane); lst; lst = g_list_next(lst)) { _3DToVisuPlane(uv, (float*)lst->data, basis, center); viewport[0] = MIN(viewport[0], uv[0]); viewport[1] = MAX(viewport[1], uv[0]); viewport[2] = MIN(viewport[2], uv[1]); viewport[3] = MAX(viewport[3], uv[1]); } DBG_fprintf(stderr, "Map: begin export to PDF/SVG in (%f-%f x %f-%f).\n", viewport[0], viewport[1], viewport[2], viewport[3]); switch (format) { case VISU_MAP_EXPORT_SVG: surface = cairo_svg_surface_create(filename, (double)((viewport[1] - viewport[0]) * fact), (double)((viewport[3] - viewport[2]) * fact)); break; case VISU_MAP_EXPORT_PDF: surface = cairo_pdf_surface_create(filename, (double)((viewport[1] - viewport[0]) * fact), (double)((viewport[3] - viewport[2]) * fact)); break; default: surface = (cairo_surface_t*)0; } status = cairo_surface_status(surface); if (status != CAIRO_STATUS_SUCCESS) { *error = g_error_new(G_FILE_ERROR, G_FILE_ERROR_FAILED, "%s", cairo_status_to_string(status)); cairo_surface_destroy(surface); visu_map_free(map); return FALSE; } cr = cairo_create(surface); status = cairo_status(cr); if (status != CAIRO_STATUS_SUCCESS) { *error = g_error_new(G_FILE_ERROR, G_FILE_ERROR_FAILED, "%s", cairo_status_to_string(status)); cairo_destroy(cr); cairo_surface_destroy(surface); visu_map_free(map); return FALSE; } mat.x0 = -(double)viewport[0] * fact; mat.y0 = -(double)viewport[2] * fact; cairo_set_matrix(cr, &mat); cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT); cairo_set_line_join(cr, CAIRO_LINE_JOIN_BEVEL); cairo_set_line_width(cr, 0.01); for (lst = map->triangles; lst; lst = g_list_next(lst)) triangle_drawToCairo((Triangle*)lst->data, cr, (map->minmax[1] - map->minmax[0]) * (.06f - precision * 0.0003f), shade, basis, center); /* Add isolines. */ DBG_fprintf(stderr, "Map: export isolines.\n"); for (i = 0; i < map->nLines; i++) { if (!rgb) { tool_shade_valueToRGB(shade, rgba, visu_line_getValue(map->lines[i])); rgba[0] = 1.f - rgba[0]; rgba[1] = 1.f - rgba[1]; rgba[2] = 1.f - rgba[2]; rgba[3] = 1.f; rgb = rgba; } cairo_set_source_rgb(cr, rgb[0], rgb[1], rgb[2]); DBG_fprintf(stderr, "VisuScalarFields: project line on plane %p.\n", (gpointer)map->plane); uvs = visu_line_project(map->lines[i], map->plane, &nVals); for (j = 0; j < nVals; j++) { cairo_move_to(cr, uvs[j * 4 + 0], uvs[j * 4 + 1]); cairo_line_to(cr, uvs[j * 4 + 2], uvs[j * 4 + 3]); cairo_stroke(cr); } g_free(uvs); } /* Add frame. */ DBG_fprintf(stderr, "Map: export the frame.\n"); uvs = visu_plane_getReducedIntersection(map->plane, &nVals); if (uvs) { cairo_set_source_rgb(cr, 0., 0., 0.); cairo_move_to(cr, uvs[(nVals - 1) * 2 + 0], uvs[(nVals - 1) * 2 + 1]); for (j = 0; j < nVals; j++) cairo_line_to(cr, uvs[j * 2 + 0], uvs[j * 2 + 1]); cairo_stroke(cr); g_free(uvs); } /* Add legend. */ /* toolShadeExport(shade, (double)(viewport[2] * fact), */ /* (double)(viewport[3] * fact)); */ /* Finalising */ cairo_show_page(cr); cairo_destroy(cr); cairo_surface_destroy(surface); return TRUE; #else g_error("Not compiled with CAIRO not able to export."); return FALSE; #endif } /*****************/ /* Init routine. */ /*****************/ /** * visu_map_init: (skip) * * Initialise the map routines. Should not be called except at * initialisation time. * * Since: 3.7 */ void visu_map_init() { float rgWidth[2] = {0.01f, 10.f}; float rgPos[2] = {0.f, 1.f}; VisuConfigFileEntry *conf; DBG_fprintf(stderr, "Map: set the conf entries for this module.\n"); conf = visu_config_file_addFloatArrayEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_LEG_SCALE, DESC_RESOURCE_LEG_SCALE, 1, &visu_map_legendScale, rgWidth); visu_config_file_entry_setVersion(conf, 3.7f); conf = visu_config_file_addFloatArrayEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_LEG_POS, DESC_RESOURCE_LEG_POS, 2, visu_map_legendPosition, rgPos); visu_config_file_entry_setVersion(conf, 3.7f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_RESOURCE, exportResources); visu_map_legendScale = DEFT_RESOURCE_LEG_SCALE; visu_map_legendPosition[0] = DEFT_RESOURCE_LEG_POS; visu_map_legendPosition[1] = DEFT_RESOURCE_LEG_POS; } /*************************/ /* Resources management. */ /*************************/ static void exportResources(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { visu_config_file_exportComment(data, DESC_RESOURCE_LEG_SCALE); visu_config_file_exportEntry(data, FLAG_RESOURCE_LEG_SCALE, NULL, "%f", visu_map_legendScale); visu_config_file_exportComment(data, DESC_RESOURCE_LEG_POS); visu_config_file_exportEntry(data, FLAG_RESOURCE_LEG_POS, NULL, "%f %f", visu_map_legendPosition[0], visu_map_legendPosition[1]); visu_config_file_exportComment(data, ""); } v_sim-3.7.0/src/extraFunctions/map.h0000644000353400050620000000675512215546074014335 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD, Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2005) Adresses mèl : BILLARD, non joignable par mèl ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD and Damien CALISTE and Olivier D'Astier, laboratoire L_Sim, (2001-2005) E-mail addresses : BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef MAP_H #define MAP_H #include #include "scalarFields.h" #include "plane.h" #include /** * VisuMapExportFormat: * @VISU_MAP_EXPORT_SVG: SVG export ; * @VISU_MAP_EXPORT_PDF: PDF export. * * Possible export for the map, see visu_map_export(). * * Since: 3.6 */ typedef enum { VISU_MAP_EXPORT_SVG, VISU_MAP_EXPORT_PDF } VisuMapExportFormat; /** * VisuMap: * * All fields are private. * * Since: 3.6 */ typedef struct _VisuMap VisuMap; float visu_map_legendScale, visu_map_legendPosition[2]; #define VISU_TYPE_MAP (visu_map_get_type()) GType visu_map_get_type(void); VisuMap* visu_map_new(); VisuMap* visu_map_newFromPlane(VisuPlane *plane); VisuMap* visu_map_ref(VisuMap *map); void visu_map_unref(VisuMap *map); void visu_map_free(VisuMap *map); gboolean visu_map_setPlane(VisuMap *map, VisuPlane *plane); gboolean visu_map_setField(VisuMap *map, VisuScalarField *field, ToolMatrixScalingFlag scale, float *inputMinMax); gboolean visu_map_setLevel(VisuMap *map, float glPrec, float gross, float refLength); gboolean visu_map_setLines(VisuMap *map, guint nIsoLines, float minmax[2]); VisuPlane* visu_map_getPlane(VisuMap *map); float* visu_map_getScaledMinMax(VisuMap *map); float* visu_map_getFieldMinMax(VisuMap *map); void visu_map_compute(VisuMap *map); void visu_map_draw(VisuMap *map, float prec, ToolShade *shade, float *rgb, gboolean alpha); gboolean visu_map_export(VisuMap *map, ToolShade *shade, float *rgb, float precision, gchar *filename, VisuMapExportFormat format, GError **error); void visu_map_init(); #endif v_sim-3.7.0/src/extraFunctions/isoline.c0000644000353400050620000003324412215546074015206 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Aurlien LHERBIER, laboratoire L_Sim, (2001-2005) Adresse ml : LHERBIER, aurelien P lherbier A cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Aurlien LHERBIER, laboratoire L_Sim, (2001-2005) E-mail addresses : LHERBIER, aurelien D lherbier AT cea D fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include #include "isoline.h" /** * SECTION:isoline * @short_description: handle the drawing and the computation of * isolines. * * TODO */ /** * VisuLine: * * Structure representing a curved line in 3D, opaque structure. */ struct _VisuLine { guint refCount; guint num_sublines, num_vertices; float **vertex_3dpos; double value; }; static gboolean Create_line(int *iTab, int ntriangles, double *xline, double *yline, double *zline, VisuLine **isoline); static int edgeTable[8] = { 0x0 , 0x0, 0x0, 0x1, 0x0, 0x2, 0x3, 0x4 }; static int linTable[5][5] = { {-1, -1, -1, -1, -1}, { 0, 1, -1, -1, -1}, { 0, 2, -1, -1, -1}, { 1, 2, -1, -1, -1}, { 0, 1, 2, 0, -1} }; /******************************************************************************/ /******************************************************************************/ /* DEVELOPMENT AREA Methods are copied to be callable without all static stuff everywhere. */ /** * visu_line_free: * @line: a set of lines. * * Free the line object. * * Since: 3.4 */ void visu_line_free(VisuLine *line) { g_return_if_fail(line); DBG_fprintf(stderr, "Line: free line %p.\n", (gpointer)line); if(line->vertex_3dpos) { g_free(line->vertex_3dpos[0]); g_free(line->vertex_3dpos); } DBG_fprintf(stderr, " | Ok.\n"); } /** * visu_line_get_type: * @void: * * Create and retrieve a #GType for a #VisuLine object. * * Since: 3.7 * * Returns: a new type for #VisuLine structures. **/ GType visu_line_get_type(void) { static GType g_define_type_id = 0; if (g_define_type_id == 0) g_define_type_id = g_boxed_type_register_static("VisuLine", (GBoxedCopyFunc)visu_line_ref, (GBoxedFreeFunc)visu_line_unref); return g_define_type_id; } /** * visu_line_ref: * @line: a #VisuLine object. * * Increase the ref counter. * * Since: 3.7 * * Returns: itself. **/ VisuLine* visu_line_ref(VisuLine *line) { line->refCount += 1; return line; } /** * visu_line_unref: * @line: a #VisuLine object. * * Decrease the ref counter, free all memory if counter reachs zero. * * Since: 3.7 **/ void visu_line_unref(VisuLine *line) { line->refCount -= 1; if (!line->refCount) visu_line_free(line); } /** * visu_line_newFromTriangles: * @data: the lines to be computed ; * @nTriangles: the surface to compute isoline from ; * @isoValue: the value of the computed isoline. * * Create on the fly an isoline from a given set of triangles. If the * lines are created, @isoline will be allocated and should be freed * with visu_line_free() after use. * * Since: 3.6 * * Returns: the newly allocated #VisuLine or NULL. */ VisuLine* visu_line_newFromTriangles(float **data, guint nTriangles, double isoValue) { /* Local variables */ VisuLine *isoline_; guint j, n; int p, q; int nPoints, nedges; int *iTab; /* give edge index in the full edge list with edge j of a given triangle i as input*/ /* j in [0,1,2] and i in [0,ntriangles-1]*/ float fac, isov; double val0, val1; double *xline, *yline, *zline; float *coord0, *coord1; /* local vertex coordinates */ gboolean status; #if DEBUG == 1 GTimer *timer; gulong fractionTimer; #endif /* Routine code*/ isov = isoValue; /* Ensure that the pointer is not zero */ g_return_val_if_fail(data, (VisuLine*)0); DBG_fprintf(stderr, "Line: compute isoline at value %g.\n", isoValue); #if DEBUG == 1 timer = g_timer_new(); g_timer_start(timer); #endif /* Allocate memory*/ nedges = 3 * nTriangles; iTab = g_malloc(nedges * sizeof(int)); xline = g_malloc(nedges * sizeof(double)); yline = g_malloc(nedges * sizeof(double)); zline = g_malloc(nedges * sizeof(double)); /* Glance trough the list of edges and search intersection between edges and VisuScalarField */ nPoints = 0; for(n = 0; n < nTriangles; n++) { /* Get the 3D coordinates and scalar field value of each vertex (0,1) of the current edge*/ for(j=0; j<3; j++) { /* Get the xyz coordinates of the 2 vertices of the current edge of the current triangle*/ p=j; q=(j == 2)?0:j+1; val0 = data[2 * n + 1][p]; val1 = data[2 * n + 1][q]; /* Test if edge contains isovalue */ if((isov - val0 < 0.0 && isov - val1 >= 0.0) || (isov - val0 >= 0.0 && isov - val1 < 0.0)) { fac = (isov - val0) / (val1 - val0); coord0 = data[2 * n + 0] + 3 * p; coord1 = data[2 * n + 0] + 3 * q; iTab[3 * n + j] = nPoints; xline[nPoints] = coord0[0] + fac * (coord1[0]-coord0[0]); yline[nPoints] = coord0[1] + fac * (coord1[1]-coord0[1]); zline[nPoints] = coord0[2] + fac * (coord1[2]-coord0[2]); nPoints++; } else iTab[3 * n + j] = -1; } } xline = g_realloc(xline, nPoints * sizeof(double)); yline = g_realloc(yline, nPoints * sizeof(double)); zline = g_realloc(zline, nPoints * sizeof(double)); DBG_fprintf(stderr, " | found %d points for line.\n", nPoints); #if DEBUG == 1 g_timer_stop(timer); fprintf(stderr, "Isoline : compute intersections in %g micro-s.\n", g_timer_elapsed(timer, &fractionTimer)/1e-6); g_timer_destroy(timer); #endif #if DEBUG == 1 timer = g_timer_new(); g_timer_start(timer); #endif if(nPoints == 0) { /* g_warning("no isoline found for value %g.", isoValue); */ status = FALSE; isoline_ = (VisuLine*)0; } else { /* Create lines from the computed points*/ isoline_ = g_malloc(sizeof(VisuLine)); isoline_->refCount = 1; isoline_->value = isoValue; status = Create_line(iTab, nTriangles, xline, yline, zline, &isoline_); } #if DEBUG == 1 g_timer_stop(timer); fprintf(stderr, "Isoline : build lines in %g micro-s.\n", g_timer_elapsed(timer, &fractionTimer)/1e-6); g_timer_destroy(timer); #endif g_free(iTab); g_free(xline); g_free(yline); g_free(zline); DBG_fprintf(stderr, " | Line exit with status %d.\n", (int)status); return (status)?isoline_:(VisuLine*)0; } /* * Create_line: * @nPoints: an integer giving the number points of the line; * @iTab: table containing the number of line points if line exists at this place otherwise -1; * @nedges: an integer giving the number of edges; * @ntriangles: an integer giving the number of triangles; * @vertices_index_from_triangles : return general vertex index from a given triangle; * @edges_index_from_triangles : return general edge index from a given triangle; * @isoValue: the value of the isoline; * @xline: x coordinate of the line points; * @yline: y coordinate of the line points; * @zline: z coordinate of the line points; * @vertices_SFV: scalar field value on each vertex; * @isoline: the Line structure containing data for plot; * Create on the fly a line from a list of points. * Returns: TRUE if the line is created. */ static gboolean Create_line(int *iTab, int ntriangles, double *xline, double *yline, double *zline, VisuLine **isoline) { /* Local variables */ register int i; int cubeindex; int e; guint n, nlines; int m0, m1; int *vTab; /* Routine code */ /* Ensure that the pointer is not zero */ g_return_val_if_fail(isoline, FALSE); /* Allocate buffers. */ vTab = g_malloc(2*3*ntriangles * sizeof(int)); nlines = 0; /* Loop over the triangles */ for(i=0; i= 0) cubeindex |= 1; if (iTab[3 * i + 1] >= 0) cubeindex |= 2; if (iTab[3 * i + 2] >= 0) cubeindex |= 4; e = edgeTable[cubeindex]; if (e == 0) continue; for (n = 0; linTable[e][n + 1]!= -1; n += 1) { m0 = iTab[3 * i + linTable[e][n ]]; if(m0 == -1) { g_warning("m1 %d.", i); g_free(vTab); g_free(*isoline); return FALSE; } m1 = iTab[3 * i + linTable[e][n+1]]; if(m1 == -1) { g_warning("m2 %d.", i); g_free(vTab); g_free(*isoline); return FALSE; } vTab[2*nlines + 0] = m0; vTab[2*nlines + 1] = m1; nlines++; } } DBG_fprintf(stderr, " | found %d lines.\n", nlines); if(nlines == 0) { g_warning("no isolines found."); g_free(vTab); g_free(*isoline); return FALSE; } /* Ok, try to create a Line object from here. */ DBG_fprintf(stderr, " | copy vertices.\n"); (*isoline)->num_sublines = nlines; (*isoline)->num_vertices = 2*nlines+1; /* Allocate memory. */ (*isoline)->vertex_3dpos = g_malloc(sizeof(float*) * (*isoline)->num_vertices); (*isoline)->vertex_3dpos[0] = g_malloc(sizeof(float) * (*isoline)->num_vertices * 3); for (n = 0; n < (*isoline)->num_vertices; n++) (*isoline)->vertex_3dpos[n] = (*isoline)->vertex_3dpos[0] + 3 * n; for(n = 0; n < nlines; n++) { (*isoline)->vertex_3dpos[2*n ][0] = xline[vTab[2*n ]]; (*isoline)->vertex_3dpos[2*n ][1] = yline[vTab[2*n ]]; (*isoline)->vertex_3dpos[2*n ][2] = zline[vTab[2*n ]]; (*isoline)->vertex_3dpos[2*n+1][0] = xline[vTab[2*n+1]]; (*isoline)->vertex_3dpos[2*n+1][1] = yline[vTab[2*n+1]]; (*isoline)->vertex_3dpos[2*n+1][2] = zline[vTab[2*n+1]]; } DBG_fprintf(stderr, " | finishing lines.\n"); g_free(vTab); return TRUE; } /** * visu_line_draw: * @line: a set of points forming a line. * @rgb: a colour. * * Call the OpenGL routine that will draw this line. * * Since: 3.4 */ void visu_line_draw(VisuLine *line, float rgb[3]) { guint i; g_return_if_fail(line); glLineWidth(2.f); /* glPointSize(2.f); */ glColor3fv(rgb); glDepthMask(0); glBegin(GL_LINES); for ( i = 0; i < line->num_sublines; i++) { glVertex3fv(line->vertex_3dpos[2 * i]); glVertex3fv(line->vertex_3dpos[2 * i + 1]); } glEnd(); /* glEnable(GL_POINT_SMOOTH); */ /* glBegin(GL_POINTS); */ /* for ( i = 0; i < line->num_sublines; i++) */ /* { */ /* glVertex3fv(line->vertex_3dpos[2 * i]); */ /* glVertex3fv(line->vertex_3dpos[2 * i + 1]); */ /* } */ /* glEnd(); */ /* glDisable(GL_POINT_SMOOTH); */ glDepthMask(1); } /** * visu_line_project: * @line: a #VisuLine object. * @plane: a #VisuPlane object. * @nSeg: a location to store the size of projection. * * Calculate the projection of each @line vertex on @plane. * * Since: 3.6 * * Returns: a newly allocated array of line segments. The size of this * array is 4 * @nSeg, holding the two plane coordiantes of the two * vertices of a line. */ float* visu_line_project(VisuLine *line, VisuPlane *plane, guint *nSeg) { float basis[2][3], center[3], *out; guint i; g_return_val_if_fail(line && nSeg, (float*)0); visu_plane_getBasis(plane, basis, center); out = g_malloc(sizeof(float) * 2 * line->num_sublines * 2); *nSeg = line->num_sublines; for ( i = 0; i < line->num_sublines; i++) { out[i * 4 + 0] = basis[0][0] * (line->vertex_3dpos[2 * i + 0][0] - center[0]) + basis[0][1] * (line->vertex_3dpos[2 * i + 0][1] - center[1]) + basis[0][2] * (line->vertex_3dpos[2 * i + 0][2] - center[2]); out[i * 4 + 1] = basis[1][0] * (line->vertex_3dpos[2 * i + 0][0] - center[0]) + basis[1][1] * (line->vertex_3dpos[2 * i + 0][1] - center[1]) + basis[1][2] * (line->vertex_3dpos[2 * i + 0][2] - center[2]); out[i * 4 + 2] = basis[0][0] * (line->vertex_3dpos[2 * i + 1][0] - center[0]) + basis[0][1] * (line->vertex_3dpos[2 * i + 1][1] - center[1]) + basis[0][2] * (line->vertex_3dpos[2 * i + 1][2] - center[2]); out[i * 4 + 3] = basis[1][0] * (line->vertex_3dpos[2 * i + 1][0] - center[0]) + basis[1][1] * (line->vertex_3dpos[2 * i + 1][1] - center[1]) + basis[1][2] * (line->vertex_3dpos[2 * i + 1][2] - center[2]); } return out; } /** * visu_line_getValue: * @line: a #VisuLine object. * * Lines are usually created as iso-values line in a mesh. * * Since: 3.6 * * Returns: the value associated to the line. */ double visu_line_getValue(VisuLine *line) { g_return_val_if_fail(line, -1.); return line->value; } v_sim-3.7.0/src/extraFunctions/isoline.h0000644000353400050620000000454312215546074015213 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2005) Adresse mèl : CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2005) E-mail address: CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef ISOLINE_H #define ISOLINE_H #include #include #include "plane.h" typedef struct _VisuLine VisuLine; #define VISU_TYPE_LINE (visu_line_get_type()) GType visu_line_get_type(void); VisuLine* visu_line_newFromTriangles(float **data, guint nTriangles, double isoValue); VisuLine* visu_line_ref(VisuLine *line); void visu_line_unref(VisuLine *line); void visu_line_free(VisuLine *line); void visu_line_draw(VisuLine *line, float rgb[3]); float* visu_line_project(VisuLine *line, VisuPlane *plane, guint *nSeg); double visu_line_getValue(VisuLine *line); #endif v_sim-3.7.0/src/extraFunctions/geometry.c0000644000353400050620000010417712215546074015403 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "geometry.h" #include #include #include #include #include #include /** * SECTION:geometry * @short_description: different routines to do high level geometry * studies on a box or a set of boxes. * * The first possibility of the #geometry section is to make a * two by two difference node position difference between two * #VisuData objects. The #VisuNode positions are compared (number to number and * not closed equivalent to closed equivalent) and stored for * visualisation. The visualisation is done through small arrows * position on the currently visualised file. * * Since: 3.5 */ enum PathItem { PATH_ITEM_COORD, PATH_ITEM_DELTA }; struct Item_ { enum PathItem type; guint time; float dxyz[3]; float energy; }; typedef struct Path_ { guint nodeId; /* A per node translation. */ float translation[3]; guint size, nItems; struct Item_ *items; } Path; /** * VisuPaths: * * An opaque structure to save a set of paths. * * Since: 3.6 */ struct _VisuPaths { guint refCount; /* The current time stamp. */ guint time; /* The global translation. */ float translation[3]; /* The min/max for the possible energies along the paths. */ float minE, maxE; ToolShade *shade; /* A list of Path elements. */ GList *lst; }; #define GEOMETRY_PATH_ALLOC_SIZE 50 #define GEOMETRY_DIFF_MINMAX_ID "max_" VISU_GEODIFF_ID #define FLAG_RESOURCE_WIDTH "path_lineWidth" #define DESC_RESOURCE_WIDTH "Line width for drawing of paths ; float (positive)" static void exportResources(GString *data, VisuData *dataObj, VisuGlView *view); /* Local variables. */ static float pathWidth = 3.f; /**********************/ /* Memory management. */ /**********************/ static void freeData(gpointer obj, gpointer data _U_) { #if GLIB_MINOR_VERSION > 9 g_slice_free1(sizeof(float) * 6, obj); #else g_free(obj); #endif } static gpointer newOrCopyData(gconstpointer orig, gpointer user_data _U_) { float *data; #if GLIB_MINOR_VERSION > 9 data = g_slice_alloc(sizeof(float) * 6); #else data = g_malloc(sizeof(float) * 6); #endif if (orig) memcpy(data, orig, sizeof(float) * 6); else memset(data, 0, sizeof(float) * 6); return (gpointer)data; } /*************************/ /* Calculation routines. */ /*************************/ /** * visu_geodiff_getPeriodicDistance: * @diff: (out) (array fixed-size=3): a location to store the shift. * @data: a #VisuData object. * @node1: a #VisuNode object. * @node2: another #VisuNode object. * * Compute the shortest distance between @node1 and @node2 of @data * taking into account the periodic boundary conditions. * * Since: 3.5 */ void visu_geodiff_getPeriodicDistance(float diff[3], VisuData *data, VisuNode *node1, VisuNode *node2) { diff[0] = node1->xyz[0] + node1->translation[0] - node2->xyz[0] - node2->translation[0]; diff[1] = node1->xyz[1] + node1->translation[1] - node2->xyz[1] - node2->translation[1]; diff[2] = node1->xyz[2] + node1->translation[2] - node2->xyz[2] - node2->translation[2]; visu_box_getPeriodicVector(visu_boxed_getBox(VISU_BOXED(data)), diff); } /** * visu_geodiff_new: * @dataRef: a #VisuData object ; * @data: another #VisuData object. * @reorder: a boolean. * * Compare the position of each #VisuNode of @dataRef and @data, * the result is store as a property of @data and can be visualise * using a #VisuGlExtNodeVectors object. If @reorder is TRUE, the nodes in * @data will be modified to follow the ordering of @dataRef. * * Since: 3.5 * * Returns: TRUE if a difference is possible (same number of nodes). */ gboolean visu_geodiff_new(VisuData *dataRef, VisuData *data, gboolean reorder) { VisuNodeProperty *prop; VisuNodeArrayIter iter, iterRef; GValue diffValue = {0, {{0}, {0}}}; float *diff, align[3]; float *minMax; g_return_val_if_fail(VISU_IS_DATA(dataRef), FALSE); g_return_val_if_fail(VISU_IS_DATA(data), FALSE); DBG_fprintf(stderr, "Geometry: making a diff between %p and %p.\n", (gpointer)dataRef, (gpointer)data); /* Check compatibility of population. */ visu_node_array_iterNew(VISU_NODE_ARRAY(data), &iter); visu_node_array_iterNew(VISU_NODE_ARRAY(dataRef), &iterRef); DBG_fprintf(stderr, " | %d - %d.\n", iter.nElements, iterRef.nElements); if (iter.nElements != iterRef.nElements) return FALSE; for (visu_node_array_iterStart(VISU_NODE_ARRAY(data), &iter), visu_node_array_iterStart(VISU_NODE_ARRAY(dataRef), &iterRef); iter.element && iterRef.element; visu_node_array_iterNextElement(VISU_NODE_ARRAY(data), &iter), visu_node_array_iterNextElement(VISU_NODE_ARRAY(dataRef), &iterRef)) { DBG_fprintf(stderr, " | (%d) # %d - %d.\n", iter.iElement, iter.nStoredNodes, iterRef.nStoredNodes); if (iter.nStoredNodes != iterRef.nStoredNodes) return FALSE; } if (reorder) visu_data_reorder(data, dataRef); /* Ok, here the two files match with respect of number of nodes per element. */ g_value_init(&diffValue, G_TYPE_POINTER); /* If the two files are free BC, we align the first atom. */ align[0] = 0.f; align[1] = 0.f; align[2] = 0.f; if (visu_box_getBoundary(visu_boxed_getBox(VISU_BOXED(dataRef))) == VISU_BOX_FREE && visu_box_getBoundary(visu_boxed_getBox(VISU_BOXED(data))) == VISU_BOX_FREE) { visu_geodiff_getPeriodicDistance(align, dataRef, visu_node_array_getFromId(VISU_NODE_ARRAY(dataRef), 0), visu_node_array_getFromId(VISU_NODE_ARRAY(data), 0)); DBG_fprintf(stderr, "Geometry: free BC boxes, applying translation %gx%gx%g.\n", align[0], align[1], align[2]); } /* We add a VisuData property to store the min max values. */ minMax = g_malloc(sizeof(float) * 2); g_object_set_data_full(G_OBJECT(data), GEOMETRY_DIFF_MINMAX_ID, (gpointer)minMax, g_free); minMax[0] = G_MAXFLOAT; minMax[1] = 0.f; /* Add a node property with the number of columns. */ prop = visu_node_array_property_newPointer(VISU_NODE_ARRAY(data), VISU_GEODIFF_ID, freeData, newOrCopyData, (gpointer)0); for (visu_node_array_iterStartNumber(VISU_NODE_ARRAY(data), &iter), visu_node_array_iterStartNumber(VISU_NODE_ARRAY(dataRef), &iterRef); iter.node && iterRef.node; visu_node_array_iterNextNodeNumber(VISU_NODE_ARRAY(data), &iter), visu_node_array_iterNextNodeNumber(VISU_NODE_ARRAY(dataRef), &iterRef)) { /* We read the data from the line, if not void. */ diff = newOrCopyData((gconstpointer)0, (gpointer)0); visu_geodiff_getPeriodicDistance(diff, data, iter.node, iterRef.node); diff[0] += align[0]; diff[1] += align[1]; diff[2] += align[2]; tool_matrix_cartesianToSpherical(diff + 3, diff); DBG_fprintf(stderr, "Geometry: diff atom %d, %9g %9g %9g (%9g %5g %5g).\n", iter.node->number, diff[0], diff[1], diff[2], diff[3], diff[4], diff[5]); minMax[0] = MIN(minMax[0], diff[3]); minMax[1] = MAX(minMax[1], diff[3]); /* Associates the values to the node. */ g_value_set_pointer(&diffValue, diff); visu_node_property_setValue(prop, iter.node, &diffValue); } return TRUE; } /** * visu_paths_get_type: * @void: nothing. * * Create and retrieve a #GType for a #VisuPaths object. * * Since: 3.7 * * Returns: a new type for #VisuPaths structures. **/ GType visu_paths_get_type(void) { static GType g_define_type_id = 0; if (g_define_type_id == 0) g_define_type_id = g_boxed_type_register_static("VisuPaths", (GBoxedCopyFunc)visu_paths_ref, (GBoxedFreeFunc)visu_paths_unref); return g_define_type_id; } /** * visu_paths_new: * @translation: the current box translation (cartesian). * * Create a new #VisuPaths object. * * Since: 3.6 * * Returns: the newly create object #VisuPaths, to be freed with * visu_paths_free(). */ VisuPaths* visu_paths_new(float translation[3]) { VisuPaths *paths; paths = g_malloc(sizeof(VisuPaths)); paths->refCount = 1; paths->time = 0; paths->translation[0] = translation[0]; paths->translation[1] = translation[1]; paths->translation[2] = translation[2]; paths->shade = (ToolShade*)0; paths->minE = G_MAXFLOAT; paths->maxE = -G_MAXFLOAT; paths->lst = (GList*)0; return paths; } /** * visu_paths_ref: * @paths: a #VisuPaths object. * * Increase the ref counter. * * Since: 3.7 * * Returns: itself. **/ VisuPaths* visu_paths_ref(VisuPaths *paths) { paths->refCount += 1; return paths; } /** * visu_paths_unref: * @paths: a #VisuPaths object. * * Decrease the ref counter, free all memory if counter reachs zero. * * Since: 3.7 **/ void visu_paths_unref(VisuPaths *paths) { paths->refCount -= 1; if (!paths->refCount) visu_paths_free(paths); } static Path* newPath() { Path *path; path = g_malloc(sizeof(Path)); path->size = GEOMETRY_PATH_ALLOC_SIZE; path->items = g_malloc(sizeof(struct Item_) * path->size); path->nItems = 0; return path; } static Path* addPathItem(Path *path, guint time, float xyz[3], enum PathItem type, float energy) { DBG_fprintf(stderr, "Visu Geometry: add a new item for path %p.\n", (gpointer)path); if (!path) /* We create a new path for the given node id. */ path = newPath(); /* We reallocate if necessary. */ if (path->nItems == path->size) { path->size += GEOMETRY_PATH_ALLOC_SIZE; path->items = g_realloc(path->items, sizeof(struct Item_) * path->size); } /* If previous type was PATH_ITEM_COORD and new is also PATH_ITEM_COORD we remove the previous one. */ if (path->nItems > 0 && path->items[path->nItems - 1].type == PATH_ITEM_COORD && type == PATH_ITEM_COORD) path->nItems -= 1; /* We add the new delta to the path. */ path->items[path->nItems].time = time; path->items[path->nItems].type = type; path->items[path->nItems].dxyz[0] = xyz[0]; path->items[path->nItems].dxyz[1] = xyz[1]; path->items[path->nItems].dxyz[2] = xyz[2]; path->items[path->nItems].energy = (energy == G_MAXFLOAT)?-G_MAXFLOAT:energy; path->nItems += 1; return path; } /** * visu_paths_addNodeStep: * @paths: a set of paths. * @time: the flag that give the number of expansion to update. * @nodeId: the node to expand the path of. * @xyz: the current position of the path. * @dxyz: the variation in the path. * @energy: the energy of the system. * * This routine expand the path for the given @nodeId at position @xyz * of @dxyz. The @energy value will be used only if * visu_paths_setToolShade() is used with a non NULL #ToolShade. In that * case the @energy value will be used to colourise the provided path. * * Since: 3.6 * * Returns: TRUE if a new path is started. */ gboolean visu_paths_addNodeStep(VisuPaths *paths, guint time, guint nodeId, float xyz[3], float dxyz[3], float energy) { GList *tmpLst; Path *path; gboolean new; /* Look for a Path with the good node id. */ new = FALSE; for (tmpLst = paths->lst; tmpLst && ((Path*)tmpLst->data)->nodeId != nodeId; tmpLst = g_list_next(tmpLst)); if (!tmpLst) { /* We create a new path for the given node id. */ path = addPathItem((Path*)0, time, xyz, PATH_ITEM_COORD, energy); path->nodeId = nodeId; path->translation[0] = paths->translation[0]; path->translation[1] = paths->translation[1]; path->translation[2] = paths->translation[2]; paths->lst = g_list_prepend(paths->lst, (gpointer)path); new = TRUE; } else path = (Path*)tmpLst->data; addPathItem(path, time, dxyz, PATH_ITEM_DELTA, energy); if (energy != G_MAXFLOAT) { paths->minE = MIN(paths->minE, energy); paths->maxE = MAX(paths->maxE, energy); } return new; } /** * visu_paths_empty: * @paths: a #VisuPaths object. * * Reinitialise internal values of a given @paths. * * Since: 3.6 */ void visu_paths_empty(VisuPaths *paths) { GList *tmpLst; Path *path; g_return_if_fail(paths); for (tmpLst = paths->lst; tmpLst; tmpLst = g_list_next(tmpLst)) { path = (Path*)tmpLst->data; g_free(path->items); g_free(path); } g_list_free(paths->lst); paths->lst = (GList*)0; paths->minE = G_MAXFLOAT; paths->maxE = -G_MAXFLOAT; paths->time = 0; } /** * visu_paths_free: * @paths: a #VisuPaths object. * * Free a set of paths. * * Since: 3.6 */ void visu_paths_free(VisuPaths *paths) { visu_paths_empty(paths); g_free(paths); } /** * visu_paths_addFromDiff: * @data: a #VisuData object with a geometry difference (see * visu_geodiff_new()). * @paths: the set of paths to extend. * * This routine read the geometry difference hold in @data and add a * new step in the set of paths. If new paths are created, one * should call visu_paths_setTranslation() to be sure that all * paths are moved inside the box. * * Since: 3.6 * * Returns: TRUE if new paths have been added. */ gboolean visu_paths_addFromDiff(VisuPaths *paths, VisuData *data) { GValue diffValue = {0, {{0}, {0}}}; VisuNodeProperty *prop; VisuNodeArrayIter iter; float *diff, xyz[3]; gdouble energy; gboolean new; new = FALSE; prop = visu_node_array_getProperty(VISU_NODE_ARRAY(data), VISU_GEODIFF_ID); g_return_val_if_fail(prop, FALSE); g_object_get(G_OBJECT(data), "totalEnergy", &energy, NULL); if (energy == G_MAXFLOAT) energy = paths->minE; g_value_init(&diffValue, G_TYPE_POINTER); visu_node_array_iterNew(VISU_NODE_ARRAY(data), &iter); for (visu_node_array_iterStart(VISU_NODE_ARRAY(data), &iter); iter.node; visu_node_array_iterNext(VISU_NODE_ARRAY(data), &iter)) { visu_node_property_getValue(prop, iter.node, &diffValue); diff = (float*)g_value_get_pointer(&diffValue); if (diff[3] > 0.01f) { xyz[0] = iter.node->xyz[0] - diff[0]; xyz[1] = iter.node->xyz[1] - diff[1]; xyz[2] = iter.node->xyz[2] - diff[2]; new = visu_paths_addNodeStep(paths, paths->time, iter.node->number, xyz, diff, (float)energy) || new; } } paths->time += 1; return new; } /** * visu_paths_getLength: * @paths: a #VisuPaths object. * * Get the number of steps stored in a #VisuPaths. * * Since: 3.6 * * Returns: the number of steps. */ guint visu_paths_getLength(VisuPaths *paths) { g_return_val_if_fail(paths, 0); return paths->time; } /** * visu_paths_setTranslation: * @paths: a #VisuPaths object. * @cartCoord: three floats. * * Change the translation of the path, stored in cartesian * coordinates. * * Since: 3.6 */ void visu_paths_setTranslation(VisuPaths *paths, float cartCoord[3]) { g_return_if_fail(paths); paths->translation[0] = cartCoord[0]; paths->translation[1] = cartCoord[1]; paths->translation[2] = cartCoord[2]; } /** * visu_paths_constrainInBox: * @paths: a #VisuPaths object. * @data: a #VisuData object. * * Modify the corrdinates of the path nodes to contraint them in a box * (when applying translations for instance). * * Since: 3.6 */ void visu_paths_constrainInBox(VisuPaths *paths, VisuData *data) { VisuBox *box; float t[3], xyz[3]; GList *tmpLst; Path *path; g_return_if_fail(paths && data); box = visu_boxed_getBox(VISU_BOXED(data)); for(tmpLst = paths->lst; tmpLst; tmpLst = g_list_next(tmpLst)) { path = (Path*)tmpLst->data; xyz[0] = path->items[0].dxyz[0] + paths->translation[0]; xyz[1] = path->items[0].dxyz[1] + paths->translation[1]; xyz[2] = path->items[0].dxyz[2] + paths->translation[2]; visu_box_constrainInside(box, t, xyz, TRUE); path->translation[0] = t[0] + paths->translation[0]; path->translation[1] = t[1] + paths->translation[1]; path->translation[2] = t[2] + paths->translation[2]; } } /** * visu_geodiff_hasData: * @data: a #VisuData object. * * A set coordinate differences can be associated to a #VisuData using visu_geodiff_new(). * * Since: 3.6 * * Returns: TRUE if the given @data has a set of differences associated. */ gboolean visu_geodiff_hasData(VisuData *data) { return (g_object_get_data(G_OBJECT(data), GEOMETRY_DIFF_MINMAX_ID) != (gpointer)0); } /** * visu_geodiff_export: * @data: a #VisuData object. * * Create a string with differences of coordinates stored in @data in * cartesian coordinates. * * Since: 3.6 * * Returns: a new string that should be freed after use. */ gchar* visu_geodiff_export(VisuData *data) { GString *output; VisuNodeArrayIter iter; GValue diffValue = {0, {{0}, {0}}}; float *diff; gboolean start; VisuNodeProperty *prop; g_return_val_if_fail(VISU_IS_DATA(data), (gchar*)0); prop = visu_node_array_getProperty(VISU_NODE_ARRAY(data), VISU_GEODIFF_ID); g_return_val_if_fail(prop, (gchar*)0); start = TRUE; output = g_string_new("#metaData: diff=[ \\\n"); g_value_init(&diffValue, G_TYPE_POINTER); visu_node_array_iterNew(VISU_NODE_ARRAY(data), &iter); for (visu_node_array_iterStart(VISU_NODE_ARRAY(data), &iter); iter.node; visu_node_array_iterNext(VISU_NODE_ARRAY(data), &iter)) { if (!start) output = g_string_append(output, "; \\\n"); visu_node_property_getValue(prop, iter.node, &diffValue); diff = (float*)g_value_get_pointer(&diffValue); g_string_append_printf(output, "# %12.8f; %12.8f; %12.8f", diff[0], diff[1], diff[2]); start = FALSE; } output = g_string_append(output, " \\\n# ]\n"); return g_string_free(output, FALSE); } /** * visu_paths_pinPositions: * @paths: a #VisuPaths object. * @data: a #VisuData object. * * Use the current positions of @data to extend @paths. * * Since: 3.6 */ void visu_paths_pinPositions(VisuPaths *paths, VisuData *data) { VisuNodeArrayIter iter; GList *tmpLst; gdouble energy; g_return_if_fail(paths && data); g_object_get(G_OBJECT(data), "totalEnergy", &energy, NULL); if (energy == G_MAXFLOAT) energy = paths->minE; DBG_fprintf(stderr, "Visu Geometry: pin current positions.\n"); visu_node_array_iterNew(VISU_NODE_ARRAY(data), &iter); for (visu_node_array_iterStart(VISU_NODE_ARRAY(data), &iter); iter.node; visu_node_array_iterNext(VISU_NODE_ARRAY(data), &iter)) { for (tmpLst = paths->lst; tmpLst; tmpLst = g_list_next(tmpLst)) if (((Path*)tmpLst->data)->nodeId == iter.node->number) break; if (tmpLst) addPathItem((Path*)tmpLst->data, paths->time, iter.node->xyz, PATH_ITEM_COORD, (float)energy); } if (energy != G_MAXFLOAT) { paths->minE = MIN(paths->minE, (float)energy); paths->maxE = MAX(paths->maxE, (float)energy); } } /** * visu_paths_setToolShade: * @paths: a #VisuPaths object. * @shade: a #ToolShade object. * * Set the colourisation scheme for the path. * * Since: 3.6 * * Returns: TRUE is the scheme is changed. */ gboolean visu_paths_setToolShade(VisuPaths *paths, ToolShade* shade) { g_return_val_if_fail(paths, FALSE); if (paths->shade == shade) return FALSE; paths->shade = shade; return TRUE; } /** * visu_paths_getToolShade: * @paths: a #VisuPaths object. * * The paths are drawn with a colourisation scheme. * * Since: 3.6 * * Returns: the #ToolShade used by the @paths. */ ToolShade* visu_paths_getToolShade(VisuPaths *paths) { g_return_val_if_fail(paths, (ToolShade*)0); return paths->shade; } /*********************/ /* Drawing routines. */ /*********************/ static void drawPath(Path *path, ToolShade *shade, float min, float max) { guint i; float xyz[3], rgba[4]; g_return_if_fail(path); /* DBG_fprintf(stderr, "Geometry: draw path for node %d.\n", path->nodeId); */ if (!shade) glColor3f(0.f, 0.f, 0.f); for (i = 0; i < path->nItems; i++) { if (path->items[i].type == PATH_ITEM_COORD) { if (i > 0) glEnd(); glBegin(GL_LINE_STRIP); xyz[0] = path->items[i].dxyz[0] + path->translation[0]; xyz[1] = path->items[i].dxyz[1] + path->translation[1]; xyz[2] = path->items[i].dxyz[2] + path->translation[2]; } else { xyz[0] += path->items[i].dxyz[0]; xyz[1] += path->items[i].dxyz[1]; xyz[2] += path->items[i].dxyz[2]; } if (shade) { tool_shade_valueToRGB (shade, rgba, CLAMP((path->items[i].energy - min) / (max - min), 0., 1.)); glColor3fv(rgba); } glVertex3fv(xyz); } glEnd(); glEnable(GL_POINT_SMOOTH); glBegin(GL_POINTS); for (i = 0; i < path->nItems; i++) { if (path->items[i].type == PATH_ITEM_COORD) { xyz[0] = path->items[i].dxyz[0] + path->translation[0]; xyz[1] = path->items[i].dxyz[1] + path->translation[1]; xyz[2] = path->items[i].dxyz[2] + path->translation[2]; } else { xyz[0] += path->items[i].dxyz[0]; xyz[1] += path->items[i].dxyz[1]; xyz[2] += path->items[i].dxyz[2]; } if (shade) { tool_shade_valueToRGB (shade, rgba, CLAMP((path->items[i].energy - min) / (max - min), 0., 1.)); glColor3fv(rgba); } glVertex3fv(xyz); } glEnd(); glDisable(GL_POINT_SMOOTH); } /** * visu_paths_draw: * @paths: a set of paths. * * OpenGL calls to create the paths. * * Since: 3.6 */ void visu_paths_draw(VisuPaths *paths) { GList *tmpLst; ToolShade *shade; if (ABS(paths->maxE - paths->minE) < 1e-6) shade = (ToolShade*)0; else shade = paths->shade; glDisable(GL_LIGHTING); glDepthMask(0); glColor3f(0.f, 0.f, 0.f); glLineWidth(pathWidth); glPointSize(pathWidth); for (tmpLst = paths->lst; tmpLst; tmpLst = g_list_next(tmpLst)) drawPath((Path*)tmpLst->data, shade, paths->minE, paths->maxE); glDepthMask(1); glEnable(GL_LIGHTING); } /*****************/ /* Init routine. */ /*****************/ /** * visu_geometry_init: (skip) * * Initialise the geometry routines. Should not be called except at * initialisation time. * * Since: 3.5 */ void visu_geometry_init() { float rg[2] = {0.01f, 10.f}; VisuConfigFileEntry *conf; DBG_fprintf(stderr, "Geometry: set the conf entries for this module.\n"); conf = visu_config_file_addFloatArrayEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_WIDTH, DESC_RESOURCE_WIDTH, 1, &pathWidth, rg); visu_config_file_entry_setVersion(conf, 3.7f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_RESOURCE, exportResources); } /*************************/ /* Resources management. */ /*************************/ static void exportResources(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { visu_config_file_exportComment(data, DESC_RESOURCE_WIDTH); visu_config_file_exportEntry(data, FLAG_RESOURCE_WIDTH, NULL, "%f", pathWidth); visu_config_file_exportComment(data, ""); } /*****************************/ /* XML files for iso-values. */ /*****************************/ /* */ /* Known elements. */ #define GEOMETRY_ELEMENT_PATHES "paths" #define GEOMETRY_ELEMENT_PATH "path" #define GEOMETRY_ELEMENT_ITEM "item" /* Known attributes. */ #define GEOMETRY_ATTRIBUTE_TIME "time" #define GEOMETRY_ATTRIBUTE_TRANS "translat" #define GEOMETRY_ATTRIBUTE_NODE "nodeId" #define GEOMETRY_ATTRIBUTE_TYPE "type" #define GEOMETRY_ATTRIBUTE_COORD "coordinates" #define GEOMETRY_ATTRIBUTE_TOT_E "totalEnergy" static guint timeShift; static gboolean startVisuPaths; static Path *currentPath; /* This method is called for every element that is parsed. The user_data must be a GList of _pick_xml. When a 'surface' element, a new struct instance is created and prepend in the list. When 'hidden-by-planes' or other qualificative elements are found, the first surface of the list is modified accordingly. */ static void geometryXML_element(GMarkupParseContext *context _U_, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer user_data, GError **error) { VisuPaths *paths; int i, n; guint val, time, type; float t[3], en; gboolean ok; GList *tmpLst; g_return_if_fail(user_data); paths = (VisuPaths*)user_data; DBG_fprintf(stderr, "Geometry: found '%s' element.\n", element_name); if (!g_ascii_strcasecmp(element_name, GEOMETRY_ELEMENT_PATHES)) { /* Initialise the pathList. */ if (startVisuPaths) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("DTD error: element '%s' should appear only once."), GEOMETRY_ELEMENT_PATHES); return; } startVisuPaths = TRUE; /* Parse the attributes. */ for (i = 0; attribute_names[i]; i++) { /* Possible translation. */ if (!g_ascii_strcasecmp(attribute_names[i], GEOMETRY_ATTRIBUTE_TRANS)) { n = sscanf(attribute_values[i], "%f;%f;%f", t, t + 1, t + 2); if (n != 3) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("DTD error: attribute '%s' has an unknown value '%s'."), GEOMETRY_ATTRIBUTE_TRANS, attribute_values[i]); return; } paths->translation[0] = t[0]; paths->translation[1] = t[1]; paths->translation[2] = t[2]; } } } else if (!g_ascii_strcasecmp(element_name, GEOMETRY_ELEMENT_PATH)) { if (!startVisuPaths) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("DTD error: parent element '%s' of element '%s' is missing."), GEOMETRY_ELEMENT_PATHES, GEOMETRY_ELEMENT_PATH); return; } /* We parse the attributes. */ val = 123456789; t[0] = 0.f; t[1] = 0.f; t[2] = 0.f; for (i = 0; attribute_names[i]; i++) { ok = TRUE; if (!g_ascii_strcasecmp(attribute_names[i], GEOMETRY_ATTRIBUTE_NODE)) ok = (sscanf(attribute_values[i], "%u", &val) == 1); else if (!g_ascii_strcasecmp(attribute_names[i], GEOMETRY_ATTRIBUTE_TRANS)) ok = (sscanf(attribute_values[i], "%f;%f;%f", t, t + 1, t + 2) == 3); if (!ok) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("DTD error: attribute '%s' has an unknown value '%s'."), GEOMETRY_ATTRIBUTE_NODE, attribute_values[i]); return; } } if (val == 123456789) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("DTD error: element '%s' have missing mandatory attributes."), GEOMETRY_ELEMENT_PATH); return; } for (tmpLst = paths->lst; tmpLst && ((Path*)tmpLst->data)->nodeId != val; tmpLst = g_list_next(tmpLst)); if (!tmpLst) { currentPath = newPath(); currentPath->nodeId = val; currentPath->translation[0] = t[0]; currentPath->translation[1] = t[1]; currentPath->translation[2] = t[2]; paths->lst = g_list_prepend(paths->lst, (gpointer)currentPath); } else currentPath = (Path*)tmpLst->data; } else if (!g_ascii_strcasecmp(element_name, GEOMETRY_ELEMENT_ITEM)) { if (!currentPath) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("DTD error: parent element '%s' of element '%s' is missing."), GEOMETRY_ELEMENT_PATH, GEOMETRY_ELEMENT_ITEM); return; } /* We parse the attributes. */ type = 999; time = 123456789; t[0] = G_MAXFLOAT; en = G_MAXFLOAT; for (i = 0; attribute_names[i]; i++) { ok = TRUE; if (!g_ascii_strcasecmp(attribute_names[i], GEOMETRY_ATTRIBUTE_TIME)) ok = (sscanf(attribute_values[i], "%u", &time) == 1); else if (!g_ascii_strcasecmp(attribute_names[i], GEOMETRY_ATTRIBUTE_TYPE)) { if (!g_ascii_strcasecmp(attribute_values[i], "dot")) type = PATH_ITEM_COORD; else if (!g_ascii_strcasecmp(attribute_values[i], "delta")) type = PATH_ITEM_DELTA; ok = (type != 999); } else if (!g_ascii_strcasecmp(attribute_names[i], GEOMETRY_ATTRIBUTE_COORD)) ok = (sscanf(attribute_values[i], "%f;%f;%f", t, t + 1, t + 2) == 3); else if (!g_ascii_strcasecmp(attribute_names[i], GEOMETRY_ATTRIBUTE_TOT_E)) ok = (sscanf(attribute_values[i], "%f", &en) == 1); if (!ok) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("DTD error: attribute '%s' has an unknown value '%s'."), GEOMETRY_ATTRIBUTE_NODE, attribute_values[i]); return; } } if (time == 123456789 || type == 999 || t[0] == G_MAXFLOAT) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("DTD error: element '%s' have missing mandatory attributes."), GEOMETRY_ELEMENT_PATH); return; } addPathItem(currentPath, time + timeShift, t, type, en); paths->time = MAX(time + timeShift + 1, paths->time); if (en != G_MAXFLOAT) { paths->minE = MIN(en, paths->minE); paths->maxE = MAX(en, paths->maxE); } } else if (startVisuPaths) { /* We silently ignore the element if pathList is unset, but raise an error if pathList has been set. */ g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, _("Unexpected element '%s'."), element_name); } } /** * visu_paths_parseFromXML: * @filename: a location on disk. * @paths: a #VisuPaths object. * @error: a pointer on an error. * * Read an XML containing a description of @paths. @paths is newly * created on success and should be freed with visu_paths_free(). * * Since: 3.6 * * Returns: TRUE on success. */ gboolean visu_paths_parseFromXML(const gchar* filename, VisuPaths *paths, GError **error) { GMarkupParseContext* xmlContext; GMarkupParser parser; gboolean status; gchar *buffer; gsize size; g_return_val_if_fail(filename, FALSE); g_return_val_if_fail(paths, FALSE); buffer = (gchar*)0; if (!g_file_get_contents(filename, &buffer, &size, error)) return FALSE; /* Create context. */ currentPath = (Path*)0; timeShift = paths->time; parser.start_element = geometryXML_element; parser.end_element = NULL; parser.text = NULL; parser.passthrough = NULL; parser.error = NULL; xmlContext = g_markup_parse_context_new(&parser, 0, paths, NULL); /* Parse data. */ startVisuPaths = FALSE; status = g_markup_parse_context_parse(xmlContext, buffer, size, error); /* Free buffers. */ g_markup_parse_context_free(xmlContext); g_free(buffer); if (!startVisuPaths) { *error = g_error_new(G_MARKUP_ERROR, G_MARKUP_ERROR_EMPTY, _("No paths found.")); status = FALSE; } if (!status) return FALSE; return TRUE; } /** * visu_paths_exportXMLFile: * @paths: a #VisuPaths object. * @filename: a location on disk. * @error: a pointer on an error. * * Write an XML file with the description of the given @paths. * * Since: 3.6 * * Returns: TRUE if no error. */ gboolean visu_paths_exportXMLFile(const VisuPaths *paths, const gchar *filename, GError **error) { GString *output; GList *tmpLst; Path *path; guint i; gboolean valid; if (!paths) return TRUE; output = g_string_new("\n", paths->translation[0], paths->translation[1], paths->translation[2]); for (tmpLst = paths->lst; tmpLst; tmpLst = g_list_next(tmpLst)) { path = (Path*)tmpLst->data; g_string_append_printf(output, " \n", path->nodeId, path->translation[0], path->translation[1], path->translation[2]); for (i = 0; i < path->nItems; i++) if (ABS(path->items[i].energy) != G_MAXFLOAT) g_string_append_printf (output, " \n", path->items[i].time, (path->items[i].type == PATH_ITEM_COORD)?"dot":"delta", path->items[i].dxyz[0], path->items[i].dxyz[1], path->items[i].dxyz[2], path->items[i].energy); else g_string_append_printf (output, " \n", path->items[i].time, (path->items[i].type == PATH_ITEM_COORD)?"dot":"delta", path->items[i].dxyz[0], path->items[i].dxyz[1], path->items[i].dxyz[2]); g_string_append(output, " \n"); } g_string_append(output, ""); valid = tool_XML_substitute(output, filename, "paths", error); if (!valid) { g_string_free(output, TRUE); return FALSE; } valid = g_file_set_contents(filename, output->str, -1, error); g_string_free(output, TRUE); return valid; } v_sim-3.7.0/src/extraFunctions/geometry.h0000644000353400050620000000721612215546074015404 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef GEOMETRY_H #define GEOMETRY_H #include #include #include typedef struct _VisuPaths VisuPaths; #define VISU_TYPE_PATHS (visu_paths_get_type()) GType visu_paths_get_type(void); VisuPaths* visu_paths_new(float translation[3]); VisuPaths* visu_paths_ref(VisuPaths *paths); void visu_paths_unref(VisuPaths *paths); void visu_paths_free(VisuPaths *paths); void visu_paths_empty(VisuPaths *paths); gboolean visu_paths_addFromDiff(VisuPaths *paths, VisuData *data); gboolean visu_paths_addNodeStep(VisuPaths *paths, guint time, guint nodeId, float xyz[3], float dxyz[3], float energy); void visu_paths_pinPositions(VisuPaths *paths, VisuData *data); void visu_paths_draw(VisuPaths *paths); void visu_paths_constrainInBox(VisuPaths *paths, VisuData *data); gboolean visu_paths_exportXMLFile(const VisuPaths *paths, const gchar *filename, GError **error); gboolean visu_paths_parseFromXML(const gchar* filename, VisuPaths *paths, GError **error); void visu_paths_setTranslation(VisuPaths *paths, float cartCoord[3]); gboolean visu_paths_setToolShade(VisuPaths *paths, ToolShade* shade); ToolShade* visu_paths_getToolShade(VisuPaths *paths); guint visu_paths_getLength(VisuPaths *paths); /** * VISU_GEODIFF_ID: * * The default name used for the #VisuGlExt representing * displacements, see visu_gl_ext_getFromName(). */ #define VISU_GEODIFF_ID "geometry_diff" gboolean visu_geodiff_new(VisuData *dataRef, VisuData *data, gboolean reorder); gboolean visu_geodiff_hasData(VisuData *data); gchar* visu_geodiff_export(VisuData *data); void visu_geodiff_getPeriodicDistance(float diff[3], VisuData *data, VisuNode *node1, VisuNode *node2); void visu_geometry_init(); #endif v_sim-3.7.0/src/extraFunctions/vibration.c0000644000353400050620000006032212215546074015536 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Jrmy BLANC et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BLANC, CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Jrmy BLANC et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "vibration.h" #include #include /*for sinus*/ #include /* for spherical coordonates */ #include #include #include /* for highlight methods*/ #include /* permit to draw arrow */ #include #include /** * SECTION:vibration * @short_description: Add a support to animate the node positions * with a phonon frequency. * * Define a way to store vibration or phonons to a #VisuData * object. One can store several phonons in one object, each phonon is * them represented by its id. The phonons can be animated on screen, * using a user defined frequency (visu_vibration_setUserFrequency) * and amplitue (visu_vibration_setAmplitude), by calling * visu_vibration_play(). * Phonons are set with visu_vibration_setCharacteristic() and * #VisuNode displacements are set with visu_vibration_setDisplacements(). */ #define OMEGA_COEFF 0.05f #define AMPL_COEFF 0.5f /* Displacement vector per atom is (U+iV) = (Ux + iVx, ...). Current applied displacement on one atom is (dx, dy, dz). qr is the Q.R part of the exponential. */ enum { Ux, Uy, Uz, mod, theta, phi, Vx, Vy, Vz, dx, dy, dz, qr, nData }; /*Local Method */ static void freeVib(gpointer data); static void freeVibe(gpointer obj, gpointer data _U_); static gpointer newOrCopyVibe(gconstpointer obj, gpointer data _U_); static void vibrationIncr(VisuData *data, gboolean time, gboolean phase); static void onPopulationChanged(VisuData *dataObj, gint *ids, gpointer data); static void onPositionChanged(VisuData *dataObj, VisuElement *ele, gpointer data); static gboolean move(gpointer data); typedef struct vibration_ { /* Parameters for the available phonons. */ guint n; float *q; float *omega; float *en; /* Array of all the displacement vectors. */ gboolean *loaded; guint nUs; float *u; float *norm; /* Current applied frequency and amplitude, phonon id, time and delta time. */ float freq, ampl; gint iph; gulong t; /* Internal parameters. */ gboolean haveTime, havePhase; gulong signal; } Vibration; /******************************************************************************************************/ /** * visu_vibration_play: * @data: a #VisuData object. * * Make the phonon displace the #VisuNode of @data according to their * definitions (see visu_vibration_setDisplacements() and * visu_vibration_setCurrentMode()). * * Since: 3.5 * * Returns: the timer's ID */ guint visu_vibration_play(VisuData *data) { Vibration *vib; guint timeoutID = 0; vib = (Vibration*)g_object_get_data(G_OBJECT(data), VISU_VIBRATION_ID); g_return_val_if_fail(vib, 0); timeoutID = g_timeout_add(50, (GSourceFunc)move, data); return timeoutID; } /** * visu_vibration_stop: * @timeoutID: an id. * * Stop the timer with the given @timeoutID. * * Since: 3.5 * * Returns: if the timer is indeed removed. */ gboolean visu_vibration_stop(guint timeoutID) { /* to stop the timer */ return g_source_remove(timeoutID); } /******************************************************************************************************/ static void freeVibe(gpointer obj, gpointer data _U_) { #if GLIB_MINOR_VERSION > 9 g_slice_free1(sizeof(float) * nData, obj); #else g_free(obj); #endif } static gpointer newOrCopyVibe(gconstpointer obj, gpointer data _U_) { float *spinData; #if GLIB_MINOR_VERSION > 9 spinData = g_slice_alloc(sizeof(float) * nData); #else spinData = g_malloc(sizeof(float) * nData); #endif if (obj) { spinData[Ux] = ((float*)obj)[0]; spinData[Uy] = ((float*)obj)[1]; spinData[Uz] = ((float*)obj)[2]; tool_matrix_cartesianToSpherical(spinData + mod, (float*)obj); spinData[Vx] = ((float*)obj)[3]; spinData[Vy] = ((float*)obj)[4]; spinData[Vz] = ((float*)obj)[5]; spinData[dx] = 0.f; spinData[dy] = 0.f; spinData[dz] = 0.f; spinData[qr] = 0.f; } else memset(spinData, 0, sizeof(float) * nData); return (gpointer)spinData; } /** * visu_vibration_init: * @data: a #VisuData object. * @n: number of phonons to set. * @nNodes: number of vibrating nodes. * * Allocate (or reallocate) storage of phonons for @data. The * allocated memory will be automatically freed when @data is * destroyed. * * Since: 3.5 * * Returns: TRUE if @data has no phonons before. */ gboolean visu_vibration_init(VisuData *data, guint n, guint nNodes) { Vibration *vib; gboolean new; guint i; new = FALSE; vib = (Vibration*)g_object_get_data(G_OBJECT(data), VISU_VIBRATION_ID); if (!vib) { new = TRUE; vib = g_malloc(sizeof(Vibration)); g_object_set_data_full(G_OBJECT(data), VISU_VIBRATION_ID, (gpointer)vib, freeVib); vib->q = g_malloc(sizeof(float) * n * 3); vib->omega = g_malloc(sizeof(float) * n); vib->en = g_malloc(sizeof(float) * n); vib->loaded= g_malloc(sizeof(gboolean) * n); vib->nUs = 6 * nNodes; vib->u = g_malloc(sizeof(float) * n * vib->nUs); vib->norm = g_malloc(sizeof(float) * n); g_signal_connect(G_OBJECT(data), "PopulationIncrease", G_CALLBACK(onPopulationChanged), (gpointer)0); vib->signal = g_signal_connect(G_OBJECT(data), "PositionChanged", G_CALLBACK(onPositionChanged), (gpointer)0); } else if (n != vib->n || vib->nUs != 6 * nNodes) { vib->q = g_realloc(vib->q, sizeof(float) * n * 3); vib->omega = g_realloc(vib->omega, sizeof(float) * n); vib->en = g_realloc(vib->en, sizeof(float) * n); vib->loaded= g_realloc(vib->loaded,sizeof(gboolean) * n); vib->nUs = 6 * nNodes; vib->u = g_realloc(vib->u, sizeof(float) * n * vib->nUs); vib->norm = g_realloc(vib->norm, sizeof(float) * n); } for (i = 0; i < n; i++) vib->loaded[i] = FALSE; vib->n = n; vib->iph = -1; vib->t = 0; vib->freq = 5.f; vib->ampl = 1.f; vib->haveTime = FALSE; vib->havePhase = FALSE; DBG_fprintf(stderr, "Vibration: set %d vibration properties for data %p (%d).\n", n, (gpointer)data, nNodes); return new; } static void freeVib(gpointer data) { Vibration *vib; vib = (Vibration*)data; g_free(vib->q); g_free(vib->omega); g_free(vib->en); g_free(vib->u); g_free(vib->norm); g_free(vib->loaded); } /** * visu_vibration_setDisplacements: * @data: a #VisuData object. * @iph: a phonon id. * @vibes: a set of displacement vectors. * @complex: a flag. * * visu_vibration_init() must have been call before. This routine is * used to define a set of displacement vectors, corresponding to one * phonon. The displacement vectors can be @complex, in that case * @vibes contains 6 values for each #VisuNode. * * Since: 3.5 * * Returns: TRUE on success. */ gboolean visu_vibration_setDisplacements(VisuData *data, guint iph, float *vibes, gboolean complex) { float *tmpVibeValues, max; Vibration *vib; int i, nSet; g_return_val_if_fail(data && vibes, FALSE); vib = (Vibration*)g_object_get_data(G_OBJECT(data), VISU_VIBRATION_ID); g_return_val_if_fail(vib && iph < vib->n, FALSE); DBG_fprintf(stderr, "Vibration: set vibration data for phonon %d (%d).\n", iph, vib->nUs / 6); nSet = (complex)?6:3; /* We copy the displacement information into the Vibration structure for the given phonon. */ max = 0.f; for (i = 0; i < (int)vib->nUs / 6; i++) { tmpVibeValues = vib->u + iph * vib->nUs + i * 6; tmpVibeValues[0] = vibes[i * nSet + 0]; tmpVibeValues[1] = vibes[i * nSet + 1]; tmpVibeValues[2] = vibes[i * nSet + 2]; tmpVibeValues[3] = (complex)?vibes[i * nSet + 3]:0.f; tmpVibeValues[4] = (complex)?vibes[i * nSet + 4]:0.f; tmpVibeValues[5] = (complex)?vibes[i * nSet + 5]:0.f; max = MAX(tmpVibeValues[0] * tmpVibeValues[0] + tmpVibeValues[1] * tmpVibeValues[1] + tmpVibeValues[2] * tmpVibeValues[2] + tmpVibeValues[3] * tmpVibeValues[3] + tmpVibeValues[4] * tmpVibeValues[4] + tmpVibeValues[5] * tmpVibeValues[6], max); DBG_fprintf(stderr, "| %d -> (%g,%g,%g) + i (%g,%g,%g)\n", i, tmpVibeValues[0], tmpVibeValues[1], tmpVibeValues[2], tmpVibeValues[3], tmpVibeValues[4], tmpVibeValues[5]); } vib->norm[iph] = sqrt(max); DBG_fprintf(stderr, "Vibration: set norm to %f.\n", vib->norm[iph]); vib->loaded[iph] = TRUE; return TRUE; } /** * visu_vibration_setCurrentMode: * @data: a #VisuData object. * @iph: a phonon id. * @error: a location for a possible error. * * Set all node displacements to zero and setup the displacement * vector (u+iv) for each #VisuNode. After this call, * visu_vibration_play() will move the nodes according to their vibration. * * Since: 3.5 * * Returns: TRUE if its the first time #VisuNodes are displaced. */ gboolean visu_vibration_setCurrentMode(VisuData *data, guint iph, GError **error) { float *tmpVibeValues, xyz[3], red[3], *vals; float *mM; VisuNodeArrayIter iter; VisuNodeProperty *nodevibe; GValue vibeValue = {0.0, {{0.0}, {0.0}}}; Vibration *vib; gboolean new, ok; int i, iNode; g_return_val_if_fail(data, FALSE); DBG_fprintf(stderr, "Vibration: set current mode to %d.\n", iph); vib = (Vibration*)g_object_get_data(G_OBJECT(data), VISU_VIBRATION_ID); g_return_val_if_fail(vib && iph < vib->n, FALSE); if (!vib->loaded[iph]) { visu_data_freePopulation(data); ok = visu_object_load(VISU_OBJECT_INSTANCE, data, iph, (GCancellable*)0, error); if (!ok) return FALSE; } g_return_val_if_fail(vib->loaded[iph], FALSE); /* We copy for all the nodes the displacements into the VISU_VIBRATION_ID node property. */ nodevibe = visu_node_array_getProperty(VISU_NODE_ARRAY(data), VISU_VIBRATION_ID); new = (nodevibe == (VisuNodeProperty*)0); /*Associate the table to a VisuNodeArray as a new property*/ if (new) nodevibe = visu_node_array_property_newPointer(VISU_NODE_ARRAY(data), VISU_VIBRATION_ID, freeVibe, newOrCopyVibe, (gpointer)0); /*for each node*/ i = 0; g_value_init(&vibeValue, G_TYPE_POINTER); visu_node_array_iterNew(VISU_NODE_ARRAY(data), &iter); for(visu_node_array_iterStart(VISU_NODE_ARRAY(data), &iter); iter.node; visu_node_array_iterNext(VISU_NODE_ARRAY(data), &iter)) { iNode = visu_node_array_getOriginal(VISU_NODE_ARRAY(data), iter.node->number); iNode = (iNode >= 0)?iNode:(int)iter.node->number; vals = vib->u + iph * vib->nUs + iNode * 6; if (new) { tmpVibeValues = newOrCopyVibe(vals, (gpointer)0); g_value_set_pointer(&vibeValue, tmpVibeValues); visu_node_property_setValue(nodevibe, iter.node, &vibeValue); } else { visu_node_property_getValue(nodevibe, iter.node, &vibeValue); tmpVibeValues = (float*)g_value_get_pointer(&vibeValue); tmpVibeValues[Ux] = vals[0]; tmpVibeValues[Uy] = vals[1]; tmpVibeValues[Uz] = vals[2]; tool_matrix_cartesianToSpherical(tmpVibeValues + mod, vals); tmpVibeValues[Vx] = vals[3]; tmpVibeValues[Vy] = vals[4]; tmpVibeValues[Vz] = vals[5]; tmpVibeValues[dx] = 0.f; tmpVibeValues[dy] = 0.f; tmpVibeValues[dz] = 0.f; } /* Set the phase. */ visu_data_getNodePosition(data, iter.node, xyz); visu_box_convertXYZtoBoxCoordinates(visu_boxed_getBox(VISU_BOXED(data)), red, xyz); tmpVibeValues[qr] = 2.f * G_PI * (red[0] * vib->q[3 * iph + 0] + red[1] * vib->q[3 * iph + 1] + red[2] * vib->q[3 * iph + 2]); DBG_fprintf(stderr, "| %d -> (%g,%g,%g) + i (%g,%g,%g) | (%g,%g,%g) %g\n", i, tmpVibeValues[Ux], tmpVibeValues[Uy], tmpVibeValues[Uz], tmpVibeValues[Vx], tmpVibeValues[Vy], tmpVibeValues[Vz], tmpVibeValues[dx], tmpVibeValues[dy], tmpVibeValues[dz], tmpVibeValues[qr]); i += 1; } /* Set the norm of the phonon. */ mM = (float*)g_object_get_data(G_OBJECT(data), "max_" VISU_VIBRATION_ID); if (!mM) { mM = g_malloc(sizeof(float) * 2); g_object_set_data_full(G_OBJECT(data), "max_" VISU_VIBRATION_ID, mM, g_free); } mM[1] = vib->norm[iph]; vib->iph = iph; return new; } /** * visu_vibration_setCharacteristic: * @data: a #VisuData object. * @n: a phonon id. * @q: a reciprocal vector. * @en: the phonon energy. * @omega: the phonon frequency. * * This routine is used to define the characteristics of a given * phonon. * * Since: 3.5 * * Returns: TRUE on success. */ gboolean visu_vibration_setCharacteristic(VisuData *data, guint n, float q[3], float en, float omega) { Vibration *vib; g_return_val_if_fail(data, FALSE); vib = (Vibration*)g_object_get_data(G_OBJECT(data), VISU_VIBRATION_ID); g_return_val_if_fail(vib || vib->n <= n, FALSE); vib->q[n * 3 + 0] = q[0]; vib->q[n * 3 + 1] = q[1]; vib->q[n * 3 + 2] = q[2]; vib->omega[n] = omega; vib->en[n] = en; return TRUE; } /** * visu_vibration_getCharacteristic: * @data: a #VisuData object. * @n: a phonon id. * @q: a location for the reciprocal vector. * @en: a locattion for the phonon energy. * @omega: a location for the phonon frequency. * * This routine is used to get the characteristics of a given * phonon, see visu_vibration_setCharacteristic() to set them. * * Since: 3.5 * * Returns: TRUE on success. */ gboolean visu_vibration_getCharacteristic(VisuData *data, guint n, float q[3], float *en, float *omega) { Vibration *vib; g_return_val_if_fail(data && en && omega, FALSE); vib = (Vibration*)g_object_get_data(G_OBJECT(data), VISU_VIBRATION_ID); g_return_val_if_fail(vib || vib->n <= n, FALSE); q[0] = vib->q[n * 3 + 0]; q[1] = vib->q[n * 3 + 1]; q[2] = vib->q[n * 3 + 2]; *omega = vib->omega[n]; *en = vib->en[n]; return TRUE; } /** * visu_vibration_getNPhonons: * @data: a #VisuData object. * @n: a location. * * Retrieves if @data contains phonons or not. Number of stored * phonons is set in @n. * * Since: 3.5 * * Returns: TRUE if @data has phonons. */ gboolean visu_vibration_getNPhonons(VisuData *data, guint *n) { Vibration *vib; g_return_val_if_fail(data && n, FALSE); vib = (Vibration*)g_object_get_data(G_OBJECT(data), VISU_VIBRATION_ID); g_return_val_if_fail(vib, FALSE); *n = vib->n; return TRUE; } /** * visu_vibration_setUserFrequency: * @data: a #VisuData object. * @freq: a frequency. * * Change the frequency at which phonons are played with visu_vibration_play(). * * Since: 3.5 */ void visu_vibration_setUserFrequency(VisuData *data, float freq) { Vibration *vib; float f; g_return_if_fail(data); vib = (Vibration*)g_object_get_data(G_OBJECT(data), VISU_VIBRATION_ID); g_return_if_fail(vib); f = vib->freq; if (freq == 0.f) vib->freq = vib->omega[vib->iph]; else vib->freq = freq; /* We update t to keep the same position. */ vib->t = (gulong)((float)vib->t * f / vib->freq); } /** * visu_vibration_setAmplitude: * @data: a #VisuData object. * @ampl: an amplitude. * * Change the amplitude at which phonon are displayed on screen when * using visu_vibration_play(). * * Since: 3.5 * * Returns: TRUE if amplitude is actually changed. */ gboolean visu_vibration_setAmplitude(VisuData *data, float ampl) { Vibration *vib; g_return_val_if_fail(data, FALSE); vib = (Vibration*)g_object_get_data(G_OBJECT(data), VISU_VIBRATION_ID); g_return_val_if_fail(vib, FALSE); if (vib->ampl == ampl) return FALSE; vib->ampl = ampl; return TRUE; } /** * visu_vibration_getCurrentMode: * @data: a #VisuData object. * * Retrieves the phonon that is currently applied to @data. * * Since: 3.5 * * Returns: a phonon id. */ guint visu_vibration_getCurrentMode(VisuData *data) { Vibration *vib; g_return_val_if_fail(data, 0); vib = (Vibration*)g_object_get_data(G_OBJECT(data), VISU_VIBRATION_ID); g_return_val_if_fail(vib, 0); return vib->iph; } static gboolean getVibration(VisuNodeProperty **nodevibe, Vibration **vib, GValue *vibeValue, VisuData *data) { *vib = (Vibration*)g_object_get_data(G_OBJECT(data), VISU_VIBRATION_ID); g_return_val_if_fail(*vib, FALSE); g_value_init(vibeValue, G_TYPE_POINTER); *nodevibe = visu_node_array_getProperty(VISU_NODE_ARRAY(data), VISU_VIBRATION_ID); return TRUE; } static void vibrationIncr(VisuData *data, gboolean time, gboolean phase) { GValue vibeValue = {0.0, {{0.0}, {0.0}}}; float *dxyz, t, c, wdtr, wdti, dU[3]; VisuNodeArrayIter iter; VisuNodeProperty *nodevibe; Vibration *vib; gboolean set; set = getVibration(&nodevibe, &vib, &vibeValue, data); g_return_if_fail(set); if (vib->iph < 0) return; DBG_fprintf(stderr, "Vibration: incr %d %d\n", time, phase); DBG_fprintf(stderr, " | t = %ld, w = %g.\n", vib->t, vib->freq); /* update the timer every time the method is call */ if (time) vib->t += 1; else vib->t = 0; c = AMPL_COEFF * vib->ampl / vib->norm[vib->iph]; t = -OMEGA_COEFF * vib->freq * vib->t; DBG_fprintf(stderr, " | c = %g, t = %g.\n", c, t); visu_node_array_iterNew(VISU_NODE_ARRAY(data), &iter); for(visu_node_array_iterStart(VISU_NODE_ARRAY(data), &iter); iter.node; visu_node_array_iterNext(VISU_NODE_ARRAY(data), &iter)) { /* Get the vector of vibration of the node (GValue) */ visu_node_property_getValue(nodevibe, iter.node, &vibeValue ); /* Convert GValue to Float[3] */ dxyz = (float*)g_value_get_pointer(&vibeValue); /* calculate xyz(t) */ if (dxyz) { wdtr = c * sin(((time)?t:0.f) + ((phase)?dxyz[qr]:0.f)); wdti = -c * cos(((time)?t:0.f) + ((phase)?dxyz[qr]:G_PI_2)); dU[0] = dxyz[Ux] * wdtr + dxyz[Vx] * wdti; dU[1] = dxyz[Uy] * wdtr + dxyz[Vy] * wdti; dU[2] = dxyz[Uz] * wdtr + dxyz[Vz] * wdti; iter.node->translation[0] += dU[0] - dxyz[dx]; iter.node->translation[1] += dU[1] - dxyz[dy]; iter.node->translation[2] += dU[2] - dxyz[dz]; dxyz[dx] = dU[0]; dxyz[dy] = dU[1]; dxyz[dz] = dU[2]; DBG_fprintf(stderr, " | dx = %f, dy = %f, dz = %f\n", dU[0], dU[1], dU[2]); } } vib->haveTime = time; vib->havePhase = phase; /*emit signal for pairs and other things */ g_signal_handler_block(G_OBJECT(data), vib->signal); g_signal_emit_by_name(G_OBJECT(data), "PositionChanged", (VisuElement*)0, NULL); g_signal_handler_unblock(G_OBJECT(data), vib->signal); /* redraw with the new values */ VISU_REDRAW_ADD; } static gboolean move(gpointer data) { vibrationIncr(VISU_DATA(data), TRUE, TRUE); return TRUE; } /** * visu_vibration_resetPosition: * @data: a #VisuData object. * * Reset the node position of the given VisuData. * * Since: 3.5 * * Returns: a boolean */ void visu_vibration_resetPosition(VisuData *data) { vibrationIncr(data, FALSE, FALSE); } /** * visu_vibration_setZeroTime: * @data: a #VisuData object. * * Reset the position of phonons to use position at time equals zero * (so applying just the q vector displacement). * * Since: 3.5 */ void visu_vibration_setZeroTime(VisuData *data) { vibrationIncr(data, FALSE, TRUE); } /** * visu_vibration_isSet: * @data: a #VisuData object. * * Retrieve if @data has some phonon attached to. * * Since: 3.5 * * Returns: TRUE if visu_vibration_init() has been called already. */ gboolean visu_vibration_isSet(VisuData *data) { return (g_object_get_data(G_OBJECT(data), VISU_VIBRATION_ID) != (Vibration*)0); } static void onPopulationChanged(VisuData *dataObj, gint *ids, gpointer data _U_) { int i; VisuNode *node; VisuNodeProperty *nodevibe; GValue vibeValue = {0.0, {{0.0}, {0.0}}}; float *dxyz ,xyz[3], red[3]; Vibration *vib; vib = (Vibration*)g_object_get_data(G_OBJECT(dataObj), VISU_VIBRATION_ID); g_return_if_fail(vib); if (vib->iph < 0) return; g_value_init(&vibeValue, G_TYPE_POINTER); nodevibe = visu_node_array_getProperty(VISU_NODE_ARRAY(dataObj), VISU_VIBRATION_ID); DBG_fprintf(stderr, "Vibration: on population increase recalculate pahse.\n"); /* We need to recalculate the phase of the new ones. */ for (i = 2; ids[i] >= 0; i++) { node = visu_node_array_getFromId(VISU_NODE_ARRAY(dataObj), ids[i]); /* Get the vector of vibration of the node (GValue) */ visu_node_property_getValue(nodevibe, node, &vibeValue ); /* Convert GValue to Float[3] */ dxyz = (float*)g_value_get_pointer(&vibeValue); visu_data_getNodePosition(dataObj, node, xyz); visu_box_convertXYZtoBoxCoordinates(visu_boxed_getBox(VISU_BOXED(dataObj)), red, xyz); DBG_fprintf(stderr, " | node %d, %f -> %f.\n", ids[i], dxyz[3], red[0] * vib->q[3 * vib->iph + 0] + red[1] * vib->q[3 * vib->iph + 1] + red[2] * vib->q[3 * vib->iph + 2]); dxyz[qr] = 2.f * G_PI * (red[0] * vib->q[3 * vib->iph + 0] + red[1] * vib->q[3 * vib->iph + 1] + red[2] * vib->q[3 * vib->iph + 2]); } } static void onPositionChanged(VisuData *dataObj, VisuElement *ele _U_, gpointer data _U_) { VisuNodeArrayIter iter; VisuNodeProperty *nodevibe; GValue vibeValue = {0.0, {{0.0}, {0.0}}}; Vibration *vib; gboolean set; float *dxyz ,xyz[3], red[3]; DBG_fprintf(stderr, "Vibration: on position changed recalculate phase.\n"); set = getVibration(&nodevibe, &vib, &vibeValue, dataObj); g_return_if_fail(set); if (vib->iph < 0) return; /* We need to recalculate the phase of the new ones. */ visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter); for(visu_node_array_iterStart(VISU_NODE_ARRAY(dataObj), &iter); iter.node; visu_node_array_iterNext(VISU_NODE_ARRAY(dataObj), &iter)) { /* Get the vector of vibration of the node (GValue) */ visu_node_property_getValue(nodevibe, iter.node, &vibeValue ); /* Convert GValue to Float[3] */ dxyz = (float*)g_value_get_pointer(&vibeValue); visu_data_getNodePosition(dataObj, iter.node, xyz); visu_box_convertXYZtoBoxCoordinates(visu_boxed_getBox(VISU_BOXED(dataObj)), red, xyz); DBG_fprintf(stderr, " | node %d, %f -> %f.\n", iter.node->number, dxyz[qr], red[0] * vib->q[3 * vib->iph + 0] + red[1] * vib->q[3 * vib->iph + 1] + red[2] * vib->q[3 * vib->iph + 2]); dxyz[qr] = 2.f * G_PI * (red[0] * vib->q[3 * vib->iph + 0] + red[1] * vib->q[3 * vib->iph + 1] + red[2] * vib->q[3 * vib->iph + 2]); } } v_sim-3.7.0/src/extraFunctions/vibration.h0000644000353400050620000000577712215546074015560 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse mèl : BILLARD, non joignable par mèl ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef VIBRATION_H #define VIBRATION_H #include /** * VISU_VIBRATION_ID: * * The default name used for the #VisuGlExt representing * vibrations, see visu_gl_ext_getFromName(). */ #define VISU_VIBRATION_ID "Vibration" gboolean visu_vibration_init(VisuData *data, guint n, guint nNodes); gboolean visu_vibration_getNPhonons(VisuData *data, guint *n); gboolean visu_vibration_setCurrentMode(VisuData *data, guint iph, GError **error); gboolean visu_vibration_setDisplacements(VisuData *data, guint iph, float *vibes, gboolean complex); gboolean visu_vibration_setCharacteristic(VisuData *data, guint n, float q[3], float en, float omega); gboolean visu_vibration_getCharacteristic(VisuData *data, guint n, float q[3], float *en, float *omega); void visu_vibration_setUserFrequency(VisuData *data, float freq); guint visu_vibration_getCurrentMode(VisuData *data); guint visu_vibration_play(VisuData *data); gboolean visu_vibration_stop(guint timeoutID); void visu_vibration_resetPosition(VisuData *data); void visu_vibration_setZeroTime(VisuData *data); gboolean visu_vibration_setAmplitude(VisuData *data, float ampl); gboolean visu_vibration_isSet(VisuData *data); #endif v_sim-3.7.0/src/extraFunctions/surfaces_tests.c0000644000353400050620000002435212215546074016601 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail addresses : CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "surfaces.h" #define BUFFERSIZE 2 #define NB_SURFS 2 #define NB_POLYS 10 #define NB_POINTS 5 /* Various tests for the surface routines. */ static gboolean test_visu_surfaces_points_init(VisuSurfacesPoints *points); static gboolean test_visu_surfaces_points_allocate_0(VisuSurfacesPoints *points); static gboolean test_visu_surfaces_points_allocate(VisuSurfacesPoints *points); static gboolean test_visu_surfaces_points_remove_1(VisuSurfacesPoints *points); static gboolean test_visu_surfaces_points_remove_all(VisuSurfacesPoints *points); static void local_populate(VisuSurfacesPoints *points); static gboolean test_visu_surfaces_new(VisuSurfaces **surf); int main(int argc, char** argv) { VisuSurfacesPoints points; VisuSurfaces *surf; /* To be removed later, needed for the link. */ getGeneralPaths(); /* Test the VisuSurfacesPoints structure. */ visu_surfaces_points_init(&points, BUFFERSIZE); g_return_val_if_fail(test_visu_surfaces_points_init(&points), 1); /* Try to allocate a points with zero points. */ visu_surfaces_points_allocate(&points, NB_SURFS + 1, 0, 0); g_return_val_if_fail(test_visu_surfaces_points_allocate_0(&points), 1); visu_surfaces_points_free(&points); /* We try to allocate with some points this time. */ visu_surfaces_points_allocate(&points, NB_SURFS + 1, NB_POLYS, NB_POINTS); g_return_val_if_fail(test_visu_surfaces_points_allocate(&points), 1); /* We populate the surfaces. */ local_populate(&points); /* We try to remove the second surface. */ g_message("IsosurfacesPoints: remove one surface."); visu_surfaces_points_remove(&points, 1); g_return_val_if_fail(test_visu_surfaces_points_remove_1(&points), 1); /* We try to remove the last two surfaces. */ g_message("IsosurfacesPoints: remove all remaining surfaces."); visu_surfaces_points_remove(&points, 1); visu_surfaces_points_remove(&points, 0); g_return_val_if_fail(test_visu_surfaces_points_remove_all(&points), 1); visu_surfaces_points_free(&points); /* Test the VisuSurfaces structure. */ g_return_val_if_fail(test_visu_surfaces_new(&surf), 1); return 0; } static gboolean test_visu_surfaces_points_init(VisuSurfacesPoints *points) { /* We check all the scalars. */ g_return_val_if_fail(points->nsurf == 0, FALSE); g_return_val_if_fail(points->bufferSize == BUFFERSIZE, FALSE); g_return_val_if_fail(points->num_polys == 0, FALSE); g_return_val_if_fail(points->num_points == 0, FALSE); /* We check that all the pointers are null. */ g_return_val_if_fail(!points->num_polys_surf, FALSE); g_return_val_if_fail(!points->poly_surf_index, FALSE); g_return_val_if_fail(!points->poly_num_vertices, FALSE); g_return_val_if_fail(!points->poly_vertices, FALSE); g_return_val_if_fail(!points->poly_points, FALSE); g_return_val_if_fail(!points->poly_normals, FALSE); return TRUE; } static gboolean test_visu_surfaces_points_allocate_0(VisuSurfacesPoints *points) { /* We check the allocated arrays. */ g_return_val_if_fail(points->num_polys_surf, FALSE); g_return_val_if_fail(points->num_polys_surf[0] == 0 && points->num_polys_surf[1] == 0 && points->num_polys_surf[2] == 0, FALSE); /* We check that all other pointers are null. */ g_return_val_if_fail(!points->poly_surf_index, FALSE); g_return_val_if_fail(!points->poly_num_vertices, FALSE); g_return_val_if_fail(!points->poly_vertices, FALSE); g_return_val_if_fail(!points->poly_points, FALSE); g_return_val_if_fail(!points->poly_normals, FALSE); return TRUE; } static gboolean test_visu_surfaces_points_allocate(VisuSurfacesPoints *points) { /* We check the allocated arrays. */ g_return_val_if_fail(points->num_polys_surf, FALSE); g_return_val_if_fail(points->num_polys_surf[0] == 0 && points->num_polys_surf[1] == 0 && points->num_polys_surf[2] == 0, FALSE); /* We check that all other pointers are allocated. */ g_return_val_if_fail(points->poly_surf_index, FALSE); g_return_val_if_fail(points->poly_num_vertices, FALSE); g_return_val_if_fail(points->poly_vertices, FALSE); g_return_val_if_fail(points->poly_points, FALSE); g_return_val_if_fail(points->poly_normals, FALSE); return TRUE; } static void local_populate(VisuSurfacesPoints *points) { int i, j; points->num_polys_surf[0] = NB_POLYS / 2 - 2; points->num_polys_surf[1] = NB_POLYS / 2 - 1; points->num_polys_surf[2] = 3; for (i = 0; i < NB_POLYS / 2 - 2; i++) points->poly_surf_index[i] = 1; for (i = NB_POLYS / 2 - 2; i < NB_POLYS - 3; i++) points->poly_surf_index[i] = 2; for (i = NB_POLYS - 3; i < NB_POLYS; i++) points->poly_surf_index[i] = 3; for (i = 0; i < NB_POLYS / 2 + 1; i++) points->poly_num_vertices[i] = 4; for (i = NB_POLYS / 2 + 1; i < NB_POLYS; i++) points->poly_num_vertices[i] = 3; for (i = 0; i < NB_POLYS / 2 + 1; i++) { points->poly_vertices[i] = g_malloc(sizeof(int) * 4); for (j = 0; j < 4; j++) points->poly_vertices[i][j] = (i + j) % 5; } for (i = NB_POLYS / 2 + 1; i < NB_POLYS; i++) { points->poly_vertices[i] = g_malloc(sizeof(int) * 3); for (j = 0; j < 3; j++) points->poly_vertices[i][j] = (i - j) % 5; } for (i = 0; i < NB_POINTS; i++) for (j = 0; j < 3 + BUFFERSIZE; j++) points->poly_points[i][j] = i + j; for (i = 0; i < NB_POINTS; i++) for (j = 0; j < 3; j++) points->poly_normals[i][j] = i + j; } static gboolean test_visu_surfaces_points_remove_1(VisuSurfacesPoints *points) { gboolean valid; int i, j; /* We check the scalar values. */ g_message(" | check scalar values."); g_return_val_if_fail(points->nsurf == NB_SURFS, FALSE); g_return_val_if_fail(points->bufferSize == BUFFERSIZE, FALSE); g_return_val_if_fail(points->num_polys == NB_POLYS / 2 + 1, FALSE); g_return_val_if_fail(points->num_points == NB_POINTS, FALSE); /* We check 1D arrays. */ g_message(" | check 1D arrays."); g_return_val_if_fail(points->num_polys_surf[0] == NB_POLYS / 2 - 2 && points->num_polys_surf[1] == 3, FALSE); g_return_val_if_fail(points->poly_surf_index[0] == 1 && points->poly_surf_index[1] == 1 && points->poly_surf_index[2] == 1 && points->poly_surf_index[3] == 2 && points->poly_surf_index[4] == 2 && points->poly_surf_index[5] == 2, FALSE); g_return_val_if_fail(points->poly_num_vertices[0] == 4 && points->poly_num_vertices[1] == 4 && points->poly_num_vertices[2] == 4 && points->poly_num_vertices[3] == 3 && points->poly_num_vertices[4] == 3 && points->poly_num_vertices[5] == 3, FALSE); /* We check 2D arrays. */ valid = TRUE; for (i = 0; i < NB_POLYS / 2 - 2; i++) for (j = 0; j < 4; j++) valid = valid && (points->poly_vertices[i][j] == (i + j) % 5); for (i = NB_POLYS / 2 - 2; i < NB_POLYS / 2 + 1; i++) for (j = 0; j < 3; j++) valid = valid && (points->poly_vertices[i][j] == (i - j - 1) % 5); g_message(" | check 2D arrays."); g_return_val_if_fail(valid, FALSE); /* We check the points and normal values. */ valid = TRUE; for (i = 0; i < NB_POINTS; i++) for (j = 0; j < 3 + BUFFERSIZE; j++) valid = valid && (points->poly_points[i][j] == i + j); for (i = 0; i < NB_POINTS; i++) for (j = 0; j < 3; j++) valid = valid && (points->poly_normals[i][j] == i + j); g_message(" | check points and normals."); g_return_val_if_fail(valid, FALSE); return TRUE; } static gboolean test_visu_surfaces_points_remove_all(VisuSurfacesPoints *points) { /* We check the scalar values. */ g_message(" | check scalar values."); g_return_val_if_fail(points->nsurf == 0, FALSE); g_return_val_if_fail(points->bufferSize == BUFFERSIZE, FALSE); g_return_val_if_fail(points->num_polys == 0, FALSE); g_return_val_if_fail(points->num_points == 0, FALSE); /* We check that all arrays have been nullified. */ g_message(" | check null arrays."); g_return_val_if_fail(!points->poly_surf_index, FALSE); g_return_val_if_fail(!points->poly_num_vertices, FALSE); g_return_val_if_fail(!points->poly_vertices, FALSE); g_return_val_if_fail(!points->poly_points, FALSE); g_return_val_if_fail(!points->poly_normals, FALSE); return TRUE; } static gboolean test_visu_surfaces_new(VisuSurfaces **surf) { *surf = visu_surfaces_new(BUFFERSIZE); g_return_val_if_fail(test_visu_surfaces_points_init(&(*surf)->basePoints), FALSE); g_return_val_if_fail(test_visu_surfaces_points_init(&(*surf)->volatilePlanes), FALSE); /* We check the null pointers. */ g_return_val_if_fail(!(*surf)->ids, FALSE); g_return_val_if_fail(!(*surf)->resources, FALSE); /* We check the associated pointers. */ g_return_val_if_fail((*surf)->properties, FALSE); return TRUE; } v_sim-3.7.0/src/extraGtkFunctions/0000755000353400050620000000000012216331345014112 500000000000000v_sim-3.7.0/src/extraGtkFunctions/gtk_dumpDialogWidget.c0000644000353400050620000005775112215546104020313 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include "gtk_dumpDialogWidget.h" #include /** * SECTION:gtk_dumpDialogWidget * @short_description: Defines a widget to export into different file * formats. * * This widget is based on the #GtkFileChooser in the save * mode. It proposes the user to choose a file to save to. In * addition, it automatically build a list of filters, corresponding * to the available export routines in V_Sim. By default, the filter * is set on 'auto', which means that the filter method is selected * with the file extension. The dialog also has a progress bar. * * This widget is also a dialog, and should be used with * gtk_dialog_run(). After the response GTK_RESPONSE_ACCEPT has been * recieved, one can grep the selected filename with * visu_ui_dump_dialog_getFilename(). The dialog does not call the exporting * routine by itself, the calling method should take care of * that. When doing it, the filechoosing part should be made * insensitive, using visu_ui_dump_dialog_start() and the progress bar should be * updated accordingly (get it with * visu_ui_dump_dialog_getProgressBar()). * * The user interface propose also to change the size (see * visu_ui_dump_dialog_getHeight() and visu_ui_dump_dialog_getWidth()) and if * some options are associated to a file format, these options are * displayed. */ static void visu_ui_dump_dialog_dispose (GObject *obj); static void visu_ui_dump_dialog_finalize(GObject *obj); struct _VisuUiDumpDialog { GtkDialog dialog; GtkWidget *fileChooser; GtkWidget *hBoxOptions; GtkWidget *comboType; VisuDump *selectedToolFileFormat; GtkWidget *expanderToolFileFormat; GtkWidget *checkFileExtension; GtkWidget *spinWidth, *spinHeight; GtkWidget *infoBar; GtkWidget *progressBar; GtkWidget *cancelButton; gchar *dumpFileName; VisuData *dataObj; /* Memory gestion. */ gboolean dispose_has_run; }; struct _VisuUiDumpDialogClass { GtkDialogClass parent_class; guint width, height; gchar *current_dir; guint formatId; void (*dumpDialog) (VisuUiDumpDialog *dump); }; /* Local callbacks */ static void onWidthHeightChanged(GtkSpinButton *spin, gpointer data); static void onSpinPropertyChange(GtkSpinButton *spin, gpointer data); static void onCheckPropertyChange(GtkToggleButton *toggle, gpointer data); static void onComboToolFileFormatChange(GtkComboBox *combo, gpointer data); static void onVisuUiDumpDialogResponse(GtkDialog *dialog, gint id, gpointer *data); G_DEFINE_TYPE(VisuUiDumpDialog, visu_ui_dump_dialog, GTK_TYPE_DIALOG) static void visu_ui_dump_dialog_class_init(VisuUiDumpDialogClass *klass) { DBG_fprintf(stderr, "Gtk VisuUiDumpDialog: creating the class of the widget.\n"); klass->width = 0; klass->height = 0; klass->current_dir = (gchar*)0; klass->formatId = 0; G_OBJECT_CLASS(klass)->dispose = visu_ui_dump_dialog_dispose; G_OBJECT_CLASS(klass)->finalize = visu_ui_dump_dialog_finalize; } static void visu_ui_dump_dialog_init(VisuUiDumpDialog *dumpDialog) { DBG_fprintf(stderr, "Gtk VisuUiDumpDialog: initializing new object (%p).\n", (gpointer)dumpDialog); dumpDialog->selectedToolFileFormat = (VisuDump*)0; dumpDialog->dumpFileName = (gchar*)0; dumpDialog->dataObj = (VisuData*)0; g_signal_connect(G_OBJECT(dumpDialog), "response", G_CALLBACK(onVisuUiDumpDialogResponse), (gpointer)dumpDialog); } static void visu_ui_dump_dialog_dispose(GObject *obj) { DBG_fprintf(stderr, "Gtk VisuUiDumpDialog: dispose object %p.\n", (gpointer)obj); if (VISU_UI_DUMP_DIALOG(obj)->dispose_has_run) return; VISU_UI_DUMP_DIALOG(obj)->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_dump_dialog_parent_class)->dispose(obj); } static void visu_ui_dump_dialog_finalize(GObject *obj) { VisuUiDumpDialog *dialog; g_return_if_fail(obj); DBG_fprintf(stderr, "Gtk VisuUiDumpDialog: finalize object %p.\n", (gpointer)obj); dialog = VISU_UI_DUMP_DIALOG(obj); if (dialog->dumpFileName) /* Free the stored filename. */ g_free(dialog->dumpFileName); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_dump_dialog_parent_class)->finalize(obj); DBG_fprintf(stderr, "Gtk VisuUiDumpDialog: freeing ... OK.\n"); } /** * visu_ui_dump_dialog_new : * @dataObj: (allow-none): a #VisuData object (can be NULL) ; * @parent: (allow-none): the parent window ; * @suggestedFilename: (allow-none): a string or NULL. * @suggestedWidth: a positive suggested width for exportation or a * negative value to get the default. * @suggestedHeight: idem for height. * * A #VisuUiDumpDialog widget is complete dialog window widget, but it is already * prepared for dumping, proposing known file formats. It is usefull to get * an filename to export to. It has also a progress bar that can illustrate * the process. The given @dataObj argument is used to initialize some * values related to the data to be dumped. * * Returns: a newly created #VisuUiDumpDialog widget. */ GtkWidget* visu_ui_dump_dialog_new(VisuData *dataObj, GtkWindow *parent, const gchar *suggestedFilename, gint suggestedWidth, gint suggestedHeight) { VisuUiDumpDialog *dumpDialog; VisuUiDumpDialogClass *klass; gchar *directory; const gchar *filename, *labelType; GList *format; GtkWidget *hbox2, *hbox; GtkWidget *label; GtkWidget *wd; GtkWidget *vbox; if (!parent) parent = visu_ui_getRenderWindow(); DBG_fprintf(stderr, "Gtk VisuUiDumpDialog: creating a new VisuUiDumpDialog object.\n"); dumpDialog = VISU_UI_DUMP_DIALOG(g_object_new(VISU_UI_TYPE_DUMP_DIALOG, NULL)); gtk_window_set_title(GTK_WINDOW(dumpDialog), _("Export to a file (image, atomic structures...)")); klass = VISU_UI_DUMP_DIALOG_CLASS(G_OBJECT_GET_CLASS(dumpDialog)); /* This is to avoid a bug in gtk 2.4 */ #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 gtk_window_set_modal(GTK_WINDOW(dumpDialog), TRUE); #endif gtk_window_set_transient_for(GTK_WINDOW(dumpDialog), GTK_WINDOW(parent)); gtk_window_set_position(GTK_WINDOW(dumpDialog), GTK_WIN_POS_CENTER_ON_PARENT); dumpDialog->cancelButton = gtk_dialog_add_button(GTK_DIALOG(dumpDialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); gtk_dialog_add_button(GTK_DIALOG(dumpDialog), GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT); gtk_dialog_set_default_response(GTK_DIALOG(dumpDialog), GTK_RESPONSE_ACCEPT); /* Create the file chooser part. */ dumpDialog->fileChooser = gtk_file_chooser_widget_new(GTK_FILE_CHOOSER_ACTION_SAVE); gtk_widget_set_size_request(dumpDialog->fileChooser, -1, 350); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 7 gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER(dumpDialog->fileChooser), TRUE); #endif gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dumpDialog))), dumpDialog->fileChooser, TRUE, TRUE, 2); gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dumpDialog->fileChooser), FALSE); /* We set the suggested filename, either a previous one or the one given. */ filename = (const gchar*)0; dumpDialog->dataObj = dataObj; if (dataObj) filename = (const gchar*)g_object_get_data(G_OBJECT(dataObj), "visu_ui_dump_dialog_filename"); if (!filename) filename = suggestedFilename; if (filename) gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dumpDialog->fileChooser), filename); /* Create the file options part. */ dumpDialog->hBoxOptions = gtk_hbox_new(FALSE, 0); gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(dumpDialog->fileChooser), dumpDialog->hBoxOptions); vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(dumpDialog->hBoxOptions), vbox, TRUE, TRUE, 2); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); /* Label to introduce the combobox which allow to choose the format */ label = gtk_label_new(_("Choose the file format : ")); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); dumpDialog->comboType = gtk_combo_box_text_new(); /* Set the combo entry that let V_Sim detect the desired format through the extension. */ gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(dumpDialog->comboType), (const gchar*)0, _("Autodetect format")); gtk_box_pack_start(GTK_BOX(hbox), dumpDialog->comboType, FALSE, FALSE, 0); /* Add an expander for file format options. */ dumpDialog->expanderToolFileFormat = gtk_expander_new(_("File format option:")); gtk_widget_set_sensitive(dumpDialog->expanderToolFileFormat, FALSE); gtk_box_pack_start(GTK_BOX(vbox), dumpDialog->expanderToolFileFormat, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(dumpDialog->comboType), "changed", G_CALLBACK(onComboToolFileFormatChange), (gpointer)dumpDialog); /* Add a separator. */ wd = gtk_vseparator_new(); gtk_box_pack_start(GTK_BOX(dumpDialog->hBoxOptions), wd, FALSE, FALSE, 0); /* Create common options part. */ vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(dumpDialog->hBoxOptions), vbox, TRUE, TRUE, 2); dumpDialog->checkFileExtension = gtk_check_button_new_with_label(_("Add extension")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dumpDialog->checkFileExtension), TRUE); gtk_widget_set_sensitive(dumpDialog->checkFileExtension, FALSE); gtk_box_pack_start(GTK_BOX(vbox), dumpDialog->checkFileExtension, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Width: ")); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); dumpDialog->spinWidth = gtk_spin_button_new_with_range(1., 2000., 1.); if (klass->width > 0) gtk_spin_button_set_value(GTK_SPIN_BUTTON(dumpDialog->spinWidth), (gdouble)klass->width); else if (suggestedWidth > 0) gtk_spin_button_set_value(GTK_SPIN_BUTTON(dumpDialog->spinWidth), (gdouble)suggestedWidth); gtk_box_pack_start(GTK_BOX(hbox), dumpDialog->spinWidth, FALSE, FALSE, 0); label = gtk_label_new(_("px")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Height: ")); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); dumpDialog->spinHeight = gtk_spin_button_new_with_range(1., 2000., 1.); if (klass->height > 0) gtk_spin_button_set_value(GTK_SPIN_BUTTON(dumpDialog->spinHeight), (gdouble)klass->height); else if (suggestedHeight > 0) gtk_spin_button_set_value(GTK_SPIN_BUTTON(dumpDialog->spinHeight), (gdouble)suggestedHeight); gtk_box_pack_start(GTK_BOX(hbox), dumpDialog->spinHeight, FALSE, FALSE, 0); label = gtk_label_new(_("px")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(dumpDialog->spinWidth), "value-changed", G_CALLBACK(onWidthHeightChanged), (gpointer)&klass->width); g_signal_connect(G_OBJECT(dumpDialog->spinHeight), "value-changed", G_CALLBACK(onWidthHeightChanged), (gpointer)&klass->height); /* Create the progress bar part. */ hbox2 = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dumpDialog))), hbox2, FALSE, FALSE, 2); /* Label to introduce the progress bar */ label = gtk_label_new(_("Dump progress : ")); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0); dumpDialog->progressBar = gtk_progress_bar_new(); gtk_box_pack_start(GTK_BOX(hbox2), dumpDialog->progressBar, TRUE, TRUE, 2); /* Add an info bar for warning and so on. */ #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 17 dumpDialog->infoBar = gtk_info_bar_new(); gtk_widget_set_no_show_all(dumpDialog->infoBar, TRUE); gtk_info_bar_set_message_type(GTK_INFO_BAR(dumpDialog->infoBar), GTK_MESSAGE_WARNING); label = gtk_label_new(_("Current box has translations applied," " do you want to proceed to exportation anyway?")); gtk_widget_show(label); gtk_container_add (GTK_CONTAINER(gtk_info_bar_get_content_area(GTK_INFO_BAR(dumpDialog->infoBar))), label); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dumpDialog))), dumpDialog->infoBar, FALSE, FALSE, 2); #endif /* Setting default values. */ gtk_widget_set_name(GTK_WIDGET(dumpDialog), "filesel"); directory = visu_ui_getLastOpenDirectory(); if (klass->current_dir) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dumpDialog->fileChooser), klass->current_dir); else if (directory) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dumpDialog->fileChooser), directory); for (format = visu_dump_getAllModules(); format; format = g_list_next(format)) { labelType = tool_file_format_getLabel(TOOL_FILE_FORMAT(format->data)); if (labelType) gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(dumpDialog->comboType), (const gchar*)0, labelType); } gtk_combo_box_set_active(GTK_COMBO_BOX(dumpDialog->comboType), klass->formatId); gtk_widget_show_all(GTK_WIDGET(dumpDialog)); return GTK_WIDGET(dumpDialog); } /*******************/ /* Local callbacks */ /*******************/ static void onSpinPropertyChange(GtkSpinButton *spin, gpointer data) { GValue *val; val = (GValue*)data; g_value_set_int(val, (int)gtk_spin_button_get_value(spin)); DBG_fprintf(stderr, "Gtk VisuUiDumpDialog: set property spin to %d.\n", g_value_get_int(val)); } static void onCheckPropertyChange(GtkToggleButton *toggle, gpointer data) { GValue *val; val = (GValue*)data; g_value_set_boolean(val, gtk_toggle_button_get_active(toggle)); DBG_fprintf(stderr, "Gtk VisuUiDumpDialog: set property check to %d.\n", g_value_get_boolean(val)); } static void onComboToolFileFormatChange(GtkComboBox *combo, gpointer data) { int formatInt, i; GList *dumpTypes; ToolFileFormatIter iter; GtkWidget *wd, *label, *hbox, *vbox; g_return_if_fail(VISU_UI_IS_DUMP_DIALOG(data)); /* Empty the expander for properties. */ wd = gtk_bin_get_child(GTK_BIN(VISU_UI_DUMP_DIALOG(data)->expanderToolFileFormat)); if (wd) gtk_widget_destroy(wd); dumpTypes = visu_dump_getAllModules(); formatInt = gtk_combo_box_get_active(combo); VISU_UI_DUMP_DIALOG_GET_CLASS(data)->formatId = (guint)formatInt; DBG_fprintf(stderr, "Gtk VisuUiDumpDialog: On file format change (%d).\n", formatInt); /* Select auto file format -> no properties. */ if (formatInt == 0) { gtk_widget_set_sensitive(VISU_UI_DUMP_DIALOG(data)->expanderToolFileFormat, FALSE); gtk_widget_set_sensitive(VISU_UI_DUMP_DIALOG(data)->checkFileExtension, FALSE); return; } else /* Search for the selected property. */ for(i = 0; i < formatInt - 1; i++) dumpTypes = g_list_next(dumpTypes); /* Set the check box for extension auto completion. */ gtk_widget_set_sensitive(VISU_UI_DUMP_DIALOG(data)->checkFileExtension, TRUE); /* Get properties if exist for this format. */ iter.lst = (GList*)0; tool_file_format_iterNextProperty(TOOL_FILE_FORMAT(dumpTypes->data), &iter); if (!iter.lst) { gtk_widget_set_sensitive(VISU_UI_DUMP_DIALOG(data)->expanderToolFileFormat, FALSE); return; } gtk_widget_set_sensitive(VISU_UI_DUMP_DIALOG(data)->expanderToolFileFormat, TRUE); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(VISU_UI_DUMP_DIALOG(data)->expanderToolFileFormat), vbox); iter.lst = (GList*)0; for (tool_file_format_iterNextProperty(TOOL_FILE_FORMAT(dumpTypes->data), &iter); iter.lst; tool_file_format_iterNextProperty(TOOL_FILE_FORMAT(dumpTypes->data), &iter)) { hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(iter.label); gtk_misc_set_alignment(GTK_MISC(label), 1., 0.5); gtk_misc_set_padding(GTK_MISC(label), 10, 0); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); switch (G_VALUE_TYPE(iter.val)) { case G_TYPE_INT: wd = gtk_spin_button_new_with_range(0., 100., 1.); gtk_spin_button_set_value(GTK_SPIN_BUTTON(wd), (gdouble)g_value_get_int(iter.val)); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(wd), "value-changed", G_CALLBACK(onSpinPropertyChange), iter.val); break; case G_TYPE_BOOLEAN: wd = gtk_check_button_new(); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wd), g_value_get_boolean(iter.val)); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(wd), "toggled", G_CALLBACK(onCheckPropertyChange), iter.val); break; default: g_warning("Unknown, or nsupprted file format property" " given to 'onComboToolFileFormatChange'."); }; } gtk_widget_show_all(vbox); /* Expand the option expander. */ gtk_expander_set_expanded(GTK_EXPANDER(VISU_UI_DUMP_DIALOG(data)->expanderToolFileFormat), TRUE); } static void onVisuUiDumpDialogResponse(GtkDialog *dialog, gint id, gpointer *data) { gchar *filename; int formatInt; gchar *ext, *pattern; GList *dumpTypes; VisuUiDumpDialog *dumpDialog; VisuUiDumpDialogClass *klass; g_return_if_fail(VISU_UI_IS_DUMP_DIALOG(data)); dumpDialog = VISU_UI_DUMP_DIALOG(data); DBG_fprintf(stderr, "Gtk VisuUiDumpDialog: catch the 'response' signal:" " %d (ACCEPT is %d).\n", id, GTK_RESPONSE_ACCEPT); /* Get the filename. */ filename = (gchar*)0; formatInt = -1; if (id == GTK_RESPONSE_ACCEPT) { filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dumpDialog->fileChooser)); formatInt = gtk_combo_box_get_active(GTK_COMBO_BOX(dumpDialog->comboType)); if (!filename) { /* Autodetect failed, no format match the given filename */ visu_ui_raiseWarning(_("Saving a file"), _("No filename chosen."), GTK_WINDOW(dialog)); g_signal_stop_emission_by_name(G_OBJECT(dumpDialog), "response"); return; } } if (formatInt >= 0) { dumpTypes = visu_dump_getAllModules(); if (formatInt == 0) /* The automatic format has been selected, we look in the pattern list to find a matching pattern. */ while (dumpTypes && !tool_file_format_match (TOOL_FILE_FORMAT(dumpTypes->data), filename)) dumpTypes = g_list_next(dumpTypes); else dumpTypes = g_list_nth(dumpTypes, formatInt - 1); if (!dumpTypes) { /* Autodetect failed, no format match the given filename */ visu_ui_raiseWarning(_("Saving a file"), _("The filename doesn't match any known format."), GTK_WINDOW(dialog)); g_free(filename); g_signal_stop_emission_by_name(G_OBJECT(dumpDialog), "response"); return; } DBG_fprintf(stderr, "Gtk VisuUiDumpDialog: export to dump %p.\n", dumpTypes->data); /* Special warning for non bitmap exportation with translations. */ #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 17 if (!visu_dump_getBitmapStatus(VISU_DUMP(dumpTypes->data)) && visu_data_getTranslationStatus(dumpDialog->dataObj) && !gtk_widget_get_visible(dumpDialog->infoBar)) { gtk_widget_show(dumpDialog->infoBar); g_free(filename); g_signal_stop_emission_by_name(G_OBJECT(dumpDialog), "response"); return; } #endif if (formatInt > 0 && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dumpDialog->checkFileExtension))) { if (tool_file_format_canMatch(TOOL_FILE_FORMAT(dumpTypes->data)) && !tool_file_format_match(TOOL_FILE_FORMAT(dumpTypes->data), filename)) { pattern = (gchar*) tool_file_format_getFilePatterns (TOOL_FILE_FORMAT(dumpTypes->data))->data; ext = g_strrstr(pattern, "."); dumpDialog->dumpFileName = g_strdup_printf("%s%s", filename, ext); g_free(filename); } else dumpDialog->dumpFileName = filename; } else dumpDialog->dumpFileName = filename; dumpDialog->selectedToolFileFormat = VISU_DUMP(dumpTypes->data); DBG_fprintf(stderr, "Gtk VisuUiDumpDialog: '%s' file format chosen.\n", tool_file_format_getName(TOOL_FILE_FORMAT(dumpDialog->selectedToolFileFormat))); /* Save the filename in a property of the VisuData object. */ filename = g_path_get_basename(dumpDialog->dumpFileName); g_object_set_data_full(G_OBJECT(dumpDialog->dataObj), "visu_ui_dump_dialog_filename", (gpointer)filename, g_free); /* Save the dirname in the class. */ klass = VISU_UI_DUMP_DIALOG_CLASS(G_OBJECT_GET_CLASS(dumpDialog)); if (klass->current_dir) g_free(klass->current_dir); klass->current_dir = g_path_get_dirname(dumpDialog->dumpFileName); } } static void onWidthHeightChanged(GtkSpinButton *spin, gpointer data) { *(guint*)data = (guint)gtk_spin_button_get_value(spin); } /******************/ /* Public methods */ /******************/ gchar* visu_ui_dump_dialog_getFilename(VisuUiDumpDialog *dialog) { g_return_val_if_fail(dialog, (gchar*)0); return dialog->dumpFileName; } VisuDump* visu_ui_dump_dialog_getType(VisuUiDumpDialog *dialog) { g_return_val_if_fail(dialog, (VisuDump*)0); return dialog->selectedToolFileFormat; } GtkProgressBar* visu_ui_dump_dialog_getProgressBar(VisuUiDumpDialog *dialog) { g_return_val_if_fail(dialog, (GtkProgressBar*)0); return GTK_PROGRESS_BAR(dialog->progressBar); } GtkButton* visu_ui_dump_dialog_getCancelButton(VisuUiDumpDialog *dialog) { g_return_val_if_fail(dialog, (GtkButton*)0); return GTK_BUTTON(dialog->cancelButton); } gint visu_ui_dump_dialog_getWidth(VisuUiDumpDialog *dialog) { g_return_val_if_fail(dialog, 0); return (gint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(dialog->spinWidth)); } gint visu_ui_dump_dialog_getHeight(VisuUiDumpDialog *dialog) { g_return_val_if_fail(dialog, 0); return (gint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(dialog->spinHeight)); } void visu_ui_dump_dialog_start(VisuUiDumpDialog *dialog) { /* Put everything except the progress bar insensitive */ gtk_widget_set_sensitive(dialog->fileChooser, FALSE); gtk_widget_set_sensitive(dialog->hBoxOptions, FALSE); } void visu_ui_dump_dialog_stop(VisuUiDumpDialog *dialog) { /* Put everything except the progress bar sensitive */ gtk_widget_set_sensitive(dialog->fileChooser, TRUE); gtk_widget_set_sensitive(dialog->hBoxOptions, TRUE); } v_sim-3.7.0/src/extraGtkFunctions/gtk_dumpDialogWidget.h0000644000353400050620000001362112215546104020304 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef GTK_DUMPDIALOG_H #define GTK_DUMPDIALOG_H #include #include #include #include #include G_BEGIN_DECLS /** * VISU_UI_TYPE_DUMP_DIALOG: * * Return the associated #GType to the VisuUiDumpDialog objects. */ #define VISU_UI_TYPE_DUMP_DIALOG (visu_ui_dump_dialog_get_type ()) /** * VISU_UI_DUMP_DIALOG: * @obj: the widget to cast. * * Cast the given object to a #VisuUiDumpDialog object. */ #define VISU_UI_DUMP_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VISU_UI_TYPE_DUMP_DIALOG, VisuUiDumpDialog)) /** * VISU_UI_DUMP_DIALOG_CLASS: * @klass: the class to cast. * * Cast the given class to a #VisuUiDumpDialogClass object. */ #define VISU_UI_DUMP_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VISU_UI_TYPE_DUMP_DIALOG, VisuUiDumpDialogClass)) /** * VISU_UI_IS_DUMP_DIALOG: * @obj: the object to test. * * Return if the given object is a valid #VisuUiDumpDialog object. */ #define VISU_UI_IS_DUMP_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VISU_UI_TYPE_DUMP_DIALOG)) /** * VISU_UI_IS_DUMP_DIALOG_CLASS: * @klass: the class to test. * * Return if the given class is a valid #VisuUiDumpDialogClass class. */ #define VISU_UI_IS_DUMP_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VISU_UI_TYPE_DUMP_DIALOG)) /** * VISU_UI_DUMP_DIALOG_GET_CLASS: * @obj: the widget to get the class of. * * Get the class of the given object. */ #define VISU_UI_DUMP_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_UI_TYPE_DUMP_DIALOG, VisuUiDumpDialogClass)) /** * VisuUiDumpDialog * * Private structure to store informations of a #VisuUiDumpDialog object. */ typedef struct _VisuUiDumpDialog VisuUiDumpDialog; /** * VisuUiDumpDialogClass * * Private structure to store informations of a #VisuUiDumpDialogClass object. */ typedef struct _VisuUiDumpDialogClass VisuUiDumpDialogClass; /** * visu_ui_dump_dialog_get_type * * #GType are unique numbers to identify objects. * * Returns: the #GType associated with #VisuUiDumpDialog objects. */ GType visu_ui_dump_dialog_get_type (void); GtkWidget* visu_ui_dump_dialog_new(VisuData *dataObj, GtkWindow *parent, const gchar *suggestedFilename, gint suggestedWidth, gint suggestedHeight); /** * visu_ui_dump_dialog_getFilename: * @dialog: a #VisuUiDumpDialog object. * * Retrieve the chosen filename. * * Returns: a read-only string. */ gchar* visu_ui_dump_dialog_getFilename(VisuUiDumpDialog *dialog); /** * visu_ui_dump_dialog_getType: * @dialog: a #VisuUiDumpDialog object. * * Retrieve the chosen VisuDump. * * Returns: (transfer none): the selected format (ToolFileFormat and write method). */ VisuDump* visu_ui_dump_dialog_getType(VisuUiDumpDialog *dialog); /** * visu_ui_dump_dialog_getProgressBar: * @dialog: a #VisuUiDumpDialog object. * * Retrieve interesting widget. * * Returns: (transfer none): a pointer to the progress bar. */ GtkProgressBar* visu_ui_dump_dialog_getProgressBar(VisuUiDumpDialog *dialog); /** * visu_ui_dump_dialog_getCancelButton: * @dialog: a #VisuUiDumpDialog object. * * Retrieve interesting widget. * * Returns: (transfer none): a pointer to the cancel button. */ GtkButton* visu_ui_dump_dialog_getCancelButton(VisuUiDumpDialog *dialog); /** * visu_ui_dump_dialog_getWidth: * @dialog: a #VisuUiDumpDialog object. * * Retrieve request image size. * * Returns: the width value. */ gint visu_ui_dump_dialog_getWidth(VisuUiDumpDialog *dialog); /** * visu_ui_dump_dialog_getHeight: * @dialog: a #VisuUiDumpDialog object. * * Retrieve request image size. * * Returns: the height value. */ gint visu_ui_dump_dialog_getHeight(VisuUiDumpDialog *dialog); /** * visu_ui_dump_dialog_start: * @dialog: a #VisuUiDumpDialog object. * * Make the file chooser part insensitive during dump, only the * progress bar and the abort button are kept sensitive. */ void visu_ui_dump_dialog_start(VisuUiDumpDialog *dialog); /** * visu_ui_dump_dialog_stop: * @dialog: a #VisuUiDumpDialog object. * * Return the filechooser to a sensitive state. */ void visu_ui_dump_dialog_stop(VisuUiDumpDialog *dialog); G_END_DECLS #endif v_sim-3.7.0/src/extraGtkFunctions/gtk_colorComboBoxWidget.c0000644000353400050620000012510312215546105020761 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include "gtk_colorComboBoxWidget.h" #include #include #include /** * SECTION:gtk_colorComboBoxWidget * @short_description: Defines a specialised #GtkComboBox to choose * stored colours. * @see_also: #ToolColor, #VisuUiStippleCombobox, #VisuUiShadeCombobox * @include: coreTools/toolColor.h * * This widget looks like a #GtkComboBox and it displays a list * of stored colours. These colours may come from the configuration * files or can be selected and stored by the user actions. To do it, * the first entry of the combo box is 'new / modify', that opens a GTK * colour picker. The new values are used to craete a new colour entry * in the combo box. In a complete version, the combo box can have a * #GtkVBox associated to modify colours without creating new entries, see * visu_ui_color_combobox_newWithRanges() method. Otherwise, only already * selected colours are available. The stored colours are shared by * all widgets of this class. It is thus a convenient way to have * coherent colour picker through V_Sim. * * When the widget is created with ranges, the additional part * can be retrieve with visu_ui_color_combobox_getRangeWidgets() and attached * whereever is convenient. When the ranges are modified, the new * colour is not added to the combo box. It can be read using * visu_ui_color_combobox_getRangeColor() or visu_ui_color_combobox_getRangeMaterial(). The combo * box is set thus to an unselected state and * visu_ui_color_combobox_getSelection() will return a NULL * pointer. Besides the colour ranges, there is an add button to * insert the newly defined colour into the combo box. * * This widget can emit a #VisuUiColorCombobox::color-selected * signal that is a wrapper around the #GtkComboBox::changed signal, * but it is emitted only when a new colour is selected (either an * existing one or a newly created from the picker). This colour * is passed to the callback. The two other signals, * #VisuUiColorCombobox::color-value-changed and * #VisuUiColorCombobox::material-value-changed, are generated when the * widget have been created with ranges and that one of these ranges * is modified. * * Since: 3.1 */ enum { COLOR_SELECTED_SIGNAL, COLOR_VALUE_CHANGED_SIGNAL, MATERIAL_VALUE_CHANGED_SIGNAL, LAST_SIGNAL }; /* This enum is used to access the column of the GtkListStore that contains the informations of stroed colors. */ enum { /* This has a pointer to a 16x16 image to represent the color, including the alpha channel. */ COLUMN_COLOR_PIXBUF_ALPHA, /* This has a pointer to a 16x16 image to represent the color, without the alpha channel. */ COLUMN_COLOR_PIXBUF, /* This is a pointer to a label that describes the color : "(n_red;n_green;n_blue;n_alpha)" with n_xxx from 0 to 255. */ COLUMN_COLOR_LABEL_ALPHA, /* This is the same label than above but without the alpha value. */ COLUMN_COLOR_LABEL, /* This a pointer to the #ToolColor as defined in visuTools.h */ COLUMN_COLOR_POINTER_TO, N_COLUMN_COLOR }; /* Labels for the ranges part. */ #define RED_ELE_LABEL _("R:") #define GREEN_ELE_LABEL _("G:") #define BLUE_ELE_LABEL _("B:") #define ALPHA_ELE_LABEL _("Alph:") #define AMB_ELE_LABEL _("amb:") #define DIF_ELE_LABEL _("dif:") #define SHI_ELE_LABEL _("shi:") #define SPE_ELE_LABEL _("spe:") #define EMI_ELE_LABEL _("emi:") static void visu_ui_color_combobox_changed (GtkWidget *widget, VisuUiColorCombobox *colorComboBox); static void visu_ui_color_combobox_dispose (GObject *obj); static void visu_ui_color_combobox_finalize(GObject *obj); static guint visu_ui_color_combobox_signals[LAST_SIGNAL] = { 0 }; /** * VisuUiColorCombobox * * Private structure to store informations of a #VisuUiColorCombobox object. * * Since: 3.1 */ struct _VisuUiColorCombobox { GtkComboBox comboColor; ToolColor* previouslySelectedColor; gboolean withRanges; GtkWidget *expandRanges; GtkWidget *rgbRanges[4]; GtkWidget *materialRanges[VISU_GL_LIGHT_MATERIAL_N_VALUES]; gulong rgbSignals[4]; gulong materialSignals[VISU_GL_LIGHT_MATERIAL_N_VALUES]; gulong comboSignal; GtkWidget *addButton; gboolean hasAlphaChannel; GtkCellRenderer *rendererRGB; /* Memory gestion. */ gboolean dispose_has_run; }; /** * VisuUiColorComboboxClass * * Private structure to store informations of a #VisuUiColorComboboxClass object. * * Since: 3.1 */ struct _VisuUiColorComboboxClass { GtkComboBoxClass parent_class; void (*colorComboBox) (VisuUiColorCombobox *colorCombo); /* This listStore contains all the colors known by widgets of this class. It is used as TreeModel for the combobox in the widget. */ GtkListStore *listStoredColors; gulong colorAddedSignalId; }; /* Local callbacks. */ static void visu_ui_color_combobox_materialChanged(GtkRange *rg, gpointer data); static void visu_ui_color_combobox_rgbChanged(GtkRange *rg, gpointer data); static void visu_ui_color_combobox_addButtonClicked(GtkButton *button, gpointer data); /* Local methods. */ static void addColorToModel(GtkTreeIter *iter, VisuUiColorComboboxClass* klass, ToolColor* color); static void onNewColorAvailable(GObject *obj, ToolColor* newColor, gpointer data); /** * visu_ui_color_combobox_get_type * * #GType are unique numbers to identify objects. * * Returns: the #GType associated with #VisuUiColorCombobox objects. * * Since: 3.1 */ G_DEFINE_TYPE(VisuUiColorCombobox, visu_ui_color_combobox, GTK_TYPE_COMBO_BOX) static void visu_ui_color_combobox_class_init(VisuUiColorComboboxClass *klass) { GtkTreeIter iter; GList *colorLst; DBG_fprintf(stderr, "Gtk VisuUiColorCombobox: creating the class of the widget.\n"); DBG_fprintf(stderr, " - adding new signals ;\n"); /** * VisuUiColorCombobox::color-selected: * @combo: the #VisuUiColorCombobox that emits the signal ; * @color: the newly selected #ToolColor. * * This signal is emitted when a new valid colour is selected, * either an existing one or newly created one. * * Since: 3.1 */ visu_ui_color_combobox_signals[COLOR_SELECTED_SIGNAL] = g_signal_new ("color-selected", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (VisuUiColorComboboxClass, colorComboBox), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); /** * VisuUiColorCombobox::color-value-changed: * @combo: the #VisuUiColorCombobox that emits the signal ; * @RGBA: the modified channel. * * This signal is emitted when the range of a colour is modified. * * Since: 3.3 */ visu_ui_color_combobox_signals[COLOR_VALUE_CHANGED_SIGNAL] = g_signal_new ("color-value-changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (VisuUiColorComboboxClass, colorComboBox), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * VisuUiColorCombobox::material-value-changed: * @combo: the #VisuUiColorCombobox that emits the signal ; * @mat: the modified material channel (see #VisuGlLightMaterial). * * This signal is emitted when the range of a material is modified. * * Since: 3.3 */ visu_ui_color_combobox_signals[MATERIAL_VALUE_CHANGED_SIGNAL] = g_signal_new ("material-value-changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (VisuUiColorComboboxClass, colorComboBox), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); DBG_fprintf(stderr, " - initializing the listStore of colors.\n"); /* Init the listStore of colors. */ klass->listStoredColors = gtk_list_store_new (N_COLUMN_COLOR, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); gtk_list_store_append(klass->listStoredColors, &iter); gtk_list_store_set(klass->listStoredColors, &iter, COLUMN_COLOR_PIXBUF_ALPHA, NULL, COLUMN_COLOR_PIXBUF , NULL, COLUMN_COLOR_LABEL_ALPHA , _("New / modify"), COLUMN_COLOR_LABEL , _("New / modify"), COLUMN_COLOR_POINTER_TO , NULL, -1); klass->colorAddedSignalId = g_signal_connect(VISU_OBJECT_INSTANCE, "colorNewAvailable", G_CALLBACK(onNewColorAvailable), (gpointer)klass); DBG_fprintf(stderr, " - add stored colours.\n"); colorLst = tool_color_getStoredColors(); while (colorLst) { addColorToModel(&iter, klass, (ToolColor*)colorLst->data); colorLst = g_list_next(colorLst); } /* Connect freeing methods. */ G_OBJECT_CLASS(klass)->dispose = visu_ui_color_combobox_dispose; G_OBJECT_CLASS(klass)->finalize = visu_ui_color_combobox_finalize; } static void visu_ui_color_combobox_dispose(GObject *obj) { DBG_fprintf(stderr, "Gtk VisuUiColorCombobox: dispose object %p.\n", (gpointer)obj); if (VISU_UI_COLOR_COMBOBOX(obj)->dispose_has_run) return; VISU_UI_COLOR_COMBOBOX(obj)->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_color_combobox_parent_class)->dispose(obj); } static void visu_ui_color_combobox_finalize(GObject *obj) { /* VisuUiColorCombobox *colorComboBox; */ g_return_if_fail(obj); DBG_fprintf(stderr, "Gtk VisuUiColorCombobox: finalize object %p.\n", (gpointer)obj); /* colorComboBox = VISU_UI_COLOR_COMBOBOX(obj); */ /* if (colorComboBox->expandRanges) */ /* gtk_widget_destroy(colorComboBox->expandRanges); */ /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_color_combobox_parent_class)->finalize(obj); DBG_fprintf(stderr, "Gtk VisuUiColorCombobox: freeing ... OK.\n"); } static void visu_ui_color_combobox_init(VisuUiColorCombobox *colorComboBox) { DBG_fprintf(stderr, "Gtk VisuUiColorCombobox: initializing new object (%p).\n", (gpointer)colorComboBox); colorComboBox->hasAlphaChannel = TRUE; colorComboBox->dispose_has_run = FALSE; colorComboBox->previouslySelectedColor = tool_color_getById(0); } static void _drawPix(GtkCellLayout *layout _U_, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { GdkPixbuf *pix; if (GPOINTER_TO_INT(data)) gtk_tree_model_get(model, iter, COLUMN_COLOR_PIXBUF_ALPHA, &pix, -1); else gtk_tree_model_get(model, iter, COLUMN_COLOR_PIXBUF, &pix, -1); if (pix) { g_object_set(G_OBJECT(cell), "pixbuf", pix, NULL); g_object_unref(pix); } else g_object_set(G_OBJECT(cell), "icon-name", "list-add", NULL); } static void buildWidgets(VisuUiColorCombobox *colorComboBox) { GObjectClass *klass; GtkCellRenderer *renderer; GtkWidget *vboxExpand, *table, *label, *hbox, *image; char *rgb[4]; char *rgbName[4] = {"scroll_r", "scroll_g", "scroll_b", "scroll_a"}; char *material[5]; int i, j; klass = G_OBJECT_GET_CLASS(colorComboBox); gtk_combo_box_set_model(GTK_COMBO_BOX(colorComboBox), GTK_TREE_MODEL(VISU_UI_COLOR_COMBOBOX_CLASS(klass)->listStoredColors)); DBG_fprintf(stderr, "Gtk VisuUiColorCombobox: build widgets.\n"); renderer = gtk_cell_renderer_pixbuf_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(colorComboBox), renderer, FALSE); gtk_cell_layout_set_cell_data_func(GTK_CELL_LAYOUT(colorComboBox), renderer, _drawPix, GINT_TO_POINTER(colorComboBox->hasAlphaChannel), (GDestroyNotify)0); /* if (colorComboBox->hasAlphaChannel) */ /* gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(colorComboBox), renderer, */ /* "pixbuf", COLUMN_COLOR_PIXBUF_ALPHA); */ /* else */ /* gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(colorComboBox), renderer, */ /* "pixbuf", COLUMN_COLOR_PIXBUF); */ renderer = gtk_cell_renderer_text_new(); g_object_set(G_OBJECT(renderer), "scale", 0.67, NULL); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(colorComboBox), renderer, FALSE); if (colorComboBox->hasAlphaChannel) gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(colorComboBox), renderer, "text", COLUMN_COLOR_LABEL_ALPHA); else gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(colorComboBox), renderer, "text", COLUMN_COLOR_LABEL); colorComboBox->rendererRGB = renderer; DBG_fprintf(stderr, " | renderers OK\n"); gtk_combo_box_set_active(GTK_COMBO_BOX(colorComboBox), 1); DBG_fprintf(stderr, " | selection OK\n"); colorComboBox->expandRanges = (GtkWidget*)0; if (colorComboBox->withRanges) { DBG_fprintf(stderr, "Gtk VisuUiColorCombobox: add range widgets.\n"); rgb[0] = RED_ELE_LABEL; rgb[1] = GREEN_ELE_LABEL; rgb[2] = BLUE_ELE_LABEL; rgb[3] = ALPHA_ELE_LABEL; material[0] = AMB_ELE_LABEL; material[1] = DIF_ELE_LABEL; material[2] = SHI_ELE_LABEL; material[3] = SPE_ELE_LABEL; material[4] = EMI_ELE_LABEL; colorComboBox->expandRanges = gtk_expander_new(_("More options")); gtk_expander_set_expanded(GTK_EXPANDER(colorComboBox->expandRanges), FALSE); vboxExpand = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(colorComboBox->expandRanges), vboxExpand); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vboxExpand), hbox, FALSE, FALSE, 5); table = gtk_table_new(3, 2, FALSE); gtk_box_pack_start(GTK_BOX(hbox), table, TRUE, TRUE, 0); gtk_widget_show(table); for (i = 0; i < 3; i++) { label = gtk_label_new(rgb[i]); gtk_table_attach(GTK_TABLE(table), label, 0, 1, i, i + 1, GTK_SHRINK, GTK_SHRINK, 5, 0); colorComboBox->rgbRanges[i] = gtk_hscale_new_with_range(0., 1., 0.001); gtk_scale_set_value_pos(GTK_SCALE(colorComboBox->rgbRanges[i]), GTK_POS_RIGHT); gtk_widget_set_name(colorComboBox->rgbRanges[i], rgbName[i]); gtk_table_attach(GTK_TABLE(table), colorComboBox->rgbRanges[i], 1, 2, i, i + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 5, 0); } colorComboBox->addButton = gtk_button_new(); gtk_box_pack_start(GTK_BOX(hbox), colorComboBox->addButton, FALSE, FALSE, 2); image = gtk_image_new_from_stock (GTK_STOCK_ADD, GTK_ICON_SIZE_BUTTON); gtk_container_add(GTK_CONTAINER(colorComboBox->addButton), image); DBG_fprintf(stderr, " | color OK\n"); table = gtk_table_new(3, 4, FALSE); gtk_box_pack_start(GTK_BOX(vboxExpand), table, FALSE, FALSE, 5); for (i = 0; i < 2; i++) { for (j = 0; j < 2; j++) { label = gtk_label_new(material[i * 2 + j]); gtk_misc_set_alignment(GTK_MISC(label), 1., 0.5); gtk_table_attach(GTK_TABLE(table), label, j * 2, j * 2 + 1, i, i + 1, GTK_SHRINK, GTK_SHRINK, 1, 0); colorComboBox->materialRanges[i * 2 + j] = gtk_hscale_new_with_range(0., 1., 0.01); gtk_scale_set_value_pos(GTK_SCALE(colorComboBox->materialRanges[i * 2 + j]), GTK_POS_RIGHT); gtk_widget_set_name(colorComboBox->materialRanges[i * 2 +j], "scroll_mat"); gtk_table_attach(GTK_TABLE(table), colorComboBox->materialRanges[i * 2 + j], 2 * j + 1, 2 * j + 2, i, i + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 1, 0); } } label = gtk_label_new(material[4]); gtk_misc_set_alignment(GTK_MISC(label), 1., 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 1, i, i + 1, GTK_SHRINK, GTK_SHRINK, 1, 0); colorComboBox->materialRanges[4] = gtk_hscale_new_with_range(0., 1., 0.01); gtk_scale_set_value_pos(GTK_SCALE(colorComboBox->materialRanges[4]), GTK_POS_RIGHT); gtk_widget_set_name(colorComboBox->materialRanges[4], "scroll_mat"); gtk_table_attach(GTK_TABLE(table), colorComboBox->materialRanges[4], 1, 2, i, i + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 1, 0); label = gtk_label_new(rgb[3]); gtk_misc_set_alignment(GTK_MISC(label), 1., 0.5); gtk_table_attach(GTK_TABLE(table), label, 2, 3, i, i + 1, GTK_SHRINK, GTK_SHRINK, 5, 0); colorComboBox->rgbRanges[3] = gtk_hscale_new_with_range(0., 1., 0.01); gtk_scale_set_value_pos(GTK_SCALE(colorComboBox->rgbRanges[3]), GTK_POS_RIGHT); gtk_widget_set_name(colorComboBox->rgbRanges[3], rgbName[3]); gtk_table_attach(GTK_TABLE(table), colorComboBox->rgbRanges[3], 3, 4, i, i + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 1, 0); DBG_fprintf(stderr, " | material OK\n"); /* Attach the callbacks. */ for (i = 0; i < 4; i++) colorComboBox->rgbSignals[i] = g_signal_connect(G_OBJECT(colorComboBox->rgbRanges[i]), "value-changed", G_CALLBACK(visu_ui_color_combobox_rgbChanged), (gpointer)colorComboBox); for (i = 0; i < VISU_GL_LIGHT_MATERIAL_N_VALUES; i++) colorComboBox->materialSignals[i] = g_signal_connect(G_OBJECT(colorComboBox->materialRanges[i]), "value-changed", G_CALLBACK(visu_ui_color_combobox_materialChanged), (gpointer)colorComboBox); g_signal_connect(G_OBJECT(colorComboBox->addButton), "clicked", G_CALLBACK(visu_ui_color_combobox_addButtonClicked), (gpointer)colorComboBox); DBG_fprintf(stderr, " | signals OK\n"); } colorComboBox->comboSignal = g_signal_connect(G_OBJECT(colorComboBox), "changed", G_CALLBACK(visu_ui_color_combobox_changed), (gpointer)colorComboBox); } /** * visu_ui_color_combobox_newWithRanges: * @hasAlphaChannel: a boolean. * * Create a color combo and several ranges. * * Returns: (transfer full): a newly created #VisuUiColorCombobox widget. * * Since: 3.3 */ GtkWidget* visu_ui_color_combobox_newWithRanges(gboolean hasAlphaChannel) { VisuUiColorCombobox *colorComboBox; DBG_fprintf(stderr, "Gtk VisuUiColorCombobox: creating new object with alpha & ranges: %d.\n", hasAlphaChannel); colorComboBox = VISU_UI_COLOR_COMBOBOX(g_object_new(visu_ui_color_combobox_get_type (), NULL)); colorComboBox->hasAlphaChannel = hasAlphaChannel; colorComboBox->withRanges = TRUE; buildWidgets(colorComboBox); DBG_fprintf(stderr, "Gtk VisuUiColorCombobox: object ready.\n"); return GTK_WIDGET(colorComboBox); } /** * visu_ui_color_combobox_new: * @hasAlphaChannel: a boolean. * * A #VisuUiColorCombobox widget is like a #GtkComboBox widget, but it is already filled * with the colors stores in the structures adhoc in visu_tools.h. Using this widget * is a convienient way to share colors between all part of V_Sim and to give a consistent * look of all color selection. If the argument @hasAlphaChannel is FALSE, the widget * display all colors but without their alpha channel, assuming it to be fully opaque. * * Returns: (transfer full): a newly created #VisuUiColorCombobox widget. * * Since: 3.1 */ GtkWidget* visu_ui_color_combobox_new(gboolean hasAlphaChannel) { VisuUiColorCombobox *colorComboBox; DBG_fprintf(stderr, "Gtk VisuUiColorCombobox: creating new object with alpha: %d.\n", hasAlphaChannel); colorComboBox = VISU_UI_COLOR_COMBOBOX(g_object_new(visu_ui_color_combobox_get_type (), NULL)); colorComboBox->hasAlphaChannel = hasAlphaChannel; colorComboBox->withRanges = FALSE; buildWidgets(colorComboBox); DBG_fprintf(stderr, "Gtk VisuUiColorCombobox: object ready.\n"); return GTK_WIDGET(colorComboBox); } /** * visu_ui_color_combobox_setExpanded: * @colorComboBox: a #ToolColor object ; * @value: a boolean value. * * Set the expanded state of the ranges. This is usable only if the colorComboBox * has been created with ranges. * * Since: 3.3 */ void visu_ui_color_combobox_setExpanded(VisuUiColorCombobox *colorComboBox, gboolean value) { g_return_if_fail(VISU_UI_IS_COLOR_COMBOBOX(colorComboBox)); g_return_if_fail(colorComboBox->withRanges); gtk_expander_set_expanded(GTK_EXPANDER(colorComboBox->expandRanges), value); } /** * visu_ui_color_combobox_setPrintValues: * @colorComboBox: a #ToolColor object ; * @value: a boolean. * * Print or not the RGB values. * * Since: 3.4 */ void visu_ui_color_combobox_setPrintValues(VisuUiColorCombobox *colorComboBox, gboolean value) { g_object_set(G_OBJECT(colorComboBox->rendererRGB), "visible", value, NULL); } /** * visu_ui_color_combobox_getRangeWidgets: * @colorComboBox: a #ToolColor object. * * Retrieve the wiodget using to represent the ranges, or NULL if the object * has no ranges. * * Returns: (transfer none): a widget owned by @color. * * Since: 3.3 */ GtkWidget* visu_ui_color_combobox_getRangeWidgets(VisuUiColorCombobox *colorComboBox) { g_return_val_if_fail(VISU_UI_IS_COLOR_COMBOBOX(colorComboBox), (GtkWidget*)0); return colorComboBox->expandRanges; } static void visu_ui_color_combobox_changed(GtkWidget *widget _U_, VisuUiColorCombobox *colorComboBox) { int selected, i; GdkColor gdkcolor; guint alpha; GtkWidget *selection; gint code; float rgba[4]; GtkTreeIter iter; GObjectClass *klass; ToolColor *color; GtkColorSelection *colorsel; selected = gtk_combo_box_get_active(GTK_COMBO_BOX(colorComboBox)); DBG_fprintf(stderr, "Gtk VisuUiColorCombobox: internal combobox changed signal -> %d.\n", selected); if (selected < 0) { if (colorComboBox->withRanges) gtk_widget_set_sensitive(colorComboBox->addButton, TRUE); colorComboBox->previouslySelectedColor = (ToolColor*)0; return; } if (colorComboBox->withRanges) gtk_widget_set_sensitive(colorComboBox->addButton, FALSE); if (selected != 0) { gtk_combo_box_get_active_iter(GTK_COMBO_BOX(colorComboBox), &iter); klass = G_OBJECT_GET_CLASS(colorComboBox); gtk_tree_model_get(GTK_TREE_MODEL(VISU_UI_COLOR_COMBOBOX_CLASS(klass)->listStoredColors), &iter, COLUMN_COLOR_POINTER_TO, &color, -1); if (color != colorComboBox->previouslySelectedColor) { colorComboBox->previouslySelectedColor = color; /* Set the ranges. */ if (colorComboBox->withRanges) for (i = 0; i <4; i++) { g_signal_handler_block(G_OBJECT(colorComboBox->rgbRanges[i]), colorComboBox->rgbSignals[i]); gtk_range_set_value(GTK_RANGE(colorComboBox->rgbRanges[i]), (gdouble)color->rgba[i]); g_signal_handler_unblock(G_OBJECT(colorComboBox->rgbRanges[i]), colorComboBox->rgbSignals[i]); } DBG_fprintf(stderr, "Gtk VisuUiColorCombobox: emitting 'color-selected' signal.\n"); g_signal_emit(G_OBJECT(colorComboBox), visu_ui_color_combobox_signals[COLOR_SELECTED_SIGNAL], 0, (gpointer)color, NULL); } else DBG_fprintf(stderr, "Gtk VisuUiColorCombobox: aborting 'color-selected' signal.\n"); return; } if (colorComboBox->previouslySelectedColor) { gdkcolor.red = (guint16)((colorComboBox->previouslySelectedColor->rgba[0]) * 65535.); gdkcolor.green = (guint16)((colorComboBox->previouslySelectedColor->rgba[1]) * 65535.); gdkcolor.blue = (guint16)((colorComboBox->previouslySelectedColor->rgba[2]) * 65535.); alpha = (guint16)((colorComboBox->previouslySelectedColor->rgba[3]) * 65535.); } else { gdkcolor.red = (guint16)0.; gdkcolor.green = (guint16)0.; gdkcolor.blue = (guint16)0.; alpha = 65535.; } /* Create the selection. */ selection = gtk_color_selection_dialog_new(_("Select a color")); colorsel = GTK_COLOR_SELECTION (gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG(selection))); gtk_color_selection_set_has_opacity_control(colorsel, colorComboBox->hasAlphaChannel); /* createColorSelectionCustomList(GTK_COLOR_SELECTION_DIALOG(selection)); */ /* Initialise its values. */ if (colorComboBox->hasAlphaChannel) gtk_color_selection_set_current_alpha(colorsel, alpha); gtk_color_selection_set_current_color(colorsel, &gdkcolor); /* Run the dialog window. */ code = gtk_dialog_run(GTK_DIALOG(selection)); if (code == GTK_RESPONSE_OK || code == GTK_RESPONSE_ACCEPT) { gtk_color_selection_get_current_color(colorsel, &gdkcolor); rgba[0] = (float)gdkcolor.red / 65535.; rgba[1] = (float)gdkcolor.green / 65535.; rgba[2] = (float)gdkcolor.blue / 65535.; rgba[3] = (float)gtk_color_selection_get_current_alpha(colorsel) / 65535.; klass = G_OBJECT_GET_CLASS(colorComboBox); g_signal_handler_block(VISU_OBJECT_INSTANCE, VISU_UI_COLOR_COMBOBOX_CLASS(klass)->colorAddedSignalId); color = tool_color_addFloatRGBA(rgba, &selected); g_signal_handler_unblock(VISU_OBJECT_INSTANCE, VISU_UI_COLOR_COMBOBOX_CLASS(klass)->colorAddedSignalId); addColorToModel(&iter, VISU_UI_COLOR_COMBOBOX_CLASS(klass), color); gtk_combo_box_set_active_iter(GTK_COMBO_BOX(colorComboBox), &iter); } else { /* Return the combobox to the previously selected color. */ if (colorComboBox->previouslySelectedColor) visu_ui_color_combobox_setSelection(colorComboBox, colorComboBox->previouslySelectedColor); else gtk_combo_box_set_active(GTK_COMBO_BOX(colorComboBox), -1); } gtk_widget_destroy(selection); } static void visu_ui_color_combobox_materialChanged(GtkRange *rg, gpointer data) { int i; VisuUiColorCombobox *colorComboBox; g_return_if_fail(VISU_UI_IS_COLOR_COMBOBOX(data)); colorComboBox = VISU_UI_COLOR_COMBOBOX(data); DBG_fprintf(stderr, "Gtk VisuUiColorCombobox: internal material range changed signal.\n"); DBG_fprintf(stderr, "Gtk VisuUiColorCombobox: emitting 'material-value-changed' signal.\n"); for (i = 0; i < VISU_GL_LIGHT_MATERIAL_N_VALUES; i++) if (GTK_WIDGET(rg) == colorComboBox->materialRanges[i]) { g_signal_emit(G_OBJECT(colorComboBox), visu_ui_color_combobox_signals[MATERIAL_VALUE_CHANGED_SIGNAL], 0, (VisuGlLightMaterial)i, NULL); return; } g_warning("Internal error, unrecognized range."); } static void visu_ui_color_combobox_rgbChanged(GtkRange *rg, gpointer data) { int i; VisuUiColorCombobox *colorComboBox; float *rgba; g_return_if_fail(VISU_UI_IS_COLOR_COMBOBOX(data)); colorComboBox = VISU_UI_COLOR_COMBOBOX(data); DBG_fprintf(stderr, "Gtk VisuUiColorCombobox: internal color range changed signal.\n"); rgba = visu_ui_color_combobox_getRangeColor(colorComboBox); tool_color_getByValues(&i, rgba[0], rgba[1], rgba[2], rgba[3]); if (i < 0) gtk_combo_box_set_active(GTK_COMBO_BOX(colorComboBox), -1); else gtk_combo_box_set_active(GTK_COMBO_BOX(colorComboBox), i + 1); g_free(rgba); DBG_fprintf(stderr, "Gtk VisuUiColorCombobox: emitting 'color-value-changed' signal.\n"); for (i = 0; i < 4; i++) if (GTK_WIDGET(rg) == colorComboBox->rgbRanges[i]) { g_signal_emit(G_OBJECT(colorComboBox), visu_ui_color_combobox_signals[COLOR_VALUE_CHANGED_SIGNAL], 0, (VisuGlLightMaterial)i, NULL); return; } g_warning("Internal error, unrecognized range."); } static void visu_ui_color_combobox_addButtonClicked(GtkButton *button _U_, gpointer data) { GtkTreeIter iter; GObjectClass *klass; ToolColor *color; VisuUiColorCombobox *colorComboBox; float *rgba; int selected; g_return_if_fail(VISU_UI_IS_COLOR_COMBOBOX(data)); colorComboBox = VISU_UI_COLOR_COMBOBOX(data); DBG_fprintf(stderr, "Gtk VisuUiColorCombobox: adding a new color from ranges.\n"); rgba = visu_ui_color_combobox_getRangeColor(colorComboBox); klass = G_OBJECT_GET_CLASS(colorComboBox); g_signal_handler_block(VISU_OBJECT_INSTANCE, VISU_UI_COLOR_COMBOBOX_CLASS(klass)->colorAddedSignalId); color = tool_color_addFloatRGBA(rgba, &selected); g_signal_handler_unblock(VISU_OBJECT_INSTANCE, VISU_UI_COLOR_COMBOBOX_CLASS(klass)->colorAddedSignalId); addColorToModel(&iter, VISU_UI_COLOR_COMBOBOX_CLASS(klass), color); gtk_combo_box_set_active_iter(GTK_COMBO_BOX(colorComboBox), &iter); g_free(rgba); } static void addColorToModel(GtkTreeIter *iter, VisuUiColorComboboxClass* klass, ToolColor* color) { char str[20], strAlpha[20]; GdkPixbuf *pixbufColorBox; GdkPixbuf *pixbufColorAlphaBox; if (!color || !klass) return; sprintf(strAlpha, "(%3d;%3d;%3d;%3d)", (int)(color->rgba[0] * 255.), (int)(color->rgba[1] * 255.), (int)(color->rgba[2] * 255.), (int)(color->rgba[3] * 255.)); sprintf(str, "(%3d;%3d;%3d)", (int)(color->rgba[0] * 255.), (int)(color->rgba[1] * 255.), (int)(color->rgba[2] * 255.)); pixbufColorAlphaBox = tool_color_get_stamp(color, TRUE); pixbufColorBox = tool_color_get_stamp(color, FALSE); gtk_list_store_append(klass->listStoredColors, iter); gtk_list_store_set(klass->listStoredColors, iter, COLUMN_COLOR_PIXBUF_ALPHA, pixbufColorAlphaBox, COLUMN_COLOR_PIXBUF , pixbufColorBox, COLUMN_COLOR_LABEL_ALPHA , strAlpha, COLUMN_COLOR_LABEL , str, COLUMN_COLOR_POINTER_TO , (gpointer)color, -1); DBG_fprintf(stderr, "Gtk VisuUiColorCombobox: appending a new color '%s'.\n", strAlpha); } /** * visu_ui_color_combobox_setSelection: * @colorComboBox: a #VisuUiColorCombobox widget ; * @color: a #ToolColor object. * * Use this method to set the ComboBox on the given color. This emits a 'color-channel' * signal if the color is changed, which means, a previous color has been modified, * or a new color is selected. * * Returns: TRUE if the @color already exists in the model. * * Since: 3.1 */ gboolean visu_ui_color_combobox_setSelection(VisuUiColorCombobox* colorComboBox, ToolColor *color) { GtkTreeIter iter; gboolean validIter; GObjectClass *klass; GtkListStore *model; ToolColor *tmpColor; g_return_val_if_fail(color && VISU_UI_IS_COLOR_COMBOBOX(colorComboBox), FALSE); DBG_fprintf(stderr, "Gtk VisuUiColorCombobox: select a new color %p.\n", (gpointer)color); klass = G_OBJECT_GET_CLASS(colorComboBox); model = GTK_LIST_STORE(VISU_UI_COLOR_COMBOBOX_CLASS(klass)->listStoredColors); validIter = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter); while (validIter) { gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, COLUMN_COLOR_POINTER_TO, &tmpColor, -1); if (tmpColor && tool_color_equal(tmpColor, color)) { gtk_combo_box_set_active_iter(GTK_COMBO_BOX(colorComboBox), &iter); return TRUE; } validIter = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); } return FALSE; } /** * visu_ui_color_combobox_setRangeColor: * @colorComboBox: a #VisuUiColorCombobox widget ; * @rgba: 4 floating point values ; * @raiseSignal: if TRUE a material-value-changed can be raised. * * Change the values for the ranges that control the color. If the color exists * in the list, it is also selected. * This is possible only if the @colorComboBox has been created with * visu_ui_color_combobox_newWithRanges(). * * Since: 3.3 */ void visu_ui_color_combobox_setRangeColor(VisuUiColorCombobox *colorComboBox, float rgba[4], gboolean raiseSignal) { int pos, i; ToolColor *color; color = tool_color_getByValues(&pos, rgba[0], rgba[1], rgba[2], rgba[3]); if (!color) { gtk_combo_box_set_active(GTK_COMBO_BOX(colorComboBox), -1); if (raiseSignal) for (i = 0; i < 4; i++) gtk_range_set_value(GTK_RANGE(colorComboBox->rgbRanges[i]), (gdouble)rgba[i]); else for (i = 0; i < 4; i++) { g_signal_handler_block(G_OBJECT(colorComboBox->rgbRanges[i]), colorComboBox->rgbSignals[i]); gtk_range_set_value(GTK_RANGE(colorComboBox->rgbRanges[i]), (gdouble)rgba[i]); g_signal_handler_unblock(G_OBJECT(colorComboBox->rgbRanges[i]), colorComboBox->rgbSignals[i]); } } else { if (raiseSignal) gtk_combo_box_set_active(GTK_COMBO_BOX(colorComboBox), pos + 1); else { colorComboBox->previouslySelectedColor = color; g_signal_handler_block(G_OBJECT(colorComboBox), colorComboBox->comboSignal); gtk_combo_box_set_active(GTK_COMBO_BOX(colorComboBox), pos + 1); g_signal_handler_unblock(G_OBJECT(colorComboBox), colorComboBox->comboSignal); for (i = 0; i < 4; i++) { g_signal_handler_block(G_OBJECT(colorComboBox->rgbRanges[i]), colorComboBox->rgbSignals[i]); gtk_range_set_value(GTK_RANGE(colorComboBox->rgbRanges[i]), (gdouble)rgba[i]); g_signal_handler_unblock(G_OBJECT(colorComboBox->rgbRanges[i]), colorComboBox->rgbSignals[i]); } } } } static void onNewColorAvailable(GObject *obj _U_, ToolColor* newColor, gpointer data) { VisuUiColorComboboxClass *klass; GtkTreeIter iter; g_return_if_fail(data); DBG_fprintf(stderr, "Gtk VisuUiColorComboboxClass: catch the 'colorNewAvailable' signal.\n"); klass = VISU_UI_COLOR_COMBOBOX_CLASS(data); addColorToModel(&iter, klass, newColor); } /** * visu_ui_color_combobox_getSelection: * @colorComboBox: a #VisuUiColorCombobox widget. * * The user can access to the selected #ToolColor object using this method. * * Returns: (transfer none): a pointer to the selected #ToolColor * object (or NULL). This object is read-only. * * Since: 3.1 */ ToolColor* visu_ui_color_combobox_getSelection(VisuUiColorCombobox *colorComboBox) { gboolean validIter; GtkTreeIter iter; ToolColor *color; GObjectClass *klass; g_return_val_if_fail(VISU_UI_IS_COLOR_COMBOBOX(colorComboBox), (ToolColor*)0); validIter = gtk_combo_box_get_active_iter(GTK_COMBO_BOX(colorComboBox), &iter); if (!validIter) return (ToolColor*)0; color = (ToolColor*)0; klass = G_OBJECT_GET_CLASS(colorComboBox); gtk_tree_model_get(GTK_TREE_MODEL(VISU_UI_COLOR_COMBOBOX_CLASS(klass)->listStoredColors), &iter, COLUMN_COLOR_POINTER_TO, &color, -1); return color; } /** * visu_ui_color_combobox_getPixbufFromColor: * @colorComboBox: a #VisuUiColorCombobox widget ; * @color: a #ToolColor object. * * The @colorComboBox has little pixbufs to represent the color. User methods can * use these pixbufs but should considered them read-only. * * Returns: (transfer none): a pixbuf pointer corresponding to the * little image shown on the @colorComboBox. * * Since: 3.1 */ GdkPixbuf* visu_ui_color_combobox_getPixbufFromColor(VisuUiColorCombobox *colorComboBox, ToolColor *color) { GtkTreeIter iter; gboolean validIter; GdkPixbuf *pixbuf; ToolColor *cl; GtkListStore *model; g_return_val_if_fail(colorComboBox && color, (GdkPixbuf*)0); model = VISU_UI_COLOR_COMBOBOX_CLASS(G_OBJECT_GET_CLASS(colorComboBox))->listStoredColors; validIter = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter); while (validIter) { pixbuf = (GdkPixbuf*)0; cl = (ToolColor*)0; if (colorComboBox->hasAlphaChannel) gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, COLUMN_COLOR_PIXBUF_ALPHA, &pixbuf, COLUMN_COLOR_POINTER_TO, &cl, -1); else gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, COLUMN_COLOR_PIXBUF, &pixbuf, COLUMN_COLOR_POINTER_TO, &cl, -1); if (cl && tool_color_equal(color, cl)) return pixbuf; validIter = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); } return (GdkPixbuf*)0; } /** * visu_ui_color_combobox_setRangeMaterial: * @colorComboBox: a #VisuUiColorCombobox widget ; * @material: VISU_GL_LIGHT_MATERIAL_N_VALUES (see #VisuGlLightMaterial) floating point values ; * @raiseSignal: if TRUE a material-value-changed can be raised. * * Change the values for the ranges that control the light (emission, diffuse...). * This is possible only if the @colorComboBox has been created with * visu_ui_color_combobox_newWithRanges(). * * Since: 3.3 */ void visu_ui_color_combobox_setRangeMaterial(VisuUiColorCombobox *colorComboBox, float material[5], gboolean raiseSignal) { int i; g_return_if_fail(VISU_UI_IS_COLOR_COMBOBOX(colorComboBox)); g_return_if_fail(colorComboBox->withRanges); if (raiseSignal) for (i = 0; i < VISU_GL_LIGHT_MATERIAL_N_VALUES; i++) gtk_range_set_value(GTK_RANGE(colorComboBox->materialRanges[i]), (gdouble)material[i]); else for (i = 0; i < VISU_GL_LIGHT_MATERIAL_N_VALUES; i++) { g_signal_handler_block(G_OBJECT(colorComboBox->materialRanges[i]), colorComboBox->materialSignals[i]); gtk_range_set_value(GTK_RANGE(colorComboBox->materialRanges[i]), (gdouble)material[i]); g_signal_handler_unblock(G_OBJECT(colorComboBox->materialRanges[i]), colorComboBox->materialSignals[i]); } } /** * visu_ui_color_combobox_getRangeMaterial: * @colorComboBox: a #VisuUiColorCombobox widget. * * If the @colorComboBox uses ranges (see visu_ui_color_combobox_newWithRanges()), this method * is used to get the values from the material ranges. * * Returns: (array fixed-size=5) (transfer full): a newly created array of size * VISU_GL_LIGHT_MATERIAL_N_VALUES (see #VisuGlLightMaterial). Use g_free() to delete it. * * Since: 3.3 */ float* visu_ui_color_combobox_getRangeMaterial(VisuUiColorCombobox *colorComboBox) { int i; float *values; g_return_val_if_fail(VISU_UI_IS_COLOR_COMBOBOX(colorComboBox), (float*)0); g_return_val_if_fail(colorComboBox->withRanges, (float*)0); values = g_malloc(sizeof(float) * VISU_GL_LIGHT_MATERIAL_N_VALUES); for (i = 0; i < VISU_GL_LIGHT_MATERIAL_N_VALUES; i++) values[i] = (float)gtk_range_get_value(GTK_RANGE(colorComboBox->materialRanges[i])); return values; } /** * visu_ui_color_combobox_getRangeColor: * @colorComboBox: a #VisuUiColorCombobox widget. * * If the @colorComboBox uses ranges (see visu_ui_color_combobox_newWithRanges()), this method * is used to get the values from the color ranges. * * Returns: (array fixed-size=4) (transfer full): a newly created * array of size 4. Use g_free() to delete it. * * Since: 3.2 */ float* visu_ui_color_combobox_getRangeColor(VisuUiColorCombobox *colorComboBox) { int i; float *values; g_return_val_if_fail(VISU_UI_IS_COLOR_COMBOBOX(colorComboBox), (float*)0); g_return_val_if_fail(colorComboBox->withRanges, (float*)0); values = g_malloc(sizeof(float) * 4); for (i = 0; i < 4; i++) values[i] = (float)gtk_range_get_value(GTK_RANGE(colorComboBox->rgbRanges[i])); return values; } /* Under developpement method, not used at the present time. */ /* void createColorSelectionCustomList(GtkColorSelectionDialog *selection) */ /* { */ /* GtkWidget *hbox; */ /* GtkWidget *buttonF, *buttonB, *button; */ /* GtkWidget *image; */ /* GtkWidget *table; */ /* GtkWidget *label; */ /* GtkWidget *align; */ /* gboolean validIter; */ /* GdkPixbuf *pixbuf; */ /* int i; */ /* gboolean usedPrevNext; */ /* #define N_SHOW_COLOR 15 */ /* GtkTreeIter iter; */ /* GtkWidget *imageGroup; */ /* GtkTreeIter *iterStored; */ /* hbox = gtk_hbox_new(FALSE, 0); */ /* gtk_widget_show(hbox); */ /* gtk_box_pack_start(GTK_BOX(GTK_DIALOG(selection)->vbox), hbox, FALSE, FALSE, 2); */ /* label = gtk_label_new(_("Stored colors:")); */ /* gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); */ /* gtk_widget_show(label); */ /* gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 2); */ /* button = gtk_button_new_from_stock(GTK_STOCK_REMOVE); */ /* gtk_widget_show(button); */ /* gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 2); */ /* usedPrevNext = (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(listStoredColors), NULL) >= N_SHOW_COLOR); */ /* hbox = gtk_hbox_new(FALSE, 0); */ /* gtk_widget_show(hbox); */ /* gtk_box_pack_start(GTK_BOX(GTK_DIALOG(selection)->vbox), hbox, FALSE, FALSE, 2); */ /* if (usedPrevNext) */ /* { */ /* buttonB = gtk_button_new (); */ /* gtk_widget_show(buttonB); */ /* gtk_box_pack_start(GTK_BOX(hbox), buttonB, FALSE, FALSE, 2); */ /* image = gtk_image_new_from_stock(GTK_STOCK_GO_BACK, GTK_ICON_SIZE_BUTTON); */ /* gtk_widget_show (image); */ /* gtk_container_add(GTK_CONTAINER(buttonB), image); */ /* } */ /* align= gtk_alignment_new(0.5, 0.5, 0., 0.); */ /* gtk_widget_show(align); */ /* gtk_box_pack_start(GTK_BOX(hbox), align, FALSE, FALSE, 2); */ /* table = gtk_table_new(1, 10, FALSE); */ /* gtk_widget_show(table); */ /* gtk_container_add(GTK_CONTAINER(align), table); */ /* if (usedPrevNext) */ /* { */ /* buttonF = gtk_button_new (); */ /* gtk_widget_show(buttonF); */ /* gtk_box_pack_start(GTK_BOX(hbox), buttonF, FALSE, FALSE, 2); */ /* image = gtk_image_new_from_stock(GTK_STOCK_GO_FORWARD, GTK_ICON_SIZE_BUTTON); */ /* gtk_widget_show (image); */ /* gtk_container_add(GTK_CONTAINER(buttonF), image); */ /* } */ /* Put all the colors. */ /* imageGroup = (GtkWidget*)0; */ /* i = 0; */ /* validIter = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(listStoredColors), &iter); */ /* while (validIter && i < N_SHOW_COLOR) */ /* { */ /* pixbuf = (GdkPixbuf*)0; */ /* gtk_tree_model_get(GTK_TREE_MODEL(listStoredColors), */ /* &iter, COLUMN_COLOR_PIXBUF_ALPHA, */ /* &pixbuf, -1); */ /* if (pixbuf) */ /* { */ /* if (!imageGroup) */ /* { */ /* imageGroup = gtk_radio_button_new(NULL); */ /* button = imageGroup; */ /* } */ /* else */ /* button = gtk_radio_button_new_from_widget(GTK_RADIO_BUTTON(imageGroup)); */ /* gtk_widget_show(button); */ /* gtk_table_attach(GTK_TABLE(table), button, i, i + 1, 0, 1, GTK_FILL, GTK_FILL, 2, 2); */ /* image = gtk_image_new_from_pixbuf(pixbuf); */ /* gtk_widget_show(image); */ /* gtk_container_add(GTK_CONTAINER(button), image); */ /* iterStored = gtk_tree_iter_copy(&iter); */ /* i += 1; */ /* } */ /* validIter = gtk_tree_model_iter_next(GTK_TREE_MODEL(listStoredColors), &iter); */ /* } */ /* } */ v_sim-3.7.0/src/extraGtkFunctions/gtk_colorComboBoxWidget.h0000644000353400050620000001127112215546105020766 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef GTK_COLORCOMBOBOXWIDGET_H #define GTK_COLORCOMBOBOXWIDGET_H #include #include #include #include #include G_BEGIN_DECLS /** * VISU_TYPE_UI_COLOR_COMBOBOX: * * Return the associated #GType to the VisuUiColorCombobox objects. * * Since: 3.1 */ #define VISU_TYPE_UI_COLOR_COMBOBOX (visu_ui_color_combobox_get_type ()) /** * VISU_UI_COLOR_COMBOBOX: * @obj: the widget to cast. * * Cast the given object to a #VisuUiColorCombobox object. * * Since: 3.1 */ #define VISU_UI_COLOR_COMBOBOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VISU_TYPE_UI_COLOR_COMBOBOX, VisuUiColorCombobox)) /** * VISU_UI_COLOR_COMBOBOX_CLASS: * @klass: the class to cast. * * Cast the given class to a #VisuUiColorComboboxClass object. * * Since: 3.1 */ #define VISU_UI_COLOR_COMBOBOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VISU_TYPE_UI_COLOR_COMBOBOX, VisuUiColorComboboxClass)) /** * VISU_UI_IS_COLOR_COMBOBOX: * @obj: the object to test. * * Return if the given object is a valid #VisuUiColorCombobox object. * * Since: 3.1 */ #define VISU_UI_IS_COLOR_COMBOBOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VISU_TYPE_UI_COLOR_COMBOBOX)) /** * VISU_UI_IS_COLOR_COMBOBOX_CLASS: * @klass: the class to test. * * Return if the given class is a valid #VisuUiColorComboboxClass class. * * Since: 3.1 */ #define VISU_UI_IS_COLOR_COMBOBOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VISU_TYPE_UI_COLOR_COMBOBOX)) typedef struct _VisuUiColorCombobox VisuUiColorCombobox; typedef struct _VisuUiColorComboboxClass VisuUiColorComboboxClass; GType visu_ui_color_combobox_get_type(void); GtkWidget* visu_ui_color_combobox_new(gboolean hasAlphaChannel); GtkWidget* visu_ui_color_combobox_newWithRanges(gboolean hasAlphaChannel); gboolean visu_ui_color_combobox_setSelection(VisuUiColorCombobox* colorComboBox, ToolColor *color); void visu_ui_color_combobox_setRangeColor(VisuUiColorCombobox *colorComboBox, float rgba[4], gboolean raiseSignal); void visu_ui_color_combobox_setRangeMaterial(VisuUiColorCombobox *colorComboBox, float material[VISU_GL_LIGHT_MATERIAL_N_VALUES], gboolean raiseSignal); ToolColor* visu_ui_color_combobox_getSelection(VisuUiColorCombobox *colorComboBox); GdkPixbuf* visu_ui_color_combobox_getPixbufFromColor(VisuUiColorCombobox *colorComboBox, ToolColor *color); float* visu_ui_color_combobox_getRangeMaterial(VisuUiColorCombobox *colorComboBox); float* visu_ui_color_combobox_getRangeColor(VisuUiColorCombobox *colorComboBox); void visu_ui_color_combobox_setExpanded(VisuUiColorCombobox *colorComboBox, gboolean value); GtkWidget* visu_ui_color_combobox_getRangeWidgets(VisuUiColorCombobox *colorComboBox); void visu_ui_color_combobox_setPrintValues(VisuUiColorCombobox *colorComboBox, gboolean value); G_END_DECLS #endif v_sim-3.7.0/src/extraGtkFunctions/gtk_toolPanelWidget.c0000644000353400050620000015727512215546105020166 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include #include "gtk_toolPanelWidget.h" #include #include #include #include #include /** * SECTION:gtk_toolPanelWidget * @short_description: Defines a widget that hold a set of V_Sim panel. * * This widget is a complex association of a #GtkComboBox and a * #GtkNotebook with V_Sim panels. It can have its own window or be * attached into the main command panel. * * This widget also has a built-in menu to exchange V_Sim panel * between different instances of a #VisuUiPanel. A #VisuUiPanel is * refered by its name and has a position and a size. These values can * be stored in the parameter files. */ enum { NOTEBOOK_ENTERED, LAST_SIGNAL }; enum { TOOL_LIST_ICON, /* The icon shown */ TOOL_LIST_STOCK, /* or the stock icon shown */ TOOL_LIST_NAME, /* The label shown */ TOOL_LIST_POINTER_TO_DATA, /* Pointer to the tool panel. */ TOOL_LIST_N_COLUMNS }; /** * VisuUiDockWindow: * * Short name for the structure of containers of #VisuUiPanel. */ struct _VisuUiDockWindow { guint refCount; /* The name of the dock window. */ gchar *name; /* The window holding the notebook of tools. Maybe NULL if the VisuUiDockWindow is integrated in something else.*/ GtkWidget *window; /* The top container widget for the VisuUiDockWindow. */ GtkWidget *vbox; /* The header line with the combobox. */ GtkWidget *hbox; /* The notebook holding the tools. */ GtkWidget *notebook; /* The combo list of accessible tool panels. */ GtkWidget *combo; /* The list store associated to the combo. */ GtkListStore *list; /* Handler on the change signals. */ gulong notebookChanged, comboChanged; /* TRUE if the dock is visible. */ gboolean show; }; /** * VisuUiPanel * * Short form for a #VisuUiPanel_struct structure. */ struct _VisuUiPanel { GtkAlignment alignment; /* Set if the visu_ui_panel can be separate from the main window and be hosted in its own window. */ gboolean dockable; /* An id, untranslated, used to identify the panel in a configuration file. It should not contain any space character. */ gchar *id; /* Value that is shown in the combo box, which is a "long" label. */ gchar *comboLabel; /* Value that appears in te tab of the GtkNoteBook */ gchar *tabLabel; /* An image representing the tool. */ GtkWidget *icon; gchar *stockIcon; /* The hosting container. */ VisuUiDockWindow *container; /* Internal widgets. */ GtkWidget *headerWidget; /* Memory gestion. */ gboolean dispose_has_run; }; /** * VisuUiPanelClass * * Opaque structure. */ struct _VisuUiPanelClass { GtkAlignmentClass parent_class; void (*visu_ui_panel) (VisuUiPanel *tool); /* This list holds pointer on active hosting windows. */ GList* hostingWindows; /* This list holds tools than have no containers. */ GList* orphanVisuUiPanel; /* This is the VisuUiDockWindow of the command panel. */ VisuUiDockWindow *commandPanel; /* Give a quick access from id of tool panels to pointers. */ GHashTable *allVisuUiPanels; /* Pointer on current handled VisuData. No reference is hold. */ VisuData *dataObj; VisuGlView *viewObj; /* If TRUE, the labels are always shown in the tabs. */ gboolean showHeader; }; /** * visu_ui_panel_get_type * * #GType are unique numbers to identify objects. * * Returns: the #GType associated with #VisuUiPanel objects. */ G_DEFINE_TYPE(VisuUiPanel, visu_ui_panel, GTK_TYPE_ALIGNMENT) #define MAIN_PANEL_NAME _("Command panel") /* Local variables. */ static VisuUiPanelClass *local_class = NULL; static GQuark CURRENT_TOOLPANEL_POINTER; static guint visu_ui_panel_signals[LAST_SIGNAL] = { 0 }; /* Local methods. */ static void visu_ui_panel_class_init(VisuUiPanelClass *klass); static void visu_ui_panel_init(VisuUiPanel *visu_ui_panel); static void visu_ui_panel_dispose(GObject *visu_ui_panel); static void visu_ui_panel_finalize(GObject *obj); static GtkWidget* buildDockMenu(VisuUiPanel *visu_ui_panel, GList *listOfDocks); static GtkWidget* buildMainMenu(VisuUiDockWindow *window); static VisuUiDockWindow* dock_window_new(gchar *name, gboolean withWindow); static VisuUiDockWindow* dock_window_ref(VisuUiDockWindow *dock); static void dock_window_unref(VisuUiDockWindow *dock); /* Local callbacks. */ static gboolean onHomePressed(GtkWidget *widget _U_, GdkEventKey *event, gpointer data); static void onDockButtonClicked(VisuUiPanel *visu_ui_panel, gpointer data); static void onMainButtonClicked(GtkButton *button, gpointer data); static void onRaiseButtonClicked(GtkButton *button, gpointer data); static void onDockMenuClicked(GtkMenuItem *menuitem, gpointer user_data); static void onDockMenuNewClicked(GtkMenuItem *menuitem, gpointer user_data); static void onDockMenuHideClicked(GtkMenuItem *menuitem, gpointer user_data); static void onDockMenuSelected(GtkMenuShell *menushell, gpointer user_data); static void onMainMenuClicked(GtkMenuItem *menuitem, gpointer user_data); static void onMainMenuShowClicked(GtkMenuItem *menuitem, gpointer user_data); static void onMainMenuHideClicked(GtkMenuItem *menuitem, gpointer user_data); static void onMainMenuSelected(GtkMenuShell *menushell, gpointer user_data); static gboolean onKillVisuUiDockWindowEvent(GtkWidget *widget, GdkEvent *event, gpointer user_data); static void onPageChanged(GtkNotebook *book, GtkWidget *child, gint num, gpointer data); static void onComboChanged(GtkComboBox *combo, gpointer data); static void visu_ui_panel_class_init(VisuUiPanelClass *klass) { DBG_fprintf(stderr, "Gtk VisuUiPanel : creating the class of the widget.\n"); local_class = klass; DBG_fprintf(stderr, " - adding new signals ;\n"); /** * VisuUiPanel::page-entered: * @panel: the #VisuUiPanel that emits the signal. * * This signal is emitted when a page of the #GtkNotebook with all * the V_Sim panels is entered. * * Since: 3.3 */ visu_ui_panel_signals[NOTEBOOK_ENTERED] = g_signal_new ("page-entered", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(VisuUiPanelClass, visu_ui_panel), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, NULL); DBG_fprintf(stderr, " - initializing the list of hosting windows.\n"); klass->hostingWindows = (GList*)0; klass->orphanVisuUiPanel = (GList*)0; klass->commandPanel = (VisuUiDockWindow*)0; klass->dataObj = (VisuData*)0; klass->viewObj = (VisuGlView*)0; klass->allVisuUiPanels = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL); klass->showHeader = FALSE; CURRENT_TOOLPANEL_POINTER = g_quark_from_static_string("VisuUiPanel_currentVisuUiPanel"); /* Connect freeing methods. */ G_OBJECT_CLASS(klass)->dispose = visu_ui_panel_dispose; G_OBJECT_CLASS(klass)->finalize = visu_ui_panel_finalize; } /* This method can be called several times. It should unref all of its reference to GObjects. */ static void visu_ui_panel_dispose(GObject *visu_ui_panel) { DBG_fprintf(stderr, "Gtk VisuUiPanel : dispose object %p (%s).\n", (gpointer)visu_ui_panel, VISU_UI_PANEL(visu_ui_panel)->id); if (VISU_UI_PANEL(visu_ui_panel)->dispose_has_run) return; VISU_UI_PANEL(visu_ui_panel)->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_panel_parent_class)->dispose(visu_ui_panel); } /* This method is called once only. */ static void visu_ui_panel_finalize(GObject *obj) { VisuUiPanel *visu_ui_panel; g_return_if_fail(obj); DBG_fprintf(stderr, "Gtk VisuUiPanel : finalize object %p.\n", (gpointer)obj); visu_ui_panel = VISU_UI_PANEL(obj); /* Remove me from the list of visu_ui_panels. */ g_hash_table_remove(local_class->allVisuUiPanels, visu_ui_panel->id); if (visu_ui_panel->comboLabel) g_free(visu_ui_panel->comboLabel); if (visu_ui_panel->tabLabel) g_free(visu_ui_panel->tabLabel); if (visu_ui_panel->id) g_free(visu_ui_panel->id); if (visu_ui_panel->stockIcon) g_free(visu_ui_panel->stockIcon); if (visu_ui_panel->headerWidget) g_object_unref(visu_ui_panel->headerWidget); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_panel_parent_class)->finalize(obj); DBG_fprintf(stderr, "Gtk VisuUiPanel : freeing ... OK.\n"); } static void visu_ui_panel_init(VisuUiPanel *visu_ui_panel) { DBG_fprintf(stderr, "Gtk VisuUiPanel : initializing new object (%p).\n", (gpointer)visu_ui_panel); visu_ui_panel->dispose_has_run = FALSE; visu_ui_panel->dockable = FALSE; visu_ui_panel->id = (gchar*)0; visu_ui_panel->comboLabel = (gchar*)0; visu_ui_panel->tabLabel = (gchar*)0; visu_ui_panel->icon = (GtkWidget*)0; visu_ui_panel->stockIcon = (gchar*)0; visu_ui_panel->headerWidget = (GtkWidget*)0; visu_ui_panel->container = (VisuUiDockWindow*)0; } /** * visu_ui_panel_new: * @id: (type filename): a string without space and non internationalised ; * @name: a string in UTF-8 that can be internationalised ; * @tabName: a shorter name than @name, in UTF-8 that can be * internationalised. * * Create a new #VisuUiPanel with the given @id, displaying @name in the * combo box of a #VisuUiDockWindow and @tabName in the tab of the page * notebook. * * Returns: a newly created widget. */ GtkWidget* visu_ui_panel_new(gchar *id, gchar* name, gchar *tabName) { VisuUiPanel *visu_ui_panel; g_return_val_if_fail(id && id[0] && !strstr(id, " "), (GtkWidget*)0); g_return_val_if_fail(name && name[0], (GtkWidget*)0); g_return_val_if_fail(tabName && tabName[0], (GtkWidget*)0); visu_ui_panel = VISU_UI_PANEL(g_object_new(visu_ui_panel_get_type(), NULL)); DBG_fprintf(stderr, "Gtk VisuUiPanel : creating new object '%s' : %p.\n", name, (gpointer)visu_ui_panel); visu_ui_panel->id = g_strdup(id); visu_ui_panel->comboLabel = g_strdup(name); visu_ui_panel->tabLabel = g_strdup(tabName); /* Add me to the list of visu_ui_panels. */ g_hash_table_insert(local_class->allVisuUiPanels, visu_ui_panel->id, (gpointer)visu_ui_panel); return GTK_WIDGET(visu_ui_panel); } /** * visu_ui_panel_newWithIconFromPath: * @id: a string without space and non internationalised ; * @name: a string in UTF-8 that can be internationalised ; * @tabName: a shorter name than @name, in UTF-8 that can be * internationalised ; * @iconPath: a path to an icon (should be 20x20). * * Create a new #VisuUiPanel with the given @id, displaying @name in the * combo box of a #VisuUiDockWindow and @tabName in the tab of the page * notebook. The displayed icon will be read from the @iconPath. * * Returns: (transfer full): a newly created widget. */ GtkWidget* visu_ui_panel_newWithIconFromPath(gchar *id, gchar* name, gchar *tabName, const gchar* iconPath) { VisuUiPanel *visu_ui_panel; visu_ui_panel = VISU_UI_PANEL(visu_ui_panel_new(id, name, tabName)); if (!visu_ui_panel) return (GtkWidget*)0; /* TODO : mettre un truc qui limite la taille des images effiches 20x20 par exemple en chargeant de GdkImage et en regardant sa taille. */ visu_ui_panel->icon = create_pixmap((GtkWidget*)0, iconPath); return GTK_WIDGET(visu_ui_panel); } /** * visu_ui_panel_newWithIconFromStock: * @id: a string without space and non internationalised ; * @name: a string in UTF-8 that can be internationalised ; * @tabName: a shorter name than @name, in UTF-8 that can be * internationalised ; * @stock: the name of a stock icon. * * Create a new #VisuUiPanel with the given @id, displaying @name in the * combo box of a #VisuUiDockWindow and @tabName in the tab of the page * notebook. The displayed icon will be taken from the @stock. * * Returns: (transfer full): a newly created widget. */ GtkWidget* visu_ui_panel_newWithIconFromStock(gchar *id, gchar* name, gchar *tabName, const gchar* stock) { VisuUiPanel *visu_ui_panel; visu_ui_panel = VISU_UI_PANEL(visu_ui_panel_new(id, name, tabName)); if (!visu_ui_panel) return (GtkWidget*)0; visu_ui_panel->stockIcon = g_strdup(stock); visu_ui_panel->icon = gtk_image_new_from_stock(stock, GTK_ICON_SIZE_MENU); return GTK_WIDGET(visu_ui_panel); } /** * visu_ui_panel_getHeaderWidget: * @visu_ui_panel: a #VisuUiPanel. * * The #VisuUiPanel should be used in a page of a #GtkNotebook. This * routine is used to get the widget that should be used in the * tab. This widget is a container with an icon and a label. * * Returns: (transfer none): a container widget that should be put in the tab of a * #GtkNotebook. */ GtkWidget* visu_ui_panel_getHeaderWidget(VisuUiPanel *visu_ui_panel) { GtkWidget *label, *wd, *image, *align; #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkTooltips *tooltips; #endif g_return_val_if_fail(visu_ui_panel, (GtkWidget*)0); /* If the header has never been created, we do it now. */ if (!visu_ui_panel->headerWidget) { #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 tooltips = gtk_tooltips_new (); #endif visu_ui_panel->headerWidget = gtk_hbox_new(FALSE, 0); wd = gtk_event_box_new(); gtk_event_box_set_visible_window(GTK_EVENT_BOX(wd), FALSE); gtk_box_pack_start(GTK_BOX(visu_ui_panel->headerWidget), wd, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(wd, visu_ui_panel->comboLabel); if (visu_ui_panel->icon) gtk_container_add(GTK_CONTAINER(wd), visu_ui_panel->icon); else gtk_container_add(GTK_CONTAINER(wd), gtk_image_new_from_stock(GTK_STOCK_MISSING_IMAGE, GTK_ICON_SIZE_MENU)); label = gtk_label_new(visu_ui_panel->tabLabel); gtk_misc_set_padding(GTK_MISC(label), 2, 0); gtk_box_pack_start(GTK_BOX(visu_ui_panel->headerWidget), label, FALSE, FALSE, 0); if (visu_ui_panel->dockable) { wd = gtk_button_new(); gtk_button_set_relief(GTK_BUTTON(wd), GTK_RELIEF_NONE); g_signal_connect_swapped(G_OBJECT(wd), "clicked", G_CALLBACK(onDockButtonClicked), (gpointer)visu_ui_panel); align = gtk_alignment_new(1.0, 0.5, 0., 0.); gtk_box_pack_start(GTK_BOX(visu_ui_panel->headerWidget), align, TRUE, TRUE, 0); image = create_pixmap((GtkWidget*)0, "stock-menu-detach.png"); gtk_container_add(GTK_CONTAINER(wd), image); gtk_container_add(GTK_CONTAINER(align), wd); gtk_widget_set_tooltip_text(wd, _("Manage this subpanel: attach/detach" " or hide it.")); } else align = (GtkWidget*)0; g_object_ref(G_OBJECT(visu_ui_panel->headerWidget)); gtk_widget_show_all(visu_ui_panel->headerWidget); gtk_widget_hide(label); if (align) gtk_widget_hide(align); } return visu_ui_panel->headerWidget; } /** * visu_ui_panel_getLabel: * @visu_ui_panel: a #VisuUiPanel. * * The #VisuUiPanel has two label, a short one, used in the tab of a * #GtkNotebook and one longer. This routine gets the longer. * * Returns: an UTF-8 internationalised name (property of V_Sim, should * not be freed). */ const gchar* visu_ui_panel_getLabel(VisuUiPanel *visu_ui_panel) { g_return_val_if_fail(visu_ui_panel, (gchar*)0); return visu_ui_panel->comboLabel; } /** * visu_ui_panel_getId: * @visu_ui_panel: a #VisuUiPanel. * * The #VisuUiPanel can be identifyed by an id (a string without space, * usually using ASCII characters only). * * Returns: a constant string identifying this #VisuUiPanel. */ const gchar* visu_ui_panel_getId(VisuUiPanel *visu_ui_panel) { g_return_val_if_fail(visu_ui_panel, (gchar*)0); return visu_ui_panel->id; } /** * visu_ui_panel_setDockable: * @visu_ui_panel: a #VisuUiPanel ; * @value: a boolean. * * A #VisuUiPanel can be moved between different #VisuUiDockWindow or * not. This ability is controlled by the dockable flag. Change it * with this method. If @visu_ui_panel is set dockable, then, it can be * hidden or moved to another or a new #VisuUiDockWindow with the pop-up * memu that is triggered by a small button in the header widget (see * visu_ui_panel_getHeaderWidget()). */ void visu_ui_panel_setDockable(VisuUiPanel *visu_ui_panel, gboolean value) { g_return_if_fail(visu_ui_panel); visu_ui_panel->dockable = value; } /** * visu_ui_panel_getContainer: * @visu_ui_panel: a #VisuUiPanel. * * Return the #VisuUiDockWindow that the given @visu_ui_panel is attached to or * NULL if the @visu_ui_panel is currently dettached. * * Returns: a #VisuUiDockWindow object. */ VisuUiDockWindow* visu_ui_panel_getContainer(VisuUiPanel *visu_ui_panel) { g_return_val_if_fail(VISU_UI_IS_PANEL(visu_ui_panel), (VisuUiDockWindow*)0); return visu_ui_panel->container; } /** * visu_ui_panel_getContainerWindow: * @visu_ui_panel: a #VisuUiPanel. * * Return the #GtkWindow that the given @visu_ui_panel is rendered in or * NULL if the @visu_ui_panel is currently dettached. * * Returns: (transfer none): a #GtkWindow object. */ GtkWindow* visu_ui_panel_getContainerWindow(VisuUiPanel *visu_ui_panel) { g_return_val_if_fail(VISU_UI_IS_PANEL(visu_ui_panel), (GtkWindow*)0); if (visu_ui_panel->container) { if (visu_ui_panel->container->window) return GTK_WINDOW(visu_ui_panel->container->window); else return GTK_WINDOW(visu_ui_main_class_getCurrentPanel()); } else return (GtkWindow*)0; } /** * visu_ui_panel_setContainer: * @visu_ui_panel: a #VisuUiPanel ; * @window: a #VisuUiDockWindow. * * Change the container of a visu_ui_panel. If it is currently attached to * a #VisuUiDockWindow, it firstly detachs it. */ void visu_ui_panel_setContainer(VisuUiPanel *visu_ui_panel, VisuUiDockWindow *container) { g_return_if_fail(VISU_UI_IS_PANEL(visu_ui_panel)); if (container == visu_ui_panel->container) return; /* If the panel is already attached, we detach it. */ if (visu_ui_panel->container) { DBG_fprintf(stderr, "Gtk VisuUiPanel : detaching panel '%s' (%p).\n", visu_ui_panel->tabLabel, (gpointer)visu_ui_panel); g_object_ref(G_OBJECT(visu_ui_panel)); visu_ui_panel_detach(visu_ui_panel); } /* If a new container is given, we attach it. */ if (container) { DBG_fprintf(stderr, "Gtk VisuUiPanel : attaching panel '%s' (%p) to %p.\n", visu_ui_panel->tabLabel, (gpointer)visu_ui_panel, (gpointer)container); visu_ui_panel_attach(visu_ui_panel, container); g_object_unref(G_OBJECT(visu_ui_panel)); } } /** * visu_ui_panel_getContainerId: * @visu_ui_panel: a #VisuUiPanel. * * Return the identifying string of the #VisuUiDockWindow that the given * @visu_ui_panel is attached to or NULL if the @visu_ui_panel is currently dettached. * * Returns: a string owned by V_Sim. */ const gchar* visu_ui_panel_getContainerId(VisuUiPanel *visu_ui_panel) { g_return_val_if_fail(VISU_UI_IS_PANEL(visu_ui_panel), (gchar*)0); if (!visu_ui_panel->container) return "None"; if (visu_ui_panel->container == VISU_UI_PANEL_CLASS(G_OBJECT_GET_CLASS(visu_ui_panel))->commandPanel) return "Main"; return visu_ui_panel->container->name; } /** * visu_ui_panel_setContainerId: * @visu_ui_panel: a #VisuUiPanel ; * @id: a #VisuUiDockWindow identifier. * * Change the container of a visu_ui_panel using the given @id. If it is * currently attached to a #VisuUiDockWindow, it firstly detachs it. */ void visu_ui_panel_setContainerId(VisuUiPanel *visu_ui_panel, const gchar *id) { g_return_if_fail(VISU_UI_IS_PANEL(visu_ui_panel) && id && id[0]); visu_ui_panel_setContainer(visu_ui_panel, visu_ui_panel_class_getDockById(id)); } /** * visu_ui_panel_getData: * @visu_ui_panel: a #VisuUiPanel. * * The @visu_ui_panel is supposed to work on a #VisuData, this routine can * be used to get it. * * Returns: (transfer none): the currently focused #VisuData (can be NULL if none). */ VisuData* visu_ui_panel_getData(VisuUiPanel *visu_ui_panel) { g_return_val_if_fail(VISU_UI_IS_PANEL(visu_ui_panel), (VisuData*)0); return VISU_UI_PANEL_CLASS(G_OBJECT_GET_CLASS(visu_ui_panel))->dataObj; } /** * visu_ui_panel_getFocused: * @visu_ui_panel: a #VisuUiPanel. * * Retrieves the currently focused #VisuBoxed object in the default #VisuUiRenderingWindow. * * Since: 3.7 * * Returns: (transfer none) (allow-none): the currently focused * #VisuBoxed (can be %NULL if none). */ VisuBoxed* visu_ui_panel_getFocused(VisuUiPanel *visu_ui_panel) { g_return_val_if_fail(VISU_UI_IS_PANEL(visu_ui_panel), (VisuBoxed*)0); return VISU_BOXED(VISU_UI_PANEL_CLASS(G_OBJECT_GET_CLASS(visu_ui_panel))->dataObj); } /** * visu_ui_panel_getView: * @visu_ui_panel: a #VisuUiPanel object. * * Convenient routine to get the current #VisuGlView, see * visu_ui_panel_class_setCurrent(). * * Since: 3.7 * * Returns: (transfer none): the current #VisuGlView, or NULL. */ VisuGlView* visu_ui_panel_getView(VisuUiPanel *visu_ui_panel) { g_return_val_if_fail(VISU_UI_IS_PANEL(visu_ui_panel), (VisuGlView*)0); return VISU_UI_PANEL_CLASS(G_OBJECT_GET_CLASS(visu_ui_panel))->viewObj; } /** * visu_ui_panel_getVisible: * @visu_ui_panel: a #VisuUiPanel. * * This is used to retrieve if the @visu_ui_panel is currently realised * and the visualised page of the #GtkNotebook it is associated to. * * Returns: TRUE if the given @visu_ui_panel is potentialy visible to the user. */ gboolean visu_ui_panel_getVisible(VisuUiPanel *visu_ui_panel) { g_return_val_if_fail(VISU_UI_IS_PANEL(visu_ui_panel), FALSE); /* If the tool panel is not shown, we return fFALSE. */ if (!visu_ui_panel->container || !visu_ui_panel->container->show) return FALSE; /* If the tool panel is attached to a visible dock, we test if the current page of the notebook is our tool panel. */ return (visu_ui_panel == VISU_UI_PANEL(gtk_notebook_get_nth_page (GTK_NOTEBOOK(visu_ui_panel->container->notebook), gtk_notebook_get_current_page (GTK_NOTEBOOK(visu_ui_panel->container->notebook))))); } /*****************/ /* Menu gestion. */ /*****************/ static void onDockButtonClicked(VisuUiPanel *visu_ui_panel, gpointer data _U_) { GtkWidget *wd; g_return_if_fail(VISU_UI_IS_PANEL(visu_ui_panel)); wd = buildDockMenu(visu_ui_panel, VISU_UI_PANEL_CLASS(G_OBJECT_GET_CLASS(visu_ui_panel))->hostingWindows); g_signal_connect(G_OBJECT(wd), "selection-done", G_CALLBACK(onDockMenuSelected), (gpointer)0); gtk_widget_show_all(wd); gtk_menu_popup(GTK_MENU(wd), NULL, NULL, NULL, NULL, 1, gtk_get_current_event_time()); } static GtkWidget* buildDockMenu(VisuUiPanel *visu_ui_panel, GList *listOfDocks) { GtkWidget *menu, *item; VisuUiDockWindow *window; gchar *lbl; menu = gtk_menu_new(); /* All dock windows. */ while (listOfDocks) { window = (VisuUiDockWindow*)listOfDocks->data; if (window->show) { lbl = g_strdup_printf(_("Send to '%s'"), window->name); item = gtk_menu_item_new_with_label(lbl); g_free(lbl); g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(onDockMenuClicked), listOfDocks->data); g_object_set_qdata_full(G_OBJECT(item), CURRENT_TOOLPANEL_POINTER, (gpointer)visu_ui_panel, NULL); gtk_widget_set_sensitive(item, (visu_ui_panel->container != window)); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); } listOfDocks = g_list_next(listOfDocks); } /* Separator. */ item = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); /* Create a new dock window. */ item = gtk_menu_item_new_with_label(_("New dock")); g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(onDockMenuNewClicked), (gpointer)visu_ui_panel); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); /* Remove the current tool panel. */ lbl = g_strdup_printf(_("Hide tool '%s'"), visu_ui_panel->tabLabel); item = gtk_menu_item_new_with_label(lbl); g_free(lbl); g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(onDockMenuHideClicked), (gpointer)visu_ui_panel); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); DBG_fprintf(stderr, "Gtk VisuUiPanel : create the dock menu %p.\n", (gpointer)menu); return menu; } static void onDockMenuClicked(GtkMenuItem *menuitem, gpointer user_data) { VisuUiPanel *visu_ui_panel; visu_ui_panel = (VisuUiPanel*)0; visu_ui_panel = VISU_UI_PANEL(g_object_get_qdata(G_OBJECT(menuitem), CURRENT_TOOLPANEL_POINTER)); g_return_if_fail(VISU_UI_IS_PANEL(visu_ui_panel)); visu_ui_panel_setContainer(visu_ui_panel, (VisuUiDockWindow*)user_data); } static void onDockMenuNewClicked(GtkMenuItem *menuitem _U_, gpointer user_data) { GList **lst; VisuUiPanel *visu_ui_panel; VisuUiDockWindow *window; guint nb; gchar *name; lst = &local_class->hostingWindows; nb = g_list_length(*lst); name = g_strdup_printf(_("Dock window (%d)"), nb); window = dock_window_new(name, TRUE); *lst = g_list_append(*lst, (gpointer)window); window->show = TRUE; gtk_widget_show_all(window->window); visu_ui_panel = VISU_UI_PANEL(user_data); if (visu_ui_panel) visu_ui_panel_setContainer(visu_ui_panel, window); } static void onDockMenuHideClicked(GtkMenuItem *menuitem _U_, gpointer user_data) { DBG_fprintf(stderr, "Gtk VisuUiPanel : hide the panel %p.\n", (gpointer)user_data); visu_ui_panel_setContainer(VISU_UI_PANEL(user_data), (VisuUiDockWindow*)0); } static void onDockMenuSelected(GtkMenuShell *menushell, gpointer user_data _U_) { DBG_fprintf(stderr, "Gtk VisuUiPanel : destroy the dock menu %p.\n", (gpointer)menushell); gtk_widget_destroy(GTK_WIDGET(menushell)); } static gboolean emitPageEnter(gpointer data) { g_return_val_if_fail(VISU_UI_IS_PANEL(data), FALSE); DBG_fprintf(stderr, "Gtk VisuUiPanel: '%s' (%p) emits 'page-entered' signal.\n", VISU_UI_PANEL(data)->id, data); g_signal_emit(G_OBJECT(data), visu_ui_panel_signals[NOTEBOOK_ENTERED], 0, NULL); return FALSE; } static void changeHeaderVisibility(VisuUiPanel *panel, gboolean status) { GList *list, *tmpLst; g_return_if_fail(VISU_UI_IS_PANEL(panel) && panel->headerWidget); list = gtk_container_get_children(GTK_CONTAINER(panel->headerWidget)); tmpLst = list->next; while(tmpLst) { if (status) gtk_widget_show(GTK_WIDGET(tmpLst->data)); else gtk_widget_hide(GTK_WIDGET(tmpLst->data)); tmpLst = g_list_next(tmpLst); } g_list_free(list); } static gboolean onHomePressed(GtkWidget *widget _U_, GdkEventKey *event, gpointer data) { DBG_fprintf(stderr, "Gtk VisuUiPanel: get key pressed.\n"); if(event->keyval == GDK_KEY_Home) { onRaiseButtonClicked((GtkButton*)0, data); return TRUE; } return FALSE; } static void onPageChanged(GtkNotebook *book, GtkWidget *child, gint num, gpointer data) { VisuUiDockWindow *window; int numOld; #if GTK_MAJOR_VERSION == 2 child = gtk_notebook_get_nth_page(book, num); #endif window = (VisuUiDockWindow*)data; g_return_if_fail(window); g_return_if_fail(VISU_UI_IS_PANEL(child)); DBG_fprintf(stderr, "Gtk VisuUiPanel: caught 'page-switch' signal, jump to %d.\n", num); /* Change the visibility of the header labels. */ if (!local_class->showHeader) { numOld = gtk_combo_box_get_active(GTK_COMBO_BOX(window->combo)); if ((gint)num != numOld) { /* We don't come from the combo so we cahnge the visibility. */ changeHeaderVisibility (VISU_UI_PANEL(gtk_notebook_get_nth_page(book, numOld)), FALSE); changeHeaderVisibility (VISU_UI_PANEL(gtk_notebook_get_nth_page(book, num)), TRUE); } } /* Change the combo to the right one. */ g_signal_handler_block(G_OBJECT(window->combo), window->comboChanged); gtk_combo_box_set_active(GTK_COMBO_BOX(window->combo), num); g_signal_handler_unblock(G_OBJECT(window->combo), window->comboChanged); g_idle_add(emitPageEnter, child); } static void onComboChanged(GtkComboBox *combo, gpointer data) { int index, numOld; VisuUiDockWindow *window; GtkNotebook *book; window = (VisuUiDockWindow*)data; g_return_if_fail(window); index = gtk_combo_box_get_active(combo); /* Change the visibility of the header labels. */ if (!local_class->showHeader) { book = GTK_NOTEBOOK(window->notebook); numOld = gtk_notebook_get_current_page(book); changeHeaderVisibility (VISU_UI_PANEL(gtk_notebook_get_nth_page(book, numOld)), FALSE); changeHeaderVisibility (VISU_UI_PANEL(gtk_notebook_get_nth_page(book, index)), TRUE); } /* Change the page to the right one. */ gtk_notebook_set_current_page(GTK_NOTEBOOK(window->notebook), index); } static gboolean onKillVisuUiDockWindowEvent(GtkWidget *widget, GdkEvent *event _U_, gpointer user_data) { g_return_val_if_fail(user_data, TRUE); DBG_fprintf(stderr, "Gtk VisuUiPanel: delete or destroy event cancelled.\n"); gtk_widget_hide(widget); ((VisuUiDockWindow*)user_data)->show = FALSE; return TRUE; } /** * visu_ui_panel_attach: * @visu_ui_panel: a #VisuUiPanel ; * @dock: a #VisuUiDockWindow. * * Put the given @visu_ui_panel in the given @dock window. It adds in this * dock window a new page in the #GtkNotebook using as tab header the * widget returned by visu_ui_panel_getHeaderWidget(). */ void visu_ui_panel_attach(VisuUiPanel *visu_ui_panel, VisuUiDockWindow *dock) { GtkTreeIter iter; VisuUiPanelClass *klass; GdkPixbuf *pixbuf; DBG_fprintf(stderr, "Gtk VisuUiPanel: attach a visu_ui_panel (%p) to a dock" " window (%s).\n", (gpointer)visu_ui_panel, dock->name); g_return_if_fail(dock && visu_ui_panel); if (visu_ui_panel->icon && gtk_image_get_storage_type(GTK_IMAGE(visu_ui_panel->icon)) == GTK_IMAGE_PIXBUF) pixbuf = gtk_image_get_pixbuf(GTK_IMAGE(visu_ui_panel->icon)); else pixbuf = (GdkPixbuf*)0; /* We add the window in the list store. */ gtk_list_store_append(dock->list, &iter); gtk_list_store_set(dock->list, &iter, TOOL_LIST_ICON, pixbuf, TOOL_LIST_STOCK, visu_ui_panel->stockIcon, TOOL_LIST_NAME, visu_ui_panel->comboLabel, TOOL_LIST_POINTER_TO_DATA, visu_ui_panel, -1); gtk_notebook_append_page(GTK_NOTEBOOK(dock->notebook), GTK_WIDGET(visu_ui_panel), visu_ui_panel_getHeaderWidget(visu_ui_panel)); gtk_widget_show(GTK_WIDGET(visu_ui_panel)); visu_ui_panel->container = dock; if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(dock->notebook)) > 1) gtk_widget_show(dock->hbox); else gtk_widget_hide(dock->hbox); klass = VISU_UI_PANEL_CLASS(G_OBJECT_GET_CLASS(visu_ui_panel)); klass->orphanVisuUiPanel = g_list_remove(klass->orphanVisuUiPanel, (gpointer)visu_ui_panel); } /** * visu_ui_panel_detach: * @visu_ui_panel: a #VisuUiPanel. * * Remove the given @visu_ui_panel from its current container and add it * to the list of hidden tool panels. It can be added again using the * pop-up menu of any #VisuUiDockWindow. */ void visu_ui_panel_detach(VisuUiPanel *visu_ui_panel) { gint page; VisuUiDockWindow *window; GtkTreeIter iter; GtkTreePath* path; gboolean valid; VisuUiPanelClass *klass; g_return_if_fail(visu_ui_panel && visu_ui_panel->container); window = visu_ui_panel->container; /* Get the id. */ page = gtk_notebook_page_num(GTK_NOTEBOOK(window->notebook), GTK_WIDGET(visu_ui_panel)); DBG_fprintf(stderr, "Gtk VisuUiPanel : detach a visu_ui_panel (%s) from page %d of dock" " (%s).\n", visu_ui_panel->tabLabel, page, window->name); /* We remove the page for the notebook. */ gtk_notebook_remove_page(GTK_NOTEBOOK(window->notebook), page); if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(window->notebook)) < 2) gtk_widget_hide(window->hbox); /* We remove the tool from the combo list. */ path = gtk_tree_path_new_from_indices(page, -1); valid = gtk_tree_model_get_iter(GTK_TREE_MODEL(window->list), &iter, path); if (valid) gtk_list_store_remove(window->list, &iter); gtk_tree_path_free(path); /* If there is no more tool in this window, we delete it. */ if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(window->notebook)) == 0 && window != VISU_UI_PANEL_CLASS(G_OBJECT_GET_CLASS(visu_ui_panel))->commandPanel) { DBG_fprintf(stderr, "Gtk VisuUiPanel: destroying dock window %p (%s).\n", (gpointer)window, window->name); gtk_widget_destroy(window->window); VISU_UI_PANEL_CLASS(G_OBJECT_GET_CLASS(visu_ui_panel))->hostingWindows = g_list_remove(VISU_UI_PANEL_CLASS(G_OBJECT_GET_CLASS(visu_ui_panel))->hostingWindows, (gconstpointer)window); g_free(window->name); g_object_unref(window->list); g_free(window); } visu_ui_panel->container = (VisuUiDockWindow*)0; klass = VISU_UI_PANEL_CLASS(G_OBJECT_GET_CLASS(visu_ui_panel)); klass->orphanVisuUiPanel = g_list_prepend(klass->orphanVisuUiPanel, (gpointer)visu_ui_panel); DBG_fprintf(stderr, "Gtk VisuUiPanel: number of orphan tool panels %d.\n", g_list_length(klass->orphanVisuUiPanel)); } static void onMainButtonClicked(GtkButton *button _U_, gpointer data) { GtkWidget *wd; wd = buildMainMenu((VisuUiDockWindow*)data); g_signal_connect(G_OBJECT(wd), "selection-done", G_CALLBACK(onMainMenuSelected), (gpointer)0); gtk_widget_show_all(wd); gtk_menu_popup(GTK_MENU(wd), NULL, NULL, NULL, NULL, 1, gtk_get_current_event_time()); } static GtkWidget* buildMainMenu(VisuUiDockWindow *window) { GtkWidget *menu, *item; GList* tmpLst; gchar *label; VisuUiPanel *panel; VisuUiDockWindow *dock; gboolean haveHiddenDock; menu = gtk_menu_new(); tmpLst = local_class->orphanVisuUiPanel; /* All dock windows. */ while (tmpLst) { panel = (VisuUiPanel*)tmpLst->data; label = g_strdup_printf(_("Show '%s'"), panel->comboLabel); item = gtk_menu_item_new_with_label(label); g_free(label); g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(onMainMenuClicked), window); g_object_set_qdata_full(G_OBJECT(item), CURRENT_TOOLPANEL_POINTER, (gpointer)panel, NULL); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); tmpLst = g_list_next(tmpLst); } if (!local_class->orphanVisuUiPanel) { item = gtk_menu_item_new_with_label(_("No hidden tool")); gtk_widget_set_sensitive(item, FALSE); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); } /* Separator. */ item = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); /* Hidden dock. */ haveHiddenDock = FALSE; tmpLst = local_class->hostingWindows; while (tmpLst) { dock = (VisuUiDockWindow*)tmpLst->data; if (!dock->show) { haveHiddenDock = TRUE; label = g_strdup_printf(_("Show '%s'"), dock->name); item = gtk_menu_item_new_with_label(label); g_free(label); g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(onMainMenuShowClicked), dock); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); } tmpLst = g_list_next(tmpLst); } if (!haveHiddenDock) { item = gtk_menu_item_new_with_label(_("No hidden dock")); gtk_widget_set_sensitive(item, FALSE); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); } if (window->window) { /* Separator. */ item = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); /* Hide action */ item = gtk_menu_item_new_with_label(_("Hide dock")); g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(onMainMenuHideClicked), window); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); } DBG_fprintf(stderr, "Gtk VisuUiPanel: create the main menu %p.\n", (gpointer)menu); return menu; } static void onMainMenuClicked(GtkMenuItem *menuitem, gpointer user_data) { VisuUiPanel *visu_ui_panel; VisuUiDockWindow *window; visu_ui_panel = (VisuUiPanel*)0; visu_ui_panel = VISU_UI_PANEL(g_object_get_qdata(G_OBJECT(menuitem), CURRENT_TOOLPANEL_POINTER)); g_return_if_fail(VISU_UI_IS_PANEL(visu_ui_panel)); window = (VisuUiDockWindow*)user_data; DBG_fprintf(stderr, "Gtk VisuUiPanel: attaching panel '%s' (%p) to %p.\n", visu_ui_panel->tabLabel, (gpointer)visu_ui_panel, (gpointer)window); visu_ui_panel_attach(visu_ui_panel, window); g_object_unref(G_OBJECT(visu_ui_panel)); } static void onMainMenuShowClicked(GtkMenuItem *menuitem _U_, gpointer user_data) { VisuUiDockWindow *dock; g_return_if_fail(user_data); dock = (VisuUiDockWindow*)user_data; if (dock->window) gtk_widget_show(dock->window); dock->show = TRUE; } static void onMainMenuHideClicked(GtkMenuItem *menuitem _U_, gpointer user_data) { VisuUiDockWindow *dock; g_return_if_fail(user_data); dock = (VisuUiDockWindow*)user_data; if (dock->window) gtk_widget_hide(dock->window); dock->show = FALSE; } static void onMainMenuSelected(GtkMenuShell *menushell, gpointer user_data _U_) { DBG_fprintf(stderr, "Gtk VisuUiPanel: destroy the main menu %p.\n", (gpointer)menushell); gtk_widget_destroy(GTK_WIDGET(menushell)); } static void onRaiseButtonClicked(GtkButton *button _U_, gpointer data _U_) { GtkWindow *window; window = visu_ui_getRenderWindow(); g_return_if_fail(window); /* We raised the rendering window, if required. */ gtk_window_present(window); } /******************/ /* Class methods. */ /******************/ /** * visu_ui_panel_class_getCommandPanel: * * There is always a #VisuUiDockWindow that is inside the command * panel. This routine gets it. * * Returns: (transfer none):the #VisuUiDockWindow that is inside the command panel. */ VisuUiDockWindow* visu_ui_panel_class_getCommandPanel(void) { if (!local_class) g_type_class_ref(VISU_UI_TYPE_PANEL); if (!local_class->commandPanel) { local_class->commandPanel = dock_window_new(MAIN_PANEL_NAME, FALSE); local_class->hostingWindows = g_list_prepend(local_class->hostingWindows, local_class->commandPanel); } return local_class->commandPanel; } /** * visu_ui_panel_class_setCurrent: * @dataObj: a #VisuData object. * @view: a #VisuGlView object. * * Set the currently focussed #VisuData. It then can be retrieve using * visu_ui_panel_getData(). * * Since: 3.7 */ void visu_ui_panel_class_setCurrent(VisuData *dataObj, VisuGlView *view) { if (!local_class) g_type_class_ref(VISU_UI_TYPE_PANEL); local_class->dataObj = dataObj; local_class->viewObj = view; } /** * visu_ui_panel_class_getPanelById: * @id: a #VisuUiPanel identifier. * * This routine associates a #VisuUiPanel identifier to the object pointer. * * Returns: (transfer none): the #VisuUiPanel that corresponds to this identifier or NULL * if none exists. */ VisuUiPanel* visu_ui_panel_class_getPanelById(const gchar *id) { gpointer panel; if (!local_class) g_type_class_ref(VISU_UI_TYPE_PANEL); DBG_fprintf(stderr, "Gtk VisuUiPanel: search panel '%s'.\n", id); panel = g_hash_table_lookup(local_class->allVisuUiPanels, id); if (!panel) return (VisuUiPanel*)0; else return VISU_UI_PANEL(panel); } /** * visu_ui_panel_class_getDockById: * @id: a #VisuUiDockWindow identifier. * * This routine associates a #VisuUiDockWindow identifier to the object pointer. * * Returns: the #VisuUiDockWindow that corresponds to this identifier. The * dock window is built if not currently exist. */ VisuUiDockWindow* visu_ui_panel_class_getDockById(const gchar *id) { VisuUiDockWindow *window; GList *tmplst; if (!local_class) g_type_class_ref(VISU_UI_TYPE_PANEL); if (!strcmp(id, "None")) return (VisuUiDockWindow*)0; if (!strcmp(id, "Main")) return local_class->commandPanel; tmplst = local_class->hostingWindows; while (tmplst) { if (!strcmp(((VisuUiDockWindow*)tmplst->data)->name, id)) return (VisuUiDockWindow*)tmplst->data; tmplst = g_list_next(tmplst); }; /* No matching name found, we create a new window. */ window = dock_window_new(g_strdup(id), TRUE); local_class->hostingWindows = g_list_prepend(local_class->hostingWindows, (gpointer)window); return window; } /** * visu_ui_panel_class_getAllPanels: * * This routine can be used to know all existing #VisuUiPanel. * * Returns: (transfer full) (element-type VisuUiPanel*): a newly * created list (use g_list_free() on it after use). */ GList* visu_ui_panel_class_getAllPanels(void) { GList *tmplst, *returnlst; gboolean valid; GtkTreeIter iter; VisuUiPanel *tool; GtkTreeModel *treeModel; if (!local_class) g_type_class_ref(VISU_UI_TYPE_PANEL); DBG_fprintf(stderr, "Gtk VisuUiPanel: create list of all panels.\n"); returnlst = (GList*)0; tmplst = local_class->hostingWindows; while (tmplst) { treeModel = GTK_TREE_MODEL(((VisuUiDockWindow*)tmplst->data)->list); valid = gtk_tree_model_get_iter_first(treeModel, &iter); while (valid) { gtk_tree_model_get(treeModel, &iter, TOOL_LIST_POINTER_TO_DATA, &tool, -1); DBG_fprintf(stderr, " | add '%s'\n", tool->id); returnlst = g_list_prepend(returnlst, (gpointer)tool); valid = gtk_tree_model_iter_next(treeModel, &iter); } tmplst = g_list_next(tmplst); } returnlst = g_list_concat(returnlst, g_list_copy(local_class->orphanVisuUiPanel)); return returnlst; } /** * visu_ui_panel_class_getAllWindows: * * This routine can be used to know all existing #VisuUiDockWindow. * * Returns: (transfer container) (element-type VisuUiDockWindow*): a * newly created list (use g_list_free() on it after use). */ GList* visu_ui_panel_class_getAllWindows(void) { GList *returnlst; if (!local_class) g_type_class_ref(VISU_UI_TYPE_PANEL); DBG_fprintf(stderr, "Gtk VisuUiPanel : create list of all windows.\n"); returnlst = g_list_copy(local_class->hostingWindows); returnlst = g_list_remove(returnlst, local_class->commandPanel); return returnlst; } /** * visu_ui_panel_class_setHeaderVisibility: * @status: a boolean. * * The header can be represented using the full image and label always * or only the image when the tab is not on top. */ void visu_ui_panel_class_setHeaderVisibility(gboolean status) { GList *tmpLst; int num, i; GtkNotebook *notebook; if (!local_class) g_type_class_ref(VISU_UI_TYPE_PANEL); DBG_fprintf(stderr, "Gtk VisuUiPanel : set the header visibility.\n"); if (local_class->showHeader == status) return; tmpLst = local_class->hostingWindows; while(tmpLst) { notebook = GTK_NOTEBOOK(((VisuUiDockWindow*)tmpLst->data)->notebook); num = gtk_notebook_get_current_page(notebook); for (i = 0; i < gtk_notebook_get_n_pages(notebook); i++) changeHeaderVisibility(VISU_UI_PANEL(gtk_notebook_get_nth_page(notebook, i)), status || (i == num)); tmpLst = g_list_next(tmpLst); } local_class->showHeader = status; } /************************/ /* Dock window methods. */ /************************/ GType visu_ui_dock_window_get_type(void) { static GType g_define_type_id = 0; if (g_define_type_id == 0) g_define_type_id = g_boxed_type_register_static("VisuUiDockWindow", (GBoxedCopyFunc)dock_window_ref, (GBoxedFreeFunc)dock_window_unref); return g_define_type_id; } static VisuUiDockWindow* dock_window_new(gchar *name, gboolean withWindow) { VisuUiDockWindow *window; GtkWidget *wd, *image, *align; GtkCellRenderer *renderer; /* GtkBindingSet *keys; */ #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkTooltips *tooltips; tooltips = gtk_tooltips_new (); #endif window = g_malloc(sizeof(VisuUiDockWindow)); window->refCount = 1; DBG_fprintf(stderr, "Gtk VisuUiPanel: create a new dock window %p (%s).\n", (gpointer)window, name); window->name = name; window->show = !strcmp(name, MAIN_PANEL_NAME); window->vbox = gtk_vbox_new(FALSE, 0); if (withWindow) { window->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window->window), window->name); gtk_window_set_default_size(GTK_WINDOW(window->window), 350, 350); gtk_window_set_type_hint(GTK_WINDOW(window->window), GDK_WINDOW_TYPE_HINT_UTILITY); gtk_window_set_skip_pager_hint(GTK_WINDOW(window->window), TRUE); g_signal_connect(G_OBJECT(window->window), "delete-event", G_CALLBACK(onKillVisuUiDockWindowEvent), (gpointer)window); g_signal_connect(G_OBJECT(window->window), "destroy-event", G_CALLBACK(onKillVisuUiDockWindowEvent), (gpointer)window); g_signal_connect(G_OBJECT(window->window), "key-press-event", G_CALLBACK(onHomePressed), (gpointer)window); gtk_container_set_border_width(GTK_CONTAINER(window->window), 3); gtk_container_add(GTK_CONTAINER(window->window), window->vbox); /* gtk_widget_show(window->window); */ } else window->window = (GtkWidget*)0; align = gtk_alignment_new(0.5, 0.5, 1.0, 1.0); gtk_alignment_set_padding(GTK_ALIGNMENT(align), 5, 0, 0, 0); gtk_box_pack_end(GTK_BOX(window->vbox), align, TRUE, TRUE, 0); window->notebook = gtk_notebook_new(); gtk_notebook_set_scrollable(GTK_NOTEBOOK(window->notebook), TRUE); gtk_container_add(GTK_CONTAINER(align), window->notebook); window->notebookChanged = g_signal_connect(G_OBJECT(window->notebook), "switch-page", G_CALLBACK(onPageChanged), (gpointer)window); window->hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(window->vbox), window->hbox, FALSE, FALSE, 0); /* Define the key bindings. */ /* keys = gtk_binding_set_new("commandPanel"); */ /* gtk_binding_entry_add_signal(keys, GDK_KEY_space, 0, "clicked", 1, (gpointer)window); */ /* Raise render area. */ wd = gtk_button_new(); g_object_set(G_OBJECT(wd), "can-default", TRUE, "can-focus", TRUE, "has-default", FALSE, "has-focus", FALSE, NULL); /* gtk_button_set_relief(GTK_BUTTON(wd), GTK_RELIEF_NONE); */ gtk_box_pack_start(GTK_BOX(window->hbox), wd, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(wd), "clicked", G_CALLBACK(onRaiseButtonClicked), (gpointer)window); image = gtk_image_new_from_stock(GTK_STOCK_GO_UP, GTK_ICON_SIZE_MENU); gtk_container_add(GTK_CONTAINER(wd), image); gtk_widget_set_tooltip_text(wd, _("Raise the rendering window.\n" " Use as key binding.")); /* The Label to introduce the combo list. */ wd = gtk_label_new(_("Tool: ")); gtk_box_pack_start(GTK_BOX(window->hbox), wd, FALSE, FALSE, 2); /* We create the list store. */ window->list = gtk_list_store_new(TOOL_LIST_N_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); /* The combo list. */ window->combo = gtk_combo_box_new_with_model(GTK_TREE_MODEL(window->list)); renderer = gtk_cell_renderer_pixbuf_new(); gtk_cell_renderer_set_fixed_size(renderer, 22, -1); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(window->combo), renderer, FALSE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(window->combo), renderer, "pixbuf", TOOL_LIST_ICON); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(window->combo), renderer, "stock-id", TOOL_LIST_STOCK); renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(window->combo), renderer, FALSE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(window->combo), renderer, "text", TOOL_LIST_NAME); gtk_box_pack_start(GTK_BOX(window->hbox), window->combo, TRUE, TRUE, 0); window->comboChanged = g_signal_connect(G_OBJECT(window->combo), "changed", G_CALLBACK(onComboChanged), (gpointer)window); /* Add a menu button. */ wd = gtk_button_new(); gtk_button_set_relief(GTK_BUTTON(wd), GTK_RELIEF_NONE); gtk_box_pack_start(GTK_BOX(window->hbox), wd, FALSE, FALSE, 2); g_signal_connect(G_OBJECT(wd), "clicked", G_CALLBACK(onMainButtonClicked), (gpointer)window); image = create_pixmap((GtkWidget*)0, "stock-menu-detach.png"); gtk_container_add(GTK_CONTAINER(wd), image); gtk_widget_set_tooltip_text(wd, _("Manage hidden subpanels and dock windows.")); /* Add a help tooltips. */ wd = gtk_event_box_new(); gtk_event_box_set_visible_window(GTK_EVENT_BOX(wd), FALSE); gtk_widget_set_tooltip_text(wd, _("Positions, sizes, names, contains... of dock" \ " windows are stored in the parameters file, " \ "see the 'Config. files' button on the command panel.")); gtk_box_pack_end(GTK_BOX(window->hbox), wd, FALSE, FALSE, 2); image = gtk_image_new_from_stock(GTK_STOCK_HELP, GTK_ICON_SIZE_MENU); gtk_container_add(GTK_CONTAINER(wd), image); gtk_widget_show_all(window->vbox); return window; } static VisuUiDockWindow* dock_window_ref(VisuUiDockWindow *dock) { dock->refCount += 1; return dock; } static void dock_window_unref(VisuUiDockWindow *dock) { dock->refCount -= 1; if (!dock->refCount) { if (dock->window) gtk_widget_destroy(dock->window); else gtk_widget_destroy(dock->vbox); } } /** * visu_ui_dock_window_getCharacteristics: * @dock: a #VisuUiDockWindow object ; * @id: a location to store the identifier (owned by V_Sim) ; * @visibility: a location to store the status of the dock, hidden or * not ; * @x: a location to store its x position on the root window ; * @y: a location to store its y position on the root window ; * @width: a location to store its width ; * @height: a location to store its height. * * A routine to know everything about a #VisuUiDockWindow. */ void visu_ui_dock_window_getCharacteristics(VisuUiDockWindow *dock, gchar **id, gboolean *visibility, gint *x, gint *y, gint *width, gint *height) { g_return_if_fail(dock); *id = dock->name; *visibility = dock->show; gtk_window_get_position(GTK_WINDOW(dock->window), x, y); gtk_window_get_size(GTK_WINDOW(dock->window), width, height); } /** * visu_ui_dock_window_getContainer: * @dock: a dock window descriptor. * * A dock window is a small utility window with a list of #VisuUiPanel. * This window can be embedded in a container or have its own * GtkWindow. This routine get the top-level container inside a given * #VisuUiDockWindow. If you prefer to get the GtkWindow containing the * #VisuUiDockWindow use visu_ui_dock_window_getWindow() instead. * * Returns: (transfer none): a top-level container (usually a #GtkVBox). */ GtkWidget* visu_ui_dock_window_getContainer(VisuUiDockWindow *dock) { g_return_val_if_fail(dock, (GtkWidget*)0); return dock->vbox; } /** * visu_ui_dock_window_getNotebook: * @dock: a dock window descriptor. * * A dock window is a small utility window with a list of #VisuUiPanel. * All #VisuUiPanel are contained in a #GtkNotebook. This routine gets it. * * Returns: (transfer none): the #GtkNotebook containing the #VisuUiPanel of this * #VisuUiDockWindow. */ GtkWidget* visu_ui_dock_window_getNotebook(VisuUiDockWindow *dock) { g_return_val_if_fail(dock, (GtkWidget*)0); return dock->notebook; } /** * visu_ui_dock_window_getWindow: * @dock: a dock window descriptor. * * A dock window is a small utility window with a list of #VisuUiPanel. * This window can be embedded in a container or have its own * GtkWindow. This routine get the #GtkWindow containing the * #VisuUiDockWindow in the case the dock is stand-alone. If not NULL is returned. * * Returns: (transfer none): a top-level container (usually a #GtkWindow) or NULL. */ GtkWidget* visu_ui_dock_window_getWindow(VisuUiDockWindow *dock) { g_return_val_if_fail(dock, (GtkWidget*)0); if (dock->window) return dock->window; else return GTK_WIDGET(visu_ui_main_class_getCurrentPanel()); } /** * visu_ui_dock_window_setSize: * @dock: a #VisuUiDockWindow object ; * @width: the requested width ; * @height: the requested height. * * Change the size of the given #VisuUiDockWindow. The size is possibly * adapted to avoid been out of screen. */ void visu_ui_dock_window_setSize(VisuUiDockWindow *dock, guint width, guint height) { GdkScreen *screen; gint widthScreen, heightScreen; gint widthSet, heightSet; g_return_if_fail(dock && dock->window); g_return_if_fail(dock != visu_ui_panel_class_getCommandPanel()); /* Before setting (width, height), we check that it is coherent with the screen size. */ if (gtk_widget_is_drawable(dock->window)) screen = gdk_window_get_screen (GDK_WINDOW(gtk_widget_get_window(dock->window))); else screen = gdk_screen_get_default(); widthScreen = gdk_screen_get_width(screen); heightScreen = gdk_screen_get_height(screen); widthSet = ((gint)width > widthScreen)?widthScreen:(gint)width; heightSet = ((gint)height > heightScreen)?heightScreen:(gint)height; if (widthSet < 0) widthSet = 50; if (heightSet < 0) heightSet = 50; DBG_fprintf(stderr, "Gtk VisuUiPanel: set window (%s) size %dx%d.\n", dock->name, widthSet, heightSet); gtk_window_resize(GTK_WINDOW(dock->window), widthSet, heightSet); } /** * visu_ui_dock_window_setPosition: * @dock: a #VisuUiDockWindow object ; * @x: the requested x position ; * @y: the requested y position. * * Change the position of the given #VisuUiDockWindow. The position is possibly * adapted to avoid been out of screen. */ void visu_ui_dock_window_setPosition(VisuUiDockWindow *dock, guint x, guint y) { GdkScreen *screen; gint xScreen, yScreen; gint xPosition, yPosition; gint width, height; g_return_if_fail(dock && dock->window); g_return_if_fail(dock != visu_ui_panel_class_getCommandPanel()); /* Before setting (x, y), we check that it is coherent with the screen definition. */ if (gtk_widget_is_drawable(dock->window)) screen = gdk_window_get_screen (GDK_WINDOW(gtk_widget_get_window(dock->window))); else screen = gdk_screen_get_default(); xScreen = gdk_screen_get_width(screen); yScreen = gdk_screen_get_height(screen); gtk_window_get_size(GTK_WINDOW(dock->window), &width, &height); xPosition = ((gint)x + width > xScreen)?xScreen - width:(gint)x; yPosition = ((gint)y + height > yScreen)?yScreen - height:(gint)y; if (xPosition < 0) xPosition = 0; if (yPosition < 0) yPosition = 0; DBG_fprintf(stderr, "Gtk VisuUiPanel: set window (%s) position %dx%d.\n", dock->name, xPosition, yPosition); gtk_window_move(GTK_WINDOW(dock->window), xPosition, yPosition); } /** * visu_ui_dock_window_setVisibility: * @dock: a #VisuUiDockWindow object ; * @visible: a boolean. * * Change the visibility of a #VisuUiDockWindow. If hidden, the dock is * added to the list of hidden #VisuUiDockWindow that can be shown again * using the pop-up menu on every visible #VisuUiDockWindow. The 'Main' dock * window can not be hidden. */ void visu_ui_dock_window_setVisibility(VisuUiDockWindow *dock, gboolean visible) { g_return_if_fail(dock && dock->window); g_return_if_fail(dock != visu_ui_panel_class_getCommandPanel()); dock->show = visible; if (!visible) gtk_widget_hide(dock->window); else gtk_widget_show(dock->window); } v_sim-3.7.0/src/extraGtkFunctions/gtk_toolPanelWidget.h0000644000353400050620000001435412215546105020161 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef GTK_TOOLPANELWIDGET_H #define GTK_TOOLPANELWIDGET_H #include #include #include #include G_BEGIN_DECLS /** * VISU_UI_TYPE_PANEL: * * Return the associated #GType to the VisuUiPanel objects. */ #define VISU_UI_TYPE_PANEL (visu_ui_panel_get_type ()) /** * VISU_UI_PANEL: * @obj: the widget to cast. * * Cast the given object to a #VisuUiPanel object. */ #define VISU_UI_PANEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VISU_UI_TYPE_PANEL, VisuUiPanel)) /** * VISU_UI_PANEL_CLASS: * @klass: the class to cast. * * Cast the given class to a #VisuUiPanelClass object. */ #define VISU_UI_PANEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VISU_UI_TYPE_PANEL, VisuUiPanelClass)) /** * VISU_UI_IS_PANEL: * @obj: the object to test. * * Return if the given object is a valid #VisuUiPanel object. */ #define VISU_UI_IS_PANEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VISU_UI_TYPE_PANEL)) /** * VISU_UI_IS_PANEL_CLASS: * @klass: the class to test. * * Return if the given class is a valid #VisuUiPanelClass class. */ #define VISU_UI_IS_PANEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VISU_UI_TYPE_PANEL)) typedef struct _VisuUiPanel VisuUiPanel; typedef struct _VisuUiPanelClass VisuUiPanelClass; GType visu_ui_panel_get_type(void); typedef struct _VisuUiDockWindow VisuUiDockWindow; GType visu_ui_dock_window_get_type(void); /** * VISU_UI_TYPE_DOCK_WINDOW: * * The type of #VisuUiDockWindow objects. */ #define VISU_UI_TYPE_DOCK_WINDOW (visu_ui_dock_window_get_type()) GtkWidget* visu_ui_panel_new(gchar *id, gchar* name, gchar *tabName); GtkWidget* visu_ui_panel_newWithIconFromPath(gchar *id, gchar* name, gchar *tabName, const gchar* iconPath); GtkWidget* visu_ui_panel_newWithIconFromStock(gchar *id, gchar* name, gchar *tabName, const gchar* stock); GtkWidget* visu_ui_panel_getHeaderWidget (VisuUiPanel *visu_ui_panel); const gchar* visu_ui_panel_getLabel (VisuUiPanel *visu_ui_panel); const gchar* visu_ui_panel_getId (VisuUiPanel *visu_ui_panel); GtkWindow* visu_ui_panel_getContainerWindow(VisuUiPanel *visu_ui_panel); VisuUiDockWindow* visu_ui_panel_getContainer (VisuUiPanel *visu_ui_panel); const gchar* visu_ui_panel_getContainerId (VisuUiPanel *visu_ui_panel); VisuData* visu_ui_panel_getData (VisuUiPanel *visu_ui_panel); VisuBoxed* visu_ui_panel_getFocused (VisuUiPanel *visu_ui_panel); VisuGlView* visu_ui_panel_getView (VisuUiPanel *visu_ui_panel); gboolean visu_ui_panel_getVisible (VisuUiPanel *visu_ui_panel); void visu_ui_panel_setDockable (VisuUiPanel *visu_ui_panel, gboolean value); void visu_ui_panel_setContainer (VisuUiPanel *visu_ui_panel, VisuUiDockWindow *window); void visu_ui_panel_setContainerId(VisuUiPanel *visu_ui_panel, const gchar *id); void visu_ui_panel_attach(VisuUiPanel *visu_ui_panel, VisuUiDockWindow *dock); void visu_ui_panel_detach(VisuUiPanel *visu_ui_panel); /* Associated variables and methods. */ GtkWidget* visu_ui_dock_window_getContainer(VisuUiDockWindow *dock); GtkWidget* visu_ui_dock_window_getNotebook(VisuUiDockWindow *dock); GtkWidget* visu_ui_dock_window_getWindow(VisuUiDockWindow *dock); void visu_ui_dock_window_getCharacteristics(VisuUiDockWindow *dock, gchar **id, gboolean *visibility, gint *x, gint *y, gint *width, gint *height); void visu_ui_dock_window_setSize(VisuUiDockWindow *dock, guint width, guint height); void visu_ui_dock_window_setPosition(VisuUiDockWindow *dock, guint x, guint y); void visu_ui_dock_window_setVisibility(VisuUiDockWindow *dock, gboolean visible); /* Class methods. */ void visu_ui_panel_class_setCurrent(VisuData *dataObj, VisuGlView *view); void visu_ui_panel_class_setHeaderVisibility(gboolean status); VisuUiDockWindow* visu_ui_panel_class_getCommandPanel(void); VisuUiDockWindow* visu_ui_panel_class_getDockById(const gchar *id); GList* visu_ui_panel_class_getAllPanels(void); GList* visu_ui_panel_class_getAllWindows(void); VisuUiPanel* visu_ui_panel_class_getPanelById(const gchar *id); G_END_DECLS #endif v_sim-3.7.0/src/extraGtkFunctions/gtk_orientationChooser.c0000644000353400050620000007444212215546105020735 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse mèl : BILLARD, non joignable par mèl ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include "gtk_orientationChooser.h" #include #include #include #include #include #include /** * SECTION:gtk_orientationChooser * @short_description: Defines a dialog widget to choose the camera position. * @include: coreTools/toolMatrix.h * * This widget is a #GtkDialog window that can be used to choose * an orientation for the camera, using either the cartesian * coordinates, the box coordinates or the spherical coordinates. */ enum { VALUES_CHANGED, LAST_SIGNAL }; typedef enum { visu_ui_orientation_chooser_ortho, visu_ui_orientation_chooser_box, visu_ui_orientation_chooser_angles } VisuUiOrientationChooserBasis; /** * VisuUiOrientationChooser: * * Short form for a #VisuUiOrientationChooser_struct structure. */ struct _VisuUiOrientationChooser { GtkDialog dialog; /* The kind of chooser in box coordinates. */ VisuUiOrientationChooserKind kind; /* The spins for the ortho selection. */ GtkWidget *spinsOrtho[3]; gulong signalsOrtho[3]; /* The spins for the box selection. */ GtkWidget *hboxBox; GtkWidget *spinsBox[3]; gulong signalsBox[3]; /* The spins for the angle selection. */ GtkWidget *spinsAngles[2]; gulong signalsAngles[2]; /* The check box for live update. */ GtkWidget *checkLiveUpdate; /* Associated VisuData, if any. */ VisuData *dataObj; /* Transformation matrix associated to the box. */ float boxToOrtho[3][3]; float orthoToBox[3][3]; /* Memory gestion. */ gboolean dispose_has_run; gulong dataReady; }; /** * VisuUiOrientationChooserClass: * * Opaque structure. */ struct _VisuUiOrientationChooserClass { GtkDialogClass parent_class; void (*orientationChooser) (VisuUiOrientationChooser *orientation); }; /** * visu_ui_orientation_chooser_get_type * * #GType are unique numbers to identify objects. * * Returns: the #GType associated with #VisuUiOrientationChooser objects. */ G_DEFINE_TYPE(VisuUiOrientationChooser, visu_ui_orientation_chooser, GTK_TYPE_DIALOG) /* Local variables. */ static guint visu_ui_orientation_chooser_signals[LAST_SIGNAL] = { 0 }; /* Local methods. */ static void visu_ui_orientation_chooser_class_init(VisuUiOrientationChooserClass *klass); static void visu_ui_orientation_chooser_init(VisuUiOrientationChooser *orientationChooser); static void visu_ui_orientation_chooser_dispose(GObject *orientationChooser); static void visu_ui_orientation_chooser_finalize(GObject *obj); static void orientationChanged(VisuUiOrientationChooser *orientation, VisuUiOrientationChooserBasis changedBasis); static void visu_data_Changed(VisuUiOrientationChooser *orientation, VisuData *data); /* Local callbacks. */ static void onResponse(VisuUiOrientationChooser *chooser, gint response, gpointer data); static void onOrthoChanged(GtkSpinButton *spin, gpointer data); static void onBoxChanged(GtkSpinButton *spin, gpointer data); static void onAnglesChanged(GtkSpinButton *spin, gpointer data); static void onDataReadyForRendering(GObject *obj, VisuData *dataObj, VisuGlView *view, gpointer data); static void visu_ui_orientation_chooser_class_init(VisuUiOrientationChooserClass *klass) { DBG_fprintf(stderr, "Gtk VisuUiOrientationChooser: creating the class of the widget.\n"); DBG_fprintf(stderr, " - adding new signals ;\n"); /** * VisuUiOrientationChooser::values-changed: * @chooser: the #VisuUiOrientationChooser that emits the signal. * * This signal is emitted when the values are changed and when the * live update checkbox is active. * * Since: 3.4 */ visu_ui_orientation_chooser_signals[VALUES_CHANGED] = g_signal_new ("values-changed", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(VisuUiOrientationChooserClass, orientationChooser), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, NULL); /* Connect freeing methods. */ G_OBJECT_CLASS(klass)->dispose = visu_ui_orientation_chooser_dispose; G_OBJECT_CLASS(klass)->finalize = visu_ui_orientation_chooser_finalize; } /* This method can be called several times. It should unref all of its reference to GObjects. */ static void visu_ui_orientation_chooser_dispose(GObject *orientationChooser) { DBG_fprintf(stderr, "Gtk VisuUiOrientationChooser: dispose object %p.\n", (gpointer)orientationChooser); if (VISU_UI_ORIENTATION_CHOOSER(orientationChooser)->dispose_has_run) return; VISU_UI_ORIENTATION_CHOOSER(orientationChooser)->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_orientation_chooser_parent_class)->dispose(orientationChooser); } /* This method is called once only. */ static void visu_ui_orientation_chooser_finalize(GObject *obj) { VisuUiOrientationChooser *orientationChooser; g_return_if_fail(obj); DBG_fprintf(stderr, "Gtk VisuUiOrientationChooser: finalize object %p.\n", (gpointer)obj); orientationChooser = VISU_UI_ORIENTATION_CHOOSER(obj); g_signal_handler_disconnect(VISU_OBJECT_INSTANCE, orientationChooser->dataReady); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_orientation_chooser_parent_class)->finalize(obj); DBG_fprintf(stderr, "Gtk VisuUiOrientationChooser: freeing ... OK.\n"); } static void visu_ui_orientation_chooser_init(VisuUiOrientationChooser *orientationChooser) { int i; DBG_fprintf(stderr, "Gtk VisuUiOrientationChooser: initializing new object (%p).\n", (gpointer)orientationChooser); orientationChooser->dispose_has_run = FALSE; orientationChooser->kind = VISU_UI_ORIENTATION_DIRECTION; for (i = 0; i < 3; i++) { orientationChooser->spinsOrtho[i] = gtk_spin_button_new_with_range(-1000, 1000, 1); gtk_spin_button_set_value (GTK_SPIN_BUTTON(orientationChooser->spinsOrtho[i]), 0); gtk_spin_button_set_digits (GTK_SPIN_BUTTON(orientationChooser->spinsOrtho[i]), 5); orientationChooser->signalsOrtho[i] = g_signal_connect(G_OBJECT(orientationChooser->spinsOrtho[i]), "value-changed", G_CALLBACK(onOrthoChanged), orientationChooser); } orientationChooser->hboxBox = gtk_hbox_new(FALSE, 0); for (i = 0; i < 3; i++) { orientationChooser->spinsBox[i] = gtk_spin_button_new_with_range(-1000, 1000, 1); gtk_spin_button_set_value (GTK_SPIN_BUTTON(orientationChooser->spinsBox[i]), 0); gtk_spin_button_set_digits (GTK_SPIN_BUTTON(orientationChooser->spinsBox[i]), 5); orientationChooser->signalsBox[i] = g_signal_connect(G_OBJECT(orientationChooser->spinsBox[i]), "value-changed", G_CALLBACK(onBoxChanged), orientationChooser); } for (i = 0; i < 2; i++) { orientationChooser->spinsAngles[i] = gtk_spin_button_new_with_range(-180, 180, 1); gtk_spin_button_set_value (GTK_SPIN_BUTTON(orientationChooser->spinsAngles[i]), 0); gtk_spin_button_set_digits (GTK_SPIN_BUTTON(orientationChooser->spinsAngles[i]), 5); orientationChooser->signalsAngles[i] = g_signal_connect(G_OBJECT(orientationChooser->spinsAngles[i]), "value-changed", G_CALLBACK(onAnglesChanged), orientationChooser); } orientationChooser->checkLiveUpdate = gtk_check_button_new_with_label(_("Update values on the fly.")); /* Connect a signal when the dialog is closed. */ g_signal_connect(G_OBJECT(orientationChooser), "response", G_CALLBACK(onResponse), (gpointer)0); } /** * visu_ui_orientation_chooser_new: * @kind: to set the box coordinates behavior ; * @liveUpdate: raise "values-changed" when a value is changed ; * @data: (allow-none): the associated #VisuData to get the box * definition (can be NULL); * @parent: (allow-none): give the parent window to set the modal * status and the position. * * Create a dialog box with three choices to choose a direction in space: the * classical orthogonal basis set, the spherical one or the basis set linked * to the box. If the @data argument is NULL, this last possibility is made * unsensitive. If the kind is set to VISU_UI_ORIENTATION_DIRECTION, the orthogonal * coordinates correspond exactly to the box coordinates (after transformation) ; * whereas @kind is VISU_UI_ORIENTATION_NORMAL, the cartesian coordinates are those * which give the right normal plane to the direction given in the box coordinates. * * Returns: (transfer full): a newly created object. */ GtkWidget* visu_ui_orientation_chooser_new(VisuUiOrientationChooserKind kind, gboolean liveUpdate, VisuData *data, GtkWindow *parent) { VisuUiOrientationChooser *orientationChooser; GtkWidget *wd, *hbox, *hbox2, *vbox; int i; gchar *axesNames[3] = {"x:", "y:", "z:"}; gchar *anglesNames[2] = {"theta:", "phi:"}; orientationChooser = VISU_UI_ORIENTATION_CHOOSER(g_object_new(visu_ui_orientation_chooser_get_type(), NULL)); DBG_fprintf(stderr, "Gtk VisuUiOrientationChooser: creating new object: %p" " with parent %p.\n", (gpointer)orientationChooser, (gpointer)parent); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(orientationChooser->checkLiveUpdate), liveUpdate); gtk_dialog_add_buttons(GTK_DIALOG(orientationChooser), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); gtk_dialog_set_default_response(GTK_DIALOG(orientationChooser), GTK_RESPONSE_ACCEPT); /* gtk_window_set_type_hint(GTK_WINDOW(orientationChooser), */ /* GDK_WINDOW_TYPE_HINT_UTILITY); */ gtk_window_set_skip_pager_hint(GTK_WINDOW(orientationChooser), TRUE); if (!parent) parent = visu_ui_getPanel(); gtk_window_set_transient_for(GTK_WINDOW(orientationChooser), parent); /* Title. */ wd = gtk_label_new(""); gtk_label_set_use_markup(GTK_LABEL(wd), TRUE); gtk_label_set_markup(GTK_LABEL(wd), _("Choose an orientation")); gtk_widget_set_name(wd, "label_head_2"); gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(orientationChooser))), wd, FALSE, FALSE, 5); /* Ortho orientation. */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(orientationChooser))), hbox, FALSE, FALSE, 3); wd = create_pixmap((GtkWidget*)0, "axes-ortho.png"); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); wd = gtk_label_new(""); gtk_label_set_use_markup(GTK_LABEL(wd), TRUE); gtk_label_set_markup(GTK_LABEL(wd), _("On an orthonormal basis set")); gtk_misc_set_alignment(GTK_MISC(wd), 0.1, 1.); gtk_box_pack_start(GTK_BOX(vbox), wd, TRUE, TRUE, 15); hbox2 = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 0); for (i = 0; i < 3; i++) { wd = gtk_label_new(axesNames[i]); gtk_misc_set_alignment(GTK_MISC(wd), 1., .5); gtk_box_pack_start(GTK_BOX(hbox2), wd, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(hbox2), orientationChooser->spinsOrtho[i], FALSE, FALSE, 0); } /* Box orientation. */ gtk_widget_set_sensitive(orientationChooser->hboxBox, data && visu_box_getBoundary(visu_boxed_getBox(VISU_BOXED(data))) != VISU_BOX_FREE); gtk_box_pack_start(GTK_BOX (gtk_dialog_get_content_area(GTK_DIALOG(orientationChooser))), orientationChooser->hboxBox, FALSE, FALSE, 3); wd = create_pixmap((GtkWidget*)0, "axes-box.png"); gtk_box_pack_start(GTK_BOX(orientationChooser->hboxBox), wd, FALSE, FALSE, 0); vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(orientationChooser->hboxBox), vbox, TRUE, TRUE, 0); wd = gtk_label_new(""); gtk_label_set_use_markup(GTK_LABEL(wd), TRUE); gtk_label_set_markup(GTK_LABEL(wd), _("Following the box basis set")); gtk_misc_set_alignment(GTK_MISC(wd), 0.1, 1.); gtk_box_pack_start(GTK_BOX(vbox), wd, TRUE, TRUE, 7); hbox2 = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 0); for (i = 0; i < 3; i++) { wd = gtk_label_new(axesNames[i]); gtk_misc_set_alignment(GTK_MISC(wd), 1., .5); gtk_box_pack_start(GTK_BOX(hbox2), wd, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(hbox2), orientationChooser->spinsBox[i], FALSE, FALSE, 0); } /* Ortho orientation. */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX (gtk_dialog_get_content_area(GTK_DIALOG(orientationChooser))), hbox, FALSE, FALSE, 3); wd = create_pixmap((GtkWidget*)0, "axes-angles.png"); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); wd = gtk_label_new(""); gtk_label_set_use_markup(GTK_LABEL(wd), TRUE); gtk_label_set_markup(GTK_LABEL(wd), _("On a spherical basis set")); gtk_misc_set_alignment(GTK_MISC(wd), 0.1, 1.); gtk_box_pack_start(GTK_BOX(vbox), wd, TRUE, TRUE, 15); hbox2 = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 0); for (i = 0; i < 2; i++) { wd = gtk_label_new(anglesNames[i]); gtk_misc_set_alignment(GTK_MISC(wd), 1., .5); gtk_box_pack_start(GTK_BOX(hbox2), wd, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(hbox2), orientationChooser->spinsAngles[i], FALSE, FALSE, 0); } /* The live update checkbox. */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX (gtk_dialog_get_content_area(GTK_DIALOG(orientationChooser))), hbox, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), orientationChooser->checkLiveUpdate, FALSE, FALSE, 90); gtk_widget_show_all(GTK_WIDGET(orientationChooser)); /* Set other internal values. */ orientationChooser->kind = kind; visu_data_Changed(orientationChooser, data); orientationChooser->dataReady = g_signal_connect (VISU_OBJECT_INSTANCE, "dataRendered", G_CALLBACK(onDataReadyForRendering), (gpointer)orientationChooser); return GTK_WIDGET(orientationChooser); } static void onDataReadyForRendering(GObject *obj _U_, VisuData *dataObj, VisuGlView *view _U_, gpointer data) { /* We recompute the transformation matrix. */ visu_data_Changed(VISU_UI_ORIENTATION_CHOOSER(data), dataObj); } static void visu_data_Changed(VisuUiOrientationChooser *orientation, VisuData *data) { float tmpCoord[3], norm; float boxMatrix[3][3]; int i, j; g_return_if_fail(VISU_UI_IS_ORIENTATION_CHOOSER(orientation)); orientation->dataObj = data; /* Set or unset the box coordinate choice. */ gtk_widget_set_sensitive(orientation->hboxBox, data && visu_box_getBoundary(visu_boxed_getBox(VISU_BOXED(data))) != VISU_BOX_FREE); if (!data) return; /* Change the transformation matrix. */ for (j = 0; j < 3; j++) { tmpCoord[0] = (j == 0)?1.:0.; tmpCoord[1] = (j == 1)?1.:0.; tmpCoord[2] = (j == 2)?1.:0.; visu_box_convertBoxCoordinatestoXYZ(visu_boxed_getBox(VISU_BOXED(orientation->dataObj)), boxMatrix[j], tmpCoord); } DBG_fprintf(stderr, "Gtk VisuUiOrientationChooser: get the box matrix.\n"); DBG_fprintf(stderr, " | %8.4f %8.4f %8.4f\n", boxMatrix[0][0], boxMatrix[1][0], boxMatrix[2][0]); DBG_fprintf(stderr, " | %8.4f %8.4f %8.4f\n", boxMatrix[0][1], boxMatrix[1][1], boxMatrix[2][1]); DBG_fprintf(stderr, " | %8.4f %8.4f %8.4f\n", boxMatrix[0][2], boxMatrix[1][2], boxMatrix[2][2]); /* We create a matrix to transform the box coordinates to cartesian values keeping the orthogonality. */ for (i = 0; i < 3; i++) { norm = 0.; for (j = 0; j < 3; j++) { orientation->boxToOrtho[j][i] = boxMatrix[(i + 1)%3][(j + 1)%3] * boxMatrix[(i + 2)%3][(j + 2)%3] - boxMatrix[(i + 1)%3][(j + 2)%3] * boxMatrix[(i + 2)%3][(j + 1)%3]; norm += orientation->boxToOrtho[j][i] * orientation->boxToOrtho[j][i]; } /* We normalise the tranformation matrix. */ norm = sqrt(norm); for (j = 0; j < 3; j++) orientation->boxToOrtho[j][i] /= norm; } DBG_fprintf(stderr, "Gtk VisuUiOrientationChooser: normal case, boxToOrtho matrix.\n"); DBG_fprintf(stderr, " | %8.4f %8.4f %8.4f\n", orientation->boxToOrtho[0][0], orientation->boxToOrtho[0][1], orientation->boxToOrtho[0][2]); DBG_fprintf(stderr, " | %8.4f %8.4f %8.4f\n", orientation->boxToOrtho[1][0], orientation->boxToOrtho[1][1], orientation->boxToOrtho[1][2]); DBG_fprintf(stderr, " | %8.4f %8.4f %8.4f\n", orientation->boxToOrtho[2][0], orientation->boxToOrtho[2][1], orientation->boxToOrtho[2][2]); /* We inverse using the trick that the matrix is down (upper side is zeros. */ orientation->orthoToBox[0][0] = 1. / orientation->boxToOrtho[0][0]; orientation->orthoToBox[1][0] = - orientation->boxToOrtho[1][0] / orientation->boxToOrtho[1][1] / orientation->boxToOrtho[0][0]; orientation->orthoToBox[2][0] = (orientation->boxToOrtho[1][0] * orientation->boxToOrtho[2][1] - orientation->boxToOrtho[1][1] * orientation->boxToOrtho[2][0]) / orientation->boxToOrtho[0][0] / orientation->boxToOrtho[1][1] / orientation->boxToOrtho[2][2]; orientation->orthoToBox[0][1] = 0.; orientation->orthoToBox[1][1] = 1. / orientation->boxToOrtho[1][1]; orientation->orthoToBox[2][1] = - orientation->boxToOrtho[2][1] / orientation->boxToOrtho[1][1] / orientation->boxToOrtho[2][2]; orientation->orthoToBox[0][2] = 0.; orientation->orthoToBox[1][2] = 0.; orientation->orthoToBox[2][2] = 1. / orientation->boxToOrtho[2][2]; DBG_fprintf(stderr, "Gtk VisuUiOrientationChooser: normal case, orthoToBox matrix.\n"); DBG_fprintf(stderr, " | %8.4f %8.4f %8.4f\n", orientation->orthoToBox[0][0], orientation->orthoToBox[0][1], orientation->orthoToBox[0][2]); DBG_fprintf(stderr, " | %8.4f %8.4f %8.4f\n", orientation->orthoToBox[1][0], orientation->orthoToBox[1][1], orientation->orthoToBox[1][2]); DBG_fprintf(stderr, " | %8.4f %8.4f %8.4f\n", orientation->orthoToBox[2][0], orientation->orthoToBox[2][1], orientation->orthoToBox[2][2]); } static void orientationChanged(VisuUiOrientationChooser *orientation, VisuUiOrientationChooserBasis changedBasis) { int i; float xyz[3], boxXYZ[3], angles[3]; g_return_if_fail(changedBasis != visu_ui_orientation_chooser_box || orientation->dataObj); /* Get the changed coordinates and update the others. */ switch (changedBasis) { case visu_ui_orientation_chooser_ortho: for (i = 0; i < 3; i++) xyz[i] = (float)gtk_spin_button_get_value (GTK_SPIN_BUTTON(orientation->spinsOrtho[i])); if (orientation->dataObj) { if (orientation->kind == VISU_UI_ORIENTATION_DIRECTION) visu_box_convertXYZtoBoxCoordinates(visu_boxed_getBox(VISU_BOXED(orientation->dataObj)), boxXYZ, xyz); else if (orientation->kind == VISU_UI_ORIENTATION_NORMAL) tool_matrix_productVector(boxXYZ, orientation->orthoToBox, xyz); } tool_matrix_cartesianToSpherical(angles, xyz); if (angles[2] > 180.) angles[2] -= 360.; break; case visu_ui_orientation_chooser_box: for (i = 0; i < 3; i++) boxXYZ[i] = (float)gtk_spin_button_get_value (GTK_SPIN_BUTTON(orientation->spinsBox[i])); /* The conversion to cartesian coordinates depends on the attribute kind. */ if (orientation->kind == VISU_UI_ORIENTATION_DIRECTION) visu_box_convertBoxCoordinatestoXYZ(visu_boxed_getBox(VISU_BOXED(orientation->dataObj)), xyz, boxXYZ); else if (orientation->kind == VISU_UI_ORIENTATION_NORMAL) tool_matrix_productVector(xyz, orientation->boxToOrtho, boxXYZ); tool_matrix_cartesianToSpherical(angles, xyz); if (angles[2] > 180.) angles[2] -= 360.; break; case visu_ui_orientation_chooser_angles: for (i = 0; i < 3; i++) xyz[i] = (float)gtk_spin_button_get_value (GTK_SPIN_BUTTON(orientation->spinsOrtho[i])); angles[0] = sqrt(xyz[0] * xyz[0] + xyz[1] * xyz[1] + xyz[2] * xyz[2]); if (angles[0] == 0.) angles[0] = 1.; for (i = 1; i < 3; i++) angles[i] = (float)gtk_spin_button_get_value (GTK_SPIN_BUTTON(orientation->spinsAngles[i - 1])); tool_matrix_sphericalToCartesian(xyz, angles); if (orientation->dataObj) { if (orientation->kind == VISU_UI_ORIENTATION_DIRECTION) visu_box_convertXYZtoBoxCoordinates(visu_boxed_getBox(VISU_BOXED(orientation->dataObj)), boxXYZ, xyz); else if (orientation->kind == VISU_UI_ORIENTATION_NORMAL) tool_matrix_productVector(boxXYZ, orientation->orthoToBox, xyz); } break; } DBG_fprintf(stderr, "Gtk VisuUiOrientationChooser: set coordinates.\n"); DBG_fprintf(stderr, " | ortho: %8.4g %8.4g %8.4g\n", xyz[0], xyz[1], xyz[2]); DBG_fprintf(stderr, " | box: %8.4g %8.4g %8.4g\n", boxXYZ[0], boxXYZ[1], boxXYZ[2]); DBG_fprintf(stderr, " | angles: %8.4g %8.4g\n", angles[1], angles[2]); /* Stop the internal spin signals, change the values and reset the signals. */ for (i = 0; i < 3; i++) { /* DBG_fprintf(stderr, "Gtk VisuUiOrientationChooser: change the ortho values\n"); */ g_signal_handler_block(G_OBJECT(orientation->spinsOrtho[i]), orientation->signalsOrtho[i]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(orientation->spinsOrtho[i]), xyz[i]); g_signal_handler_unblock(G_OBJECT(orientation->spinsOrtho[i]), orientation->signalsOrtho[i]); } if (orientation->dataObj) for (i = 0; i < 3; i++) { /* DBG_fprintf(stderr, "Gtk VisuUiOrientationChooser: change the box values\n"); */ g_signal_handler_block(G_OBJECT(orientation->spinsBox[i]), orientation->signalsBox[i]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(orientation->spinsBox[i]), boxXYZ[i]); g_signal_handler_unblock(G_OBJECT(orientation->spinsBox[i]), orientation->signalsBox[i]); } for (i = 0; i < 2; i++) { /* DBG_fprintf(stderr, "Gtk VisuUiOrientationChooser: change the angles values\n"); */ g_signal_handler_block(G_OBJECT(orientation->spinsAngles[i]), orientation->signalsAngles[i]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(orientation->spinsAngles[i]), angles[i + 1]); g_signal_handler_unblock(G_OBJECT(orientation->spinsAngles[i]), orientation->signalsAngles[i]); } if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(orientation->checkLiveUpdate))) { DBG_fprintf(stderr, "Gtk VisuUiOrientationChooser: emit value changed (%d).\n", changedBasis); g_signal_emit(G_OBJECT(orientation), visu_ui_orientation_chooser_signals[VALUES_CHANGED], 0 , NULL); } } static void onOrthoChanged(GtkSpinButton *spin _U_, gpointer data) { orientationChanged(VISU_UI_ORIENTATION_CHOOSER(data), visu_ui_orientation_chooser_ortho); } static void onBoxChanged(GtkSpinButton *spin _U_, gpointer data) { orientationChanged(VISU_UI_ORIENTATION_CHOOSER(data), visu_ui_orientation_chooser_box); } static void onAnglesChanged(GtkSpinButton *spin _U_, gpointer data) { orientationChanged(VISU_UI_ORIENTATION_CHOOSER(data), visu_ui_orientation_chooser_angles); } static void onResponse(VisuUiOrientationChooser *chooser, gint response, gpointer data _U_) { if (response == GTK_RESPONSE_ACCEPT && !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chooser->checkLiveUpdate))) { DBG_fprintf(stderr, "Gtk VisuUiOrientationChooser: emit value changed on out.\n"); g_signal_emit(G_OBJECT(chooser), visu_ui_orientation_chooser_signals[VALUES_CHANGED], 0 , NULL); } } /** * visu_ui_orientation_chooser_setOrthoValues: * @orientation: a #VisuUiOrientationChooser widget ; * @values: (array fixed-size=3): three floating point values. * * Change the direction using the one given in an orthogonal basis * set. Update all other values accordingly. */ void visu_ui_orientation_chooser_setOrthoValues(VisuUiOrientationChooser *orientation, float values[3]) { int i; gboolean update; GtkSpinButton *spin; g_return_if_fail(VISU_UI_IS_ORIENTATION_CHOOSER(orientation)); DBG_fprintf(stderr, "Gtk VisuUiOrientationChooser: change ortho.\n"); /* Block the internal spin signals and raise manually the signal for one spin. */ update = FALSE; for (i = 0; i < 3; i++) { spin = GTK_SPIN_BUTTON(orientation->spinsOrtho[i]); g_signal_handler_block(G_OBJECT(spin), orientation->signalsOrtho[i]); update = update || ((float)gtk_spin_button_get_value(spin) != values[i]); gtk_spin_button_set_value(spin, values[i]); g_signal_handler_unblock(G_OBJECT(spin), orientation->signalsOrtho[i]); } if (update) orientationChanged(orientation, visu_ui_orientation_chooser_ortho); } /** * visu_ui_orientation_chooser_setBoxValues: * @orientation: a #VisuUiOrientationChooser widget ; * @values: (array fixed-size=3): three floating point values. * * Change the direction using the one given in the box basis * set. Update all other values accordingly. */ void visu_ui_orientation_chooser_setBoxValues(VisuUiOrientationChooser *orientation, float values[3]) { int i; gboolean update; GtkSpinButton *spin; g_return_if_fail(VISU_UI_IS_ORIENTATION_CHOOSER(orientation)); DBG_fprintf(stderr, "Gtk VisuUiOrientationChooser: change box.\n"); /* Block the internal spin signals and raise manually the signal for one spin. */ update = FALSE; for (i = 0; i < 3; i++) { spin = GTK_SPIN_BUTTON(orientation->spinsBox[i]); g_signal_handler_block(G_OBJECT(spin), orientation->signalsBox[i]); update = update || ((float)gtk_spin_button_get_value(spin) != values[i]); gtk_spin_button_set_value(spin, values[i]); g_signal_handler_unblock(G_OBJECT(spin), orientation->signalsBox[i]); } if (update) orientationChanged(orientation, visu_ui_orientation_chooser_box); } /** * visu_ui_orientation_chooser_setAnglesValues: * @orientation: a #VisuUiOrientationChooser widget ; * @values: (array fixed-size=2): two floating point values. * * Change the direction using the one given in a spherical basis * set. Update all other values accordingly. */ void visu_ui_orientation_chooser_setAnglesValues(VisuUiOrientationChooser *orientation, float values[2]) { int i; gboolean update; GtkSpinButton *spin; g_return_if_fail(VISU_UI_IS_ORIENTATION_CHOOSER(orientation)); DBG_fprintf(stderr, "Gtk VisuUiOrientationChooser: change angles to %gx%g.\n", values[0], values[1]); update = FALSE; for (i = 0; i < 2; i++) { spin = GTK_SPIN_BUTTON(orientation->spinsAngles[i]); g_signal_handler_block(G_OBJECT(spin), orientation->signalsAngles[i]); update = update || ((float)gtk_spin_button_get_value(spin) != values[i]); gtk_spin_button_set_value(spin, values[i]); g_signal_handler_unblock(G_OBJECT(spin), orientation->signalsAngles[i]); } if (update) orientationChanged(orientation, visu_ui_orientation_chooser_angles); } /** * visu_ui_orientation_chooser_getOrthoValues: * @orientation: a #VisuUiOrientationChooser widget ; * @values: (array fixed-size=3) (out): a location for three floating point values. * * Get the current orientation in the orthogonal basis set. */ void visu_ui_orientation_chooser_getOrthoValues(VisuUiOrientationChooser *orientation, float values[3]) { int i; g_return_if_fail(VISU_UI_IS_ORIENTATION_CHOOSER(orientation)); for (i = 0; i < 3; i++) values[i] = (float)gtk_spin_button_get_value (GTK_SPIN_BUTTON(orientation->spinsOrtho[i])); } /** * visu_ui_orientation_chooser_getBoxValues: * @orientation: a #VisuUiOrientationChooser widget ; * @values: (array fixed-size=3) (out): a location for three floating point values. * * Get the current orientation in the box basis set. */ void visu_ui_orientation_chooser_getBoxValues(VisuUiOrientationChooser *orientation, float values[3]) { int i; g_return_if_fail(VISU_UI_IS_ORIENTATION_CHOOSER(orientation)); for (i = 0; i < 3; i++) values[i] = (float)gtk_spin_button_get_value (GTK_SPIN_BUTTON(orientation->spinsBox[i])); } /** * visu_ui_orientation_chooser_getAnglesValues: * @orientation: a #VisuUiOrientationChooser widget ; * @values: (array fixed-size=2) (out): a location for two floating point values. * * Get the current orientation in the spherical basis set. */ void visu_ui_orientation_chooser_getAnglesValues(VisuUiOrientationChooser *orientation, float values[2]) { int i; g_return_if_fail(VISU_UI_IS_ORIENTATION_CHOOSER(orientation)); for (i = 0; i < 2; i++) values[i] = (float)gtk_spin_button_get_value (GTK_SPIN_BUTTON(orientation->spinsAngles[i])); } v_sim-3.7.0/src/extraGtkFunctions/gtk_orientationChooser.h0000644000353400050620000001162112215546105020730 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef GTK_ORIENTATIONCHOOSER_H #define GTK_ORIENTATIONCHOOSER_H #include #include G_BEGIN_DECLS /** * VISU_UI_TYPE_ORIENTATION_CHOOSER: * * Return the associated #GType to the VisuUiOrientationChooser objects. */ #define VISU_UI_TYPE_ORIENTATION_CHOOSER (visu_ui_orientation_chooser_get_type ()) /** * VISU_UI_ORIENTATION_CHOOSER: * @obj: the widget to cast. * * Cast the given object to a #VisuUiOrientationChooser object. */ #define VISU_UI_ORIENTATION_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VISU_UI_TYPE_ORIENTATION_CHOOSER, VisuUiOrientationChooser)) /** * VISU_UI_ORIENTATION_CHOOSER_CLASS: * @klass: the class to cast. * * Cast the given class to a #VisuUiOrientationChooserClass object. */ #define VISU_UI_ORIENTATION_CHOOSER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VISU_UI_TYPE_ORIENTATION_CHOOSER, VisuUiOrientationChooserClass)) /** * VISU_UI_IS_ORIENTATION_CHOOSER: * @obj: the object to test. * * Return if the given object is a valid #VisuUiOrientationChooser object. */ #define VISU_UI_IS_ORIENTATION_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VISU_UI_TYPE_ORIENTATION_CHOOSER)) /** * VISU_UI_IS_ORIENTATION_CHOOSER_CLASS: * @klass: the class to test. * * Return if the given class is a valid #VisuUiOrientationChooserClass class. */ #define VISU_UI_IS_ORIENTATION_CHOOSER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VISU_UI_TYPE_ORIENTATION_CHOOSER)) typedef struct _VisuUiOrientationChooser VisuUiOrientationChooser; typedef struct _VisuUiOrientationChooserClass VisuUiOrientationChooserClass; /** * VisuUiOrientationChooserKind: * @VISU_UI_ORIENTATION_DIRECTION: this flag specifies that the box coordinates * are used to identity a direction ; * @VISU_UI_ORIENTATION_NORMAL: this flag specifies that the box coordinates * are used to identify a normal direction. * * These values are used when creating an #VisuUiOrientationChooser, to specify the * behavior of the box coordinates. This is due to the fact that the box coordinates * are not always orthoggonal. */ typedef enum { VISU_UI_ORIENTATION_DIRECTION, VISU_UI_ORIENTATION_NORMAL } VisuUiOrientationChooserKind; GType visu_ui_orientation_chooser_get_type (void); GtkWidget* visu_ui_orientation_chooser_new(VisuUiOrientationChooserKind kind, gboolean liveUpdate, VisuData *data, GtkWindow *parent); void visu_ui_orientation_chooser_setOrthoValues(VisuUiOrientationChooser *orientation, float values[3]); void visu_ui_orientation_chooser_setBoxValues(VisuUiOrientationChooser *orientation, float values[3]); void visu_ui_orientation_chooser_setAnglesValues(VisuUiOrientationChooser *orientation, float values[2]); void visu_ui_orientation_chooser_getOrthoValues(VisuUiOrientationChooser *orientation, float values[3]); void visu_ui_orientation_chooser_getBoxValues(VisuUiOrientationChooser *orientation, float values[3]); void visu_ui_orientation_chooser_getAnglesValues(VisuUiOrientationChooser *orientation, float values[2]); G_END_DECLS #endif v_sim-3.7.0/src/extraGtkFunctions/gtk_numericalEntryWidget.c0000644000353400050620000002321112215546105021210 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include "gtk_numericalEntryWidget.h" /** * SECTION:gtk_numericalEntryWidget * @short_description: Defines a widget to enter numerical values without * any boundary or precision constrains. * * This widget is based on the #GtkEntry widget but behaves more * like a #GtkSpinButton is fact. It is designed to enter numerical * values, but without any boundary or precision constrains. One can * use either plain or scientific notations. */ enum { VALUE_CHANGED_SIGNAL, LAST_SIGNAL }; static guint visu_ui_numerical_entry_signals[LAST_SIGNAL] = { 0 }; #define VISU_UI_NUMERICAL_ENTRY_FORMAT_DEFAULT "%g" struct _VisuUiNumericalEntry { GtkEntry entry; double value; double printed_value; gchar *format; /* VisuUiNumericalEntryPrivate *private; */ gboolean dispose_has_run; }; struct _VisuUiNumericalEntryClass { GtkEntryClass parent_class; void (*numericalEntry) (VisuUiNumericalEntry *numEntry); gulong valueChangedSignalId; }; static void visu_ui_numerical_entry_dispose (GObject *obj); static void visu_ui_numerical_entry_finalize(GObject *obj); G_DEFINE_TYPE(VisuUiNumericalEntry, visu_ui_numerical_entry, GTK_TYPE_ENTRY) /* Local methods. */ void printStoredValue(VisuUiNumericalEntry* numericalEntry); gboolean parsePrintedValue(VisuUiNumericalEntry *numericalEntry, double *value); void onEntryValueChange(VisuUiNumericalEntry *numericalEntry, gpointer data); gboolean onEntryLeaveFocus(VisuUiNumericalEntry *numericalEntry, GdkEventFocus *event, gpointer data); gboolean onEntryGetFocus(VisuUiNumericalEntry *numericalEntry, GdkEventFocus *event, gpointer data); static void visu_ui_numerical_entry_class_init(VisuUiNumericalEntryClass *klass) { DBG_fprintf(stderr, "Gtk VisuUiNumericalEntry : creating the class of the widget.\n"); DBG_fprintf(stderr, " - adding new signals ;\n"); /** * VisuUiNumericalEntry::value-changed: * @entry: the #VisuUiNumericalEntry that emits the signal ; * @oldValue: the previous value. * * This signal is emitted when a new valid numerical value is entered. * * Since: 3.1 */ visu_ui_numerical_entry_signals[VALUE_CHANGED_SIGNAL] = g_signal_new ("value-changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (VisuUiNumericalEntryClass, numericalEntry), NULL, NULL, g_cclosure_marshal_VOID__DOUBLE, G_TYPE_NONE, 1, G_TYPE_DOUBLE); /* Connect freeing methods. */ G_OBJECT_CLASS(klass)->dispose = visu_ui_numerical_entry_dispose; G_OBJECT_CLASS(klass)->finalize = visu_ui_numerical_entry_finalize; } static void visu_ui_numerical_entry_dispose(GObject *obj) { DBG_fprintf(stderr, "Gtk VisuUiNumericalEntry: dispose object %p.\n", (gpointer)obj); if (VISU_UI_NUMERICAL_ENTRY(obj)->dispose_has_run) return; VISU_UI_NUMERICAL_ENTRY(obj)->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_numerical_entry_parent_class)->dispose(obj); } static void visu_ui_numerical_entry_finalize(GObject *obj) { VisuUiNumericalEntry *entry; g_return_if_fail(obj); DBG_fprintf(stderr, "Gtk VisuUiNumericalEntry: finalize object %p.\n", (gpointer)obj); entry = VISU_UI_NUMERICAL_ENTRY(obj); g_free(entry->format); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_numerical_entry_parent_class)->finalize(obj); DBG_fprintf(stderr, "Gtk VisuUiNumericalEntry: freeing ... OK.\n"); } static void visu_ui_numerical_entry_init(VisuUiNumericalEntry *numericalEntry) { DBG_fprintf(stderr, "Gtk VisuUiNumericalEntry : initializing new object (%p).\n", (gpointer)numericalEntry); numericalEntry->dispose_has_run = FALSE; numericalEntry->format = g_strdup(VISU_UI_NUMERICAL_ENTRY_FORMAT_DEFAULT); g_signal_connect_swapped(G_OBJECT(numericalEntry), "activate", G_CALLBACK(onEntryValueChange), (gpointer)numericalEntry); g_signal_connect_swapped(G_OBJECT(numericalEntry), "focus-out-event", G_CALLBACK(onEntryLeaveFocus), (gpointer)numericalEntry); g_signal_connect_swapped(G_OBJECT(numericalEntry), "focus-in-event", G_CALLBACK(onEntryGetFocus), (gpointer)numericalEntry); } /** * visu_ui_numerical_entry_new : * @value: the initial value. * * A #VisuUiNumericalEntry widget is like a #GtkEntry widget, but it only accepts * double precision values (written in plain format, e.g. 1.23456, or scientific * notation, e.g. 1.2345e6). The widget can't be blank and there is always * a value printed in it. If the user erase the current value or enter something * that is not a recognised double precision value, the widget returns to its previous * valid value. * * Returns: a newly created #VisuUiNumericalEntry widget. */ GtkWidget* visu_ui_numerical_entry_new(double value) { VisuUiNumericalEntry *numericalEntry; DBG_fprintf(stderr, "Gtk VisuUiNumericalEntry : creating new object with value : %g.\n", value); numericalEntry = VISU_UI_NUMERICAL_ENTRY(g_object_new(visu_ui_numerical_entry_get_type(), NULL)); numericalEntry->value = value; printStoredValue(numericalEntry); return GTK_WIDGET(numericalEntry); } void printStoredValue(VisuUiNumericalEntry* numericalEntry) { gchar *str; g_return_if_fail(VISU_UI_IS_NUMERICAL_ENTRY(numericalEntry)); str = g_strdup_printf(numericalEntry->format, numericalEntry->value); gtk_entry_set_text(GTK_ENTRY(numericalEntry), str); g_free(str); if (!parsePrintedValue(numericalEntry, &numericalEntry->printed_value)) numericalEntry->printed_value = G_MAXFLOAT; } gboolean parsePrintedValue(VisuUiNumericalEntry *numericalEntry, double *value) { double valueDouble; gchar *last; g_return_val_if_fail(VISU_UI_IS_NUMERICAL_ENTRY(numericalEntry) && value, FALSE); valueDouble = g_ascii_strtod(gtk_entry_get_text(GTK_ENTRY(numericalEntry)), &last); if (*last != '\0') { /* Wrong number. */ g_warning("Can't read a number from '%s'.\n", gtk_entry_get_text(GTK_ENTRY(numericalEntry))); return FALSE; } *value = valueDouble; return TRUE; } /** * visu_ui_numerical_entry_setValue: * @numericalEntry: a #VisuUiNumericalEntry widget ; * @value: a double precision value. * * Use this method to set the value for the given #numericalEntry widget. */ void visu_ui_numerical_entry_setValue(VisuUiNumericalEntry* numericalEntry, double value) { double valueOld; g_return_if_fail(VISU_UI_IS_NUMERICAL_ENTRY(numericalEntry)); if (value == numericalEntry->value) return; valueOld = numericalEntry->value; numericalEntry->value = value; printStoredValue(numericalEntry); DBG_fprintf(stderr, "Gtk VisuUiNumericalEntry : emitting 'value-changed' signal.\n"); g_signal_emit(G_OBJECT(numericalEntry), visu_ui_numerical_entry_signals[VALUE_CHANGED_SIGNAL], 0, valueOld, NULL); } /** * visu_ui_numerical_entry_getValue: * @numericalEntry: a #VisuUiNumericalEntry widget. * * You can get the value contained in the given @numericalEntry using this method. * * Returns: the double precision value printed in the #VisuUiNumericalEntry. */ double visu_ui_numerical_entry_getValue(VisuUiNumericalEntry *numericalEntry) { g_return_val_if_fail(VISU_UI_IS_NUMERICAL_ENTRY(numericalEntry), 0.); return numericalEntry->value; } void onEntryValueChange(VisuUiNumericalEntry *numericalEntry, gpointer data _U_) { gboolean valid; double valueDouble; valid = parsePrintedValue(numericalEntry, &valueDouble); if (!valid) printStoredValue(numericalEntry); else { if (valueDouble != numericalEntry->printed_value) visu_ui_numerical_entry_setValue(numericalEntry, valueDouble); } } gboolean onEntryLeaveFocus(VisuUiNumericalEntry *numericalEntry, GdkEventFocus *event _U_, gpointer data _U_) { onEntryValueChange(numericalEntry, (gpointer)0); return FALSE; } gboolean onEntryGetFocus(VisuUiNumericalEntry *numericalEntry _U_, GdkEventFocus *event _U_, gpointer data _U_) { /* gtk_editable_select_region(GTK_EDITABLE(numericalEntry), 0, -1); */ return FALSE; } v_sim-3.7.0/src/extraGtkFunctions/gtk_numericalEntryWidget.h0000644000353400050620000000766512215546105021234 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef GTK_NUMERICALENTRYWIDGET_H #define GTK_NUMERICALENTRYWIDGET_H #include #include #include #include G_BEGIN_DECLS /** * VISU_UI_TYPE_NUMERICAL_ENTRY: * * Return the associated #GType to the VisuUiNumericalEntry objects. */ #define VISU_UI_TYPE_NUMERICAL_ENTRY (visu_ui_numerical_entry_get_type ()) /** * VISU_UI_NUMERICAL_ENTRY: * @obj: the widget to cast. * * Cast the given object to a #VisuUiNumericalEntry object. */ #define VISU_UI_NUMERICAL_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VISU_UI_TYPE_NUMERICAL_ENTRY, VisuUiNumericalEntry)) /** * VISU_UI_NUMERICAL_ENTRY_CLASS: * @klass: the class to cast. * * Cast the given class to a #VisuUiNumericalEntryClass object. */ #define VISU_UI_NUMERICAL_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VISU_UI_TYPE_NUMERICAL_ENTRY, VisuUiNumericalEntryClass)) /** * VISU_UI_IS_NUMERICAL_ENTRY: * @obj: the object to test. * * Return if the given object is a valid #VisuUiNumericalEntry object. */ #define VISU_UI_IS_NUMERICAL_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VISU_UI_TYPE_NUMERICAL_ENTRY)) /** * VISU_UI_IS_NUMERICAL_ENTRY_CLASS: * @klass: the class to test. * * Return if the given class is a valid #VisuUiNumericalEntryClass class. */ #define VISU_UI_IS_NUMERICAL_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VISU_UI_TYPE_NUMERICAL_ENTRY)) /** * VisuUiNumericalEntry * * Short form for a #VisuUiNumericalEntry_struct structure. */ typedef struct _VisuUiNumericalEntry VisuUiNumericalEntry; /* typedef struct VisuUiNumericalEntryPrivate_struct VisuUiNumericalEntryPrivate; */ /** * VisuUiNumericalEntryClass * * Opaque structure. */ typedef struct _VisuUiNumericalEntryClass VisuUiNumericalEntryClass; /** * visu_ui_numerical_entry_get_type * * #GType are unique numbers to identify objects. * * Returns: the #GType associated with #VisuUiNumericalEntry objects. */ GType visu_ui_numerical_entry_get_type(void); GtkWidget* visu_ui_numerical_entry_new(double value); void visu_ui_numerical_entry_setValue(VisuUiNumericalEntry* numericalEntry, double value); double visu_ui_numerical_entry_getValue(VisuUiNumericalEntry *numericalEntry); G_END_DECLS #endif v_sim-3.7.0/src/extraGtkFunctions/gtk_shadeComboBoxWidget.c0000644000353400050620000005274312215546105020740 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include "gtk_shadeComboBoxWidget.h" #include #include #include #include #include /** * SECTION:gtk_shadeComboBoxWidget * @short_description: Defines a specialised #GtkComboBox to choose * pre-built shades. * @see_also: #VisuUiStippleCombobox, #ToolShade * @include: coreTools/toolShade.h * * This widget looks like a #GtkComboBox and it displays a list * of preset colour shades. These patterns are defined by colour * parameters, see #ToolShade. * This widget can emit a #VisuUiShadeCombobox::shade-selected * signal that is a wrapper around the #GtkComboBox::changed signal, * but it is emitted only when a new shade is selected and this shade * is passed to the callback. * * Since: 3.3 */ enum { SHADE_SELECTED_SIGNAL, LAST_SIGNAL }; /* This enum is used to access the column of the GtkListStore that contains the informations of stroed shades. */ enum { /* This has a pointer to a 48x16 image to represent the shade. */ COLUMN_SHADE_PIXBUF, /* This is a pointer to a label that describes the shade. */ COLUMN_SHADE_LABEL, /* This is a label with the shade id '(n)'. */ COLUMN_SHADE_ID, /* This a pointer to the #ToolShade as defined in toolShade.h */ COLUMN_SHADE_POINTER_TO, N_COLUMN_SHADE }; /* Store a tree model to remember shades. */ #define SHADE_BOX_WIDTH 48 #define SHADE_BOX_HEIGHT 16 #define SHADE_BOX_BITS 8 /* Entries in the parameter file. */ #define FLAG_PARAMETER_FAVSHADE "presetShade" #define DESC_PARAMETER_FAVSHADE "The id of a shade used as preset one in the shade selectors ; an integer ranging from 0" #define PARAMETER_FAVSHADE_DEFAULT 0 static void visu_ui_shade_combobox_dispose (GObject *obj); static void visu_ui_shade_combobox_finalize(GObject *obj); static guint visu_ui_shade_combobox_signals[LAST_SIGNAL] = { 0 }; /** * VisuUiShadeCombobox * * Private structure to store informations of a #VisuUiShadeCombobox object. * * Since: 3.3 */ struct _VisuUiShadeCombobox { GtkComboBox comboToolShade; ToolShade* previouslySelectedToolShade; gboolean hasAlphaChannel; /* Memory gestion. */ gboolean dispose_has_run; }; /** * VisuUiShadeComboboxClass * * Private structure to store informations of a #VisuUiShadeComboboxClass object. * * Since: 3.3 */ struct _VisuUiShadeComboboxClass { GtkComboBoxClass parent_class; void (*shadeComboBox) (VisuUiShadeCombobox *shadeCombo); /* This listStore contains all the shades known by widgets of this class. It is used as TreeModel for the combobox in the widget. */ GtkListStore *listStoredToolShades; guint favToolShade; gulong shadeAddedSignalId; }; static VisuUiShadeComboboxClass *my_class = (VisuUiShadeComboboxClass*)0; /* Local callbacks. */ static void visu_ui_shade_combobox_changed(GtkWidget *widget, VisuUiShadeCombobox *shadeComboBox); /* Local methods. */ static void addToolShadeToModel(GtkTreeIter *iter, VisuUiShadeComboboxClass* klass, ToolShade* shade); static void onNewShadeAvailable(GObject *obj, ToolShade* newColor, gpointer data); static void buildWidgets(VisuUiShadeCombobox *shadeComboBox, gboolean showNames); static gboolean readFavToolShade(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static void exportParameters(GString *data, VisuData* dataObj, VisuGlView *view); /** * visu_ui_shade_combobox_get_type * * #GType are unique numbers to identify objects. * * Returns: the #GType associated with #VisuUiShadeCombobox objects. * * Since: 3.3 */ G_DEFINE_TYPE(VisuUiShadeCombobox, visu_ui_shade_combobox, GTK_TYPE_COMBO_BOX) static void visu_ui_shade_combobox_class_init(VisuUiShadeComboboxClass *klass) { GtkTreeIter iter; GList *shadeLst; VisuConfigFileEntry *resourceEntry; DBG_fprintf(stderr, "Gtk VisuUiShadeCombobox: creating the class of the widget.\n"); DBG_fprintf(stderr, " - adding new signals ;\n"); /** * VisuUiShadeCombobox::shade-selected: * @combo: the #VisuUiShadeCombobox that emits the signal ; * @shade: the newly selected #ToolShade. * * This signal is emitted when a new valid colour shade is selected. * * Since: 3.3 */ visu_ui_shade_combobox_signals[SHADE_SELECTED_SIGNAL] = g_signal_new ("shade-selected", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (VisuUiShadeComboboxClass, shadeComboBox), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); klass->shadeAddedSignalId = g_signal_connect(VISU_OBJECT_INSTANCE, "shadeNewAvailable", G_CALLBACK(onNewShadeAvailable), (gpointer)klass); DBG_fprintf(stderr, " - initializing the listStore of shades.\n"); /* Init the listStore of shades. */ klass->listStoredToolShades = gtk_list_store_new(N_COLUMN_SHADE, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); for (shadeLst = tool_shade_getList(); shadeLst; shadeLst = g_list_next(shadeLst)) addToolShadeToModel(&iter, klass, (ToolShade*)shadeLst->data); klass->favToolShade = 0; /* Dealing with parameters. */ resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_FAVSHADE, DESC_PARAMETER_FAVSHADE, 1, readFavToolShade); visu_config_file_entry_setVersion(resourceEntry, 3.5f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_PARAMETER, exportParameters); /* Connect freeing methods. */ G_OBJECT_CLASS(klass)->dispose = visu_ui_shade_combobox_dispose; G_OBJECT_CLASS(klass)->finalize = visu_ui_shade_combobox_finalize; my_class = klass; } static void visu_ui_shade_combobox_dispose(GObject *obj) { DBG_fprintf(stderr, "Gtk VisuUiShadeCombobox: dispose object %p.\n", (gpointer)obj); if (VISU_UI_SHADE_COMBOBOX(obj)->dispose_has_run) return; VISU_UI_SHADE_COMBOBOX(obj)->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_shade_combobox_parent_class)->dispose(obj); } static void visu_ui_shade_combobox_finalize(GObject *obj) { g_return_if_fail(obj); DBG_fprintf(stderr, "Gtk VisuUiShadeCombobox: finalize object %p.\n", (gpointer)obj); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_shade_combobox_parent_class)->finalize(obj); DBG_fprintf(stderr, " | freeing ... OK.\n"); } static void visu_ui_shade_combobox_init(VisuUiShadeCombobox *shadeComboBox) { DBG_fprintf(stderr, "Gtk VisuUiShadeCombobox: initializing new object (%p).\n", (gpointer)shadeComboBox); shadeComboBox->hasAlphaChannel = TRUE; shadeComboBox->dispose_has_run = FALSE; shadeComboBox->previouslySelectedToolShade = (ToolShade*)0; } static void buildWidgets(VisuUiShadeCombobox *shadeComboBox, gboolean showNames) { GObjectClass *klass; GtkCellRenderer *renderer; klass = G_OBJECT_GET_CLASS(shadeComboBox); gtk_combo_box_set_model(GTK_COMBO_BOX(shadeComboBox), GTK_TREE_MODEL(VISU_UI_SHADE_COMBOBOX_CLASS(klass)->listStoredToolShades)); renderer = gtk_cell_renderer_pixbuf_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(shadeComboBox), renderer, FALSE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(shadeComboBox), renderer, "pixbuf", COLUMN_SHADE_PIXBUF); if (showNames) { renderer = gtk_cell_renderer_text_new(); g_object_set(G_OBJECT(renderer), "foreground", "#505050", "xpad", 0, "align-set", TRUE, "xalign", 1.0, NULL); gtk_cell_layout_pack_end(GTK_CELL_LAYOUT(shadeComboBox), renderer, FALSE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(shadeComboBox), renderer, "markup", COLUMN_SHADE_ID); renderer = gtk_cell_renderer_text_new(); /* g_object_set(G_OBJECT(renderer), "scale", 0.85, NULL); */ gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(shadeComboBox), renderer, TRUE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(shadeComboBox), renderer, "text", COLUMN_SHADE_LABEL); } if ((gint)VISU_UI_SHADE_COMBOBOX_CLASS(klass)->favToolShade < gtk_tree_model_iter_n_children (GTK_TREE_MODEL(VISU_UI_SHADE_COMBOBOX_CLASS(klass)->listStoredToolShades), (GtkTreeIter*)0)) gtk_combo_box_set_active(GTK_COMBO_BOX(shadeComboBox), VISU_UI_SHADE_COMBOBOX_CLASS(klass)->favToolShade); else gtk_combo_box_set_active(GTK_COMBO_BOX(shadeComboBox), -1); g_signal_connect(G_OBJECT(shadeComboBox), "changed", G_CALLBACK(visu_ui_shade_combobox_changed), (gpointer)shadeComboBox); } /** * visu_ui_shade_combobox_new : * @hasAlphaChannel : a boolean. * @showNames: if TRUE, the names of the shades are displayed. * * A #VisuUiShadeCombobox widget is like a #GtkComboBox widget, but it is already filled * with the known shades. Using this widget * is a convienient way to share shades between all part of V_Sim and to give a consistent * look of all shade selection. If the argument @hasAlphaChannel is FALSE, the widget * display all shades but without their alpha channel, assuming it to be fully opaque. * * Returns: (transfer full): a newly created #VisuUiShadeCombobox widget. * * Since: 3.3 */ GtkWidget* visu_ui_shade_combobox_new(gboolean hasAlphaChannel, gboolean showNames) { VisuUiShadeCombobox *shadeComboBox; DBG_fprintf(stderr, "Gtk VisuUiShadeCombobox: creating new object with alpha: %d.\n", hasAlphaChannel); shadeComboBox = VISU_UI_SHADE_COMBOBOX(g_object_new(visu_ui_shade_combobox_get_type (), NULL)); shadeComboBox->hasAlphaChannel = hasAlphaChannel; DBG_fprintf(stderr, "Gtk VisuUiShadeCombobox: build widgets.\n"); buildWidgets(shadeComboBox, showNames); return GTK_WIDGET(shadeComboBox); } static void visu_ui_shade_combobox_changed(GtkWidget *widget _U_, VisuUiShadeCombobox *shadeComboBox) { int selected; GtkTreeIter iter; GObjectClass *klass; ToolShade *shade; selected = gtk_combo_box_get_active(GTK_COMBO_BOX(shadeComboBox)); DBG_fprintf(stderr, "Gtk VisuUiShadeCombobox: internal combobox changed signal -> %d.\n", selected); if (selected < 0) { shadeComboBox->previouslySelectedToolShade = (ToolShade*)0; /* DBG_fprintf(stderr, "Gtk VisuUiShadeCombobox: emitting 'shade-selected' signal.\n"); */ /* g_signal_emit(G_OBJECT(shadeComboBox), */ /* visu_ui_shade_combobox_signals[SHADE_SELECTED_SIGNAL], 0, (gpointer)0, NULL); */ return; } gtk_combo_box_get_active_iter(GTK_COMBO_BOX(shadeComboBox), &iter); klass = G_OBJECT_GET_CLASS(shadeComboBox); gtk_tree_model_get(GTK_TREE_MODEL(VISU_UI_SHADE_COMBOBOX_CLASS(klass)->listStoredToolShades), &iter, COLUMN_SHADE_POINTER_TO, &shade, -1); if (shade != shadeComboBox->previouslySelectedToolShade) { shadeComboBox->previouslySelectedToolShade = shade; DBG_fprintf(stderr, "Gtk VisuUiShadeCombobox: emitting 'shade-selected' signal for shade (%p).\n", (gpointer)shade); g_signal_emit(G_OBJECT(shadeComboBox), visu_ui_shade_combobox_signals[SHADE_SELECTED_SIGNAL], 0, (gpointer)shade, NULL); } else DBG_fprintf(stderr, "Gtk VisuUiShadeCombobox: aborting 'shade-selected' signal.\n"); } /** * visu_ui_shade_combobox_buildStamp: * @shade: a #ToolShade object ; * @pixbuf: (inout) (allow-none): an existing pixbuf (can be NULL). * * This method is used to create pixbuf representing shades. If @pixbuf is given, * it must be a valid pixbuf, and the shade is created in it. Otherwise, a new * pixbuf is created. * * Returns: (transfer full): a pixbuf pointer. * * Since: 3.3 */ GdkPixbuf* visu_ui_shade_combobox_buildStamp(ToolShade *shade, GdkPixbuf *pixbuf) { GdkPixbuf *pixbufToolShadeBox; int rowstride, x, y; guchar *pixels, *p; float grey; float **rgbVals; if (!pixbuf) pixbufToolShadeBox = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, SHADE_BOX_BITS, SHADE_BOX_WIDTH, SHADE_BOX_HEIGHT); else pixbufToolShadeBox = pixbuf; rowstride = gdk_pixbuf_get_rowstride(pixbufToolShadeBox); pixels = gdk_pixbuf_get_pixels(pixbufToolShadeBox); rgbVals = g_malloc(sizeof(float*) * SHADE_BOX_WIDTH); rgbVals[0] = g_malloc(sizeof(float) * SHADE_BOX_WIDTH * 5); for (x = 0; x < SHADE_BOX_WIDTH; x++) { rgbVals[x] = rgbVals[0] + x * 5; rgbVals[x][0] = (float)x / (float)(SHADE_BOX_WIDTH - 1); tool_shade_valueToRGB(shade, &rgbVals[x][1], rgbVals[x][0]); } for (y = 0; y < SHADE_BOX_HEIGHT; y++) for (x = 0; x < SHADE_BOX_WIDTH; x++) { p = pixels + y * rowstride + x * 3; if (x < SHADE_BOX_WIDTH / 2) { if (y < SHADE_BOX_HEIGHT / 2) grey = 0.75; else grey = 0.5; } else { if (y < SHADE_BOX_HEIGHT / 2) grey = 0.5; else grey = 0.75; } p[0] = (guchar)((rgbVals[x][1] * rgbVals[x][4] + (1. - rgbVals[x][4]) * grey) * 255.); p[1] = (guchar)((rgbVals[x][2] * rgbVals[x][4] + (1. - rgbVals[x][4]) * grey) * 255.); p[2] = (guchar)((rgbVals[x][3] * rgbVals[x][4] + (1. - rgbVals[x][4]) * grey) * 255.); } g_free(rgbVals[0]); g_free(rgbVals); return pixbufToolShadeBox; } static void onNewShadeAvailable(GObject *obj _U_, ToolShade* newShade, gpointer data) { VisuUiShadeComboboxClass *klass; GtkTreeIter iter; g_return_if_fail(data); DBG_fprintf(stderr, "Gtk VisuUiShadeComboboxClass: catch the 'shadeNewAvailable' signal.\n"); klass = VISU_UI_SHADE_COMBOBOX_CLASS(data); addToolShadeToModel(&iter, klass, newShade); } static void addToolShadeToModel(GtkTreeIter *iter, VisuUiShadeComboboxClass* klass, ToolShade* shade) { GtkTreePath *path; gint *ids; gchar *idLbl; g_return_if_fail(iter && klass && shade); DBG_fprintf(stderr, "Gtk VisuUiShadeCombobox: appending a new shade '%s'.\n", tool_shade_getLabel(shade)); gtk_list_store_append(klass->listStoredToolShades, iter); path = gtk_tree_model_get_path(GTK_TREE_MODEL(klass->listStoredToolShades), iter); ids = gtk_tree_path_get_indices(path); idLbl = g_strdup_printf("(%d)", ids[0]); gtk_tree_path_free(path); gtk_list_store_set(klass->listStoredToolShades, iter, COLUMN_SHADE_PIXBUF , visu_ui_shade_combobox_buildStamp(shade, (GdkPixbuf*)0), COLUMN_SHADE_LABEL , tool_shade_getLabel(shade), COLUMN_SHADE_ID , idLbl, COLUMN_SHADE_POINTER_TO , (gpointer)shade, -1); g_free(idLbl); DBG_fprintf(stderr, "Gtk VisuUiShadeCombobox: appending a new shade '%s'.\n", tool_shade_getLabel(shade)); } /** * visu_ui_shade_combobox_setSelectionByShade: * @shadeComboBox: a #VisuUiShadeCombobox widget ; * @shade: a #ToolShade object. * * Use this method to set the ComboBox on the given shade. This emits a 'shade-channel' * signal if the shade is changed, which means, a previous shade has been modified, * or a new shade is selected. * * Returns: TRUE if the @shade already exists in the model. * * Since: 3.3 */ gboolean visu_ui_shade_combobox_setSelectionByShade(VisuUiShadeCombobox* shadeComboBox, ToolShade *shade) { GtkTreeIter iter; gboolean validIter; GObjectClass *klass; GtkListStore *model; ToolShade *tmpToolShade; g_return_val_if_fail(VISU_UI_IS_SHADE_COMBOBOX(shadeComboBox), FALSE); DBG_fprintf(stderr, "Gtk VisuUiShadeCombobox: select a new shade %p.\n", (gpointer)shade); if (!shade) { gtk_combo_box_set_active(GTK_COMBO_BOX(shadeComboBox), -1); return TRUE; } klass = G_OBJECT_GET_CLASS(shadeComboBox); model = GTK_LIST_STORE(VISU_UI_SHADE_COMBOBOX_CLASS(klass)->listStoredToolShades); for (validIter = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter); validIter; validIter = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter)) { gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, COLUMN_SHADE_POINTER_TO, &tmpToolShade, -1); if (tmpToolShade == shade || tool_shade_compare(tmpToolShade, shade)) { gtk_combo_box_set_active_iter(GTK_COMBO_BOX(shadeComboBox), &iter); return TRUE; } } return FALSE; } GdkPixbuf* shadeComboBoxGet_selectedPixbuf(VisuUiShadeCombobox *shadeComboBox) { gboolean validIter; GtkTreeIter iter; GdkPixbuf *pixbuf; GObjectClass *klass; g_return_val_if_fail(VISU_UI_IS_SHADE_COMBOBOX(shadeComboBox), (GdkPixbuf*)0); validIter = gtk_combo_box_get_active_iter(GTK_COMBO_BOX(shadeComboBox), &iter); if (!validIter) return (GdkPixbuf*)0; pixbuf = (GdkPixbuf*)0; klass = G_OBJECT_GET_CLASS(shadeComboBox); gtk_tree_model_get(GTK_TREE_MODEL(VISU_UI_SHADE_COMBOBOX_CLASS(klass)->listStoredToolShades), &iter, COLUMN_SHADE_PIXBUF, &pixbuf, -1); return pixbuf; } /** * visu_ui_shade_combobox_getSelection: * @shadeComboBox: a #VisuUiShadeCombobox widget. * * The user can access to the selected #ToolShade object using this method. * * Returns: (transfer none): a pointer to the selected #ToolShade * object (or NULL). This object is read-only. * * Since: 3.3 */ ToolShade* visu_ui_shade_combobox_getSelection(VisuUiShadeCombobox *shadeComboBox) { gboolean validIter; GtkTreeIter iter; ToolShade *shade; GObjectClass *klass; g_return_val_if_fail(VISU_UI_IS_SHADE_COMBOBOX(shadeComboBox), (ToolShade*)0); validIter = gtk_combo_box_get_active_iter(GTK_COMBO_BOX(shadeComboBox), &iter); if (!validIter) return (ToolShade*)0; shade = (ToolShade*)0; klass = G_OBJECT_GET_CLASS(shadeComboBox); gtk_tree_model_get(GTK_TREE_MODEL(VISU_UI_SHADE_COMBOBOX_CLASS(klass)->listStoredToolShades), &iter, COLUMN_SHADE_POINTER_TO, &shade, -1); return shade; } /** * visu_ui_shade_combobox_getStamp: * @shadeComboBox: a #VisuUiShadeCombobox widget ; * @shade: a #ToolShade object. * * The @shadeComboBox has little pixbufs to represent the shade. User methods can * use these pixbufs but should considered them read-only. * * Returns: (transfer none): a pixbuf pointer corresponding to the * little image shown on the @shadeComboBox. * * Since: 3.3 */ GdkPixbuf* visu_ui_shade_combobox_getStamp(VisuUiShadeCombobox *shadeComboBox, ToolShade *shade) { GtkTreeIter iter; gboolean validIter; GdkPixbuf *pixbuf; ToolShade *cl; GtkListStore *model; g_return_val_if_fail(VISU_UI_IS_SHADE_COMBOBOX(shadeComboBox) && shade, (GdkPixbuf*)0); model = VISU_UI_SHADE_COMBOBOX_CLASS(G_OBJECT_GET_CLASS(shadeComboBox))->listStoredToolShades; validIter = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter); while (validIter) { pixbuf = (GdkPixbuf*)0; cl = (ToolShade*)0; gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, COLUMN_SHADE_PIXBUF, &pixbuf, COLUMN_SHADE_POINTER_TO, &cl, -1); if (shade == cl) return pixbuf; validIter = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); } return (GdkPixbuf*)0; } static gboolean readFavToolShade(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { int val; g_return_val_if_fail(my_class, FALSE); g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readInteger(lines[0], position, &val, 1, error)) return FALSE; if (val < 0) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d: prefered shade must be positive.\n"), position); return FALSE; } my_class->favToolShade = (guint)val; return TRUE; } static void exportParameters(GString *data, VisuData* dataObj _U_, VisuGlView *view _U_) { g_return_if_fail(my_class); g_string_append_printf(data, "# %s\n", DESC_PARAMETER_FAVSHADE); g_string_append_printf(data, "%s[gtk]: %d\n\n", FLAG_PARAMETER_FAVSHADE, my_class->favToolShade); } v_sim-3.7.0/src/extraGtkFunctions/gtk_shadeComboBoxWidget.h0000644000353400050620000000762512215546105020744 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef GTK_SHADECOMBOBOXWIDGET_H #define GTK_SHADECOMBOBOXWIDGET_H #include #include #include #include G_BEGIN_DECLS /** * VISU_UI_TYPE_SHADE_COMBOBOX: * * Return: the associated #GType to the VisuUiShadeCombobox objects. * * Since: 3.3 */ #define VISU_UI_TYPE_SHADE_COMBOBOX (visu_ui_shade_combobox_get_type ()) /** * VISU_UI_SHADE_COMBOBOX: * @obj: the widget to cast. * * Cast the given object to a #VisuUiShadeCombobox object. * * Since: 3.3 */ #define VISU_UI_SHADE_COMBOBOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VISU_UI_TYPE_SHADE_COMBOBOX, VisuUiShadeCombobox)) /** * VISU_UI_SHADE_COMBOBOX_CLASS: * @klass: the class to cast. * * Cast the given class to a #VisuUiShadeComboboxClass object. * * Since: 3.3 */ #define VISU_UI_SHADE_COMBOBOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VISU_UI_TYPE_SHADE_COMBOBOX, VisuUiShadeComboboxClass)) /** * VISU_UI_IS_SHADE_COMBOBOX: * @obj: the object to test. * * Get if the given object is a valid #VisuUiShadeCombobox object. * * Since: 3.3 */ #define VISU_UI_IS_SHADE_COMBOBOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VISU_UI_TYPE_SHADE_COMBOBOX)) /** * VISU_UI_IS_SHADE_COMBOBOX_CLASS: * @klass: the class to test. * * Get if the given class is a valid #VisuUiShadeComboboxClass class. * * Since: 3.3 */ #define VISU_UI_IS_SHADE_COMBOBOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VISU_UI_TYPE_SHADE_COMBOBOX)) typedef struct _VisuUiShadeCombobox VisuUiShadeCombobox; typedef struct _VisuUiShadeComboboxClass VisuUiShadeComboboxClass; GType visu_ui_shade_combobox_get_type(void); GtkWidget* visu_ui_shade_combobox_new(gboolean hasAlphaChannel, gboolean showNames); gboolean visu_ui_shade_combobox_setSelectionByShade(VisuUiShadeCombobox* shadeComboBox, ToolShade *shade); ToolShade* visu_ui_shade_combobox_getSelection(VisuUiShadeCombobox *shadeComboBox); GdkPixbuf* visu_ui_shade_combobox_getStamp(VisuUiShadeCombobox *shadeComboBox, ToolShade *shade); GdkPixbuf* visu_ui_shade_combobox_buildStamp(ToolShade *shade, GdkPixbuf *pixbuf); G_END_DECLS #endif v_sim-3.7.0/src/extraGtkFunctions/gtk_elementComboBox.c0000644000353400050620000005004412215546105020131 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse mèl : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include "gtk_elementComboBox.h" #include #include #include #include /** * SECTION:gtk_elementComboBox * @short_description: Defines a specialised #GtkComboBox to choose #VisuElement. * * This widget looks like a #GtkComboBox and it displays a list * of #VisuElement currently used by the displayed data. * * Since: 3.6 */ enum { ELEMENT_SELECTED_SIGNAL, LAST_SIGNAL }; /* This enum is used to access the column of the GtkListStore that contains the informations of stroed shades. */ enum { /* This is a pointer to a label that describes the element. */ COLUMN_ELEMENT_LABEL, /* This a pointer to the VisuElement */ COLUMN_ELEMENT_POINTER_TO, /* This column control the visibility of the VisuElement. */ COLUMN_ELEMENT_VISIBLE, N_COLUMN_ELEMENT }; static void visu_ui_element_combobox_dispose (GObject *obj); static void visu_ui_element_combobox_finalize(GObject *obj); static guint visu_ui_element_combobox_signals[LAST_SIGNAL] = { 0 }; /** * VisuUiElementCombobox: * * An opaque structure defining a #VisuUiElementCombobox widget. * * Since: 3.6 */ struct _VisuUiElementCombobox { GtkComboBox comboElement; GtkTreeModel *filter; gulong onChanged; gpointer previousSelection; gboolean hasAllSelector; gboolean hasNoneSelector; gboolean showUnPhysical; gchar *format; /* Memory gestion. */ gboolean dispose_has_run; }; /** * VisuUiElementComboboxClass: * * An opaque structure defining the class of a #VisuUiElementCombobox widget. * * Since: 3.6 */ struct _VisuUiElementComboboxClass { GtkComboBoxClass parent_class; void (*elementComboBox) (VisuUiElementCombobox *shadeCombo); /* This listStore contains all the elements known by widgets of this class. It is used as TreeModel for the combobox in the widget. */ GtkListStore *storedElements; gulong newElementSignalId, popDef_signal; gboolean disableChangeSignal; }; static VisuUiElementComboboxClass *my_class = (VisuUiElementComboboxClass*)0; /* Local callbacks. */ static void onChanged(GtkComboBox *widget, gpointer user_data); static gboolean onElementNewHook(GSignalInvocationHint *ihint, guint nvalues, const GValue *param_values, gpointer data); static void onDataReady(VisuUiElementComboboxClass *klass, VisuData *data, VisuGlView *view, gpointer user_data); static void onDataNotReady(VisuUiElementComboboxClass *klass, VisuData *data, VisuGlView *view, gpointer user_data); static void onPopulationDefined(VisuNodeArray *array, guint nEle, gpointer data); static void onDataReadySelection(VisuUiElementCombobox *combo, VisuData *data, VisuGlView *view, gpointer user_data); /* Local methods. */ static void addElementToModel(GtkTreeIter *iter, VisuUiElementComboboxClass* klass, gpointer element); static void printLabel(GtkCellLayout *layout, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data); static gboolean showLabel(GtkTreeModel *model, GtkTreeIter *iter, gpointer data); /** * visu_ui_element_combobox_get_type: * * Internal routine, retrieves the type of #VisuUiElementCombobox * objects. Use VISU_UI_TYPE_ELEMENT_COMBOBOX macro instead. * * Since: 3.6 */ G_DEFINE_TYPE(VisuUiElementCombobox, visu_ui_element_combobox, GTK_TYPE_COMBO_BOX) static void visu_ui_element_combobox_class_init(VisuUiElementComboboxClass *klass) { GtkTreeIter iter; GList *elementLst; DBG_fprintf(stderr, "VisuUi ElementCombobox: creating the class of the widget.\n"); DBG_fprintf(stderr, " - adding new signals ;\n"); /** * VisuUiElementCombobox::element-selected: * @combo: the #VisuUiElementCombobox that emits the signal ; * @element: the newly selected #VisuElement. * * This signal is emitted when a new element is selected. * * Since: 3.6 */ visu_ui_element_combobox_signals[ELEMENT_SELECTED_SIGNAL] = g_signal_new ("element-selected", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (VisuUiElementComboboxClass, elementComboBox), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); DBG_fprintf(stderr, " - initializing the listStore of elements.\n"); /* Init the listStore of elements. */ klass->storedElements = gtk_list_store_new(N_COLUMN_ELEMENT, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOOLEAN); addElementToModel(&iter, klass, (gpointer)0); addElementToModel(&iter, klass, GINT_TO_POINTER(1)); for (elementLst = (GList*)visu_element_getAllElements(); elementLst; elementLst = g_list_next(elementLst)) addElementToModel(&iter, klass, elementLst->data); /* Connect freeing methods. */ G_OBJECT_CLASS(klass)->dispose = visu_ui_element_combobox_dispose; G_OBJECT_CLASS(klass)->finalize = visu_ui_element_combobox_finalize; g_signal_add_emission_hook(g_signal_lookup("ElementNew", VISU_TYPE_ELEMENT), 0, onElementNewHook, (gpointer)klass, (GDestroyNotify)0); g_signal_connect_swapped(VISU_OBJECT_INSTANCE, "dataRendered", G_CALLBACK(onDataReady), (gpointer)klass); g_signal_connect_swapped(VISU_OBJECT_INSTANCE, "dataUnRendered", G_CALLBACK(onDataNotReady), (gpointer)klass); my_class = klass; klass->disableChangeSignal = FALSE; } static void visu_ui_element_combobox_dispose(GObject *obj) { DBG_fprintf(stderr, "VisuUi ElementCombobox: dispose object %p.\n", (gpointer)obj); if (VISU_UI_ELEMENT_COMBOBOX(obj)->dispose_has_run) return; VISU_UI_ELEMENT_COMBOBOX(obj)->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_element_combobox_parent_class)->dispose(obj); } static void visu_ui_element_combobox_finalize(GObject *obj) { g_return_if_fail(obj); DBG_fprintf(stderr, "VisuUi ElementCombobox: finalize object %p.\n", (gpointer)obj); if (VISU_UI_ELEMENT_COMBOBOX(obj)->format) g_free(VISU_UI_ELEMENT_COMBOBOX(obj)->format); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_element_combobox_parent_class)->finalize(obj); DBG_fprintf(stderr, " | freeing ... OK.\n"); } static void visu_ui_element_combobox_init(VisuUiElementCombobox *elementComboBox) { DBG_fprintf(stderr, "VisuUi ElementCombobox: initializing new object (%p).\n", (gpointer)elementComboBox); elementComboBox->hasAllSelector = FALSE; elementComboBox->hasNoneSelector = FALSE; elementComboBox->showUnPhysical = FALSE; elementComboBox->format = g_strdup("%s"); elementComboBox->dispose_has_run = FALSE; elementComboBox->previousSelection = (gpointer)0; g_signal_connect_swapped(VISU_OBJECT_INSTANCE, "dataRendered", G_CALLBACK(onDataReadySelection), (gpointer)elementComboBox); } /** * visu_ui_element_combobox_new: * @hasAllSelector: a boolean. * @hasNoneSelector: a boolean. * @format: (allow-none): a string (can be NULL). * * Creates a #GtkComboBox with a list of available #VisuElement. This * list can contain in addition a "all" value if @hasAllSelector is * TRUE, or a "None" value if @hasNoneSelector is TRUE. The @format * parameter is used to specify the text for each row of the * #GtkComboBox. If @formt is NULL, just the name of the element is printed. * * Since: 3.6 * * Returns: (transfer full): a newly created widget. */ GtkWidget* visu_ui_element_combobox_new(gboolean hasAllSelector, gboolean hasNoneSelector, const gchar *format) { VisuUiElementCombobox *wd; GObjectClass *klass; GtkCellRenderer *renderer; DBG_fprintf(stderr, "VisuUi ElementCombobox: creating new object with format: '%s'.\n", format); wd = VISU_UI_ELEMENT_COMBOBOX(g_object_new(visu_ui_element_combobox_get_type (), NULL)); wd->hasAllSelector = hasAllSelector; wd->hasNoneSelector = hasNoneSelector; if (format) { g_free(wd->format); wd->format = g_strdup(format); } DBG_fprintf(stderr, "VisuUi ElementCombobox: build widgets.\n"); klass = G_OBJECT_GET_CLASS(wd); wd->filter = gtk_tree_model_filter_new (GTK_TREE_MODEL(VISU_UI_ELEMENT_COMBOBOX_CLASS(klass)->storedElements), (GtkTreePath*)0); gtk_combo_box_set_model(GTK_COMBO_BOX(wd), wd->filter); g_object_unref(wd->filter); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(wd->filter), showLabel, wd, (GDestroyNotify)0); gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(wd->filter)); DBG_fprintf(stderr, "VisuUi ElementCombobox: use filter %p.\n", (gpointer)wd->filter); renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(wd), renderer, TRUE); gtk_cell_layout_set_cell_data_func(GTK_CELL_LAYOUT(wd), renderer, printLabel, (gpointer)wd, (GDestroyNotify)0); wd->onChanged = g_signal_connect(G_OBJECT(wd), "changed", G_CALLBACK(onChanged), (gpointer)wd); gtk_combo_box_set_active(GTK_COMBO_BOX(wd), (hasAllSelector)?1:0); return GTK_WIDGET(wd); } static gboolean onElementNewHook(GSignalInvocationHint *ihint _U_, guint nvalues _U_, const GValue *param_values, gpointer data) { GtkTreeIter iter; VisuElement *ele; DBG_fprintf(stderr, "VisuUi ElementCombobox: found a new element.\n"); ele = VISU_ELEMENT(g_value_get_object(param_values)); addElementToModel(&iter, VISU_UI_ELEMENT_COMBOBOX_CLASS(data), (gpointer)ele); return TRUE; } static void onChanged(GtkComboBox *widget, gpointer user_data _U_) { GtkTreeIter iter; gpointer *data; GList *lst; if (VISU_UI_ELEMENT_COMBOBOX_GET_CLASS(widget)->disableChangeSignal) return; if (!gtk_combo_box_get_active_iter(widget, &iter)) return; DBG_fprintf(stderr, "VisuUi ElementCombobox: internal combobox changed signal.\n"); gtk_tree_model_get(VISU_UI_ELEMENT_COMBOBOX(widget)->filter, &iter, COLUMN_ELEMENT_POINTER_TO, &data, -1); if (data != VISU_UI_ELEMENT_COMBOBOX(widget)->previousSelection) { VISU_UI_ELEMENT_COMBOBOX(widget)->previousSelection = data; lst = visu_ui_element_combobox_getSelection(VISU_UI_ELEMENT_COMBOBOX(widget)); DBG_fprintf(stderr, "VisuUi ElementCombobox: emitting 'element-selected'" " signal with list %p.\n", (gpointer)lst); g_signal_emit(G_OBJECT(widget), visu_ui_element_combobox_signals[ELEMENT_SELECTED_SIGNAL], 0, (gpointer)lst, NULL); DBG_fprintf(stderr, " | free list\n"); if (lst) g_list_free(lst); DBG_fprintf(stderr, " | OK\n"); } else DBG_fprintf(stderr, "VisuUi ElementCombobox: aborting 'element-selected' signal.\n"); } static void addElementToModel(GtkTreeIter *iter, VisuUiElementComboboxClass* klass, gpointer element) { gboolean visible; g_return_if_fail(iter && klass); DBG_fprintf(stderr, "VisuUi ElementCombobox: appending a new element '%p'.\n", element); visible = (element && GPOINTER_TO_INT(element) != 1)?FALSE:TRUE; gtk_list_store_append(klass->storedElements, iter); gtk_list_store_set(klass->storedElements, iter, COLUMN_ELEMENT_VISIBLE , visible, COLUMN_ELEMENT_POINTER_TO , element, -1); } static void printLabel(GtkCellLayout *layout _U_, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { gpointer pt; gchar *str; gtk_tree_model_get(model, iter, COLUMN_ELEMENT_POINTER_TO, &pt, -1); if (!pt) g_object_set(G_OBJECT(cell), "text", _("None"), NULL); else if (GPOINTER_TO_INT(pt) == 1) g_object_set(G_OBJECT(cell), "text", _("All elements"), NULL); else { str = g_strdup_printf(VISU_UI_ELEMENT_COMBOBOX(data)->format, ((VisuElement*)pt)->name); g_object_set(G_OBJECT(cell), "text", str, NULL); g_free(str); } } static gboolean showLabel(GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { gpointer pt; gboolean visible; gtk_tree_model_get(model, iter, COLUMN_ELEMENT_POINTER_TO, &pt, COLUMN_ELEMENT_VISIBLE, &visible, -1); DBG_fprintf(stderr, "VisuUi ElementCombobox: filter entry '%s' %p for model %p -> %d.\n", (GPOINTER_TO_INT(pt) != 0 && GPOINTER_TO_INT(pt) != 1)?VISU_ELEMENT(pt)->name:"None", (gpointer)pt, (gpointer)model, (!pt && VISU_UI_ELEMENT_COMBOBOX(data)->hasNoneSelector) || (pt && GPOINTER_TO_INT(pt) == 1 && VISU_UI_ELEMENT_COMBOBOX(data)->hasAllSelector) || (pt && GPOINTER_TO_INT(pt) != 1 && visible)); return (!pt && VISU_UI_ELEMENT_COMBOBOX(data)->hasNoneSelector) || (pt && GPOINTER_TO_INT(pt) == 1 && VISU_UI_ELEMENT_COMBOBOX(data)->hasAllSelector) || (pt && GPOINTER_TO_INT(pt) != 1 && visible && (VISU_UI_ELEMENT_COMBOBOX(data)->showUnPhysical || visu_element_getPhysical(VISU_ELEMENT(pt)))); } /** * visu_ui_element_combobox_setSelection: * @wd: a #VisuUiElementCombobox widget. * @name: a string. * * Select a #VisuElement by providing its name. * * Since: 3.6 * * Returns: TRUE if the given element exists. */ gboolean visu_ui_element_combobox_setSelection(VisuUiElementCombobox* wd, const gchar *name) { GtkTreeIter iter; gboolean valid; gpointer *pt; g_return_val_if_fail(VISU_UI_IS_ELEMENT_COMBOBOX(wd) && name, FALSE); DBG_fprintf(stderr, "VisuUi ElementCombobox: select a new element '%s'.\n", name); for (valid = gtk_tree_model_get_iter_first(wd->filter, &iter); valid; valid = gtk_tree_model_iter_next(wd->filter, &iter)) { gtk_tree_model_get(wd->filter, &iter, COLUMN_ELEMENT_POINTER_TO, &pt, -1); if (pt && GPOINTER_TO_INT(pt) != 1 && !strcmp(((VisuElement*)pt)->name, name)) { gtk_combo_box_set_active_iter(GTK_COMBO_BOX(wd), &iter); return TRUE; } } return FALSE; } /** * visu_ui_element_combobox_getSelection: * @wd: a #VisuUiElementCombobox widget. * * Provide a list of selected elements. * * Since: 3.6 * * Returns: (transfer container) (element-type VisuElement*): a newly * created list of #VisuElement. It should be freed later with * g_list_free(). */ GList* visu_ui_element_combobox_getSelection(VisuUiElementCombobox *wd) { GtkTreeIter iter; gpointer *data; GList *lst; gboolean valid; g_return_val_if_fail(VISU_UI_IS_ELEMENT_COMBOBOX(wd), (GList*)0); if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(wd), &iter)) return (GList*)0; gtk_tree_model_get(wd->filter, &iter, COLUMN_ELEMENT_POINTER_TO, &data, -1); lst = (GList*)0; if (GPOINTER_TO_INT(data) == 1) for (valid = gtk_tree_model_get_iter_first(wd->filter, &iter); valid; valid = gtk_tree_model_iter_next(wd->filter, &iter)) { gtk_tree_model_get(wd->filter, &iter, COLUMN_ELEMENT_POINTER_TO, &data, -1); if (data && GPOINTER_TO_INT(data) != 1 && visu_element_getPhysical(VISU_ELEMENT(data))) lst = g_list_prepend(lst, data); } else if (data) lst = g_list_prepend(lst, data); DBG_fprintf(stderr, "VisuUi ElementCombobox: return a list of %d elements.\n", g_list_length(lst)); return lst; } static void refreshCombo(VisuUiElementComboboxClass *klass, VisuNodeArray *array) { gboolean valid; GtkTreeIter child; GtkTreeModel *model; gpointer pt; klass->disableChangeSignal = TRUE; model = GTK_TREE_MODEL(klass->storedElements); for (valid = gtk_tree_model_get_iter_first(model, &child); valid; valid = gtk_tree_model_iter_next(model, &child)) { gtk_tree_model_get(model, &child, COLUMN_ELEMENT_POINTER_TO, &pt, -1); if (pt && GPOINTER_TO_INT(pt) != 1 && array && visu_node_array_getElementId(array, VISU_ELEMENT(pt)) >= 0) gtk_list_store_set(klass->storedElements, &child, COLUMN_ELEMENT_VISIBLE, TRUE, -1); else gtk_list_store_set(klass->storedElements, &child, COLUMN_ELEMENT_VISIBLE, FALSE, -1); } klass->disableChangeSignal = FALSE; } static void onDataReady(VisuUiElementComboboxClass *klass, VisuData *data, VisuGlView *view _U_, gpointer user_data _U_) { DBG_fprintf(stderr, "VisuUi ElementCombobox: set visible elements from data %p.\n", (gpointer)data); if (data) refreshCombo(klass, VISU_NODE_ARRAY(data)); else refreshCombo(klass, (VisuNodeArray*)0); if (data) klass->popDef_signal = g_signal_connect(G_OBJECT(data), "PopulationDefined", G_CALLBACK(onPopulationDefined), (gpointer)klass); } static void onDataNotReady(VisuUiElementComboboxClass *klass, VisuData *data, VisuGlView *view _U_, gpointer user_data _U_) { DBG_fprintf(stderr, "VisuUi ElementCombobox: unset visible elements from data %p.\n", (gpointer)data); g_signal_handler_disconnect(G_OBJECT(data), klass->popDef_signal); } static void onPopulationDefined(VisuNodeArray *array, guint nEle _U_, gpointer data) { DBG_fprintf(stderr, "VisuUi ElementCombobox: refresh list on population defined.\n"); refreshCombo(VISU_UI_ELEMENT_COMBOBOX_CLASS(data), array); } static void onDataReadySelection(VisuUiElementCombobox *combo, VisuData *data, VisuGlView *view _U_, gpointer user_data _U_) { if (!data) return; if (gtk_combo_box_get_active(GTK_COMBO_BOX(combo)) < 0) gtk_combo_box_set_active(GTK_COMBO_BOX(combo), MIN((combo->hasAllSelector)?1:0, gtk_tree_model_iter_n_children(combo->filter, (GtkTreeIter*)0) - 1)); } /** * visu_ui_element_combobox_setUnphysicalStatus: * @wd: a #VisuUiElementCombobox object ; * @status: a boolean * * If @status is TRUE, the combobox will also show elements that are * tagged unphysical, see visu_element_getPhysical(). * * Since: 3.7 */ void visu_ui_element_combobox_setUnphysicalStatus(VisuUiElementCombobox* wd, gboolean status) { g_return_if_fail(VISU_UI_IS_ELEMENT_COMBOBOX(wd)); wd->showUnPhysical = status; } v_sim-3.7.0/src/extraGtkFunctions/gtk_elementComboBox.h0000644000353400050620000001012412215546105020131 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse mèl : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef GTK_ELEMENTCOMBOBOX_H #define GTK_ELEMENTCOMBOBOX_H #include G_BEGIN_DECLS /** * VISU_UI_TYPE_ELEMENT_COMBOBOX: * * Return the associated #GType to the #VisuUiElementCombobox objects. * * Since: 3.6 */ #define VISU_UI_TYPE_ELEMENT_COMBOBOX (visu_ui_element_combobox_get_type ()) /** * VISU_UI_ELEMENT_COMBOBOX: * @obj: the widget to cast. * * Cast the given object to a #VisuUiElementCombobox object. * * Since: 3.6 */ #define VISU_UI_ELEMENT_COMBOBOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VISU_UI_TYPE_ELEMENT_COMBOBOX, VisuUiElementCombobox)) /** * VISU_UI_ELEMENT_COMBOBOX_CLASS: * @klass: the class to cast. * * Cast the given class to a #VisuUiElementCombobox object. * * Since: 3.6 */ #define VISU_UI_ELEMENT_COMBOBOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VISU_UI_TYPE_ELEMENT_COMBOBOX, VisuUiElementComboboxClass)) /** * VISU_UI_IS_ELEMENT_COMBOBOX: * @obj: the object to test. * * Return if the given object is a valid #VisuUiElementCombobox object. * * Since: 3.6 */ #define VISU_UI_IS_ELEMENT_COMBOBOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VISU_UI_TYPE_ELEMENT_COMBOBOX)) /** * VISU_UI_IS_ELEMENT_COMBOBOX_CLASS: * @klass: the class to test. * * Return if the given class is a valid #VisuUiElementComboboxClass class. * * Since: 3.6 */ #define VISU_UI_IS_ELEMENT_COMBOBOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VISU_UI_TYPE_ELEMENT_COMBOBOX)) /** * VISU_UI_ELEMENT_COMBOBOX_GET_CLASS: * @obj: the widget to get the class of. * * Get the class of the given object. * * Since: 3.6 */ #define VISU_UI_ELEMENT_COMBOBOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_UI_TYPE_ELEMENT_COMBOBOX, VisuUiElementComboboxClass)) typedef struct _VisuUiElementCombobox VisuUiElementCombobox; typedef struct _VisuUiElementComboboxClass VisuUiElementComboboxClass; GType visu_ui_element_combobox_get_type(void); GtkWidget* visu_ui_element_combobox_new(gboolean hasAllSelector, gboolean hasNoneSelector, const gchar *format); GList* visu_ui_element_combobox_getSelection(VisuUiElementCombobox *wd); gboolean visu_ui_element_combobox_setSelection(VisuUiElementCombobox* wd, const gchar *name); void visu_ui_element_combobox_setUnphysicalStatus(VisuUiElementCombobox* wd, gboolean status); G_END_DECLS #endif v_sim-3.7.0/src/extraGtkFunctions/gtk_stippleComboBoxWidget.c0000644000353400050620000004224112215546105021324 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include "gtk_stippleComboBoxWidget.h" #include /** * SECTION:gtk_stippleComboBoxWidget * @short_description: Defines a specialised #GtkComboBox to choose * patterns for lines. * @see_also: #VisuUiShadeCombobox * * This widget looks like a #GtkComboBox and it displays a list * of preset patterns for line. These patterns are defined by a * guint16 value that is given to OpenGL for line stipple. * This widget can emit a #VisuUiStippleCombobox::stipple-selected * signal that is a wrapper around the #GtkComboBox::changed signal, * but it is emitted only when a stipple is selected and this stipple * is passed to the call back. * * Since: 3.4 */ enum { STIPPLE_SELECTED_SIGNAL, LAST_SIGNAL }; /* This enum is used to access the column of the GtkListStore that contains the informations of stroed shades. */ enum { /* This has a pointer to an image to represent the stipple. */ COLUMN_STIPPLE_PIXBUF, /* This is a pointer to a label that describes the stipple. */ COLUMN_STIPPLE_LABEL, /* This is the value of the stipple. */ COLUMN_STIPPLE_VALUE, N_COLUMN_STIPPLE }; /* Store a tree model to remember stipples. */ #define STIPPLE_BOX_WIDTH 32 #define STIPPLE_BOX_HEIGHT 3 #define STIPPLE_BOX_BITS 8 static void visu_ui_stipple_combobox_dispose (GObject *obj); static void visu_ui_stipple_combobox_finalize(GObject *obj); static guint visu_ui_stipple_combobox_signals[LAST_SIGNAL] = { 0 }; /** * VisuUiStippleCombobox: * * Private structure to store informations of a #VisuUiStippleCombobox object. * * Since: 3.4 */ struct _VisuUiStippleCombobox { GtkComboBox comboStipple; guint16 previousStipple; /* Memory gestion. */ gboolean dispose_has_run; }; /** * VisuUiStippleComboboxClass * * Private structure to store informations of a #VisuUiStippleComboboxClass object. * * Since: 3.4 */ struct _VisuUiStippleComboboxClass { GtkComboBoxClass parent_class; void (*stippleComboBox) (VisuUiStippleCombobox *stippleCombo); /* This listStore contains all the stipples known by widgets of this class. It is used as TreeModel for the combobox in the widget. */ GtkListStore *listStoredStipples; gulong stippleAddedSignalId; }; /* Built-in stipple values. */ static guint16 builtInStipples[] = {65535, 43690, 52428, 61680, 65280, 58596, 57568, 49344, 65340, 0}; /* Local callbacks. */ static void visu_ui_stipple_combobox_changed(VisuUiStippleCombobox *stippleComboBox, gpointer data _U_); /* Local methods. */ static void addStippleToModel(GtkTreeIter *iter, VisuUiStippleComboboxClass* klass, guint16 value); static void buildWidgets(VisuUiStippleCombobox *stippleComboBox); /** * visu_ui_stipple_combobox_get_type * * #GType are unique numbers to identify objects. * * Returns: the #GType associated with #VisuUiStippleCombobox objects. * * Since: 3.4 */ G_DEFINE_TYPE(VisuUiStippleCombobox, visu_ui_stipple_combobox, GTK_TYPE_COMBO_BOX) static void visu_ui_stipple_combobox_class_init(VisuUiStippleComboboxClass *klass) { GtkTreeIter iter; int i; DBG_fprintf(stderr, "Gtk VisuUiStippleCombobox: creating the class of the widget.\n"); DBG_fprintf(stderr, " - adding new signals ;\n"); /** * VisuUiStippleCombobox::stipple-selected: * @combo: the #VisuUiStippleCombobox that emits the signal ; * @stipple: the value of the newly selected line patter. * * This signal is emitted when a new valid line pattern is selected. * * Since: 3.4 */ visu_ui_stipple_combobox_signals[STIPPLE_SELECTED_SIGNAL] = g_signal_new ("stipple-selected", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (VisuUiStippleComboboxClass, stippleComboBox), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); DBG_fprintf(stderr, " - initializing the listStore of stipples.\n"); /* Init the listStore of stipples. */ klass->listStoredStipples = gtk_list_store_new(N_COLUMN_STIPPLE, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_UINT); for (i = 0; builtInStipples[i]; i++) addStippleToModel(&iter, klass, builtInStipples[i]); /* Connect freeing methods. */ G_OBJECT_CLASS(klass)->dispose = visu_ui_stipple_combobox_dispose; G_OBJECT_CLASS(klass)->finalize = visu_ui_stipple_combobox_finalize; } static void visu_ui_stipple_combobox_dispose(GObject *obj) { DBG_fprintf(stderr, "Gtk VisuUiStippleCombobox: dispose object %p.\n", (gpointer)obj); if (VISU_UI_STIPPLE_COMBOBOX(obj)->dispose_has_run) return; VISU_UI_STIPPLE_COMBOBOX(obj)->dispose_has_run = TRUE; /* Chain up to the parent class */ DBG_fprintf(stderr, " | chain to parent\n"); G_OBJECT_CLASS(visu_ui_stipple_combobox_parent_class)->dispose(obj); DBG_fprintf(stderr, " | disposing ... OK.\n"); } static void visu_ui_stipple_combobox_finalize(GObject *obj) { g_return_if_fail(obj); DBG_fprintf(stderr, "Gtk VisuUiStippleCombobox: finalize object %p.\n", (gpointer)obj); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_stipple_combobox_parent_class)->finalize(obj); DBG_fprintf(stderr, " | freeing ... OK.\n"); } static void visu_ui_stipple_combobox_init(VisuUiStippleCombobox *stippleComboBox) { DBG_fprintf(stderr, "Gtk VisuUiStippleCombobox: initializing new object (%p).\n", (gpointer)stippleComboBox); stippleComboBox->previousStipple = (guint16)0; stippleComboBox->dispose_has_run = FALSE; } static void buildWidgets(VisuUiStippleCombobox *stippleComboBox) { GObjectClass *klass; GtkCellRenderer *renderer; klass = G_OBJECT_GET_CLASS(stippleComboBox); gtk_combo_box_set_model(GTK_COMBO_BOX(stippleComboBox), GTK_TREE_MODEL(VISU_UI_STIPPLE_COMBOBOX_CLASS(klass)->listStoredStipples)); renderer = gtk_cell_renderer_pixbuf_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(stippleComboBox), renderer, FALSE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(stippleComboBox), renderer, "pixbuf", COLUMN_STIPPLE_PIXBUF); /* renderer = gtk_cell_renderer_text_new(); */ /* gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(stippleComboBox), renderer, FALSE); */ /* gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(stippleComboBox), renderer, */ /* "markup", COLUMN_STIPPLE_LABEL); */ gtk_combo_box_set_active(GTK_COMBO_BOX(stippleComboBox), 0); g_signal_connect(G_OBJECT(stippleComboBox), "changed", G_CALLBACK(visu_ui_stipple_combobox_changed), (gpointer)0); } /** * visu_ui_stipple_combobox_new : * * A #VisuUiStippleCombobox widget is like a #GtkComboBox widget, but it is already filled * with predefined line patterns (call stipple). Using this widget is * a convienient way to share stipples between all part of V_Sim and * to give a consistent look of all stipple selection. * * Returns: (transfer full): a newly created #VisuUiStippleCombobox widget. * * Since: 3.4 */ GtkWidget* visu_ui_stipple_combobox_new() { VisuUiStippleCombobox *stippleComboBox; DBG_fprintf(stderr, "Gtk VisuUiStippleCombobox: creating new object.\n"); stippleComboBox = VISU_UI_STIPPLE_COMBOBOX(g_object_new(VISU_UI_TYPE_STIPPLE_COMBOBOX, NULL)); DBG_fprintf(stderr, "Gtk VisuUiStippleCombobox: build widgets.\n"); buildWidgets(stippleComboBox); return GTK_WIDGET(stippleComboBox); } static void visu_ui_stipple_combobox_changed(VisuUiStippleCombobox *stippleComboBox, gpointer data _U_) { int selected; GtkTreeIter iter; GObjectClass *klass; guint stipple; selected = gtk_combo_box_get_active(GTK_COMBO_BOX(stippleComboBox)); DBG_fprintf(stderr, "Gtk VisuUiStippleCombobox: internal combobox changed signal -> %d.\n", selected); if (selected < 0) { stippleComboBox->previousStipple = (guint16)0; /* DBG_fprintf(stderr, "Gtk VisuUiStippleCombobox : emitting 'stipple-selected' signal.\n"); */ /* g_signal_emit(G_OBJECT(stippleComboBox), */ /* visu_ui_stipple_combobox_signals[STIPPLE_SELECTED_SIGNAL], 0, (gpointer)0, NULL); */ return; } gtk_combo_box_get_active_iter(GTK_COMBO_BOX(stippleComboBox), &iter); klass = G_OBJECT_GET_CLASS(stippleComboBox); gtk_tree_model_get(GTK_TREE_MODEL(VISU_UI_STIPPLE_COMBOBOX_CLASS(klass)->listStoredStipples), &iter, COLUMN_STIPPLE_VALUE, &stipple, -1); if ((guint16)(stipple) != stippleComboBox->previousStipple) { stippleComboBox->previousStipple = (guint16)(stipple); DBG_fprintf(stderr, "Gtk VisuUiStippleCombobox: emitting 'stipple-selected'" " signal for value %d.\n", stipple); g_signal_emit(G_OBJECT(stippleComboBox), visu_ui_stipple_combobox_signals[STIPPLE_SELECTED_SIGNAL], 0, stipple, NULL); } else DBG_fprintf(stderr, "Gtk VisuUiStippleCombobox: aborting 'stipple-selected' signal.\n"); } /** * visu_ui_stipple_combobox_class_buildStamp: * @stipple: a pattern value. * * This method is used to create pixbuf representing stipples.A new * pixbuf is created. * * Returns: (transfer full): a pixbuf pointer. * * Since: 3.4 */ GdkPixbuf* visu_ui_stipple_combobox_class_buildStamp(guint16 stipple) { GdkPixbuf *pixbufStippleBox; int rowstride, x, y; guchar *pixels, *p; guint16 coul; pixbufStippleBox = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, STIPPLE_BOX_BITS, STIPPLE_BOX_WIDTH, STIPPLE_BOX_HEIGHT); rowstride = gdk_pixbuf_get_rowstride(pixbufStippleBox); pixels = gdk_pixbuf_get_pixels(pixbufStippleBox); for (x = 0; x < STIPPLE_BOX_WIDTH; x++) { coul = stipple & (1 << ((x+3)%16)); for (y = 0; y < STIPPLE_BOX_HEIGHT; y++) { p = pixels + y * rowstride + x * 4; p[0] = 0; p[1] = 0; p[2] = 0; p[3] = (coul)?255:0; } } return pixbufStippleBox; } void addStippleToModel(GtkTreeIter *iter, VisuUiStippleComboboxClass* klass, guint16 stipple) { GdkPixbuf *pix; gchar *label; g_return_if_fail(iter && klass && stipple); label = g_markup_printf_escaped("(%d)", stipple); pix = visu_ui_stipple_combobox_class_buildStamp(stipple); gtk_list_store_append(klass->listStoredStipples, iter); gtk_list_store_set(klass->listStoredStipples, iter, COLUMN_STIPPLE_PIXBUF, pix, COLUMN_STIPPLE_LABEL, label, COLUMN_STIPPLE_VALUE, (guint)stipple, -1); g_object_unref(pix); g_free(label); DBG_fprintf(stderr, "Gtk VisuUiStippleCombobox: appending a new stipple '%d'.\n", stipple); } /** * visu_ui_stipple_combobox_setSelection: * @stippleComboBox: a #VisuUiStippleCombobox widget ; * @stipple: a pattern value. * * Use this method to set the ComboBox on the given stipple. This emits a 'stipple-channel' * signal if the stipple is changed, which means, a previous stipple has been modified, * or a new stipple is selected. * * Returns: TRUE if the @stipple already exists in the model. * * Since: 3.4 */ gboolean visu_ui_stipple_combobox_setSelection(VisuUiStippleCombobox* stippleComboBox, guint16 stipple) { GtkTreeIter iter; gboolean validIter; GObjectClass *klass; GtkListStore *model; guint tmpStipple; g_return_val_if_fail(stipple && VISU_UI_IS_STIPPLE_COMBOBOX(stippleComboBox), FALSE); DBG_fprintf(stderr, "Gtk VisuUiStippleCombobox: select a new stipple %d.\n", stipple); klass = G_OBJECT_GET_CLASS(stippleComboBox); model = GTK_LIST_STORE(VISU_UI_STIPPLE_COMBOBOX_CLASS(klass)->listStoredStipples); validIter = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter); while (validIter) { gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, COLUMN_STIPPLE_VALUE, &tmpStipple, -1); if ((guint16)(tmpStipple) == stipple) { gtk_combo_box_set_active_iter(GTK_COMBO_BOX(stippleComboBox), &iter); return TRUE; } validIter = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); } return FALSE; } GdkPixbuf* stippleComboBoxGet_selectedPixbuf(VisuUiStippleCombobox *stippleComboBox) { gboolean validIter; GtkTreeIter iter; GdkPixbuf *pixbuf; GObjectClass *klass; g_return_val_if_fail(VISU_UI_IS_STIPPLE_COMBOBOX(stippleComboBox), (GdkPixbuf*)0); validIter = gtk_combo_box_get_active_iter(GTK_COMBO_BOX(stippleComboBox), &iter); if (!validIter) return (GdkPixbuf*)0; pixbuf = (GdkPixbuf*)0; klass = G_OBJECT_GET_CLASS(stippleComboBox); gtk_tree_model_get(GTK_TREE_MODEL(VISU_UI_STIPPLE_COMBOBOX_CLASS(klass)->listStoredStipples), &iter, COLUMN_STIPPLE_PIXBUF, &pixbuf, -1); return pixbuf; } /** * visu_ui_stipple_combobox_getSelection: * @stippleComboBox: a #VisuUiStippleCombobox widget. * * The user can access to the selected stipple pattern using this method. * * Returns: a pattern value (or 65535). * * Since: 3.4 */ guint16 visu_ui_stipple_combobox_getSelection(VisuUiStippleCombobox *stippleComboBox) { gboolean validIter; GtkTreeIter iter; guint stipple; GObjectClass *klass; g_return_val_if_fail(VISU_UI_IS_STIPPLE_COMBOBOX(stippleComboBox), (guint16)0); validIter = gtk_combo_box_get_active_iter(GTK_COMBO_BOX(stippleComboBox), &iter); if (!validIter) return (guint16)0; klass = G_OBJECT_GET_CLASS(stippleComboBox); gtk_tree_model_get(GTK_TREE_MODEL(VISU_UI_STIPPLE_COMBOBOX_CLASS(klass)->listStoredStipples), &iter, COLUMN_STIPPLE_VALUE, &stipple, -1); return (guint16)stipple; } /** * visu_ui_stipple_combobox_getStamp: * @stippleComboBox: a #VisuUiStippleCombobox widget ; * @stipple: a pattern value. * * The @stippleComboBox has little pixbufs to represent the stipple. User methods can * use these pixbufs but should considered them read-only. * * Returns: (transfer none): a pixbuf pointer corresponding to the * little image shown on the @stippleComboBox. * * Since: 3.4 */ GdkPixbuf* visu_ui_stipple_combobox_getStamp(VisuUiStippleCombobox *stippleComboBox, guint16 stipple) { GtkTreeIter iter; gboolean validIter; GdkPixbuf *pixbuf; guint cl; GtkListStore *model; g_return_val_if_fail(VISU_UI_IS_STIPPLE_COMBOBOX(stippleComboBox) && stipple, (GdkPixbuf*)0); model = VISU_UI_STIPPLE_COMBOBOX_CLASS(G_OBJECT_GET_CLASS(stippleComboBox))->listStoredStipples; validIter = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter); while (validIter) { pixbuf = (GdkPixbuf*)0; gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, COLUMN_STIPPLE_PIXBUF, &pixbuf, COLUMN_STIPPLE_VALUE, &cl, -1); if (stipple == (guint16)cl) return pixbuf; validIter = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); } return (GdkPixbuf*)0; } /** * visu_ui_stipple_combobox_add: * @stippleComboBox: a #VisuUiStippleCombobox widget ; * @stipple: a pattern value. * * Create an entry in the ComboBox for the given @stipple pattern if * it does not already exist. * * Since: 3.4 */ void visu_ui_stipple_combobox_add(VisuUiStippleCombobox *stippleComboBox, guint16 stipple) { GtkTreeIter iter; gboolean validIter; GObjectClass *klass; GtkListStore *model; guint tmpStipple; g_return_if_fail(VISU_UI_IS_STIPPLE_COMBOBOX(stippleComboBox)); /* We test if the stipple already exist or not. */ klass = G_OBJECT_GET_CLASS(stippleComboBox); model = GTK_LIST_STORE(VISU_UI_STIPPLE_COMBOBOX_CLASS(klass)->listStoredStipples); validIter = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter); while (validIter) { gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, COLUMN_STIPPLE_VALUE, &tmpStipple, -1); if ((guint16)(tmpStipple) == stipple) return ; validIter = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); } addStippleToModel(&iter, VISU_UI_STIPPLE_COMBOBOX_CLASS(klass), stipple); } v_sim-3.7.0/src/extraGtkFunctions/gtk_stippleComboBoxWidget.h0000644000353400050620000000761112215546105021333 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef GTK_STIPPLECOMBOBOXWIDGET_H #define GTK_STIPPLECOMBOBOXWIDGET_H #include #include #include G_BEGIN_DECLS /** * VISU_UI_TYPE_STIPPLE_COMBOBOX: * * Get the associated #GType to the VisuUiStippleCombobox objects. * * Since: 3.4 */ #define VISU_UI_TYPE_STIPPLE_COMBOBOX (visu_ui_stipple_combobox_get_type ()) /** * VISU_UI_STIPPLE_COMBOBOX: * @obj: the widget to cast. * * Cast the given object to a #VisuUiStippleCombobox object. * * Since: 3.4 */ #define VISU_UI_STIPPLE_COMBOBOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VISU_UI_TYPE_STIPPLE_COMBOBOX, VisuUiStippleCombobox)) /** * VISU_UI_STIPPLE_COMBOBOX_CLASS: * @klass: the class to cast. * * Cast the given class to a #VisuUiStippleComboboxClass object. * * Since: 3.4 */ #define VISU_UI_STIPPLE_COMBOBOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VISU_UI_TYPE_STIPPLE_COMBOBOX, VisuUiStippleComboboxClass)) /** * VISU_UI_IS_STIPPLE_COMBOBOX: * @obj: the object to test. * * Get if the given object is a valid #VisuUiStippleCombobox object. * * Since: 3.4 */ #define VISU_UI_IS_STIPPLE_COMBOBOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VISU_UI_TYPE_STIPPLE_COMBOBOX)) /** * VISU_UI_IS_STIPPLE_COMBOBOX_CLASS: * @klass: the class to test. * * Get if the given class is a valid #VisuUiStippleComboboxClass class. * * Since: 3.4 */ #define VISU_UI_IS_STIPPLE_COMBOBOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VISU_UI_TYPE_STIPPLE_COMBOBOX)) typedef struct _VisuUiStippleCombobox VisuUiStippleCombobox; typedef struct _VisuUiStippleComboboxClass VisuUiStippleComboboxClass; GType visu_ui_stipple_combobox_get_type(void); GtkWidget* visu_ui_stipple_combobox_new(); gboolean visu_ui_stipple_combobox_setSelection(VisuUiStippleCombobox* stippleComboBox, guint16 stipple); guint16 visu_ui_stipple_combobox_getSelection(VisuUiStippleCombobox *stippleComboBox); GdkPixbuf* visu_ui_stipple_combobox_getStamp(VisuUiStippleCombobox *stippleComboBox, guint16 stipple); GdkPixbuf* visu_ui_stipple_combobox_class_buildStamp(guint16 stipple); void visu_ui_stipple_combobox_add(VisuUiStippleCombobox *stippleComboBox, guint16 stipple); G_END_DECLS #endif v_sim-3.7.0/src/extraGtkFunctions/gtk_lineObjectWidget.c0000644000353400050620000004517712215546105020304 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include "gtk_lineObjectWidget.h" #include "gtk_stippleComboBoxWidget.h" #include "gtk_colorComboBoxWidget.h" #include /** * SECTION:gtk_lineObjectWidget * @short_description: Defines a specialised #GtkBox to choose * all characteristic of lines. * @see_also: #VisuUiColorCombobox and #VisuUiStippleCombobox * * * * Since: 3.4 */ enum { LINE_USE_CHANGED_SIGNAL, LINE_WIDTH_CHANGED_SIGNAL, LINE_STIPPLE_CHANGED_SIGNAL, LINE_COLOR_CHANGED_SIGNAL, LAST_SIGNAL }; static void visu_ui_line_dispose (GObject *obj); static void visu_ui_line_finalize(GObject *obj); static guint visu_ui_line_signals[LAST_SIGNAL] = { 0 }; /** * VisuUiLine: * * Private structure to store informations of a #VisuUiLine object. * * Since: 3.4 */ struct _VisuUiLine { GtkVBox box; GtkWidget *expand; GtkWidget *label; GtkWidget *used; GtkWidget *width; GtkWidget *stipple; GtkWidget *rgRGB[3]; GtkWidget *color; GtkWidget *btColor; gulong rgSignals[3]; gulong colorSignal; /* Memory gestion. */ gboolean dispose_has_run; }; /** * VisuUiLineClass * * Private structure to store informations of a #VisuUiLineClass object. * * Since: 3.4 */ struct _VisuUiLineClass { GtkComboBoxClass parent_class; void (*lineObject) (VisuUiLine *box); }; /* Local callbacks. */ static void onUseChanged(GtkCheckButton *check, VisuUiLine *line); static void onWidthChanged(GtkSpinButton *spin, VisuUiLine *line); static void onStippleChanged(VisuUiStippleCombobox *wd, guint stipple, VisuUiLine *line); static void onRGBValueChanged(GtkRange *rg, VisuUiLine *line); static void onAddClicked(GtkButton *bt, VisuUiLine *line); static void onColorChanged(VisuUiColorCombobox *combo, ToolColor *color, VisuUiLine *line); /* Local methods. */ /** * visu_ui_line_get_type * * #GType are unique numbers to identify objects. * * Returns: the #GType associated with #VisuUiLine objects. * * Since: 3.4 */ G_DEFINE_TYPE(VisuUiLine, visu_ui_line, GTK_TYPE_VBOX) static void visu_ui_line_class_init(VisuUiLineClass *klass) { DBG_fprintf(stderr, "Gtk VisuUiLine: creating the class of the widget.\n"); DBG_fprintf(stderr, " - adding new signals ;\n"); /** * VisuUiLine::use-changed: * @line: the #VisuUiLine that emits the signal ; * @used: TRUE if the line is used. * * This signal is emitted when the usage check box is changed. * * Since: 3.4 */ visu_ui_line_signals[LINE_USE_CHANGED_SIGNAL] = g_signal_new ("use-changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (VisuUiLineClass, lineObject), NULL, NULL, g_cclosure_marshal_VOID__BOOLEAN, G_TYPE_NONE, 1, G_TYPE_BOOLEAN); /** * VisuUiLine::width-changed: * @line: the #VisuUiLine that emits the signal ; * @width: the new width. * * This signal is emitted when the width of the line is changed. * * Since: 3.4 */ visu_ui_line_signals[LINE_WIDTH_CHANGED_SIGNAL] = g_signal_new ("width-changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (VisuUiLineClass, lineObject), NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); /** * VisuUiLine::stipple-changed: * @line: the #VisuUiLine that emits the signal ; * @stipple: the new stipple pattern. * * This signal is emitted when the stipple pattern of the line is changed. * * Since: 3.4 */ visu_ui_line_signals[LINE_STIPPLE_CHANGED_SIGNAL] = g_signal_new ("stipple-changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (VisuUiLineClass, lineObject), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * VisuUiLine::color-changed: * @line: the #VisuUiLine that emits the signal ; * @color: the new color values (three RGB values). * * This signal is emitted when the colour of the line is changed. * * Since: 3.4 */ visu_ui_line_signals[LINE_COLOR_CHANGED_SIGNAL] = g_signal_new ("color-changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (VisuUiLineClass, lineObject), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); /* Connect freeing methods. */ G_OBJECT_CLASS(klass)->dispose = visu_ui_line_dispose; G_OBJECT_CLASS(klass)->finalize = visu_ui_line_finalize; } static void visu_ui_line_dispose(GObject *obj) { DBG_fprintf(stderr, "Gtk VisuUiLine: dispose object %p.\n", (gpointer)obj); if (VISU_UI_LINE(obj)->dispose_has_run) return; VISU_UI_LINE(obj)->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_line_parent_class)->dispose(obj); } static void visu_ui_line_finalize(GObject *obj) { g_return_if_fail(obj); DBG_fprintf(stderr, "Gtk VisuUiLine: finalize object %p.\n", (gpointer)obj); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_line_parent_class)->finalize(obj); DBG_fprintf(stderr, " | freeing ... OK.\n"); } static void visu_ui_line_init(VisuUiLine *line) { GtkWidget *vbox, *hbox, *label, *align, *table; char *rgb[3]; char *rgbName[3] = {"scroll_r", "scroll_g", "scroll_b"}; int i; DBG_fprintf(stderr, "Gtk VisuUiLine: initializing new object (%p).\n", (gpointer)line); gtk_box_set_spacing(GTK_BOX(line), 5); /********************/ /* The header line. */ /********************/ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(line), hbox, FALSE, FALSE, 0); /* The drawn checkbox. */ line->used = gtk_check_button_new(); align = gtk_alignment_new(.5, 0., 0, 0); gtk_box_pack_start(GTK_BOX(hbox), align, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(align), line->used); g_signal_connect(G_OBJECT(line->used), "toggled", G_CALLBACK(onUseChanged), (gpointer)line); /* The expander. */ line->expand = gtk_expander_new(""); gtk_box_pack_start(GTK_BOX(hbox), line->expand, TRUE, TRUE, 0); /* The label. */ hbox = gtk_hbox_new(FALSE, 30); line->label = gtk_label_new(""); gtk_misc_set_alignment(GTK_MISC(line->label), 0., 0.5); gtk_widget_set_name(line->label, "label_head"); gtk_box_pack_start(GTK_BOX(hbox), line->label, TRUE, FALSE, 0); label = gtk_label_new(_("" "expand for options")); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_expander_set_label_widget(GTK_EXPANDER(line->expand), hbox); /* The insider. */ vbox = gtk_vbox_new(FALSE, 2); gtk_container_add(GTK_CONTAINER(line->expand), vbox); hbox = gtk_hbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); /*******************/ /* The scale line. */ /*******************/ /* The label. */ label = gtk_label_new(_("Line style:")); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); /* The scale width spin button. */ align = gtk_alignment_new(1., 0.5, 1, 1); gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, 5, 0); gtk_box_pack_start(GTK_BOX(hbox), align, FALSE, FALSE, 0); label = gtk_label_new(_("width:")); gtk_container_add(GTK_CONTAINER(align), label); line->width = gtk_spin_button_new_with_range(1., 10., 1.); gtk_entry_set_width_chars(GTK_ENTRY(line->width), 2); gtk_box_pack_start(GTK_BOX(hbox), line->width, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(line->width), "value-changed", G_CALLBACK(onWidthChanged), (gpointer)line); /* px for pixel. */ label = gtk_label_new(_("px")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2); /* The stipple pattern. */ align = gtk_alignment_new(1., 0.5, 1, 1); gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, 5, 0); gtk_box_pack_start(GTK_BOX(hbox), align, FALSE, FALSE, 3); line->stipple = visu_ui_stipple_combobox_new(); gtk_container_add(GTK_CONTAINER(align), line->stipple); g_signal_connect(G_OBJECT(line->stipple), "stipple-selected", G_CALLBACK(onStippleChanged), (gpointer)line); /********************/ /* The colour line. */ /********************/ hbox = gtk_hbox_new(FALSE, 10); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); /* The table for the box colour. */ table = gtk_table_new(3, 2, FALSE); gtk_box_pack_end(GTK_BOX(hbox), table, TRUE, TRUE, 0); rgb[0] = _("R:"); rgb[1] = _("G:"); rgb[2] = _("B:"); for (i = 0; i < 3; i++) { label = gtk_label_new(rgb[i]); gtk_table_attach(GTK_TABLE(table), label, 0, 1, i, i + 1, GTK_SHRINK, GTK_SHRINK, 0, 0); line->rgRGB[i] = gtk_hscale_new_with_range(0., 1., 0.001); gtk_scale_set_value_pos(GTK_SCALE(line->rgRGB[i]), GTK_POS_RIGHT); gtk_range_set_value(GTK_RANGE(line->rgRGB[i]), 0.741456963); gtk_widget_set_name(line->rgRGB[i], rgbName[i]); gtk_table_attach(GTK_TABLE(table), line->rgRGB[i], 1, 2, i, i + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 3, 0); line->rgSignals[i] = g_signal_connect(G_OBJECT(line->rgRGB[i]), "value-changed", G_CALLBACK(onRGBValueChanged), (gpointer)line); } vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); label = gtk_label_new(_("color:")); line->color = visu_ui_color_combobox_new(FALSE); line->colorSignal = g_signal_connect(G_OBJECT(line->color), "color-selected", G_CALLBACK(onColorChanged), (gpointer)line); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); visu_ui_color_combobox_setPrintValues(VISU_UI_COLOR_COMBOBOX(line->color), FALSE); gtk_box_pack_start(GTK_BOX(hbox), line->color, FALSE, FALSE, 0); align = gtk_alignment_new(0.5, 0.5, 0, 1); gtk_box_pack_end(GTK_BOX(hbox), align, FALSE, FALSE, 0); line->btColor = gtk_button_new(); gtk_container_add(GTK_CONTAINER(align), line->btColor); gtk_container_add(GTK_CONTAINER(line->btColor), gtk_image_new_from_stock (GTK_STOCK_GO_BACK, GTK_ICON_SIZE_MENU)); label = gtk_label_new(_("(preset)")); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 1., 0.5); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(line->btColor), "clicked", G_CALLBACK(onAddClicked), (gpointer)line); gtk_widget_show_all(GTK_WIDGET(line)); } /** * visu_ui_line_new : * @label: the name of the group, output in bold. * * A #VisuUiLine widget is a widget allowing to choose the * properties of a line. These properties are the line stipple * pattern, its colour and its width. The colour is available through * #GtkRange and with a #VisuUiColorCombobox widget. There is also a * checkbox allowing to turn the line on or off. * * Returns: (transfer full): a newly created #VisuUiLine widget. * * Since: 3.4 */ GtkWidget* visu_ui_line_new(const gchar* label) { VisuUiLine *line; gchar *markup; DBG_fprintf(stderr, "Gtk VisuUiLine: creating new object.\n"); line = VISU_UI_LINE(g_object_new(visu_ui_line_get_type(), NULL)); DBG_fprintf(stderr, "Gtk VisuUiLine: build widgets.\n"); markup = g_markup_printf_escaped("%s", label); gtk_label_set_markup(GTK_LABEL(line->label), markup); g_free(markup); return GTK_WIDGET(line); } static void onUseChanged(GtkCheckButton *check, VisuUiLine *line) { g_signal_emit(G_OBJECT(line), visu_ui_line_signals[LINE_USE_CHANGED_SIGNAL], 0, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check)), NULL); } static void onWidthChanged(GtkSpinButton *spin, VisuUiLine *line) { g_signal_emit(G_OBJECT(line), visu_ui_line_signals[LINE_WIDTH_CHANGED_SIGNAL], 0, (gint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin)), NULL); } static void onStippleChanged(VisuUiStippleCombobox *wd _U_, guint stipple, VisuUiLine *line) { g_signal_emit(G_OBJECT(line), visu_ui_line_signals[LINE_STIPPLE_CHANGED_SIGNAL], 0, stipple, NULL); } static void onRGBValueChanged(GtkRange *rg _U_, VisuUiLine *line) { float rgba[4]; int i; g_return_if_fail(VISU_UI_IS_LINE(line)); rgba[0] = gtk_range_get_value(GTK_RANGE(line->rgRGB[0])); rgba[1] = gtk_range_get_value(GTK_RANGE(line->rgRGB[1])); rgba[2] = gtk_range_get_value(GTK_RANGE(line->rgRGB[2])); rgba[3] = 1.f; tool_color_getByValues(&i, rgba[0], rgba[1], rgba[2], rgba[3]); g_signal_handler_block(G_OBJECT(line->color), line->colorSignal); if (i < 0) gtk_combo_box_set_active(GTK_COMBO_BOX(line->color), -1); else gtk_combo_box_set_active(GTK_COMBO_BOX(line->color), i + 1); g_signal_handler_unblock(G_OBJECT(line->color), line->colorSignal); gtk_widget_set_sensitive(line->btColor, (i < 0)); g_signal_emit(G_OBJECT(line), visu_ui_line_signals[LINE_COLOR_CHANGED_SIGNAL], 0, (gpointer)rgba, NULL); } static void onAddClicked(GtkButton *bt _U_, VisuUiLine *line) { float rgba[4]; int selected; g_return_if_fail(VISU_UI_IS_LINE(line)); DBG_fprintf(stderr, "Gtk VisuUiLine: adding a new color from ranges.\n"); rgba[0] = gtk_range_get_value(GTK_RANGE(line->rgRGB[0])); rgba[1] = gtk_range_get_value(GTK_RANGE(line->rgRGB[1])); rgba[2] = gtk_range_get_value(GTK_RANGE(line->rgRGB[2])); rgba[3] = 1.f; tool_color_addFloatRGBA(rgba, &selected); g_signal_handler_block(G_OBJECT(line->color), line->colorSignal); gtk_combo_box_set_active(GTK_COMBO_BOX(line->color), selected); g_signal_handler_unblock(G_OBJECT(line->color), line->colorSignal); gtk_widget_set_sensitive(line->btColor, FALSE); } static void onColorChanged(VisuUiColorCombobox *combo _U_, ToolColor *color, VisuUiLine *line) { visu_ui_line_setColor(line, color->rgba); } /** * visu_ui_line_setUsed: * @line: the object to modify ; * @status: a boolean. * * The line can be turn on or off, call this routine to change the * interface status. * * Since: 3.4 */ void visu_ui_line_setUsed(VisuUiLine *line, gboolean status) { g_return_if_fail(VISU_UI_IS_LINE(line)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(line->used), status); } /** * visu_ui_line_setWidth: * @line: the object to modify ; * @width: a value. * * The line can be drawn with a given width, call this routine to change the * interface value. * * Since: 3.4 */ void visu_ui_line_setWidth(VisuUiLine *line, gint width) { g_return_if_fail(VISU_UI_IS_LINE(line) && width > 0 && width < 11); gtk_spin_button_set_value(GTK_SPIN_BUTTON(line->width), (gdouble)width); } /** * visu_ui_line_setColor: * @line: the object to modify ; * @rgb: a RGB array. * * The line can is drawn in a given colour. Change the interface * values using this routine. The colour ranges are updated and if it * correspond to a registered colour, it is selected in the combobox. * * Since: 3.4 */ void visu_ui_line_setColor(VisuUiLine *line, float rgb[3]) { gboolean change; g_return_if_fail(VISU_UI_IS_LINE(line)); g_signal_handler_block(G_OBJECT(line->rgRGB[0]), line->rgSignals[0]); g_signal_handler_block(G_OBJECT(line->rgRGB[1]), line->rgSignals[1]); g_signal_handler_block(G_OBJECT(line->rgRGB[2]), line->rgSignals[2]); change = FALSE; if ((float)gtk_range_get_value(GTK_RANGE(line->rgRGB[0])) != rgb[0]) { change = TRUE; gtk_range_set_value(GTK_RANGE(line->rgRGB[0]), rgb[0]); } if ((float)gtk_range_get_value(GTK_RANGE(line->rgRGB[1])) != rgb[1]) { change = TRUE; gtk_range_set_value(GTK_RANGE(line->rgRGB[1]), rgb[1]); } if ((float)gtk_range_get_value(GTK_RANGE(line->rgRGB[2])) != rgb[2]) { change = TRUE; gtk_range_set_value(GTK_RANGE(line->rgRGB[2]), rgb[2]); } g_signal_handler_unblock(G_OBJECT(line->rgRGB[0]), line->rgSignals[0]); g_signal_handler_unblock(G_OBJECT(line->rgRGB[1]), line->rgSignals[1]); g_signal_handler_unblock(G_OBJECT(line->rgRGB[2]), line->rgSignals[2]); if (change) onRGBValueChanged((GtkRange*)0, line); } /** * visu_ui_line_setStipple: * @line: the object to modify ; * @stipple: a value. * * The line can be drawn with a given stipple pattern, call this * routine to change the interface value. * * Since: 3.4 */ void visu_ui_line_setStipple(VisuUiLine *line, guint16 stipple) { g_return_if_fail(VISU_UI_IS_LINE(line)); if (!visu_ui_stipple_combobox_setSelection(VISU_UI_STIPPLE_COMBOBOX(line->stipple), stipple)) { visu_ui_stipple_combobox_add(VISU_UI_STIPPLE_COMBOBOX(line->stipple), stipple); visu_ui_stipple_combobox_setSelection(VISU_UI_STIPPLE_COMBOBOX(line->stipple), stipple); } } /** * visu_ui_line_getOptionBox: * @line: the object to get the GtkVBox. * * Give access to the #GtkVBox of the expander. * * Since: 3.6 * * Returns: (transfer none): a #GtkWidget. */ GtkWidget* visu_ui_line_getOptionBox(VisuUiLine *line) { g_return_val_if_fail(VISU_UI_IS_LINE(line), (GtkWidget*)0); return gtk_bin_get_child(GTK_BIN(line->expand)); } v_sim-3.7.0/src/extraGtkFunctions/gtk_lineObjectWidget.h0000644000353400050620000000660512215546105020302 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef GTK_LINEOBJECTWIDGET_H #define GTK_LINEOBJECTWIDGET_H #include #include G_BEGIN_DECLS /** * VISU_UI_TYPE_LINE: * * Get the associated #GType to the VisuUiLine objects. * * Since: 3.4 */ #define VISU_UI_TYPE_LINE (visu_ui_line_get_type ()) /** * VISU_UI_LINE: * @obj: the widget to cast. * * Cast the given object to a #VisuUiLine object. * * Since: 3.4 */ #define VISU_UI_LINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VISU_UI_TYPE_LINE, VisuUiLine)) /** * VISU_UI_LINE_CLASS: * @klass: the class to cast. * * Cast the given class to a #VisuUiLineClass object. * * Since: 3.4 */ #define VISU_UI_LINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VISU_UI_TYPE_LINE, VisuUiLineClass)) /** * VISU_UI_IS_LINE: * @obj: the object to test. * * Get if the given object is a valid #VisuUiLine object. * * Since: 3.4 */ #define VISU_UI_IS_LINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VISU_UI_TYPE_LINE)) /** * VISU_UI_IS_LINE_CLASS: * @klass: the class to test. * * Get if the given class is a valid #VisuUiLineClass class. * * Since: 3.4 */ #define VISU_UI_IS_LINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VISU_UI_TYPE_LINE)) typedef struct _VisuUiLine VisuUiLine; typedef struct _VisuUiLineClass VisuUiLineClass; GType visu_ui_line_get_type(void); GtkWidget* visu_ui_line_new(const gchar *label); void visu_ui_line_setUsed(VisuUiLine *line, gboolean status); void visu_ui_line_setWidth(VisuUiLine *line, gint width); void visu_ui_line_setColor(VisuUiLine *line, float rgb[3]); void visu_ui_line_setStipple(VisuUiLine *line, guint16 stipple); GtkWidget* visu_ui_line_getOptionBox(VisuUiLine *line); G_END_DECLS #endif v_sim-3.7.0/src/extraGtkFunctions/gtk_valueIOWidget.c0000644000353400050620000004610412215546105017561 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include "gtk_valueIOWidget.h" #include #include #include /** * SECTION:gtk_valueIOWidget * @short_description: Defines a specialised #GtkHBox with three * button to open, save and save as XML value files. * * * * Since: 3.5 */ static void visu_ui_value_io_dispose (GObject *obj); static void visu_ui_value_io_finalize(GObject *obj); /** * VisuUiValueIo: * * Private structure to store informations of a #VisuUiValueIo object. * * Since: 3.5 */ struct _VisuUiValueIo { GtkHBox hbox; GtkWidget *btExportOpen, *btExportSave, *btExportSaveAs; #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkWidget *dialog; #endif GtkWindow *parent; VisuUiValueIoCallback ioOpen; gulong openSignalId; VisuUiValueIoCallback ioSave; gulong saveSignalId; gulong saveAsSignalId; /* Memory gestion. */ gboolean dispose_has_run; }; /** * VisuUiValueIoClass * * Private structure to store informations of a #VisuUiValueIoClass object. * * Since: 3.5 */ struct _VisuUiValueIoClass { GtkComboBoxClass parent_class; void (*valueio) (VisuUiValueIo *hbox); }; /* Local callbacks. */ #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 11 static void onImportXML(GtkFileChooserButton *filechooserbutton, gpointer data); #else static void onImportXML(GtkDialog *dialog, gint response, gpointer data); #endif #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 6 static void onOpenXMLClicked(GtkButton *bt, gpointer data); #endif static void onExportXML(GtkButton *button, gpointer data); /* Local methods. */ /** * visu_ui_value_io_get_type * * #GType are unique numbers to identify objects. * * Returns: the #GType associated with #VisuUiValueIo objects. * * Since: 3.5 */ G_DEFINE_TYPE(VisuUiValueIo, visu_ui_value_io, GTK_TYPE_HBOX) static void visu_ui_value_io_class_init(VisuUiValueIoClass *klass) { DBG_fprintf(stderr, "Gtk VisuUiValueIo: creating the class of the widget.\n"); /* Connect freeing methods. */ G_OBJECT_CLASS(klass)->dispose = visu_ui_value_io_dispose; G_OBJECT_CLASS(klass)->finalize = visu_ui_value_io_finalize; } static void visu_ui_value_io_dispose(GObject *obj) { DBG_fprintf(stderr, "Gtk VisuUiValueIo: dispose object %p.\n", (gpointer)obj); if (VISU_UI_VALUE_IO(obj)->dispose_has_run) return; VISU_UI_VALUE_IO(obj)->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_value_io_parent_class)->dispose(obj); } static void visu_ui_value_io_finalize(GObject *obj) { g_return_if_fail(obj); DBG_fprintf(stderr, "Gtk VisuUiValueIo: finalize object %p.\n", (gpointer)obj); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_value_io_parent_class)->finalize(obj); DBG_fprintf(stderr, " | freeing ... OK.\n"); } static void visu_ui_value_io_init(VisuUiValueIo *valueio) { DBG_fprintf(stderr, "Gtk VisuUiValueIo: initializing new object (%p).\n", (gpointer)valueio); valueio->ioOpen = (VisuUiValueIoCallback)0; valueio->openSignalId = 0; valueio->ioSave = (VisuUiValueIoCallback)0; valueio->saveSignalId = 0; valueio->saveAsSignalId = 0; } static void buildWidgets(VisuUiValueIo *valueio, GtkWindow *parent, const gchar*tipsOpen, const gchar*tipsSave, const gchar*tipsSaveAs) { GtkFileFilter *filter1, *filter2; char *directory; #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkTooltips *tooltips; tooltips = gtk_tooltips_new(); #endif valueio->parent = parent; /* The save as button. */ valueio->btExportSaveAs = gtk_button_new(); gtk_widget_set_tooltip_text(valueio->btExportSaveAs, tipsSaveAs); gtk_widget_set_sensitive(valueio->btExportSaveAs, FALSE); gtk_container_add(GTK_CONTAINER(valueio->btExportSaveAs), gtk_image_new_from_stock(GTK_STOCK_SAVE_AS, GTK_ICON_SIZE_MENU)); gtk_box_pack_end(GTK_BOX(valueio), valueio->btExportSaveAs, FALSE, FALSE, 0); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 /* The save button. */ valueio->btExportSave = gtk_button_new(); gtk_widget_set_tooltip_text(valueio->btExportSave, tipsSave); gtk_widget_set_sensitive(valueio->btExportSave, FALSE); gtk_container_add(GTK_CONTAINER(valueio->btExportSave), gtk_image_new_from_stock(GTK_STOCK_SAVE, GTK_ICON_SIZE_MENU)); gtk_box_pack_end(GTK_BOX(valueio), valueio->btExportSave, FALSE, FALSE, 0); #endif /* The open button. */ filter1 = gtk_file_filter_new(); gtk_file_filter_set_name(filter1, _("V_Sim value file (*.xml)")); gtk_file_filter_add_pattern(filter1, "*.xml"); filter2 = gtk_file_filter_new (); gtk_file_filter_set_name(filter2, _("All files")); gtk_file_filter_add_pattern (filter2, "*"); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 11 valueio->btExportOpen = gtk_file_chooser_button_new(_("Open a V_Sim value file"), GTK_FILE_CHOOSER_ACTION_OPEN); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(valueio->btExportOpen), filter1); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(valueio->btExportOpen), filter2); #else valueio->dialog = gtk_file_chooser_dialog_new (_("Open a V_Sim value file"), parent, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(valueio->dialog), filter1); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(valueio->dialog), filter2); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 valueio->btExportOpen = gtk_file_chooser_button_new_with_dialog(valueio->dialog); #else valueio->btExportOpen = gtk_button_new_from_stock(GTK_STOCK_OPEN); #endif #endif #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 directory = visu_ui_getLastOpenDirectory(); if (directory) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(valueio->btExportOpen), directory); #endif gtk_widget_set_tooltip_text(valueio->btExportOpen, tipsOpen); gtk_widget_set_sensitive(valueio->btExportOpen, FALSE); gtk_box_pack_end(GTK_BOX(valueio), valueio->btExportOpen, TRUE, TRUE, 0); /* The label. */ gtk_box_pack_end(GTK_BOX(valueio), gtk_label_new(_("I/O:")), FALSE, FALSE, 0); } /** * visu_ui_value_io_new: * @parent: the parent used to show the file dialog. * @tipsOpen: a tooltip to show on open button. * @tipsSave: a tooltip to show on save button. * @tipsSaveAs: a tooltip to show on save-as button. * * A #VisuUiValueIo widget is like a #GtkComboBox widget, but it is already filled * with predefined line patterns (call stipple). Using this widget is * a convienient way to share stipples between all part of V_Sim and * to give a consistent look of all stipple selection. * * Since: 3.5 * * Returns: (transfer full): a newly created #VisuUiValueIo widget. */ GtkWidget* visu_ui_value_io_new(GtkWindow *parent, const gchar*tipsOpen, const gchar*tipsSave, const gchar*tipsSaveAs) { VisuUiValueIo *valueio; DBG_fprintf(stderr, "Gtk VisuUiValueIo: creating new object.\n"); valueio = VISU_UI_VALUE_IO(g_object_new(visu_ui_value_io_get_type (), NULL)); DBG_fprintf(stderr, "Gtk VisuUiValueIo: build widgets.\n"); buildWidgets(valueio, parent, tipsOpen, tipsSave, tipsSaveAs); return GTK_WIDGET(valueio); } /** * visu_ui_value_io_connectOnOpen: * @valueio: a #VisuUiValueIo widget. * @open: a method. * * Set the function to call when the open button is clicked. * * Since: 3.5 */ void visu_ui_value_io_connectOnOpen(VisuUiValueIo *valueio, VisuUiValueIoCallback open) { g_return_if_fail(VISU_UI_IS_VALUE_IO(valueio)); if (valueio->openSignalId) { #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 11 g_signal_handler_disconnect(G_OBJECT(valueio->btExportOpen), valueio->openSignalId); #else g_signal_handler_disconnect(G_OBJECT(valueio->dialog), valueio->openSignalId); #endif #else g_signal_handler_disconnect(G_OBJECT(valueio->btExportOpen), valueio->openSignalId); #endif } valueio->ioOpen = open; #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 11 valueio->openSignalId = g_signal_connect(G_OBJECT(valueio->btExportOpen), "file-set", G_CALLBACK(onImportXML), (gpointer)valueio); #else valueio->openSignalId = g_signal_connect(G_OBJECT(valueio->dialog), "response", G_CALLBACK(onImportXML), (gpointer)valueio); #endif #else valueio->openSignalId = g_signal_connect(G_OBJECT(valueio->btExportOpen), "clicked", G_CALLBACK(onOpenXMLClicked), (gpointer)valueio); #endif } /** * visu_ui_value_io_connectOnSave: * @valueio: a #VisuUiValueIo widget. * @save: a method. * * Set the function to call when the save or save-as button is clicked. * * Since: 3.5 */ void visu_ui_value_io_connectOnSave(VisuUiValueIo *valueio, VisuUiValueIoCallback save) { g_return_if_fail(VISU_UI_IS_VALUE_IO(valueio)); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 if (valueio->saveSignalId) g_signal_handler_disconnect(G_OBJECT(valueio->btExportSave), valueio->saveSignalId); #endif if (valueio->saveAsSignalId) g_signal_handler_disconnect(G_OBJECT(valueio->btExportSaveAs), valueio->saveAsSignalId); valueio->ioSave = save; valueio->saveAsSignalId = g_signal_connect(G_OBJECT(valueio->btExportSaveAs), "clicked", G_CALLBACK(onExportXML), (gpointer)valueio); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 valueio->saveSignalId = g_signal_connect(G_OBJECT(valueio->btExportSave), "clicked", G_CALLBACK(onExportXML), (gpointer)valueio); #endif } static gboolean loadXMLFile(gpointer data) { gchar *filename; GError *error; g_return_val_if_fail(VISU_UI_IS_VALUE_IO(data), FALSE); g_return_val_if_fail(VISU_UI_VALUE_IO(data)->ioOpen, FALSE); filename = g_object_get_data(G_OBJECT(data), "filename"); g_return_val_if_fail(filename, FALSE); error = (GError*)0; if (!VISU_UI_VALUE_IO(data)->ioOpen(filename, &error)) { visu_ui_raiseWarning (_("Import V_Sim values from a file."), error->message, VISU_UI_VALUE_IO(data)->parent); g_error_free(error); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 gtk_file_chooser_unselect_all(GTK_FILE_CHOOSER(VISU_UI_VALUE_IO(data)->btExportOpen)); gtk_widget_set_sensitive(VISU_UI_VALUE_IO(data)->btExportSave, FALSE); #endif } g_free(filename); g_object_set_data(G_OBJECT(data), "filename", (gpointer)0); return FALSE; } #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 11 static void onImportXML(GtkFileChooserButton *filechooserbutton, gpointer data) { gchar *filename; filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filechooserbutton)); if (!filename) return; g_object_set_data(G_OBJECT(data), "filename", filename); g_idle_add(loadXMLFile, (gpointer)data); } #else static void onImportXML(GtkDialog *dialog, gint response, gpointer data) { gchar *filename; if (response != GTK_RESPONSE_ACCEPT) return; filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); g_object_set_data(G_OBJECT(data), "filename", filename); g_idle_add(loadXMLFile, (gpointer)data); } #endif #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 6 static void onOpenXMLClicked(GtkButton *bt _U_, gpointer data) { gchar *filename; if (gtk_dialog_run(GTK_DIALOG(VISU_UI_VALUE_IO(data)->dialog)) != GTK_RESPONSE_ACCEPT) return; filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(VISU_UI_VALUE_IO(data)->dialog)); g_object_set_data(G_OBJECT(data), "filename", filename); g_idle_add(loadXMLFile, (gpointer)data); } #endif /** * visu_ui_value_io_getFilename: * @parent: a parent to display the dialog on. * * Open a save dialog window with XML filter to choose the name of a * file. This is the default action that can be connect to a #VisuUiValueIo * widget using visu_ui_value_io_connectOnSave(). * * Since: 3.5 * * Returns: a filename that should be freed later with g_free() by the caller. */ gchar* visu_ui_value_io_getFilename(GtkWindow *parent) { GtkWidget *saveDialog; gchar *filename, *directory; GtkFileFilter *filter; saveDialog = gtk_file_chooser_dialog_new (_("Export V_Sim values to a file."), parent, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); gtk_window_set_modal(GTK_WINDOW(saveDialog), TRUE); gtk_window_set_transient_for(GTK_WINDOW(saveDialog), GTK_WINDOW(parent)); gtk_window_set_position(GTK_WINDOW(saveDialog), GTK_WIN_POS_CENTER_ON_PARENT); directory = visu_ui_getLastOpenDirectory(); if (directory) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(saveDialog), directory); gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(saveDialog), FALSE); gtk_dialog_set_default_response(GTK_DIALOG(saveDialog), GTK_RESPONSE_ACCEPT); filter = gtk_file_filter_new (); gtk_file_filter_set_name(filter, _("V_Sim value files (*.xml)")); gtk_file_filter_add_pattern(filter, "*.xml"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(saveDialog), filter); filter = gtk_file_filter_new (); gtk_file_filter_set_name(filter, _("All files")); gtk_file_filter_add_pattern (filter, "*"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(saveDialog), filter); /* A suggested filename. */ gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(saveDialog), _("values.xml")); if (gtk_dialog_run(GTK_DIALOG(saveDialog)) != GTK_RESPONSE_ACCEPT) { gtk_widget_destroy(saveDialog); return (gchar*)0; } filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(saveDialog)); gtk_widget_destroy(saveDialog); return filename; } static gboolean saveXMLFile(gpointer data) { gchar *filename; GError *error; g_return_val_if_fail(VISU_UI_IS_VALUE_IO(data), FALSE); g_return_val_if_fail(VISU_UI_VALUE_IO(data)->ioSave, FALSE); filename = g_object_get_data(G_OBJECT(data), "filename"); g_return_val_if_fail(filename, FALSE); error = (GError*)0; if (!VISU_UI_VALUE_IO(data)->ioSave(filename, &error)) { visu_ui_raiseWarning (_("Export V_Sim values to a file."), error->message, VISU_UI_VALUE_IO(data)->parent); g_error_free(error); } #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 else { #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 11 g_signal_handler_block(G_OBJECT(VISU_UI_VALUE_IO(data)->btExportOpen), VISU_UI_VALUE_IO(data)->openSignalId); #endif gtk_file_chooser_set_filename (GTK_FILE_CHOOSER(VISU_UI_VALUE_IO(data)->btExportOpen), filename); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 11 g_signal_handler_unblock(G_OBJECT(VISU_UI_VALUE_IO(data)->btExportOpen), VISU_UI_VALUE_IO(data)->openSignalId); #endif } #endif g_free(filename); g_object_set_data(G_OBJECT(data), "filename", (gpointer)0); return FALSE; } static void onExportXML(GtkButton *button, gpointer data) { gchar *filename; if (button == GTK_BUTTON(VISU_UI_VALUE_IO(data)->btExportSave)) filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(VISU_UI_VALUE_IO(data)->btExportOpen)); else filename = visu_ui_value_io_getFilename(VISU_UI_VALUE_IO(data)->parent); if (filename) { g_object_set_data(G_OBJECT(data), "filename", filename); g_idle_add(saveXMLFile, (gpointer)data); } } /** * visu_ui_value_io_setSensitiveOpen: * @valueio: a #VisuUiValueIo widget. * @status: a boolean. * * Modify the sensitivity of the open button, depending on @status. * * Since: 3.5 */ void visu_ui_value_io_setSensitiveOpen(VisuUiValueIo *valueio, gboolean status) { g_return_if_fail(VISU_UI_IS_VALUE_IO(valueio)); gtk_widget_set_sensitive(valueio->btExportOpen, status); } /** * visu_ui_value_io_setSensitiveSave: * @valueio: a #VisuUiValueIo widget. * @status: a boolean. * * Modify the sensitivity of the save button, depending on @status. * * Since: 3.5 */ void visu_ui_value_io_setSensitiveSave(VisuUiValueIo *valueio, gboolean status) { gchar *filename; g_return_if_fail(VISU_UI_IS_VALUE_IO(valueio)); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(valueio->btExportOpen)); gtk_widget_set_sensitive(valueio->btExportSave, status && filename); if (filename) g_free(filename); #endif gtk_widget_set_sensitive(valueio->btExportSaveAs, status); } /** * visu_ui_value_io_setFilename: * @valueio: a #VisuUiValueIo widget. * @filename: a location on disk. * * Call the open routine previously set by visu_ui_value_io_connectOnOpen() on * @filename and update the buttons accordingly. * * Since: 3.5 * * Returns: TRUE on success of the open routine. */ gboolean visu_ui_value_io_setFilename(VisuUiValueIo *valueio, const gchar *filename) { gboolean valid; GError *error; g_return_val_if_fail(VISU_UI_IS_VALUE_IO(valueio), FALSE); g_return_val_if_fail(valueio->ioOpen, FALSE); error = (GError*)0; valid = valueio->ioOpen(filename, &error); if (!valid) { visu_ui_raiseWarning (_("Export V_Sim values to a file."), error->message, valueio->parent); g_error_free(error); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 gtk_file_chooser_unselect_all(GTK_FILE_CHOOSER(valueio->btExportOpen)); gtk_widget_set_sensitive(valueio->btExportSave, FALSE); #endif } else { gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(valueio->btExportOpen), filename); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 gtk_widget_set_sensitive(valueio->btExportSave, TRUE); #endif gtk_widget_set_sensitive(valueio->btExportSaveAs, TRUE); } return valid; } v_sim-3.7.0/src/extraGtkFunctions/gtk_valueIOWidget.h0000644000353400050620000001032112215546105017556 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef GTK_STIPPLECOMBOBOXWIDGET_H #define GTK_STIPPLECOMBOBOXWIDGET_H #include #include #include G_BEGIN_DECLS /** * VISU_UI_TYPE_VALUE_IO: * * Get the associated #GType to the VisuUiValueIo objects. * * Since: 3.5 */ #define VISU_UI_TYPE_VALUE_IO (visu_ui_value_io_get_type ()) /** * VISU_UI_VALUE_IO: * @obj: the widget to cast. * * Cast the given object to a #VisuUiValueIo object. * * Since: 3.5 */ #define VISU_UI_VALUE_IO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VISU_UI_TYPE_VALUE_IO, VisuUiValueIo)) /** * VISU_UI_VALUE_IO_CLASS: * @klass: the class to cast. * * Cast the given class to a #VisuUiValueIoClass object. * * Since: 3.5 */ #define VISU_UI_VALUE_IO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VISU_UI_TYPE_VALUE_IO, VisuUiValueIoClass)) /** * VISU_UI_IS_VALUE_IO: * @obj: the object to test. * * Get if the given object is a valid #VisuUiValueIo object. * * Since: 3.5 */ #define VISU_UI_IS_VALUE_IO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VISU_UI_TYPE_VALUE_IO)) /** * VISU_UI_IS_VALUE_IO_CLASS: * @klass: the class to test. * * Get if the given class is a valid #VisuUiValueIoClass class. * * Since: 3.5 */ #define VISU_UI_IS_VALUE_IO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VISU_UI_TYPE_VALUE_IO)) typedef struct _VisuUiValueIo VisuUiValueIo; typedef struct _VisuUiValueIoClass VisuUiValueIoClass; GType visu_ui_value_io_get_type(void); GtkWidget* visu_ui_value_io_new(GtkWindow *parent, const gchar*tipsOpen, const gchar*tipsSave, const gchar*tipsSaveAs); /** * VisuUiValueIoCallback: * @filename: the name of the file to be saved or opened ; * @error: a location to store a possible error. * * Prototypes of functions to be called when an IO file is saved or * opened, see visu_ui_value_io_connectOnOpen() and visu_ui_value_io_connectOnSave(). * * Returns: should return TRUE if the action of the callback succeed. */ typedef gboolean (*VisuUiValueIoCallback)(const gchar *filename, GError **error); void visu_ui_value_io_connectOnOpen(VisuUiValueIo *valueio, VisuUiValueIoCallback open); void visu_ui_value_io_connectOnSave(VisuUiValueIo *valueio, VisuUiValueIoCallback save); void visu_ui_value_io_setSensitiveOpen(VisuUiValueIo *valueio, gboolean status); void visu_ui_value_io_setSensitiveSave(VisuUiValueIo *valueio, gboolean status); gboolean visu_ui_value_io_setFilename(VisuUiValueIo *valueio, const gchar *filename); gchar* visu_ui_value_io_getFilename(GtkWindow *parent); G_END_DECLS #endif v_sim-3.7.0/src/extraGtkFunctions/gtk_curveWidget.c0000644000353400050620000007071712215546105017350 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include #include "gtk_curveWidget.h" #include #include #include #include #include /** * SECTION: gtk_curveWidget * @short_description: A specialised curve widget to draw distance * distribution for pairs. * * This is a psecialised widget to display g(r) * information. * * Since: 3.6 */ /** * VisuUiCurveFrame: * * An opaque structure defining a #VisuUiCurveFrame widget. * * Since: 3.6 */ struct _VisuUiCurveFrame { GtkDrawingArea parent; gboolean dispose_has_run; ToolMatrixScalingFlag scale; float dists[2]; float heights[2]; float hlRange[2]; VisuUiCurveFrameStyle style; gchar *filter; GHashTable *data; guint nSteps; float init, step; }; /** * VisuUiCurveFrameClass: * * An opaque structure defining the class of a #VisuUiCurveFrame widget. * * Since: 3.6 */ struct _VisuUiCurveFrameClass { GtkDrawingAreaClass parent_class; }; #define SPACER "\302\240-\302\240" #define ALL _("All") /** * visu_ui_curve_frame_get_type: * * Internal routine to get #VISU_UI_TYPE_CURVE_FRAME value. * * Since: 3.6 */ G_DEFINE_TYPE (VisuUiCurveFrame, visu_ui_curve_frame, GTK_TYPE_DRAWING_AREA) #if GTK_MAJOR_VERSION < 3 && GTK_MINOR_VERSION < 26 static gboolean visu_ui_curve_frame_expose(GtkWidget *curve, GdkEventExpose *event); #endif static gboolean visu_ui_curve_frame_drawCairo(GtkWidget *curve, cairo_t *cr); static void visu_ui_curve_frame_dispose(GObject *obj); static void visu_ui_curve_frame_finalize(GObject *obj); static void redraw(GtkWidget *widget); static void hashDraw(gpointer key, gpointer value, gpointer usre_data); static void drawData(VisuUiCurveFrame *curve, cairo_t *cr, const gchar *name, const guint *data, double w, double h, double dw, VisuUiCurveFrameStyle style); static void visu_ui_curve_frame_class_init (VisuUiCurveFrameClass *class) { GtkWidgetClass *widget_class; widget_class = GTK_WIDGET_CLASS (class); #if GTK_MAJOR_VERSION < 3 && GTK_MINOR_VERSION < 26 widget_class->expose_event = visu_ui_curve_frame_expose; #else widget_class->draw = visu_ui_curve_frame_drawCairo; #endif G_OBJECT_CLASS(class)->dispose = visu_ui_curve_frame_dispose; G_OBJECT_CLASS(class)->finalize = visu_ui_curve_frame_finalize; } static void visu_ui_curve_frame_init(VisuUiCurveFrame *curve) { curve->dispose_has_run = FALSE; curve->style = CURVE_LINEAR; curve->scale = TOOL_MATRIX_SCALING_LOG; curve->heights[0] = 0.; curve->heights[1] = 5.; curve->hlRange[0] = -1.f; curve->filter = (gchar*)0; curve->data = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); } static void visu_ui_curve_frame_dispose(GObject *obj) { DBG_fprintf(stderr, "Gtk Curve: dispose object %p.\n", (gpointer)obj); if (VISU_UI_CURVE_FRAME(obj)->dispose_has_run) return; VISU_UI_CURVE_FRAME(obj)->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_curve_frame_parent_class)->dispose(obj); } static void visu_ui_curve_frame_finalize(GObject *obj) { g_return_if_fail(obj); DBG_fprintf(stderr, "Gtk Curve: finalize object %p.\n", (gpointer)obj); g_hash_table_destroy(VISU_UI_CURVE_FRAME(obj)->data); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_curve_frame_parent_class)->finalize(obj); DBG_fprintf(stderr, " | freeing ... OK.\n"); } static void redraw(GtkWidget *widget) { cairo_region_t *region; GdkWindow *window; if (!gtk_widget_get_mapped(widget)) return; window = gtk_widget_get_window(widget); region = gdk_window_get_clip_region(GDK_WINDOW(window)); /* redraw the cairo canvas completely by exposing it */ gdk_window_invalidate_region(window, region, TRUE); gdk_window_process_updates(window, TRUE); cairo_region_destroy (region); } static double tickDist(float dists[2], int length, ToolMatrixScalingFlag scale) { #define TICK_SPACE 50.f float s, l, n; n = (float)length / TICK_SPACE; s = (dists[1] - dists[0]) / n; l = log10(s); l = (int)((l < 0.f)?l - 1.f:l); s = s / exp(l * log(10)); if (scale == TOOL_MATRIX_SCALING_LINEAR) { if (s <= 1.25) n = 1.f; else if (s <= 3.75) n = 2.5f; else if (s <= 7.5) n = 5.f; else s = 10.f; } else { if (s <= 5.f) n = 1.f; else n = 10.f; } s = n * exp(l * log(10)); return (double)s; } static gboolean isValidData(const gchar* filter, const gchar *data) { gchar *tmp; gboolean res; if (filter) { tmp = g_strdup_printf("%s"SPACER, filter); res = (!strcmp(data, filter) || strstr(data, tmp)); g_free(tmp); } else res = (!strcmp(data, _("All")) || !strstr(data, SPACER)); return res; } static void setCairoColor(cairo_t *cr, const gchar *filter, const gchar *data) { VisuElement *ele; gchar *tmp; const gchar *name; if (!filter) name = data; else { tmp = g_strdup_printf("%s"SPACER, filter); name = data + strlen(tmp); g_free(tmp); } ele = visu_element_lookup(name); if (ele) cairo_set_source_rgb (cr, ele->rgb[0], ele->rgb[1], ele->rgb[2]); else cairo_set_source_rgb (cr, 0.5, 0.5, 0.5); } struct _drawData { VisuUiCurveFrame *curve; cairo_t *cr; double w; double h; double dw; }; static gboolean visu_ui_curve_frame_drawCairo(GtkWidget *wd, cairo_t *cr) { #define BUF 3. double x, s, f, g, w, h, dw, dh, xp, wl, hl, yp; float *dists, *heights; gchar val[64]; cairo_text_extents_t ext; struct _drawData dt; guint *data; VisuUiCurveFrame *curve; GList *eles, *tmpLst; GtkAllocation allocation; DBG_fprintf(stderr, "Gtk Curve: general redraw.\n"); curve = VISU_UI_CURVE_FRAME(wd); dists = curve->dists; heights = curve->heights; gtk_widget_get_allocation(wd, &allocation); cairo_select_font_face(cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); cairo_set_font_size(cr, 10.0); cairo_text_extents(cr, "10000.", &ext); dw = ext.width + BUF * 2.; dh = ext.height + BUF * 2.; w = (double)allocation.width - dw; h = (double)allocation.height - dh; data = (guint*)g_hash_table_lookup(curve->data, (curve->filter)?curve->filter:ALL); /* the frame itself. */ cairo_set_line_width(cr, 1.); cairo_rectangle(cr, dw - 0.5, 0.5, w, h); cairo_set_source_rgb (cr, 1, 1, 1); cairo_fill_preserve (cr); cairo_set_source_rgb (cr, 0, 0, 0); cairo_stroke (cr); cairo_set_line_width(cr, 2.); DBG_fprintf(stderr, "Gtk Curve: frame done.\n"); /* The highlight zone. */ if (curve->hlRange[0] >= 0.f && data) { wl = w * CLAMP((curve->hlRange[1] - curve->hlRange[0]) / (dists[1] - dists[0]), 0.f, 1.f); cairo_set_source_rgba(cr, 0.05, 0., 1., 0.25); cairo_rectangle(cr, dw + w * CLAMP((curve->hlRange[0] - dists[0])/ (dists[1] - dists[0]), 0.f, 1.f), 0.5, wl, h); cairo_fill(cr); } /* The plots. */ dt.curve = curve; dt.cr = cr; dt.w = w; dt.dw = dw; dt.h = h; if (data && curve->style != CURVE_BAR) drawData(curve, cr, (curve->filter)?curve->filter:ALL, data, w, h, dw, CURVE_BAR); g_hash_table_foreach(curve->data, hashDraw, &dt); if (data && curve->style == CURVE_BAR) drawData(curve, cr, (curve->filter)?curve->filter:ALL, data, w, h, dw, CURVE_LINEAR); DBG_fprintf(stderr, "Gtk Curve: plots done.\n"); /* the ticks & the labels */ cairo_set_source_rgb (cr, 0, 0, 0); cairo_set_line_width(cr, 2.); f = w / (dists[1] - dists[0]); g = 1.f / f; s = tickDist(dists, w, TOOL_MATRIX_SCALING_LINEAR) * f; for (x = - dists[0] * f; x <= w; x += s) if (x >= 0.) { cairo_move_to(cr, dw + x, 0); cairo_line_to(cr, dw + x, 3); cairo_move_to(cr, dw + x, h); cairo_line_to(cr, dw + x, h - 3); cairo_stroke(cr); sprintf(val, "%g", x * g + dists[0]); cairo_text_extents(cr, val, &ext); cairo_move_to(cr, dw + MIN(MAX(0., x - ext.width/2 - ext.x_bearing), w - ext.width - ext.x_bearing), allocation.height - ext.height - ext.y_bearing - BUF); cairo_show_text(cr, val); } if (curve->scale == TOOL_MATRIX_SCALING_LOG) f = h / log(heights[1] + 0.5f); else { f = h / heights[1]; s = tickDist(heights, h, curve->scale); } for (x = (curve->scale == TOOL_MATRIX_SCALING_LOG)?1.:0.; x <= heights[1]; x = (curve->scale == TOOL_MATRIX_SCALING_LOG)?x * 10:x + s) { if (curve->scale == TOOL_MATRIX_SCALING_LOG) { cairo_set_line_width(cr, 1.); for (xp = x * 2.; xp < x * 10.; xp += x) { yp = h - log(xp + 0.5f) * f; cairo_move_to(cr, dw + 0, yp); cairo_line_to(cr, dw + 1.5, yp); cairo_move_to(cr, allocation.width, yp); cairo_line_to(cr, allocation.width - 2.5, yp); cairo_stroke(cr); } xp = h - log(x + 0.5f) * f; } else xp = h - x * f; cairo_set_line_width(cr, 2.); cairo_move_to(cr, dw + 0, xp); cairo_line_to(cr, dw + 3, xp); cairo_move_to(cr, allocation.width, xp); cairo_line_to(cr, allocation.width - 4, xp); cairo_stroke(cr); sprintf(val, "%g", x); cairo_text_extents(cr, val, &ext); cairo_move_to(cr, dw - BUF - ext.width - ext.x_bearing, MIN(MAX(- ext.y_bearing, xp - ext.height/2 - ext.y_bearing), h)); cairo_show_text(cr, val); } DBG_fprintf(stderr, "Gtk Curve: ticks done.\n"); /* The legend. */ eles = g_hash_table_get_keys(curve->data); if (eles) { DBG_fprintf(stderr, "Gtk Curve: rebuild the legend (%d).\n", g_list_length(eles)); wl = 0; s = 0; hl = BUF; for (tmpLst = eles; tmpLst; tmpLst = g_list_next(tmpLst)) if (isValidData(curve->filter, (gchar*)tmpLst->data)) { cairo_text_extents(cr, (gchar*)tmpLst->data, &ext); DBG_fprintf(stderr, " | '%s' -> %fx%fx%f\n", (gchar*)tmpLst->data, ext.width, ext.height, ext.y_bearing); wl = MAX(wl, ext.width); s = MAX(s, -ext.y_bearing - 2.); hl += BUF - ext.y_bearing; } wl += 2 * BUF + BUF + s; hl += BUF; cairo_set_line_width(cr, 1.); cairo_rectangle(cr, dw + 3 + BUF + 0.5, 0.5 + 3 + BUF, wl, hl); cairo_set_source_rgb(cr, 0.67, 0.67, 0.67); cairo_fill_preserve (cr); cairo_set_source_rgb (cr, 0, 0, 0); cairo_stroke (cr); hl = BUF; for (tmpLst = eles; tmpLst; tmpLst = g_list_next(tmpLst)) if (isValidData(curve->filter, (gchar*)tmpLst->data)) { cairo_text_extents(cr, (gchar*)tmpLst->data, &ext); hl -= ext.y_bearing; cairo_move_to(cr, dw + 3 + 3 * BUF + 0.5 + ext.x_bearing + s, 0.5 + 3 + BUF + hl); cairo_set_source_rgb(cr, 0, 0, 0); cairo_show_text(cr, (gchar*)tmpLst->data); cairo_arc(cr, dw + 3 + 2 * BUF + 0.5 + s / 2., 0.5 + 3 + BUF + hl - s / 2., s / 2., 0, 2 * G_PI); setCairoColor(cr, curve->filter, (gchar*)tmpLst->data); cairo_fill(cr); hl += BUF/* + ext.y_bearing + ext.height */; } g_list_free(eles); } DBG_fprintf(stderr, "Gtk Curve: redraw done.\n"); return FALSE; } static void hashDraw(gpointer key, gpointer value, gpointer user_data) { struct _drawData *dt; gchar *tmp; gboolean ret; if (!strcmp(key, ALL)) return; dt = (struct _drawData*)user_data; if (!dt->curve->filter) { if (strstr((gchar*)key, SPACER)) return; } else { tmp = g_strdup_printf("%s"SPACER, dt->curve->filter); ret = (!strstr((gchar*)key, tmp)); g_free(tmp); if (ret) return; } drawData(dt->curve, dt->cr, (gchar*)key, (guint*)value, dt->w, dt->h, dt->dw, dt->curve->style); } static void drawData(VisuUiCurveFrame *curve, cairo_t *cr, const gchar *name, const guint *data, double w, double h, double dw, VisuUiCurveFrameStyle style) { float step, fx, x, fy, y, val, init; int nSteps, i; double bw; VisuPairDistribution dd; guint startStopId[2], pos; cairo_text_extents_t ext; gchar str[25]; init = curve->init; step = curve->step; nSteps = curve->nSteps; setCairoColor(cr, curve->filter, name); bw = MAX(w * step / (curve->dists[1] - curve->dists[0]) - 1., 0.5); if (style == CURVE_BAR) cairo_set_line_width(cr, bw); else cairo_set_line_width(cr, 1.5); cairo_move_to(cr, dw, h - 0.5); fx = w / (curve->dists[1] - curve->dists[0]); if (curve->scale == TOOL_MATRIX_SCALING_LINEAR) fy = (h - 1.) / (curve->heights[1] - curve->heights[0]); else fy = (h - 1.) / log(curve->heights[1] + 0.5); for (i = 0; i < nSteps - 1; i++) if ((val = (step * i + init - curve->dists[0])) >= 0.) { if (style != CURVE_BAR || data[i] > 0) { x = dw + val * fx + bw / 2.; if (style == CURVE_BAR) cairo_move_to(cr, x, h - 0.5); if (curve->scale == TOOL_MATRIX_SCALING_LINEAR) cairo_line_to(cr, x, h - 0.5 - data[i] * fy); else cairo_line_to(cr, x, h - 0.5 - log(MAX(data[i] + 0.5, 1)) * fy); if (style == CURVE_BAR) cairo_stroke(cr); } } if (style != CURVE_BAR) cairo_stroke(cr); if (style != CURVE_BAR) { dd.histo = (guint*)data; dd.nValues = (guint)nSteps; dd.initValue = init; dd.stepValue = step; if (curve->scale == TOOL_MATRIX_SCALING_LINEAR) dd.nNodesEle1 = dd.nNodesEle2 = h / fy / 1.5; else dd.nNodesEle1 = dd.nNodesEle2 = exp(h / fy / 1.5); startStopId[0] = 0; startStopId[1] = (guint)(nSteps - 1); while (visu_pair_distribution_getNextPick(&dd, startStopId, (guint*)0, (guint*)0, &pos)) { sprintf(str, "%6.3f", init + step * pos); val = step * pos + init - curve->dists[0]; cairo_text_extents(cr, str, &ext); x = val * fx + bw / 2. + 1.; x = (x + ext.width >= w)?w - ext.width:x; y = h - 0.5; if (curve->scale == TOOL_MATRIX_SCALING_LINEAR) y -= data[pos] * fy; else y -= log(MAX(data[pos] + 0.5, 1)) * fy; y += ext.height / 2.; y = MAX(y, ext.height + 1.5); cairo_move_to(cr, dw + x, y); cairo_set_source_rgb (cr, 0., 0., 0.); cairo_show_text(cr, str); startStopId[0] = startStopId[1]; startStopId[1] = (guint)(nSteps - 1); } } } #if GTK_MAJOR_VERSION < 3 && GTK_MINOR_VERSION < 26 static gboolean visu_ui_curve_frame_expose(GtkWidget *curve, GdkEventExpose *event) { cairo_t *cr; gboolean res; /* get a cairo_t */ cr = gdk_cairo_create(GDK_DRAWABLE(gtk_widget_get_window(curve))); cairo_rectangle (cr, event->area.x, event->area.y, event->area.width, event->area.height); cairo_clip (cr); res = visu_ui_curve_frame_drawCairo(curve, cr); cairo_destroy (cr); return res; } #endif /** * visu_ui_curve_frame_new: * @distMin: a float. * @distMax: a float (bigger than @distMin). * * It creates a graph that can display distances distribution for * #VisuElement pairing. The display span is given by @distMin and @distMax. * * Since: 3.6 * * Returns: a newly craeted #VisuUiCurveFrame widget. */ GtkWidget *visu_ui_curve_frame_new(float distMin, float distMax) { GtkWidget *obj; g_return_val_if_fail(distMin >= 0.f && distMax > distMin, (GtkWidget*)0); obj = g_object_new(VISU_UI_TYPE_CURVE_FRAME, NULL); g_return_val_if_fail(obj, (GtkWidget*)0); visu_ui_curve_frame_init(VISU_UI_CURVE_FRAME(obj)); VISU_UI_CURVE_FRAME(obj)->dists[0] = distMin; VISU_UI_CURVE_FRAME(obj)->dists[1] = distMax; return obj; } /** * visu_ui_curve_frame_setSpan: * @curve: a #VisuUiCurveFrame widget. * @span: two floats. * * Changes the distance range that is displayed on the curve. * * Since: 3.6 * * Returns: TRUE if the distance displayed is actually changed. */ gboolean visu_ui_curve_frame_setSpan(VisuUiCurveFrame *curve, float span[2]) { gboolean update; g_return_val_if_fail(VISU_UI_IS_CURVE_FRAME(curve), FALSE); g_return_val_if_fail(span[0] >= 0.f && span[1] > span[0], FALSE); update = (curve->dists[0] != span[0] || curve->dists[1] != span[1]); curve->dists[0] = span[0]; curve->dists[1] = span[1]; return update; } /** * visu_ui_curve_frame_getSpan: * @curve: a #VisuUiCurveFrame widget. * @span: a location for two floats. * * Retrieves the distances inside which the distribution is displayed. * * Since: 3.6 */ void visu_ui_curve_frame_getSpan(VisuUiCurveFrame *curve, float span[2]) { g_return_if_fail(VISU_UI_IS_CURVE_FRAME(curve)); span[0] = curve->dists[0]; span[1] = curve->dists[1]; } /** * visu_ui_curve_frame_hasData: * @curve: a #VisuUiCurveFrame widget. * * Retrieve if some distance data have been added to the @curve. * * Since: 3.6 * * Returns: TRUE if the @curve has some data associated. */ gboolean visu_ui_curve_frame_hasData(VisuUiCurveFrame *curve) { g_return_val_if_fail(VISU_UI_IS_CURVE_FRAME(curve), FALSE); return (g_hash_table_size(curve->data) > 0 && curve->step > 0.f); } /** * visu_ui_curve_frame_setData: * @curve: a #VisuUiCurveFrame widget. * @step: the stepping distance. * @min: the minimum distance for the distribution. * @max: the maximum distance for the distribution. * * Compute and allocate the required size to store distributions, see * visu_ui_curve_frame_addData() to actually setup the distribution values. * * Since: 3.6 */ void visu_ui_curve_frame_setData(VisuUiCurveFrame *curve, float step, float min, float max) { guint *storage; g_return_if_fail(VISU_UI_IS_CURVE_FRAME(curve)); g_return_if_fail(min >= 0.f && step >= 0.f && max > min); g_hash_table_remove_all(curve->data); curve->heights[1] = 5.; curve->init = min; curve->step = step; if (step > 0.f) { curve->nSteps = (int)((max - min) / step) + 1; storage = g_malloc0(sizeof(guint) * curve->nSteps); g_hash_table_insert(curve->data, g_strdup(ALL), storage); } else redraw(GTK_WIDGET(curve)); } /** * visu_ui_curve_frame_addData: * @curve: a #VisuUiCurveFrame widget. * @eleName: a string. * @lkName: a string. * @data: an array of frequencies. * @nSteps: the size of @data. * @init: the initial x value for array @data. * @step: the step value to increase x for array @data. * * This routine changes the distribution for element @eleName, with * respect to element @lkName. @data is an array that gives the number @data[i] * of pairs @eleName - @lkName which distance is in (@init + @step * i). * * Since: 3.6 */ void visu_ui_curve_frame_addData(VisuUiCurveFrame *curve, const gchar *eleName, const gchar *lkName, const guint *data, guint nSteps, float init, float step) { guint max, i; guint *storage, *all, *ele1, *ele2; gchar *link1, *link2; g_return_if_fail(VISU_UI_IS_CURVE_FRAME(curve)); g_return_if_fail(eleName && eleName[0] && lkName && lkName[0] && data); g_return_if_fail(curve->nSteps == nSteps && curve->init == init && curve->step == step); link1 = g_strdup_printf("%s"SPACER"%s", eleName, lkName); if (strcmp(eleName, lkName)) link2 = g_strdup_printf("%s"SPACER"%s", lkName, eleName); else link2 = (gchar*)0; DBG_fprintf(stderr, "Gtk Curve: add data for link '%s'.\n", link1); ele1 = (guint*)g_hash_table_lookup(curve->data, eleName); ele2 = (guint*)g_hash_table_lookup(curve->data, lkName); all = (guint*)g_hash_table_lookup(curve->data, ALL); /* Create or replace the link data themselves. */ storage = (guint*)g_hash_table_lookup(curve->data, link1); if (storage) { /* Remove it from the element data and all data. */ g_return_if_fail(all && ele1 && ele2); DBG_fprintf(stderr, "Gtk Curve: remove previously stored" " values for link '%s'.\n", link1); for (i = 0; i < nSteps; i++) { ele1[i] -= storage[i]; if (ele1 != ele2) ele2[i] -= storage[i]; all[i] -= storage[i]; } } DBG_fprintf(stderr, "Gtk Curve: copy histo values.\n"); storage = g_memdup(data, sizeof(int) * nSteps); g_hash_table_insert(curve->data, link1, (gpointer)storage); if (link2) { storage = g_memdup(data, sizeof(int) * nSteps); g_hash_table_insert(curve->data, link2, (gpointer)storage); } /* Add the data to the element data and all data. */ if (!ele1) { ele1 = g_memdup(data, sizeof(int) * nSteps); g_hash_table_insert(curve->data, g_strdup(eleName), (gpointer)ele1); } else for (i = 0; i < nSteps - 1; i++) ele1[i] += data[i]; if (link2) { if (!ele2) { ele2 = g_memdup(data, sizeof(int) * nSteps); g_hash_table_insert(curve->data, g_strdup(lkName), (gpointer)ele2); } else for (i = 0; i < nSteps - 1; i++) ele2[i] += data[i]; } max = 0; for (i = 0; i < nSteps - 1; i++) { max = MAX(max, data[i]); all[i] += data[i]; } curve->heights[1] = MAX(curve->heights[1], max * 1.1f); DBG_fprintf(stderr, " | max %g becomes %g.\n", (double)max, curve->heights[1]); } /** * visu_ui_curve_frame_setNNodes: * @curve: a #VisuUiCurveFrame widget. * @ele: a string. * @n: a number. * * Modify the number of ... TODO * * Since: 3.6 */ void visu_ui_curve_frame_setNNodes(VisuUiCurveFrame *curve, const gchar *ele, guint n) { guint *data; g_return_if_fail(VISU_UI_IS_CURVE_FRAME(curve)); data = (guint*)g_hash_table_lookup(curve->data, ele); g_return_if_fail(data); data[curve->nSteps - 1] = n; data = (guint*)g_hash_table_lookup(curve->data, ALL); g_return_if_fail(data); data[curve->nSteps - 1] += n; DBG_fprintf(stderr, "Gtk Curve: set %d nodes to '%s' (all = %d).\n", n, ele, data[curve->nSteps - 1]); } /** * visu_ui_curve_frame_setStyle: * @curve: a #VisuUiCurveFrame object. * @style: a style id. * * Modify the rendering style of the graph. * * Since: 3.5 * * Returns: TRUE if the style is actually changed. */ gboolean visu_ui_curve_frame_setStyle(VisuUiCurveFrame *curve, VisuUiCurveFrameStyle style) { g_return_val_if_fail(VISU_UI_IS_CURVE_FRAME(curve), FALSE); if (curve->style == style) return FALSE; curve->style = style; return TRUE; } /** * visu_ui_curve_frame_setFilter: * @curve: a #VisuUiCurveFrame widget. * @filter: a string. * * Modify the filter used to draw all or single #VisuElement * distribution. * * Since: 3.6 * * Returns: TRUE if filter is actually changed. */ gboolean visu_ui_curve_frame_setFilter(VisuUiCurveFrame *curve, const gchar* filter) { g_return_val_if_fail(VISU_UI_IS_CURVE_FRAME(curve), FALSE); if (curve->filter && filter && !strcmp(curve->filter, filter)) return FALSE; if (curve->filter) g_free(curve->filter); curve->filter = (gchar*)0; if (filter) curve->filter = g_strdup(filter); return TRUE; } /** * visu_ui_curve_frame_setHighlightRange: * @curve: a #VisuUiCurveFrame widget. * @range: two floats. * * Modify the distance span that is used for highlight rendering and * calculation, see visu_ui_curve_frame_getMeanInRange(). * * Since: 3.6 * * Returns: TRUE if range is actually changed. */ gboolean visu_ui_curve_frame_setHighlightRange(VisuUiCurveFrame *curve, float range[2]) { g_return_val_if_fail(VISU_UI_IS_CURVE_FRAME(curve), FALSE); DBG_fprintf(stderr, "Gtk Curve: set highlight range to %gx%g.\n", range[0], range[1]); if (range[0] >= 0.f && range[1] > range[0]) { if (curve->hlRange[0] == range[0] && curve->hlRange[1] == range[1]) return FALSE; curve->hlRange[0] = range[0]; curve->hlRange[1] = range[1]; } else { if (curve->hlRange[0] == -1.f) return FALSE; curve->hlRange[0] = -1.f; } return TRUE; } /** * visu_ui_curve_frame_getHighlightRange: * @curve: a #VisuUiCurveFrame widget. * @range: a location for two floats. * * Retrieves the distance span that is used for highlight rendering and * calculation, see visu_ui_curve_frame_setHighlightRange(). * * Since: 3.6 * * Returns: TRUE if range has been set already. */ gboolean visu_ui_curve_frame_getHighlightRange(VisuUiCurveFrame *curve, float range[2]) { g_return_val_if_fail(VISU_UI_IS_CURVE_FRAME(curve), FALSE); DBG_fprintf(stderr, "Gtk Curve: get highlight range of %gx%g.\n", curve->hlRange[0], curve->hlRange[1]); if (curve->hlRange[0] < 0.f || curve->hlRange[1] <= curve->hlRange[0]) return FALSE; range[0] = curve->hlRange[0]; range[1] = curve->hlRange[1]; return TRUE; } /** * visu_ui_curve_frame_draw: * @curve: a #VisuUiCurveFrame widget. * * Forces to redraw the widget. * * Since: 3.6 */ void visu_ui_curve_frame_draw(VisuUiCurveFrame *curve) { g_return_if_fail(VISU_UI_IS_CURVE_FRAME(curve)); redraw(GTK_WIDGET(curve)); } /** * visu_ui_curve_frame_getIntegralInRange: * @curve: a #VisuUiCurveFrame widget. * @label: a location to a string. * * Calculates the integral of the displayed distribution (see * visu_ui_curve_frame_setFilter()) in the given range (see * visu_ui_curve_frame_setHighlightRange()). If @label is present, it will points on a * string labeling the displayed distribution. The string is owned by V_Sim. * * Since: 3.6 * * Returns: the integral. */ float visu_ui_curve_frame_getIntegralInRange(VisuUiCurveFrame *curve, gchar **label) { guint *data; float val, d; guint i; g_return_val_if_fail(VISU_UI_IS_CURVE_FRAME(curve), 0.f); if (label && curve->filter) *label = curve->filter; else if (label) *label = ALL; if (curve->filter) data = (guint*)g_hash_table_lookup(curve->data, curve->filter); else data = (guint*)g_hash_table_lookup(curve->data, ALL); if (!data) return 0.f; val = 0.f; d = curve->init; for (i = 0; i < curve->nSteps - 1; i++) { if (d >= curve->hlRange[0] && d < curve->hlRange[1]) val += (float)data[i]; d += curve->step; } DBG_fprintf(stderr, "Gtk Curve: get %d pairs for %d elements.\n", (int)val, data[curve->nSteps - 1]); return val / (float)data[curve->nSteps - 1]; } /** * visu_ui_curve_frame_getMeanInRange: * @curve: a #VisuUiCurveFrame widget. * @label: a location to a string. * * Calculates the average distance value of the displayed distribution (see * visu_ui_curve_frame_setFilter()) in the given range (see * visu_ui_curve_frame_setHighlightRange()). If @label is present, it will points on a * string labeling the displayed distribution. The string is owned by V_Sim. * * Since: 3.6 * * Returns: the average distance value. */ float visu_ui_curve_frame_getMeanInRange(VisuUiCurveFrame *curve, gchar **label) { guint *data; float val, d; guint i, n; g_return_val_if_fail(VISU_UI_IS_CURVE_FRAME(curve), 0.f); if (label && curve->filter) *label = curve->filter; else if (label) *label = ALL; if (curve->filter) data = (guint*)g_hash_table_lookup(curve->data, curve->filter); else data = (guint*)g_hash_table_lookup(curve->data, ALL); if (!data) return 0.f; val = 0.f; n = 0; for (i = 0, d = curve->init; i < curve->nSteps - 1; i++, d += curve->step) if (d >= curve->hlRange[0] && d < curve->hlRange[1]) { val += (float)data[i] * (d + curve->step * 0.5f); n += data[i]; } DBG_fprintf(stderr, "Gtk Curve: get mean (%f) for %d elements.\n", val / (float)n, n); return val / (float)n; } v_sim-3.7.0/src/extraGtkFunctions/gtk_curveWidget.h0000644000353400050620000000644712215546104017353 00000000000000#ifndef __CURVEFRAME_H__ #define __CURVEFRAME_H__ #include G_BEGIN_DECLS /** * VisuUiCurveFrameStyle: * @CURVE_LINEAR: the curve is drawn with lines ; * @CURVE_BAR: the curve is drawn with bars ; * @CURVE_GAUSS: the curve is convoluted with gaussians (not * implemented yet). * * Possible styles for the curve rendering, see visu_ui_curve_frame_setStyle(). */ typedef enum { CURVE_LINEAR, CURVE_BAR, CURVE_GAUSS } VisuUiCurveFrameStyle; /** * VISU_UI_TYPE_CURVE_FRAME: * * Return the associated #GType to the #VisuUiCurveFrame objects. * * Since: 3.6 */ #define VISU_UI_TYPE_CURVE_FRAME (visu_ui_curve_frame_get_type()) /** * VISU_UI_CURVE_FRAME: * @obj: the widget to cast. * * Cast the given object to a #VisuUiCurveFrame object. * * Since: 3.6 */ #define VISU_UI_CURVE_FRAME(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), VISU_UI_TYPE_CURVE_FRAME, VisuUiCurveFrame)) /** * VISU_UI_CURVE_FRAME_CLASS: * @obj: the class to cast. * * Cast the given class to a #VisuUiCurveFrame object. * * Since: 3.6 */ #define VISU_UI_CURVE_FRAME_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST((obj), VISU_UI_CURVE_FRAME, VisuUiCurveFrameClass)) /** * VISU_UI_IS_CURVE_FRAME: * @obj: the object to test. * * Return if the given object is a valid #VisuUiCurveFrame object. * * Since: 3.6 */ #define VISU_UI_IS_CURVE_FRAME(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), VISU_UI_TYPE_CURVE_FRAME)) /** * VISU_UI_IS_CURVE_FRAME_CLASS: * @obj: the class to test. * * Return if the given class is a valid #VisuUiCurveFrameClass class. * * Since: 3.6 */ #define VISU_UI_IS_CURVE_FRAME_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((obj), VISU_UI_TYPE_CURVE_FRAME)) /** * VISU_UI_CURVE_FRAME_GET_CLASS: * @obj: the widget to get the class of. * * Get the class of the given object. * * Since: 3.6 */ #define VISU_UI_CURVE_FRAME_GET_CLASS (G_TYPE_INSTANCE_GET_CLASS((obj), VISU_UI_TYPE_CURVE_FRAME, VisuUiCurveFrameClass)) typedef struct _VisuUiCurveFrame VisuUiCurveFrame; typedef struct _VisuUiCurveFrameClass VisuUiCurveFrameClass; GType visu_ui_curve_frame_get_type(void); GtkWidget *visu_ui_curve_frame_new(float distMin, float distMax); void visu_ui_curve_frame_draw(VisuUiCurveFrame *curve); gboolean visu_ui_curve_frame_setSpan(VisuUiCurveFrame *curve, float span[2]); void visu_ui_curve_frame_getSpan(VisuUiCurveFrame *curve, float span[2]); gboolean visu_ui_curve_frame_hasData(VisuUiCurveFrame *curve); void visu_ui_curve_frame_setData(VisuUiCurveFrame *curve, float step, float min, float max); void visu_ui_curve_frame_addData(VisuUiCurveFrame *curve, const gchar *eleName, const gchar *lkName, const guint *data, guint nSteps, float init, float step); gboolean visu_ui_curve_frame_setStyle(VisuUiCurveFrame *curve, VisuUiCurveFrameStyle style); gboolean visu_ui_curve_frame_setFilter(VisuUiCurveFrame *curve, const gchar* filter); gboolean visu_ui_curve_frame_setHighlightRange(VisuUiCurveFrame *curve, float range[2]); gboolean visu_ui_curve_frame_getHighlightRange(VisuUiCurveFrame *curve, float range[2]); void visu_ui_curve_frame_setNNodes(VisuUiCurveFrame *curve, const gchar *ele, guint n); float visu_ui_curve_frame_getIntegralInRange(VisuUiCurveFrame *curve, gchar **label); float visu_ui_curve_frame_getMeanInRange(VisuUiCurveFrame *curve, gchar **label); G_END_DECLS #endif v_sim-3.7.0/src/extraGtkFunctions/gtk_fieldChooser.c0000644000353400050620000003023212215546105017452 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2011-2011) Adresse ml : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2011-2011) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include "gtk_fieldChooser.h" #include #include #include #include /** * SECTION:gtk_fieldChooser * @short_description: Defines a widget to choose a scalar field or an * isosurface. * * TODO. */ enum { VALIDATE_SIGNAL, LAST_SIGNAL }; static void visu_ui_field_chooser_dispose (GObject *obj); static void visu_ui_field_chooser_finalize(GObject *obj); struct _VisuUiFieldChooser { GtkFileChooserDialog dialog; GtkWidget *fitToBox, *fitToSurface; VisuScalarFieldMethod *validFormat; GList* allFilters; GtkWidget *addWd; gchar *preFilename; /* Memory gestion. */ gboolean dispose_has_run; }; struct _VisuUiFieldChooserClass { GtkFileChooserDialogClass parent_class; }; /* Local callbacks */ static void onFieldChooserResponse(GtkDialog *dialog, gint id, gpointer *data); static guint visu_ui_field_chooser_signals[LAST_SIGNAL] = { 0 }; G_DEFINE_TYPE(VisuUiFieldChooser, visu_ui_field_chooser, GTK_TYPE_FILE_CHOOSER_DIALOG) static void visu_ui_field_chooser_class_init(VisuUiFieldChooserClass *klass) { DBG_fprintf(stderr, "VisuUi FieldChooser: creating the class of the widget.\n"); DBG_fprintf(stderr, " - adding new signals ;\n"); /** * VisuUiFieldChooser::validate: * @chooser: the object which emit the signal ; * * Gets emitted when the user choose a file and a format has been * validated for it. * * Since: 3.7 */ visu_ui_field_chooser_signals[VALIDATE_SIGNAL] = g_signal_new("validate", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT, NULL); G_OBJECT_CLASS(klass)->dispose = visu_ui_field_chooser_dispose; G_OBJECT_CLASS(klass)->finalize = visu_ui_field_chooser_finalize; } static void visu_ui_field_chooser_init(VisuUiFieldChooser *fieldChooser) { DBG_fprintf(stderr, "VisuUi FieldChooser: initializing new object (%p).\n", (gpointer)fieldChooser); fieldChooser->validFormat = (VisuScalarFieldMethod*)0; fieldChooser->allFilters = (GList*)0; fieldChooser->addWd = (GtkWidget*)0; fieldChooser->preFilename = g_strdup(""); g_signal_connect(G_OBJECT(fieldChooser), "response", G_CALLBACK(onFieldChooserResponse), (gpointer)fieldChooser); } static void visu_ui_field_chooser_dispose(GObject *obj) { DBG_fprintf(stderr, "VisuUi FieldChooser: dispose object %p.\n", (gpointer)obj); if (VISU_UI_FIELD_CHOOSER(obj)->dispose_has_run) return; VISU_UI_FIELD_CHOOSER(obj)->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_field_chooser_parent_class)->dispose(obj); } static void visu_ui_field_chooser_finalize(GObject *obj) { VisuUiFieldChooser *dialog; GList *tmpLst; g_return_if_fail(obj); DBG_fprintf(stderr, "VisuUi FieldChooser: finalize object %p.\n", (gpointer)obj); dialog = VISU_UI_FIELD_CHOOSER(obj); for (tmpLst = dialog->allFilters; tmpLst; tmpLst = g_list_next(tmpLst)) g_free(tmpLst->data); g_list_free(dialog->allFilters); if (dialog->preFilename) g_free(dialog->preFilename); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_field_chooser_parent_class)->finalize(obj); DBG_fprintf(stderr, "VisuUi FieldChooser: freeing ... OK.\n"); } /** * visu_ui_field_chooser_new: * @parent: (allow-none): the parent window. * * Create a filechooser, specific for #VisuScalarField files. * * Since: 3.7 * * Returns: (transfer full): a newly created file chooser. **/ GtkWidget* visu_ui_field_chooser_new(GtkWindow *parent) { VisuUiFieldChooser *fieldChooser; gchar *directory; GtkWidget *vbox; GList *scalarMethods, *allMethods; const gchar *type[] = {"*.surf", (char*)0}; const gchar *descr = _("Isosurfaces files"); if (!parent) parent = visu_ui_getRenderWindow(); DBG_fprintf(stderr, "VisuUi FieldChooser: creating a new VisuUiFieldChooser object.\n"); fieldChooser = VISU_UI_FIELD_CHOOSER(g_object_new(VISU_UI_TYPE_FIELD_CHOOSER, NULL)); gtk_window_set_title(GTK_WINDOW(fieldChooser), _("Open a surface/density file")); /* This is to avoid a bug in gtk 2.4 */ #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 gtk_window_set_modal(GTK_WINDOW(fieldChooser), TRUE); #endif gtk_window_set_transient_for(GTK_WINDOW(fieldChooser), GTK_WINDOW(parent)); gtk_window_set_position(GTK_WINDOW(fieldChooser), GTK_WIN_POS_CENTER_ON_PARENT); gtk_dialog_add_button(GTK_DIALOG(fieldChooser), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); gtk_dialog_add_button(GTK_DIALOG(fieldChooser), GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT); gtk_dialog_set_default_response(GTK_DIALOG(fieldChooser), GTK_RESPONSE_ACCEPT); directory = visu_ui_getLastOpenDirectory(); if (directory) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(fieldChooser), directory); fieldChooser->fitToBox = gtk_radio_button_new_with_label(NULL, _("Fit surfaces to box")); gtk_widget_set_tooltip_text(fieldChooser->fitToBox, _("Makes surfaces fit to the current" " loaded bounding box.")); fieldChooser->fitToSurface = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(fieldChooser->fitToBox), _("Fit box to surfaces")); gtk_widget_set_tooltip_text(fieldChooser->fitToSurface, _("Makes the current bounding box fit" " to the surfaces.")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(fieldChooser->fitToBox), TRUE); vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), fieldChooser->fitToBox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), fieldChooser->fitToSurface, FALSE, FALSE, 0); fieldChooser->addWd = gtk_alignment_new(0.5, 0.5, 1., 1.); gtk_box_pack_end(GTK_BOX(vbox), fieldChooser->addWd, FALSE, FALSE, 0); gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(fieldChooser), vbox); allMethods = (GList*)0; allMethods = g_list_append(allMethods, tool_file_format_new(descr, type)); for (scalarMethods = visu_scalar_field_method_getAll(); scalarMethods; scalarMethods = g_list_next(scalarMethods)) allMethods = g_list_append(allMethods, TOOL_FILE_FORMAT(scalarMethods->data)); fieldChooser->allFilters = visu_ui_createFilter(allMethods, GTK_WIDGET(fieldChooser)); g_list_free(allMethods); gtk_widget_show_all(GTK_WIDGET(fieldChooser)); return GTK_WIDGET(fieldChooser); } /*******************/ /* Local callbacks */ /*******************/ static void onFieldChooserResponse(GtkDialog *dialog, gint id, gpointer *data _U_) { gchar *filename, *directory; VisuUiFieldChooser *fieldChooser; GList *scalarMethods; g_return_if_fail(VISU_UI_IS_FIELD_CHOOSER(dialog)); fieldChooser = VISU_UI_FIELD_CHOOSER(dialog); fieldChooser->validFormat = (VisuScalarFieldMethod*)0; DBG_fprintf(stderr, "VisuUi FieldChooser: catch the 'response' signal:" " %d (ACCEPT is %d).\n", id, GTK_RESPONSE_ACCEPT); if (id == GTK_RESPONSE_ACCEPT) { /* Get the filename. */ filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fieldChooser)); if (!filename) { /* Autodetect failed, no format match the given filename */ visu_ui_raiseWarning(_("Opening a file"), _("No filename chosen."), GTK_WINDOW(dialog)); g_signal_stop_emission_by_name(G_OBJECT(dialog), "response"); return; } /* Get the directory. */ directory = (char*)gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(fieldChooser)); visu_ui_setLastOpenDirectory(directory, VISU_UI_DIR_SURFACE); /* We test here the file format for formats that support poking. */ for (scalarMethods = visu_scalar_field_method_getAll(); scalarMethods; scalarMethods = g_list_next(scalarMethods)) if (tool_file_format_validate(TOOL_FILE_FORMAT(scalarMethods->data), filename)) break; if (scalarMethods && strcmp(fieldChooser->preFilename, filename)) { fieldChooser->validFormat = VISU_SCALAR_FIELD_METHOD(scalarMethods->data); /* Call hook in case we found a valid file format. */ DBG_fprintf(stderr, "VisuUi FieldChooser: '%s' is a valid %s format.\n", filename, tool_file_format_getName (TOOL_FILE_FORMAT(fieldChooser->validFormat))); g_signal_emit(G_OBJECT(fieldChooser), visu_ui_field_chooser_signals[VALIDATE_SIGNAL], 0, G_OBJECT(scalarMethods->data), NULL); } if (fieldChooser->preFilename) g_free(fieldChooser->preFilename); fieldChooser->preFilename = filename; } } /******************/ /* Public methods */ /******************/ /** * visu_ui_field_chooser_getFileFormat: * @dialog: a #VisuUiFieldChooser object. * * After the @dialog returns, it has validate the selected file on * possible file formats. * * Since: 3.7 * * Returns: the #VisuScalarFieldMethod that correspond to the selected file. **/ VisuScalarFieldMethod* visu_ui_field_chooser_getFileFormat(VisuUiFieldChooser *dialog) { g_return_val_if_fail(dialog, (VisuScalarFieldMethod*)0); return dialog->validFormat; } /** * visu_ui_field_chooser_getFit: * @dialog: a #VisuUiFieldChooser object. * * The #VisuScalarField objects can be fitted on the #visuData box or * impose their boxes to #VisuData. * * Since: 3.7 * * Returns: if the box should be fitted or not. **/ VisuUiBoxFit visu_ui_field_chooser_getFit(VisuUiFieldChooser *dialog) { g_return_val_if_fail(dialog, VISU_UI_FIT_TO_BOX); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->fitToBox))) return VISU_UI_FIT_TO_BOX; else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->fitToSurface))) return VISU_UI_FIT_TO_SURFACE; else return VISU_UI_FIT_TO_BOX; } /** * visu_ui_field_chooser_setOptions: * @dialog: a #VisuUiFieldChooser object. * @wd: some additional options to add to the dialog. * * One can add widgets to add more options to the chooser. If the * chooser already has some option widgets, they are destroyed. * * Since: 3.7 **/ void visu_ui_field_chooser_setOptions(VisuUiFieldChooser *dialog, GtkWidget *wd) { GtkWidget *child; g_return_if_fail(dialog); child = gtk_bin_get_child(GTK_BIN(dialog->addWd)); if (child) gtk_widget_destroy(child); /* Add the new widgets to provide additional optionas. */ gtk_container_add(GTK_CONTAINER(dialog->addWd), wd); gtk_widget_show_all(wd); /* Freeze the filechooser itself. */ /* Stop the response action. */ g_signal_stop_emission_by_name(G_OBJECT(dialog), "response"); } v_sim-3.7.0/src/extraGtkFunctions/gtk_fieldChooser.h0000644000353400050620000001072612215546105017465 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2011-2011) Adresse ml : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2011-2011) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef GTK_FIELDCHOOSER_H #define GTK_FIELDCHOOSER_H #include #include #include G_BEGIN_DECLS /** * VISU_UI_TYPE_FIELD_CHOOSER: * * Return the associated #GType to the VisuUiFieldChooser objects. */ #define VISU_UI_TYPE_FIELD_CHOOSER (visu_ui_field_chooser_get_type ()) /** * VISU_UI_FIELD_CHOOSER: * @obj: the widget to cast. * * Cast the given object to a #VisuUiFieldChooser object. */ #define VISU_UI_FIELD_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VISU_UI_TYPE_FIELD_CHOOSER, VisuUiFieldChooser)) /** * VISU_UI_FIELD_CHOOSER_CLASS: * @klass: the class to cast. * * Cast the given class to a #VisuUiFieldChooserClass object. */ #define VISU_UI_FIELD_CHOOSER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VISU_UI_TYPE_FIELD_CHOOSER, VisuUiFieldChooserClass)) /** * VISU_UI_IS_FIELD_CHOOSER: * @obj: the object to test. * * Return if the given object is a valid #VisuUiFieldChooser object. */ #define VISU_UI_IS_FIELD_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VISU_UI_TYPE_FIELD_CHOOSER)) /** * VISU_UI_IS_FIELD_CHOOSER_CLASS: * @klass: the class to test. * * Return if the given class is a valid #VisuUiFieldChooserClass class. */ #define VISU_UI_IS_FIELD_CHOOSER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VISU_UI_TYPE_FIELD_CHOOSER)) /** * VISU_UI_FIELD_CHOOSER_GET_CLASS: * @obj: the widget to get the class of. * * Get the class of the given object. */ #define VISU_UI_FIELD_CHOOSER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_UI_TYPE_FIELD_CHOOSER, VisuUiFieldChooserClass)) /** * VisuUiFieldChooser * * Private structure to store informations of a #VisuUiFieldChooser object. */ typedef struct _VisuUiFieldChooser VisuUiFieldChooser; /** * VisuUiFieldChooserClass * * Private structure to store informations of a #VisuUiFieldChooserClass object. */ typedef struct _VisuUiFieldChooserClass VisuUiFieldChooserClass; /** * visu_ui_field_chooser_get_type * * #GType are unique numbers to identify objects. * * Returns: the #GType associated with #VisuUiFieldChooser objects. */ GType visu_ui_field_chooser_get_type (void); /** * VisuUiBoxFit: * @VISU_UI_FIT_TO_BOX: adapt the box of the field to the box of the * loaded #VisuData. * @VISU_UI_FIT_TO_SURFACE: adapt the box of the loaded #VisuData to * the box of the field. * * Possible value to adapt the boxes of structure and field. * * Since: 3.7 */ typedef enum { VISU_UI_FIT_TO_BOX, VISU_UI_FIT_TO_SURFACE } VisuUiBoxFit; GtkWidget* visu_ui_field_chooser_new(GtkWindow *parent); VisuScalarFieldMethod* visu_ui_field_chooser_getFileFormat(VisuUiFieldChooser *dialog); VisuUiBoxFit visu_ui_field_chooser_getFit(VisuUiFieldChooser *dialog); void visu_ui_field_chooser_setOptions(VisuUiFieldChooser *dialog, GtkWidget *wd); G_END_DECLS #endif v_sim-3.7.0/src/glade/0000755000353400050620000000000012216331346011505 500000000000000v_sim-3.7.0/src/glade/v_sim.glade0000644000353400050620000051503112215546070013546 00000000000000 True Save session True center-on-parent 450 icone-dialog.png normal False True True True 1 10 5 save-bandeau.png False False 0 True True <span size="larger"><b>Manage configuration files</b></span> True False False 1 0 600 True True True 2 True True left True 15 True True 0 25 10 <b>Load from file</b> True False False 0 250 True 1 True 0.89999997615814209 0 3 gtk-open True False True True True False True False False 2 True gtk-open 3 False tab True 15 True True 0 25 10 <b>Save to file</b> True False False 0 True True 0 True 0 gtk-save True True True True False True False False 5 1 False False 1 Export resources related to rendered file only True False True False 5 True True False False 2 1 True gtk-save 3 1 False tab 0 True True 0 10 True fill True False False 1 True True gtk-dialog-warning 1 False False 0 True False 1 False False end 4 True <b>Resources</b> <span size="smaller"><i>(values related to rendering aspects)</i></span> True False tab True 2 True True gtk-floppy 3 False False 0 True 25 10 <b>Save to file</b> True False False 1 False False 3 0 True True 0 15 True 0 gtk-save True True True True False True False False 5 1 False False 1 True True gtk-dialog-warning 1 False False 0 True False 1 False False end 4 1 True <b>Parameters</b> <span size="smaller"><i>(Interface options)</i></span> True 1 False tab 5 1 True 0 True True 0 5 5 <span size="smaller">When saving, if you just specify a directory '<span font_desc="courier">dir/</span>', it will be save to '<span font_desc="courier">dir/v_sim.[res][par]</span>' by default, ortherwise speficy a full path.</span> True fill True False False 0 True True 0 5 5 <span size="smaller"><u>Tips</u>: think to create a <span font_desc="courier">$XDG_CONFIG_HOME/v_sim</span> directory and put your resource and parameter files in it. It is scanned at startup.</span> True True True False False 1 True True gtk-help 2 0 True Help False False 1 label_item False False end 2 1 1 True end gtk-close -7 True True True False True False False 0 False end 0 True Pick and observe session center-on-parent icone-dialog.png normal False True True 400 True 1 observe-bandeau.png False False 10 0 True True True True False True True 0 0 True 2 True gtk-zoom-fit False False 0 True Observe True False False 1 0 True True ( False False 0 constrained True True False Movement are along meridians when the mouse is dragged along y axis and along parallels when the movement is along x axis. True True False False 1 walker True True False Movements are those of a walking ant on a sphere, when mouse move along y axis, the ant goes strait on, when mouse is dragged along x axis, the ant translates on its right or on its left. True True radioObserveConstrained False False 2 True ) False False 3 False False 1 False False 0 True 3 3 7 2 True 0 Translations spinDx 2 1 2 GTK_FILL True 0 Scale spinGross 2 2 3 GTK_FILL True True 6 0 -360 360 5 10 0 1 1 True 5 6 True True 6 -50 -360 360 5 10 0 1 1 True 3 4 True True 6 0.5 -3 3 0.050000000745099998 0.10000000149 0 0.10000000149 3 True 3 4 1 2 True True 6 1 0.019999999553000001 999 0.10000000149 0.5 0 0.10000000149 3 True 3 4 2 3 True True 6 40 -360 360 5 10 0 1 1 True 1 2 True 1 omega: spinPhi 4 5 True 1 phi: spinPhi 2 3 True 1 dx: spinDx 2 3 1 2 True 1 zoom: spinGross 2 3 2 3 True 1 theta: spinTheta True True False True axes-button.png 6 7 GTK_FILL True 1 dy: spinDy 4 5 1 2 True 1 persp.: spinPersp 4 5 2 3 True True 6 0.5 -3 3 0.050000000745099998 0.10000000149 0 0.10000000149 3 True 5 6 1 2 True True 6 5 1.1000000238400001 100 0.5 10 0 2 1 True 5 6 2 3 False False 1 True True True True True True False True True 0 0 True 2 True gtk-color-picker False False 0 True Pick True False False 1 0 False False 0 True 10 10 True True True 100 True True never automatic True True True True 0 15 True True False False 0 True center True False False 1 0 True Persistent measures True True False True True True False False 0 True True False Remove all drawn measurements. False True gtk-clear 1 False False 1 True 1 5 Highlights <span size="small">(none)</span>: True 2 True True True False Add highlighted nodes to the list below. True gtk-go-down 1 False False 0 True True False Remove all highlight marks. True gtk-clear 1 False False end 2 False False 3 False False end 1 True False 152 True True True 0 <b>List of nodes <span size="small">(none)</span></b> True 0 True 3 gtk-help 1 False False 1 True <span size="smaller">Values in <span color="blue">blue</span> are editable</span> True False False 2 False False 0 True 1 True 0 <b>Draw data on nodes</b> True False False 2 True True 5 none True True False True True False False 0 listed True True False True True radioDrawNever False False 1 all True True False True True radioDrawNever 2 True 3 False False 3 True False 1 True Pick False tab True True True False True True 0 0 True 2 True gtk-jump-to False False 0 True Modify nodes (position, numbers...) True False False 1 False False 0 True 10 10 True True True 0 <b>Move or delete:</b> True False False 0 picked _node True True False True True False False 1 True 10 _selected nodes True True False True True radioMovePick False False 2 True 1 nb True False False 3 True True False Suppress node (either picked one or selected ones). True gtk-remove 2 False False end 5 False False 0 True 10 True 1 <span size="smaller">(selected nodes are listed in the pick tab)</span> True False False 1 True 5 True 3 8 5 True 1 15 Specific moving axis: True 1 2 GTK_FILL True 1 2 <b>z</b> True 5 7 GTK_FILL GTK_FILL True 1 2 <b>y</b> True 3 5 GTK_FILL GTK_FILL True 1 2 <b>x</b> True 1 3 GTK_FILL GTK_FILL True 1 15 Current pos./trans.: 2 3 35 True 0 True 2 3 2 3 GTK_FILL 35 True 0 True 4 5 2 3 GTK_FILL 35 True 0 True 6 7 2 3 GTK_FILL True True False Capture the perpendicular to the current view. True gtk-zoom-fit 2 7 8 1 2 GTK_FILL True True False Return coordinates to initial values. True gtk-redo 2 7 8 2 3 GTK_FILL False False 2 True 0 1 5 <b>Add a new node:</b> True False False 3 True 5 True 1 15 position: 1 True True False Add a new node. True gtk-add 2 False False end 5 False False 4 True True 0 1 <b>Screen basis set:</b> True False False 0 True 1 5 <i>horiz.</i> True 1 True False False 2 True 1 5 <i>vert.</i> True 3 True False False 4 False False end 5 1 1 True Geometry changes 1 False tab 2 True 3 0 True 0 2 True True True True gtk-help 1 0 True Help False False 1 label_item False False end 3 1 1 True end -7 True True True True False True 0 0 True 2 True gtk-go-back False False 0 True Back to command panel True False False 1 False False 0 False end 0 True About V_Sim True center icone-about.png dialog False True True True True 10 10 logo_rectangle.png False False 0 True True 3 2 True 1 <b>Version</b> : True GTK_FILL True 1 <b>Release Date</b> : True 1 2 GTK_FILL True 1 <b>Web site</b> : True 2 3 GTK_FILL True 0 5 2.99 1 2 GTK_FILL True 0 5 AAAA-MM-JJ 1 2 1 2 GTK_FILL True True 0 5 <u>http://</u> True True 1 2 2 3 GTK_FILL False 0 1 0 475 300 True True True True never automatic etched-in True True False word 2 2 False True Readme False tab True True never automatic etched-in True True False word 2 2 False 1 True Authors 1 False tab True True automatic etched-in True True False 2 2 False 2 True License 2 False tab True True 0 15 5 Loaded plug-ins: False False 0 True True automatic 1 3 True Plug-ins 3 False tab True True automatic etched-in True True False 2 2 False 4 True Changelog 4 False tab 1 1 True end gtk-close -7 True True True False True False False 0 False end 0 True set and customize pairs icone-dialog.png normal False True 2 True True liaison-bandeau.png False False 0 True True 0.25 <span size="larger"><b>Set parameters for pairs</b></span> True 0 True True Model: False False 0 False False end 1 1 False False 1 True True left True True 150 True True automatic automatic True True 0 0 True Pairs 90 False tab True 1 True Distances 90 1 False tab 2 True end gtk-close -7 True True True False True False False 0 False end 0 True Quit V_Sim True center-on-parent gtk-dialog-question dialog False True True True 6 gtk-dialog-question 6 False False 0 True True 10 <span size="larger"><b>Quit V_Sim?</b></span> True False False 0 True 0 Don't show this warning again. True True False True True 1 15 True gtk-dialog-warning 3 False False 5 0 True <i>Can't find a local configuration directory <span font_desc="courier">$XDG_CONFIG_HOME/v_sim</span>. Should one be added?</i> True fill True False False 1 True 0 gtk-add True True False True False False 2 2 15 True gtk-dialog-warning 3 False False 5 0 True <i>Can't find a <span font_desc="courier">v_sim.par</span> file with enough write permissions to store the preference, neither in the installation directory nor in the <span font_desc="courier">$XDG_CONFIG_HOME/v_sim</span> one.</i> True fill True False False 1 3 True 0 True 0 0 2 2 <span size="smaller">If you check the above box but you want to have this warning dialog again before closing, you can change this by editing the parameter file (<span font_desc="courier">v_sim.par</span>). The option is called 'main_confirmQuit'.</span> True True True True gtk-help 1 0 True 5 Help False False 1 label_item False False 4 1 1 True end gtk-cancel -6 True True True False True False False 0 gtk-quit -5 True True True False True False False 1 False end 0 v_sim-3.7.0/src/glade/v_sim.gladep0000644000353400050620000000064212215546070013723 00000000000000 Glade glade FALSE FALSE FALSE FALSE v_sim-3.7.0/src/openGLFunctions/0000755000353400050620000000000012216331341013501 500000000000000v_sim-3.7.0/src/openGLFunctions/light.c0000644000353400050620000002567712215546102014717 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "light.h" #include #include #include #include /** * SECTION:light * @short_description: Controls the use of lights in the rendering * window. * * One can defines several lights in OpenGL. The * #VisuGlLights is an object that stores several of them and * that can be applied to the current OpenGL context using * visu_gl_lights_apply(). The lights that are created with * visu_gl_light_newDefault() are ambiant light with a white colour. The * multiplier coefficient is use to soften lights when several are * used together. It is used as a factor for all light parameters * (ambient, diffuse...) ecept the specular one. */ /** * VisuGlLight: * @enabled: if the light is used or not ; * @ambient: the ambient color of the light ; * @diffuse: the diffuse color of the light ; * @specular: the specular color of the light ; * @position: the position in space of the light ; * @multiplier: a value that multiply all color values (should be in [0;1]). * * This structure is convenient to store lights as defined by OpenGL. */ /** * VisuGlLights: * * A short way to access #_VisuGlLights objects. */ struct _VisuGlLights { guint refCount; GList* list; /* Current size of the list. */ gint nbStoredVisuGlLights; /* Number of lights called by glEnable() when last applied. */ gint nbEnabledVisuGlLights; }; /* Local methods. */ static void lighting_set(gpointer data, gpointer user_data); static VisuGlLight* light_copy(VisuGlLight *light); /** * visu_gl_lights_get_type: * * Create and retrieve a #GType for a #VisuGlLights object. * * Since: 3.7 * * Returns: a new type for #VisuGlLights structures. */ GType visu_gl_lights_get_type(void) { static GType g_define_type_id = 0; if (g_define_type_id == 0) g_define_type_id = g_boxed_type_register_static("VisuGlLights", (GBoxedCopyFunc)visu_gl_lights_ref, (GBoxedFreeFunc)visu_gl_lights_unref); return g_define_type_id; } /** * visu_gl_lights_new: * * Create a new #VisuGlLights object. It contains no light when created. * Use visu_gl_lights_add() to add new lights and * visu_gl_lights_remove() to remove others. * * Returns: a newly created #VisuGlLights. Use visu_gl_lights_free() * to free such an object. */ VisuGlLights* visu_gl_lights_new() { VisuGlLights *env; env = g_malloc(sizeof(VisuGlLights)); env->refCount = 1; env->list = (GList*)0; env->nbStoredVisuGlLights = 0; env->nbEnabledVisuGlLights = 0; return env; } /** * visu_gl_lights_ref: * @env: a #VisuGlLights object. * * Increase the ref counter. * * Since: 3.7 * * Returns: itself. **/ VisuGlLights* visu_gl_lights_ref(VisuGlLights *env) { env->refCount += 1; return env; } /** * visu_gl_lights_unref: * @env: a #VisuGlLights object. * * Decrease the ref counter, free all memory if counter reachs zero. * * Since: 3.7 **/ void visu_gl_lights_unref(VisuGlLights *env) { env->refCount -= 1; if (!env->refCount) visu_gl_lights_free(env); } /** * visu_gl_lights_free: * @env: a #VisuGlLights object. * * Free memory occupied by the given environnement. */ void visu_gl_lights_free(VisuGlLights *env) { g_return_if_fail(env); visu_gl_lights_removeAll(env); /* Need to apply to disable all previously enbaled lights before freeing the object. */ visu_gl_lights_apply(env); g_free(env); } /** * visu_gl_lights_add: * @env: a #VisuGlLights object ; * @light: a #VisuGlLight object. * * This method adds the given @light to the list of known lights declared * in the given environnement. The light is not copied and should not be freed * when stored in the environnement. * * Returns: TRUE if visu_gl_lights_apply() should be called. */ gboolean visu_gl_lights_add(VisuGlLights *env, VisuGlLight *light) { g_return_val_if_fail(env && light, FALSE); g_return_val_if_fail(env->nbStoredVisuGlLights < GL_MAX_LIGHTS, FALSE); DBG_fprintf(stderr, "VisuGlLight : add a new light (%p).\n", (gpointer)light); env->list = g_list_append(env->list, light); env->nbStoredVisuGlLights += 1; return TRUE; } /** * visu_gl_lights_remove: * @env: a #VisuGlLights object ; * @light: a #VisuGlLight object. * * This method removes the given @light from the list of known lights declared * in the given environnement. The @light argument is first removed and then freed * by a call to g_free(). * * Returns: TRUE if visu_gl_lights_apply() should be called. */ gboolean visu_gl_lights_remove(VisuGlLights *env, VisuGlLight *light) { g_return_val_if_fail(env && light, FALSE); DBG_fprintf(stderr, "VisuGlLight : remove a light (%p).\n", (gpointer)light); env->list = g_list_remove(env->list, light); g_free(light); env->nbStoredVisuGlLights -= 1; return TRUE; } /** * visu_gl_lights_getList: * @env: a #VisuGlLights object. * * Retrieve the list of known #VisuGlLight used by the given environnement. * * Returns: (transfer none) (element-type VisuGlLight*): a list of * #VisuGlLight objects. Should not be freed. */ GList* visu_gl_lights_getList(VisuGlLights *env) { g_return_val_if_fail(env, (GList*)0); return env->list; } /** * visu_gl_lights_removeAll: * @env: a #VisuGlLights object. * * Empty the list of stored lights. All stored lights objects are freed. * * Returns: TRUE if the visu_gl_lights_apply() should be called. */ gboolean visu_gl_lights_removeAll(VisuGlLights *env) { GList *list; int n; g_return_val_if_fail(env, FALSE); if (!env->list) return FALSE; DBG_fprintf(stderr, "VisuGlLight : emptying list of stored lights of" " environnement %p.\n", (gpointer)env); list = env->list; n = 0; while (list) { DBG_fprintf(stderr, " | removing light %p\n", list->data); g_free(list->data); n += 1; list = g_list_next(list); } g_list_free(env->list); env->list = (GList*)0; env->nbStoredVisuGlLights = 0; return TRUE; } /** * visu_gl_lights_apply: * @env: a #VisuGlLights object. * * Apply all stored informations about lights to the current OpenGL context. * * Returns: TRUE if the "OpenGLAskForReDraw" signal should be * emitted after a call to this method. */ gboolean visu_gl_lights_apply(VisuGlLights *env) { gint nb; float lmodel_ambient[4] = {0.2f, 0.2f, 0.2f, 1.0f}; g_return_val_if_fail(env, FALSE); if (env->nbEnabledVisuGlLights == 0 && !env->list) return FALSE; /* glPushMatrix(); */ /* glLoadIdentity(); */ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE); glEnable(GL_LIGHTING); for (nb = 0; nb < env->nbEnabledVisuGlLights; nb++) glDisable(GL_LIGHT0 + nb); g_list_foreach(env->list, lighting_set, (gpointer)env); env->nbEnabledVisuGlLights = env->nbStoredVisuGlLights; /* glPopMatrix(); */ return TRUE; } /** * visu_gl_light_newDefault: * * Create a new light with default value (white color and position in * the front, right, top position of the screen). * * Returns: the newly created #VisuGlLight. Use g_free() to deallocate this light. */ VisuGlLight* visu_gl_light_newDefault() { float params[16] = {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 3.0f, 2.0f, 1.7f, 0.0f}; VisuGlLight *light; int i; light = g_malloc(sizeof(VisuGlLight)); light->enabled = TRUE; light->multiplier = 1.; for(i = 0; i < 4; i++) { light->ambient[i] = params[i]; light->diffuse[i] = params[4 + i]; light->specular[i] = params[8 + i]; light->position[i] = params[12 + i]; } return light; } /** * visu_gl_light_get_type: * * Create and retrieve a #GType for a #VisuGlLight object. * * Since: 3.7 * * Returns: a new type for #VisuGlLight structures. */ GType visu_gl_light_get_type(void) { static GType g_define_type_id = 0; if (g_define_type_id == 0) g_define_type_id = g_boxed_type_register_static("VisuGlLight", (GBoxedCopyFunc)light_copy, (GBoxedFreeFunc)g_free); return g_define_type_id; } static VisuGlLight* light_copy(VisuGlLight *light) { VisuGlLight *out; out = g_malloc(sizeof(VisuGlLight)); *out = *light; return out; } static void lighting_set(gpointer data, gpointer user_data) { VisuGlLight *light0 = data; int n; float values[4]; int i; VisuGlLights *env; g_return_if_fail(user_data); env = (VisuGlLights*)user_data; n = g_list_index(env->list, light0); if(light0->enabled == FALSE) { /* From glLightfv man page : "It is always the case that GL_LIGHTi = GL_LIGHT0 + i." */ glDisable(GL_LIGHT0 + n); return; } glEnable(GL_LIGHT0 + n); for (i = 0; i < 4; i++) values[i] = light0->ambient[i] * light0->multiplier; glLightfv(GL_LIGHT0 + n, GL_AMBIENT, values); for (i = 0; i < 4; i++) values[i] = light0->diffuse[i] * light0->multiplier; glLightfv(GL_LIGHT0 + n, GL_DIFFUSE, values); for (i = 0; i < 4; i++) values[i] = light0->specular[i] * 1.; glLightfv(GL_LIGHT0 + n, GL_SPECULAR, values); glLightfv(GL_LIGHT0 + n, GL_POSITION, light0->position); DBG_fprintf(stderr, "VisuGlLight : set light [%f][%f][%f][%f]\n", light0->position[0], light0->position[1], light0->position[2], light0->multiplier); } v_sim-3.7.0/src/openGLFunctions/light.h0000644000353400050620000000705212215546102014707 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef LIGHT_H #define LIGHT_H #include #include typedef struct _VisuGlLights VisuGlLights; GType visu_gl_lights_get_type(void); /** * VISU_TYPE_GL_LIGHTS: * * The type of #VisuGlLights objects. */ #define VISU_TYPE_GL_LIGHTS (visu_gl_lights_get_type()) VisuGlLights* visu_gl_lights_new(); VisuGlLights* visu_gl_lights_ref(VisuGlLights *env); void visu_gl_lights_unref(VisuGlLights *env); void visu_gl_lights_free(VisuGlLights *env); /** * VisuGlLightMaterial: * @VISU_GL_LIGHT_MATERIAL_AMB: the ambient identifier ; * @VISU_GL_LIGHT_MATERIAL_DIF: the diffuse identifier ; * @VISU_GL_LIGHT_MATERIAL_SHI: the shiningness identifier ; * @VISU_GL_LIGHT_MATERIAL_SPE: the specular identifier ; * @VISU_GL_LIGHT_MATERIAL_EMI: the emissivity identifier ; * @VISU_GL_LIGHT_MATERIAL_N_VALUES: number of used material identifiers. * * This enum is used to address the OpenGL parameters for light rendering. */ typedef enum { VISU_GL_LIGHT_MATERIAL_AMB, VISU_GL_LIGHT_MATERIAL_DIF, VISU_GL_LIGHT_MATERIAL_SHI, VISU_GL_LIGHT_MATERIAL_SPE, VISU_GL_LIGHT_MATERIAL_EMI, VISU_GL_LIGHT_MATERIAL_N_VALUES } VisuGlLightMaterial; typedef struct _VisuGlLight VisuGlLight; struct _VisuGlLight { gboolean enabled; float ambient[4]; float diffuse[4]; float specular[4]; float position[4]; float multiplier; }; GType visu_gl_light_get_type(void); /** * VISU_TYPE_GL_LIGHT: * * The type of #VisuGlLight objects. */ #define VISU_TYPE_GL_LIGHT (visu_gl_light_get_type()) gboolean visu_gl_lights_add(VisuGlLights *env, VisuGlLight *light); gboolean visu_gl_lights_remove(VisuGlLights *env, VisuGlLight *light); GList* visu_gl_lights_getList(VisuGlLights *env); gboolean visu_gl_lights_removeAll(VisuGlLights *env); gboolean visu_gl_lights_apply(VisuGlLights *env); VisuGlLight* visu_gl_light_newDefault(); #endif v_sim-3.7.0/src/openGLFunctions/renderingMode.c0000644000353400050620000002034012215546102016350 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "renderingMode.h" #include #include #include #include #include #include /** * SECTION:renderingMode * @short_description: Controls the way OpenGL renders objects. * * * This modules creates an interface to access to the way OpenGL * renders the objects (glPolygonMode() and glToolShadeModel() * functions). There are then three rendering modes available in * V_Sim: wireframe, flat and smooth. They are controls by an enum * #RenderingModeId. When visu_gl_rendering_applyMode() is called, the * current rendering mode is changed for all future drawing calls that * uses polygons. * */ #define FLAG_PARAMETER_OPENGL_RENDERING "opengl_render" #define DESC_PARAMETER_OPENGL_RENDERING "Rules the way OpenGl draws objects in general ; 4 possible strings : VISU_GL_RENDERING_WIREFRAME, VISU_GL_RENDERING_FLAT, VISU_GL_RENDERING_SMOOTH and VISU_GL_RENDERING_SMOOTH_AND_EDGE" #define PARAMETER_OPENGL_RENDERING_DEFAULT VISU_GL_RENDERING_SMOOTH static VisuGlRenderingMode renderingOption; static gboolean readOpenGLRendering(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static void exportParametersRenderingMode(GString *data, VisuData *dataObj, VisuGlView *view); static const char *renderingStrings[VISU_GL_RENDERING_N_MODES + 1] = {"Wireframe", "Flat", "Smooth", "SmoothAndEdge", (const char*)0}; static const char *renderingStringsI18n[VISU_GL_RENDERING_N_MODES + 1]; /** * visu_gl_rendering_init: (skip) * * This method is used by opengl.c to initialise this module (declare config file * options...). It should not be called elsewhere. */ void visu_gl_rendering_init(void) { DBG_fprintf(stderr, "OpenGl RenderingMode : initialization.\n"); visu_config_file_addEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_OPENGL_RENDERING, DESC_PARAMETER_OPENGL_RENDERING, 1, readOpenGLRendering); visu_config_file_addExportFunction(VISU_CONFIG_FILE_PARAMETER, exportParametersRenderingMode); renderingOption = PARAMETER_OPENGL_RENDERING_DEFAULT; renderingStringsI18n[VISU_GL_RENDERING_WIREFRAME ] = _("Wireframe"); renderingStringsI18n[VISU_GL_RENDERING_FLAT ] = _("Flat"); renderingStringsI18n[VISU_GL_RENDERING_SMOOTH ] = _("Smooth"); renderingStringsI18n[VISU_GL_RENDERING_SMOOTH_AND_EDGE] = _("Smooth & edge"); renderingStringsI18n[VISU_GL_RENDERING_N_MODES] = (const char*)0; } /** * visu_gl_rendering_applyMode: * @mode: an integer. * * Change the rendering mode of current OpenGL context. */ void visu_gl_rendering_applyMode(VisuGlRenderingMode mode) { switch (mode) { case VISU_GL_RENDERING_WIREFRAME: glShadeModel(GL_FLAT); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glLineWidth(1); break; case VISU_GL_RENDERING_FLAT: glShadeModel(GL_FLAT); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); break; case VISU_GL_RENDERING_SMOOTH: case VISU_GL_RENDERING_SMOOTH_AND_EDGE: glShadeModel(GL_SMOOTH); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); break; default: g_warning("Wrong value for parameter 'mode' in a call" " to 'visu_gl_rendering_applyMode'."); return; } DBG_fprintf(stderr, "Rendering Mode : switch rendering mode to '%s'.\n", renderingStrings[mode]); } /** * visu_gl_rendering_setGlobalMode: * @value: an integer to represent the method of rendering. * * This function change the value of the parameter renderingOption. * It controls how V_Sim renders objects, in wireframe for example. * * Returns: TRUE if the signal OpenGLAskForReDraw should be emitted. */ gboolean visu_gl_rendering_setGlobalMode(VisuGlRenderingMode value) { g_return_val_if_fail(value < VISU_GL_RENDERING_N_MODES, FALSE); if (value == renderingOption) return FALSE; renderingOption = value; visu_gl_rendering_applyMode(value); return 1; } /** * visu_gl_rendering_getGlobalMode: * * This function retrieve the value of the parameter renderingOption. * * Returns: the identifier of the current rendering option. */ VisuGlRenderingMode visu_gl_rendering_getGlobalMode(void) { return renderingOption; } /** * visu_gl_rendering_getAllModeLabels: * * This function retrieve al the names (translated) of available rendering modes. * * Returns: (transfer none): an array of string, NULL terminated that * is private (not to be freed). */ const char** visu_gl_rendering_getAllModeLabels(void) { return renderingStringsI18n; } /** * visu_gl_rendering_getAllModes: * * This function retrieve al the names of available rendering modes. * * Returns: (transfer none): an array of string, NULL terminated that * is private (not to be freed). */ const char** visu_gl_rendering_getAllModes(void) { return renderingStrings; } /** * visu_gl_rendering_getModeFromName: * @name: a string ; * @id: a location to store the resulting id. * * This function retrieve the rendering mode id associated to the name. * * Returns: TRUE if the name exists. */ gboolean visu_gl_rendering_getModeFromName(const char* name, VisuGlRenderingMode *id) { g_return_val_if_fail(name && id, FALSE); *id = 0; while (*id < VISU_GL_RENDERING_N_MODES && strcmp(name, renderingStrings[*id])) *id += 1; return (*id < VISU_GL_RENDERING_N_MODES); } static gboolean readOpenGLRendering(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { VisuGlRenderingMode id; gchar **val; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readString(lines[0], position, &val, 1, FALSE, error)) return FALSE; if (!visu_gl_rendering_getModeFromName(val[0], &id)) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d: the shape '%s' is unknown.\n"), position, val[0]); g_strfreev(val); return FALSE; } g_strfreev(val); visu_gl_rendering_setGlobalMode(id); return TRUE; } static void exportParametersRenderingMode(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { g_string_append_printf(data, "# %s\n", DESC_PARAMETER_OPENGL_RENDERING); g_string_append_printf(data, "%s: %s\n\n", FLAG_PARAMETER_OPENGL_RENDERING, renderingStrings[renderingOption]); } v_sim-3.7.0/src/openGLFunctions/renderingMode.h0000644000353400050620000000605512215546102016364 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef RENDERINGMODE_H #define RENDERINGMODE_H #include /** * VisuGlRenderingMode: * @VISU_GL_RENDERING_WIREFRAME: objects are rendered with lines only ; * @VISU_GL_RENDERING_FLAT: objects are rendered with polygons whose colours are uniform * on each polygon ; * @VISU_GL_RENDERING_SMOOTH: objects are rendered with polygons whose colours * are shaded to be smooth all along the object. * @VISU_GL_RENDERING_SMOOTH_AND_EDGE: objects are rendered with lines hightlighting the * contours of polygons. * @VISU_GL_RENDERING_N_MODES: number of rendering mode. * @VISU_GL_RENDERING_FOLLOW: use this value not to choose any rendering mode. * * Implemented mode to draw objects. */ typedef enum { VISU_GL_RENDERING_WIREFRAME, VISU_GL_RENDERING_FLAT, VISU_GL_RENDERING_SMOOTH, VISU_GL_RENDERING_SMOOTH_AND_EDGE, VISU_GL_RENDERING_N_MODES, VISU_GL_RENDERING_FOLLOW } VisuGlRenderingMode; void visu_gl_rendering_init(void); gboolean visu_gl_rendering_setGlobalMode(VisuGlRenderingMode value); VisuGlRenderingMode visu_gl_rendering_getGlobalMode(void); gboolean visu_gl_rendering_getModeFromName(const char* name, VisuGlRenderingMode *id); const char** visu_gl_rendering_getAllModes(void); const char** visu_gl_rendering_getAllModeLabels(void); void visu_gl_rendering_applyMode(VisuGlRenderingMode mode); #endif v_sim-3.7.0/src/openGLFunctions/text.c0000644000353400050620000001505212215551035014557 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "text.h" #include #include #include #ifdef HAVE_FTGL #include #endif /** * SECTION:text * @short_description: Enables capabilities to write some text on rendering screen. * * For the moment, this module is very basic and the only fonts * available is the helvetica 12 one. This module is currently broken * under Windows. */ static GLuint BASE; /* for the font display list */ static GLuint SMALL; /* for the small font display list */ static gboolean textListHaveBeenBuilt = FALSE; #ifdef HAVE_FTGL static FTGLfont *font = NULL; #endif static float fontSize = 32.f; /* only used in the case of FTGL. */ static void _putGlText(const gchar *text, VisuGlTextSize size) { g_return_if_fail(textListHaveBeenBuilt); glPushAttrib(GL_LIST_BIT); if (size == VISU_GL_TEXT_SMALL && SMALL > 0) glListBase(SMALL); else glListBase(BASE); glCallLists((int)strlen(text), GL_UNSIGNED_BYTE, (GLubyte *)text); glPopAttrib(); } static VisuGlTextFunc renderText = _putGlText; /** * visu_gl_text_putTextWithFTGL: * @text: the text to write. * @size: the size. * * A #VisuGlTextFunc routine using FTGL to render text with Pixmap * lists, see visu_gl_text_setFunc(). * * Since: 3.7 **/ void visu_gl_text_putTextWithFTGL(const gchar *text, VisuGlTextSize size) { g_return_if_fail(textListHaveBeenBuilt); #ifdef HAVE_FTGL if (size == VISU_GL_TEXT_NORMAL) ftglSetFontFaceSize(font, fontSize, fontSize); else ftglSetFontFaceSize(font, fontSize * 0.75f, fontSize * 0.75f); /* glGetFloatv(GL_CURRENT_COLOR, color); */ /* glPixelTransferf(GL_RED_BIAS, 255.f * color[0]); */ /* glPixelTransferf(GL_GREEN_BIAS, 255.f * color[1]); */ /* glPixelTransferf(GL_BLUE_BIAS, 255.f * color[2]); */ ftglRenderFont(font, text, FTGL_RENDER_ALL); /* glPixelTransferf(GL_RED_BIAS, 0.f); */ /* glPixelTransferf(GL_GREEN_BIAS, 0.f); */ /* glPixelTransferf(GL_BLUE_BIAS, 0.f); */ #else g_warning("FTGL backend not compiled, unable to write '%s' at size %d.", text, size); #endif } /** * visu_gl_text_setFunc: * @func: (scope call) (allow-none): a #VisuGlTextFunc function * * Set the function to render text at the raster position. * * Since: 3.7 * * Returns: TRUE if the function is indeed changed. **/ gboolean visu_gl_text_setFunc(VisuGlTextFunc func) { if (func == renderText) return FALSE; renderText = (func)?func:_putGlText; return TRUE; } /** * visu_gl_text_setFontSize: * @size: a new size. * * Change the normal font size used by V_Sim (see * #VISU_GL_TEXT_NORMAL). The small font is scaled accordingly. This is working only * with the FTGL backend. * * Since: 3.7 * * Returns: TRUE if font size is indeed changed. **/ gboolean visu_gl_text_setFontSize(float size) { if (size == fontSize) return FALSE; fontSize = CLAMP(size, 12.f, 999.f); return TRUE; } /** * visu_gl_text_drawChars: * @s: a string. * @size: the size of the text to render. * * Draw the given string on the current raster position with default * font. */ void visu_gl_text_drawChars(gchar *s, VisuGlTextSize size) { gsize nread, nwritten; GError *error; gchar *text; g_return_if_fail(s); DBG_fprintf(stderr, "OpenGL Text: put text '%s'.\n", s); error = (GError*)0; text = g_convert_with_fallback(s, -1, "iso-8859-1", "utf-8", "", &nread, &nwritten, &error); if (text) { renderText(text, size); g_free(text); } else { g_warning("%s", error->message); g_error_free(error); } } /** * visu_gl_text_initFontList: * * Initialise the font drawing with default font (depending on system). * It must be called before visu_gl_text_drawChars() and not in a glNewList(). * Can be called several times, fonts are initialized once only. Use * visu_gl_text_rebuildFontList() to force to build a new font list. */ void visu_gl_text_initFontList() { if (textListHaveBeenBuilt) return; BASE = visu_gl_initFontList(18); SMALL = visu_gl_initFontList(14); textListHaveBeenBuilt = (BASE > 0); DBG_fprintf(stderr, "OpenGL Text: creating font list: %d %d.\n", BASE, SMALL); g_return_if_fail(BASE > 0 && SMALL > 0); #ifdef HAVE_FTGL font = ftglCreatePixmapFont("/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf"); #endif } /** * visu_gl_text_rebuildFontList: * * Force to buid a new font list (for example new context has changed. */ void visu_gl_text_rebuildFontList() { DBG_fprintf(stderr, "OpenGL Text: rebuilding font list.\n"); visu_gl_text_initFontList(); } /** * visu_gl_text_onNewContext: * * Set the flag for text list build to FALSE. It will force to rebuild * the text lists at next call of visu_gl_text_initFontList(). * * Since: 3.6 */ void visu_gl_text_onNewContext() { DBG_fprintf(stderr, "OpenGL Text: new context, forgetting fonts.\n"); textListHaveBeenBuilt = FALSE; } v_sim-3.7.0/src/openGLFunctions/text.h0000644000353400050620000000512712215546102014565 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef TEXT_H #define TEXT_H #include /** * VisuGlTextSize: * @VISU_GL_TEXT_NORMAL: normal size (14) ; * @VISU_GL_TEXT_SMALL: small text (12). * * Different text size available in V_Sim. */ typedef enum { VISU_GL_TEXT_NORMAL, VISU_GL_TEXT_SMALL } VisuGlTextSize; /** * VisuGlTextFunc: * @text: the text to render. * @size: the size for rendering. * * A function that render iso8859-1 text at the current raster * position. * * Since: 3.7 */ typedef void (*VisuGlTextFunc)(const gchar *text, VisuGlTextSize size); gboolean visu_gl_text_setFunc(VisuGlTextFunc func); gboolean visu_gl_text_setFontSize(float size); void visu_gl_text_drawChars(gchar *s, VisuGlTextSize size); void visu_gl_text_initFontList(); void visu_gl_text_rebuildFontList(); void visu_gl_text_onNewContext(); void visu_gl_text_putTextWithFTGL(const gchar *text, VisuGlTextSize size); #endif v_sim-3.7.0/src/openGLFunctions/view.c0000644000353400050620000017320212215546102014546 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include #include #include #include #include #include #include #include "view.h" /** * SECTION:view * @short_description: Defines all necessary informations for the * rendering of a view. * * The #VisuGlView stores three basic informations: one for the * position and orientation of the camera (#VisuGlCamera), one for the * description of the bounding box in the OpenGL coordinates * (#OpenGLBox, should be moved elsewhere later) and one last for the * definition of the viewing window (#VisuGlWindow, including volumic * informations). * * One resource is used by this part, defining the precision * desired by the user when drawing OpenGL objects. This precision can * be changed using visu_gl_view_class_setPrecision() and all V_Sim part * drawing something should use visu_gl_view_getDetailLevel() to * know the size of the vertices to be drawn depending on this * precision and the level of zoom. * * The rendering is done in an OpenGl viewport whose size is * given by the bounding box (plus 10%). The camera can be positionned * with three angles (theta, phi and omega) and has a zoom factor * (gross) and a perspective value (d_red). The angle theta is around * the z axis (box coordinates), phi is around the new x axis (after * the theta rotation) and omega is a rotation around the axis which * goes from the observer to the center of the bounding box. By * default the camera looks at the center of the bounding box but this * can be changed with the Xs and Ys parameters. These values are * stored and are readable through the #VisuGlCamera structure. They * must be changed with the following methods : * openGLViewSet_thetaPhiOmega(), openGLViewSet_gross(), * openGLViewSet_persp() and openGLViewSet_XsYs(). */ /** * VisuGlView: * * A container structure to deal with OpenGL observer position, size of rendering * viewport... */ /** * VisuGlCamera: * @d_red: a factor for perspective from 1. to inifnity. With one, the nose of * the observer is completly set on the rendered object, and the size * of the observer is neglectible compared to the size of the object. * @theta: the theta angle in spherical coordinates of the position of the observer ; * @phi: the phi angle in spherical coordinates of the position of the observer ; * @omega: rotation of the observer on itself ; * @xs: a value for translation of the viewport on x axis ; * @ys: a value for translation of the viewport on y axis ; * @gross: a value of zoom ; * @length0: a length reference to adimension all values, by default, * this is the longest diagonal of the current box (without * duplication) ; * @up: (in) (array fixed-size=3): the current up vector. * @upAxis: which axis define the north pole. * @centre: (in) (array fixed-size=3): position of the eye look at ; * @eye: (in) (array fixed-size=3): position of the eye. * @unit: the unit of @length0. * * Values to define the position of the observer. */ /** * VisuGlWindow: * @extens: additional length to add to length0 to obtain the global * viewable area. * @unit: the #ToolUnits of @extens. * @width : the width of the window ; * @height : the height of the window ; * @near : the beginning of the viewport on z axis (z for observer) ; * @far : the end of the viewport on z axis (z for observer) ; * @left : the left of the viewport on x axis ; * @right : the right of the viewport on x axis ; * @bottom : the bottom of the viewport on y axis ; * @top : the top of the viewport on y axis ; * * Values to describe the window where the render is done. */ /* Global value used as default when creating a new VisuGlView. */ static float anglesDefault[3] = {40., -50., 0.}; static float translatDefault[2] = {0.5, 0.5}; static float grossDefault = 1.; static float perspDefault = 5.; /* Local methods. */ static VisuGlCamera* camera_copy(VisuGlCamera *camera); /** * visu_gl_camera_get_type: * * Create and retrieve a #GType for a #VisuGlCamera object. * * Since: 3.7 * * Returns: a new type for #VisuGlCamera structures. */ GType visu_gl_camera_get_type(void) { static GType g_define_type_id = 0; if (g_define_type_id == 0) g_define_type_id = g_boxed_type_register_static("VisuGlCamera", (GBoxedCopyFunc)g_free, (GBoxedFreeFunc)camera_copy); return g_define_type_id; } /** * visu_gl_camera_copy: * @to: a location to copy values to * @from: a #VisuGlCamera to copy values from * * Do a deep copy of @from to @to. * * Since: 3.7 **/ void visu_gl_camera_copy(VisuGlCamera *to, const VisuGlCamera *from) { to->theta = from->theta; to->phi = from->phi; to->omega = from->omega; to->xs = from->xs; to->ys = from->ys; to->gross = from->gross; to->d_red = from->d_red; to->length0 = from->length0; to->unit = from->unit; to->upAxis = from->upAxis; to->centre[0] = from->centre[0]; to->centre[1] = from->centre[1]; to->centre[2] = from->centre[2]; to->up[0] = from->up[0]; to->up[1] = from->up[1]; to->up[2] = from->up[2]; to->eye[0] = from->eye[0]; to->eye[1] = from->eye[1]; to->eye[2] = from->eye[2]; } static VisuGlCamera* camera_copy(VisuGlCamera *camera) { VisuGlCamera *out; out = g_malloc(sizeof(VisuGlCamera)); visu_gl_camera_copy(out, camera); return out; } /** * visu_gl_camera_setThetaPhiOmega: * @camera: a valid #VisuGlCamera object ; * @valueTheta: a floatinf point value in degrees ; * @valuePhi: a floating point value in degrees ; * @valueOmega: a floating point value in degrees ; * @mask: to specified what values will be changed. * * Change the orientation of the camera to the specified angles. * * Returns: TRUE if the signal OpenGLAskForReDraw should be emitted. */ gboolean visu_gl_camera_setThetaPhiOmega(VisuGlCamera *camera, float valueTheta, float valuePhi, float valueOmega, int mask) { float valT, valP, valO; int idem; g_return_val_if_fail(camera, FALSE); idem = 1; if (mask & VISU_GL_CAMERA_THETA) { valT = valueTheta; while (valT < -180.) valT += 360.; while (valT > 180.) valT -= 360.; if (camera->theta != valT) { idem = 0; camera->theta = valT; } } if (mask & VISU_GL_CAMERA_PHI) { valP = valuePhi; while (valP < -180.) valP += 360.; while (valP > 180.) valP -= 360.; if (camera->phi != valP) { idem = 0; camera->phi = valP; } } if (mask & VISU_GL_CAMERA_OMEGA) { valO = valueOmega; while (valO < -180.) valO += 360.; while (valO > 180.) valO -= 360.; if (camera->omega != valO) { idem = 0; camera->omega = valO; } } if (idem) return FALSE; /* modelize(view); */ /* g_signal_emit (visu, VISU_GET_CLASS (visu)->OpenGLThetaPhi_signal_id, */ /* 0 , NULL); */ return TRUE; } /** * visu_gl_camera_setXsYs: * @camera: a valid #VisuGlCamera object ; * @valueX: a floatinf point value in the bounding box scale * (1 is the size of the bounding box) ; * @valueY: a floating point value in bounding box scale ; * @mask: to specified what values will be changed. * * Change the point where the camera is pointed to. * * Returns: TRUE if the signal OpenGLAskForReDraw should be emitted. */ gboolean visu_gl_camera_setXsYs(VisuGlCamera *camera, float valueX, float valueY, int mask) { float valX, valY, dX, dY/* , z */; /* float O[3]; */ g_return_val_if_fail(camera, FALSE); dX = 0.f; dY = 0.f; if (mask & VISU_GL_CAMERA_XS) { valX = valueX; if (valX < -3.) valX = -3.; if (valX > 3.) valX = 3.; if (camera->xs != valX) { dX = valX - camera->xs; camera->xs = valX; } } if (mask & VISU_GL_CAMERA_YS) { valY = valueY; if (valY < -3.) valY = -3.; if (valY > 3.) valY = 3.; if (camera->ys != valY) { dY = valY - camera->ys; camera->ys = valY; } } if (dX == 0.f && dY == 0.f) return FALSE; /* g_signal_emit (visu, VISU_GET_CLASS (visu)->OpenGLXsYs_signal_id, */ /* 0 , NULL); */ /* project(view); */ /* Change the eyes position. */ /* O[0] = view->camera->centre[0] + view->box->dxxs2; */ /* O[1] = view->camera->centre[1] + view->box->dyys2; */ /* O[2] = view->camera->centre[2] + view->box->dzzs2; */ /* z = visu_gl_view_getZCoordinate(view, O); */ /* DBG_fprintf(stderr, "OpenGL View: new window coordinates (%f;%f;%f).\n", */ /* 0.5f * view->window->width, 0.5f * view->window->height, z); */ /* visu_gl_view_getRealCoordinates(view, view->camera->centre, */ /* 0.5f * view->window->width, */ /* 0.5f * view->window->height, z, FALSE); */ /* modelize(view); */ return TRUE; } /** * visu_gl_camera_setGross: * @camera: a valid #VisuGlCamera object ; * @value: a positive floating point value. * * Change the value of the camera zoom value. If the value is higher than 10 * it is set to 10 and if the value is negative it is set to 0.001. * * Returns: TRUE if the signal OpenGLAskForReDraw should be emitted. */ gboolean visu_gl_camera_setGross(VisuGlCamera *camera, float value) { float val; g_return_val_if_fail(camera, FALSE); val = value; if (val < 0.02) val = 0.02; else if (val > 999.) val = 999.; if (camera->gross == val) return FALSE; camera->gross = val; /* g_signal_emit (visu, VISU_GET_CLASS (visu)->OpenGLGross_signal_id, */ /* 0 , NULL); */ /* project(view); */ /* g_signal_emit (visu, VISU_GET_CLASS (visu)->OpenGLFacetteChanged_signal_id, */ /* 0 , NULL); */ return TRUE; } /** * visu_gl_camera_setPersp: * @camera: a valid #VisuGlCamera object ; * @value: a floating point value greater than 1.1. * * Change the value of the camera perspective value and put it in * bounds if needed. * * Returns: TRUE if the signal OpenGLAskForReDraw should be emitted. */ gboolean visu_gl_camera_setPersp(VisuGlCamera *camera, float value) { g_return_val_if_fail(camera, FALSE); DBG_fprintf(stderr, "Visu GlCamera: set persp to %g (%g).\n", value, camera->d_red); value = CLAMP(value, 1.1f, 100.f); if (camera->d_red == value) return FALSE; camera->d_red = value; /* project(view); */ /* modelize(view); */ return TRUE; } /** * visu_gl_window_setViewport: * @window: a valid #VisuGlWindow object ; * @width: the new horizontal size ; * @height: the new vertical size. * * It changes the size of the OpenGl area and reccompute the OpenGL viewport. * * Returns: TRUE the size of @window is actually changed. */ gboolean visu_gl_window_setViewport(VisuGlWindow *window, guint width, guint height) { DBG_fprintf(stderr, "OpenGL Window: set viewport size (%dx%d) for window %p.\n", width, height, (gpointer)window); g_return_val_if_fail(window, FALSE); if (window->width == width && window->height == height) return FALSE; DBG_fprintf(stderr, " | old values were %dx%d.\n", window->width, window->height); window->width = width; window->height = height; glViewport(0, 0, window->width, window->height); return TRUE; } /** * visu_gl_window_setAddLength: * @window: a #VisuGlWindow object. * @value: a float value (positive). * @unit: the unit of @value. * * The viewable area is defined by the #VisuGlCamera size, as set by * visu_gl_camera_setRefLength() and by additional space setup by this routine. * * Since: 3.7 * * Returns: TRUE if the value is indeed changed and * visu_gl_window_project() should be called. **/ gboolean visu_gl_window_setAddLength(VisuGlWindow *window, float value, ToolUnits unit) { DBG_fprintf(stderr, "OpenGL Window: set additional length (%f) for window %p.\n", value, (gpointer)window); g_return_val_if_fail(window, FALSE); if (window->extens == value && window->unit == unit) return FALSE; window->extens = value; window->unit = unit; return TRUE; } /** * visu_gl_window_getAddLength: * @window: a #VisuGlWindow object. * @unit: (allow-none): a location for the unit of the returned value. * * The viewable area is defined by the #VisuGlCamera size, as set by * visu_gl_camera_setRefLength() and by additional space setup by * visu_gl_window_setAddLength(). * * Since: 3.7 * * Returns: the additional length to be added to the camera object * size to obtain the full viewable area. **/ float visu_gl_window_getAddLength(VisuGlWindow *window, ToolUnits *unit) { g_return_val_if_fail(window, FALSE); DBG_fprintf(stderr, "OpenGL Window: get additional length (%f) for window %p.\n", window->extens, (gpointer)window); if (unit) *unit = window->unit; return window->extens; } /** * visu_gl_camera_setUpAxis: * @camera: a #VisuGlCamera object. * @upAxis: a direction. * * In constraint observation mode, the "north" direction is a singular * one. Define this direction with this routine. * * Since: 3.6 */ void visu_gl_camera_setUpAxis(VisuGlCamera *camera, VisuGlCameraAxis upAxis) { g_return_if_fail(camera); camera->upAxis = upAxis; } /** * visu_gl_camera_setRefLength: * @camera: a #VisuGlCamera object. * @value: a new length. * @unit: its measurement unit. * * Change the reference value that is used for the zoom. * * Since: 3.6 * * Returns: TRUE if the value is indeed changed. */ gboolean visu_gl_camera_setRefLength(VisuGlCamera *camera, float value, ToolUnits unit) { g_return_val_if_fail(camera, FALSE); if (camera->length0 == value && camera->unit == unit) return FALSE; camera->length0 = value; camera->unit = unit; return TRUE; } /** * visu_gl_camera_getRefLength: * @camera: a #VisuGlCamera object. * @unit: a location for unit value (can be NULL). * * The zoom is define from a reference length in given unit. If @unit * is provided, the corresponding unit will be set. * * Since: 3.6 * * Returns: the current reference length. */ float visu_gl_camera_getRefLength(VisuGlCamera *camera, ToolUnits *unit) { g_return_val_if_fail(camera, -1.f); if (unit) *unit = camera->unit; return camera->length0; } /** * visu_gl_camera_modelize: * @camera: a #VisuGlCamera object. * * Set-up the orientation matrix, depending on the camera definition. */ void visu_gl_camera_modelize(VisuGlCamera *camera) { double theta_rad, d_red; double phi_rad; double sth, cth, sph, cph, com, som; double distance; int permut[3][3] = {{1,2,0}, {2,0,1}, {0,1,2}}; g_return_if_fail(camera); DBG_fprintf(stderr, "OpenGL Camera: modelize view.\n"); DBG_fprintf(stderr, "OpenGL Camera: using ref length %g.\n", camera->length0); if (camera->d_red > 100.) d_red = 100.; else d_red = camera->d_red; theta_rad = camera->theta * TOOL_PI180; phi_rad = camera->phi * TOOL_PI180; distance = d_red * camera->length0; sth = sin(theta_rad); cth = cos(theta_rad); sph = sin(phi_rad); cph = cos(phi_rad); com = cos(camera->omega * TOOL_PI180); som = sin(camera->omega * TOOL_PI180); /* La matrice de rotation est la suivante pour passer des coordonnes transformes aux coordonnes de l'cran : /cph.cth -sph cph.sth\ |sph.cth cph sph.sth| (for z as north axis) \ -sth 0 cth/ / cph -sph.sth sph.cth\ | 0 cth sth| (for y as north axis) \-sph -sth.cph cph.cth/ Ainsi la camra qui est situ en (0,0,Distance) dans le repre transform devient dans le repre de l'cran : */ camera->eye[permut[camera->upAxis][0]] = distance*sth*cph; camera->eye[permut[camera->upAxis][1]] = distance*sth*sph; camera->eye[permut[camera->upAxis][2]] = distance*cth; /* Vecteur donnant la direction verticale. Dans le repre transform il est (-1,0,0). */ camera->up[permut[camera->upAxis][0]] = -cth*cph*com + sph*som; camera->up[permut[camera->upAxis][1]] = -cth*sph*com - cph*som; camera->up[permut[camera->upAxis][2]] = sth*com; DBG_fprintf(stderr, "Visu GlView: modelize with:\n"); DBG_fprintf(stderr, " | %g %g %g %g %g %g %g %g %g\n", camera->eye[0], camera->eye[1], camera->eye[2], camera->centre[0], camera->centre[1], camera->centre[2], camera->up[0], camera->up[1], camera->up[2]); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(camera->eye[0], camera->eye[1], camera->eye[2], camera->centre[0], camera->centre[1], camera->centre[2], camera->up[0], camera->up[1], camera->up[2]); } /** * visu_gl_window_project: * @window: definition of the screen. * @camera: position of the camera. * * This method is used to set the projection and the OpenGL viewport. */ void visu_gl_window_project(VisuGlWindow *window, const VisuGlCamera *camera) { double x, y, xmin, xmax, ymin, ymax, fact, rap; double rap_win, d_red; g_return_if_fail(camera && window); DBG_fprintf(stderr, "OpenGL View: project view (%d, %d).\n", camera->unit, window->unit); DBG_fprintf(stderr, " | %g %g.\n", camera->length0, window->extens); g_return_if_fail(camera->unit == window->unit); if (camera->d_red > 100.) d_red = 100.; else d_red = camera->d_red; fact = d_red * camera->length0; window->near = MAX(0.01, fact - window->extens); window->far = fact + window->extens; fact = window->near / camera->gross / d_red; rap = 2. * window->near / (d_red - 1.); x = (0.5 - camera->xs) * rap; xmin = x - fact; xmax = x + fact; y = (0.5 - camera->ys) * rap; ymin = y - fact; ymax = y + fact; window->left = xmin; window->bottom = ymin; rap_win = (1.0*window->height)/window->width; if ( 1. > rap_win ) { window->top = ymax; fact = (ymax - ymin) / rap_win; window->left = 0.5 * (xmin + xmax - fact); window->right = 0.5 * (xmin + xmax + fact); } else if ( 1. < rap_win ) { window->right = xmax; fact = (xmax - xmin) * rap_win; window->bottom = 0.5 * (ymin + ymax - fact); window->top = 0.5 * (ymin + ymax + fact); } else { window->right = xmax; window->top = ymax; } DBG_fprintf(stderr, "Visu GlView: project:\n"); DBG_fprintf(stderr, " | %g %g %g %g %g %g\n", window->left, window->right, window->bottom, window->top, window->near, window->far); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (d_red == 100.) glOrtho(window->left, window->right, window->bottom, window->top, window->near, window->far); else glFrustum(window->left, window->right, window->bottom, window->top, window->near, window->far); glMatrixMode(GL_MODELVIEW); } /***************************/ /* The #VisuGlView object. */ /***************************/ enum { THETA_PHI_OMEGA_CHANGED_SIGNAL, XS_YS_CHANGED_SIGNAL, GROSS_CHANGED_SIGNAL, PERSP_CHANGED_SIGNAL, NEAR_FAR_CHANGED_SIGNAL, WIDTH_HEIGHT_CHANGED_SIGNAL, REF_LENGTH_CHANGED_SIGNAL, FACETTES_CHANGED_SIGNAL, LAST_SIGNAL }; /** * VisuGlViewClass: * @parent: the parent class. * @priv: private members. * * An opaque structure. */ /** * VisuGlViewClassPrivate: * * An opaque structure. */ struct _VisuGlViewClassPrivate { float precision; }; /* This is a positive float that enable to increase or decrease the rendering load by modifying the number of facettes. */ #define FLAG_PARAMETER_OPENGL_DETAILS "opengl_details" #define DESC_PARAMETER_OPENGL_DETAILS "Give a value to the quality of rendering (100 is normal) ; positive integer" #define PARAMETER_OPENGL_DETAILS_DEFAULT 100 static gboolean readOpenGLPrecision(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static void exportParametersVisuGlView(GString *data, VisuData *dataObj, VisuGlView *view); #define FLAG_RESOURCE_OPENGL_ANGLES "opengl_theta_phi_omega" #define DESC_RESOURCE_OPENGL_ANGLES "2 real values (degrees) for user orientation with respect to sample" #define FLAG_RESOURCE_OPENGL_TRANSLAT "opengl_xs_ys" #define DESC_RESOURCE_OPENGL_TRANSLAT "2 real values for image position with respect to [0.0, 1.0]x[0.0, 1.0] window" #define FLAG_RESOURCE_OPENGL_GROSS "opengl_gross" #define DESC_RESOURCE_OPENGL_GROSS "gross factor (must be real > 0.0)" #define FLAG_RESOURCE_OPENGL_PERSP "opengl_d_red" #define DESC_RESOURCE_OPENGL_PERSP "reduced perspective distance (must be real > 1.0)" static void exportResourcesVisuGlView(GString *data, VisuData *dataObj, VisuGlView *view); static void visu_gl_view_dispose (GObject* obj); static void visu_gl_view_finalize (GObject* obj); static void visu_boxed_interface_init(VisuBoxedInterface *iface); static guint visu_gl_view_signals[LAST_SIGNAL] = { 0 }; /* Callbacks. */ static void onSizeChanged(VisuBox *box, gfloat extens, gpointer data); static void onUnitChanged(VisuBox *box, gfloat fact, gpointer data); static void onBoundaryChanged(VisuBox *box, gpointer data); static void onEntryAngles(VisuGlView *view, gchar *key, VisuObject *obj); static void onEntryTrans(VisuGlView *view, gchar *key, VisuObject *obj); static void onEntryGross(VisuGlView *view, gchar *key, VisuObject *obj); static void onEntryPersp(VisuGlView *view, gchar *key, VisuObject *obj); /* Local methods. */ static void _setBoundary(VisuGlView *view, VisuBox *box); static VisuBox* _getBox(VisuBoxed *boxed); static gboolean _setBox(VisuBoxed *boxed, VisuBox* box, gboolean update); G_DEFINE_TYPE_WITH_CODE(VisuGlView, visu_gl_view, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE(VISU_TYPE_BOXED, visu_boxed_interface_init)) static void visu_gl_view_class_init(VisuGlViewClass *klass) { float rg[2] = {-G_MAXFLOAT, G_MAXFLOAT}; float rgGross[2] = {0.02f, 999.f}; float rgPersp[2] = {1.1f, 100.f}; VisuConfigFileEntry *resourceEntry; DBG_fprintf(stderr, "Visu GlView: creating the class of the object.\n"); /* Connect the overloading methods. */ G_OBJECT_CLASS(klass)->dispose = visu_gl_view_dispose; G_OBJECT_CLASS(klass)->finalize = visu_gl_view_finalize; DBG_fprintf(stderr, " - adding new signals ;\n"); /** * VisuGlView::ThetaPhiOmegaChanged: * @view: the object which received the signal ; * * Gets emitted when the camera angles have been changed. * * Since: 3.2 */ visu_gl_view_signals[THETA_PHI_OMEGA_CHANGED_SIGNAL] = g_signal_new("ThetaPhiOmegaChanged", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * VisuGlView::XsYsChanged: * @view: the object which received the signal ; * * Gets emitted when the camera position has been changed. * * Since: 3.2 */ visu_gl_view_signals[XS_YS_CHANGED_SIGNAL] = g_signal_new("XsYsChanged", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * VisuGlView::GrossChanged: * @view: the object which received the signal ; * * Gets emitted when the camera zoom factor has been changed. * * Since: 3.2 */ visu_gl_view_signals[GROSS_CHANGED_SIGNAL] = g_signal_new("GrossChanged", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * VisuGlView::PerspChanged: * @view: the object which received the signal ; * * Gets emitted when the camera perspective factor has been changed. * * Since: 3.2 */ visu_gl_view_signals[PERSP_CHANGED_SIGNAL] = g_signal_new("PerspChanged", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * VisuGlView::NearFarChanged: * @view: the object which received the signal ; * * Gets emitted when the viewing field has been changed. * * Since: 3.2 */ visu_gl_view_signals[NEAR_FAR_CHANGED_SIGNAL] = g_signal_new("NearFarChanged", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * VisuGlView::WidthHeightChanged: * @view: the object which received the signal ; * * Gets emitted when the viewing frame has been changed. * * Since: 3.2 */ visu_gl_view_signals[WIDTH_HEIGHT_CHANGED_SIGNAL] = g_signal_new("WidthHeightChanged", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * VisuGlView::RefLengthChanged: * @view: the object which received the signal ; * * Gets emitted when the reference length of the camera has been changed. * * Since: 3.7 */ visu_gl_view_signals[REF_LENGTH_CHANGED_SIGNAL] = g_signal_new("RefLengthChanged", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * VisuGlView::DetailLevelChanged: * @view: the object which received the signal ; * * Gets emitted when precision of the drawn object has been changed. * * Since: 3.2 */ visu_gl_view_signals[FACETTES_CHANGED_SIGNAL] = g_signal_new("DetailLevelChanged", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); DBG_fprintf(stderr, " - adding resources ;\n"); /* Parameters */ resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_OPENGL_DETAILS, DESC_PARAMETER_OPENGL_DETAILS, 1, readOpenGLPrecision); visu_config_file_addExportFunction(VISU_CONFIG_FILE_PARAMETER, exportParametersVisuGlView); /* Resources */ resourceEntry = visu_config_file_addFloatArrayEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_OPENGL_ANGLES, DESC_RESOURCE_OPENGL_ANGLES, 3, anglesDefault, rg); visu_config_file_entry_setVersion(resourceEntry, 3.1f); resourceEntry = visu_config_file_addFloatArrayEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_OPENGL_TRANSLAT, DESC_RESOURCE_OPENGL_TRANSLAT, 2, translatDefault, rg); resourceEntry = visu_config_file_addFloatArrayEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_OPENGL_GROSS, DESC_RESOURCE_OPENGL_GROSS, 1, &grossDefault, rgGross); resourceEntry = visu_config_file_addFloatArrayEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_OPENGL_PERSP, DESC_RESOURCE_OPENGL_PERSP, 1, &perspDefault, rgPersp); visu_config_file_addExportFunction(VISU_CONFIG_FILE_RESOURCE, exportResourcesVisuGlView); klass->priv = g_malloc(sizeof(VisuGlViewClassPrivate)); klass->priv->precision = (float)PARAMETER_OPENGL_DETAILS_DEFAULT / 100.; } static void visu_boxed_interface_init(VisuBoxedInterface *iface) { iface->get_box = _getBox; iface->set_box = _setBox; } static void visu_gl_view_init(VisuGlView *view) { DBG_fprintf(stderr, "Visu GlView: initializing a new object (%p).\n", (gpointer)view); view->dispose_has_run = FALSE; view->box = (VisuBox*)0; view->box_signal = 0; view->unit_signal = 0; view->bc_signal = 0; view->camera = g_malloc(sizeof(VisuGlCamera)); view->window = g_malloc(sizeof(VisuGlWindow)); view->window->extens = 0.; view->window->width = 0; view->window->height = 0; view->window->near = 0.; view->window->far = 0.; view->window->unit = TOOL_UNITS_UNDEFINED; view->camera->theta = anglesDefault[0]; view->camera->phi = anglesDefault[1]; view->camera->omega = anglesDefault[2]; view->camera->xs = translatDefault[0]; view->camera->ys = translatDefault[1]; view->camera->gross = grossDefault; view->camera->d_red = perspDefault; view->camera->length0 = -1.; view->camera->unit = TOOL_UNITS_UNDEFINED; view->camera->upAxis = VIEW_Z; view->camera->centre[0] = 0.f; view->camera->centre[1] = 0.f; view->camera->centre[2] = 0.f; DBG_fprintf(stderr, " | theta = %g\n", view->camera->theta); DBG_fprintf(stderr, " | phi = %g\n", view->camera->phi); DBG_fprintf(stderr, " | omega = %g\n", view->camera->omega); DBG_fprintf(stderr, " | dx-dy = %g %g\n", view->camera->xs, view->camera->ys); DBG_fprintf(stderr, " | gross = %g\n", view->camera->gross); DBG_fprintf(stderr, " | persp = %g\n", view->camera->d_red); DBG_fprintf(stderr, " | width x height = %d x %d\n", view->window->width, view->window->height); /* g_signal_emit_by_name(VISU_OBJECT_INSTANCE, "viewNew", view, NULL); */ g_signal_connect_object(VISU_OBJECT_INSTANCE, "entryParsed::" FLAG_RESOURCE_OPENGL_ANGLES, G_CALLBACK(onEntryAngles), (gpointer)view, G_CONNECT_SWAPPED); g_signal_connect_object(VISU_OBJECT_INSTANCE, "entryParsed::" FLAG_RESOURCE_OPENGL_TRANSLAT, G_CALLBACK(onEntryTrans), (gpointer)view, G_CONNECT_SWAPPED); g_signal_connect_object(VISU_OBJECT_INSTANCE, "entryParsed::" FLAG_RESOURCE_OPENGL_GROSS, G_CALLBACK(onEntryGross), (gpointer)view, G_CONNECT_SWAPPED); g_signal_connect_object(VISU_OBJECT_INSTANCE, "entryParsed::" FLAG_RESOURCE_OPENGL_PERSP, G_CALLBACK(onEntryPersp), (gpointer)view, G_CONNECT_SWAPPED); } /* This method can be called several times. It should unref all of its reference to GObjects. */ static void visu_gl_view_dispose(GObject* obj) { VisuGlView *view; DBG_fprintf(stderr, "Visu GlView: dispose object %p.\n", (gpointer)obj); view = VISU_GL_VIEW(obj); if (view->dispose_has_run) return; view->dispose_has_run = TRUE; _setBox(VISU_BOXED(view), (VisuBox*)0, TRUE); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_gl_view_parent_class)->dispose(obj); } /* This method is called once only. */ static void visu_gl_view_finalize(GObject* obj) { VisuGlView *view; g_return_if_fail(obj); DBG_fprintf(stderr, "Visu GlView: finalize object %p.\n", (gpointer)obj); view = VISU_GL_VIEW(obj); if (view->camera) g_free(view->camera); if (view->window) g_free(view->window); /* Chain up to the parent class */ DBG_fprintf(stderr, "Visu GlView: chain to parent.\n"); G_OBJECT_CLASS(visu_gl_view_parent_class)->finalize(obj); DBG_fprintf(stderr, "Visu GlView: freeing ... OK.\n"); } /** * visu_gl_view_new: * * Create a new #VisuGlView object with default values. * * Returns: (transfer full): the newly created object. */ VisuGlView* visu_gl_view_new(void) { VisuGlView *view; view = VISU_GL_VIEW(g_object_new(VISU_TYPE_GL_VIEW, NULL)); return view; } /** * visu_gl_view_new_withSize: * @w: the width ; * @h: the height. * * Create a new #VisuGlView object with default values and the given * window size. * * Since: 3.7 * * Returns: (transfer full): the newly created object. */ VisuGlView* visu_gl_view_new_withSize(guint w, guint h) { VisuGlView *view; view = VISU_GL_VIEW(g_object_new(VISU_TYPE_GL_VIEW, NULL)); visu_gl_window_setViewport(view->window, w, h); return view; } /** * visu_gl_view_setBox: * @view: a #VisuGlView object. * @box: a #VisuBox object. * @adjust: a boolean. * * This routine attach @box to @view and call * visu_gl_view_setRefLength() and visu_gl_view_setObjectRadius() * accordingly. The reference length of @view is indeed changed only * if @adjust is TRUE or is not initialized yet. * * Since: 3.7 * * Returns: TRUE if the attached box has changed. **/ static gboolean _setBox(VisuBoxed *self, VisuBox *box, gboolean adjust) { VisuGlView *view; float fact; g_return_val_if_fail(VISU_IS_GL_VIEW(self), FALSE); view = VISU_GL_VIEW(self); if (box == view->box) return FALSE; if (view->box) { g_signal_handler_disconnect(G_OBJECT(view->box), view->box_signal); g_signal_handler_disconnect(G_OBJECT(view->box), view->unit_signal); g_signal_handler_disconnect(G_OBJECT(view->box), view->bc_signal); g_object_unref(view->box); } if (box) { g_object_ref(box); view->box_signal = g_signal_connect(G_OBJECT(box), "SizeChanged", G_CALLBACK(onSizeChanged), (gpointer)view); view->unit_signal = g_signal_connect(G_OBJECT(box), "UnitChanged", G_CALLBACK(onUnitChanged), (gpointer)view); view->bc_signal = g_signal_connect(G_OBJECT(box), "BoundaryChanged", G_CALLBACK(onBoundaryChanged), (gpointer)view); /* Update lengths. */ if (adjust || view->camera->length0 <= 0.f) visu_gl_view_setRefLength(view, visu_box_getGlobalSize(box, FALSE), visu_box_getUnit(box)); else { fact = 1.; if (view->camera->unit != TOOL_UNITS_UNDEFINED && visu_box_getUnit(box) != TOOL_UNITS_UNDEFINED) fact = tool_physic_getUnitValueInMeter(view->camera->unit) / tool_physic_getUnitValueInMeter(visu_box_getUnit(box)); visu_gl_view_setRefLength(view, view->camera->length0 * fact, visu_box_getUnit(box)); } visu_gl_view_setObjectRadius(view, visu_box_getGlobalSize(box, TRUE), visu_box_getUnit(box)); /* Update camera. */ _setBoundary(view, box); } else { view->box_signal = 0; view->unit_signal = 0; view->bc_signal = 0; } view->box = box; return TRUE; } static void onSizeChanged(VisuBox *box, gfloat extens, gpointer data) { VisuGlView *view = VISU_GL_VIEW(data); DBG_fprintf(stderr, "Visu GlView: caught 'SizeChanged'.\n"); visu_gl_view_setObjectRadius(view, extens, visu_box_getUnit(box)); DBG_fprintf(stderr, "Visu GlView: done 'SizeChanged'.\n"); } static void onUnitChanged(VisuBox *box, gfloat fact, gpointer data) { VisuGlView *view = VISU_GL_VIEW(data); ToolUnits unit; DBG_fprintf(stderr, "Visu GlView: caught 'UnitChanged'.\n"); unit = visu_box_getUnit(box); if (view->camera->unit != TOOL_UNITS_UNDEFINED && unit != TOOL_UNITS_UNDEFINED) fact = tool_physic_getUnitValueInMeter(view->camera->unit) / tool_physic_getUnitValueInMeter(unit); visu_gl_view_setRefLength(view, view->camera->length0 * fact, unit); /* Box size changed will be emitted after, so the object radius will be updated automatically. */ DBG_fprintf(stderr, "Visu GlView: done 'UnitChanged'.\n"); } static void onBoundaryChanged(VisuBox *box, gpointer data) { _setBoundary(VISU_GL_VIEW(data), box); } static void _setBoundary(VisuGlView *view, VisuBox *box) { switch (visu_box_getBoundary(box)) { case (VISU_BOX_PERIODIC): case (VISU_BOX_FREE): case (VISU_BOX_WIRE_X): case (VISU_BOX_WIRE_Y): case (VISU_BOX_WIRE_Z): case (VISU_BOX_SURFACE_XY): visu_gl_camera_setUpAxis(view->camera, VIEW_Z); break; case (VISU_BOX_SURFACE_YZ): visu_gl_camera_setUpAxis(view->camera, VIEW_X); break; case (VISU_BOX_SURFACE_ZX): visu_gl_camera_setUpAxis(view->camera, VIEW_Y); break; } } static VisuBox* _getBox(VisuBoxed *boxed) { g_return_val_if_fail(VISU_IS_GL_VIEW(boxed), (VisuBox*)0); return VISU_GL_VIEW(boxed)->box; } /** * visu_gl_view_getDetailLevel: * @view: a valid #VisuGlView object ; * @dimension: the size of the object which asks for its number of facettes. * * This is a function to get the number of "facettes" advised * by the server (according to its policy on rendering) * to draw an object according to a given dimension. * * Returns: the number of facettes the object should used. */ gint visu_gl_view_getDetailLevel(VisuGlView *view, float dimension) { gint rsize; gint nlat; #define NLAT_MIN 12 #define NLAT_MAX 50 #define RSIZE_MIN 10 #define RSIZE_MAX 250 #define NLAT_V_MIN 0 #define NLAT_V_MAX (NLAT_MIN) #define RSIZE_V_MIN 0 #define RSIZE_V_MAX (RSIZE_MIN) #define NLAT_MINI 3 #define NLAT_MAXI 100 static float fac = -1.0f, fac_v = -1.0f; g_return_val_if_fail(view->camera && view->window, -1); /* if (!visuCamera->gr || !visuCamera->gross) */ /* return -1; */ DBG_fprintf(stderr, "Visu GlView: get GL details for window %dx%d.\n", view->window->width, view->window->height); DBG_fprintf(stderr, " | gross = %g.\n", view->camera->gross); DBG_fprintf(stderr, " | persp = %g.\n", view->camera->d_red); DBG_fprintf(stderr, " | lgth0 = %g.\n", view->camera->length0); /* calculate once fac and fac_v!... */ if(fac < 0.0f) { fac = ((float)(NLAT_MAX - NLAT_MIN))/(RSIZE_MAX - RSIZE_MIN); fac_v = ((float)(NLAT_V_MAX - NLAT_V_MIN))/(RSIZE_V_MAX - RSIZE_V_MIN); } rsize = (int)((float)MIN(view->window->width, view->window->height) * (0.5 * dimension / view->camera->length0 * view->camera->gross * view->camera->d_red / (view->camera->d_red - 1.))); if(rsize < RSIZE_MIN) { nlat = (int)(NLAT_V_MIN + fac_v * (rsize - RSIZE_V_MIN)); if(nlat < NLAT_MINI) nlat = NLAT_MINI; } else if(rsize > RSIZE_MAX) { nlat = NLAT_MAX; } else { nlat = (int)(NLAT_MIN + fac * (rsize - RSIZE_MIN)); } nlat = (int)((float)nlat * VISU_GL_VIEW_GET_CLASS(view)->priv->precision); nlat = CLAMP(nlat, NLAT_MINI, NLAT_MAXI); DBG_fprintf(stderr, " | nlat = %d.\n", nlat); return nlat; } /** * visu_gl_view_class_setPrecision: * @value: a positive value (1. is normal precision). * * This function change the value of the parameter precisionOfRendering. It * changes the number of facettes advised for every objects. It allows to * increase or decrease the number of polygons drawn and thus acts on the * speed of rendering. * * Returns: TRUE if the signals OpenGLFacetteChanged and * OpenGLAskForReDraw should be emitted. */ gboolean visu_gl_view_class_setPrecision(float value) { gpointer *klass; klass = g_type_class_peek(VISU_TYPE_GL_VIEW); if (!klass) klass = g_type_class_ref(VISU_TYPE_GL_VIEW); if (value <= 0. || value == VISU_GL_VIEW_CLASS(klass)->priv->precision) return FALSE; VISU_GL_VIEW_CLASS(klass)->priv->precision = value; return TRUE; } /** * visu_gl_view_class_getPrecision: * * This function retrieve the value of the parameter precisionOfRendering. * * Returns: the actual precision. */ float visu_gl_view_class_getPrecision(void) { gpointer *klass; klass = g_type_class_peek(VISU_TYPE_GL_VIEW); if (!klass) klass = g_type_class_ref(VISU_TYPE_GL_VIEW); return VISU_GL_VIEW_CLASS(klass)->priv->precision; } /** * visu_gl_window_getFileUnitPerPixel: * @window: a valid #VisuGlWindow object. * * This method is used to know the ratio of a pixel with the unit of the file. * WARNING : this method is valid only when the camera is position at infinity. * * Returns: how much of a unit of file is in a pixel. */ float visu_gl_window_getFileUnitPerPixel(VisuGlWindow *window) { float deltaH, deltaV; g_return_val_if_fail(window, 0.); deltaH = window->right - window->left; deltaV = window->top - window->bottom; if (deltaH < deltaV) return deltaH / (float)window->width; else return deltaV / (float)window->height; } /** * visu_gl_camera_getScreenAxes: * @camera: a valid #VisuGlCamera. * @xAxis: (in) (array fixed-size=3): three float values representing x axis ; * @yAxis: (in) (array fixed-size=3): three float values representing y axis. * * This method is used to get the coordinates in box frame of x axis and y axis * of the current camera view. */ void visu_gl_camera_getScreenAxes(VisuGlCamera *camera, float xAxis[3], float yAxis[3]) { double cth, sth, cph, sph, com, som; float matPhi[3][3], matTheta[3][3], matOmega[3][3]; float matRes[3][3], matRes2[3][3]; float axis[3]; g_return_if_fail(camera); cth = cos(camera->theta * TOOL_PI180); sth = sin(camera->theta * TOOL_PI180); cph = cos(camera->phi * TOOL_PI180); sph = sin(camera->phi * TOOL_PI180); com = cos(camera->omega * TOOL_PI180); som = sin(camera->omega * TOOL_PI180); matPhi[0][0] = cph; matPhi[1][0] = sph; matPhi[2][0] = 0.; matPhi[0][1] = -sph; matPhi[1][1] = cph; matPhi[2][1] = 0.; matPhi[0][2] = 0.; matPhi[1][2] = 0.; matPhi[2][2] = 1.; matTheta[0][0] = cth; matTheta[1][0] = 0.; matTheta[2][0] = -sth; matTheta[0][1] = 0.; matTheta[1][1] = 1.; matTheta[2][1] = 0.; matTheta[0][2] = sth; matTheta[1][2] = 0.; matTheta[2][2] = cth; matOmega[0][0] = com; matOmega[1][0] = som; matOmega[2][0] = 0.; matOmega[0][1] = -som; matOmega[1][1] = com; matOmega[2][1] = 0.; matOmega[0][2] = 0.; matOmega[1][2] = 0.; matOmega[2][2] = 1.; tool_matrix_productMatrix(matRes, matTheta, matOmega); tool_matrix_productMatrix(matRes2, matPhi, matRes); axis[0] = 0.; axis[1] = 1.; axis[2] = 0.; tool_matrix_productVector(xAxis, matRes2, axis); axis[0] = -1.; axis[1] = 0.; axis[2] = 0.; tool_matrix_productVector(yAxis, matRes2, axis); } /** * visu_gl_view_getZCoordinate: * @view: a #VisuGlView object. * @xyz: a cartesian point. * * Use this routine to know the Z value of a real point defined by * @xyz in caretsian coordinates. */ float visu_gl_view_getZCoordinate(VisuGlView *view, float xyz[3]) { GLdouble model[16], project[16]; GLint viewport[4]; GLdouble xyzGL[3], winGL[3]; g_return_val_if_fail(view, 0.5f); glGetDoublev(GL_MODELVIEW_MATRIX, model); glGetDoublev(GL_PROJECTION_MATRIX, project); glGetIntegerv(GL_VIEWPORT, viewport); xyzGL[0] = (GLdouble)xyz[0]; xyzGL[1] = (GLdouble)xyz[1]; xyzGL[2] = (GLdouble)xyz[2]; gluProject(xyzGL[0], xyzGL[1], xyzGL[2], model, project, viewport, winGL, winGL + 1, winGL + 2); DBG_fprintf(stderr, "OpenGL View: get z coordinates from %gx%gx%g: %g.\n", xyz[0], xyz[1], xyz[2], (float)winGL[2]); DBG_fprintf(stderr, " | win coords: %gx%g\n", (float)winGL[0], (float)winGL[1]); return (float)winGL[2]; } /** * visu_gl_view_getRealCoordinates: * @view: a #VisuGlView object. * @xyz: a location to store the result. * @winx: position on X axis of screen. * @winy: position on Y axis of screen. * @winz: height before projection on screen. * * Use this routine to get the cartesian coordinates in real space of * a point located at @winx and @winy on screen. */ void visu_gl_view_getRealCoordinates(VisuGlView *view, float xyz[3], float winx, float winy, float winz) { GLdouble model[16], project[16]; GLint viewport[4]; GLdouble xyzGL[3], winGL[3]; g_return_if_fail(view); glGetDoublev(GL_MODELVIEW_MATRIX, model); glGetDoublev(GL_PROJECTION_MATRIX, project); glGetIntegerv(GL_VIEWPORT, viewport); winGL[0] = (GLdouble)winx; winGL[1] = (GLdouble)(view->window->height - winy); winGL[2] = (GLdouble)winz; gluUnProject(winGL[0], winGL[1], winGL[2], model, project, viewport, xyzGL, xyzGL + 1, xyzGL + 2); xyz[0] = (float)xyzGL[0]; xyz[1] = (float)xyzGL[1]; xyz[2] = (float)xyzGL[2]; DBG_fprintf(stderr, "OpenGL View: get real coordinates from %gx%gx%g: %gx%gx%g.\n", winx, winy, winz, xyz[0], xyz[1], xyz[2]); } /** * visu_gl_view_setThetaPhiOmega: * @view: a #VisuGlView object ; * @valueTheta: a floatinf point value in degrees ; * @valuePhi: a floating point value in degrees ; * @valueOmega: a floating point value in degrees ; * @mask: to specified what values will be changed. * * This method is used to change the camera orientation for the given @view. * If necessary, this method will emit the 'ThetaPhiOmegaChanged' signal. * * Returns: 1 if the 'OpenGLAskForReDraw' signal should be emitted. */ gboolean visu_gl_view_setThetaPhiOmega(VisuGlView *view, float valueTheta, float valuePhi, float valueOmega, int mask) { gboolean res; g_return_val_if_fail(VISU_IS_GL_VIEW(view), FALSE); res = visu_gl_camera_setThetaPhiOmega(view->camera, valueTheta, valuePhi, valueOmega, mask); if (res) { visu_gl_camera_modelize(view->camera); g_signal_emit(view, visu_gl_view_signals[THETA_PHI_OMEGA_CHANGED_SIGNAL], 0, NULL); } return res; } /** * visu_gl_view_setXsYs: * @view: a #VisuGlView object ; * @valueX: a floatinf point value in the bounding box scale * (1 is the size of the bounding box) ; * @valueY: a floating point value in bounding box scale ; * @mask: to specified what values will be changed. * * This method is used to change the camera position for the given @view. * If necessary, this method will emit the 'XsYsChanged' signal. * * Returns: 1 if the 'OpenGLAskForReDraw' signal should be emitted. */ gboolean visu_gl_view_setXsYs(VisuGlView *view, float valueX, float valueY, int mask) { gboolean res; g_return_val_if_fail(VISU_IS_GL_VIEW(view), FALSE); res = visu_gl_camera_setXsYs(view->camera, valueX, valueY, mask); if (res) { visu_gl_window_project(view->window, view->camera); g_signal_emit(view, visu_gl_view_signals[XS_YS_CHANGED_SIGNAL], 0, NULL); } return res; } /** * visu_gl_view_setGross: * @view: a #VisuGlView object ; * @value: a positive floating point value. * * This method is used to change the camera zoom for the given @view. * If necessary, this method will emit the 'GrossChanged' signal and * the 'FacetteChangedChanged' signal. * * Returns: 1 if the 'OpenGLAskForReDraw' signal should be emitted. */ gboolean visu_gl_view_setGross(VisuGlView *view, float value) { gboolean res; g_return_val_if_fail(VISU_IS_GL_VIEW(view), FALSE); res = visu_gl_camera_setGross(view->camera, value); if (res) { g_signal_emit(view, visu_gl_view_signals[GROSS_CHANGED_SIGNAL], 0, NULL); g_signal_emit(view, visu_gl_view_signals[FACETTES_CHANGED_SIGNAL], 0, NULL); visu_gl_window_project(view->window, view->camera); g_signal_emit(view, visu_gl_view_signals[NEAR_FAR_CHANGED_SIGNAL], 0, NULL); } return res; } /** * visu_gl_view_setPersp: * @view: a #VisuGlView object ; * @value: a positive floating point value (> 1.1). * * This method is used to change the camera perspective for the given @view. * If necessary, this method will emit the 'PerspChanged' signal and * the 'FacetteChangedChanged' signal. * * Returns: 1 if the 'OpenGLAskForReDraw' signal should be emitted. */ gboolean visu_gl_view_setPersp(VisuGlView *view, float value) { gboolean res; g_return_val_if_fail(VISU_IS_GL_VIEW(view), FALSE); res = visu_gl_camera_setPersp(view->camera, value); if (res) { DBG_fprintf(stderr, "Visu GlView: emitting signals on persp changed.\n"); g_signal_emit(view, visu_gl_view_signals[PERSP_CHANGED_SIGNAL], 0, NULL); g_signal_emit(view, visu_gl_view_signals[FACETTES_CHANGED_SIGNAL], 0, NULL); visu_gl_camera_modelize(view->camera); visu_gl_window_project(view->window, view->camera); g_signal_emit(view, visu_gl_view_signals[NEAR_FAR_CHANGED_SIGNAL], 0, NULL); } return res; } /** * visu_gl_view_setViewport: * @view: a #VisuGlView object ; * @width: the new horizontal size ; * @height: the new vertical size. * * It changes the size of the OpenGl area and reccompute the OpenGL viewport. * Warning : it doesn't change the size of the window. * * Returns: TRUE if the 'AskForReDrawChanged' signal should be emitted. */ gboolean visu_gl_view_setViewport(VisuGlView *view, guint width, guint height) { gboolean res; g_return_val_if_fail(VISU_IS_GL_VIEW(view), FALSE); res = visu_gl_window_setViewport(view->window, width, height); if (res) { g_signal_emit(view, visu_gl_view_signals[WIDTH_HEIGHT_CHANGED_SIGNAL], 0, NULL); g_signal_emit(view, visu_gl_view_signals[FACETTES_CHANGED_SIGNAL], 0, NULL); visu_gl_window_project(view->window, view->camera); g_signal_emit(view, visu_gl_view_signals[NEAR_FAR_CHANGED_SIGNAL], 0, NULL); } return res; } /** * visu_gl_view_setRefLength: * @view: a #VisuGlView object ; * @lg: the new value. * @units: the unit to read @lg with. * * This method is used to change the camera reference length for the given @view. * If necessary, this method will modelize and emit the 'RefLengthChanged' signal. * * Returns: TRUE if the 'OpenGLAskForReDraw' signal should be emitted. */ gboolean visu_gl_view_setRefLength(VisuGlView *view, float lg, ToolUnits units) { gboolean res; g_return_val_if_fail(VISU_IS_GL_VIEW(view), FALSE); res = visu_gl_camera_setRefLength(view->camera, lg, units); if (res) { visu_gl_camera_modelize(view->camera); g_signal_emit(view, visu_gl_view_signals[REF_LENGTH_CHANGED_SIGNAL], 0, NULL); } return res; } /** * visu_gl_view_setObjectRadius: * @view: a #VisuGlView object ; * @lg: the new value. * @units: the unit to read @lg with. * * This method is used to change the window frustum for the given @view. * If necessary, this method will project and emit the * 'NearFarChanged' signal. * * Since: 3.7 * * Returns: TRUE if the 'OpenGLAskForReDraw' signal should be emitted. */ gboolean visu_gl_view_setObjectRadius(VisuGlView *view, float lg, ToolUnits units) { gboolean res; g_return_val_if_fail(VISU_IS_GL_VIEW(view), FALSE); res = visu_gl_window_setAddLength(view->window, lg, units); if (res) { visu_gl_window_project(view->window, view->camera); g_signal_emit(view, visu_gl_view_signals[NEAR_FAR_CHANGED_SIGNAL], 0, NULL); } return res; } /** * visu_gl_view_rotateBox: * @view: a valid #VisuGlView object ; * @dTheta: a float value ; * @dPhi: a float value ; * @angles: (out) (array fixed-size=2): a storing area two floats. * * This methods rotates the camera of the given @view of (@dTheta, @dPhi) and * put new theta and phi angles in @angles, first being theta and second phi. */ void visu_gl_view_rotateBox(VisuGlView *view, float dTheta, float dPhi, float angles[2]) { g_return_if_fail(view && angles); angles[0] = view->camera->theta + dTheta; angles[1] = view->camera->phi + dPhi; } /** * visu_gl_view_rotateCamera: * @view: a valid #VisuGlView object ; * @dTheta: a float value ; * @dPhi: a float value ; * @angles: (out) (array fixed-size=3): a storing area three floats. * * This methods rotates the camera of the given @view of (@dTheta, @dPhi). * @dTheta is taken as displacement along camera x axis and dPhi along camera y axis. * Then, computations are done to obtain new theta, phi and omega values. They are * put in @angles, first being theta, second phi and third omega. */ void visu_gl_view_rotateCamera(VisuGlView *view, float dTheta, float dPhi, float angles[3]) { double cth, sth, cph, sph, com, som; double cdth, sdth, cdph, sdph; double Theta, Phi, Omega; #define RADTODEG 57.29577951 float MinRprime[3], MinR[3]; float Mspherical[3]; float matPhi[3][3], matTheta[3][3], matOmega[3][3], matdPhi[3][3], matdTheta[3][3]; float matPhiPrime[3][3], matThetaPrime[3][3]; float matRprime2R[3][3]; float matRes[3][3], matRes2[3][3]; g_return_if_fail(view && angles); cth = cos(view->camera->theta * TOOL_PI180); sth = sin(view->camera->theta * TOOL_PI180); cph = cos(view->camera->phi * TOOL_PI180); sph = sin(view->camera->phi * TOOL_PI180); com = cos(view->camera->omega * TOOL_PI180); som = sin(view->camera->omega * TOOL_PI180); cdth = cos(dTheta * TOOL_PI180); sdth = sin(dTheta * TOOL_PI180); cdph = cos(dPhi * TOOL_PI180); sdph = sin(dPhi * TOOL_PI180); matPhi[0][0] = cph; matPhi[1][0] = sph; matPhi[2][0] = 0.; matPhi[0][1] = -sph; matPhi[1][1] = cph; matPhi[2][1] = 0.; matPhi[0][2] = 0.; matPhi[1][2] = 0.; matPhi[2][2] = 1.; matTheta[0][0] = cth; matTheta[1][0] = 0.; matTheta[2][0] = -sth; matTheta[0][1] = 0.; matTheta[1][1] = 1.; matTheta[2][1] = 0.; matTheta[0][2] = sth; matTheta[1][2] = 0.; matTheta[2][2] = cth; matOmega[0][0] = com; matOmega[1][0] = som; matOmega[2][0] = 0.; matOmega[0][1] = -som; matOmega[1][1] = com; matOmega[2][1] = 0.; matOmega[0][2] = 0.; matOmega[1][2] = 0.; matOmega[2][2] = 1.; matdPhi[0][0] = 1.; matdPhi[1][0] = 0.; matdPhi[2][0] = 0.; matdPhi[0][1] = 0.; matdPhi[1][1] = cdph; matdPhi[2][1] = -sdph; matdPhi[0][2] = 0.; matdPhi[1][2] = sdph; matdPhi[2][2] = cdph; matdTheta[0][0] = cdth; matdTheta[1][0] = 0.; matdTheta[2][0] = -sdth; matdTheta[0][1] = 0.; matdTheta[1][1] = 1.; matdTheta[2][1] = 0.; matdTheta[0][2] = sdth; matdTheta[1][2] = 0.; matdTheta[2][2] = cdth; tool_matrix_productMatrix(matRes, matdPhi, matdTheta); tool_matrix_productMatrix(matRes2, matOmega, matRes); tool_matrix_productMatrix(matRes, matTheta, matRes2); tool_matrix_productMatrix(matRprime2R, matPhi, matRes); MinRprime[0] = 0.; MinRprime[1] = 0.; MinRprime[2] = 1.; tool_matrix_productVector(MinR, matRprime2R, MinRprime); /* fprintf(stderr, "M : %f %f %f -> %f\n", MinR[0], MinR[1], MinR[2], */ /* MinR[0]*MinR[0] + MinR[1]*MinR[1] + MinR[2]*MinR[2]); */ /* cartesian_to_spherical(Mspherical, MinR); */ Mspherical[0] = sqrt(MinR[0]*MinR[0] + MinR[1]*MinR[1] + MinR[2]*MinR[2]); if (MinR[1] == 0 && MinR[0] == 0) { Mspherical[1] = (MinR[2] > 0.)?0.:180.; Mspherical[2] = view->camera->phi; } else { Mspherical[1] = acos(MinR[2] / Mspherical[0]) * RADTODEG; if (MinR[0] == 0.) Mspherical[2] = (MinR[1] > 0.)?90.:-90.; else { Mspherical[2] = atan(MinR[1] / MinR[0]) * RADTODEG; if (MinR[0] < 0.) Mspherical[2] += 180.; } } /* fprintf(stderr, "avant %f %f\n", Mspherical[1], Mspherical[2]); */ while (Mspherical[1] - view->camera->theta < -90.) Mspherical[1] += 360.; while (Mspherical[1] - view->camera->theta > 90.) Mspherical[1] -= 360.; while (Mspherical[2] - view->camera->phi < -90.) Mspherical[2] += 360.; while (Mspherical[2] - view->camera->phi > 90.) Mspherical[2] -= 360.; /* fprintf(stderr, "aprs %f %f\n", Mspherical[1], Mspherical[2]); */ Theta = Mspherical[1]; Phi = Mspherical[2]; /* fprintf(stderr, "%f %f, %f %f\n", view->camera->theta, view->camera->phi, Theta, Phi); */ /* fprintf(stderr, "%f %f, %f %f\n", dTheta, dPhi, Theta - view->camera->theta, Phi - view->camera->phi); */ cth = cos(Theta * TOOL_PI180); sth = sin(Theta * TOOL_PI180); cph = cos(Phi * TOOL_PI180); sph = sin(Phi * TOOL_PI180); matPhiPrime[0][0] = cph; matPhiPrime[1][0] = -sph; matPhiPrime[2][0] = 0.; matPhiPrime[0][1] = sph; matPhiPrime[1][1] = cph; matPhiPrime[2][1] = 0.; matPhiPrime[0][2] = 0.; matPhiPrime[1][2] = 0.; matPhiPrime[2][2] = 1.; matThetaPrime[0][0] = cth; matThetaPrime[1][0] = 0.; matThetaPrime[2][0] = sth; matThetaPrime[0][1] = 0.; matThetaPrime[1][1] = 1.; matThetaPrime[2][1] = 0.; matThetaPrime[0][2] = -sth; matThetaPrime[1][2] = 0.; matThetaPrime[2][2] = cth; tool_matrix_productMatrix(matRes2, matPhiPrime, matRprime2R); tool_matrix_productMatrix(matRes, matThetaPrime, matRes2); MinRprime[0] = 0.; MinRprime[1] = 1.; MinRprime[2] = 0.; tool_matrix_productVector(MinR, matRes, MinRprime); /* fprintf(stderr, "vect u : %f %f %f -> %f\n", MinR[0], MinR[1], MinR[2], */ /* MinR[0]*MinR[0] + MinR[1]*MinR[1] + MinR[2]*MinR[2]); */ Omega = acos(CLAMP(MinR[1], -1.f, 1.f)) * RADTODEG; if (MinR[0] > 0.) Omega = -Omega; while (Omega - view->camera->omega < -90.) Omega += 360.; while (Omega - view->camera->omega > 90.) Omega -= 360.; /* fprintf(stderr, "Theta phi omega : %f %f %f\n", Theta, Phi, Omega); */ angles[0] = Theta; angles[1] = Phi; angles[2] = Omega; } /***************************/ /* Dealing with resources. */ /***************************/ static gboolean readOpenGLPrecision(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { int val; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readInteger(lines[0], position, &val, 1, error)) return FALSE; if (val <= 0 || val > 500) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d: width must be in %d-%d.\n"), position, 0, 500); return FALSE; } visu_gl_view_class_setPrecision((float)val / 100.); return TRUE; } static void exportParametersVisuGlView(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { g_string_append_printf(data, "# %s\n", DESC_PARAMETER_OPENGL_DETAILS); g_string_append_printf(data, "%s: %d\n\n", FLAG_PARAMETER_OPENGL_DETAILS, (int)(visu_gl_view_class_getPrecision() * 100.)); } static void onEntryAngles(VisuGlView *view, gchar *key _U_, VisuObject *obj _U_) { visu_gl_view_setThetaPhiOmega (view, anglesDefault[0], anglesDefault[1], anglesDefault[2], VISU_GL_CAMERA_THETA | VISU_GL_CAMERA_PHI | VISU_GL_CAMERA_OMEGA); } static void onEntryTrans(VisuGlView *view, gchar *key _U_, VisuObject *obj _U_) { visu_gl_view_setXsYs(view, translatDefault[0], translatDefault[1], VISU_GL_CAMERA_XS | VISU_GL_CAMERA_YS); } static void onEntryGross(VisuGlView *view, gchar *key _U_, VisuObject *obj _U_) { visu_gl_view_setGross(view, grossDefault); } static void onEntryPersp(VisuGlView *view, gchar *key _U_, VisuObject *obj _U_) { visu_gl_view_setPersp(view, perspDefault); } static void exportResourcesVisuGlView(GString *data, VisuData *dataObj _U_, VisuGlView *view) { visu_config_file_exportComment(data, DESC_RESOURCE_OPENGL_ANGLES); if (view) visu_config_file_exportEntry(data, FLAG_RESOURCE_OPENGL_ANGLES, NULL, "%9.3f %9.3f %9.3f", view->camera->theta, view->camera->phi, view->camera->omega); else visu_config_file_exportEntry(data, FLAG_RESOURCE_OPENGL_ANGLES, NULL, "%9.3f %9.3f %9.3f", anglesDefault[0], anglesDefault[1], anglesDefault[2]); visu_config_file_exportComment(data, DESC_RESOURCE_OPENGL_TRANSLAT); if (view) visu_config_file_exportEntry(data, FLAG_RESOURCE_OPENGL_TRANSLAT, NULL, "%9.3f %9.3f", view->camera->xs, view->camera->ys); else visu_config_file_exportEntry(data, FLAG_RESOURCE_OPENGL_TRANSLAT, NULL, "%9.3f %9.3f", translatDefault[0], translatDefault[1]); visu_config_file_exportComment(data, DESC_RESOURCE_OPENGL_GROSS); if (view) visu_config_file_exportEntry(data, FLAG_RESOURCE_OPENGL_GROSS, NULL, "%9.3f", view->camera->gross); else visu_config_file_exportEntry(data, FLAG_RESOURCE_OPENGL_GROSS, NULL, "%9.3f", grossDefault); visu_config_file_exportComment(data, DESC_RESOURCE_OPENGL_PERSP); if (view) visu_config_file_exportEntry(data, FLAG_RESOURCE_OPENGL_PERSP, NULL, "%9.3f", view->camera->d_red); else visu_config_file_exportEntry(data, FLAG_RESOURCE_OPENGL_PERSP, NULL, "%9.3f", perspDefault); visu_config_file_exportComment(data, ""); } v_sim-3.7.0/src/openGLFunctions/view.h0000644000353400050620000001762412215546102014560 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef CAMERA_H #define CAMERA_H #include #include #include #include /** * TOOL_PI180: * * Value of pi / 180. */ #define TOOL_PI180 0.017453292522 /** * VisuGlCameraAxis: * @VIEW_X: the up axis is X ; * @VIEW_Y: the up axis is Y ; * @VIEW_Z: the up axis is Z. * * Define the up axis. */ typedef enum { VIEW_X, VIEW_Y, VIEW_Z } VisuGlCameraAxis; typedef struct _VisuGlCamera VisuGlCamera; struct _VisuGlCamera { /* Perspective. */ double d_red; /* Orientation. */ double theta, phi, omega; /* Position. */ double xs, ys; /* Zoom. */ double gross; /* A length reference and its unit. */ double length0; ToolUnits unit; /* Up vector. */ double up[3]; /* Up axis. */ VisuGlCameraAxis upAxis; /* Eye target and eye position. */ double centre[3], eye[3]; }; GType visu_gl_camera_get_type(void); /** * VISU_TYPE_GL_CAMERA: * * The type of #VisuGlCamera objects. */ #define VISU_TYPE_GL_CAMERA (visu_gl_camera_get_type()) void visu_gl_camera_copy(VisuGlCamera *to, const VisuGlCamera *from); /** * VISU_GL_CAMERA_THETA: * * Value used in the visu_gl_camera_setThetaPhiOmega() method to store the tetha angle. */ #define VISU_GL_CAMERA_THETA (1 << 1) /** * VISU_GL_CAMERA_PHI: * * Value used in the visu_gl_camera_setThetaPhiOmega() method to store the phi angle. */ #define VISU_GL_CAMERA_PHI (1 << 2) /** * VISU_GL_CAMERA_OMEGA: * * Value used in the visu_gl_camera_setThetaPhiOmega() method to store the omega angle. */ #define VISU_GL_CAMERA_OMEGA (1 << 3) gboolean visu_gl_camera_setThetaPhiOmega(VisuGlCamera *camera, float valueTheta, float valuePhi, float valueOmega, int mask); /** * VISU_GL_CAMERA_XS: * * Value used in the visu_gl_camera_setXsYs() method to store the horizontal offset. */ #define VISU_GL_CAMERA_XS (1 << 1) /** * VISU_GL_CAMERA_YS: * * Value used in the visu_gl_camera_setXsYs() method to store the vertical offset. */ #define VISU_GL_CAMERA_YS (1 << 2) gboolean visu_gl_camera_setXsYs(VisuGlCamera *camera, float valueX, float valueY, int mask); gboolean visu_gl_camera_setGross(VisuGlCamera *camera, float value); gboolean visu_gl_camera_setPersp(VisuGlCamera *camera, float value); gboolean visu_gl_camera_setRefLength(VisuGlCamera *camera, float value, ToolUnits unit); float visu_gl_camera_getRefLength(VisuGlCamera *camera, ToolUnits *unit); void visu_gl_camera_setUpAxis(VisuGlCamera *camera, VisuGlCameraAxis upAxis); void visu_gl_camera_getScreenAxes(VisuGlCamera *camera, float xAxis[3], float yAxis[3]); void visu_gl_camera_modelize(VisuGlCamera *camera); #undef near #undef far typedef struct _VisuGlWindow VisuGlWindow; struct _VisuGlWindow { float extens; ToolUnits unit; guint width, height; double near, far; double left, right, bottom, top; }; gboolean visu_gl_window_setViewport(VisuGlWindow *window, guint width, guint height); gboolean visu_gl_window_setAddLength(VisuGlWindow *window, float value, ToolUnits unit); float visu_gl_window_getAddLength(VisuGlWindow *window, ToolUnits *unit); float visu_gl_window_getFileUnitPerPixel(VisuGlWindow *window); void visu_gl_window_project(VisuGlWindow *window, const VisuGlCamera *camera); /***************************/ /* The #VisuGlView object. */ /***************************/ /** * VISU_TYPE_GL_VIEW: * * The type of #VisuGlView objects. */ #define VISU_TYPE_GL_VIEW (visu_gl_view_get_type()) /** * VISU_GL_VIEW: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuGlView type. */ #define VISU_GL_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_GL_VIEW, VisuGlView)) /** * VISU_GL_VIEW_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuGlViewClass. */ #define VISU_GL_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_GL_VIEW, VisuGlViewClass)) /** * VISU_IS_GL_VIEW: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuGlView object. */ #define VISU_IS_GL_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_GL_VIEW)) /** * VISU_IS_GL_VIEW_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuGlViewClass class. */ #define VISU_IS_GL_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_GL_VIEW)) /** * VISU_GL_VIEW_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. */ #define VISU_GL_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_GL_VIEW, VisuGlViewClass)) typedef struct _VisuGlView VisuGlView; struct _VisuGlView { GObject parent; VisuGlCamera *camera; VisuGlWindow *window; VisuBox *box; gulong box_signal, unit_signal, bc_signal; gboolean dispose_has_run; }; typedef struct _VisuGlViewClassPrivate VisuGlViewClassPrivate; typedef struct _VisuGlViewClass VisuGlViewClass; struct _VisuGlViewClass { GObjectClass parent; VisuGlViewClassPrivate *priv; }; GType visu_gl_view_get_type(void); VisuGlView* visu_gl_view_new(void); VisuGlView* visu_gl_view_new_withSize(guint w, guint h); gboolean visu_gl_view_setThetaPhiOmega(VisuGlView *view, float valueTheta, float valuePhi, float valueOmega, int mask); gboolean visu_gl_view_setXsYs(VisuGlView *view, float valueX, float valueY, int mask); gboolean visu_gl_view_setGross(VisuGlView *view, float value); gboolean visu_gl_view_setPersp(VisuGlView *view, float value); gboolean visu_gl_view_setRefLength(VisuGlView *view, float lg, ToolUnits units); gboolean visu_gl_view_setObjectRadius(VisuGlView *view, float lg, ToolUnits units); gboolean visu_gl_view_setViewport(VisuGlView *view, guint width, guint height); gint visu_gl_view_getDetailLevel(VisuGlView *view, float dimension); void visu_gl_view_rotateBox(VisuGlView *view, float dTheta, float dPhi, float angles[2]); void visu_gl_view_rotateCamera(VisuGlView *view, float dTheta, float dPhi, float angles[3]); float visu_gl_view_getZCoordinate(VisuGlView *view, float xyz[3]); void visu_gl_view_getRealCoordinates(VisuGlView *view, float xyz[3], float winx, float winy, float winz); gboolean visu_gl_view_class_setPrecision(float value); float visu_gl_view_class_getPrecision(void); #endif v_sim-3.7.0/src/openGLFunctions/interactive.c0000644000353400050620000016430312215546102016113 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include #include #include "view.h" #include "objectList.h" #include #include #include #include #include #include "interactive.h" #define FLAG_PARAMETER_OBSERVE_METHOD "opengl_observe_method" #define DESC_PARAMETER_OBSERVE_METHOD "Choose the observe method ; integer (0: constrained mode, 1: walker mode)" #define FLAG_PARAMETER_CAMERA_SETTINGS "opengl_prefered_camera_orientation" #define DESC_PARAMETER_CAMERA_SETTINGS "Saved preferd camera position ; three angles, two shifts, zoom and perspective level" /** * SECTION:interactive * @short_description: Gives tools to interact with the rendered * area. * * When one wants some interactions on the rendering area * (either from the mouse or from the keyboard), one should initialise * it using openGLInteractiveInit_session(). Then, during the * interactive session, several modes have been implemented: * * * openGLInteractiveBegin_mark(), is a mode where the mouse can select * a node and this nodes become highlighted. * * * openGLInteractiveBegin_move(), the mouse is then used to move * picked nodes. Moves are possible in the plane of the screen or * constrained along axis of the bounding box. * * * openGLInteractiveBegin_observe(), in this mode, the mouse is used * to change the position of camera, its orientation and its zoom * characteristics. * * * openGLInteractiveBegin_pick(), this mode is the most complex * picking mode. It can select atoms up to two references and measure * distances and angles. * * * openGLInteractiveBegin_pickAndObserve(), this mode is a simplified * mix of obervation and picking. * * * The observe mode has two different moving algorithms that can be * changed using openGLInteractiveSet_preferedObserveMethod(). The * first, called 'constrained' (cf. #OPENGL_OBSERVE_CONSTRAINED) * corresponds to movements along parallels and meridians. When the * mouse is moved along x axis, the camera raotates along a * parallel. When the camera is moved along y axis, the camera rotate * along a meridian. The top is always pointing to the north pole (in * fact, omega is always forced to 0 in this mode). This mode has a * 'strange' behavior when the observer is near a pole: moving mouse * along x axis make the box rotates on itself. It is normal, because * movements on x axis is equivalent to movements on parallel and near * the poles, parallel are small circle around the z axis. This can be * unnatural in some occasion and the other mode, called 'walker' (see * #OPENGL_OBSERVE_WALKER) can be used instead of the 'constrained' * mode. In the former, the moving is done has if the observer was a * walking ant on a sphere : moving the mouse along y axis makes the * ant go on or forward ; and x axis movements makes the ant goes on * its left or on it right. This is a more natural way to move the box * but it has the inconvient that it is hard to return in a given * position (omega has never the right value). * */ struct _VisuInteractive { GObject parent; /* Internal object gestion. */ gboolean dispose_has_run; /* The kind of interactive (pick, observe...) */ VisuInteractiveId id; /* Data needed in case of pick. */ /* The last selected node. */ gint idSelected; /* The current first reference. */ gint idRef1; /* The current second reference. */ gint idRef2; /* */ GList *idRegion; /* The position of the pick. */ int xOrig, yOrig; int xPrev, yPrev; /* Data for the move action. */ gboolean movingPicked; GList *movingNodes; float movingAxe[3]; /* The OpenGL list used to identify nodes. */ VisuGlExtNodes *nodeList; /* Signals to listen to. */ gulong popDec_signal; /* Copy of last event. */ ToolSimplifiedEvents ev; }; enum { INTERACTIVE_OBSERVE_SIGNAL, INTERACTIVE_PICK_ERROR_SIGNAL, INTERACTIVE_PICK_NODE_SIGNAL, INTERACTIVE_PICK_REGION_SIGNAL, INTERACTIVE_PICK_MENU_SIGNAL, INTERACTIVE_START_MOVE_SIGNAL, INTERACTIVE_MOVE_SIGNAL, INTERACTIVE_STOP_SIGNAL, /* INTERACTIVE_EVENT_SIGNAL, */ N_INTERACTIVE_SIGNALS }; struct _VisuInteractiveClass { GObjectClass parent; VisuInteractiveMethod preferedObserveMethod; /* The save camera positions are implemented as a circular list we a pointer on the current head. */ GList *savedCameras, *lastCamera; }; static VisuInteractiveClass *local_class = NULL; /* Internal variables. */ static guint interactive_signals[N_INTERACTIVE_SIGNALS] = { 0 }; /* Object gestion methods. */ static void visu_interactive_dispose (GObject* obj); static void visu_interactive_finalize(GObject* obj); /* Local methods. */ static void exportParameters(GString *data, VisuData *dataObj, VisuGlView *view); static gboolean readOpenGLObserveMethod(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static gboolean readCameraSettings(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static void onVisuDataReady(GObject *obj, VisuData *dataObj, VisuGlView *view, gpointer data); static void onVisuDataNotReady(GObject *obj, VisuData *dataObj, VisuGlView *view, gpointer data); static void onPopulationChange(VisuData *dataObj, int *nodes, gpointer data); static gboolean observe(VisuInteractive *inter, VisuGlView *view, ToolSimplifiedEvents *ev); static gboolean pick(VisuInteractive *inter, VisuGlView *view, ToolSimplifiedEvents *ev); static gboolean move(VisuInteractive *inter, VisuGlView *view, ToolSimplifiedEvents *ev); static gboolean mark(VisuInteractive *inter, VisuGlView *view, ToolSimplifiedEvents *ev); static gboolean pickAndObserve(VisuInteractive *inter, VisuGlView *view, ToolSimplifiedEvents *ev); G_DEFINE_TYPE(VisuInteractive, visu_interactive, G_TYPE_OBJECT) static void g_cclosure_marshal_NODE_SELECTION(GClosure *closure, GValue *return_value _U_, guint n_param_values, const GValue *param_values, gpointer invocation_hint _U_, gpointer marshal_data) { typedef void (*callbackFunc)(gpointer data1, guint kind, VisuNode *node1, VisuNode *node2, VisuNode *node3, gpointer data2); register callbackFunc callback; register GCClosure *cc = (GCClosure*)closure; register gpointer data1, data2; g_return_if_fail(n_param_values == 5); if (G_CCLOSURE_SWAP_DATA(closure)) { data1 = closure->data; data2 = g_value_peek_pointer(param_values + 0); } else { data1 = g_value_peek_pointer(param_values + 0); data2 = closure->data; } callback = (callbackFunc)(size_t)(marshal_data ? marshal_data : cc->callback); DBG_fprintf(stderr, "Interactive: marshall callback for node-selection" " with nodes %p, %p, %p.\n", (gpointer)g_value_get_boxed(param_values + 2), (gpointer)g_value_get_boxed(param_values + 3), (gpointer)g_value_get_boxed(param_values + 4)); callback(data1, g_value_get_uint(param_values + 1), (VisuNode*)g_value_get_boxed(param_values + 2), (VisuNode*)g_value_get_boxed(param_values + 3), (VisuNode*)g_value_get_boxed(param_values + 4), data2); } static void g_cclosure_marshal_NODE_MENU(GClosure *closure, GValue *return_value _U_, guint n_param_values, const GValue *param_values, gpointer invocation_hint _U_, gpointer marshal_data) { typedef void (*callbackFunc)(gpointer data1, gint x, gint y, VisuNode *node, gpointer data2); register callbackFunc callback; register GCClosure *cc = (GCClosure*)closure; register gpointer data1, data2; g_return_if_fail(n_param_values == 4); if (G_CCLOSURE_SWAP_DATA(closure)) { data1 = closure->data; data2 = g_value_peek_pointer(param_values + 0); } else { data1 = g_value_peek_pointer(param_values + 0); data2 = closure->data; } callback = (callbackFunc)(size_t)(marshal_data ? marshal_data : cc->callback); DBG_fprintf(stderr, "Interactive: marshall callback for menu at %dx%d" " with node %p.\n", g_value_get_int(param_values + 1), g_value_get_int(param_values + 2), (gpointer)g_value_get_boxed(param_values + 3)); callback(data1, g_value_get_int(param_values + 1), g_value_get_int(param_values + 2), (VisuNode*)g_value_get_boxed(param_values + 3), data2); } static void visu_interactive_class_init(VisuInteractiveClass *klass) { GType paramPointer[1] = {G_TYPE_POINTER}; GType paramBool[1] = {G_TYPE_BOOLEAN}; GType paramUInt[1] = {G_TYPE_UINT}; VisuConfigFileEntry *resourceEntry; local_class = klass; DBG_fprintf(stderr, "visu Interactive: creating the class of the object.\n"); DBG_fprintf(stderr, " - adding new signals ;\n"); /** * VisuInteractive::observe: * @obj: the object emitting the signal. * @bool: a boolean. * * This signal is emitted each time an observe session is start * (@bool is TRUE) or finished (@bool is FALSE). * * Since: 3.6 */ interactive_signals[INTERACTIVE_OBSERVE_SIGNAL] = g_signal_newv("observe", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE, NULL, NULL, NULL, g_cclosure_marshal_VOID__BOOLEAN, G_TYPE_NONE, 1, paramBool); /** * VisuInteractive::selection-error: * @obj: the object emitting the signal. * @err: an error value. * * This signal is emitted each time a selection fails, providing the * error in @err (see #VisuInteractivePickError). * * Since: 3.6 */ interactive_signals[INTERACTIVE_PICK_ERROR_SIGNAL] = g_signal_newv("selection-error", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, NULL, NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, paramUInt); /** * VisuInteractive::node-selection: * @obj: the object emitting the signal. * @kind: a flag, see #VisuInteractivePick. * @node1: (type VisuNode*) (transfer none): the primary node. * @node2: (type VisuNode*) (transfer none): the secondary * node, if any. * @node3: (type VisuNode*) (transfer none): the tertiary * node, if any. * * This signal is emitted each time a single node selection succeed, providing the * kind in @kind (see #VisuInteractivePick). The corresponding nodes * are stored in @node1, @node2 and @node3. * * Since: 3.6 */ interactive_signals[INTERACTIVE_PICK_NODE_SIGNAL] = g_signal_new("node-selection", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE, 0, NULL, NULL, g_cclosure_marshal_NODE_SELECTION, G_TYPE_NONE, 4, G_TYPE_UINT, VISU_TYPE_NODE, VISU_TYPE_NODE, VISU_TYPE_NODE, NULL); /** * VisuInteractive::region-selection: * @obj: the object emitting the signal. * @nodes: an array of node ids. * * This signal is emitted each time a region selection succeed. The corresponding nodes * are stored in @nodes. * * Since: 3.6 */ interactive_signals[INTERACTIVE_PICK_REGION_SIGNAL] = g_signal_newv("region-selection", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, NULL, NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, paramPointer); /** * VisuInteractive::menu: * @obj: the object emitting the signal. * @x: the x coordinate. * @y: the y coordinate. * @node: (type VisuNode*) (transfer none) (allow-none): a #VisuNode. * * This signal is emitted each time a menu key stroke is done. * * Since: 3.7 */ interactive_signals[INTERACTIVE_PICK_MENU_SIGNAL] = g_signal_new("menu", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE, 0, NULL, NULL, g_cclosure_marshal_NODE_MENU, G_TYPE_NONE, 3, G_TYPE_INT, G_TYPE_INT, VISU_TYPE_NODE); /** * VisuInteractive::start-move: * @obj: the object emitting the signal. * @nodes: an array of node ids. * * This signal is emitted each time a set of nodes are clicked to be * moved. The corresponding nodes are stored in @nodes. * * Since: 3.6 */ interactive_signals[INTERACTIVE_START_MOVE_SIGNAL] = g_signal_newv("start-move", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, NULL, NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, paramPointer); /** * VisuInteractive::move: * @obj: the object emitting the signal. * @nodes: an array of node ids. * * This signal is emitted each time a set of nodes are moved. The * corresponding nodes are stored in @nodes. * * Since: 3.6 */ interactive_signals[INTERACTIVE_MOVE_SIGNAL] = g_signal_newv("move", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, NULL, NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, paramPointer); /** * VisuInteractive::stop: * @obj: the object emitting the signal. * * This signal is emitted each time a set of nodes are stopped to be * moved. * * Since: 3.6 */ interactive_signals[INTERACTIVE_STOP_SIGNAL] = g_signal_newv("stop", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, NULL, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, NULL); /* Connect freeing methods. */ G_OBJECT_CLASS(klass)->dispose = visu_interactive_dispose; G_OBJECT_CLASS(klass)->finalize = visu_interactive_finalize; DBG_fprintf(stderr, " - add the resources.\n"); visu_config_file_addEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_OBSERVE_METHOD, DESC_PARAMETER_OBSERVE_METHOD, 1, readOpenGLObserveMethod); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_CAMERA_SETTINGS, DESC_PARAMETER_CAMERA_SETTINGS, 1, readCameraSettings); visu_config_file_entry_setVersion(resourceEntry, 3.7f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_PARAMETER, exportParameters); /* Set local variables to default. */ DBG_fprintf(stderr, " - setup the local variables.\n"); klass->preferedObserveMethod = interactive_constrained; } static void visu_interactive_init(VisuInteractive *obj) { DBG_fprintf(stderr, "Visu Interactive: creating a new interactive session (%p).\n", (gpointer)obj); obj->dispose_has_run = FALSE; obj->idRef1 = -99; obj->idRef2 = -99; obj->idSelected = -99; obj->idRegion = (GList*)0; obj->movingAxe[0] = 1.f; obj->movingAxe[1] = 0.f; obj->movingAxe[2] = 0.f; obj->movingPicked = FALSE; obj->movingNodes = (GList*)0; obj->nodeList = (VisuGlExtNodes*)0; obj->popDec_signal = (gulong)0; g_signal_connect(VISU_OBJECT_INSTANCE, "dataRendered", G_CALLBACK(onVisuDataReady), (gpointer)obj); g_signal_connect(VISU_OBJECT_INSTANCE, "dataUnRendered", G_CALLBACK(onVisuDataNotReady), (gpointer)obj); } static void onVisuDataReady(GObject *obj _U_, VisuData *dataObj, VisuGlView *view _U_, gpointer data) { visu_interactive_apply(VISU_INTERACTIVE(data), VISU_NODE_ARRAY(dataObj)); } static void onVisuDataNotReady(GObject *obj _U_, VisuData *dataObj, VisuGlView *view _U_, gpointer data) { DBG_fprintf(stderr, "Visu Interactive: caught the 'dataUnRendered' signal.\n"); g_signal_handler_disconnect(G_OBJECT(dataObj), VISU_INTERACTIVE(data)->popDec_signal); } static void onPopulationChange(VisuData *dataObj _U_, int *nodes, gpointer data) { int i; VisuInteractive *inter; inter = VISU_INTERACTIVE(data); g_return_if_fail(inter); DBG_fprintf(stderr, "Visu Interactive: remove the specific nodes.\n"); for (i = 0; nodes[i] >= 0; i++) { if (inter->idRef1 == nodes[i]) inter->idRef1 = -1; if (inter->idRef2 == nodes[i]) inter->idRef2 = -1; if (inter->idSelected == nodes[i]) inter->idSelected = -1; } if (inter->idRegion) g_list_free(inter->idRegion); inter->idRegion = (GList*)0; } /* This method can be called several times. It should unref all of its reference to GObjects. */ static void visu_interactive_dispose(GObject* obj) { DBG_fprintf(stderr, "Visu Interactive: dispose object %p.\n", (gpointer)obj); if (VISU_INTERACTIVE(obj)->dispose_has_run) return; VISU_INTERACTIVE(obj)->dispose_has_run = TRUE; visu_interactive_setNodeList(VISU_INTERACTIVE(obj), (VisuGlExtNodes*)0); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_interactive_parent_class)->dispose(obj); } /* This method is called once only. */ static void visu_interactive_finalize(GObject* obj) { g_return_if_fail(obj); DBG_fprintf(stderr, "Visu Interactive: finalize object %p.\n", (gpointer)obj); if (VISU_INTERACTIVE(obj)->movingNodes) g_list_free(VISU_INTERACTIVE(obj)->movingNodes); if (VISU_INTERACTIVE(obj)->idRegion) g_list_free(VISU_INTERACTIVE(obj)->idRegion); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_interactive_parent_class)->finalize(obj); } /** * visu_interactive_new: * @type: a #VisuInteractiveId flag. * * Creates a new interactive session of the given @type. * * Returns: (transfer full): a newly created object. */ VisuInteractive* visu_interactive_new(VisuInteractiveId type) { VisuInteractive *inter; inter = VISU_INTERACTIVE(g_object_new(VISU_TYPE_INTERACTIVE, NULL)); g_return_val_if_fail(inter, (VisuInteractive*)0); DBG_fprintf(stderr, "Visu Interactive: start new interactive session %p (%d).\n", (gpointer)inter, type); inter->id = type; return inter; } /** * visu_interactive_getType: * @inter: a #VisuInteractive object. * * It returns the kind of interactive session. * * Returns: a #VisuInteractiveId value. */ VisuInteractiveId visu_interactive_getType(VisuInteractive *inter) { g_return_val_if_fail(VISU_IS_INTERACTIVE(inter), interactive_none); return inter->id; } /** * visu_interactive_setType: * @inter: a #VisuInteractive object. * @id: a #VisuInteractiveId. * * It changes the kind of interactive session. * * Returns: TRUE if indeed changed. */ gboolean visu_interactive_setType(VisuInteractive *inter, VisuInteractiveId id) { g_return_val_if_fail(VISU_IS_INTERACTIVE(inter), FALSE); if (inter->id == id) return FALSE; inter->id = id; return TRUE; } /** * visu_interactive_setNodeList: * @inter: a #VisuInteractive object. * @nodes: (transfer full) (allow-none): a #VisuGlExtNodes object. * * Associate a #VisuGlExtNodes object for node selection. This is * mandatory for move, pick and mark actions. * * Since: 3.7 **/ void visu_interactive_setNodeList(VisuInteractive *inter, VisuGlExtNodes *nodes) { g_return_if_fail(VISU_IS_INTERACTIVE(inter)); if (inter->nodeList) g_object_unref(inter->nodeList); inter->nodeList = nodes; if (nodes) g_object_ref(nodes); } /** * visu_interactive_apply: * @inter: a #VisuInteractive object. * @array: (allow-none): a #VisuNodeArray object. * * Update all ids of @inter to point to actual nodes of @array. * * Since: 3.7 **/ void visu_interactive_apply(VisuInteractive *inter, VisuNodeArray *array) { g_return_if_fail(VISU_IS_INTERACTIVE(inter)); if (inter->idRef1 >= 0 && (!array || !visu_node_array_getFromId(array, inter->idRef1))) inter->idRef1 = -99; if (inter->idRef2 >= 0 && (!array || !visu_node_array_getFromId(array, inter->idRef2))) inter->idRef2 = -99; if (inter->idSelected >= 0 && (!array || !visu_node_array_getFromId(array, inter->idSelected))) inter->idSelected = -99; DBG_fprintf(stderr, "Visu Interactive: specific nodes are now:\n"); DBG_fprintf(stderr, " - selected %d.\n", inter->idSelected); DBG_fprintf(stderr, " - ref. 1 %d.\n", inter->idRef1); DBG_fprintf(stderr, " - ref. 2 %d.\n", inter->idRef2); if (inter->idRegion) g_list_free(inter->idRegion); inter->idRegion = (GList*)0; if (array) inter->popDec_signal = g_signal_connect(G_OBJECT(array), "PopulationDecrease", G_CALLBACK(onPopulationChange), (gpointer)inter); } /** * visu_interactive_popSavedCamera: * @inter: a #VisuInteractive object. * * @inter object stores camera settings as a ring. This routine goes * to the next camera in the ring and returns the current one. The * popped camera is not actually removed from the ring. * * Since: 3.6 * * Returns: a pointer to the previously current #VisuGlCamera. It * is owned by V_Sim and should not be touched. */ VisuGlCamera* visu_interactive_popSavedCamera(VisuInteractive *inter) { VisuGlCamera *cur; VisuInteractiveClass *klass; klass = VISU_INTERACTIVE_GET_CLASS(inter); g_return_val_if_fail(klass, (VisuGlCamera*)0); if (!klass->lastCamera) return (VisuGlCamera*)0; cur = (VisuGlCamera*)klass->lastCamera->data; klass->lastCamera = g_list_next(klass->lastCamera); if (!klass->lastCamera) klass->lastCamera = klass->savedCameras; DBG_fprintf(stderr, "Interactive: pop, pointing now at camera %d.\n", g_list_position(klass->savedCameras, klass->lastCamera)); return cur; } /** * visu_interactive_getSavedCameras: * @inter: a #VisuInteractive object. * @cameras: (out) (element-type VisuGlCamera*): a location to store a list of cameras. * @head: (out) (element-type VisuGlCamera*): a location to store a list of cameras. * * @inter object stores camera settings as a ring. One can access the * set of saved cameras thanks to @cameras or to the current position * in the ring thanks to @head. @cameras or @head are not copied and * are owned by V_Sim. They should be considered read-only. * * Since: 3.6 */ void visu_interactive_getSavedCameras(VisuInteractive *inter, GList **cameras, GList **head) { VisuInteractiveClass *klass; klass = VISU_INTERACTIVE_GET_CLASS(inter); g_return_if_fail(klass); *cameras = klass->savedCameras; *head = klass->lastCamera; } static gboolean cmpCameras(VisuGlCamera *c1, VisuGlCamera *c2) { return (c1 == c2) || (c1->theta == c2->theta && c1->phi == c2->phi && c1->omega == c2->omega && c1->xs == c2->xs && c1->ys == c2->ys/* && */ /* c1->gross == c2->gross && */ /* c1->d_red == c2->d_red */); } static void _pushSavedCamera(VisuInteractiveClass *klass, VisuGlCamera *camera) { VisuGlCamera *tmp; g_return_if_fail(klass && camera); for (klass->lastCamera = klass->savedCameras ; klass->lastCamera && !cmpCameras((VisuGlCamera*)klass->lastCamera->data, camera); klass->lastCamera = g_list_next(klass->lastCamera)); /* Case we don't find it, we add. */ if (!klass->lastCamera || (VisuGlCamera*)klass->lastCamera->data != camera) { tmp = g_malloc(sizeof(VisuGlCamera)); tmp->theta = camera->theta; tmp->phi = camera->phi; tmp->omega = camera->omega; tmp->xs = camera->xs; tmp->ys = camera->ys; tmp->gross = camera->gross; tmp->d_red = camera->d_red; klass->savedCameras = g_list_prepend(klass->savedCameras, (gpointer)tmp); } klass->lastCamera = klass->savedCameras; DBG_fprintf(stderr, "Interactive: push, storing now %d cameras.\n", g_list_length(klass->savedCameras)); } /** * visu_interactive_pushSavedCamera: * @inter: a #VisuInteractive object. * @camera: a #VisuGlCamera object. * * @inter object stores camera settings as a ring. The given @camera * is copied in the ring if its values not already exist. The current camera * is set to this new one. * * Since: 3.6 */ void visu_interactive_pushSavedCamera(VisuInteractive *inter, VisuGlCamera *camera) { VisuInteractiveClass *klass; klass = VISU_INTERACTIVE_GET_CLASS(inter); _pushSavedCamera(klass, camera); } gboolean visuInteractiveRemove_savedCamera(VisuInteractive *inter, VisuGlCamera *camera) { VisuInteractiveClass *klass; GList *lst; klass = VISU_INTERACTIVE_GET_CLASS(inter); g_return_val_if_fail(klass, FALSE); for (lst = klass->savedCameras ; lst && !cmpCameras((VisuGlCamera*)lst->data, camera); lst = g_list_next(lst)); /* Case we don't find it, we return. */ if (!lst) return FALSE; g_free(lst->data); klass->savedCameras = g_list_delete_link(klass->savedCameras, lst); if (klass->lastCamera == lst) klass->lastCamera = lst->next; if (!klass->lastCamera) klass->lastCamera = klass->savedCameras; DBG_fprintf(stderr, "Interactive: remove, storing now %d cameras.\n", g_list_length(klass->savedCameras)); return TRUE; } /** * visu_interactive_handleEvent: * @inter: a #VisuInteractive object ; * @view: a #VisuGlView object the interaction happened on. * @ev: a simplified event. * * This routine should be called by the rendering window when some * event is raised on the rendering surface. */ void visu_interactive_handleEvent(VisuInteractive *inter, VisuGlView *view, ToolSimplifiedEvents *ev) { gboolean stop; g_return_if_fail(VISU_IS_INTERACTIVE(inter)); inter->ev = *ev; switch (inter->id) { case interactive_observe: stop = observe(inter, view, ev); break; case interactive_measureAndObserve: stop = pickAndObserve(inter, view, ev); break; case interactive_measure: case interactive_pick: stop = pick(inter, view, ev); break; case interactive_move: stop = move(inter, view, ev); break; case interactive_mark: stop = mark(inter, view, ev); break; default: stop = FALSE; break; } if (stop) g_signal_emit(G_OBJECT(inter), interactive_signals[INTERACTIVE_STOP_SIGNAL], 0, NULL); } /** * visu_interactive_setReferences: * @inter: a #VisuInteractive object. * @from: another #VisuInteractive object. * * Copies all node ids used as reference from @from to @inter. */ void visu_interactive_setReferences(VisuInteractive *inter, VisuInteractive *from) { g_return_if_fail(VISU_IS_INTERACTIVE(inter) && VISU_IS_INTERACTIVE(from)); inter->idSelected = from->idSelected; inter->idRef1 = from->idRef1; inter->idRef2 = from->idRef2; } /** * visu_interactive_getEvent: * @inter: a #VisuInteractive object. * * This routine can be called in callbacks of @inter to get some * details about the event that raise signals like * VisuInteractive::node-selection. * * Since: 3.7 * * Returns: (transfer none): a location with details on the last event. **/ ToolSimplifiedEvents* visu_interactive_getEvent(VisuInteractive *inter) { g_return_val_if_fail(VISU_IS_INTERACTIVE(inter), (ToolSimplifiedEvents*)0); return &inter->ev; } /******************************************************************************/ static gboolean pickAndObserve(VisuInteractive *inter, VisuGlView *view, ToolSimplifiedEvents *ev) { /* If button 1 or 2, use observe mode */ if (ev->button != 3 && ev->specialKey != Key_Menu) return observe(inter, view, ev); /* If button 3, use pick mode with button 3 as button 1 */ else { if (ev->shiftMod && !ev->controlMod) { ev->button = 2; } else if (!ev->shiftMod && ev->controlMod) { ev->button = 2; } else if (ev->shiftMod && ev->controlMod) { ev->shiftMod = 0; ev->controlMod = 1; ev->button = 1; } else ev->button = 1; ev->motion = 0; return pick(inter, view, ev); } } static gboolean observe(VisuInteractive *inter, VisuGlView *view, ToolSimplifiedEvents *ev) { int reDrawNeeded; int sign_theta; int dx, dy; VisuGlCamera *camera; float angles[3], ratio; gboolean zoom; g_return_val_if_fail(ev && inter, TRUE); if (ev->button == 3) return (ev->buttonType == TOOL_BUTTON_TYPE_PRESS); /* If the realese event is triggered, we exit only if it's not a scroll event (button 4 and 5). */ if (ev->button > 0 && ev->buttonType == TOOL_BUTTON_TYPE_RELEASE) if (ev->button != 4 && ev->button != 5 ) { if (ev->button == 1) g_signal_emit(G_OBJECT(inter), interactive_signals[INTERACTIVE_OBSERVE_SIGNAL], 0 , FALSE, NULL); return FALSE; } g_return_val_if_fail(view, FALSE); /* fprintf(stderr, "%d %d, %d\n", ev->x, ev->y, ev->button); */ /* fprintf(stderr, "%d %d, %d\n", ev->shiftMod, ev->controlMod, ev->motion); */ reDrawNeeded = 0; /* Support de la roulette en zoom et perspective. */ if (ev->specialKey == Key_Page_Up || ev->specialKey == Key_Page_Down || ev->button == 4 || ev->button == 5) { if ((ev->button == 4 || ev->specialKey == Key_Page_Up) && !ev->shiftMod) reDrawNeeded = visu_gl_view_setGross(view, view->camera->gross * 1.1); else if ((ev->button == 4 || ev->specialKey == Key_Page_Up) && ev->shiftMod) reDrawNeeded = visu_gl_view_setPersp(view, view->camera->d_red / 1.1); else if ((ev->button == 5 || ev->specialKey == Key_Page_Down) && !ev->shiftMod) reDrawNeeded = visu_gl_view_setGross(view, view->camera->gross / 1.1); else if ((ev->button == 5 || ev->specialKey == Key_Page_Down) && ev->shiftMod) reDrawNeeded = visu_gl_view_setPersp(view, view->camera->d_red * 1.1); } else if (ev->button && !ev->motion) { inter->xOrig = ev->x; inter->yOrig = ev->y; if (ev->button == 1) g_signal_emit(G_OBJECT(inter), interactive_signals[INTERACTIVE_OBSERVE_SIGNAL], 0 , TRUE, NULL); } else if (ev->motion || ev->specialKey == Key_Arrow_Down || ev->specialKey == Key_Arrow_Up || ev->specialKey == Key_Arrow_Right || ev->specialKey == Key_Arrow_Left) { if (ev->motion) { dx = ev->x - inter->xOrig; dy = -(ev->y - inter->yOrig); } else { g_signal_emit(G_OBJECT(inter), interactive_signals[INTERACTIVE_OBSERVE_SIGNAL], 0 , TRUE, NULL); dx = 0; dy = 0; if (ev->specialKey == Key_Arrow_Left) dx = -10; else if (ev->specialKey == Key_Arrow_Right) dx = +10; else if (ev->specialKey == Key_Arrow_Down) dy = -10; else if (ev->specialKey == Key_Arrow_Up) dy = +10; } zoom = (ev->button == 2); if(!zoom && !ev->shiftMod && !ev->controlMod) { if (local_class->preferedObserveMethod == interactive_constrained) { if(view->camera->theta > 0.0) sign_theta = 1; else sign_theta = -1; visu_gl_view_rotateBox(view, dy * 180.0f / view->window->height, -dx * 180.0f / view->window->width * sign_theta, angles); reDrawNeeded = visu_gl_view_setThetaPhiOmega(view, angles[0], angles[1], 0., VISU_GL_CAMERA_THETA | VISU_GL_CAMERA_PHI); } else if (local_class->preferedObserveMethod == interactive_walker) { visu_gl_view_rotateCamera(view, dy * 180.0f / view->window->height, -dx * 180.0f / view->window->width, angles); reDrawNeeded = visu_gl_view_setThetaPhiOmega(view, angles[0], angles[1], angles[2], VISU_GL_CAMERA_THETA | VISU_GL_CAMERA_PHI | VISU_GL_CAMERA_OMEGA); } } else if(!zoom && ev->shiftMod && !ev->controlMod) { ratio = 1. / MIN(view->window->width, view->window->height) / view->camera->gross * (view->camera->d_red - 1.f) / view->camera->d_red; reDrawNeeded = visu_gl_view_setXsYs(view, view->camera->xs + (float)dx * ratio, view->camera->ys + (float)dy * ratio, VISU_GL_CAMERA_XS | VISU_GL_CAMERA_YS); } else if(!zoom && ev->controlMod && !ev->shiftMod) { if (ABS(dx) > ABS(dy)) reDrawNeeded = visu_gl_view_setThetaPhiOmega(view, 0., 0., view->camera->omega + dx * 180.0f / view->window->width, VISU_GL_CAMERA_OMEGA); else reDrawNeeded = visu_gl_view_setThetaPhiOmega(view, 0., 0., view->camera->omega + dy * 180.0f / view->window->height, VISU_GL_CAMERA_OMEGA); } else if(zoom && !ev->shiftMod) reDrawNeeded = visu_gl_view_setGross(view, view->camera->gross * (1. + (float)dy * 3.0f / view->window->height)); else if(zoom && ev->shiftMod) reDrawNeeded = visu_gl_view_setPersp(view, view->camera->d_red * (1. - (float)dy * 5.0f / view->window->height)); if (ev->motion) { inter->xOrig = ev->x; inter->yOrig = ev->y; } else g_signal_emit(G_OBJECT(inter), interactive_signals[INTERACTIVE_OBSERVE_SIGNAL], 0 , FALSE, NULL); } else if (ev->letter == 'r') { camera = visu_interactive_popSavedCamera(inter); if (camera) { reDrawNeeded = visu_gl_view_setThetaPhiOmega(view, camera->theta, camera->phi, camera->omega, VISU_GL_CAMERA_THETA | VISU_GL_CAMERA_PHI | VISU_GL_CAMERA_OMEGA) || reDrawNeeded; reDrawNeeded = visu_gl_view_setXsYs(view, camera->xs, camera->ys, VISU_GL_CAMERA_XS | VISU_GL_CAMERA_YS) || reDrawNeeded; reDrawNeeded = visu_gl_view_setGross(view, camera->gross) || reDrawNeeded; reDrawNeeded = visu_gl_view_setPersp(view, camera->d_red) || reDrawNeeded; } } else if (ev->letter == 's' && !ev->shiftMod && !ev->controlMod) visu_interactive_pushSavedCamera(inter, view->camera); else if (ev->letter == 's' && ev->shiftMod && !ev->controlMod) visuInteractiveRemove_savedCamera(inter, view->camera); if (reDrawNeeded) { DBG_fprintf(stderr, "Visu Interactive: redraw on observe.\n"); g_idle_add_full(G_PRIORITY_HIGH_IDLE, visu_object_redrawForce, (gpointer)__func__, (GDestroyNotify)0); } return FALSE; } static void glDrawSelection(VisuInteractive *inter, int x, int y) { int viewport[4]; glPushAttrib(GL_ENABLE_BIT); glDisable(GL_FOG); glEnable(GL_BLEND); glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_SRC_COLOR); glGetIntegerv(GL_VIEWPORT, viewport); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluOrtho2D(0.0, (float)viewport[2], 0., (float)viewport[3]); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glColor4f(1.f, 1.f, 1.f, 1.f); glLineWidth(2); glDrawBuffer(GL_FRONT); /* We erase the previous selecting rectangle. */ glBegin(GL_LINE_LOOP); glVertex3f(inter->xOrig, (float)viewport[3] - inter->yOrig, 0.f); glVertex3f(inter->xPrev, (float)viewport[3] - inter->yOrig, 0.f); glVertex3f(inter->xPrev, (float)viewport[3] - inter->yPrev, 0.f); glVertex3f(inter->xOrig, (float)viewport[3] - inter->yPrev, 0.f); glEnd(); glFlush(); /* We draw the new selecting rectangle. */ if (x > 0 && y > 0) { glBegin(GL_LINE_LOOP); glVertex3f(inter->xOrig, (float)viewport[3] - inter->yOrig, 0.f); glVertex3f(x, (float)viewport[3] - inter->yOrig, 0.f); glVertex3f(x, (float)viewport[3] - y, 0.f); glVertex3f(inter->xOrig, (float)viewport[3] - y, 0.f); glEnd(); glFlush(); } glDrawBuffer(GL_BACK); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glPopMatrix(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopAttrib(); } static gboolean pick(VisuInteractive *inter, VisuGlView *view, ToolSimplifiedEvents *ev) { int nodeId; GList *region; gboolean pickOnly; VisuInteractivePick pick; VisuInteractivePickError error; VisuNodeArray *nodeArray; VisuNode *nodes[3]; g_return_val_if_fail(ev && inter, TRUE); /* We store the pickInfo into the VisuData on press, but we apply it only at release if there was no drag action. */ if (ev->button == 3) { if (ev->buttonType == TOOL_BUTTON_TYPE_PRESS) return TRUE; else return FALSE; } pickOnly = (inter->id == interactive_pick); if (ev->button == 1 && ev->motion && !pickOnly) { /* We drag a selecting area. */ /* A nodeInfo should have been stored, we retrieve it. */ DBG_fprintf(stderr, "Interactive: pick, drag to %dx%d.\n", ev->x, ev->y); glDrawSelection(inter, ev->x, ev->y); inter->xPrev = ev->x; inter->yPrev = ev->y; } else if (ev->buttonType == TOOL_BUTTON_TYPE_PRESS) { /* We create and store a nodeInfo data. */ DBG_fprintf(stderr, "Interactive: pick, press at %dx%d.\n", ev->x, ev->y); inter->xOrig = ev->x; inter->yOrig = ev->y; inter->xPrev = ev->x; inter->yPrev = ev->y; } else if (ev->buttonType == TOOL_BUTTON_TYPE_RELEASE) { g_return_val_if_fail(inter->nodeList, TRUE); /* Reset current selection. */ if (inter->idRegion) g_list_free(inter->idRegion); inter->idRegion = (GList*)0; inter->idSelected = -1; /* Set new selection from click. */ pick = PICK_NONE; /* If no drag action, we select the node and compute the pick mesure. */ if ((inter->xOrig == inter->xPrev && inter->yOrig == inter->yPrev) || pickOnly) { nodeId = visu_gl_ext_nodes_getSelection(inter->nodeList, view, ev->x, ev->y); error = PICK_ERROR_NO_SELECTION; DBG_fprintf(stderr, "Visu Interactive: set selection (single %d %d).\n", ev->shiftMod, ev->controlMod); if (pickOnly && (ev->button == 1 || ev->button == 2)) { DBG_fprintf(stderr, "Visu Interactive: set pick node %d.\n", nodeId); inter->idSelected = nodeId; pick = (nodeId >= 0)?PICK_SELECTED:PICK_NONE; } else if (!pickOnly && ev->button == 1 && !ev->controlMod) { if (nodeId >= 0) { pick = PICK_SELECTED; if (nodeId == inter->idRef1 || nodeId == inter->idRef2) { error = PICK_ERROR_SAME_REF; pick = PICK_NONE; } if (pick != PICK_NONE) { inter->idSelected = nodeId; if (inter->idRef1 >= 0) pick = (inter->idRef2 < 0)?PICK_DISTANCE:PICK_ANGLE; } } else pick = PICK_NONE; } else if (!pickOnly && ev->button == 1 && ev->controlMod) pick = (nodeId < 0)?PICK_NONE:PICK_HIGHLIGHT; else if (!pickOnly && ev->button == 2 && ev->shiftMod && !ev->controlMod) { DBG_fprintf(stderr, "Visu Interactive: set ref1 info for node %d.\n", nodeId); pick = PICK_REFERENCE_1; /* The error case. */ if (nodeId >= 0 && inter->idRef2 == nodeId) { error = PICK_ERROR_SAME_REF; pick = PICK_NONE; } else if (nodeId < 0 && inter->idRef2 >= 0) { error = PICK_ERROR_REF2; pick = PICK_NONE; } if (pick != PICK_NONE) { inter->idRef1 = nodeId; pick = (nodeId < 0)?PICK_UNREFERENCE_1:PICK_REFERENCE_1; } } else if (!pickOnly && ev->button == 2 && !ev->shiftMod && ev->controlMod) { DBG_fprintf(stderr, "Visu Interactive: set ref2 info for node %d.\n", nodeId); pick = PICK_REFERENCE_2; /* The error case. */ if (nodeId >= 0 && inter->idRef1 < 0) { error = PICK_ERROR_REF1; pick = PICK_NONE; } else if (nodeId >= 0 && inter->idRef1 == nodeId) { error = PICK_ERROR_SAME_REF; pick = PICK_NONE; } if (pick != PICK_NONE) { inter->idRef2 = nodeId; pick = (nodeId < 0)?PICK_UNREFERENCE_2:PICK_REFERENCE_2; } } else if (!pickOnly && ev->button == 2 && !ev->shiftMod && !ev->controlMod) pick = (nodeId < 0)?PICK_NONE:PICK_INFORMATION; else return FALSE; DBG_fprintf(stderr, " | OK.\n"); if (pick != PICK_NONE) { nodeArray = VISU_NODE_ARRAY(visu_gl_ext_nodes_getData(inter->nodeList)); nodes[0] = visu_node_array_getFromId(nodeArray, nodeId); nodes[1] = visu_node_array_getFromId (nodeArray, (pick != PICK_REFERENCE_1)?inter->idRef1:nodeId); nodes[2] = visu_node_array_getFromId (nodeArray, (pick != PICK_REFERENCE_2)?inter->idRef2:nodeId); DBG_fprintf(stderr, "Interactive: emit node-selection with nodes" " %p, %p, %p.\n", (gpointer)nodes[0], (gpointer)nodes[1], (gpointer)nodes[2]); g_signal_emit(G_OBJECT(inter), interactive_signals[INTERACTIVE_PICK_NODE_SIGNAL], 0 , pick, nodes[0], nodes[1], nodes[2], NULL); } else if (pick == PICK_NONE && error != PICK_ERROR_NONE) g_signal_emit(G_OBJECT(inter), interactive_signals[INTERACTIVE_PICK_ERROR_SIGNAL], 0 , error, NULL); } /* If drag action, we compute all the nodes in the rectangle and we erase it. */ else { /* We get the list of selected nodes. */ glDrawSelection(inter, -1, -1); /* Get all nodes in the region. */ region = visu_gl_ext_nodes_getSelectionByRegion(inter->nodeList, view, inter->xOrig, inter->yOrig, ev->x, ev->y); DBG_fprintf(stderr, "Interactive: set selection (drag).\n"); /* Copy the region list. */ if (region) { inter->idRegion = region; g_signal_emit(G_OBJECT(inter), interactive_signals[INTERACTIVE_PICK_REGION_SIGNAL], 0 , region, NULL); } else g_signal_emit(G_OBJECT(inter), interactive_signals[INTERACTIVE_PICK_ERROR_SIGNAL], 0 , PICK_ERROR_NO_SELECTION, NULL); } } else if (ev->specialKey == Key_Menu) { g_return_val_if_fail(inter->nodeList, TRUE); /* Set new selection from click. */ pick = PICK_NONE; /* We select the node or none. */ nodeId = visu_gl_ext_nodes_getSelection(inter->nodeList, view, ev->x, ev->y); if (nodeId >= 0) { nodeArray = VISU_NODE_ARRAY(visu_gl_ext_nodes_getData(inter->nodeList)); nodes[0] = visu_node_array_getFromId(nodeArray, nodeId); } else nodes[0] = (VisuNode*)0; g_signal_emit(G_OBJECT(inter), interactive_signals[INTERACTIVE_PICK_MENU_SIGNAL], 0, ev->root_x, ev->root_y, nodes[0], NULL); } return FALSE; } static gboolean move(VisuInteractive *inter, VisuGlView *view, ToolSimplifiedEvents *ev) { int dx, dy, nodeId; float ratio, z, xyz[3]; VisuData *dataObj; VisuNode *node; float delta[3], delta0[3], centre[3]; GList *tmpLst; g_return_val_if_fail(ev && inter, TRUE); if (ev->button == 3) { if (ev->buttonType == TOOL_BUTTON_TYPE_PRESS) return TRUE; else return FALSE; } if (ev->button != 1 && ev->button != 2 && ev->button != 4 && ev->button != 5 && ev->specialKey != Key_Arrow_Left && ev->specialKey != Key_Arrow_Right && ev->specialKey != Key_Arrow_Up && ev->specialKey != Key_Arrow_Down) return FALSE; DBG_fprintf(stderr, "Visu Interactive: event (%d - %d, %d %d).\n", ev->button, ev->specialKey, ev->shiftMod, ev->controlMod); if ((ev->motion == 1 || ev->button == 4 || ev->button == 5 || ev->specialKey == Key_Arrow_Left || ev->specialKey == Key_Arrow_Right || ev->specialKey == Key_Arrow_Up || ev->specialKey == Key_Arrow_Down) && inter->movingNodes) { DBG_fprintf(stderr, "Visu Interactive: drag action (%dx%d).\n", ev->x, ev->y); if (ev->specialKey == Key_Arrow_Left) { ev->x = inter->xPrev - 1; ev->y = inter->yPrev; ev->button = 1; } else if (ev->specialKey == Key_Arrow_Right) { ev->x = inter->xPrev + 1; ev->y = inter->yPrev; ev->button = 1; } else if (ev->specialKey == Key_Arrow_Up) { ev->x = inter->xPrev; ev->y = inter->yPrev - 1; ev->button = 1; } else if (ev->specialKey == Key_Arrow_Down) { ev->x = inter->xPrev; ev->y = inter->yPrev + 1; ev->button = 1; } dx = ev->x - inter->xPrev; dy = -(ev->y - inter->yPrev); DBG_fprintf(stderr, " | dx x dy : %d x %d\n", dx, dy); g_return_val_if_fail(inter->nodeList, TRUE); dataObj = visu_gl_ext_nodes_getData(inter->nodeList); /* Get the camera orientation. */ if (!ev->shiftMod && !ev->controlMod) { if (ev->button == 1) { visu_box_getCentre(visu_boxed_getBox(VISU_BOXED(view)), centre); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glTranslated(-centre[0], -centre[1], -centre[2]); z = 0.f; for (tmpLst = inter->movingNodes; tmpLst; tmpLst = g_list_next(tmpLst)) { node = visu_node_array_getFromId (VISU_NODE_ARRAY(dataObj), GPOINTER_TO_INT(tmpLst->data)); visu_data_getNodePosition(dataObj, node, xyz); z += visu_gl_view_getZCoordinate(view, xyz); } z /= (float)g_list_length(inter->movingNodes); /* Now, z contains the prev real space coord z of the selected nodes (averaged). */ visu_gl_view_getRealCoordinates(view, delta, (float)ev->x, (float)ev->y, z); visu_gl_view_getRealCoordinates(view, delta0, (float)inter->xPrev, (float)inter->yPrev, z); glPopMatrix(); /* Now, delta contains the new real space coord. */ delta[0] -= delta0[0]; delta[1] -= delta0[1]; delta[2] -= delta0[2]; } else if (ev->button > 1) { if (ev->button == 4) dy = -5; else if (ev->button == 5) dy = +5; ratio = visu_gl_window_getFileUnitPerPixel(view->window) * dy; delta[0] = inter->movingAxe[0] * ratio; delta[1] = inter->movingAxe[1] * ratio; delta[2] = inter->movingAxe[2] * ratio; } } else if (ev->button == 1) { delta[0] = 0.f; delta[1] = 0.f; delta[2] = 0.f; ratio = visu_gl_window_getFileUnitPerPixel(view->window); if (ABS(dy) > ABS(dx)) ratio *= ((dy > 0)?1.f:-1.f); else ratio *= ((dx > 0)?1.f:-1.f); if (ev->shiftMod && !ev->controlMod) delta[0] = ratio * sqrt(dx * dx + dy * dy); else if (ev->controlMod && !ev->shiftMod) delta[1] = ratio * sqrt(dx * dx + dy * dy); else if (ev->controlMod && ev->shiftMod) delta[2] = ratio * sqrt(dx * dx + dy * dy); } else return FALSE; DBG_fprintf(stderr, "Visu Interactive: drag a list of %d nodes of %gx%gx%g.\n", g_list_length(inter->movingNodes), delta[0], delta[1], delta[2]); node = (VisuNode*)0; for (tmpLst = inter->movingNodes; tmpLst; tmpLst = g_list_next(tmpLst)) { node = visu_node_array_getFromId(VISU_NODE_ARRAY(dataObj), GPOINTER_TO_INT(tmpLst->data)); if (node) { node->xyz[0] += delta[0]; node->xyz[1] += delta[1]; node->xyz[2] += delta[2]; } } if (!inter->movingNodes->next) g_signal_emit_by_name(G_OBJECT(dataObj), "PositionChanged", visu_node_array_getElement(VISU_NODE_ARRAY(dataObj), node), NULL); else g_signal_emit_by_name(G_OBJECT(dataObj), "PositionChanged", (VisuElement*)0, NULL); /* Update stored position for drag info. */ inter->xPrev = ev->x; inter->yPrev = ev->y; DBG_fprintf(stderr, "Visu Interactive: emit the 'move' signal.\n"); g_signal_emit(G_OBJECT(inter), interactive_signals[INTERACTIVE_MOVE_SIGNAL], 0 , delta, NULL); } else if ((ev->button == 1 || ev->button == 2) && ev->buttonType == TOOL_BUTTON_TYPE_PRESS) { g_return_val_if_fail(inter->nodeList, TRUE); nodeId = visu_gl_ext_nodes_getSelection(inter->nodeList, view, ev->x, ev->y); /* Store the position to find the drag values. */ inter->xOrig = inter->xPrev = ev->x; inter->yOrig = inter->yPrev = ev->y; /* Empty previously picked movingNodes. */ if (inter->movingPicked) { g_list_free(inter->movingNodes); inter->movingNodes = (GList*)0; } /* Case no list set yet. */ if (inter->movingNodes == (GList*)0) { if (nodeId < 0) return FALSE; inter->movingNodes = g_list_append(inter->movingNodes, GINT_TO_POINTER(nodeId)); inter->movingPicked = TRUE; } DBG_fprintf(stderr, "Visu Interactive: emit the 'start-move' signal.\n"); g_signal_emit(G_OBJECT(inter), interactive_signals[INTERACTIVE_START_MOVE_SIGNAL], 0, inter->movingNodes, NULL); } else if ((ev->button == 1 || ev->button == 2) && ev->buttonType == TOOL_BUTTON_TYPE_RELEASE && inter->movingNodes) { DBG_fprintf(stderr, "Visu Interactive: stop dragging a list of %d nodes.\n", g_list_length(inter->movingNodes)); node = (VisuNode*)0; } else return FALSE; /* Force redraw */ g_idle_add_full(G_PRIORITY_HIGH_IDLE, visu_object_redrawForce, (gpointer)__func__, (GDestroyNotify)0); return FALSE; } /** * visu_interactive_setMovingNodes: * @inter: a #VisuInteractive object. * @nodeIds: (element-type guint32): a list of node ids. * * Defines the nodes that should be moved if @inter is a move * action session. The list is actually copied. */ void visu_interactive_setMovingNodes(VisuInteractive *inter, GList *nodeIds) { DBG_fprintf(stderr, "Visu Interactive: set the list of %d nodes to move.\n", g_list_length(nodeIds)); g_return_if_fail(VISU_IS_INTERACTIVE(inter) && inter->id == interactive_move); /* Empty the node list. */ if (inter->movingNodes) g_list_free(inter->movingNodes); inter->movingNodes = g_list_copy(nodeIds); inter->movingPicked = FALSE; } /** * visu_interactive_setMovingAxe: * @inter: a #VisuInteractive object. * @axe: a direction. * * Defines the axe that can be used to move along if @inter is a move * action session. */ void visu_interactive_setMovingAxe(VisuInteractive *inter, float axe[3]) { float norm; norm = 1.f / sqrt(axe[0] * axe[0] + axe[1] * axe[1] + axe[2] * axe[2]); inter->movingAxe[0] = axe[0] * norm; inter->movingAxe[1] = axe[1] * norm; inter->movingAxe[2] = axe[2] * norm; } /** * visu_interactive_highlight: * @inter: a #VisuInteractive object. * @dataObj: a #VisuData object. * @nodeId: a node id. * * This routine simulates an highlight action on @nodeId from * @dataObj. This triggers the signal * #VisuInteractive::node-selection, or #VisuInteractive::selection-error * if @nodeId is invalid. * * Since: 3.7 **/ void visu_interactive_highlight(VisuInteractive *inter, VisuData *dataObj, guint nodeId) { VisuNode *nodes; nodes = visu_node_array_getFromId(VISU_NODE_ARRAY(dataObj), nodeId); if (nodes) g_signal_emit(G_OBJECT(inter), interactive_signals[INTERACTIVE_PICK_NODE_SIGNAL], 0 , PICK_HIGHLIGHT, nodes, (VisuNode*)0, (VisuNode*)0, NULL); else g_signal_emit(G_OBJECT(inter), interactive_signals[INTERACTIVE_PICK_ERROR_SIGNAL], 0 , PICK_ERROR_NO_SELECTION, NULL); } static gboolean mark(VisuInteractive *inter, VisuGlView *view, ToolSimplifiedEvents *ev) { int nodeId; g_return_val_if_fail(ev && inter, TRUE); if (ev->button == 3 && ev->buttonType == TOOL_BUTTON_TYPE_PRESS) return TRUE; if (ev->buttonType == TOOL_BUTTON_TYPE_RELEASE) return FALSE; g_return_val_if_fail(inter->nodeList, TRUE); nodeId = visu_gl_ext_nodes_getSelection(inter->nodeList, view, ev->x, ev->y); visu_interactive_highlight(inter, visu_gl_ext_nodes_getData(inter->nodeList), (guint)nodeId); return FALSE; } static gboolean readOpenGLObserveMethod(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { int val; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readInteger(lines[0], position, &val, 1, error)) return FALSE; if (val != interactive_constrained && val != interactive_walker) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d: width must be in %d-%d.\n"), position, 0, 500); return FALSE; } visu_interactive_class_setPreferedObserveMethod(val); return TRUE; } static gboolean readCameraSettings(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { VisuGlCamera camera; float vals[7]; g_return_val_if_fail(nbLines == 1, FALSE); if (!local_class) visu_interactive_get_type(); if (!tool_config_file_readFloat(lines[0], position, vals, 7, error)) return FALSE; memset(&camera, 0, sizeof(VisuGlCamera)); visu_gl_camera_setThetaPhiOmega(&camera, vals[0], vals[1], vals[2], VISU_GL_CAMERA_THETA | VISU_GL_CAMERA_PHI | VISU_GL_CAMERA_OMEGA); visu_gl_camera_setXsYs(&camera, vals[3], vals[4], VISU_GL_CAMERA_XS | VISU_GL_CAMERA_YS); visu_gl_camera_setGross(&camera, vals[5]); visu_gl_camera_setPersp(&camera, vals[6]); _pushSavedCamera(local_class, &camera); return TRUE; } static void exportParameters(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { VisuGlCamera *camera; GList *tmp; if (!local_class) visu_interactive_get_type(); g_string_append_printf(data, "# %s\n", DESC_PARAMETER_OBSERVE_METHOD); g_string_append_printf(data, "%s[gtk]: %d\n\n", FLAG_PARAMETER_OBSERVE_METHOD, local_class->preferedObserveMethod); if (local_class->savedCameras) g_string_append_printf(data, "# %s\n", DESC_PARAMETER_CAMERA_SETTINGS); for (tmp = local_class->savedCameras; tmp; tmp = g_list_next(tmp)) { camera = (VisuGlCamera*)tmp->data; g_string_append_printf(data, "%s[gtk]: %7.5g %7.5g %7.5g %4.3g %4.3g %g %g\n", FLAG_PARAMETER_CAMERA_SETTINGS, camera->theta, camera->phi, camera->omega, camera->xs, camera->ys, camera->gross, camera->d_red); } if (local_class->savedCameras) g_string_append(data, "\n"); } void visu_interactive_class_setPreferedObserveMethod(VisuInteractiveMethod method) { g_return_if_fail(method == interactive_constrained || method == interactive_walker); if (!local_class) visu_interactive_get_type(); local_class->preferedObserveMethod = method; } VisuInteractiveMethod visu_interactive_class_getPreferedObserveMethod() { if (!local_class) visu_interactive_get_type(); return local_class->preferedObserveMethod; } /* From an array of nodes ids, we specify their 2D coordinates */ void visu_interactive_class_getNodes2DCoordinates(VisuData *dataObj, guint *nodeIds, guint nNodes, GLfloat *coordinates2D, guint *size) { int i,j; guint k; VisuNode *node; float xyz[3], centre[3]; GLfloat *coord; GLint nValues; visu_box_getCentre(visu_boxed_getBox(VISU_BOXED(dataObj)), centre); coord = g_malloc(sizeof(GLfloat) * nNodes * (1 + 2)); glFeedbackBuffer(nNodes * (2 + 1), GL_2D, coord); glRenderMode(GL_FEEDBACK); glPushMatrix(); glTranslated(-centre[0], -centre[1], -centre[2]); /* Get nodes from ids and store their 2D coordinates */ glBegin(GL_POINTS); for(k = 0; k < nNodes; k++){ node = visu_node_array_getFromId(VISU_NODE_ARRAY(dataObj), nodeIds[k]); if(node != NULL) { visu_data_getNodePosition(dataObj, node, xyz); glVertex3fv(xyz); } } glEnd(); glPopMatrix(); nValues = glRenderMode(GL_RENDER); i = 0; j = 0; /* Keep only the coordinates */ while (i < nValues) { if (coord[i] == GL_POINT_TOKEN) { coordinates2D[j] = coord[i + 1]; coordinates2D[j+1] = coord[i + 2]; i += 3; j += 2; } else i++; } *size = j; } v_sim-3.7.0/src/openGLFunctions/interactive.h0000644000353400050620000002177012215546102016120 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef INTERACTIVE_H #define INTERACTIVE_H #include #include "view.h" #include #include #include #include /** * VisuInteractiveMethod: * @interactive_constrained: the camera is moved keeping the north * pole up. The north pole is defined by the Z axis et periodic * boundary conditions and by normal to surface in surface conditions. * @interactive_walker: the camera is moved following the mouse moves, * orienting the view as a walker would do along a sphere. * * Describes the different possible methods for observe moves. */ typedef enum { interactive_constrained, interactive_walker } VisuInteractiveMethod; /** * VisuInteractiveId: * @interactive_none: no interaction ; * @interactive_observe: interaction to rotate the view ; * @interactive_measureAndObserve: interaction to rotate the view and * access limited pick action on the right click ; * @interactive_measure: interaction to pick and measure ; * @interactive_pick: interaction to select node ; * @interactive_move: interaction to move nodes ; * @interactive_mark: interaction to mark nodes. * * These are the possible mouse interaction that are implemented. */ typedef enum { interactive_none, interactive_observe, interactive_measureAndObserve, interactive_measure, interactive_pick, interactive_move, interactive_mark } VisuInteractiveId; /** * VisuInteractivePick: * @PICK_NONE: click to void ; * @PICK_SELECTED: click to select one node ; * @PICK_DISTANCE: click to measure a distance between two nodes ; * @PICK_ANGLE: click to measure an angle ; * @PICK_HIGHLIGHT: click to highlight a node ; * @PICK_REFERENCE_1: click to select a first reference ; * @PICK_UNREFERENCE_1: click to un-select a first reference ; * @PICK_REFERENCE_2: click to select a second reference ; * @PICK_UNREFERENCE_2: click to un-select a second reference ; * @PICK_INFORMATION: click to measure distances and angles around one * node ; * @PICK_REGION: click to select a list of nodes. * * Possible significations of a click. */ typedef enum { PICK_NONE, PICK_SELECTED, PICK_DISTANCE, PICK_ANGLE, PICK_HIGHLIGHT, PICK_REFERENCE_1, PICK_UNREFERENCE_1, PICK_REFERENCE_2, PICK_UNREFERENCE_2, PICK_INFORMATION, PICK_REGION } VisuInteractivePick; /** * VisuInteractivePickError: * @PICK_ERROR_NONE: no error during click ; * @PICK_ERROR_NO_SELECTION: click to sleect but nothing selected ; * @PICK_ERROR_SAME_REF: click to set a reference but reference * already exists ; * @PICK_ERROR_REF1: click to select a first reference but impossible * to choose this one ; * @PICK_ERROR_REF2: the same for second reference. * * Possible errors to occur when pick or measure. */ typedef enum { PICK_ERROR_NONE, PICK_ERROR_NO_SELECTION, PICK_ERROR_SAME_REF, PICK_ERROR_REF1, PICK_ERROR_REF2 } VisuInteractivePickError; /** * VISU_TYPE_INTERACTIVE: * * return the type of #VisuInteractive. */ #define VISU_TYPE_INTERACTIVE (visu_interactive_get_type ()) /** * VISU_INTERACTIVE: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuInteractive type. */ #define VISU_INTERACTIVE(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_INTERACTIVE, VisuInteractive)) /** * VISU_INTERACTIVE_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuInteractiveClass. */ #define VISU_INTERACTIVE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_INTERACTIVE, VisuInteractiveClass)) /** * VISU_IS_INTERACTIVE: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuInteractive object. */ #define VISU_IS_INTERACTIVE(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_INTERACTIVE)) /** * VISU_IS_INTERACTIVE_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuInteractiveClass class. */ #define VISU_IS_INTERACTIVE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_INTERACTIVE)) /** * VISU_INTERACTIVE_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. */ #define VISU_INTERACTIVE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_INTERACTIVE, VisuInteractiveClass)) /** * VisuInteractive: * * All fields are private. */ typedef struct _VisuInteractive VisuInteractive; /** * VisuInteractiveClass: * * An opaque structure representing the class of #VisuInteractive objects. */ typedef struct _VisuInteractiveClass VisuInteractiveClass; /** * visu_interactive_get_type: * * This method returns the type of #VisuInteractive, use VISU_TYPE_INTERACTIVE instead. * * Returns: the type of #VisuInteractive. */ GType visu_interactive_get_type(void); /** * visu_interactive_class_setPreferedObserveMethod: * @method: an integer that identify the method, see #OPENGL_OBSERVE_CONSTRAINED, * and #OPENGL_OBSERVE_WALKER flags. * * There are two methods to move the camera in a pick and observe sesion. These * two methods are described in the commentary of the keys #OPENGL_OBSERVE_CONSTRAINED * an d#OPENGL_OBSERVE_WALKER. */ void visu_interactive_class_setPreferedObserveMethod(VisuInteractiveMethod method); /** * visu_interactive_class_getPreferedObserveMethod: * * There are two methods to move the camera in a pick and observe sesion. These * two methods are described in the commentary of the keys #OPENGL_OBSERVE_CONSTRAINED * an d#OPENGL_OBSERVE_WALKER. * * Returns: an integer that identify the method, see #OPENGL_OBSERVE_CONSTRAINED, * and #OPENGL_OBSERVE_WALKER flags. */ VisuInteractiveMethod visu_interactive_class_getPreferedObserveMethod(); VisuInteractive* visu_interactive_new(VisuInteractiveId type); void visu_interactive_apply(VisuInteractive *inter, VisuNodeArray *array); gboolean visu_interactive_setType(VisuInteractive *inter, VisuInteractiveId id); VisuInteractiveId visu_interactive_getType(VisuInteractive *inter); void visu_interactive_handleEvent(VisuInteractive *inter, VisuGlView *view, ToolSimplifiedEvents *ev); ToolSimplifiedEvents* visu_interactive_getEvent(VisuInteractive *inter); void visu_interactive_setNodeList(VisuInteractive *inter, VisuGlExtNodes *nodes); void visu_interactive_setMovingNodes(VisuInteractive *inter, GList *nodeIds); void visu_interactive_setMovingAxe(VisuInteractive *inter, float axe[3]); void visu_interactive_highlight(VisuInteractive *inter, VisuData *dataObj, guint nodeId); VisuGlCamera* visu_interactive_popSavedCamera(VisuInteractive *inter); void visu_interactive_pushSavedCamera(VisuInteractive *inter, VisuGlCamera *camera); void visu_interactive_getSavedCameras(VisuInteractive *inter, GList **cameras, GList **head); void visu_interactive_setReferences(VisuInteractive *inter, VisuInteractive *from); /** * visu_interactive_class_getNodes2DCoordinates: (skip) * @dataObj: a #VisuData object ; * @nodeIds: an array of #VisuNode ids ; * @nNodes: the number of nodes in the array ; * @coordinates2D: an array of nodes 2D coordinates ; * @size: the size of the coordinates array. * * From nodes ids, compute and store in @coordinates2D their 2D coordinates. */ void visu_interactive_class_getNodes2DCoordinates(VisuData *dataObj, guint *nodeIds, guint nNodes, float *coordinates2D, guint *size); #endif v_sim-3.7.0/src/openGLFunctions/objectList.c0000644000353400050620000004650012215546102015676 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "objectList.h" #include #include #include #include #include #include #include "text.h" /** * SECTION:objectList * @short_description: Gives storage for ids used by OpenGL lists and * provides primitive routine for common drawing operations * (distances, torus...). * * When using OpenGL list, one must specify ids. This module can * return unused ids when needed. * * Here are also defined the common primitive for drawing, see * visu_gl_drawDistance() for instance. */ /* Variables to store the glObjectList. */ /* The default size of the table to store the user lists. */ #define GLOBJECTLIST_INCREMENT 15 /* First value given to user to store their glObjectList. */ #define GLOBJECTLIST_FIRST 1001 /* The table that stores the identifier of user's glObjectList. */ static int *glObjectListRegistered; /* The allocated size of this table. */ static int glObjectListRegisteredSize; /* The number of stored elements. */ static int nbGlObjectListRegistered; /* The number of user's reserved numbers of the last entry in this table. */ static int lastGlObjectListSize; /** * visu_gl_objectlist_init: (skip) * * Used to initialise this part of code, don't use it. */ void visu_gl_objectlist_init(void) { /* Initialisation of the table that stores the user glObjectList. */ glObjectListRegistered = (int*)0; glObjectListRegisteredSize = 0; nbGlObjectListRegistered = 0; lastGlObjectListSize = 0; } /** * visu_gl_objectlist_new: * @size: the requested size. * * It returns the id that can be used to link glObjectList. * This number is also added to the list of glObjectList to be displayed. * The size parameter is the number of lists that could be used by * the user for this glObjectList. Then the next call to this function * will return the last value plus the size plus one. * * Returns: an identifier used by OpenGl as a list. */ int visu_gl_objectlist_new(int size) { if (nbGlObjectListRegistered >= glObjectListRegisteredSize) { glObjectListRegisteredSize += GLOBJECTLIST_INCREMENT; glObjectListRegistered = g_realloc(glObjectListRegistered, sizeof(int) * glObjectListRegisteredSize); } if (nbGlObjectListRegistered > 0) glObjectListRegistered[nbGlObjectListRegistered] = glObjectListRegistered[nbGlObjectListRegistered - 1] + lastGlObjectListSize; else glObjectListRegistered[0] = GLOBJECTLIST_FIRST; lastGlObjectListSize = size; nbGlObjectListRegistered++; DBG_fprintf(stderr, "Object List: request %d OpenGL lists -> %d %d.\n", size, glObjectListRegistered[nbGlObjectListRegistered - 1], glObjectListRegistered[nbGlObjectListRegistered - 1] + size - 1); return glObjectListRegistered[nbGlObjectListRegistered - 1]; } static void drawRoundedHat(GLUquadricObj *obj, float hat_length, float hat_height, float radius, int nlat) { gluCylinder(obj, hat_length, 0, hat_height, nlat, 1); glRotatef(180, 1, 0, 0); gluDisk(obj, 0, radius, nlat, 1); glRotatef(180, 1, 0, 0); } static void drawRoundedTail(GLUquadricObj *obj, float tail_length, float tail_height, int nlat) { if (tail_height <= 0.f) return; glTranslatef(0, 0, -tail_height); glRotatef(180, 1, 0, 0); gluDisk(obj, 0, (tail_length)*1.03, nlat, 1); glRotatef(180, 1, 0, 0); gluCylinder(obj, tail_length, tail_length, tail_height, nlat, 1); } static void drawEdgedHat(float hat_length, float hat_height) { glBegin(GL_TRIANGLE_FAN); glNormal3f(hat_height, 0, hat_length); glVertex3f(0, 0, hat_height); glVertex3f(hat_length,-hat_length,0); glVertex3f(hat_length,hat_length,0); glNormal3f(0, hat_height, hat_length); glVertex3f(-hat_length,hat_length,0); glNormal3f(-hat_height, 0, hat_length); glVertex3f(-hat_length,-hat_length,0); glNormal3f(-hat_height, 0, hat_length); glVertex3f(hat_length,-hat_length,0); glEnd(); glBegin(GL_QUADS); glNormal3f(0., 0., -1.); glVertex3f(hat_length ,hat_length ,0 ); glVertex3f(hat_length ,-hat_length ,0 ); glVertex3f(-hat_length ,-hat_length ,0 ); glVertex3f(-hat_length ,hat_length ,0 ); glEnd(); } static void drawEdgedTail(float tail_length, float tail_height) { glBegin(GL_QUADS); glNormal3f(0., 0., 1.); glVertex3f(tail_length , tail_length , 0 ); glVertex3f(-tail_length , tail_length , 0 ); glVertex3f(-tail_length , -tail_length , 0 ); glVertex3f(tail_length , -tail_length , 0 ); glNormal3f(0., 0., -1.); glVertex3f(tail_length ,tail_length ,-tail_height ); glVertex3f(tail_length ,-tail_length ,-tail_height ); glVertex3f(-tail_length ,-tail_length ,-tail_height ); glVertex3f(-tail_length ,tail_length ,-tail_height ); glNormal3f(1., 0., 0.); glVertex3f(tail_length ,tail_length ,0 ); glVertex3f(tail_length ,-tail_length ,0 ); glVertex3f(tail_length ,-tail_length ,-tail_height ); glVertex3f(tail_length ,tail_length ,-tail_height ); glNormal3f(-1., 0., 0.); glVertex3f(-tail_length ,tail_length ,0 ); glVertex3f(-tail_length ,tail_length ,-tail_height ); glVertex3f(-tail_length ,-tail_length ,-tail_height ); glVertex3f(-tail_length ,-tail_length ,0 ); glNormal3f(0., 1., 0.); glVertex3f(-tail_length ,tail_length ,-tail_height ); glVertex3f(-tail_length ,tail_length ,0 ); glVertex3f(tail_length ,tail_length ,0 ); glVertex3f(tail_length ,tail_length ,-tail_height ); glNormal3f(0., -1., 0.); glVertex3f(-tail_length ,-tail_length ,-tail_height ); glVertex3f(tail_length ,-tail_length ,-tail_height ); glVertex3f(tail_length ,-tail_length ,0 ); glVertex3f(-tail_length ,-tail_length ,0 ); glEnd(); } /** * visu_gl_drawSmoothArrow: * @obj: (type gpointer): ... * @material_id: an OpenGL list id for material change. * @centering: a flag. * @tailLength: length of tail part. * @tailRadius: length of edge of tail part. * @tailN: number of edges in the approximation. * @tailUseMat: use the material colour for the tail part. * @hatLength: length of hat part. * @hatRadius: length of edge of hat part. * @hatN: number of edges in the approximation. * @hatUseMat: use the material colour for the hat part. * * Draw arrows, using sqaure edges. For rounded arrows, see * visu_gl_drawEdgeArrow(). * * Since: 3.6 */ void visu_gl_drawSmoothArrow(GLUquadricObj *obj, int material_id, VisuGlArrowCentering centering, float tailLength, float tailRadius, float tailN, gboolean tailUseMat, float hatLength, float hatRadius, float hatN, gboolean hatUseMat) { switch (centering) { case VISU_GL_ARROW_TAIL_CENTERED: glTranslatef(0.f, 0.f, tailLength / 2.f); break; case VISU_GL_ARROW_CENTERED: glTranslatef(0.f, 0.f, -(hatLength - tailLength) / 2.f); break; case VISU_GL_ARROW_BOTTOM_CENTERED: glTranslatef(0.f, 0.f, tailLength); break; default: break; } if(tailUseMat && hatUseMat) { glCallList(material_id); drawRoundedHat(obj, hatRadius, hatLength, MAX(hatRadius, tailRadius)*1.03, hatN); drawRoundedTail(obj, tailRadius, tailLength, tailN); } else if(tailUseMat) { drawRoundedHat(obj, hatRadius, hatLength, MAX(hatRadius, tailRadius)*1.03, hatN); glCallList(material_id); drawRoundedTail(obj, tailRadius, tailLength, tailN); } else if(hatUseMat) { drawRoundedTail(obj, tailRadius, tailLength, tailN); glTranslatef(0, 0, tailLength); glCallList(material_id); drawRoundedHat(obj, hatRadius, hatLength, MAX(hatRadius, tailRadius)*1.03, hatN); } else { drawRoundedHat(obj, hatRadius, hatLength, MAX(hatRadius, tailRadius)*1.03, hatN); drawRoundedTail(obj, tailRadius, tailLength, tailN); } } /** * visu_gl_drawEdgeArrow: * @material_id: an OpenGL list id for material change. * @centering: a flag. * @tailLength: length of tail part. * @tailRadius: length of edge of tail part. * @tailUseMat: use the material colour for the tail part. * @hatLength: length of hat part. * @hatRadius: length of edge of hat part. * @hatUseMat: use the material colour for the hat part. * * Draw arrows, using sqaure edges. For rounded arrows, see * visu_gl_drawSmoothArrow(). * * Since: 3.6 */ void visu_gl_drawEdgeArrow(int material_id, VisuGlArrowCentering centering, float tailLength, float tailRadius, gboolean tailUseMat, float hatLength, float hatRadius, gboolean hatUseMat) { /* This one is a edged arrow. */ switch (centering) { case VISU_GL_ARROW_TAIL_CENTERED: glTranslatef(0.f, 0.f, tailLength / 2.f); break; case VISU_GL_ARROW_CENTERED: glTranslatef(0.f, 0.f, tailLength - (hatLength + tailLength) / 2.f); break; case VISU_GL_ARROW_BOTTOM_CENTERED: glTranslatef(0.f, 0.f, tailLength); break; default: break; } if(tailUseMat && hatUseMat) { glCallList(material_id); drawEdgedHat(hatRadius, hatLength); drawEdgedTail(tailRadius, tailLength); } else if(tailUseMat) { drawEdgedHat(hatRadius, hatLength); glCallList(material_id); drawEdgedTail(tailRadius, tailLength); } else if(hatUseMat) { drawEdgedTail(tailRadius, tailLength); glCallList(material_id); drawEdgedHat(hatRadius, hatLength); } else { drawEdgedHat(hatRadius, hatLength); drawEdgedTail(tailRadius, tailLength); } } /** * visu_gl_drawEllipsoid: * @obj: (type gpointer): ... * @material_id: an OpenGL list id for material change. * @aAxis: length of long axis. * @bAxis: length of short axis. * @n: number of edges for the sphere approximation. * @useMat: a flag to use the material definition or not. * * Draw an ellipsoid. * * Since: 3.6 */ void visu_gl_drawEllipsoid(GLUquadricObj *obj, int material_id, float aAxis, float bAxis, float n, gboolean useMat) { if (bAxis == 0.f) glScalef(1.f, 1.f, 10.f); else glScalef(1.f, 1.f, aAxis / bAxis); if (useMat) glCallList(material_id); gluSphere(obj, bAxis, n, n); } /** * visu_gl_drawTorus: * @obj: (type gpointer): ... * @material_id: an OpenGL list id for material change. * @radius: global radius. * @ratio: ratio on internal radius over global radius. * @nA: number of edges for the global radius. * @nB: number of edges for the internal radius. * @useMat: a flag to use the material definition or not. * * Draw a torus. * * Since: 3.5 */ void visu_gl_drawTorus(GLUquadricObj *obj _U_, int material_id, float radius, float ratio, int nA, int nB, gboolean useMat) { int i, j; float tp, tc, dtA, dtB, xp1, yp1, xp2, yp2, xc1, yc1, xc2, yc2, alpha; float a[3], b[3], c[3], d[3], aa[3], bb[3], cc[3], dd[3]; if (useMat) glCallList(material_id); glBegin(GL_QUADS); glEnable(GL_NORMALIZE); dtA = 2.f*G_PI/(float)nA; dtB = 2.f*G_PI/(float)nB; alpha = 1.f / ratio; /* loop on the position of the centre of the circle which stands vertical in the plane, and which is rotated to create the torus */ for (i = 0; i < nA; i++) { tp = (float)i*dtA; xp1 = radius*cos(tp); yp1 = radius*sin(tp); xp2 = radius*cos(tp+dtA); yp2 = radius*sin(tp+dtA); /* loop around the circle */ for (j = 0; j < nB; j++) { tc = (float)j*dtB; xc1 = alpha*cos(tc); yc1 = alpha*sin(tc); xc2 = alpha*cos(tc+dtB); yc2 = alpha*sin(tc+dtB); a[0] = xp1 * (1.f + xc1); a[1] = yp1 * (1.f + xc1); a[2] = yc1 * radius; b[0] = xp2 * (1.f + xc1); b[1] = yp2 * (1.f + xc1); b[2] = yc1 * radius; c[0] = xp1 * (1.f + xc2); c[1] = yp1 * (1.f + xc2); c[2] = yc2 * radius; d[0] = xp2 * (1.f + xc2); d[1] = yp2 * (1.f + xc2); d[2] = yc2 * radius; aa[0] = xp1 * xc1; aa[1] = yp1 * xc1; aa[2] = yc1 * radius; bb[0] = xp2 * xc1; bb[1] = yp2 * xc1; bb[2] = yc1 * radius; cc[0] = xp1 * xc2; cc[1] = yp1 * xc2; cc[2] = yc2 * radius; dd[0] = xp2 * xc2; dd[1] = yp2 * xc2; dd[2] = yc2 * radius; /* Point A */ glNormal3fv(aa); glVertex3fv(a); /* Point B */ glNormal3fv(bb); glVertex3fv(b); /* Point D */ glNormal3fv(dd); glVertex3fv(d); /* Point C */ glNormal3fv(cc); glVertex3fv(c); } } glDisable(GL_NORMALIZE); glEnd(); } /** * visu_gl_drawDistance: * @xyzRef: cartesian coordinates of first ref. * @xyz: cartesian coordinates of current point. * @drawLength: a boolean. * * Draw a distance mark between @xyzRef and @xyz. A distance mark is a * colour inverted line and two squared marks on node. @drawLength * is a flag to display or not the distance value. * * Since: 3.6 */ void visu_gl_drawDistance(float xyzRef[3], float xyz[3], gboolean drawLength) { float dist; int i; char distStr[8]; glLineWidth(1); glColor4f(1., 1., 1., 0.); glBegin(GL_LINES); glVertex3fv(xyzRef); glVertex3fv(xyz); glEnd(); glPointSize(8.); glBegin(GL_POINTS); glVertex3fv(xyzRef); glVertex3fv(xyz); glEnd(); if (drawLength) { dist = 0.; for (i = 0; i < 3; i++) dist += (xyzRef[i] - xyz[i]) * (xyzRef[i] - xyz[i]); sprintf(distStr, "%7.3f", sqrt(dist)); distStr[7] = '\0'; DBG_fprintf(stderr, "OpenGL Objects: draw a link with distance %s.\n", distStr); glRasterPos3f((xyzRef[0] + xyz[0]) / 2.f, (xyzRef[1] + xyz[1]) / 2.f, (xyzRef[2] + xyz[2]) / 2.f); visu_gl_text_drawChars(distStr, VISU_GL_TEXT_NORMAL); } } /** * visu_gl_drawAngle: * @xyzRef: cartesian coordinates of first ref. * @xyzRef2: cartesian coordinates of second ref. * @xyz: cartesian coordinates of current point. * @id: a counter. * @drawLength: a boolean. * * Draw an angle mark by to distance marks and a disk taking @xyzRef * as central point and @xyzRef2 and @xyz as the two positions. @id is * a counter to obtain different colours for the disk and @drawLength * is a flag to display or not the angle value in degrees. * * Since: 3.6 */ void visu_gl_drawAngle(float xyzRef[3], float xyzRef2[3], float xyz[3], guint id, gboolean drawLength) { float dist, u[3], v[3], M[3], c, s, theta, thetaM, l; int i, iM; char distStr[9]; /* We calculate the new basis set. */ u[0] = xyz[0] - xyzRef[0]; u[1] = xyz[1] - xyzRef[1]; u[2] = xyz[2] - xyzRef[2]; l = sqrt(u[0] * u[0] + u[1] * u[1] + u[2] * u[2]); dist = 1.f / l; u[0] *= dist; u[1] *= dist; u[2] *= dist; v[0] = xyzRef2[0] - xyzRef[0]; v[1] = xyzRef2[1] - xyzRef[1]; v[2] = xyzRef2[2] - xyzRef[2]; dist = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); l = MIN(l, dist); dist = 1.f / dist; v[0] *= dist; v[1] *= dist; v[2] *= dist; l /= 4.f; dist = u[0] * v[0] + u[1] * v[1] + u[2] * v[2]; thetaM = acos(dist); iM = MAX((int)(thetaM / G_PI * 20.f), 2); if (drawLength) { sprintf(distStr, "%5.1f\302\260", thetaM * 180.f / G_PI); distStr[8] = '\0'; DBG_fprintf(stderr, "OpenGL Objects: the angle is %g.\n", thetaM * 180.f / G_PI); } v[0] -= dist * u[0]; v[1] -= dist * u[1]; v[2] -= dist * u[2]; dist = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); if (dist < 1e-3) { v[0] = 1.f; v[1] = 1.f; v[2] = 1.f; i = 0; if (u[0] != 0.f) i = 0; else if (u[1] != 0.f) i = 1; else if (u[2] != 0.f) i = 2; else g_warning("Selected node and reference are the same."); v[i] = 1.f - (u[0] + u[1] + u[2]) / u[i]; dist = 1.f / sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); } else dist = 1.f / dist; v[0] *= dist; v[1] *= dist; v[2] *= dist; glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4fv(tool_color_new_bright(id)->rgba); if (drawLength) { theta = 0.5f * thetaM; c = cos(theta); s = sin(theta); M[0] = xyzRef[0] + (u[0] * c + v[0] * s) * l * 1.33f; M[1] = xyzRef[1] + (u[1] * c + v[1] * s) * l * 1.33f; M[2] = xyzRef[2] + (u[2] * c + v[2] * s) * l * 1.33f; glRasterPos3fv(M); visu_gl_text_drawChars(distStr, VISU_GL_TEXT_SMALL); } glLineWidth(1); glBegin(GL_LINES); glVertex3fv(xyzRef); glVertex3fv(xyzRef2); glVertex3fv(xyzRef); glVertex3fv(xyz); glEnd(); glEnable(GL_POLYGON_OFFSET_FILL); glPolygonOffset(1.0, 1.0); glBegin(GL_POLYGON); glVertex3fv(xyzRef); for (i = 0; i < iM; i++) { theta = (float)i / ((float)iM - 1.f) * thetaM; c = cos(theta); s = sin(theta); M[0] = xyzRef[0] + (u[0] * c + v[0] * s) * l; M[1] = xyzRef[1] + (u[1] * c + v[1] * s) * l; M[2] = xyzRef[2] + (u[2] * c + v[2] * s) * l; glVertex3fv(M); } glEnd(); glPointSize(4.); glBegin(GL_POINTS); glVertex3fv(xyzRef2); glVertex3fv(xyz); glEnd(); glDisable(GL_POLYGON_OFFSET_FILL); glColor3f (0.0, 0.0, 0.0); glLineWidth(1.1); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glBegin(GL_POLYGON); glVertex3fv(xyzRef); for (i = 0; i < iM; i++) { theta = (float)i / ((float)iM - 1.f) * thetaM; c = cos(theta); s = sin(theta); M[0] = xyzRef[0] + (u[0] * c + v[0] * s) * l; M[1] = xyzRef[1] + (u[1] * c + v[1] * s) * l; M[2] = xyzRef[2] + (u[2] * c + v[2] * s) * l; glVertex3fv(M); } glEnd(); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); /* glColor4f(0., 0., 0., 1.); */ /* glBegin(GL_LINE_LOOP); */ /* glVertex3fv(xyzRef); */ /* for (i = 0; i < iM; i++) */ /* { */ /* theta = (float)i / ((float)iM - 1.f) * thetaM; */ /* c = cos(theta); */ /* s = sin(theta); */ /* M[0] = xyzRef[0] + (u[0] * c + v[0] * s) * l; */ /* M[1] = xyzRef[1] + (u[1] * c + v[1] * s) * l; */ /* M[2] = xyzRef[2] + (u[2] * c + v[2] * s) * l; */ /* glVertex3fv(M); */ /* } */ /* glEnd(); */ glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_SRC_COLOR); } v_sim-3.7.0/src/openGLFunctions/objectList.h0000644000353400050620000000717712215546102015712 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef OBJECTLIST_H #define OBJECTLIST_H #include #include int visu_gl_objectlist_new(int size); void visu_gl_objectlist_init(void); /** * VisuGlArrowCentering: * @VISU_GL_ARROW_ORIGIN_CENTERED: the arrows are positioned with respect to the * point between tail and hat. * @VISU_GL_ARROW_BOTTOM_CENTERED: the arrows are positioned with respect to the bottom * of the arrow ; * @VISU_GL_ARROW_TAIL_CENTERED: the arrows are positioned with respect to the * center of the tail part ; * @VISU_GL_ARROW_CENTERED: the arrows are centered. * * The way to draw arrows (see visu_gl_drawSmoothArrow() for instance). */ typedef enum { VISU_GL_ARROW_ORIGIN_CENTERED, VISU_GL_ARROW_BOTTOM_CENTERED, VISU_GL_ARROW_TAIL_CENTERED, VISU_GL_ARROW_CENTERED } VisuGlArrowCentering; void visu_gl_drawSmoothArrow(GLUquadricObj *obj, int material_id, VisuGlArrowCentering centering, float tailLength, float tailRadius, float tailN, gboolean tailUseMat, float hatLength, float hatRadius, float hatN, gboolean hatUseMat); void visu_gl_drawEdgeArrow(int material_id, VisuGlArrowCentering centering, float tailLength, float tailRadius, gboolean tailUseMat, float hatLength, float hatRadius, gboolean hatUseMat); void visu_gl_drawEllipsoid(GLUquadricObj *obj, int material_id, float aAxis, float bAxis, float n, gboolean useMat); void visu_gl_drawTorus(GLUquadricObj *obj, int material_id, float radius, float ratio, int nA, int nB, gboolean useMat); void visu_gl_drawDistance(float xyzRef[3], float xyz[3], gboolean drawLength); void visu_gl_drawAngle(float xyzRef[3], float xyzRef2[3], float xyz[3], guint id, gboolean drawLength); #endif v_sim-3.7.0/src/OSOpenGL/0000755000353400050620000000000012216331341012012 500000000000000v_sim-3.7.0/src/OSOpenGL/visu_WGL.c0000644000353400050620000001623612215546074013617 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2006) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2006) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifdef HAVE_CONFIG_H #include #endif #include "visu_openGL.h" #include #include #include struct _VisuPixmapContext { HDC hdc; HDC pixmapDC; HBITMAP pixmap; int width, height; HGLRC context; }; void visu_gl_setupPixelFormat(HDC hDC) { /* Pixel format index */ int nPixelFormat; static PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), /*size of structure*/ 1, /*default version*/ PFD_DRAW_TO_WINDOW | /*window drawing support*/ PFD_SUPPORT_OPENGL | /*opengl support*/ PFD_DOUBLEBUFFER, /*double buffering support*/ PFD_TYPE_RGBA, /*RGBA color mode*/ 32, /*32 bit color mode*/ 0, 0, 0, 0, 0, 0, /*ignore color bits*/ 0, /*no alpha buffer*/ 0, /*ignore shift bit*/ 0, /*no accumulation buffer*/ 0, 0, 0, 0, /*ignore accumulation bits*/ 16, /*16 bit z-buffer size*/ 0, /*no stencil buffer*/ 0, /*no aux buffer*/ PFD_MAIN_PLANE, /*main drawing plane*/ 0, /*reserved*/ 0, 0, 0 }; /*layer masks ignored*/ /* Choose best matching format*/ nPixelFormat = ChoosePixelFormat(hDC, &pfd); /* Set the pixel format to the device context*/ SetPixelFormat(hDC, nPixelFormat, &pfd); } void SetupPixelFormatPixmap(HDC hDC) { /* Pixel format index */ int nPixelFormat; static PIXELFORMATDESCRIPTOR pfdPix = { sizeof(PIXELFORMATDESCRIPTOR), /*size of structure*/ 1, /*default version*/ PFD_DRAW_TO_BITMAP | /*window drawing support*/ PFD_SUPPORT_OPENGL, /*opengl support*/ PFD_TYPE_RGBA, /*RGBA color mode*/ 32, /*32 bit color mode*/ 0, 0, 0, 0, 0, 0, /*ignore color bits*/ 0, /*no alpha buffer*/ 0, /*ignore shift bit*/ 0, /*no accumulation buffer*/ 0, 0, 0, 0, /*ignore accumulation bits*/ 16, /*16 bit z-buffer size*/ 0, /*no stencil buffer*/ 0, /*no aux buffer*/ PFD_MAIN_PLANE, /*main drawing plane*/ 0, /*reserved*/ 0, 0, 0 }; /*layer masks ignored*/ /* Choose best matching format*/ nPixelFormat = ChoosePixelFormat(hDC, &pfdPix); /* Set the pixel format to the device context*/ SetPixelFormat(hDC, nPixelFormat, &pfdPix); } VisuPixmapContext* visu_pixmap_context_new(guint width, guint height) { VisuPixmapContext *image; DBG_fprintf(stderr, "Visu WGL : creating a off-screen buffer (%dx%d).", width, height); image = g_malloc(sizeof(VisuPixmapContext)); image->hdc = (HDC)0; image->pixmap = (HBITMAP)0; image->pixmapDC = (HDC)0; image->context = (HGLRC)0; image->width = width; image->height = height; image->hdc = GetDC(NULL); if (!image->hdc) { g_warning("Cannot get a HDC."); g_free(image); return (VisuPixmapContext*)0; } image->pixmap = CreateCompatibleBitmap(image->hdc, width, height); if (!image->pixmap) { g_warning("Cannot allocate a pixmap for the indirect rendering."); g_free(image); return (VisuPixmapContext*)0; } image->pixmapDC = CreateCompatibleDC(NULL); if (!image->pixmapDC) { g_warning("Cannot allocate a pixmapDC for the indirect rendering."); g_free(image); return (VisuPixmapContext*)0; } image->pixmap = SelectObject(image->pixmapDC, image->pixmap); SetupPixelFormatPixmap(image->pixmapDC); image->context = wglCreateContext(image->pixmapDC); if (!image->context) { g_warning("Cannot create indirect WGL context."); g_free(image); return (VisuPixmapContext*)0; } wglMakeCurrent(NULL, NULL); wglMakeCurrent(image->pixmapDC, image->context); /* Changing context, update fonts. */ visu_gl_text_onNewContext(); return image; } void visu_pixmap_context_free(VisuPixmapContext *dumpData) { g_return_if_fail(dumpData); wglDeleteContext(dumpData->context); DeleteObject(SelectObject(dumpData->pixmapDC, dumpData->pixmap)); DeleteDC(dumpData->pixmapDC); g_free(dumpData); } GLuint visu_gl_initFontList(guint size) { GLuint BASE; BOOL res; HDC hdc; BASE = 0; DBG_fprintf(stderr, "Visu WGL : initialise fonts.\n"); /* this creates display lists 1 to 256 (not checked) */ if ( (BASE = glGenLists(256)) == 0 ) { g_warning("Cannot build font display lists.\n"); return 0; } hdc = GetDC(NULL); res = wglUseFontBitmaps(hdc, 0, 255, BASE); /* else res = wglUseFontBitmaps(hdcPixmap, 0, 255, BASE);*/ if ( !res ) { g_warning("wglUseFontBitmaps returns false.\n"); return 0; } else return BASE; } v_sim-3.7.0/src/OSOpenGL/visu_GLX.c0000644000353400050620000002627312215546074013622 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2006) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2006) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include "visu_openGL.h" #include #include static Display *dpy = (Display*)0; static gboolean Xerror = FALSE; struct _VisuPixmapContext { GLXContext context; #ifdef HAVE_PBUFFER GLXPbuffer glxPbuffer; #else GLXPixmap glxPixmap; #endif Pixmap pixmap; guint width, height; }; struct _VisuGLXFont { GLuint id; GLsizei len; XFontStruct *font; }; static GHashTable *fonts = (GHashTable*)0; static int handler(Display *dpy _U_, XErrorEvent *error _U_) { DBG_fprintf(stderr, "Visu GLX: ouch one X error.\n"); Xerror = TRUE; return 0; } #ifdef HAVE_PBUFFER static XVisualInfo* _visualInfoFromFB(Display *dpy, int screenId, GLXFBConfig **fb) { XVisualInfo *vinfo; GLXFBConfig *fbconfig; int nitems; int attrib[] = { GLX_DOUBLEBUFFER, False, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_DEPTH_SIZE, 1, GLX_RENDER_TYPE, GLX_RGBA_BIT, GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT, None }; fbconfig = glXChooseFBConfig(dpy, screenId, attrib, &nitems); if (fbconfig == (GLXFBConfig*)0 || nitems == 0) { g_warning("Can't get FBConfig."); return (XVisualInfo*)0; } *fb = fbconfig; vinfo = glXGetVisualFromFBConfig(dpy, fbconfig[0]); if (!vinfo) { g_warning("Can't get RGBA Visual."); return (XVisualInfo*)0; } return vinfo; } #endif XVisualInfo* visu_gl_getVisualInfo(Display *dpy, int screenId) { XVisualInfo *vinfo; int list[] = { GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_DEPTH_SIZE, 1, GLX_DOUBLEBUFFER, GLX_STEREO, None }; if ( (vinfo = glXChooseVisual(dpy, screenId, list)) == NULL ) { list[10] = None; if ( (vinfo = glXChooseVisual(dpy, screenId, list)) == NULL ) { g_error("Cannot find a visual.\n" "Have you enough right access on the X server?"); } DBG_fprintf(stderr, " | not a stereo buffer.\n"); } else DBG_fprintf(stderr, " | stereo buffer.\n"); return vinfo; } /** * visu_pixmap_context_new: * @width: an integer ; * @height: an integer. * * Create a pixmap storage and a context associated to it. This pixmap * can then be used to dump pixel data from an OpenGL area. * * Returns: (transfer none): a newly allocated #DumpImage object. */ VisuPixmapContext* visu_pixmap_context_new(guint width, guint height) { VisuPixmapContext *image; int screenId, res; Bool direct; XVisualInfo *visualInfo; #ifdef HAVE_PBUFFER GLXFBConfig *fbconfig; int pbufAttrib[] = { GLX_PBUFFER_WIDTH, 0, GLX_PBUFFER_HEIGHT, 0, GLX_LARGEST_PBUFFER, False, None }; #endif DBG_fprintf(stderr, "Visu GLX: creating a off-screen buffer (%dx%d).\n", width, height); image = g_malloc(sizeof(VisuPixmapContext)); image->pixmap = (Pixmap)0; #ifdef HAVE_PBUFFER image->glxPbuffer = (GLXPbuffer)0; #else image->glxPixmap = (GLXPixmap)0; #endif image->context = (GLXContext)0; if (!dpy) dpy = XOpenDisplay(0); if (!dpy) { g_warning("Cannot connect to the X server."); g_free(image); return (VisuPixmapContext*)0; } DBG_fprintf(stderr, "Visu GLX: display opened.\n"); screenId = DefaultScreen(dpy); #ifdef HAVE_PBUFFER visualInfo = _visualInfoFromFB(dpy, screenId, &fbconfig); #else visualInfo = visu_gl_getVisualInfo(dpy, screenId); #endif if (!visualInfo) { g_free(image); return (VisuPixmapContext*)0; } image->width = width; image->height = height; image->pixmap = XCreatePixmap(dpy, RootWindow(dpy, screenId), width, height, visualInfo->depth); if (!image->pixmap) { g_warning("Cannot allocate a XPixmap for the indirect rendering."); g_free(image); XFree(visualInfo); return (VisuPixmapContext*)0; } DBG_fprintf(stderr, "Visu GLX: X pixmap created.\n"); #ifdef HAVE_PBUFFER pbufAttrib[1] = width; pbufAttrib[3] = height; image->glxPbuffer = glXCreatePbuffer(dpy, fbconfig[0], pbufAttrib); DBG_fprintf(stderr, "Visu GLX: use pBuffer.\n"); if (!image->glxPbuffer) { g_warning("Cannot allocate a GLXPbuffer for the indirect rendering."); XFreePixmap(dpy, image->pixmap); g_free(image); XFree(visualInfo); return (VisuPixmapContext*)0; } direct = GL_TRUE; #else image->glxPixmap = glXCreateGLXPixmap(dpy, visualInfo, image->pixmap); DBG_fprintf(stderr, "Visu GLX: use GLXPixmap.\n"); if (!image->glxPixmap) { g_warning("Cannot allocate a GLXPixmap for the indirect rendering."); XFreePixmap(dpy, image->pixmap); g_free(image); XFree(visualInfo); return (VisuPixmapContext*)0; } direct = GL_FALSE; #endif DBG_fprintf(stderr, "Visu GLX: GLX off-creen surface created.\n"); image->context = glXCreateContext(dpy, visualInfo, 0, direct); if (!image->context) { g_warning("Cannot create indirect GLX context."); XFreePixmap(dpy, image->pixmap); #ifdef HAVE_PBUFFER glXDestroyPbuffer(dpy, image->glxPbuffer); #else glXDestroyGLXPixmap(dpy, image->glxPixmap); #endif g_free(image); XFree(visualInfo); return (VisuPixmapContext*)0; } DBG_fprintf(stderr, "Visu GLX: new OpenGL context created.\n"); Xerror = FALSE; XSetErrorHandler(handler); #ifdef HAVE_PBUFFER res = glXMakeCurrent(dpy, image->glxPbuffer, image->context); #else res = glXMakeCurrent(dpy, image->glxPixmap, image->context); #endif XSetErrorHandler(NULL); if (!res || Xerror) { g_warning("Cannot make current the pixmap context."); XFreePixmap(dpy, image->pixmap); #ifdef HAVE_PBUFFER glXDestroyPbuffer(dpy, image->glxPbuffer); #else glXDestroyGLXPixmap(dpy, image->glxPixmap); #endif g_free(image); XFree(visualInfo); return (VisuPixmapContext*)0; } DBG_fprintf(stderr, "Visu GLX: pixmap context is now current.\n"); /* Changing context, update fonts. */ visu_gl_text_onNewContext(); XFree(visualInfo); glXWaitX(); return image; } /** * visu_pixmap_context_free: * @dumpData: an allocated #DumpImage object. * * Free an allocated #DumpImage. */ void visu_pixmap_context_free(VisuPixmapContext *dumpData) { g_return_if_fail(dumpData); if (dpy) { #ifdef HAVE_PBUFFER DBG_fprintf(stderr, "Visu GLX: free the GLX pbuffer 0x%x.\n", (int)dumpData->glxPbuffer); if (dumpData->glxPbuffer) glXDestroyPbuffer(dpy, dumpData->glxPbuffer); #else DBG_fprintf(stderr, "Visu GLX: free the GLX pixmap 0x%x.\n", (int)dumpData->glxPixmap); if (dumpData->glxPixmap) glXDestroyGLXPixmap(dpy, dumpData->glxPixmap); #endif DBG_fprintf(stderr, "Visu GLX: free the X pixmap 0x%x.\n", (int)dumpData->pixmap); if (dumpData->pixmap) XFreePixmap(dpy, dumpData->pixmap); DBG_fprintf(stderr, "Visu GLX: free the context.\n"); if (dumpData->context) glXDestroyContext(dpy, dumpData->context); /* We do NOT close the display since it is shared by all the application and thus dpy structure is unique and will be closed by the main program when quiting. */ /* XCloseDisplay(dumpData->dpy); */ glXWaitX(); } g_free(dumpData); } static void freeFont(gpointer data) { struct _VisuGLXFont *font = (struct _VisuGLXFont*)data; if (!dpy) dpy = XOpenDisplay(0); DBG_fprintf(stderr, "Visu GLX: delete font %d.\n", font->id); glDeleteLists(font->id, font->len); XFreeFont(dpy, font->font); g_free(data); } GLuint visu_gl_initFontList(guint size) { XFontStruct *fontInfo = (XFontStruct*)0; guint first, last; gchar *name; struct _VisuGLXFont *font; name = g_strdup_printf("-misc-fixed-bold-r-normal-*-%d-*-*-*-*-*-iso8859-1", size); DBG_fprintf(stderr, "Visu GLX: initialise fonts (%s).\n", name); if (!dpy) dpy = XOpenDisplay(0); if (!fonts) fonts = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, freeFont); /* Delete previous lists for this size. */ DBG_fprintf(stderr, " | remove previous entry %p if any from %p (%d).\n", GINT_TO_POINTER(size), (gpointer)fonts, g_hash_table_size(fonts)); g_hash_table_remove(fonts, name); DBG_fprintf(stderr, " | get the X font description.\n"); Xerror = FALSE; XSetErrorHandler(handler); if ((fontInfo = XLoadQueryFont(dpy, name)) == NULL) { g_message("Specified font not available in gl_font_init\n" "Trying to use fixed font\n"); if ((fontInfo = XLoadQueryFont(dpy, "fixed")) == NULL) { g_error("Fixed font not available.\n"); } } XSetErrorHandler(NULL); if (Xerror) { g_warning("No font for this surface."); return 0; } DBG_fprintf(stderr, " | Found XFontStruct.\n"); first = fontInfo->min_char_or_byte2; last = fontInfo->max_char_or_byte2; DBG_fprintf(stderr, " | XFontStruct OK (%d %d).\n", first, last); /* this creates display lists 1 to 256 (not checked) */ font = g_malloc(sizeof(struct _VisuGLXFont)); font->font = fontInfo; font->len = last + 1; font->id = glGenLists(font->len); if (!font->id) { g_free(font); g_free(name); return 0; } g_hash_table_insert(fonts, name, (gpointer)font); Xerror = FALSE; XSetErrorHandler(handler); glXUseXFont(fontInfo->fid, first, last-first+1, font->id+first); XSetErrorHandler(NULL); if (Xerror) { g_warning("No font generation for this surface."); font->id = 0; } DBG_fprintf(stderr, " | list id %d\n", font->id); return font->id; } v_sim-3.7.0/src/OSOpenGL/visu_GtkGlExt.c0000644000353400050620000001230612215546074014651 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2006) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2006) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "visu_openGL.h" #include struct VisuPixmapContext_struct { GdkGLConfig *glConfig; GdkGLContext *glContext; GdkGLPixmap *glPixmap; GdkPixmap *pixmap; guint width, height; }; GdkGLConfig* visu_gl_getGLConfig(GdkScreen *screen) { GdkGLConfig *glconfig; int list[] = { GDK_GL_RGBA, GDK_GL_RED_SIZE, 1, GDK_GL_GREEN_SIZE, 1, GDK_GL_BLUE_SIZE, 1, GDK_GL_DEPTH_SIZE, 1, GDK_GL_DOUBLEBUFFER, GDK_GL_STEREO, GDK_GL_ATTRIB_LIST_NONE }; /* Create the GdkGLConfig for this screen. */ glconfig = gdk_gl_config_new_for_screen(screen, list); if ( !glconfig ) { list[10] = (int)GDK_GL_ATTRIB_LIST_NONE; glconfig = gdk_gl_config_new_for_screen(screen, list); if ( !glconfig ) g_error("Cannot find a matching visual."); } return glconfig; } GLuint visu_gl_initFontList(guint size) { PangoFont *font; GLuint BASE; gchar *str; /* GtkWidget *wd; */ DBG_fprintf(stderr, "Visu GtkGlExt: initialise fonts.\n"); /* wd = gtk_label_new("toto"); */ BASE = 123; str = g_strdup_printf("sans %d", size); font = gdk_gl_font_use_pango_font(pango_font_description_from_string(str), 0, 128, BASE); g_free(str); /* font = gdk_gl_font_use_pango_font(gtk_widget_get_style(wd)->font_desc, */ /* 0, 128, BASE); */ if (!font) g_error("Font not available for OpenGLification.\n"); /* g_object_unref(G_OBJECT(wd)); */ return BASE; } VisuPixmapContext* visu_pixmap_context_new(guint width, guint height) { GdkScreen *screen; gboolean res; VisuPixmapContext *image; DBG_fprintf(stderr, "Visu GtkGlExt: creating a off-screen buffer (%dx%d).\n", width, height); image = g_malloc(sizeof(VisuPixmapContext)); image->glConfig = (GdkGLConfig*)0; image->glContext = (GdkGLContext*)0; image->pixmap = (GdkPixmap*)0; image->glPixmap = (GdkGLPixmap*)0; screen = gdk_screen_get_default(); image->glConfig = visu_gl_getGLConfig(screen); image->width = width; image->height = height; image->pixmap = gdk_pixmap_new((GdkDrawable*)0, (gint)width, (gint)height, gdk_gl_config_get_depth(image->glConfig)); if (!image->pixmap) { g_warning("Cannot allocate a GdkPixmap for the indirect rendering."); visu_pixmap_context_free(image); return (VisuPixmapContext*)0; } image->glPixmap = gdk_gl_pixmap_new(image->glConfig, image->pixmap, NULL); if (!image->glPixmap) { g_warning("Cannot allocate a GdkGLPixmap for the indirect rendering."); visu_pixmap_context_free(image); return (VisuPixmapContext*)0; } image->glContext = gdk_gl_context_new(GDK_GL_DRAWABLE(image->glPixmap), (GdkGLContext*)0, FALSE, GDK_GL_RGBA_TYPE); if (!image->glContext) { g_warning("Cannot create indirect context."); visu_pixmap_context_free(image); return (VisuPixmapContext*)0; } res = gdk_gl_drawable_make_current((GdkGLDrawable*)image->glPixmap, image->glContext); if (!res) { g_warning("Cannot make current the pixmap context."); visu_pixmap_context_free(image); return (VisuPixmapContext*)0; } return image; } void visu_pixmap_context_free(VisuPixmapContext *dumpData) { if (!dumpData) return; if (dumpData->pixmap) g_object_unref(dumpData->pixmap); if (dumpData->glConfig) g_object_unref(dumpData->glConfig); if (dumpData->glPixmap) gdk_gl_pixmap_destroy(dumpData->glPixmap); if (dumpData->glContext) gdk_gl_context_destroy(dumpData->glContext); g_free(dumpData); } v_sim-3.7.0/src/OSOpenGL/visu_openGL.c0000644000353400050620000000654312215546075014353 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2006) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2006) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifdef HAVE_CONFIG_H #include #endif #include #include "visu_openGL.h" #include /** * SECTION:visu_openGL * @short_description: Define the OS dependent routines related to * OpenGL. * * TODO */ /** * visu_pixmap_getData: * @width: an integer ; * @height: an integer ; * @hasAlpha: if TRUE, read also the alpha channel. * * Dump the pixels of the current GL area, assuming that its size * is given by @widthx@height. This method should not be used directly, see * visu_ui_gl_widget_getPixmapData() to dump a given OpenGL area. * * Returns: (transfer full) (element-type gint8): newly allocated dump * data (use g_array_unref() after use). */ GArray* visu_pixmap_getData(guint width, guint height, gboolean hasAlpha) { GArray *image; guchar *row_tab; int row_length, m, n1, n2; DBG_fprintf(stderr, "Visu OpenGL: read the pixel values (%dx%d).\n", width, height); if (hasAlpha) row_length = 4 * width; else row_length = 3 * width; row_tab = g_malloc(sizeof(guchar) * row_length); image = g_array_sized_new(FALSE, FALSE, sizeof(guchar), row_length * height); glPixelStorei(GL_PACK_ALIGNMENT,1); /* just in case */ /* Copy the image into our buffer */ n2 = 0; for(m = height - 1; m >= 0; m--) { if (hasAlpha) glReadPixels(0, m, width, 1, GL_RGBA, GL_UNSIGNED_BYTE, row_tab); else glReadPixels(0, m, width, 1, GL_RGB, GL_UNSIGNED_BYTE, row_tab); n1 = n2; n2 = n1 + row_length; image = g_array_insert_vals(image, n1, row_tab, n2 - n1); } g_free(row_tab); DBG_fprintf(stderr, " | save to array %p.\n", (gpointer)image); return image; } v_sim-3.7.0/src/OSOpenGL/visu_openGL.h0000644000353400050620000000767512215546074014366 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2006) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2006) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef VISU_GL_H #define VISU_GL_H #ifdef HAVE_CONFIG_H #include #endif #include #include #ifdef HAVE_GTKGLEXT /** * GDKGLEXT_MULTIHEAD_SUPPORT: (skip) * * GtkGlExt support. */ #define GDKGLEXT_MULTIHEAD_SUPPORT #include /** * IMPL_GTKGLEXT: (skip) * * GtkGlExt support. */ #define IMPL_GTKGLEXT #else #if SYSTEM_X11 == 1 #include #include /** * IMPL_BUILTIN_X11: (skip) * * X11 support. */ #define IMPL_BUILTIN_X11 #endif #if SYSTEM_WIN32 == 1 #include /** * IMPL_BUILTIN_WIN32: (skip) * * Win32 support. */ #define IMPL_BUILTIN_WIN32 #endif #endif /** * VisuPixmapContext: * * Short way to address #_VisuPixmapContext objects. */ typedef struct _VisuPixmapContext VisuPixmapContext; GArray* visu_pixmap_getData(guint width, guint height, gboolean hasAlpha); VisuPixmapContext* visu_pixmap_context_new(guint width, guint height); void visu_pixmap_context_free(VisuPixmapContext *dumpData); /** * visu_gl_initFontList: * @size: the size of the text. * * This method create a list with a default font. * * Returns: (type guint32) (transfer none): the GL id of the list storing the font. */ GLuint visu_gl_initFontList(guint size); #ifdef IMPL_GTKGLEXT /** * visu_gl_getGLConfig: * @screen: a #GdkScreen. * * Call gdk_gl_config_new_for_screen(), trying to acquire a RGBA visual with stereo * capabilities. This method is used internaly and should not be used elsewhere. * * Returns: a matching #GdkGLConfig. */ GdkGLConfig* visu_gl_getGLConfig(GdkScreen *screen); #endif #ifdef IMPL_BUILTIN_X11 /** * visu_gl_getVisualInfo: * @dpy: an X display ; * @screenId: an X screen id. * * Call glXChooseVisual(), trying to acquire a RGBA visual with stereo * capabilities. This method is used internaly and should not be used elsewhere. * * Returns: an allocated XVisualInfo. */ XVisualInfo* visu_gl_getVisualInfo(Display *dpy, int screenId); #endif #ifdef IMPL_BUILTIN_WIN32 /** * visu_gl_setupPixelFormat: * @hDC: an HDC. * * Call ChoosePixelFormat() and SetPixelFormat(), trying to acquire a RGBA visual. * This method is used internaly and should not be used elsewhere. */ void visu_gl_setupPixelFormat(HDC hDC); #endif #endif v_sim-3.7.0/src/pairsModeling/0000755000353400050620000000000012216331345013225 500000000000000v_sim-3.7.0/src/pairsModeling/externalPairsExtensions.h0000644000353400050620000000437612215546075020240 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef EXTERNALPAIRSEXTENSIONS_H #define EXTERNALPAIRSEXTENSIONS_H #include "../visu_pairs.h" #include "wire.h" #include "cylinder.h" /** * VisuPairExtensionInitFunc: * * Prototype of the functions used to initialise a new pair models. * * Returns: a newly allocated pair model. */ typedef VisuPairExtension* (*VisuPairExtensionInitFunc) (void); /** * listInitPairsFunc: * * blabla */ static VisuPairExtensionInitFunc listInitPairsFunc[] = { visu_gl_pairs_wire_init, visu_gl_pairs_cylinder_init, (VisuPairExtensionInitFunc)0}; #endif v_sim-3.7.0/src/pairsModeling/wire.c0000644000353400050620000005624412216050555014273 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "wire.h" #include #include #include #include #include #include #include #include #include #include /** * SECTION:wire * @short_description:Gives methods to draw lines as OpenGl objects * pairing two elements. * * The wire pair module is the simplest way to draw pairs * between elements : using lines. The size of lines can be chosen but * is limited by OpenGL implementation that usually only allow line * width of 10 pixels as maximum size. */ static VisuPairExtension* pointerToPairExtension_wire; /* This function details how to read what is needed by PairsData. */ static gboolean readWireGeneralWidth(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static gboolean readWireWidth(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static gboolean readLinkWidth(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static gboolean readLinkStipple(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static gboolean readLinkShade(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); /* This function details how to read the parameter FLAG_PARAMETER_PAIRS. */ static gboolean readWireNonLinear(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static gboolean readWireToolShade(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); /* This function save the resources. */ static void exportResourcesWire(GString *data, VisuData *dataObj, VisuGlView *view); #define FLAG_PARAMETER_WIRE "wire_nonLinear" #define DESC_PARAMETER_WIRE "If the color of the pairs are corrected by their length ; boolean 0 or 1" #define PARAMETER_WIRE_DEFAULT 0 #define FLAG_PARAMETER_SHADE "wire_shade" #define DESC_PARAMETER_SHADE "If positive, use a shade to colourise pairs depending on length ; -1 or a positive shade id" #define FLAG_RESOURCES_SHADE "pairWire_linkShade" #define DESC_RESOURCES_SHADE "For each given pair, if positive, use a shade to colourise pairs depending on length ; \"ele1\" \"ele2\" -1 or a positive shade id" #define FLAG_RESOURCES_PAIR_WIDTH "pairWire_pairWidth" #define DESC_RESOURCES_PAIR_WIDTH "Widths detail for each pair drawn ; \"ele1\" \"ele2\" 0 < integer < 10" #define FLAG_RESOURCES_LINK_WIDTH "pairWire_linkWidth" #define DESC_RESOURCES_LINK_WIDTH "Widths detail for each drawn link ; \"ele1\" \"ele2\" 0 < integer < 10" #define FLAG_RESOURCES_WIRE_WIDTH "pairWire_width" #define DESC_RESOURCES_WIRE_WIDTH "This value is the width for all pairs drawn ; \"ele1\" \"ele2\" 0 < integer < 10" #define RESOURCES_WIRE_WIDTH_DEFAULT 2 #define RESOURCES_WIRE_WIDTH_MAX 10 static guint wireWidth; #define FLAG_RESOURCES_LINK_STIPPLE "pairWire_linkStipple" #define DESC_RESOURCES_LINK_STIPPLE "Dot scheme detail for each drawn link ; \"ele1\" \"ele2\" 0 < integer < 2^16" /** * visu_gl_pairs_wire_getStatic: * * Internal function to access the #VisuPairExtension wire. * * Since: 3.6 * * Returns: (transfer none): the #VisuPairExtension wire. */ VisuPairExtension* visu_gl_pairs_wire_getStatic() { return pointerToPairExtension_wire; } static void beginPairLink(VisuElement *ele1 _U_, VisuElement *ele2 _U_, VisuPairLink *data, VisuGlView *view _U_) { ToolColor *color; int *width; guint16 *stipple; width = (int*)g_object_get_data(G_OBJECT(data), "width"); if (width) glLineWidth(*width); else glLineWidth(wireWidth); color = visu_pair_link_getColor(data); glColor3fv(color->rgba); stipple = (guint16*)g_object_get_data(G_OBJECT(data), "stipple"); if (stipple) { glEnable(GL_LINE_STIPPLE); glLineStipple(1, *stipple); } glDisable(GL_LIGHTING); glDisable(GL_DITHER); } static void endPairLink(VisuElement *ele1 _U_, VisuElement *ele2 _U_, VisuPairLink *data _U_, VisuGlView *view _U_) { glDisable(GL_LINE_STIPPLE); glEnable(GL_DITHER); /* WARNING: it is the default! */ glEnable(GL_LIGHTING); } static void drawPairLink(VisuElement *ele1 _U_, VisuElement *ele2 _U_, VisuPairLink *data, VisuGlView *view _U_, double x1, double y1, double z1, double x2, double y2, double z2, float d2, float alpha) { float ratio; ToolColor *color; float rgba[4], mM[2]; ToolShade *shade; shade = (ToolShade*)g_object_get_data(G_OBJECT(data), "shade"); if (shade) { mM[0] = visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MIN); mM[1] = visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MAX); ratio = (sqrt(d2) - mM[0]) / (mM[1] - mM[0]); tool_shade_valueToRGB(shade, rgba, ratio); rgba[3] = alpha; glColor4fv(rgba); } else { color = visu_pair_link_getColor(data); glColor4f(color->rgba[0], color->rgba[1], color->rgba[2], alpha); } glBegin(GL_LINES); glVertex3d(x1, y1, z1); glVertex3d(x2, y2, z2); glEnd(); } /** * visu_gl_pairs_wire_init: * * This method is used by V_Sim on startup, don't use it on your own. * * Returns: the wire pair extension. */ VisuPairExtension* visu_gl_pairs_wire_init() { char *name = _("Wire pairs"); char *desc = _("Pairs are rendered by flat lines." " The color and the width can by chosen."); VisuPairExtension *extension; VisuConfigFileEntry *resourceEntry, *oldEntry, *olderEntry; VisuPairDrawFuncs meth; meth.start = beginPairLink; meth.stop = endPairLink; meth.main = drawPairLink; extension = visu_pair_extension_new("Wire pairs", name, desc, FALSE, &meth); wireWidth = RESOURCES_WIRE_WIDTH_DEFAULT; resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCES_WIRE_WIDTH, DESC_RESOURCES_WIRE_WIDTH, 1, readWireGeneralWidth); oldEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCES_PAIR_WIDTH, DESC_RESOURCES_PAIR_WIDTH, 1, readWireWidth); visu_config_file_entry_setVersion(resourceEntry, 3.1f); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCES_LINK_WIDTH, DESC_RESOURCES_LINK_WIDTH, 1, readLinkWidth); visu_config_file_entry_setVersion(resourceEntry, 3.4f); visu_config_file_entry_setReplace(resourceEntry, oldEntry); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCES_LINK_STIPPLE, DESC_RESOURCES_LINK_STIPPLE, 1, readLinkStipple); visu_config_file_entry_setVersion(resourceEntry, 3.4f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_RESOURCE, exportResourcesWire); olderEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_WIRE, DESC_PARAMETER_WIRE, 1, readWireNonLinear); oldEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_SHADE, DESC_PARAMETER_SHADE, 1, readWireToolShade); visu_config_file_entry_setVersion(oldEntry, 3.6f); visu_config_file_entry_setReplace(oldEntry, olderEntry); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCES_SHADE, DESC_RESOURCES_SHADE, 1, readLinkShade); visu_config_file_entry_setVersion(resourceEntry, 3.7f); visu_config_file_entry_setReplace(resourceEntry, oldEntry); pointerToPairExtension_wire = extension; return extension; } /** * visu_gl_pairs_wire_setStipple: * @data: a #VisuPairLink object ; * @stipple: a pattern. * * Change the line pattern of @data. * * Returns: TRUE if the value is different from previous. */ gboolean visu_gl_pairs_wire_setStipple(VisuPairLink *data, guint16 stipple) { guint16 *stipple_; g_return_val_if_fail(data && stipple, FALSE); DBG_fprintf(stderr, "Pairs Wire: set the wire pattern to %d.\n", stipple); stipple_ = (guint16*)g_object_get_data(G_OBJECT(data), "stipple"); if (!stipple_) { stipple_ = g_malloc(sizeof(guint16)); g_object_set_data_full(G_OBJECT(data), "stipple", (gpointer)stipple_, g_free); *stipple_ = stipple + 1; } if (*stipple_ != stipple) { *stipple_ = stipple; if (visu_pair_link_isDrawn(data)) g_signal_emit_by_name(G_OBJECT(data), "ParameterChanged", NULL); return TRUE; } return FALSE; } /** * visu_gl_pairs_wire_getStipple: * @data: a #VisuPairLink object. * * Get the line pattern of @data. * * Returns: a line pattern (default is 65535). */ guint16 visu_gl_pairs_wire_getStipple(VisuPairLink *data) { guint16 *stipple_; g_return_val_if_fail(data, (guint16)1); stipple_ = g_object_get_data(G_OBJECT(data), "stipple"); if (stipple_) return *stipple_; else return (guint16)65535; } /** * visu_gl_pairs_wire_setGeneralWidth: * @val: a positive integer. * * The width of line between elements can be chosen by kinds of pairs, * but can use a default value for all kinds of pairs when no individual value * is available. Use this method to set the default width. * * Returns: TRUE if the value is different from previous. */ gboolean visu_gl_pairs_wire_setGeneralWidth(guint val) { DBG_fprintf(stderr, "Pairs Wire: set the wire thickness to %d.\n", val); if (val == 0 || val > RESOURCES_WIRE_WIDTH_MAX || val == wireWidth) return FALSE; wireWidth = val; return TRUE; } /** * visu_gl_pairs_wire_getGeneralWidth: * * Get the default width for wire pairs (see visu_gl_pairs_wire_setGeneralWidth() to set this value). * * Returns: the default width. */ guint visu_gl_pairs_wire_getGeneralWidth() { return wireWidth; } /** * visu_gl_pairs_wire_setWidth: * @data: a #VisuPairLink object ; * @val: a positive integer. * * This method allows to change the width of line for a specific pair. * When a pair is rendered via with a line, it first checks if that pairs has * a specific width value set by this method. If not, it uses the default value. * * Returns: TRUE if the value is different from previous. */ gboolean visu_gl_pairs_wire_setWidth(VisuPairLink *data, guint val) { guint *width; if (!data) return FALSE; width = (guint*)g_object_get_data(G_OBJECT(data), "width"); if (!width) { width = g_malloc(sizeof(guint)); g_object_set_data_full(G_OBJECT(data), "width", (gpointer)width, g_free); *width = val + 1; } val = (val > RESOURCES_WIRE_WIDTH_MAX)?RESOURCES_WIRE_WIDTH_MAX:val; if (*width != val) { *width = val; if (visu_pair_link_isDrawn(data)) g_signal_emit_by_name(G_OBJECT(data), "ParameterChanged", NULL); return TRUE; } return FALSE; } /** * visu_gl_pairs_wire_getWidth: * @data: a #VisuPairLink object. * * Get the width of the given pair @data. If the given pair has no * specific width, the defaul value is returned. * * Returns: the width of the given pair. */ guint visu_gl_pairs_wire_getWidth(VisuPairLink *data) { guint *width; if (!data) return 0; width = (guint*)g_object_get_data(G_OBJECT(data), "width"); if (width) return *width; else return wireWidth; } /** * visu_gl_pairs_wire_setShade: * @data: a #VisuPairLink object. * @shade: (allow-none): a #ToolShade object (can be NULL). * * If @shade is not NULL, make the colour of each pair varies with its * length according to @shade colour scheme. * * Since: 3.6 * * Returns: TRUE if shade is changed. */ gboolean visu_gl_pairs_wire_setShade(VisuPairLink *data, ToolShade *shade) { ToolShade *val; if (!data) return FALSE; DBG_fprintf(stderr, "Pairs Wire: set the shade %p for the wire color.\n", (gpointer)shade); val = (ToolShade*)g_object_get_data(G_OBJECT(data), "shade"); if (val != shade) { g_object_set_data(G_OBJECT(data), "shade", (gpointer)shade); if (visu_pair_link_isDrawn(data)) g_signal_emit_by_name(G_OBJECT(data), "ParameterChanged", NULL); return TRUE; } return FALSE; } /** * visu_gl_pairs_wire_getShade: * @data: a #VisuPairLink object. * * Colour of wires can depend on length, following a #ToolShade scheme. * * Since: 3.6 * * Returns: (transfer none): the #ToolShade scheme if used, or NULL. */ ToolShade* visu_gl_pairs_wire_getShade(VisuPairLink *data) { if (!data) return (ToolShade*)0; return (ToolShade*)g_object_get_data(G_OBJECT(data), "shade"); } /*****************************************/ /* Dealing with parameters and resources */ /*****************************************/ static gboolean readLinkInteger(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, GError **error, VisuPairLink **data, int *value) { gchar **tokens; int id; g_return_val_if_fail(nbLines == 1, FALSE); tokens = g_strsplit_set(lines[0], " \n", TOOL_MAX_LINE_LENGTH); id = 0; if (!visu_pair_readLinkFromTokens(tokens, &id, data, position, error)) { g_strfreev(tokens); return FALSE; } /* Read the associated integer. */ if (!tool_config_file_readIntegerFromTokens(tokens, &id, value, 1, position, error)) { g_strfreev(tokens); return FALSE; } g_strfreev(tokens); return TRUE; } static gboolean readLinkShade(VisuConfigFileEntry *entry, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { int value; VisuPairLink *data; GList *list; if (!readLinkInteger(entry, lines, nbLines, position, error, &data, &value)) return FALSE; list = tool_shade_getList(); if (value >= (int)g_list_length(list)) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d: shade id must be in %d-%d.\n"), position, 0, g_list_length(list) - 1); return FALSE; } else visu_gl_pairs_wire_setShade(data, (ToolShade*)g_list_nth_data(list, value)); return TRUE; } static gboolean readLinkStipple(VisuConfigFileEntry *entry, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { int value; VisuPairLink *data; if (!readLinkInteger(entry, lines, nbLines, position, error, &data, &value)) return FALSE; if ((guint16)value == 0) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d: stipple must be in 1-65535.\n"), position); return FALSE; } else visu_gl_pairs_wire_setStipple(data, (guint16)value); return TRUE; } static gboolean readLinkWidth(VisuConfigFileEntry *entry, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { int width; VisuPairLink *data; if (!readLinkInteger(entry, lines, nbLines, position, error, &data, &width)) return FALSE; /* Check. */ if (width <= 0 || width > RESOURCES_WIRE_WIDTH_MAX) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d: width must be in %d-%d.\n"), position, 0, RESOURCES_WIRE_WIDTH_MAX); return FALSE; } visu_gl_pairs_wire_setWidth(data, width); return TRUE; } /* This function details how to read what is needed by PairsData. */ static gboolean readWireGeneralWidth(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { int width; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readInteger(lines[0], position, &width, 1, error)) return FALSE; if (width <= 0 || width > RESOURCES_WIRE_WIDTH_MAX) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d: width must be in %d-%d.\n"), position, 0, RESOURCES_WIRE_WIDTH_MAX); return FALSE; } visu_gl_pairs_wire_setGeneralWidth(width); return TRUE; } void exportPairsWidth(VisuElement *ele1, VisuElement *ele2, VisuPairLink *data, gpointer userData) { struct _VisuConfigFileForeachFuncExport *str; int *width; guint16 *stipple; ToolShade *shade; gboolean output; GList *list; gchar *buf; buf = g_strdup_printf("%s %s %4.3f %4.3f", ele1->name, ele2->name, visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MIN), visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MAX)); width = (int*)g_object_get_data(G_OBJECT(data), "width"); if (width) { str = ( struct _VisuConfigFileForeachFuncExport*)userData; output = TRUE; /* We export the resource only if the elements are part of the given VisuData. */ if (str->dataObj) output = visu_node_array_getElementId(VISU_NODE_ARRAY(str->dataObj), ele1) >= 0&& visu_node_array_getElementId(VISU_NODE_ARRAY(str->dataObj), ele2) >= 0; if (output) visu_config_file_exportEntry(str->data, FLAG_RESOURCES_LINK_WIDTH, buf, "%d", *width); } stipple = (guint16*)g_object_get_data(G_OBJECT(data), "stipple"); if (stipple) { str = ( struct _VisuConfigFileForeachFuncExport*)userData; output = TRUE; /* We export the resource only if the elements are part of the given VisuData. */ if (str->dataObj) output = visu_node_array_getElementId(VISU_NODE_ARRAY(str->dataObj), ele1) >= 0&& visu_node_array_getElementId(VISU_NODE_ARRAY(str->dataObj), ele2) >= 0; if (output) visu_config_file_exportEntry(str->data, FLAG_RESOURCES_LINK_STIPPLE, buf, "%d", *stipple); } shade = (ToolShade*)g_object_get_data(G_OBJECT(data), "shade"); if (shade) { list = tool_shade_getList(); str = ( struct _VisuConfigFileForeachFuncExport*)userData; output = TRUE; /* We export the resource only if the elements are part of the given VisuData. */ if (str->dataObj) output = visu_node_array_getElementId(VISU_NODE_ARRAY(str->dataObj), ele1) >= 0&& visu_node_array_getElementId(VISU_NODE_ARRAY(str->dataObj), ele2) >= 0; if (output) visu_config_file_exportEntry(str->data, FLAG_RESOURCES_LINK_STIPPLE, buf, "%d", g_list_index(list, shade)); } g_free(buf); } static void exportResourcesWire(GString *data, VisuData *dataObj, VisuGlView *view _U_) { struct _VisuConfigFileForeachFuncExport str; visu_config_file_exportComment(data, DESC_RESOURCES_WIRE_WIDTH); visu_config_file_exportEntry(data, FLAG_RESOURCES_WIRE_WIDTH, NULL, "%d", wireWidth); str.data = data; str.dataObj = dataObj; visu_config_file_exportComment(data, DESC_RESOURCES_LINK_WIDTH); visu_config_file_exportComment(data, DESC_RESOURCES_LINK_STIPPLE); visu_config_file_exportComment(data, DESC_RESOURCES_SHADE); visu_pair_foreach(exportPairsWidth, &str); visu_config_file_exportComment(data, ""); } /* OBSOLETE function, kept for backward compatibility. */ static gboolean readWireWidth(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position _U_, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { int token; VisuElement* ele[2]; float radius; int val; VisuPairLink *data; gchar **tokens; g_return_val_if_fail(nbLines == 1, FALSE); /* Tokenize the line of values. */ tokens = g_strsplit_set(g_strchug(lines[0]), " \n", TOOL_MAX_LINE_LENGTH); token = 0; /* Get the two elements. */ if (!tool_config_file_readElementFromTokens(tokens, &token, ele, 2, nbLines, error)) { g_strfreev(tokens); return FALSE; } data = visu_pair_link_getFromId(ele[0], ele[1], 0); g_return_val_if_fail(data, FALSE); /* Read 1 int. */ if (!tool_config_file_readFloatFromTokens(tokens, &token, &radius, 1, nbLines, error)) { g_strfreev(tokens); return FALSE; } val = CLAMP((int)radius, 0, RESOURCES_WIRE_WIDTH_MAX); visu_gl_pairs_wire_setWidth(data, val); g_strfreev(tokens); return TRUE; } static gboolean readWireNonLinear(VisuConfigFileEntry *entry _U_, gchar **lines _U_, int nbLines _U_, int position _U_, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error _U_) { g_warning("No support anymore of this parameter.\n" " Use pairWire_linkShade instead."); return TRUE; } static gboolean readWireToolShade(VisuConfigFileEntry *entry _U_, gchar **lines _U_, int nbLines _U_, int position _U_, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error _U_) { g_warning("No support anymore of this parameter.\n" " Use pairWire_linkShade instead."); return TRUE; } v_sim-3.7.0/src/pairsModeling/wire.h0000644000353400050620000000467012215546075014302 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef WIRE_H #define WIRE_H #include #include #include VisuPairExtension* visu_gl_pairs_wire_init(); VisuPairExtension* visu_gl_pairs_wire_getStatic(); gboolean visu_gl_pairs_wire_setGeneralWidth(guint val); guint visu_gl_pairs_wire_getGeneralWidth(); gboolean visu_gl_pairs_wire_setWidth(VisuPairLink *data, guint val); guint visu_gl_pairs_wire_getWidth(VisuPairLink *data); gboolean visu_gl_pairs_wire_setShade(VisuPairLink *data, ToolShade *shade); ToolShade* visu_gl_pairs_wire_getShade(VisuPairLink *data); gboolean visu_gl_pairs_wire_setStipple(VisuPairLink *data, guint16 stipple); guint16 visu_gl_pairs_wire_getStipple(VisuPairLink *data); #endif v_sim-3.7.0/src/pairsModeling/cylinder.c0000644000353400050620000004731512215546075015143 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "cylinder.h" #include #include #include #include #include #include #include #include #include #include /** * SECTION:cylinder * @short_description: Gives methods to draw cylinders as OpenGl * objects pairing two elements. * * The cylinders have two characteristics: their radius and * their colour. Their radius are in the units of the rendered * box. They can be specific to each kind of pairs (e.g. Si-Si) or * they have a default value. Only the default value is stored in the * resource file with the flag "pairCylinder_radius". Their color is * herited by the colour of the pair. The lighting values * (i.e. emi., shi., spe. ...) are not movable and are fixed to amb = * 0.5, dif = 0.5, shi = 0, spe = 0, emi = 0. */ static int listCylinder; static VisuPairExtension* pointerToPairExtension_cylinder; #define FLAG_RESOURCES_PAIR_RADIUS "pairCylinder_pairRadius" #define DESC_RESOURCES_PAIR_RADIUS "This value is the radius for specific pairs drawn as cylinders ; element1 elemen2 0 < real < 10" #define FLAG_RESOURCES_LINK_RADIUS "pairCylinder_linkRadius" #define DESC_RESOURCES_LINK_RADIUS "This value is the radius for specific drawn link as cylinders ; [element1] [element2] [min] [max] [0 < real < 10]" #define FLAG_RESOURCES_CYLINDER_RADIUS "pairCylinder_radius" #define DESC_RESOURCES_CYLINDER_RADIUS "This value is the default radius of the pairs drawn as cylinders ; 0 < real < 10" #define RESOURCES_CYLINDER_RADIUS_DEFAULT 0.1 static float cylinderRadius; #define FLAG_RESOURCES_CYLINDER_COLOR_TYPE "cylinder_colorType" #define DESC_RESOURCES_CYLINDER_COLOR_TYPE "It chooses the colors of the cylinders according differents criterion ;" #define RESOURCES_CYLINDER_COLOR_TYPE_DEFAULT VISU_GL_PAIRS_CYLINDER_COLOR_USER static int cylinderColorType; static gboolean readCylinderDefaultRadius(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static gboolean readCylinderRadius(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static gboolean readLinkRadius(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static gboolean readCylinderColorType(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static void exportResourcesCylinder(GString *data, VisuData *dataObj, VisuGlView *view); /** * visu_gl_pairs_cylinder_getStatic: * * Internal use only to get the cylinder extension. */ VisuPairExtension* visu_gl_pairs_cylinder_getStatic() { return pointerToPairExtension_cylinder; } /** * visu_gl_pairs_cylinder_setGeneralRadius: * @val: a float value. * * This method allows to change the default value of radius for cylinder pairs. * When a pair is rendered via a cylinder, it first checks if that pairs has * a specific radius value. If not, it uses the default value set by this method. * If the default value is indeed changed, all #VisuGlExtPairs objects * should redraw themselves. * * Returns: TRUE if the calling method should take care of * #VisuGlExtPairs objects, FALSE if not. */ gboolean visu_gl_pairs_cylinder_setGeneralRadius(float val) { DBG_fprintf(stderr, "Pairs Cylinder : set the general cylinder radius to %f.\n", val); val = CLAMP(val, VISU_GL_PAIRS_CYLINDER_RADIUS_MIN, VISU_GL_PAIRS_CYLINDER_RADIUS_MAX); if (val == cylinderRadius) return FALSE; cylinderRadius = val; return TRUE; } /** * visu_gl_pairs_cylinder_getGeneralRadius: * * Get the default value for cylinder radius. * * Returns: the default value for cylinder radius. */ float visu_gl_pairs_cylinder_getGeneralRadius() { return cylinderRadius; } /** * visu_gl_pairs_cylinder_setRadius: * @data: a #VisuPairLink object ; * @val: a float value. * * This method allows to change the radius value of a specific pair. * When a pair is rendered via a cylinder, it first checks if that pairs has * a specific radius value set by this method. If not, it uses the default value. * * Returns: TRUE if the value is changed. */ gboolean visu_gl_pairs_cylinder_setRadius(VisuPairLink *data, float val) { float *radius; if (!data) return FALSE; DBG_fprintf(stderr, "Pairs Cylinder : set the cylinder radius to %f.\n", val); val = CLAMP(val, VISU_GL_PAIRS_CYLINDER_RADIUS_MIN, VISU_GL_PAIRS_CYLINDER_RADIUS_MAX); radius = (float*)g_object_get_data(G_OBJECT(data), "radius"); if (!radius) { radius = g_malloc(sizeof(float)); g_object_set_data_full(G_OBJECT(data), "radius", (gpointer)radius, g_free); *radius = G_MAXFLOAT; } if (*radius != val) { *radius = val; if (visu_pair_link_isDrawn(data)) g_signal_emit_by_name(G_OBJECT(data), "ParameterChanged", NULL); return TRUE; } return FALSE; } /** * visu_gl_pairs_cylinder_getRadius: * @data: a #VisuPairLink object. * * Get the radius value for the specified pair. * * Returns: the radius value. */ float visu_gl_pairs_cylinder_getRadius(VisuPairLink *data) { float *radius; if (!data) return -1.; radius = (float*)g_object_get_data(G_OBJECT(data), "radius"); if (radius) return *radius; else return cylinderRadius; } /** * visu_gl_pairs_cylinder_setColorType: * @val: a integer that identify the color scheme. * * It set the color scheme for cylinder pairs. It can be 0 or 1. * * Returns: TRUE if the calling method should take care of * #VisuGlExtPairs objects, FALSE if not. */ gboolean visu_gl_pairs_cylinder_setColorType(VisuGlPairsCylinderColorId val) { DBG_fprintf(stderr, "Pairs Cylinder : set the cylinder color type to %d.\n", val); g_return_val_if_fail(val < VISU_GL_PAIRS_CYLINDER_N_COLOR, FALSE); cylinderColorType = val; return TRUE; } /** * visu_gl_pairs_cylinder_getColorType: * * Get the color scheme. * * Returns: an integer corresponding to the color scheme (0 or 1). */ VisuGlPairsCylinderColorId visu_gl_pairs_cylinder_getColorType() { return cylinderColorType; } void setColorAndWidthForCylinder(VisuElement *ele1 _U_, VisuElement *ele2 _U_, VisuPairLink *data, VisuGlView *view) { float rgba[4], mm[5] = {0.5, 0.5, 0., 0. , 0.}; ToolColor *color; float radius, *tmpRad; guint *nlat; switch (cylinderColorType) { case VISU_GL_PAIRS_CYLINDER_COLOR_USER: color = visu_pair_link_getColor(data); rgba[0] = color->rgba[0]; rgba[1] = color->rgba[1]; rgba[2] = color->rgba[2]; rgba[3] = 1.; visu_gl_setColor(mm, rgba); break; case VISU_GL_PAIRS_CYLINDER_COLOR_ELEMENT: default: break; } tmpRad = (float*)g_object_get_data(G_OBJECT(data), "radius"); if (tmpRad) radius = *tmpRad; else radius = cylinderRadius; nlat = (guint*)g_object_get_data(G_OBJECT(data), "nlat"); if (!nlat) { nlat = g_malloc(sizeof(guint)); g_object_set_data_full(G_OBJECT(data), "nlat", (gpointer)nlat, g_free); } *nlat = visu_gl_view_getDetailLevel(view, radius); } void drawCylinderPairs(VisuElement *ele1, VisuElement *ele2, VisuPairLink *data, VisuGlView *view _U_, double x1, double y1, double z1, double x2, double y2, double z2, float d2, float alphaColour) { float rgba[4], mm[5] = {0.5, 0.5, 0., 0. , 0.}; ToolColor *color; int mat1, mat2; guint *nlat; double vNorm[3]; /* vecteur normal aux vecteurs (0,0,1) et (x2-x1, y2-y1, z2-z1) */ double vDest[3]; /* vecteur (x2-x1, y2-y1, z2-z1) */ double cosAlpha; /* cosinus entre (0,0,1) et Vdest */ double alpha; #define RADTODEG 57.29577951 float radius, *tmpRad; GLUquadricObj *obj; tmpRad = (float*)g_object_get_data(G_OBJECT(data), "radius"); if (tmpRad) radius = *tmpRad; else radius = cylinderRadius; nlat = (guint*)g_object_get_data(G_OBJECT(data), "nlat"); g_return_if_fail(nlat); vDest[0] = x2 - x1; vDest[1] = y2 - y1; vDest[2] = z2 - z1; if (vDest[0] != 0 || vDest[1] != 0) { vNorm[0] = - vDest[1]; vNorm[1] = vDest[0]; vNorm[2] = 0.; cosAlpha = sqrt((vDest[2] * vDest[2]) / d2); if (vDest[2] < 0.) cosAlpha = - cosAlpha; cosAlpha = CLAMP(cosAlpha, -1., 1.); alpha = acos(cosAlpha) * RADTODEG; } else { vNorm[0] = 1.; vNorm[1] = 0.; vNorm[2] = 0.; if (vDest[2] < 0.) alpha = 180.; else alpha = 0.; } obj = gluNewQuadric(); glPushMatrix(); switch (cylinderColorType) { case VISU_GL_PAIRS_CYLINDER_COLOR_USER: /* Color is set by the setColorAndWidthForCylinder() method before for this family of pairs, we change need to change it because of alphaColour. */ color = visu_pair_link_getColor(data); rgba[0] = color->rgba[0]; rgba[1] = color->rgba[1]; rgba[2] = color->rgba[2]; rgba[3] = alphaColour; visu_gl_setColor(mm, rgba); glTranslated(x1, y1, z1); glRotated(alpha, vNorm[0], vNorm[1], vNorm[2]); gluCylinder(obj, (GLdouble)radius, (GLdouble)radius, (GLdouble)sqrt(d2), (GLint)*nlat, (GLint)1); break; case VISU_GL_PAIRS_CYLINDER_COLOR_ELEMENT: mat1 = visu_element_getMaterialId(ele1); mat2 = visu_element_getMaterialId(ele2); if (mat1 <= 0 || mat2 <= 0) g_warning("Can't draw cylinders because either ele1" "or ele2 has no identifier for material.\n"); glTranslated(x1, y1, z1); glRotated(alpha, vNorm[0], vNorm[1], vNorm[2]); glCallList(mat1); gluCylinder(obj, (GLdouble)radius, (GLdouble)radius, (GLdouble)sqrt(d2) * 0.5f, (GLint)*nlat, (GLint)1); glPopMatrix(); glPushMatrix(); glTranslated(0.5f * (x2 + x1), 0.5f * (y2 + y1), 0.5f * (z2 + z1)); glRotated(alpha, vNorm[0], vNorm[1], vNorm[2]); glCallList(mat2); gluCylinder(obj, (GLdouble)radius, (GLdouble)radius, (GLdouble)sqrt(d2) * 0.5f, (GLint)*nlat, (GLint)1); break; default: break; } glPopMatrix(); gluDeleteQuadric(obj); } /** * visu_gl_pairs_cylinder_init: * * This method is used by V_Sim on startup, don't use it on your own. * * Returns: the cylinder pair extension. */ VisuPairExtension* visu_gl_pairs_cylinder_init() { char *name = _("Cylinder pairs"); char *desc = _("Pairs are rendered by cylinders." " The color and the width can by chosen."); VisuPairExtension *extension; VisuConfigFileEntry *resourceEntry, *oldEntry; VisuPairDrawFuncs meth; meth.start = setColorAndWidthForCylinder; meth.stop = NULL; meth.main = drawCylinderPairs; extension = visu_pair_extension_new("Cylinder pairs", name, desc, TRUE, &meth); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCES_CYLINDER_COLOR_TYPE, DESC_RESOURCES_CYLINDER_COLOR_TYPE, 1, readCylinderColorType); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCES_CYLINDER_RADIUS, DESC_RESOURCES_CYLINDER_RADIUS, 1, readCylinderDefaultRadius); oldEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCES_PAIR_RADIUS, DESC_RESOURCES_PAIR_RADIUS, 1, readCylinderRadius); visu_config_file_entry_setVersion(resourceEntry, 3.1f); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCES_LINK_RADIUS, DESC_RESOURCES_LINK_RADIUS, 1, readLinkRadius); visu_config_file_entry_setVersion(resourceEntry, 3.4f); visu_config_file_entry_setReplace(resourceEntry, oldEntry); visu_config_file_addExportFunction(VISU_CONFIG_FILE_RESOURCE, exportResourcesCylinder); listCylinder = visu_gl_objectlist_new(2); cylinderRadius = RESOURCES_CYLINDER_RADIUS_DEFAULT; cylinderColorType = VISU_GL_PAIRS_CYLINDER_COLOR_USER; pointerToPairExtension_cylinder = extension; return extension; } /*****************************************/ /* Dealing with parameters and resources */ /*****************************************/ static gboolean readLinkRadius(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { gchar **tokens; int id; float radius; VisuPairLink *data; g_return_val_if_fail(nbLines == 1, FALSE); tokens = g_strsplit_set(lines[0], " \n", TOOL_MAX_LINE_LENGTH); id = 0; if (!visu_pair_readLinkFromTokens(tokens, &id, &data, position, error)) { g_strfreev(tokens); return FALSE; } /* Read the associated radius. */ if (!tool_config_file_readFloatFromTokens(tokens, &id, &radius, 1, position, error)) { g_strfreev(tokens); return FALSE; } g_strfreev(tokens); /* Check. */ if (radius < VISU_GL_PAIRS_CYLINDER_RADIUS_MIN || radius > VISU_GL_PAIRS_CYLINDER_RADIUS_MAX) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d: radius (%g) must be in %g-%g.\n"), position, radius, VISU_GL_PAIRS_CYLINDER_RADIUS_MIN, VISU_GL_PAIRS_CYLINDER_RADIUS_MAX); return FALSE; } /* Set the value. */ visu_gl_pairs_cylinder_setRadius(data, radius); return TRUE; } static gboolean readCylinderDefaultRadius(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { float radius; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readFloat(lines[0], position, &radius, 1, error)) return FALSE; if (radius < VISU_GL_PAIRS_CYLINDER_RADIUS_MIN || radius > VISU_GL_PAIRS_CYLINDER_RADIUS_MAX) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d: radius must be in %g-%g.\n"), position, VISU_GL_PAIRS_CYLINDER_RADIUS_MIN, VISU_GL_PAIRS_CYLINDER_RADIUS_MAX); return FALSE; } visu_gl_pairs_cylinder_setGeneralRadius(radius); return TRUE; } static gboolean readCylinderColorType(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { int val; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readInteger(lines[0], position, &val, 1, error)) return FALSE; if (val < 0 || val >= VISU_GL_PAIRS_CYLINDER_N_COLOR) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d: 1 integer value must" " appear after the %s markup.\n"), position, FLAG_RESOURCES_CYLINDER_COLOR_TYPE); return FALSE; } visu_gl_pairs_cylinder_setColorType(val); return TRUE; } static void exportPairsRadius(VisuElement *ele1, VisuElement *ele2, VisuPairLink *data, gpointer userData) { struct _VisuConfigFileForeachFuncExport *str; float *radius; gchar *buf; buf = g_strdup_printf("%s %s %4.3f %4.3f", ele1->name, ele2->name, visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MIN), visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MAX)); radius = (float*)g_object_get_data(G_OBJECT(data), "radius"); if (radius) { str = ( struct _VisuConfigFileForeachFuncExport*)userData; /* We export the resource only if the elements are part of the given VisuData. */ if (str->dataObj && (!visu_node_array_getElementId(VISU_NODE_ARRAY(str->dataObj), ele1) >= 0 || !visu_node_array_getElementId(VISU_NODE_ARRAY(str->dataObj), ele2) >= 0)) return; visu_config_file_exportEntry(str->data, FLAG_RESOURCES_LINK_RADIUS, buf, "%4.3f", *radius); } g_free(buf); } static void exportResourcesCylinder(GString *data, VisuData *dataObj, VisuGlView *view _U_) { struct _VisuConfigFileForeachFuncExport str; gchar *buf; buf = g_strdup_printf("%s 0 <= integer < %d", DESC_RESOURCES_CYLINDER_COLOR_TYPE, VISU_GL_PAIRS_CYLINDER_N_COLOR); visu_config_file_exportComment(data, buf); g_free(buf); visu_config_file_exportEntry(data, FLAG_RESOURCES_CYLINDER_COLOR_TYPE, NULL, "%d", cylinderColorType); visu_config_file_exportComment(data, DESC_RESOURCES_CYLINDER_RADIUS); visu_config_file_exportEntry(data, FLAG_RESOURCES_CYLINDER_RADIUS, NULL, "%f", cylinderRadius); str.data = data; str.dataObj = dataObj; visu_config_file_exportComment(data, DESC_RESOURCES_PAIR_RADIUS); visu_pair_foreach(exportPairsRadius, &str); visu_config_file_exportComment(data, ""); } /* OBSOLETE function kept for backward compatibility. */ static gboolean readCylinderRadius(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position _U_, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { int token; float radius; VisuElement* ele[2]; VisuPairLink *data; gchar **tokens; g_return_val_if_fail(nbLines == 1, FALSE); /* Tokenize the line of values. */ tokens = g_strsplit_set(g_strchug(lines[0]), " \n", TOOL_MAX_LINE_LENGTH); token = 0; /* Get the two elements. */ if (!tool_config_file_readElementFromTokens(tokens, &token, ele, 2, nbLines, error)) { g_strfreev(tokens); return FALSE; } data = visu_pair_link_getFromId(ele[0], ele[1], 0); g_return_val_if_fail(data, FALSE); /* Read 1 float. */ if (!tool_config_file_readFloatFromTokens(tokens, &token, &radius, 1, nbLines, error)) { g_strfreev(tokens); return FALSE; } radius = CLAMP(radius, VISU_GL_PAIRS_CYLINDER_RADIUS_MIN, VISU_GL_PAIRS_CYLINDER_RADIUS_MAX); visu_gl_pairs_cylinder_setRadius(data, radius); g_strfreev(tokens); return TRUE; } v_sim-3.7.0/src/pairsModeling/cylinder.h0000644000353400050620000000613712215546075015145 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef CYLINDER_H #define CYLINDER_H #include #include /** * VISU_GL_PAIRS_CYLINDER_RADIUS_MIN: * * Minimum value for the radius of cylinder pairs. */ #define VISU_GL_PAIRS_CYLINDER_RADIUS_MIN 0.01f /** * VISU_GL_PAIRS_CYLINDER_RADIUS_MAX: * * Maximum value for the radius of cylinder pairs. */ #define VISU_GL_PAIRS_CYLINDER_RADIUS_MAX 3.f /** * VisuGlPairsCylinderColorId: * @VISU_GL_PAIRS_CYLINDER_COLOR_USER: color is chosen by the user. * @VISU_GL_PAIRS_CYLINDER_COLOR_ELEMENT: color is chosen according to * the color of the #VisuElement the pair is linked to. * @VISU_GL_PAIRS_CYLINDER_N_COLOR: number of choices for the colourisation. * * Possible flags to colourise the cylinder pairs. */ typedef enum { VISU_GL_PAIRS_CYLINDER_COLOR_USER, VISU_GL_PAIRS_CYLINDER_COLOR_ELEMENT, VISU_GL_PAIRS_CYLINDER_N_COLOR } VisuGlPairsCylinderColorId; VisuPairExtension* visu_gl_pairs_cylinder_getStatic(); VisuPairExtension* visu_gl_pairs_cylinder_init(); gboolean visu_gl_pairs_cylinder_setGeneralRadius(float val); float visu_gl_pairs_cylinder_getGeneralRadius(); gboolean visu_gl_pairs_cylinder_setRadius(VisuPairLink *data, float val); float visu_gl_pairs_cylinder_getRadius(VisuPairLink *data); gboolean visu_gl_pairs_cylinder_setColorType(VisuGlPairsCylinderColorId val); VisuGlPairsCylinderColorId visu_gl_pairs_cylinder_getColorType(); #endif v_sim-3.7.0/src/pairsModeling/externalGtkPairsExtensions.h0000644000353400050620000000474112215546075020702 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef EXTERNALGTKPAIRSEXTENSIONS_H #define EXTERNALGTKPAIRSEXTENSIONS_H #include #include "gtk_wire.h" #include "gtk_cylinder.h" static VisuUiPairsInitFunc listVisuUiPairsInitFunc[] = { visu_ui_pairs_wire_init, visu_ui_pairs_cylinder_init, (VisuUiPairsInitFunc)0}; static VisuUiPairsBuildWidgetsFunc listGtkPairsBuildFunc[] = { visu_ui_pairs_wire_initBuild, visu_ui_pairs_cylinder_initBuild, (VisuUiPairsBuildWidgetsFunc)0}; static VisuUiPairsToLabelFunc listGtkPairsLabelFunc[] = { visu_ui_pairs_wire_getValues, visu_ui_pairs_cylinder_getValues, (VisuUiPairsToLabelFunc)0}; static VisuUiPairsSetValuesFunc listGtkPairsSignalFunc[] = { visu_ui_pairs_wire_setValues, visu_ui_pairs_cylinder_setValues, (VisuUiPairsSetValuesFunc)0}; #endif v_sim-3.7.0/src/pairsModeling/gtk_cylinder.c0000644000353400050620000002150312215546075015777 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "gtk_cylinder.h" #include #include #include #include #include #include "cylinder.h" /** * SECTION: gtk_cylinder * @short_description: The additional widgets displayed in the pair * dialog to handle cylinder pairs. * * Some additional widgets to be displayed in the pairs dialog * window. It contains a tool to choose the colourisation scheme of * pairs and the radius of cylinder representation. */ int colorForCurve; int colorDescr; GtkWidget *spinCylinderRadius; gulong signalSpinCylinderRadiusId; GtkWidget *radioCylinderUser, *radioCylinderElement; #define RESOURCES_CYLINDER_RADIUS_STEP 0.02 /* Callbacks */ void changeCylinderRadius(GtkSpinButton *spin, gpointer data); void changeCylinderColorType(GtkToggleButton *button, gpointer data); /* static void cylinderValuesChangedOnResources(GObject *obj, gpointer data); */ /** * visu_ui_pairs_cylinder_init: (skip) * * This routine is used by V_Sim to initialise the Gtk part of * cylinder pair model. This should be called once on start-up. */ void visu_ui_pairs_cylinder_init(void) { /* g_signal_connect(VISU_OBJECT_INSTANCE, "resourcesLoaded", */ /* G_CALLBACK(cylinderValuesChangedOnResources), (gpointer)0); */ } /** * visu_ui_pairs_cylinder_initBuild: (skip) * * This routine create a container #GtkWidget that hold all widgets * necessary for handling cylinder pair model. * * Returns: a newly created #GtkWidget. */ GtkWidget* visu_ui_pairs_cylinder_initBuild() { GtkWidget *hbox, *vbox; GtkWidget *label; GSList *radioCylinderUser_group = NULL; vbox = gtk_vbox_new(FALSE, 0); hbox = gtk_hbox_new(FALSE, 10); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Radius:")); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); spinCylinderRadius = gtk_spin_button_new_with_range(VISU_GL_PAIRS_CYLINDER_RADIUS_MIN, VISU_GL_PAIRS_CYLINDER_RADIUS_MAX, RESOURCES_CYLINDER_RADIUS_STEP); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinCylinderRadius), visu_gl_pairs_cylinder_getGeneralRadius()); gtk_box_pack_start(GTK_BOX(hbox), spinCylinderRadius, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Color:")); gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); radioCylinderUser = gtk_radio_button_new_with_mnemonic(NULL, _("_user defined")); gtk_widget_set_name(radioCylinderUser, "message_radio"); gtk_box_pack_start(GTK_BOX(hbox), radioCylinderUser, FALSE, FALSE, 0); gtk_radio_button_set_group(GTK_RADIO_BUTTON(radioCylinderUser), radioCylinderUser_group); radioCylinderUser_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radioCylinderUser)); if(visu_gl_pairs_cylinder_getColorType() == 0) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioCylinderUser), TRUE); radioCylinderElement = gtk_radio_button_new_with_mnemonic(NULL, _("_elements")); gtk_widget_set_name(radioCylinderElement, "message_radio"); gtk_box_pack_start(GTK_BOX(hbox), radioCylinderElement, FALSE, FALSE, 0); gtk_radio_button_set_group(GTK_RADIO_BUTTON(radioCylinderElement), radioCylinderUser_group); if (visu_gl_pairs_cylinder_getColorType() == 1) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioCylinderElement), TRUE); signalSpinCylinderRadiusId = g_signal_connect(G_OBJECT(spinCylinderRadius), "value-changed", G_CALLBACK(changeCylinderRadius), (gpointer)0); g_signal_connect(G_OBJECT(radioCylinderUser), "toggled", G_CALLBACK(changeCylinderColorType), GINT_TO_POINTER(0)); g_signal_connect(G_OBJECT(radioCylinderElement), "toggled", G_CALLBACK(changeCylinderColorType), GINT_TO_POINTER(1)); return vbox; } void changeCylinderRadius(GtkSpinButton *spin, gpointer data _U_) { int res; VisuUiPairsIter iter; gchar* label; res = FALSE; /* Currently, the label depends only on the radius, so we can build only one label and use it every time. */ label = (gchar*)0; /* We run on all selected pairs. */ for (visu_ui_pairs_iter_startSelected(&iter); iter.data; visu_ui_pairs_iter_nextSelected(&iter)) { /* We change the value for this pair. */ res = visu_gl_pairs_cylinder_setRadius(iter.data, (float)gtk_spin_button_get_value(spin)) || res; if (!label) label = visu_ui_pairs_cylinder_getValues(iter.data); /* We change the drawn label. */ visu_ui_pairs_setSpecificLabels(&(iter.iter), label); } g_free(label); if (res) { visu_gl_ext_pairs_draw(visu_gl_ext_pairs_getDefault()); VISU_REDRAW_ADD; } } void changeCylinderColorType(GtkToggleButton *button, gpointer data) { int color; int res; if (!gtk_toggle_button_get_active(button)) return; color = GPOINTER_TO_INT(data); g_return_if_fail(color >= 0 && color < VISU_GL_PAIRS_CYLINDER_N_COLOR); res = visu_gl_pairs_cylinder_setColorType(color); if (res) { visu_gl_ext_pairs_draw(visu_gl_ext_pairs_getDefault()); VISU_REDRAW_ADD; } } /* static void cylinderValuesChangedOnResources(GObject *obj, gpointer data) */ /* { */ /* int val; */ /* if (!gtkPairs_isPairExtensionInUse(pointerToPairExtension_cylinder)) */ /* return; */ /* DBG_fprintf(stderr, "Gtk Cylinder : catch the 'resourcesLoaded' signal, updating values.\n"); */ /* gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinCylinderRadius), visu_gl_pairs_cylinder_getGeneralRadius()); */ /* val = visu_gl_pairs_cylinder_getColorType(); */ /* switch (val) */ /* { */ /* case VISU_GL_PAIRS_CYLINDER_COLOR_USER: */ /* gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioCylinderUser), TRUE); */ /* break; */ /* case VISU_GL_PAIRS_CYLINDER_COLOR_ELEMENT: */ /* gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioCylinderElement), TRUE); */ /* break; */ /* } */ /* } */ /** * visu_ui_pairs_cylinder_setValues: * @data: information about a pair. * * Change the widget values with the given information. This change trigger * no signals. */ void visu_ui_pairs_cylinder_setValues(VisuPairLink *data) { g_signal_handler_block(G_OBJECT(spinCylinderRadius), signalSpinCylinderRadiusId); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinCylinderRadius), visu_gl_pairs_cylinder_getRadius(data)); g_signal_handler_unblock(G_OBJECT(spinCylinderRadius), signalSpinCylinderRadiusId); } /** * visu_ui_pairs_cylinder_getValues: * @data: information about a pair * * Create an internationalised UTF-8 label that describes the * information about a pair. * * Returns: (transfer full): a newly allocated string. */ gchar* visu_ui_pairs_cylinder_getValues(VisuPairLink *data) { gchar *str; /* a.u. is for arbitrary units. */ str = g_strdup_printf("%s %3.2f%s", _("cyl.:"), visu_gl_pairs_cylinder_getRadius(data), _("a.u.")); return str; } v_sim-3.7.0/src/pairsModeling/gtk_cylinder.h0000644000353400050620000000400712215546075016004 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef GTK_CYLINDER_H #define GTK_CYLINDER_H #include #include void visu_ui_pairs_cylinder_init(void); GtkWidget* visu_ui_pairs_cylinder_initBuild(); void visu_ui_pairs_cylinder_setValues(VisuPairLink *data); gchar* visu_ui_pairs_cylinder_getValues(VisuPairLink *data); #endif v_sim-3.7.0/src/pairsModeling/gtk_wire.c0000644000353400050620000002474612215546075015150 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "gtk_wire.h" #include #include #include #include #include #include #include #include "wire.h" /** * SECTION: gtk_wire * @short_description: The additional widgets displayed in the pair * dialog to handle wire pairs. * * Some additional widgets to be displayed in the pairs dialog * window. It contains a selector for the stipple of line * representation, a selector for the colour and a way to choose a * shade in case of colourisation depending on length. */ static GtkWidget *spinThickness; static GtkWidget *comboStipple; static GtkWidget *comboToolShade; static GtkWidget *checkNonLinear; static gulong signalSpinWidthId, signalComboStippleId; static gulong signalComboShadeId, signalCheckLinearId; /* Callbacks */ static void onThicknessChanged(GtkSpinButton *spin, gpointer data); static void onUseToolShade(GtkToggleButton *button, gpointer data); static void onStippleChanged(VisuUiStippleCombobox *combo, guint value, gpointer data); static void onComboToolShadeChanged(GtkComboBox *combo, gpointer data); /** * visu_ui_pairs_wire_init: (skip) * * This routine is used by V_Sim to initialise the Gtk part of * wire pair model. This should be called once on start-up. */ void visu_ui_pairs_wire_init(void) { /* g_signal_connect(VISU_OBJECT_INSTANCE, "resourcesLoaded", */ /* G_CALLBACK(wireValuesChangedOnResources), (gpointer)0); */ } /** * visu_ui_pairs_wire_initBuild: (skip) * * This routine create a container #GtkWidget that hold all widgets * necessary for handling wire pair model. * * Returns: a newly created #GtkWidget. */ GtkWidget* visu_ui_pairs_wire_initBuild() { GtkWidget *hbox, *vbox; GtkWidget *label; #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkTooltips *tooltips; tooltips = gtk_tooltips_new (); #endif DBG_fprintf(stderr, "Gtk Wire: building interface for wire pairs.\n"); vbox = gtk_vbox_new(FALSE, 0); hbox = gtk_hbox_new(FALSE, 10); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Thickness:")); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); spinThickness = gtk_spin_button_new_with_range(1, 10, 1); gtk_box_pack_start(GTK_BOX(hbox), spinThickness, FALSE, FALSE, 0); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spinThickness), TRUE); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinThickness), visu_gl_pairs_wire_getGeneralWidth()); gtk_entry_set_width_chars(GTK_ENTRY(spinThickness), 3); label = gtk_label_new(_("Pattern:")); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); comboStipple = visu_ui_stipple_combobox_new(); gtk_box_pack_start(GTK_BOX(hbox), comboStipple, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); comboToolShade = visu_ui_shade_combobox_new(TRUE, FALSE); gtk_combo_box_set_active(GTK_COMBO_BOX(comboToolShade), 0); gtk_box_pack_end(GTK_BOX(hbox), comboToolShade, FALSE, FALSE, 0); checkNonLinear = gtk_check_button_new_with_mnemonic (_("Color _varies with length:")); gtk_box_pack_end(GTK_BOX(hbox), checkNonLinear, FALSE, FALSE, 0); signalComboShadeId = g_signal_connect(G_OBJECT(comboToolShade), "changed", G_CALLBACK(onComboToolShadeChanged), (gpointer)checkNonLinear); signalSpinWidthId = g_signal_connect(G_OBJECT(spinThickness), "value-changed", G_CALLBACK(onThicknessChanged), (gpointer)0); signalCheckLinearId = g_signal_connect(G_OBJECT(checkNonLinear), "toggled", G_CALLBACK(onUseToolShade), (gpointer)comboToolShade); signalComboStippleId = g_signal_connect(G_OBJECT(comboStipple), "stipple-selected", G_CALLBACK(onStippleChanged), (gpointer)0); return vbox; } /** * visu_ui_pairs_wire_getValues: * @data: information about a pair * * Create an internationalised UTF-8 label that describes the * information about a pair. * * Returns: (transfer full): a newly allocated string. */ gchar* visu_ui_pairs_wire_getValues(VisuPairLink *data) { int width; guint16 stipple; gchar *str; width = visu_gl_pairs_wire_getWidth(data); stipple = visu_gl_pairs_wire_getStipple(data); /* px is for pixels and pat. for pattern. */ str = g_strdup_printf("%s %2d%s, %s %d", _("wire:"), width, _("px"), _("pat."), stipple); return str; } /** * visu_ui_pairs_wire_setValues: * @data: information about a pair. * * Change the widget values with the given information. This change trigger * no signals. */ void visu_ui_pairs_wire_setValues(VisuPairLink *data) { int width; guint16 stipple; ToolShade *shade; /* Update width. */ width = visu_gl_pairs_wire_getWidth(data); g_signal_handler_block(G_OBJECT(spinThickness), signalSpinWidthId); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinThickness), width); g_signal_handler_unblock(G_OBJECT(spinThickness), signalSpinWidthId); /* Update stipple. */ stipple = visu_gl_pairs_wire_getStipple(data); g_signal_handler_block(G_OBJECT(comboStipple), signalComboStippleId); if (!visu_ui_stipple_combobox_setSelection(VISU_UI_STIPPLE_COMBOBOX(comboStipple), stipple)) { visu_ui_stipple_combobox_add(VISU_UI_STIPPLE_COMBOBOX(comboStipple), stipple); visu_ui_stipple_combobox_setSelection(VISU_UI_STIPPLE_COMBOBOX(comboStipple), stipple); } g_signal_handler_unblock(G_OBJECT(comboStipple), signalComboStippleId); /* Update shade. */ shade = visu_gl_pairs_wire_getShade(data); g_signal_handler_block(G_OBJECT(checkNonLinear), signalCheckLinearId); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkNonLinear), (shade != (ToolShade*)0)); g_signal_handler_unblock(G_OBJECT(checkNonLinear), signalCheckLinearId); gtk_widget_set_sensitive(comboToolShade, (shade != (ToolShade*)0)); if (shade) { g_signal_handler_block(G_OBJECT(comboToolShade), signalComboShadeId); visu_ui_shade_combobox_setSelectionByShade(VISU_UI_SHADE_COMBOBOX(comboToolShade), shade); g_signal_handler_unblock(G_OBJECT(comboToolShade), signalComboShadeId); } } static void onThicknessChanged(GtkSpinButton *spin, gpointer data _U_) { int res; VisuUiPairsIter iter; gchar* label; res = FALSE; /* We run on all selected pairs. */ for (visu_ui_pairs_iter_startSelected(&iter); iter.data; visu_ui_pairs_iter_nextSelected(&iter)) { /* We change the value for this pair. */ res = visu_gl_pairs_wire_setWidth(iter.data, (float)gtk_spin_button_get_value(spin)) || res; label = visu_ui_pairs_wire_getValues(iter.data); /* We change the drawn label. */ visu_ui_pairs_setSpecificLabels(&(iter.iter), label); g_free(label); } if (res) { visu_gl_ext_pairs_draw(visu_gl_ext_pairs_getDefault()); VISU_REDRAW_ADD; } } static void onStippleChanged(VisuUiStippleCombobox *combo _U_, guint value, gpointer data _U_) { int res; VisuUiPairsIter iter; gchar* label; DBG_fprintf(stderr, "Gtk Wire: caught 'stipple-selected' signal.\n"); res = FALSE; /* We run on all selected pairs. */ for (visu_ui_pairs_iter_startSelected(&iter); iter.data; visu_ui_pairs_iter_nextSelected(&iter)) { /* We change the value for this pair. */ res = visu_gl_pairs_wire_setStipple(iter.data, (guint16)value) || res; label = visu_ui_pairs_wire_getValues(iter.data); /* We change the drawn label. */ visu_ui_pairs_setSpecificLabels(&(iter.iter), label); g_free(label); } if (res) { visu_gl_ext_pairs_draw(visu_gl_ext_pairs_getDefault()); VISU_REDRAW_ADD; } } static void setToolShade(VisuUiShadeCombobox *combo, GtkToggleButton *button) { gboolean use, res; VisuUiPairsIter iter; ToolShade *sh; use = gtk_toggle_button_get_active(button); gtk_widget_set_sensitive(GTK_WIDGET(combo), use); sh = (use)?visu_ui_shade_combobox_getSelection(combo):(ToolShade*)0; /* We run on all selected pairs. */ for (visu_ui_pairs_iter_startSelected(&iter); iter.data; visu_ui_pairs_iter_nextSelected(&iter)) res = visu_gl_pairs_wire_setShade(iter.data, sh) || res; if (res) { visu_gl_ext_pairs_draw(visu_gl_ext_pairs_getDefault()); VISU_REDRAW_ADD; } } static void onComboToolShadeChanged(GtkComboBox *combo, gpointer data) { setToolShade(VISU_UI_SHADE_COMBOBOX(combo), GTK_TOGGLE_BUTTON(data)); } static void onUseToolShade(GtkToggleButton *button, gpointer data) { setToolShade(VISU_UI_SHADE_COMBOBOX(data), button); } v_sim-3.7.0/src/pairsModeling/gtk_wire.h0000644000353400050620000000375712215546075015154 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef GTK_WIRE_H #define GTK_WIRE_H #include #include void visu_ui_pairs_wire_init(void); GtkWidget* visu_ui_pairs_wire_initBuild(); void visu_ui_pairs_wire_setValues(VisuPairLink *data); gchar* visu_ui_pairs_wire_getValues(VisuPairLink *data); #endif v_sim-3.7.0/src/panelModules/0000755000353400050620000000000012216331343013056 500000000000000v_sim-3.7.0/src/panelModules/externalModules.h0000644000353400050620000000533612215546063016337 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse mèl : BILLARD, non joignable par mèl ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef EXTERNALMODULES_H #define EXTERNALMODULES_H /** * PanelInitFunc: * * Prototype of the functions used to initialise a new panel. * * Returns: a newly created #VisuUiPanel. */ typedef VisuUiPanel* (*PanelInitFunc) (VisuUiMain *main); #include "panelGeometry.h" #include "panelVibration.h" #include "panelAxes.h" #include "panelOpenGL.h" #include "panelFogBgColor.h" #include "panelBrowser.h" #include "panelDataFile.h" #include "panelElements.h" #include "panelConfig.h" #include "panelPlanes.h" #include "panelSurfaces.h" #include "panelMethod.h" #include "panelMap.h" PanelInitFunc panelListAll[] = { visu_ui_panel_elements_init, visu_ui_panel_axes_init, visu_ui_panel_bg_init, visu_ui_panel_browser_init, visu_ui_panel_geometry_init, visu_ui_panel_colorization_init, visu_ui_panel_planes_init, visu_ui_panel_surfaces_init, visu_ui_panel_map_init, visu_ui_panel_vibration_init, visu_ui_panel_method_init, visu_ui_panel_gl_init, visu_ui_panel_config_init, (PanelInitFunc)0}; #endif v_sim-3.7.0/src/panelModules/panelElements.c0000644000353400050620000006142212215546064015752 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "panelElements.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include "gtkAtomic.h" #include "gtkSpin.h" /** * SECTION: panelElements * @short_description: The tab where #VisuElement characteristics can * be tuned. * * It is possible to get the list of selected elements by * calling visu_ui_panel_elements_getSelected(). */ /** * panelElements: * * A pointer on the #VisuUiPanel that host the elements chooser. */ static GtkWidget *panelElements; /* Functions used to initialise the * specific area in the panel of elements. */ static ToolInitFunc listInitRendenringGtkPanelFunc[] = { visu_ui_panel_elements_atomic_init, visu_ui_panel_elements_spin_init, (ToolInitFunc)0}; /* sensitive widgets */ GtkWidget *vBoxElements; GtkWidget *renderingMethodElements; static GtkWidget *elementsComboBox; static GtkWidget *checkRendered; static GtkWidget *checkMasked; GtkWidget *widgetVisuElementColor; gint sortVisuElements(gpointer a, gpointer b); /* Structure to store the hooks that are required for the specific zone for elements. */ struct GtkRenderingInterface_struct { /* setSensitiveFunc sensitiveInterface; */ VisuUiPanelElementsChangeFunc newElementInterface; VisuUiNewWidgetFunc createInterface; }; typedef struct GtkRenderingInterface_struct GtkRenderingInterface; GHashTable *listOfRenderingInterfaces; static VisuUiPanelElementsChangeFunc updateRenderingMethodResources; /* Local methods. */ static void createInteriorElements(GtkWidget *visu_ui_panel); static void updateRenderingSpecificPart(VisuRendering *method); void createCallBacksElements(); void setInitialValuesElements(); char *getDefaultLabelOfElement(VisuElement *element); /* It adds the interface widget in the subPanel. The variable renderingMethodElements pints then to this widget. If renderingMethodElements has already a target, this target is freed via gtk_widget_destroy. */ static void changeRenderingMethodInterface(GtkWidget* wd); /* It allows the client to set the method use to update user defined values. */ static void setElementChangedFunc(VisuUiPanelElementsChangeFunc func); /* It reads the value of the interface methods. */ static void getRenderingInterface(VisuRendering *method, VisuUiPanelElementsChangeFunc *change, VisuUiNewWidgetFunc *create); /* Callbacks */ static void onElementSelected(VisuUiElementCombobox *combo, GList *elements, gpointer data); static gboolean onElementChanged(GSignalInvocationHint *ihint, guint n_param_values, const GValue *param_values, gpointer data); static void resourcesChanged(GObject *object, VisuData *dataObj, gpointer data); static void colorVisuElementChanged(VisuUiColorCombobox *colorWd, ToolColor *color, gpointer userData); static void checkVisibilityChanged(GtkToggleButton *button, gpointer data); static void checkMaskedChanged(GtkToggleButton *button, gpointer data); static void onDataFocused(GObject *obj, VisuData *dataObj, gpointer userData); static void onRenderingMethodChanged(GObject *obj, VisuRendering *method, gpointer userData); static void onColorChanged(VisuUiColorCombobox *colorComboBox, guint colorId, gpointer data); static void onMaterialChanged(VisuUiColorCombobox *colorComboBox, VisuGlLightMaterial mat, gpointer data); /** * visu_ui_panel_elements_init: (skip) * * Should be used in the list declared in externalModules.h to be loaded by * V_Sim on start-up. This routine will create the #VisuUiPanel where the element * stuff can be done, such as choosing a colour, setting the radius of * spheres... * * Returns: a newly created #VisuUiPanel object. */ VisuUiPanel* visu_ui_panel_elements_init(VisuUiMain *ui) { gchar *cl = _("Set elements caracteristics"); gchar *tl = _("Elements"); int i; panelElements = visu_ui_panel_newWithIconFromPath("Panel_elements", cl, tl, "stock-elements_20.png"); /* Create the list of the available rendering method interfaces. */ listOfRenderingInterfaces = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL); for (i = 0; listInitRendenringGtkPanelFunc[i]; i++) listInitRendenringGtkPanelFunc[i](); createInteriorElements(panelElements); visu_ui_panel_setDockable(VISU_UI_PANEL(panelElements), TRUE); if (!panelElements) return (VisuUiPanel*)0; /* Create the callbacks of all the sensitive widgets. */ createCallBacksElements(); g_signal_connect(G_OBJECT(ui), "DataFocused", G_CALLBACK(onDataFocused), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "renderingChanged", G_CALLBACK(onRenderingMethodChanged), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "resourcesLoaded", G_CALLBACK(resourcesChanged), (gpointer)0); g_signal_add_emission_hook(g_signal_lookup("ElementVisibilityChanged", VISU_TYPE_ELEMENT), 0, onElementChanged, (gpointer)0, (GDestroyNotify)0); g_signal_add_emission_hook(g_signal_lookup("ElementMaterialChanged", VISU_TYPE_ELEMENT), 0, onElementChanged, (gpointer)0, (GDestroyNotify)0); g_signal_add_emission_hook(g_signal_lookup("ElementPlaneChanged", VISU_TYPE_ELEMENT), 0, onElementChanged, (gpointer)0, (GDestroyNotify)0); return VISU_UI_PANEL(panelElements); } static void createInteriorElements(GtkWidget *visu_ui_panel) { GtkWidget *label, *expand, *image; GtkWidget *hbox; GtkWidget *align; GtkWidget *scrollView; #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkTooltips *tooltips; tooltips = gtk_tooltips_new (); #endif scrollView = gtk_scrolled_window_new((GtkAdjustment*)0, (GtkAdjustment*)0); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrollView), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollView), GTK_SHADOW_NONE); vBoxElements = gtk_vbox_new(FALSE, 0); gtk_widget_set_sensitive(vBoxElements, FALSE); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrollView), vBoxElements); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vBoxElements), hbox, FALSE, FALSE, 5); label = gtk_label_new(_("Set caracteristics of: ")); gtk_widget_set_name(label, "label_head"); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2); /* We create the tree widget that show the methods. */ elementsComboBox = visu_ui_element_combobox_new(TRUE, FALSE, _("Element '%s'")); visu_ui_element_combobox_setUnphysicalStatus(VISU_UI_ELEMENT_COMBOBOX(elementsComboBox), TRUE); gtk_box_pack_start(GTK_BOX(hbox), elementsComboBox, TRUE, TRUE, 2); label = gtk_label_new(""); gtk_label_set_markup(GTK_LABEL(label), _("Standard resources")); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_widget_set_name(label, "label_head_2"); gtk_box_pack_start(GTK_BOX(vBoxElements), label, FALSE, FALSE, 5); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vBoxElements), hbox, FALSE, FALSE, 0); /* label = gtk_label_new(_("Color: ")); */ /* gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2); */ widgetVisuElementColor = visu_ui_color_combobox_newWithRanges(TRUE); gtk_box_pack_start(GTK_BOX(hbox), widgetVisuElementColor, FALSE, FALSE, 2); align = gtk_alignment_new(1., 0.5, 0., 0.); gtk_box_pack_start(GTK_BOX(hbox), align, TRUE, TRUE, 2); checkRendered = gtk_check_button_new_with_label(_("rendered")); gtk_container_add(GTK_CONTAINER(align), checkRendered); align = gtk_alignment_new(0.5, 0.5, 0., 0.); gtk_box_pack_start(GTK_BOX(hbox), align, FALSE, FALSE, 2); checkMasked = gtk_check_button_new(); gtk_container_add(GTK_CONTAINER(align), checkMasked); image = create_pixmap((GtkWidget*)0, "stock-masking.png"); gtk_container_add(GTK_CONTAINER(checkMasked), image); gtk_widget_set_tooltip_text(checkMasked, _("Make nodes sensitive to the masking effect of planes.")); expand = visu_ui_color_combobox_getRangeWidgets(VISU_UI_COLOR_COMBOBOX(widgetVisuElementColor)); gtk_box_pack_start(GTK_BOX(vBoxElements), expand, FALSE, FALSE, 0); label = gtk_label_new(_("Rendering specific resources")); gtk_widget_set_name(label, "label_head_2"); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_box_pack_start(GTK_BOX(vBoxElements), label, FALSE, FALSE, 5); DBG_fprintf(stderr, "Panel Elements: create the specific widgets.\n"); renderingMethodElements = (GtkWidget*)0; updateRenderingSpecificPart(visu_object_getRendering(VISU_OBJECT_INSTANCE)); gtk_widget_show_all(scrollView); gtk_container_add(GTK_CONTAINER(visu_ui_panel), scrollView); } void createCallBacksElements() { g_signal_connect(G_OBJECT(elementsComboBox), "element-selected", G_CALLBACK(onElementSelected), (gpointer)0); g_signal_connect(G_OBJECT(widgetVisuElementColor), "color-selected", G_CALLBACK(colorVisuElementChanged), (gpointer)0); g_signal_connect(G_OBJECT(widgetVisuElementColor), "material-value-changed", G_CALLBACK(onMaterialChanged), (gpointer)0); g_signal_connect(G_OBJECT(widgetVisuElementColor), "color-value-changed", G_CALLBACK(onColorChanged), (gpointer)0); g_signal_connect(G_OBJECT(checkRendered), "toggled", G_CALLBACK(checkVisibilityChanged), (gpointer)0); g_signal_connect(G_OBJECT(checkMasked), "toggled", G_CALLBACK(checkMaskedChanged), (gpointer)0); } /*****************/ /* Miscellaneous */ /*****************/ gint sortVisuElements(gpointer a, gpointer b) { return strcmp(((VisuElement*)a)->name, ((VisuElement*)b)->name); } /*************/ /* Callbacks */ /*************/ static void onDataFocused(GObject *obj _U_, VisuData *dataObj, gpointer userData _U_) { DBG_fprintf(stderr,"Panel Element: caught 'DataFocused' signal.\n"); if (dataObj) gtk_widget_set_sensitive(vBoxElements, TRUE); else gtk_widget_set_sensitive(vBoxElements, FALSE); } static void updateRenderingSpecificPart(VisuRendering *method) { VisuUiPanelElementsChangeFunc change; VisuUiNewWidgetFunc create; change = (VisuUiPanelElementsChangeFunc)0; create = (VisuUiNewWidgetFunc)0; if (method) getRenderingInterface(method, &change, &create); DBG_fprintf(stderr,"Panel Element: set the gtk interface for" " the method '%s'.\n", visu_rendering_getName(method, FALSE)); setElementChangedFunc(change); if (create) changeRenderingMethodInterface(create()); else changeRenderingMethodInterface((GtkWidget*)0); } static void onRenderingMethodChanged(GObject *obj _U_, VisuRendering *method, gpointer userData _U_) { updateRenderingSpecificPart(method); } static gboolean onElementChanged(GSignalInvocationHint *ihint _U_, guint n_param_values _U_, const GValue *param_values, gpointer data _U_) { GList *elements; VisuElement *ele; elements = visu_ui_element_combobox_getSelection(VISU_UI_ELEMENT_COMBOBOX(elementsComboBox)); if (!elements) return TRUE; ele = VISU_ELEMENT(g_value_get_object(param_values)); DBG_fprintf(stderr, "Panel Elements: element '%s' has been modified.\n", ele->name); if (elements->data != (gpointer)ele) { g_list_free(elements); return TRUE; } g_list_free(elements); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkRendered), visu_element_getRendered(ele)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkMasked), visu_element_getSensitiveToPlanes(ele)); visu_ui_color_combobox_setRangeColor(VISU_UI_COLOR_COMBOBOX(widgetVisuElementColor), ele->rgb, FALSE); visu_ui_color_combobox_setRangeMaterial(VISU_UI_COLOR_COMBOBOX(widgetVisuElementColor), ele->material, FALSE); return TRUE; } static void onElementSelected(VisuUiElementCombobox *combo _U_, GList *elements, gpointer data _U_) { VisuElement *ele; DBG_fprintf(stderr, "Panel Elements: set new list of selected elements to %p.\n", (gpointer)elements); if (elements) { ele = (VisuElement*)elements->data; DBG_fprintf(stderr, "Panel Element: set the selected VisuElement to '%s'.\n", ele->name); visu_ui_color_combobox_setRangeColor(VISU_UI_COLOR_COMBOBOX(widgetVisuElementColor), ele->rgb, FALSE); visu_ui_color_combobox_setRangeMaterial(VISU_UI_COLOR_COMBOBOX(widgetVisuElementColor), ele->material, FALSE); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkRendered), visu_element_getRendered(ele)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkMasked), visu_element_getSensitiveToPlanes(ele)); } /* Force refresh on the specific area. */ DBG_fprintf(stderr, "Panel Element: update the render widgets for %p.\n", (gpointer)elements); if (updateRenderingMethodResources) updateRenderingMethodResources(elements); } static void colorVisuElementChanged(VisuUiColorCombobox *colorWd _U_, ToolColor *color, gpointer userData _U_) { int res; gboolean refresh; VisuData *dataObj; GList *elements, *tmp; DBG_fprintf(stderr, "Panel Elements: Catch 'color-selected' signal (%p).\n", (gpointer) color); /* Get the selected elements. */ elements = visu_ui_element_combobox_getSelection(VISU_UI_ELEMENT_COMBOBOX(elementsComboBox)); g_return_if_fail(elements); /* If currentSelectedElement is NULL we apply the changes on all elements. */ dataObj = VISU_DATA(visu_ui_panel_getFocused(VISU_UI_PANEL(panelElements))); g_return_if_fail(!dataObj || VISU_IS_DATA(dataObj)); refresh = FALSE; for (tmp = elements; tmp; tmp = g_list_next(tmp)) { res = visu_element_setAllRGBValues((VisuElement*)tmp->data, color->rgba); if (res > 0) g_signal_emit_by_name(G_OBJECT(dataObj), "RenderingChanged", (VisuElement*)tmp->data, NULL); refresh = refresh || (res != 0); } g_list_free(elements); if (refresh) { DBG_fprintf(stderr, "Panel Elements: color change, refresh.\n"); VISU_REDRAW_ADD; } } static void onColorChanged(VisuUiColorCombobox *colorComboBox, guint colorId _U_, gpointer data _U_) { int res; gboolean refresh; VisuData *dataObj; float *rgbVal; GList *elements, *tmp; /* Get the selected elements. */ elements = visu_ui_element_combobox_getSelection(VISU_UI_ELEMENT_COMBOBOX(elementsComboBox)); g_return_if_fail(elements); /* Get the values. */ rgbVal = visu_ui_color_combobox_getRangeColor(colorComboBox); /* If currentSelectedElement is NULL we apply the changes on all elements. */ dataObj = VISU_DATA(visu_ui_panel_getFocused(VISU_UI_PANEL(panelElements))); g_return_if_fail(!dataObj || VISU_IS_DATA(dataObj)); refresh = FALSE; for (tmp = elements; tmp; tmp = g_list_next(tmp)) { res = visu_element_setAllRGBValues((VisuElement*)tmp->data, rgbVal); if (res > 0) g_signal_emit_by_name(G_OBJECT(dataObj), "RenderingChanged", (VisuElement*)tmp->data, NULL); refresh = refresh || (res != 0); } g_list_free(elements); if (refresh) { DBG_fprintf(stderr, "Panel Elements: RGB change, refresh.\n"); VISU_REDRAW_ADD; } g_free(rgbVal); } static void onMaterialChanged(VisuUiColorCombobox *colorComboBox, VisuGlLightMaterial mat _U_, gpointer data _U_) { int res; int refresh; VisuData *dataObj; float *matVal; GList *elements, *tmp; /* Get the selected elements. */ elements = visu_ui_element_combobox_getSelection(VISU_UI_ELEMENT_COMBOBOX(elementsComboBox)); g_return_if_fail(elements); /* Get the values. */ matVal = visu_ui_color_combobox_getRangeMaterial(colorComboBox); /* If currentSelectedElement is NULL we apply the changes on all elements. */ dataObj = VISU_DATA(visu_ui_panel_getFocused(VISU_UI_PANEL(panelElements))); g_return_if_fail(!dataObj || VISU_IS_DATA(dataObj)); refresh = FALSE; for (tmp = elements; tmp; tmp = g_list_next(tmp)) { res = visu_element_setAllMaterialValues((VisuElement*)tmp->data, matVal); if (res > 0) g_signal_emit_by_name(G_OBJECT(dataObj), "RenderingChanged", (VisuElement*)tmp->data, NULL); refresh = refresh || (res != 0); } g_list_free(elements); if (refresh) { DBG_fprintf(stderr, "Panel Elements: material change, refresh.\n"); VISU_REDRAW_ADD; } g_free(matVal); } static gboolean askForHide(gpointer data _U_) { VisuData *dataObj; gboolean refresh; dataObj = VISU_DATA(visu_ui_panel_getFocused(VISU_UI_PANEL(panelElements))); g_return_val_if_fail(VISU_IS_DATA(dataObj), FALSE); refresh = FALSE; g_signal_emit_by_name(G_OBJECT(dataObj), "AskForShowHide", &refresh, NULL); if (refresh) { g_signal_emit_by_name(G_OBJECT(dataObj), "VisibilityChanged", NULL); VISU_REDRAW_ADD; } return FALSE; } static void checkMaskedChanged(GtkToggleButton *button, gpointer data _U_) { gboolean refresh; GList *elements, *tmp; /* Get the selected elements. */ elements = visu_ui_element_combobox_getSelection(VISU_UI_ELEMENT_COMBOBOX(elementsComboBox)); g_return_if_fail(elements); refresh = FALSE; for (tmp = elements; tmp; tmp = g_list_next(tmp)) refresh = visu_element_setSensitiveToPlanes((VisuElement*)tmp->data, gtk_toggle_button_get_active(button)) || refresh; g_list_free(elements); if (refresh) g_idle_add(askForHide, (gpointer)0); } static void checkVisibilityChanged(GtkToggleButton *button, gpointer data _U_) { int res; gboolean refresh; VisuData *dataObj; GList *elements, *tmp; /* Get the selected elements. */ elements = visu_ui_element_combobox_getSelection(VISU_UI_ELEMENT_COMBOBOX(elementsComboBox)); g_return_if_fail(elements); dataObj = VISU_DATA(visu_ui_panel_getFocused(VISU_UI_PANEL(panelElements))); g_return_if_fail(!dataObj || VISU_IS_DATA(dataObj)); refresh = FALSE; for (tmp = elements; tmp; tmp = g_list_next(tmp)) { res = visu_element_setRendered((VisuElement*)tmp->data, gtk_toggle_button_get_active(button)); if (res) { refresh = TRUE; g_signal_emit_by_name(G_OBJECT(dataObj), "RenderingChanged", (VisuElement*)tmp->data, NULL); } } g_list_free(elements); if (refresh) VISU_REDRAW_ADD; } static void resourcesChanged(GObject *object _U_, VisuData *dataObj _U_, gpointer data _U_) { GList *elements; /* The resources loading could have changed ToolColor of the element, so we check all the list. */ DBG_fprintf(stderr, "Panel Elements: catch the 'resourcesChanged'" " signal, checking color pointers.\n"); /* Get the selected iter. */ elements = visu_ui_element_combobox_getSelection(VISU_UI_ELEMENT_COMBOBOX(elementsComboBox)); if (!elements) return; /* Force refresh on the specific area. */ if (updateRenderingMethodResources) updateRenderingMethodResources(elements); g_list_free(elements); } /** * visu_ui_panel_elements_getSelected: * * This method is used to get a list of selected #VisuElement from the * element selector of this panel. * * Since: 3.6 * * Returns: (transfer container) (element-type VisuElement*): a list * of #VisuElement, the list should be freed after use by * g_list_free(). */ GList* visu_ui_panel_elements_getSelected() { return visu_ui_element_combobox_getSelection(VISU_UI_ELEMENT_COMBOBOX(elementsComboBox)); } /* It allows the client to set the method use to update user defined values. */ static void setElementChangedFunc(VisuUiPanelElementsChangeFunc func) { updateRenderingMethodResources = func; } /* It adds the interface widget in the subPanel. The variable renderingMethodElements pints then to this widget. If renderingMethodElements has already a target, this target is freed via gtk_widget_destroy. If interface is a null pointer the previous renderingMethodElements is removed, but nothing replaces it. */ static void changeRenderingMethodInterface(GtkWidget* wd) { GList *elements; DBG_fprintf(stderr, "Panel Element: caught 'resourcesLoaded' signal.\n"); if (renderingMethodElements) { /* note that gtk_destroy automatically remove renderingMethodElements for its container, so a call to gtk_container_remove is not necessary. */ DBG_fprintf(stderr, "Panel Element: removing old rendering specific widget.\n"); gtk_widget_destroy(renderingMethodElements); } renderingMethodElements = wd; if (wd) { gtk_box_pack_start(GTK_BOX(vBoxElements), wd, FALSE, FALSE, 5); gtk_box_reorder_child(GTK_BOX(vBoxElements), wd, 6); gtk_widget_show(wd); } /* Force refresh on the specific area. */ if (updateRenderingMethodResources) { elements = visu_ui_element_combobox_getSelection(VISU_UI_ELEMENT_COMBOBOX(elementsComboBox)); updateRenderingMethodResources(elements); g_list_free(elements); } } /* RenderingMethod gtk interface. */ /** * visu_ui_panel_elements_setMethod: * @method: a pointer on the method this interface is associated to ; * @change: (scope call): the method to be called whenever the element * selection is cahnged ; * @create: (scope call): the method to be called when the interface must be built. * * This method allows to initiate the methods to deal with the rendering * specific interfaces. */ void visu_ui_panel_elements_setMethod(VisuRendering *method, VisuUiPanelElementsChangeFunc change, VisuUiNewWidgetFunc create) { GtkRenderingInterface *wd; if (!method) return; /* Search for an already existing GtkRenderingInterface for this name. */ wd = g_hash_table_lookup(listOfRenderingInterfaces, (gpointer)method); if (wd) { wd->newElementInterface = change; wd->createInterface = create; } else { wd = g_malloc(sizeof(GtkRenderingInterface)); wd->newElementInterface = change; wd->createInterface = create; g_hash_table_insert(listOfRenderingInterfaces, (gpointer)method, (gpointer)wd); } } /* It reads the value of the interface methods. */ static void getRenderingInterface(VisuRendering *method, VisuUiPanelElementsChangeFunc *change, VisuUiNewWidgetFunc *create) { GtkRenderingInterface *wd; *change = (VisuUiPanelElementsChangeFunc)0; *create = (VisuUiNewWidgetFunc)0; if (!method) return; wd = g_hash_table_lookup(listOfRenderingInterfaces, (gpointer)method); if (wd) { *change = wd->newElementInterface; *create = wd->createInterface; } } /** * visu_ui_panel_elements_getStatic: * * Retrives a pointer on this #VisuUiPanel. * * Returns: (transfer none): a pointer owned by V_Sim. */ GtkWidget* visu_ui_panel_elements_getStatic() { return panelElements; } v_sim-3.7.0/src/panelModules/panelElements.h0000644000353400050620000000522312215546063015753 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef PANELELEMENTS_H #define PANELELEMENTS_H #include #include #include #include #include VisuUiPanel* visu_ui_panel_elements_init(); /** * VisuUiPanelElementsChangeFunc: * @elements: a list of all #VisuElements that are selected. * * Methods from this interface are called whenever the currently selected * elements are changed. */ typedef void (*VisuUiPanelElementsChangeFunc)(GList *elements); void visu_ui_panel_elements_setMethod(VisuRendering *method, VisuUiPanelElementsChangeFunc change, VisuUiNewWidgetFunc create); GList* visu_ui_panel_elements_getSelected(); /** * VISU_UI_PANEL_ELEMENTS: * * Retrieve the widget of the panel of #VisuElement. * * Returns: a #GtkWidget owned by V_Sim. */ #define VISU_UI_PANEL_ELEMENTS visu_ui_panel_elements_getStatic() GtkWidget* visu_ui_panel_elements_getStatic(); #endif v_sim-3.7.0/src/panelModules/gtkAtomic.c0000644000353400050620000005006512215546063015100 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse mèl : BILLARD, non joignable par mèl ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include "gtkAtomic.h" #include #include #include #include "panelElements.h" #include "panelMethod.h" #include #include #include /** * SECTION:gtkAtomic * @short_description: The gtk interface elements that are specific to * the atomic rendering method. * * This part gathers all the routine specific to the widgets * related to the atomic rendering method. For the method itself, * there is no specific widgets. For the #VisuElement part, one can * tune the shape, the radius and the elipsoid orientation (when * selected). There is no specific #GtkFileChooser widget. */ #define SPIN_ATOMIC_RADIUS_UPPER (gdouble)999. #define SPIN_ATOMIC_RADIUS_LOWER (gdouble)0.001 #define SPIN_ATOMIC_RADIUS_STEP (gdouble)0.05 #define LABEL_RADIUS _("Radius:") /* the spin button to control the radius. */ static GtkWidget *spinRadius; static GtkWidget *entryShape; static GtkWidget *labelRadius; static GtkWidget *spinRatio; static GtkWidget *spinPhi; static GtkWidget *spinTheta; static GtkWidget *checkForces; static GtkWidget *radioScaleAuto; static GtkWidget *entryScale; static GtkWidget *labelMaxForces; static gulong configResourcesLoadedId; enum { paramRadius, paramShape, paramRatio, paramPhi, paramTheta }; /* Callbacks */ static gboolean disableSignals = FALSE; static void paramChanged(GtkSpinButton* button, gpointer data); static void shapeChanged(GtkComboBox *box, gpointer data); static void updateOnResources(GObject *obj, VisuData *dataObj, gpointer data); static void onDrawForces(GtkToggleButton *toggle, gpointer data); static void onDataReady(GObject *obj, VisuData *dataObj, VisuGlView *view, gpointer data); static void onScaleForces(GtkToggleButton *toggle, gpointer data); static void onEntryForces(VisuUiNumericalEntry *entry, gdouble old_value, gpointer data); static gboolean onForcesHook(GSignalInvocationHint *ihint, guint nvalues, const GValue *param_values, gpointer data); /* Local routines. */ static GtkWidget* createGtkConfigForAtomicMethod(void); static void destroyGtkConfigForAtomicMethod(); static void updateLabelMaxForces(); /***************/ /* Public part */ /***************/ /** * visu_ui_panel_elements_atomic_init: (skip) * * Initialise the specific area in the element panel * for the atomic rendering method. */ void visu_ui_panel_elements_atomic_init() { visu_ui_panel_elements_setMethod(visu_rendering_getByName (VISU_RENDERING_ATOMIC_NAME), visu_ui_panel_elements_atomic_onChange, visu_ui_panel_elements_atomic_initBuild); } /** * visu_ui_panel_elements_atomic_initOpen: (skip) * * Initialise the gtk methods associated with * the atomic rendering method. */ void visu_ui_panel_elements_atomic_initOpen() { DBG_fprintf(stderr, "Gtk Atomic: set no specific file method.\n"); visu_ui_setRenderingSpecificMethod(visu_rendering_getByName (VISU_RENDERING_ATOMIC_NAME), (VisuUiSetFilesFunc)0); } /** * visu_ui_panel_elements_atomic_initMethod: (skip) * * Initialise widgets related to the atomic rendering methods. * * Since: 3.7 */ void visu_ui_panel_elements_atomic_initMethod() { visu_ui_panel_method_set(visu_rendering_getByName (VISU_RENDERING_ATOMIC_NAME), createGtkConfigForAtomicMethod, destroyGtkConfigForAtomicMethod); /* May draw Forces on new data. */ labelMaxForces = (GtkWidget*)0; radioScaleAuto = (GtkWidget*)0; entryScale = (GtkWidget*)0; checkForces = (GtkWidget*)0; g_signal_connect(VISU_OBJECT_INSTANCE, "dataRendered", G_CALLBACK(onDataReady), NULL); g_signal_add_emission_hook(g_signal_lookup("ForcesChanged", VISU_TYPE_RENDERING_ATOMIC), 0, onForcesHook, (gpointer)0, (GDestroyNotify)0); } /** * visu_ui_panel_elements_atomic_initBuild: (skip) * * Create the gtk widgets (a hbox with a spin with * positive values) and return it. * * Returns: newly created widgets to handle atomic rendering * characteristics of elements. */ GtkWidget* visu_ui_panel_elements_atomic_initBuild() { GtkWidget* hbox, *vbox; GtkWidget* label; GtkWidget *comboShape; const char **names, **ids; int i; DBG_fprintf(stderr, "GTK Atomic: create the gtk interface.\n"); vbox = gtk_vbox_new(FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5); labelRadius = gtk_label_new(""); gtk_label_set_text(GTK_LABEL(labelRadius), LABEL_RADIUS); gtk_box_pack_start(GTK_BOX(hbox), labelRadius, FALSE, FALSE, 1); spinRadius = gtk_spin_button_new_with_range(SPIN_ATOMIC_RADIUS_LOWER, SPIN_ATOMIC_RADIUS_UPPER, SPIN_ATOMIC_RADIUS_STEP); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinRadius), 1.0); gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinRadius), 3); gtk_box_pack_start(GTK_BOX(hbox), spinRadius, FALSE,FALSE, 3); label = gtk_label_new(_("Shape: ")); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 1); gtk_misc_set_alignment(GTK_MISC(label), 1., 0.5); comboShape = gtk_combo_box_text_new(); names = visu_rendering_atomic_getAllShapesI18n(); ids = visu_rendering_atomic_getAllShapes(); if (names && ids) for (i = 0; names[i] && ids[i]; i++) gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(comboShape), ids[i], names[i]); else gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(comboShape), (const gchar*)0, (char*)visu_rendering_atomic_getShapeNameDefault()); gtk_combo_box_set_active(GTK_COMBO_BOX(comboShape), 0); entryShape = comboShape; /* set callback for the combo button. */ g_signal_connect(G_OBJECT(entryShape), "changed", G_CALLBACK(shapeChanged), (gpointer)0); gtk_box_pack_start(GTK_BOX(hbox), comboShape, FALSE, FALSE, 3); /* set callback for the spin button. */ g_signal_connect((gpointer)spinRadius, "value-changed", G_CALLBACK(paramChanged), GINT_TO_POINTER(paramRadius)); /* Set widgets for the elipsoid parameters. */ label = gtk_label_new(""); gtk_label_set_markup(GTK_LABEL(label), _("Parameters for elipsoid shape")); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 5); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 2); label = gtk_label_new(_("Ratio: ")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_misc_set_padding(GTK_MISC(label), 10, 0); spinRatio = gtk_spin_button_new_with_range(1., 10., 0.1); gtk_box_pack_end(GTK_BOX(hbox), spinRatio, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 2); label = gtk_label_new(_("Phi: ")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_misc_set_padding(GTK_MISC(label), 10, 0); spinPhi = gtk_spin_button_new_with_range(-180., 180., 1.); gtk_box_pack_end(GTK_BOX(hbox), spinPhi, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 2); label = gtk_label_new(_("Theta: ")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_misc_set_padding(GTK_MISC(label), 10, 0); spinTheta = gtk_spin_button_new_with_range(-180., 180., 1.); gtk_box_pack_end(GTK_BOX(hbox), spinTheta, FALSE, FALSE, 0); g_signal_connect((gpointer)spinRatio, "value-changed", G_CALLBACK(paramChanged), GINT_TO_POINTER(paramRatio)); g_signal_connect((gpointer)spinPhi, "value-changed", G_CALLBACK(paramChanged), GINT_TO_POINTER(paramPhi)); g_signal_connect((gpointer)spinTheta, "value-changed", G_CALLBACK(paramChanged), GINT_TO_POINTER(paramTheta)); gtk_widget_show_all(vbox); return vbox; } /** * visu_ui_panel_elements_atomic_onChange: * @eleList: (element-type VisuElement*): a list of #VisuElement. * * Call this routine with a list of #VisuElement to change the values * shown in the widgets controling the atomic rendering. The values to * be put are read from the first #VisuElement of the list. The list * is then stored for future changes to the widgets will be applied to * all these elements. */ void visu_ui_panel_elements_atomic_onChange(GList *eleList) { float radius, ratio, phi, theta; int shape; VisuElement *ele; DBG_fprintf(stderr, "Gtk Atomic: changing values on element change.\n"); if (!eleList) return; ele = (VisuElement*)eleList->data; disableSignals = TRUE; /* Change the radius for the new element. */ DBG_fprintf(stderr, " | radius for %s.\n", ele->name); radius = visu_rendering_atomic_getRadius(ele); if (radius >= 0.) gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinRadius), radius); else { g_warning("Can't find a value for radius of element '%s'.\n", ele->name); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinRadius), visu_rendering_atomic_getRadiusDefault()); } /* Change the shape for the new element. */ DBG_fprintf(stderr, " | shape.\n"); shape = visu_rendering_atomic_getShape(ele); if (shape >= 0) gtk_combo_box_set_active(GTK_COMBO_BOX(entryShape), shape); else { g_warning("Can't find the shape of element '%s'.\n", ele->name); gtk_combo_box_set_active(GTK_COMBO_BOX(entryShape), visu_rendering_atomic_getShapeDefault()); } /* Change the elipsoid parameters. */ DBG_fprintf(stderr, " | ellipsoid.\n"); ratio = visu_rendering_atomic_getElipsoidRatio(ele); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinRatio), ratio); phi = visu_rendering_atomic_getElipsoidPhi(ele); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinPhi), phi); theta = visu_rendering_atomic_getElipsoidTheta(ele); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinTheta), theta); DBG_fprintf(stderr, " | Done.\n"); disableSignals = FALSE; } /* Creates the vbox displayed in the config panel */ static GtkWidget* createGtkConfigForAtomicMethod() { GtkWidget *vbox, *wd, *hbox, *radio, *vbox2; GSList *lst; gfloat scale; DBG_fprintf(stderr, "Gtk Atomic: building specific widgets for method.\n"); vbox = gtk_vbox_new(FALSE, 0); checkForces = gtk_check_button_new_with_mnemonic (_("Display _forces (if available)")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkForces), visu_gl_ext_getActive(VISU_GL_EXT(visu_gl_ext_forces_getDefault()))); g_signal_connect(G_OBJECT(checkForces), "toggled", G_CALLBACK(onDrawForces), (gpointer)0); gtk_box_pack_start(GTK_BOX(vbox), checkForces, FALSE, FALSE, 0); vbox2 = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), vbox2, FALSE, FALSE, 0); wd = gtk_label_new(_("Policy to scale arrows:")); gtk_misc_set_alignment(GTK_MISC(wd), 0., 0.5); gtk_misc_set_padding(GTK_MISC(wd), 10, 0); gtk_box_pack_start(GTK_BOX(vbox2), wd, FALSE, FALSE, 0); /* hbox = gtk_hbox_new(FALSE, 0); */ /* gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 0); */ /* radio = gtk_radio_button_new_with_label(NULL, _("per node type")); */ /* gtk_radio_button_set_group(GTK_RADIO_BUTTON(radio), (GSList*)0); */ /* lst = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio)); */ /* gtk_box_pack_start(GTK_BOX(hbox), radio, TRUE, TRUE, 15); */ scale = visu_gl_ext_node_vectors_getNormalisation(VISU_GL_EXT_NODE_VECTORS(visu_gl_ext_forces_getDefault())); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 0); radioScaleAuto = gtk_radio_button_new_with_label(NULL, _("automatic")); if (scale > 0.f) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioScaleAuto), FALSE); g_signal_connect(G_OBJECT(radioScaleAuto), "toggled", G_CALLBACK(onScaleForces), (gpointer)0); gtk_radio_button_set_group(GTK_RADIO_BUTTON(radioScaleAuto), (GSList*)0); lst = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radioScaleAuto)); gtk_box_pack_start(GTK_BOX(hbox), radioScaleAuto, TRUE, TRUE, 15); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 0); radio = gtk_radio_button_new_with_label(NULL, _("manual")); gtk_radio_button_set_group(GTK_RADIO_BUTTON(radio), lst); if (scale > 0.f) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), TRUE); g_signal_connect(G_OBJECT(radio), "toggled", G_CALLBACK(onScaleForces), (gpointer)0); gtk_box_pack_start(GTK_BOX(hbox), radio, FALSE, FALSE, 15); entryScale = visu_ui_numerical_entry_new(1e-2); gtk_entry_set_width_chars(GTK_ENTRY(entryScale), 6); if (scale > 0.f) visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryScale), scale); g_signal_connect(G_OBJECT(entryScale), "value-changed", G_CALLBACK(onEntryForces), (gpointer)0); gtk_box_pack_start(GTK_BOX(hbox), entryScale, FALSE, FALSE, 0); labelMaxForces = gtk_label_new(""); gtk_misc_set_alignment(GTK_MISC(labelMaxForces), 0., 0.5); gtk_box_pack_start(GTK_BOX(hbox), labelMaxForces, TRUE, TRUE, 5); updateLabelMaxForces(); gtk_widget_show_all(vbox); configResourcesLoadedId = g_signal_connect(VISU_OBJECT_INSTANCE, "resourcesLoaded", G_CALLBACK(updateOnResources), NULL); return vbox; } static void destroyGtkConfigForAtomicMethod() { DBG_fprintf(stderr, "Gtk Atomic: remove signal from config rendering widget.\n"); g_signal_handler_disconnect(VISU_OBJECT_INSTANCE, configResourcesLoadedId); } /****************/ /* Private part */ /****************/ static void shapeChanged(GtkComboBox *box, gpointer data _U_) { int shape; GList *tmpLst, *eleList; gboolean refresh; VisuElement *ele; VisuGlView *view; VisuRendering *method; if (disableSignals) return; eleList = visu_ui_panel_elements_getSelected(); if (!eleList) return; shape = (int)gtk_combo_box_get_active(box); method = visu_object_getRendering(VISU_OBJECT_INSTANCE); view = visu_ui_panel_getView(VISU_UI_PANEL(VISU_UI_PANEL_ELEMENTS)); refresh = FALSE; for (tmpLst = eleList; tmpLst; tmpLst = g_list_next(tmpLst)) { ele = (VisuElement*)tmpLst->data; if (visu_rendering_atomic_setShape(ele, shape)) { visu_rendering_createElement(method, ele, view); refresh = TRUE; } } g_list_free(eleList); if (refresh) VISU_REDRAW_ADD; } static void paramChanged(GtkSpinButton* button, gpointer data) { int param; float value; VisuElement *ele; VisuGlView *view; GList *tmpLst, *eleList; gboolean refresh, res; VisuRendering *method; if (disableSignals) return; eleList = visu_ui_panel_elements_getSelected(); if (!eleList) return; view = visu_ui_panel_getView(VISU_UI_PANEL(VISU_UI_PANEL_ELEMENTS)); param = GPOINTER_TO_INT(data); value = gtk_spin_button_get_value(button); method = visu_object_getRendering(VISU_OBJECT_INSTANCE); refresh = FALSE; for (tmpLst = eleList; tmpLst; tmpLst = g_list_next(tmpLst)) { ele = (VisuElement*)tmpLst->data; switch (param) { case paramRadius: res = visu_rendering_atomic_setRadius(ele, value); break; case paramRatio: res = visu_rendering_atomic_setElipsoidRatio(ele, value); break; case paramPhi: res = visu_rendering_atomic_setElipsoidPhi(ele, value); break; case paramTheta: res = visu_rendering_atomic_setElipsoidTheta(ele, value); break; default: res = FALSE; } if (res) { visu_rendering_createElement(method, ele, view); refresh = TRUE; } } g_list_free(eleList); if (refresh) VISU_REDRAW_ADD; } static void updateOnResources(GObject *obj _U_, VisuData *dataObj _U_, gpointer data _U_) { } static void updateLabelMaxForces() { float max; VisuData *dataObj; gchar *str; if (!labelMaxForces) return; dataObj = visu_ui_panel_getData(VISU_UI_PANEL(VISU_UI_PANEL_ELEMENTS)); if (!dataObj) max = 0.f; else max = visu_rendering_atomic_getMaxForces(dataObj); if (max > 0.f) { str = g_strdup_printf(_("(max. force is %.4g)"), max); gtk_label_set_text(GTK_LABEL(labelMaxForces), str); g_free(str); } else gtk_label_set_text(GTK_LABEL(labelMaxForces), _("(No force data)")); } static void onDrawForces(GtkToggleButton *toggle, gpointer data _U_) { if (visu_gl_ext_setActive(VISU_GL_EXT(visu_gl_ext_forces_getDefault()), gtk_toggle_button_get_active(toggle))) { visu_gl_ext_node_vectors_draw(VISU_GL_EXT_NODE_VECTORS(visu_gl_ext_forces_getDefault())); VISU_REDRAW_ADD; } } static void onDataReady(GObject *obj _U_, VisuData *dataObj _U_, VisuGlView *view _U_, gpointer data _U_) { updateLabelMaxForces(); } static void onScaleForces(GtkToggleButton *toggle, gpointer data _U_) { VisuGlExtNodeVectors *forces; gfloat scale; if (!gtk_toggle_button_get_active(toggle)) return; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioScaleAuto))) scale = -1.f; else scale = (entryScale)?(float)visu_ui_numerical_entry_getValue(VISU_UI_NUMERICAL_ENTRY(entryScale)):-1.f; forces = VISU_GL_EXT_NODE_VECTORS(visu_gl_ext_forces_getDefault()); if (visu_gl_ext_node_vectors_setNormalisation(forces, scale)) visu_gl_ext_node_vectors_draw(forces); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkForces))) VISU_REDRAW_ADD; } static void onEntryForces(VisuUiNumericalEntry *entry _U_, gdouble old_value _U_, gpointer data _U_) { VisuGlExtNodeVectors *forces; gfloat scale; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioScaleAuto))) scale = -1.f; else scale = (entryScale)?(float)visu_ui_numerical_entry_getValue(VISU_UI_NUMERICAL_ENTRY(entryScale)):-1.f; forces = VISU_GL_EXT_NODE_VECTORS(visu_gl_ext_forces_getDefault()); if (visu_gl_ext_node_vectors_setNormalisation(forces, scale)) visu_gl_ext_node_vectors_draw(forces); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkForces)) && !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioScaleAuto))) VISU_REDRAW_ADD; } static gboolean onForcesHook(GSignalInvocationHint *ihint _U_, guint nvalues _U_, const GValue *param_values _U_, gpointer data _U_) { DBG_fprintf(stderr, "Panel Method: new forces available.\n"); updateLabelMaxForces(); return TRUE; } v_sim-3.7.0/src/panelModules/gtkAtomic.h0000644000353400050620000000434012215546063015100 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef ATOMIC_GTK_H #define ATOMIC_GTK_H /* This .h and .c give functions to create a gtk interface to adjust resources values introduced with the atomic render method. */ #include /***************/ /* Public part */ /***************/ void visu_ui_panel_elements_atomic_init(); void visu_ui_panel_elements_atomic_initOpen(); void visu_ui_panel_elements_atomic_initMethod(); GtkWidget* visu_ui_panel_elements_atomic_initBuild(); void visu_ui_panel_elements_atomic_onChange(GList *eleList); #endif v_sim-3.7.0/src/panelModules/gtkSpin.c0000644000353400050620000016107312215546064014600 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD, Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2005) Adresses ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD and Damien CALISTE and Olivier D'Astier, laboratoire L_Sim, (2001-2005) E-mail addresses : BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "gtkSpin.h" #include #include #include #include #include #include "gtkAtomic.h" #include "panelElements.h" #include "panelMethod.h" #include #include #include #include /** * SECTION:gtkSpin * @short_description: The gtk interface elements that can interfere * with renderingSpin parameters. * * This is the gtk interface for all #VisuRenderingSpin module * parameters. They are split in two parts. The first part is placed * under the config tab and allows the user to modify the "global * properties" of the renderingSpin module such as cone's axe * orientation, and color repartition. The second part is under the * element panel and allows to modify each element resource. Size of * the arrows, and their shape can be modified. */ #define LABEL_ARROW_SIZE _("Shape size and color properties:") #define LABEL_SPIN_POLICY _("Drawing policy for spins with null modulus:") void set_view(GtkWidget* button, gpointer data); /* A widget to select a shape for the arrows */ static GtkWidget *gtkw_element_shape_number = NULL; static GtkWidget *heightResourceSpin = NULL; static GtkWidget *rheightResourceSpin = NULL; static GtkWidget *lengthResourceSpin = NULL; static GtkWidget *rlengthResourceSpin = NULL; static GtkWidget *ratioElipsoidSpin = NULL; static GtkWidget *lengthElipsoidSpin = NULL; static GtkWidget *gtkw_cone_theta_angle = NULL; static GtkWidget *gtkw_cone_phi_angle = NULL; static GtkWidget *gtkw_color_wheel_angle = NULL; static GtkWidget *gtkw_use_element_color = NULL; static GtkWidget *gtkw_use_element_color_hat = NULL; static GtkWidget *useElementForElipsoid; static GtkWidget *gtkw_x = NULL, *gtkw_y = NULL, *gtkw_z = NULL; static GtkWidget *gtkw_set_view; static GtkWidget *labelSizeProp; static GtkWidget *vboxArrowShape, *vboxElipsoidShape; static GtkWidget *radioPerTypeMod, *radioGlobalMod; static GtkWidget *expandAtomic; static GtkWidget *radioAlwaysSpin, *radioEmptySpin, *radioAtomicSpin; static GtkWidget *labelAtomic; static guint element_callback_ids[10]; static int need_redraw = 1; static gulong configResourcesLoadedId; struct FileChooserSpin_struct { GtkLabel* label[2]; GtkRadioButton* radio[2]; gchar* files[2]; GtkFileChooserDialog *fileChooserDialog; GtkWidget* apply[2]; int fileKind; VisuUiPreview preview; }; /* A special widget to select two kind of files at a time. */ static gboolean gtkSpinCreate_fileChooser(VisuData *data, GtkWindow *parent); /* Its callbacks. */ static void onFileSelected(GtkButton *button, gpointer data); static void fileKindChangedForPosition(GtkToggleButton *button, gpointer data); static void fileKindChangedForSpin(GtkToggleButton *button, gpointer data); static void fileUpdatePreview(GtkFileChooser *chooser, struct FileChooserSpin_struct *fileChooserSpin); /* Callbacks */ void global_resource_callback(GtkWidget* widget, gpointer data); void element_resource_callback(GtkWidget* widget, gpointer data); static void changeSomethingSpin(); GtkWidget* createGtkInterfaceForSpinMethod(); static void onPolicyChanged(GtkToggleButton *toggle, gpointer data); static void onPolicyAtomicChanged(GtkToggleButton *toggle, gpointer data); static void onPolicyModulusChanged(GtkToggleButton *toggle, gpointer data); static GtkWidget* createGtkConfigForSpinMethod(void); static void destroyGtkConfigForSpinMethod(); /* Local routines. */ static gboolean fileSelected(struct FileChooserSpin_struct *values); static void sync_global_resources(GObject *object, VisuData *dataObj, gpointer data); static void sync_local_resources(GObject *trash, gpointer data); /***************/ /* Public part */ /***************/ /* See h file for more info */ void visu_ui_panel_elements_spin_init() { visu_ui_panel_elements_setMethod(visu_rendering_getByName (VISU_RENDERING_SPIN_NAME), changeSomethingSpin, createGtkInterfaceForSpinMethod); } /* See h file for more info */ void visu_ui_panel_elements_spin_initMethod() { visu_ui_panel_method_set(visu_rendering_getByName (VISU_RENDERING_SPIN_NAME), createGtkConfigForSpinMethod, destroyGtkConfigForSpinMethod); } /* Creates the hbox containing x,y,z spin buttons */ static GtkWidget *gtk_spin_create_direction(float *cartesian_values, float *spherical_values) { GtkWidget *table; GtkWidget* label_x = gtk_label_new(_("x:")); GtkWidget* label_y = gtk_label_new(_("y:")); GtkWidget* label_z = gtk_label_new(_("z:")); GtkWidget* label_theta = gtk_label_new("\316\270:"); GtkWidget* label_phi = gtk_label_new("\317\206:"); #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkTooltips *tooltips; tooltips = gtk_tooltips_new(); #endif table = gtk_table_new(2, 6, FALSE); gtk_misc_set_alignment(GTK_MISC(label_x), 1., 0.5); gtk_misc_set_alignment(GTK_MISC(label_y), 1., 0.5); gtk_misc_set_alignment(GTK_MISC(label_z), 1., 0.5); gtkw_x = gtk_spin_button_new_with_range(-99.99, 99.99, 0.05); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtkw_x), cartesian_values[0]); g_signal_connect(gtkw_x, "value-changed", G_CALLBACK(global_resource_callback), GINT_TO_POINTER(-1)); gtkw_y = gtk_spin_button_new_with_range(-99.99, 99.99, 0.05); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtkw_y), cartesian_values[1]); g_signal_connect(gtkw_y, "value-changed", G_CALLBACK(global_resource_callback), GINT_TO_POINTER(-2)); gtkw_z = gtk_spin_button_new_with_range(-99.99, 99.99, 0.05); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtkw_z), cartesian_values[2]); g_signal_connect(gtkw_z, "value-changed", G_CALLBACK(global_resource_callback), GINT_TO_POINTER(-3)); gtk_table_attach(GTK_TABLE(table), label_x, 0, 1, 0, 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 2); gtk_table_attach(GTK_TABLE(table), label_y, 2, 3, 0, 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 2); gtk_table_attach(GTK_TABLE(table), label_z, 4, 5, 0, 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 2); gtk_table_attach(GTK_TABLE(table), gtkw_x, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 1, 2); gtk_table_attach(GTK_TABLE(table), gtkw_y, 3, 4, 0, 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 1, 2); gtk_table_attach(GTK_TABLE(table), gtkw_z, 5, 6, 0, 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 1, 2); gtk_misc_set_alignment(GTK_MISC(label_theta), 1., 0.5); gtk_misc_set_alignment(GTK_MISC(label_phi), 1., 0.5); gtkw_cone_theta_angle = gtk_spin_button_new_with_range(0, 180., 3); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtkw_cone_theta_angle), spherical_values[1]); g_signal_connect(gtkw_cone_theta_angle, "value-changed", G_CALLBACK(global_resource_callback), GINT_TO_POINTER(0)); gtkw_cone_phi_angle = gtk_spin_button_new_with_range(0, 360., 3); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtkw_cone_phi_angle), spherical_values[2]); g_signal_connect(gtkw_cone_phi_angle, "value-changed", G_CALLBACK(global_resource_callback), GINT_TO_POINTER(1)); gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(gtkw_cone_phi_angle), TRUE); gtkw_set_view = gtk_button_new_with_label (_("Set ortho.")); gtk_widget_set_tooltip_text(gtkw_set_view, _("Set the cone orientation to be orthogonal" " to the screen.")); g_signal_connect(gtkw_set_view, "clicked", G_CALLBACK(set_view), NULL); gtk_table_attach(GTK_TABLE(table), label_theta, 0, 1, 1, 2, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 2); gtk_table_attach(GTK_TABLE(table), label_phi, 2, 3, 1, 2, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 2); gtk_table_attach(GTK_TABLE(table), gtkw_cone_theta_angle, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 1, 2); gtk_table_attach(GTK_TABLE(table), gtkw_cone_phi_angle, 3, 4, 1, 2, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 1, 2); gtk_table_attach(GTK_TABLE(table), gtkw_set_view, 4, 6, 1, 2, GTK_EXPAND, GTK_SHRINK, 1, 2); return table; } /* Creates the hbox containing the color_wheel_angle button */ static GtkWidget *gtk_spin_create_color_wheel(float color_wheel_angle) { GtkWidget* hbox = gtk_hbox_new(FALSE, 0); GtkWidget* label = gtk_label_new(_("Rotate color wheel:")); gtk_misc_set_alignment(GTK_MISC(label), 0.,0.5); gtkw_color_wheel_angle = gtk_spin_button_new_with_range(0, 360., 3); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtkw_color_wheel_angle), color_wheel_angle); g_signal_connect(gtkw_color_wheel_angle, "value-changed", G_CALLBACK(global_resource_callback), GINT_TO_POINTER(2)); gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(gtkw_color_wheel_angle), TRUE); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 1); gtk_box_pack_start(GTK_BOX(hbox), gtkw_color_wheel_angle, FALSE, FALSE, 1); /* Degrees. */ label = gtk_label_new(_("deg.")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 1); return hbox; } GtkWidget* createHidingModeRadioWidgets() { GtkWidget *hbox; GSList *radiobutton_group; VisuRenderingSpinDrawingPolicy policy; hbox = gtk_hbox_new(FALSE, 0); radioAlwaysSpin = gtk_radio_button_new_with_label(NULL, _("always")); gtk_radio_button_set_group(GTK_RADIO_BUTTON(radioAlwaysSpin), (GSList*)0); radiobutton_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radioAlwaysSpin)); gtk_box_pack_start(GTK_BOX(hbox), radioAlwaysSpin, TRUE, TRUE, 1); g_signal_connect(G_OBJECT(radioAlwaysSpin), "toggled", G_CALLBACK(onPolicyChanged), GINT_TO_POINTER(VISU_RENDERING_SPIN_ALWAYS)); radioEmptySpin = gtk_radio_button_new_with_label(NULL, _("never")); gtk_radio_button_set_group(GTK_RADIO_BUTTON(radioEmptySpin), radiobutton_group); radiobutton_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radioEmptySpin)); gtk_box_pack_start(GTK_BOX(hbox), radioEmptySpin, TRUE, TRUE, 1); g_signal_connect(G_OBJECT(radioEmptySpin), "toggled", G_CALLBACK(onPolicyChanged), GINT_TO_POINTER(VISU_RENDERING_SPIN_HIDE_NULL)); radioAtomicSpin = gtk_radio_button_new_with_label(NULL, _("atomic")); gtk_radio_button_set_group(GTK_RADIO_BUTTON(radioAtomicSpin), radiobutton_group); radiobutton_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radioAtomicSpin)); gtk_box_pack_start(GTK_BOX(hbox), radioAtomicSpin, TRUE, TRUE, 1); g_signal_connect(G_OBJECT(radioAtomicSpin), "toggled", G_CALLBACK(onPolicyChanged), GINT_TO_POINTER(VISU_RENDERING_SPIN_ATOMIC_NULL)); g_object_get(G_OBJECT(visu_rendering_getByName(VISU_RENDERING_SPIN_NAME)), "hiding-mode", &policy, NULL); switch (policy) { case VISU_RENDERING_SPIN_ALWAYS: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioAlwaysSpin), TRUE); break; case VISU_RENDERING_SPIN_HIDE_NULL: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioEmptySpin), TRUE); break; case VISU_RENDERING_SPIN_ATOMIC_NULL: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioAtomicSpin), TRUE); break; default: g_warning("Wrong 'hiding-mode'."); } gtk_widget_show_all(hbox); return hbox; } /* Creates the vbox displayed in the config panel */ static GtkWidget* createGtkConfigForSpinMethod() { GtkWidget *vbox = gtk_vbox_new(FALSE, 0); GtkWidget *label2 = gtk_label_new(_("Color cone orientation:")); float cartesian[3], spherical[3], wheel; GtkWidget *labelPolicy; GtkWidget *hbox, *check, *label, *align; GSList *radiobutton_group; VisuRenderingSpinModulusPolicy modPol; VisuRendering *spin; gboolean atomic; DBG_fprintf(stderr, "Gtk Spin : building specific spin rendering method config widget.\n"); spin = visu_rendering_getByName(VISU_RENDERING_SPIN_NAME); spherical[0] = 1; g_object_get(G_OBJECT(spin), "cone-theta", spherical + 1, "cone-phi", spherical + 2, NULL); tool_matrix_sphericalToCartesian(cartesian, spherical); /* Use modulus. */ g_object_get(G_OBJECT(spin), "modulus-scaling", &modPol, NULL); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Spin lenght is proportional to modulus: ")); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_widget_set_name(label, "label_head_2"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 3); check = gtk_check_button_new(); gtk_box_pack_start(GTK_BOX(hbox), check, FALSE, FALSE, 10); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), (modPol != VISU_RENDERING_SPIN_CONSTANT)); g_signal_connect(G_OBJECT(check), "toggled", G_CALLBACK(onPolicyModulusChanged), GINT_TO_POINTER(VISU_RENDERING_SPIN_CONSTANT)); hbox = gtk_hbox_new(FALSE, 0); radioPerTypeMod = gtk_radio_button_new_with_label(NULL, _("per node type")); gtk_radio_button_set_group(GTK_RADIO_BUTTON(radioPerTypeMod), (GSList*)0); radiobutton_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radioPerTypeMod)); gtk_box_pack_start(GTK_BOX(hbox), radioPerTypeMod, TRUE, TRUE, 1); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioPerTypeMod), modPol == VISU_RENDERING_SPIN_PER_TYPE); gtk_widget_set_sensitive(radioPerTypeMod, (modPol != VISU_RENDERING_SPIN_CONSTANT)); g_signal_connect(G_OBJECT(radioPerTypeMod), "toggled", G_CALLBACK(onPolicyModulusChanged), GINT_TO_POINTER(VISU_RENDERING_SPIN_PER_TYPE)); radioGlobalMod = gtk_radio_button_new_with_label(NULL, _("globaly")); gtk_radio_button_set_group(GTK_RADIO_BUTTON(radioGlobalMod), radiobutton_group); radiobutton_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radioGlobalMod)); gtk_box_pack_start(GTK_BOX(hbox), radioGlobalMod, TRUE, TRUE, 1); g_signal_connect(G_OBJECT(radioGlobalMod), "toggled", G_CALLBACK(onPolicyModulusChanged), GINT_TO_POINTER(VISU_RENDERING_SPIN_GLOBAL)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioGlobalMod), modPol == VISU_RENDERING_SPIN_GLOBAL); gtk_widget_set_sensitive(radioGlobalMod, (modPol != VISU_RENDERING_SPIN_CONSTANT)); gtk_widget_show_all(hbox); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); /* Drawing atomic. */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Use atomic rendering in addition to spin: ")); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_widget_set_name(label, "label_head_2"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 3); check = gtk_check_button_new(); gtk_box_pack_start(GTK_BOX(hbox), check, FALSE, FALSE, 10); g_object_get(G_OBJECT(spin), "use-atomic", &atomic, NULL); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), atomic); g_signal_connect(G_OBJECT(check), "toggled", G_CALLBACK(onPolicyAtomicChanged), (gpointer)0); /* Drawing policy. */ labelPolicy = gtk_label_new(LABEL_SPIN_POLICY); gtk_misc_set_alignment(GTK_MISC(labelPolicy), 0., 0.5); gtk_misc_set_padding(GTK_MISC(labelPolicy), 3, 0); gtk_widget_set_name(labelPolicy, "label_head_2"); gtk_box_pack_start(GTK_BOX(vbox), labelPolicy, FALSE, FALSE, 3); hbox = createHidingModeRadioWidgets(); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(""); gtk_label_set_markup(GTK_LABEL(label), _("Color distribution options:")); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_misc_set_padding(GTK_MISC(label), 3, 0); gtk_widget_set_name(label, "label_head_2"); align = gtk_alignment_new(0.5, 0.5, 1., 1.); gtk_alignment_set_padding(GTK_ALIGNMENT(align), 5, 0, 0, 0); gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, FALSE, 3); gtk_container_add(GTK_CONTAINER(align), label); g_object_get(G_OBJECT(spin), "cone-omega", &wheel, NULL); gtk_box_pack_start(GTK_BOX(vbox), gtk_spin_create_color_wheel(wheel), FALSE, FALSE, 3); gtk_box_pack_start(GTK_BOX(vbox), label2, FALSE, FALSE, 3); gtk_misc_set_alignment(GTK_MISC(label2), 0., 0.5); gtk_box_pack_start(GTK_BOX(vbox), gtk_spin_create_direction(cartesian, spherical), FALSE, FALSE, 3); gtk_widget_show_all(vbox); configResourcesLoadedId = g_signal_connect(VISU_OBJECT_INSTANCE, "resourcesLoaded", G_CALLBACK(sync_global_resources), NULL); return vbox; } static void destroyGtkConfigForSpinMethod() { DBG_fprintf(stderr, "Gtk Spin: remove signal from config rendering widget.\n"); g_signal_handler_disconnect(VISU_OBJECT_INSTANCE, configResourcesLoadedId); } static void onPolicyChanged(GtkToggleButton *toggle, gpointer data) { gboolean atomic; VisuData *dataObj; if (!gtk_toggle_button_get_active(toggle)) return; g_object_set(G_OBJECT(visu_rendering_getByName(VISU_RENDERING_SPIN_NAME)), "hiding-mode", (guint)GPOINTER_TO_INT(data), NULL); atomic = (gtk_toggle_button_get_active(toggle) || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioAtomicSpin))); gtk_widget_set_sensitive(expandAtomic, atomic); gtk_expander_set_expanded(GTK_EXPANDER(expandAtomic), atomic); if (atomic) gtk_widget_hide(labelAtomic); else gtk_widget_show(labelAtomic); dataObj = visu_ui_panel_getData(VISU_UI_PANEL(VISU_UI_PANEL_ELEMENTS)); if (!dataObj) return; g_signal_emit_by_name(G_OBJECT(dataObj), "RenderingChanged", (VisuElement*)0, NULL); VISU_REDRAW_ADD; } static void onPolicyAtomicChanged(GtkToggleButton *toggle, gpointer data _U_) { VisuData *dataObj; gboolean atomic; g_object_set(G_OBJECT(visu_rendering_getByName(VISU_RENDERING_SPIN_NAME)), "use-atomic", gtk_toggle_button_get_active(toggle), NULL); atomic = (gtk_toggle_button_get_active(toggle) || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioAtomicSpin))); gtk_widget_set_sensitive(expandAtomic, atomic); gtk_expander_set_expanded(GTK_EXPANDER(expandAtomic), atomic); if (atomic) gtk_widget_hide(labelAtomic); else gtk_widget_show(labelAtomic); dataObj = visu_ui_panel_getData(VISU_UI_PANEL(VISU_UI_PANEL_ELEMENTS)); if (!dataObj) return; g_signal_emit_by_name(G_OBJECT(dataObj), "ElementRenderingChanged", (VisuElement*)0, NULL); g_signal_emit_by_name(G_OBJECT(dataObj), "RenderingChanged", (VisuElement*)0, NULL); VISU_REDRAW_ADD; } static void onPolicyModulusChanged(GtkToggleButton *toggle, gpointer data) { VisuData *dataObj; VisuRenderingSpinModulusPolicy modPol; if ((VisuRenderingSpinModulusPolicy)data == VISU_RENDERING_SPIN_CONSTANT) { if (!gtk_toggle_button_get_active(toggle)) modPol = VISU_RENDERING_SPIN_CONSTANT; else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioPerTypeMod))) modPol = VISU_RENDERING_SPIN_PER_TYPE; else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioGlobalMod))) modPol = VISU_RENDERING_SPIN_GLOBAL; else modPol = VISU_RENDERING_SPIN_CONSTANT; gtk_widget_set_sensitive(radioGlobalMod, gtk_toggle_button_get_active(toggle)); gtk_widget_set_sensitive(radioPerTypeMod, gtk_toggle_button_get_active(toggle)); } else { if (!gtk_toggle_button_get_active(toggle)) return; modPol = (VisuRenderingSpinModulusPolicy)data; } g_object_set(G_OBJECT(visu_rendering_getByName(VISU_RENDERING_SPIN_NAME)), "modulus-scaling", modPol, NULL); dataObj = visu_ui_panel_getData(VISU_UI_PANEL(VISU_UI_PANEL_ELEMENTS)); if (!dataObj) return; g_signal_emit_by_name(G_OBJECT(dataObj), "ElementRenderingChanged", (VisuElement*)0, NULL); g_signal_emit_by_name(G_OBJECT(dataObj), "RenderingChanged", (VisuElement*)0, NULL); VISU_REDRAW_ADD; } /* Initialise the gtk methods associated with the spin rendering method. */ void visu_ui_panel_elements_spin_initOpen() { visu_ui_setRenderingSpecificMethod(visu_rendering_getByName (VISU_RENDERING_SPIN_NAME), gtkSpinCreate_fileChooser); } /* Creates a custom file chooser which allows the user to select a spin and a position file */ static gboolean gtkSpinCreate_fileChooser(VisuData *data, GtkWindow *parent) { GtkWidget *fileSelection; GList *lst, *tmpLst; const GList *tmpLst2; GtkWidget *vbox, *wd; gchar* directory; GtkFileFilter *filterPos, *filterSpin, *filterAll; GtkWidget *table, *hbox, *align; GtkWidget *label, *button; GtkWidget *labelPosition, *labelSpin; GtkWidget *radioPosition, *radioSpin; GtkWidget *hiding_mode; struct FileChooserSpin_struct fileChooserSpin; gint status; VisuRendering *spin; #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkTooltips *tooltips; tooltips = gtk_tooltips_new (); #endif if (!data) return 0; fileSelection = gtk_file_chooser_dialog_new(_("Load session"), GTK_WINDOW(parent), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); directory = visu_ui_getLastOpenDirectory(); if (directory) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(fileSelection), directory); gtk_widget_set_name(fileSelection, "filesel"); gtk_window_set_position(GTK_WINDOW(fileSelection), GTK_WIN_POS_CENTER_ON_PARENT); gtk_window_set_modal(GTK_WINDOW(fileSelection), TRUE); spin = visu_rendering_getByName(VISU_RENDERING_SPIN_NAME); DBG_fprintf(stderr, "Gtk Spin: filter for position.\n"); filterPos = gtk_file_filter_new (); lst = visu_rendering_getFileFormat(spin, FILE_KIND_POSITION); for (tmpLst = lst; tmpLst; tmpLst = g_list_next(tmpLst)) for (tmpLst2 = tool_file_format_getFilePatterns((ToolFileFormat*)tmpLst->data); tmpLst2; tmpLst2 = g_list_next(tmpLst2)) { DBG_fprintf(stderr, " | add pattern '%s'.\n", (char*)tmpLst2->data); gtk_file_filter_add_pattern (filterPos, (char*)tmpLst2->data); } g_list_free(lst); gtk_file_filter_set_name(filterPos, visu_rendering_getFileTypeName (spin, FILE_KIND_POSITION)); DBG_fprintf(stderr, "Gtk Spin: filter for spin.\n"); filterSpin = gtk_file_filter_new (); lst = visu_rendering_getFileFormat(spin, FILE_KIND_SPIN); for (tmpLst = lst; tmpLst; tmpLst = g_list_next(tmpLst)) for (tmpLst2 = tool_file_format_getFilePatterns((ToolFileFormat*)tmpLst->data); tmpLst2; tmpLst2 = g_list_next(tmpLst2)) { DBG_fprintf(stderr, " | add pattern '%s'.\n", (char*)tmpLst2->data); gtk_file_filter_add_pattern (filterSpin, (char*)tmpLst2->data); } g_list_free(lst); gtk_file_filter_set_name(filterSpin, visu_rendering_getFileTypeName(spin, FILE_KIND_SPIN)); filterAll = gtk_file_filter_new (); gtk_file_filter_add_pattern (filterAll, "*"); gtk_file_filter_set_name(filterAll, _("All files")); /* g_signal_connect(G_OBJECT(fileSelection), "file-activated", */ /* G_CALLBACK(fileSelectedForSpinMethod), (gpointer)&fileChooserSpin); */ gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(fileSelection), filterPos); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(fileSelection), filterSpin); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(fileSelection), filterAll); gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(fileSelection), filterPos); /* The preview widget. */ visu_ui_preview_add(&fileChooserSpin.preview, GTK_FILE_CHOOSER(fileSelection)); g_signal_connect(GTK_FILE_CHOOSER(fileSelection), "update-preview", G_CALLBACK(fileUpdatePreview), &fileChooserSpin); /* The additional widgets. */ vbox = gtk_vbox_new(FALSE, 0); gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(fileSelection), vbox); label = gtk_label_new(_("Selected files are used for:")); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_widget_set_name(label, "label_head_2"); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 2); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 2); /* The table for the two file types selections (spin & position). */ table = gtk_table_new(2, 4, FALSE); gtk_box_pack_start(GTK_BOX(hbox), table, TRUE, TRUE, 2); /* Position button. */ align = gtk_alignment_new(0., 1.0, 1., 0.); radioPosition = gtk_radio_button_new_with_label(NULL, _("position")); gtk_container_add(GTK_CONTAINER(align), radioPosition); gtk_table_attach(GTK_TABLE(table), align, 0, 1, 0, 1, GTK_FILL, GTK_SHRINK, 2, 0); g_signal_connect(G_OBJECT(radioPosition), "toggled", G_CALLBACK(fileKindChangedForPosition), (gpointer)&fileChooserSpin); /* Spin button */ align = gtk_alignment_new(0., 1.0, 1., 0.); radioSpin = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(radioPosition), _("spin")); gtk_container_add(GTK_CONTAINER(align), radioSpin); gtk_table_attach(GTK_TABLE(table), align, 0, 1, 1, 2, GTK_FILL, GTK_SHRINK, 2, 0); g_signal_connect(G_OBJECT(radioSpin), "toggled", G_CALLBACK(fileKindChangedForSpin), (gpointer)&fileChooserSpin); /* Layout labels */ label = gtk_label_new(":"); gtk_table_attach(GTK_TABLE(table), label, 2, 3, 0, 1, GTK_SHRINK, GTK_SHRINK, 5, 0); label = gtk_label_new(":"); gtk_table_attach(GTK_TABLE(table), label, 2, 3, 1, 2, GTK_SHRINK, GTK_SHRINK, 5, 0); labelPosition = gtk_label_new(_("None")); gtk_misc_set_alignment(GTK_MISC(labelPosition), 0., 0.5); gtk_table_attach(GTK_TABLE(table), labelPosition, 3, 4, 0, 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 2, 0); labelSpin = gtk_label_new(_("None")); gtk_misc_set_alignment(GTK_MISC(labelSpin), 0., 0.5); gtk_table_attach(GTK_TABLE(table), labelSpin, 3, 4, 1, 2, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 2, 0); button = gtk_button_new(); gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); wd = gtk_image_new_from_stock(GTK_STOCK_APPLY, GTK_ICON_SIZE_MENU); gtk_container_add(GTK_CONTAINER(button), wd); gtk_table_attach(GTK_TABLE(table), button, 1, 2, 0, 1, GTK_SHRINK, GTK_SHRINK, 10, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(onFileSelected), (gpointer)&fileChooserSpin); gtk_widget_set_tooltip_text(button, _("Set the selected file as position to load.")); fileChooserSpin.apply[0] = button; button = gtk_button_new(); gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); wd = gtk_image_new_from_stock(GTK_STOCK_APPLY, GTK_ICON_SIZE_MENU); gtk_container_add(GTK_CONTAINER(button), wd); gtk_table_attach(GTK_TABLE(table), button, 1, 2, 1, 2, GTK_SHRINK, GTK_SHRINK, 10, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(onFileSelected), (gpointer)&fileChooserSpin); gtk_widget_set_tooltip_text(button, _("Set the selected file as spin to load.")); gtk_widget_set_sensitive(button, FALSE); fileChooserSpin.apply[1] = button; /* Hiding mode button */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 2); label = gtk_label_new(LABEL_SPIN_POLICY); gtk_widget_set_name(label, "label_head_2"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2); hiding_mode = createHidingModeRadioWidgets(); gtk_box_pack_start(GTK_BOX(hbox), hiding_mode, FALSE, FALSE, 2); gtk_widget_show_all(vbox); /* frame = gtk_frame_new(NULL); */ /* gtk_widget_show (frame); */ /* gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), frame, TRUE, TRUE, 0); */ /* label = gtk_label_new(_("The spin method uses 2 files: one stores the position and the other is used for the spin orientation. These two files are required to render a spin configurations. Either position or spin file can be kept between two views if they have the same number of nodes.")); */ /* gtk_widget_show(label); */ /* gtk_container_add(GTK_CONTAINER(frame), label); */ /* gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); */ /* gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); */ /* gtk_misc_set_padding(GTK_MISC(label), 5, 5); */ /* hbox = gtk_hbox_new(FALSE, 0); */ /* gtk_widget_show(hbox); */ /* gtk_frame_set_label_widget(GTK_FRAME(frame), hbox); */ /* image = gtk_image_new_from_stock(GTK_STOCK_HELP, GTK_ICON_SIZE_SMALL_TOOLBAR); */ /* gtk_widget_show(image); */ /* gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); */ /* label = gtk_label_new (_("Help")); */ /* gtk_widget_show(label); */ /* gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); */ fileChooserSpin.label[FILE_KIND_POSITION] = GTK_LABEL(labelPosition); fileChooserSpin.label[FILE_KIND_SPIN] = GTK_LABEL(labelSpin); fileChooserSpin.radio[FILE_KIND_POSITION] = GTK_RADIO_BUTTON(radioPosition); fileChooserSpin.radio[FILE_KIND_SPIN] = GTK_RADIO_BUTTON(radioSpin); fileChooserSpin.fileChooserDialog = GTK_FILE_CHOOSER_DIALOG(fileSelection); fileChooserSpin.fileKind = FILE_KIND_POSITION; fileChooserSpin.files[FILE_KIND_POSITION] = (gchar*)0; fileChooserSpin.files[FILE_KIND_SPIN] = (gchar*)0; do { status = gtk_dialog_run(GTK_DIALOG(fileSelection)); if (status != GTK_RESPONSE_OK) { if (fileChooserSpin.files[FILE_KIND_POSITION]) g_free(fileChooserSpin.files[FILE_KIND_POSITION]); if (fileChooserSpin.files[FILE_KIND_SPIN]) g_free(fileChooserSpin.files[FILE_KIND_SPIN]); gtk_widget_destroy(fileSelection); return FALSE; } else { DBG_fprintf(stderr, "Gtk Spin: get response OK.\n"); fileSelected(&fileChooserSpin); if (fileChooserSpin.files[FILE_KIND_POSITION] && fileChooserSpin.files[FILE_KIND_SPIN]) { visu_data_addFile(data, fileChooserSpin.files[FILE_KIND_POSITION], FILE_KIND_POSITION, (ToolFileFormat*)0); visu_data_addFile(data, fileChooserSpin.files[FILE_KIND_SPIN], FILE_KIND_SPIN, (ToolFileFormat*)0); g_free(fileChooserSpin.files[FILE_KIND_POSITION]); g_free(fileChooserSpin.files[FILE_KIND_SPIN]); directory = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER(fileSelection)); visu_ui_setLastOpenDirectory((char*)directory, VISU_UI_DIR_FILE); g_free(directory); gtk_widget_destroy(fileSelection); return TRUE; } } } while (TRUE); return FALSE; } static gboolean fileSelected(struct FileChooserSpin_struct *values) { gchar *filename = NULL, *filenameUTF8; gchar *message; filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(values->fileChooserDialog)); if (!filename) return FALSE; if (!g_file_test(filename, G_FILE_TEST_IS_DIR)) { DBG_fprintf(stderr, "Gtk Spin: select '%s' as file %d\n", filename, values->fileKind); if (values->files[values->fileKind]) g_free(values->files[values->fileKind]); /* filename is not freed here, it will be later. */ values->files[values->fileKind] = filename; filenameUTF8 = g_filename_to_utf8(filename, -1, NULL, NULL, NULL); g_return_val_if_fail(filenameUTF8, TRUE); if (g_utf8_strlen(filenameUTF8, 51) > 50) message = g_strdup_printf("(...)%s", g_utf8_offset_to_pointer (filenameUTF8, g_utf8_strlen(filenameUTF8, -1) - 50)); else message = g_strdup(filenameUTF8); gtk_label_set_text(values->label[values->fileKind], message); g_free(message); g_free(filenameUTF8); if (values->fileKind == FILE_KIND_POSITION) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(values->radio[FILE_KIND_SPIN]), TRUE); else if (values->fileKind == FILE_KIND_SPIN) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(values->radio[FILE_KIND_POSITION]), TRUE); DBG_fprintf(stderr, "Gtk Spin: interface updated after selection.\n"); return TRUE; /* if (values->files[FILE_KIND_POSITION] && values->files[FILE_KIND_SPIN]) */ /* { */ /* DBG_fprintf(stderr, "Gtk Spin: emit response OK.\n"); */ /* gtk_dialog_response(GTK_DIALOG(values->fileChooserDialog), GTK_RESPONSE_OK); */ /* } */ } g_free(filename); return FALSE; } static void onFileSelected(GtkButton *button _U_, gpointer data) { fileSelected((struct FileChooserSpin_struct*)data); } static void fileUpdatePreview(GtkFileChooser *chooser, struct FileChooserSpin_struct *fileChooserSpin) { const char *filenames[3]; if (fileChooserSpin->files[FILE_KIND_POSITION]) filenames[0] = g_strdup(fileChooserSpin->files[FILE_KIND_POSITION]); else filenames[0] = gtk_file_chooser_get_preview_filename(chooser); if (fileChooserSpin->files[FILE_KIND_POSITION] && !fileChooserSpin->files[FILE_KIND_SPIN]) filenames[1] = gtk_file_chooser_get_preview_filename(chooser); else if (fileChooserSpin->files[FILE_KIND_SPIN]) filenames[1] = g_strdup(fileChooserSpin->files[FILE_KIND_SPIN]); else filenames[1] = (char*)0; filenames[2] = (char*)0; DBG_fprintf(stderr, "Gtk Spin: update preview with %s %s.\n", filenames[0], filenames[1]); /* We test if the selected filename is a directory or not. */ if (filenames[0] && !g_file_test(filenames[0], G_FILE_TEST_IS_DIR) && filenames[1] && !g_file_test(filenames[1], G_FILE_TEST_IS_DIR)) visu_ui_preview_update(&fileChooserSpin->preview, filenames); if (filenames[0]) g_free((gchar*)filenames[0]); if (filenames[1]) g_free((gchar*)filenames[1]); } static void fileKindChangedForPosition(GtkToggleButton *button, gpointer data) { struct FileChooserSpin_struct* param = data; GSList *tmpLst; if (!gtk_toggle_button_get_active(button)) return; tmpLst = gtk_file_chooser_list_filters(GTK_FILE_CHOOSER(param->fileChooserDialog)); gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(param->fileChooserDialog), (GtkFileFilter*)(tmpLst->data)); param->fileKind = FILE_KIND_POSITION; gtk_widget_set_sensitive(param->apply[0], TRUE); gtk_widget_set_sensitive(param->apply[1], FALSE); if (param->files[0]) gtk_file_chooser_select_filename(GTK_FILE_CHOOSER(param->fileChooserDialog), param->files[0]); } static void fileKindChangedForSpin(GtkToggleButton *button, gpointer data) { struct FileChooserSpin_struct* param = data; GSList *tmpLst; if (!gtk_toggle_button_get_active(button)) return; tmpLst = gtk_file_chooser_list_filters(GTK_FILE_CHOOSER(param->fileChooserDialog)); gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(param->fileChooserDialog), (GtkFileFilter*)(tmpLst->next->data)); param->fileKind = FILE_KIND_SPIN; gtk_widget_set_sensitive(param->apply[1], TRUE); gtk_widget_set_sensitive(param->apply[0], FALSE); if (param->files[1]) gtk_file_chooser_select_filename(GTK_FILE_CHOOSER(param->fileChooserDialog), param->files[1]); } /* Create the gtk widgets (a hbox with a spin with positive values) and return it. */ GtkWidget* createGtkInterfaceForSpinMethod() { GtkWidget* hbox[7], *vbox, *label, *vboxAtomic; GtkWidget* shapeLabel, *hLabel, *rhLabel, *lLabel, *rlLabel, *ratioLabel, *lengthLabel; int i, j = 0; VisuRenderingSpinDrawingPolicy hide; gboolean atomic, useAt; VisuRendering *spin; vbox = gtk_vbox_new(FALSE, 0); for(i=0; i<7; i++) hbox[i] = gtk_hbox_new(FALSE, 0); vboxArrowShape = gtk_vbox_new(FALSE, 0); gtk_widget_show(vboxArrowShape); for(i=2; i<5; i++) { gtk_box_pack_start(GTK_BOX(vboxArrowShape), hbox[i], FALSE, FALSE, 2); gtk_widget_show(hbox[i]); } vboxElipsoidShape = gtk_vbox_new(FALSE, 0); for(i=5; i<7; i++) { gtk_box_pack_start(GTK_BOX(vboxElipsoidShape), hbox[i], FALSE, FALSE, 2); gtk_widget_show(hbox[i]); } /* Labels creation */ shapeLabel = gtk_label_new(""); gtk_label_set_markup(GTK_LABEL(shapeLabel), _("Spin shape:")); gtk_misc_set_alignment(GTK_MISC(shapeLabel), 0., 0.5); gtk_misc_set_padding(GTK_MISC(shapeLabel), 10, 0); gtk_widget_show(shapeLabel); labelSizeProp = gtk_label_new(""); gtk_label_set_markup(GTK_LABEL(labelSizeProp), LABEL_ARROW_SIZE); gtk_misc_set_alignment(GTK_MISC(labelSizeProp), 0., 0.5); gtk_misc_set_padding(GTK_MISC(labelSizeProp), 10, 0); gtk_widget_show(labelSizeProp); /* Size labels. */ hLabel = gtk_label_new(_("Hat length:")); gtk_misc_set_alignment(GTK_MISC(hLabel), 1.0, 0.5); gtk_widget_show(hLabel); rhLabel = gtk_label_new(_("Tail length:")); gtk_misc_set_alignment(GTK_MISC(rhLabel), 1.0, 0.5); gtk_widget_show(rhLabel); lLabel = gtk_label_new(_("Hat radius:")); gtk_misc_set_alignment(GTK_MISC(lLabel), 1.0, 0.5); gtk_widget_show(lLabel); rlLabel = gtk_label_new(_("Tail radius:")); gtk_misc_set_alignment(GTK_MISC(rlLabel), 1.0, 0.5); gtk_widget_show(rlLabel); /* Spin buttons creation */ heightResourceSpin = gtk_spin_button_new_with_range(0, 9, 0.05); element_callback_ids[0] = g_signal_connect((gpointer)heightResourceSpin, "value-changed", G_CALLBACK(element_resource_callback), GINT_TO_POINTER(VISU_RENDERING_SPIN_HAT_RADIUS)); gtk_widget_show(heightResourceSpin); rheightResourceSpin = gtk_spin_button_new_with_range(0, 9, 0.05); element_callback_ids[1] = g_signal_connect((gpointer)rheightResourceSpin, "value-changed", G_CALLBACK(element_resource_callback), GINT_TO_POINTER(VISU_RENDERING_SPIN_TAIL_RADIUS)); gtk_widget_show(rheightResourceSpin); lengthResourceSpin = gtk_spin_button_new_with_range(0, 9, 0.05); element_callback_ids[2] = g_signal_connect((gpointer)lengthResourceSpin, "value-changed", G_CALLBACK(element_resource_callback), GINT_TO_POINTER(VISU_RENDERING_SPIN_HAT_LENGTH)); gtk_widget_show(lengthResourceSpin); rlengthResourceSpin = gtk_spin_button_new_with_range(0, 9, 0.05); element_callback_ids[3] = g_signal_connect((gpointer)rlengthResourceSpin, "value-changed", G_CALLBACK(element_resource_callback), GINT_TO_POINTER(spin_VISU_RENDERING_SPIN_TAIL_LENGTH)); gtk_widget_show(rlengthResourceSpin); /* Check box creation */ label = gtk_label_new(_("Use element color on:")); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_widget_show(label); gtkw_use_element_color = gtk_check_button_new_with_label(_(" tail")); element_callback_ids[4] = g_signal_connect(gtkw_use_element_color, "toggled", G_CALLBACK(element_resource_callback), GINT_TO_POINTER(VISU_RENDERING_SPIN_TAIL_COLOR)); gtk_widget_show(gtkw_use_element_color); gtkw_use_element_color_hat = gtk_check_button_new_with_label(_(" hat")); element_callback_ids[5] = g_signal_connect(gtkw_use_element_color_hat, "toggled", G_CALLBACK(element_resource_callback), GINT_TO_POINTER(VISU_RENDERING_SPIN_HAT_COLOR)); gtk_widget_show(gtkw_use_element_color_hat); /* Combo boxes creation */ gtkw_element_shape_number = gtk_combo_box_text_new(); for (i=0; iEnable the atomic rendering in the method tab.")); gtk_widget_show(labelAtomic); gtk_label_set_use_markup(GTK_LABEL(labelAtomic), TRUE); spin = visu_rendering_getByName(VISU_RENDERING_SPIN_NAME); g_object_get(G_OBJECT(spin), "hiding-mode", &hide, "use-atomic", &useAt, NULL); atomic = (useAt || hide == VISU_RENDERING_SPIN_ATOMIC_NULL); gtk_widget_set_sensitive(expandAtomic, atomic); gtk_expander_set_expanded(GTK_EXPANDER(expandAtomic), atomic); if (atomic) gtk_widget_hide(labelAtomic); else gtk_widget_show(labelAtomic); /* Displaying every widget created so far */ gtk_box_pack_start(GTK_BOX(hbox[j]), shapeLabel, TRUE, TRUE, 1); gtk_box_pack_start(GTK_BOX(hbox[j]), gtkw_element_shape_number, FALSE, FALSE, 3); gtk_box_pack_start(GTK_BOX(vbox), hbox[j], FALSE, FALSE, 2); gtk_widget_show(hbox[j++]); gtk_box_pack_start(GTK_BOX(hbox[j]), labelSizeProp, TRUE, TRUE, 1); gtk_box_pack_start(GTK_BOX(vbox), hbox[j], FALSE, FALSE, 2); gtk_widget_show(hbox[j++]); gtk_box_pack_start(GTK_BOX(vbox), vboxArrowShape, FALSE, FALSE, 2); gtk_box_pack_start(GTK_BOX(hbox[j]), hLabel, FALSE, FALSE, 1); gtk_box_pack_start(GTK_BOX(hbox[j]), heightResourceSpin, FALSE,FALSE, 3); gtk_box_pack_start(GTK_BOX(hbox[j]), rhLabel, TRUE, TRUE, 1); gtk_box_pack_start(GTK_BOX(hbox[j++]), rheightResourceSpin, FALSE,FALSE, 3); gtk_box_pack_start(GTK_BOX(hbox[j]), lLabel, FALSE, FALSE, 1); gtk_box_pack_start(GTK_BOX(hbox[j]), lengthResourceSpin, FALSE,FALSE, 3); gtk_box_pack_start(GTK_BOX(hbox[j]), rlLabel, TRUE, TRUE, 1); gtk_box_pack_start(GTK_BOX(hbox[j++]), rlengthResourceSpin, FALSE,FALSE, 3); gtk_box_pack_start(GTK_BOX(hbox[j]), label, TRUE, TRUE, 1); gtk_box_pack_start(GTK_BOX(hbox[j]), gtkw_use_element_color_hat, FALSE, FALSE, 1); gtk_box_pack_start(GTK_BOX(hbox[j++]), gtkw_use_element_color, FALSE, FALSE, 1); gtk_box_pack_start(GTK_BOX(vbox), vboxElipsoidShape, FALSE, FALSE, 2); gtk_box_pack_start(GTK_BOX(hbox[j]), lengthLabel, FALSE, FALSE, 1); gtk_box_pack_start(GTK_BOX(hbox[j]), lengthElipsoidSpin, FALSE,FALSE, 3); gtk_box_pack_start(GTK_BOX(hbox[j]), ratioLabel, TRUE, TRUE, 1); gtk_box_pack_start(GTK_BOX(hbox[j++]), ratioElipsoidSpin, FALSE,FALSE, 3); gtk_box_pack_start(GTK_BOX(hbox[j++]), useElementForElipsoid, FALSE, FALSE, 1); gtk_box_pack_start(GTK_BOX(vbox), expandAtomic, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), labelAtomic, FALSE, FALSE, 0); g_signal_connect(VISU_OBJECT_INSTANCE, "resourcesLoaded", G_CALLBACK(sync_local_resources), NULL); return vbox; } /* This function is called whenever the current element is changed in the gtk panel. */ static void changeSomethingSpin(GList *eleList) { VisuElement *ele; DBG_fprintf(stderr, "Gtk Spin: changing values on element change for %p.\n", (gpointer)eleList); if (!eleList) return; DBG_fprintf(stderr, "Gtk Spin: give the element change to the atomic part.\n"); visu_ui_panel_elements_atomic_onChange(eleList); ele = (VisuElement*)eleList->data; need_redraw = 0; DBG_fprintf(stderr, "Gtk Spin: change all values on element change.\n"); g_signal_handler_block (heightResourceSpin, element_callback_ids[0] ); g_signal_handler_block (rheightResourceSpin, element_callback_ids[1] ); g_signal_handler_block (lengthResourceSpin, element_callback_ids[2] ); g_signal_handler_block (rlengthResourceSpin, element_callback_ids[3] ); g_signal_handler_block (gtkw_use_element_color, element_callback_ids[4] ); g_signal_handler_block (gtkw_use_element_color_hat, element_callback_ids[5] ); /* g_signal_handler_block (gtkw_element_shape_number, element_callback_ids[6] ); */ g_signal_handler_block (ratioElipsoidSpin, element_callback_ids[7] ); g_signal_handler_block (lengthElipsoidSpin, element_callback_ids[8] ); g_signal_handler_block (useElementForElipsoid, element_callback_ids[9] ); gtk_spin_button_set_value(GTK_SPIN_BUTTON(heightResourceSpin), visu_rendering_spin_getResourceFloat(ele, VISU_RENDERING_SPIN_HAT_RADIUS)); gtk_spin_button_set_value(GTK_SPIN_BUTTON(rheightResourceSpin), visu_rendering_spin_getResourceFloat(ele, VISU_RENDERING_SPIN_TAIL_RADIUS)); gtk_spin_button_set_value(GTK_SPIN_BUTTON(lengthResourceSpin), visu_rendering_spin_getResourceFloat(ele, VISU_RENDERING_SPIN_HAT_LENGTH)); gtk_spin_button_set_value(GTK_SPIN_BUTTON(rlengthResourceSpin), visu_rendering_spin_getResourceFloat(ele, spin_VISU_RENDERING_SPIN_TAIL_LENGTH)); gtk_spin_button_set_value(GTK_SPIN_BUTTON(lengthElipsoidSpin), visu_rendering_spin_getResourceFloat(ele, VISU_RENDERING_SPIN_A_AXIS)); gtk_spin_button_set_value(GTK_SPIN_BUTTON(ratioElipsoidSpin), visu_rendering_spin_getResourceFloat(ele, VISU_RENDERING_SPIN_B_AXIS)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtkw_use_element_color), visu_rendering_spin_getResourceBoolean(ele, VISU_RENDERING_SPIN_TAIL_COLOR)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtkw_use_element_color_hat), visu_rendering_spin_getResourceBoolean(ele, VISU_RENDERING_SPIN_HAT_COLOR)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(useElementForElipsoid), visu_rendering_spin_getResourceBoolean(ele, VISU_RENDERING_SPIN_ELIPSOID_COLOR)); gtk_combo_box_set_active(GTK_COMBO_BOX(gtkw_element_shape_number), visu_rendering_spin_getResourceUint(ele, VISU_RENDERING_SPIN_SHAPE)); g_signal_handler_unblock (heightResourceSpin, element_callback_ids[0] ); g_signal_handler_unblock (rheightResourceSpin, element_callback_ids[1] ); g_signal_handler_unblock (lengthResourceSpin, element_callback_ids[2] ); g_signal_handler_unblock (rlengthResourceSpin, element_callback_ids[3] ); g_signal_handler_unblock (gtkw_use_element_color, element_callback_ids[4] ); g_signal_handler_unblock (gtkw_use_element_color_hat, element_callback_ids[5] ); /* g_signal_handler_unblock (gtkw_element_shape_number, element_callback_ids[6] ); */ g_signal_handler_unblock (ratioElipsoidSpin, element_callback_ids[7] ); g_signal_handler_unblock (lengthElipsoidSpin, element_callback_ids[8] ); g_signal_handler_unblock (useElementForElipsoid, element_callback_ids[9] ); need_redraw = 1; } /* This is the callback func for each element resource. */ void element_resource_callback(GtkWidget* widget, gpointer data) { gboolean refresh; GList *tmpLst, *eleList; VisuElement *ele; VisuRenderingSpinResources property; gboolean new_bool; guint new_int; float new_float; VisuData *dataObj; eleList = visu_ui_panel_elements_getSelected(); if (!eleList) return; property = GPOINTER_TO_INT(data); refresh = FALSE; for (tmpLst = eleList; tmpLst; tmpLst = g_list_next(tmpLst)) { ele = (VisuElement*)tmpLst->data; switch (property) { case VISU_RENDERING_SPIN_HAT_COLOR: case VISU_RENDERING_SPIN_TAIL_COLOR: case VISU_RENDERING_SPIN_ELIPSOID_COLOR: new_bool = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); DBG_fprintf(stderr, "GtkSpin : Set element '%d' property to %d\n", property, new_bool); refresh = visu_rendering_spin_setResourceBoolean(ele, property, new_bool) || refresh; break; case VISU_RENDERING_SPIN_SHAPE: new_int = (guint)gtk_combo_box_get_active(GTK_COMBO_BOX(widget)); DBG_fprintf(stderr, "GtkSpin : Set element '%d' property to %d\n", property, new_int); refresh = visu_rendering_spin_setResourceUint(ele, property, new_int) || refresh; if (new_int == VISU_RENDERING_SPIN_ELLIPSOID || new_int == VISU_RENDERING_SPIN_TORUS) { gtk_widget_show(vboxElipsoidShape); gtk_widget_hide(vboxArrowShape); } else { gtk_widget_hide(vboxElipsoidShape); gtk_widget_show(vboxArrowShape); } break; case VISU_RENDERING_SPIN_HAT_LENGTH: case VISU_RENDERING_SPIN_HAT_RADIUS: case spin_VISU_RENDERING_SPIN_TAIL_LENGTH: case VISU_RENDERING_SPIN_TAIL_RADIUS: case VISU_RENDERING_SPIN_A_AXIS: case VISU_RENDERING_SPIN_B_AXIS: new_float = gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget)); DBG_fprintf(stderr, "GtkSpin : Set element '%d' property to %f\n", property, new_float); refresh = visu_rendering_spin_setResourceFloat(ele, property, new_float) || refresh; break; default: g_warning("Unknown property '%d' in callback for spin element values.", property); return; } } if(need_redraw && refresh) { dataObj = visu_ui_panel_getData(VISU_UI_PANEL(VISU_UI_PANEL_ELEMENTS)); if (!dataObj) return; for(tmpLst = eleList; tmpLst; tmpLst = g_list_next(tmpLst)) { g_signal_emit_by_name(G_OBJECT(dataObj), "ElementRenderingChanged", (VisuElement*)tmpLst->data, NULL); g_signal_emit_by_name(G_OBJECT(dataObj), "RenderingChanged", (VisuElement*)tmpLst->data, NULL); } VISU_REDRAW_ADD; } g_list_free(eleList); } /* This is the callback func for each global resource. */ void global_resource_callback(GtkWidget* button, gpointer data) { int value; VisuData *dataObj; VisuRendering *spin; value = GPOINTER_TO_INT(data); if (value >= 0) { spin = visu_rendering_getByName(VISU_RENDERING_SPIN_NAME); switch (value) { case 0: g_object_set(G_OBJECT(spin), "cone-theta", gtk_spin_button_get_value(GTK_SPIN_BUTTON(button)), NULL); break; case 1: g_object_set(G_OBJECT(spin), "cone-phi", gtk_spin_button_get_value(GTK_SPIN_BUTTON(button)), NULL); break; case 2: g_object_set(G_OBJECT(spin), "cone-omega", gtk_spin_button_get_value(GTK_SPIN_BUTTON(button)), NULL); break; default: g_warning("Unknown property '%d' in callback for spin global values.", value); return; } if(need_redraw) { float spherical[3]; float cartesian[3]; int i; need_redraw = 0; spherical[0] = 1; g_object_get(G_OBJECT(spin), "cone-theta", spherical + 1, "cone-phi", spherical + 2, NULL); tool_matrix_sphericalToCartesian(cartesian, spherical); for(i=0; i<3; i++) if(cartesian[i] < 0.01 && cartesian [i] > -0.01) cartesian[i] = 0; gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtkw_x), cartesian[0]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtkw_y), cartesian[1]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtkw_z), cartesian[2]); need_redraw = 1; } } else { float cartesian[3]; float spherical[3]; float x = (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(gtkw_x)); float y = (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(gtkw_y)); float z = (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(gtkw_z)); if(need_redraw) { need_redraw = 0; cartesian[0] = x; cartesian[1] = y; cartesian[2] = z; tool_matrix_cartesianToSpherical(spherical, cartesian); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtkw_cone_theta_angle), spherical[1]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtkw_cone_phi_angle), spherical[2]); need_redraw = 1; } } if(need_redraw == 1) { dataObj = visu_ui_panel_getData(VISU_UI_PANEL(VISU_UI_PANEL_ELEMENTS)); if (!dataObj) return; g_signal_emit_by_name(G_OBJECT(dataObj), "RenderingChanged", (VisuElement*)0, NULL); VISU_REDRAW_ADD; } } void set_view(GtkWidget* button _U_, gpointer data _U_) { float theta; float phi; VisuData *dataObj; VisuGlView *view; dataObj = visu_ui_panel_getData(VISU_UI_PANEL(VISU_UI_PANEL_ELEMENTS)); view = visu_ui_panel_getView(VISU_UI_PANEL(VISU_UI_PANEL_ELEMENTS)); if (!dataObj || !view) return; theta = tool_modulo_float(view->camera->theta, 360); if(theta > 180) theta = 360 - theta; phi = tool_modulo_float(view->camera->phi, 360); need_redraw = 0; gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtkw_cone_theta_angle), theta); need_redraw = 1; gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtkw_cone_phi_angle), phi); } static void sync_global_resources(GObject *object _U_, VisuData *dataObj _U_, gpointer data _U_) { float spherical[3], cartesian[3], wheel; int i; DBG_fprintf(stderr, "Gtk Spin: caught the 'resourcesLoaded' signal.\n"); if(gtkw_cone_theta_angle == NULL) return; spherical[0] = 1; g_object_get(G_OBJECT(visu_rendering_getByName(VISU_RENDERING_SPIN_NAME)), "cone-theta", spherical + 1, "cone-phi", spherical + 2, "cone-omega", &wheel, NULL); tool_matrix_sphericalToCartesian(cartesian, spherical); for(i=0; i<3; i++) if(cartesian[i] < 0.01 && cartesian [i] > -0.01) cartesian[i] = 0; need_redraw = 0; gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtkw_x), cartesian[0]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtkw_y), cartesian[1]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtkw_z), cartesian[2]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtkw_cone_theta_angle), spherical[1]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtkw_cone_phi_angle), spherical[2]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtkw_color_wheel_angle), wheel); need_redraw = 1; } static void sync_local_resources(GObject *trash _U_, gpointer data _U_) { GList *eleList; VisuElement *ele; if(heightResourceSpin == NULL) return; eleList = visu_ui_panel_elements_getSelected(); if (!eleList) return; ele = (VisuElement*)eleList->data; g_list_free(eleList); need_redraw = 0; gtk_spin_button_set_value(GTK_SPIN_BUTTON(heightResourceSpin), visu_rendering_spin_getResourceFloat(ele, VISU_RENDERING_SPIN_HAT_RADIUS)); gtk_spin_button_set_value(GTK_SPIN_BUTTON(rheightResourceSpin), visu_rendering_spin_getResourceFloat(ele, VISU_RENDERING_SPIN_TAIL_RADIUS)); gtk_spin_button_set_value(GTK_SPIN_BUTTON(lengthResourceSpin), visu_rendering_spin_getResourceFloat(ele, VISU_RENDERING_SPIN_HAT_LENGTH)); gtk_spin_button_set_value(GTK_SPIN_BUTTON(rlengthResourceSpin), visu_rendering_spin_getResourceFloat(ele, spin_VISU_RENDERING_SPIN_TAIL_LENGTH)); gtk_spin_button_set_value(GTK_SPIN_BUTTON(lengthElipsoidSpin), visu_rendering_spin_getResourceFloat(ele, VISU_RENDERING_SPIN_A_AXIS)); gtk_spin_button_set_value(GTK_SPIN_BUTTON(ratioElipsoidSpin), visu_rendering_spin_getResourceFloat(ele, VISU_RENDERING_SPIN_B_AXIS)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtkw_use_element_color), visu_rendering_spin_getResourceBoolean(ele, VISU_RENDERING_SPIN_TAIL_COLOR)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtkw_use_element_color_hat), visu_rendering_spin_getResourceBoolean(ele, VISU_RENDERING_SPIN_HAT_COLOR)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(useElementForElipsoid), visu_rendering_spin_getResourceBoolean(ele, VISU_RENDERING_SPIN_ELIPSOID_COLOR)); gtk_combo_box_set_active(GTK_COMBO_BOX(gtkw_element_shape_number), visu_rendering_spin_getResourceUint(ele, VISU_RENDERING_SPIN_SHAPE)); need_redraw = 1; } v_sim-3.7.0/src/panelModules/gtkSpin.h0000644000353400050620000000471412215546064014603 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD, Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2005) Adresses ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD and Damien CALISTE and Olivier D'Astier, laboratoire L_Sim, (2001-2005) E-mail addresses : BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef SPIN_GTK_H #define SPIN_GTK_H #include /** * visu_ui_panel_elements_spin_init: (skip) * * Initialise the specific area in the element panel * for the atomic rendering method. * **/ void visu_ui_panel_elements_spin_init(); /** * visu_ui_panel_elements_spin_initOpen: (skip) * * Initialise the gtk methods associated with * the spin rendering method. * **/ void visu_ui_panel_elements_spin_initOpen(); /** * visu_ui_panel_elements_spin_initMethod: (skip) * * Initialise the specific area in the config panel * for the spin rendering method. */ void visu_ui_panel_elements_spin_initMethod(); #endif v_sim-3.7.0/src/panelModules/panelConfig.c0000644000353400050620000006032012215546064015377 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "panelConfig.h" #include #include #include #include #include #include #include /** * SECTION: panelConfig * @short_description: The tab where miscellaneous options are setup. * * Nothing special here. */ #define FLAG_PARAMETER_TABVIEW_CONFIG "config_subPanelTabView" #define FLAG_PARAMETER_SKIN_CONFIG "config_skin" #define FLAG_PARAMETER_REFRESH_CONFIG "config_refreshIsOn" #define FLAG_PARAMETER_PERIOD_CONFIG "config_refreshPeriod" #define DESC_PARAMETER_TABVIEW_CONFIG "See or not the labels on tabs ; boolean 0 or 1" #define DESC_PARAMETER_SKIN_CONFIG "Path to a gtkrc file ; chain" #define DESC_PARAMETER_REFRESH_CONFIG "When on V_Sim reloads the file at periodic time ; boolean 0 or 1" #define DESC_PARAMETER_PERIOD_CONFIG "The period of reloading in ms ; integer (10 < v < 10000)" #define PARAMETER_CONFIG_TABVIEW_DEFAULT 0 #define PARAMETER_CONFIG_SKIN_DEFAULT "None" #define PARAMETER_CONFIG_REFRESH_DEFAULT 0 #define PARAMETER_CONFIG_PERIOD_DEFAULT 250 static gboolean config_subPanelTabView; static gchar *config_skin; static int config_refreshIsOn; static float config_refreshPeriod; static GtkWidget *comboUnit, *panelVBox; /* Private functions. */ static GtkWidget *createInteriorConfig(); static void setSkin(char* label); static gboolean automaticReload(gpointer data); /* This function details how to read the preferedNumberOfViews parameter. */ static gboolean readConfigTabView(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static gboolean readConfigSkin(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static gboolean readConfigRefresh(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static gboolean readConfigPeriod(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); /* These functions write all the element list to export there associated resources. */ static void exportParametersPanelConfig(GString *data, VisuData* dataObj, VisuGlView *view); static void onUnitChanged(GtkComboBox *combo, gpointer data); static void initPanelConfigGtkPart(); static char *defaultSkinPath, *userSkinPath; gboolean isPanelConfigInitialized; /* Specific widgets used in this panel. */ static VisuUiPanel *panelConfig; static GtkWidget *checkShowTab; static GtkWidget *checkRefreshAuto; static GtkWidget *checkStorePositions; static GtkWidget *checkRedCoord; /* Callbacks */ static void checkShowTabToggled(GtkToggleButton *button, gpointer data); static void checkRememberToggled(GtkToggleButton *button, gpointer data); static void checkRefreshToggled(GtkToggleButton *button, gpointer data); static void checkRedCoordToggled(GtkToggleButton *button, gpointer data); void entryRcFilesChanged(GtkEntry *entry, gpointer data); void directorySelectedForResources(GtkButton *button, gpointer user_data); void openRcFileSelector(GtkButton *button, gpointer data); static void onRefreshPeriodChanged(GtkSpinButton* button, gpointer data); static void onDataFocused(GObject *obj, VisuData *dataObj, gpointer data); gboolean treePathClicked(GtkWidget *widget, GdkEventButton *event, gpointer user_data); void directoryRemoveFromResources(GtkButton *button, gpointer user_data); static void onConfigEnter(VisuUiPanel *visu_ui_panel, gpointer data); /** * visu_ui_panel_config_init: (skip) * @ui: a #VisuUiMain object. * * Should be used in the list declared in externalModules.h to be loaded by * V_Sim on start-up. This routine will create the #VisuUiPanel where the configuration * stuff can be done, such as the auto-reloading. * * Returns: a newly created #VisuUiPanel object. */ VisuUiPanel* visu_ui_panel_config_init(VisuUiMain *ui) { char *cl = _("Configure the interface"); char *tl = _("Configuration"); visu_config_file_addEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_TABVIEW_CONFIG, DESC_PARAMETER_TABVIEW_CONFIG, 1, readConfigTabView); visu_config_file_addEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_SKIN_CONFIG, DESC_PARAMETER_SKIN_CONFIG, 1, readConfigSkin); visu_config_file_addEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_REFRESH_CONFIG, DESC_PARAMETER_REFRESH_CONFIG, 1, readConfigRefresh); visu_config_file_addEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_PERIOD_CONFIG, DESC_PARAMETER_PERIOD_CONFIG, 1, readConfigPeriod); visu_config_file_addExportFunction(VISU_CONFIG_FILE_PARAMETER, exportParametersPanelConfig); #if GTK_MAJOR_VERSION < 3 defaultSkinPath = g_build_filename(visu_basic_getDataDir(), "v_sim.rc", NULL); userSkinPath = g_build_filename(visu_basic_getLocalDir(), "v_sim.rc", NULL); #else defaultSkinPath = g_build_filename(visu_basic_getDataDir(), "v_sim.css", NULL); userSkinPath = g_build_filename(visu_basic_getLocalDir(), "v_sim.css", NULL); #endif config_subPanelTabView = PARAMETER_CONFIG_TABVIEW_DEFAULT; config_refreshPeriod = -1; config_refreshIsOn = -1; /* Now that everything has a value, we create the panel. */ panelConfig = VISU_UI_PANEL(visu_ui_panel_newWithIconFromStock("Panel_configuration", cl, tl, GTK_STOCK_PREFERENCES)); if (!panelConfig) return (VisuUiPanel*)0; isPanelConfigInitialized = FALSE; visu_ui_panel_config_setRefreshPeriod((VisuUiRenderingWindow*)0, PARAMETER_CONFIG_PERIOD_DEFAULT); visu_ui_panel_config_setAutomaticRefresh((VisuUiRenderingWindow*)0, PARAMETER_CONFIG_REFRESH_DEFAULT); /* Set global callbacks. */ g_signal_connect(G_OBJECT(ui), "DataFocused", G_CALLBACK(onDataFocused), (gpointer)0); g_signal_connect(G_OBJECT(panelConfig), "page-entered", G_CALLBACK(onConfigEnter), (gpointer)0); return panelConfig; } static void initPanelConfigGtkPart() { if (isPanelConfigInitialized) return; DBG_fprintf(stderr, "Panel Config : creating the config panel on demand.\n"); isPanelConfigInitialized = TRUE; panelVBox = createInteriorConfig(); gtk_container_add(GTK_CONTAINER(panelConfig), panelVBox); /* Force the callbacks to initialise the values. */ checkShowTabToggled((GtkToggleButton*)0, (gpointer)0); } static GtkWidget *createInteriorConfig() { GtkWidget *vbox; GtkWidget *hbox; GtkWidget *label; GtkWidget *spinRefresh; const gchar **units; int i; #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkTooltips *tooltips; tooltips = gtk_tooltips_new (); #endif vbox = gtk_vbox_new(FALSE, 0); checkShowTab = gtk_check_button_new_with_mnemonic(_("Always show _labels in tabs")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkShowTab), (gboolean)config_subPanelTabView); gtk_box_pack_start(GTK_BOX(vbox), checkShowTab, FALSE, FALSE, 3); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 3); checkRefreshAuto = gtk_check_button_new_with_mnemonic(_("Automatic _refresh")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkRefreshAuto), (gboolean)config_refreshIsOn); gtk_box_pack_start(GTK_BOX(hbox), checkRefreshAuto, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 3); label = gtk_label_new(_(" ms")); gtk_box_pack_end(GTK_BOX(hbox), label, FALSE, FALSE, 0); spinRefresh = gtk_spin_button_new_with_range(10., 10000., 10.); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinRefresh), config_refreshPeriod); gtk_box_pack_end(GTK_BOX(hbox), spinRefresh, FALSE, FALSE, 0); label = gtk_label_new(_("period:")); gtk_box_pack_end(GTK_BOX(hbox), label, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 3); checkStorePositions = gtk_check_button_new_with_mnemonic(_("Remember _windows positions")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkStorePositions), (gboolean)TRUE); gtk_box_pack_start(GTK_BOX(hbox), checkStorePositions, FALSE, FALSE, 0); checkRedCoord = gtk_check_button_new_with_mnemonic(_("Display _coordinates in reduce")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkRedCoord), (gboolean)visu_ui_rendering_window_class_getDisplayCoordinatesInReduce()); gtk_box_pack_start(GTK_BOX(vbox), checkRedCoord, FALSE, FALSE, 3); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 3); label = gtk_label_new(_("Set the prefered unit:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); comboUnit = gtk_combo_box_text_new(); units = tool_physic_getUnitNames(); for (i = 0; units[i]; i++) gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(comboUnit), (const gchar*)0, units[i]); gtk_combo_box_set_active(GTK_COMBO_BOX(comboUnit), visu_basic_getPreferedUnit()); g_signal_connect(G_OBJECT(comboUnit), "changed", G_CALLBACK(onUnitChanged), (gpointer)0); gtk_box_pack_start(GTK_BOX(hbox), comboUnit, FALSE, FALSE, 0); /* Set the callbacks. */ g_signal_connect(G_OBJECT(checkShowTab), "toggled", G_CALLBACK(checkShowTabToggled), (gpointer)0); g_signal_connect(G_OBJECT(checkStorePositions), "toggled", G_CALLBACK(checkRememberToggled), (gpointer)0); g_signal_connect(G_OBJECT(checkRefreshAuto), "toggled", G_CALLBACK(checkRefreshToggled), (gpointer)0); g_signal_connect(G_OBJECT(checkRedCoord), "toggled", G_CALLBACK(checkRedCoordToggled), (gpointer)0); g_signal_connect(G_OBJECT(spinRefresh), "value-changed", G_CALLBACK(onRefreshPeriodChanged), (gpointer)0); gtk_widget_show_all(vbox); return vbox; } /*************/ /* Callbacks */ /*************/ static void checkShowTabToggled(GtkToggleButton *button _U_, gpointer data _U_) { visu_ui_panel_config_setTabView(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkShowTab))); } static void checkRememberToggled(GtkToggleButton *button, gpointer data _U_) { visu_ui_main_class_setRememberPosition(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))); } static void onConfigEnter(VisuUiPanel *visu_ui_panel _U_, gpointer data _U_) { if (!isPanelConfigInitialized) initPanelConfigGtkPart(); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkStorePositions), visu_ui_main_class_getRememberPosition()); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkRedCoord), visu_ui_rendering_window_class_getDisplayCoordinatesInReduce()); } static void checkRefreshToggled(GtkToggleButton *button, gpointer data _U_) { visu_ui_panel_config_setAutomaticRefresh(visu_ui_main_class_getDefaultRendering(), gtk_toggle_button_get_active(button)); } static void checkRedCoordToggled(GtkToggleButton *button, gpointer data _U_) { visu_ui_rendering_window_class_setDisplayCoordinatesInReduce(gtk_toggle_button_get_active(button)); } static void onRefreshPeriodChanged(GtkSpinButton* button, gpointer data _U_) { visu_ui_panel_config_setRefreshPeriod(visu_ui_main_class_getDefaultRendering(), (float)gtk_spin_button_get_value(button)); } void openRcFileSelector(GtkButton *button _U_, gpointer data _U_) { } static void setSkin(char* label) { char *tmp; #if GTK_MAJOR_VERSION < 3 GtkSettings *settings; #else GError *error; GtkCssProvider *css; #endif if (!label || label[0] == '\0' || !strcmp(label, "None")) return; if (!strcmp(label, "V_Sim")) { /* We try first a skin in the user config path. */ if (g_file_test(userSkinPath, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) tmp = userSkinPath; else tmp = defaultSkinPath; } else tmp = label; /* test if the file exists or fall back on default installation path */ DBG_fprintf(stderr,"Panel Config: Reading rc file '%s' ... %d\n", tmp, g_file_test(tmp, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)); if (!g_file_test(tmp, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) return; #if GTK_MAJOR_VERSION < 3 gtk_rc_parse(tmp); DBG_fprintf(stderr, "Panel Config: get the settings.\n"); settings = gtk_settings_get_default (); gtk_rc_reparse_all_for_settings(settings, TRUE); DBG_fprintf(stderr,"Panel Config: applying RC file OK.\n"); #else css = gtk_css_provider_new(); error = (GError*)0; gtk_css_provider_load_from_path(css, tmp, &error); if (error) { g_warning("%s", error->message); g_error_free(error); } DBG_fprintf(stderr, "Panel Config: CSS file loaded.\n"); gtk_style_context_add_provider_for_screen(gdk_screen_get_default(), GTK_STYLE_PROVIDER(css), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); g_object_unref(G_OBJECT(css)); gtk_style_context_reset_widgets(gdk_screen_get_default()); #endif } void autoReloadAddTimeout(VisuData *data, guint time, gpointer user_data) { guint *timeoutId; g_return_if_fail(data); timeoutId = (guint*)g_object_get_data(G_OBJECT(data), "autoLoad_timeoutId"); if (!timeoutId) { timeoutId = g_malloc(sizeof(guint)); g_object_set_data_full(G_OBJECT(data), "autoLoad_timeoutId", (gpointer)timeoutId, g_free); *timeoutId = 0; } if (!*timeoutId) *timeoutId = visu_data_addTimeout(data, time, automaticReload, user_data); } void autoReloadRemoveTimeout(VisuData *data) { guint *timeoutId; g_return_if_fail(data); timeoutId = (guint*)g_object_get_data(G_OBJECT(data), "autoLoad_timeoutId"); if (timeoutId) { visu_data_removeTimeout(data, *timeoutId); *timeoutId = 0; } } static gboolean automaticReload(gpointer data) { struct stat statBuf; int res, iSet; const gchar *file; time_t modTime; int kind, nbKind; gboolean reloadNeeded; VisuData *dataObj; time_t *lastReadTime; DBG_fprintf(stderr, "Panel Config: automatic reload called.\n"); dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelConfig)); if (!dataObj) { DBG_fprintf(stderr, "Panel Config: automatic reload aborted, no file available.\n"); return TRUE; } lastReadTime = (time_t*)g_object_get_data(G_OBJECT(dataObj), "autoLoad_accessTime"); g_return_val_if_fail(lastReadTime, TRUE); reloadNeeded = FALSE; nbKind = visu_rendering_getNFileTypes(visu_object_getRendering(VISU_OBJECT_INSTANCE)); for (kind = 0; kind < nbKind; kind++) { file = visu_data_getFile(dataObj, kind, (ToolFileFormat**)0); if (!file) return TRUE; res = stat(file, &statBuf); if (!res) { modTime = statBuf.st_ctime; if (modTime > lastReadTime[kind]) { reloadNeeded = TRUE; lastReadTime[kind] = modTime; } } } if (reloadNeeded) { DBG_fprintf(stderr, "Panel Config: automatic reloading in progress...\n"); iSet = visu_data_getISubset(dataObj); visu_data_freePopulation(dataObj); visu_ui_rendering_window_loadFile(VISU_UI_RENDERING_WINDOW(data), dataObj, iSet); } return TRUE; } static void onDataFocused(GObject *obj _U_, VisuData *dataObj, gpointer data _U_) { struct stat statBuf; int res; const gchar *file; int kind, nbKind; time_t *lastReadTime; if (!dataObj) return; DBG_fprintf(stderr, "Panel Config: caught the 'DataFocused' signal," " set acces time for VisuData %p.\n", (gpointer)dataObj); nbKind = visu_rendering_getNFileTypes(visu_object_getRendering(VISU_OBJECT_INSTANCE)); lastReadTime = g_malloc(sizeof(time_t) * nbKind); for (kind = 0; kind < nbKind; kind++) { file = visu_data_getFile(dataObj, kind, (ToolFileFormat**)0); if (!file) lastReadTime[kind] = 0; else { res = stat(file, &statBuf); if (!res) lastReadTime[kind] = statBuf.st_ctime; else lastReadTime[kind] = 0; } } g_object_set_data_full(G_OBJECT(dataObj), "autoLoad_accessTime", lastReadTime, g_free); if (config_refreshIsOn) autoReloadAddTimeout(dataObj, config_refreshPeriod, (gpointer)visu_ui_main_class_getDefaultRendering()); } static void onUnitChanged(GtkComboBox *combo, gpointer data _U_) { visu_basic_setPreferedUnit(gtk_combo_box_get_active(combo)); } /**********************************/ /* Public method to change values */ /**********************************/ /** * visu_ui_panel_config_setTabView: * @viewed: a boolean value. * * The note can show its tabs or not. Change this with that method. */ void visu_ui_panel_config_setTabView(gboolean viewed) { DBG_fprintf(stderr,"Panel Config : toggle tab view -> %d (previously %d)\n", (int)viewed, config_subPanelTabView); if (viewed == config_subPanelTabView) return; visu_ui_panel_class_setHeaderVisibility(viewed); /* set the associated parameter. */ config_subPanelTabView = viewed; } /** * visu_ui_panel_config_setAutomaticRefresh: * @window: the #VisuUiRenderingWindow to associated the auto refresh ; * @bool: a boolean value. * * V_Sim can poll the rendered file at periodic intervals to check if the file * has been modified. If true, the file is reloaded. Turn this functionality on or off * with this method. See visu_ui_panel_config_setRefreshPeriod() to tune the period of the polling. */ void visu_ui_panel_config_setAutomaticRefresh(VisuUiRenderingWindow *window, gboolean bool) { VisuData *dataObj; DBG_fprintf(stderr, "Panel Config : set refresh to %d (previously %d).\n", bool, config_refreshIsOn); if (config_refreshIsOn == bool) return; config_refreshIsOn = bool; dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelConfig)); if (dataObj) { if (bool) autoReloadAddTimeout(dataObj, config_refreshPeriod, (gpointer)window); else autoReloadRemoveTimeout(dataObj); } } /** * visu_ui_panel_config_setRefreshPeriod: * @window: the #VisuUiRenderingWindow to associated the auto refresh ; * @val: a floating point value in milliseconds. * * V_Sim can poll the rendered file at periodic intervals. Use this method to tune * the period. See visu_ui_panel_config_setAutomaticRefresh() to enable this functionality. */ void visu_ui_panel_config_setRefreshPeriod(VisuUiRenderingWindow *window, float val) { VisuData *dataObj; DBG_fprintf(stderr, "Panel Config : set the refresh period to %f (previously %f).\n", val, config_refreshPeriod); if (config_refreshPeriod == val) return; config_refreshPeriod = val; dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelConfig)); if (dataObj && config_refreshIsOn) { DBG_fprintf(stderr, "Panel Config : stopping the callback of refresh " "to change the period.\n"); autoReloadRemoveTimeout(dataObj); autoReloadAddTimeout(dataObj, config_refreshPeriod, (gpointer)window); } } /** * visu_ui_panel_config_getArea: * * This routine can be used to extend the configure panel from plug-ins. * * Since: 3.7 * * Returns: (transfer none): a #GtkBox containing elements of the * configure panel. **/ GtkWidget* visu_ui_panel_config_getArea() { if (!isPanelConfigInitialized) initPanelConfigGtkPart(); return panelVBox; } /********************/ /* In/Out functions */ /********************/ /* This function details how to read the preferedNumberOfViews parameter. */ static gboolean readConfigTabView(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { gboolean viewed; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readBoolean(lines[0], position, &viewed, 1, error)) return FALSE; visu_ui_panel_config_setTabView(viewed); return TRUE; } static gboolean readConfigSkin(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { g_return_val_if_fail(nbLines == 1, FALSE); lines[0] = g_strstrip(lines[0]); if (!lines[0][0]) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d: 1 string value must appear" " after the %s markup.\n"), position, FLAG_PARAMETER_SKIN_CONFIG); config_skin = g_strdup(PARAMETER_CONFIG_SKIN_DEFAULT); setSkin(config_skin); return FALSE; } config_skin = g_strdup(lines[0]); setSkin(config_skin); return TRUE; } static gboolean readConfigRefresh(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { gboolean bool; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readBoolean(lines[0], position, &bool, 1, error)) return FALSE; visu_ui_panel_config_setAutomaticRefresh(visu_ui_main_class_getDefaultRendering(), bool); return TRUE; } static gboolean readConfigPeriod(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { float val; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readFloat(lines[0], position, &val, 1, error)) return FALSE; config_refreshPeriod = val; visu_ui_panel_config_setRefreshPeriod(visu_ui_main_class_getDefaultRendering(), config_refreshPeriod); return TRUE; } /* These functions write all the element list to export there associated resources. */ static void exportParametersPanelConfig(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { g_string_append_printf(data, "# %s\n", DESC_PARAMETER_TABVIEW_CONFIG); g_string_append_printf(data, "%s[gtk]: %d\n\n", FLAG_PARAMETER_TABVIEW_CONFIG, config_subPanelTabView); g_string_append_printf(data, "# %s\n", DESC_PARAMETER_SKIN_CONFIG); g_string_append_printf(data, "%s[gtk]: %s\n\n", FLAG_PARAMETER_SKIN_CONFIG, config_skin); g_string_append_printf(data, "# %s\n", DESC_PARAMETER_REFRESH_CONFIG); g_string_append_printf(data, "%s[gtk]: %d\n\n", FLAG_PARAMETER_REFRESH_CONFIG, config_refreshIsOn); g_string_append_printf(data, "# %s\n", DESC_PARAMETER_PERIOD_CONFIG); g_string_append_printf(data, "%s[gtk]: %i\n\n", FLAG_PARAMETER_PERIOD_CONFIG, (int)config_refreshPeriod); } v_sim-3.7.0/src/panelModules/panelConfig.h0000644000353400050620000000436312215546064015411 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef PANELCONFIG_H #define PANELCONFIG_H #include #include #include #include #include VisuUiPanel* visu_ui_panel_config_init(VisuUiMain *ui); void visu_ui_panel_config_setTabView(gboolean viewed); void visu_ui_panel_config_setAutomaticRefresh(VisuUiRenderingWindow *window, gboolean bool); void visu_ui_panel_config_setRefreshPeriod(VisuUiRenderingWindow *window, float val); GtkWidget* visu_ui_panel_config_getArea(); #endif v_sim-3.7.0/src/panelModules/panelOpenGL.c0000644000353400050620000007602712215546063015330 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "panelOpenGL.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /** * SECTION: panelOpenGL * @short_description: The tab where OpenGL options like lights or * quality are setup. * * Nothing tunable here. */ /* Sensitive widget in this subpanel. */ static GtkWidget *checkImmediateDrawing; static GtkWidget *comboOpenGLRendering; static GtkWidget *checkAntialiasing; static GtkWidget *checkTransparency; static GtkWidget *checkStereo; static GtkWidget *spinPrecision; static GtkWidget *spinStereoAngle; static GtkWidget *hboxStereo; static int disableCallbacksOpenGL; static GtkListStore *light_list_store; static GtkWidget *panelOpenGL; #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 static GtkListStore *renderingListStore; #endif #define OPENGL_FOLLOW_GLOBAL_RENDERING_MODE _("Follow global setting") /* Private functions. */ GtkWidget *createInteriorOpenGL(); void createCallBacksOpenGL(); /* Local callbacks. */ static void immediateDrawingCheckChanged(GtkToggleButton *button, gpointer data); static void stereoCheckChanged(GtkToggleButton *button, gpointer data); static void stereoSpinChanged(GtkSpinButton *button, gpointer data); static void antialisingCheckChanged(GtkToggleButton *button, gpointer data); static void onTransparencyChanged(GtkToggleButton *button, gpointer data); void precisionChanged(GtkButton *button, gpointer user_data); void comboOpenGLRenderingChanged(GtkComboBox *combobox, gpointer data); void addPresetOneLightClicked(GtkButton *button, gpointer data); void addPresetFourLightsClicked(GtkButton *button, gpointer data); static void selectionChanged(GtkTreeSelection *tree, gpointer data); static void addNewLightClicked(GtkButton *button, gpointer data); static void removeSelectedLightsClicked(GtkButton *button, gpointer data); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 static void renderingModeEdited(GtkCellRendererText *cellrenderertext, gchar *path, gchar *text, gpointer user_data); #endif static void onOpenGLEnter(VisuUiPanel *visu_ui_panel, gpointer data); VisuUiPanel* visu_ui_panel_gl_init(VisuUiMain *ui _U_) { char *cl = _("Set OpenGL parameters"); char *tl = _("OpenGL"); panelOpenGL = visu_ui_panel_newWithIconFromPath("Panel_opengl", cl, tl, "stock-opengl_20.png"); if (!panelOpenGL) return (VisuUiPanel*)0; gtk_container_add(GTK_CONTAINER(panelOpenGL), createInteriorOpenGL()); visu_ui_panel_setDockable(VISU_UI_PANEL(panelOpenGL), TRUE); /* Create the callbacks of all the sensitive widgets. */ createCallBacksOpenGL(); g_signal_connect(G_OBJECT(panelOpenGL), "page-entered", G_CALLBACK(onOpenGLEnter), (gpointer)0); /* Private parameters. */ disableCallbacksOpenGL = 0; hboxStereo = (GtkWidget*)0; return VISU_UI_PANEL(panelOpenGL); } enum { LIGHT_POINTER_TO, LIGHT_ENABLED, LIGHT_POSITION0, LIGHT_POSITION1, LIGHT_POSITION2, LIGHT_MULTIPLIER, LIGHT_N_PARAMETERS }; enum { RENDERING_POINTER_TO, RENDERING_NAME, RENDERING_MODE, RENDERING_N_PARAMETERS }; void light_store_in_list_store(gpointer data, gpointer user_data) { VisuGlLight *light0 = data; GtkTreeIter iter; GtkListStore *list; g_return_if_fail(user_data); list = GTK_LIST_STORE(user_data); gtk_list_store_append(list, &iter); gtk_list_store_set(list, &iter, LIGHT_POINTER_TO, (gpointer)light0, LIGHT_ENABLED, light0->enabled, LIGHT_POSITION0, light0->position[0], LIGHT_POSITION1, light0->position[1], LIGHT_POSITION2, light0->position[2], LIGHT_MULTIPLIER, light0->multiplier, -1); } void light_tree_show_hide(GtkCellRendererToggle *cell_renderer, gchar *string_path, gpointer user_data) { GtkTreePath* path = gtk_tree_path_new_from_string(string_path); GtkTreeIter iter; gboolean status; VisuGlLight *light0; GtkListStore *list; g_return_if_fail(user_data); list = GTK_LIST_STORE(user_data); if(gtk_tree_model_get_iter(GTK_TREE_MODEL(light_list_store), &iter, path) == FALSE) return; status = gtk_cell_renderer_toggle_get_active(cell_renderer) ? FALSE : TRUE; gtk_list_store_set(list, &iter, LIGHT_ENABLED, status, -1); gtk_tree_model_get(GTK_TREE_MODEL(list), &iter, LIGHT_POINTER_TO, &light0, -1); light0->enabled = status; status = visu_gl_lights_apply(visu_gl_getLights()); if (status) VISU_REDRAW_ADD; } void light_update(GtkCellRendererText *cellrenderertext _U_, gchar *path, gchar *text, gpointer user_data) { GtkTreeIter iter; float new_value = atof(text); VisuGlLight *light0; gboolean status; if(gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(light_list_store), &iter, path)) { gtk_list_store_set(light_list_store, &iter, GPOINTER_TO_INT(user_data), new_value, -1); gtk_tree_model_get(GTK_TREE_MODEL(light_list_store), &iter, LIGHT_POINTER_TO, &light0, -1); } if (GPOINTER_TO_INT(user_data) == LIGHT_MULTIPLIER) light0->multiplier = new_value; else light0->position[GPOINTER_TO_INT(user_data)-LIGHT_POSITION0] = new_value; status = visu_gl_lights_apply(visu_gl_getLights()); if (status) VISU_REDRAW_ADD; } void light_sync_lists(GtkListStore *list) { g_return_if_fail(list); gtk_list_store_clear(list); g_list_foreach(visu_gl_lights_getList(visu_gl_getLights()), light_store_in_list_store, (gpointer)list); } GtkWidget* lights_make_tree_view() { GtkTreeViewColumn* column; GtkCellRenderer *cell_show = gtk_cell_renderer_toggle_new(); GtkCellRenderer *cell_float; GtkWidget *light_tree_view; light_list_store = gtk_list_store_new(LIGHT_N_PARAMETERS, G_TYPE_POINTER, G_TYPE_BOOLEAN, G_TYPE_FLOAT, G_TYPE_FLOAT, G_TYPE_FLOAT, G_TYPE_FLOAT); light_tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(light_list_store)); light_sync_lists(light_list_store); g_signal_connect(cell_show, "toggled", G_CALLBACK(light_tree_show_hide), (gpointer)light_list_store); column = gtk_tree_view_column_new_with_attributes(_("Use"), cell_show, "active", LIGHT_ENABLED, NULL); gtk_tree_view_column_set_expand(column, FALSE); gtk_tree_view_column_set_alignment(column, 0.5); gtk_tree_view_append_column (GTK_TREE_VIEW (light_tree_view), column); cell_float = gtk_cell_renderer_text_new(); g_object_set(G_OBJECT(cell_float), "editable", TRUE, NULL); g_signal_connect(G_OBJECT(cell_float), "edited", G_CALLBACK(light_update), GINT_TO_POINTER(LIGHT_POSITION0)); column = gtk_tree_view_column_new_with_attributes(_("x"), cell_float, "text", LIGHT_POSITION0, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (light_tree_view), column); cell_float = gtk_cell_renderer_text_new(); g_object_set(G_OBJECT(cell_float), "editable", TRUE, NULL); g_signal_connect(G_OBJECT(cell_float), "edited", G_CALLBACK(light_update), GINT_TO_POINTER(LIGHT_POSITION1)); column = gtk_tree_view_column_new_with_attributes(_("y"), cell_float, "text", LIGHT_POSITION1, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (light_tree_view), column); cell_float = gtk_cell_renderer_text_new(); g_object_set(G_OBJECT(cell_float), "editable", TRUE, NULL); g_signal_connect(G_OBJECT(cell_float), "edited", G_CALLBACK(light_update), GINT_TO_POINTER(LIGHT_POSITION2)); column = gtk_tree_view_column_new_with_attributes(_("z"), cell_float, "text", LIGHT_POSITION2, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (light_tree_view), column); cell_float = gtk_cell_renderer_text_new(); g_object_set(G_OBJECT(cell_float), "editable", TRUE, NULL); g_signal_connect(G_OBJECT(cell_float), "edited", G_CALLBACK(light_update), GINT_TO_POINTER(LIGHT_MULTIPLIER)); column = gtk_tree_view_column_new_with_attributes(_("power"), cell_float, "text", LIGHT_MULTIPLIER, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (light_tree_view), column); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (light_tree_view), TRUE); gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(light_tree_view)), GTK_SELECTION_MULTIPLE); return light_tree_view; } GtkWidget* make_renderingTreeView() { #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 GtkTreeViewColumn* column; GtkCellRenderer *renderer; GtkWidget *renderingTreeView; GtkListStore *namesListStore; GtkTreeIter iter; const char** names; int i; GList *list; VisuGlRenderingMode mode; gchar *label; const char *modeName; /* Initialize the model that store the possibilities for the cellRendererComboBox. */ namesListStore = gtk_list_store_new(1, G_TYPE_STRING); gtk_list_store_append(namesListStore, &iter); gtk_list_store_set(namesListStore, &iter, 0, OPENGL_FOLLOW_GLOBAL_RENDERING_MODE, -1); names = visu_gl_rendering_getAllModeLabels(); for (i = 0; names[i]; i++) { gtk_list_store_append(namesListStore, &iter); gtk_list_store_set(namesListStore, &iter, 0, names[i], -1); } /* Initialize the model that stores the extensions. */ renderingListStore = gtk_list_store_new(RENDERING_N_PARAMETERS, G_TYPE_POINTER, G_TYPE_STRING, G_TYPE_STRING); for (list = visu_gl_ext_getAll(); list; list = g_list_next(list)) if (visu_gl_ext_getSensitiveToRenderingMode(VISU_GL_EXT(list->data))) { mode = visu_gl_ext_getPreferedRenderingMode(VISU_GL_EXT(list->data)); if (mode == VISU_GL_RENDERING_FOLLOW) modeName = OPENGL_FOLLOW_GLOBAL_RENDERING_MODE; else modeName = names[mode]; g_object_get(G_OBJECT(list->data), "label", &label, NULL); gtk_list_store_append(renderingListStore, &iter); gtk_list_store_set(renderingListStore, &iter, RENDERING_POINTER_TO, list->data, RENDERING_NAME, label, RENDERING_MODE, modeName, -1); g_free(label); } renderingTreeView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(renderingListStore)); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("name of extension"), renderer, "text", RENDERING_NAME, NULL); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_alignment(column, 0.); gtk_tree_view_append_column(GTK_TREE_VIEW(renderingTreeView), column); renderer = gtk_cell_renderer_combo_new(); g_object_set(G_OBJECT(renderer), "has-entry", FALSE, "model", namesListStore, "text-column", 0, "editable", TRUE, NULL); g_signal_connect(G_OBJECT(renderer), "edited", G_CALLBACK(renderingModeEdited), (gpointer)renderingListStore); column = gtk_tree_view_column_new_with_attributes(_("mode"), renderer, "text", RENDERING_MODE, NULL); gtk_tree_view_column_set_alignment(column, 0.5); gtk_tree_view_append_column(GTK_TREE_VIEW(renderingTreeView), column); g_object_unref(namesListStore); return renderingTreeView; #else return (GtkWidget*)0; #endif } void addNewLightClicked(GtkButton *button _U_, gpointer data) { VisuGlLight *light0; GtkTreeIter iter; gboolean status; g_return_if_fail(data); if(gtk_tree_model_iter_n_children(GTK_TREE_MODEL(data), (GtkTreeIter*)0) >= GL_MAX_LIGHTS) { visu_ui_raiseWarning(_("OpenGL"), _("The maximm number of lights allowed by OpenGL" " has been reached, can't add more."), (GtkWindow*)0); return; } light0 = visu_gl_light_newDefault(); status = visu_gl_lights_add(visu_gl_getLights(), light0); if (!status) return; gtk_list_store_append(GTK_LIST_STORE(data), &iter); gtk_list_store_set(GTK_LIST_STORE(data), &iter, LIGHT_POINTER_TO, (gpointer)light0, LIGHT_ENABLED, light0->enabled, LIGHT_POSITION0, light0->position[0], LIGHT_POSITION1, light0->position[1], LIGHT_POSITION2, light0->position[2], LIGHT_MULTIPLIER, light0->multiplier, -1); status = visu_gl_lights_apply(visu_gl_getLights()); if (status) VISU_REDRAW_ADD; } void removeSelectedLightsClicked(GtkButton *button _U_, gpointer data) { GList *tmpLst, *selectedRows; GtkTreeIter iter; gboolean validIter, status; VisuGlLight *light0; GtkTreeIter *removableIter; g_return_if_fail(GTK_TREE_SELECTION(data)); selectedRows = gtk_tree_selection_get_selected_rows(GTK_TREE_SELECTION(data), NULL); tmpLst = selectedRows; while (tmpLst) { validIter = gtk_tree_model_get_iter(GTK_TREE_MODEL(light_list_store), &iter, (GtkTreePath*)tmpLst->data); gtk_tree_path_free((GtkTreePath*)tmpLst->data); tmpLst->data = (gpointer)0; if (!validIter) g_warning("Wrong 'path' variable in 'removeSelectedLightsClicked' method.\n"); else { gtk_tree_model_get(GTK_TREE_MODEL(light_list_store), &iter, LIGHT_POINTER_TO, &light0, -1); visu_gl_lights_remove(visu_gl_getLights(), light0); removableIter = g_malloc(sizeof(GtkTreeIter)); *removableIter = iter; tmpLst->data = (gpointer)removableIter; } tmpLst = g_list_next(tmpLst); } tmpLst = selectedRows; while (tmpLst) { if (tmpLst->data) { gtk_list_store_remove(light_list_store, (GtkTreeIter*)tmpLst->data); g_free(tmpLst->data); } tmpLst = g_list_next(tmpLst); } g_list_free(selectedRows); status = visu_gl_lights_apply(visu_gl_getLights()); if (status) VISU_REDRAW_ADD; } void selectionChanged(GtkTreeSelection *tree, gpointer data) { gint nb; g_return_if_fail(GTK_WIDGET(data)); nb = gtk_tree_selection_count_selected_rows(tree); if (nb == 0) gtk_widget_set_sensitive(GTK_WIDGET(data), FALSE); else gtk_widget_set_sensitive(GTK_WIDGET(data), TRUE); } GtkWidget *createInteriorOpenGL() { GtkWidget *vbox, *hbox; GtkWidget *label, *align; GtkWidget *scrollLight; GtkWidget *button; GtkWidget *image; GtkWidget *scroll, *viewport; GtkWidget *expanderLight, *vbox2, *expand; GtkWidget *light_tree_view; const char** names, **ids; int i; #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 GtkWidget *scrollRendering, *expanderRendering, *renderingTreeView; #endif scroll = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); viewport = gtk_viewport_new(NULL, NULL); gtk_container_add(GTK_CONTAINER(scroll), viewport); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(viewport), vbox); /*************************/ /* Rendering parameters. */ /*************************/ expand = gtk_expander_new(_("Rendering options:")); gtk_expander_set_expanded(GTK_EXPANDER(expand), TRUE); label = gtk_expander_get_label_widget(GTK_EXPANDER(expand)); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_widget_set_name(label, "label_head"); gtk_box_pack_start(GTK_BOX(vbox), expand, FALSE, FALSE, 5); align = gtk_alignment_new(0.5, 0.5, 1., 1.); gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, 5, 0); gtk_container_add(GTK_CONTAINER(expand), align); vbox2 = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(align), vbox2); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 2); label = gtk_label_new(_("Precision:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2); spinPrecision = gtk_spin_button_new_with_range(10, 500, 5); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinPrecision), visu_gl_view_class_getPrecision() * 100.); gtk_box_pack_start(GTK_BOX(hbox), spinPrecision, FALSE, FALSE, 2); label = gtk_label_new("%"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2); comboOpenGLRendering = gtk_combo_box_text_new(); names = visu_gl_rendering_getAllModeLabels(); ids = visu_gl_rendering_getAllModes(); if (names && ids) for (i = 0; names[i] && ids[i]; i++) gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(comboOpenGLRendering), ids[i], names[i]); else g_warning("No OpenGL rendering mode available."); gtk_combo_box_set_active(GTK_COMBO_BOX(comboOpenGLRendering), 0); gtk_box_pack_end(GTK_BOX(hbox), comboOpenGLRendering, FALSE, FALSE, 2); g_signal_connect(G_OBJECT(comboOpenGLRendering), "changed", G_CALLBACK(comboOpenGLRenderingChanged), (gpointer)0); label = gtk_label_new(_("Mode:")); gtk_box_pack_end(GTK_BOX(hbox), label, FALSE, FALSE, 2); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 2); label = gtk_label_new(_("Antialiase lines:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2); checkAntialiasing = gtk_check_button_new(); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkAntialiasing), (gboolean)visu_gl_getAntialias()); gtk_box_pack_start(GTK_BOX(hbox), checkAntialiasing, FALSE, FALSE, 2); checkTransparency = gtk_check_button_new(); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkTransparency), visu_gl_getTrueTransparency()); gtk_box_pack_end(GTK_BOX(hbox), checkTransparency, FALSE, FALSE, 2); label = gtk_label_new(_("Enhanced transparency:")); gtk_box_pack_end(GTK_BOX(hbox), label, FALSE, FALSE, 2); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 5); label = gtk_label_new(_("Use stereo rendering:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2); checkStereo = gtk_check_button_new(); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkStereo), visu_gl_getStereo()); gtk_box_pack_start(GTK_BOX(hbox), checkStereo, FALSE, FALSE, 2); hboxStereo = hbox; /* Degrees. */ label = gtk_label_new(_("deg.")); gtk_box_pack_end(GTK_BOX(hbox), label, FALSE, FALSE, 2); spinStereoAngle = gtk_spin_button_new_with_range(0.5,25.,0.1); gtk_box_pack_end(GTK_BOX(hbox), spinStereoAngle, FALSE, FALSE, 2); label = gtk_label_new(_("angle:")); gtk_box_pack_end(GTK_BOX(hbox), label, FALSE, FALSE, 1); /******************************/ /* Rendering mode parameters. */ /******************************/ #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 expanderRendering = gtk_expander_new(_("Per extension rendering mode:")); label = gtk_expander_get_label_widget(GTK_EXPANDER(expanderRendering)); gtk_box_pack_start(GTK_BOX(vbox2), expanderRendering, TRUE, TRUE, 5); scrollRendering = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollRendering), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(expanderRendering), scrollRendering); renderingTreeView = make_renderingTreeView(); gtk_widget_set_size_request(renderingTreeView, -1, 125); gtk_container_add(GTK_CONTAINER(scrollRendering), renderingTreeView); #endif /******************/ /* Other options. */ /******************/ hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new(_("Redraw immediately after changes:")); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_widget_set_name(label, "label_head"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2); checkImmediateDrawing = gtk_check_button_new(); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkImmediateDrawing), visu_gl_getImmediate()); gtk_box_pack_start(GTK_BOX(hbox), checkImmediateDrawing, FALSE, FALSE, 2); gtk_widget_show(checkImmediateDrawing); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5); /*********************/ /* VisuGlLight parameters. */ /*********************/ expanderLight = gtk_expander_new(_("Light sources:")); label = gtk_expander_get_label_widget(GTK_EXPANDER(expanderLight)); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_widget_set_name(label, "label_head"); gtk_box_pack_start(GTK_BOX(vbox), expanderLight, FALSE, FALSE, 5); hbox = gtk_hbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(expanderLight), hbox); scrollLight = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollLight), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_box_pack_start(GTK_BOX(hbox), scrollLight, TRUE, TRUE, 0); light_tree_view = lights_make_tree_view(); gtk_container_add(GTK_CONTAINER(scrollLight), light_tree_view); vbox2 = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox2, FALSE, FALSE, 0); button = gtk_button_new(); image = gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_BUTTON); gtk_container_add(GTK_CONTAINER(button), image); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(addNewLightClicked), (gpointer)gtk_tree_view_get_model(GTK_TREE_VIEW(light_tree_view))); gtk_box_pack_start(GTK_BOX(vbox2), button, FALSE, FALSE, 1); button = gtk_button_new(); gtk_widget_set_sensitive(button, FALSE); image = gtk_image_new_from_stock(GTK_STOCK_REMOVE, GTK_ICON_SIZE_BUTTON); gtk_container_add(GTK_CONTAINER(button), image); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(removeSelectedLightsClicked), (gpointer)gtk_tree_view_get_selection(GTK_TREE_VIEW(light_tree_view))); gtk_box_pack_start(GTK_BOX(vbox2), button, FALSE, FALSE, 1); g_signal_connect(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(light_tree_view))), "changed", G_CALLBACK(selectionChanged), (gpointer)button); button = gtk_button_new(); image = create_pixmap((GtkWidget*)0, "stock-one-light_20.png"); gtk_container_add(GTK_CONTAINER(button), image); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(addPresetOneLightClicked), (gpointer)gtk_tree_view_get_model(GTK_TREE_VIEW(light_tree_view))); gtk_box_pack_end(GTK_BOX(vbox2), button, FALSE, FALSE, 1); button = gtk_button_new(); image = create_pixmap((GtkWidget*)0, "stock-four-lights_20.png"); gtk_container_add(GTK_CONTAINER(button), image); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(addPresetFourLightsClicked), (gpointer)gtk_tree_view_get_model(GTK_TREE_VIEW(light_tree_view))); gtk_box_pack_end(GTK_BOX(vbox2), button, FALSE, FALSE, 1); gtk_widget_show_all(scroll); return scroll; } void createCallBacksOpenGL() { g_signal_connect(G_OBJECT(spinPrecision), "value-changed", G_CALLBACK(precisionChanged), (gpointer)0); g_signal_connect(G_OBJECT(checkAntialiasing), "toggled", G_CALLBACK(antialisingCheckChanged), (gpointer)0); g_signal_connect(G_OBJECT(checkTransparency), "toggled", G_CALLBACK(onTransparencyChanged), (gpointer)0); g_signal_connect(G_OBJECT(checkImmediateDrawing), "toggled", G_CALLBACK(immediateDrawingCheckChanged), (gpointer)0); g_signal_connect(G_OBJECT(checkStereo), "toggled", G_CALLBACK(stereoCheckChanged), (gpointer)0); g_signal_connect(G_OBJECT(spinStereoAngle), "value-changed", G_CALLBACK(stereoSpinChanged), (gpointer)0); } /*************/ /* Callbacks */ /*************/ static void immediateDrawingCheckChanged(GtkToggleButton *button, gpointer data _U_) { if (disableCallbacksOpenGL) return; visu_gl_setImmediate(gtk_toggle_button_get_active(button)); } static void stereoCheckChanged(GtkToggleButton *button, gpointer data _U_) { if (disableCallbacksOpenGL) return; visu_gl_setStereo(gtk_toggle_button_get_active(button)); VISU_REDRAW_ADD; } static void stereoSpinChanged(GtkSpinButton *button, gpointer data _U_) { if (disableCallbacksOpenGL) return; if (visu_gl_setStereoAngle((float)gtk_spin_button_get_value(button))) VISU_REDRAW_ADD; } void comboOpenGLRenderingChanged(GtkComboBox *combobox, gpointer data _U_) { int mode; if (disableCallbacksOpenGL) return; mode = (int)gtk_combo_box_get_active(combobox); if (visu_gl_rendering_setGlobalMode(mode)) VISU_REDRAW_ADD; } static void antialisingCheckChanged(GtkToggleButton *button, gpointer data _U_) { if (disableCallbacksOpenGL) return; if (visu_gl_setAntialias(gtk_toggle_button_get_active(button))) VISU_REDRAW_ADD; } static void onTransparencyChanged(GtkToggleButton *button, gpointer data _U_) { if (disableCallbacksOpenGL) return; if (visu_gl_setTrueTransparency(gtk_toggle_button_get_active(button))) VISU_REDRAW_ADD; } void precisionChanged(GtkButton *button _U_, gpointer user_data _U_) { float prec; VisuGlView *view; if (disableCallbacksOpenGL) return; prec = (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinPrecision)); if (visu_gl_view_class_setPrecision(prec / 100.)) { view = visu_ui_panel_getView(VISU_UI_PANEL(panelOpenGL)); g_signal_emit_by_name(G_OBJECT(view), "DetailLevelChanged", NULL); VISU_REDRAW_ADD; } } static void onOpenGLEnter(VisuUiPanel *visu_ui_panel _U_, gpointer data _U_) { #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 const gchar **names; gchar *name; GtkTreeIter iter; gboolean valid; VisuGlExt *ext; VisuGlRenderingMode mode; #endif if (hboxStereo) gtk_widget_set_sensitive(hboxStereo, visu_gl_getStereoCapability()); disableCallbacksOpenGL = 1; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkImmediateDrawing), visu_gl_getImmediate()); gtk_combo_box_set_active(GTK_COMBO_BOX(comboOpenGLRendering), visu_gl_rendering_getGlobalMode()); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinPrecision), visu_gl_view_class_getPrecision() * 100.); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkAntialiasing), (gboolean)visu_gl_getAntialias()); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkTransparency), visu_gl_getTrueTransparency()); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkStereo), visu_gl_getStereo()); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinStereoAngle), visu_gl_getStereoAngle()); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 names = visu_gl_rendering_getAllModeLabels(); valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(renderingListStore), &iter); while(valid) { gtk_tree_model_get(GTK_TREE_MODEL(renderingListStore), &iter, RENDERING_POINTER_TO, &ext, RENDERING_MODE, &name, -1); if (visu_gl_ext_getSensitiveToRenderingMode(ext)) { mode = visu_gl_ext_getPreferedRenderingMode(ext); if (mode < VISU_GL_RENDERING_N_MODES && strcmp(names[mode], name)) gtk_list_store_set(renderingListStore, &iter, RENDERING_MODE, names[mode], -1); else if (mode == VISU_GL_RENDERING_FOLLOW && strcmp(OPENGL_FOLLOW_GLOBAL_RENDERING_MODE, name)) gtk_list_store_set(renderingListStore, &iter, RENDERING_MODE, OPENGL_FOLLOW_GLOBAL_RENDERING_MODE, -1); } g_free(name); valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(renderingListStore), &iter); } #endif disableCallbacksOpenGL = 0; } void addPresetOneLightClicked(GtkButton *button _U_, gpointer data) { VisuGlLight *light; gboolean status; g_return_if_fail(data); status = visu_gl_lights_removeAll(visu_gl_getLights()); light = visu_gl_light_newDefault(); status = visu_gl_lights_add(visu_gl_getLights(), light) || status; light_sync_lists(GTK_LIST_STORE(data)); status = visu_gl_lights_apply(visu_gl_getLights()) || status; if (status) VISU_REDRAW_ADD; } void addPresetFourLightsClicked(GtkButton *button _U_, gpointer data) { VisuGlLight *light; gboolean status; g_return_if_fail(data); status = visu_gl_lights_removeAll(visu_gl_getLights()); light = visu_gl_light_newDefault(); light->multiplier = 0.25; status = visu_gl_lights_add(visu_gl_getLights(), light) || status; light = visu_gl_light_newDefault(); light->position[0] *= -1.; light->multiplier = 0.25; status = visu_gl_lights_add(visu_gl_getLights(), light) || status; light = visu_gl_light_newDefault(); light->position[1] *= -1.; light->multiplier = 0.25; status = visu_gl_lights_add(visu_gl_getLights(), light) || status; light = visu_gl_light_newDefault(); light->position[0] *= -1.; light->position[1] *= -1.; light->multiplier = 0.25; status = visu_gl_lights_add(visu_gl_getLights(), light) || status; light_sync_lists(GTK_LIST_STORE(data)); status = visu_gl_lights_apply(visu_gl_getLights()) || status; if (status) VISU_REDRAW_ADD; } #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 static void renderingModeEdited(GtkCellRendererText *cellrenderertext _U_, gchar *path, gchar *text, gpointer user_data) { GtkListStore *list; gboolean valid; GtkTreeIter iter; const char** names; int mode; VisuGlExt *ext; if (disableCallbacksOpenGL) return; list = GTK_LIST_STORE(user_data); g_return_if_fail(list); valid = gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(list), &iter, path); g_return_if_fail(valid); if (!strcmp(text, OPENGL_FOLLOW_GLOBAL_RENDERING_MODE)) { valid = TRUE; mode = VISU_GL_RENDERING_FOLLOW; } else { valid = FALSE; names = visu_gl_rendering_getAllModeLabels(); for (mode = 0; names[mode] && !valid; mode++) valid = !strcmp(text, names[mode]); mode -= 1; } g_return_if_fail(valid); gtk_tree_model_get(GTK_TREE_MODEL(list), &iter, RENDERING_POINTER_TO, &ext, -1); valid = visu_gl_ext_setPreferedRenderingMode(ext, mode); if (mode == VISU_GL_RENDERING_FOLLOW) gtk_list_store_set(list, &iter, RENDERING_MODE, OPENGL_FOLLOW_GLOBAL_RENDERING_MODE, -1); else { names = visu_gl_rendering_getAllModeLabels(); gtk_list_store_set(list, &iter, RENDERING_MODE, names[mode], -1); } if (valid && visu_gl_ext_getActive(ext)) VISU_REDRAW_ADD; } #endif v_sim-3.7.0/src/panelModules/panelOpenGL.h0000644000353400050620000000423312215546064015324 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef PANELOPENGL_H #define PANELOPENGL_H #include /** * visu_ui_panel_gl_init: * * Should be used in the list declared in externalModules.h to be loaded by * V_Sim on start-up. This routine will create the #VisuUiPanel where the OpenGL * stuff can be tuned, such as antialise lines, drawing precision... * * Returns: a newly created #VisuUiPanel object. */ VisuUiPanel* visu_ui_panel_gl_init(); #endif v_sim-3.7.0/src/panelModules/panelGeometry.c0000644000353400050620000013136112215546063015770 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "panelGeometry.h" #include "panelBrowser.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /** * SECTION: panelGeometry * @short_description: This tab gathers the geometry operation on a * #VisuData, like periodic translation, physical units, ... * * Nothing tunable here. */ /* Local objects. */ static GtkWidget *panelGeometry; static GtkWidget *stippleExpandBox, *colorExpandBox; static GtkWidget *vboxPeriodic; static GtkWidget *checkAllowTranslations; static GtkWidget *spinTransXYZ[3]; static GtkWidget *checkAllowExpand; static GtkWidget *spinExpandXYZ[3]; static GtkWidget *imagePeriodic; static GtkWidget *labelPeriodic; static gulong transId; static gboolean transStatus = FALSE; static GtkWidget *comboUnit; static GtkWidget *checkDiff, *checkAdjust, *checkOrdering; static GtkWidget *checkVisuPaths, *hboxVisuPaths, *togglePathSave, *labelVisuPaths; static GtkWidget *hboxIOVisuPaths, *hboxVisuPaths2, *checkColorisePath, *comboToolShadePath; /* Local variables. */ static gboolean disableCallbacks; static gboolean widgetsNotBuilt; static VisuPaths *paths; static VisuGlExtPaths *extPaths; static gchar *exportPathFile = NULL; static gulong extension_signal, translation_signal; #define NO_PATH _("No stored path") #define PATH _("Path has %d step(s)") /* Local routines. */ static GtkWidget *createInteriorBox(); static void updateValues(VisuData *dataObj); static void updatePeriodic(VisuData *dataObj); static void applyTranslation(gboolean setFree); static void applyExpansion(float expansion[3]); static void getCartesianTranslation(float trans[3]); /* Local callbacks. */ static void onEnter(VisuUiPanel *visu_ui_panel, gpointer data); static void onVisuDataChanged(GObject *obj, VisuData* visuData, gpointer data); static void onDataReady(VisuObject *obj, VisuData *dataObj, VisuGlView *view, gpointer data); static void onDataNotReady(VisuObject *obj, VisuData *dataObj, VisuGlView *view, gpointer data); static void onDataFocused(GObject *obj, VisuData* visuData, gpointer data); static void onTranslationChanged(GtkSpinButton* button, gpointer data); static void onTranslationChecked(GtkToggleButton* button, gpointer data); static void onExpandChanged(GtkSpinButton* button, gpointer data); static void onExpandChecked(GtkToggleButton* button, gpointer data); static gboolean onElementRenderChanged(GSignalInvocationHint *ihint, guint nVals, const GValue *vals, gpointer data); static void onStippleExpandChanged(VisuUiStippleCombobox *combo, gint stipple, gpointer data); static void onColorExpandChanged(VisuUiColorCombobox *combo, ToolColor *color, gpointer data); static void onUnitChanged(GtkComboBox *combo, gpointer data); static void onDiffChanged(GtkToggleButton *toggle, gpointer data); static void onAdjustChanged(GtkToggleButton *toggle, gpointer data); static void onPathToggled(GtkToggleButton *toggle, gpointer data); static void onPathSaveToggled(GtkToggleButton *toggle, gpointer data); static void onPathClearClicked(GtkButton *bt, gpointer data); static void onColorisePathToggled(GtkToggleButton *bt, gpointer data); static void onToolShadePathSelected(VisuUiShadeCombobox *combo, ToolShade *shade, gpointer data); static void onSavePathClicked(GtkButton *bt, gpointer data); static void onLoadPathClicked(GtkButton *bt, gpointer data); static void onDirBrowsed(VisuObject *obj, VisuUiDirectoryType type, gpointer user); static void onExtensionChanged(VisuBox *box, gpointer data); static void onTransChanged(VisuData *dataObj, gpointer data); /** * visu_ui_panel_geometry_init: (skip) * * Should be used in the list declared in externalModules.h to be loaded by * V_Sim on start-up. This routine will create the #VisuUiPanel where the box * stuff can be tuned, such as the bounding box, its colour, and the actions linked * to the periodicity (translation, dupplication...). * * Returns: a newly created #VisuUiPanel object. */ VisuUiPanel* visu_ui_panel_geometry_init(VisuUiMain *ui) { int i; panelGeometry = visu_ui_panel_newWithIconFromPath("Panel_geometry", _("Geometry operations"), _("Geometry"), "stock-geometry_20.png"); if (!panelGeometry) return (VisuUiPanel*)0; visu_ui_panel_setDockable(VISU_UI_PANEL(panelGeometry), TRUE); /* Create the widgets that are needed even without the GTK interface be built. */ imagePeriodic = gtk_image_new_from_stock(GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_MENU); labelPeriodic = gtk_label_new(""); vboxPeriodic = gtk_vbox_new(FALSE, 0); checkAllowTranslations = gtk_check_button_new_with_mnemonic(_("_Translations")); checkAllowExpand = gtk_check_button_new_with_mnemonic(_("_Expand nodes")); for (i = 0; i < 3; i++) { /* For the translation. */ spinTransXYZ[i] = gtk_spin_button_new_with_range(-1, 1, 0.05); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinTransXYZ[i]), 0); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spinTransXYZ[i]), TRUE); /* For the expansion. */ spinExpandXYZ[i] = gtk_spin_button_new_with_range(0, 5, 0.05); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spinExpandXYZ[i]), TRUE); } checkDiff = gtk_check_button_new_with_mnemonic(_("Show node _displacements")); checkOrdering = gtk_check_button_new_with_mnemonic(_("with re_ordering")); comboUnit = gtk_combo_box_text_new(); checkVisuPaths = gtk_check_button_new_with_mnemonic(_("Use _paths")); togglePathSave = gtk_toggle_button_new(); stippleExpandBox = visu_ui_stipple_combobox_new(); colorExpandBox = visu_ui_color_combobox_new(TRUE); visu_ui_color_combobox_setPrintValues(VISU_UI_COLOR_COMBOBOX(colorExpandBox), FALSE); checkAdjust = gtk_check_button_new_with_mnemonic(_("Automatic zoom _adjustment on file loading")); /* Create the callbacks of all the sensitive widgets. */ g_signal_connect(G_OBJECT(panelGeometry), "page-entered", G_CALLBACK(onEnter), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "dataLoaded", G_CALLBACK(onVisuDataChanged), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "dataRendered", G_CALLBACK(onDataReady), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "dataUnRendered", G_CALLBACK(onDataNotReady), (gpointer)0); g_signal_connect(G_OBJECT(ui), "DataFocused", G_CALLBACK(onDataFocused), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "DirectoryChanged", G_CALLBACK(onDirBrowsed), (gpointer)0); g_signal_add_emission_hook(g_signal_lookup("ElementVisibilityChanged", VISU_TYPE_ELEMENT), 0, onElementRenderChanged, (gpointer)0, (GDestroyNotify)0); /* Private parameters. */ disableCallbacks = FALSE; widgetsNotBuilt = TRUE; paths = (VisuPaths*)0; extPaths = visu_gl_ext_paths_new(NULL); return VISU_UI_PANEL(panelGeometry); } static GtkWidget *createInteriorBox() { GtkWidget *vbox, *hbox, *bt, *wd; GtkWidget *label, *align; int i; #define X_LABEL _("dx:") #define Y_LABEL _("dy:") #define Z_LABEL _("dz:") char *xyz[3]; const gchar **units; #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkTooltips *tooltips; tooltips = gtk_tooltips_new (); #endif vbox = gtk_vbox_new(FALSE, 0); /**************************/ /* The periodicity stuff. */ /**************************/ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Periodic operations")); gtk_widget_set_name(label, "label_head"); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 2); gtk_box_pack_end(GTK_BOX(hbox), labelPeriodic, FALSE, FALSE, 2); gtk_label_set_use_markup(GTK_LABEL(labelPeriodic), TRUE); gtk_misc_set_alignment(GTK_MISC(labelPeriodic), 0.5, 0.5); gtk_box_pack_end(GTK_BOX(hbox), imagePeriodic, FALSE, FALSE, 0); align = gtk_alignment_new(0.5, 0., 1, 1); gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 15, 0, 0); gtk_container_add(GTK_CONTAINER(align), vboxPeriodic); gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, FALSE, 0); /* The translations. */ gtk_widget_set_tooltip_text(checkAllowTranslations, _("Translations are given in box coordinates and nodes are " "automatically translated back into the bounding box.")); gtk_box_pack_start(GTK_BOX(vboxPeriodic), checkAllowTranslations, FALSE, FALSE, 0); transId = g_signal_connect(G_OBJECT(checkAllowTranslations), "toggled", G_CALLBACK(onTranslationChecked), (gpointer)0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vboxPeriodic), hbox, FALSE, FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(hbox), 3); xyz[0] = X_LABEL; xyz[1] = Y_LABEL; xyz[2] = Z_LABEL; for (i = 0; i < 3; i++) { label = gtk_label_new(xyz[i]); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 3); gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); g_signal_connect(G_OBJECT(spinTransXYZ[i]), "value-changed", G_CALLBACK(onTranslationChanged), (gpointer)0); gtk_box_pack_start(GTK_BOX(hbox), spinTransXYZ[i], FALSE, FALSE, 0); } /* The replication. */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vboxPeriodic), hbox, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(checkAllowExpand, _("The size of the expansion is given in box coordinates." " Nodes are automatically translated back into the new" " defined area. The drawn bounding box is kept to the" " original size.")); gtk_box_pack_start(GTK_BOX(hbox), checkAllowExpand, TRUE, TRUE, 0); g_signal_connect(G_OBJECT(checkAllowExpand), "toggled", G_CALLBACK(onExpandChecked), (gpointer)0); /* The rendering parameters. */ label = gtk_label_new(_("param.:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); /* The stipple pattern. */ gtk_box_pack_start(GTK_BOX(hbox), stippleExpandBox, FALSE, FALSE, 3); g_signal_connect(G_OBJECT(stippleExpandBox), "stipple-selected", G_CALLBACK(onStippleExpandChanged), (gpointer)0); /* The color widget. */ gtk_box_pack_start(GTK_BOX(hbox), colorExpandBox, FALSE, FALSE, 3); g_signal_connect(G_OBJECT(colorExpandBox), "color-selected", G_CALLBACK(onColorExpandChanged), (gpointer)0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vboxPeriodic), hbox, FALSE, FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(hbox), 3); xyz[0] = X_LABEL; xyz[1] = Y_LABEL; xyz[2] = Z_LABEL; for (i = 0; i < 3; i++) { label = gtk_label_new(xyz[i]); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 3); gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); g_signal_connect(G_OBJECT(spinExpandXYZ[i]), "value-changed", G_CALLBACK(onExpandChanged), (gpointer)0); gtk_box_pack_start(GTK_BOX(hbox), spinExpandXYZ[i], FALSE, FALSE, 0); } /********************/ /* The units stuff. */ /********************/ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Units and lengths")); gtk_widget_set_name(label, "label_head"); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 2); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkAdjust), (gboolean)visu_ui_rendering_window_class_getAutoAdjust()); g_signal_connect(G_OBJECT(checkAdjust), "toggled", G_CALLBACK(onAdjustChanged), (gpointer)0); gtk_box_pack_start(GTK_BOX(vbox), checkAdjust, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Set the unit of the file:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); gtk_widget_set_sensitive(comboUnit, FALSE); units = tool_physic_getUnitNames(); for (i = 0; units[i]; i++) gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(comboUnit), (const gchar*)0, units[i]); gtk_combo_box_set_active(GTK_COMBO_BOX(comboUnit), 0); g_signal_connect(G_OBJECT(comboUnit), "changed", G_CALLBACK(onUnitChanged), (gpointer)0); gtk_box_pack_start(GTK_BOX(hbox), comboUnit, FALSE, FALSE, 0); /************************/ /* The multifile stuff. */ /************************/ align = gtk_alignment_new(0.5, 0., 1, 1); gtk_alignment_set_padding(GTK_ALIGNMENT(align), 15, 0, 1, 0); gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, FALSE, 0); label = gtk_label_new(_("Multi file actions")); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_widget_set_name(label, "label_head"); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_container_add(GTK_CONTAINER(align), label); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(checkOrdering, _("On load of a new file, reorder the nodes to" " minimize displacements.")); gtk_box_pack_end(GTK_BOX(hbox), checkOrdering, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(checkDiff, _("When a new file is loaded, draw arrows on nodes that" " represent their displacements with respect to their" " previous positions.")); g_signal_connect(G_OBJECT(checkDiff), "toggled", G_CALLBACK(onDiffChanged), (gpointer)0); gtk_box_pack_start(GTK_BOX(hbox), checkDiff, TRUE, TRUE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(checkVisuPaths), "toggled", G_CALLBACK(onPathToggled), (gpointer)0); gtk_widget_set_tooltip_text(checkVisuPaths, _("Store differences between files and plot" " them as lines.")); gtk_box_pack_start(GTK_BOX(hbox), checkVisuPaths, TRUE, TRUE, 0); hboxVisuPaths = gtk_hbox_new(FALSE, 2); gtk_widget_set_sensitive(hboxVisuPaths, FALSE); gtk_box_pack_start(GTK_BOX(hbox), hboxVisuPaths, FALSE, FALSE, 3); labelVisuPaths = gtk_label_new(NO_PATH); gtk_label_set_use_markup(GTK_LABEL(labelVisuPaths), TRUE); gtk_box_pack_start(GTK_BOX(hboxVisuPaths), labelVisuPaths, FALSE, FALSE, 3); gtk_widget_set_tooltip_text(togglePathSave, _("When toggled, store differences" " between files as paths" " through nodes..")); gtk_container_add(GTK_CONTAINER(togglePathSave), gtk_image_new_from_stock(GTK_STOCK_MEDIA_RECORD, GTK_ICON_SIZE_MENU)); g_signal_connect(G_OBJECT(togglePathSave), "toggled", G_CALLBACK(onPathSaveToggled), (gpointer)0); gtk_box_pack_start(GTK_BOX(hboxVisuPaths), togglePathSave, FALSE, FALSE, 0); bt = gtk_button_new(); gtk_widget_set_tooltip_text(bt, _("Remove all stored paths.")); gtk_container_add(GTK_CONTAINER(bt), gtk_image_new_from_stock(GTK_STOCK_CLEAR, GTK_ICON_SIZE_MENU)); g_signal_connect(G_OBJECT(bt), "clicked", G_CALLBACK(onPathClearClicked), (gpointer)0); gtk_box_pack_start(GTK_BOX(hboxVisuPaths), bt, FALSE, FALSE, 0); hboxVisuPaths2 = gtk_hbox_new(FALSE, 0); gtk_widget_set_sensitive(hboxVisuPaths2, FALSE); gtk_box_pack_start(GTK_BOX(vbox), hboxVisuPaths2, FALSE, FALSE, 0); align = gtk_alignment_new(1., 0.5, 0, 1); gtk_box_pack_start(GTK_BOX(hboxVisuPaths2), align, TRUE, TRUE, 0); checkColorisePath = bt = gtk_check_button_new_with_mnemonic(_("colourise with: ")); gtk_widget_set_tooltip_text(bt, _("If energy information was present" " when loading file, colourise the paths" " with shading colours.")); gtk_container_add(GTK_CONTAINER(align), bt); comboToolShadePath = wd = visu_ui_shade_combobox_new(FALSE, FALSE); gtk_widget_set_sensitive(wd, FALSE); g_signal_connect(G_OBJECT(bt), "toggled", G_CALLBACK(onColorisePathToggled), (gpointer)wd); g_signal_connect(G_OBJECT(wd), "shade-selected", G_CALLBACK(onToolShadePathSelected), (gpointer)0); gtk_box_pack_start(GTK_BOX(hboxVisuPaths2), wd, FALSE, FALSE, 0); hboxIOVisuPaths = gtk_hbox_new(FALSE, 2); /* gtk_widget_set_sensitive(hboxIOVisuPaths, FALSE); */ gtk_box_pack_start(GTK_BOX(hboxVisuPaths2), hboxIOVisuPaths, FALSE, FALSE, 3); bt = gtk_button_new(); gtk_widget_set_tooltip_text(bt, _("Read a set of paths from a file and" " add them to the current set.")); gtk_container_add(GTK_CONTAINER(bt), gtk_image_new_from_stock(GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU)); g_signal_connect(G_OBJECT(bt), "clicked", G_CALLBACK(onLoadPathClicked), (gpointer)0); gtk_box_pack_start(GTK_BOX(hboxIOVisuPaths), bt, FALSE, FALSE, 0); bt = gtk_button_new(); gtk_widget_set_tooltip_text(bt, _("Save the current set of paths" " to an XML file.")); gtk_container_add(GTK_CONTAINER(bt), gtk_image_new_from_stock(GTK_STOCK_SAVE, GTK_ICON_SIZE_MENU)); g_signal_connect(G_OBJECT(bt), "clicked", G_CALLBACK(onSavePathClicked), (gpointer)0); gtk_box_pack_start(GTK_BOX(hboxIOVisuPaths), bt, FALSE, FALSE, 0); gtk_widget_show_all(vbox); widgetsNotBuilt = FALSE; return vbox; } static void updateSensitive(VisuData *dataObj) { gboolean per[3], setTrans, setExpand; VisuBoxBoundaries bc; setExpand = TRUE; setTrans = !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkAllowExpand)); if (dataObj) { bc = visu_box_getBoundary(visu_boxed_getBox(VISU_BOXED(dataObj))); per[0] = (bc != VISU_BOX_FREE && bc != VISU_BOX_SURFACE_YZ) || (bc == VISU_BOX_WIRE_X); per[1] = (bc != VISU_BOX_FREE && bc != VISU_BOX_SURFACE_ZX) || (bc == VISU_BOX_WIRE_Y); per[2] = (bc != VISU_BOX_FREE && bc != VISU_BOX_SURFACE_XY) || (bc == VISU_BOX_WIRE_Z); if (bc == VISU_BOX_FREE) { setTrans = setExpand = FALSE; gtk_widget_show(imagePeriodic); } else gtk_widget_hide(imagePeriodic); } else { gtk_widget_hide(imagePeriodic); setTrans = setExpand = FALSE; per[0] = FALSE; per[1] = FALSE; per[2] = FALSE; } gtk_widget_set_sensitive(checkAllowTranslations, setTrans); gtk_widget_set_sensitive(spinTransXYZ[0], setTrans && per[0]); gtk_widget_set_sensitive(spinTransXYZ[1], setTrans && per[1]); gtk_widget_set_sensitive(spinTransXYZ[2], setTrans && per[2]); gtk_widget_set_sensitive(checkAllowExpand, setExpand); gtk_widget_set_sensitive(spinExpandXYZ[0], setExpand && per[0]); gtk_widget_set_sensitive(spinExpandXYZ[1], setExpand && per[1]); gtk_widget_set_sensitive(spinExpandXYZ[2], setExpand && per[2]); } static void updateValues(VisuData *dataObj) { int i; float *transXYZ, transBox[3], expand[3]; gboolean set; guint16 stipple; VisuBox *box; ToolColor *color; disableCallbacks = TRUE; DBG_fprintf(stderr, "Panel Geometry: update inside values.\n"); stipple = visu_gl_ext_box_getExpandStipple(visu_gl_ext_box_getDefault()); if (!visu_ui_stipple_combobox_setSelection(VISU_UI_STIPPLE_COMBOBOX(stippleExpandBox), stipple)) { visu_ui_stipple_combobox_add(VISU_UI_STIPPLE_COMBOBOX(stippleExpandBox), stipple); visu_ui_stipple_combobox_setSelection(VISU_UI_STIPPLE_COMBOBOX(stippleExpandBox), stipple); } color = tool_color_addFloatRGBA(visu_gl_ext_box_getSideRGB(visu_gl_ext_box_getDefault()), (int*)0); visu_ui_color_combobox_setSelection(VISU_UI_COLOR_COMBOBOX(colorExpandBox), color); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkAdjust), visu_ui_rendering_window_class_getAutoAdjust()); /* Values dependent on a visuData. */ DBG_fprintf(stderr, "Panel Geometry: update values for object %p.\n", (gpointer)dataObj); if (dataObj) { box = visu_boxed_getBox(VISU_BOXED(dataObj)); transXYZ = visu_data_getXYZtranslation(dataObj); visu_box_convertXYZtoBoxCoordinates(box, transBox, transXYZ); set = visu_data_getTranslationStatus(dataObj); if (set) for (i = 0; i < 3; i++) gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinTransXYZ[i]), (double)transBox[i]); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkAllowTranslations), set); g_free(transXYZ); if (visu_box_getBoundary(box) != VISU_BOX_FREE) { visu_box_getExtension(box, expand); set = (expand[0] != 0. || expand[1] != 0. || expand[2] != 0.); if (set) for (i = 0; i < 3; i++) gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinExpandXYZ[i]), (double)expand[i]); if (set) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkAllowExpand), TRUE); } gtk_combo_box_set_active(GTK_COMBO_BOX(comboUnit), visu_box_getUnit(visu_boxed_getBox(VISU_BOXED(dataObj)))); gtk_widget_set_sensitive(comboUnit, TRUE); } else { for (i = 0; i < 3; i++) gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinTransXYZ[i]), 0.); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkAllowTranslations), FALSE); for (i = 0; i < 3; i++) gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinExpandXYZ[i]), 0.); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkAllowExpand), FALSE); gtk_widget_set_sensitive(comboUnit, FALSE); } disableCallbacks = FALSE; /* Set the sensitivity of the translation. */ updateSensitive(dataObj); } static void updatePeriodic(VisuData *dataObj) { VisuBoxBoundaries bc; gchar *lbl; if (dataObj) { bc = visu_box_getBoundary(visu_boxed_getBox(VISU_BOXED(dataObj))); switch (bc) { case VISU_BOX_FREE: lbl = g_markup_printf_escaped("%s", _("non periodic data")); break; case VISU_BOX_WIRE_X: lbl = g_strdup(_("(wire X)")); break; case VISU_BOX_WIRE_Y: lbl = g_strdup(_("(wire Y)")); break; case VISU_BOX_WIRE_Z: lbl = g_strdup(_("(wire Z)")); break; case VISU_BOX_SURFACE_XY: lbl = g_strdup(_("(surface XY)")); break; case VISU_BOX_SURFACE_YZ: lbl = g_strdup(_("(surface YZ)")); break; case VISU_BOX_SURFACE_ZX: lbl = g_strdup(_("(surface ZX)")); break; case VISU_BOX_PERIODIC: lbl = g_strdup(_("(periodic)")); break; default: lbl = g_strdup(""); } } else lbl = g_strdup(""); gtk_label_set_markup(GTK_LABEL(labelPeriodic), lbl); g_free(lbl); } static void updateGeometry(VisuData *visuData) { VisuData *dataRef; gboolean res, new; gchar *text; dataRef = visu_ui_panel_getData(VISU_UI_PANEL(panelGeometry)); DBG_fprintf(stderr, "Panel Geometry: updating geometry between %p and %p.\n", (gpointer)dataRef, (gpointer)visuData); if ((gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkDiff)) || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(togglePathSave)))&& dataRef) { res = visu_geodiff_new(dataRef, visuData, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(checkOrdering))); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkDiff))) { visu_gl_ext_node_vectors_setData(visu_gl_ext_geodiff_getDefault(), visuData); visu_gl_ext_node_vectors_draw(visu_gl_ext_geodiff_getDefault()); } if (res && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(togglePathSave))) { g_return_if_fail(paths); new = visu_paths_addFromDiff(paths, visuData); if (new) visu_paths_constrainInBox(paths, visuData); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkVisuPaths))) { visu_gl_ext_paths_setDirty(extPaths); visu_gl_ext_paths_draw(extPaths); } text = g_strdup_printf(PATH, visu_paths_getLength(paths)); gtk_label_set_markup(GTK_LABEL(labelVisuPaths), text); g_free(text); } } } static void applyTranslation(gboolean setFree) { VisuData *data; float cartCoord[3]; gboolean rebuild; data = visu_ui_panel_getData(VISU_UI_PANEL(panelGeometry)); if (!data) return; DBG_fprintf(stderr, "Visu Ui Geometry: apply translation (setFree = %d).\n", setFree); g_signal_handler_block(G_OBJECT(data), translation_signal); if (setFree) { cartCoord[0] = 0.f; cartCoord[1] = 0.f; cartCoord[2] = 0.f; rebuild = (gboolean)visu_data_setXYZtranslation(data, cartCoord); rebuild = visu_data_constrainedFree(data) || rebuild; } else { getCartesianTranslation(cartCoord); rebuild = (gboolean)visu_data_setXYZtranslation(data, cartCoord); rebuild = visu_data_constrainedInTheBox(data) || rebuild; } g_signal_handler_unblock(G_OBJECT(data), translation_signal); /* Update the paths if necessary. */ if (paths) { visu_paths_setTranslation(paths, cartCoord); visu_paths_constrainInBox(paths, data); visu_gl_ext_paths_setDirty(extPaths); visu_gl_ext_paths_draw(extPaths); } if (rebuild) { g_signal_emit_by_name(G_OBJECT(data), "PositionChanged", (VisuElement*)0, NULL); VISU_REDRAW_ADD; } } static void applyExpansion(float expansion[3]) { VisuData *data; VisuGlView *view; gboolean redraw; data = visu_ui_panel_getData(VISU_UI_PANEL(panelGeometry)); view = visu_ui_panel_getView(VISU_UI_PANEL(panelGeometry)); if (!data) return; redraw = visu_data_replicate(data, expansion); if (view && redraw) VISU_REDRAW_ADD; } static void getCartesianTranslation(float trans[3]) { float transBox[3]; VisuData *data; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkAllowTranslations))) { transBox[0] = (float)gtk_spin_button_get_value (GTK_SPIN_BUTTON(spinTransXYZ[0])); transBox[1] = (float)gtk_spin_button_get_value (GTK_SPIN_BUTTON(spinTransXYZ[1])); transBox[2] = (float)gtk_spin_button_get_value (GTK_SPIN_BUTTON(spinTransXYZ[2])); data = visu_ui_panel_getData(VISU_UI_PANEL(panelGeometry)); visu_box_convertBoxCoordinatestoXYZ(visu_boxed_getBox(VISU_BOXED(data)), trans, transBox); } else { trans[0] = 0.f; trans[1] = 0.f; trans[2] = 0.f; } } /*************/ /* Callbacks */ /*************/ static void onEnter(VisuUiPanel *visu_ui_panel _U_, gpointer data _U_) { VisuData *dataObj; if (widgetsNotBuilt) { DBG_fprintf(stderr, "Panel Geometry: first build on enter.\n"); gtk_container_add(GTK_CONTAINER(panelGeometry), createInteriorBox()); } dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelGeometry)); updateValues(dataObj); updatePeriodic(dataObj); updateSensitive(dataObj); } static void onStippleExpandChanged(VisuUiStippleCombobox *combo _U_, gint stipple, gpointer data _U_) { if (disableCallbacks) return; if (visu_gl_ext_box_setExpandStipple(visu_gl_ext_box_getDefault(), stipple)) { visu_gl_ext_box_draw(visu_gl_ext_box_getDefault()); VISU_REDRAW_ADD; } } static void onColorExpandChanged(VisuUiColorCombobox *combo _U_, ToolColor *color, gpointer data _U_) { if (disableCallbacks) return; if (visu_gl_ext_box_setSideRGB(visu_gl_ext_box_getDefault(), color->rgba, TOOL_COLOR_MASK_RGBA)) { visu_gl_ext_box_draw(visu_gl_ext_box_getDefault()); VISU_REDRAW_ADD; } } static void onVisuDataChanged(GObject *obj _U_, VisuData* visuData, gpointer data _U_) { float cartCoord[3]; float transBox[3]; float expand[3]; int i, val; VisuData *dataRef; VisuBox *box; DBG_fprintf(stderr, "Panel Geometry: Catch 'dataLoaded' signal, update.\n"); if (!visuData) return; dataRef = visu_ui_panel_getData(VISU_UI_PANEL(panelGeometry)); box = visu_boxed_getBox(VISU_BOXED(visuData)); /* Apply the periodic stuffs. */ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkAllowTranslations)) && (visu_box_getBoundary(box) != VISU_BOX_FREE && dataRef && visu_box_getBoundary(visu_boxed_getBox(VISU_BOXED(dataRef))) != VISU_BOX_FREE)) { DBG_fprintf(stderr, "Panel Geometry: Catch 'dataLoaded' signal," " applying current translations.\n"); for (i = 0; i < 3; i++) transBox[i] = (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinTransXYZ[i])); visu_box_convertBoxCoordinatestoXYZ(box, cartCoord, transBox); visu_data_setXYZtranslation(visuData, cartCoord); visu_data_constrainedInTheBox(visuData); } if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkAllowExpand)) && visu_box_getBoundary(box) != VISU_BOX_FREE) { DBG_fprintf(stderr, "Panel Geometry: Catch 'dataLoaded' signal," " applying current expansion.\n"); for (i = 0; i < 3; i++) expand[i] = (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinExpandXYZ[i])); visu_data_replicate(visuData, expand); } /* Update the units if necessary. */ if (visu_basic_getPreferedUnit() == TOOL_UNITS_UNDEFINED) { val = gtk_combo_box_get_active(GTK_COMBO_BOX(comboUnit)); if (val > 0 && visu_box_getUnit(box) != TOOL_UNITS_UNDEFINED) visu_box_setUnit(box, (ToolUnits)val); } /* Make a geometry diff. */ updateGeometry(visuData); } static void onDataReady(VisuObject *visu _U_, VisuData *dataObj, VisuGlView *view _U_, gpointer data _U_) { if (dataObj) { extension_signal = g_signal_connect(G_OBJECT(visu_boxed_getBox(VISU_BOXED(dataObj))), "ExtensionChanged", G_CALLBACK(onExtensionChanged), (gpointer)dataObj); translation_signal = g_signal_connect(G_OBJECT(dataObj), "TranslationsChanged", G_CALLBACK(onTransChanged), (gpointer)dataObj); } } static void onDataNotReady(VisuObject *visu _U_, VisuData *dataObj, VisuGlView *view _U_, gpointer data _U_) { g_signal_handler_disconnect(G_OBJECT(visu_boxed_getBox(VISU_BOXED(dataObj))), extension_signal); g_signal_handler_disconnect(G_OBJECT(dataObj), translation_signal); } static void onDataFocused(GObject *obj _U_, VisuData* visuData, gpointer data _U_) { DBG_fprintf(stderr, "Panel Geometry: Catch 'DataFocused' signal," " update values.\n"); if (visuData) { /* Update the sensitivity of the periodic stuff. */ updatePeriodic(visuData); updateSensitive(visuData); updateValues(visuData); } } static void onTranslationChanged(GtkSpinButton* button _U_, gpointer data _U_) { if (disableCallbacks) return; if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkAllowTranslations))) return; applyTranslation(FALSE); } static void onTranslationChecked(GtkToggleButton* button, gpointer data _U_) { if (disableCallbacks) return; applyTranslation(!gtk_toggle_button_get_active(button)); } static gboolean onElementRenderChanged(GSignalInvocationHint *ihint _U_, guint nVals _U_, const GValue *vals, gpointer data _U_) { VisuData *dataObj; VisuElement *element; if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkAllowTranslations))) return TRUE; element = VISU_ELEMENT(g_value_get_object(vals + 0)); if (element->rendered) { DBG_fprintf(stderr, "Panel Geometry: caught 'ElementVisibilityChanged' applying" " translation for element '%s'.\n", element->name); dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelGeometry)); if (visu_data_constrainedElementInTheBox(dataObj, element)) g_signal_emit_by_name(G_OBJECT(dataObj), "PositionChanged", element, NULL); } else DBG_fprintf(stderr, "Panel Geometry: caught 'ElementVisibilityChanged' but" " do not apply translation since element '%s' is masked.\n", element->name); return TRUE; } static void onExpandChanged(GtkSpinButton* button _U_, gpointer data _U_) { float expansion[3]; int i; if (disableCallbacks) return; if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkAllowExpand))) return; for (i = 0; i < 3; i++) expansion[i] = (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinExpandXYZ[i])); applyExpansion(expansion); } static void onExpandChecked(GtkToggleButton* button, gpointer data _U_) { float expansion[3]; float transBox[3], cartCoord[3]; float transZero[3] = { 0.f, 0.f, 0.f}; VisuData *dataObj; gboolean rebuildTrans, redraw; if (disableCallbacks) return; dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelGeometry)); if (!dataObj) return; disableCallbacks = TRUE; redraw = rebuildTrans = FALSE; if (gtk_toggle_button_get_active(button)) { /* Before applying expansion we put everything into the box if it is not there yet. */ if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkAllowTranslations))) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(checkAllowTranslations), TRUE); transBox[0] = (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinTransXYZ[0])); transBox[1] = (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinTransXYZ[1])); transBox[2] = (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinTransXYZ[2])); visu_box_convertBoxCoordinatestoXYZ(visu_boxed_getBox(VISU_BOXED(dataObj)), cartCoord, transBox); rebuildTrans = (gboolean)visu_data_setXYZtranslation(dataObj, cartCoord); rebuildTrans = visu_data_constrainedInTheBox(dataObj) || rebuildTrans; transStatus = FALSE; } else transStatus = TRUE; expansion[0] = (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinExpandXYZ[0])); expansion[1] = (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinExpandXYZ[1])); expansion[2] = (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinExpandXYZ[2])); redraw = visu_data_replicate(dataObj, expansion); } else { redraw = visu_data_restore(dataObj); /* We release the translation if not checked. */ if (!transStatus) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(checkAllowTranslations), FALSE); rebuildTrans = (gboolean)visu_data_setXYZtranslation(dataObj, transZero); rebuildTrans = visu_data_constrainedFree(dataObj) || rebuildTrans; } } disableCallbacks = FALSE; if (rebuildTrans) g_signal_emit_by_name(G_OBJECT(dataObj), "PositionChanged", (VisuElement*)0, NULL); if (rebuildTrans || redraw) VISU_REDRAW_ADD; /* Set the sensitivity of the translation. */ updateSensitive(dataObj); } static void onExtensionChanged(VisuBox *box _U_, gpointer data) { updateValues(VISU_DATA(data)); } static void onTransChanged(VisuData *dataObj, gpointer data _U_) { updateValues(dataObj); } static void onUnitChanged(GtkComboBox *combo, gpointer data _U_) { gint val; ToolUnits unit; VisuData *dataObj; VisuGlView *view; val = gtk_combo_box_get_active(combo); g_return_if_fail(val >= 0); unit = (ToolUnits)val; dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelGeometry)); view = visu_ui_panel_getView(VISU_UI_PANEL(panelGeometry)); g_return_if_fail(dataObj && view); if (visu_box_setUnit(visu_boxed_getBox(VISU_BOXED(dataObj)), unit)) VISU_REDRAW_ADD; } static void onAdjustChanged(GtkToggleButton *toggle, gpointer data _U_) { visu_ui_rendering_window_class_setAutoAdjust(gtk_toggle_button_get_active(toggle)); } static void onDiffChanged(GtkToggleButton *toggle, gpointer data _U_) { visu_gl_ext_setActive(VISU_GL_EXT(visu_gl_ext_geodiff_getDefault()), gtk_toggle_button_get_active(toggle)); visu_gl_ext_node_vectors_draw(visu_gl_ext_geodiff_getDefault()); VISU_REDRAW_ADD; } static void onPathToggled(GtkToggleButton *toggle, gpointer data _U_) { gboolean used; float t[3]; used = gtk_toggle_button_get_active(toggle); gtk_widget_set_sensitive(hboxVisuPaths, used); gtk_widget_set_sensitive(hboxVisuPaths2, used); if (!paths) { getCartesianTranslation(t); paths = visu_paths_new(t); visu_gl_ext_paths_set(extPaths, paths); } visu_gl_ext_setActive(VISU_GL_EXT(extPaths), used); VISU_REDRAW_ADD; } static void pinPath() { VisuData *dataObj; dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelGeometry)); if (dataObj && paths) visu_paths_pinPositions(paths, dataObj); visu_ui_panel_browser_setMessage(_("Recording paths"), GTK_MESSAGE_INFO); } static void onPathSaveToggled(GtkToggleButton *toggle, gpointer data _U_) { if (gtk_toggle_button_get_active(toggle)) pinPath(); else visu_ui_panel_browser_setMessage((const gchar*)0, GTK_MESSAGE_INFO); } static void onDirBrowsed(VisuObject *obj _U_, VisuUiDirectoryType type, gpointer user _U_) { if (type == VISU_UI_DIR_BROWSER) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(togglePathSave), FALSE); } static void onPathClearClicked(GtkButton *bt _U_, gpointer data _U_) { if (paths) { visu_paths_empty(paths); visu_gl_ext_paths_setDirty(extPaths); visu_gl_ext_paths_draw(extPaths); } gtk_label_set_markup(GTK_LABEL(labelVisuPaths), NO_PATH); VISU_REDRAW_ADD; } static void onColorisePathToggled(GtkToggleButton *bt, gpointer data) { gboolean set; ToolShade *shade; set = gtk_toggle_button_get_active(bt); gtk_widget_set_sensitive(GTK_WIDGET(data), set); shade = (set)?visu_ui_shade_combobox_getSelection(VISU_UI_SHADE_COMBOBOX(data)):(ToolShade*)0; if (visu_paths_setToolShade(paths, shade)) { visu_gl_ext_paths_setDirty(extPaths); visu_gl_ext_paths_draw(extPaths); VISU_REDRAW_ADD; } } static void onToolShadePathSelected(VisuUiShadeCombobox *combo _U_, ToolShade *shade, gpointer data _U_) { if (visu_paths_setToolShade(paths, shade)) { visu_gl_ext_paths_setDirty(extPaths); visu_gl_ext_paths_draw(extPaths); VISU_REDRAW_ADD; } } static void onSavePathClicked(GtkButton *bt _U_, gpointer data _U_) { GtkWidget *wd; gint response; GError *error; gchar *base; if (visu_paths_getLength(paths) < 1) return; wd = gtk_file_chooser_dialog_new(_("Export current set of paths."), (GtkWindow*)0, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); if (!exportPathFile) exportPathFile = g_build_filename(g_get_current_dir(), _("paths.xml"), NULL); base = g_path_get_basename(exportPathFile); gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(wd), base); g_free(base); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 7 gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(wd), TRUE); #endif do { response = gtk_dialog_run(GTK_DIALOG(wd)); if (exportPathFile) g_free(exportPathFile); exportPathFile = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(wd)); switch (response) { case GTK_RESPONSE_ACCEPT: error = (GError*)0; if (!visu_paths_exportXMLFile(paths, exportPathFile, &error)) { visu_ui_raiseWarning(_("Export current set of paths."), error->message, GTK_WINDOW(wd)); g_error_free(error); response = GTK_RESPONSE_NONE; } break; default: response = GTK_RESPONSE_ACCEPT; break; } } while (response != GTK_RESPONSE_ACCEPT); gtk_widget_destroy(wd); } static void onLoadPathClicked(GtkButton *bt _U_, gpointer data _U_) { GtkWidget *wd; gint response; GError *error; gchar *text, *directory; wd = gtk_file_chooser_dialog_new(_("Load a set of paths."), (GtkWindow*)0, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); directory = visu_ui_getLastOpenDirectory(); if (directory) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(wd), directory); do { response = gtk_dialog_run(GTK_DIALOG(wd)); if (exportPathFile) g_free(exportPathFile); exportPathFile = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(wd)); switch (response) { case GTK_RESPONSE_ACCEPT: error = (GError*)0; if (!visu_paths_parseFromXML(exportPathFile, paths, &error)) { visu_ui_raiseWarning(_("Load a set of paths."), error->message, GTK_WINDOW(wd)); g_error_free(error); response = GTK_RESPONSE_NONE; } break; default: response = GTK_RESPONSE_ACCEPT; break; } } while (response != GTK_RESPONSE_ACCEPT); gtk_widget_destroy(wd); visu_gl_ext_paths_setDirty(extPaths); visu_gl_ext_paths_draw(extPaths); text = g_strdup_printf(PATH, visu_paths_getLength(paths)); gtk_label_set_markup(GTK_LABEL(labelVisuPaths), text); g_free(text); VISU_REDRAW_ADD; } /** * visu_ui_panel_geometry_getPaths: * * This panel can store a #VisuPaths object. * * Since: 3.7 * * Returns: (transfer none): the stored #VisuPaths object. **/ VisuPaths* visu_ui_panel_geometry_getPaths() { return paths; } /*******************************/ /* Test script for this panel. */ /*******************************/ static guint n_issues; #define TEST_COND(C) {if (!(C)) {n_issues += 1; g_message("%s failed", #C);}} static void _resetTranslation() { guint i; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkAllowTranslations), FALSE); for (i = 0; i < 3; i++) gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinTransXYZ[i]), 0.); } static void _testTranslation(VisuData *data, gboolean status) { float *trans, cartCoord[3]; TEST_COND(visu_data_getTranslationStatus(data) == status); trans = visu_data_getXYZtranslation(data); if (status) getCartesianTranslation(cartCoord); else { cartCoord[0] = 0.f; cartCoord[1] = 0.f; cartCoord[2] = 0.f; } TEST_COND(trans[0] == cartCoord[0]); TEST_COND(trans[1] == cartCoord[1]); TEST_COND(trans[2] == cartCoord[2]); g_free(trans); } /** * visu_ui_panel_geometry_runTests: * @error: the location of a nullified #GError pointer. * * Internal test routine, used by the test suite. * * Since: 3.7 **/ void visu_ui_panel_geometry_runTests(GError **error) { VisuData *data; GQuark TEST_ERROR = g_quark_from_static_string("Testing suite error"); data = visu_ui_panel_getData(VISU_UI_PANEL(panelGeometry)); n_issues = 0; if (widgetsNotBuilt) gtk_container_add(GTK_CONTAINER(panelGeometry), createInteriorBox()); /* Testing translations */ /* -------------------- */ _resetTranslation(); /* Check no change. */ gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinTransXYZ[0]), 0.5); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkAllowTranslations), FALSE); _testTranslation(data, FALSE); _resetTranslation(); /* Check change before applying. */ gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinTransXYZ[0]), 0.5); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkAllowTranslations), TRUE); _testTranslation(data, TRUE); _resetTranslation(); /* Check change after applying. */ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkAllowTranslations), TRUE); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinTransXYZ[0]), 0.25); _testTranslation(data, TRUE); _resetTranslation(); if (n_issues > 0) *error = g_error_new(TEST_ERROR, 0, "There are %d failed tests.", n_issues); } v_sim-3.7.0/src/panelModules/panelGeometry.h0000644000353400050620000000376512215546063016003 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef PANELGEOMETRY_H #define PANELGEOMETRY_H #include #include VisuUiPanel* visu_ui_panel_geometry_init(); VisuPaths* visu_ui_panel_geometry_getPaths(); void visu_ui_panel_geometry_runTests(GError **error); #endif v_sim-3.7.0/src/panelModules/panelAxes.c0000644000353400050620000007714312215546064015105 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "panelAxes.h" #include #include #include #include #include #include #include #include #include #include #include #include /** * SECTION: panelAxes * @short_description: The tab where axes, box, scale and legend are * setup. * * Nothing tunable here. */ /* Sensitive widget in this subpanel. */ static GtkWidget *panelAxes; static GtkWidget *lineBox; static GtkWidget *lineAxes; static GtkWidget *lineScales; static GtkWidget *spinScaleLength; static GtkWidget *entryScale; static GtkWidget *originespin[3]; static GtkWidget *orientationspin[3]; static GtkWidget *checkLegend; static GtkWidget *checkLengths, *checkAxes; /* , *checkBasis */ static GtkWidget *spinXPos, *spinYPos, *spinXLegPos, *spinYLegPos; static GtkWidget *lblScales; static gboolean disableCallbacks; static VisuGlExtAxes *currentAxes = NULL; /* Private functions. */ static GtkWidget *createInteriorAxes(); /* Local callbacks. */ static void onExtensionUsed(VisuUiLine *line, gboolean used, gpointer data); static void onBoxRGBValueChanged(VisuUiLine *line, float *rgb, gpointer data); static void onBoxLineWidthChanged(VisuUiLine *line, gint width, gpointer data); static void onBoxStippleChanged(VisuUiLine *line, gint stipple, gpointer data); static void onBoxLengthsToggled(GtkToggleButton *toggle, gpointer data); static void onBoxLegPosChanged(GtkSpinButton *spin, gpointer data); static void onAxesToggled(GtkToggleButton *toggle, gpointer data); static void onAxesWidthChanged(VisuUiLine *line, gint width, gpointer user_data); static void onAxesRGBChanged(VisuUiLine *line, float *rgb, gpointer data); static void onAxesStippleChanged(VisuUiLine *line, gint stipple, gpointer data); static void onAxesPosChanged(GtkSpinButton *spin, gpointer data); static void onEnter(VisuUiPanel *visu_ui_panel, gpointer data); static void onResources(GObject *object, VisuData *dataObj, gpointer data); static void onScalesWidthChanged(VisuUiLine *line, gint width, gpointer user_data); static void onScalesRGBChanged(VisuUiLine *line, float *rgb, gpointer data); static void onScalesStippleChanged(VisuUiLine *line, gint stipple, gpointer data); static void scaleDistanceChanged(GtkSpinButton *spin,gpointer data); static void scaleOriginChanged(GtkSpinButton *spin,gpointer data); static void scaleOrientationChanged(GtkSpinButton *spin,gpointer data); static void onLegendChanged(GtkEntry *entry, gpointer data); static void onUseLegendChanged(GtkToggleButton *toggle, gpointer data); static void onViewAvail(VisuObject *obj, VisuData *dataObj, VisuGlView *view, gpointer data); /** * visu_ui_panel_axes_init: (skip) * * Should be used in the list declared in externalModules.h to be loaded by * V_Sim on start-up. This routine will create the #VisuUiPanel where the axes and the * label stuffs can be tuned, such as their colour, create scales... * * Returns: a newly created #VisuUiPanel object. */ VisuUiPanel* visu_ui_panel_axes_init(VisuUiMain *ui _U_) { panelAxes = visu_ui_panel_newWithIconFromPath("Panel_axes", _("Box, axes and labels"), _("Frames/labels"), "stock-axes_20.png"); if (!panelAxes) return (VisuUiPanel*)0; gtk_container_add(GTK_CONTAINER(panelAxes), createInteriorAxes()); visu_ui_panel_setDockable(VISU_UI_PANEL(panelAxes), TRUE); /* Create the callbacks of all the sensitive widgets. */ g_signal_connect(G_OBJECT(panelAxes), "page-entered", G_CALLBACK(onEnter), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "dataRendered", G_CALLBACK(onViewAvail), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "resourcesLoaded", G_CALLBACK(onResources), (gpointer)0); /* Private parameters. */ disableCallbacks = FALSE; return VISU_UI_PANEL(panelAxes); } /** * visu_ui_panel_axes_setAxesExtension: * @axes: (transfer full) (allow-none): a #VisuGlExtAxes object. * * Set the current axes extension handled by this #VisuUiPanel. * * Since: 3.7 **/ void visu_ui_panel_axes_setAxesExtension(VisuGlExtAxes *axes) { if (currentAxes) g_object_unref(currentAxes); currentAxes = axes; if (axes) g_object_ref(axes); } static GtkWidget *createInteriorAxes() { GtkWidget *vbox, *hbox, *vbox2; GtkWidget *label; GtkWidget *table; GtkWidget *align; float *xyz, *orientation, len; VisuGlExtScale *scale; gchar *lblXYZ[3] = {"X", "Y", "Z"}; float xyzDefault[3] = {0.f, 0.f, 0.f}; float orientationDefault[3] = {1.f, 0.f, 0.f}; int i; #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkTooltips *tooltips; tooltips = gtk_tooltips_new (); #endif vbox = gtk_vbox_new(FALSE, 0); /*********************/ /* The Bounding box. */ /*********************/ align = gtk_alignment_new(0.5, 0.5, 1, 1); gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 15, 0, 0); gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, FALSE, 0); lineBox = visu_ui_line_new(_("Bounding box")); gtk_container_add(GTK_CONTAINER(align), lineBox); vbox2 = visu_ui_line_getOptionBox(VISU_UI_LINE(lineBox)); checkLengths = gtk_check_button_new_with_mnemonic(_("Show box _lengths")); gtk_box_pack_start(GTK_BOX(vbox2), checkLengths, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(_("x pos.")), TRUE, TRUE, 0); spinXLegPos = gtk_spin_button_new_with_range(0., 1., 0.1); gtk_box_pack_start(GTK_BOX(hbox), spinXLegPos, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(_("y pos.")), TRUE, TRUE, 0); spinYLegPos = gtk_spin_button_new_with_range(0., 1., 0.1); gtk_box_pack_start(GTK_BOX(hbox), spinYLegPos, FALSE, FALSE, 0); /* label = gtk_label_new(_("Draw basis set:")); */ /* gtk_misc_set_alignment(GTK_MISC(label), 1., 0.5); */ /* gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); */ /* checkBasis = gtk_check_button_new(); */ /* gtk_box_pack_start(GTK_BOX(hbox), checkBasis, FALSE, FALSE, 0); */ g_signal_connect(G_OBJECT(lineBox), "use-changed", G_CALLBACK(onExtensionUsed), (gpointer)visu_gl_ext_box_getDefault()); g_signal_connect(G_OBJECT(lineBox), "width-changed", G_CALLBACK(onBoxLineWidthChanged), (gpointer)0); g_signal_connect(G_OBJECT(lineBox), "color-changed", G_CALLBACK(onBoxRGBValueChanged), (gpointer)0); g_signal_connect(G_OBJECT(lineBox), "stipple-changed", G_CALLBACK(onBoxStippleChanged), (gpointer)0); g_signal_connect(G_OBJECT(checkLengths), "toggled", G_CALLBACK(onBoxLengthsToggled), (gpointer)0); g_signal_connect(G_OBJECT(spinXLegPos), "value-changed", G_CALLBACK(onBoxLegPosChanged), (gpointer)0); g_signal_connect(G_OBJECT(spinYLegPos), "value-changed", G_CALLBACK(onBoxLegPosChanged), (gpointer)0); /*************/ /* The Axes. */ /*************/ lineAxes = visu_ui_line_new(_("Basis set")); align = gtk_alignment_new(0.5, 0., 1, 1); gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 15, 0, 0); gtk_container_add(GTK_CONTAINER(align), lineAxes); gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, FALSE, 0); vbox2 = visu_ui_line_getOptionBox(VISU_UI_LINE(lineAxes)); checkAxes = gtk_check_button_new_with_mnemonic(_("Use _box basis-set")); gtk_box_pack_start(GTK_BOX(vbox2), checkAxes, TRUE, TRUE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(_("x pos.")), TRUE, TRUE, 0); spinXPos = gtk_spin_button_new_with_range(0., 1., 0.1); gtk_box_pack_start(GTK_BOX(hbox), spinXPos, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(_("y pos.")), TRUE, TRUE, 0); spinYPos = gtk_spin_button_new_with_range(0., 1., 0.1); gtk_box_pack_start(GTK_BOX(hbox), spinYPos, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(lineAxes), "use-changed", G_CALLBACK(onExtensionUsed), (gpointer)currentAxes); g_signal_connect(G_OBJECT(lineAxes), "width-changed", G_CALLBACK(onAxesWidthChanged), (gpointer)0); g_signal_connect(G_OBJECT(lineAxes), "color-changed", G_CALLBACK(onAxesRGBChanged), (gpointer)0); g_signal_connect(G_OBJECT(lineAxes), "stipple-changed", G_CALLBACK(onAxesStippleChanged), (gpointer)0); g_signal_connect(G_OBJECT(checkAxes), "toggled", G_CALLBACK(onAxesToggled), (gpointer)0); g_signal_connect(G_OBJECT(spinXPos), "value-changed", G_CALLBACK(onAxesPosChanged), (gpointer)0); g_signal_connect(G_OBJECT(spinYPos), "value-changed", G_CALLBACK(onAxesPosChanged), (gpointer)0); /**************/ /* The legend */ /**************/ hbox = gtk_hbox_new(FALSE, 0); align = gtk_alignment_new(0.5, 0., 1, 1); gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 15, 0, 0); gtk_container_add(GTK_CONTAINER(align), hbox); gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, FALSE, 0); /* The drawn checkbox. */ checkLegend = gtk_check_button_new(); gtk_box_pack_start(GTK_BOX(hbox), checkLegend, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(checkLegend), "toggled", G_CALLBACK(onUseLegendChanged), (gpointer)0); /* The label. */ label = gtk_label_new(_("Legend")); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_widget_set_name(label, "label_head"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2); /*************************/ /* Adding scale widgets. */ /*************************/ lineScales = visu_ui_line_new(_("Label")); align = gtk_alignment_new(0.5, 0., 1, 1); gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 15, 0, 0); gtk_container_add(GTK_CONTAINER(align), lineScales); gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, FALSE, 0); vbox2 = visu_ui_line_getOptionBox(VISU_UI_LINE(lineScales)); g_signal_connect(G_OBJECT(lineScales), "use-changed", G_CALLBACK(onExtensionUsed), (gpointer)visu_gl_ext_scale_getDefault()); g_signal_connect(G_OBJECT(lineScales), "width-changed", G_CALLBACK(onScalesWidthChanged), (gpointer)0); g_signal_connect(G_OBJECT(lineScales), "color-changed", G_CALLBACK(onScalesRGBChanged), (gpointer)0); g_signal_connect(G_OBJECT(lineScales), "stipple-changed", G_CALLBACK(onScalesStippleChanged), (gpointer)0); /* To be removed. */ lblScales = gtk_label_new(_("Several scales are defined from resource files,\n" "but only one is editable.")); gtk_label_set_use_markup(GTK_LABEL(lblScales), TRUE); gtk_box_pack_end(GTK_BOX(vbox2), lblScales, FALSE, FALSE, 10); gtk_widget_set_no_show_all(lblScales, TRUE); scale = visu_gl_ext_scale_getDefault(); if (visu_gl_ext_scale_getNArrows(scale) > 0) { len = visu_gl_ext_scale_getLength(scale, 0); xyz = visu_gl_ext_scale_getOrigin(scale, 0); orientation = visu_gl_ext_scale_getOrientation(scale, 0); if (visu_gl_ext_scale_getNArrows(scale) > 1) gtk_widget_show(lblScales); } else { len = 5.; xyz = xyzDefault; orientation = orientationDefault; } /* code yoann*/ hbox = gtk_hbox_new(FALSE,0); label = gtk_label_new(_("Legend:")); gtk_misc_set_alignment(GTK_MISC(label), 1., 0.5); gtk_box_pack_start(GTK_BOX(hbox),label, FALSE, FALSE, 0); entryScale = gtk_entry_new(); gtk_widget_set_tooltip_text(entryScale, _("Use blank legend to print the default" " value with the distance.")); gtk_box_pack_start(GTK_BOX(hbox), entryScale, TRUE, TRUE, 3); g_signal_connect(G_OBJECT(entryScale), "activate", G_CALLBACK(onLegendChanged), (gpointer)0); label = gtk_label_new(_("Length:")); gtk_misc_set_alignment(GTK_MISC(label), 1., 0.5); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); spinScaleLength = gtk_spin_button_new_with_range(1., 1000., 1.); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinScaleLength), len); gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinScaleLength), 2); g_signal_connect((gpointer)spinScaleLength, "value-changed", G_CALLBACK(scaleDistanceChanged), (gpointer)0); gtk_box_pack_start(GTK_BOX(hbox),spinScaleLength, FALSE, FALSE, 3); gtk_box_pack_start(GTK_BOX(vbox2),hbox,FALSE,FALSE,5); table = gtk_table_new(3, 4, FALSE); /* je declare une nouvelle table*/ gtk_box_pack_start(GTK_BOX(vbox2), table, FALSE, FALSE, 0); label = gtk_label_new(_("Origin")); /* je cree le premier labelle*/ gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);/*fonction pour placer le labelle a droite*/ gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2, /*je positionne le label */ GTK_FILL | GTK_EXPAND, (GtkAttachOptions)0, 5, 0);/*j'indique qu il peut prendre toute la place qu'il a besoins*/ label = gtk_label_new(_("Orientation")); /* je crée le second label*/ gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 2, 3,/* je le positionne*/ GTK_FILL | GTK_EXPAND, (GtkAttachOptions)0, 5, 0);/* j'indique qui peut s etendre */ for (i = 0; i < 3; i++) { gtk_table_attach(GTK_TABLE(table), gtk_label_new(lblXYZ[i]), 1 + i, 2 + i, 0, 1, (GtkAttachOptions)0, (GtkAttachOptions)0, 0, 0); originespin[i] = gtk_spin_button_new_with_range(-10., 999., 1.); gtk_spin_button_set_value(GTK_SPIN_BUTTON(originespin[i]), xyz[i]); gtk_spin_button_set_digits(GTK_SPIN_BUTTON(originespin[i]), 2); g_signal_connect(G_OBJECT(originespin[i]), "value-changed", G_CALLBACK(scaleOriginChanged), GINT_TO_POINTER(i)); gtk_table_attach(GTK_TABLE(table), originespin[i], 1 + i, 2 + i, 1, 2, (GtkAttachOptions)0, (GtkAttachOptions)0, 3, 0); orientationspin[i] = gtk_spin_button_new_with_range(-10., 999., 1.); gtk_spin_button_set_value(GTK_SPIN_BUTTON(orientationspin[i]), orientation[i]); gtk_spin_button_set_digits(GTK_SPIN_BUTTON(orientationspin[i]), 2); g_signal_connect(G_OBJECT(orientationspin[i]), "value-changed", G_CALLBACK(scaleOrientationChanged), GINT_TO_POINTER(i)); gtk_table_attach(GTK_TABLE(table), orientationspin[i], 1 + i, 2 + i, 2, 3, (GtkAttachOptions)0, (GtkAttachOptions)0, 3, 0); } gtk_widget_show_all(vbox); /* fonctions qui permet de tous dessiner */ return vbox; } /*************/ /* Callbacks */ /*************/ static void onResources(GObject *object _U_, VisuData *dataObj _U_, gpointer data) { DBG_fprintf(stderr, "Panel Axes: catch the 'resourcesChanged'" " signal, updating.\n"); onEnter(VISU_UI_PANEL(panelAxes), data); } static void onViewAvail(VisuObject *obj _U_, VisuData *dataObj, VisuGlView *view, gpointer data _U_) { VisuBox *box; VisuNodeArray *nodes; DBG_fprintf(stderr, "Panel Axes: caught 'dataRendered' signal, attaching default axes.\n"); box = (dataObj)?visu_boxed_getBox(VISU_BOXED(dataObj)):(VisuBox*)0; nodes = (dataObj)?VISU_NODE_ARRAY(dataObj):(VisuNodeArray*)0; visu_ui_panel_axes_setAxesExtension((dataObj)?visu_gl_ext_axes_getDefault():(VisuGlExtAxes*)0); if (visu_gl_ext_box_setBox(visu_gl_ext_box_getDefault(), box)) visu_gl_ext_box_draw(visu_gl_ext_box_getDefault()); visu_gl_ext_frame_setGlView(VISU_GL_EXT_FRAME(visu_gl_ext_box_legend_getDefault()), view); if (visu_gl_ext_box_legend_setBox(visu_gl_ext_box_legend_getDefault(), box)) visu_gl_ext_frame_draw(VISU_GL_EXT_FRAME(visu_gl_ext_box_legend_getDefault())); visu_gl_ext_frame_setGlView(VISU_GL_EXT_FRAME(visu_gl_ext_legend_getDefault()), view); if (visu_gl_ext_legend_setNodes(visu_gl_ext_legend_getDefault(), nodes)) visu_gl_ext_frame_draw(VISU_GL_EXT_FRAME(visu_gl_ext_legend_getDefault())); if (visu_gl_ext_scale_setGlView(visu_gl_ext_scale_getDefault(), view)) visu_gl_ext_scale_draw(visu_gl_ext_scale_getDefault()); } static void onEnter(VisuUiPanel *visu_ui_panel _U_, gpointer data _U_) { float *xyz, *orientation, xpos, ypos; VisuGlExtScale *scale; float xyzDefault[3] = {0.f, 0.f, 0.f}; float orientationDefault[3] = {1.f, 0.f, 0.f}; gchar *legend; VisuGlExtBox *box; disableCallbacks = TRUE; /* Set the box values. */ box = visu_gl_ext_box_getDefault(); visu_ui_line_setUsed(VISU_UI_LINE(lineBox), visu_gl_ext_getActive(VISU_GL_EXT(box))); visu_ui_line_setWidth(VISU_UI_LINE(lineBox), visu_gl_ext_box_getLineWidth(box)); visu_ui_line_setColor(VISU_UI_LINE(lineBox), visu_gl_ext_box_getRGB(box)); visu_ui_line_setStipple(VISU_UI_LINE(lineBox), visu_gl_ext_box_getLineStipple(box)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkLengths), visu_gl_ext_getActive(VISU_GL_EXT(visu_gl_ext_box_legend_getDefault()))); visu_gl_ext_frame_getPosition(VISU_GL_EXT_FRAME(visu_gl_ext_box_legend_getDefault()), &xpos, &ypos); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinXLegPos), xpos); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinYLegPos), ypos); /* Set the axes values. */ if (currentAxes) { gtk_widget_set_sensitive(lineAxes, TRUE); visu_ui_line_setUsed(VISU_UI_LINE(lineAxes), visu_gl_ext_getActive(VISU_GL_EXT(currentAxes))); visu_ui_line_setWidth(VISU_UI_LINE(lineAxes), visu_gl_ext_axes_getLineWidth(currentAxes)); visu_ui_line_setColor(VISU_UI_LINE(lineAxes), visu_gl_ext_axes_getRGB(currentAxes)); visu_ui_line_setStipple(VISU_UI_LINE(lineAxes), visu_gl_ext_axes_getLineStipple(currentAxes)); visu_gl_ext_axes_getPosition(currentAxes, &xpos, &ypos); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinXPos), xpos); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinYPos), ypos); } else gtk_widget_set_sensitive(lineAxes, FALSE); /* Set the scale class values. */ scale = visu_gl_ext_scale_getDefault(); visu_ui_line_setUsed(VISU_UI_LINE(lineScales), visu_gl_ext_getActive(VISU_GL_EXT(scale))); visu_ui_line_setWidth(VISU_UI_LINE(lineScales), visu_gl_ext_scale_getDefaultLineWidth()); visu_ui_line_setColor(VISU_UI_LINE(lineScales), visu_gl_ext_scale_getDefaultRGB()); visu_ui_line_setStipple(VISU_UI_LINE(lineScales), visu_gl_ext_scale_getDefaultStipple()); /* To be removed. */ gtk_widget_hide(lblScales); if (visu_gl_ext_scale_getNArrows(scale) > 0) { DBG_fprintf(stderr, "Panel Axes: set scales values from %p.\n", (gpointer)scale); xyz = visu_gl_ext_scale_getOrigin(scale, 0); orientation = visu_gl_ext_scale_getOrientation(scale, 0); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinScaleLength), visu_gl_ext_scale_getLength(scale, 0)); legend = (gchar*)visu_gl_ext_scale_getLegend(scale, 0); if (!legend) legend = ""; if (visu_gl_ext_scale_getNArrows(scale) > 1) gtk_widget_show(lblScales); } else { xyz = xyzDefault; orientation = orientationDefault; gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinScaleLength), 5.); legend = ""; } gtk_spin_button_set_value(GTK_SPIN_BUTTON(originespin[0]), xyz[0]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(originespin[1]), xyz[1]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(originespin[2]), xyz[2]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(orientationspin[0]), orientation[0]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(orientationspin[1]), orientation[1]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(orientationspin[2]), orientation[2]); gtk_entry_set_text(GTK_ENTRY(entryScale), legend); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkLegend), visu_gl_ext_getActive(VISU_GL_EXT(visu_gl_ext_legend_getDefault()))); disableCallbacks = FALSE; } static void onExtensionUsed(VisuUiLine *line _U_, gboolean used, gpointer data) { if (disableCallbacks || !data) return; visu_gl_ext_setActive(VISU_GL_EXT(data), used); if (VISU_IS_GL_EXT_SCALE(data)) visu_gl_ext_scale_draw(VISU_GL_EXT_SCALE(data)); else if (VISU_IS_GL_EXT_AXES(data)) visu_gl_ext_axes_draw(VISU_GL_EXT_AXES(data)); else if (VISU_IS_GL_EXT_BOX(data)) visu_gl_ext_box_draw(VISU_GL_EXT_BOX(data)); VISU_REDRAW_ADD; } static void onAxesWidthChanged(VisuUiLine *line _U_, gint width, gpointer data _U_) { if (disableCallbacks || !currentAxes) return; if (visu_gl_ext_axes_setLineWidth(currentAxes, (float)width)) { visu_gl_ext_axes_draw(currentAxes); VISU_REDRAW_ADD; } } static void onAxesRGBChanged(VisuUiLine *line _U_, float *rgb, gpointer data _U_) { if (disableCallbacks || !currentAxes) return; if (visu_gl_ext_axes_setRGB(currentAxes, rgb, TOOL_COLOR_MASK_RGBA)) { visu_gl_ext_axes_draw(currentAxes); VISU_REDRAW_ADD; } } static void onAxesStippleChanged(VisuUiLine *line _U_, gint stipple, gpointer data _U_) { if (disableCallbacks || !currentAxes) return; if (visu_gl_ext_axes_setLineStipple(currentAxes, stipple)) { visu_gl_ext_axes_draw(currentAxes); VISU_REDRAW_ADD; } } static void onAxesToggled(GtkToggleButton *toggle, gpointer data _U_) { VisuData *dataObj; if (disableCallbacks || !currentAxes) return; dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelAxes)); if (visu_gl_ext_axes_setBasisFromBox (currentAxes, (gtk_toggle_button_get_active(toggle))?visu_boxed_getBox(VISU_BOXED(dataObj)):(VisuBox*)0)) { visu_gl_ext_axes_draw(currentAxes); VISU_REDRAW_ADD; } } static void onAxesPosChanged(GtkSpinButton *spin _U_, gpointer data _U_) { if (disableCallbacks || !currentAxes) return; if (visu_gl_ext_axes_setPosition(currentAxes, (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinXPos)), (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinYPos)))) { visu_gl_ext_axes_draw(currentAxes); VISU_REDRAW_ADD; } } static void scaleDistanceChanged(GtkSpinButton *spin, gpointer data _U_) { gboolean res; VisuGlExtScale *scale; float xyz[3], orientation[3], len; if (disableCallbacks) return; scale = visu_gl_ext_scale_getDefault(); if (visu_gl_ext_scale_getNArrows(scale) == 0) { xyz[0] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(originespin[0])); xyz[1] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(originespin[1])); xyz[2] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(originespin[2])); orientation[0] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(orientationspin[0])); orientation[1] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(orientationspin[1])); orientation[2] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(orientationspin[2])); len = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin)) / 2.f; visu_gl_ext_scale_add(scale, xyz, orientation, len, (const gchar*)0); } DBG_fprintf(stderr, "Panel Box&axes: scale distance changed.\n"); res = visu_gl_ext_scale_setLength(scale, 0, (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin))); if (*gtk_entry_get_text(GTK_ENTRY(entryScale)) == '\0') visu_gl_ext_scale_setLegend(scale, 0, (const gchar*)0); else visu_gl_ext_scale_setLegend(scale, 0, gtk_entry_get_text(GTK_ENTRY(entryScale))); if (res) { visu_gl_ext_scale_draw(scale); VISU_REDRAW_ADD; } } static void scaleOriginChanged(GtkSpinButton *spin, gpointer data) { gboolean res; int xyzMask[3] = {TOOL_XYZ_MASK_X, TOOL_XYZ_MASK_Y, TOOL_XYZ_MASK_Z}; int val; VisuGlExtScale *scale; float xyz[3], orientation[3]; val = GPOINTER_TO_INT(data); g_return_if_fail(val >= 0 && val < 3); if (disableCallbacks) return; scale = visu_gl_ext_scale_getDefault(); if (visu_gl_ext_scale_getNArrows(scale) == 0) { xyz[0] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(originespin[0])); xyz[1] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(originespin[1])); xyz[2] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(originespin[2])); orientation[0] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(orientationspin[0])); orientation[1] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(orientationspin[1])); orientation[2] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(orientationspin[2])); xyz[val] += 1.f; visu_gl_ext_scale_add(scale, xyz, orientation, gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinScaleLength)), (const gchar*)0); } DBG_fprintf(stderr, "Panel Box&axes: scale origine %d change.\n", val); xyz[val] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin)); res = visu_gl_ext_scale_setOrigin(scale, 0, xyz, xyzMask[val]); if (res) { visu_gl_ext_scale_draw(scale); VISU_REDRAW_ADD; } } static void scaleOrientationChanged(GtkSpinButton *spin, gpointer data) { gboolean res; int xyzMask[3] = {TOOL_XYZ_MASK_X, TOOL_XYZ_MASK_Y, TOOL_XYZ_MASK_Z}; int val; VisuGlExtScale *scale; float xyz[3], orientation[3]; val = GPOINTER_TO_INT(data); g_return_if_fail(val >= 0 && val < 3); if (disableCallbacks) return; scale = visu_gl_ext_scale_getDefault(); if (visu_gl_ext_scale_getNArrows(scale) == 0) { xyz[0] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(originespin[0])); xyz[1] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(originespin[1])); xyz[2] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(originespin[2])); orientation[0] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(orientationspin[0])); orientation[1] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(orientationspin[1])); orientation[2] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(orientationspin[2])); orientation[val] += 999.f; visu_gl_ext_scale_add(scale, xyz, orientation, gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinScaleLength)), (const gchar*)0); } DBG_fprintf(stderr, "Panel Box&axes: scale orientation %d changed.\n", val); xyz[val] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin)); res = visu_gl_ext_scale_setOrientation(scale, 0, xyz, xyzMask[val]); if (res) { visu_gl_ext_scale_draw(scale); VISU_REDRAW_ADD; } } static void onLegendChanged(GtkEntry *entry, gpointer data _U_) { gboolean res; VisuGlExtScale *scale; float xyz[3], orientation[3]; if (disableCallbacks) return; scale = visu_gl_ext_scale_getDefault(); if (visu_gl_ext_scale_getNArrows(scale) == 0) { xyz[0] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(originespin[0])); xyz[1] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(originespin[1])); xyz[2] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(originespin[2])); orientation[0] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(orientationspin[0])); orientation[1] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(orientationspin[1])); orientation[2] = gtk_spin_button_get_value(GTK_SPIN_BUTTON(orientationspin[2])); visu_gl_ext_scale_add(scale, xyz, orientation, gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinScaleLength)), (const gchar*)0); } DBG_fprintf(stderr, "Panel Box&axes: scale legend changed.\n"); res = visu_gl_ext_scale_setLegend(scale, 0, gtk_entry_get_text(entry)); if (res) { visu_gl_ext_scale_draw(scale); VISU_REDRAW_ADD; } } static void onScalesWidthChanged(VisuUiLine *line _U_, gint width, gpointer data _U_) { if (visu_gl_ext_scale_setDefaultLineWidth(width)) { visu_gl_ext_scale_draw(visu_gl_ext_scale_getDefault()); VISU_REDRAW_ADD; } } static void onScalesRGBChanged(VisuUiLine *line _U_, float *rgb, gpointer data _U_) { float rgba[4]; memcpy(rgba, rgb, sizeof(float) * 3); rgba[3] = 1.f; if (visu_gl_ext_scale_setDefaultRGB(rgba, TOOL_COLOR_MASK_RGBA)) { visu_gl_ext_scale_draw(visu_gl_ext_scale_getDefault()); VISU_REDRAW_ADD; } } static void onScalesStippleChanged(VisuUiLine *line _U_, gint stipple, gpointer data _U_) { if (visu_gl_ext_scale_setDefaultStipple(stipple)) { visu_gl_ext_scale_draw(visu_gl_ext_scale_getDefault()); VISU_REDRAW_ADD; } } static void onUseLegendChanged(GtkToggleButton *toggle, gpointer data _U_) { if (disableCallbacks) return; visu_gl_ext_setActive(VISU_GL_EXT(visu_gl_ext_legend_getDefault()), gtk_toggle_button_get_active(toggle)); visu_gl_ext_frame_draw(VISU_GL_EXT_FRAME(visu_gl_ext_legend_getDefault())); VISU_REDRAW_ADD; } static void onBoxLengthsToggled(GtkToggleButton *toggle, gpointer data _U_) { if (disableCallbacks) return; visu_gl_ext_setActive(VISU_GL_EXT(visu_gl_ext_box_legend_getDefault()), gtk_toggle_button_get_active(toggle)); visu_gl_ext_frame_draw(VISU_GL_EXT_FRAME(visu_gl_ext_box_legend_getDefault())); VISU_REDRAW_ADD; } static void onBoxLineWidthChanged(VisuUiLine *line _U_, gint width, gpointer data _U_) { if (disableCallbacks) return; if (visu_gl_ext_box_setLineWidth(visu_gl_ext_box_getDefault(), (float)width)) { visu_gl_ext_box_draw(visu_gl_ext_box_getDefault()); VISU_REDRAW_ADD; } } static void onBoxStippleChanged(VisuUiLine *line _U_, gint stipple, gpointer data _U_) { if (disableCallbacks) return; if (visu_gl_ext_box_setLineStipple(visu_gl_ext_box_getDefault(), stipple)) { visu_gl_ext_box_draw(visu_gl_ext_box_getDefault()); VISU_REDRAW_ADD; } } static void onBoxRGBValueChanged(VisuUiLine *line _U_, float *rgb, gpointer data _U_) { if (disableCallbacks) return; if (visu_gl_ext_box_setRGB(visu_gl_ext_box_getDefault(), rgb, TOOL_COLOR_MASK_RGBA)) { visu_gl_ext_box_draw(visu_gl_ext_box_getDefault()); VISU_REDRAW_ADD; } } static void onBoxLegPosChanged(GtkSpinButton *spin _U_, gpointer data _U_) { if (disableCallbacks) return; if (visu_gl_ext_frame_setPosition (VISU_GL_EXT_FRAME(visu_gl_ext_box_legend_getDefault()), (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinXLegPos)), (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinYLegPos)))) { visu_gl_ext_frame_draw(VISU_GL_EXT_FRAME(visu_gl_ext_box_legend_getDefault())); VISU_REDRAW_ADD; } } v_sim-3.7.0/src/panelModules/panelAxes.h0000644000353400050620000000367212215546064015106 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef PANELAXES_H #define PANELAXES_H #include #include VisuUiPanel* visu_ui_panel_axes_init(); void visu_ui_panel_axes_setAxesExtension(VisuGlExtAxes *axes); #endif v_sim-3.7.0/src/panelModules/panelFogBgColor.c0000644000353400050620000005253712216005442016157 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "panelFogBgColor.h" #include #include #include #include #include #include #include #include #include #include #include /** * SECTION:panelFogBgColor * @short_description: The widget to tune the background and the fog. * * This is the user interface for fog and the background. The * background can be either uniform or use a bitmap picture. The fog * can be of different colours, custom or background. */ /* Sensitive widget in this subpanel. */ static GtkWidget *checkFogIsOn; static GtkWidget *rangeFogStart, *rangeFogEnd; static GtkWidget *radioBgFog, *radioOtherFog; static GtkWidget *rgbBgColor[4]; static GtkWidget *rgbFogColor[3]; static GtkWidget *bgImageWd, *checkFollowZoom; static gulong trans_signal, gross_signal; /* Private functions. */ GtkWidget *createInteriorFogBgColor(); void createCallBacksFogBgColor(); static gboolean loadBgFile(gpointer data); /* Local callbacks. */ static void fogCheckChanged(GtkToggleButton *button, gpointer data); static void changedRGBBgColor(GtkRange *rg, gpointer data); static void radioBgChanged(GtkToggleButton *button, gpointer data); static void changedRGBFogColor(GtkRange *rg, gpointer data); static void changedFogStart(GtkRange *rg, gpointer data); static void changedFogEnd(GtkRange *rg, gpointer data); static void onFogBgEnter(VisuUiPanel *visu_ui_panel, gpointer data); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 11 static void onBgImageSet(GtkFileChooserButton *filechooserbutton, gpointer data); #else static void onBgImageSet(GtkDialog *dialog, gint response, gpointer data); #endif #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 6 static void onBgImageChoose(GtkButton *bt, gpointer data); #endif static void onBgImageUnset(GtkButton *bt, gpointer data); static void onBgImageFollow(GtkToggleButton *bt, gpointer data); static void onDataReady(VisuObject *obj, VisuData *dataObj, VisuGlView *view, gpointer data); static void onDataNotReady(VisuObject *obj, VisuData *dataObj, VisuGlView *view, gpointer data); static void onCameraChange(VisuGlView *view, gpointer data); static GtkWidget *panelFogBgColor; static int disableCallbacksFogBgColor; VisuUiPanel* visu_ui_panel_bg_init(VisuUiMain *ui _U_) { char *cl = _("Fog and background color"); char *tl = _("Fog & bg"); panelFogBgColor = visu_ui_panel_newWithIconFromPath("Panel_fog_and_bg_color", cl, tl, "stock-fog_20.png"); if (!panelFogBgColor) return (VisuUiPanel*)0; gtk_container_add(GTK_CONTAINER(panelFogBgColor), createInteriorFogBgColor()); visu_ui_panel_setDockable(VISU_UI_PANEL(panelFogBgColor), TRUE); /* Create the callbacks of all the sensitive widgets. */ createCallBacksFogBgColor(); g_signal_connect(G_OBJECT(panelFogBgColor), "page-entered", G_CALLBACK(onFogBgEnter), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "dataRendered", G_CALLBACK(onDataReady), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "dataUnRendered", G_CALLBACK(onDataNotReady), (gpointer)0); /* Private parameters. */ disableCallbacksFogBgColor = 0; return VISU_UI_PANEL(panelFogBgColor); } static void onDataReady(VisuObject *visu _U_, VisuData *dataObj, VisuGlView *view, gpointer data _U_) { if (view && dataObj) { visu_gl_ext_bg_setGlView(visu_gl_ext_bg_getDefault(), view); trans_signal = g_signal_connect(G_OBJECT(view), "XsYsChanged", G_CALLBACK(onCameraChange), (gpointer)0); gross_signal = g_signal_connect(G_OBJECT(view), "GrossChanged", G_CALLBACK(onCameraChange), (gpointer)0); } else visu_gl_ext_bg_setGlView(visu_gl_ext_bg_getDefault(), (VisuGlView*)0); } static void onDataNotReady(VisuObject *visu _U_, VisuData *dataObj _U_, VisuGlView *view, gpointer data _U_) { g_signal_handler_disconnect(G_OBJECT(view), trans_signal); g_signal_handler_disconnect(G_OBJECT(view), gross_signal); } static void update_preview_cb(GtkFileChooser *file_chooser, gpointer data) { GtkWidget *preview; char *filename; GdkPixbuf *pixbuf; gboolean have_preview; preview = GTK_WIDGET (data); filename = gtk_file_chooser_get_preview_filename (file_chooser); if (filename) pixbuf = gdk_pixbuf_new_from_file_at_size (filename, 128, 128, NULL); else pixbuf = (GdkPixbuf*)0; have_preview = (pixbuf != NULL); g_free (filename); gtk_image_set_from_pixbuf (GTK_IMAGE (preview), pixbuf); if (pixbuf) g_object_unref (pixbuf); gtk_file_chooser_set_preview_widget_active(file_chooser, have_preview); } GtkWidget *createInteriorFogBgColor() { GtkWidget *vbox, *hbox; GtkWidget *label; GtkWidget *table; #define RED_LABEL _("R:") #define GREEN_LABEL _("G:") #define BLUE_LABEL _("B:") #define ALPHA_LABEL _("A:") char *rgb[4]; char *rgbName[4] = {"scroll_r", "scroll_g", "scroll_b", "scroll_a"}; int i; GtkWidget *dialog, *bt, *preview; GtkFileFilter *filters; #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkTooltips *tooltips; tooltips = gtk_tooltips_new (); #endif rgb[0] = RED_LABEL; rgb[1] = GREEN_LABEL; rgb[2] = BLUE_LABEL; rgb[3] = ALPHA_LABEL; vbox = gtk_vbox_new(FALSE, 0); table = gtk_table_new(5, 2, FALSE); gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 5); hbox = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 0, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 2); label = gtk_label_new(_("Background:")); gtk_widget_set_name(label, "label_head"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2); for (i = 0; i < 4; i++) { label = gtk_label_new(rgb[i]); gtk_table_attach(GTK_TABLE(table), label, 0, 1, i + 1, i + 2, GTK_SHRINK, GTK_SHRINK, 5, 0); rgbBgColor[i] = gtk_hscale_new_with_range(0., 1., 0.001); gtk_scale_set_value_pos(GTK_SCALE(rgbBgColor[i]), GTK_POS_RIGHT); gtk_widget_set_name(rgbBgColor[i], rgbName[i]); gtk_table_attach(GTK_TABLE(table), rgbBgColor[i], 1, 2, i + 1, i + 2, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 5, 0); } hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Insert an image:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); dialog = gtk_file_chooser_dialog_new(_("Choose a background image"), (GtkWindow*)0, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); filters = gtk_file_filter_new(); gtk_file_filter_add_pixbuf_formats(filters); gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filters); preview = gtk_image_new(); gtk_file_chooser_set_preview_widget(GTK_FILE_CHOOSER(dialog), preview); gtk_file_chooser_set_preview_widget_active(GTK_FILE_CHOOSER(dialog), FALSE); g_signal_connect(GTK_FILE_CHOOSER(dialog), "update-preview", G_CALLBACK(update_preview_cb), preview); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 bgImageWd = gtk_file_chooser_button_new_with_dialog(dialog); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 11 g_signal_connect(G_OBJECT(bgImageWd), "file-set", G_CALLBACK(onBgImageSet), (gpointer)0); #else g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(onBgImageSet), (gpointer)bgImageWd); #endif #else bgImageWd = gtk_button_new_from_stock(GTK_STOCK_OPEN); g_signal_connect(G_OBJECT(dialog), "clicked", G_CALLBACK(onBgImageChoose), (gpointer)dialog); #endif gtk_box_pack_start(GTK_BOX(hbox), bgImageWd, TRUE, TRUE, 0); bt = gtk_button_new(); gtk_widget_set_tooltip_text(bt, _("Remove the background image.")); gtk_container_add(GTK_CONTAINER(bt), gtk_image_new_from_stock(GTK_STOCK_CLEAR, GTK_ICON_SIZE_MENU)); gtk_box_pack_start(GTK_BOX(hbox), bt, FALSE, FALSE, 5); g_signal_connect(G_OBJECT(bt), "clicked", G_CALLBACK(onBgImageUnset), (gpointer)bgImageWd); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); checkFollowZoom = gtk_check_button_new_with_mnemonic(_("Image size & position _follow the camera")); g_signal_connect(G_OBJECT(checkFollowZoom), "toggled", G_CALLBACK(onBgImageFollow), (gpointer)0); gtk_box_pack_end(GTK_BOX(hbox), checkFollowZoom, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new(_("Use fog:")); gtk_widget_set_name(label, "label_head"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2); checkFogIsOn = gtk_check_button_new(); gtk_box_pack_start(GTK_BOX(hbox), checkFogIsOn, FALSE, FALSE, 2); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5); table = gtk_table_new(2, 2, FALSE); gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 5); label = gtk_label_new(_("Start:")); gtk_misc_set_alignment(GTK_MISC(label), 1., 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_SHRINK, GTK_SHRINK, 5, 0); rangeFogStart = gtk_hscale_new_with_range(0., 100., 0.1); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 11 gtk_range_set_restrict_to_fill_level(GTK_RANGE(rangeFogStart), TRUE); gtk_range_set_fill_level(GTK_RANGE(rangeFogStart), 50.); gtk_range_set_show_fill_level(GTK_RANGE(rangeFogStart), TRUE); #endif gtk_scale_set_value_pos(GTK_SCALE(rangeFogStart), GTK_POS_RIGHT); gtk_table_attach(GTK_TABLE(table), rangeFogStart, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 5, 0); label = gtk_label_new(_("End:")); gtk_misc_set_alignment(GTK_MISC(label), 1., 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2, GTK_SHRINK, GTK_SHRINK, 5, 0); rangeFogEnd = gtk_hscale_new_with_range(0., 100., 0.1); gtk_scale_set_value_pos(GTK_SCALE(rangeFogEnd), GTK_POS_RIGHT); gtk_table_attach(GTK_TABLE(table), rangeFogEnd, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 5, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5); label = gtk_label_new(_("Color:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2); radioBgFog = gtk_radio_button_new_with_label(NULL, _("background color")); gtk_box_pack_start(GTK_BOX(hbox), radioBgFog, FALSE, FALSE, 2); radioOtherFog = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radioBgFog), _("specific color")); gtk_box_pack_start(GTK_BOX(hbox), radioOtherFog, FALSE, FALSE, 2); table = gtk_table_new(5, 2, FALSE); gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 5); for (i = 0; i < 3; i++) { label = gtk_label_new(rgb[i]); gtk_table_attach(GTK_TABLE(table), label, 0, 1, i + 1, i + 2, GTK_SHRINK, GTK_SHRINK, 5, 0); rgbFogColor[i] = gtk_hscale_new_with_range(0., 1., 0.001); gtk_scale_set_value_pos(GTK_SCALE(rgbFogColor[i]), GTK_POS_RIGHT); gtk_widget_set_sensitive(rgbFogColor[i], FALSE); gtk_widget_set_name(rgbFogColor[i], rgbName[i]); gtk_table_attach(GTK_TABLE(table), rgbFogColor[i], 1, 2, i + 1, i + 2, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 5, 0); } gtk_widget_show_all(vbox); return vbox; } void createCallBacksFogBgColor() { int i; g_signal_connect((gpointer)checkFogIsOn, "toggled", G_CALLBACK(fogCheckChanged), (gpointer)0); for (i = 0; i < 4; i++) g_signal_connect((gpointer)rgbBgColor[i], "value-changed", G_CALLBACK(changedRGBBgColor), GINT_TO_POINTER(i)); g_signal_connect((gpointer)radioBgFog, "toggled", G_CALLBACK(radioBgChanged), (gpointer)0); for (i = 0; i < 3; i++) g_signal_connect((gpointer)rgbFogColor[i], "value-changed", G_CALLBACK(changedRGBFogColor), GINT_TO_POINTER(i)); g_signal_connect((gpointer)rangeFogStart, "value-changed", G_CALLBACK(changedFogStart), (gpointer)rangeFogEnd); g_signal_connect((gpointer)rangeFogEnd, "value-changed", G_CALLBACK(changedFogEnd), (gpointer)rangeFogStart); } /*************/ /* Callbacks */ /*************/ static void fogRedraw() { VisuData *dataObj; dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelFogBgColor)); if (!dataObj) return; visu_gl_ext_fog_create(visu_ui_panel_getView(VISU_UI_PANEL(panelFogBgColor)), visu_boxed_getBox(VISU_BOXED(dataObj))); VISU_REDRAW_ADD; } static void fogCheckChanged(GtkToggleButton *button, gpointer data _U_) { if (disableCallbacksFogBgColor) return; visu_gl_ext_fog_setOn(gtk_toggle_button_get_active(button)); fogRedraw(); } static void changedFogStart(GtkRange *rg, gpointer data _U_) { float val[2]; if (disableCallbacksFogBgColor) return; val[0] = (float)gtk_range_get_value(rg); #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 11 if (val[0] > gtk_range_get_value(GTK_RANGE(data))) { gtk_range_set_value(rg, gtk_range_get_value(GTK_RANGE(data))); val[0] = (float)gtk_range_get_value(rg); } #endif val[0]= val[0] / 100.; if (visu_gl_ext_fog_setStartEndValues(val, VISU_GL_EXT_FOG_MASK_START)) fogRedraw(); } static void changedFogEnd(GtkRange *rg, gpointer data) { float val[2]; val[1] = (float)gtk_range_get_value(rg); if (val[1] < gtk_range_get_value(GTK_RANGE(data))) { gtk_range_set_value(rg, gtk_range_get_value(GTK_RANGE(data))); val[1] = (float)gtk_range_get_value(rg); } #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 11 gtk_range_set_fill_level(GTK_RANGE(rangeFogStart), val[1]); #endif val[1]= val[1] / 100.; if (disableCallbacksFogBgColor) return; if (visu_gl_ext_fog_setStartEndValues(val, VISU_GL_EXT_FOG_MASK_END)) fogRedraw(); } static void radioBgChanged(GtkToggleButton *button, gpointer data _U_) { int i; if (disableCallbacksFogBgColor) return; for (i = 0; i < 3; i++) gtk_widget_set_sensitive(rgbFogColor[i], !gtk_toggle_button_get_active(button)); if (visu_gl_ext_fog_setUseSpecificColor(!gtk_toggle_button_get_active(button))) VISU_REDRAW_ADD; } static void changedRGBFogColor(GtkRange *rg, gpointer data) { GtkAdjustment *adj; int rgbMask[4] = {TOOL_COLOR_MASK_R, TOOL_COLOR_MASK_G, TOOL_COLOR_MASK_B, TOOL_COLOR_MASK_A}; float rgb[4]; if (disableCallbacksFogBgColor) return; g_return_if_fail(GPOINTER_TO_INT(data) >= 0 && GPOINTER_TO_INT(data) < 4); adj = gtk_range_get_adjustment(rg); rgb[GPOINTER_TO_INT(data)] = (float)gtk_adjustment_get_value(adj); if (visu_gl_ext_fog_setValues(rgb, rgbMask[GPOINTER_TO_INT(data)])) VISU_REDRAW_ADD; } static void onFogBgEnter(VisuUiPanel *visu_ui_panel _U_, gpointer data _U_) { int i; float rgb[4]; disableCallbacksFogBgColor = 1; DBG_fprintf(stderr, "Panel Fog & bg : refresh data on enter.\n"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkFogIsOn), visu_gl_ext_fog_getOn()); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioOtherFog), visu_gl_ext_fog_getUseSpecificColor()); visu_gl_ext_bg_getRGBA(visu_gl_ext_bg_getDefault(), rgb); for (i = 0; i < 4; i++) gtk_range_set_value(GTK_RANGE(rgbBgColor[i]), (gdouble)rgb[i]); visu_gl_ext_fog_getValues(rgb); for (i = 0; i < 3; i++) gtk_range_set_value(GTK_RANGE(rgbFogColor[i]), (gdouble)rgb[i]); gtk_range_set_value(GTK_RANGE(rangeFogStart), (gdouble)visu_gl_ext_fog_getStart() * 100.); gtk_range_set_value(GTK_RANGE(rangeFogEnd), (gdouble)visu_gl_ext_fog_getEnd() * 100.); disableCallbacksFogBgColor = 0; } static void changedRGBBgColor(GtkRange *rg, gpointer data) { GtkAdjustment *adj; int rgbMask[4] = {TOOL_COLOR_MASK_R, TOOL_COLOR_MASK_G, TOOL_COLOR_MASK_B, TOOL_COLOR_MASK_A}; float rgb[4]; if (disableCallbacksFogBgColor) return; g_return_if_fail(GPOINTER_TO_INT(data) >= 0 && GPOINTER_TO_INT(data) < 4); adj = gtk_range_get_adjustment(rg); rgb[GPOINTER_TO_INT(data)] = (float)gtk_adjustment_get_value(adj); if (visu_gl_ext_bg_setRGBA(visu_gl_ext_bg_getDefault(), rgb, rgbMask[GPOINTER_TO_INT(data)])) { visu_gl_ext_bg_draw(visu_gl_ext_bg_getDefault()); VISU_REDRAW_ADD; } } #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 11 static void onBgImageSet(GtkFileChooserButton *filechooserbutton, gpointer data _U_) { gchar *filename; DBG_fprintf(stderr, "Panel Fog & Bg: bg image changed.\n"); filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filechooserbutton)); if (!filename) return; g_idle_add(loadBgFile, (gpointer)filename); VISU_REDRAW_ADD; } #else static void onBgImageSet(GtkDialog *dialog, gint response, gpointer data _U_) { gchar *filename; if (response != GTK_RESPONSE_ACCEPT) return; filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); g_idle_add(loadBgFile, (gpointer)filename); VISU_REDRAW_ADD; } #endif #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 6 static void onBgImageChoose(GtkButton *bt, gpointer data) { gchar *filename; if (gtk_dialog_run(GTK_DIALOG(data)) != GTK_RESPONSE_ACCEPT) return; filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data)); g_idle_add(loadBgFile, (gpointer)filename); VISU_REDRAW_ADD; } #endif static gboolean loadBgFile(gpointer data) { GError *error; GdkPixbuf *pixbuf; gchar *filename, *title; gboolean fit; filename = (gchar*)data; DBG_fprintf(stderr, "Panel Fog & Bg: set the background image to '%s'.\n", filename); error = (GError*)0; pixbuf = gdk_pixbuf_new_from_file(filename, &error); if (!pixbuf) { visu_ui_raiseWarning(_("Load image file"), error->message, (GtkWindow*)0); g_error_free(error); g_free(filename); return FALSE; } fit = TRUE; title = g_path_get_basename(filename); g_free(filename); if (!strcmp(title, "logo_grey.png")) { fit = FALSE; g_free(title); title = (gchar*)0; } visu_gl_ext_bg_setImage(visu_gl_ext_bg_getDefault(), gdk_pixbuf_get_pixels(pixbuf), gdk_pixbuf_get_width(pixbuf), gdk_pixbuf_get_height(pixbuf), gdk_pixbuf_get_has_alpha(pixbuf), title, fit); g_object_unref(pixbuf); g_free(title); visu_gl_ext_bg_draw(visu_gl_ext_bg_getDefault()); return FALSE; } static void onBgImageUnset(GtkButton *bt _U_, gpointer data) { visu_gl_ext_bg_setImage(visu_gl_ext_bg_getDefault(), (guchar*)0, 0, 0, FALSE, (const gchar*)0, TRUE); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 gtk_file_chooser_unselect_all(GTK_FILE_CHOOSER(data)); #endif visu_gl_ext_bg_draw(visu_gl_ext_bg_getDefault()); VISU_REDRAW_ADD; } void visu_ui_panel_bg_setImage(const gchar *filename) { gchar *path, *cur; DBG_fprintf(stderr, "Panel Fog & Bg: set bg image to '%s'.\n", filename); if (!g_path_is_absolute(filename)) { cur = g_get_current_dir(); path = g_build_filename(cur, filename, NULL); g_free(cur); } else path = g_strdup(filename); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(bgImageWd), path); #endif loadBgFile(path); } static void onBgImageFollow(GtkToggleButton *bt, gpointer data _U_) { VisuGlView *view; view = visu_ui_panel_getView(VISU_UI_PANEL(panelFogBgColor)); g_return_if_fail(view); visu_gl_ext_bg_setFollowCamera(visu_gl_ext_bg_getDefault(), gtk_toggle_button_get_active(bt), view->camera->gross, view->camera->xs, view->camera->ys); } static void onCameraChange(VisuGlView *view, gpointer data _U_) { if (visu_gl_ext_bg_setCamera(visu_gl_ext_bg_getDefault(), view->camera->gross, view->camera->xs, view->camera->ys)) { visu_gl_ext_bg_draw(visu_gl_ext_bg_getDefault()); VISU_REDRAW_ADD; } } v_sim-3.7.0/src/panelModules/panelFogBgColor.h0000644000353400050620000000453112215546064016164 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef PANELFOGBGCOLOR_H #define PANELFOGBGCOLOR_H #include /** * visu_ui_panel_bg_init: * * Should be used in the list declared in externalModules.h to be loaded by * V_Sim on start-up. This routine will create the #VisuUiPanel where the fog * and the background colour stuff can be tuned, such the position of * the fog, its colour... * * Returns: a newly created #VisuUiPanel object. */ VisuUiPanel* visu_ui_panel_bg_init(); /** * visu_ui_panel_bg_setImage: * @filename: a path to a file. * * Set the background image. */ void visu_ui_panel_bg_setImage(const gchar *filename); #endif v_sim-3.7.0/src/panelModules/panelBrowser.c0000644000353400050620000024130512215546063015620 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse m�l : BILLARD, non joignable par m�l ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant � visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est r�gi par la licence CeCILL soumise au droit fran�ais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffus�e par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez acc�der � cet en-t�te signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept� les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "panelBrowser.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /** * SECTION: panelBrowser * @short_description: A tab to view a list of files and quickly * change from one to another. * * One can display a message about the file list by calling * visu_ui_panel_browser_setMessage(). It is possible also to change * the browser directory or directories with * visu_ui_panel_browser_setCurrentDirectory(). */ static GtkWidget *panelBrowser, *vbox1; static GtkTreeStore *treeStoreFiles; static GtkTreeModel *treeStoreFilesFilter, *treeFilesSortable; enum { COLUMN_BOOLEAN, /* Rendered or not. */ COLUMN_NAME, /* File name in locale of the file system. */ COLUMN_NAME_UTF8, /* File name in UTF8 (to view it in GTK). */ COLUMN_DATE, /* The modified time for the file. */ COLUMN_DATA, /* File info (size / date). */ COLUMN_ACTIVE, /* A boolean to set if this file is filtered or not. */ COLUMN_FILE_KIND, /* An integer that correspond to the file type. */ COLUMN_FILE_VALID, /* TRUE if the file is parsable. */ COLUMN_FILE_ERROR_ID, /* a stock icon id. */ N_COLUMNS }; static GtkWidget *fileTree; static GtkWidget *scrolledwindow1, *infoBar, *labelInfo; static GtkWidget *labelDirectory; #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 17 static GtkWidget *infoImg; #endif static gboolean flagListLoaded; /* A list of array of directory names and the current position in the list. */ static GList *historyBrowseredDirectory, *currentHistory; /* A NULL terminated array of directories names, currently printed. */ static gchar **currentBrowseredDirectory; /* The string common to all paths in currentBrowseredDirectory. */ static gchar *commonBrowseredDirectory; #define HISTORY_TOOLTIP_PREV "Go to previously visited directories in history." #define HISTORY_TOOLTIP_NEXT "Go to next visited directories in history." static GtkWidget *entryFilterBrowser; enum { PANEL_BROWSER_COLUMN_FILTER_LABEL, PANEL_BROWSER_COLUMN_FILTER_ID, PANEL_BROWSER_N_COLUMN_FILTER }; static GtkListStore *panelBrowserListFilter; static GtkWidget *panelBrowserComboFilter; static gint currentComboFilterValue; struct TimerInfo_ { GtkWidget *bt; guint timer, label, nbFiles; gboolean abort; }; static GtkWidget *imagePlay; static GtkWidget *imageStop; static GtkWidget *buttonPlayStop; static GtkWidget *spinDelay; static GtkWidget *buttonPrevious; static GtkWidget *buttonNext; static GtkWidget *buttonDirPrev; static GtkWidget *buttonDirNext; static GtkWidget *buttonSelectAll; static GtkWidget *buttonUnselectAll; static GtkWidget *buttonDirectory; static GtkWidget *buttonRecurse; static GtkWidget *radioGoAround, *radioGoOnce, *radioGoAndBack; static int currentBrowseDirection; static GtkTreePath *startBrowsePath; static GtkWidget *buttonDumpAll; /* GtkProgressBar *progressBarDump; */ static GtkWidget *createInteriorBrowser(); static void browseDirectory(); static void addParsedDirectory(int commonPathLen, const gchar *root, GDir *gdir, gboolean recurse, int nbKind, int *nbPattern, GPatternSpec ***pattern, struct TimerInfo_ *timer); static gboolean showProgressBar(gpointer data); static void hideProgressBar(struct TimerInfo_ *timer); /* Load and render the given file. The iter is given in the filter model. */ static gboolean browserLoad(gchar *filename, gchar* fileUTF8, int kind, GtkTreeIter *iter, int nSet); /* For the given iter load it. The iter must be given in the filter model. */ static gboolean navigateInFiles(GtkTreePath *path, GtkTreeIter *iterSelected); static void selectFile(GtkTreePath *path, GtkTreeIter *iter); gboolean gtk_tree_model_get_iter_last(GtkTreeModel *model, GtkTreeIter *last, GtkTreePath **path); void panelBrowserSet_labelCurrentDir(); static void updateMethodCombo(VisuRendering *method); /* Callbacks */ static void onCheckFile(GtkCellRendererToggle *cell_renderer, gchar *path, gpointer user_data); static void onTreeviewActivated(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *col, gpointer user_data); static void navigateClicked(GtkButton *button, gpointer data); static void checkFiles(GtkButton *button, gpointer data); static void onDirectoryClicked(GtkButton *button, gpointer data); static void onPlayStopClicked(GtkToggleButton *button _U_, gpointer data _U_); static void stopPlayStop(gpointer data); static void onSpinDelayChangeValue(GtkSpinButton *spinbutton, gpointer user_data); void onDumpButtonClicked(GtkButton *button, gpointer user_data); static void onFilterChanged(GtkEditable *entry, gpointer user_data); void abortDumpAll(GtkButton *button, gpointer data); void updateDumpAllProgressBar(gpointer data); static void onRenderingChanged(GObject *obj, VisuRendering *method, gpointer data); static gboolean panelBrowserIsIterVisible(GtkTreeModel *model, GtkTreeIter *iter, gpointer data); static void onComboFilterChanged(GtkComboBox *combo, gpointer data); static void onRefreshDir(GtkButton *button, gpointer data); static void onEnter(VisuUiPanel *visu_ui_panel, gpointer data); static gboolean checkFile(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data); #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 17 static void onParseAbortClicked(GtkButton *button, gpointer data); #else static void onParseAbortClicked(GtkInfoBar *infoBar, gint response, gpointer data); #endif static void onRecurseToggled(GtkToggleButton *toggle, gpointer data); static void onNewDir(GObject *obj, VisuUiDirectoryType type, gpointer userData); static void onPrevClicked(GtkButton *button, gpointer data); static void onNextClicked(GtkButton *button, gpointer data); static gint onSortNames(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data); static void onNextPrevFile(VisuUiRenderingWindow *window, gpointer data); static void updateHistory(); static void updateDirectionalTooltips(); /* Parameters customising the dialog. */ #define FLAG_PARAMETER_BROWSER_HEADERS "browser_headersVisibility" #define DESC_PARAMETER_BROWSER_HEADERS "Show or hide the headers in the treeview ; boolean 0 or 1" static gboolean showHeaders; #define FLAG_PARAMETER_BROWSER_DATE "browser_dateVisibility" #define DESC_PARAMETER_BROWSER_DATE "Show or hide the date column in the treeview ; boolean 0 or 1" static gboolean showDate; static void exportParameters(GString *data, VisuData *dataObj, VisuGlView *view); VisuUiPanel* visu_ui_panel_browser_init(VisuUiMain *ui _U_) { char *cl = _("Browser"); char *tl = _("Browser"); VisuConfigFileEntry *entry; /* Create the list that store the filters. */ panelBrowserListFilter = gtk_list_store_new(PANEL_BROWSER_N_COLUMN_FILTER, G_TYPE_STRING, G_TYPE_INT); panelBrowser = visu_ui_panel_newWithIconFromPath("Panel_browser", cl, tl, "stock-browser_20.png"); if (!panelBrowser) return (VisuUiPanel*)0; vbox1 = gtk_vbox_new(FALSE, 0); fileTree = (GtkWidget*)0; buttonDirPrev = (GtkWidget*)0; buttonDirNext = (GtkWidget*)0; gtk_container_add(GTK_CONTAINER(panelBrowser), vbox1); visu_ui_panel_setDockable(VISU_UI_PANEL(panelBrowser), TRUE); /* Create the configuration file entries. */ entry = visu_config_file_addBooleanEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_BROWSER_HEADERS, DESC_PARAMETER_BROWSER_HEADERS, &showHeaders); visu_config_file_entry_setVersion(entry, 3.5f); entry = visu_config_file_addBooleanEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_BROWSER_DATE, DESC_PARAMETER_BROWSER_DATE, &showDate); visu_config_file_entry_setVersion(entry, 3.5f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_PARAMETER, exportParameters); /* Create the tree structure. */ treeStoreFiles = gtk_tree_store_new(N_COLUMNS, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_INT, G_TYPE_BOOLEAN, G_TYPE_STRING); /* Use the COLUMN_ACTIVE as a flag to hide or not the rows that don't match the filter value. */ treeStoreFilesFilter = gtk_tree_model_filter_new(GTK_TREE_MODEL(treeStoreFiles), NULL); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(treeStoreFilesFilter), panelBrowserIsIterVisible, (gpointer)0, (GDestroyNotify)0); treeFilesSortable = gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL(treeStoreFilesFilter)); /* gtk_tree_model_filter_set_visible_column(GTK_TREE_MODEL_FILTER(treeStoreFilesFilter), COLUMN_ACTIVE); */ gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(treeStoreFiles), COLUMN_NAME_UTF8, onSortNames, (gpointer)0, (GDestroyNotify)0); /* Add a new row to the model */ gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(treeStoreFiles), COLUMN_NAME_UTF8, GTK_SORT_ASCENDING); /* Initialise the values. */ currentBrowseredDirectory = (gchar**)0; commonBrowseredDirectory = (gchar*)0; historyBrowseredDirectory = (GList*)0; currentHistory = (GList*)0; flagListLoaded = FALSE; currentBrowseDirection = VISU_UI_PANEL_BROWSER_NEXT; showHeaders = FALSE; showDate = FALSE; /* Create the callbacks of all the sensitive widgets. */ g_signal_connect(G_OBJECT(panelBrowser), "page-entered", G_CALLBACK(onEnter), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "DirectoryChanged", G_CALLBACK(onNewDir), (gpointer)0); g_signal_connect(G_OBJECT(visu_ui_main_class_getDefaultRendering()), "load-next-file", G_CALLBACK(onNextPrevFile), GINT_TO_POINTER(VISU_UI_PANEL_BROWSER_NEXT)); g_signal_connect(G_OBJECT(visu_ui_main_class_getDefaultRendering()), "load-prev-file", G_CALLBACK(onNextPrevFile), GINT_TO_POINTER(VISU_UI_PANEL_BROWSER_PREVIOUS)); return VISU_UI_PANEL(panelBrowser); } static GtkWidget *createInteriorBrowser() { /* include from glade */ GtkWidget *image2; GtkWidget *image3; GtkWidget *image1; GtkWidget *hbox2; GtkWidget *label4; GtkWidget *label1; GtkWidget *alignment1; GtkWidget *hbox5; GtkWidget *image4; GtkWidget *refreshDirButton; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkWidget *label; GtkWidget *hbox, *vbox; GtkWidget *hrule; #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkTooltips *tooltips; tooltips = gtk_tooltips_new (); #endif GSList *radiobuttonCycle_group; hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox1), hbox, FALSE, FALSE, 0); /* This is a label in the browser panel to introduce the entry that allows to enter a filter for files shown. */ label = gtk_label_new(_("Filter: ")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2); entryFilterBrowser = gtk_entry_new(); gtk_editable_set_editable(GTK_EDITABLE(entryFilterBrowser), TRUE); gtk_entry_set_text(GTK_ENTRY(entryFilterBrowser), "*"); gtk_box_pack_start(GTK_BOX(hbox), entryFilterBrowser, TRUE, TRUE, 0); panelBrowserComboFilter = gtk_combo_box_new_with_model(GTK_TREE_MODEL(panelBrowserListFilter)); renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(panelBrowserComboFilter), renderer, FALSE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(panelBrowserComboFilter), renderer, "text", PANEL_BROWSER_COLUMN_FILTER_LABEL); gtk_box_pack_start(GTK_BOX(hbox), panelBrowserComboFilter, FALSE, FALSE, 2); updateMethodCombo(visu_object_getRendering(VISU_OBJECT_INSTANCE)); /*******************/ /* File lists part */ /*******************/ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox1), hbox, TRUE, TRUE, 0); vbox = gtk_vbox_new (FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 2); buttonDirectory = gtk_button_new (); gtk_box_pack_start (GTK_BOX (vbox), buttonDirectory, FALSE, FALSE, 1); gtk_widget_set_tooltip_text(buttonDirectory, _("Choose a different directory.")); image3 = gtk_image_new_from_stock ("gtk-open", GTK_ICON_SIZE_BUTTON); gtk_container_add (GTK_CONTAINER (buttonDirectory), image3); refreshDirButton = gtk_button_new (); gtk_widget_set_tooltip_text(refreshDirButton, _("Rescan current directory.")); gtk_box_pack_start(GTK_BOX(vbox), refreshDirButton, FALSE, FALSE, 1); image3 = gtk_image_new_from_stock (GTK_STOCK_REFRESH, GTK_ICON_SIZE_BUTTON); gtk_container_add(GTK_CONTAINER(refreshDirButton), image3); g_signal_connect(G_OBJECT(refreshDirButton), "clicked", G_CALLBACK(onRefreshDir), (gpointer)entryFilterBrowser); buttonRecurse = gtk_toggle_button_new(); gtk_widget_set_tooltip_text(buttonRecurse, _("Read directories recursively.")); gtk_box_pack_start(GTK_BOX(vbox), buttonRecurse, FALSE, FALSE, 1); image3 = gtk_image_new_from_stock (GTK_STOCK_ZOOM_IN, GTK_ICON_SIZE_BUTTON); gtk_container_add(GTK_CONTAINER(buttonRecurse), image3); g_signal_connect(G_OBJECT(buttonRecurse), "toggled", G_CALLBACK(onRecurseToggled), (gpointer)entryFilterBrowser); buttonDirPrev = gtk_button_new(); gtk_widget_set_sensitive(buttonDirPrev, FALSE); gtk_widget_set_tooltip_text(buttonDirPrev, _(HISTORY_TOOLTIP_PREV)); gtk_box_pack_start(GTK_BOX(vbox), buttonDirPrev, FALSE, FALSE, 1); image3 = gtk_image_new_from_stock (GTK_STOCK_GO_BACK, GTK_ICON_SIZE_BUTTON); gtk_container_add(GTK_CONTAINER(buttonDirPrev), image3); g_signal_connect(G_OBJECT(buttonDirPrev), "clicked", G_CALLBACK(onPrevClicked), (gpointer)0); buttonDirNext = gtk_button_new(); gtk_widget_set_sensitive(buttonDirNext, FALSE); gtk_widget_set_tooltip_text(buttonDirNext, _(HISTORY_TOOLTIP_NEXT)); gtk_box_pack_start(GTK_BOX(vbox), buttonDirNext, FALSE, FALSE, 1); image3 = gtk_image_new_from_stock (GTK_STOCK_GO_FORWARD, GTK_ICON_SIZE_BUTTON); gtk_container_add(GTK_CONTAINER(buttonDirNext), image3); g_signal_connect(G_OBJECT(buttonDirNext), "clicked", G_CALLBACK(onNextClicked), (gpointer)0); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 label = gtk_label_new(_("Dir.:")); gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.); gtk_label_set_angle(GTK_LABEL(label), 90.); gtk_box_pack_end(GTK_BOX(vbox), label, TRUE, TRUE, 0); #endif /* The infobar for cancel if to long and other messages. */ vbox = gtk_vbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); labelInfo = gtk_label_new(""); gtk_misc_set_alignment(GTK_MISC(labelInfo), 0., 0.5); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 17 infoBar = gtk_info_bar_new(); gtk_container_add(GTK_CONTAINER(gtk_info_bar_get_content_area(GTK_INFO_BAR(infoBar))), labelInfo); #else infoBar = gtk_hbox_new(FALSE, 5); infoImg = gtk_image_new_from_stock(GTK_STOCK_INFO, GTK_ICON_SIZE_MENU); gtk_box_pack_start(GTK_BOX(infoBar), infoImg, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(infoBar), labelInfo, TRUE, TRUE, 0); #endif gtk_widget_set_no_show_all(infoBar, TRUE); gtk_box_pack_start(GTK_BOX(vbox), infoBar, FALSE, FALSE, 0); scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL); gtk_box_pack_start(GTK_BOX(vbox), scrolledwindow1, TRUE, TRUE, 0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow1), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow1), GTK_SHADOW_ETCHED_IN); fileTree = gtk_tree_view_new (); gtk_widget_set_tooltip_text(fileTree, _("Double click on a file to render it.")); gtk_container_add (GTK_CONTAINER (scrolledwindow1), fileTree); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(fileTree), showHeaders); renderer = gtk_cell_renderer_toggle_new (); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(onCheckFile), (gpointer)0); column = gtk_tree_view_column_new_with_attributes ("", renderer, "active", COLUMN_BOOLEAN, "sensitive", COLUMN_FILE_VALID, "activatable", COLUMN_FILE_VALID, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (fileTree), column); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(GTK_TREE_VIEW_COLUMN(column), _("File")); renderer = gtk_cell_renderer_text_new (); gtk_tree_view_column_pack_end(GTK_TREE_VIEW_COLUMN(column), renderer, TRUE); gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column), renderer, "markup", COLUMN_NAME_UTF8, "sensitive", COLUMN_FILE_VALID, NULL); renderer = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column), renderer, FALSE); gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column), renderer, "stock-id", COLUMN_FILE_ERROR_ID, NULL); gtk_tree_view_column_set_sort_column_id(column, COLUMN_NAME_UTF8); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_append_column(GTK_TREE_VIEW (fileTree), column); if (showDate) { renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Date"), renderer, "text", COLUMN_DATA, "sensitive", COLUMN_FILE_VALID, NULL); gtk_tree_view_column_set_sort_column_id(column, COLUMN_DATE); gtk_tree_view_append_column (GTK_TREE_VIEW (fileTree), column); } gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(fileTree)), GTK_SELECTION_SINGLE); vbox = gtk_vbox_new (FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 2); buttonUnselectAll = gtk_button_new(); gtk_widget_set_tooltip_text(buttonUnselectAll, _("Unselect all files.")); gtk_box_pack_start(GTK_BOX(vbox), buttonUnselectAll, FALSE, FALSE, 1); image2 = create_pixmap ((GtkWidget*)0, "stock-unselect-all_20.png"); gtk_container_add(GTK_CONTAINER(buttonUnselectAll), image2); buttonSelectAll = gtk_button_new(); gtk_widget_set_tooltip_text(buttonSelectAll, _("Select all files.")); gtk_box_pack_start(GTK_BOX (vbox), buttonSelectAll, FALSE, FALSE, 1); image2 = create_pixmap ((GtkWidget*)0, "stock-select-all_20.png"); gtk_container_add (GTK_CONTAINER (buttonSelectAll), image2); alignment1 = gtk_alignment_new(0.5, 0.5, 0., 0.); gtk_box_pack_start(GTK_BOX(vbox), alignment1, TRUE, TRUE, 0); buttonDumpAll = gtk_button_new(); gtk_container_add(GTK_CONTAINER(alignment1), buttonDumpAll); image4 = gtk_image_new_from_stock("gtk-save-as", GTK_ICON_SIZE_BUTTON); gtk_container_add(GTK_CONTAINER(buttonDumpAll), image4); gtk_widget_set_tooltip_text(buttonDumpAll, _("Export the rendering of all selected files" " in other formats.")); buttonNext = gtk_button_new (); gtk_box_pack_end(GTK_BOX (vbox), buttonNext, FALSE, FALSE, 1); gtk_widget_set_tooltip_text(buttonNext, _("Render the next selected file.")); image1 = gtk_image_new_from_stock (GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_BUTTON); gtk_container_add (GTK_CONTAINER (buttonNext), image1); buttonPrevious = gtk_button_new (); gtk_box_pack_end(GTK_BOX (vbox), buttonPrevious, FALSE, FALSE, 1); gtk_widget_set_tooltip_text(buttonPrevious, _("Render the previous selected file.")); image2 = gtk_image_new_from_stock (GTK_STOCK_GO_UP, GTK_ICON_SIZE_BUTTON); gtk_container_add (GTK_CONTAINER (buttonPrevious), image2); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox1), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Current dir.: ")); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); labelDirectory = gtk_label_new(""); gtk_label_set_use_markup(GTK_LABEL(labelDirectory), TRUE); gtk_misc_set_alignment(GTK_MISC(labelDirectory), 0., 0.5); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 gtk_label_set_ellipsize(GTK_LABEL(labelDirectory), PANGO_ELLIPSIZE_START); #endif gtk_box_pack_start(GTK_BOX(hbox), labelDirectory, TRUE, TRUE, 0); panelBrowserSet_labelCurrentDir(); /***************/ /* Action part */ /***************/ alignment1 = gtk_alignment_new(0.5, 0.5, 0.3, 0); gtk_box_pack_start(GTK_BOX(vbox1), alignment1, FALSE, FALSE, 2); hrule = gtk_hseparator_new(); gtk_container_add(GTK_CONTAINER(alignment1), hrule); hbox2 = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox1), hbox2, FALSE, TRUE, 1); alignment1 = gtk_alignment_new(0.5, 0.5, 1.0, 0.0); gtk_alignment_set_padding(GTK_ALIGNMENT(alignment1), 0, 0, 0, 5); gtk_box_pack_start(GTK_BOX(hbox2), alignment1, FALSE, FALSE, 0); hbox5 = gtk_hbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(alignment1), hbox5); radioGoAround = gtk_radio_button_new(NULL); gtk_radio_button_set_group(GTK_RADIO_BUTTON(radioGoAround), (GSList*)0); radiobuttonCycle_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radioGoAround)); gtk_box_pack_start(GTK_BOX(hbox5), radioGoAround, FALSE, FALSE, 0); image1 = create_pixmap((GtkWidget*)0, "stock-go-around.png"); gtk_container_add(GTK_CONTAINER(radioGoAround), image1); radioGoOnce = gtk_radio_button_new(NULL); gtk_radio_button_set_group(GTK_RADIO_BUTTON(radioGoOnce), radiobuttonCycle_group); radiobuttonCycle_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radioGoOnce)); gtk_box_pack_start(GTK_BOX(hbox5), radioGoOnce, FALSE, FALSE, 0); image1 = create_pixmap((GtkWidget*)0, "stock-go-once.png"); gtk_container_add(GTK_CONTAINER(radioGoOnce), image1); radioGoAndBack = gtk_radio_button_new(NULL); gtk_radio_button_set_group(GTK_RADIO_BUTTON(radioGoAndBack), radiobuttonCycle_group); radiobuttonCycle_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radioGoAndBack)); gtk_box_pack_start(GTK_BOX(hbox5), radioGoAndBack, FALSE, FALSE, 0); image1 = create_pixmap((GtkWidget*)0, "stock-go-and-back.png"); gtk_container_add(GTK_CONTAINER(radioGoAndBack), image1); label4 = gtk_label_new (_("Play at ")); gtk_box_pack_start (GTK_BOX (hbox2), label4, TRUE, TRUE, 0); gtk_misc_set_alignment (GTK_MISC (label4), 1, 0.5); spinDelay = gtk_spin_button_new_with_range(10, 10000, 25); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinDelay), 500); gtk_box_pack_start (GTK_BOX (hbox2), spinDelay, FALSE, TRUE, 0); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinDelay), TRUE); /* Units: milliseconds */ label1 = gtk_label_new (_(" ms")); gtk_box_pack_start (GTK_BOX (hbox2), label1, TRUE, TRUE, 0); gtk_misc_set_alignment (GTK_MISC (label1), 0, 0.5); buttonPlayStop = gtk_toggle_button_new(); gtk_widget_set_tooltip_text(buttonPlayStop, _("Cycle through the selected files at the given rate.")); gtk_box_pack_start (GTK_BOX (hbox2), buttonPlayStop, FALSE, FALSE, 5); hbox5 = gtk_hbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (buttonPlayStop), hbox5); #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 5 imagePlay = create_pixmap ((GtkWidget*)0, "stock_media-play.png"); imageStop = create_pixmap ((GtkWidget*)0, "stock_media-stop.png"); #else imagePlay = gtk_image_new_from_stock(GTK_STOCK_MEDIA_PLAY, GTK_ICON_SIZE_MENU); imageStop = gtk_image_new_from_stock(GTK_STOCK_MEDIA_STOP, GTK_ICON_SIZE_MENU); #endif gtk_widget_set_no_show_all(imageStop, TRUE); gtk_box_pack_start (GTK_BOX (hbox5), imagePlay, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (hbox5), imageStop, TRUE, TRUE, 0); g_signal_connect(G_OBJECT(fileTree), "row-activated", G_CALLBACK(onTreeviewActivated), (gpointer)0); g_signal_connect(G_OBJECT(buttonPrevious), "clicked", G_CALLBACK(navigateClicked), GINT_TO_POINTER(VISU_UI_PANEL_BROWSER_PREVIOUS)); g_signal_connect(G_OBJECT(buttonNext), "clicked", G_CALLBACK(navigateClicked), GINT_TO_POINTER(VISU_UI_PANEL_BROWSER_NEXT)); g_signal_connect(G_OBJECT(buttonSelectAll), "clicked", G_CALLBACK(checkFiles), GINT_TO_POINTER(TRUE)); g_signal_connect(G_OBJECT(buttonUnselectAll), "clicked", G_CALLBACK(checkFiles), GINT_TO_POINTER(FALSE)); g_signal_connect(G_OBJECT(buttonDirectory), "clicked", G_CALLBACK(onDirectoryClicked), (gpointer)entryFilterBrowser); g_signal_connect(G_OBJECT(buttonPlayStop), "toggled", G_CALLBACK(onPlayStopClicked), (gpointer)0); g_signal_connect(G_OBJECT(spinDelay), "value-changed", G_CALLBACK(onSpinDelayChangeValue), (gpointer)buttonPlayStop); g_signal_connect(G_OBJECT(buttonDumpAll), "clicked", G_CALLBACK(onDumpButtonClicked), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "renderingChanged", G_CALLBACK(onRenderingChanged), (gpointer)0); g_signal_connect(G_OBJECT(entryFilterBrowser), "changed", G_CALLBACK(onFilterChanged), (gpointer)0); g_signal_connect(G_OBJECT(panelBrowserComboFilter), "changed", G_CALLBACK(onComboFilterChanged), (gpointer)0); gtk_widget_show_all(vbox1); return vbox1; } /*************/ /* Callbacks */ /*************/ static void onFilterChanged(GtkEditable *entry, gpointer user_data _U_) { GPatternSpec *pattern; gboolean valid; GtkTreeIter iter; gboolean match; gchar *fileUTF8; /* fprintf(stderr, "'%s'\n", gtk_entry_get_text(GTK_ENTRY(entry))); */ pattern = g_pattern_spec_new(gtk_entry_get_text(GTK_ENTRY(entry))); for (valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(treeStoreFiles), &iter); valid; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(treeStoreFiles), &iter)) { gtk_tree_model_get(GTK_TREE_MODEL(treeStoreFiles), &iter, COLUMN_NAME_UTF8, &fileUTF8, -1); match = g_pattern_match_string(pattern, fileUTF8); gtk_tree_store_set(treeStoreFiles, &iter, COLUMN_ACTIVE, match, -1); g_free(fileUTF8); } gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(treeStoreFilesFilter)); g_pattern_spec_free(pattern); } static void onCheckFile(GtkCellRendererToggle *cell_renderer _U_, gchar *path, gpointer user_data _U_) { GtkTreeIter iter, childIter; gboolean checked; GtkTreePath *currentPath; currentPath = gtk_tree_path_new_from_string(path); gtk_tree_model_get_iter(GTK_TREE_MODEL(treeFilesSortable), &iter, currentPath); gtk_tree_path_free(currentPath); gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT(treeFilesSortable), &childIter, &iter); gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER(treeStoreFilesFilter), &iter, &childIter); gtk_tree_model_get(GTK_TREE_MODEL(treeStoreFiles), &iter, COLUMN_BOOLEAN, &checked, -1); gtk_tree_store_set(treeStoreFiles, &iter, COLUMN_BOOLEAN, !checked, -1); } static void onTreeviewActivated(GtkTreeView *treeview _U_, GtkTreePath *path, GtkTreeViewColumn *col _U_, gpointer user_data _U_) { GtkTreeIter iter, childIter, parentIter; gboolean checked; gchar* filename, *utf8; int kind, nSet; DBG_fprintf(stderr, "Panel Browser: double click detected.\n"); gtk_tree_model_get_iter(GTK_TREE_MODEL(treeFilesSortable), &iter, path); gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT(treeFilesSortable), &childIter, &iter); gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER(treeStoreFilesFilter), &iter, &childIter); gtk_tree_model_get(GTK_TREE_MODEL(treeStoreFiles), &iter, COLUMN_NAME, &filename, COLUMN_NAME_UTF8, &utf8, COLUMN_BOOLEAN, &checked, COLUMN_FILE_KIND, &kind, -1); if (!checked) gtk_tree_store_set(GTK_TREE_STORE(treeStoreFiles), &iter, COLUMN_BOOLEAN, TRUE, -1); if (gtk_tree_model_iter_parent(GTK_TREE_MODEL(treeStoreFiles), &parentIter, &iter)) gtk_tree_model_get(GTK_TREE_MODEL(treeStoreFiles), &iter, COLUMN_DATE, &nSet, -1); else nSet = 0; DBG_fprintf(stderr, "Panel Browser: double click asks for loading (%s).\n", filename); browserLoad(filename, utf8, kind, &iter, nSet); g_free(filename); g_free(utf8); } static void navigateClicked(GtkButton *button _U_, gpointer data) { GtkTreeIter iter; GtkTreePath *path; gboolean res; res = visu_ui_panel_browser_getNextSelected(&path, &iter, GPOINTER_TO_INT(data)); if (!res) return; res = navigateInFiles(path, &iter); gtk_tree_path_free(path); } static void onNextPrevFile(VisuUiRenderingWindow *window _U_, gpointer data) { GtkTreeIter iter; GtkTreePath *path; gboolean res; res = visu_ui_panel_browser_getNextSelected(&path, &iter, GPOINTER_TO_INT(data)); if (!res) return; res = navigateInFiles(path, &iter); gtk_tree_path_free(path); } static void checkFiles(GtkButton *button _U_, gpointer data) { gtk_tree_model_foreach(GTK_TREE_MODEL(treeStoreFilesFilter), checkFile, data); } static void updateMethodCombo(VisuRendering *method) { int nb, i; GtkTreeIter iter; /* Clear everything. */ gtk_list_store_clear(panelBrowserListFilter); gtk_tree_store_clear(treeStoreFiles); flagListLoaded = FALSE; if (!method) return; /* Update the filters. */ nb = visu_rendering_getNFileTypes(method); if (nb == 1) gtk_widget_set_sensitive(panelBrowserComboFilter, FALSE); else gtk_widget_set_sensitive(panelBrowserComboFilter, TRUE); for (i = 0; i < nb; i++) { gtk_list_store_append(panelBrowserListFilter, &iter); gtk_list_store_set(panelBrowserListFilter, &iter, PANEL_BROWSER_COLUMN_FILTER_LABEL, visu_rendering_getFileTypeName(method, i), PANEL_BROWSER_COLUMN_FILTER_ID, i, -1); } if (nb > 1) { gtk_list_store_append(panelBrowserListFilter, &iter); gtk_list_store_set(panelBrowserListFilter, &iter, PANEL_BROWSER_COLUMN_FILTER_LABEL, "Similar name files", PANEL_BROWSER_COLUMN_FILTER_ID, nb, -1); } gtk_combo_box_set_active(GTK_COMBO_BOX(panelBrowserComboFilter), 0); currentComboFilterValue = 0; } static void onRenderingChanged(GObject *obj _U_, VisuRendering *method, gpointer data _U_) { DBG_fprintf(stderr, "Panel browser: catch the 'renderingChanged' signal.\n"); updateMethodCombo(method); } static void onRefreshDir(GtkButton *button _U_, gpointer data _U_) { browseDirectory((gchar*)0); } gboolean playSelectedFiles(gpointer data _U_) { GtkTreeIter iter; gboolean res, load; GtkTreePath *path; g_return_val_if_fail(startBrowsePath, FALSE); /* We try to get the next iter. */ res = visu_ui_panel_browser_getNextSelected(&path, &iter, currentBrowseDirection); if (!res) return FALSE; /* We follow the cycle policy to select the file. */ load = TRUE; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioGoAndBack))) { if (!gtk_tree_path_compare(path, startBrowsePath)) { DBG_fprintf(stderr, "Panel browser: One round is done, applyng policy.\n"); if (currentBrowseDirection == VISU_UI_PANEL_BROWSER_PREVIOUS) currentBrowseDirection = VISU_UI_PANEL_BROWSER_NEXT; else { currentBrowseDirection = VISU_UI_PANEL_BROWSER_PREVIOUS; gtk_tree_path_free(path); res = visu_ui_panel_browser_getNextSelected(&path, &iter, currentBrowseDirection); g_return_val_if_fail(res, FALSE); } } } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioGoOnce))) { if (!gtk_tree_path_compare(path, startBrowsePath)) { DBG_fprintf(stderr, "Panel browser: One round is done, applyng policy.\n"); res = FALSE; load = FALSE; } } if (load) { /* We advance the select one. */ selectFile(path, &iter); /* We render it. */ res = navigateInFiles(path, &iter); } gtk_tree_path_free(path); return res; } static void onPlayStopClicked(GtkToggleButton *button, gpointer data _U_) { GtkTreeIter startIter; gboolean res, checked, hasChild; gulong *playCallbackId; DBG_fprintf(stderr, "Panel Browser: toggle on play button.\n"); /* if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(panelBrowserListFilter), &startIter)) */ /* return; */ if (gtk_toggle_button_get_active(button)) { /* Button has been pushed. */ checked = FALSE; res = visu_ui_panel_browser_getCurrentSelected(&startBrowsePath, &startIter); if (res) { gtk_tree_model_get(GTK_TREE_MODEL(treeFilesSortable), &startIter, COLUMN_BOOLEAN, &checked, -1); hasChild = gtk_tree_model_iter_has_child(GTK_TREE_MODEL(treeFilesSortable), &startIter); } if (!res || !checked || hasChild) { res = visu_ui_panel_browser_getNextSelected(&startBrowsePath, &startIter, VISU_UI_PANEL_BROWSER_NEXT); if (!res) { startBrowsePath = gtk_tree_path_new(); /* No file selected. */ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(buttonPlayStop), FALSE); return; } } navigateInFiles(startBrowsePath, &startIter); /* Launch play */ gtk_widget_hide(imagePlay); gtk_widget_show(imageStop); currentBrowseDirection = VISU_UI_PANEL_BROWSER_NEXT; playCallbackId = g_malloc(sizeof(gulong)); *playCallbackId = g_timeout_add_full(G_PRIORITY_HIGH_IDLE, (gint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinDelay)), playSelectedFiles, (gpointer)0, stopPlayStop); g_object_set_data(G_OBJECT(button), "playCallbackId", (gpointer)playCallbackId); DBG_fprintf(stderr, " | start play\n"); } else { /* Stop play */ playCallbackId = (gulong*)g_object_get_data(G_OBJECT(button), "playCallbackId"); if (playCallbackId) g_source_remove(*playCallbackId); DBG_fprintf(stderr, " | stop play\n"); } } void stopPlayStop(gpointer data _U_) { gtk_widget_hide(imageStop); gtk_widget_show(imagePlay); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(buttonPlayStop), FALSE); g_return_if_fail(startBrowsePath); gtk_tree_path_free(startBrowsePath); } static void onSpinDelayChangeValue(GtkSpinButton *spinbutton _U_, gpointer user_data) { GtkTreePath *startPath; GtkToggleButton *button; gulong *playCallbackId; g_return_if_fail(GTK_IS_TOGGLE_BUTTON(user_data)); button = GTK_TOGGLE_BUTTON(user_data); if (gtk_toggle_button_get_active(button)) { playCallbackId = (gulong*)g_object_get_data(G_OBJECT(button), "playCallbackId"); g_return_if_fail(playCallbackId); startPath = gtk_tree_path_copy(startBrowsePath); /* Stop playing at this rate */ g_source_remove(*playCallbackId); startBrowsePath = startPath; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(buttonPlayStop), TRUE); } } void onDumpButtonClicked(GtkButton *button _U_, gpointer user_data _U_) { GtkWidget *dump; GtkProgressBar *progressBarDump; char *filename; VisuDump *format; GError *error; GString *buffer; GtkButton *abort; char *chr, *chr2; int goodPattern, flagAbort, i; gint response; GString *fileNumbered; GtkTreeIter iter; gboolean valid, errors; GtkTreePath *currentPath, *startPath; VisuGlView *view; view = visu_ui_panel_getView(VISU_UI_PANEL(panelBrowser)); dump = visu_ui_dump_dialog_new (visu_ui_panel_getData(VISU_UI_PANEL(panelBrowser)), visu_ui_panel_getContainerWindow(VISU_UI_PANEL(panelBrowser)), _("foo%02d.png"), view->window->width, view->window->height); do { response = gtk_dialog_run(GTK_DIALOG(dump)); if (response != GTK_RESPONSE_ACCEPT) { gtk_widget_destroy(dump); return; } filename = visu_ui_dump_dialog_getFilename(VISU_UI_DUMP_DIALOG(dump)); format = visu_ui_dump_dialog_getType(VISU_UI_DUMP_DIALOG(dump)); g_return_if_fail(filename && format); DBG_fprintf(stderr, "Panel browser: dump all returns this filename" " pattern '%s' (format : %s)\n", filename, tool_file_format_getName(TOOL_FILE_FORMAT(format))); buffer = g_string_new(_("Dumping all selected files to images,")); g_string_append_printf(buffer, _(" format '%s'.\n\n"), tool_file_format_getName(TOOL_FILE_FORMAT(format))); /* Verify the name is regular */ if (g_pattern_match_simple("*%0?d*", filename)) { chr = strchr(filename, '%'); if ((int)*(chr + 2) <= '0' || (int)*(chr + 2) > '9') { goodPattern = 0; g_string_append_printf(buffer, _("Error! The numbering pattern is" " wrong.\n")); } else { chr2 = strchr(chr + 1, '%'); if (chr2) { goodPattern = 0; g_string_append_printf(buffer, _("Error! Only one '%s' character" " is allowed in the file name.\n"), "%"); } else goodPattern = 1; } } else { goodPattern = 0; g_string_append_printf(buffer, _("Error! Missing pattern in the filename.\n")); } if (!goodPattern) { g_string_append_printf(buffer, _("\nHelp : you must specify '%s' in" " the filename, where 'x' is a number [|1;9|]." " This allows V_Sim to number the dumped" " files.\n\n For example, with a pattern like this" " : 'foo%s.pdf', dumped files will be named" " : foo00.pdf, foo01.pdf..."), "%0xd", "%02d"); visu_ui_raiseWarning(_("Exporting files"), buffer->str, (GtkWindow*)0); g_string_free(buffer, TRUE); } } while (!goodPattern); error = (GError*)0; abort = visu_ui_dump_dialog_getCancelButton(VISU_UI_DUMP_DIALOG(dump)); progressBarDump = visu_ui_dump_dialog_getProgressBar(VISU_UI_DUMP_DIALOG(dump)); visu_ui_dump_dialog_start(VISU_UI_DUMP_DIALOG(dump)); g_signal_connect (G_OBJECT(abort), "clicked", G_CALLBACK(visu_dump_abort), (gpointer)&flagAbort); g_signal_connect (G_OBJECT(abort), "clicked", G_CALLBACK(abortDumpAll), (gpointer)progressBarDump); gtk_progress_bar_set_fraction(progressBarDump, 0.); fileNumbered = g_string_new(""); i = 0; flagAbort = 0; /* We write it only once to avoid blinking effects. */ gtk_progress_bar_set_text(progressBarDump, _("Waiting for generating image in memory...")); visu_ui_wait(); gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(GTK_TREE_VIEW(fileTree))); errors = FALSE; valid = visu_ui_panel_browser_getNextSelected(&startPath, &iter, VISU_UI_PANEL_BROWSER_NEXT); if (valid) valid = navigateInFiles(startPath, &iter); while (valid && !errors && !flagAbort) { g_string_append_printf(buffer, _("Write to file %d ..."), i); g_string_printf(fileNumbered, filename, i); DBG_fprintf(stderr, "Panel browser: write '%s'\n", fileNumbered->str); errors = !visu_ui_rendering_window_dump(visu_ui_main_class_getDefaultRendering(), format, fileNumbered->str, visu_ui_dump_dialog_getWidth(VISU_UI_DUMP_DIALOG(dump)), visu_ui_dump_dialog_getHeight(VISU_UI_DUMP_DIALOG(dump)), updateDumpAllProgressBar, (gpointer)progressBarDump, &error); if (errors) g_string_append_printf(buffer, _(" error\n")); else g_string_append_printf(buffer, _(" OK\n")); i += 1; valid = visu_ui_panel_browser_getNextSelected(¤tPath, &iter, VISU_UI_PANEL_BROWSER_NEXT); if (!gtk_tree_path_compare(currentPath, startPath)) valid = FALSE; if (valid) valid = navigateInFiles(currentPath, &iter); gtk_tree_path_free(currentPath); } gtk_tree_path_free(startPath); if (error) { visu_ui_raiseWarning(_("Exporting files"), error->message, (GtkWindow*)0); g_error_free(error); } g_string_free(fileNumbered, TRUE); gtk_widget_destroy(dump); } void updateDumpAllProgressBar(gpointer data) { gdouble val; gdouble percentage; gdouble nEle; g_return_if_fail(GTK_PROGRESS_BAR(data)); nEle = (gdouble)gtk_tree_model_iter_n_children(GTK_TREE_MODEL(treeFilesSortable), NULL); val = gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR(data)); /* if (((int)(val * nEle)) % 100 == 1) */ gtk_progress_bar_set_text(GTK_PROGRESS_BAR(data), ""); percentage = val + 0.01 / nEle; if (percentage > 1.0) percentage = 1.0; if (percentage < 0.) percentage = 0.; gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(data), percentage); visu_ui_wait(); } void abortDumpAll(GtkButton *button _U_, gpointer data) { gtk_progress_bar_set_text(GTK_PROGRESS_BAR(data), _("Abortion request, please wait...")); } /******************/ /* Public methods */ /******************/ gboolean visu_ui_panel_browser_getCurrentSelected(GtkTreePath **path, GtkTreeIter *iterSelected) { GtkTreeSelection *selection; gboolean res; GtkTreeModel *model; g_return_val_if_fail(path && iterSelected, FALSE); if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(treeFilesSortable), iterSelected)) return FALSE; selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(fileTree)); res = gtk_tree_selection_get_selected(selection, &model, iterSelected); if (res) *path = gtk_tree_model_get_path(model, iterSelected); return res; } gboolean visu_ui_panel_browser_getNextSelected(GtkTreePath **path, GtkTreeIter *iterSelected, int direction) { GtkTreeSelection *selection; GtkTreePath *currentPath, *firstPath; GtkTreeIter iter, child, parent; gboolean res, checked; GtkTreeModel *model; int loopComplete; g_return_val_if_fail(path && iterSelected && (direction == VISU_UI_PANEL_BROWSER_NEXT || direction == VISU_UI_PANEL_BROWSER_PREVIOUS), FALSE); *path = (GtkTreePath*)0; if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(treeFilesSortable), &iter)) return FALSE; selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(fileTree)); res = gtk_tree_selection_get_selected(selection, &model, &iter); /* Cas o� rien n'est s�lectionn� */ if (!res) { if (direction == VISU_UI_PANEL_BROWSER_NEXT) res = gtk_tree_model_get_iter_last(GTK_TREE_MODEL(treeFilesSortable), &iter, (GtkTreePath**)0); else if (GPOINTER_TO_INT(direction) == VISU_UI_PANEL_BROWSER_PREVIOUS) res = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(treeFilesSortable), &iter); } g_return_val_if_fail(res, FALSE); currentPath = gtk_tree_model_get_path(GTK_TREE_MODEL(treeFilesSortable), &iter); firstPath = gtk_tree_path_copy(currentPath); do { if (direction == VISU_UI_PANEL_BROWSER_NEXT) { /* If the current iter has child, we select the first. */ if (gtk_tree_model_iter_has_child(GTK_TREE_MODEL(treeFilesSortable), &iter)) { gtk_tree_model_iter_children(GTK_TREE_MODEL(treeFilesSortable), &child, &iter); iter = child; gtk_tree_path_free(currentPath); currentPath = gtk_tree_model_get_path(GTK_TREE_MODEL(treeFilesSortable), &iter); } /* If the current iter has no child, we go next. */ else { /* Avance d'un pas dans la liste */ gtk_tree_path_next(currentPath); /* Recup�re l'it�ration avanc�e d'un pas */ child = iter; res = gtk_tree_model_get_iter(GTK_TREE_MODEL(treeFilesSortable), &iter, currentPath); /* In case, there's no next iter. */ if (!res) { /* If the iter has no parent we go top. */ if (!gtk_tree_model_iter_parent (GTK_TREE_MODEL(treeFilesSortable), &parent, &child)) { gtk_tree_model_get_iter_first (GTK_TREE_MODEL(treeFilesSortable), &iter); gtk_tree_path_free(currentPath); currentPath = gtk_tree_model_get_path (GTK_TREE_MODEL(treeFilesSortable), &iter); } /* If the iter has parent, we go next parent. */ else { iter = parent; gtk_tree_path_free(currentPath); currentPath = gtk_tree_model_get_path (GTK_TREE_MODEL(treeFilesSortable), &iter); gtk_tree_path_next(currentPath); res = gtk_tree_model_get_iter (GTK_TREE_MODEL(treeFilesSortable), &iter, currentPath); if (!res) { gtk_tree_model_get_iter_first (GTK_TREE_MODEL(treeFilesSortable), &iter); gtk_tree_path_free(currentPath); currentPath = gtk_tree_model_get_path (GTK_TREE_MODEL(treeFilesSortable), &iter); } } } } } else if (direction == VISU_UI_PANEL_BROWSER_PREVIOUS) { /* Recule d'un pas dans la liste */ res = gtk_tree_path_prev(currentPath); /* Recup�re l'it�ration recul�e d'un pas */ child = iter; res = res && gtk_tree_model_get_iter(GTK_TREE_MODEL(treeFilesSortable), &iter, currentPath); /* If this prev iter does not exist. */ if (!res) { /* In the case the current iter has a parent, we select it. */ if (gtk_tree_model_iter_parent(GTK_TREE_MODEL(treeFilesSortable), &parent, &child)) { iter = parent; gtk_tree_path_free(currentPath); currentPath = gtk_tree_model_get_path (GTK_TREE_MODEL(treeFilesSortable), &iter); } /* Si ce path n'existe pas ou si cette iteration n'existe pas on va � la fin. */ else { gtk_tree_path_free(currentPath); res = gtk_tree_model_get_iter_last (GTK_TREE_MODEL(treeFilesSortable), &iter, ¤tPath); if (!res) { g_warning("Panel browser: impossible to find" " the end of the list.\n"); gtk_tree_path_free(currentPath); gtk_tree_path_free(firstPath); return FALSE; } } } /* If the previous iter has children, we select last. */ else if (gtk_tree_model_iter_has_child(GTK_TREE_MODEL(treeFilesSortable), &iter)) { parent = iter; res = gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(treeFilesSortable), &iter, &parent, gtk_tree_model_iter_n_children(GTK_TREE_MODEL(treeFilesSortable), &parent) - 1); if (!res) { g_warning("Panel browser: impossible to find" " the last child of this iter.\n"); gtk_tree_path_free(currentPath); gtk_tree_path_free(firstPath); return FALSE; } gtk_tree_path_free(currentPath); currentPath = gtk_tree_model_get_path (GTK_TREE_MODEL(treeFilesSortable), &iter); } } /* R�cup�re les donn�es pour l'it�ration avanc�e d'un pas. */ checked = FALSE; gtk_tree_model_get(GTK_TREE_MODEL(treeFilesSortable), &iter, COLUMN_BOOLEAN, &checked, -1); checked = checked && !gtk_tree_model_iter_has_child(GTK_TREE_MODEL(treeFilesSortable), &iter); /* fprintf(stderr, "%d '%s'\n", nbSteps, filename); */ loopComplete = !gtk_tree_path_compare(firstPath, currentPath); } while ( !checked && !loopComplete); gtk_tree_path_free(firstPath); if (!loopComplete) { *path = currentPath; *iterSelected = iter; return TRUE; } else { gtk_tree_path_free(currentPath); return FALSE; } } static void selectFile(GtkTreePath *path, GtkTreeIter *iter) { GtkTreeSelection *selection; g_return_if_fail(path && iter); /* Rend l'iter s�lectionn� */ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(fileTree)); gtk_tree_selection_select_iter(selection, iter); gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(fileTree), path, NULL, FALSE, 0., 0.); } static gboolean navigateInFiles(GtkTreePath *path, GtkTreeIter *iterSelected) { gboolean res; gchar *filename, *utf8; int kind, nSet; GtkTreeIter parentIter, iter; g_return_val_if_fail(path && iterSelected, FALSE); /* We select the given iter. */ selectFile(path, iterSelected); /* Load the new selected file */ gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT(treeFilesSortable), &parentIter, iterSelected); gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER(treeStoreFilesFilter), &iter, &parentIter); if (gtk_tree_model_iter_parent(GTK_TREE_MODEL(treeStoreFiles), &parentIter, &iter)) gtk_tree_model_get(GTK_TREE_MODEL(treeStoreFiles), &iter, COLUMN_DATE, &nSet, -1); else nSet = 0; gtk_tree_model_get(GTK_TREE_MODEL(treeStoreFiles), &iter, COLUMN_NAME, &filename, COLUMN_NAME_UTF8, &utf8, COLUMN_FILE_KIND, &kind, -1); res = browserLoad(filename, utf8, kind, &iter, nSet); g_free(filename); g_free(utf8); return res; } static gboolean setFiles(VisuData *data, const gchar *filename, const gchar *utf8, int fileKind, int nbKind, VisuData *oldData) { int kind; gchar *pt, **tokens, *name; g_return_val_if_fail(data && fileKind >= 0 && fileKind <= nbKind, FALSE); if (fileKind < nbKind) { /* The case where we just change one filename, using oldData. */ if (nbKind > 1 && !oldData) return FALSE; visu_data_addFile(data, (gchar*)filename, fileKind, (ToolFileFormat*)0); for (kind = 0; kind < nbKind; kind++) if (kind != fileKind) visu_data_addFile(data, visu_data_getFile(oldData, kind, (ToolFileFormat**)0), kind, (ToolFileFormat*)0); return TRUE; } else { /* The case where the name is used for all files. */ pt = strrchr(utf8, ']'); *pt = '\0'; pt = strrchr(utf8, '['); tokens = g_strsplit(pt + 1, ",", nbKind); for (kind = 0; kind < nbKind; kind++) { name = g_strdup_printf("%s.%s", filename, tokens[kind]); visu_data_addFile(data, name, kind, (ToolFileFormat*)0); } g_strfreev(tokens); return TRUE; } } gboolean browserLoad(gchar *filename, gchar *utf8, int fileKind, GtkTreeIter *iter, int nSet) { GError *error; VisuData *data, *prevData; VisuRendering *method; gboolean changeElement, res, valid; VisuData *dataObj; GtkTreeIter parentIter, childIter; int iSet, nSets; GtkTreePath *path; gchar *comment, *buf, *commentFormat; g_return_val_if_fail(iter, FALSE); data = visu_data_new(); g_return_val_if_fail(data, FALSE); method = visu_object_getRendering(VISU_OBJECT_INSTANCE); g_return_val_if_fail(method, FALSE); if (fileKind < 0) fileKind = 0; if (!setFiles(data, filename, utf8, fileKind, visu_rendering_getNFileTypes(method), visu_ui_panel_getData(VISU_UI_PANEL(panelBrowser)))) { visu_ui_raiseWarning(_("Loading a file"), _("Can't load this file through the browser because it" " requires to read several files. You should use the 'Open'" " button on the main panel and then use the browser to vary" " one kind of file at a time."), (GtkWindow*)0); g_object_unref(data); gtk_tree_store_set(treeStoreFiles, iter, COLUMN_FILE_VALID, FALSE, COLUMN_BOOLEAN, FALSE, -1); return FALSE; } prevData = visu_ui_panel_getData(VISU_UI_PANEL(panelBrowser)); gtk_widget_set_sensitive(buttonPrevious, FALSE); gtk_widget_set_sensitive(buttonNext, FALSE); error = (GError*)0; res = visu_object_load(VISU_OBJECT_INSTANCE, data, nSet, (GCancellable*)0, &error); if (!res) { if (error) visu_ui_raiseWarning(_("Loading a file"), error->message, (GtkWindow*)0); g_object_unref(data); dataObj = (VisuData*)0; } else dataObj = data; gtk_widget_set_sensitive(buttonPrevious, TRUE); gtk_widget_set_sensitive(buttonNext, TRUE); if (prevData && dataObj) { changeElement = visu_node_array_compareElements(VISU_NODE_ARRAY(prevData), VISU_NODE_ARRAY(dataObj)); visu_data_setChangeElementFlag(dataObj, changeElement); /* Useless unref since, attaching dataObj to the window on next line will unref the previous VisuData object attached. */ /* g_object_unref(G_OBJECT(prevData)); */ } if (!dataObj) gtk_tree_store_set(treeStoreFiles, iter, COLUMN_FILE_ERROR_ID, GTK_STOCK_DIALOG_ERROR, COLUMN_FILE_VALID, FALSE, COLUMN_BOOLEAN, FALSE, -1); else gtk_tree_store_set(treeStoreFiles, iter, COLUMN_FILE_ERROR_ID, (gchar*)0, COLUMN_FILE_VALID, TRUE, -1); visu_ui_rendering_window_setData(visu_ui_main_class_getDefaultRendering(), dataObj); if (dataObj) { /* We release a ref on dataObj, since visu_ui_rendering_window_setData has increased it. */ g_object_unref(G_OBJECT(dataObj)); /* If the file has more than one node set, we create the child entries in the tree view. */ nSets = visu_data_getNSubset(dataObj); if (nSets > 1) { /* We get the parent iter. */ if (!gtk_tree_model_iter_parent(GTK_TREE_MODEL(treeStoreFiles), &parentIter, iter)) { /* We clear its children. */ valid = gtk_tree_model_iter_children (GTK_TREE_MODEL(treeStoreFiles), &childIter, iter); while (valid) { gtk_tree_store_remove(treeStoreFiles, &childIter); valid = gtk_tree_model_iter_children (GTK_TREE_MODEL(treeStoreFiles), &childIter, iter); } /* We create the new ones. */ commentFormat = g_strdup_printf(_("data set %s0%dd"), "%", (int)log10(nSets) + 1); for (iSet = 0; iSet < nSets; iSet++) { comment = visu_data_getFileCommentary(data, iSet); if (!comment || !comment[0]) { buf = g_strdup_printf(commentFormat, iSet + 1); comment = buf; } else buf = (gchar*)0; #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 9 gtk_tree_store_insert_with_values(treeStoreFiles, &childIter, iter, iSet, COLUMN_BOOLEAN, TRUE, COLUMN_NAME, filename, COLUMN_NAME_UTF8, comment, COLUMN_ACTIVE, TRUE, COLUMN_DATE, iSet, COLUMN_FILE_KIND, fileKind, COLUMN_FILE_VALID, TRUE, -1); #else gtk_tree_store_insert(treeStoreFiles, &childIter, iter, iSet); gtk_tree_store_set(treeStoreFiles, &childIter, COLUMN_BOOLEAN, TRUE, COLUMN_NAME, filename, COLUMN_NAME_UTF8, comment, COLUMN_ACTIVE, TRUE, COLUMN_DATE, iSet, COLUMN_FILE_KIND, fileKind, COLUMN_FILE_VALID, TRUE, -1); #endif if (buf) g_free(buf); } g_free(commentFormat); /* We expand the row. */ gtk_tree_model_filter_convert_child_iter_to_iter (GTK_TREE_MODEL_FILTER(treeStoreFilesFilter), &parentIter, iter); gtk_tree_model_sort_convert_child_iter_to_iter (GTK_TREE_MODEL_SORT(treeFilesSortable), iter, &parentIter); path = gtk_tree_model_get_path(GTK_TREE_MODEL(treeFilesSortable), iter); gtk_tree_view_expand_row(GTK_TREE_VIEW(fileTree), path, TRUE); /* We select the first. */ /* selectFile(path, iterSelected); */ gtk_tree_path_free(path); } } /* We render the new data set. */ g_idle_add_full(G_PRIORITY_HIGH_IDLE, visu_object_redraw, (gpointer)0, (GDestroyNotify)0); } if (error) g_error_free(error); if (dataObj) return TRUE; else return FALSE; } static gboolean checkFile(GtkTreeModel *model, GtkTreePath *path _U_, GtkTreeIter *iter, gpointer data) { gboolean filterOk, valid; GtkTreeIter iterList; GtkTreeStore *tree; /* If we check the row, the checkbutton is on only if the name is in accordance with the filter. */ gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(treeStoreFilesFilter), &iterList, iter); tree = GTK_TREE_STORE(gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(treeStoreFilesFilter))); if (GPOINTER_TO_INT(data)) { gtk_tree_model_get(GTK_TREE_MODEL(model), iter, COLUMN_ACTIVE, &filterOk, COLUMN_FILE_VALID, &valid, -1); if (filterOk && valid) gtk_tree_store_set(tree, &iterList, COLUMN_BOOLEAN, TRUE, -1); /* else */ /* gtk_tree_store_set(tree, &iterList, COLUMN_BOOLEAN, */ /* FALSE, -1); */ } else { gtk_tree_store_set(tree, &iterList, COLUMN_BOOLEAN, FALSE, -1); } return FALSE; } void visu_ui_panel_browser_setCurrentDirectory(const gchar *dir) { g_return_if_fail(dir && dir[0]); if (currentBrowseredDirectory) DBG_fprintf(stderr, "Panel Browser: compare dirs '%s' and '%s'.\n", currentBrowseredDirectory[0], dir); /* Test if the new directory is not already the current one. */ if (currentBrowseredDirectory && currentBrowseredDirectory[0] && !strcmp(currentBrowseredDirectory[0], dir) && !currentBrowseredDirectory[1]) return; /* Set the new directory current. */ currentBrowseredDirectory = g_malloc(sizeof(gchar*) * 2); currentBrowseredDirectory[0] = g_strdup(dir); currentBrowseredDirectory[1] = (gchar*)0; DBG_fprintf(stderr, "Panel Browser: set currentBrowseredDirectory to '%s'.\n", currentBrowseredDirectory[0]); if (commonBrowseredDirectory) g_free(commonBrowseredDirectory); commonBrowseredDirectory = tool_path_normalize(dir); DBG_fprintf(stderr, "Panel Browser: set common path to '%s'.\n", commonBrowseredDirectory); /* Save the new list of current directories. */ updateHistory(); /* Refresh the list if visible, else let the page-enter signal do it. */ DBG_fprintf(stderr, "Panel Browser: ask for refresh.\n"); if (visu_ui_panel_getVisible(VISU_UI_PANEL(panelBrowser))) browseDirectory(); else flagListLoaded = FALSE; visu_ui_setLastOpenDirectory(commonBrowseredDirectory, VISU_UI_DIR_BROWSER); } static void setCurrentDirectories(gchar **dirs) { int i, j; gchar *tmp; /* Set the new directory current. */ currentBrowseredDirectory = dirs; DBG_fprintf(stderr, "Panel Browser: set currentBrowseredDirectory to the list:\n"); /* Try to find a common path for all directories. */ if (commonBrowseredDirectory) g_free(commonBrowseredDirectory); commonBrowseredDirectory = g_strdup(dirs[0]); for (i = 0; dirs[i]; i++) { DBG_fprintf(stderr, " | '%s'\n", dirs[i]); for (j = 0; dirs[i][j] && commonBrowseredDirectory[j]; j++) if (dirs[i][j] != commonBrowseredDirectory[j]) commonBrowseredDirectory[j] = '\0'; } tmp = commonBrowseredDirectory; commonBrowseredDirectory = tool_path_normalize(tmp); g_free(tmp); DBG_fprintf(stderr, "Panel Browser: set common path to '%s'.\n", commonBrowseredDirectory); /* Refresh the list if visible, else let the page-enter signal do it. */ if (visu_ui_panel_getVisible(VISU_UI_PANEL(panelBrowser))) browseDirectory(); else flagListLoaded = FALSE; visu_ui_setLastOpenDirectory(commonBrowseredDirectory, VISU_UI_DIR_BROWSER); } static void updateHistory() { GList *tmpLst, *del; g_return_if_fail(currentBrowseredDirectory); DBG_fprintf(stderr, "Panel Browser: update the history.\n"); /* We kill the history between historyBrowseredDirectory and currentHistory. */ tmpLst = historyBrowseredDirectory; while (tmpLst != currentHistory) { DBG_fprintf(stderr, "Panel Browser: removing a group of" " directories from history.\n"); g_strfreev((gchar**)tmpLst->data); del = tmpLst; tmpLst = g_list_next(tmpLst); g_list_free_1(del); } if (currentHistory) currentHistory->prev = (GList*)0; historyBrowseredDirectory = currentHistory; DBG_fprintf(stderr, "Panel Browser: adding a group of" " directories to history.\n"); historyBrowseredDirectory = g_list_prepend(historyBrowseredDirectory, currentBrowseredDirectory); currentHistory = historyBrowseredDirectory; DBG_fprintf(stderr, "Panel Browser: set current history to %p (%d).\n", (gpointer)currentHistory, g_list_length(currentHistory)); if (buttonDirPrev) gtk_widget_set_sensitive(buttonDirPrev, TRUE); if (buttonDirNext) gtk_widget_set_sensitive(buttonDirNext, FALSE); DBG_fprintf(stderr, "Panel Browser: history updated OK.\n"); updateDirectionalTooltips(); } void visu_ui_panel_browser_setCurrentDirectories(gchar **dirs) { g_return_if_fail(dirs && dirs[0]); /* Change the current directories. */ setCurrentDirectories(dirs); /* Save the new list of current directories. */ updateHistory(); DBG_fprintf(stderr, "Panel Browser: directories updated OK.\n"); } static void updateDirectionalTooltips() { GString *lbl; int i; gchar **history; #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkTooltips *tooltips; tooltips = gtk_tooltips_new (); #endif DBG_fprintf(stderr, "Panel Browser: update directional tooltips.\n"); if (currentHistory && currentHistory->prev && buttonDirNext) { history = (gchar**)(currentHistory->prev->data); lbl = g_string_new(_(HISTORY_TOOLTIP_NEXT)); if (history) { g_string_append_printf(lbl, "\n\n(%s", history[0]); for (i = 1; history[i]; i++) g_string_append_printf(lbl, ", %s", history[i]); g_string_append_printf(lbl, ")"); } gtk_widget_set_tooltip_text(buttonDirNext, lbl->str); g_string_free(lbl, TRUE); } if (currentHistory && currentHistory->next && buttonDirPrev) { history = (gchar**)(currentHistory->next->data); lbl = g_string_new(_(HISTORY_TOOLTIP_PREV)); if (history) { g_string_append_printf(lbl, "\n\n(%s", history[0]); for (i = 1; history[i]; i++) g_string_append_printf(lbl, ", %s", history[i]); g_string_append_printf(lbl, ")"); } gtk_widget_set_tooltip_text(buttonDirPrev, lbl->str); g_string_free(lbl, TRUE); } } gboolean panelBrowserSet_previousHistoryDirectories() { if (!currentHistory || !g_list_next(currentHistory)) return FALSE; currentHistory = g_list_next(currentHistory); DBG_fprintf(stderr, "Panel Browser: set current history to %p (%d).\n", (gpointer)currentHistory, g_list_length(currentHistory)); setCurrentDirectories((gchar**)(currentHistory->data)); updateDirectionalTooltips(); gtk_widget_set_sensitive(buttonDirPrev, g_list_next(currentHistory) != (gpointer)0); gtk_widget_set_sensitive(buttonDirNext, TRUE); return TRUE; } gboolean panelBrowserSet_nextHistoryDirectories() { if (!currentHistory || !g_list_previous(currentHistory)) return FALSE; currentHistory = g_list_previous(currentHistory); DBG_fprintf(stderr, "Panel Browser: set current history to %p (%d).\n", (gpointer)currentHistory, g_list_length(currentHistory)); setCurrentDirectories((gchar**)(currentHistory->data)); updateDirectionalTooltips(); gtk_widget_set_sensitive(buttonDirPrev, TRUE); gtk_widget_set_sensitive(buttonDirNext, g_list_previous(currentHistory) != (gpointer)0); return TRUE; } static void associateFiles(int nbKind, int commonPathLen) { gboolean valid; GtkTreeIter iter; int kind, searchKind, i; gchar *filename, *searchName, *pt, *fileUTF8; GList *tmpLst, *storeLst; gsize lu, ecrit; gchar **ext; /* Read all the stored files and try to associate them on their names. When the name matches the previous one without the extension, then the kind is stored. If a full set of names can be retrieved, then it is stored. The extensions are stored in the ext array. */ searchName = g_strdup("."); searchKind = 0; storeLst = (GList*)0; ext = g_malloc(sizeof(gchar*) * (nbKind + 1)); memset(ext, 0, sizeof(gchar*) * (nbKind + 1)); for (valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(treeStoreFiles), &iter); valid; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(treeStoreFiles), &iter)) { gtk_tree_model_get(GTK_TREE_MODEL(treeStoreFiles), &iter, COLUMN_FILE_KIND, &kind, COLUMN_NAME, &filename, -1); pt = strrchr(filename, '.'); if (pt) *pt = '\0'; if (kind >= 0 && kind < nbKind) ext[kind] = g_strdup(pt + 1); /* fprintf(stderr, "'%s' %d %d\n", filename, kind, searchKind); */ if (kind >= 0 && kind < nbKind && !strcmp(searchName, filename)) { /* Ok, match, we continue. */ searchKind += kind; g_free(filename); if (searchKind == nbKind * (nbKind - 1) / 2) { pt = g_strjoinv(",", ext); /* We found a complete set. */ storeLst = g_list_prepend(storeLst, g_markup_printf_escaped("%s.[%s]", searchName, pt)); g_free(pt); for (i = 0; i < nbKind; i++) g_free(ext[i]); memset(ext, 0, sizeof(gchar*) * (nbKind + 1)); } } else { /* Doesn't match, try for new. */ g_free(searchName); for (i = 0; i < nbKind; i++) if (ext[i]) g_free(ext[i]); memset(ext, 0, sizeof(gchar*) * (nbKind + 1)); searchName = filename; searchKind = kind; if (kind >= 0 && kind < nbKind) ext[kind] = g_strdup(pt + 1); } } g_free(searchName); /* Store now the associated list. */ for (tmpLst = storeLst; tmpLst; tmpLst = g_list_next(tmpLst)) { fileUTF8 = g_filename_to_utf8((gchar*)tmpLst->data + commonPathLen + 1, -1, &lu, &ecrit, NULL); pt = g_strrstr((gchar*)tmpLst->data, " 2 || GTK_MINOR_VERSION > 9 gtk_tree_store_insert_with_values(treeStoreFiles, &iter, (GtkTreeIter*)0, 0, COLUMN_BOOLEAN, FALSE, COLUMN_NAME, tmpLst->data, COLUMN_NAME_UTF8, fileUTF8, COLUMN_ACTIVE, TRUE, COLUMN_FILE_KIND, nbKind, COLUMN_FILE_VALID, TRUE, -1); #else gtk_tree_store_prepend(treeStoreFiles, &iter, (GtkTreeIter*)0); gtk_tree_store_set(treeStoreFiles, &iter, COLUMN_BOOLEAN, FALSE, COLUMN_NAME, tmpLst->data, COLUMN_NAME_UTF8, fileUTF8, COLUMN_ACTIVE, TRUE, COLUMN_FILE_KIND, nbKind, COLUMN_FILE_VALID, TRUE, -1); #endif g_free(tmpLst->data); if (fileUTF8) g_free(fileUTF8); } g_list_free(storeLst); } static void browseDirectory() { VisuRendering* method; GList *lst; const GList *tmpLst, *tmpLst2; GDir *gdir; gint nbKind, kind, len; int *nbPattern, i; GPatternSpec ***pattern; gboolean success; struct TimerInfo_ info; if (!currentBrowseredDirectory) return; method = visu_object_getRendering(VISU_OBJECT_INSTANCE); if (!method) return; DBG_fprintf(stderr, "Panel browser: cleaning of the list.\n"); gtk_tree_store_clear(treeStoreFiles); flagListLoaded = FALSE; nbKind = visu_rendering_getNFileTypes(method); pattern = g_malloc(sizeof(GPatternSpec**) * nbKind); nbPattern = g_malloc(sizeof(int) * nbKind); for( kind = 0; kind < nbKind; kind++) { nbPattern[kind] = 0; lst = visu_rendering_getFileFormat(method, kind); for (tmpLst = lst; tmpLst; tmpLst = g_list_next(tmpLst)) nbPattern[kind] += g_list_length ((GList*)tool_file_format_getFilePatterns((ToolFileFormat*)tmpLst->data)); if (nbPattern[kind]) { pattern[kind] = g_malloc(sizeof(GPatternSpec*) * nbPattern[kind]); i = 0; for (tmpLst = lst; tmpLst; tmpLst = g_list_next(tmpLst)) for (tmpLst2 = tool_file_format_getFilePatterns ((ToolFileFormat*)tmpLst->data); tmpLst2; tmpLst2 = g_list_next(tmpLst2)) pattern[kind][i++] = g_pattern_spec_new((char*)tmpLst2->data); } else { g_warning("The present rendering method has no" " pattern for prefered file of kind %d, assuming '*'.", kind); pattern[kind] = g_malloc(sizeof(GPatternSpec*)); nbPattern[kind] = 1; pattern[kind][0] = g_pattern_spec_new((char*)"*"); } g_list_free(lst); } /* Remove temporary the model. */ gtk_tree_view_set_model(GTK_TREE_VIEW(fileTree), (GtkTreeModel*)0); gtk_widget_set_sensitive(scrolledwindow1, FALSE); /* Add a timeout to show the progress bar if the scan is too long. */ info.abort = FALSE; info.nbFiles = 0; info.bt = (GtkWidget*)0; #if GLIB_MINOR_VERSION < 13 info.timer = g_timeout_add(1000, showProgressBar, (gpointer)(&info)); #else info.timer = g_timeout_add_seconds(1, showProgressBar, (gpointer)(&info)); #endif info.label = 0; success = TRUE; len = strlen(commonBrowseredDirectory); for (i = 0; success && currentBrowseredDirectory[i] && !info.abort; i++) { DBG_fprintf(stderr, "Panel browser: scanning directory '%s'.\n", currentBrowseredDirectory[i]); gdir = g_dir_open(currentBrowseredDirectory[i], 0, NULL); if (gdir) { addParsedDirectory(len, currentBrowseredDirectory[i], gdir, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(buttonRecurse)), nbKind, nbPattern, pattern, &info); g_dir_close(gdir); } else success = FALSE; } hideProgressBar(&info); for (kind = 0; kind < nbKind; kind++) { for (i = 0; i < nbPattern[kind]; i++) g_pattern_spec_free(pattern[kind][i]); g_free(pattern[kind]); } g_free(pattern); g_free(nbPattern); panelBrowserSet_labelCurrentDir(); if (nbKind > 1) associateFiles(nbKind, len); flagListLoaded = TRUE; onFilterChanged(GTK_EDITABLE(entryFilterBrowser), (gpointer)0); gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(treeStoreFilesFilter)); /* Reattach the model. */ gtk_tree_view_set_model(GTK_TREE_VIEW(fileTree), GTK_TREE_MODEL(treeFilesSortable)); gtk_widget_set_sensitive(scrolledwindow1, TRUE); if (!success) visu_ui_raiseWarning(_("Browsing a directory"), _("The specified directory is unreadable."), (GtkWindow*)0); } static void addParsedDirectory(int commonPathLen, const gchar *root, GDir *gdir, gboolean recurse, int nbKind, int *nbPattern, GPatternSpec ***pattern, struct TimerInfo_ *timer) { const gchar *fileFromDir; gchar *fileUTF8, *file; gboolean passed; gsize lu, ecrit; GDir *recursedDir; gint kind; int i; GtkTreeIter iter; #if GLIB_MINOR_VERSION > 5 struct stat buf; struct tm *tm; gchar data[256]; #endif g_return_if_fail(root && root[0]); DBG_fprintf(stderr, "Panel Browser: read dir '%s' %d.\n", root, (int)recurse); fileFromDir = g_dir_read_name(gdir); while(fileFromDir && !timer->abort) { file = g_build_filename(root, fileFromDir, NULL); fileUTF8 = g_filename_to_utf8(file + commonPathLen + 1, -1, &lu, &ecrit, NULL); if(fileUTF8) { if (g_file_test(file, G_FILE_TEST_IS_DIR)) { DBG_fprintf(stderr, "Panel Browser: read dir '%s'\n", file); if (recurse) { recursedDir = g_dir_open(file, 0, NULL); if (recursedDir) { addParsedDirectory(commonPathLen, file, recursedDir, TRUE, nbKind, nbPattern, pattern, timer); g_dir_close(recursedDir); } } } else { passed = FALSE; for (kind = 0; kind < nbKind && !passed; kind++) { for (i = 0; i < nbPattern[kind] && !passed; i++) passed = passed || g_pattern_match_string(pattern[kind][i], fileUTF8); } kind -= 1; DBG_fprintf(stderr, "Panel Browser: read file '%s' -> %d\n", file, kind); #if GLIB_MINOR_VERSION > 5 if (showDate) { if (g_stat(file, &buf)) buf.st_mtime = 0; DBG_fprintf(stderr, "Panel Browser: mtime %d.\n", (int)buf.st_mtime); tm = localtime(&buf.st_mtime); strftime(data, 256, _("%Y-%m-%d %H:%M"), tm); } else { buf.st_mtime = 0; data[0] = '\0'; } #endif #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 9 gtk_tree_store_insert_with_values(treeStoreFiles, &iter, (GtkTreeIter*)0, 0, COLUMN_BOOLEAN, FALSE, COLUMN_NAME, file, COLUMN_NAME_UTF8, fileUTF8, COLUMN_ACTIVE, TRUE, COLUMN_FILE_KIND, (passed)?kind:-1, #if GLIB_MINOR_VERSION > 5 COLUMN_DATE, buf.st_mtime, COLUMN_DATA, data, #endif COLUMN_FILE_VALID, passed, -1); #else gtk_tree_store_append(treeStoreFiles, &iter, (GtkTreeIter*)0); gtk_tree_store_set(treeStoreFiles, &iter, COLUMN_BOOLEAN, FALSE, COLUMN_NAME, file, COLUMN_NAME_UTF8, fileUTF8, #if GLIB_MINOR_VERSION > 5 COLUMN_DATE, buf.st_mtime, COLUMN_DATA, data, #endif COLUMN_ACTIVE, TRUE, COLUMN_FILE_KIND, (passed)?kind:-1, COLUMN_FILE_VALID, passed, -1); #endif timer->nbFiles += 1; } g_free(fileUTF8); } g_free(file); visu_ui_wait(); fileFromDir = g_dir_read_name(gdir); } } #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 17 static void onParseAbortClicked(GtkButton *button _U_, gpointer data) { (*(gboolean*)data) = TRUE; } #else static void onParseAbortClicked(GtkInfoBar *infoBar _U_, gint response, gpointer data) { (*(gboolean*)data) = (response == GTK_RESPONSE_CANCEL); } #endif static void onEnter(VisuUiPanel *visu_ui_panel _U_, gpointer data _U_) { DBG_fprintf(stderr, "Panel Browser: enter, parse directory (%d - %d).\n", !fileTree, !flagListLoaded); if (!fileTree) createInteriorBrowser(); if (!flagListLoaded) browseDirectory(); } static void onDirectoryClicked(GtkButton *button _U_, gpointer data _U_) { gchar **filenames; filenames = visu_ui_getSelectedDirectory (visu_ui_panel_getContainerWindow(VISU_UI_PANEL(panelBrowser)), TRUE, commonBrowseredDirectory); if (!filenames) return; visu_ui_panel_browser_setCurrentDirectories(filenames); } static void onRecurseToggled(GtkToggleButton *toggle _U_, gpointer data _U_) { browseDirectory(); } static void onPrevClicked(GtkButton *button _U_, gpointer data _U_) { panelBrowserSet_previousHistoryDirectories(); } static void onNextClicked(GtkButton *button _U_, gpointer data _U_) { panelBrowserSet_nextHistoryDirectories(); } static gboolean pulseProgressBar(gpointer data) { struct TimerInfo_ *timer; gchar nbFilesLabel[36]; timer = (struct TimerInfo_*)data; sprintf(nbFilesLabel, _("%4d files found."), timer->nbFiles); gtk_label_set_text(GTK_LABEL(labelInfo), nbFilesLabel); DBG_fprintf(stderr, "Panel browser: update label to '%s'.\n", nbFilesLabel); return TRUE; } static gboolean showProgressBar(gpointer data) { gchar nbFilesLabel[36]; struct TimerInfo_ *timer; DBG_fprintf(stderr, "Panel browser: scanning is too slow, showing progress bar.\n"); timer = (struct TimerInfo_*)data; #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 17 timer->bt = gtk_button_new_from_stock(GTK_STOCK_CANCEL); gtk_box_pack_end(GTK_BOX(infoBar), timer->bt, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(timer->bt), "clicked", G_CALLBACK(onParseAbortClicked), (gpointer)&timer->abort); #else timer->bt = gtk_info_bar_add_button(GTK_INFO_BAR(infoBar), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); g_signal_connect(G_OBJECT(infoBar), "response", G_CALLBACK(onParseAbortClicked), (gpointer)&timer->abort); #endif sprintf(nbFilesLabel, _("%4d files found."), timer->nbFiles); visu_ui_panel_browser_setMessage(nbFilesLabel, GTK_MESSAGE_INFO); timer->label = g_timeout_add(250, pulseProgressBar, data); return FALSE; } static void hideProgressBar(struct TimerInfo_ *timer) { DBG_fprintf(stderr, "Panel browser: scanning is finished, hiding progress bar.\n"); g_source_remove(timer->timer); if (timer->label) { g_source_remove(timer->label); visu_ui_panel_browser_setMessage((const gchar*)0, GTK_MESSAGE_INFO); } if (timer->bt) gtk_widget_destroy(timer->bt); } /***************************/ /* Miscellaneous functions */ /***************************/ gboolean gtk_tree_model_get_iter_last(GtkTreeModel *model, GtkTreeIter *last, GtkTreePath **path) { gboolean valid; gint n; g_return_val_if_fail(model && last, FALSE); n = gtk_tree_model_iter_n_children(model, (GtkTreeIter*)0); if (n == 0) return FALSE; valid = gtk_tree_model_iter_nth_child(model, last, (GtkTreeIter*)0, n - 1); g_return_val_if_fail(valid, FALSE); if (path) *path = gtk_tree_model_get_path(model, last); return TRUE; } static gboolean panelBrowserIsIterVisible(GtkTreeModel *model, GtkTreeIter *iter, gpointer data _U_) { gboolean passUserFilter; gint kind; gtk_tree_model_get(model, iter, COLUMN_FILE_KIND, &kind, COLUMN_ACTIVE, &passUserFilter, -1); return (passUserFilter && (currentComboFilterValue < 0 || kind == currentComboFilterValue || kind < 0)); } static gint onSortNames(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data _U_) { gint kindA, kindB; gchar *lblA, *lblB; gint diff, iSetA, iSetB; GtkTreeIter parentA, parentB; /* We always sort the kind first. */ gtk_tree_model_get(model, a, COLUMN_FILE_KIND, &kindA, -1); gtk_tree_model_get(model, b, COLUMN_FILE_KIND, &kindB, -1); if ((kindA < 0 && kindB >= 0) || (kindA >= 0 && kindB < 0)) return (kindB - kindA); else { if (gtk_tree_model_iter_parent(model, &parentA, a) && gtk_tree_model_iter_parent(model, &parentB, b)) { gtk_tree_model_get(model, a, COLUMN_DATE, &iSetA, -1); gtk_tree_model_get(model, b, COLUMN_DATE, &iSetB, -1); diff = iSetA - iSetB; } else { gtk_tree_model_get(model, a, COLUMN_NAME_UTF8, &lblA, -1); gtk_tree_model_get(model, b, COLUMN_NAME_UTF8, &lblB, -1); diff = g_utf8_collate(lblA, lblB); g_free(lblA); g_free(lblB); } return diff; } } static void onComboFilterChanged(GtkComboBox *combo _U_, gpointer data _U_) { GtkTreeIter comboIter; gboolean validIter; validIter = gtk_combo_box_get_active_iter(GTK_COMBO_BOX(panelBrowserComboFilter), &comboIter); if (!validIter) return; gtk_tree_model_get(GTK_TREE_MODEL(panelBrowserListFilter), &comboIter, PANEL_BROWSER_COLUMN_FILTER_ID, ¤tComboFilterValue, -1); gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(treeStoreFilesFilter)); } void panelBrowserSet_labelCurrentDir() { gchar *directoryUTF8, *markup; if (!commonBrowseredDirectory) return; directoryUTF8 = g_filename_to_utf8(commonBrowseredDirectory, -1, NULL, NULL, NULL); g_return_if_fail(directoryUTF8); markup = g_markup_printf_escaped(_("%s"), directoryUTF8); g_free(directoryUTF8); gtk_label_set_markup(GTK_LABEL(labelDirectory), markup); g_free(markup); } static void onNewDir(GObject *obj _U_, VisuUiDirectoryType type, gpointer user _U_) { DBG_fprintf(stderr, "Panel Browser: caught 'DirectoryChanged'" " signal for type %d.\n", type); if (type == VISU_UI_DIR_FILE) visu_ui_panel_browser_setCurrentDirectory(visu_ui_getLastOpenDirectory()); } static void exportParameters(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { g_string_append_printf(data, "# %s\n", DESC_PARAMETER_BROWSER_HEADERS); g_string_append_printf(data, "%s[gtk]: %i\n\n", FLAG_PARAMETER_BROWSER_HEADERS, (int)showHeaders); g_string_append_printf(data, "# %s\n", DESC_PARAMETER_BROWSER_DATE); g_string_append_printf(data, "%s[gtk]: %i\n\n", FLAG_PARAMETER_BROWSER_DATE, (int)showDate); } /** * visu_ui_panel_browser_setMessage: * @message: a string to be displaied. * @message_type: the kind of message. * * This routine is used to give the user a message. This message can * be mere information or a warning or an error. * * Since: 3.6 */ void visu_ui_panel_browser_setMessage(const gchar* message, GtkMessageType message_type) { if (!fileTree) createInteriorBrowser(); if (message) { gtk_label_set_text(GTK_LABEL(labelInfo), message); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 17 gtk_info_bar_set_message_type(GTK_INFO_BAR(infoBar), message_type); #else switch (message_type) { case GTK_MESSAGE_INFO: gtk_image_set_from_stock(GTK_IMAGE(infoImg), GTK_STOCK_INFO, GTK_ICON_SIZE_BUTTON); break; default: gtk_image_clear(GTK_IMAGE(infoImg)); break; } #endif gtk_widget_set_no_show_all(infoBar, FALSE); gtk_widget_show_all(infoBar); } else { gtk_widget_hide(infoBar); } } v_sim-3.7.0/src/panelModules/panelBrowser.h0000644000353400050620000001041112215546063015615 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef PANELBROWSER_H #define PANELBROWSER_H #include #include #include /** * VISU_UI_PANEL_BROWSER_PREVIOUS: * * Value that give the direction when the selector is moved around file list. * See visu_ui_panel_browser_getNextSelected(). */ #define VISU_UI_PANEL_BROWSER_PREVIOUS 0 /** * VISU_UI_PANEL_BROWSER_NEXT: * * Value that give the direction when the selector is moved around file list. * See visu_ui_panel_browser_getNextSelected(). */ #define VISU_UI_PANEL_BROWSER_NEXT 1 /** * visu_ui_panel_browser_init: (skip) * * Should be used in the list declared in externalModules.h to be loaded by * V_Sim on start-up. This routine will create the #VisuUiPanel handling * the browser. * * Returns: a newly created #VisuUiPanel object. */ VisuUiPanel* visu_ui_panel_browser_init(); /** * visu_ui_panel_browser_getNextSelected: * @path: a pointer to returned the path of the newly selected file ; * @iterSelected: a pointer to store the newly selected iter ; * @direction: VISU_UI_PANEL_BROWSER_NEXT or VISU_UI_PANEL_BROWSER_PREVIOUS. * * Change the selected file in the browser given the direction. * * Returns: TRUE if one exists. */ gboolean visu_ui_panel_browser_getNextSelected(GtkTreePath **path, GtkTreeIter *iterSelected, int direction); /** * visu_ui_panel_browser_getCurrentSelected: * @path: a pointer to returned the path of the currently selected file ; * @iterSelected: a pointer to store the currently selected iter. * * Get iter and path of the currently sleected file. * * Returns: TRUE if one exists. */ gboolean visu_ui_panel_browser_getCurrentSelected(GtkTreePath **path, GtkTreeIter *iterSelected); /** * visu_ui_panel_browser_setCurrentDirectory: * @dir: the path of a directory. * * Change the directory for the browser. The directory is not parsed immediately * but only when the subpanel becomes visible. */ void visu_ui_panel_browser_setCurrentDirectory(const gchar *dir); /** * visu_ui_panel_browser_setCurrentDirectories: * @dirs: a NULL terminated array of directories to be loaded. * * Change the directories for the browser. It is the same routine than * visu_ui_panel_browser_setCurrentDirectory(), but several directories can be loaded * at once. But internally, contrary to visu_ui_panel_browser_setCurrentDirectory() * the given array must not be freed since it is not copied. */ void visu_ui_panel_browser_setCurrentDirectories(gchar **dirs); void visu_ui_panel_browser_setMessage(const gchar* message, GtkMessageType message_type); #endif v_sim-3.7.0/src/panelModules/panelDataFile.c0000644000353400050620000024637412216253427015661 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "panelDataFile.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /** * SECTION: panelDataFile * @short_description: The tab where to configure the action of an * external data file on colourisation of nodes. * * The widgets are organised in three categories. The first is * used to normalised the inputs, see * visu_ui_panel_colorization_setManualRange() or * visu_ui_panel_colorization_setRangeMode(). The second category is used * for colourisation, see * visu_ui_panel_colorization_setPresetShade(). Finally the last category * is about post-processing. */ /* Local variables. */ static GtkWidget *panelDataFile; static int nbColumns; static gboolean panelDataFileIsInitiated; static gboolean flagDataFileIsLoaded; static gboolean flagDisableCallbacks; static gchar *fileExt; static VisuGlExtShade *extLeg; #define RED_DATA_LABEL _("R") #define GREEN_DATA_LABEL _("G") #define BLUE_DATA_LABEL _("B") #define HUE_DATA_LABEL _("H") #define SAT_DATA_LABEL _("S") #define VAL_DATA_LABEL _("V") char* labelRGB[3]; char* labelHSV[3]; #define COL_ONE "1." #define COL_COORD_X _("coord. x") #define COL_COORD_Y _("coord. y") #define COL_COORD_Z _("coord. z") #define N_STATIC_COLS 4 #define N_COORDS_COLS 3 #define COLOR_PREVIEW_WIDTH 120 #define COLOR_PREVIEW_HEIGHT 15 #define COLOR_PREVIEW_BITS 8 #define COLOR_TRANSFORMATION_WIDTH 60 #define COLOR_TRANSFORMATION_HEIGHT 40 #define MIN_MAX_NO_DATA_FILE _("No data file loaded") #define DATA_FILE_NO_FILE_MESSAGE _("No data file") #define FLAG_PARAMETER_FILEEXT "dataFile_fileExtension" #define DESC_PARAMETER_FILEEXT "The extension used for data file ; chain e.g. '.dat'" #define PARAMETER_FILEEXT_DEFAULT ".dat" /* Local methods. */ static void createInteriorDataFile(); static void updateNormalisationWidgets(VisuData *data); static void updateStatusBar(VisuData *data); static void updateColorWidgets(VisuData *data); static void updatePostWidgets(VisuData *data); static void makeColorPreview(VisuData *data); /* Linkable widgets */ static GtkWidget *vBoxDataFileOption, *vboxNormalize; static GtkWidget *openDataFileButton; static GtkWidget *checkbuttonData; static GtkWidget *checkbuttonAutoLoad; static GtkWidget *statusbarDataFile; static guint statusDataFileContextId; static GtkWidget *expanderNormalize, *expanderPostProcessing, *expanderTransformation; static GtkWidget *radioNormalized; static GtkWidget *radioMinMax; static GtkWidget *entryDataMax; static GtkWidget *entryDataMin; static GtkWidget *spinbuttonDataChA[3]; static GtkWidget *spinbuttonDataChB[3]; static GtkWidget *comboboxDataCh[6]; static GtkWidget *radiobuttonDataRGB; static GtkWidget *radiobuttonDataHSV; static GtkWidget *labelChannel[3]; static GdkPixbuf *pixbufColorPreview; static GtkWidget *colorPreview; static GtkWidget *labelPreview; static GtkWidget *readMinMaxValues; static GtkWidget *comboPreSetColorRange; static GtkWidget *checkHideMinValues; static GtkWidget *spinHideMinValues; static GtkWidget *entryHideMinValues; static GtkWidget *entryFileExtension; static GtkWidget *tableLinearToolShade; static GtkWidget *checkScaleRadius; static GtkWidget *checkRestrictInRange; static GtkWidget *checkShowLegend; /* Signals that need to be suspended */ static gulong signalCheckDataFile; static gulong signalComboColumnId[6]; static gulong signalSpinDataChA[3]; static gulong signalSpinDataChB[3]; static gulong signalComboToolShade; static gulong signalRadioRGB; static gulong signalRadioHSV; static gulong hide_signal; /* Callbacks */ static void visuFileReset(GObject *obj, VisuData *dataObj, gpointer data); static void onDataReady(VisuObject *obj, VisuData *dataObj, VisuGlView *view, gpointer data); static void onDataNotReady(VisuObject *obj, VisuData *dataObj, VisuGlView *view, gpointer data); static void onLoadDataResponse(GtkDialog *dialog, gint response, gpointer data); static void useDataFileColor(GtkToggleButton *toggle, gpointer data); static void onScaleTypeChange(GtkToggleButton *toggle, gpointer data); static void onEntryMinMaxChangeValue(VisuUiNumericalEntry *entry, double oldValue, gpointer data); static void onSpinChChangeValue(GtkSpinButton *spinbutton, gpointer user_data); static void onComboColChange(GtkComboBox *combo, gpointer data); static void onComboPresetColChange(GtkComboBox *combo, gpointer data); static void onComboManualChange(GtkComboBox *combo, gpointer data); static void onColorTypeChange(GtkToggleButton *toggle, gpointer data); static void onColorPreSetChange(VisuUiShadeCombobox *combo, ToolShade *shade, gpointer data); static void onSpinHideMinValuesChange(GtkSpinButton *spin, gpointer data); static void onEntryHideMinValuesChange(VisuUiNumericalEntry *entry, double oldValue, gpointer data); static void onCheckHideMinValuesChange(GtkToggleButton *toggle, gpointer data); static void onCheckScaleRadiusChange(GtkToggleButton *toggle, gpointer data); static void onComboScaleChange(GtkComboBox *combo, gpointer data); static void onAskForHideNodes(VisuData *visuData, gboolean *redraw, gpointer data); static void onDataFileEnter(VisuUiPanel *visu_ui_panel, gpointer data); static void onCheckRestrictChange(GtkToggleButton *toggle, gpointer data); static void onCheckLegendChange(GtkToggleButton *toggle, gpointer data); static void onEntryExt(GtkEntry *entry, gchar *key, VisuObject *obj); /* Local methods. */ static GtkWidget* _createLoadDataDialog(); static void applyHideMinValues(VisuData *visuData, gboolean askRedraw); static gboolean hideBelow(VisuColorization *dt, const VisuColorizationNodeData *values, gpointer data); static void exportParameters(GString *data, VisuData* dataObj, VisuGlView *view); struct _HideBelowData { guint column; float value; }; static struct _HideBelowData hidingData; /** * visu_ui_panel_colorization_init: (skip) * * Should be used in the list declared in externalModules.h to be loaded by * V_Sim on start-up. This routine will create the #VisuUiPanel where the colouring * stuff can be done, such as choosing a colour shade, opening a file, * setting boundaries... * * Returns: a newly created #VisuUiPanel object. */ VisuUiPanel* visu_ui_panel_colorization_init() { char *cl = _("Colorize with data"); char *tl = _("Data color"); VisuConfigFileEntry *resourceEntry; labelRGB[0] = RED_DATA_LABEL; labelRGB[1] = GREEN_DATA_LABEL; labelRGB[2] = BLUE_DATA_LABEL; labelHSV[0] = HUE_DATA_LABEL; labelHSV[1] = SAT_DATA_LABEL; labelHSV[2] = VAL_DATA_LABEL; panelDataFile = visu_ui_panel_newWithIconFromPath("Panel_colorise", cl, tl, "stock-data_20.png"); if (!panelDataFile) return (VisuUiPanel*)0; visu_ui_panel_setDockable(VISU_UI_PANEL(panelDataFile), TRUE); /* Local variables */ checkbuttonData = gtk_check_button_new_with_mnemonic(_("_Use color scheme")); entryFileExtension = (GtkWidget*)0; tableLinearToolShade = (GtkWidget*)0; panelDataFileIsInitiated = FALSE; flagDataFileIsLoaded = FALSE; flagDisableCallbacks = FALSE; fileExt = g_strdup(PARAMETER_FILEEXT_DEFAULT); extLeg = visu_gl_ext_shade_new("Colourisation legend"); visu_gl_ext_setActive(VISU_GL_EXT(extLeg), FALSE); /* Dealing with parameters. */ resourceEntry = visu_config_file_addStringEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_FILEEXT, DESC_PARAMETER_FILEEXT, &fileExt); visu_config_file_entry_setVersion(resourceEntry, 3.4f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_PARAMETER, exportParameters); /* Local callbacks. */ g_signal_connect(G_OBJECT(panelDataFile), "page-entered", G_CALLBACK(onDataFileEnter), (gpointer)0); return VISU_UI_PANEL(panelDataFile); } static void createInteriorDataFile() { GtkWidget *containerDataFilePanel; GtkWidget *scrolledwindow1; GtkWidget *viewport1; GtkWidget *vbox; GtkWidget *vboxLimits, *vboxTransformation, *vboxPostProcessing; GtkWidget *hbox3; GtkWidget *alignment2; GtkWidget *hbox8; GSList *radioNormalized_group = NULL; GtkWidget *alignment3; GtkWidget *table2; GtkWidget *label7; GtkWidget *label8; GtkWidget *hbox6; GSList *radiobuttonDataRGB_group = NULL; GtkWidget *label; GtkWidget *label14; GtkWidget *label15; GtkWidget *label16; GtkWidget *label20; GtkWidget *label21; GtkWidget *hrule; GtkWidget *hboxPreSetColorRange; gint i; VisuData *dataObj; #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkTooltips *tooltips; tooltips = gtk_tooltips_new (); #endif DBG_fprintf(stderr, "Panel DataFile : creating subpanel.\n"); containerDataFilePanel = gtk_vbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (containerDataFilePanel), checkbuttonData, FALSE, FALSE, 0); scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_SHADOW_IN); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_box_pack_start (GTK_BOX (containerDataFilePanel), scrolledwindow1, TRUE, TRUE, 0); viewport1 = gtk_viewport_new (NULL, NULL); gtk_container_add (GTK_CONTAINER (scrolledwindow1), viewport1); vbox = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (viewport1), vbox); vBoxDataFileOption = vbox; gtk_widget_set_sensitive(vBoxDataFileOption, FALSE); /********************/ /* The Data subset. */ /********************/ hbox3 = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox3, FALSE, FALSE, 0); checkbuttonAutoLoad = gtk_check_button_new_with_mnemonic(_("_Auto load data")); gtk_box_pack_end(GTK_BOX(hbox3), checkbuttonAutoLoad, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(checkbuttonAutoLoad, _("Try to load a data file whenever a new V_Sim file is loaded." " For example, if 'example.ascii' has just been opened, V_Sim" " will look for 'example.dat' and will apply it.")); entryFileExtension = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(entryFileExtension), 4); gtk_entry_set_text(GTK_ENTRY(entryFileExtension), fileExt); g_signal_connect_object(VISU_OBJECT_INSTANCE, "entryParsed::" FLAG_PARAMETER_FILEEXT, G_CALLBACK(onEntryExt), (gpointer)entryFileExtension, G_CONNECT_SWAPPED); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 openDataFileButton = gtk_file_chooser_button_new_with_dialog(_createLoadDataDialog()); #else openDataFileButton = gtk_button_new_from_stock (GTK_STOCK_OPEN); g_signal_connect(G_OBJECT(openDataFileButton), "clicked", G_CALLBACK(loadDataFile), (gpointer)0); #endif gtk_widget_set_tooltip_text(openDataFileButton, _("Choose a file to read the colorization data from.")); gtk_box_pack_start(GTK_BOX(hbox3), openDataFileButton, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox3), entryFileExtension, FALSE, FALSE, 5); gtk_widget_set_tooltip_text(entryFileExtension, _("File extension used for the autoload option, its value is" " saved in the parameter file (see 'dataFile_fileExt').")); vboxNormalize = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), vboxNormalize, FALSE, FALSE, 0); hbox3 = gtk_hbox_new (FALSE, 0); gtk_box_pack_start(GTK_BOX(vboxNormalize), hbox3, FALSE, FALSE, 0); label = gtk_label_new(_("Normalize input: ")); gtk_widget_set_name(label, "label_head"); gtk_misc_set_alignment (GTK_MISC (label), 0., 0.5); gtk_box_pack_start (GTK_BOX (hbox3), label, TRUE, TRUE, 0); radioNormalized = gtk_radio_button_new_with_mnemonic (NULL, _("auto")); gtk_box_pack_start (GTK_BOX (hbox3), radioNormalized, FALSE, FALSE, 0); gtk_radio_button_set_group (GTK_RADIO_BUTTON (radioNormalized), radioNormalized_group); radioNormalized_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radioNormalized)); radioMinMax = gtk_radio_button_new_with_mnemonic (NULL, _("manual")); gtk_box_pack_start (GTK_BOX (hbox3), radioMinMax, FALSE, FALSE, 0); gtk_radio_button_set_group (GTK_RADIO_BUTTON (radioMinMax), radioNormalized_group); radioNormalized_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radioMinMax)); expanderNormalize = gtk_expander_new(_("More information")); gtk_box_pack_start(GTK_BOX(vboxNormalize), expanderNormalize, FALSE, FALSE, 0); alignment3 = gtk_alignment_new(0.5, 0.5, 1, 1); gtk_alignment_set_padding(GTK_ALIGNMENT(alignment3), 0, 0, 15, 0); gtk_container_add(GTK_CONTAINER(expanderNormalize), alignment3); vboxLimits = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(alignment3), vboxLimits); /* label = gtk_label_new(_("Read min/max values:")); */ /* gtk_label_set_use_markup(GTK_LABEL(label), TRUE); */ /* gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); */ /* gtk_box_pack_start(GTK_BOX(vboxLimits), label, FALSE, FALSE, 0); */ readMinMaxValues = gtk_alignment_new (0.5, 0.5, 0.8, 1); gtk_box_pack_start (GTK_BOX(vboxLimits), readMinMaxValues, FALSE, FALSE, 0); label = gtk_label_new(MIN_MAX_NO_DATA_FILE); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5); gtk_container_add(GTK_CONTAINER(readMinMaxValues), label); label = gtk_label_new(_("Input data bounds:")); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_misc_set_alignment (GTK_MISC (label), 0., 0.5); gtk_box_pack_start(GTK_BOX(vboxLimits), label, FALSE, FALSE, 0); alignment3 = gtk_alignment_new(0.5, 0.5, 0.8, 1); gtk_box_pack_start(GTK_BOX(vboxLimits), alignment3, FALSE, FALSE, 0); table2 = gtk_table_new (1, 6, FALSE); gtk_container_add (GTK_CONTAINER (alignment3), table2); gtk_table_set_col_spacings (GTK_TABLE (table2), 3); entryDataMax = visu_ui_numerical_entry_new(1.); gtk_entry_set_width_chars(GTK_ENTRY(entryDataMax), 6); gtk_table_attach (GTK_TABLE (table2), entryDataMax, 3, 4, 0, 1, GTK_FILL | GTK_EXPAND, (GtkAttachOptions)0, 0, 0); gtk_widget_set_sensitive(entryDataMax, FALSE); entryDataMin = visu_ui_numerical_entry_new(-1.); gtk_entry_set_width_chars(GTK_ENTRY(entryDataMin), 6); gtk_table_attach (GTK_TABLE (table2), entryDataMin, 1, 2, 0, 1, GTK_FILL | GTK_EXPAND, (GtkAttachOptions)0, 0, 0); gtk_widget_set_sensitive(entryDataMin, FALSE); comboboxDataCh[4] = gtk_combo_box_text_new(); gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(comboboxDataCh[4]), (const gchar*)0, COL_COORD_X); gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(comboboxDataCh[4]), (const gchar*)0, COL_COORD_Y); gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(comboboxDataCh[4]), (const gchar*)0, COL_COORD_Z); gtk_combo_box_set_active(GTK_COMBO_BOX(comboboxDataCh[4]), 0); gtk_table_attach(GTK_TABLE(table2), comboboxDataCh[4], 5, 6, 0, 1, GTK_FILL | GTK_EXPAND, (GtkAttachOptions)0, 0, 0); gtk_widget_set_sensitive(comboboxDataCh[4], FALSE); label7 = gtk_label_new (_("Min:")); gtk_table_attach (GTK_TABLE (table2), label7, 0, 1, 0, 1, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label7), 1, 0.5); label8 = gtk_label_new (_("Max:")); gtk_table_attach (GTK_TABLE (table2), label8, 2, 3, 0, 1, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label8), 1, 0.5); label8 = gtk_label_new(_("Col.:")); gtk_table_attach (GTK_TABLE(table2), label8, 4, 5, 0, 1, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment(GTK_MISC(label8), 1, 0.5); /* Bar */ alignment2 = gtk_alignment_new(0.5, 0.5, 0.3, 0); gtk_box_pack_start(GTK_BOX(vbox), alignment2, FALSE, FALSE, 8); hrule = gtk_hseparator_new(); gtk_container_add(GTK_CONTAINER(alignment2), hrule); /***********************/ /* Transformation part */ /***********************/ label = gtk_label_new(_("Define the color scheme:")); gtk_widget_set_name(label, "label_head"); gtk_misc_set_alignment (GTK_MISC (label), 0., 0.5); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); hboxPreSetColorRange = gtk_hbox_new (FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hboxPreSetColorRange, FALSE, FALSE, 0); /* label = gtk_label_new(_("Preset:")); */ /* gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); */ /* gtk_box_pack_start(GTK_BOX(hboxPreSetColorRange), label, TRUE, TRUE, 0); */ comboPreSetColorRange = visu_ui_shade_combobox_new(FALSE, TRUE); gtk_combo_box_set_active(GTK_COMBO_BOX(comboPreSetColorRange), -1); gtk_box_pack_start(GTK_BOX(hboxPreSetColorRange), comboPreSetColorRange, TRUE, TRUE, 0); comboboxDataCh[5] = gtk_combo_box_text_new(); gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(comboboxDataCh[5]), (const gchar*)0, COL_COORD_X); gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(comboboxDataCh[5]), (const gchar*)0, COL_COORD_Y); gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(comboboxDataCh[5]), (const gchar*)0, COL_COORD_Z); gtk_combo_box_set_active(GTK_COMBO_BOX(comboboxDataCh[5]), -1); gtk_box_pack_start(GTK_BOX(hboxPreSetColorRange), comboboxDataCh[5], FALSE, FALSE, 0); expanderTransformation = gtk_expander_new(_("More options")); gtk_expander_set_expanded(GTK_EXPANDER(expanderTransformation), FALSE); gtk_box_pack_start(GTK_BOX (vbox), expanderTransformation, FALSE, FALSE, 0); alignment3 = gtk_alignment_new(0.5, 0.5, 1, 1); gtk_alignment_set_padding(GTK_ALIGNMENT(alignment3), 0, 0, 15, 0); gtk_container_add(GTK_CONTAINER(expanderTransformation), alignment3); vboxTransformation = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(alignment3), vboxTransformation); hbox6 = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (vboxTransformation), hbox6, FALSE, FALSE, 0); label = gtk_label_new(_("Color space: ")); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_misc_set_alignment (GTK_MISC (label), 0., 0.5); gtk_box_pack_start (GTK_BOX (hbox6), label, TRUE, TRUE, 0); radiobuttonDataRGB = gtk_radio_button_new_with_mnemonic (NULL, _("RGB")); gtk_box_pack_start (GTK_BOX (hbox6), radiobuttonDataRGB, FALSE, FALSE, 0); gtk_radio_button_set_group (GTK_RADIO_BUTTON (radiobuttonDataRGB), radiobuttonDataRGB_group); radiobuttonDataRGB_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radiobuttonDataRGB)); radiobuttonDataHSV = gtk_radio_button_new_with_mnemonic (NULL, _("HSV")); gtk_box_pack_start (GTK_BOX (hbox6), radiobuttonDataHSV, FALSE, FALSE, 0); gtk_radio_button_set_group (GTK_RADIO_BUTTON (radiobuttonDataHSV), radiobuttonDataRGB_group); radiobuttonDataRGB_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radiobuttonDataHSV)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radiobuttonDataHSV), TRUE); tableLinearToolShade = gtk_table_new (3, 7, FALSE); gtk_box_pack_start (GTK_BOX (vboxTransformation), tableLinearToolShade, FALSE, FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (tableLinearToolShade), 3); gtk_table_set_row_spacings (GTK_TABLE (tableLinearToolShade), 3); labelChannel[0] = gtk_label_new (_("R")); gtk_table_attach (GTK_TABLE (tableLinearToolShade), labelChannel[0], 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (labelChannel[0]), 0, 0.5); labelChannel[1] = gtk_label_new (_("G")); gtk_table_attach (GTK_TABLE (tableLinearToolShade), labelChannel[1], 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (labelChannel[1]), 0, 0.5); labelChannel[2] = gtk_label_new (_("B")); gtk_table_attach (GTK_TABLE (tableLinearToolShade), labelChannel[2], 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (labelChannel[2]), 0, 0.5); label14 = gtk_label_new ("="); gtk_table_attach (GTK_TABLE (tableLinearToolShade), label14, 1, 2, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); label14 = gtk_label_new ("="); gtk_table_attach (GTK_TABLE (tableLinearToolShade), label14, 1, 2, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); label14 = gtk_label_new ("="); gtk_table_attach (GTK_TABLE (tableLinearToolShade), label14, 1, 2, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); label15 = gtk_label_new ("+"); gtk_table_attach (GTK_TABLE (tableLinearToolShade), label15, 3, 4, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); label15 = gtk_label_new ("+"); gtk_table_attach (GTK_TABLE (tableLinearToolShade), label15, 3, 4, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); label15 = gtk_label_new ("+"); gtk_table_attach (GTK_TABLE (tableLinearToolShade), label15, 3, 4, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); label16 = gtk_label_new ("\303\227"); gtk_table_attach (GTK_TABLE (tableLinearToolShade), label16, 5, 6, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); label20 = gtk_label_new ("\303\227"); gtk_table_attach (GTK_TABLE (tableLinearToolShade), label20, 5, 6, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); label21 = gtk_label_new ("\303\227"); gtk_table_attach (GTK_TABLE (tableLinearToolShade), label21, 5, 6, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); spinbuttonDataChA[0] = gtk_spin_button_new_with_range(-99, 99, 0.01); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbuttonDataChA[0]), 1.); gtk_table_attach (GTK_TABLE (tableLinearToolShade), spinbuttonDataChA[0], 4, 5, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbuttonDataChA[0]), TRUE); spinbuttonDataChA[1] = gtk_spin_button_new_with_range(-99, 99, 0.01); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbuttonDataChA[1]), 1.); gtk_table_attach (GTK_TABLE (tableLinearToolShade), spinbuttonDataChA[1], 4, 5, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbuttonDataChA[1]), TRUE); spinbuttonDataChA[2] = gtk_spin_button_new_with_range(-99, 99, 0.01); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbuttonDataChA[2]), 1.); gtk_table_attach (GTK_TABLE (tableLinearToolShade), spinbuttonDataChA[2], 4, 5, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbuttonDataChA[2]), TRUE); spinbuttonDataChB[0] = gtk_spin_button_new_with_range(-99, 99, 0.01); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbuttonDataChB[0]), 0.); gtk_table_attach (GTK_TABLE (tableLinearToolShade), spinbuttonDataChB[0], 2, 3, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbuttonDataChB[0]), TRUE); spinbuttonDataChB[1] = gtk_spin_button_new_with_range(-99, 99, 0.01); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbuttonDataChB[1]), 0.); gtk_table_attach (GTK_TABLE (tableLinearToolShade), spinbuttonDataChB[1], 2, 3, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbuttonDataChB[1]), TRUE); spinbuttonDataChB[2] = gtk_spin_button_new_with_range(-99, 99, 0.01); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbuttonDataChB[2]), 0.); gtk_table_attach (GTK_TABLE (tableLinearToolShade), spinbuttonDataChB[2], 2, 3, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbuttonDataChB[2]), TRUE); for (i = 0; i < 3; i++) { comboboxDataCh[i] = gtk_combo_box_text_new(); gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(comboboxDataCh[i]), (const gchar*)0, COL_ONE); gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(comboboxDataCh[i]), (const gchar*)0, COL_COORD_X); gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(comboboxDataCh[i]), (const gchar*)0, COL_COORD_Y); gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(comboboxDataCh[i]), (const gchar*)0, COL_COORD_Z); gtk_combo_box_set_active(GTK_COMBO_BOX(comboboxDataCh[i]), 0); gtk_table_attach (GTK_TABLE (tableLinearToolShade), comboboxDataCh[i], 6, 7, i, i + 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); } hbox8 = gtk_hbox_new (FALSE, 0); gtk_box_pack_start(GTK_BOX(vboxTransformation), hbox8, FALSE, FALSE, 0); label = gtk_label_new(_("Color range preview: ")); gtk_box_pack_start (GTK_BOX (hbox8), label, FALSE, FALSE, 0); pixbufColorPreview = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, COLOR_PREVIEW_BITS, COLOR_PREVIEW_WIDTH, COLOR_PREVIEW_HEIGHT); colorPreview = create_pixmap ((GtkWidget*)0, NULL); gtk_widget_set_size_request (colorPreview, COLOR_PREVIEW_WIDTH, COLOR_PREVIEW_HEIGHT); gtk_box_pack_start (GTK_BOX (hbox8), colorPreview, TRUE, TRUE, 0); labelPreview = gtk_label_new(_("No preview available")); gtk_label_set_use_markup(GTK_LABEL(labelPreview), TRUE); gtk_box_pack_start (GTK_BOX (hbox8), labelPreview, TRUE, TRUE, 0); /* Bar */ alignment2 = gtk_alignment_new(0.5, 0.5, 0.3, 0); gtk_box_pack_start(GTK_BOX(vbox), alignment2, FALSE, FALSE, 8); hrule = gtk_hseparator_new(); gtk_container_add(GTK_CONTAINER(alignment2), hrule); checkShowLegend = gtk_check_button_new_with_mnemonic(_("Display the colour range.")); gtk_box_pack_start(GTK_BOX(vboxTransformation), checkShowLegend, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkShowLegend), TRUE); /***********************/ /* Post treatment part */ /***********************/ expanderPostProcessing = gtk_expander_new(_("Post processing:")); gtk_widget_set_sensitive(expanderPostProcessing, FALSE); gtk_widget_set_name(gtk_expander_get_label_widget(GTK_EXPANDER(expanderPostProcessing)), "label_head"); gtk_expander_set_expanded(GTK_EXPANDER(expanderPostProcessing), TRUE); gtk_box_pack_start(GTK_BOX(vbox), expanderPostProcessing, FALSE, FALSE, 0); vboxPostProcessing = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(expanderPostProcessing), vboxPostProcessing); hbox3 = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vboxPostProcessing), hbox3, FALSE, FALSE, 0); checkHideMinValues = gtk_check_button_new_with_mnemonic(_("_Hide elements")); gtk_box_pack_start(GTK_BOX(hbox3), checkHideMinValues, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkHideMinValues), FALSE); label = gtk_label_new(_(" whose value from")); gtk_box_pack_start(GTK_BOX(hbox3), label, FALSE, FALSE, 0); hbox3 = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vboxPostProcessing), hbox3, FALSE, FALSE, 0); label = gtk_label_new(_("col. ")); gtk_misc_set_alignment(GTK_MISC(label), 1., 0.5); gtk_box_pack_start(GTK_BOX(hbox3), label, TRUE, TRUE, 0); /* The 2 here is to avoid a GTK bug in 2.4. */ spinHideMinValues = gtk_spin_button_new_with_range(1, 2, 1); gtk_box_pack_start(GTK_BOX(hbox3), spinHideMinValues, FALSE, FALSE, 0); label = gtk_label_new(_(" is lower than ")); gtk_box_pack_start(GTK_BOX(hbox3), label, FALSE, FALSE, 0); entryHideMinValues = visu_ui_numerical_entry_new(1.); gtk_entry_set_width_chars(GTK_ENTRY(entryHideMinValues), 10); gtk_box_pack_start(GTK_BOX(hbox3), entryHideMinValues, FALSE, FALSE, 0); hbox3 = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vboxPostProcessing), hbox3, FALSE, FALSE, 0); checkScaleRadius = gtk_check_button_new_with_mnemonic(_("_Scale shape according to ")); gtk_box_pack_start(GTK_BOX(hbox3), checkScaleRadius, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkScaleRadius), FALSE); comboboxDataCh[3] = gtk_combo_box_text_new(); /* gtk_combo_box_append_text(GTK_COMBO_BOX(comboboxDataCh[i]), COL_ONE); */ /* gtk_combo_box_append_text(GTK_COMBO_BOX(comboboxDataCh[i]), COL_COORD_X); */ /* gtk_combo_box_append_text(GTK_COMBO_BOX(comboboxDataCh[i]), COL_COORD_Y); */ /* gtk_combo_box_append_text(GTK_COMBO_BOX(comboboxDataCh[i]), COL_COORD_Z); */ /* gtk_combo_box_set_active(GTK_COMBO_BOX(comboboxDataCh[i]), 0); */ gtk_box_pack_start(GTK_BOX(hbox3), comboboxDataCh[3], TRUE, TRUE, 0); hbox3 = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vboxPostProcessing), hbox3, FALSE, FALSE, 0); checkRestrictInRange = gtk_check_button_new_with_mnemonic(_("_Restrict colourisation" " to values in range.")); gtk_box_pack_start(GTK_BOX(hbox3), checkRestrictInRange, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkRestrictInRange), FALSE); /**************/ /* Status bar */ /**************/ statusbarDataFile = gtk_statusbar_new(); gtk_box_pack_end(GTK_BOX(containerDataFilePanel), statusbarDataFile, FALSE, FALSE, 0); #if GTK_MAJOR_VERSION < 3 && GTK_MINOR_VERSION < 24 gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (statusbarDataFile), FALSE); #endif statusDataFileContextId = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbarDataFile), _("Description of loaded data file.")); gtk_statusbar_push(GTK_STATUSBAR(statusbarDataFile), statusDataFileContextId, DATA_FILE_NO_FILE_MESSAGE); gtk_widget_show_all(containerDataFilePanel); gtk_widget_hide(colorPreview); /********************/ /* Create callbacks */ /********************/ signalCheckDataFile = g_signal_connect(G_OBJECT(checkbuttonData), "toggled", G_CALLBACK(useDataFileColor), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "dataLoaded", G_CALLBACK(visuFileReset), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "dataRendered", G_CALLBACK(onDataReady), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "dataUnRendered", G_CALLBACK(onDataNotReady), (gpointer)0); g_signal_connect(G_OBJECT(radioNormalized), "toggled", G_CALLBACK(onScaleTypeChange), (gpointer)VISU_COLORIZATION_NORMALIZE); g_signal_connect(G_OBJECT(radioMinMax), "toggled", G_CALLBACK(onScaleTypeChange), (gpointer)VISU_COLORIZATION_MINMAX); g_signal_connect(G_OBJECT(entryDataMin), "value-changed", G_CALLBACK(onEntryMinMaxChangeValue), (gpointer)0); g_signal_connect(G_OBJECT(entryDataMax), "value-changed", G_CALLBACK(onEntryMinMaxChangeValue), (gpointer)1); signalComboColumnId[4] = g_signal_connect(G_OBJECT(comboboxDataCh[4]), "changed", G_CALLBACK(onComboManualChange), (gpointer)0); signalComboColumnId[5] = g_signal_connect(G_OBJECT(comboboxDataCh[5]), "changed", G_CALLBACK(onComboPresetColChange), (gpointer)0); for (i = 0; i < 3; i++) { signalSpinDataChA[i] = g_signal_connect(G_OBJECT(spinbuttonDataChA[i]), "value-changed", G_CALLBACK(onSpinChChangeValue), GINT_TO_POINTER(i + 3)); signalSpinDataChB[i] = g_signal_connect(G_OBJECT(spinbuttonDataChB[i]), "value-changed", G_CALLBACK(onSpinChChangeValue), GINT_TO_POINTER(i)); signalComboColumnId[i] = g_signal_connect(G_OBJECT(comboboxDataCh[i]), "changed", G_CALLBACK(onComboColChange), GINT_TO_POINTER(i)); } signalRadioRGB = g_signal_connect(G_OBJECT(radiobuttonDataRGB), "toggled", G_CALLBACK(onColorTypeChange), GINT_TO_POINTER(TOOL_SHADE_COLOR_MODE_RGB)); signalRadioHSV = g_signal_connect(G_OBJECT(radiobuttonDataHSV), "toggled", G_CALLBACK(onColorTypeChange), GINT_TO_POINTER(TOOL_SHADE_COLOR_MODE_HSV)); signalComboToolShade = g_signal_connect(G_OBJECT(comboPreSetColorRange), "shade-selected", G_CALLBACK(onColorPreSetChange), (gpointer)0); g_signal_connect(G_OBJECT(checkHideMinValues), "toggled", G_CALLBACK(onCheckHideMinValuesChange), (gpointer)0); g_signal_connect(G_OBJECT(entryHideMinValues), "value-changed", G_CALLBACK(onEntryHideMinValuesChange), (gpointer)0); g_signal_connect(G_OBJECT(spinHideMinValues), "value-changed", G_CALLBACK(onSpinHideMinValuesChange), (gpointer)0); g_signal_connect(G_OBJECT(checkScaleRadius), "toggled", G_CALLBACK(onCheckScaleRadiusChange), comboboxDataCh[3]); signalComboColumnId[3] = g_signal_connect(G_OBJECT(comboboxDataCh[3]), "changed", G_CALLBACK(onComboScaleChange), checkScaleRadius); g_signal_connect(G_OBJECT(checkRestrictInRange), "toggled", G_CALLBACK(onCheckRestrictChange), (gpointer)0); g_signal_connect(G_OBJECT(checkShowLegend), "toggled", G_CALLBACK(onCheckLegendChange), (gpointer)0); dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelDataFile)); if (dataObj) onDataReady((VisuObject*)0, dataObj, (VisuGlView*)0, (gpointer)0); DBG_fprintf(stderr, " | Creation OK.\n"); gtk_container_add(GTK_CONTAINER(panelDataFile), containerDataFilePanel); } static GtkWidget* _createLoadDataDialog() { GtkWidget *file_selector; char *directory; GtkFileFilter *filter; GString *label; file_selector = gtk_file_chooser_dialog_new(_("Load data file"), visu_ui_panel_getContainerWindow(VISU_UI_PANEL(panelDataFile)), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); directory = visu_ui_getLastOpenDirectory(); if (directory) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(file_selector), directory); gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(file_selector), FALSE); filter = gtk_file_filter_new(); label = g_string_new(_("Data files")); g_string_append_printf(label, " (*%s)", gtk_entry_get_text(GTK_ENTRY(entryFileExtension))); gtk_file_filter_set_name(filter, label->str); g_string_printf(label, "*%s", gtk_entry_get_text(GTK_ENTRY(entryFileExtension))); gtk_file_filter_add_pattern(filter, label->str); g_string_free(label, TRUE); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(file_selector), filter); filter = gtk_file_filter_new(); gtk_file_filter_set_name(filter, _("All files")); gtk_file_filter_add_pattern(filter, "*"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(file_selector), filter); gtk_widget_set_name(file_selector, "filesel"); gtk_window_set_position(GTK_WINDOW(file_selector), GTK_WIN_POS_CENTER_ON_PARENT); gtk_window_set_modal (GTK_WINDOW (file_selector), TRUE); g_signal_connect(G_OBJECT(file_selector), "response", G_CALLBACK(onLoadDataResponse), (gpointer)0); return file_selector; } static void onLoadDataResponse(GtkDialog *dialog, gint response, gpointer data _U_) { char *filename; char *directory; int res; VisuData *dataObj; gboolean new; gtk_widget_hide(GTK_WIDGET(dialog)); directory = (char*)gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(dialog)); visu_ui_setLastOpenDirectory(directory, VISU_UI_DIR_DATAFILE); g_free(directory); if (response == GTK_RESPONSE_OK) { dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelDataFile)); filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); DBG_fprintf(stderr, "Panel DataFile: load file '%s'.\n", filename); res = visu_ui_panel_colorization_load(dataObj, filename, &new); DBG_fprintf(stderr, "Panel DataFile: load OK, new %d.\n", new); g_free(filename); DBG_fprintf(stderr, "Panel DataFile: update the panel.\n"); visu_ui_panel_colorization_update(dataObj); DBG_fprintf(stderr, "Panel DataFile: update OK.\n"); /* Ask for a redraw */ if (res) { g_signal_emit_by_name(G_OBJECT(dataObj), "RenderingChanged", (VisuElement*)0, NULL); DBG_fprintf(stderr, "Panel DataFile: may ask for redraw.\n"); /* Update rendering. */ if (new) gtk_combo_box_set_active(GTK_COMBO_BOX(comboPreSetColorRange), 0); else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbuttonData))) VISU_REDRAW_ADD; } else { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkHideMinValues))) { applyHideMinValues(dataObj, FALSE); VISU_REDRAW_ADD; } } } } static void updateNormalisationWidgets(VisuData *data) { GtkWidget *childMinMax; int nbColumns; int i; GtkWidget *table, *label; GString *labelStr; float minMax[2]; VisuColorization *dt; DBG_fprintf(stderr, "Panel DataFile: update widgets for normalisation.\n"); /* empty the child of the alignment */ childMinMax = gtk_bin_get_child(GTK_BIN(readMinMaxValues)); if (childMinMax) gtk_widget_destroy(childMinMax); dt = visu_colorization_get(data, FALSE, (gboolean*)0); /* Special case without VisuData or without stored data. */ if (!visu_colorization_getFileSet(dt)) { label = gtk_label_new(MIN_MAX_NO_DATA_FILE); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_widget_show(label); gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5); gtk_container_add(GTK_CONTAINER(readMinMaxValues), label); return; } /* Update the radio buttons. */ switch (visu_colorization_getScaleType(dt)) { case VISU_COLORIZATION_NORMALIZE: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioNormalized), TRUE); break; case VISU_COLORIZATION_MINMAX: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioMinMax), TRUE); break; default: break; } /* Update the min max entries. */ i = gtk_combo_box_get_active(GTK_COMBO_BOX(comboboxDataCh[4])); if (i >= 0) { i -= N_COORDS_COLS; visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryDataMin), visu_colorization_getMin(dt, i)); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryDataMax), visu_colorization_getMax(dt, i)); } /* Update the table of min/max values. */ nbColumns = visu_colorization_getNColumns(dt); g_return_if_fail(nbColumns > 0); table = gtk_table_new(nbColumns + 1, 3, FALSE); /* label = gtk_label_new(_("Column number")); */ /* gtk_widget_set_name(label, "label_head"); */ /* gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_SHRINK, GTK_SHRINK, 2, 0); */ label = gtk_label_new(_("Min value")); gtk_widget_set_name(label, "label_head"); gtk_table_attach(GTK_TABLE(table), label, 1, 2, 0, 1, GTK_EXPAND, GTK_SHRINK, 2, 0); label = gtk_label_new(_("Max value")); gtk_widget_set_name(label, "label_head"); gtk_table_attach(GTK_TABLE(table), label, 2, 3, 0, 1, GTK_EXPAND, GTK_SHRINK, 2, 0); labelStr = g_string_new(""); for (i = 0; i < nbColumns; i++) { g_string_printf(labelStr, _("Column %d"), i + 1); label = gtk_label_new(labelStr->str); gtk_table_attach(GTK_TABLE(table), label, 0, 1, i + 1, i + 2, GTK_SHRINK, GTK_SHRINK, 2, 0); if (visu_colorization_getColumnMinMax(dt, minMax, i)) { g_string_printf(labelStr, "%g", minMax[0]); label = gtk_label_new(labelStr->str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_table_attach(GTK_TABLE(table), label, 1, 2, i + 1, i + 2, GTK_EXPAND, GTK_SHRINK, 2, 0); g_string_printf(labelStr, "%g", minMax[1]); label = gtk_label_new(labelStr->str); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_table_attach(GTK_TABLE(table), label, 2, 3, i + 1, i + 2, GTK_EXPAND, GTK_SHRINK, 2, 0); } else g_warning("Can't retrieve min/max values for column %d.\n", i); } gtk_widget_show_all(table); g_string_free(labelStr, TRUE); gtk_container_add(GTK_CONTAINER(readMinMaxValues), table); } static void updateColorWidgets(VisuData *data) { int i, j; GString *label; const int *selected; int scale; float *vectA, *vectB; ToolShade *shade; VisuColorization *dt; DBG_fprintf(stderr, "Panel dataFile: rebuilding colour widgets.\n"); /* empty combobox */ g_signal_handler_block(G_OBJECT(comboboxDataCh[0]), signalComboColumnId[0]); g_signal_handler_block(G_OBJECT(comboboxDataCh[1]), signalComboColumnId[1]); g_signal_handler_block(G_OBJECT(comboboxDataCh[2]), signalComboColumnId[2]); g_signal_handler_block(G_OBJECT(comboboxDataCh[3]), signalComboColumnId[3]); g_signal_handler_block(G_OBJECT(comboboxDataCh[4]), signalComboColumnId[4]); g_signal_handler_block(G_OBJECT(comboboxDataCh[5]), signalComboColumnId[5]); for (j = nbColumns + N_COORDS_COLS - 1; j > N_COORDS_COLS - 1; j--) { gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(comboboxDataCh[4]), j); gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(comboboxDataCh[5]), j); } for (i = 0; i < 3; i++) { for (j = nbColumns + N_STATIC_COLS - 1; j > N_STATIC_COLS - 1; j--) gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(comboboxDataCh[i]), j); gtk_combo_box_set_active(GTK_COMBO_BOX(comboboxDataCh[i]), 0); DBG_fprintf(stderr, "Panel dataFile: reset channel %d.\n", i); } for (j = nbColumns - 1; j > - 1; j--) gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(comboboxDataCh[3]), j); if (data) { dt = visu_colorization_get(data, FALSE, (gboolean*)0); shade = visu_colorization_getShade(dt); if (shade) { if (tool_shade_getMode(shade) == TOOL_SHADE_MODE_LINEAR) { tool_shade_getLinearCoeff(shade, &vectA, &vectB); /* Update the vectors. */ gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbuttonDataChA[0]), vectA[0]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbuttonDataChA[1]), vectA[1]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbuttonDataChA[2]), vectA[2]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbuttonDataChB[0]), vectB[0]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbuttonDataChB[1]), vectB[1]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbuttonDataChB[2]), vectB[2]); } gtk_widget_set_sensitive(tableLinearToolShade, (tool_shade_getMode(shade) == TOOL_SHADE_MODE_LINEAR)); } /* Rebuild the column comboboxes. */ nbColumns = visu_colorization_getNColumns(dt); if (nbColumns > 0) { label = g_string_new(""); for (j = 0; j < nbColumns; j++) { g_string_printf(label, _("Col. %d"), j + 1); for (i = 0; i < 6; i++) gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(comboboxDataCh[i]), (const gchar*)0, label->str); } g_string_free(label, TRUE); } selected = visu_colorization_getColUsed(dt); if (selected) { for (i = 0; i < 3; i++) { DBG_fprintf(stderr, "Panel dataFile: Channel %d has selection %d.\n", i, selected[i]); gtk_combo_box_set_active(GTK_COMBO_BOX(comboboxDataCh[i]), selected[i] + N_STATIC_COLS); } if (visu_colorization_getSingleColumnId(dt, &i)) gtk_combo_box_set_active(GTK_COMBO_BOX(comboboxDataCh[5]), i + N_STATIC_COLS - 1); } scale = visu_colorization_getScalingUsed(dt); if (scale != -N_STATIC_COLS) gtk_combo_box_set_active(GTK_COMBO_BOX(comboboxDataCh[3]), scale + N_STATIC_COLS); if (shade) { /* Change the colour scheme. */ switch (tool_shade_getColorMode(shade)) { case TOOL_SHADE_COLOR_MODE_RGB: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radiobuttonDataRGB), TRUE); for (i = 0; i < 3; i++) gtk_label_set_text(GTK_LABEL(labelChannel[i]), labelRGB[i]); break; case TOOL_SHADE_COLOR_MODE_HSV: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radiobuttonDataHSV), TRUE); for (i = 0; i < 3; i++) gtk_label_set_text(GTK_LABEL(labelChannel[i]), labelHSV[i]); break; default: break; } /* Update the preset combo. */ g_signal_handler_block(G_OBJECT(comboPreSetColorRange), signalComboToolShade); visu_ui_shade_combobox_setSelectionByShade(VISU_UI_SHADE_COMBOBOX(comboPreSetColorRange), shade); g_signal_handler_unblock(G_OBJECT(comboPreSetColorRange), signalComboToolShade); } } g_signal_handler_unblock(G_OBJECT(comboboxDataCh[0]), signalComboColumnId[0]); g_signal_handler_unblock(G_OBJECT(comboboxDataCh[1]), signalComboColumnId[1]); g_signal_handler_unblock(G_OBJECT(comboboxDataCh[2]), signalComboColumnId[2]); g_signal_handler_unblock(G_OBJECT(comboboxDataCh[3]), signalComboColumnId[3]); g_signal_handler_unblock(G_OBJECT(comboboxDataCh[4]), signalComboColumnId[4]); g_signal_handler_unblock(G_OBJECT(comboboxDataCh[5]), signalComboColumnId[5]); gtk_combo_box_set_active(GTK_COMBO_BOX(comboboxDataCh[4]), 0); /* Update the color preview. */ makeColorPreview(data); } static void updatePostWidgets(VisuData *data) { int nb; GtkAdjustment *adj; VisuColorization *dt; if (!data) return; DBG_fprintf(stderr, "Panel dataFile: update post-processing widgets.\n"); dt = visu_colorization_get(data, FALSE, (gboolean*)0); nb = MAX(visu_colorization_getNColumns(dt), 1); adj = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(spinHideMinValues)); gtk_adjustment_set_upper(adj, nb); /* gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinHideMinValues), 1); */ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkRestrictInRange), visu_colorization_getRestrictInRange(dt)); } static void makeColorPreview(VisuData *data) { const int *valCols; int i, j, id; int rowstride, x, y; guchar *pixels, *p; float rgbValues[COLOR_PREVIEW_WIDTH][4]; float fromVal[3]; ToolShade *shade; VisuColorization *dt; if (!data) { gtk_image_set_from_pixbuf(GTK_IMAGE(colorPreview), NULL); gtk_widget_hide(colorPreview); gtk_widget_show(labelPreview); return; } dt = visu_colorization_get(data, FALSE, (gboolean*)0); valCols = visu_colorization_getColUsed(dt); if (!valCols) return; if (!visu_colorization_getSingleColumnId(dt, &id)) { gtk_image_set_from_pixbuf(GTK_IMAGE(colorPreview), NULL); gtk_widget_hide(colorPreview); gtk_widget_show(labelPreview); visu_gl_ext_setActive(VISU_GL_EXT(extLeg), FALSE); } else { DBG_fprintf(stderr, "Panel dataFile: making color preview bitmap.\n"); rowstride = gdk_pixbuf_get_rowstride(pixbufColorPreview); pixels = gdk_pixbuf_get_pixels(pixbufColorPreview); shade = visu_colorization_getShade(dt); for (i = 0; i < COLOR_PREVIEW_WIDTH; i++) { for (j = 0; j < 3; j++) fromVal[j] = (valCols[j] != -N_STATIC_COLS)?(float)i / (float)(COLOR_PREVIEW_WIDTH - 1):1.; tool_shade_channelToRGB(shade, rgbValues[i], fromVal); /* fprintf(stderr, "% d ----> %f %f %f -> %f %f %f\n",i, fromVal[0], fromVal[1], fromVal [2], rgbValues[i][0], rgbValues[i][1], rgbValues[i][2]); */ } for (y = 0; y < COLOR_PREVIEW_HEIGHT; y++) for (x = 0; x < COLOR_PREVIEW_WIDTH; x++) { p = pixels + y * rowstride + x * 3; p[0] = (guchar)(rgbValues[x][0] * 255); p[1] = (guchar)(rgbValues[x][1] * 255); p[2] = (guchar)(rgbValues[x][2] * 255); } gtk_image_set_from_pixbuf(GTK_IMAGE(colorPreview), pixbufColorPreview); gtk_widget_hide(labelPreview); gtk_widget_show(colorPreview); visu_gl_ext_setActive(VISU_GL_EXT(extLeg), gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkShowLegend)) && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbuttonData))); visu_gl_ext_shade_setMinMax(extLeg, visu_colorization_getMin(dt, id), visu_colorization_getMax(dt, id)); visu_gl_ext_frame_setGlView(VISU_GL_EXT_FRAME(extLeg), visu_ui_panel_getView(VISU_UI_PANEL(panelDataFile))); visu_gl_ext_shade_setShade(extLeg, shade); visu_gl_ext_frame_draw(VISU_GL_EXT_FRAME(extLeg)); } } static void updateStatusBar(VisuData *data) { gchar *fileUTF8, *basename; gchar *message; VisuColorization *dt; gchar *currentDataFile; gint nbColumns; dt = visu_colorization_get(data, FALSE, (gboolean*)0); nbColumns = visu_colorization_getNColumns(dt); currentDataFile = visu_colorization_getFile(dt); /* Create the text of the status bar or empty it. */ gtk_statusbar_pop(GTK_STATUSBAR(statusbarDataFile), statusDataFileContextId); /* Create the text of the status bar or empty it. */ if (currentDataFile) { basename = g_path_get_basename(currentDataFile); fileUTF8 = g_filename_to_utf8(basename, -1, NULL, NULL, NULL); g_free(basename); g_return_if_fail(fileUTF8); if (nbColumns > 0) message = g_strdup_printf(_("%s: %d column(s)"), fileUTF8, nbColumns); else message = g_strdup_printf(_("%s: file error"), fileUTF8); g_free(fileUTF8); gtk_statusbar_push(GTK_STATUSBAR(statusbarDataFile), statusDataFileContextId, message); g_free(message); g_free(currentDataFile); } else if (nbColumns > 0) { message = g_strdup_printf(_("%d column(s)"), nbColumns); gtk_statusbar_push(GTK_STATUSBAR(statusbarDataFile), statusDataFileContextId, message); g_free(message); } else gtk_statusbar_push(GTK_STATUSBAR(statusbarDataFile), statusDataFileContextId, DATA_FILE_NO_FILE_MESSAGE); } /** * visu_ui_panel_colorization_load: * @visuData: the #VisuData object to associated the data to ; * @file: the file to read ; * @new: return TRUE if the loaded data are associated for the * first time to @visuData. * * Read the given data file and associate the values of each column to * the node. It does not update the widgets of the panel. This is done * to allow to change the values of the colouration before drawing the * widgets. See visu_ui_panel_colorization_update() to do it. * * Returns: TRUE if VisuNodeArray::RenderingChanged should be emitted. */ gboolean visu_ui_panel_colorization_load(VisuData *visuData, const gchar *file, gboolean *new) { GError *error; gchar *errStr; VisuColorization *dt; DBG_fprintf(stderr, "Panel dataFile: loading a new data file '%s'.\n", file); g_return_val_if_fail(visuData && file && new, 0); /* If panel has still not been loaded, we do it now. */ if (!panelDataFileIsInitiated) { panelDataFileIsInitiated = TRUE; createInteriorDataFile(); } error = (GError*)0; dt = visu_colorization_new_fromFile(visuData, file, new, &error); /* Raise the error dialog if necessary. */ if (error) { errStr = g_strdup_printf(_("Reading data file '%s' reports:\n\t%s"), file, error->message); visu_ui_raiseWarning(_("Loading a data file"), errStr, (GtkWindow*)0); g_free(errStr); g_error_free(error); } if (dt) { /* Set if the colours are used. */ visu_colorization_setUsed (visuData, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbuttonData))); /* Force applying hidding status if needed. */ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkHideMinValues))) applyHideMinValues(visuData, FALSE); flagDataFileIsLoaded = TRUE; } else flagDataFileIsLoaded = FALSE; gtk_widget_set_sensitive(expanderPostProcessing, flagDataFileIsLoaded); DBG_fprintf(stderr, "Panel dataFile: load OK.\n"); return flagDataFileIsLoaded; } /** * visu_ui_panel_colorization_update: * @visuData: the #VisuData object to associated the data to. * * Update the widgets depending on the colouration associated to the given * #VisuData object. */ void visu_ui_panel_colorization_update(VisuData *dataObj) { VisuColorization *dt; #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 gchar *currentDataFile; #endif DBG_fprintf(stderr, "Panel dataFile: update the widgets" " depending on the data %p.\n", (gpointer)dataObj); if (!dataObj) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbuttonData), FALSE); dt = visu_colorization_get(dataObj, FALSE, (gboolean*)0); /* Update the widgets of this panel if necessary. */ #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 currentDataFile = visu_colorization_getFile(dt); if (currentDataFile) gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(openDataFileButton), currentDataFile); g_free(currentDataFile); #endif updateStatusBar(dataObj); updateNormalisationWidgets(dataObj); updateColorWidgets(dataObj); updatePostWidgets(dataObj); /* currentDataFile is updated by updateStatusBar(). */ gtk_widget_set_sensitive(vBoxDataFileOption, (dataObj != (VisuData*)0)); gtk_widget_set_sensitive(expanderPostProcessing, (visu_colorization_getNColumns(dt) > 0)); } /*************/ /* Callbacks */ /*************/ static void visuFileReset(GObject *obj _U_, VisuData *dataObj, gpointer data _U_) { gchar *fileCpy, *fileExtPosition, *dataFile; int res, nbColumns, iCol; float minVal, maxVal; int dataNormalize; int colUsed[3]; const int *oldCols; gboolean new; ToolShade *shade, *tmpSh; VisuData *dataOld; VisuColorization *dt; DBG_fprintf(stderr, "Panel dataFile: caught 'dataLoaded' signal.\n"); if (dataObj) { /* Store old values, may be useful if data file is autoloaded. */ DBG_fprintf(stderr, "Panel dataFile: Saving current colour values.\n"); dataOld = visu_ui_panel_getData(VISU_UI_PANEL(panelDataFile)); dt = visu_colorization_get(dataOld, FALSE, (gboolean*)0); tmpSh = (dataOld)?visu_colorization_getShade(dt): visu_ui_shade_combobox_getSelection(VISU_UI_SHADE_COMBOBOX(comboPreSetColorRange)); shade = (tmpSh)?tool_shade_copy(tmpSh):(ToolShade*)0; oldCols = (dataOld)?visu_colorization_getColUsed(dt):(int*)0; if (oldCols) { colUsed[0] = oldCols[0]; colUsed[1] = oldCols[1]; colUsed[2] = oldCols[2]; } else { colUsed[0] = 0; colUsed[1] = 0; colUsed[2] = 0; } DBG_fprintf(stderr, " | column usage %d ; %d ; %d\n", colUsed[0], colUsed[1], colUsed[2]); iCol = gtk_combo_box_get_active(GTK_COMBO_BOX(comboboxDataCh[4])); minVal = visu_ui_numerical_entry_getValue(VISU_UI_NUMERICAL_ENTRY(entryDataMin)); maxVal = visu_ui_numerical_entry_getValue(VISU_UI_NUMERICAL_ENTRY(entryDataMax)); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioNormalized))) dataNormalize = VISU_COLORIZATION_NORMALIZE; else dataNormalize = VISU_COLORIZATION_MINMAX; /* Check the autoload flag. */ res = FALSE; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbuttonAutoLoad))) { /* Compute the name of the data file from the rendered filename. */ fileCpy = g_strdup(visu_data_getFile(dataObj, 0, (ToolFileFormat**)0)); fileExtPosition = g_strrstr(fileCpy, "."); if (fileExtPosition) *fileExtPosition = '\0'; dataFile = g_strdup_printf("%s%s", fileCpy, gtk_entry_get_text(GTK_ENTRY(entryFileExtension))); DBG_fprintf(stderr, "Panel DataFile: try to load a new data file" " ('%s') from the name of the rendered file.\n", dataFile); res = visu_ui_panel_colorization_load(dataObj, dataFile, &new); g_free(dataFile); g_free(fileCpy); } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbuttonData))) { /* Try to reload the same data file. */ dataFile = (dataOld)?visu_colorization_getFile(dt):(gchar*)0; if (dataFile) { res = visu_ui_panel_colorization_load(dataObj, dataFile, &new); g_free(dataFile); } else res = (colUsed[0] > -N_STATIC_COLS && colUsed[1] > -N_STATIC_COLS && colUsed[2] > -N_STATIC_COLS); } if (res) { DBG_fprintf(stderr, "Panel dataFile: restore colour" " values from previous.\n"); dt = visu_colorization_get(dataObj, TRUE, (gboolean*)0); /* Reuse previous colUsed values. */ if (shade) visu_colorization_setShade(dt, shade); nbColumns = visu_colorization_getNColumns(dt); if (colUsed[0] < nbColumns) visu_colorization_setColUsed(dt, colUsed[0], 0); if (colUsed[1] < nbColumns) visu_colorization_setColUsed(dt, colUsed[1], 1); if (colUsed[2] < nbColumns) visu_colorization_setColUsed(dt, colUsed[2], 2); if (iCol >= 0) { iCol -= N_COORDS_COLS; visu_colorization_setMin(dt, minVal, iCol); visu_colorization_setMax(dt, maxVal, iCol); } visu_colorization_setScaleType(dt, dataNormalize); } visu_colorization_setUsed (dataObj, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbuttonData))); } if (visu_ui_panel_getVisible(VISU_UI_PANEL(panelDataFile))) { flagDisableCallbacks = TRUE; visu_ui_panel_colorization_update(dataObj); flagDisableCallbacks = FALSE; } } static void onDataReady(VisuObject *obj _U_, VisuData *dataObj, VisuGlView *view _U_, gpointer data _U_) { DBG_fprintf(stderr, "Panel DataFile: caught 'dataRendered' signal," " connecting local signals.\n"); if (dataObj) hide_signal = g_signal_connect(G_OBJECT(dataObj), "AskForShowHide", G_CALLBACK(onAskForHideNodes), (gpointer)0); } static void onDataNotReady(VisuObject *obj _U_, VisuData *dataObj, VisuGlView *view _U_, gpointer data _U_) { DBG_fprintf(stderr, "Panel DataFile: caught 'dataUnRendered' signal," " disconnecting local signals.\n"); g_signal_handler_disconnect(G_OBJECT(dataObj), hide_signal); } #if GTK_MAJOR_VERSION < 3 && GTK_MINOR_VERSION < 5 static void loadDataFile(GtkButton *button _U_, gpointer data _U_) { GtkWidget *file_selector; VisuData *dataObj; dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelDataFile)); if (!dataObj) { g_warning("Can't click here since no visuData is available.\n"); return; } file_selector = _createLoadDataDialog(); gtk_dialog_run (GTK_DIALOG (file_selector)); gtk_widget_destroy(file_selector); } #endif /** * visu_ui_panel_colorization_setUsed: * @used: a boolean. * * Set if the panel is used or not. */ void visu_ui_panel_colorization_setUsed(gboolean used) { VisuData *dataObj; dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelDataFile)); if (!dataObj) return; /* If panel has still not been loaded, we do it now. */ if (!panelDataFileIsInitiated) { panelDataFileIsInitiated = TRUE; createInteriorDataFile(); } gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbuttonData), used); } /** * visu_ui_panel_colorization_setRangeMode: * @mode: auto or manual scaling mode. * * Set how data are clamp into [0;1]. * * Since: 3.7 */ void visu_ui_panel_colorization_setRangeMode(VisuColorizationInputScaleId mode) { /* If panel has still not been loaded, we do it now. */ if (!panelDataFileIsInitiated) { panelDataFileIsInitiated = TRUE; createInteriorDataFile(); } if (mode == VISU_COLORIZATION_NORMALIZE) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioNormalized), TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioMinMax), TRUE); } /** * visu_ui_panel_colorization_setManualRange: * @min: a float value. * @max: a float value. * @column: the column to apply the manual range to. * * Set the clamping range to [min;max] for @column. Column ids range * from 0 to (max number of column - 1). Use -3, -2 and -1 for x * coordinates, y and z. * * Since: 3.7 */ void visu_ui_panel_colorization_setManualRange(float min, float max, int column) { VisuData *dataObj; dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelDataFile)); if (!dataObj) return; /* If panel has still not been loaded, we do it now. */ if (!panelDataFileIsInitiated) { panelDataFileIsInitiated = TRUE; createInteriorDataFile(); } /* The column combo should be created here. */ visu_ui_panel_colorization_update(dataObj); DBG_fprintf(stderr, "Panel DataFile: set manual range of column %d to [%f;%f].\n", column, min, max); gtk_combo_box_set_active(GTK_COMBO_BOX(comboboxDataCh[4]), column + 3); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryDataMin), (double)min); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryDataMax), (double)max); } static void useDataFileColor(GtkToggleButton *toggle, gpointer data _U_) { gboolean isOn; int res; VisuData *dataObj; dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelDataFile)); if (!dataObj) return; isOn = gtk_toggle_button_get_active(toggle); res = visu_colorization_setUsed(dataObj, (gboolean)isOn); makeColorPreview(dataObj); /* visu_gl_ext_setActive(VISU_GL_EXT(extLeg), */ /* gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkShowLegend)) && */ /* isOn); */ /* visu_gl_ext_frame_draw(VISU_GL_EXT_FRAME(extLeg)); */ /* Force applying hidding status if needed. */ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkHideMinValues))) applyHideMinValues(dataObj, FALSE); if (res) { g_signal_emit_by_name(G_OBJECT(dataObj), "RenderingChanged", (VisuElement*)0, NULL); VISU_REDRAW_ADD; } } static void onDataFileEnter(VisuUiPanel *visu_ui_panel _U_, gpointer data _U_) { DBG_fprintf(stderr, "Panel dataFile: check values on enter.\n"); if (!panelDataFileIsInitiated) { DBG_fprintf(stderr, "Panel dataFile: initialize interior.\n"); panelDataFileIsInitiated = TRUE; createInteriorDataFile(); } flagDisableCallbacks = TRUE; DBG_fprintf(stderr, "Panel dataFile: set values on enter.\n"); visu_ui_panel_colorization_update(visu_ui_panel_getData(VISU_UI_PANEL(panelDataFile))); flagDisableCallbacks = FALSE; } static void onScaleTypeChange(GtkToggleButton *toggle, gpointer data) { int scale, res; VisuData *dataObj; VisuColorization *dt; if (flagDisableCallbacks) return; DBG_fprintf(stderr, "Panel dataFile: change on scale radio buttons.\n"); if (!gtk_toggle_button_get_active(toggle)) return; dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelDataFile)); g_return_if_fail(dataObj); scale = GPOINTER_TO_INT(data); g_return_if_fail(scale >= VISU_COLORIZATION_NORMALIZE && scale <= VISU_COLORIZATION_MINMAX); dt = visu_colorization_get(dataObj, TRUE, (gboolean*)0); res = visu_colorization_setScaleType(dt, scale); if (scale != VISU_COLORIZATION_MINMAX) { gtk_widget_set_sensitive(entryDataMax, FALSE); gtk_widget_set_sensitive(entryDataMin, FALSE); gtk_widget_set_sensitive(comboboxDataCh[4], FALSE); } else { gtk_widget_set_sensitive(entryDataMax, TRUE); gtk_widget_set_sensitive(entryDataMin, TRUE); gtk_widget_set_sensitive(comboboxDataCh[4], TRUE); gtk_expander_set_expanded(GTK_EXPANDER(expanderNormalize), TRUE); } if (res) { g_signal_emit_by_name(G_OBJECT(dataObj), "RenderingChanged", (VisuElement*)0, NULL); VISU_REDRAW_ADD; } } static void onComboManualChange(GtkComboBox *combo, gpointer data _U_) { int iCol; VisuData *dataObj; VisuColorization *dt; dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelDataFile)); g_return_if_fail(dataObj); dt = visu_colorization_get(dataObj, FALSE, (gboolean*)0); iCol = gtk_combo_box_get_active(combo); if (iCol < 0) return; iCol -= N_COORDS_COLS; flagDisableCallbacks = TRUE; visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryDataMin), (double)visu_colorization_getMin(dt, iCol)); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryDataMax), (double)visu_colorization_getMax(dt, iCol)); flagDisableCallbacks = FALSE; } static void onEntryMinMaxChangeValue(VisuUiNumericalEntry *entry, double oldValue _U_, gpointer data) { int minMax, res, iCol; VisuData *dataObj; VisuColorization *dt; if (flagDisableCallbacks) return; DBG_fprintf(stderr, "Panel dataFile: change on min/max entries.\n"); dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelDataFile)); g_return_if_fail(dataObj); iCol = gtk_combo_box_get_active(GTK_COMBO_BOX(comboboxDataCh[4])); g_return_if_fail(iCol >= 0); iCol -= N_COORDS_COLS; minMax = GPOINTER_TO_INT(data); g_return_if_fail(minMax == 0 || minMax == 1); DBG_fprintf(stderr, "Panel Data File: grep value from GtkEntry for" " the minMax value (%d) of column %d.\n", minMax, iCol); dt = visu_colorization_get(dataObj, TRUE, (gboolean*)0); switch (minMax) { case 0: res = visu_colorization_setMin(dt, visu_ui_numerical_entry_getValue(entry), iCol); break; case 1: res = visu_colorization_setMax(dt, visu_ui_numerical_entry_getValue(entry), iCol); break; default: res = 0; break; } if (visu_colorization_getSingleColumnId(dt, &iCol) && visu_gl_ext_shade_setMinMax(extLeg, visu_colorization_getMin(dt, iCol), visu_colorization_getMax(dt, iCol))) visu_gl_ext_frame_draw(VISU_GL_EXT_FRAME(extLeg)); if (res) { g_signal_emit_by_name(G_OBJECT(dataObj), "RenderingChanged", (VisuElement*)0, NULL); VISU_REDRAW_ADD; } } static void onSpinChChangeValue(GtkSpinButton *spinbutton, gpointer user_data) { int pos; int res; VisuData *dataObj; VisuColorization *dt; if (flagDisableCallbacks) return; DBG_fprintf(stderr, "Panel dataFile: change on spin vect[%d].\n", GPOINTER_TO_INT(user_data)); /* Disable preset range since manual chance. */ gtk_combo_box_set_active(GTK_COMBO_BOX(comboPreSetColorRange), -1); dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelDataFile)); g_return_if_fail(dataObj); pos = GPOINTER_TO_INT(user_data); g_return_if_fail(pos >= 0 && pos < 6); dt = visu_colorization_get(dataObj, FALSE, (gboolean*)0); res = tool_shade_setLinearCoeff(visu_colorization_getShade(dt), gtk_spin_button_get_value(spinbutton), pos % 3, pos / 3); makeColorPreview(dataObj); if (res) { g_signal_emit_by_name(G_OBJECT(dataObj), "RenderingChanged", (VisuElement*)0, NULL); VISU_REDRAW_ADD; } } static void onComboPresetColChange(GtkComboBox *combo, gpointer data _U_) { int val; VisuData *dataObj; VisuColorization *dt; DBG_fprintf(stderr, "Panel dataFile: change on combo preset column.\n"); if (flagDisableCallbacks) return; dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelDataFile)); dt = visu_colorization_get(dataObj, FALSE, (gboolean*)0); val = gtk_combo_box_get_active(combo) - N_COORDS_COLS; visu_colorization_setColUsed(dt, val, 0); visu_colorization_setColUsed(dt, val, 1); visu_colorization_setColUsed(dt, val, 2); g_signal_handler_block(G_OBJECT(comboboxDataCh[0]), signalComboColumnId[0]); g_signal_handler_block(G_OBJECT(comboboxDataCh[1]), signalComboColumnId[1]); g_signal_handler_block(G_OBJECT(comboboxDataCh[2]), signalComboColumnId[2]); gtk_combo_box_set_active(GTK_COMBO_BOX(comboboxDataCh[0]), val + N_STATIC_COLS); gtk_combo_box_set_active(GTK_COMBO_BOX(comboboxDataCh[1]), val + N_STATIC_COLS); gtk_combo_box_set_active(GTK_COMBO_BOX(comboboxDataCh[2]), val + N_STATIC_COLS); g_signal_handler_unblock(G_OBJECT(comboboxDataCh[0]), signalComboColumnId[0]); g_signal_handler_unblock(G_OBJECT(comboboxDataCh[1]), signalComboColumnId[1]); g_signal_handler_unblock(G_OBJECT(comboboxDataCh[2]), signalComboColumnId[2]); if (gtk_combo_box_get_active(GTK_COMBO_BOX(comboPreSetColorRange)) >= 0) { makeColorPreview(dataObj); g_signal_emit_by_name(G_OBJECT(dataObj), "RenderingChanged", (VisuElement*)0, NULL); VISU_REDRAW_ADD; } } static void onComboColChange(GtkComboBox *combo, gpointer data) { int pos; int res; VisuData *dataObj; VisuColorization *dt; if (flagDisableCallbacks) return; DBG_fprintf(stderr, "Panel dataFile: change on combo column.\n"); /* Disable preset range since manual chance. */ gtk_combo_box_set_active(GTK_COMBO_BOX(comboPreSetColorRange), -1); g_signal_handler_block(G_OBJECT(comboboxDataCh[5]), signalComboColumnId[5]); gtk_combo_box_set_active(GTK_COMBO_BOX(comboboxDataCh[5]), -1); g_signal_handler_unblock(G_OBJECT(comboboxDataCh[5]), signalComboColumnId[5]); dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelDataFile)); g_return_if_fail(dataObj); pos = GPOINTER_TO_INT(data); g_return_if_fail(pos >= 0 && pos < 3); dt = visu_colorization_get(dataObj, FALSE, (gboolean*)0); res = visu_colorization_setColUsed(dt, gtk_combo_box_get_active(combo) - N_STATIC_COLS, pos); makeColorPreview(dataObj); if (res) { g_signal_emit_by_name(G_OBJECT(dataObj), "RenderingChanged", (VisuElement*)0, NULL); VISU_REDRAW_ADD; } } static void onColorTypeChange(GtkToggleButton *toggle, gpointer data) { int color, res, i; VisuData *dataObj; VisuColorization *dt; if (flagDisableCallbacks) return; DBG_fprintf(stderr, "Panel dataFile: change on colour type radio buttons.\n"); /* Desable preset range since manual chance. */ gtk_combo_box_set_active(GTK_COMBO_BOX(comboPreSetColorRange), -1); if (!gtk_toggle_button_get_active(toggle)) return; dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelDataFile)); g_return_if_fail(dataObj); color = GPOINTER_TO_INT(data); g_return_if_fail(color == TOOL_SHADE_COLOR_MODE_RGB || color == TOOL_SHADE_COLOR_MODE_HSV); dt = visu_colorization_get(dataObj, FALSE, (gboolean*)0); res = tool_shade_setColorMode(visu_colorization_getShade(dt), color); if (color == TOOL_SHADE_COLOR_MODE_RGB) for (i = 0; i < 3; i++) gtk_label_set_text(GTK_LABEL(labelChannel[i]), labelRGB[i]); else for (i = 0; i < 3; i++) gtk_label_set_text(GTK_LABEL(labelChannel[i]), labelHSV[i]); makeColorPreview(dataObj); if (res) { g_signal_emit_by_name(G_OBJECT(dataObj), "RenderingChanged", (VisuElement*)0, NULL); VISU_REDRAW_ADD; } } /** * visu_ui_panel_colorization_setPresetShade: * @shade: a #ToolShade object. * * Change the preset @shade used to colourise the data. * * Returns: TRUE if a #ToolShade is set. */ gboolean visu_ui_panel_colorization_setPresetShade(ToolShade *shade) { float *vectA, *vectB; int i, j; VisuData *dataObj; VisuColorization *dt; const int *colUsed; DBG_fprintf(stderr, "Panel dataFile: change the colour transformation" " according to shade %p.\n", (gpointer)shade); if (!shade) return FALSE; /* If panel has still not been loaded, we do it now. */ if (!panelDataFileIsInitiated) { panelDataFileIsInitiated = TRUE; createInteriorDataFile(); } dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelDataFile)); dt = visu_colorization_get(dataObj, TRUE, (gboolean*)0); /* Suspend all combo signals during changes */ g_signal_handler_block(G_OBJECT(radiobuttonDataRGB), signalRadioRGB); g_signal_handler_block(G_OBJECT(radiobuttonDataHSV), signalRadioHSV); for (i = 0; i < 3; i++) { g_signal_handler_block(G_OBJECT(comboboxDataCh[i]), signalComboColumnId[i]); g_signal_handler_block(G_OBJECT(spinbuttonDataChA[i]), signalSpinDataChA[i]); g_signal_handler_block(G_OBJECT(spinbuttonDataChB[i]), signalSpinDataChB[i]); } g_signal_handler_block(G_OBJECT(comboboxDataCh[5]), signalComboColumnId[5]); visu_colorization_setShade(dt, shade); g_signal_emit_by_name(G_OBJECT(dataObj), "RenderingChanged", (VisuElement*)0, NULL); switch (tool_shade_getColorMode(shade)) { case TOOL_SHADE_COLOR_MODE_RGB: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radiobuttonDataRGB), TRUE); for (i = 0; i < 3; i++) gtk_label_set_text(GTK_LABEL(labelChannel[i]), labelRGB[i]); break; case TOOL_SHADE_COLOR_MODE_HSV: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radiobuttonDataHSV), TRUE); for (i = 0; i < 3; i++) gtk_label_set_text(GTK_LABEL(labelChannel[i]), labelHSV[i]); break; default: g_warning("Incorrect ToolShadeColorMode in call of 'onColorPreSetChange'."); } /* j is the selected column. */ j = gtk_combo_box_get_active(GTK_COMBO_BOX(comboboxDataCh[5])); if (j < 0) j = (visu_colorization_getFileSet(dt))?N_STATIC_COLS:N_COORDS_COLS; else j += N_STATIC_COLS - N_COORDS_COLS; if (tool_shade_getMode(shade) == TOOL_SHADE_MODE_LINEAR) { colUsed = visu_colorization_getColUsed(dt); tool_shade_getLinearCoeff(shade, &vectA, &vectB); for (i = 0; i < 3; i++) { if (vectA[i] != 0.f && gtk_combo_box_get_active(GTK_COMBO_BOX(comboboxDataCh[i])) < 1) { visu_colorization_setColUsed(dt, j - N_STATIC_COLS, i); gtk_combo_box_set_active(GTK_COMBO_BOX(comboboxDataCh[i]), j); } else gtk_combo_box_set_active(GTK_COMBO_BOX(comboboxDataCh[i]), colUsed[i] + N_STATIC_COLS); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbuttonDataChA[i]), vectA[i]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbuttonDataChB[i]), vectB[i]); } } else { visu_colorization_setColUsed(dt, j - N_STATIC_COLS, 0); visu_colorization_setColUsed(dt, j - N_STATIC_COLS, 1); visu_colorization_setColUsed(dt, j - N_STATIC_COLS, 2); } gtk_widget_set_sensitive(expanderTransformation, (tool_shade_getMode(shade) == TOOL_SHADE_MODE_LINEAR)); /* ReActivate all combo signals after changes */ g_signal_handler_unblock(G_OBJECT(radiobuttonDataRGB), signalRadioRGB); g_signal_handler_unblock(G_OBJECT(radiobuttonDataHSV), signalRadioHSV); for (i = 0; i < 3; i++) { g_signal_handler_unblock(G_OBJECT(comboboxDataCh[i]), signalComboColumnId[i]); g_signal_handler_unblock(G_OBJECT(spinbuttonDataChA[i]), signalSpinDataChA[i]); g_signal_handler_unblock(G_OBJECT(spinbuttonDataChB[i]), signalSpinDataChB[i]); } g_signal_handler_unblock(G_OBJECT(comboboxDataCh[5]), signalComboColumnId[5]); if (gtk_combo_box_get_active(GTK_COMBO_BOX(comboboxDataCh[5])) < 0 && visu_colorization_getSingleColumnId(dt, &i)) gtk_combo_box_set_active(GTK_COMBO_BOX(comboboxDataCh[5]), i + N_STATIC_COLS - 1); makeColorPreview(dataObj); return TRUE; } static void onColorPreSetChange(VisuUiShadeCombobox *combo _U_, ToolShade *values, gpointer data _U_) { if (visu_ui_panel_colorization_setPresetShade(values) && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbuttonData))) VISU_REDRAW_ADD; } static void applyHideMinValues(VisuData *visuData, gboolean askRedraw) { gboolean redraw; VisuColorization *dt; g_return_if_fail(visuData); /* Wants to change the rendered attributes of Nodes, must emit the AskForShowHide signal. */ DBG_fprintf(stderr, "Panel DataFile : emitting 'AskForShowHide' signal.\n"); g_signal_handler_block(G_OBJECT(visuData), hide_signal); g_signal_emit_by_name(G_OBJECT(visuData), "AskForShowHide", &redraw, NULL); g_signal_handler_unblock(G_OBJECT(visuData), hide_signal); DBG_fprintf(stderr, " | returned redraw value %d.\n", redraw); /* Get the parameters for hiding mode. */ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkHideMinValues))) { dt = visu_colorization_get(visuData, FALSE, (gboolean*)0); hidingData.column = (guint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinHideMinValues)) - 1; hidingData.value = visu_ui_numerical_entry_getValue(VISU_UI_NUMERICAL_ENTRY(entryHideMinValues)); redraw = visu_colorization_applyHide(dt, visuData) || redraw; } if (redraw) { g_signal_emit_by_name(G_OBJECT(visuData), "VisibilityChanged", NULL); if (askRedraw) VISU_REDRAW_ADD; } } static gboolean hideBelow(VisuColorization *dt _U_, const VisuColorizationNodeData *values, gpointer data) { struct _HideBelowData *st = (struct _HideBelowData*)data; float *arr; g_return_val_if_fail(st->column < values->data->len, FALSE); arr = (float*)values->data->data; return (arr[st->column] < st->value); } static void onCheckHideMinValuesChange(GtkToggleButton *toggle, gpointer data _U_) { VisuData *visuData; VisuColorization *dt; /* Set or unset the hiding mode for the current colorization. */ visuData = visu_ui_panel_getData(VISU_UI_PANEL(panelDataFile)); dt = visu_colorization_get(visuData, FALSE, (gboolean*)0); if (!dt) return; if (gtk_toggle_button_get_active(toggle)) visu_colorization_setHidingFunc(dt, hideBelow, &hidingData, (GDestroyNotify)0); else visu_colorization_setHidingFunc(dt, (VisuColorizationHidingFunc)0, (gpointer)0, (GDestroyNotify)0); if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbuttonData)) || flagDisableCallbacks) return; DBG_fprintf(stderr, "Panel DataFile: toggle check" " button to hide elements.\n"); applyHideMinValues(visuData, TRUE); } static void onEntryHideMinValuesChange(VisuUiNumericalEntry *entry, double oldValue _U_, gpointer data _U_) { if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbuttonData)) || !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkHideMinValues)) || flagDisableCallbacks) return; DBG_fprintf(stderr, "Panel DataFile : change value on hide" " min values entry : %f\n", visu_ui_numerical_entry_getValue(entry)); applyHideMinValues(visu_ui_panel_getData(VISU_UI_PANEL(panelDataFile)), TRUE); } static void onSpinHideMinValuesChange(GtkSpinButton *spinbutton, gpointer user_data _U_) { if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbuttonData)) || !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkHideMinValues)) || flagDisableCallbacks) return; DBG_fprintf(stderr, "Panel DataFile : change value of spin column" " for hide function : %f\n", gtk_spin_button_get_value(spinbutton)); applyHideMinValues(visu_ui_panel_getData(VISU_UI_PANEL(panelDataFile)), TRUE); } static void onAskForHideNodes(VisuData *visuData, gboolean *redraw, gpointer data _U_) { VisuColorization *dt; /* No data, useless to stay here. */ if (!flagDataFileIsLoaded) return; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkHideMinValues))) { DBG_fprintf(stderr, "Panel DataFile: caught the 'AskForShowHide' signal for" " VisuData %p.\n", (gpointer)visuData); dt = visu_colorization_get(visuData, FALSE, (gboolean*)0); hidingData.column = (guint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinHideMinValues)) - 1; hidingData.value = visu_ui_numerical_entry_getValue(VISU_UI_NUMERICAL_ENTRY(entryHideMinValues)); *redraw = visu_colorization_applyHide(dt, visuData) || *redraw; } } static void onCheckRestrictChange(GtkToggleButton *toggle, gpointer data _U_) { VisuData *dataObj; VisuColorization *dt; if (flagDisableCallbacks) return; DBG_fprintf(stderr, "Panel dataFile: change restrict in range.\n"); dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelDataFile)); g_return_if_fail(dataObj); dt = visu_colorization_get(dataObj, TRUE, (gboolean*)0); if (visu_colorization_setRestrictInRange(dt, gtk_toggle_button_get_active(toggle))) { g_signal_emit_by_name(G_OBJECT(dataObj), "RenderingChanged", (VisuElement*)0, NULL); VISU_REDRAW_ADD; } } static void onCheckLegendChange(GtkToggleButton *toggle, gpointer data _U_) { gboolean active; active = gtk_toggle_button_get_active(toggle) && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbuttonData)); visu_gl_ext_setActive(VISU_GL_EXT(extLeg), active); if (active) visu_gl_ext_frame_draw(VISU_GL_EXT_FRAME(extLeg)); VISU_REDRAW_ADD; } static void onCheckScaleRadiusChange(GtkToggleButton *toggle, gpointer data) { int i; VisuData *dataObj; VisuColorization *dt; if (flagDisableCallbacks) return; DBG_fprintf(stderr, "Panel dataFile: change scaling radius appliance.\n"); dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelDataFile)); g_return_if_fail(dataObj); dt = visu_colorization_get(dataObj, TRUE, (gboolean*)0); if (gtk_toggle_button_get_active(toggle)) { i = gtk_combo_box_get_active(GTK_COMBO_BOX(data)); visu_colorization_setScalingUsed(dt, (i < 0)?-N_STATIC_COLS:i); } else visu_colorization_setScalingUsed(dt, -N_STATIC_COLS); g_signal_emit_by_name(G_OBJECT(dataObj), "RenderingChanged", (VisuElement*)0, NULL); VISU_REDRAW_ADD; } static void onComboScaleChange(GtkComboBox *combo, gpointer data) { int i; gboolean val; VisuData *dataObj; VisuColorization *dt; if (flagDisableCallbacks) return; DBG_fprintf(stderr, "Panel dataFile: change on scaling radius combo.\n"); dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelDataFile)); g_return_if_fail(dataObj); dt = visu_colorization_get(dataObj, TRUE, (gboolean*)0); i = gtk_combo_box_get_active(combo); val = visu_colorization_setScalingUsed(dt, (i < 0)?-N_STATIC_COLS:i); if (val && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data))) { g_signal_emit_by_name(G_OBJECT(dataObj), "RenderingChanged", (VisuElement*)0, NULL); VISU_REDRAW_ADD; } } static void onEntryExt(GtkEntry *entry, gchar *key _U_, VisuObject *obj _U_) { gtk_entry_set_text(entry, fileExt); } static void exportParameters(GString *data, VisuData* dataObj _U_, VisuGlView *view _U_) { g_string_append_printf(data, "# %s\n", DESC_PARAMETER_FILEEXT); g_string_append_printf(data, "%s[gtk]: %s\n\n", FLAG_PARAMETER_FILEEXT, fileExt); } v_sim-3.7.0/src/panelModules/panelDataFile.h0000644000353400050620000000461312215546063015652 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef PANELDATAFILE_H #define PANELDATAFILE_H #include #include #include #include VisuUiPanel* visu_ui_panel_colorization_init(); gboolean visu_ui_panel_colorization_load(VisuData *visuData, const gchar *file, gboolean *new); void visu_ui_panel_colorization_setUsed(gboolean used); gboolean visu_ui_panel_colorization_setPresetShade(ToolShade *shade); void visu_ui_panel_colorization_setRangeMode(VisuColorizationInputScaleId mode); void visu_ui_panel_colorization_setManualRange(float min, float max, int column); void visu_ui_panel_colorization_update(VisuData *visuData); #endif v_sim-3.7.0/src/panelModules/panelPlanes.c0000644000353400050620000017717012215555376015436 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "panelPlanes.h" #include #include #include #include #include #include #include #include #include #include #include #include #include /** * SECTION: panelPlanes * @short_description: The tab where planes are defined. * * It is possible to get the list of planes using * visu_ui_panel_planes_getAll(). One can also access to the list * store hosting the planes by calling visu_ui_panel_planes_getList(). */ #define PANEL_PLANES_NO_VISU_PLANE_LIST _("none") GtkWidget *panelPlanes; GtkWidget *vBoxVisuPlanes; GtkWidget *checkUseVisuPlanes; /* The spin buttons use integer values in the box coordinates. */ GtkWidget *entryNVect[3]; gulong signalsOrientation[3]; /* The true values in the cartesian coordinates are stored there. */ /* float nVect[3]; */ GtkWidget *spinbuttonDistance; GtkWidget *widgetColorVisuPlane; GtkWidget *treeviewVisuPlanes; GtkListStore *listStoredVisuPlanes; GtkWidget *labelDistance; GtkWidget *buttonRotate; GtkWidget *hboxHidingMode; GtkWidget *vboxDistChange; GtkWidget *entryDistFrom, *entryDistTo, *entryDistStep, *spinDistDelay; static GtkWidget *imageDistPlay, *imageDistStop; static GtkWidget *orientationChooser; /* Variables for the IO tab. */ GtkWidget *hboxSaveList; gchar *currentSaveListFile; GtkWidget *buttonSaveList; GtkWidget *labelVisuPlaneList; /* Callbacks for the IO tab. */ static void onVisuPlaneListOpen(GtkButton *button, gpointer data); static void onVisuPlaneListSave(GtkButton *button, gpointer data); static void onVisuPlaneListSaveAs(GtkButton *button, gpointer data); static gulong hide_signal, position_signal, popInc_signal, popDec_signal; static guint isPlayingDistanceId; static gdouble directionDist; static gboolean disableCallbacks; /* Local callbacks. */ static void onVisuPlaneUsed(GtkToggleButton *button, gpointer data); void onVisuPlaneAdd(GtkButton *button, gpointer data); void onVisuPlaneRemove(GtkButton *button, gpointer data); static void onEntryNVectChange(VisuUiNumericalEntry *entry, double oldValue, gpointer data); static void onSpinDistanceChange(GtkSpinButton *spin, gpointer data); static void onVisuPlaneColorChange(VisuUiColorCombobox *combo, ToolColor *selectedColor, gpointer data); static void onDataFocused(GObject *obj, VisuData *dataObj, gpointer data); static void onDataReady(VisuObject *obj, VisuData *dataObj, VisuGlView *view, gpointer data); static void onDataNotReady(VisuObject *obj, VisuData *dataObj, VisuGlView *view, gpointer data); static void onTreeSelectionChanged(GtkTreeSelection *tree, gpointer data); static void onPositionChanged(VisuData *dataObj, VisuElement *ele, gpointer data); static void onPopulationIncreased(VisuData *dataObj, int *newNodes, gpointer data); void onSetCameraPosition(GtkButton *button, gpointer data); static void onGtkVisuPlanesDrawnToggled(GtkCellRendererToggle *cell_renderer, gchar *path, gpointer user_data); static void onGtkVisuPlanesHideToggled(GtkCellRendererToggle *cell_renderer, gchar *path, gpointer user_data); void onGtkVisuPlanesHidingModeToggled(GtkToggleButton *toggle, gpointer data); static void onAskForHideNodes(VisuData *visuData, gboolean *redraw, gpointer data); static void onPlayStopDist(GtkButton *button, gpointer data); static void onSpinDistDelayChange(GtkSpinButton *spin, gpointer data); static void onVisuPlanesEnter(VisuUiPanel *planes, gpointer data); static void onVisuUiOrientationChooser(GtkButton *button, gpointer data); static void onSizeChanged(VisuBox *box, gfloat extens, gpointer user_data); /* Local methods. */ static void _getBoxSpan(VisuBox *box, float span[2]); static void stopPlayStop(gpointer data); static gboolean playDistances(gpointer data); /* Call createInteriorVisuPlanes() to create all the widgets, and if dataObj is not null, it set callbacks as if a new VisuData has been loaded. */ static void createAndInitVisuPlanePanel(VisuData *dataObj); static void createInteriorVisuPlanes(VisuData *dataObj); static gboolean isVisuPlanesInitialised; /* String used to labelled planes, dist. means 'distance' and norm. means 'normal' (50 chars max). */ #define LABEL_PLANE _("norm.: (%3d;%3d;%3d)\ndistance: %6.2f") /** * visu_ui_panel_planes_init: (skip) * * Should be used in the list declared in externalModules.h to be loaded by * V_Sim on start-up. This routine will create the #VisuUiPanel where the plane * stuff can be done, such as creating a plane, masking nodes, * changing the orientation or the colour... * * Returns: a newly created #VisuUiPanel object. */ VisuUiPanel* visu_ui_panel_planes_init(VisuUiMain *ui) { /* Long description */ char *cl = _("Drawing planes"); /* Short description */ char *tl = _("Planes"); panelPlanes = visu_ui_panel_newWithIconFromPath("Panel_planes", cl, tl, "stock-planes_20.png"); if (!panelPlanes) return (VisuUiPanel*)0; visu_ui_panel_setDockable(VISU_UI_PANEL(panelPlanes), TRUE); vBoxVisuPlanes = gtk_vbox_new (FALSE, 0); gtk_widget_set_sensitive(vBoxVisuPlanes, FALSE); isVisuPlanesInitialised = FALSE; checkUseVisuPlanes = (GtkWidget*)0; spinbuttonDistance = (GtkWidget*)0; orientationChooser = (GtkWidget*)0; isPlayingDistanceId = 0; currentSaveListFile = (gchar*)0; disableCallbacks = FALSE; /* Create the listModel */ listStoredVisuPlanes = gtk_list_store_new (VISU_UI_PANEL_PLANES_N_COLUMNS, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, GDK_TYPE_PIXBUF, G_TYPE_OBJECT); /* Add the signal for the vBoxVisuPlanes. */ g_signal_connect(G_OBJECT(ui), "DataFocused", G_CALLBACK(onDataFocused), (gpointer)0); g_signal_connect(G_OBJECT(panelPlanes), "page-entered", G_CALLBACK(onVisuPlanesEnter), (gpointer)0); return VISU_UI_PANEL(panelPlanes); } /** * visu_ui_panel_planes_getList: * * This method gives read access to the #GtkListStore used to store * the planes. * * Returns: (transfer none): the #GtkListStore used by this panel to * store its planes. It should be considered read-only. */ GtkListStore* visu_ui_panel_planes_getList() { return listStoredVisuPlanes; } static void createAndInitVisuPlanePanel(VisuData *dataObj) { createInteriorVisuPlanes(dataObj); isVisuPlanesInitialised = TRUE; /* Force to connect signal if a file is already loaded. */ if (dataObj) onDataReady(VISU_OBJECT_INSTANCE, dataObj, (VisuGlView*)0, (gpointer)0); } static void onVisuPlanesEnter(VisuUiPanel *planes, gpointer data _U_) { DBG_fprintf(stderr, "Panel VisuPlanes: caught the 'page-entered' signal %d.\n", isVisuPlanesInitialised); if (!isVisuPlanesInitialised) createAndInitVisuPlanePanel(visu_ui_panel_getData(planes)); } static void createInteriorVisuPlanes(VisuData *dataObj) { GtkWidget *wd; GtkWidget *hbox; GtkWidget *label; GtkWidget *scrolledVisuPlanes; GtkWidget *hbox2; GtkWidget *alignment3; GtkWidget *vbox3, *vboxIO; GtkWidget *hbox4; GtkWidget *label2; GtkWidget *hbox5; GtkWidget *hbox3; GtkWidget *label4; GtkWidget *alignment2; GtkWidget *vbox2, *vbox; GtkWidget *buttonVisuPlaneAdd, *buttonDistPlayStop; GtkWidget *image2; GtkWidget *buttonVisuPlaneRemove, *button; GtkWidget *image4; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkWidget *image; GSList *radiobuttonHideUnion_group; GtkWidget *radiobuttonHideInter, *radiobuttonHideUnion; GtkWidget *notebook; int i; float span[2]; #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkTooltips *tooltips; tooltips = gtk_tooltips_new (); #endif gtk_widget_show(vBoxVisuPlanes); checkUseVisuPlanes = gtk_check_button_new_with_mnemonic(_("_Use planes")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkUseVisuPlanes), visu_gl_ext_getActive(VISU_GL_EXT(visu_gl_ext_planes_getDefault()))); gtk_widget_show (checkUseVisuPlanes); gtk_box_pack_start (GTK_BOX (vBoxVisuPlanes), checkUseVisuPlanes, FALSE, FALSE, 0); scrolledVisuPlanes = gtk_scrolled_window_new (NULL, NULL); gtk_widget_show (scrolledVisuPlanes); gtk_box_pack_start (GTK_BOX (vBoxVisuPlanes), scrolledVisuPlanes, TRUE, TRUE, 0); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledVisuPlanes), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledVisuPlanes), GTK_SHADOW_IN); treeviewVisuPlanes = gtk_tree_view_new (); gtk_widget_show (treeviewVisuPlanes); gtk_container_add (GTK_CONTAINER (scrolledVisuPlanes), treeviewVisuPlanes); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeviewVisuPlanes), TRUE); notebook = gtk_notebook_new(); gtk_widget_show(notebook); gtk_box_pack_start(GTK_BOX(vBoxVisuPlanes), notebook, FALSE, FALSE, 2); /* Page 1 : simple tools*/ vbox = gtk_vbox_new(FALSE, 0); gtk_widget_show(vbox); label = gtk_label_new(_("Simple tools")); gtk_widget_show(label); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label); /* Hiding Mode */ hboxHidingMode = gtk_hbox_new (FALSE, 0); gtk_widget_show(hboxHidingMode); gtk_box_pack_start(GTK_BOX(vbox), hboxHidingMode, FALSE, FALSE, 2); label = gtk_label_new(_("Hiding mode: ")); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hboxHidingMode), label, FALSE, FALSE, 0); radiobuttonHideUnion = gtk_radio_button_new(NULL); gtk_widget_show(radiobuttonHideUnion); gtk_box_pack_start(GTK_BOX(hboxHidingMode), radiobuttonHideUnion, FALSE, FALSE, 0); gtk_radio_button_set_group(GTK_RADIO_BUTTON(radiobuttonHideUnion), (GSList*)0); radiobuttonHideUnion_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radiobuttonHideUnion)); gtk_widget_set_tooltip_text(radiobuttonHideUnion, _("Hide all elements that are hidden by al least one plane.")); hbox = gtk_hbox_new (FALSE, 2); gtk_widget_show(hbox); gtk_container_add(GTK_CONTAINER(radiobuttonHideUnion), hbox); wd = create_pixmap((GtkWidget*)0, "stock-union.png"); gtk_widget_show(wd); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); label = gtk_label_new(_("Union")); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); radiobuttonHideInter = gtk_radio_button_new(NULL); gtk_widget_show(radiobuttonHideInter); gtk_box_pack_start(GTK_BOX(hboxHidingMode), radiobuttonHideInter, FALSE, FALSE, 0); gtk_radio_button_set_group(GTK_RADIO_BUTTON(radiobuttonHideInter), radiobuttonHideUnion_group); radiobuttonHideUnion_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radiobuttonHideInter)); gtk_widget_set_tooltip_text(radiobuttonHideInter, _("Hide elements only if they are hidden by all planes.")); hbox = gtk_hbox_new (FALSE, 2); gtk_widget_show(hbox); gtk_container_add(GTK_CONTAINER(radiobuttonHideInter), hbox); wd = create_pixmap((GtkWidget*)0, "stock-inter.png"); gtk_widget_show(wd); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); label = gtk_label_new(_("Intersection")); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radiobuttonHideUnion), TRUE); gtk_widget_set_sensitive(hboxHidingMode, FALSE); /* VisuPlanes parameters */ hbox2 = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, FALSE, 0); vbox3 = gtk_vbox_new (FALSE, 3); gtk_box_pack_start(GTK_BOX(hbox2), vbox3, FALSE, FALSE, 2); buttonRotate = gtk_button_new(); gtk_widget_set_tooltip_text(buttonRotate, _("Set the camera to look in the direction" " of the normal of the selected plane.")); gtk_box_pack_start(GTK_BOX(vbox3), buttonRotate, TRUE, FALSE, 0); image = create_pixmap((GtkWidget*)0, "stock_rotate_20.png"); gtk_container_add(GTK_CONTAINER(buttonRotate), image); gtk_widget_set_sensitive(buttonRotate, FALSE); alignment3 = gtk_alignment_new (0.5, 0.5, 0, 0); gtk_box_pack_start (GTK_BOX (hbox2), alignment3, TRUE, TRUE, 0); vbox3 = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (alignment3), vbox3); hbox4 = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox3), hbox4, TRUE, TRUE, 0); label2 = gtk_label_new (_("Normal: ")); gtk_box_pack_start (GTK_BOX (hbox4), label2, TRUE, TRUE, 0); gtk_misc_set_alignment (GTK_MISC (label2), 1, 0.5); for (i = 0; i < 3; i++) { entryNVect[i] = visu_ui_numerical_entry_new(1.); gtk_entry_set_width_chars(GTK_ENTRY(entryNVect[i]), 5); gtk_box_pack_start(GTK_BOX(hbox4), entryNVect[i], FALSE, FALSE, 0); } wd = gtk_button_new(); gtk_box_pack_start(GTK_BOX(hbox4), wd, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(wd), "clicked", G_CALLBACK(onVisuUiOrientationChooser), (gpointer)0); image = create_pixmap((GtkWidget*)0, "axes-button.png"); gtk_container_add(GTK_CONTAINER(wd), image); hbox5 = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox3), hbox5, TRUE, TRUE, 0); labelDistance = gtk_label_new (""); gtk_label_set_text(GTK_LABEL(labelDistance), _("Distance from origin: ")); gtk_box_pack_start (GTK_BOX (hbox5), labelDistance, TRUE, TRUE, 0); gtk_misc_set_alignment (GTK_MISC (labelDistance), 1, 0.5); if (dataObj) _getBoxSpan(visu_boxed_getBox(VISU_BOXED(dataObj)), span); else { span[0] = -998.f; span[1] = 1000.f; } spinbuttonDistance = gtk_spin_button_new_with_range(-span[1], span[1], 0.25); gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinbuttonDistance), 2); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbuttonDistance), (span[0] + span[1]) / 2.f); gtk_box_pack_start (GTK_BOX (hbox5), spinbuttonDistance, FALSE, FALSE, 0); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbuttonDistance), TRUE); hbox3 = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox3), hbox3, TRUE, TRUE, 0); label4 = gtk_label_new (_("Color: ")); gtk_box_pack_start (GTK_BOX (hbox3), label4, TRUE, TRUE, 0); gtk_misc_set_alignment (GTK_MISC (label4), 1, 0.5); widgetColorVisuPlane = visu_ui_color_combobox_new(TRUE); gtk_box_pack_start(GTK_BOX(hbox3), widgetColorVisuPlane, FALSE, FALSE, 0); alignment2 = gtk_alignment_new (0.5, 0.5, 1, 0); gtk_box_pack_start (GTK_BOX (hbox2), alignment2, FALSE, FALSE, 0); vbox2 = gtk_vbox_new (FALSE, 2); gtk_container_add (GTK_CONTAINER (alignment2), vbox2); /* gtk_container_set_border_width (GTK_CONTAINER (vbox2), 3); */ buttonVisuPlaneAdd = gtk_button_new (); gtk_box_pack_start (GTK_BOX (vbox2), buttonVisuPlaneAdd, FALSE, FALSE, 0); image2 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_BUTTON); gtk_container_add (GTK_CONTAINER (buttonVisuPlaneAdd), image2); buttonVisuPlaneRemove = gtk_button_new (); gtk_box_pack_start (GTK_BOX (vbox2), buttonVisuPlaneRemove, FALSE, FALSE, 0); image4 = gtk_image_new_from_stock ("gtk-remove", GTK_ICON_SIZE_BUTTON); gtk_container_add (GTK_CONTAINER (buttonVisuPlaneRemove), image4); gtk_widget_show_all(hbox2); /* Page : advanced tools*/ vboxDistChange = gtk_vbox_new(FALSE, 0); gtk_widget_set_sensitive(vboxDistChange, FALSE); gtk_widget_show(vboxDistChange); label = gtk_label_new(_("Advanced tools")); gtk_widget_show(label); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vboxDistChange, label); label = gtk_label_new(_("Change selected plane distance")); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(vboxDistChange), label, FALSE, FALSE, 3); hbox = gtk_hbox_new(FALSE, 0); gtk_widget_show(hbox); gtk_box_pack_start(GTK_BOX(vboxDistChange), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("From: ")); gtk_misc_set_alignment(GTK_MISC(label), 1., 0.5); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); entryDistFrom = visu_ui_numerical_entry_new(0.); gtk_entry_set_width_chars(GTK_ENTRY(entryDistFrom), 7); gtk_widget_show(entryDistFrom); gtk_box_pack_start(GTK_BOX(hbox), entryDistFrom, FALSE, FALSE, 0); label = gtk_label_new(_("to: ")); gtk_misc_set_alignment(GTK_MISC(label), 1., 0.5); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); entryDistTo = visu_ui_numerical_entry_new(0.); gtk_entry_set_width_chars(GTK_ENTRY(entryDistTo), 7); gtk_widget_show(entryDistTo); gtk_box_pack_start(GTK_BOX(hbox), entryDistTo, FALSE, FALSE, 0); label = gtk_label_new(_("step: ")); gtk_misc_set_alignment(GTK_MISC(label), 1., 0.5); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); entryDistStep = visu_ui_numerical_entry_new(1.); gtk_entry_set_width_chars(GTK_ENTRY(entryDistStep), 7); gtk_widget_show(entryDistStep); gtk_box_pack_start(GTK_BOX(hbox), entryDistStep, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_widget_show(hbox); gtk_box_pack_start(GTK_BOX(vboxDistChange), hbox, FALSE, FALSE, 0); label = gtk_label_new (_("Play at ")); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); gtk_misc_set_alignment(GTK_MISC(label), 1., 0.5); spinDistDelay = gtk_spin_button_new_with_range(10, 10000, 25); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinDistDelay), 500.); gtk_widget_show(spinDistDelay); gtk_box_pack_start(GTK_BOX(hbox), spinDistDelay, FALSE, TRUE, 0); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spinDistDelay), TRUE); label = gtk_label_new(_(" ms")); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); buttonDistPlayStop = gtk_button_new(); gtk_widget_set_tooltip_text(buttonDistPlayStop, _("Change the distance parameter of he selected file" " at the given rate.")); gtk_widget_show(buttonDistPlayStop); gtk_box_pack_start(GTK_BOX(hbox), buttonDistPlayStop, FALSE, FALSE, 15); hbox = gtk_hbox_new(FALSE, 0); gtk_widget_show(hbox); gtk_container_add(GTK_CONTAINER(buttonDistPlayStop), hbox); #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 5 imageDistPlay = create_pixmap((GtkWidget*)0, "stock_media-play.png"); imageDistStop = create_pixmap((GtkWidget*)0, "stock_media-stop.png"); #else imageDistPlay = gtk_image_new_from_stock(GTK_STOCK_MEDIA_PLAY, GTK_ICON_SIZE_BUTTON); imageDistStop = gtk_image_new_from_stock(GTK_STOCK_MEDIA_STOP, GTK_ICON_SIZE_BUTTON); #endif gtk_widget_show(imageDistPlay); gtk_box_pack_start(GTK_BOX(hbox), imageDistPlay, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), imageDistStop, TRUE, TRUE, 0); /* The IO tab. */ vboxIO = gtk_vbox_new(FALSE, 0); gtk_widget_show(vboxIO); label = gtk_label_new(_("File tools")); gtk_widget_show(label); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vboxIO, label); hbox = gtk_hbox_new(FALSE, 0); gtk_widget_show(hbox); gtk_box_pack_start(GTK_BOX(vboxIO), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Load a plane list:")); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); button = gtk_button_new_from_stock(GTK_STOCK_OPEN); gtk_widget_show(button); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(onVisuPlaneListOpen), (gpointer)0); label = gtk_label_new(_("Current loaded list:")); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(vboxIO), label, TRUE, TRUE, 0); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); labelVisuPlaneList = gtk_label_new(""); gtk_label_set_use_markup(GTK_LABEL(labelVisuPlaneList), TRUE); gtk_label_set_markup(GTK_LABEL(labelVisuPlaneList), PANEL_PLANES_NO_VISU_PLANE_LIST); gtk_widget_show(labelVisuPlaneList); gtk_box_pack_start(GTK_BOX(vboxIO), labelVisuPlaneList, TRUE, TRUE, 0); gtk_misc_set_alignment(GTK_MISC(labelVisuPlaneList), 0., 0.5); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 gtk_label_set_ellipsize(GTK_LABEL(labelVisuPlaneList), PANGO_ELLIPSIZE_START); #endif hboxSaveList = gtk_hbox_new(FALSE, 0); gtk_widget_set_sensitive(hboxSaveList, FALSE); gtk_widget_show(hboxSaveList); gtk_box_pack_start(GTK_BOX(vboxIO), hboxSaveList, FALSE, FALSE, 0); alignment2 = gtk_alignment_new(1., 0.5, 0, 0); gtk_widget_show(alignment2); gtk_box_pack_start(GTK_BOX(hboxSaveList), alignment2, TRUE, TRUE, 0); buttonSaveList = gtk_button_new_from_stock(GTK_STOCK_SAVE); gtk_widget_set_sensitive(buttonSaveList, FALSE); gtk_widget_show(buttonSaveList); gtk_container_add(GTK_CONTAINER(alignment2), buttonSaveList); g_signal_connect(G_OBJECT(buttonSaveList), "clicked", G_CALLBACK(onVisuPlaneListSave), (gpointer)0); button = gtk_button_new_from_stock(GTK_STOCK_SAVE_AS); gtk_widget_show(button); gtk_box_pack_start(GTK_BOX(hboxSaveList), button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(onVisuPlaneListSaveAs), (gpointer)0); /* Add the callback methods. */ g_signal_connect(G_OBJECT(checkUseVisuPlanes), "toggled", G_CALLBACK(onVisuPlaneUsed), (gpointer)0); g_signal_connect(G_OBJECT(buttonVisuPlaneAdd), "clicked", G_CALLBACK(onVisuPlaneAdd), (gpointer)0); g_signal_connect(G_OBJECT(buttonVisuPlaneRemove), "clicked", G_CALLBACK(onVisuPlaneRemove), (gpointer)0); for (i = 0; i < 3; i++) signalsOrientation[i] = g_signal_connect(G_OBJECT(entryNVect[i]), "value-changed", G_CALLBACK(onEntryNVectChange), GINT_TO_POINTER(i)); g_signal_connect(G_OBJECT(spinbuttonDistance), "value-changed", G_CALLBACK(onSpinDistanceChange), (gpointer)0); g_signal_connect(G_OBJECT(widgetColorVisuPlane), "color-selected", G_CALLBACK(onVisuPlaneColorChange), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "dataRendered", G_CALLBACK(onDataReady), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "dataUnRendered", G_CALLBACK(onDataNotReady), (gpointer)0); g_signal_connect(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeviewVisuPlanes)), "changed", G_CALLBACK(onTreeSelectionChanged), (gpointer)0); g_signal_connect(G_OBJECT(buttonRotate), "clicked", G_CALLBACK(onSetCameraPosition), (gpointer)0); g_signal_connect(G_OBJECT(radiobuttonHideUnion), "toggled", G_CALLBACK(onGtkVisuPlanesHidingModeToggled), GINT_TO_POINTER(VISU_PLANE_HIDE_UNION)); g_signal_connect(G_OBJECT(radiobuttonHideInter), "toggled", G_CALLBACK(onGtkVisuPlanesHidingModeToggled), GINT_TO_POINTER(VISU_PLANE_HIDE_INTER)); g_signal_connect(G_OBJECT(buttonDistPlayStop), "clicked", G_CALLBACK(onPlayStopDist), (gpointer)0); g_signal_connect(G_OBJECT(spinDistDelay), "value-changed", G_CALLBACK(onSpinDistDelayChange), (gpointer)0); /* Render the associated tree */ renderer = gtk_cell_renderer_toggle_new (); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(onGtkVisuPlanesDrawnToggled), (gpointer)0); column = gtk_tree_view_column_new_with_attributes (_("Drawn"), renderer, "active", VISU_UI_PANEL_PLANES_DRAWN, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW(treeviewVisuPlanes), column); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Parameters"), renderer, "markup", VISU_UI_PANEL_PLANES_LABEL, NULL); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_alignment(column, 0.5); gtk_tree_view_append_column (GTK_TREE_VIEW (treeviewVisuPlanes), column); renderer = gtk_cell_renderer_toggle_new (); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(onGtkVisuPlanesHideToggled), GINT_TO_POINTER(0)); column = gtk_tree_view_column_new_with_attributes (_("Mask"), renderer, "active", VISU_UI_PANEL_PLANES_HIDE_IS_ON, NULL); image = create_pixmap((GtkWidget*)0, "stock-masking.png"); gtk_widget_show(image); gtk_tree_view_column_set_widget(column, image); gtk_tree_view_append_column (GTK_TREE_VIEW(treeviewVisuPlanes), column); renderer = gtk_cell_renderer_toggle_new (); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(onGtkVisuPlanesHideToggled), GINT_TO_POINTER(1)); column = gtk_tree_view_column_new_with_attributes (_("Invert"), renderer, "active", VISU_UI_PANEL_PLANES_HIDDEN_SIDE, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW(treeviewVisuPlanes), column); renderer = gtk_cell_renderer_pixbuf_new (); column = gtk_tree_view_column_new_with_attributes (_("Color"), renderer, "pixbuf", VISU_UI_PANEL_PLANES_COLOR_PIXBUF, NULL); image = gtk_image_new_from_stock(GTK_STOCK_SELECT_COLOR, GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_widget_show(image); gtk_tree_view_column_set_widget(column, image); gtk_tree_view_append_column (GTK_TREE_VIEW(treeviewVisuPlanes), column); gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeviewVisuPlanes)), GTK_SELECTION_SINGLE); gtk_tree_view_set_model(GTK_TREE_VIEW(treeviewVisuPlanes), GTK_TREE_MODEL(listStoredVisuPlanes)); gtk_container_add(GTK_CONTAINER(panelPlanes), vBoxVisuPlanes); } /** * visu_ui_panel_planes_getAll: * @maskingOnly: a boolean. * * Return a newly created list (to be freed with g_list_free()) of all planes * available in the subpanel. This list can be restricted to masking planes * only with the help of argument @maskingOnly. * * Returns: (array zero-terminated=1) (transfer container): a newly * created array NULL terminated that must be freed with g_free(). */ VisuPlane** visu_ui_panel_planes_getAll(gboolean maskingOnly) { VisuPlane **planeList; GtkTreeIter iter; VisuPlane *plane; int i; gboolean skip; DBG_fprintf(stderr, "Panel VisuPlanes: building plane list...\n"); /* Build the list of all planes. */ planeList = g_malloc(sizeof(VisuPlane*) * (gtk_tree_model_iter_n_children (GTK_TREE_MODEL(listStoredVisuPlanes), NULL) + 1)); skip = (maskingOnly && (!checkUseVisuPlanes || !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkUseVisuPlanes)))); i = 0; if (!skip && gtk_tree_model_get_iter_first(GTK_TREE_MODEL(listStoredVisuPlanes), &iter)) do { gtk_tree_model_get(GTK_TREE_MODEL(listStoredVisuPlanes), &iter, VISU_UI_PANEL_PLANES_POINTER, &plane, -1); /* Because the get action increase the counter... */ g_object_unref(G_OBJECT(plane)); if (!maskingOnly || (visu_plane_getHiddenState(plane) != VISU_PLANE_SIDE_NONE)) { planeList[i] = plane; i += 1; DBG_fprintf(stderr, " | found one plane %p.\n", (gpointer)plane); } } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(listStoredVisuPlanes), &iter)); planeList[i] = (VisuPlane*)0; return planeList; } static void _getBoxSpan(VisuBox *box, float span[2]) { float diag[3], ext[3], red[3] = {1.f, 1.f, 1.f}; visu_box_convertBoxCoordinatestoXYZ(box, diag, red); visu_box_getExtension(box, ext); diag[0] *= diag[0]; diag[1] *= diag[1]; diag[2] *= diag[2]; span[0] = -sqrt(ext[0] * ext[0] * diag[0] + ext[1] * ext[1] * diag[1] + ext[2] * ext[2] * diag[2]); span[1] = sqrt((ext[0] + 1.f) * (ext[0] + 1.f) * diag[0] + (ext[1] + 1.f) * (ext[1] + 1.f) * diag[1] + (ext[2] + 1.f) * (ext[2] + 1.f) * diag[2]); } static void onAskForHideNodes(VisuData *visuData, gboolean *redraw, gpointer data _U_) { VisuPlane **listOfVisuPlanes; DBG_fprintf(stderr, "Panel VisuPlanes: caught the 'AskForShowHide' signal for" " VisuData %p.\n", (gpointer)visuData); DBG_fprintf(stderr, "Visu UI Planes: checkbox is %p.\n", (gpointer)checkUseVisuPlanes); if (!checkUseVisuPlanes || !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkUseVisuPlanes))) return; listOfVisuPlanes = visu_ui_panel_planes_getAll(FALSE); if (listOfVisuPlanes) { *redraw = visu_plane_class_showHideAll(listOfVisuPlanes, visuData) || *redraw; g_free(listOfVisuPlanes); } } /** * visu_ui_panel_planes_setUsed: * @value: a boolean. * * When @value is TRUE, the planes are used and drawn. If the panel * has not been created yet, a call to this function will do it. * * Returns: TRUE if the hiding scheme has been applied. */ gboolean visu_ui_panel_planes_setUsed(gboolean value) { int val; GtkTreeIter iter; VisuData *dataObj; DBG_fprintf(stderr, "Visu UI Planes: set used (%d).\n", value); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkUseVisuPlanes), value); if (!visu_gl_ext_setActive(VISU_GL_EXT(visu_gl_ext_planes_getDefault()), value)) return FALSE; visu_gl_ext_planes_draw(visu_gl_ext_planes_getDefault()); dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelPlanes)); if (!isVisuPlanesInitialised) createAndInitVisuPlanePanel(dataObj); /* Test if any planes are stored. */ if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(listStoredVisuPlanes), &iter)) return FALSE; DBG_fprintf(stderr, " | apply hiding scheme.\n"); val = visu_ui_panel_planes_applyHidingScheme(dataObj); return (gboolean)val; } static void onVisuPlaneUsed(GtkToggleButton *button, gpointer data _U_) { visu_ui_panel_planes_setUsed(gtk_toggle_button_get_active(button)); VISU_REDRAW_ADD; } /** * visu_ui_panel_planes_add: * @plane: (transfer full): a #VisuPlane object. * @hidingStatus: if plane is used for hiding. * @hidingSide: the side hiding is done on. * * Add a plane to the list of planes. * * Since: 3.7 * * Returns: TRUE if redraw is needed. **/ gboolean visu_ui_panel_planes_add(VisuPlane *plane, gboolean hidingStatus, gboolean hidingSide) { gchar str[256]; float vect[3]; GtkTreeIter iter; GdkPixbuf *pix; /* String used to labelled planes, dist. means 'distance' and norm. means 'normal' (50 chars max). */ visu_plane_getNVectUser(plane, vect); sprintf(str, LABEL_PLANE, (int)vect[0], (int)vect[1], (int)vect[2], visu_plane_getDistanceFromOrigin(plane)); pix = tool_color_get_stamp(visu_plane_getColor(plane), TRUE); gtk_list_store_append(listStoredVisuPlanes, &iter); gtk_list_store_set(listStoredVisuPlanes, &iter, VISU_UI_PANEL_PLANES_DRAWN, visu_plane_getRendered(plane), VISU_UI_PANEL_PLANES_LABEL, str, VISU_UI_PANEL_PLANES_HIDE_IS_ON, hidingStatus, VISU_UI_PANEL_PLANES_HIDDEN_SIDE, hidingSide, VISU_UI_PANEL_PLANES_COLOR_PIXBUF, (gpointer)pix, VISU_UI_PANEL_PLANES_POINTER, (gpointer)plane, -1); g_object_unref(pix); if (visu_gl_ext_planes_add(visu_gl_ext_planes_getDefault(), plane)) visu_gl_ext_planes_draw(visu_gl_ext_planes_getDefault()); gtk_tree_selection_select_iter (gtk_tree_view_get_selection(GTK_TREE_VIEW(treeviewVisuPlanes)), &iter); gtk_widget_set_sensitive(hboxHidingMode, (gtk_tree_model_iter_n_children (GTK_TREE_MODEL(listStoredVisuPlanes), (GtkTreeIter*)0) > 1)); return visu_gl_ext_getActive(VISU_GL_EXT(visu_gl_ext_planes_getDefault())); } void onVisuPlaneAdd(GtkButton *button _U_, gpointer userData _U_) { VisuPlane* plane; float vect[3]; int i; ToolColor *color; float dist; gboolean redraw; /* We create a new plane. */ color = visu_ui_color_combobox_getSelection (VISU_UI_COLOR_COMBOBOX(widgetColorVisuPlane)); for (i = 0; i < 3; i++) vect[i] = (float)visu_ui_numerical_entry_getValue (VISU_UI_NUMERICAL_ENTRY(entryNVect[i])); dist = (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbuttonDistance)); plane = visu_plane_new(visu_boxed_getBox(VISU_BOXED(visu_ui_panel_getData(VISU_UI_PANEL(panelPlanes)))), vect, dist, color); /* We store it. */ redraw = visu_ui_panel_planes_add(plane, FALSE, FALSE); /* We count down the counter on plane since it has been added to the list. */ g_object_unref(G_OBJECT(plane)); if (redraw) VISU_REDRAW_ADD; } void onVisuPlaneRemove(GtkButton *button _U_, gpointer data _U_) { gboolean res; GtkTreeModel *tmpList; GtkTreeIter iter; VisuData *dataObj; VisuPlane *plane; DBG_fprintf(stderr, "Panel VisuPlanes: removing plane...\n"); res = gtk_tree_selection_get_selected (gtk_tree_view_get_selection(GTK_TREE_VIEW(treeviewVisuPlanes)), &tmpList, &iter); if (!res) return; gtk_tree_model_get(GTK_TREE_MODEL(listStoredVisuPlanes), &iter, VISU_UI_PANEL_PLANES_POINTER, &plane); /* Remove plane from VisuGlExtPlanes list. */ if (visu_gl_ext_planes_remove(visu_gl_ext_planes_getDefault(), plane)) visu_gl_ext_planes_draw(visu_gl_ext_planes_getDefault()); g_object_unref(plane); /* Remove it from interface and update selection. */ res = TRUE; if (!gtk_list_store_remove(GTK_LIST_STORE(listStoredVisuPlanes), &iter)) res = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(listStoredVisuPlanes), &iter); if (res) gtk_tree_selection_select_iter (gtk_tree_view_get_selection(GTK_TREE_VIEW(treeviewVisuPlanes)), &iter); DBG_fprintf(stderr, "Panel VisuPlanes: OK plane found and removed.\n"); if (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(listStoredVisuPlanes), (GtkTreeIter*)0) < 2) gtk_widget_set_sensitive(hboxHidingMode, FALSE); /* If extension is not used, we leave here. */ if (!visu_gl_ext_getActive(VISU_GL_EXT(visu_gl_ext_planes_getDefault()))) return; /* Modify nodes visibility accordingly. */ dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelPlanes)); if (visu_ui_panel_planes_applyHidingScheme(dataObj)) VISU_REDRAW_ADD; } static void onEntryNVectChange(VisuUiNumericalEntry *entry, double oldValue _U_, gpointer data) { gboolean res; GtkTreeModel *tmpList; GtkTreeIter iter; VisuPlane *plane; char str[256]; float dist; float vect[3]; gboolean hide, side; int i; VisuData *dataObj; i = GPOINTER_TO_INT(data); g_return_if_fail(i >= 0 && i < 3); if (disableCallbacks) return; res = gtk_tree_selection_get_selected (gtk_tree_view_get_selection(GTK_TREE_VIEW(treeviewVisuPlanes)), &tmpList, &iter); if (!res) return; plane = (VisuPlane*)0; hide = FALSE; side = FALSE; gtk_tree_model_get(GTK_TREE_MODEL(listStoredVisuPlanes), &iter, VISU_UI_PANEL_PLANES_POINTER, &plane, VISU_UI_PANEL_PLANES_HIDE_IS_ON, &hide, VISU_UI_PANEL_PLANES_HIDDEN_SIDE, &side, -1); g_return_if_fail(plane); /* Because the get action increase the counter... */ g_object_unref(G_OBJECT(plane)); visu_plane_getNVectUser(plane, vect); vect[i] = (float)visu_ui_numerical_entry_getValue(entry); if (vect[0] == 0. && vect[1] == 0. && vect[2] == 0.) { g_warning("Can't assign a null vector.\n"); visu_plane_getNVectUser(plane, vect); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryNVect[0]), (double)vect[0]); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryNVect[1]), (double)vect[1]); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryNVect[2]), (double)vect[2]); return; } res = visu_plane_setNormalVector(plane, vect); if (!res) return; dist = visu_plane_getDistanceFromOrigin(plane); sprintf(str, LABEL_PLANE, (int)vect[0], (int)vect[1], (int)vect[2], dist); gtk_list_store_set(listStoredVisuPlanes, &iter, VISU_UI_PANEL_PLANES_LABEL, str, -1); /* Get the VisuData to deal with. */ dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelPlanes)); /* Need to modify the nodes visibility only if the current plane use the masking function (hiddenState != VISU_PLANE_SIDE_NONE). */ if (visu_gl_ext_getActive(VISU_GL_EXT(visu_gl_ext_planes_getDefault())) && visu_plane_getHiddenState(plane) != VISU_PLANE_SIDE_NONE) /* Modify nodes visibility accordingly. */ visu_ui_panel_planes_applyHidingScheme(dataObj); VISU_REDRAW_ADD; } static void onSpinDistanceChange(GtkSpinButton *spin, gpointer data _U_) { gboolean res; GtkTreeModel *tmpList; GtkTreeIter iter; VisuPlane *plane; char str[256]; float dist; float vect[3]; gboolean hide, side; int val; VisuData *dataObj; if (disableCallbacks) return; res = gtk_tree_selection_get_selected (gtk_tree_view_get_selection(GTK_TREE_VIEW(treeviewVisuPlanes)), &tmpList, &iter); if (!res) return; plane = (VisuPlane*)0; hide = FALSE; side = FALSE; gtk_tree_model_get(GTK_TREE_MODEL(listStoredVisuPlanes), &iter, VISU_UI_PANEL_PLANES_POINTER, &plane, VISU_UI_PANEL_PLANES_HIDE_IS_ON, &hide, VISU_UI_PANEL_PLANES_HIDDEN_SIDE, &side, -1); g_return_if_fail(plane); /* Because the get action increase the counter... */ g_object_unref(G_OBJECT(plane)); dist = (float)gtk_spin_button_get_value(spin); val = visu_plane_setDistanceFromOrigin(plane, dist); if (val < 0) { g_warning("Can't assign the new distance from origin: %f.\n", dist); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbuttonDistance), 0.); return; } else if (val == 0) return; visu_plane_getNVectUser(plane, vect); sprintf(str, LABEL_PLANE, (int)vect[0], (int)vect[1], (int)vect[2], dist); gtk_list_store_set(listStoredVisuPlanes, &iter, VISU_UI_PANEL_PLANES_LABEL, str, -1); /* Get the VisuData to deal with. */ dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelPlanes)); /* Need to modify the nodes visibility only if the current plane use the masking function (hiddenState != VISU_PLANE_SIDE_NONE). */ if (visu_gl_ext_getActive(VISU_GL_EXT(visu_gl_ext_planes_getDefault())) && visu_plane_getHiddenState(plane) != VISU_PLANE_SIDE_NONE) /* Modify nodes visibility accordingly. */ visu_ui_panel_planes_applyHidingScheme(dataObj); VISU_REDRAW_ADD; } static void onVisuPlaneColorChange(VisuUiColorCombobox *combo, ToolColor *color, gpointer data _U_) { gboolean res; GtkTreeModel *tmpList; GtkTreeIter iter; VisuPlane *plane; int val; GdkPixbuf *pixbufColorAlphaBox; if (disableCallbacks) return; DBG_fprintf(stderr, "Panel VisuPlanes: Catch the 'color-selected' signal.\n"); pixbufColorAlphaBox = visu_ui_color_combobox_getPixbufFromColor(combo, color); /* Get the plane */ res = gtk_tree_selection_get_selected (gtk_tree_view_get_selection(GTK_TREE_VIEW(treeviewVisuPlanes)), &tmpList, &iter); if (!res) return; plane = (VisuPlane*)0; gtk_tree_model_get(GTK_TREE_MODEL(listStoredVisuPlanes), &iter, VISU_UI_PANEL_PLANES_POINTER, &plane, -1); if (!plane) return; /* Because the get action increase the counter... */ g_object_unref(G_OBJECT(plane)); /* Change the color value. */ val = visu_plane_setColor(plane, color); if (val < 0) { g_warning("Can't assign the new color: %p.\n", (gpointer)color); return; } else if (val == 0) return; DBG_fprintf(stderr, "Panel VisuPlanes: color combobox changed to %p (%f,%f,%f,%f).\n", (gpointer)color, color->rgba[0], color->rgba[1], color->rgba[2], color->rgba[3]); DBG_fprintf(stderr, "Panel VisuPlanes: Changed color (%p) for plane : %p.\n", (gpointer)color, (gpointer)plane); gtk_list_store_set(listStoredVisuPlanes, &iter, VISU_UI_PANEL_PLANES_COLOR_PIXBUF, pixbufColorAlphaBox, -1); if (visu_gl_ext_getActive(VISU_GL_EXT(visu_gl_ext_planes_getDefault()))) VISU_REDRAW_ADD; } static void onDataFocused(GObject *obj _U_, VisuData *dataObj, gpointer data _U_) { VisuPlane **list; int i; gboolean needShowHide; float span[2]; VisuBox *box; DBG_fprintf(stderr, "Panel VisuPlanes: caught 'DataFocused' signal\n" " | setting sensitivity.\n"); if (dataObj) gtk_widget_set_sensitive(vBoxVisuPlanes, TRUE); else { gtk_widget_set_sensitive(vBoxVisuPlanes, FALSE); return; } if (spinbuttonDistance) { DBG_fprintf(stderr, " | set the maximum of the distance spin.\n"); _getBoxSpan(visu_boxed_getBox(VISU_BOXED(dataObj)), span); gtk_spin_button_set_range(GTK_SPIN_BUTTON(spinbuttonDistance), -span[1], span[1]); } DBG_fprintf(stderr, " | recalculating intersections and masking set.\n"); box = visu_boxed_getBox(VISU_BOXED(dataObj)); list = visu_ui_panel_planes_getAll(FALSE); for (i = 0; list[i]; i++) visu_boxed_setBox(VISU_BOXED(list[i]), VISU_BOXED(box), TRUE); if (!visu_gl_ext_getActive(VISU_GL_EXT(visu_gl_ext_planes_getDefault()))) { g_free(list); return; } needShowHide = FALSE; for (i = 0; list[i]; i++) /* Test if one of the plane at least need to mask some nodes. */ needShowHide = needShowHide || (visu_plane_getHiddenState(list[i]) != VISU_PLANE_SIDE_NONE); g_free(list); /* Compute the masking state */ if (needShowHide) visu_ui_panel_planes_applyHidingScheme(dataObj); } static void onDataReady(VisuObject *obj _U_, VisuData *dataObj, VisuGlView *view _U_, gpointer data _U_) { DBG_fprintf(stderr, "Panel VisuPlanes: caught 'dataRendered' signal," " connecting local signals.\n"); if (dataObj) { hide_signal = g_signal_connect(G_OBJECT(dataObj), "AskForShowHide", G_CALLBACK(onAskForHideNodes), (gpointer)0); position_signal = g_signal_connect(G_OBJECT(dataObj), "PositionChanged", G_CALLBACK(onPositionChanged), (gpointer)0); popInc_signal = g_signal_connect(G_OBJECT(dataObj), "PopulationIncrease", G_CALLBACK(onPopulationIncreased), (gpointer)0); popDec_signal = g_signal_connect(G_OBJECT(visu_boxed_getBox(VISU_BOXED(dataObj))), "SizeChanged", G_CALLBACK(onSizeChanged), (gpointer)0); } } static void onDataNotReady(VisuObject *obj _U_, VisuData *dataObj, VisuGlView *view _U_, gpointer data _U_) { DBG_fprintf(stderr, "Panel VisuPlanes: caught 'dataUnRendered' signal," " disconnecting local signals.\n"); g_signal_handler_disconnect(G_OBJECT(dataObj), hide_signal); g_signal_handler_disconnect(G_OBJECT(dataObj), position_signal); g_signal_handler_disconnect(G_OBJECT(dataObj), popInc_signal); g_signal_handler_disconnect(G_OBJECT(visu_boxed_getBox(VISU_BOXED(dataObj))), popDec_signal); } static void onPositionChanged(VisuData *dataObj, VisuElement *ele _U_, gpointer data _U_) { GtkTreeIter iter; DBG_fprintf(stderr, "Panel VisuPlanes: catch 'PositionChanged' signal," " recalculating masking properties.\n"); if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(listStoredVisuPlanes), &iter)) visu_ui_panel_planes_applyHidingScheme(dataObj); } static void onPopulationIncreased(VisuData *dataObj, int *newNodes _U_, gpointer data _U_) { GtkTreeIter iter; DBG_fprintf(stderr, "Panel VisuPlanes: catch 'PopulationIncrease' signal," " recalculating masking properties for all nodes.\n"); if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(listStoredVisuPlanes), &iter)) visu_ui_panel_planes_applyHidingScheme(dataObj); } static void onSizeChanged(VisuBox *box, gfloat extens _U_, gpointer user_data _U_) { float span[2]; DBG_fprintf(stderr, "Panel VisuPlanes: catch 'SizeChanged' signal," " updating interface.\n"); if (spinbuttonDistance) { DBG_fprintf(stderr, " | set the maximum of the distance spin.\n"); _getBoxSpan(box, span); gtk_spin_button_set_range(GTK_SPIN_BUTTON(spinbuttonDistance), -span[1], span[1]); } } static void onTreeSelectionChanged(GtkTreeSelection *tree, gpointer data _U_) { gboolean res; GtkTreeModel *tmpList; GtkTreeIter iter; VisuPlane *plane; float nVisuPlane[3], dist; ToolColor *colorVisuPlane; DBG_fprintf(stderr, "Panel VisuPlanes: catch 'changed' signal from " " the gtkTreeSelection.\n"); res = gtk_tree_selection_get_selected(tree, &tmpList, &iter); if (res) { plane = (VisuPlane*)0; gtk_tree_model_get(GTK_TREE_MODEL(listStoredVisuPlanes), &iter, VISU_UI_PANEL_PLANES_POINTER, &plane, -1); /* Because the get action increase the counter... */ g_object_unref(G_OBJECT(plane)); DBG_fprintf(stderr, "Panel VisuPlanes: get the values for plane %p.\n", (gpointer)plane); visu_plane_getNVectUser(plane, nVisuPlane); dist = visu_plane_getDistanceFromOrigin(plane); colorVisuPlane = visu_plane_getColor(plane); DBG_fprintf(stderr, "Panel VisuPlanes: update the widgets.\n"); disableCallbacks = TRUE; visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryNVect[0]), (double)nVisuPlane[0]); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryNVect[1]), (double)nVisuPlane[1]); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryNVect[2]), (double)nVisuPlane[2]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbuttonDistance), dist); visu_ui_color_combobox_setSelection(VISU_UI_COLOR_COMBOBOX(widgetColorVisuPlane), colorVisuPlane); disableCallbacks = FALSE; DBG_fprintf(stderr, " | done.\n"); gtk_widget_set_sensitive(buttonRotate, TRUE); gtk_widget_set_sensitive(vboxDistChange, TRUE); gtk_widget_set_sensitive(hboxSaveList, TRUE); } else { gtk_widget_set_sensitive(buttonRotate, FALSE); gtk_widget_set_sensitive(vboxDistChange, FALSE); gtk_widget_set_sensitive(hboxSaveList, FALSE); } } void onSetCameraPosition(GtkButton *button _U_, gpointer data _U_) { gboolean res; GtkTreeModel *tmpList; GtkTreeIter iter; float spherical[3]; VisuPlane *plane; float nVisuPlane[3]; res = gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeviewVisuPlanes)), &tmpList, &iter); if (res) { plane = (VisuPlane*)0; gtk_tree_model_get(GTK_TREE_MODEL(listStoredVisuPlanes), &iter, VISU_UI_PANEL_PLANES_POINTER, &plane, -1); /* Because the get action increase the counter... */ g_object_unref(G_OBJECT(plane)); DBG_fprintf(stderr, "Panel VisuPlanes: Set the camera position to be" " normal to the selected plane (%p).\n", (gpointer)plane); visu_plane_getNVectUser(plane, nVisuPlane); tool_matrix_cartesianToSpherical(spherical, nVisuPlane); visu_gl_view_setThetaPhiOmega(visu_ui_panel_getView(VISU_UI_PANEL(panelPlanes)), spherical[1], spherical[2], 0., VISU_GL_CAMERA_THETA | VISU_GL_CAMERA_PHI); VISU_REDRAW_ADD; } } static void panelSet_rendered(GtkTreeIter *iter, VisuPlane *plane, gboolean status) { visu_plane_setRendered(plane, status); gtk_list_store_set(listStoredVisuPlanes, iter, VISU_UI_PANEL_PLANES_DRAWN, status, -1); DBG_fprintf(stderr, "Panel planes: set state (%d) for plane %p.\n", status, (gpointer)plane); } static void onGtkVisuPlanesDrawnToggled(GtkCellRendererToggle *cell_renderer, gchar *path, gpointer user_data _U_) { gboolean validIter; GtkTreeIter iter; VisuPlane *plane; validIter = gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(listStoredVisuPlanes), &iter, path); g_return_if_fail(validIter); gtk_tree_model_get(GTK_TREE_MODEL(listStoredVisuPlanes), &iter, VISU_UI_PANEL_PLANES_POINTER, &plane, -1); g_object_unref(G_OBJECT(plane)); panelSet_rendered(&iter, plane, !gtk_cell_renderer_toggle_get_active(cell_renderer)); VISU_REDRAW_ADD; } /** * visu_ui_panel_planes_setRendered: * @plane: a #VisuPlane object ; * @status: a boolean. * * Change the visibility of the plane through the Gtk interface, then * the widgets are also update and the list of drawn planes is * rebuilt. To only directly change the visibility of one plane use * visu_plane_setRendered() instead. * * Returns: TRUE if the redraw sigbnal should be emitted. */ gboolean visu_ui_panel_planes_setRendered(VisuPlane *plane, gboolean status) { gboolean valid; GtkTreeIter iter; VisuPlane *storedVisuPlane; storedVisuPlane = (VisuPlane*)0; valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(listStoredVisuPlanes), &iter); while (valid) { gtk_tree_model_get(GTK_TREE_MODEL(listStoredVisuPlanes), &iter, VISU_UI_PANEL_PLANES_POINTER, &storedVisuPlane, -1); g_object_unref(G_OBJECT(storedVisuPlane)); if (storedVisuPlane == plane) valid = FALSE; else valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(listStoredVisuPlanes), &iter); } g_return_val_if_fail(storedVisuPlane == plane, FALSE); panelSet_rendered(&iter, plane, status); return TRUE; } void onGtkVisuPlanesHideToggled(GtkCellRendererToggle *cell_renderer _U_, gchar *path, gpointer user_data) { gboolean validIter, checked, side; GtkTreeIter iter; int val; VisuPlane *plane; VisuData *dataObj; DBG_fprintf(stderr, "Panel VisuPlanes: toggle plane hide mode.\n"); validIter = gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(listStoredVisuPlanes), &iter, path); g_return_if_fail(validIter); gtk_tree_model_get(GTK_TREE_MODEL(listStoredVisuPlanes), &iter, VISU_UI_PANEL_PLANES_POINTER, &plane, VISU_UI_PANEL_PLANES_HIDE_IS_ON, &checked, VISU_UI_PANEL_PLANES_HIDDEN_SIDE, &side, -1); /* Because the get action increase the counter... */ g_object_unref(G_OBJECT(plane)); if (GPOINTER_TO_INT(user_data) == 0) { checked = !checked; gtk_list_store_set(listStoredVisuPlanes, &iter, VISU_UI_PANEL_PLANES_HIDE_IS_ON, checked, -1); } else { side = !side; gtk_list_store_set(listStoredVisuPlanes, &iter, VISU_UI_PANEL_PLANES_HIDDEN_SIDE, side, -1); } /* Set the hidden status */ if (!checked) val = visu_plane_setHiddenState(plane, VISU_PLANE_SIDE_NONE); else { if (side) val = visu_plane_setHiddenState(plane, VISU_PLANE_SIDE_MINUS); else val = visu_plane_setHiddenState(plane, VISU_PLANE_SIDE_PLUS); } if (!visu_gl_ext_getActive(VISU_GL_EXT(visu_gl_ext_planes_getDefault()))) return; if (val) { /* Get the VisuData to deal with. */ dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelPlanes)); /* Modify nodes visibility accordingly. */ if (visu_ui_panel_planes_applyHidingScheme(dataObj)) VISU_REDRAW_ADD; } } void onGtkVisuPlanesHidingModeToggled(GtkToggleButton *toggle, gpointer data) { int res, i; VisuPlane **planeList; gboolean needShowHide; VisuData *dataObj; if (!gtk_toggle_button_get_active(toggle)) return; DBG_fprintf(stderr, "Panel planes : set hiding mode to %d.\n", GPOINTER_TO_INT(data)); res = visu_plane_class_setHiddingMode(GPOINTER_TO_INT(data)); if (!res || !visu_gl_ext_getActive(VISU_GL_EXT(visu_gl_ext_planes_getDefault()))) return; /* Build the list of all planes. */ planeList = visu_ui_panel_planes_getAll(FALSE); if (!planeList[0]) { g_free(planeList); return; } /* Test if one of the plane has a mask attribute. */ needShowHide = FALSE; for (i = 0; planeList[i]; i++) /* Test if one of the plane at least need to mask some nodes. */ needShowHide = needShowHide || (visu_plane_getHiddenState(planeList[i]) != VISU_PLANE_SIDE_NONE); res = 0; /* Get the VisuData to deal with. */ dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelPlanes)); if (needShowHide) /* Modify nodes visibility accordingly. */ res = visu_ui_panel_planes_applyHidingScheme(dataObj); g_free(planeList); if (res) VISU_REDRAW_ADD; } /** * visu_ui_panel_planes_applyHidingScheme: * @data: a #VisuData object to associate the planes to (required * to compute the intersection with the bounding box) ; * * Use this method to hide nodes according to current list of planes * and hiding policy. * * Returns: TRUE if the redraw signal should be emitted. */ gboolean visu_ui_panel_planes_applyHidingScheme(VisuData *data) { gboolean redraw; redraw = FALSE; g_signal_emit_by_name(G_OBJECT(data), "AskForShowHide", &redraw, NULL); if (redraw) g_signal_emit_by_name(G_OBJECT(data), "VisibilityChanged", NULL); return redraw; } static void onPlayStopDist(GtkButton *button _U_, gpointer data _U_) { DBG_fprintf(stderr, "Panel VisuPlanes: push the play/stop button.\n"); if (!isPlayingDistanceId) { /* Launch play */ gtk_widget_hide(imageDistPlay); gtk_widget_show(imageDistStop); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbuttonDistance), visu_ui_numerical_entry_getValue(VISU_UI_NUMERICAL_ENTRY(entryDistFrom))); directionDist = 1.; isPlayingDistanceId = g_timeout_add_full(G_PRIORITY_DEFAULT + 30, (gint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinDistDelay)), playDistances, (gpointer)0, stopPlayStop); } else { /* Stop play */ g_source_remove(isPlayingDistanceId); } } static void stopPlayStop(gpointer data _U_) { isPlayingDistanceId = 0; gtk_widget_hide(imageDistStop); gtk_widget_show(imageDistPlay); } static gboolean playDistances(gpointer data _U_) { gdouble val, step; gboolean changed; if (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(listStoredVisuPlanes), NULL) == 0) return FALSE; val = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbuttonDistance)); step = visu_ui_numerical_entry_getValue(VISU_UI_NUMERICAL_ENTRY(entryDistStep)); changed = FALSE; if (directionDist > 0.) { if (val + step > visu_ui_numerical_entry_getValue(VISU_UI_NUMERICAL_ENTRY(entryDistTo))) directionDist = -1.; else changed = TRUE; } else changed = TRUE; if (directionDist < 0.) { if (val - step < visu_ui_numerical_entry_getValue(VISU_UI_NUMERICAL_ENTRY(entryDistFrom))) directionDist = +1.; else changed = TRUE; } /* If the direction has been changed twice in a row, then the step is too wide for the range, we stop. */ if (!changed) return FALSE; DBG_fprintf(stderr, "Panel VisuPlanes: set new distance to %g.\n", val + directionDist * step); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbuttonDistance), val + directionDist * step); return TRUE; } static void onSpinDistDelayChange(GtkSpinButton *spin _U_, gpointer data _U_) { if (isPlayingDistanceId) { /* Stop play. */ g_source_remove(isPlayingDistanceId); /* Launch play. */ gtk_widget_hide(imageDistPlay); gtk_widget_show(imageDistStop); isPlayingDistanceId = g_timeout_add_full(G_PRIORITY_DEFAULT + 30, (gint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinDistDelay)), playDistances, (gpointer)0, stopPlayStop); } } /* IO tab. */ static void setCurrentSaveFile() { gchar *filenameUTF8, *markup; if (!currentSaveListFile) return; /* Print the filename to screen. */ filenameUTF8 = g_filename_to_utf8(currentSaveListFile, -1, NULL, NULL, NULL); g_return_if_fail(filenameUTF8); markup = g_markup_printf_escaped(_("%s"), filenameUTF8); g_free(filenameUTF8); gtk_label_set_markup(GTK_LABEL(labelVisuPlaneList), markup); g_free(markup); /* Since we've got a file name, save button can be activated. */ gtk_widget_set_sensitive(buttonSaveList, TRUE); } /** * visu_ui_panel_planes_load: * @dataObj: a #VisuData object to associate the planes to (required * to compute the intersection with the bounding box) ; * @filename: the path to the file to load ; * @error: a pointer to a GError handler to reccord possible failure. * * This method is used to parse and load an XML file containing * planes informations. The panel must have been initialised before * calling this method. The @error argument is required (can't be NULL), * since it is set if something went wrong. * * Returns: TRUE if visu_ui_panel_planes_applyHidingScheme(). */ gboolean visu_ui_panel_planes_load(VisuData *dataObj, gchar *filename, GError **error) { VisuPlane **list; gboolean res; int hide, i; g_return_val_if_fail(dataObj && filename && error && *error == (GError*)0, FALSE); if (!isVisuPlanesInitialised) createAndInitVisuPlanePanel(dataObj); /* Try to load the file. */ list = (VisuPlane**)0; res = visu_plane_class_parseXMLFile(filename, &list, error); if (!res) return FALSE; DBG_fprintf(stderr, "Panel VisuPlanes: found planes in file '%s'.\n", filename); /* Begin to compute intersections of all planes and then add then to the list. */ gtk_list_store_clear(listStoredVisuPlanes); for (i = 0; list[i]; i++) { DBG_fprintf(stderr, " | %d plane %p.\n", i, (gpointer)list[i]); hide = visu_plane_getHiddenState(list[i]); visu_ui_panel_planes_add(list[i], (hide != VISU_PLANE_SIDE_NONE), (hide == VISU_PLANE_SIDE_MINUS)); g_object_unref(G_OBJECT(list[i])); visu_boxed_setBox(VISU_BOXED(list[i]), VISU_BOXED(dataObj), TRUE); } g_free(list); /* Save the file name. */ if (currentSaveListFile) g_free(currentSaveListFile); currentSaveListFile = g_strdup(filename); setCurrentSaveFile(); return visu_gl_ext_getActive(VISU_GL_EXT(visu_gl_ext_planes_getDefault())); } static void onVisuPlaneListOpen(GtkButton *button _U_, gpointer data _U_) { GtkWidget *openDialog; gchar *filename, *directory; VisuData *dataObj; gboolean res; GError *error; GtkWindow *parent; GtkFileFilter *filter; dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelPlanes)); g_return_if_fail(dataObj); parent = visu_ui_panel_getContainerWindow(VISU_UI_PANEL(panelPlanes)); openDialog = gtk_file_chooser_dialog_new(_("Choose a file with a list of planes"), GTK_WINDOW(parent), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); gtk_window_set_modal(GTK_WINDOW(openDialog), TRUE); gtk_window_set_transient_for(GTK_WINDOW(openDialog), GTK_WINDOW(parent)); gtk_window_set_position(GTK_WINDOW(openDialog), GTK_WIN_POS_CENTER_ON_PARENT); directory = visu_ui_getLastOpenDirectory(); if (directory) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(openDialog), directory); gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(openDialog), FALSE); filter = gtk_file_filter_new (); gtk_file_filter_set_name(filter, _("Plane description (*.xml)")); gtk_file_filter_add_pattern(filter, "*.xml"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(openDialog), filter); filter = gtk_file_filter_new (); gtk_file_filter_set_name(filter, _("All files")); gtk_file_filter_add_pattern (filter, "*"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(openDialog), filter); if (gtk_dialog_run(GTK_DIALOG(openDialog)) != GTK_RESPONSE_ACCEPT) { gtk_widget_destroy(openDialog); return; } filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(openDialog)); gtk_widget_destroy(openDialog); error = (GError*)0; res = visu_ui_panel_planes_load(dataObj, filename, &error); g_free(filename); if (error) { visu_ui_raiseWarning(_("Loading a file"), error->message, (GtkWindow*)0); g_error_free(error); return; } /* If the extension is actually used, recompute the visibility of nodes. */ if (res) { visu_ui_panel_planes_applyHidingScheme(dataObj); VISU_REDRAW_ADD; } } static gboolean callbackSave(gchar* filename) { VisuPlane **list; GError *error; gboolean res; g_return_val_if_fail(filename, FALSE); /* Get all planes in a list. */ list = visu_ui_panel_planes_getAll(FALSE); /* Give the list to the save method. */ error = (GError*)0; res = visu_plane_class_exportXMLFile(filename, list, &error); if (!res) { visu_ui_raiseWarning(_("Saving a file"), error->message, (GtkWindow*)0); g_clear_error(&error); return FALSE; } /* Free the used list. */ g_free(list); return TRUE; } static void onVisuPlaneListSave(GtkButton *button _U_, gpointer data _U_) { callbackSave(currentSaveListFile); } static void onVisuPlaneListSaveAs(GtkButton *button _U_, gpointer data _U_) { gchar *filename; gboolean res; filename = visu_ui_value_io_getFilename(GTK_WINDOW(visu_ui_panel_getContainerWindow (VISU_UI_PANEL(panelPlanes)))); if (!filename) return; res = callbackSave(filename); if (res) { currentSaveListFile = filename; setCurrentSaveFile(); } else g_free(filename); } static void onOrientationChanged(VisuUiOrientationChooser *orientationChooser, gpointer data _U_) { int i; float values[3]; /* for (i = 0; i < 2; i++) */ /* g_signal_handler_block(G_OBJECT(entryNVect[i]), */ /* signalsOrientation[i]); */ visu_ui_orientation_chooser_getOrthoValues(orientationChooser, values); for (i = 0; i < 3; i++) visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryNVect[i]), (double)values[i]); /* for (i = 0; i < 2; i++) */ /* g_signal_handler_unblock(G_OBJECT(entryNVect[i]), */ /* signalsOrientation[i]); */ } static void onVisuUiOrientationChooser(GtkButton *button _U_, gpointer data _U_) { float values[3]; int i; if (!orientationChooser) { orientationChooser = visu_ui_orientation_chooser_new (VISU_UI_ORIENTATION_NORMAL, TRUE, visu_ui_panel_getData(VISU_UI_PANEL(panelPlanes)), GTK_WINDOW(visu_ui_dock_window_getWindow (visu_ui_panel_getContainer(VISU_UI_PANEL(panelPlanes))))); /* gtk_window_set_modal(GTK_WINDOW(orientationChooser), TRUE); */ for (i = 0; i < 3; i++) values[i] = (float)visu_ui_numerical_entry_getValue (VISU_UI_NUMERICAL_ENTRY(entryNVect[i])); visu_ui_orientation_chooser_setOrthoValues(VISU_UI_ORIENTATION_CHOOSER(orientationChooser), values); g_signal_connect(G_OBJECT(orientationChooser), "values-changed", G_CALLBACK(onOrientationChanged), (gpointer)0); } else gtk_window_present(GTK_WINDOW(orientationChooser)); gtk_widget_show(orientationChooser); switch (gtk_dialog_run(GTK_DIALOG(orientationChooser))) { case GTK_RESPONSE_ACCEPT: DBG_fprintf(stderr, "Panel VisuPlanes: accept changings on orientation.\n"); break; default: DBG_fprintf(stderr, "Panel VisuPlanes: reset values on orientation.\n"); for (i = 0; i < 3; i++) { /* g_signal_handler_block(G_OBJECT(entryNVect[i]), */ /* signalsOrientation[i]); */ visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryNVect[i]), (double)values[i]); /* g_signal_handler_unblock(G_OBJECT(entryNVect[i]), */ /* signalsOrientation[i]); */ } } DBG_fprintf(stderr, "Panel VisuPlanes: orientation object destroy.\n"); gtk_widget_destroy(orientationChooser); orientationChooser = (GtkWidget*)0; } v_sim-3.7.0/src/panelModules/panelPlanes.h0000644000353400050620000000677612215546063015437 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef PANELPLANES_H #define PANELPLANES_H #include #include #include #include #include /** * VisuUiPanelPlanesColumnId: * @VISU_UI_PANEL_PLANES_DRAWN: a boolean, code if the plane is drawn or not. * @VISU_UI_PANEL_PLANES_LABEL: a string, the description of the plane (normal vector * and distance to origin). * @VISU_UI_PANEL_PLANES_HIDE_IS_ON: a boolean, code if the plane hide elements on one side. * @VISU_UI_PANEL_PLANES_HIDDEN_SIDE: a boolean, code for the side. * @VISU_UI_PANEL_PLANES_COLOR_PIXBUF: a pixbuf, a small colored square. * @VISU_UI_PANEL_PLANES_POINTER: the pointer to the #VisuPlane object. * @VISU_UI_PANEL_PLANES_N_COLUMNS: the number of columns. * * Thesse are the description of the columns stored in the #GtkListStore * of this panel. See visu_ui_panel_planes_getList() to access this liststore. */ typedef enum { VISU_UI_PANEL_PLANES_DRAWN, VISU_UI_PANEL_PLANES_LABEL, VISU_UI_PANEL_PLANES_HIDE_IS_ON, VISU_UI_PANEL_PLANES_HIDDEN_SIDE, VISU_UI_PANEL_PLANES_COLOR_PIXBUF, VISU_UI_PANEL_PLANES_POINTER, VISU_UI_PANEL_PLANES_N_COLUMNS } VisuUiPanelPlanesColumnId; VisuUiPanel* visu_ui_panel_planes_init(); gboolean visu_ui_panel_planes_load(VisuData *dataObj, gchar *filename, GError **error); gboolean visu_ui_panel_planes_setUsed(gboolean value); gboolean visu_ui_panel_planes_setRendered(VisuPlane *plane, gboolean status); gboolean visu_ui_panel_planes_applyHidingScheme(VisuData *data); GtkListStore* visu_ui_panel_planes_getList(); VisuPlane** visu_ui_panel_planes_getAll(gboolean maskingOnly); gboolean visu_ui_panel_planes_add(VisuPlane *plane, gboolean hidingStatus, gboolean hidingSide); #endif v_sim-3.7.0/src/panelModules/panelSurfaces.c0000644000353400050620000032074612215556011015751 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD, Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD and Damien CALISTE and Olivier D'Astier, laboratoire L_Sim, (2001-2005) E-mail addresses : BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "panelSurfaces.h" #include "panelSurfacesTools.h" #include "panelPlanes.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /** * SECTION:panelSurfaces * @short_description: Gtk interface to load isosurfaces. * * This module contains the panel used to draw isosurfaces. From * it, you can draw isosurfaces on screen after they are loaded * through the surfaces * module. You can also access tools to manage and create .surf files, * these tools are related to the panelSurfacesTools * module. */ /* Global variables. */ static GtkWidget *panelSurfaces; static GtkWidget *isosurfaces_gtk_vbox; static GtkTreeStore *isosurfaces_data_list; static GtkListStore *fields_data_list; static GtkWidget *isosurfaces_tree_model; static gulong box_signal, hide_signal; static gboolean disableCallbacks; static gboolean fitToBox; static GtkTreeViewColumn *colorColumn; enum { SURFACE_TYPE_FILE_DENPOT, /* The entry is a potential or a density file. */ SURFACE_TYPE_FILE_SURF, /* The entry is a surfaces file. */ SURFACE_TYPE_SURF /* The entry is a surface. */ }; enum { NUMBER_COLUMN, SHOW_COLUMN, USE_SHOW_COLUMN, NAME_COLUMN, DISPLAY_NAME_COLUMN, EDIT_NAME_COLUMN, COLOR_NAME_COLUMN, TYPE_COLUMN, POTENTIAL_COLUMN, USE_POTENTIAL_COLUMN, EDIT_POTENTIAL_COLUMN, COLOR_POTENTIAL_COLUMN, PIXBUF_COLUMN, SHADE_COLUMN, MASKING_COLUMN, DATA_SURF_COLUMN, DATA_FIELD_COLUMN, FILENAME_COLUMN, N_COLUMNS }; static gboolean getSelectedRow(GtkTreeIter *iter); static void isosurfaces_update_data_list(GtkTreeIter *iter); static void showHideVisuSurfaces(GtkTreeIter *iter, gboolean recurse, gpointer value); static void changeSurfaceColor(GtkTreeIter *iter, gboolean recurse, gpointer color); static gboolean panel_isosurfaces_add(GtkTreeIter *iter, gboolean setValue, float value, const gchar *name, VisuSurfaces **surf); static gboolean panel_isosurfaces_remove(GtkTreeIter *iter); static void isosurfaces_remove_field(GtkListStore *list, VisuScalarField *field); static void changeTreeViewElement(GtkTreeIter *iter, const gchar *nameRef, int columnId, gpointer value); static gboolean isosurfaces_show_next(); static gboolean loadXMLFile(const gchar *filename, GError **error); static void _update_surf_at_iter(GtkTreeIter *iter, VisuSurfaces *surf); /* Callbacks. */ static void onDataReady(VisuObject *obj, VisuData *dataObj, VisuGlView *view, gpointer data); static void onDataNotReady(VisuObject *obj, VisuData *dataObj, VisuGlView *view, gpointer data); static void onDataFocused(GObject *visu, VisuData *dataObj, gpointer data); static void onOpenClicked(GtkButton *button, gpointer data); static void onTreeSelectionChanged(GtkTreeSelection *tree, gpointer data); static void onAddButtonClicked(GtkButton *button, gpointer data); static void onAddSpecialButtonClicked(GtkButton *button, gpointer data); static void onGenerateChanged(GtkSpinButton *spin, gpointer data); static void onRemoveButtonClicked(GtkButton *button, gpointer data); static void onReorderToggled(GtkToggleButton *toggle, gpointer data); static void onNameEdited(GtkCellRendererText *cellrenderertext, gchar *path, gchar *text, gpointer user_data); static void onPotentialValueEdited(GtkCellRendererText *cellrenderertext, gchar *path, gchar *text, gpointer user_data); static void onShowHideAllButton(GtkButton *button, gpointer visibility); static void onRangesChanged(VisuUiColorCombobox *colorComboBox, guint valId, gpointer data); static void onEditPropertiesClicked(GtkButton *button, gpointer data); static gboolean onTreeViewClicked(GtkWidget *widget, GdkEventButton *event, gpointer user_data); static void onAskForHideNodes(VisuData *visuData, gboolean *redraw, gpointer data); static gboolean onPropertiesClosed(GtkWidget *widget, GdkEvent *event, gpointer data); static void onToolShadeChange(VisuUiShadeCombobox *combo, ToolShade *shade, gpointer data); static void onMaskingToggled(GtkCellRendererToggle *cell_renderer, gchar *path, gpointer user_data); static void onSizeChanged(VisuBox *box, gfloat extens, gpointer user_data); static void onResourcesChanged(GObject *object, VisuData *dataObj, gpointer data); static void onDrawIntraChanged(GtkToggleButton *button, gpointer data); static void onTreeViewActivated(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data); static void panelIsosurfacesUpdate_surfaceProperties(); /* Global widgets. */ static GtkWidget *useButton; static GtkWidget *edit_window; static GtkWidget *edit_combo_color; static GtkWidget *vboxColorur; static GtkWidget *vboxToolShade; static GtkWidget *shadeCombo; static GtkWidget *auto_reorder; static GtkWidget *buttonAddSurface; static GtkWidget *buttonAddSpecial; static GtkWidget *buttonRemoveSurface; static GtkWidget *buttonEdit; static GtkWidget *buttonOpen; static GtkWidget *buttonConvert; static GtkWidget *checkAutoLoad; static GtkWidget *checkDrawIntra; static GtkWidget *valueIO; /* Global flags. */ static gboolean reverse_order = FALSE; static gboolean autoload_file = FALSE; /* New types. */ typedef void (*ChangesMethod)(GtkTreeIter *iter, gboolean recurse, gpointer data); /* Get the iter of the selected row. */ static gboolean getSelectedRow(GtkTreeIter *iter) { GtkTreeModel *model; GtkTreeSelection* tree_selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(isosurfaces_tree_model)); if (!gtk_tree_selection_get_selected(tree_selection, &model, iter)) return FALSE; return TRUE; } /* Call @method on iter depending on selection. - If there is no selection, changes are applied on all surfaces. - If selection is on a file, changes are applied on all surfaces on that file. - If selection is on a surface, changes are applied on all surfaces of the same file. */ static void applyChanges(ChangesMethod method, gpointer value) { gboolean valid; int type; gboolean validParent, validChild; GtkTreeIter iter, parent, child; DBG_fprintf(stderr, "Panel VisuSurfaces: run in the treeview to apply changes.\n"); valid = getSelectedRow(&iter); if (!valid) { DBG_fprintf(stderr, " | run on all row without recurse.\n"); /* Nothing is selected, we call the changing method on all surfaces. */ validParent = gtk_tree_model_get_iter_first (GTK_TREE_MODEL(isosurfaces_data_list), &parent); while (validParent) { DBG_fprintf(stderr, "Panel VisuSurfaces: find one parent.\n"); validChild = gtk_tree_model_iter_children(GTK_TREE_MODEL(isosurfaces_data_list), &child, &parent); while (validChild) { DBG_fprintf(stderr, "Panel VisuSurfaces: find one child.\n"); method(&child, FALSE, value); validChild = gtk_tree_model_iter_next (GTK_TREE_MODEL(isosurfaces_data_list), &child); } validParent = gtk_tree_model_iter_next (GTK_TREE_MODEL(isosurfaces_data_list), &parent); } } else { DBG_fprintf(stderr, " | run on all row of the current file.\n"); /* Something is selected, we try to find the parent file. */ gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), &iter, TYPE_COLUMN, &type, -1); if (type == SURFACE_TYPE_SURF) { valid = gtk_tree_model_iter_parent(GTK_TREE_MODEL(isosurfaces_data_list), &parent, &iter); g_return_if_fail(valid); } else parent = iter; /* We change the visibility of all child of parent. */ valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(isosurfaces_data_list), &iter, &parent); while (valid) { DBG_fprintf(stderr, "Panel VisuSurfaces: find one child.\n"); method(&iter, TRUE, value); valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(isosurfaces_data_list), &iter); } } } /* Change one element in the tree (visibility, pixbuf color...) for the given iter and if @nameRef is not NULL for also all surfaces whose resource's name is @nameRef. */ static void changeTreeViewElement(GtkTreeIter *iter, const gchar *nameRef, int columnId, gpointer value) { gchar *name; gboolean validParent, validChild; GtkTreeIter parent, child; g_return_if_fail(iter); DBG_fprintf(stderr, "Panel VisuSurfaces: change value of '%s' from column %d.\n", nameRef, columnId); gtk_tree_store_set(isosurfaces_data_list, iter, columnId, value, -1); if (!nameRef) return; /* Update the treestore, for all surfaces with the same name. */ validParent = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(isosurfaces_data_list), &parent); while (validParent) { validChild = gtk_tree_model_iter_children(GTK_TREE_MODEL(isosurfaces_data_list), &child, &parent); while (validChild) { gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), &child, NAME_COLUMN, &name, -1); DBG_fprintf(stderr, " | child '%s'\n", name); if (name && !strcmp(name, nameRef)) gtk_tree_store_set(isosurfaces_data_list, &child, columnId, value, -1); validChild = gtk_tree_model_iter_next(GTK_TREE_MODEL(isosurfaces_data_list), &child); } validParent = gtk_tree_model_iter_next(GTK_TREE_MODEL(isosurfaces_data_list), &parent); } DBG_fprintf(stderr, "Panel VisuSurfaces: OK.\n"); } /***********************/ /* Visibility Handling */ /***********************/ /* Change the visibility of one surface (given by its iter). The visibility is in value (using GPOINTER_TO_INT) and recurse is a flag to tell if changes must be propagated to all elements with the same name or not. */ static void showHideVisuSurfaces(GtkTreeIter *iter, gboolean recurse, gpointer value) { int surf_number; VisuSurfaces *surfaces; int type; gchar *name; g_return_if_fail(iter); /* Grep surface informations. */ gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), iter, NUMBER_COLUMN, &surf_number, DATA_SURF_COLUMN, &surfaces, NAME_COLUMN, &name, TYPE_COLUMN, &type, -1); if (type != SURFACE_TYPE_SURF) return; /* Update the treestore, for all surfaces with the same name. */ if (recurse) changeTreeViewElement(iter, name, SHOW_COLUMN, value); else gtk_tree_store_set(isosurfaces_data_list, iter, SHOW_COLUMN, value, -1); /* Update the surface properties. */ DBG_fprintf(stderr, "Panel VisuSurfaces: set visible property of" " surface %d to %d.\n", surf_number, GPOINTER_TO_INT(value)); visu_surfaces_setRendered(surfaces, surf_number, (gboolean)GPOINTER_TO_INT(value)); } /* Callback for the "Draw" check box. If the selected surface were drawn, hides it and uncheck the button. If it was hidden, shows it and check the button. */ void isosurfaces_tree_show_hide(GtkCellRendererToggle *cell_renderer, gchar *string_path, gpointer user_data _U_) { GtkTreePath* path = gtk_tree_path_new_from_string(string_path); GtkTreeIter iter; gboolean valid; valid = gtk_tree_model_get_iter(GTK_TREE_MODEL(isosurfaces_data_list), &iter, path); gtk_tree_path_free(path); if(!valid) return; DBG_fprintf(stderr, "Panel VisuSurfaces: toggle show box on '%s'.\n", string_path); /* We change the visibility of the surface (both resource and check box). */ showHideVisuSurfaces(&iter, TRUE, GINT_TO_POINTER(!gtk_cell_renderer_toggle_get_active(cell_renderer))); visu_gl_ext_surfaces_draw(visu_gl_ext_surfaces_getDefault()); VISU_REDRAW_ADD; } static void onMaskingToggled(GtkCellRendererToggle *cell_renderer _U_, gchar *string_path, gpointer user_data _U_) { GtkTreePath* path = gtk_tree_path_new_from_string(string_path); GtkTreeIter iter; gboolean valid, mask, rebuild; VisuSurfaces *surf; VisuSurfacesResources *res; int idSurf; VisuPlane **planes; valid = gtk_tree_model_get_iter(GTK_TREE_MODEL(isosurfaces_data_list), &iter, path); gtk_tree_path_free(path); g_return_if_fail(valid); DBG_fprintf(stderr, "Panel VisuSurfaces: toggle masking box on '%s'.\n", string_path); gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), &iter, NUMBER_COLUMN, &idSurf, MASKING_COLUMN, &mask, DATA_SURF_COLUMN, &surf, -1); gtk_tree_store_set(isosurfaces_data_list, &iter, MASKING_COLUMN, !mask, -1); res = visu_surfaces_getResourceById(surf, idSurf); if (res->sensitiveToPlanes == !mask) return; res->sensitiveToPlanes = !mask; rebuild = FALSE; /* Hide the polygons in the surface. */ planes = visu_ui_panel_planes_getAll(TRUE); if (planes[0]) rebuild = visu_surfaces_hide(surf, planes); g_free(planes); if (rebuild) VISU_REDRAW_ADD; } /** * visu_ui_panel_surfaces_showAll: * @show: TRUE to show all surfaces, FALSE to hide them. * * Shows or hides all surfaces and check their "draw" status in the panel accordingly. * * Returns: TRUE if surface list should be rebuild and redraw. **/ gboolean visu_ui_panel_surfaces_showAll(gboolean show) { applyChanges(showHideVisuSurfaces, GINT_TO_POINTER(show)); visu_gl_ext_surfaces_draw(visu_gl_ext_surfaces_getDefault()); VISU_REDRAW_ADD; return TRUE; } void onShowHideAllButton(GtkButton *button _U_, gpointer visibility) { gboolean reorder; reorder = visu_ui_panel_surfaces_showAll(GPOINTER_TO_INT(visibility)); if (reorder) VISU_REDRAW_ADD; } /******************************/ /* Color & material Handling */ /******************************/ /* Changes the colour for a specific surface identified by its iter. If recurse is TRUE, changes are also applied on surfaces with the same name. */ void changeSurfaceColor(GtkTreeIter *iter, gboolean recurse, gpointer colorComboBox) { GdkPixbuf *pixbuf; int id; VisuSurfaces *surfaces; gchar *name; ToolColor *color; float *rgba; float *material; g_return_if_fail(iter); /* Grep surface informations. */ gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), iter, DATA_SURF_COLUMN, &surfaces, NAME_COLUMN, &name, NUMBER_COLUMN, &id, -1); /* We get a color from the values of the ranges. */ material = visu_ui_color_combobox_getRangeMaterial(VISU_UI_COLOR_COMBOBOX(colorComboBox)); rgba = visu_ui_color_combobox_getRangeColor(VISU_UI_COLOR_COMBOBOX(colorComboBox)); color = tool_color_new(rgba); /* Change the pixbuf for all surfaces with the name @name. */ pixbuf = tool_color_get_stamp(color, TRUE); if (recurse) changeTreeViewElement(iter, name, PIXBUF_COLUMN, (gpointer)pixbuf); else gtk_tree_store_set(isosurfaces_data_list, iter, PIXBUF_COLUMN, (gpointer)pixbuf, -1); g_object_unref(pixbuf); /* Change the color & material. */ visu_surfaces_setColorAndMaterial(surfaces, id, color, material); g_free(material); g_free(rgba); g_free(color); } /* Callback for when the combo color is changed in the edit panel */ void isosurfaces_combo_selection_changed(VisuUiColorCombobox *combo, ToolColor *color _U_, gpointer data) { GtkTreeIter iter; gboolean valid; DBG_fprintf(stderr, "Panel VisuSurfaces: caught the 'color-selected' signal.\n"); if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data))) { valid = getSelectedRow(&iter); g_return_if_fail(valid); /* We only change the selected surface. */ changeSurfaceColor(&iter, TRUE, (gpointer)combo); } else /* We change all surfaces depending on the selected one. */ applyChanges(changeSurfaceColor, (gpointer)combo); visu_gl_ext_surfaces_draw(visu_gl_ext_surfaces_getDefault()); VISU_REDRAW_ADD; } static void onRangesChanged(VisuUiColorCombobox *colorComboBox, guint valId _U_, gpointer data) { gboolean valid; GtkTreeIter iter; DBG_fprintf(stderr, "Panel VisuSurfaces: caught the " "'[material:color]-value-changed' signal.\n"); if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data))) { valid = getSelectedRow(&iter); g_return_if_fail(valid); /* We only change the selected surface. */ changeSurfaceColor(&iter, TRUE, (gpointer)colorComboBox); } else /* We change all surfaces depending on the selected one. */ applyChanges(changeSurfaceColor, (gpointer)colorComboBox); visu_gl_ext_surfaces_draw(visu_gl_ext_surfaces_getDefault()); VISU_REDRAW_ADD; } static void onToolShadeChange(VisuUiShadeCombobox *combo _U_, ToolShade *shade, gpointer data _U_) { gboolean valid; GtkTreeIter iter, child; int type, surfId; VisuScalarField *field; VisuSurfaces *surf; float value, alpha; double minmax[2]; VisuSurfacesResources *res, *resNew; DBG_fprintf(stderr, "Panel VisuSurfaces: caught the " "'shade-selected' signal.\n"); valid = getSelectedRow(&iter); g_return_if_fail(valid); gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), &iter, TYPE_COLUMN, &type, DATA_FIELD_COLUMN, &field, -1); g_return_if_fail(type == SURFACE_TYPE_FILE_DENPOT && field); visu_scalar_field_getMinMax(field, minmax); alpha = sqrt((float)gtk_tree_model_iter_n_children (GTK_TREE_MODEL(isosurfaces_data_list), &iter)); /* For each children, we apply the shade. */ valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(isosurfaces_data_list), &child, &iter); while (valid) { gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), &child, TYPE_COLUMN, &type, POTENTIAL_COLUMN, &value, NUMBER_COLUMN, &surfId, DATA_SURF_COLUMN, &surf, -1); g_return_if_fail(type == SURFACE_TYPE_SURF); res = visu_surfaces_getResourceById(surf, surfId); if (res->surfnom) { resNew = visu_surfaces_resources_getFromName((const gchar*)0, (gboolean*)0); visu_surfaces_resources_copy(resNew, res); visu_surfaces_setResource(surf, surfId, resNew); res = resNew; } /* We change the colour. */ tool_shade_valueToRGB(shade, res->color->rgba, (value - minmax[0]) / (minmax[1] - minmax[0])); res->color->rgba[3] = exp(-alpha * (1. - (value - minmax[0]) / (minmax[1] - minmax[0]))); valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(isosurfaces_data_list), &child); } isosurfaces_update_data_list(&iter); VISU_REDRAW_ADD; } /** * visu_ui_panel_surfaces_editProperties: * @iter: the currently selected row iter (or NULL). * * Opens a new window allowing to edit surface properties. */ void visu_ui_panel_surfaces_editProperties(GtkTreeIter *iter) { GtkWidget *hbox, *label, *expand, *notebook, *radio; GSList *radiobuttonCycle_group; static GtkWidget *radioOne, *radioAll; gint type; if (!GTK_IS_WINDOW(edit_window)) { edit_window = gtk_dialog_new_with_buttons (_("Edit surface properties"), GTK_WINDOW(visu_ui_panel_getContainerWindow(VISU_UI_PANEL(panelSurfaces))), 0, GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT, NULL); gtk_window_set_default_size(GTK_WINDOW(edit_window), 320, -1); gtk_window_set_type_hint(GTK_WINDOW(edit_window), GDK_WINDOW_TYPE_HINT_UTILITY); gtk_window_set_skip_pager_hint(GTK_WINDOW(edit_window), TRUE); gtk_container_set_border_width(GTK_CONTAINER(edit_window), 3); notebook = gtk_notebook_new(); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(edit_window))), notebook, TRUE, TRUE, 0); /* Create the colour tab. */ vboxColorur = gtk_vbox_new(FALSE, 0); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vboxColorur, gtk_label_new(_("Color"))); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vboxColorur), hbox, FALSE, FALSE, 5); label = gtk_label_new(_("Apply on: ")); gtk_widget_set_name(label, "label_head_2"); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); radio = gtk_radio_button_new(NULL); gtk_radio_button_set_group(GTK_RADIO_BUTTON(radio), (GSList*)0); radiobuttonCycle_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), TRUE); gtk_box_pack_start(GTK_BOX(hbox), radio, TRUE, TRUE, 0); label = gtk_label_new(_("selected surface")); gtk_container_add(GTK_CONTAINER(radio), label); radioOne = radio; radio = gtk_radio_button_new(NULL); gtk_radio_button_set_group(GTK_RADIO_BUTTON(radio), radiobuttonCycle_group); radiobuttonCycle_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), FALSE); gtk_box_pack_start(GTK_BOX(hbox), radio, TRUE, TRUE, 0); label = gtk_label_new(_("all surfaces")); gtk_container_add(GTK_CONTAINER(radio), label); radioAll = radio; hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vboxColorur), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Color: ")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2); edit_combo_color = visu_ui_color_combobox_newWithRanges(TRUE); visu_ui_color_combobox_setExpanded(VISU_UI_COLOR_COMBOBOX(edit_combo_color), TRUE); gtk_box_pack_start(GTK_BOX(hbox), edit_combo_color, TRUE, TRUE, 2); expand = visu_ui_color_combobox_getRangeWidgets(VISU_UI_COLOR_COMBOBOX(edit_combo_color)); gtk_box_pack_start(GTK_BOX(vboxColorur), expand, FALSE, FALSE, 0); /* Set the callbacks. */ g_signal_connect(G_OBJECT(edit_window), "response", G_CALLBACK(gtk_widget_hide), (gpointer)0); g_signal_connect(G_OBJECT(edit_window), "delete-event", G_CALLBACK(onPropertiesClosed), (gpointer)0); g_signal_connect(G_OBJECT(edit_window), "destroy-event", G_CALLBACK(onPropertiesClosed), (gpointer)0); g_signal_connect(G_OBJECT(edit_combo_color), "color-selected", G_CALLBACK(isosurfaces_combo_selection_changed), (gpointer)radio); g_signal_connect(G_OBJECT(edit_combo_color), "material-value-changed", G_CALLBACK(onRangesChanged), (gpointer)radio); g_signal_connect(G_OBJECT(edit_combo_color), "color-value-changed", G_CALLBACK(onRangesChanged), (gpointer)radio); /* Create the shade tab. */ vboxToolShade = gtk_vbox_new(FALSE, 0); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vboxToolShade, gtk_label_new(_("Shade"))); label = gtk_label_new(_("Apply a shade to the current surfaces of" " the selected scalar field.")); gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_FILL); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_box_pack_start(GTK_BOX(vboxToolShade), label, FALSE, FALSE, 5); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vboxToolShade), hbox, FALSE, FALSE, 5); label = gtk_label_new(_("ToolShade: ")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); shadeCombo = visu_ui_shade_combobox_new(TRUE, TRUE); gtk_box_pack_start(GTK_BOX(hbox), shadeCombo, TRUE, TRUE, 0); /* Set the callbacks. */ g_signal_connect(G_OBJECT(shadeCombo), "shade-selected", G_CALLBACK(onToolShadeChange), (gpointer)0); gtk_widget_show_all(edit_window); } else gtk_window_present(GTK_WINDOW(edit_window)); /* Set the radio combo. */ if (iter) gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), iter, TYPE_COLUMN, &type, -1); else type = SURFACE_TYPE_FILE_DENPOT; gtk_widget_set_sensitive(radioOne, (type == SURFACE_TYPE_SURF)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioAll), (type != SURFACE_TYPE_SURF)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioOne), (type == SURFACE_TYPE_SURF)); panelIsosurfacesUpdate_surfaceProperties(); } static void panelIsosurfacesUpdate_surfaceProperties() { VisuSurfacesResources *res; gboolean valid; int current_surface_selected, type; GtkTreeIter iter; VisuSurfaces *surfaces; gint shadeId; float material[5]; res = (VisuSurfacesResources*)0; type = -1; valid = getSelectedRow(&iter); if(valid) { gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), &iter, DATA_SURF_COLUMN, &surfaces, TYPE_COLUMN, &type, NUMBER_COLUMN, ¤t_surface_selected, SHADE_COLUMN, &shadeId, -1); if (type == SURFACE_TYPE_SURF) res = visu_surfaces_getResourceById(surfaces, current_surface_selected); if (type != SURFACE_TYPE_FILE_DENPOT) shadeId = -1; } else { shadeId = -1; type = SURFACE_TYPE_SURF; } /* Set the default values but don't raise any change signal. */ if (res) { visu_ui_color_combobox_setRangeColor(VISU_UI_COLOR_COMBOBOX(edit_combo_color), res->color->rgba, FALSE); visu_ui_color_combobox_setRangeMaterial(VISU_UI_COLOR_COMBOBOX(edit_combo_color), res->material, FALSE); } else { material[0] = 0.2f; material[1] = 1.0f; material[2] = 0.5f; material[3] = 0.5f; material[4] = 0.0f; visu_ui_color_combobox_setRangeMaterial(VISU_UI_COLOR_COMBOBOX(edit_combo_color), material, FALSE); } /* Set widgets sensitive or not. */ if (vboxToolShade) { gtk_widget_set_sensitive(vboxToolShade, (type == SURFACE_TYPE_FILE_DENPOT)); gtk_combo_box_set_active(GTK_COMBO_BOX(shadeCombo), shadeId); } } static gboolean onPropertiesClosed(GtkWidget *widget, GdkEvent *event _U_, gpointer data _U_) { gtk_widget_hide(widget); return TRUE; } static void onEditPropertiesClicked(GtkButton *button _U_, gpointer data _U_) { GtkTreeIter iter; gboolean valid; DBG_fprintf(stderr, "Panel VisuSurfaces: clicked on properties button.\n"); valid = getSelectedRow(&iter); if (valid) visu_ui_panel_surfaces_editProperties(&iter); else visu_ui_panel_surfaces_editProperties((GtkTreeIter*)0); } /* See header for more info */ static void onOpenClicked(GtkButton *button _U_, gpointer data _U_) { char *file_choosed; #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkTooltips *tooltips = gtk_tooltips_new (); #endif GtkWidget *dialog; gboolean invalid, redraw; VisuData *dataObj; float trans[3] = {0.f, 0.f, 0.f}; VisuScalarFieldMethod *fmt; double box[6]; VisuBox *boxObj; GtkTreeIter iter; VisuSurfaces *surf; VisuScalarField *field; dialog = visu_ui_field_chooser_new((GtkWindow*)0); dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelSurfaces)); redraw = FALSE; invalid = TRUE; while(invalid) { switch(gtk_dialog_run(GTK_DIALOG(dialog))) { case GTK_RESPONSE_ACCEPT: file_choosed = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); fmt = visu_ui_field_chooser_getFileFormat(VISU_UI_FIELD_CHOOSER(dialog)); if (visu_ui_field_chooser_getFit(VISU_UI_FIELD_CHOOSER(dialog)) == VISU_UI_FIT_TO_BOX) boxObj = visu_boxed_getBox(VISU_BOXED(dataObj)); else boxObj = (VisuBox*)0; if(visu_ui_panel_surfaces_loadFile(file_choosed, boxObj, (GHashTable*)0, fmt)) { redraw = TRUE; invalid = FALSE; } break; default: invalid = FALSE; } } /* We update the VisuData bounding box. */ if (redraw && visu_ui_field_chooser_getFit(VISU_UI_FIELD_CHOOSER(dialog)) == VISU_UI_FIT_TO_SURFACE) { getSelectedRow(&iter); gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), &iter, DATA_SURF_COLUMN, &surf, DATA_FIELD_COLUMN, &field, -1); DBG_fprintf(stderr, "Panel Surfaces: update data bounding box.\n"); if (field) { visu_boxed_setBox(VISU_BOXED(dataObj), VISU_BOXED(field), FALSE); visu_box_setMargin(visu_boxed_getBox(VISU_BOXED(dataObj)), visu_node_array_getMaxElementSize(VISU_NODE_ARRAY(dataObj)) + visu_data_getAllNodeExtens(dataObj, (VisuBox*)0), TRUE); } else if (surf) visu_boxed_setBox(VISU_BOXED(dataObj), VISU_BOXED(surf), FALSE); visu_data_setXYZtranslation(dataObj, trans); g_signal_emit_by_name(G_OBJECT(dataObj), "PositionChanged", (VisuElement*)0, NULL); } /* Free everything. */ DBG_fprintf(stderr, "Panel Surfaces: free load dialog.\n"); g_free(box); gtk_widget_destroy(dialog); } static gboolean visu_ui_panel_surfaces_loadScalarField(const gchar *filename, GList **list, VisuScalarFieldMethod *meth, GHashTable *table) { gboolean valid; GError *error; GList *tmplst; g_return_val_if_fail(list, FALSE); error = (GError*)0; if (meth) valid = visu_scalar_field_method_load(meth, filename, list, &error); else valid = visu_scalar_field_new_fromFile(filename, list, table, &error); if (!valid) { if (error) g_error_free(error); return FALSE; } if (error) { visu_ui_raiseWarning(_("Loading a file"), error->message, (GtkWindow*)0); g_error_free(error); for (tmplst = *list; tmplst; tmplst = g_list_next(tmplst)) g_object_unref(G_OBJECT(tmplst->data)); g_list_free(*list); *list = (GList*)0; return TRUE; } return TRUE; } static gboolean visu_ui_panel_surfaces_loadSurface(const gchar *filename, VisuSurfaces **surf) { gboolean valid; GError *error; g_return_val_if_fail(surf, FALSE); error = (GError*)0; valid = visu_surfaces_loadFile(filename, surf, &error); if (!valid) { if (error) g_error_free(error); return FALSE; } if (error) { visu_ui_raiseWarning(_("Loading a file"), error->message, (GtkWindow*)0); g_error_free(error); g_object_unref(*surf); *surf = (VisuSurfaces*)0; return TRUE; } return TRUE; } /** * visu_ui_panel_surfaces_addField: * @field: (transfer full): a #VisuScalarField object. * @iter: (out caller-allocates): a location to store the iter. * * This routine can be used to add a #VisuScalarField to the tree * view. @iter is then populated with the row it has been inserted to. * * Since: 3.7 **/ void visu_ui_panel_surfaces_addField(VisuScalarField *field, GtkTreeIter *iter) { gchar *name, *label; double minmax[2]; name = g_path_get_basename(visu_scalar_field_getFilename(field)); visu_scalar_field_getMinMax(field, minmax); label = g_strdup_printf(_("%s\n " "Den./pot. data (min|max)\n %g | %g"), name, minmax[0], minmax[1]); gtk_list_store_append(fields_data_list, iter); gtk_list_store_set(fields_data_list, iter, VISU_UI_SURFACES_FIELD_LABEL, label, VISU_UI_SURFACES_FIELD_POINTER, field, -1); gtk_tree_store_append(isosurfaces_data_list, iter, (GtkTreeIter*)0); gtk_tree_store_set(isosurfaces_data_list, iter, NUMBER_COLUMN, -1, USE_SHOW_COLUMN, FALSE, DISPLAY_NAME_COLUMN, label, TYPE_COLUMN, SURFACE_TYPE_FILE_DENPOT, USE_POTENTIAL_COLUMN, FALSE, FILENAME_COLUMN, visu_scalar_field_getFilename(field), SHADE_COLUMN, -1, DATA_SURF_COLUMN, (VisuSurfaces*)0, DATA_FIELD_COLUMN, field, -1); DBG_fprintf(stderr, " | field %p.\n", (gpointer)field); g_free(label); g_free(name); } /** * visu_ui_panel_surfaces_addSurfaces: * @surf: (transfer full): a #VisuSurfaces object. * @name: a name @surf comes from. * @iter: (out caller-allocates): a location to store the iter. * * This routine can be used to add a #VisuSurfaces to the tree * view. @iter is then populated with the row it has been inserted to. * * Since: 3.7 **/ void visu_ui_panel_surfaces_addSurfaces(VisuSurfaces *surf, const gchar *name, GtkTreeIter *iter) { gchar *label; label = g_strdup_printf(_("%s\n " "Surfaces data"), name); gtk_tree_store_append(isosurfaces_data_list, iter, (GtkTreeIter*)0); gtk_tree_store_set(isosurfaces_data_list, iter, NUMBER_COLUMN, -1, USE_SHOW_COLUMN, FALSE, DISPLAY_NAME_COLUMN, label, TYPE_COLUMN, SURFACE_TYPE_FILE_SURF, USE_POTENTIAL_COLUMN, FALSE, FILENAME_COLUMN, name, SHADE_COLUMN, -1, DATA_SURF_COLUMN, surf, DATA_FIELD_COLUMN, (VisuScalarField*)0, -1); DBG_fprintf(stderr, " | surf %p.\n", (gpointer)surf); _update_surf_at_iter(iter, surf); if (visu_gl_ext_surfaces_add(visu_gl_ext_surfaces_getDefault(), surf)) visu_gl_ext_surfaces_draw(visu_gl_ext_surfaces_getDefault()); } /** * visu_ui_panel_surfaces_loadFile: * @file_name: (type filename): the file you want to try to load * @boxToFit: (allow-none): a #VisuBox object to fit to ; * @table: (allow-none): a set of different #Option (can be NULL). * @meth: a #VisuScalarFieldMethod object. * * Tries to load the given @file_name and if it succeeds, adds loaded surfaces * to the isosurfaces panel. If @file_name is a #VisuScalarField then, * @meth is used to load it. If @fitToBox is not %NULL, the load * surfaces or scalar fields are fit to it. * * Return value: TRUE in case of success. */ gboolean visu_ui_panel_surfaces_loadFile(const char* file_name, VisuBox *boxToFit, GHashTable *table, VisuScalarFieldMethod *meth) { VisuSurfaces *surf; GtkTreeIter iter/* , iter2 */; gchar *name; gboolean valid; /* gchar *filename; */ int type; GList *list, *tmplst; g_return_val_if_fail(file_name, FALSE); g_return_val_if_fail(isosurfaces_data_list, FALSE); list = (GList*)0; surf = (VisuSurfaces*)0; valid = visu_ui_panel_surfaces_loadSurface(file_name, &surf); if (valid) { if (!surf) return FALSE; type = SURFACE_TYPE_FILE_SURF; DBG_fprintf(stderr, "Panel VisuSurfaces: append surfaces %p.\n", (gpointer)surf); list = g_list_append(list, (gpointer)surf); } else { valid = visu_ui_panel_surfaces_loadScalarField(file_name, &list, meth, table); if (valid) { if (!list) return FALSE; type = SURFACE_TYPE_FILE_DENPOT; } } if (!valid) /* Not a density/potential file. */ return FALSE; if (boxToFit) { fitToBox = TRUE; if (type == SURFACE_TYPE_FILE_SURF) for (tmplst = list; tmplst; tmplst = g_list_next(tmplst)) visu_boxed_setBox(VISU_BOXED(tmplst->data), VISU_BOXED(boxToFit), TRUE); else for (tmplst = list; tmplst; tmplst = g_list_next(tmplst)) visu_boxed_setBox(VISU_BOXED(tmplst->data), VISU_BOXED(boxToFit), FALSE); } else fitToBox = FALSE; /* Before adding it to the tree, we may remove all identic already existing file. */ /* DBG_fprintf(stderr, "Panel VisuSurfaces: may remove an existing entry.\n"); */ /* valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(isosurfaces_data_list), */ /* &iter); */ /* while (valid) */ /* { */ /* gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), */ /* &iter, FILENAME_COLUMN, &filename, -1); */ /* iter2 = iter; */ /* valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(isosurfaces_data_list), */ /* &iter); */ /* if (!strcmp(filename, file_name)) */ /* panel_isosurfaces_remove(&iter2); */ /* } */ /* We create a root element for the file. */ DBG_fprintf(stderr, "Panel VisuSurfaces: add a new root entry '%s'.\n", file_name); if (type == SURFACE_TYPE_FILE_SURF) { name = g_path_get_basename(file_name); for (tmplst = list; tmplst; tmplst = g_list_next(tmplst)) visu_ui_panel_surfaces_addSurfaces(VISU_SURFACES(tmplst->data), name, &iter); g_free(name); } else for (tmplst = list; tmplst; tmplst = g_list_next(tmplst)) visu_ui_panel_surfaces_addField((VisuScalarField*)tmplst->data, &iter); g_list_free(list); gtk_tree_selection_select_iter (gtk_tree_view_get_selection(GTK_TREE_VIEW(isosurfaces_tree_model)), &iter); return TRUE; } /* refresh tree view info according to loaded surfaces by surfaces.c refresh gl display */ static void isosurfaces_update_data_list(GtkTreeIter *iter) { int i, n, type, *ids, pos; VisuSurfacesResources *res; const gchar *current_surface; GdkPixbuf *pixbuf; float *potentialData; GtkTreeIter childIter, selectedIter; gboolean valid; GtkTreePath *path; GtkTreeRowReference* selectedRow; const gchar *display_name; VisuSurfaces *surf; g_return_if_fail(isosurfaces_data_list); /* Save the selected item. */ valid = getSelectedRow(&selectedIter); if (valid) { DBG_fprintf(stderr, "Panel VisuSurfaces: store selected iter.\n"); path = gtk_tree_model_get_path(GTK_TREE_MODEL(isosurfaces_data_list), &selectedIter); selectedRow = gtk_tree_row_reference_new(GTK_TREE_MODEL(isosurfaces_data_list), path); gtk_tree_path_free(path); } else selectedRow = (GtkTreeRowReference*)0; DBG_fprintf(stderr, "Panel VisuSurfaces: get surf & type for given iter.\n"); gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), iter, TYPE_COLUMN, &type, DATA_SURF_COLUMN, &surf, -1); /* We remove all children from the given iter. */ DBG_fprintf(stderr, "Panel VisuSurfaces: remove children from the iter.\n"); valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(isosurfaces_data_list), &childIter, iter); while (valid) { gtk_tree_store_remove(isosurfaces_data_list, &childIter); valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(isosurfaces_data_list), &childIter, iter); } /* No surfaces are currently associated to the iter. */ if (!surf) { if (selectedRow) gtk_tree_row_reference_free(selectedRow); return; } ids = visu_surfaces_getSortedById(surf); n = visu_surfaces_getN(surf); DBG_fprintf(stderr, "Panel VisuSurfaces: append %d children to the iter.\n", n); potentialData = visu_surfaces_getPropertyFloat(surf, VISU_SURFACES_PROPERTY_POTENTIAL); for(i = 0; i < n; i++) { current_surface = visu_surfaces_getName(surf, ids[i]); if (!current_surface) display_name = VISU_UI_SURFACE_NAME_CHOOSE; else display_name = current_surface; DBG_fprintf(stderr, " | surface '%s' %d.\n", current_surface, ids[i]); res = visu_surfaces_getResourceById(surf, ids[i]); g_return_if_fail(res); pixbuf = tool_color_get_stamp(res->color, TRUE); pos = visu_surfaces_getPosition(surf, ids[i]); gtk_tree_store_append(isosurfaces_data_list, &childIter, iter); gtk_tree_store_set(isosurfaces_data_list, &childIter, NUMBER_COLUMN, ids[i], SHOW_COLUMN, res->rendered, USE_SHOW_COLUMN, TRUE, NAME_COLUMN, current_surface, DISPLAY_NAME_COLUMN, display_name, EDIT_NAME_COLUMN, TRUE, COLOR_NAME_COLUMN, "blue", TYPE_COLUMN, SURFACE_TYPE_SURF, POTENTIAL_COLUMN, potentialData[pos], EDIT_POTENTIAL_COLUMN, (type == SURFACE_TYPE_FILE_DENPOT), USE_POTENTIAL_COLUMN, TRUE, DATA_SURF_COLUMN, surf, MASKING_COLUMN, res->sensitiveToPlanes, PIXBUF_COLUMN, pixbuf, -1); /* We count down the ref on the pixbuf, since one was added when created and one was added when insering into the tree_model. But we want only one ref count. */ g_object_unref(pixbuf); if (type == SURFACE_TYPE_FILE_DENPOT) gtk_tree_store_set(isosurfaces_data_list, &childIter, COLOR_POTENTIAL_COLUMN, "blue", -1); } g_free(ids); /* Expand children. */ path = gtk_tree_model_get_path(GTK_TREE_MODEL(isosurfaces_data_list), iter); gtk_tree_view_expand_row(GTK_TREE_VIEW(isosurfaces_tree_model), path, TRUE); gtk_tree_path_free(path); DBG_fprintf(stderr, "Panel VisuSurfaces: restore selected item.\n"); if (selectedRow) { path = gtk_tree_row_reference_get_path(selectedRow); gtk_tree_row_reference_free(selectedRow); if (path) { valid = gtk_tree_model_get_iter(GTK_TREE_MODEL(isosurfaces_data_list), &childIter, path); gtk_tree_path_free(path); if (valid) gtk_tree_selection_select_iter (gtk_tree_view_get_selection(GTK_TREE_VIEW(isosurfaces_tree_model)), &childIter); } } } /* See header file for more info */ static gboolean isosurfaces_show_next() { GtkTreeIter iter, selected_iter, child_iter; GtkTreeSelection* selected_surf; selected_surf = gtk_tree_view_get_selection(GTK_TREE_VIEW(isosurfaces_tree_model)); if(!gtk_tree_selection_get_selected(selected_surf, NULL, &iter)) return FALSE; if (gtk_tree_model_iter_has_child(GTK_TREE_MODEL(isosurfaces_data_list), &iter)) { gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(isosurfaces_data_list), &child_iter, &iter, 0); iter = child_iter; } selected_iter = iter; if(reverse_order == FALSE) { if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(isosurfaces_data_list), &iter)) { reverse_order = TRUE; if (!gtk_tree_model_iter_previous(GTK_TREE_MODEL(isosurfaces_data_list), &selected_iter)) return FALSE; iter = selected_iter; } } else { if (!gtk_tree_model_iter_previous(GTK_TREE_MODEL(isosurfaces_data_list), &iter)) { reverse_order = FALSE; if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(isosurfaces_data_list), &selected_iter)) return FALSE; iter = selected_iter; } } /* Set the selection to the new row. */ gtk_tree_selection_select_iter(selected_surf, &iter); /* Set all surfaces, set show to FALSE. */ visu_ui_panel_surfaces_showAll(FALSE); /* For the selected surface, set show to TRUE. */ showHideVisuSurfaces(&iter, FALSE, GINT_TO_POINTER(TRUE)); visu_gl_ext_surfaces_draw(visu_gl_ext_surfaces_getDefault()); VISU_REDRAW_ADD; return TRUE; } static void onPlayStop(gpointer data) { gtk_button_set_label(GTK_BUTTON(data), _("Play")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data), FALSE); } /* Callback for the "play" button. Registers the above function to be called at a specified time interval. */ static void isosurfaces_play(GtkToggleButton *play_stop, GtkWidget *time_interval) { static int event_id = 0; if(gtk_toggle_button_get_active(play_stop) == TRUE) { gtk_button_set_label(GTK_BUTTON(play_stop), _("Stop")); event_id = g_timeout_add_full(G_PRIORITY_DEFAULT, gtk_spin_button_get_value(GTK_SPIN_BUTTON(time_interval)), isosurfaces_show_next, play_stop, onPlayStop); } else g_source_remove(event_id); } /* Sets up the model/view architecture used to store the surfaces info. */ void isosurfaces_make_tree_view() { GtkWidget *image; GtkCellRenderer *cell_show = gtk_cell_renderer_toggle_new(); GtkCellRenderer *renderer; GtkTreeViewColumn *column = NULL; isosurfaces_data_list = gtk_tree_store_new (N_COLUMNS, G_TYPE_INT, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_INT, G_TYPE_FLOAT, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_INT, G_TYPE_BOOLEAN, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_STRING); isosurfaces_tree_model = gtk_tree_view_new_with_model (GTK_TREE_MODEL (isosurfaces_data_list)); g_signal_connect(cell_show, "toggled", G_CALLBACK(isosurfaces_tree_show_hide), NULL); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("File / label"), renderer, "markup", DISPLAY_NAME_COLUMN, "foreground", COLOR_NAME_COLUMN, "editable", EDIT_NAME_COLUMN, NULL); g_signal_connect(G_OBJECT(renderer), "edited", G_CALLBACK(onNameEdited), (gpointer)0); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_alignment(column, 0); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_append_column (GTK_TREE_VIEW (isosurfaces_tree_model), column); column = gtk_tree_view_column_new_with_attributes("", cell_show, "active", SHOW_COLUMN, "visible", USE_SHOW_COLUMN, NULL); gtk_tree_view_column_set_expand(column, FALSE); gtk_tree_view_column_set_alignment(column, 0.5); gtk_tree_view_append_column (GTK_TREE_VIEW (isosurfaces_tree_model), column); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes(_("Value"), renderer, "text", POTENTIAL_COLUMN, "editable", EDIT_POTENTIAL_COLUMN, "foreground", COLOR_POTENTIAL_COLUMN, "visible", USE_POTENTIAL_COLUMN, NULL); gtk_tree_view_column_set_sort_column_id(GTK_TREE_VIEW_COLUMN(column), POTENTIAL_COLUMN); g_signal_connect(G_OBJECT(renderer), "edited", G_CALLBACK(onPotentialValueEdited), (gpointer)0); gtk_tree_view_append_column(GTK_TREE_VIEW(isosurfaces_tree_model), column); renderer = gtk_cell_renderer_pixbuf_new (); column = gtk_tree_view_column_new_with_attributes(_("Color"), renderer, "pixbuf", PIXBUF_COLUMN, NULL); image = gtk_image_new_from_stock(GTK_STOCK_SELECT_COLOR, GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_widget_show(image); gtk_tree_view_column_set_widget(column, image); gtk_tree_view_append_column(GTK_TREE_VIEW(isosurfaces_tree_model), column); colorColumn = column; renderer = gtk_cell_renderer_toggle_new(); column = gtk_tree_view_column_new_with_attributes(_("Plane masking"), renderer, "active", MASKING_COLUMN, "visible", USE_POTENTIAL_COLUMN, NULL); image = create_pixmap((GtkWidget*)0, "stock-masking.png"); gtk_widget_show(image); gtk_tree_view_column_set_widget(column, image); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(onMaskingToggled), NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(isosurfaces_tree_model), column); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (isosurfaces_tree_model), TRUE); g_signal_connect(gtk_tree_view_get_selection(GTK_TREE_VIEW(isosurfaces_tree_model)), "changed", G_CALLBACK(onTreeSelectionChanged), (gpointer)0); g_signal_connect(G_OBJECT(isosurfaces_tree_model), "button-release-event", G_CALLBACK(onTreeViewClicked), (gpointer)0); g_signal_connect(G_OBJECT(isosurfaces_tree_model), "row-activated", G_CALLBACK(onTreeViewActivated), (gpointer)0); } /* Callback for time interval value spin button. Changes the frequency used to play the surfaces. */ void isosurfaces_change_time_interval(GtkWidget *spin_button _U_, GtkWidget *play_stop) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(play_stop), FALSE); } /** * visu_ui_panel_surfaces_setUsed: * @used: a boolean. * * Change the status of the isosurface extension, drawn or not. * * Returns: TRUE if the OpenGLAskForReDraw signal should be emitted. */ gboolean visu_ui_panel_surfaces_setUsed(gboolean used) { if (!visu_gl_ext_setActive(VISU_GL_EXT(visu_gl_ext_surfaces_getDefault()), used)) return FALSE; visu_gl_ext_surfaces_draw(visu_gl_ext_surfaces_getDefault()); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(useButton), used); return TRUE; } /* Callback for the check button "use isosurfaces". Enables/disables the drawing of isosurfaces by V_Sim's core. */ void isosurfaces_switch_use(GtkToggleButton *togglebutton, gpointer user_data _U_) { gboolean redraw; redraw = visu_ui_panel_surfaces_setUsed(gtk_toggle_button_get_active(togglebutton)); if(redraw) VISU_REDRAW_ADD; } /** * visu_ui_panel_surfaces_updateAtIter: * @iter: an iterator. * * Reset the shown surfaces at @iter. * * Since: 3.7 **/ void visu_ui_panel_surfaces_updateAtIter(GtkTreeIter *iter) { VisuSurfaces *surf; DBG_fprintf(stderr, "Panel Surfaces: update view at iter.\n"); gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), iter, DATA_SURF_COLUMN, &surf, -1); _update_surf_at_iter(iter, surf); } static void _update_surf_at_iter(GtkTreeIter *iter, VisuSurfaces *surf) { VisuPlane **planes; /* Update the tree view. */ isosurfaces_update_data_list(iter); /* Hide the polygons in the surface. */ if (surf) { planes = visu_ui_panel_planes_getAll(TRUE); if (planes[0]) visu_surfaces_hide(surf, planes); g_free(planes); } } /** * visu_ui_panel_surfaces_add: * @filename: the name of the scalar field from which to add a surface ; * @value: the iso value ; * @name: the name used to identify the new surface (can be NULL). * * Create and add a surface created from the given scalar field. This * field must already be loaded. If @name is not given, the surface will * be called "Isosurface id" where id is an increasing counter. */ void visu_ui_panel_surfaces_add(gchar *filename, float value, gchar *name) { GtkTreeIter iter; gboolean valid, found; gchar *file; VisuSurfaces *surf; g_return_if_fail(filename); DBG_fprintf(stderr, "Panel VisuSurfaces: add a new surface (%g) for '%s'.\n", value, filename); valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(isosurfaces_data_list), &iter); /* We look for the iter with the given file. */ found = FALSE; while (valid && !found) { gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), &iter, FILENAME_COLUMN, &file, -1); found = (!strcmp(file, filename)); if (!found) valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(isosurfaces_data_list), &iter); } if (valid && found) { valid = panel_isosurfaces_add(&iter, TRUE, value, name, &surf); if (valid) _update_surf_at_iter(&iter, surf); } else g_warning("Cannot find the given scalar field '%s'.", filename); } /** * visu_ui_panel_surfaces_computeAuto: * @iter: a #GtkTreeIter. * * Add new surfaces to the entry pointed by @iter. This entry must be * a #VisuScalarField object. This routine will redraw if necessary. * * Since: 3.7 * * Returns: (transfer none): a #VisuSurfaces object. **/ const VisuSurfaces* visu_ui_panel_surfaces_computeAuto(GtkTreeIter *iter) { VisuSurfaces *surf; gboolean rebuild; rebuild = panel_isosurfaces_add(iter, FALSE, 0.f, (const gchar*)0, &surf); if (rebuild) { _update_surf_at_iter(iter, surf); VISU_REDRAW_ADD; } return surf; } /** * visu_ui_panel_surfaces_compute: * @iter: a #GtkTreeIter. * @values: (array length=nValues): values to create surfaces at. * @names: (array length=nValues): names for the new surfaces. * @nValues: number of surfaces to create. * * This routine will generate @nValues surfaces for the * #VisuScalarField located at @iter. It will redraw if necessary. * * Since: 3.7 * * Returns: (transfer none): a #VisuSurfaces object. **/ const VisuSurfaces* visu_ui_panel_surfaces_compute(GtkTreeIter *iter, const float *values, const gchar **names, guint nValues) { VisuSurfaces *surf; gboolean rebuild; VisuScalarField *field; guint i; int nb; g_return_val_if_fail(nValues, (const VisuSurfaces*)0); rebuild = panel_isosurfaces_add(iter, TRUE, values[0], names[0], &surf); gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), iter, DATA_FIELD_COLUMN, &field, -1); for (i = 1; i < nValues; i++) { nb = visu_surfaces_getNewId(surf); rebuild = visu_surfaces_createFromScalarField(&surf, field, values[i], nb, names[i]) || rebuild; } if (rebuild) { _update_surf_at_iter(iter, surf); VISU_REDRAW_ADD; } return surf; } static gboolean panel_isosurfaces_add(GtkTreeIter *iter, gboolean setValue, float value, const gchar *name, VisuSurfaces **surf) { double mimax[2]; int type, nb; gboolean valid, new; VisuScalarField *field; VisuSurfacesResources *res; int blue[4] = {0, 24, 185, 196}, red[4] = {185, 24, 0, 196}; gchar *resName; GtkTreePath *path; gint* ind; g_return_val_if_fail(iter && surf, FALSE); *surf = (VisuSurfaces*)0; gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), iter, TYPE_COLUMN, &type, DATA_SURF_COLUMN, surf, DATA_FIELD_COLUMN, &field, -1); g_return_val_if_fail(type == SURFACE_TYPE_FILE_DENPOT && field, FALSE); nb = visu_surfaces_getNewId(*surf); if (setValue) valid = visu_surfaces_createFromScalarField(surf, field, value, nb, name); else { visu_scalar_field_getMinMax(field, mimax); /* For densities, this create only one surface. For wavefunctions, it create two and set their style accordingly. */ if (mimax[0] * mimax[1] < 0.f && MIN(ABS(mimax[0]), ABS(mimax[1])) / MAX(ABS(mimax[0]), ABS(mimax[1])) > 0.2) { path = gtk_tree_model_get_path(GTK_TREE_MODEL(isosurfaces_data_list), iter); ind = gtk_tree_path_get_indices(path); resName = g_strdup_printf(_("Negative (%d)"), ind[0]); res = visu_surfaces_resources_getFromName(resName, &new); if (new) { res->color = tool_color_addIntRGBA(blue); res->rendered = TRUE; } valid = visu_surfaces_createFromScalarField(surf, field, mimax[0] / 2., nb, resName); g_free(resName); resName = g_strdup_printf(_("Positive (%d)"), ind[0]); res = visu_surfaces_resources_getFromName(resName, &new); if (new) { res->color = tool_color_addIntRGBA(red); res->rendered = TRUE; } nb = visu_surfaces_getNewId(*surf); valid = valid && visu_surfaces_createFromScalarField(surf, field, mimax[1] / 2., nb, resName); g_free(resName); gtk_tree_path_free(path); } else valid = visu_surfaces_createFromScalarField(surf, field, (mimax[0] + mimax[1]) / 2., nb, (gchar*)0); } gtk_tree_store_set(isosurfaces_data_list, iter, DATA_SURF_COLUMN, *surf, -1); if (*surf) visu_gl_ext_surfaces_add(visu_gl_ext_surfaces_getDefault(), *surf); return valid; } static void isosurfaces_remove_field(GtkListStore *list, VisuScalarField *field) { gboolean valid; GtkTreeIter iter; VisuScalarField *tmpField; valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list), &iter); while (valid) { gtk_tree_model_get(GTK_TREE_MODEL(list), &iter, VISU_UI_SURFACES_FIELD_POINTER, &tmpField, -1); if (tmpField == field) { gtk_list_store_remove(list, &iter); return; } valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(list), &iter); } } static gboolean panel_isosurfaces_remove(GtkTreeIter *iter) { int type, idSurf; VisuSurfaces *surf; VisuScalarField *field; gboolean empty, valid; GtkTreeIter iterFather, iterChild; g_return_val_if_fail(iter, FALSE); gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), iter, TYPE_COLUMN, &type, DATA_SURF_COLUMN, &surf, DATA_FIELD_COLUMN, &field, NUMBER_COLUMN, &idSurf, -1); switch (type) { case SURFACE_TYPE_FILE_DENPOT: /* If the denpot has children, we remove them. And don't delete the data. */ if (gtk_tree_model_iter_has_child(GTK_TREE_MODEL(isosurfaces_data_list), iter)) { valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(isosurfaces_data_list), &iterChild, iter); while (valid) { gtk_tree_store_remove(isosurfaces_data_list, &iterChild); valid = gtk_tree_model_iter_children (GTK_TREE_MODEL(isosurfaces_data_list), &iterChild, iter); } if (surf) g_object_unref(surf); gtk_tree_store_set(isosurfaces_data_list, iter, DATA_SURF_COLUMN, (VisuSurfaces*)0, -1); visu_ui_value_io_setSensitiveSave(VISU_UI_VALUE_IO(valueIO), FALSE); return TRUE; } return FALSE; case SURFACE_TYPE_FILE_SURF: /* We remove the entry from the tree. */ gtk_tree_store_remove(isosurfaces_data_list, iter); if (field) isosurfaces_remove_field(fields_data_list, field); /* We free the memory used by these surfaces. */ if (surf) g_object_unref(surf); if (field) g_object_unref(field); /* We need to rebuild the order list. */ return TRUE; case SURFACE_TYPE_SURF: /* We change the surface list. */ empty = visu_surfaces_remove(surf, idSurf); if (empty) { gtk_tree_model_iter_parent(GTK_TREE_MODEL(isosurfaces_data_list), &iterFather, iter); gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), &iterFather, TYPE_COLUMN, &type, -1); if (type == SURFACE_TYPE_FILE_SURF) gtk_tree_store_remove(isosurfaces_data_list, &iterFather); else { gtk_tree_store_set(isosurfaces_data_list, &iterFather, DATA_SURF_COLUMN, (VisuSurfaces*)0, -1); /* We remove the entry from the tree. */ gtk_tree_store_remove(isosurfaces_data_list, iter); } g_object_unref(surf); } else { /* We remove the entry from the tree. */ gtk_tree_store_remove(isosurfaces_data_list, iter); } /* We need to rebuild the order list. */ return TRUE; default: g_warning("Wrong type for the selected entry."); } return FALSE; } /* Creates the main panel. */ void isosurfaces_create_gtk_interface(VisuUiPanel *visu_ui_panel) { #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkTooltips *tooltips = gtk_tooltips_new (); #endif GtkWidget *top_hbox = gtk_hbox_new (FALSE, 0); GtkWidget *h_box3 = gtk_hbox_new (FALSE, 0); GtkWidget *show_all = gtk_button_new(); GtkWidget *show_none = gtk_button_new(); GtkWidget *play_stop = gtk_toggle_button_new_with_label(_("Play")); GtkWidget *time_interval = gtk_spin_button_new_with_range (50, 2000, 10); GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL); /* GtkWidget *reorder_button = gtk_button_new_with_label("Re-order"); */ GtkWidget *image_color = create_pixmap((GtkWidget*)0, "stock_effects-object-colorize_20.png"); GtkWidget *image_show = create_pixmap((GtkWidget*)0, "stock-select-all_20.png"); GtkWidget *image_hide = create_pixmap((GtkWidget*)0, "stock-unselect-all_20.png"); GtkWidget *tree_vbox = gtk_vbox_new(FALSE, 0); GtkWidget *tree_hbox = gtk_hbox_new(FALSE, 0); GtkWidget *image, *align, *vbox; vbox = gtk_vbox_new(FALSE, 0); useButton = gtk_check_button_new_with_mnemonic(_("_Use isosurfaces")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(useButton), visu_gl_ext_getActive(VISU_GL_EXT(visu_gl_ext_surfaces_getDefault()))); gtk_box_pack_start(GTK_BOX(vbox), useButton, FALSE, FALSE, 0); buttonEdit = gtk_button_new(); gtk_widget_set_sensitive(buttonEdit, FALSE); gtk_container_add(GTK_CONTAINER(buttonEdit), image_color); gtk_container_add(GTK_CONTAINER(show_all), image_show); gtk_container_add(GTK_CONTAINER(show_none), image_hide); /* The line about loading files. */ gtk_box_pack_start(GTK_BOX(vbox), top_hbox, FALSE, FALSE, 0); align = gtk_alignment_new(0., 0.5, 1., 0.); gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, 10, 0); gtk_box_pack_start(GTK_BOX(top_hbox), align, TRUE, TRUE, 2); checkAutoLoad = gtk_check_button_new_with_mnemonic(_("Auto _load data file")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkAutoLoad), autoload_file); gtk_widget_set_tooltip_text(checkAutoLoad, _("Try to load a data file whenever a new V_Sim file is loaded." " If the new file contains a scalar field, it is loaded, otherwise" " a surface file is tested using a .surf extension on the file name.")); gtk_container_add(GTK_CONTAINER(align), checkAutoLoad); buttonOpen = gtk_button_new(); buttonConvert = gtk_button_new_with_mnemonic(_("_Convert")); gtk_widget_set_tooltip_text(buttonOpen, _("Load a surface file or a potential/density file.")); gtk_box_pack_end(GTK_BOX(top_hbox), buttonOpen, FALSE, FALSE, 2); image = gtk_image_new_from_stock(GTK_STOCK_OPEN, GTK_ICON_SIZE_BUTTON); gtk_container_add(GTK_CONTAINER( buttonOpen), image); gtk_widget_set_tooltip_text(buttonConvert, _("Several built-in tools to create .surf files.")); gtk_box_pack_end(GTK_BOX(top_hbox), buttonConvert, FALSE, FALSE, 2); isosurfaces_make_tree_view (); isosurfaces_gtk_vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), isosurfaces_gtk_vbox, TRUE, TRUE, 0); auto_reorder = gtk_check_button_new_with_mnemonic(_("_Reorder on the fly")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(auto_reorder), FALSE); /* gtk_widget_set_sensitive(reorder_button, FALSE); */ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(play_stop), FALSE); g_signal_connect(G_OBJECT(auto_reorder), "toggled", G_CALLBACK(onReorderToggled), (gpointer)0); /* g_signal_connect(G_OBJECT(reorder_button), "clicked", */ /* G_CALLBACK(isosurfaces_rebuild_gl_list_in_order_and_redraw), NULL); */ g_signal_connect(G_OBJECT(buttonOpen), "clicked", G_CALLBACK(onOpenClicked), NULL); g_signal_connect(G_OBJECT(buttonConvert), "clicked", G_CALLBACK(visu_ui_panel_surfaces_tools_init), NULL); g_signal_connect(G_OBJECT(buttonEdit), "clicked", G_CALLBACK(onEditPropertiesClicked), (gpointer)0); g_signal_connect(G_OBJECT(show_all), "clicked", G_CALLBACK(onShowHideAllButton), GINT_TO_POINTER(1)); g_signal_connect(G_OBJECT(show_none), "clicked", G_CALLBACK(onShowHideAllButton), GINT_TO_POINTER(0)); g_signal_connect(G_OBJECT(play_stop), "toggled", G_CALLBACK(isosurfaces_play), time_interval); g_signal_connect(G_OBJECT(time_interval), "value_changed", G_CALLBACK(isosurfaces_change_time_interval), play_stop); g_signal_connect(G_OBJECT(useButton), "toggled", G_CALLBACK(isosurfaces_switch_use), NULL); /* The main viewport. */ gtk_box_pack_start(GTK_BOX(isosurfaces_gtk_vbox), tree_hbox, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(tree_hbox), scrolled_window, TRUE, TRUE, 0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN); gtk_container_add (GTK_CONTAINER (scrolled_window), isosurfaces_tree_model); gtk_box_pack_start(GTK_BOX(tree_hbox), tree_vbox, FALSE, FALSE, 2); gtk_widget_set_tooltip_text(show_none, _("Hides all surfaces")); gtk_box_pack_start(GTK_BOX(tree_vbox), show_none, FALSE, FALSE, 2); gtk_widget_set_tooltip_text(show_all, _("Shows all surfaces")); gtk_box_pack_start(GTK_BOX(tree_vbox), show_all, FALSE, FALSE, 2); gtk_widget_set_tooltip_text(buttonEdit, _("Change color and material properties.")); gtk_box_pack_end(GTK_BOX(tree_vbox), buttonEdit, FALSE, FALSE, 2); align = gtk_alignment_new(0.5, 1., 0., 0.); gtk_box_pack_start(GTK_BOX(tree_vbox), align, TRUE, TRUE, 2); buttonAddSurface = gtk_button_new(); gtk_widget_set_sensitive(buttonAddSurface, FALSE); gtk_widget_set_tooltip_text(buttonAddSurface, _("Add a new surface.")); g_signal_connect(G_OBJECT(buttonAddSurface), "clicked", G_CALLBACK(onAddButtonClicked), NULL); gtk_container_add(GTK_CONTAINER(align), buttonAddSurface); image = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_BUTTON); gtk_container_add(GTK_CONTAINER(buttonAddSurface), image); buttonAddSpecial = gtk_button_new(); gtk_widget_set_sensitive(buttonAddSpecial, FALSE); gtk_widget_set_tooltip_text(buttonAddSpecial, _("Add many surfaces to the list of surfaces.")); g_signal_connect(G_OBJECT(buttonAddSpecial), "clicked", G_CALLBACK(onAddSpecialButtonClicked), NULL); gtk_box_pack_start(GTK_BOX(tree_vbox), buttonAddSpecial, FALSE, FALSE, 2); image = gtk_image_new_from_stock ("gtk-execute", GTK_ICON_SIZE_BUTTON); gtk_container_add(GTK_CONTAINER(buttonAddSpecial), image); align = gtk_alignment_new(0.5, 0., 0., 0.); gtk_box_pack_start(GTK_BOX(tree_vbox), align, TRUE, TRUE, 2); buttonRemoveSurface = gtk_button_new (); gtk_widget_set_sensitive(buttonRemoveSurface, FALSE); gtk_widget_set_tooltip_text(buttonRemoveSurface, _("Remove selected surface or file.")); g_signal_connect(G_OBJECT(buttonRemoveSurface), "clicked", G_CALLBACK(onRemoveButtonClicked), NULL); gtk_container_add(GTK_CONTAINER(align), buttonRemoveSurface); image = gtk_image_new_from_stock ("gtk-remove", GTK_ICON_SIZE_BUTTON); gtk_container_add (GTK_CONTAINER(buttonRemoveSurface), image); /* The surfaces tool line. */ gtk_box_pack_start(GTK_BOX(isosurfaces_gtk_vbox), h_box3, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(play_stop, _("Starts/stops showing isosurfaces at specified rate")); gtk_box_pack_start(GTK_BOX(h_box3), play_stop, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(h_box3), gtk_label_new(_("@")), FALSE, FALSE, 0); gtk_widget_set_tooltip_text(time_interval, _("Selects rate to show isosurfaces")); gtk_entry_set_width_chars(GTK_ENTRY(time_interval), 3); gtk_box_pack_start(GTK_BOX(h_box3), time_interval, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(h_box3), gtk_label_new(_("ms")), FALSE, FALSE, 0); valueIO = visu_ui_value_io_new(visu_ui_panel_getContainerWindow(VISU_UI_PANEL(panelSurfaces)), _("Import iso-values from an existing XML file."), _("Export iso-values to the current XML file."), _("Export iso-values to a new XML file.")); visu_ui_value_io_connectOnOpen(VISU_UI_VALUE_IO(valueIO), loadXMLFile); visu_ui_value_io_connectOnSave(VISU_UI_VALUE_IO(valueIO), visu_ui_panel_surfaces_exportXMLFile); align = gtk_alignment_new(1., 0.5, 1., 0.); gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, 20, 0); gtk_container_add(GTK_CONTAINER(align), valueIO); gtk_box_pack_end(GTK_BOX(h_box3), align, TRUE, TRUE, 0); /* The option line. */ h_box3 = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(isosurfaces_gtk_vbox), h_box3, FALSE, FALSE, 0); checkDrawIntra = gtk_check_button_new_with_mnemonic(_("Draw _intra surfaces")); gtk_widget_set_tooltip_text(checkDrawIntra, _("Draw the interior of iso-surfaces with the complementary colour.")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkDrawIntra), visu_gl_ext_surfaces_getDrawIntra(visu_gl_ext_surfaces_getDefault())); g_signal_connect(G_OBJECT(checkDrawIntra), "toggled", G_CALLBACK(onDrawIntraChanged), (gpointer)0); gtk_box_pack_start(GTK_BOX(h_box3), checkDrawIntra, FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(h_box3), auto_reorder, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(auto_reorder, _("Automatically re-orders surfaces in back to front order" " whenever camera is modified (can be slow but get rid of" " transparency problems). This has no effect if the" " transparency option of the OpenGL panel is set")); gtk_widget_show_all(vbox); gtk_container_add(GTK_CONTAINER(visu_ui_panel), vbox); } /** * visu_ui_panel_surfaces_parseXMLFile: * @filename: a location to read the XML data. * @error: a location to store possible error. * * This routine reads an XML file and setup the resources and the * isovalues to the selected row accordingly. * * Returns: TRUE on success. */ gboolean visu_ui_panel_surfaces_parseXMLFile(const gchar *filename, GError **error) { gboolean valid; gchar *path; GtkTreeIter iter; VisuSurfaces *surfaces; VisuScalarField *field; int type; /* VisuData *dataObj; */ g_return_val_if_fail(getSelectedRow(&iter), FALSE); gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), &iter, TYPE_COLUMN, &type, DATA_SURF_COLUMN, &surfaces, DATA_FIELD_COLUMN, &field, -1); g_return_val_if_fail(type == SURFACE_TYPE_FILE_DENPOT, FALSE); path = tool_path_normalize(filename); valid = visu_surfaces_parseXMLFile(filename, &surfaces, field, error); if (valid) { gtk_tree_store_set(isosurfaces_data_list, &iter, DATA_SURF_COLUMN, surfaces, -1); _update_surf_at_iter(&iter, surfaces); /* dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelSurfaces)); */ /* g_return_val_if_fail(dataObj, FALSE); */ /* isosurfaces_rebuild_gl_list(visu_data_getBox(dataObj)); */ } g_free(path); return valid; } static gboolean loadXMLFile(const gchar *filename, GError **error) { if (visu_ui_panel_surfaces_parseXMLFile(filename, error)) { /* Update the sensitivity. */ visu_ui_value_io_setSensitiveSave(VISU_UI_VALUE_IO(valueIO), TRUE); /* We ask for redraw. */ VISU_REDRAW_ADD; return TRUE; } else return FALSE; } /** * visu_ui_panel_surfaces_exportXMLFile: * @filename: a filename to export to. * @error: (allow-none): a location to store an error. * * Export to @filename the list of isosurfaces values of the selected * scalar-field file. * * Since: 3.7 * * Returns: TRUE if everything goes right. **/ gboolean visu_ui_panel_surfaces_exportXMLFile(const gchar *filename, GError **error) { GtkTreeIter iter, child; int type, n, id; float *values; gboolean valid; VisuSurfacesResources **res; VisuSurfaces *surf; if (!getSelectedRow(&iter)) return TRUE; gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), &iter, TYPE_COLUMN, &type, DATA_SURF_COLUMN, &surf, -1); g_return_val_if_fail(type == SURFACE_TYPE_FILE_DENPOT && surf, FALSE); n = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(isosurfaces_data_list), &iter); values = g_malloc(sizeof(float) * n); res = g_malloc(sizeof(VisuSurfacesResources*) * n); valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(isosurfaces_data_list), &child, &iter); n = 0; while (valid) { gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), &child, POTENTIAL_COLUMN, values + n, NUMBER_COLUMN, &id, -1); res[n] = visu_surfaces_getResourceById(surf, id); valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(isosurfaces_data_list), &child); n += 1; } valid = visu_surfaces_exportXMLFile(filename, values, res, n, error); g_free(res); g_free(values); return valid; } /* static VisuSurfaces** getAllVisuSurfacesList() */ /* { */ /* int n; */ /* gboolean valid; */ /* GtkTreeIter iter; */ /* VisuSurfaces **surfaces; */ /* n = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(isosurfaces_data_list), */ /* (GtkTreeIter*)0); */ /* surfaces = g_malloc(sizeof(VisuSurfaces*) * (n + 1)); */ /* n = 0; */ /* valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(isosurfaces_data_list), &iter); */ /* while (valid) */ /* { */ /* gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), */ /* &iter, DATA_SURF_COLUMN, surfaces + n, -1); */ /* /\* In case the surface n is NULL, we don't count it. *\/ */ /* if (surfaces[n]) */ /* n += 1; */ /* valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(isosurfaces_data_list), &iter); */ /* } */ /* surfaces[n] = (VisuSurfaces*)0; */ /* DBG_fprintf(stderr, "Panel VisuSurfaces: get list of all surfaces (%d).\n", n); */ /* return surfaces; */ /* } */ static void onSizeChanged(VisuBox *box, gfloat extens _U_, gpointer user_data _U_) { gboolean valid; GtkTreeIter iter; VisuScalarField *field; VisuSurfaces *surf; DBG_fprintf(stderr, "Panel VisuSurfaces: caught a 'SizeChanged' signal.\n"); /* We recompute the scalar fields and isosurfaces if the fitToBox flag is TRUE. */ if (fitToBox) for (valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(isosurfaces_data_list), &iter); valid; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(isosurfaces_data_list), &iter)) { gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), &iter, DATA_FIELD_COLUMN, &field, DATA_SURF_COLUMN, &surf, -1); if (surf) visu_boxed_setBox(VISU_BOXED(surf), VISU_BOXED(box), TRUE); if (field) visu_boxed_setBox(VISU_BOXED(field), VISU_BOXED(box), FALSE); } } static void onDrawIntraChanged(GtkToggleButton *button, gpointer data _U_) { if (disableCallbacks) return; if (visu_gl_ext_surfaces_setDrawIntra(visu_gl_ext_surfaces_getDefault(), gtk_toggle_button_get_active(button))) { visu_gl_ext_surfaces_draw(visu_gl_ext_surfaces_getDefault()); VISU_REDRAW_ADD; } } static void onResourcesChanged(GObject *object _U_, VisuData *dataObj _U_, gpointer data _U_) { /* We change the check boxes. */ disableCallbacks = TRUE; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkDrawIntra), visu_gl_ext_surfaces_getDrawIntra(visu_gl_ext_surfaces_getDefault())); disableCallbacks = FALSE; } /* Callback to set the interface insensitive whenever a file hasn't been loaded. */ static void onDataReady(VisuObject *visu _U_, VisuData *dataObj, VisuGlView *view _U_, gpointer data _U_) { if (dataObj) { DBG_fprintf(stderr, "Panel VisuSurfaces: caught 'dataRendered' signal," " attaching signals.\n"); hide_signal = g_signal_connect(G_OBJECT(dataObj), "AskForShowHide", G_CALLBACK(onAskForHideNodes), (gpointer)0); box_signal = g_signal_connect(G_OBJECT(visu_boxed_getBox(VISU_BOXED(dataObj))), "SizeChanged", G_CALLBACK(onSizeChanged), (gpointer)0); } } static void onDataNotReady(VisuObject *visu _U_, VisuData *dataObj, VisuGlView *view _U_, gpointer data _U_) { g_signal_handler_disconnect(G_OBJECT(dataObj), hide_signal); g_signal_handler_disconnect(G_OBJECT(visu_boxed_getBox(VISU_BOXED(dataObj))), box_signal); } static void onTreeSelectionChanged(GtkTreeSelection *tree, gpointer data _U_) { gboolean res; GtkTreeModel *model; GtkTreeIter iter; int type; gboolean empty, hasChildren; DBG_fprintf(stderr, "Panel VisuSurfaces: catch 'changed' signal from " "the gtkTreeSelection.\n"); res = gtk_tree_selection_get_selected(tree, &model, &iter); if (res) { gtk_tree_model_get(model, &iter, TYPE_COLUMN, &type, -1); hasChildren = (type == SURFACE_TYPE_FILE_DENPOT) && gtk_tree_model_iter_has_child(GTK_TREE_MODEL(isosurfaces_data_list), &iter); } else { type = -1; hasChildren = FALSE; } empty = !gtk_tree_model_get_iter_first(GTK_TREE_MODEL(isosurfaces_data_list), &iter); gtk_widget_set_sensitive(buttonRemoveSurface, (type >= 0)); gtk_widget_set_sensitive(buttonAddSurface, (type == SURFACE_TYPE_FILE_DENPOT)); gtk_widget_set_sensitive(buttonAddSpecial, (type == SURFACE_TYPE_FILE_DENPOT)); gtk_widget_set_sensitive(buttonEdit, !empty); visu_ui_value_io_setSensitiveOpen(VISU_UI_VALUE_IO(valueIO), (type == SURFACE_TYPE_FILE_DENPOT)); visu_ui_value_io_setSensitiveSave(VISU_UI_VALUE_IO(valueIO), (type == SURFACE_TYPE_FILE_DENPOT && hasChildren)); if (GTK_IS_WINDOW(edit_window)) panelIsosurfacesUpdate_surfaceProperties(); } static void onAddButtonClicked(GtkButton *button _U_, gpointer data _U_) { gboolean valid; GtkTreeIter iter; valid = getSelectedRow(&iter); g_return_if_fail(valid); visu_ui_panel_surfaces_computeAuto(&iter); } static void onAddSpecialButtonClicked(GtkButton *button _U_, gpointer data _U_) { gboolean rebuild, valid; GtkTreeIter iter; float *values; int nbValues; VisuSurfaces *surf; VisuScalarField *field; int type, i; double mimax[2]; gchar *name; GtkWidget *dialog, *progress; char mess[50]; GList *lst, *children; valid = getSelectedRow(&iter); g_return_if_fail(valid); surf = (VisuSurfaces*)0; gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), &iter, TYPE_COLUMN, &type, DATA_SURF_COLUMN, &surf, DATA_FIELD_COLUMN, &field, -1); g_return_if_fail(type == SURFACE_TYPE_FILE_DENPOT && field); visu_scalar_field_getMinMax(field, mimax); values = (float*)0; name = (gchar*)0; dialog = visu_ui_panel_surfaces_generateValues(&nbValues, &values, &name, (float)mimax[0], (float)mimax[1]); rebuild = FALSE; if (!dialog) return; progress = (GtkWidget*)0; children = gtk_container_get_children (GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog)))); for (lst = children; lst; lst = lst->next) { gtk_widget_set_sensitive(GTK_WIDGET(lst->data), FALSE); if (GTK_IS_PROGRESS_BAR(lst->data)) progress = GTK_WIDGET(lst->data); } g_list_free(children); for (i = 0; i < nbValues; i++) { sprintf(mess, "%d/%d", i + 1, nbValues); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress), mess); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress), (float)i/(float)nbValues); visu_ui_wait(); rebuild = panel_isosurfaces_add(&iter, TRUE, values[i], name, &surf) || rebuild; } gtk_widget_destroy(dialog); if (values) g_free(values); if (name) g_free(name); visu_ui_value_io_setSensitiveSave(VISU_UI_VALUE_IO(valueIO), TRUE); if (rebuild) { _update_surf_at_iter(&iter, surf); VISU_REDRAW_ADD; } } static void onRemoveButtonClicked(GtkButton *button _U_, gpointer data _U_) { gboolean rebuild, valid; GtkTreeIter iter; valid = getSelectedRow(&iter); g_return_if_fail(valid); rebuild = panel_isosurfaces_remove(&iter); if (rebuild) VISU_REDRAW_ADD; } static void onNameEdited(GtkCellRendererText *cellrenderertext _U_, gchar *path, gchar *text, gpointer user_data _U_) { GtkTreeIter iter; gboolean status, new; int type, surfId; VisuSurfaces *surf; VisuSurfacesResources *res, *res_old; GdkPixbuf *pixbuf; gchar *display_name; VisuPlane **planes; if (!strcmp(text, VISU_UI_SURFACE_NAME_STR)) return; status = gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(isosurfaces_data_list), &iter, path); g_return_if_fail(status); /* We get the VisuSurfaces of the edited object. */ gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), &iter, DATA_SURF_COLUMN, &surf, NUMBER_COLUMN, &surfId, TYPE_COLUMN, &type, -1); g_return_if_fail(type == SURFACE_TYPE_SURF); g_return_if_fail(surf); /* Save previous resource. */ res_old = visu_surfaces_getResourceById(surf, surfId); DBG_fprintf(stderr, "Panel VisuSurfaces: old resources %p (%s).\n", (gpointer)res_old, res_old->surfnom); /* We change the resource of the edited surface. */ res = visu_surfaces_resources_getFromName(text, &new); DBG_fprintf(stderr, "Panel VisuSurfaces: new resources %p (%s).\n", (gpointer)res, res->surfnom); /* If the resource is new, we copy the value of previous resource into the new. */ if (new) visu_surfaces_resources_copy(res, res_old); /* We set the new resource (may free the old one). */ visu_surfaces_setResource(surf, surfId, res); if (!new) { /* We need to change the visibility and color of the surface since the new resource is different from old one. */ pixbuf = tool_color_get_stamp(res->color, TRUE); gtk_tree_store_set(isosurfaces_data_list, &iter, PIXBUF_COLUMN, (gpointer)pixbuf, MASKING_COLUMN, res->sensitiveToPlanes, SHOW_COLUMN, res->rendered, -1); g_object_unref(pixbuf); /* Hide the polygons in the surface. */ planes = visu_ui_panel_planes_getAll(TRUE); if (planes[0]) visu_surfaces_hide(surf, planes); g_free(planes); } if (!res->surfnom) display_name = VISU_UI_SURFACE_NAME_CHOOSE; else display_name = res->surfnom; gtk_tree_store_set(isosurfaces_data_list, &iter, DISPLAY_NAME_COLUMN, display_name, NAME_COLUMN, text, -1); VISU_REDRAW_ADD; } static void onPotentialValueEdited(GtkCellRendererText *cellrenderertext _U_, gchar *path, gchar *text, gpointer user_data _U_) { GtkTreeIter iterFather; GtkTreeIter iter; GtkTreePath *treePath; float new_value = atof(text); VisuSurfaces *surf; VisuScalarField *field; int type, idSurf; double minmax[2]; gboolean status, empty, new; gchar *name; VisuSurfacesResources *res, *res_old; status = gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(isosurfaces_data_list), &iter, path); g_return_if_fail(status); gtk_tree_model_iter_parent(GTK_TREE_MODEL(isosurfaces_data_list), &iterFather, &iter); gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), &iterFather, DATA_FIELD_COLUMN, &field, DATA_SURF_COLUMN, &surf, TYPE_COLUMN, &type, -1); g_return_if_fail(type == SURFACE_TYPE_FILE_DENPOT); g_return_if_fail(surf && field); visu_scalar_field_getMinMax(field, minmax); g_return_if_fail(new_value >= minmax[0] && new_value <= minmax[1]); gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), &iter, NAME_COLUMN, &name, NUMBER_COLUMN, &idSurf, -1); /* We save the ressource of the surface if it is a private resource. */ res = visu_surfaces_getResourceById(surf, idSurf); res_old = visu_surfaces_resources_getFromName(res->surfnom, &new); DBG_fprintf(stderr, "Panel VisuSurfaces: remove surface with id %d ('%s').\n", idSurf, res->surfnom); /* If the resource is new, we copy the value of previous resource into the new. */ if (new) visu_surfaces_resources_copy(res_old, res); else res_old = (VisuSurfacesResources*)0; /* We remove the surface. */ empty = visu_surfaces_remove(surf, idSurf); if (empty) { g_object_unref(surf); surf = (VisuSurfaces*)0; } /* We add the new surface. */ DBG_fprintf(stderr, "Panel VisuSurfaces: create surface with id %d.\n", idSurf); status = visu_surfaces_createFromScalarField(&surf, field, new_value, idSurf, name); /* We get and copy the surface resource if the old one was private. */ if (res_old) { res = visu_surfaces_getResourceById(surf, idSurf); visu_surfaces_resources_copy(res, res_old); visu_surfaces_resources_free(res_old); } /* We read the surf pointer if this one has changed. */ gtk_tree_store_set(isosurfaces_data_list, &iterFather, DATA_SURF_COLUMN, surf, -1); _update_surf_at_iter(&iterFather, surf); /* We reselect the right iter. */ treePath = gtk_tree_path_new_from_string(path); gtk_tree_selection_select_path (gtk_tree_view_get_selection(GTK_TREE_VIEW(isosurfaces_tree_model)), treePath); gtk_tree_path_free(treePath); VISU_REDRAW_ADD; } static void onReorderToggled(GtkToggleButton *toggle, gpointer data _U_) { visu_gl_ext_surfaces_setOnTheFlyOrdering(visu_gl_ext_surfaces_getDefault(), (gtk_toggle_button_get_active(toggle))?visu_ui_panel_getView(VISU_UI_PANEL(panelSurfaces)):(VisuGlView*)0); } static void onDataFocused(GObject *visu _U_, VisuData *dataObj, gpointer data _U_) { GtkTreeIter iter; gboolean valid, rebuild, *flag; int type, i, *ids, n; VisuSurfaces *surf; VisuScalarField *field; gchar *fileCpy, *fileExtPosition; GString *dataFile; float isoValues[256], *potentialData; int nIsoValues; const gchar *isoNames[256]; double minmax[2]; DBG_fprintf(stderr, "Panel Surfaces: caught the 'DataFocused'" " signal.\n | setting sensititvity.\n"); if (dataObj) { gtk_widget_set_sensitive(isosurfaces_gtk_vbox, TRUE); gtk_widget_set_sensitive(buttonOpen, TRUE); gtk_widget_set_sensitive(buttonConvert, TRUE); } else { gtk_widget_set_sensitive(isosurfaces_gtk_vbox, FALSE); gtk_widget_set_sensitive(buttonOpen, FALSE); gtk_widget_set_sensitive(buttonConvert, FALSE); } DBG_fprintf(stderr, " | update list of surfaces and fields.\n"); /* Store all isovalues into isoValues array. */ nIsoValues = 0; /* Remove all scalar-fields. */ rebuild = FALSE; valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(isosurfaces_data_list), &iter); while (valid) { gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), &iter, DATA_FIELD_COLUMN, &field, DATA_SURF_COLUMN, &surf, TYPE_COLUMN, &type, -1); g_return_if_fail(type == SURFACE_TYPE_FILE_DENPOT || type == SURFACE_TYPE_FILE_SURF); /* If the data is a field, we store all its values and names. */ if (surf && type == SURFACE_TYPE_FILE_DENPOT) { ids = visu_surfaces_getSortedById(surf); n = visu_surfaces_getN(surf); potentialData = visu_surfaces_getPropertyFloat (surf, VISU_SURFACES_PROPERTY_POTENTIAL); for (i = 0; i < n; i++) { isoValues[nIsoValues] = potentialData[ids[i]]; /* If a name is given, we can keep it since it won't be freed. */ isoNames[nIsoValues] = visu_surfaces_getName(surf, ids[i]); nIsoValues = MIN(255, nIsoValues + 1); } g_free(ids); } DBG_fprintf(stderr, " | remove a non persistent scalar field.\n"); if (surf) { visu_gl_ext_surfaces_remove(visu_gl_ext_surfaces_getDefault(), surf); g_object_unref(surf); } if (field) g_object_unref(field); rebuild = TRUE; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(isosurfaces_data_list), &iter); } gtk_tree_store_clear(GTK_TREE_STORE(isosurfaces_data_list)); gtk_list_store_clear(GTK_LIST_STORE(fields_data_list)); /* If the flag of autoload is not checked or no data is available, we return. */ if (!dataObj || !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkAutoLoad))) { /* If rebuild is TRUE, we rebuild the list to empty. */ if (rebuild) { DBG_fprintf(stderr, "Panel VisuSurfaces: reorder and build the OpenGL list.\n"); visu_gl_ext_surfaces_draw(visu_gl_ext_surfaces_getDefault()); } return; } /* Read if the new file has the VISU_SCALAR_FIELD_DEFINED_IN_STRUCT_FILE flag. */ flag = (gboolean*)g_object_get_data(G_OBJECT(dataObj), VISU_SCALAR_FIELD_DEFINED_IN_STRUCT_FILE); fileCpy = g_strdup(visu_data_getFile(dataObj, 0, (ToolFileFormat**)0)); if (!flag) { /* We try to find a surf file with the right name. */ fileExtPosition = g_strrstr(fileCpy, "."); if (fileExtPosition) *fileExtPosition = '\0'; dataFile = g_string_new(""); g_string_printf(dataFile, "%s.%s", fileCpy, "surf"); g_free(fileCpy); DBG_fprintf(stderr, "Panel VisuSurfaces: try to load a new surface file" " ('%s') from the name of the rendered file.\n", dataFile->str); fileCpy = dataFile->str; g_string_free(dataFile, FALSE); if (!g_file_test(fileCpy, G_FILE_TEST_EXISTS)) { g_free(fileCpy); fileCpy = (gchar*)0; DBG_fprintf(stderr, " | file doesn't exist.\n"); } } if (fileCpy) { rebuild = visu_ui_panel_surfaces_loadFile(fileCpy, visu_boxed_getBox(VISU_BOXED(dataObj)), (GHashTable*)0, (VisuScalarFieldMethod*)0); g_free(fileCpy); /* We create the surfaces for the values readed from isoValues. */ valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(isosurfaces_data_list), &iter); if (valid) { gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), &iter, DATA_FIELD_COLUMN, &field, TYPE_COLUMN, &type, -1); if (type == SURFACE_TYPE_FILE_DENPOT) { visu_scalar_field_getMinMax(field, minmax); for (i = 0; i < nIsoValues; i++) if (isoValues[i] > minmax[0] && isoValues[i] < minmax[1]) panel_isosurfaces_add(&iter, TRUE, isoValues[i], isoNames[i], &surf); } _update_surf_at_iter(&iter, surf); } } } /** * visu_ui_panel_surfaces_hide: * @planes: an array of planes to be applied (NULL terminated). * * Must be called after the initialisation of the plane subpanel. It applies the * masking scheme of planes on current surfaces. * * Returns: TRUE if the surface should be rebuilt. */ gboolean visu_ui_panel_surfaces_hide(VisuPlane ** planes) { gboolean valid; GtkTreeIter iter; VisuSurfaces *surf; gboolean rebuild; DBG_fprintf(stderr, "Panel VisuSurfaces: apply hiding scheme.\n"); g_return_val_if_fail(planes, FALSE); /* For each polygons, we compute if it is masked by a plane or not. */ rebuild = FALSE; valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(isosurfaces_data_list), &iter); while (valid) { gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), &iter, DATA_SURF_COLUMN, &surf, -1); if (surf) rebuild = visu_surfaces_hide(surf, planes) || rebuild; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(isosurfaces_data_list), &iter); } return rebuild; } static void onAskForHideNodes(VisuData *visuData _U_, gboolean *redraw, gpointer data _U_) { VisuPlane **planes; DBG_fprintf(stderr, "Panel VisuSurfaces: caught the 'AskForShowHide' signal.\n"); planes = visu_ui_panel_planes_getAll(TRUE); *redraw = visu_ui_panel_surfaces_hide(planes) || *redraw; g_free(planes); } static gboolean onPopupClicked(GtkWidget *widget, GdkEventButton *event _U_, gpointer user_data _U_) { gtk_widget_destroy(widget); return FALSE; } static gboolean onTreeViewClicked(GtkWidget *widget, GdkEventButton *event, gpointer user_data _U_) { gboolean valid; GtkTreePath *path; GtkTreeIter iter; int type, row; VisuScalarField *field; GtkWidget *win, *vbox, *wd, *table, *align; gchar *name, *markup; const gchar *comment; gint x, y; GList *options, *tmplst; if (event->button != 3) return FALSE; DBG_fprintf(stderr, "Panel VisuSurfaces: right clic detected.\n"); valid = gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), (gint)event->x, (gint)event->y, &path, (GtkTreeViewColumn**)0, (gint*)0, (gint*)0); if (!valid) return FALSE; valid = gtk_tree_model_get_iter(GTK_TREE_MODEL(isosurfaces_data_list), &iter, path); gtk_tree_path_free(path); if (!valid) return FALSE; gtk_tree_model_get(GTK_TREE_MODEL(isosurfaces_data_list), &iter, DATA_FIELD_COLUMN, &field, TYPE_COLUMN, &type, -1); if (type != SURFACE_TYPE_FILE_DENPOT) return FALSE; g_return_val_if_fail(field, FALSE); /* Ok, now, we have the scalar field. We create a popup window with info. */ win = gtk_window_new(GTK_WINDOW_POPUP); gtk_widget_set_events(win, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK); gtk_grab_add(win); #if GTK_MAJOR_VERSION > 2 gdk_device_get_position(event->device, NULL, &x, &y); #else gdk_display_get_pointer(gdk_screen_get_display(gtk_widget_get_screen(widget)), (GdkScreen**)0, &x, &y, NULL); #endif gtk_window_move(GTK_WINDOW(win), x, y); g_signal_connect(G_OBJECT(win), "button-press-event", G_CALLBACK(onPopupClicked), (gpointer)0); gtk_container_set_border_width(GTK_CONTAINER(win), 20); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(win), vbox); /* Print the File name. */ name = g_path_get_basename(visu_scalar_field_getFilename(field)); markup = g_markup_printf_escaped("%s", name); g_free(name); wd = gtk_label_new(""); gtk_misc_set_alignment(GTK_MISC(wd), 0., 0.5); gtk_label_set_markup(GTK_LABEL(wd), markup); g_free(markup); gtk_box_pack_start(GTK_BOX(vbox), wd, FALSE, FALSE, 0); /* Print a list of all interesting characteristics of the file. */ align = gtk_alignment_new(0., 0.5, 1., 1.); gtk_alignment_set_padding(GTK_ALIGNMENT(align), 15, 0, 15, 0); gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, FALSE, 0); options = visu_scalar_field_getAllOptions(field); table = gtk_table_new(1 + g_list_length(options), 2, FALSE); gtk_container_add(GTK_CONTAINER(align), table); wd = gtk_label_new(""); gtk_misc_set_alignment(GTK_MISC(wd), 1., 0.5); gtk_label_set_markup(GTK_LABEL(wd), _("Comment:")); gtk_table_attach(GTK_TABLE(table), wd, 0, 1, 0, 1, GTK_FILL, GTK_SHRINK, 5, 0); comment = visu_scalar_field_getCommentary(field); if (comment) wd = gtk_label_new(comment); else wd = gtk_label_new(_("None")); gtk_misc_set_alignment(GTK_MISC(wd), 0., 0.5); gtk_table_attach(GTK_TABLE(table), wd, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 5, 0); row = 1; tmplst = options; while(tmplst) { wd = gtk_label_new(""); gtk_misc_set_alignment(GTK_MISC(wd), 1., 0.5); markup = g_markup_printf_escaped("%s:", tool_option_getName((ToolOption*)tmplst->data)); gtk_label_set_markup(GTK_LABEL(wd), markup); g_free(markup); gtk_table_attach(GTK_TABLE(table), wd, 0, 1, row, row + 1, GTK_FILL, GTK_SHRINK, 5, 0); wd = gtk_label_new(""); gtk_misc_set_alignment(GTK_MISC(wd), 0., 0.5); markup = tool_option_getValueAndLabel((ToolOption*)tmplst->data); gtk_label_set_markup(GTK_LABEL(wd), markup); g_free(markup); gtk_table_attach(GTK_TABLE(table), wd, 1, 2, row, row + 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 5, 0); row += 1; tmplst = g_list_next(tmplst); } g_list_free(options); gtk_widget_show_all(win); return FALSE; } static void onTreeViewActivated(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data _U_) { GtkTreeIter iter; /* We do something only if the color column is activated for a surface. */ if (column != colorColumn) return; if (gtk_tree_path_get_depth(path) < 2) return; if (gtk_tree_model_get_iter(gtk_tree_view_get_model(tree_view), &iter, path)) visu_ui_panel_surfaces_editProperties(&iter); } /** * visu_ui_panel_surfaces_getFields: * * This method gives read access to the #GtkListStore used to store * the scalar field files. * * Returns: (transfer none): the #GtkListStore used by this panel to * store its scalar fields. It should be considered read-only. */ GtkListStore* visu_ui_panel_surfaces_getFields() { return fields_data_list; } struct GenerateWidgets_struct { GtkWidget *spin_start; GtkWidget *spin_end; GtkWidget *spin_step; GtkWidget *spin_delta; }; static void onSpecialModeToggled(GtkToggleButton *button, gpointer data) { gtk_widget_set_sensitive(GTK_WIDGET(data), gtk_toggle_button_get_active(button)); } static void onGenerateChanged(GtkSpinButton *spin, gpointer data) { struct GenerateWidgets_struct *wds; float delta; wds = (struct GenerateWidgets_struct*)data; g_return_if_fail(wds); delta = gtk_spin_button_get_value(GTK_SPIN_BUTTON(wds->spin_end)) - gtk_spin_button_get_value(GTK_SPIN_BUTTON(wds->spin_start)); if (spin == GTK_SPIN_BUTTON(wds->spin_step) || spin != GTK_SPIN_BUTTON(wds->spin_delta)) gtk_spin_button_set_value(GTK_SPIN_BUTTON(wds->spin_delta), delta / gtk_spin_button_get_value(GTK_SPIN_BUTTON (wds->spin_step))); if (spin == GTK_SPIN_BUTTON(wds->spin_delta) || spin != GTK_SPIN_BUTTON(wds->spin_step)) gtk_spin_button_set_value(GTK_SPIN_BUTTON(wds->spin_step), delta / gtk_spin_button_get_value(GTK_SPIN_BUTTON (wds->spin_delta))); } /** * visu_ui_panel_surfaces_generateValues: * @nbValues: a location of an integer to store the number of generated values ; * @values: a pointer on a float array. The target of this pointer must be * NULL and it will be allocated after a call to this method. Use * g_free() after use to free it. * @name: a pointer to store a name. The target of this pointer must be * NULL on enter. It is associated only if a name is given. * @minVal: the minimum value for the range ; * @maxVal: the maximum value for the range. * * This method opens a little dialog window that is made to help the * user enter a list of values for creation of iso-surfaces. These values * are generated between @minVal and @maxVal. * * Returns: (transfer full): the dialog widget. */ GtkWidget* visu_ui_panel_surfaces_generateValues(int *nbValues, float **values, gchar **name, float minVal, float maxVal) { GtkWidget *dialog, *table; float value, incr; #define MAX_NB_VALUES 99 struct GenerateWidgets_struct wds; GtkWidget *spin_start; GtkWidget *spin_end; GtkWidget *spin_step; GtkWidget *spin_delta; GtkWidget *radioStep, *radioDelta; GtkWidget *entry, *progress; GSList *radiobuttonCycle_group; g_return_val_if_fail(nbValues && values && !*values && name && !*name, (GtkWidget*)0); dialog = gtk_dialog_new_with_buttons (_("Generate iso-values"), NULL, GTK_DIALOG_MODAL, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); table = gtk_table_new(6, 2, FALSE); spin_start = gtk_spin_button_new_with_range(minVal, maxVal, 0.0000001); g_signal_connect(G_OBJECT(spin_start), "value_changed", G_CALLBACK(onGenerateChanged), (gpointer)&wds); spin_end = gtk_spin_button_new_with_range(minVal, maxVal, 0.0000001); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_end), maxVal); g_signal_connect(G_OBJECT(spin_end), "value_changed", G_CALLBACK(onGenerateChanged), (gpointer)&wds); spin_step = gtk_spin_button_new_with_range(2, MAX_NB_VALUES, 1); g_signal_connect(G_OBJECT(spin_step), "value_changed", G_CALLBACK(onGenerateChanged), (gpointer)&wds); spin_delta = gtk_spin_button_new_with_range(0.000001, maxVal - minVal, (maxVal - minVal) / 200); g_signal_connect(G_OBJECT(spin_delta), "value_changed", G_CALLBACK(onGenerateChanged), (gpointer)&wds); wds.spin_start = spin_start; wds.spin_end = spin_end; wds.spin_step = spin_step; wds.spin_delta = spin_delta; gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_step), 10); radioStep = gtk_radio_button_new_with_label(NULL, _("Number of steps:")); gtk_radio_button_set_group(GTK_RADIO_BUTTON(radioStep), (GSList*)0); radiobuttonCycle_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radioStep)); gtk_table_attach(GTK_TABLE(table), radioStep, 0, 1, 2, 3, (GtkAttachOptions)0, (GtkAttachOptions)0, 0, 0); g_signal_connect(G_OBJECT(radioStep), "toggled", G_CALLBACK(onSpecialModeToggled), (gpointer)spin_step); radioDelta = gtk_radio_button_new_with_label(NULL, _("Delta of steps:")); gtk_radio_button_set_group(GTK_RADIO_BUTTON(radioDelta), radiobuttonCycle_group); radiobuttonCycle_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radioDelta)); gtk_table_attach(GTK_TABLE(table), radioDelta, 1, 2, 2, 3, (GtkAttachOptions)0, (GtkAttachOptions)0, 0, 0); g_signal_connect(G_OBJECT(radioDelta), "toggled", G_CALLBACK(onSpecialModeToggled), (gpointer)spin_delta); entry = gtk_entry_new(); progress = gtk_progress_bar_new(); gtk_table_attach(GTK_TABLE(table), spin_step, 0, 1, 3, 4, GTK_FILL | GTK_EXPAND, (GtkAttachOptions)0, 0, 0); gtk_table_attach(GTK_TABLE(table), spin_delta, 1, 2, 3, 4, GTK_FILL | GTK_EXPAND, (GtkAttachOptions)0, 0, 0); gtk_table_attach(GTK_TABLE(table), gtk_label_new(_("Start:")), 0, 1, 0, 1, GTK_FILL | GTK_EXPAND, (GtkAttachOptions)0, 0, 0); gtk_table_attach(GTK_TABLE(table), gtk_label_new(_("End:")), 1, 2, 0, 1, GTK_FILL | GTK_EXPAND, (GtkAttachOptions)0, 0, 0); gtk_table_attach(GTK_TABLE(table), spin_start, 0, 1, 1, 2, GTK_FILL | GTK_EXPAND, (GtkAttachOptions)0, 0, 0); gtk_table_attach(GTK_TABLE(table), spin_end, 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, (GtkAttachOptions)0, 0, 0); gtk_table_attach(GTK_TABLE(table), gtk_label_new(_("Name (optional):")), 0, 2, 4, 5, GTK_FILL | GTK_EXPAND, (GtkAttachOptions)0, 0, 0); gtk_table_attach(GTK_TABLE(table), entry, 0, 2, 5, 6, GTK_FILL | GTK_EXPAND, (GtkAttachOptions)0, 0, 0); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), table, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), progress, FALSE, FALSE, 5); gtk_widget_set_sensitive(spin_delta, FALSE); gtk_widget_show_all(dialog); *values = (float*)0; *nbValues = 0; switch(gtk_dialog_run(GTK_DIALOG(dialog))) { case GTK_RESPONSE_ACCEPT: { float start = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin_start)); float end = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin_end)); int step = floor(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin_step))); *values = g_malloc(sizeof(float) * MAX_NB_VALUES); value = start; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioStep))) { if (abs(start - minVal) < 1e-6) step += 1; incr = (end - start) / step; } else incr = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin_delta)); if (abs(value - minVal) < 1e-6) value += incr; while ((incr > 0 && (value - end) < -1e-6) || (incr < 0 && (value - end) > 1e-6)) { if (value > minVal && value < maxVal) { DBG_fprintf(stderr, "Panel VisuSurfaces: create a new value, %d %f\n", *nbValues, value); (*values)[*nbValues] = value; *nbValues += 1; } value += incr; } *name = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry))); } default: return dialog; } } /** * visu_ui_panel_surfaces_init: (skip) * * Should be used in the list declared in externalModules.h to be loaded by * V_Sim on start-up. This routine will create the #VisuUiPanel where the iso-surfaces * stuff can be done, such as creating a surface, loading a scalar field, * changing the properties... * * Returns: a newly created #VisuUiPanel object. */ VisuUiPanel* visu_ui_panel_surfaces_init(VisuUiMain *ui) { /* Long description */ char *cl = _("Drawing iso-surfaces"); /* Short description */ char *tl = "Isosurfaces"; panelSurfaces = visu_ui_panel_newWithIconFromPath("Panel_surfaces", cl, _(tl), "stock-isosurfaces_20.png"); visu_ui_panel_setDockable(VISU_UI_PANEL(panelSurfaces), TRUE); fields_data_list = gtk_list_store_new(VISU_UI_SURFACES_FIELD_N_COLUMNS, G_TYPE_STRING, VISU_TYPE_SCALAR_FIELD); /* Create the widgets. */ isosurfaces_create_gtk_interface(VISU_UI_PANEL(panelSurfaces)); gtk_widget_set_sensitive(isosurfaces_gtk_vbox, FALSE); gtk_widget_set_sensitive(buttonOpen, FALSE); gtk_widget_set_sensitive(buttonConvert, FALSE); vboxColorur = (GtkWidget*)0; vboxToolShade = (GtkWidget*)0; fitToBox = TRUE; /* Add the signal for the vBoxVisuPlanes. */ g_signal_connect(VISU_OBJECT_INSTANCE, "dataRendered", G_CALLBACK(onDataReady), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "dataUnRendered", G_CALLBACK(onDataNotReady), (gpointer)0); g_signal_connect(G_OBJECT(ui), "DataFocused", G_CALLBACK(onDataFocused), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "resourcesLoaded", G_CALLBACK(onResourcesChanged), (gpointer)0); visu_gl_ext_surfaces_setOnObserveOrdering(visu_gl_ext_surfaces_getDefault(), visu_ui_rendering_window_class_getInteractive ()); if(!panelSurfaces) return NULL; return VISU_UI_PANEL(panelSurfaces); } v_sim-3.7.0/src/panelModules/panelSurfaces.h0000644000353400050620000001077112215546063015756 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD, Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2005) Adresses ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD and Damien CALISTE and Olivier D'Astier, laboratoire L_Sim, (2001-2005) E-mail addresses : BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef PANELSURFACES_H #define PANELSURFACES_H #include #include #include #include #include #include #include VisuUiPanel* visu_ui_panel_surfaces_init(); gboolean visu_ui_panel_surfaces_setUsed(gboolean used); gboolean visu_ui_panel_surfaces_loadFile(const char* file_name, VisuBox *boxToFit, GHashTable *table, VisuScalarFieldMethod *meth); void visu_ui_panel_surfaces_addField(VisuScalarField *field, GtkTreeIter *iter); void visu_ui_panel_surfaces_addSurfaces(VisuSurfaces *surf, const gchar *name, GtkTreeIter *iter); gboolean visu_ui_panel_surfaces_parseXMLFile(const gchar *filename, GError **error); gboolean visu_ui_panel_surfaces_exportXMLFile(const gchar *filename, GError **error); gboolean visu_ui_panel_surfaces_showAll(gboolean show); void visu_ui_panel_surfaces_editProperties(GtkTreeIter *iter); void visu_ui_panel_surfaces_add(gchar *filename, float value, gchar *name); const VisuSurfaces* visu_ui_panel_surfaces_compute(GtkTreeIter *iter, const float *values, const gchar **names, guint nValues); const VisuSurfaces* visu_ui_panel_surfaces_computeAuto(GtkTreeIter *iter); void visu_ui_panel_surfaces_updateAtIter(GtkTreeIter *iter); /** * VisuUiSurfacesFieldId: * @VISU_UI_SURFACES_FIELD_LABEL: a string, the description of the scalar field. * @VISU_UI_SURFACES_FIELD_POINTER: the pointer to the #VisuScalarField object. * @VISU_UI_SURFACES_FIELD_N_COLUMNS: the number of columns. * * Thesse are the description of the columns stored in the #GtkListStore * of this panel. See visu_ui_panel_surfaces_getFields() to access this liststore. */ typedef enum { VISU_UI_SURFACES_FIELD_LABEL, VISU_UI_SURFACES_FIELD_POINTER, VISU_UI_SURFACES_FIELD_N_COLUMNS } VisuUiSurfacesFieldId; GtkListStore* visu_ui_panel_surfaces_getFields(); gboolean visu_ui_panel_surfaces_hide(VisuPlane **planes); /** * VISU_UI_SURFACE_NAME_STR: * * The default string used to name surfaces that are not associated to * any public surface ressource. */ #define VISU_UI_SURFACE_NAME_STR "Choose an id name" /** * VISU_UI_SURFACE_NAME_CHOOSE: * * The string used in the tree view to represent the surfaces that * don't share surface resources. */ #define VISU_UI_SURFACE_NAME_CHOOSE ""VISU_UI_SURFACE_NAME_STR"" GtkWidget* visu_ui_panel_surfaces_generateValues(int *nbValues, float **values, gchar **name, float minVal, float maxVal); #endif v_sim-3.7.0/src/panelModules/panelSurfacesTools.c0000644000353400050620000023426012215546064016774 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD, Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2005) Adresses ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD and Damien CALISTE and Olivier D'Astier, laboratoire L_Sim, (2001-2005) E-mail addresses : BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "panelSurfacesTools.h" #include "panelSurfaces.h" #include #include #include #include #include #include #include #include #include #include /** * SECTION:panelSurfacesTools * @short_description: Gtk interface to manage isosurfaces. * * This module contains the panel used to manage your .surf * files. At the moment, only two tools are availiable for you to * use. pot2surf will allow you * to create .surf files from .pot files. There is also a .surf file * merger which is so short that we beliedved it didn't need it's own * module. */ static GtkWidget *convert_window; static gboolean convert_w_opened = FALSE; static GtkListStore* list_store = NULL; static GtkListStore* list_store_target = NULL; static GtkWidget* tree_view_source = NULL; static GtkWidget* tree_view_target = NULL; enum { MERGE_SURF_NAME, MERGE_NB_POINTS, MERGE_NB_VERTEX, MERGE_FILENAME, MERGE_NEW_SURF_NAME, MERGE_SHORT_FILENAME, MERGE_N_COLUMNS }; static GtkWidget *surfmerge_source_ddd[6]; static GtkWidget *surfmerge_target_ddd[6]; static GtkWidget *entry_current_file; static GtkWidget *entry_target_file; void surf_add_surf_to_target(); #if GTK_MAJOR_VERSION < 3 gboolean gtk_tree_model_iter_previous(GtkTreeModel *tree_model, GtkTreeIter *iter) { GtkTreePath *temp_to_free = gtk_tree_model_get_path(tree_model, iter); if (!temp_to_free) return FALSE; if(!gtk_tree_path_prev(temp_to_free)) { /* DBG_fprintf(stderr, "WARNING : custom gtk_tree_model_iter_previous couldn't retrieve previous element\n"); */ gtk_tree_path_free(temp_to_free); return FALSE; } if(!gtk_tree_model_get_iter(tree_model, iter, temp_to_free)) { /* DBG_fprintf(stderr, "WARNING : custom gtk_tree_model_iter_previous couldn't retrieve a valid iter\n"); */ gtk_tree_path_free(temp_to_free); return FALSE; } gtk_tree_path_free(temp_to_free); return TRUE; } #endif /* Parses target surf file to retrieve dxx, ..., dzz, as well as each surface name, nb of vertex and nb of points. */ gboolean surf_simply_parse_file(char *file_name) { GString *line = g_string_new(""); gchar **surf_names = NULL; gsize terminator_pos; int last_op_status; int number_of_surfaces; int i; int *nb_vertex, *nb_points; float ddd[6]; char float_to_string[128]; gboolean ddd_are_null = TRUE; gboolean ddd_are_equal = TRUE; GIOChannel* file_to_parse = g_io_channel_new_file(file_name, "r", NULL); if(file_to_parse == NULL) return FALSE; /* First line is arbitrary */ last_op_status = g_io_channel_read_line_string (file_to_parse, line, &terminator_pos, NULL); if(last_op_status != G_IO_STATUS_NORMAL) return FALSE; /* Second line contains dxx, dyx and dyy values */ last_op_status = g_io_channel_read_line_string (file_to_parse, line, &terminator_pos, NULL); if(last_op_status != G_IO_STATUS_NORMAL || sscanf(line->str, "%f %f %f", &ddd[0], &ddd[1], &ddd[2]) != 3) return FALSE; /* Third line contains dzx, dzy and dzz values */ last_op_status = g_io_channel_read_line_string (file_to_parse, line, &terminator_pos, NULL); if(last_op_status != G_IO_STATUS_NORMAL || sscanf(line->str, "%f %f %f", &ddd[3], &ddd[4], &ddd[5]) != 3) return FALSE; /* Fourth line contains nsurf values (as well as two other values) */ last_op_status = g_io_channel_read_line_string (file_to_parse, line, &terminator_pos, NULL); if(last_op_status != G_IO_STATUS_NORMAL || sscanf(line->str, "%d", &number_of_surfaces) != 1) return FALSE; if(number_of_surfaces <= 0) return FALSE; surf_names = g_malloc(number_of_surfaces * sizeof(gchar *)); nb_vertex = g_malloc(number_of_surfaces * sizeof(int)); nb_points = g_malloc(number_of_surfaces * sizeof(int)); for(i=0; istr[0] == '#'); surf_names[i] = g_strdup(line->str); g_strdelimit(surf_names[i], "\n", ' '); g_strstrip(surf_names[i]); last_op_status = g_io_channel_read_line_string (file_to_parse, line, &terminator_pos, NULL); if(last_op_status != G_IO_STATUS_NORMAL || sscanf(line->str, "%d %d", &nb_vertex[i], &nb_points[i]) != 2) return FALSE; for(j=0; j<(nb_vertex[i]+nb_points[i]); j++) { last_op_status = g_io_channel_read_line_string (file_to_parse, line, &terminator_pos, NULL); if(last_op_status != G_IO_STATUS_NORMAL) return FALSE; } } gtk_list_store_clear(list_store); for(i=0; i<6; i++) { sprintf(float_to_string, "%f", ddd[i]); gtk_entry_set_text(GTK_ENTRY(surfmerge_source_ddd[i]), float_to_string); ddd_are_null = ddd_are_null && (atof(gtk_entry_get_text(GTK_ENTRY(surfmerge_target_ddd[i]))) == 0.); ddd_are_equal = ddd_are_equal && (atof(gtk_entry_get_text(GTK_ENTRY(surfmerge_target_ddd[i]))) == ddd[i]); } if(ddd_are_null) for(i=0; i<6; i++) gtk_entry_set_text(GTK_ENTRY(surfmerge_target_ddd[i]), gtk_entry_get_text(GTK_ENTRY(surfmerge_source_ddd[i]))); else if(!ddd_are_equal) { GtkWidget* choice = gtk_dialog_new_with_buttons(_("Found different dxx, ..., dzz"), GTK_WINDOW(convert_window), GTK_DIALOG_MODAL, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, _("Keep current values"), GTK_RESPONSE_YES, _("Change values to new ones"), GTK_RESPONSE_NO, NULL); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(choice))), gtk_label_new(_("Current dxx, ..., dzz, doesn't match the ones used in the " "file you are trying to load. Do you want to keep old " "dxx, ..., dzz ? (if you don't know exactly what you're doing, " "just cancel and load another file)")), TRUE, TRUE, 0); gtk_widget_show_all(choice); switch(gtk_dialog_run (GTK_DIALOG (choice))) { case GTK_RESPONSE_CANCEL: gtk_widget_destroy(choice); return FALSE; break; case GTK_RESPONSE_NO: for(i=0; i<6; i++) gtk_entry_set_text(GTK_ENTRY(surfmerge_target_ddd[i]), gtk_entry_get_text(GTK_ENTRY(surfmerge_source_ddd[i]))); gtk_widget_destroy(choice); break; case GTK_RESPONSE_YES: default: gtk_widget_destroy(choice); break; } } for(i=0; idata)) break; if(gtk_tree_selection_get_selected(tree_selection_target, &model_target, &iter_target)) { gtk_list_store_insert_after(list_store_target, &iter_target_new, &iter_target); gtk_tree_selection_select_iter(tree_selection_target, &iter_target_new); } else { iter_target_new = iter_target; gtk_list_store_append(list_store_target, &iter_target_new); } gtk_tree_model_get(GTK_TREE_MODEL(list_store), &iter_source, MERGE_SURF_NAME, &surf_name, MERGE_NB_POINTS, &nb_points, MERGE_NB_VERTEX, &nb_vertex, -1); short_filename = g_path_get_basename(gtk_entry_get_text(GTK_ENTRY(entry_current_file))); g_strdelimit(surf_name, " ", '_'); gtk_list_store_set(list_store_target, &iter_target_new, MERGE_SURF_NAME, surf_name, MERGE_NB_POINTS, nb_points, MERGE_NB_VERTEX, nb_vertex, MERGE_FILENAME, gtk_entry_get_text(GTK_ENTRY(entry_current_file)), MERGE_NEW_SURF_NAME, surf_name, MERGE_SHORT_FILENAME, short_filename, -1); g_free(surf_name); g_free(short_filename); gtk_tree_path_free(rows_browse->data); rows_browse = rows_browse->next; } g_list_free(rows_start); } /* Only used with a gtk_tree_model_foreach() Used to count the total of surfaces, nb_vertex, and nb_points to build a correct .surf file. */ gboolean surfmerge_init_export(GtkTreeModel *model, GtkTreePath *path _U_, GtkTreeIter *iter, gpointer data) { int *total = data; int nb_points; int nb_vertex; gtk_tree_model_get(GTK_TREE_MODEL(model), iter, MERGE_NB_POINTS, &nb_points, MERGE_NB_VERTEX, &nb_vertex, -1); total[0]++; total[1] += nb_vertex; total[2] += nb_points; return FALSE; } /* Only used with a gtk_tree_model_foreach() Used to write a surface in the file the user wants to write. */ gboolean surf_export_surf(GtkTreeModel *model, GtkTreePath *path _U_, GtkTreeIter *iter, gpointer data) { FILE *file_to_write = data; gchar *old_surf_name; gchar * file_name; gchar * surf_name; int nb_vertex, nb_points, i, j; GIOChannel* file_to_read; gsize terminator_pos; GString *line = g_string_new(""); int last_op_status; gtk_tree_model_get(GTK_TREE_MODEL(model), iter, MERGE_SURF_NAME, &old_surf_name, MERGE_FILENAME, &file_name, MERGE_NEW_SURF_NAME, &surf_name, MERGE_NB_VERTEX, &nb_vertex, MERGE_NB_POINTS, &nb_points, -1); file_to_read = g_io_channel_new_file(file_name, "r", NULL); DBG_fprintf(stderr, "Surface Merger : writing surface '%s' info \n", surf_name); for(i=0; i<4; i++) { last_op_status = g_io_channel_read_line_string (file_to_read, line, &terminator_pos, NULL); if(last_op_status != G_IO_STATUS_NORMAL) { g_free(file_name); g_free(surf_name); g_free(old_surf_name); g_string_free(line, TRUE); g_io_channel_unref(file_to_read); visu_ui_raiseWarning(_("Loading a file"), _("An unknown error occured. Your surf" " file is corrupted.\n"), (GtkWindow*)0); return TRUE; } } for(i=0; i>-1; i++) { gchar *cur_surf_name; int surf_nb_vertex, surf_nb_points; last_op_status = g_io_channel_read_line_string (file_to_read, line, &terminator_pos, NULL); if(last_op_status != G_IO_STATUS_NORMAL) { g_free(file_name); g_free(surf_name); g_free(old_surf_name); g_string_free(line, TRUE); g_io_channel_unref(file_to_read); visu_ui_raiseWarning(_("Loading a file"), _("An unknown error occured. Your surf" " file is corrupted.\n"), (GtkWindow*)0); return TRUE; } cur_surf_name = g_strdup(line->str); g_strdelimit(cur_surf_name, "\n", ' '); g_strstrip(cur_surf_name); DBG_fprintf(stderr, "%s, old:%s\n", cur_surf_name, old_surf_name); if(strcmp(cur_surf_name, old_surf_name) == 0) fprintf(file_to_write, "%s\n", surf_name); last_op_status = g_io_channel_read_line_string (file_to_read, line, &terminator_pos, NULL); if(last_op_status != G_IO_STATUS_NORMAL || sscanf(line->str, "%d %d", &surf_nb_vertex, &surf_nb_points) != 2) { g_free(file_name); g_free(surf_name); g_free(old_surf_name); g_string_free(line, TRUE); g_io_channel_unref(file_to_read); visu_ui_raiseWarning(_("Loading a file"), _("An unknown error occured. Your surf" " file is corrupted.\n"), (GtkWindow*)0); return TRUE; } DBG_fprintf(stderr, "%s, old:%s\n", cur_surf_name, old_surf_name); if(strcmp(cur_surf_name, old_surf_name) == 0) fprintf(file_to_write, "%s", line->str); for(j=0; j<(surf_nb_vertex+surf_nb_points); j++) { last_op_status = g_io_channel_read_line_string (file_to_read, line, &terminator_pos, NULL); if(last_op_status != G_IO_STATUS_NORMAL) { g_free(file_name); g_free(surf_name); g_free(old_surf_name); g_string_free(line, TRUE); g_io_channel_unref(file_to_read); visu_ui_raiseWarning(_("Loading a file"), _("An unknown error occured. Your surf" " file is corrupted.\n"), (GtkWindow*)0); return TRUE; } if(strcmp(cur_surf_name, old_surf_name) == 0) fprintf(file_to_write, "%s", line->str); } DBG_fprintf(stderr, "%s, old:%s\n", cur_surf_name, old_surf_name); if(strcmp(cur_surf_name, old_surf_name) == 0) { g_free(cur_surf_name); break; } g_free(cur_surf_name); DBG_fprintf(stderr, "%s, old:%s\n", cur_surf_name, old_surf_name); } g_free(file_name); g_free(old_surf_name); g_free(surf_name); g_string_free(line, TRUE); g_io_channel_unref(file_to_read); return FALSE; } /* If all parameters are correctly set, tries to write a valid .surf file from the surfaces selected by the user. */ void surf_gogogo() { FILE* file_to_write = fopen(gtk_entry_get_text(GTK_ENTRY(entry_target_file)), "wb"); int i; int total[3]; if(file_to_write == NULL) { visu_ui_raiseWarning(_("Saving a file"), _("Please choose a surf file to write\n"), (GtkWindow*)0); return; } for(i=0; i<3; i++) total[i] = 0; gtk_tree_model_foreach(GTK_TREE_MODEL(list_store_target), surfmerge_init_export, total); if(total[0] == 0) { visu_ui_raiseWarning(_("Saving a file"), _("No surface to write\n"), (GtkWindow*)0); return; } if(fprintf(file_to_write, "surf file generated by v_sim's merger\n") < 0) return; for(i=0; i<6; i++) { if(fprintf(file_to_write, "%s ", gtk_entry_get_text(GTK_ENTRY(surfmerge_target_ddd[i]))) < 0) return; if((i+1)%3==0) if(fprintf(file_to_write, "\n") < 0) return; } if(fprintf(file_to_write, "%d %d %d\n", total[0], total[1], total[2]) < 0) return; gtk_tree_model_foreach(GTK_TREE_MODEL(list_store_target), surf_export_surf, file_to_write); fclose(file_to_write); DBG_fprintf(stderr, "Surface Merger : wrote file %s\n", gtk_entry_get_text(GTK_ENTRY(entry_target_file))); } /* See header file for more info */ GtkWidget *visu_ui_panel_surfaces_tools_fileWidget() { enum { DXX, DYX, DYY, DZX, DZY, DZZ }; #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkTooltips *tooltips = gtk_tooltips_new (); #endif GtkWidget* scrolled_window_top = gtk_scrolled_window_new(NULL, NULL); GtkWidget* scrolled_window_bot = gtk_scrolled_window_new(NULL, NULL); GtkWidget *global_vbox = gtk_vbox_new(FALSE, 0); GtkWidget *hbox1 = gtk_hbox_new(FALSE, 0); GtkWidget *hbox_top_ddd = gtk_hbox_new(FALSE, 2); GtkWidget *hbox_top_ddd2 = gtk_hbox_new(FALSE, 2); GtkWidget *hbox_bot_ddd = gtk_hbox_new(FALSE, 2); GtkWidget *hbox_bot_ddd2 = gtk_hbox_new(FALSE, 2); GtkWidget *hbox_go = gtk_hbox_new(FALSE, 0); GtkWidget *bottom_frame = gtk_frame_new(_("Target info : ")); GtkWidget *top_frame = gtk_frame_new(_("Source info : ")); GtkWidget *vbox = gtk_vbox_new(FALSE, 2); GtkWidget *vbox_r = gtk_vbox_new(FALSE, 2); GtkWidget *add_surf_button = gtk_button_new(); GtkWidget *go_button = gtk_button_new_with_label("Build"); GtkWidget *save_file = gtk_button_new(); GtkWidget *hbox_target_file = gtk_hbox_new(FALSE, 0); char *ddd[] = {"dxx :", "dyx :", "dyy :", "dzx :", "dzy :", "dzz :"}; GtkWidget *label; GtkWidget *remove_surf_button = gtk_button_new(); GtkWidget *move_down_surf_button = gtk_button_new(); GtkWidget *move_up_surf_button = gtk_button_new(); int i; GtkWidget *open_file = gtk_button_new(); GtkWidget *manage_top_tview_vbox = gtk_vbox_new(FALSE, 0); GtkWidget *manage_bot_tview_vbox = gtk_vbox_new(FALSE, 0); GtkWidget *top_tview_hbox = gtk_hbox_new(FALSE, 0); GtkWidget *bot_tview_hbox = gtk_hbox_new(FALSE, 0); GtkWidget *image_add = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_BUTTON); GtkWidget *image_remove = gtk_image_new_from_stock ("gtk-remove", GTK_ICON_SIZE_BUTTON); GtkWidget *image_go_down = gtk_image_new_from_stock ("gtk-go-down", GTK_ICON_SIZE_BUTTON); GtkWidget *image_go_up = gtk_image_new_from_stock ("gtk-go-up", GTK_ICON_SIZE_BUTTON); GtkWidget *image_open = gtk_image_new_from_stock ("gtk-open", GTK_ICON_SIZE_BUTTON); entry_current_file = gtk_entry_new(); entry_target_file = gtk_entry_new(); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window_top), GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window_bot), GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); gtk_container_add (GTK_CONTAINER (add_surf_button), image_add); gtk_container_add (GTK_CONTAINER (remove_surf_button), image_remove); gtk_container_add (GTK_CONTAINER (move_down_surf_button), image_go_down); gtk_container_add (GTK_CONTAINER (move_up_surf_button), image_go_up); gtk_container_add (GTK_CONTAINER (open_file), image_open); image_open = gtk_image_new_from_stock ("gtk-open", GTK_ICON_SIZE_BUTTON); gtk_container_add (GTK_CONTAINER (save_file), image_open); gtk_widget_set_tooltip_text(go_button, _("Build specified new .surf file")); gtk_widget_set_tooltip_text(entry_current_file, _("Contains the full path to the currently .surf selected file")); gtk_widget_set_tooltip_text(entry_target_file, _("Contains the full path to the .surf file you want to build")); gtk_widget_set_tooltip_text(open_file, _("Allows you to select a .surf file")); gtk_widget_set_tooltip_text(save_file, _("Selects the .surf file to write")); gtk_widget_set_tooltip_text(add_surf_button, _("Moves selected surface to the list of surfaces to build")); gtk_widget_set_tooltip_text(move_down_surf_button, _("Moves down selected surface in the list of surfaces to build")); gtk_widget_set_tooltip_text(move_up_surf_button, _("Moves up selected surface in the list of surfaces to build")); gtk_widget_set_tooltip_text(remove_surf_button, _("Removes selected surface from the list of surfaces to build")); for(i=0; i<6; i++) { surfmerge_source_ddd[i] = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(surfmerge_source_ddd[i]), "0.0000000"); g_object_set(G_OBJECT(surfmerge_source_ddd[i]), "width-chars", 9, NULL); gtk_editable_set_editable(GTK_EDITABLE(surfmerge_source_ddd[i]), FALSE); gtk_widget_set_tooltip_text(surfmerge_source_ddd[i], _("The d__ of the current selected file")); } for(i=0; i<6; i++) { surfmerge_target_ddd[i] = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(surfmerge_target_ddd[i]), "0.0000000"); g_object_set(G_OBJECT(surfmerge_target_ddd[i]), "width-chars", 9, NULL); gtk_widget_set_tooltip_text(surfmerge_target_ddd[i], _("The d__ of the file to build")); } surf_create_tree_views(); gtk_box_pack_start(GTK_BOX(global_vbox), top_frame, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(global_vbox), bottom_frame, TRUE, TRUE, 0); gtk_container_add(GTK_CONTAINER(top_frame), vbox); gtk_container_add(GTK_CONTAINER(scrolled_window_top), tree_view_source); gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox_top_ddd, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox_top_ddd2, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), top_tview_hbox, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox1), gtk_label_new(_("Current file : ")), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox1), entry_current_file, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox1), open_file, FALSE, FALSE, 0); for(i=0; i<3; i++) { label = gtk_label_new(ddd[i]); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); gtk_box_pack_start(GTK_BOX(hbox_top_ddd), label, i==0 ? FALSE : TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox_top_ddd), surfmerge_source_ddd[i], FALSE, FALSE, 0); } for(i=3; i<6; i++) { label = gtk_label_new(ddd[i]); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); gtk_box_pack_start(GTK_BOX(hbox_top_ddd2), label, i==3 ? FALSE : TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox_top_ddd2), surfmerge_source_ddd[i], FALSE, FALSE, 0); } gtk_box_pack_start(GTK_BOX(top_tview_hbox), scrolled_window_top, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(top_tview_hbox), manage_top_tview_vbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(manage_top_tview_vbox), add_surf_button, TRUE, FALSE, 0); gtk_container_add(GTK_CONTAINER(bottom_frame), vbox_r); gtk_container_add(GTK_CONTAINER(scrolled_window_bot), tree_view_target); gtk_box_pack_start(GTK_BOX(vbox_r), hbox_bot_ddd, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox_r), hbox_bot_ddd2, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox_r), bot_tview_hbox, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox_r), hbox_target_file, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox_r), hbox_go, FALSE, FALSE, 0); for(i=0; i<3; i++) { label = gtk_label_new(ddd[i]); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); gtk_box_pack_start(GTK_BOX(hbox_bot_ddd), label, i==0 ? FALSE : TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox_bot_ddd), surfmerge_target_ddd[i], FALSE, FALSE, 0); } for(i=3; i<6; i++) { label = gtk_label_new(ddd[i]); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); gtk_box_pack_start(GTK_BOX(hbox_bot_ddd2), label, i==3 ? FALSE : TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox_bot_ddd2), surfmerge_target_ddd[i], FALSE, FALSE, 0); } gtk_box_pack_start(GTK_BOX(bot_tview_hbox), scrolled_window_bot, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(bot_tview_hbox), manage_bot_tview_vbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(manage_bot_tview_vbox), remove_surf_button, FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(manage_bot_tview_vbox), move_down_surf_button, FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(manage_bot_tview_vbox), move_up_surf_button, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox_target_file), gtk_label_new(_("Target file : ")), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox_target_file), entry_target_file, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox_target_file), save_file, FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(hbox_go), go_button, FALSE, FALSE, 0); /* Signal connexion */ g_signal_connect(G_OBJECT(open_file), "clicked", G_CALLBACK(surf_open_file_chooser), entry_current_file); g_signal_connect(G_OBJECT(add_surf_button), "clicked", G_CALLBACK(surf_add_surf_to_target), NULL); g_signal_connect(G_OBJECT(go_button), "clicked", G_CALLBACK(surf_gogogo), NULL); g_signal_connect(G_OBJECT(remove_surf_button), "clicked", G_CALLBACK(surfmerge_remove_surf), NULL); g_signal_connect(G_OBJECT(move_up_surf_button), "clicked", G_CALLBACK(surfmerge_move_surf), GINT_TO_POINTER(-1)); g_signal_connect(G_OBJECT(move_down_surf_button), "clicked", G_CALLBACK(surfmerge_move_surf), GINT_TO_POINTER(1)); g_signal_connect(G_OBJECT(save_file), "clicked", G_CALLBACK(surfmerge_target_file_chooser), NULL); return global_vbox; } /*****************************************************************************/ /* */ /* POT2SURF */ /* */ /*****************************************************************************/ static GtkListStore *pot2surf_list_store = NULL; static GtkWidget *pot2surf_tree_view = NULL; static GtkWidget *pot2surf_entry_source_pot_file = NULL; static GtkWidget *pot2surf_entry_target_surf_file = NULL; static GtkWidget *pot2surf_potmax = NULL; static GtkWidget *pot2surf_potmin = NULL; enum { POT2SURF_NAME, POT2SURF_VALUE, POT2SURF_N_COLUMNS }; /* Pops up a window containing info about the pot2surf routine Currently unused. */ void pot2surf_popup_help() { GtkWidget *window; gsize length; gchar *text = NULL; GtkTextBuffer *text_buf; GtkWidget *text_view; GtkWidget *scrolled_window; gchar *chemin = g_build_filename(V_SIM_LEGAL_DIR, "pot2surf_help", NULL); if(!g_file_get_contents(chemin, &text, &length, (GError**)0)) { g_free(chemin); return; } g_free(chemin); text_buf = gtk_text_buffer_new(NULL); text_view = gtk_text_view_new_with_buffer(text_buf); scrolled_window = gtk_scrolled_window_new(NULL, NULL); gtk_text_buffer_insert_at_cursor(text_buf, text, -1); g_free(text); /* Create a new dialog window for the scrolled window to be * packed into. */ window = gtk_dialog_new_with_buttons(_("pot2surf_help"), NULL, 0, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); gtk_container_set_border_width (GTK_CONTAINER (window), 0); gtk_widget_set_size_request (window, 600, 300); /* create a new scrolled window. */ scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); /* The dialog window is created with a vbox packed into it. */ gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(window))), scrolled_window, TRUE, TRUE, 0); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW (scrolled_window), text_view); gtk_widget_show_all (window); switch(gtk_dialog_run(GTK_DIALOG(window))) { default: gtk_widget_destroy(window); } } /* Parses target to file to retrieve pot_min and pot_max Returns TRUE in case of success, FALSE otherwise. */ gboolean pot2surf_quick_parse(char *file_name, float *pot_min, float *pot_max) { GString *line = g_string_new(""); int last_op_status; int na, nb, nc; int i, j; float current_value; gsize terminator_pos; gchar **float_tab; GIOChannel* file_to_parse = g_io_channel_new_file(file_name, "r", NULL); if(file_to_parse == NULL) { visu_ui_raiseWarning(_("Loading a file"), _("Can't open given file for reading"), (GtkWindow*)0); g_io_channel_unref(file_to_parse); return FALSE; } /* Read the first five lines */ for(i=0; i<5; i++) { last_op_status = g_io_channel_read_line_string (file_to_parse, line, &terminator_pos, NULL); if(last_op_status != G_IO_STATUS_NORMAL) { visu_ui_raiseWarning(_("Loading a file"), _("This file doesn't seem to be a correct pot file"), (GtkWindow*)0); g_io_channel_unref(file_to_parse); return FALSE; } if(i==1) { sscanf(line->str, "%d %d %d", &na, &nb, &nc); if(na <= 0 || nb <= 0 || nc <= 0) { visu_ui_raiseWarning(_("Loading a file"), _("Second line seem to contain incorrect values"), (GtkWindow*)0); g_io_channel_unref(file_to_parse); return FALSE; } } } /* Retrieve pot values to find min & max in the following lines. According to .pot files specifications, the following lines are in free format */ for(i=0; istr, " ", -1); for(j=0; float_tab[j] != NULL; j++) { if(sscanf(float_tab[j], "%f", ¤t_value) == 1) { if(i==0) *pot_max = *pot_min = current_value; else if(current_value < *pot_min) *pot_min = current_value; else if(current_value > *pot_max) *pot_max = current_value; i++; } } g_strfreev(float_tab); } g_io_channel_unref(file_to_parse); return TRUE; } /* Opens a file chooser for the user to select a pot file. This file is parsed using pot2surf_quick_parse() to try to retrieve pot_in and pot_max. If parsing is successful, set entries to default values (ie : file_selected.surf and file_selected.instruc) */ void pot2surf_select_pot_file(GtkWidget *widget _U_, gpointer data _U_) { GtkFileFilter *filter_pot = gtk_file_filter_new(); GtkFileFilter *filter_none = gtk_file_filter_new(); GtkWidget* file_chooser = gtk_file_chooser_dialog_new("Select a .pot file", GTK_WINDOW(convert_window), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, /* GTK_STOCK_HELP, GTK_RESPONSE_HELP, */ GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); gchar *directory = visu_ui_getLastOpenDirectory(); if (directory) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(file_chooser), directory); gtk_file_filter_add_pattern(filter_pot, "*.pot"); gtk_file_filter_add_pattern(filter_pot, "*.dat"); gtk_file_filter_set_name(filter_pot, "Potential files (*.pot, *.dat)"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(file_chooser), filter_pot); gtk_file_filter_add_pattern(filter_none, "*"); gtk_file_filter_set_name(filter_none, "All files"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(file_chooser), filter_none); while(1) { switch(gtk_dialog_run(GTK_DIALOG(file_chooser))) { float pot_min, pot_max; char float_to_string[128]; gchar *selected_file; GString *other_files; case GTK_RESPONSE_ACCEPT: selected_file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file_chooser)); if(pot2surf_quick_parse(selected_file, &pot_min, &pot_max)) { sprintf(float_to_string, "%f", pot_min); gtk_entry_set_text(GTK_ENTRY(pot2surf_potmin), float_to_string); sprintf(float_to_string, "%f", pot_max); gtk_entry_set_text(GTK_ENTRY(pot2surf_potmax), float_to_string); gtk_entry_set_text(GTK_ENTRY(pot2surf_entry_source_pot_file), selected_file); other_files = g_string_new(selected_file); if(g_str_has_suffix(other_files->str, ".pot")) g_string_erase(other_files, other_files->len-4, -1); g_string_append(other_files, ".surf"); gtk_entry_set_text(GTK_ENTRY(pot2surf_entry_target_surf_file), other_files->str); g_string_free(other_files, TRUE); directory = (char*)gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER (file_chooser)); visu_ui_setLastOpenDirectory(directory, VISU_UI_DIR_SURFACE); g_free(directory); gtk_list_store_clear(pot2surf_list_store); gtk_widget_destroy(file_chooser); return; } else break; case GTK_RESPONSE_HELP: break; case GTK_RESPONSE_CANCEL: default: directory = (char*)gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER (file_chooser)); visu_ui_setLastOpenDirectory(directory, VISU_UI_DIR_SURFACE); g_free(directory); gtk_widget_destroy (file_chooser); return; } } } /* Opens a file chooser to select an instruc file. */ /* void pot2surf_source_instruc_open(GtkWidget *widget, gpointer data) */ /* { */ /* GtkFileFilter *filter_pot = gtk_file_filter_new (); */ /* GtkFileFilter *filter_none = gtk_file_filter_new(); */ /* GtkWidget* file_chooser = */ /* gtk_file_chooser_dialog_new("Select an instruction file", GTK_WINDOW(convert_window), */ /* GTK_FILE_CHOOSER_ACTION_OPEN, */ /* GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, */ /* /\* GTK_STOCK_HELP, GTK_RESPONSE_HELP, *\/ */ /* GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); */ /* gchar *directory = visu_ui_getLastOpenDirectory(); */ /* if (directory) */ /* gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(file_chooser), directory); */ /* gtk_file_filter_add_pattern(filter_pot, "*.instruc"); */ /* gtk_file_filter_set_name(filter_pot, "Instruction files (*.instruc)"); */ /* gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(file_chooser), filter_pot); */ /* gtk_file_filter_add_pattern(filter_none, "*"); */ /* gtk_file_filter_set_name(filter_none, "All files"); */ /* gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(file_chooser), filter_none); */ /* while(1) */ /* { */ /* switch(gtk_dialog_run(GTK_DIALOG(file_chooser))) */ /* { */ /* gchar *selected_file; */ /* case GTK_RESPONSE_ACCEPT: */ /* selected_file = */ /* gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file_chooser)); */ /* gtk_entry_set_text(GTK_ENTRY(pot2surf_entry_source_instruc_file), selected_file); */ /* directory = (char*)gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER (file_chooser)); */ /* visu_ui_setLastOpenDirectory(directory); */ /* g_free(directory); */ /* gtk_widget_destroy(file_chooser); */ /* return; */ /* case GTK_RESPONSE_HELP: */ /* break; */ /* case GTK_RESPONSE_CANCEL: */ /* default: */ /* directory = (char*)gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER (file_chooser)); */ /* visu_ui_setLastOpenDirectory(directory); */ /* g_free(directory); */ /* gtk_widget_destroy (file_chooser); */ /* return; */ /* } */ /* } */ /* } */ /* Opens a file chooser to select a surf file. */ void pot2surf_select_surf_file(GtkWidget *widget _U_, gpointer data _U_) { GtkFileFilter *filter_pot = gtk_file_filter_new (); GtkFileFilter *filter_none = gtk_file_filter_new(); GtkWidget* file_chooser = gtk_file_chooser_dialog_new("Select a .surf file", GTK_WINDOW(convert_window), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, /* GTK_STOCK_HELP, GTK_RESPONSE_HELP, */ GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); gchar *directory = visu_ui_getLastOpenDirectory(); if (directory) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(file_chooser), directory); gtk_file_filter_add_pattern(filter_pot, "*.surf"); gtk_file_filter_set_name(filter_pot, "Isosurfaces files (*.surf)"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(file_chooser), filter_pot); gtk_file_filter_add_pattern(filter_none, "*"); gtk_file_filter_set_name(filter_none, "All files"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(file_chooser), filter_none); while(1) { switch(gtk_dialog_run(GTK_DIALOG(file_chooser))) { gchar *selected_file; case GTK_RESPONSE_ACCEPT: selected_file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file_chooser)); gtk_entry_set_text(GTK_ENTRY(pot2surf_entry_target_surf_file), selected_file); directory = (char*)gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER (file_chooser)); visu_ui_setLastOpenDirectory(directory, VISU_UI_DIR_SURFACE); g_free(directory); gtk_widget_destroy(file_chooser); return; case GTK_RESPONSE_HELP: break; case GTK_RESPONSE_CANCEL: default: directory = (char*)gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER (file_chooser)); visu_ui_setLastOpenDirectory(directory, VISU_UI_DIR_SURFACE); g_free(directory); gtk_widget_destroy (file_chooser); return; } } } /* Callback for when a surf name is changed in the gtk_tree_view */ void pot2surf_update_surf_name(GtkCellRendererText *cellrenderertext _U_, gchar *path, gchar *text, gpointer user_data _U_) { GtkTreeIter iter; g_return_if_fail(gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL(pot2surf_list_store), &iter, path)); DBG_fprintf(stderr, "Panel VisuSurfacesTools: entered text '%s'.\n", text); if (!strcmp(text, VISU_UI_SURFACE_NAME_STR)) gtk_list_store_set(pot2surf_list_store, &iter, POT2SURF_NAME, VISU_UI_SURFACE_NAME_CHOOSE, -1); else if (text && text[0]) gtk_list_store_set(pot2surf_list_store, &iter, POT2SURF_NAME, g_strdelimit(text, " ", '_'), -1); else gtk_list_store_set(pot2surf_list_store, &iter, POT2SURF_NAME, VISU_UI_SURFACE_NAME_CHOOSE, -1); } /* Callback for when the pot of a surf to build is changed in the gtk_tree_view */ void pot2surf_update_surf_value(GtkCellRendererText *cellrenderertext _U_, gchar *path, gchar *text, gpointer user_data _U_) { GtkTreeIter iter; float value; float pot_min = atof(gtk_entry_get_text(GTK_ENTRY(pot2surf_potmin))); float pot_max = atof(gtk_entry_get_text(GTK_ENTRY(pot2surf_potmax))); if(sscanf(text, "%f", &value) != 1) return; if(value <= pot_min || value >= pot_max) return; if(gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(pot2surf_list_store), &iter, path)) gtk_list_store_set(pot2surf_list_store, &iter, POT2SURF_VALUE, value, -1); } /* Sets up the model/view used to represent the surfaces to build from a .pot file. */ void pot2surf_create_tree_view() { GtkCellRenderer* surf_name = gtk_cell_renderer_text_new (); GtkCellRenderer* surf_value = gtk_cell_renderer_text_new (); GtkTreeViewColumn* column1 = gtk_tree_view_column_new_with_attributes(_("Surface name"), surf_name, "markup", POT2SURF_NAME, NULL); GtkTreeViewColumn* column2 = gtk_tree_view_column_new_with_attributes(_("Pot value"), surf_value, "text", POT2SURF_VALUE, NULL); pot2surf_list_store = gtk_list_store_new (POT2SURF_N_COLUMNS, G_TYPE_STRING, G_TYPE_FLOAT); pot2surf_tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(pot2surf_list_store)); g_object_set(G_OBJECT(surf_name), "editable", TRUE, "foreground", "blue", NULL); g_object_set(G_OBJECT(surf_value), "editable", TRUE, "foreground", "blue", NULL); gtk_tree_view_column_set_expand (column1, TRUE); gtk_tree_view_column_set_expand(column2, FALSE); gtk_tree_view_insert_column(GTK_TREE_VIEW(pot2surf_tree_view), column1, -1); gtk_tree_view_insert_column(GTK_TREE_VIEW(pot2surf_tree_view), column2, -1); g_signal_connect(G_OBJECT(surf_name), "edited", G_CALLBACK(pot2surf_update_surf_name), NULL); g_signal_connect(G_OBJECT(surf_value), "edited", G_CALLBACK(pot2surf_update_surf_value), NULL); } /* Adds a new surface to the list of surfaces to build from a .pot file. */ void pot2surf_add_surf(GtkWidget *button _U_, gpointer data _U_) { GtkTreeIter iter, new_row; GtkTreeModel *model; GtkTreeSelection* tree_selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(pot2surf_tree_view)); if(strcmp("", gtk_entry_get_text(GTK_ENTRY(pot2surf_entry_source_pot_file))) == 0) return; tree_selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(pot2surf_tree_view)); if (gtk_tree_selection_get_selected (tree_selection, &model, &iter)) gtk_list_store_insert_after(pot2surf_list_store, &new_row, &iter); else gtk_list_store_append(pot2surf_list_store, &new_row); gtk_tree_selection_select_iter(tree_selection, &new_row); gtk_list_store_set(pot2surf_list_store, &new_row, POT2SURF_NAME, VISU_UI_SURFACE_NAME_CHOOSE, POT2SURF_VALUE, (atof(gtk_entry_get_text(GTK_ENTRY(pot2surf_potmin))) + atof(gtk_entry_get_text(GTK_ENTRY(pot2surf_potmax)))) / 2, -1); } void onSpecialModeToggled(GtkToggleButton *button, gpointer data) { gtk_widget_set_sensitive(GTK_WIDGET(data), gtk_toggle_button_get_active(button)); } void pot2surf_special_add_surf(GtkWidget *button _U_, gpointer data _U_) { float *values, pot_min, pot_max; int nbValues, i; gchar *name; GtkTreeIter new_row; GtkTreeSelection* tree_selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(pot2surf_tree_view)); GtkWidget *dialog; if(strcmp("", gtk_entry_get_text(GTK_ENTRY(pot2surf_entry_source_pot_file))) == 0) return; pot_min = g_ascii_strtod(gtk_entry_get_text(GTK_ENTRY(pot2surf_potmin)), NULL); pot_max = g_ascii_strtod(gtk_entry_get_text(GTK_ENTRY(pot2surf_potmax)), NULL); values = (float*)0; name = (gchar*)0; dialog = visu_ui_panel_surfaces_generateValues(&nbValues, &values, &name, pot_min, pot_max); if (!dialog) return; gtk_widget_destroy(dialog); for (i = 0; i < nbValues; i++) { gtk_list_store_append(pot2surf_list_store, &new_row); gtk_list_store_set(pot2surf_list_store, &new_row, POT2SURF_NAME, (name && name[0])?name:VISU_UI_SURFACE_NAME_CHOOSE, POT2SURF_VALUE, values[i], -1); } if (nbValues) gtk_tree_selection_select_iter(tree_selection, &new_row); if (values) g_free(values); if (name) g_free(name); } /* Removes selected surface from the list of surfaces to build from a .pot file. */ void pot2surf_remove_surf(GtkWidget *button _U_, gpointer data _U_) { GtkTreeIter iter, iter2; GtkTreeModel *model; GtkTreeSelection* tree_selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(pot2surf_tree_view)); gboolean list_empty = TRUE; if (gtk_tree_selection_get_selected (tree_selection, &model, &iter)) { iter2 = iter; if(gtk_tree_model_iter_previous(model, &iter2)) list_empty = FALSE; if(gtk_list_store_remove(pot2surf_list_store, &iter)) gtk_tree_selection_select_iter(tree_selection, &iter); else if(list_empty == FALSE) gtk_tree_selection_select_iter(tree_selection, &iter2); } } /* Callback for when a user decides to move up or down a surface. data == GINT_TO_POINTER(1) : move up data == GINT_TO_POINTER(-1) : move down */ void pot2surf_move_surf(GtkWidget *button _U_, gpointer data) { GtkTreeIter iter, iter2; GtkTreeModel *model; int direction; GtkTreeSelection* tree_selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(pot2surf_tree_view)); if(data == NULL) return; direction = GPOINTER_TO_INT(data); if(direction != -1 && direction != 1) return; if(!gtk_tree_selection_get_selected(tree_selection, &model, &iter)) return; iter2 = iter; if(direction == 1) { if(gtk_tree_model_iter_next(model, &iter2)) gtk_list_store_move_after(pot2surf_list_store, &iter, &iter2); } else if(direction == -1) { if(gtk_tree_model_iter_previous(model, &iter2)) gtk_list_store_move_before(pot2surf_list_store, &iter, &iter2); } } /* Only used through a gtk_tree_model_foreach() count the number of element present in a GtkTreeModel */ gboolean pot2surf_count_surf(GtkTreeModel *model _U_, GtkTreePath *path _U_, GtkTreeIter *iter _U_, gpointer data) { int *n = data; (*n)++; return FALSE; } /* Only used through a gtk_tree_model_foreach() Writes a surface name and value in an instruc file. */ gboolean pot2surf_write_surf(GtkTreeModel *model, GtkTreePath *path _U_, GtkTreeIter *iter, gpointer data) { FILE *instruc = data; char *surf_name=NULL; float surf_value; gtk_tree_model_get(GTK_TREE_MODEL(model), iter, POT2SURF_NAME, &surf_name, POT2SURF_VALUE, &surf_value, -1); fprintf(instruc, "%f %s\n", surf_value, surf_name); g_free(surf_name); return FALSE; } /* Tries to build a valid .instruc file. */ /* Returns : 0 in case of success n != 0 otherwise */ gboolean pot2surf_build_instruc_file(const gchar *pot_file, const gchar *surf_file, const gchar *instruc_file, int n) { FILE *instruc = NULL; if(instruc_file == NULL || strcmp(instruc_file, "") == 0) { visu_ui_raiseWarning(_("Loading a file"), _("Please select an instruc file to write"), (GtkWindow*)0); return FALSE; } if((instruc = fopen(instruc_file, "w")) == NULL) { visu_ui_raiseWarning(_("Loading a file"), _("Can't open selected instruc file for writing"), (GtkWindow*)0); return FALSE; } DBG_fprintf(stderr, "pot2surf : writing/overwriting %s file...\n", instruc_file); fprintf(instruc, "%s\n", pot_file); fprintf(instruc, "%s\n", surf_file); fprintf(instruc, "%d\n", n); gtk_tree_model_foreach(GTK_TREE_MODEL(pot2surf_list_store), pot2surf_write_surf, instruc); DBG_fprintf(stderr, "pot2surf : ...finished to write file\n"); fclose(instruc); return TRUE; } void pot2surf_select_instruc_file_to_save() { GtkFileFilter *filter_instruc; GtkFileFilter *filter_none; GtkWidget* file_chooser; char *directory = visu_ui_getLastOpenDirectory(); int n=0; const gchar *pot_file = gtk_entry_get_text(GTK_ENTRY(pot2surf_entry_source_pot_file)); const gchar *surf_file = gtk_entry_get_text(GTK_ENTRY(pot2surf_entry_target_surf_file)); GString *default_file = NULL; gtk_tree_model_foreach(GTK_TREE_MODEL(pot2surf_list_store), pot2surf_count_surf, &n); if(n == 0) { visu_ui_raiseWarning(_("Saving a file"), _("Please specify surfaces to draw"), (GtkWindow*)0); return; } if(strcmp(pot_file, "") == 0) { visu_ui_raiseWarning(_("Saving a file"), _("Please select a source pot file"), (GtkWindow*)0); return; } if(surf_file == NULL || strcmp(surf_file, "") == 0) { visu_ui_raiseWarning(_("Saving a file"), _("Please select a target surf file"), (GtkWindow*)0); return; } default_file = g_string_new(""); g_string_append(default_file, pot_file); g_string_append(default_file, ".instruc"); filter_instruc = gtk_file_filter_new (); filter_none = gtk_file_filter_new(); file_chooser = gtk_file_chooser_dialog_new("Save as a .instruc file", GTK_WINDOW(convert_window), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); if(directory) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(file_chooser), directory); gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(file_chooser),default_file->str); gtk_file_filter_add_pattern(filter_instruc, "*.instruc"); gtk_file_filter_set_name(filter_instruc, "Instruction files (*.instruc)"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(file_chooser), filter_instruc); gtk_file_filter_add_pattern(filter_none, "*"); gtk_file_filter_set_name(filter_none, "All files"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(file_chooser), filter_none); while(1) switch(gtk_dialog_run(GTK_DIALOG(file_chooser))) { case GTK_RESPONSE_ACCEPT: if(!pot2surf_build_instruc_file(pot_file, surf_file, gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file_chooser)), n)) break; visu_ui_setLastOpenDirectory(gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER (file_chooser)), VISU_UI_DIR_SURFACE); g_string_free(default_file, TRUE); gtk_widget_destroy(file_chooser); return; case GTK_RESPONSE_CANCEL: default: g_string_free(default_file, TRUE); gtk_widget_destroy (file_chooser); return; } } /* Only used through a gtk_tree_model_foreach() Writes a surface name and value in a struct surf array */ gboolean pot2surf_get_surfs(GtkTreeModel *model, GtkTreePath *path _U_, GtkTreeIter *iter, gpointer data) { struct surf { char *name; float value; }; struct surf *surfaces = data; int i; for(i=0; surfaces[i].name != NULL; i++); gtk_tree_model_get(GTK_TREE_MODEL(model), iter, POT2SURF_NAME, &surfaces[i].name, POT2SURF_VALUE, &surfaces[i].value, -1); return FALSE; } /* Tries to build a valid .instruc file and then to executes this file. */ gboolean pot2surf_build_surf_file(GtkWidget *button _U_, gpointer data) { struct surf { char *name; float value; }; float *values = NULL; gchar **names = NULL; struct surf *surfaces = NULL; int n=0, i; const gchar *pot_file = gtk_entry_get_text(GTK_ENTRY(pot2surf_entry_source_pot_file)); const gchar *surf_file = gtk_entry_get_text(GTK_ENTRY(pot2surf_entry_target_surf_file)); gtk_tree_model_foreach(GTK_TREE_MODEL(pot2surf_list_store), pot2surf_count_surf, &n); if(n == 0) { visu_ui_raiseWarning(_("Saving a file"), _("Please specify surfaces to draw"), (GtkWindow*)0); return FALSE; } if(pot_file == NULL || strcmp(pot_file, "") == 0) { visu_ui_raiseWarning(_("Saving a file"), _("Please select a source pot file"), (GtkWindow*)0); return FALSE; } if(surf_file == NULL || strcmp(surf_file, "") == 0) { visu_ui_raiseWarning(_("Saving a file"), _("Please select a target surf file"), (GtkWindow*)0); return FALSE; } surfaces = g_malloc(n*sizeof(struct surf)); values = g_malloc(n*sizeof(float)); names = g_malloc(n*sizeof(gchar *)); for(i=0; istr, 0) == 0) */ /* { */ /* g_string_free(surf_file_wrote, TRUE); */ /* return FALSE; */ /* } */ /* return TRUE; */ /* } */ /* void pot2surf_select_build_surf(GtkWidget *radio_button, GtkWidget *hbox) */ /* { */ /* gtk_widget_set_sensitive(hbox, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio_button))); */ /* } */ /* void pot2surf_select_build_instruc(GtkWidget *radio_button, GtkWidget *hbox) */ /* { */ /* gtk_widget_set_sensitive(hbox, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio_button))); */ /* } */ gboolean pot2surf_load_instruc_file(const gchar *instruc_filename) { GIOChannel* instruc_file=NULL; GString *line=NULL; gchar *surf_file=NULL; gchar *pot_file=NULL; int n=0, i, j; gchar **surf_names; float *surf_values; GtkTreeIter iter; float pot_min, pot_max; char float_to_string[128]; instruc_file = g_io_channel_new_file(instruc_filename, "r", NULL); line = g_string_new(""); if(instruc_file == NULL) { visu_ui_raiseWarning(_("Loading a file"), _("Can't open selected file"), (GtkWindow*)0); return FALSE; } if(g_io_channel_read_line_string(instruc_file, line, NULL, NULL) != G_IO_STATUS_NORMAL) { visu_ui_raiseWarning(_("Loading a file"), _("Line 1 must contain the full path to the .pot" " file to read\n"), (GtkWindow*)0); g_string_free(line, TRUE); return FALSE; } pot_file = g_strstrip(g_strdup(line->str)); if(g_io_channel_read_line_string(instruc_file, line, NULL, NULL) != G_IO_STATUS_NORMAL) { visu_ui_raiseWarning(_("Loading a file"), _("Line 2 must contain the full path to the" " .surf file to read\n"), (GtkWindow*)0); g_string_free(line, TRUE); g_free(instruc_file); return FALSE; } surf_file = g_strstrip(g_strdup(line->str)); if((g_io_channel_read_line_string(instruc_file, line, NULL, NULL) != G_IO_STATUS_NORMAL) || (sscanf(line->str, "%d", &n) != 1)) { visu_ui_raiseWarning(_("Loading a file"), _("Line 3 must contain the number of" " surfaces to build\n"), (GtkWindow*)0); g_string_free(line, TRUE); g_free(instruc_file); g_free(surf_file); return FALSE; } surf_names = g_malloc(n*sizeof(gchar *)); surf_values = g_malloc(n*sizeof(gchar *)); for(i=0; istr, "%f %s", &surf_values[i], surf_names[i]) != 2)) { visu_ui_raiseWarning(_("Loading a file"), _("Lines must contain the value of the" " surface to build and its name\n"), (GtkWindow*)0); g_string_free(line, TRUE); g_free(instruc_file); g_free(surf_file); for(j=0; j #if GTK_MAJOR_VERSION < 3 /** * gtk_tree_model_iter_previous: * @tree_model: the #GtkTreeModel to get the previous iteration from ; * @iter: a location to a #GtkTreeIter to store the result. * * Similar to gtk_tree_model_iter_next(). See * www.gtk.org * for more info. * * Return value: TRUE if @iter has been changed to the next node. **/ gboolean gtk_tree_model_iter_previous(GtkTreeModel *tree_model, GtkTreeIter *iter); #endif /** * visu_ui_panel_surfaces_tools_fileWidget: * * Creates a widget containing an interface to merge surf files. * Don't use two of them simultaneously, * they would conflict. * * Return value: an allocated GtkWidget containing the interface. **/ GtkWidget *visu_ui_panel_surfaces_tools_fileWidget(); /** * visu_ui_panel_surfaces_tools_convertWidget: * * Creates a widget containing the whole pot2surf frontend. Don't use two of them simultaneously, * they would conflict. * * Return value: an allocated GtkWidget containing the interface. **/ GtkWidget *visu_ui_panel_surfaces_tools_convertWidget(); /** * visu_ui_panel_surfaces_tools_init: * * Opens a new window containing tools to operate on surf and pot files. **/ void visu_ui_panel_surfaces_tools_init(); #endif v_sim-3.7.0/src/panelModules/panelMethod.c0000644000353400050620000003430512215546063015415 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "panelMethod.h" #include #include #include #include #include #include "gtkAtomic.h" #include "gtkSpin.h" /** * SECTION: panelMethod * @short_description: The tab where drawing method is chosen (atomic * or spin). * * This tab has an area to display custom widgets according to * the selected rendering method, see visu_ui_panel_method_set(). */ /* Functions used to initialise the * specific area in the panel of rendering methods. */ ToolInitFunc listInitRendenringConfigGtkFunc[] = { visu_ui_panel_elements_atomic_initMethod, visu_ui_panel_elements_spin_initMethod, (ToolInitFunc)0}; /* Local variables. */ /* Store the toolpanel object, can be interesting to fetch the current visuData object for instance. */ static GtkWidget* panelMethod; /* A flag to control if the GTK part of the panel has been initialated or not. */ static gboolean isPanelInitialised; /* This is a hashtable to store the pointers to methods used to display some specific options of rendering methods. The key are pointer to valid RenderingMethod and the values are pointer to struct RenderingExpanderWidget_struct. */ static GHashTable *listOfRenderingSpecificConfigWidget; /* Since C doesn't accept to (gpointer)-ize pointers to methods the hashtable can't store directly VisuUiNewWidgetFunc() so they are encapsulated in this struct. */ struct RenderingExpanderWidget_struct { VisuUiNewWidgetFunc create; VisuUiPanelDestroyFunc destroy; }; static VisuUiPanelDestroyFunc currentDestroyFunc; /* Liststore to store the icon and the name of all rendering methods. */ static GtkListStore *listStoreRenderingMethods; enum { COLUMN_ICON, /* A pixmap to represent the method */ COLUMN_NAME, /* The label shown */ COLUMN_POINTER_TO_DATA, /* Pointer to the rendering method. */ COLUMN_POINTER_TO_WIDGETS, /* Pointer the above structure. */ N_COLUMNS }; /* Widgets that can be accessed during the run. */ static GtkWidget *descrLabel; static GtkWidget *comboMethod; static GtkWidget *viewport; /* Loacl methods. */ static GtkWidget* createTreeListRenderingMethod(int *iterSelected); static void setRenderingSpecificWidget(struct RenderingExpanderWidget_struct *str); /* Callbacks */ static void onMethodPanelEnter(VisuUiPanel *visu_ui_panel, gpointer data); static void onRenderingChanged(GObject *obj, VisuRendering *meth, gpointer data); static void comboInputMethodsChanged(GtkComboBox *combo, gpointer data); VisuUiPanel* visu_ui_panel_method_init(VisuUiMain *ui _U_) { char *cl = _("Rendering method"); char *tl = _("Draw"); int i; /* Now that everything has a value, we create the panel. */ panelMethod = visu_ui_panel_newWithIconFromPath("Panel_method", cl, tl, "stock-method_20.png"); if (!panelMethod) return (VisuUiPanel*)0; visu_ui_panel_setDockable(VISU_UI_PANEL(panelMethod), TRUE); /* Initialisation of loacl variables. */ isPanelInitialised = FALSE; currentDestroyFunc = (VisuUiPanelDestroyFunc)0; listOfRenderingSpecificConfigWidget = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_free); /* Initialise the rendering specific widgets */ for (i = 0; listInitRendenringConfigGtkFunc[i]; i++) listInitRendenringConfigGtkFunc[i](); /* Set global callbacks. */ g_signal_connect(G_OBJECT(panelMethod), "page-entered", G_CALLBACK(onMethodPanelEnter), (gpointer)0); return VISU_UI_PANEL(panelMethod); } static void onMethodPanelEnter(VisuUiPanel *visu_ui_panel _U_, gpointer data _U_) { GtkWidget *label, *vbox, *align, *scrollView, *hbox; int iterSelected; /* On page enter, we just create the GTK objects if required. */ if (isPanelInitialised) return; vbox = gtk_vbox_new(FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 2); label = gtk_label_new(_("Input method:")); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_misc_set_padding(GTK_MISC(label), 5, 0); gtk_widget_set_name(label, "label_head"); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); comboMethod = createTreeListRenderingMethod(&iterSelected); gtk_box_pack_start(GTK_BOX(hbox), comboMethod, TRUE, TRUE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 2); label = gtk_label_new(_("Description:")); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.); gtk_misc_set_padding(GTK_MISC(label), 15, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); descrLabel = gtk_label_new(""); gtk_widget_set_name(descrLabel, "label_info"); gtk_misc_set_alignment(GTK_MISC(descrLabel), 0.5, 0.5); gtk_misc_set_padding(GTK_MISC(descrLabel), 2, 0); gtk_box_pack_start(GTK_BOX(hbox), descrLabel, TRUE, TRUE, 0); gtk_widget_set_size_request(descrLabel, 250, -1); gtk_label_set_use_markup(GTK_LABEL(descrLabel), TRUE); gtk_label_set_line_wrap(GTK_LABEL(descrLabel), TRUE); gtk_label_set_justify(GTK_LABEL(descrLabel), GTK_JUSTIFY_FILL); align = gtk_alignment_new(0., 0.5, 1., 1.); gtk_alignment_set_padding(GTK_ALIGNMENT(align), 10, 0, 0, 0); gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, FALSE, 0); label = gtk_label_new(_("Options:")); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_misc_set_padding(GTK_MISC(label), 5, 0); gtk_widget_set_name(label, "label_head"); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_container_add(GTK_CONTAINER(align), label); scrollView = gtk_scrolled_window_new((GtkAdjustment*)0, (GtkAdjustment*)0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (scrollView), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (scrollView), GTK_SHADOW_NONE); gtk_box_pack_start(GTK_BOX(vbox), scrollView, TRUE, TRUE, 2); viewport = gtk_viewport_new (NULL, NULL); gtk_container_add(GTK_CONTAINER(scrollView), viewport); gtk_widget_show_all(vbox); isPanelInitialised = TRUE; gtk_container_add(GTK_CONTAINER(panelMethod), vbox); /* Set callbacks. */ g_signal_connect(G_OBJECT(comboMethod), "changed", G_CALLBACK(comboInputMethodsChanged), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "renderingChanged", G_CALLBACK(onRenderingChanged), (gpointer)1); /* Set the default values. */ gtk_combo_box_set_active(GTK_COMBO_BOX(comboMethod), iterSelected); } static GtkWidget* createTreeListRenderingMethod(int *iterSelected) { GtkTreeIter iter; GList *methodLst; GtkWidget *methodsWd; GtkCellRenderer *renderer; int i; VisuRendering *methodInUse, *meth; GdkPixbuf *pixbufIconBox; gpointer str; const gchar *iconPath; DBG_fprintf(stderr, "Panel Method: create the combobox of methods.\n"); /* We create the structure that store the methods */ listStoreRenderingMethods = gtk_list_store_new (N_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_POINTER); *iterSelected = 0; i = 0; methodInUse = visu_object_getRendering(VISU_OBJECT_INSTANCE); for (methodLst = visu_rendering_getAllObjects(); methodLst; methodLst = g_list_next(methodLst)) { meth = (VisuRendering*)methodLst->data; DBG_fprintf(stderr, " | add method '%s'.\n", visu_rendering_getName(meth, TRUE)); iconPath = visu_rendering_getIconPath(meth); if (iconPath) pixbufIconBox = gdk_pixbuf_new_from_file_at_size(iconPath, 16, 16, (GError**)0); else pixbufIconBox = (GdkPixbuf*)0; str = g_hash_table_lookup(listOfRenderingSpecificConfigWidget, methodLst->data); gtk_list_store_append(listStoreRenderingMethods, &iter); gtk_list_store_set(listStoreRenderingMethods, &iter, COLUMN_ICON, pixbufIconBox, COLUMN_NAME, visu_rendering_getName(meth, TRUE), COLUMN_POINTER_TO_DATA, methodLst->data, COLUMN_POINTER_TO_WIDGETS, str, -1); if (meth == methodInUse) *iterSelected = i; i += 1; } /* We create the tree widget that show the methods. */ methodsWd = gtk_combo_box_new_with_model(GTK_TREE_MODEL(listStoreRenderingMethods)); renderer = gtk_cell_renderer_pixbuf_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(methodsWd), renderer, FALSE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(methodsWd), renderer, "pixbuf", 0); renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(methodsWd), renderer, FALSE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(methodsWd), renderer, "text", 1); return methodsWd; } static void comboInputMethodsChanged(GtkComboBox *combo, gpointer data _U_) { GtkTreeModel *tree; gboolean selected; GtkTreeIter iter; VisuRendering *meth; char* markup; struct RenderingExpanderWidget_struct *str; DBG_fprintf(stderr, "Panel Method: Change occured on the method combo.\n"); tree = gtk_combo_box_get_model(combo); selected = gtk_combo_box_get_active_iter(combo, &iter); if (selected) { gtk_tree_model_get(tree, &iter, COLUMN_POINTER_TO_DATA, &meth, COLUMN_POINTER_TO_WIDGETS, &str, -1); g_return_if_fail(meth); DBG_fprintf(stderr, "Panel Method: set the rendering method to '%s'.\n", visu_rendering_getName(meth, FALSE)); markup = g_markup_printf_escaped("%s", visu_rendering_getDescription(meth)); gtk_label_set_markup(GTK_LABEL(descrLabel), markup); g_free(markup); visu_object_setRendering(VISU_OBJECT_INSTANCE, meth); setRenderingSpecificWidget(str); } else { g_warning("Can't find the selected method in the" " combobox of the config panel.\n"); gtk_label_set_text(GTK_LABEL(descrLabel), _("None")); setRenderingSpecificWidget((struct RenderingExpanderWidget_struct*)0); } } static void setRenderingSpecificWidget(struct RenderingExpanderWidget_struct *str) { GtkWidget *wd; /* Remove the current widget. */ wd = gtk_bin_get_child(GTK_BIN(viewport)); if (wd) { if (currentDestroyFunc) currentDestroyFunc(); gtk_widget_destroy(wd); } if (str && str->create) { DBG_fprintf(stderr, "Panel Method: creating the rendering specific" " widget for current method.\n"); wd = str->create(); currentDestroyFunc = str->destroy; } else { DBG_fprintf(stderr, "Panel Method: no rendering specific" " widget for the current method.\n"); wd = gtk_label_new(""); gtk_label_set_markup(GTK_LABEL(wd), _("None")); gtk_misc_set_alignment(GTK_MISC(wd), 0., 0.); gtk_misc_set_padding(GTK_MISC(wd), 15, 0); currentDestroyFunc = (VisuUiPanelDestroyFunc)0; } gtk_container_add(GTK_CONTAINER(viewport), wd); gtk_widget_show(wd); } static void onRenderingChanged(GObject *obj _U_, VisuRendering *meth, gpointer data _U_) { GtkTreeIter iter; gboolean valid; VisuRendering* method; int i; if (meth) { DBG_fprintf(stderr, "Panel Method: changing rendering method to '%s'.\n", visu_rendering_getName(meth, FALSE)); i = 0; /* Get the first iter in the list */ valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(listStoreRenderingMethods), &iter); while (valid) { gtk_tree_model_get(GTK_TREE_MODEL(listStoreRenderingMethods), &iter, COLUMN_POINTER_TO_DATA, &method, -1); if (method == meth) { gtk_combo_box_set_active(GTK_COMBO_BOX(comboMethod), i); DBG_fprintf(stderr, "Panel Method: ok, new method found at position %d.\n", i); return; } valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(listStoreRenderingMethods), &iter); i += 1; } g_warning("Can't find the current rendering method ('%s')" " is the combobox of the config panel.", visu_rendering_getName(meth, FALSE)); } else g_warning("Unsupported NULL rendering method."); } void visu_ui_panel_method_set(VisuRendering *method, VisuUiNewWidgetFunc create, VisuUiPanelDestroyFunc destroy) { struct RenderingExpanderWidget_struct *str; g_return_if_fail(method && (!destroy || (destroy && create))); if (!create) return; str = g_malloc(sizeof(struct RenderingExpanderWidget_struct)); str->create = create; str->destroy = destroy; g_hash_table_insert(listOfRenderingSpecificConfigWidget, (gpointer)method, (gpointer)str); } v_sim-3.7.0/src/panelModules/panelMethod.h0000644000353400050620000000545112215546063015422 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef PANELMETHOD_H #define PANELMETHOD_H #include #include #include /** * VisuUiPanelDestroyFunc: * * Prototype of method called when the rendering method widget is destroyed. */ typedef void (*VisuUiPanelDestroyFunc)(void); /** * visu_ui_panel_method_init: * * Should be used in the list declared in externalModules.h to be loaded by * V_Sim on start-up. This routine will create the #VisuUiPanel where the * stuff about a rendering method can be tuned, such as choosing the * current rendering method, its parameters... * * Returns: a newly created #VisuUiPanel object. */ VisuUiPanel* visu_ui_panel_method_init(); /** * visu_ui_panel_method_set: * @method: a #RenderingMethod ; * @create: a method returning a widget ; * @destroy: a method to detached, signals, free everything from the * created widget. * * This method allows to initiate the method to deal with the interface. */ void visu_ui_panel_method_set(VisuRendering *method, VisuUiNewWidgetFunc create, VisuUiPanelDestroyFunc destroy); #endif v_sim-3.7.0/src/panelModules/panelMap.c0000644000353400050620000013730412215546063014715 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD, Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2005) Adresses ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD and Damien CALISTE and Olivier D'Astier, laboratoire L_Sim, (2001-2005) E-mail addresses : BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "panelMap.h" #include "panelPlanes.h" #include "panelSurfaces.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /** * SECTION:panelMap * @short_description: The widget to create coloured map. * * This is the user interface for the coloured maps. For a * plane, a scalar field and a shade, it is possible to draw one * coloured plane. The available planes are taken from the #panelVisuPlane * subpanel and the scalar field for the #panelSurfaces. */ /* Local variables. */ static GtkWidget *panelMap; static GtkWidget *comboVisuPlane; static GtkWidget *comboField; static GtkWidget *comboToolShade, *ckAlpha; static GtkWidget *comboMap; static GtkWidget *spinPrecision; static GtkWidget *rdLinear, *rdLog, *rdZero; static GtkWidget *ckColour, *cbColour; static GtkWidget *spinIsoLines; static GtkWidget *removeButton, *buildButton, *exportButton; static VisuGlExtMaps *extMaps; static VisuGlExtShade *extLegend; static float drawnMinMax[2] = {G_MAXFLOAT, -G_MAXFLOAT}; static GtkWidget *radioNormalized, *radioMinMax; static GtkWidget *hboxEntries, *entryDataMax, *entryDataMin; static gboolean isMapInitialised; static GtkWidget *warnVisuPlane, *warnField, *warnLabel; static gulong comboMap_signal; /* String used to labelled planes, dist. means 'distance' and norm. means 'normal' (50 chars max). */ #define LABEL_PLANE _("plane (%2d;%2d;%2d - %4.1f)") enum { MAP_PLANE, MAP_MOVE_SIGNAL, MAP_LABEL, MAP_OBJ, MAP_N_COLUMNS }; static GtkListStore *maps; /* Local methods. */ static void createGtkInterface(VisuUiPanel *panel); static gboolean getElements(VisuPlane **plane, VisuScalarField **field, ToolShade **shade); static void getParameters(ToolMatrixScalingFlag *scale, float **rgb, float manualMinMax[2], gboolean *useMinMax, float *precision, guint *nLines); static gboolean setupMap( gpointer data); static gboolean rebuildFromField(gpointer data); static VisuPlane* removeMap(GtkTreeIter *iter); static void updateInterface(gboolean selectFirst); static void setField(VisuMap *map); static void setCompute(VisuMap *map); static gboolean setGlobalMinMax(); static gboolean setIsoLine(VisuMap *map); static VisuMap* addMap(); static gboolean checkAvailability(); /* Local callbacks. */ static void onBuildClicked(GtkButton *button, gpointer data); static void onRemoveClicked(GtkButton *button, gpointer data); static void onExportClicked(GtkButton *button, gpointer data); static void onPrecisionChanged(GtkSpinButton *spin, gpointer data); static void onFieldChanged(GtkComboBox *combo, gpointer data); static void onToolShadeChanged(VisuUiShadeCombobox *combo, ToolShade *shade, gpointer data); static void onComboVisuPlaneChanged(GtkComboBox *combo, gpointer data); static void onComboMapChanged(GtkComboBox *combo, gpointer data); static void onPlaneMoved(VisuPlane *plane, gpointer data); static void onScaleChanged(GtkToggleButton *button, gpointer data); static void onAlphaChanged(GtkToggleButton *button, gpointer data); static void onUseColourChanged(GtkToggleButton *button, gpointer data); static void onIsoChanged(GtkSpinButton *button, gpointer data); static void onColorChange(VisuUiColorCombobox *combo, ToolColor *selectedColor, gpointer data); static void onScaleTypeChange(GtkToggleButton *toggle, gpointer data); static void onEntryMinMaxChangeValue(VisuUiNumericalEntry *entry, double oldValue, gpointer data); static void onMapEnter(VisuUiPanel *map, gpointer data); static void onViewAvail(VisuObject *obj, VisuData *dataObj, VisuGlView *view, gpointer data); static void onPlaneDeleted(GtkTreeModel *tree_model, GtkTreePath *path, gpointer user_data); static void createGtkInterface(VisuUiPanel *panel) { GtkWidget *vbox, *hbox, *label, *combo, *align, *wd; GtkListStore *list; GtkCellRenderer *renderer; ToolColor *color; float black[4] = {0.f, 0.f, 0.f, 1.f}; int pos; /* We create the list of maps. */ maps = gtk_list_store_new(MAP_N_COLUMNS, G_TYPE_OBJECT, G_TYPE_ULONG, G_TYPE_STRING, G_TYPE_POINTER); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(panel), vbox); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 3); label = gtk_label_new(_("Map sources")); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_widget_set_name(label, "label_head"); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); warnLabel = gtk_hbox_new(FALSE, 0); gtk_box_pack_end(GTK_BOX(hbox), warnLabel, FALSE, FALSE, 0); wd = gtk_image_new_from_stock(GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_BUTTON); gtk_box_pack_start(GTK_BOX(warnLabel), wd, FALSE, FALSE, 0); label = gtk_label_new(_("missing elements")); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_box_pack_start(GTK_BOX(warnLabel), label, FALSE, FALSE, 0); /* The plane selector. */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Cutting plane:")); gtk_misc_set_padding(GTK_MISC(label), 5, 0); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); label = gtk_label_new(_("" "Create elements in the 'planes' tab")); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_misc_set_padding(GTK_MISC(label), 5, 0); gtk_misc_set_alignment(GTK_MISC(label), 1., 0.5); gtk_box_pack_end(GTK_BOX(hbox), label, FALSE, FALSE, 0); align = gtk_alignment_new(0.5, 0.5, 1.0, 1.0); gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, 15, 15); gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, FALSE, 2); hbox = gtk_hbox_new(FALSE, 5); gtk_container_add(GTK_CONTAINER(align), hbox); list = visu_ui_panel_planes_getList(); g_signal_connect(G_OBJECT(list), "row-deleted", G_CALLBACK(onPlaneDeleted), (gpointer)0); combo = gtk_combo_box_new_with_model(GTK_TREE_MODEL(list)); renderer = gtk_cell_renderer_pixbuf_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), renderer, FALSE); g_object_set(G_OBJECT(renderer), "xpad", 10, NULL); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(combo), renderer, "pixbuf", VISU_UI_PANEL_PLANES_COLOR_PIXBUF); renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), renderer, FALSE); g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(combo), renderer, "markup", VISU_UI_PANEL_PLANES_LABEL); gtk_box_pack_start(GTK_BOX(hbox), combo, TRUE, TRUE, 0); comboVisuPlane = combo; g_signal_connect(G_OBJECT(combo), "changed", G_CALLBACK(onComboVisuPlaneChanged), (gpointer)0); warnVisuPlane = gtk_image_new_from_stock(GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_BUTTON); gtk_box_pack_end(GTK_BOX(hbox), warnVisuPlane, FALSE, FALSE, 0); /* The scalar field selector. */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Scalar field:")); gtk_misc_set_padding(GTK_MISC(label), 5, 0); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); label = gtk_label_new(_("" "Import fields in the 'isosurfaces' tab")); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_misc_set_padding(GTK_MISC(label), 5, 0); gtk_misc_set_alignment(GTK_MISC(label), 1., 0.5); gtk_box_pack_end(GTK_BOX(hbox), label, FALSE, FALSE, 0); align = gtk_alignment_new(0.5, 0.5, 1.0, 1.0); gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, 15, 15); gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, FALSE, 2); hbox = gtk_hbox_new(FALSE, 5); gtk_container_add(GTK_CONTAINER(align), hbox); list = visu_ui_panel_surfaces_getFields(); combo = gtk_combo_box_new_with_model(GTK_TREE_MODEL(list)); renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), renderer, FALSE); g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(combo), renderer, "markup", VISU_UI_SURFACES_FIELD_LABEL); gtk_box_pack_start(GTK_BOX(hbox), combo, TRUE, TRUE, 0); comboField = combo; g_signal_connect(G_OBJECT(combo), "changed", G_CALLBACK(onFieldChanged), (gpointer)0); warnField = gtk_image_new_from_stock(GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_BUTTON); gtk_box_pack_end(GTK_BOX(hbox), warnField, FALSE, FALSE, 0); /* The shade selector. */ wd = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), wd, FALSE, FALSE, 0); label = gtk_label_new(_("Shade:")); gtk_misc_set_padding(GTK_MISC(label), 5, 0); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_box_pack_start(GTK_BOX(wd), label, FALSE, FALSE, 0); ckAlpha = gtk_check_button_new_with_mnemonic(_("with _transparency")); gtk_box_pack_end(GTK_BOX(wd), ckAlpha, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(ckAlpha), "toggled", G_CALLBACK(onAlphaChanged), (gpointer)0); align = gtk_alignment_new(0.5, 0.5, 1.0, 1.0); gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, 15, 15); gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, FALSE, 2); combo = visu_ui_shade_combobox_new(TRUE, TRUE); gtk_combo_box_set_active(GTK_COMBO_BOX(combo), -1); gtk_container_add(GTK_CONTAINER(align), combo); g_signal_connect(G_OBJECT(combo), "shade-selected", G_CALLBACK(onToolShadeChanged), (gpointer)0); comboToolShade = combo; /* ToolOptions. */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 3); label = gtk_label_new(_("Options")); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_widget_set_name(label, "label_head"); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); label = gtk_label_new("%"); gtk_misc_set_padding(GTK_MISC(label), 5, 0); gtk_box_pack_end(GTK_BOX(hbox), label, FALSE, FALSE, 0); spinPrecision = gtk_spin_button_new_with_range(0, 200, 5); gtk_entry_set_width_chars(GTK_ENTRY(spinPrecision), 3); gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinPrecision), 0); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinPrecision), 100); gtk_box_pack_end(GTK_BOX(hbox), spinPrecision, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(spinPrecision), "value-changed", G_CALLBACK(onPrecisionChanged), (gpointer)0); label = gtk_label_new(_("Precision:")); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_box_pack_end(GTK_BOX(hbox), label, FALSE, FALSE, 5); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Scale:")); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 5); rdLinear = gtk_radio_button_new_with_mnemonic((GSList*)0, _("_linear")); g_signal_connect(G_OBJECT(rdLinear), "toggled", G_CALLBACK(onScaleChanged), GINT_TO_POINTER(TOOL_MATRIX_SCALING_LINEAR)); gtk_box_pack_start(GTK_BOX(hbox), rdLinear, FALSE, FALSE, 0); rdLog = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(rdLinear), _("lo_g.")); g_signal_connect(G_OBJECT(rdLog), "toggled", G_CALLBACK(onScaleChanged), GINT_TO_POINTER(TOOL_MATRIX_SCALING_LOG)); gtk_box_pack_start(GTK_BOX(hbox), rdLog, FALSE, FALSE, 0); rdZero = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(rdLinear), _("_zero centred log.")); g_signal_connect(G_OBJECT(rdZero), "toggled", G_CALLBACK(onScaleChanged), GINT_TO_POINTER(TOOL_MATRIX_SCALING_ZERO_CENTRED_LOG)); gtk_box_pack_start(GTK_BOX(hbox), rdZero, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Number of isolines:")); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); spinIsoLines = gtk_spin_button_new_with_range(0, 20, 1); gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinIsoLines), 0); gtk_entry_set_width_chars(GTK_ENTRY(spinIsoLines), 2); gtk_box_pack_start(GTK_BOX(hbox), spinIsoLines, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(spinIsoLines), "value-changed", G_CALLBACK(onIsoChanged), (gpointer)0); align = gtk_alignment_new(1.0, 0.5, 0., 1.0); gtk_box_pack_start(GTK_BOX(hbox), align, TRUE, TRUE, 0); ckColour = gtk_check_button_new_with_mnemonic(_("_colour:")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ckColour), TRUE); g_signal_connect(G_OBJECT(ckColour), "toggled", G_CALLBACK(onUseColourChanged), (gpointer)0); gtk_container_add(GTK_CONTAINER(align), ckColour); cbColour = visu_ui_color_combobox_new(FALSE); visu_ui_color_combobox_setPrintValues(VISU_UI_COLOR_COMBOBOX(cbColour), FALSE); color = tool_color_addFloatRGBA(black, &pos); visu_ui_color_combobox_setSelection(VISU_UI_COLOR_COMBOBOX(cbColour), color); g_signal_connect(G_OBJECT(cbColour), "color-selected", G_CALLBACK(onColorChange), (gpointer)0); gtk_box_pack_start(GTK_BOX(hbox), cbColour, FALSE, FALSE, 5); /* The normalisation. */ hbox = gtk_hbox_new (FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Normalise:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); radioNormalized = gtk_radio_button_new_with_mnemonic(NULL, _("auto")); gtk_box_pack_start(GTK_BOX(hbox), radioNormalized, FALSE, FALSE, 0); radioMinMax = gtk_radio_button_new_with_mnemonic_from_widget (GTK_RADIO_BUTTON(radioNormalized), _("manual")); gtk_box_pack_start(GTK_BOX(hbox), radioMinMax, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioNormalized), TRUE); g_signal_connect(G_OBJECT(radioMinMax), "toggled", G_CALLBACK(onScaleTypeChange), GINT_TO_POINTER(FALSE)); g_signal_connect(G_OBJECT(radioNormalized), "toggled", G_CALLBACK(onScaleTypeChange), GINT_TO_POINTER(TRUE)); hboxEntries = gtk_hbox_new (FALSE, 0); gtk_widget_set_sensitive(hboxEntries, FALSE); gtk_box_pack_end(GTK_BOX(hbox), hboxEntries, FALSE, FALSE, 0); label = gtk_label_new("["); gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); gtk_box_pack_start(GTK_BOX(hboxEntries), label, TRUE, TRUE, 0); entryDataMin = visu_ui_numerical_entry_new(-1.); gtk_entry_set_width_chars(GTK_ENTRY(entryDataMin), 5); gtk_box_pack_start(GTK_BOX(hboxEntries), entryDataMin, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(entryDataMin), "value-changed", G_CALLBACK(onEntryMinMaxChangeValue), GINT_TO_POINTER(0)); label = gtk_label_new(";"); gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); gtk_box_pack_start(GTK_BOX(hboxEntries), label, FALSE, FALSE, 0); entryDataMax = visu_ui_numerical_entry_new(1.); gtk_entry_set_width_chars(GTK_ENTRY(entryDataMax), 5); gtk_box_pack_start(GTK_BOX(hboxEntries), entryDataMax, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(entryDataMax), "value-changed", G_CALLBACK(onEntryMinMaxChangeValue), GINT_TO_POINTER(1)); label = gtk_label_new("]"); gtk_box_pack_start(GTK_BOX(hboxEntries), label, FALSE, FALSE, 0); /* The action buttons. */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 5); wd = gtk_label_new(_("List of maps:")); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 5); comboMap = gtk_combo_box_new_with_model(GTK_TREE_MODEL(maps)); gtk_widget_set_sensitive(comboMap, FALSE); renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(comboMap), renderer, FALSE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(comboMap), renderer, "markup", MAP_LABEL); gtk_box_pack_start(GTK_BOX(hbox), comboMap, TRUE, FALSE, 0); comboMap_signal = g_signal_connect(G_OBJECT(comboMap), "changed", G_CALLBACK(onComboMapChanged), (gpointer)0); buildButton = gtk_button_new(); wd = gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_MENU); gtk_container_add(GTK_CONTAINER(buildButton), wd); gtk_box_pack_end(GTK_BOX(hbox), buildButton, FALSE, FALSE, 2); g_signal_connect(G_OBJECT(buildButton), "clicked", G_CALLBACK(onBuildClicked), (gpointer)0); removeButton = gtk_button_new(); wd = gtk_image_new_from_stock(GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU); gtk_container_add(GTK_CONTAINER(removeButton), wd); gtk_widget_set_sensitive(removeButton, FALSE); gtk_box_pack_end(GTK_BOX(hbox), removeButton, FALSE, FALSE, 2); g_signal_connect(G_OBJECT(removeButton), "clicked", G_CALLBACK(onRemoveClicked), (gpointer)0); exportButton = gtk_button_new(); wd = gtk_image_new_from_stock(GTK_STOCK_SAVE_AS, GTK_ICON_SIZE_MENU); gtk_container_add(GTK_CONTAINER(exportButton), wd); gtk_widget_set_sensitive(exportButton, FALSE); gtk_box_pack_end(GTK_BOX(hbox), exportButton, FALSE, FALSE, 2); g_signal_connect(G_OBJECT(exportButton), "clicked", G_CALLBACK(onExportClicked), (gpointer)0); gtk_widget_show_all(vbox); gtk_widget_hide(warnLabel); gtk_widget_hide(warnVisuPlane); gtk_widget_hide(warnField); isMapInitialised = TRUE; } /** * visu_ui_panel_map_update: * @map: (allow-none): a #VisuMap to update (parameters may have * changed). * * Rebuild @map depending on parameters selected in the interface. If * @map is NULL, rebuild all maps. * * Since: 3.7 **/ void visu_ui_panel_map_update(VisuMap *map) { setField(map); setCompute(map); setGlobalMinMax(); setIsoLine(map); visu_gl_ext_maps_draw(extMaps); visu_gl_ext_frame_draw(VISU_GL_EXT_FRAME(extLegend)); } static gboolean rebuildFromField(gpointer data _U_) { visu_ui_panel_map_update((VisuMap*)0); return FALSE; } static VisuMap* addMap() { GtkTreeIter iter; gboolean valid, add; VisuPlane *plane, *tmpVisuPlane; gulong moveId; gchar str[256]; float vect[3], dist; ToolShade *shade; VisuScalarField *field; VisuMap *map; DBG_fprintf(stderr, "Panel Map: add a new map.\n"); valid = getElements(&plane, &field, &shade); if (!valid) { gtk_widget_show(warnLabel); if (!plane) gtk_widget_show(warnVisuPlane); if (!field) gtk_widget_show(warnField); return (VisuMap*)0; } /* Check that the plane has not already been added. */ add = TRUE; for (valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(maps), &iter); valid && add; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(maps), &iter)) { gtk_tree_model_get(GTK_TREE_MODEL(maps), &iter, MAP_PLANE, &tmpVisuPlane, MAP_OBJ, &map, -1); g_object_unref(G_OBJECT(tmpVisuPlane)); add = add && (tmpVisuPlane != plane); } if (!add) return map; /* We listen to the moved signal. */ moveId = g_signal_connect_after(G_OBJECT(plane), "moved", G_CALLBACK(onPlaneMoved), (gpointer)0); map = visu_map_newFromPlane(plane); visu_plane_getNVectUser(plane, vect); dist = visu_plane_getDistanceFromOrigin(plane); sprintf(str, LABEL_PLANE, (int)vect[0], (int)vect[1], (int)vect[2], dist); /* We store this new entry in the map list. */ gtk_list_store_append(maps, &iter); gtk_list_store_set(maps, &iter, MAP_PLANE, plane, MAP_LABEL, str, MAP_MOVE_SIGNAL, moveId, MAP_OBJ, map, -1); /* Change the visibility status of the plane to FALSE. */ visu_ui_panel_planes_setRendered(plane, FALSE); /* We update the interface. */ DBG_fprintf(stderr, "Panel Map: update interface.\n"); updateInterface(FALSE); gtk_combo_box_set_active_iter(GTK_COMBO_BOX(comboMap), &iter); DBG_fprintf(stderr, "Panel Map: setup new map.\n"); g_idle_add(setupMap, (gpointer)map); return map; } static gboolean setupMap(gpointer data) { VisuMap *map = (VisuMap*)data; ToolShade *shade; ToolColor *color; gboolean redraw; g_return_val_if_fail(map, FALSE); shade = visu_ui_shade_combobox_getSelection(VISU_UI_SHADE_COMBOBOX(comboToolShade)); g_return_val_if_fail(shade, FALSE); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ckColour))) color = visu_ui_color_combobox_getSelection(VISU_UI_COLOR_COMBOBOX(cbColour)); else color = (ToolColor*)0; visu_gl_ext_maps_add(extMaps, map, gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinPrecision)), shade, color, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ckAlpha))); /* We set the map characteristics. */ setField(map); setCompute(map); /* Map is computed, we add the lines. */ redraw = setGlobalMinMax(); setIsoLine((redraw)?(VisuMap*)0:map); visu_gl_ext_maps_draw(extMaps); visu_gl_ext_frame_draw(VISU_GL_EXT_FRAME(extLegend)); return FALSE; } static void setField(VisuMap *map_) { gboolean valid; GtkTreeIter iter; float manualMinMax[2], *minmax, *rgb, precision; double minMax[2]; VisuScalarField *field; ToolMatrixScalingFlag scale; gboolean useMinMax; guint nLines; VisuMap *map; DBG_fprintf(stderr, "Panel Map: set field for map %p.\n", (gpointer)map_); g_return_if_fail(getElements((VisuPlane**)0, &field, (ToolShade**)0)); getParameters(&scale, &rgb, manualMinMax, &useMinMax, &precision, &nLines); if (useMinMax) minmax = manualMinMax; else minmax = (float*)0; if (map_) visu_map_setField(map_, field, scale, minmax); else for (valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(maps), &iter); valid; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(maps), &iter)) { gtk_tree_model_get(GTK_TREE_MODEL(maps), &iter, MAP_OBJ, &map, -1); if (map) visu_map_setField(map, field, scale, minmax); } visu_gl_ext_maps_setDirty(extMaps, map_); /* We update the legend min and max. */ if (useMinMax) visu_gl_ext_shade_setMinMax(extLegend, manualMinMax[0], manualMinMax[1]); else { visu_scalar_field_getMinMax(field, minMax); visu_gl_ext_shade_setMinMax(extLegend, minMax[0], minMax[1]); } } static void setCompute(VisuMap *map_) { gboolean valid; GtkTreeIter iter; VisuMap *map; DBG_fprintf(stderr, "Panel Map: compute map %p.\n", (gpointer)map_); /* We compute the map, or all maps. */ if (map_) visu_map_compute(map_); else for (valid = (map_)?TRUE:gtk_tree_model_get_iter_first(GTK_TREE_MODEL(maps), &iter); valid; valid = (map_)?FALSE:gtk_tree_model_iter_next(GTK_TREE_MODEL(maps), &iter)) { gtk_tree_model_get(GTK_TREE_MODEL(maps), &iter, MAP_OBJ, &map, -1); if (map) visu_map_compute(map); } } static gboolean setGlobalMinMax() { gboolean valid; GtkTreeIter iter; VisuMap *map; float *drawnMinMax_, oldMinMax[2]; oldMinMax[0] = drawnMinMax[0]; oldMinMax[1] = drawnMinMax[1]; /* We update the drawnMinMax array. */ drawnMinMax[0] = G_MAXFLOAT; drawnMinMax[1] = -G_MAXFLOAT; for (valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(maps), &iter); valid; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(maps), &iter)) { gtk_tree_model_get(GTK_TREE_MODEL(maps), &iter, MAP_OBJ, &map, -1); if (map) { drawnMinMax_ = visu_map_getScaledMinMax(map); drawnMinMax[0] = MIN(drawnMinMax[0], drawnMinMax_[0]); drawnMinMax[1] = MAX(drawnMinMax[1], drawnMinMax_[1]); } } DBG_fprintf(stderr, "Panel Map: global scaled min/max: %g/%g.\n", drawnMinMax[0], drawnMinMax[1]); return (oldMinMax[0] != drawnMinMax[0] || oldMinMax[1] != drawnMinMax[1]); } static gboolean setIsoLine(VisuMap *map_) { gboolean valid; GtkTreeIter iter; VisuMap *map; guint i, nLines; float minmax[2]; float *marks; nLines = (guint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinIsoLines)); DBG_fprintf(stderr, "Panel Map: set %d lines for map %p.\n", nLines, (gpointer)map_); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioMinMax))) { minmax[0] = 0.; minmax[1] = 1.; } else { minmax[0] = drawnMinMax[0]; minmax[1] = drawnMinMax[1]; } /* Compute the isolines for one or each maps. */ if (map_) visu_map_setLines(map_, nLines, minmax); else for (valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(maps), &iter); valid; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(maps), &iter)) { gtk_tree_model_get(GTK_TREE_MODEL(maps), &iter, MAP_OBJ, &map, -1); if (map) visu_map_setLines(map, nLines, minmax); } visu_gl_ext_maps_setDirty(extMaps, map_); /* Update the shade legend. */ marks = g_malloc(sizeof(float) * (2 + nLines)); for (i = 0; i < nLines; i++) marks[1 + i] = (minmax[1] - minmax[0]) * (float)(i + 1) / (float)(nLines + 1) + minmax[0]; marks[0] = drawnMinMax[0]; marks[1 + nLines] = drawnMinMax[1]; visu_gl_ext_shade_setMarks(extLegend, marks, 2 + nLines); g_free(marks); return TRUE; } /** * visu_ui_panel_map_setData: * @planeId: a entry for the plane combobox ; * @scalarFieldId: a entry for the scalar field combobox ; * @shadeId: a entry for the shade combobox. * * Change the values of the three combobox of this panel. * * Since: 3.4 * * Returns: (transfer none): the associated #VisuMap. */ VisuMap* visu_ui_panel_map_setData(guint planeId, guint scalarFieldId, guint shadeId) { if (!isMapInitialised) createGtkInterface(VISU_UI_PANEL(panelMap)); visu_gl_ext_setActive(VISU_GL_EXT(extMaps), FALSE); gtk_combo_box_set_active(GTK_COMBO_BOX(comboVisuPlane), planeId); gtk_combo_box_set_active(GTK_COMBO_BOX(comboField), scalarFieldId); gtk_combo_box_set_active(GTK_COMBO_BOX(comboToolShade), shadeId); visu_gl_ext_setActive(VISU_GL_EXT(extMaps), TRUE); return addMap(); } static void onBuildClicked(GtkButton *button _U_, gpointer data _U_) { addMap(); VISU_REDRAW_ADD; } static void onPrecisionChanged(GtkSpinButton *spin, gpointer data _U_) { if (visu_gl_ext_maps_setPrecision(extMaps, (VisuMap*)0, gtk_spin_button_get_value(spin))) { visu_gl_ext_maps_draw(extMaps); VISU_REDRAW_ADD; } } static void onAlphaChanged(GtkToggleButton *button, gpointer data _U_) { if (visu_gl_ext_maps_setTransparent(extMaps, (VisuMap*)0, gtk_toggle_button_get_active(button))) { visu_gl_ext_maps_draw(extMaps); VISU_REDRAW_ADD; } } static void onToolShadeChanged(VisuUiShadeCombobox *combo _U_, ToolShade *shade, gpointer data _U_) { gtk_widget_hide(warnLabel); if (visu_gl_ext_maps_setShade(extMaps, (VisuMap*)0, shade)) visu_gl_ext_maps_draw(extMaps); if (visu_gl_ext_shade_setShade(extLegend, shade) || visu_gl_ext_frame_setGlView(VISU_GL_EXT_FRAME(extLegend), visu_ui_panel_getView(VISU_UI_PANEL(panelMap)))) visu_gl_ext_frame_draw(VISU_GL_EXT_FRAME(extLegend)); if (visu_gl_ext_getActive(VISU_GL_EXT(extMaps)) || visu_gl_ext_getActive(VISU_GL_EXT(extLegend))) VISU_REDRAW_ADD; } static void onFieldChanged(GtkComboBox *combo _U_, gpointer data _U_) { gtk_widget_hide(warnLabel); gtk_widget_hide(warnField); if (visu_gl_ext_getActive(VISU_GL_EXT(extMaps)) && checkAvailability()) { g_idle_add(rebuildFromField, (gpointer)0); VISU_REDRAW_ADD; } } static void onComboVisuPlaneChanged(GtkComboBox *combo _U_, gpointer data _U_) { gtk_widget_hide(warnLabel); gtk_widget_hide(warnVisuPlane); } static void onComboMapChanged(GtkComboBox *combo, gpointer data _U_) { GtkTreeIter iter; gboolean valid; VisuPlane *plane, *tmpVisuPlane; GtkTreeModel *model; DBG_fprintf(stderr, "Panel Map: set map list to %d.\n", gtk_combo_box_get_active(combo)); valid = gtk_combo_box_get_active_iter(combo, &iter); g_return_if_fail(valid); gtk_tree_model_get(GTK_TREE_MODEL(maps), &iter, MAP_PLANE, &plane, -1); g_object_unref(G_OBJECT(plane)); visu_gl_ext_setActive(VISU_GL_EXT(extMaps), FALSE); model = gtk_combo_box_get_model(GTK_COMBO_BOX(comboVisuPlane)); for (valid = gtk_tree_model_get_iter_first(model, &iter); valid; valid = gtk_tree_model_iter_next(model, &iter)) { gtk_tree_model_get(model, &iter, VISU_UI_PANEL_PLANES_POINTER, &tmpVisuPlane, -1); g_object_unref(G_OBJECT(tmpVisuPlane)); if (plane == tmpVisuPlane) gtk_combo_box_set_active_iter(GTK_COMBO_BOX(comboVisuPlane), &iter); } visu_gl_ext_setActive(VISU_GL_EXT(extMaps), TRUE); } static void onPlaneMoved(VisuPlane *plane, gpointer data _U_) { gboolean valid; GtkTreeIter iter; VisuPlane *tmpVisuPlane; gchar str[256]; float vect[3], dist; if (visu_gl_ext_getActive(VISU_GL_EXT(extMaps))) { for (valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(maps), &iter); valid; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(maps), &iter)) { gtk_tree_model_get(GTK_TREE_MODEL(maps), &iter, MAP_PLANE, &tmpVisuPlane, -1); g_object_unref(G_OBJECT(tmpVisuPlane)); if (tmpVisuPlane == plane) { visu_plane_getNVectUser(plane, vect); dist = visu_plane_getDistanceFromOrigin(plane); /* We update the label in the map list. */ sprintf(str, LABEL_PLANE, (int)vect[0], (int)vect[1], (int)vect[2], dist); gtk_list_store_set(maps, &iter, MAP_LABEL, str, -1); } } setGlobalMinMax(); setIsoLine((VisuMap*)0); visu_gl_ext_maps_draw(extMaps); visu_gl_ext_frame_draw(VISU_GL_EXT_FRAME(extLegend)); } } static void onPlaneDeleted(GtkTreeModel *tree_model, GtkTreePath *path _U_, gpointer user_data _U_) { gboolean valid, valid2, found; GtkTreeIter iterMap, iterVisuPlane; VisuPlane *plane, *tmpVisuPlane; DBG_fprintf(stderr, "Panel Map: plane deleted.\n"); /* We try to find the plane in maps that is not existing anymore in planes. */ for (valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(maps), &iterMap); valid; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(maps), &iterMap)) { gtk_tree_model_get(GTK_TREE_MODEL(maps), &iterMap, MAP_PLANE, &tmpVisuPlane, -1); g_object_unref(G_OBJECT(tmpVisuPlane)); found = FALSE; for (valid2 = gtk_tree_model_get_iter_first(tree_model, &iterVisuPlane); valid2 && !found; valid2 = gtk_tree_model_iter_next(tree_model, &iterVisuPlane)) { gtk_tree_model_get(tree_model, &iterVisuPlane, VISU_UI_PANEL_PLANES_POINTER, &plane, -1); g_object_unref(G_OBJECT(plane)); found = found || (plane == tmpVisuPlane); } if (!found) { plane = removeMap(&iterMap); updateInterface(TRUE); visu_gl_ext_maps_draw(extMaps); break; } } } static void onRemoveClicked(GtkButton *button _U_, gpointer data _U_) { gboolean valid; GtkTreeIter iter; VisuPlane *plane; /* We get the current map, if no, we do nothing. */ valid = gtk_combo_box_get_active_iter(GTK_COMBO_BOX(comboMap), &iter); if (!valid) return; plane = removeMap(&iter); /* Return the visibility status of the plane to TRUE. */ visu_ui_panel_planes_setRendered(plane, TRUE); updateInterface(TRUE); visu_gl_ext_maps_draw(extMaps); VISU_REDRAW_ADD; } static VisuPlane* removeMap(GtkTreeIter *iter) { VisuPlane *plane; gulong moveId; VisuMap *map; /* We stop the listener on the move signal. */ gtk_tree_model_get(GTK_TREE_MODEL(maps), iter, MAP_MOVE_SIGNAL, &moveId, MAP_PLANE, &plane, MAP_OBJ, &map, -1); g_signal_handler_disconnect(G_OBJECT(plane), moveId); g_object_unref(G_OBJECT(plane)); if (map) { visu_map_free(map); visu_gl_ext_maps_remove(extMaps, map); } /* We remove the entry from the liststore. */ g_signal_handler_block(G_OBJECT(GTK_COMBO_BOX(comboMap)), comboMap_signal); gtk_list_store_remove(maps, iter); g_signal_handler_unblock(G_OBJECT(GTK_COMBO_BOX(comboMap)), comboMap_signal); if (map && setGlobalMinMax()) setIsoLine((VisuMap*)0); return plane; } static void updateInterface(gboolean selectFirst) { gboolean valid; /* Update the interface. */ valid = (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(maps), (GtkTreeIter*)0) > 0); DBG_fprintf(stderr, "Panel Map: status of maps %d.\n", valid); gtk_widget_set_sensitive(removeButton, valid); gtk_widget_set_sensitive(exportButton, valid); gtk_widget_set_sensitive(comboMap, valid); if (valid && selectFirst) gtk_combo_box_set_active(GTK_COMBO_BOX(comboMap), 0); visu_gl_ext_setActive(VISU_GL_EXT(extMaps), valid); visu_gl_ext_setActive(VISU_GL_EXT(extLegend), valid); } static void onScaleChanged(GtkToggleButton *button, gpointer data) { if (!gtk_toggle_button_get_active(button)) return; visu_gl_ext_shade_setScaling(extLegend, GPOINTER_TO_INT(data)); if (visu_gl_ext_getActive(VISU_GL_EXT(extMaps))) { g_idle_add(rebuildFromField, (gpointer)0); VISU_REDRAW_ADD; } } static void onScaleTypeChange(GtkToggleButton *toggle, gpointer data) { if (!gtk_toggle_button_get_active(toggle)) return; gtk_widget_set_sensitive(hboxEntries, !GPOINTER_TO_INT(data)); if (visu_gl_ext_getActive(VISU_GL_EXT(extMaps))) { g_idle_add(rebuildFromField, (gpointer)0); VISU_REDRAW_ADD; } } static void onUseColourChanged(GtkToggleButton *button, gpointer data _U_) { ToolColor *color; if (gtk_toggle_button_get_active(button)) color = visu_ui_color_combobox_getSelection(VISU_UI_COLOR_COMBOBOX(cbColour)); else color = (ToolColor*)0; if (visu_gl_ext_maps_setLineColor(extMaps, (VisuMap*)0, color)) { visu_gl_ext_maps_draw(extMaps); VISU_REDRAW_ADD; } } static void onColorChange(VisuUiColorCombobox *combo _U_, ToolColor *selectedColor, gpointer data _U_) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ckColour)) && visu_gl_ext_maps_setLineColor(extMaps, (VisuMap*)0, selectedColor)) { visu_gl_ext_maps_draw(extMaps); VISU_REDRAW_ADD; } } static void onIsoChanged(GtkSpinButton *button _U_, gpointer data _U_) { if (visu_gl_ext_getActive(VISU_GL_EXT(extMaps))) { setIsoLine((VisuMap*)0); visu_gl_ext_maps_draw(extMaps); visu_gl_ext_frame_draw(VISU_GL_EXT_FRAME(extLegend)); } if (visu_gl_ext_getActive(VISU_GL_EXT(extLegend)) || visu_gl_ext_getActive(VISU_GL_EXT(extMaps))) VISU_REDRAW_ADD; } static void onEntryMinMaxChangeValue(VisuUiNumericalEntry *entry _U_, double oldValue _U_, gpointer data _U_) { if (visu_gl_ext_getActive(VISU_GL_EXT(extMaps))) { g_idle_add(rebuildFromField, (gpointer)0); VISU_REDRAW_ADD; } } static gboolean getElements(VisuPlane **plane, VisuScalarField **field, ToolShade **shade) { GtkTreeModel *model; GtkTreeIter iter; gboolean valid, out; if (plane) *plane = (VisuPlane*)0; if (field) *field = (VisuScalarField*)0; if (shade) *shade = (ToolShade*)0; out = TRUE; if (field) { model = gtk_combo_box_get_model(GTK_COMBO_BOX(comboField)); valid = gtk_combo_box_get_active_iter(GTK_COMBO_BOX(comboField), &iter); if (!model || !valid) out = FALSE; else gtk_tree_model_get(model, &iter, VISU_UI_SURFACES_FIELD_POINTER, field, -1); } if (shade) { *shade = visu_ui_shade_combobox_getSelection(VISU_UI_SHADE_COMBOBOX(comboToolShade)); if (!*shade) out = FALSE; } if (plane) { /* We get the plane to listen to its signals. */ model = gtk_combo_box_get_model(GTK_COMBO_BOX(comboVisuPlane)); valid = gtk_combo_box_get_active_iter(GTK_COMBO_BOX(comboVisuPlane), &iter); if (!model || !valid) out = FALSE; else { gtk_tree_model_get(model, &iter, VISU_UI_PANEL_PLANES_POINTER, plane, -1); g_object_unref(G_OBJECT(*plane)); } } return out; } static void getParameters(ToolMatrixScalingFlag *scale, float **rgb, float manualMinMax[2], gboolean *useMinMax, float *precision, guint *nLines) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rdLinear))) *scale = TOOL_MATRIX_SCALING_LINEAR; else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rdLog))) *scale = TOOL_MATRIX_SCALING_LOG; else *scale = TOOL_MATRIX_SCALING_ZERO_CENTRED_LOG; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ckColour))) *rgb = visu_ui_color_combobox_getSelection(VISU_UI_COLOR_COMBOBOX(cbColour))->rgba; else *rgb = (float*)0; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioNormalized))) *useMinMax = FALSE; else { manualMinMax[0] = visu_ui_numerical_entry_getValue(VISU_UI_NUMERICAL_ENTRY(entryDataMin)); manualMinMax[1] = visu_ui_numerical_entry_getValue(VISU_UI_NUMERICAL_ENTRY(entryDataMax)); DBG_fprintf(stderr, "Panel Map: get min/max: %g/%g.\n", manualMinMax[0], manualMinMax[1]); *useMinMax = TRUE; } *precision = (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinPrecision)); *nLines = (guint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinIsoLines)); } static void onExportClicked(GtkButton *button _U_, gpointer data _U_) { GtkWidget *dialog; gchar *name, *filename, *directory; GtkFileFilter *filterPDF, *filterSVG, *filter; VisuData *dataObj; VisuMapExportFormat format; gboolean valid; ToolShade *shade; float *rgb, precision; GError *error; GtkTreeIter iter; VisuMap *map; dialog = gtk_file_chooser_dialog_new (_("Export to SVG or PDF."), visu_ui_panel_getContainerWindow(VISU_UI_PANEL(panelMap)), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 7 gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER (dialog), TRUE); #endif filterPDF = filter = gtk_file_filter_new(); gtk_file_filter_set_name(filter, _("PDF document (*.pdf)")); gtk_file_filter_add_pattern(filter, "*.pdf"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter); filterSVG = filter = gtk_file_filter_new(); gtk_file_filter_set_name(filter, _("SVG document (*.svg)")); gtk_file_filter_add_pattern(filter, "*.svg"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter); /* We set the suggested filename, either a previous one or the one given. */ dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelMap)); directory = visu_ui_getLastOpenDirectory(); if (directory) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), directory); filename = (gchar*)0; if (dataObj) filename = g_object_get_data(G_OBJECT(dataObj), "exportMap_filename"); if (!filename) filename = _("map.pdf"); gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), filename); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); name = g_path_get_basename(filename); g_object_set_data_full(G_OBJECT(dataObj), "exportMap_filename", (gpointer)name, g_free); /* We detect the format. */ filter = gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(dialog)); if (filter == filterPDF) format = VISU_MAP_EXPORT_PDF; else if (filter == filterSVG) format = VISU_MAP_EXPORT_SVG; else format = VISU_MAP_EXPORT_PDF; /* We get the data. */ valid = gtk_combo_box_get_active_iter(GTK_COMBO_BOX(comboMap), &iter); g_return_if_fail(valid); gtk_tree_model_get(GTK_TREE_MODEL(maps), &iter, MAP_OBJ, &map, -1); shade = visu_ui_shade_combobox_getSelection(VISU_UI_SHADE_COMBOBOX(comboToolShade)); rgb = (float*)0; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ckColour))) rgb = visu_ui_color_combobox_getSelection(VISU_UI_COLOR_COMBOBOX(cbColour))->rgba; precision = (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinPrecision)); g_return_if_fail(map && shade); /* We export. */ error = (GError*)0; if (!visu_map_export(map, shade, rgb, precision, filename, format, &error) && error) { visu_ui_raiseWarning(_("Export a coloured map"), error->message, GTK_WINDOW(dialog)); g_error_free(error); } g_free(filename); } gtk_widget_destroy(dialog); } /** * visu_ui_panel_map_setScale: * @scale: the status. * * Set the scaling method. * * Since: 3.4 */ void visu_ui_panel_map_setScale(ToolMatrixScalingFlag scale) { if (!isMapInitialised) createGtkInterface(VISU_UI_PANEL(panelMap)); if (scale == TOOL_MATRIX_SCALING_LINEAR) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rdLinear), TRUE); else if (scale == TOOL_MATRIX_SCALING_LOG) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rdLog), TRUE); else if (scale == TOOL_MATRIX_SCALING_ZERO_CENTRED_LOG) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rdZero), TRUE); else g_warning("Wrong scale argument"); } /** * visu_ui_panel_map_setNIsolines: * @nIsoLines: a value. * * Change the number of drawn isolines. * * Since: 3.4 */ void visu_ui_panel_map_setNIsolines(guint nIsoLines) { if (!isMapInitialised) createGtkInterface(VISU_UI_PANEL(panelMap)); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinIsoLines), nIsoLines); } /** * visu_ui_panel_map_setIsolinesColor: * @color: an RGB value (can be NULL). * * Change the colour of drawn isolines. If @color is NULL, then the * specific colour is unchecked and inversed colours are used. * * Since: 3.5 */ void visu_ui_panel_map_setIsolinesColor(float *color) { ToolColor *cl; float rgba[4]; int position; if (!isMapInitialised) createGtkInterface(VISU_UI_PANEL(panelMap)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ckColour), (color != (float*)0)); if (color) { rgba[0] = color[0]; rgba[1] = color[1]; rgba[2] = color[2]; rgba[3] = 1.f; cl = tool_color_addFloatRGBA(rgba, &position); visu_ui_color_combobox_setSelection(VISU_UI_COLOR_COMBOBOX(cbColour), cl); } } /** * visu_ui_panel_map_setPrecision: * @prec: a pourcentage. * * Set the precision used to render the maps. At 200, there is no * adaptive mesh. * * Since: 3.6 */ void visu_ui_panel_map_setPrecision(guint prec) { if (!isMapInitialised) createGtkInterface(VISU_UI_PANEL(panelMap)); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinPrecision), prec); } /** * visu_ui_panel_map_setMinMax: * @minMax: two floats containing min and max values. Can be NULL. * * Set-up the minimum and maximum scaling values. In case @minMax is * NULL, then the automatic normalisation is chosen. * * Since: 3.6 */ void visu_ui_panel_map_setMinMax(float *minMax) { if (!isMapInitialised) createGtkInterface(VISU_UI_PANEL(panelMap)); if (minMax) { visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryDataMin), minMax[0]); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryDataMax), minMax[1]); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioMinMax), TRUE); } else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioNormalized), TRUE); } static gboolean checkAvailability() { gboolean valid; GtkTreeIter iterMap; /* Delete maps if necessary. */ if (gtk_combo_box_get_active(GTK_COMBO_BOX(comboVisuPlane)) < 0 || gtk_combo_box_get_active(GTK_COMBO_BOX(comboField)) < 0) { for (valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(maps), &iterMap); valid; valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(maps), &iterMap)) removeMap(&iterMap); visu_gl_ext_setActive(VISU_GL_EXT(extMaps), FALSE); visu_gl_ext_setActive(VISU_GL_EXT(extLegend), FALSE); return FALSE; } return TRUE; } static void onMapEnter(VisuUiPanel *map, gpointer data _U_) { DBG_fprintf(stderr, "Panel Map: caught the 'page-entered' signal %d.\n", isMapInitialised); if (!isMapInitialised) createGtkInterface(map); if (gtk_tree_model_iter_n_children (gtk_combo_box_get_model(GTK_COMBO_BOX(comboVisuPlane)), (GtkTreeIter*)0) > 0 && gtk_combo_box_get_active(GTK_COMBO_BOX(comboVisuPlane)) < 0) gtk_combo_box_set_active(GTK_COMBO_BOX(comboVisuPlane), 0); if (gtk_tree_model_iter_n_children (gtk_combo_box_get_model(GTK_COMBO_BOX(comboField)), (GtkTreeIter*)0) > 0 && gtk_combo_box_get_active(GTK_COMBO_BOX(comboField)) < 0) gtk_combo_box_set_active(GTK_COMBO_BOX(comboField), 0); gtk_combo_box_set_active(GTK_COMBO_BOX(comboToolShade), 0); /* Delete maps if necessary. */ if (!checkAvailability()) updateInterface(FALSE); } static void onViewAvail(VisuObject *obj _U_, VisuData *dataObj _U_, VisuGlView *view, gpointer data _U_) { DBG_fprintf(stderr, "Panel Maps: caught 'dataRendered' signal, attaching default axes.\n"); visu_gl_ext_maps_setGlView(extMaps, view); visu_gl_ext_setActive(VISU_GL_EXT(extMaps), FALSE); visu_gl_ext_setActive(VISU_GL_EXT(extLegend), FALSE); } /** * visu_ui_panel_map_init: (skip) * * Should be used in the list declared in externalModules.h to be loaded by * V_Sim on start-up. This routine will create the #VisuUiPanel where * the coloured map stuff can be done, such as choosing a plane, * associating a scalar field... * * Returns: a newly created #VisuUiPanel object. */ VisuUiPanel* visu_ui_panel_map_init(VisuUiMain *ui _U_) { /* Long description */ char *cl = _("Map projections"); /* Short description */ char *tl = _("Maps"); panelMap = visu_ui_panel_newWithIconFromPath("Panel_map", cl, tl, "stock-map_20.png"); g_return_val_if_fail(panelMap, (VisuUiPanel*)0); isMapInitialised = FALSE; g_signal_connect(G_OBJECT(panelMap), "page-entered", G_CALLBACK(onMapEnter), (gpointer)0); visu_ui_panel_setDockable(VISU_UI_PANEL(panelMap), TRUE); /* Extension to draw values. */ extMaps = visu_gl_ext_maps_new(NULL); visu_gl_ext_setActive(VISU_GL_EXT(extMaps), FALSE); /* Extension to draw a legend. */ extLegend = visu_gl_ext_shade_new("Map legend"); g_signal_connect(VISU_OBJECT_INSTANCE, "dataRendered", G_CALLBACK(onViewAvail), (gpointer)0); return VISU_UI_PANEL(panelMap); } v_sim-3.7.0/src/panelModules/panelMap.h0000644000353400050620000000464612215546063014724 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD, Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2005) Adresses ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD and Damien CALISTE and Olivier D'Astier, laboratoire L_Sim, (2001-2005) E-mail addresses : BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef PANELMAP_H #define PANELMAP_H #include #include #include VisuUiPanel* visu_ui_panel_map_init(); void visu_ui_panel_map_update(VisuMap *map); VisuMap* visu_ui_panel_map_setData(guint planeId, guint scalarFieldId, guint shadeId); void visu_ui_panel_map_setScale(ToolMatrixScalingFlag scale); void visu_ui_panel_map_setNIsolines(guint nIsoLines); void visu_ui_panel_map_setIsolinesColor(float *color); void visu_ui_panel_map_setPrecision(guint prec); void visu_ui_panel_map_setMinMax(float *minMax); #endif v_sim-3.7.0/src/panelModules/panelVibration.c0000644000353400050620000004543312215546063016136 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD, Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresses m�l : BILLARD, non joignable par m�l ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant � visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est r�gi par la licence CeCILL soumise au droit fran�ais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffus�e par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez acc�der � cet en-t�te signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept� les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD and Damien CALISTE and Olivier D'Astier, laboratoire L_Sim, (2001-2005) E-mail addresses : BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include #include #include #include #include #include #include #include #include "panelVibration.h" /** * SECTION: panelVibration * @short_description: The tab where phonons are loaded and listed. * * Nothing tunable here. */ enum { NUM_COLUMN, FREQ_COLUMN, Q_COLUMN, ENERGY_COLUMN, N_COLUMN }; /* Local objects. */ static GtkWidget *panelVibration; static GtkWidget *vboxStart; static GtkWidget *buttonPlay, *buttonStop, *buttonReset; static GtkWidget *treeView; static GtkWidget *checkSpin, *checkFreq; /* Local variables. */ static gboolean widgetsNotBuilt, isEmpty; static gboolean play; static guint timeout; static GtkListStore *pListStore; /* Local routines. */ static GtkWidget *createInteriorVibe(); static void playToStop(); static void stopToPlay(); static void fillTreeView(VisuData *data); /* Local callbacks. */ static void onVibeEnter(VisuUiPanel *visu_ui_panel, gpointer data); /* static void onDirectoryClicked(GtkButton *button , gpointer data); */ static void onPlayClicked(GtkButton *button, gpointer dataObj); static void onStopClicked(GtkButton *button, gpointer data); static void onResetClicked(GtkButton *button , gpointer dataObj); static void onDataFocused(GObject *obj, VisuData *dataObj, gpointer data); static void onFreqChanged(GtkSpinButton *spin, gpointer data); static void onAmplChanged(GtkSpinButton *spin, gpointer data); static void onViewClikcked(); static void onSpinChanged(GtkToggleButton *toggle, gpointer data); /* static void onFreqChecked(GtkToggleButton *toggle, gpointer data); */ /* Setup the selection handler */ static GtkTreeSelection *treeSelection; /* The string common to all paths in currentBrowseredDirectory. */ static gchar *commonBrowseredDirectory; VisuUiPanel* visu_ui_panel_vibration_init(VisuUiMain *ui) { panelVibration = visu_ui_panel_newWithIconFromPath("panel_Vibration", _("Phonons"), _("Phonons"), "stock-phonons.png"); if (!panelVibration) return (VisuUiPanel*)0; visu_ui_panel_setDockable(VISU_UI_PANEL(panelVibration), TRUE); vboxStart = gtk_vbox_new(FALSE, 0); commonBrowseredDirectory = (char *)0; checkSpin = gtk_check_button_new_with_mnemonic(_("with _arrow")); checkFreq = gtk_check_button_new_with_mnemonic(_("use _fixed frequency")); /* Create the callbacks of all the sensitive widgets. */ g_signal_connect(G_OBJECT(panelVibration), "page-entered", G_CALLBACK(onVibeEnter), (gpointer)0); g_signal_connect(G_OBJECT(ui), "DataFocused", G_CALLBACK(onDataFocused), (gpointer)0); pListStore = gtk_list_store_new(N_COLUMN, G_TYPE_INT, G_TYPE_FLOAT, G_TYPE_STRING, G_TYPE_FLOAT); widgetsNotBuilt = TRUE; isEmpty = TRUE; timeout = 0; return VISU_UI_PANEL(panelVibration); } static void onVibeEnter(VisuUiPanel *visu_ui_panel _U_, gpointer data _U_) { if (widgetsNotBuilt) { DBG_fprintf(stderr, "Panel Vibe: first build on enter.\n"); widgetsNotBuilt = FALSE; gtk_container_add(GTK_CONTAINER(panelVibration), createInteriorVibe()); } } static GtkWidget *createInteriorVibe() { GtkWidget *vbox1; GtkWidget /* *hbox1, */*hbox2, *hbox; GtkWidget *label, *wd; /* GtkWidget *buttonDirectory; */ GtkWidget *image; GtkWidget *scrollbar; GtkCellRenderer *CellRender; GtkTreeViewColumn *column; VisuData *data; #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkTooltips *tooltips; tooltips = gtk_tooltips_new (); #endif vbox1 = gtk_vbox_new(FALSE, 0); /* hbox1 = gtk_hbox_new(FALSE, 0); */ hbox2 = gtk_hbox_new(FALSE, 0); /* the first hbox with the "open-file" button */ /* gtk_box_pack_start(GTK_BOX(vbox1), hbox1, FALSE, FALSE, 2); */ /* buttonDirectory = gtk_button_new (); */ /* gtk_box_pack_start (GTK_BOX (hbox1), buttonDirectory, FALSE, FALSE, 2); */ /* gtk_widget_set_tooltip_text(buttonDirectory, */ /* _("Choose a different directory.")); */ /* image = gtk_image_new_from_stock ("gtk-open", GTK_ICON_SIZE_BUTTON); */ /* gtk_container_add (GTK_CONTAINER (buttonDirectory), image); */ /* label = gtk_label_new("open phonon file"); */ /* gtk_container_add(GTK_CONTAINER(hbox1), label); */ /* gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); */ /* the checkboxes */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox1), hbox, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(checkSpin, _("Draw arrows on nodes that represent" " their displacements.")); g_signal_connect(G_OBJECT(checkSpin), "toggled", G_CALLBACK(onSpinChanged), (gpointer)0); gtk_box_pack_start(GTK_BOX(hbox), checkSpin, TRUE, TRUE, 0); gtk_widget_set_sensitive(checkSpin, FALSE); /* gtk_widget_set_tooltip_text(checkFreq, */ /* _("Use a given frequency for the" */ /* " vibration representation.")); */ /* g_signal_connect(G_OBJECT(checkFreq), "toggled", */ /* G_CALLBACK(onFreqChecked), (gpointer)0); */ /* gtk_box_pack_start(GTK_BOX(hbox), checkFreq, FALSE, FALSE, 0); */ /* gtk_widget_set_sensitive(checkFreq, FALSE); */ /* the second hbox with the treeview */ treeView = gtk_tree_view_new(); CellRender = gtk_cell_renderer_text_new(); /* when clicking in the treeView */ treeSelection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeView)); gtk_tree_selection_set_mode (treeSelection, GTK_SELECTION_SINGLE); /* make and add the first column to the view */ column = gtk_tree_view_column_new_with_attributes(_("id"), CellRender, "text", NUM_COLUMN, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeView), column); /* make and add the second column to the view */ column = gtk_tree_view_column_new_with_attributes(_("q point"), CellRender, "text", Q_COLUMN, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeView), column); /* make and add the third column to the view */ column = gtk_tree_view_column_new_with_attributes(_("energy"), CellRender, "text", ENERGY_COLUMN, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeView), column); /* make and add the fourth column to the view */ column = gtk_tree_view_column_new_with_attributes("\317\211", CellRender, "text", FREQ_COLUMN, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeView), column); /* put the treeview with a scrollbar in the tab*/ scrollbar = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollbar), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrollbar), GTK_SHADOW_ETCHED_IN); gtk_container_add(GTK_CONTAINER(scrollbar), treeView); gtk_box_pack_start(GTK_BOX(vbox1), scrollbar, TRUE, TRUE, 0); /* the third hbox with the timer, resetButton and PlayStop Button */ gtk_box_pack_end(GTK_BOX(vbox1), hbox2, FALSE, FALSE, 2); /* the timer */ label = gtk_label_new(_("Freq.: ")); gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 2); wd = gtk_spin_button_new_with_range (1, 20, 1); gtk_spin_button_set_value(GTK_SPIN_BUTTON(wd), 5); gtk_box_pack_start(GTK_BOX(hbox2), wd, FALSE, FALSE, 2); g_signal_connect(G_OBJECT(wd), "value-changed", G_CALLBACK(onFreqChanged), (gpointer)0); /* the amplitude */ label = gtk_label_new(_("Ampl.: ")); gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 2); wd = gtk_spin_button_new_with_range (0, 2, 0.1); gtk_spin_button_set_value(GTK_SPIN_BUTTON(wd), 1.); gtk_box_pack_start(GTK_BOX(hbox2), GTK_WIDGET(wd), FALSE, FALSE, 2); g_signal_connect(G_OBJECT(wd), "value-changed", G_CALLBACK(onAmplChanged), (gpointer)0); /* Stop Button */ buttonStop = gtk_button_new (); gtk_box_pack_end(GTK_BOX (hbox2), buttonStop, FALSE, FALSE, 2); gtk_widget_set_tooltip_text(buttonStop, _("Stop the nodes at their given positions.")); image = gtk_image_new_from_stock (GTK_STOCK_MEDIA_STOP, GTK_ICON_SIZE_BUTTON); gtk_container_add (GTK_CONTAINER (buttonStop), image); /* Play Button */ buttonPlay = gtk_button_new (); gtk_box_pack_end(GTK_BOX (hbox2), buttonPlay, FALSE, FALSE, 2); gtk_widget_set_tooltip_text(buttonPlay, _("Move the nodes according to their phonon vibration.")); image = gtk_image_new_from_stock (GTK_STOCK_MEDIA_PLAY, GTK_ICON_SIZE_BUTTON); gtk_container_add (GTK_CONTAINER (buttonPlay), image); /* reset button */ buttonReset = gtk_button_new_with_label(_("Reset")); gtk_box_pack_end(GTK_BOX (hbox2), buttonReset, FALSE, FALSE, 2); gtk_widget_set_tooltip_text(buttonReset, _("Reset the node positions to input file coordinates.")); data = visu_ui_panel_getData(VISU_UI_PANEL(panelVibration)); if(data) onDataFocused((GObject*)0, data, (gpointer)0); /* to show all the content of the tab */ gtk_widget_show_all(vbox1); gtk_widget_hide(buttonStop); gtk_widget_set_sensitive(buttonPlay, FALSE); gtk_widget_set_sensitive(buttonReset, FALSE); gtk_widget_set_sensitive(checkSpin, FALSE); /* g_signal_connect(G_OBJECT(buttonDirectory), "clicked", */ /* G_CALLBACK(onDirectoryClicked), (gpointer)0); */ g_signal_connect(G_OBJECT(buttonPlay), "clicked", G_CALLBACK(onPlayClicked), (gpointer)0); g_signal_connect(G_OBJECT(treeView), "row-activated", G_CALLBACK(onPlayClicked), (gpointer)0); g_signal_connect(G_OBJECT(buttonStop), "clicked", G_CALLBACK(onStopClicked), (gpointer)0); g_signal_connect(G_OBJECT(buttonReset), "clicked", G_CALLBACK(onResetClicked), (gpointer)0); g_signal_connect (G_OBJECT (treeSelection), "changed", G_CALLBACK (onViewClikcked), (gpointer)0); return vbox1; } static void onDataFocused(GObject *obj _U_, VisuData *dataObj, gpointer data _U_) { gboolean set; DBG_fprintf(stderr, "Panel Vibration: caught 'DataFocused' signal (%p).\n", (gpointer)dataObj); if (widgetsNotBuilt) return; if (timeout > 0) { visu_vibration_stop(timeout); timeout = 0; play = FALSE; stopToPlay(); } fillTreeView(dataObj); set = (dataObj != (VisuData*)0); gtk_widget_set_sensitive(checkFreq, set); gtk_widget_set_sensitive(buttonReset, FALSE); /* if (visu_vibration_isSet(dataObj)) */ /* { */ /* if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkFreq))) */ /* visu_vibration_setUserFrequency(dataObj, 50.f); */ /* else */ /* visu_vibration_setUserFrequency(dataObj, 0.f); */ /* } */ } /* static void onDirectoryClicked(GtkButton *button _U_, gpointer data _U_) */ /* { */ /* GtkWidget *file_selector; */ /* gchar *filename; */ /* GtkFileFilter *filter; */ /* file_selector = gtk_file_chooser_dialog_new(_("Choose a file to open"), NULL, */ /* GTK_FILE_CHOOSER_ACTION_OPEN, */ /* GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, */ /* GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, */ /* NULL); */ /* filter = gtk_file_filter_new (); */ /* gtk_file_filter_add_pattern (filter, "*.xyz"); */ /* gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(file_selector), filter); */ /* if (gtk_dialog_run (GTK_DIALOG (file_selector)) == GTK_RESPONSE_ACCEPT) */ /* { */ /* filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (file_selector)); */ /* } */ /* else */ /* filename = (gchar*)0; */ /* gtk_widget_destroy (file_selector); */ /* if (filename) { */ /* DBG_fprintf(stderr, "panelVibration: opening file \" %s \" \n", filename); */ /* } */ /* } */ static void onPlayClicked(GtkButton *button _U_, gpointer timer _U_) { DBG_fprintf(stderr, "panelVibration: begin vibration.\n"); if (timeout!=0) visu_vibration_stop(timeout); timeout = visu_vibration_play(visu_ui_panel_getData(VISU_UI_PANEL(panelVibration))); play = TRUE; playToStop(); } static void onStopClicked(GtkButton *button _U_, gpointer data _U_) { DBG_fprintf(stderr, "panel Vibration: Stoping vibration\n"); /* call the method that stop the timeout */ visu_vibration_stop(timeout); timeout = 0; play = FALSE; stopToPlay(); } static void playToStop() { gtk_widget_hide(buttonPlay); gtk_widget_show(buttonStop); gtk_widget_set_sensitive(buttonReset, FALSE); } static void stopToPlay() { gtk_widget_hide(buttonStop); gtk_widget_show(buttonPlay); gtk_widget_set_sensitive(buttonReset, TRUE); } static void onResetClicked(GtkButton *button _U_, gpointer dataObj _U_) { DBG_fprintf(stderr, "panelVibration: reseting all nodes position \n"); if (play) onStopClicked(GTK_BUTTON(buttonStop), (gpointer)0); gtk_tree_selection_unselect_all(treeSelection); } static void fillTreeView(VisuData *data) { gchar *sTexte; guint i; float qpt[3], en, omega; GtkTreeIter pIter; guint nSet; if (!isEmpty) { gtk_list_store_clear(pListStore); } isEmpty = TRUE; g_return_if_fail(data); if (visu_vibration_isSet(data)) { /* Fill TreeView Model */ DBG_fprintf(stderr, "panelVibration: filling treeView ...\n"); visu_vibration_getNPhonons(data, &nSet); for (i = 0; i < nSet; i++) { visu_vibration_getCharacteristic(data, i, qpt, &en, &omega); sTexte = g_strdup_printf("(%g;%g;%g)", qpt[0], qpt[1], qpt[2]); /* Create a new line */ gtk_list_store_append(pListStore, &pIter); /* update data */ gtk_list_store_set(pListStore, &pIter, NUM_COLUMN, i+1, FREQ_COLUMN, omega, Q_COLUMN, sTexte, ENERGY_COLUMN, en, -1); g_free(sTexte); } isEmpty = FALSE; gtk_tree_view_set_model(GTK_TREE_VIEW(treeView) , GTK_TREE_MODEL(pListStore)); /* gtk_tree_model_get_iter_first(GTK_TREE_MODEL(pListStore), &pIter); */ /* gtk_tree_selection_select_iter(selection, &pIter); */ } } static void onViewClikcked() { GtkTreeIter iter; GtkTreeModel *model; int num; GError *error; VisuData *data; model = GTK_TREE_MODEL(pListStore); if (!gtk_tree_selection_get_selected(treeSelection, &model, &iter)) { gtk_widget_set_sensitive(buttonPlay, FALSE); gtk_widget_set_sensitive(buttonReset, FALSE); gtk_widget_set_sensitive(checkSpin, FALSE); visu_gl_ext_setActive(VISU_GL_EXT(visu_gl_ext_vibration_getDefault()), FALSE); return; } data = visu_ui_panel_getData(VISU_UI_PANEL(panelVibration)); if (!visu_vibration_isSet(data)) return; visu_vibration_resetPosition(data); gtk_widget_set_sensitive(buttonPlay, TRUE); gtk_widget_set_sensitive(buttonReset, (timeout == 0)); gtk_widget_set_sensitive(checkSpin, TRUE); gtk_tree_model_get (model, &iter, NUM_COLUMN, &num, -1); DBG_fprintf (stderr, "Panel Vibration: You have selected a new mode number %d.\n", num); error = (GError*)0; visu_vibration_setCurrentMode(data, (guint)(num - 1), &error); if (error) { visu_ui_raiseWarning(_("Vibration file reloading"), error->message, (GtkWindow*)0); g_error_free(error); visu_ui_rendering_window_setData(visu_ui_main_class_getDefaultRendering(), (VisuData*)0); return; } visu_gl_ext_node_vectors_setData(visu_gl_ext_vibration_getDefault(), data); /* Set the initiale phase properly. */ visu_vibration_setZeroTime(data); /* ReDraw Spins */ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkSpin))) { visu_gl_ext_setActive(VISU_GL_EXT(visu_gl_ext_vibration_getDefault()), TRUE); visu_gl_ext_node_vectors_draw(visu_gl_ext_vibration_getDefault()); } DBG_fprintf(stderr, "panelVibration: new proper mode loaded.\n"); } static void onSpinChanged(GtkToggleButton *toggle, gpointer data _U_) { /* permit to draw or not spin by "activating" the list or not */ visu_gl_ext_setActive(VISU_GL_EXT(visu_gl_ext_vibration_getDefault()), gtk_toggle_button_get_active(toggle)); if (gtk_toggle_button_get_active(toggle)) visu_gl_ext_node_vectors_draw(visu_gl_ext_vibration_getDefault()); VISU_REDRAW_ADD; } /* static void onFreqChecked(GtkToggleButton *toggle, gpointer data _U_) */ /* { */ /* if (gtk_toggle_button_get_active(toggle)) */ /* visu_vibration_setUserFrequency(visu_ui_panel_getData(VISU_UI_PANEL(panelVibration)), 50.f); */ /* else */ /* visu_vibration_setUserFrequency(visu_ui_panel_getData(VISU_UI_PANEL(panelVibration)), 0.f); */ /* } */ static void onFreqChanged(GtkSpinButton *spin, gpointer user_data _U_) { VisuData *data; data = visu_ui_panel_getData(VISU_UI_PANEL(panelVibration)); g_return_if_fail(visu_vibration_isSet(data)); visu_vibration_setUserFrequency(data, gtk_spin_button_get_value(spin)); } static void onAmplChanged(GtkSpinButton *spin, gpointer user_data _U_) { VisuData *data; gboolean redraw; data = visu_ui_panel_getData(VISU_UI_PANEL(panelVibration)); g_return_if_fail(visu_vibration_isSet(data)); redraw = visu_vibration_setAmplitude(data, gtk_spin_button_get_value(spin)); if (visu_gl_ext_node_vectors_setRenderedSize(visu_gl_ext_vibration_getDefault(), gtk_spin_button_get_value(spin))) visu_gl_ext_node_vectors_draw(visu_gl_ext_vibration_getDefault()); if (redraw && timeout == 0) VISU_REDRAW_ADD; } v_sim-3.7.0/src/panelModules/panelVibration.h0000644000353400050620000000416212215546063016135 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse mèl : BILLARD, non joignable par mèl ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef PANELVIBRATION_H #define PANELVIBRATION_H #include /** * visu_ui_panel_vibration_init: * * Should be used in the list declared in externalModules.h to be loaded by * V_Sim on start-up. This routine will create the #VisuUiPanel where the box * * Returns: a newly created #VisuUiPanel object. */ VisuUiPanel* visu_ui_panel_vibration_init(); #endif v_sim-3.7.0/src/renderingBackend/0000755000353400050620000000000012216331341013651 500000000000000v_sim-3.7.0/src/renderingBackend/visu_actionInterface.h0000644000353400050620000000773012215546061020123 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef VISU_ACTIONINTERFACE_H #define VISU_ACTIONINTERFACE_H /** * SECTION:visu_actionInterface * @short_description: Interface for defining actions and events. * * These definitions are used to give a library and plateform * independent simplified event handlers. */ /** * TOOL_BUTTON_TYPE_PRESS: * * Value that can be put into field buttonType of structure #_ToolSimplifiedEvents. */ #define TOOL_BUTTON_TYPE_PRESS 1 /** * TOOL_BUTTON_TYPE_RELEASE: * * Value that can be put into field buttonType of structure #_ToolSimplifiedEvents. */ #define TOOL_BUTTON_TYPE_RELEASE 2 /** * ToolSpecialKeyStroke: * @Key_None: no key pressed ; * @Key_Page_Up: key up ; * @Key_Page_Down: key down ; * @Key_Arrow_Left: key left ; * @Key_Arrow_Right: key right ; * @Key_Arrow_Up: key up ; * @Key_Arrow_Down: key down ; * @Key_Menu: key menu. * * Possible non ascii keys used in #ToolSimplifiedEvents. */ typedef enum { Key_None, Key_Page_Up, Key_Page_Down, Key_Arrow_Left, Key_Arrow_Right, Key_Arrow_Up, Key_Arrow_Down, Key_Menu } ToolSpecialKeyStroke; /** * ToolSimplifiedEvents: * @x: the position x (on parent) for the event ; * @y: the position y (on parent) for the event ; * @root_x: the position x (in root window) for the event ; * @root_y: the position y (in root window) for the event ; * @button: the number of the button, 0 if not a button event ; * @buttonType: #TOOL_BUTTON_TYPE_PRESS or #TOOL_BUTTON_TYPE_RELEASE ; * @shiftMod: TRUE if Shift key is pressed during the event ; * @controlMod: TRUE if Control key is pressed during the event ; * @motion: TRUE if the event is a motion ; * @letter: The value of the letter if the event is a key stroke '\0' if not ; * @specialKey: the value of a special key if the event is a key stroke * but not with an ascii letter. * * This structure is a common interface for events (inspired from X). We don't * use the one introduced by GDK because we don't want this dependency be a * limitation. */ typedef struct _ToolSimplifiedEvents ToolSimplifiedEvents; struct _ToolSimplifiedEvents { int x, y; int root_x, root_y; guint button; int buttonType; int shiftMod, controlMod; int motion; char letter; ToolSpecialKeyStroke specialKey; }; #endif v_sim-3.7.0/src/renderingMethods/0000755000353400050620000000000012216331341013725 500000000000000v_sim-3.7.0/src/renderingMethods/renderingAtomic.c0000644000353400050620000010551112215546066017141 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include "renderingAtomic.h" #include "renderingAtomic_ascii.h" #include "renderingAtomic_d3.h" #include "atomic_xyz.h" #include "atomic_yaml.h" #include #include #include #include #include #include #include #include #include #include #include /** * SECTION:renderingAtomic * @short_description: A rendering method to draw atoms positioned in * a box. * * This the main part of a rendering method made to represent * atomic positions. It draws either spheres or cubes depending of the * elements properties. The radius (for the sphere) or the length of * the sides of the cubes can be tuned. */ #define FORCES_MAX "max_" VISU_RENDERING_ATOMIC_FORCES /* The OpenGL identifier to store the glObjectLists that describe the spheres. */ /* int identifierSpheres; */ /* The icosahedron drawing. */ #define X .525731112119133606 #define Z .850650808352039932 static GLfloat vdata[12][3] = { {X, 0.0, -Z}, {-X, 0.0, -Z}, {X, 0.0, Z}, {-X, 0.0, Z}, {0.0, -Z, -X}, {0.0, -Z, X}, {0.0, Z, -X}, {0.0, Z, X}, {-Z, -X, 0.0}, {Z, -X, 0.0}, {-Z, X, 0.0}, {Z, X, 0.0} }; static GLuint tindices[20][3] = { {0,4,1}, {0,9,4}, {9,5,4}, {4,5,8}, {4,8,1}, {8,10,1}, {8,3,10}, {5,3,8}, {5,2,3}, {2,7,3}, {7,10,3}, {7,6,10}, {7,11,6}, {11,0,6}, {0,1,6}, {6,1,10}, {9,0,11}, {9,11,2}, {9,2,5}, {7,2,11} }; #define RADIUS_DEFAULT 1. #define SHAPE_DEFAULT VISU_RENDERING_ATOMIC_SPHERE #define RATIO_DEFAULT 2. #define PHI_DEFAULT 0. #define THETA_DEFAULT 90. /* Dealing with the radius resource. */ #define FLAG_RESOURCE_RADIUS_SHAPE "atomic_radius_shape" #define DESC_RESOURCE_RADIUS_SHAPE "The radius of the element and its shape, a real > 0. & [Sphere Cube Elipsoid Point]" static gboolean readAtomicRadiusShape(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); /* These functions write all the element list to export there associated resources. */ static void exportAtomicRadiusShape(GString *data, VisuData* dataObj, VisuGlView *view); #define FLAG_PARAMETER_SHAPE "atomic_sphere_method" #define DESC_PARAMETER_SHAPE "The sphere drawing method, [GluSphere Icosahedron]" static gboolean readAtomicShape(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static void exportAtomicShape(GString *data, VisuData* dataObj, VisuGlView *view); enum { sphere_glu, sphere_icosahedron, sphere_nb }; static guint sphereMethod = sphere_glu; const char* sphereName[sphere_nb + 1] = {"GluSphere", "Icosahedron", (const char*)0}; const char* shapeName[VISU_RENDERING_ATOMIC_N_SHAPES + 1] = {"Sphere", "Cube", "Elipsoid", "Point", "Torus", (const char*)0}; const char* shapeNameI18n[VISU_RENDERING_ATOMIC_N_SHAPES + 1]; static VisuDataNode *dataNodeForces; struct atomicResources { /* One of this structure is associated to each element. */ /* The radius of the element. */ float radius; /* The ratio long axis, short axis when the shape is an elipsoid. */ float ratio; /* The angles positioning of the long axis when the shape is an elipsoid. */ float phi, theta; /* The shape used. */ VisuRenderingAtomicShapeId shape; /* An id of the list associated with the form. */ int openGLIdentifier; }; /* Local callbacks. */ static void visu_rendering_atomic_dispose(GObject* obj); static void visu_rendering_atomic_finalize(GObject* obj); static int createShape(VisuElement* ele, VisuGlView *view); static void positionShape(VisuData *visuData, VisuNode *node, VisuElement* ele, int glEleId); static int getShape(VisuElement *element); enum { FORCES_CHANGED, LAST_SIGNAL }; /* Internal variables. */ static guint atomic_signals[LAST_SIGNAL] = { 0 }; /** * VisuRenderingAtomic: * * An opaque structure. */ struct _VisuRenderingAtomic { VisuRendering method; gboolean dispose_has_run; }; /** * VisuRenderingAtomicClass: * * An opaque structure. */ struct _VisuRenderingAtomicClass { VisuRenderingClass parent_class; }; static VisuRenderingAtomic *atomic = (VisuRenderingAtomic*)0; G_DEFINE_TYPE(VisuRenderingAtomic, visu_rendering_atomic, VISU_TYPE_RENDERING) static void visu_rendering_atomic_class_init(VisuRenderingAtomicClass *klass) { VisuConfigFileEntry *resourceEntry; DBG_fprintf(stderr, "Visu RenderingAtomic: creating the class of the object.\n"); /* Connect freeing methods. */ G_OBJECT_CLASS(klass)->dispose = visu_rendering_atomic_dispose; G_OBJECT_CLASS(klass)->finalize = visu_rendering_atomic_finalize; VISU_RENDERING_CLASS(klass)->createElement = createShape; VISU_RENDERING_CLASS(klass)->getElementGlId = getShape; VISU_RENDERING_CLASS(klass)->createNode = positionShape; VISU_RENDERING_CLASS(klass)->getNodeExtend = visu_rendering_atomic_getRadius; /** * VisuRenderingAtomic::ForcesChanged: * @obj: the object emitting the signal. * @dataObj: the #VisuData forces are applied on. * * Emitted each time forces are updated. * * Since: 3.7 */ atomic_signals[FORCES_CHANGED] = g_signal_new("ForcesChanged", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT, NULL); /* Dealing with config files. */ resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCE_RADIUS_SHAPE, DESC_RESOURCE_RADIUS_SHAPE, 1, readAtomicRadiusShape); visu_config_file_addExportFunction(VISU_CONFIG_FILE_RESOURCE, exportAtomicRadiusShape); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_SHAPE, DESC_PARAMETER_SHAPE, 1, readAtomicShape); visu_config_file_entry_setVersion(resourceEntry, 3.4f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_PARAMETER, exportAtomicShape); shapeNameI18n[0] = _("Sphere"); shapeNameI18n[1] = _("Cube"); shapeNameI18n[2] = _("Elipsoid"); shapeNameI18n[3] = _("Point"); shapeNameI18n[4] = _("Torus"); shapeNameI18n[5] = (const char*)0; /* Add possibilities to handle forces. */ dataNodeForces = VISU_DATA_NODE(visu_data_node_new (VISU_RENDERING_ATOMIC_FORCES, G_TYPE_FLOAT)); visu_data_node_setLabel(dataNodeForces, _("Forces")); visu_data_node_setEditable(dataNodeForces, FALSE); } static void visu_rendering_atomic_dispose(GObject* obj) { DBG_fprintf(stderr, "Visu RenderingAtomic: dispose object %p.\n", (gpointer)obj); if (VISU_RENDERING_ATOMIC(obj)->dispose_has_run) return; VISU_RENDERING_ATOMIC(obj)->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS(visu_rendering_atomic_parent_class)->dispose(obj); } static void visu_rendering_atomic_finalize(GObject* obj) { DBG_fprintf(stderr, "Visu RenderingAtomic: finalize object %p.\n", (gpointer)obj); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_rendering_atomic_parent_class)->finalize(obj); } static void visu_rendering_atomic_init(VisuRenderingAtomic *obj) { DBG_fprintf(stderr, "Visu renderingAtomic: initializing a new object (%p).\n", (gpointer)obj); obj->dispose_has_run = FALSE; g_return_if_fail((atomic == (VisuRenderingAtomic*)0)); atomic = obj; } static struct atomicResources *getRadiusAndShape(VisuElement *ele); /** * visu_rendering_atomic_new: * * Create the structure and initialise its values. * * Since: 3.6 * * Returns: a newly allocate #VisuRenderingAtomic object. */ VisuRenderingAtomic* visu_rendering_atomic_new() { char *descr = _("It draws spheres at specified positions to represent atoms." " The radius of the sphere can vary."); gchar *iconPath; VisuRenderingAtomic* atom; DBG_fprintf(stderr,"Initialising the atomic rendering method...\n"); atom = VISU_RENDERING_ATOMIC(g_object_new(VISU_TYPE_RENDERING_ATOMIC, "name", VISU_RENDERING_ATOMIC_NAME, "label", _(VISU_RENDERING_ATOMIC_NAME), "description", descr, "nFiles", 1, NULL)); visu_rendering_setFileTypeLabel(VISU_RENDERING(atom), 0, _("Position files")); iconPath = g_build_filename(V_SIM_PIXMAPS_DIR, "stock-atomic.png", NULL); visu_rendering_setIcon(VISU_RENDERING(atom), iconPath); g_free(iconPath); initAtomicD3(VISU_RENDERING(atom)); initAtomicAscii(VISU_RENDERING(atom)); initAtomicXyz(VISU_RENDERING(atom)); visu_rendering_atomic_yaml_init(VISU_RENDERING(atom)); return atom; } static void freeForces(gpointer obj, gpointer data _U_) { #if GLIB_MINOR_VERSION > 9 g_slice_free1(sizeof(float) * 6, obj); #else g_free(obj); #endif } static gpointer newForces(gconstpointer obj, gpointer data _U_) { float *fData; #if GLIB_MINOR_VERSION > 9 fData = g_slice_alloc(sizeof(float) * 6); #else fData = g_malloc(sizeof(float) * 6); #endif if (obj) memcpy(fData, obj, sizeof(float) * 6); else memset(fData, 0, sizeof(float) * 6); return (gpointer)fData; } static void initMaxForces(VisuElement *ele _U_, GValue *val) { DBG_fprintf(stderr, " | init max modulus of val %p.\n", (gpointer)val); g_value_init(val, G_TYPE_FLOAT); g_value_set_float(val, -G_MAXFLOAT); } /** * visu_rendering_atomic_setForces: * @dataObj: a #VisuData object. * @forces: (array): an array of forces. * * Forces can be associated to nodes of @dataObj. The array @forces must * have the size of the number of nodes of @dataObj times three. Forces * are given in cartesian coordinates. * * Since: 3.7 **/ void visu_rendering_atomic_setForces(VisuData *dataObj, float *forces) { float *svgForces, *maxModulus; VisuNodeProperty *f; VisuNodeArrayIter iter; GValue forcesValue = {0, {{0}, {0}}}; GValueArray *svgMaxModulus; GValue *val; DBG_fprintf(stderr, "Rendering Atomic: set forces.\n"); maxModulus = g_malloc(sizeof(float) * 2); g_object_set_data(G_OBJECT(dataObj), FORCES_MAX, maxModulus); maxModulus[1] = 0.f; svgMaxModulus = visu_node_array_setElementProperty(VISU_NODE_ARRAY(dataObj), VISU_RENDERING_ATOMIC_FORCES_ELE_MAX, initMaxForces); f = visu_node_array_property_newPointer(VISU_NODE_ARRAY(dataObj), VISU_RENDERING_ATOMIC_FORCES, freeForces, newForces, (gpointer)0); g_value_init(&forcesValue, G_TYPE_POINTER); visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter); for(visu_node_array_iterStartNumber(VISU_NODE_ARRAY(dataObj), &iter); iter.node; visu_node_array_iterNextNodeNumber(VISU_NODE_ARRAY(dataObj), &iter)) { svgForces = newForces(forces + iter.node->number * 3, (gpointer)0); DBG_fprintf(stderr, " | %d -> %fx%fx%f\n", iter.node->number, svgForces[0], svgForces[1], svgForces[2]); tool_matrix_cartesianToSpherical(svgForces + 3, svgForces); g_value_set_pointer(&forcesValue, svgForces); visu_node_property_setValue(f, iter.node, &forcesValue); val = g_value_array_get_nth(svgMaxModulus, iter.iElement); g_value_set_float(val, MAX(svgForces[3], g_value_get_float(val))); maxModulus[1] = MAX(maxModulus[1], svgForces[3]); } DBG_fprintf(stderr, " | max forces %g.\n", maxModulus[1]); g_signal_emit(G_OBJECT(atomic), atomic_signals[FORCES_CHANGED], 0, dataObj, NULL); visu_data_node_setUsed(dataNodeForces, dataObj, 3); } /** * visu_rendering_atomic_getMaxForces: * @dataObj: a #VisuData object. * * If @dataObj has forces associated to (see * visu_rendering_atomic_setForces()), this routine provides the * modulus of the biggest force. * * Since: 3.7 * * Returns: 0 if no forces have been associated. **/ float visu_rendering_atomic_getMaxForces(VisuData *dataObj) { float *val; val = (float*)g_object_get_data(G_OBJECT(dataObj), FORCES_MAX); if (val) return val[1]; else return 0.f; } static struct atomicResources *getRadiusAndShape(VisuElement *ele) { struct atomicResources *str; g_return_val_if_fail(ele, (struct atomicResources*)0); DBG_fprintf(stderr, "Rendering Atomic: get resource structure (%s - %p)...\n", ele->name, (gpointer)ele); str = (struct atomicResources*)g_object_get_data(G_OBJECT(ele), "radiusAndShape"); if (!str) { DBG_fprintf(stderr, "Rendering Atomic: create a new resource structure for '%s'.\n", ele->name); str = g_malloc(sizeof(struct atomicResources)); if (!tool_physic_getZFromSymbol((int*)0, &str->radius, ele->name)) str->radius = RADIUS_DEFAULT; str->shape = SHAPE_DEFAULT; str->ratio = RATIO_DEFAULT; str->phi = PHI_DEFAULT; str->theta = THETA_DEFAULT; str->openGLIdentifier = visu_gl_objectlist_new(1); g_object_set_data(G_OBJECT(ele), "radiusAndShape", (gpointer)str); } return str; } /** * visu_rendering_atomic_getRadius: * @ele: a #VisuElement object. * * In the rendering atomic method, shapes are characterized by * a radius. This method gets it for the specified element. If this * element has no radius defined yet, the default value is * associated and returned. * * Returns: the radius of the specified element. A negative value if something * goies wrong. */ float visu_rendering_atomic_getRadius(VisuElement *ele) { struct atomicResources *str; g_return_val_if_fail(ele, RADIUS_DEFAULT); DBG_fprintf(stderr, "Rendering Atomic: get radius.\n"); str = getRadiusAndShape(ele); g_return_val_if_fail(str, -1.f); return str->radius; } /** * visu_rendering_atomic_getRadiusDefault: * * This method gets the default radius of the rendering atomic method. * * Returns: the default value for radius resource. */ float visu_rendering_atomic_getRadiusDefault() { return RADIUS_DEFAULT; } /** * visu_rendering_atomic_setRadius: * @ele: a #VisuElement object ; * @value: a positive floating point value. * * This change the radius value of element @ele to @value. * * Returns: 1 if a call to visu_rendering_createElement() is required, 0 if not. */ gboolean visu_rendering_atomic_setRadius(VisuElement* ele, float value) { struct atomicResources *str; g_return_val_if_fail(ele && value > 0.f, FALSE); str = getRadiusAndShape(ele); g_return_val_if_fail(str, FALSE); if (value == str->radius) return FALSE; else str->radius = value; DBG_fprintf(stderr, "Rendering Atomic: emit 'elementSizeChanged'.\n"); if (atomic) g_signal_emit_by_name(G_OBJECT(atomic), "elementSizeChanged", value, NULL); DBG_fprintf(stderr, "Rendering Atomic: emission done.\n"); /* Ask for reDraw if needed. */ return TRUE; } /** * visu_rendering_atomic_getShape: * @ele: a #VisuElement object. * * In the rendering atomic method, shapes are multiple. * This method gets it for the specified element. Shapes are * characterized by their id, corresponding to an integer value. * Use the enum #VisuRenderingAtomicShapeId to associate an integer value * to a specific shape. * * Returns: the shape id of the element @ele. */ VisuRenderingAtomicShapeId visu_rendering_atomic_getShape(VisuElement *ele) { struct atomicResources *str; str = getRadiusAndShape(ele); g_return_val_if_fail(str, FALSE); return str->shape; } /** * visu_rendering_atomic_getShapeName: * @shape: an integer. * * This method does the corresponding between a shape id and * its name (a string value). * * Returns: the name associated to a shape. */ const char* visu_rendering_atomic_getShapeName(VisuRenderingAtomicShapeId shape) { if (shape >= VISU_RENDERING_ATOMIC_N_SHAPES) return (const char*)0; else return shapeName[shape]; } /** * visu_rendering_atomic_getShapeNameDefault: * * This method is used to retrieve the default name for shapes. * * Returns: the name associated to the default shape. */ const char* visu_rendering_atomic_getShapeNameDefault() { return shapeName[SHAPE_DEFAULT]; } /** * visu_rendering_atomic_getShapeDefault: * * This method gets the default shape. * * Returns: the default shape id. */ VisuRenderingAtomicShapeId visu_rendering_atomic_getShapeDefault() { return SHAPE_DEFAULT; } /** * visu_rendering_atomic_setShape: * @ele: a #VisuElement object ; * @shape: an integer. * * This changes the shape of the element @ele to the shape defined by its id. * * Returns: 1 if a call to visu_rendering_createElement() is required, 0 if not. */ int visu_rendering_atomic_setShape(VisuElement *ele, VisuRenderingAtomicShapeId shape) { struct atomicResources *str; g_return_val_if_fail(ele && shape < VISU_RENDERING_ATOMIC_N_SHAPES, 0); str = getRadiusAndShape(ele); g_return_val_if_fail(str, FALSE); if (shape == str->shape) return 0; else str->shape = shape; return 1; } /** * visu_rendering_atomic_setShapeFromName: * @ele: a #VisuElement object ; * @shape: a string. * * This method is equivalent to visu_rendering_atomic_setShape() but the shape is * defined by its name. * * Returns: 1 if a call to visu_rendering_createElement() is required, 0 if not. */ int visu_rendering_atomic_setShapeFromName(VisuElement *ele, const char* shape) { int res, i; res = -1; for (i = 0; shapeName[i] && res < 0; i++) { if (!strcmp(shapeName[i], shape)) res = i; } if (res < 0) { g_warning("Unknown shape name in the call of visu_rendering_atomic_setShapeFromName."); return 0; } else return visu_rendering_atomic_setShape(ele, res); } /** * visu_rendering_atomic_getAllShapes: * * This methods retrieve the whole list of shape names used by V_Sim for example * in the resources file. These names are not translated. If internationalized * names are required, use visu_rendering_atomic_getAllShapesI18n() instead. * * Returns: (transfer none) (array zero-terminated=1) (element-type filename): a pointer to a list of shape names (should not be modified or freed). */ const char** visu_rendering_atomic_getAllShapes() { return shapeName; } /** * visu_rendering_atomic_getAllShapesI18n: * * This methods retrieve the whole list of shape names, translated strings. * * Returns: (transfer none) (array zero-terminated=1) (element-type utf8): a pointer to a list of shape names (should not be modified or freed). */ const char** visu_rendering_atomic_getAllShapesI18n() { return shapeNameI18n; } /** * visu_rendering_atomic_setElipsoidParameters: * @ele: a #VisuElement object ; * @ratio: a float ; * @phi: a float ; * @theta: a float. * * Change the parameters for the elipsoid shape for the given @ele. * These parameters include a @ratio which is the ratio of the * long axis on the short one. Thus @ratio is always equal or greater than 1. * Arguments @theta and @phi are the direction of the long axis. * * Returns: TRUE if visu_rendering_createElement() should be called. */ gboolean visu_rendering_atomic_setElipsoidParameters(VisuElement *ele, float ratio, float phi, float theta) { struct atomicResources *str; gboolean refresh; g_return_val_if_fail(ele && (ratio >= 1.), 0); str = getRadiusAndShape(ele); g_return_val_if_fail(str, FALSE); refresh = FALSE; if (ratio != str->ratio) { str->ratio = ratio; refresh = TRUE; } if (phi != str->phi) { str->phi = phi; refresh = TRUE; } if (theta != str->theta) { str->theta = theta; refresh = TRUE; } return refresh && (str->shape == VISU_RENDERING_ATOMIC_ELLIPSOID || str->shape == VISU_RENDERING_ATOMIC_TORUS); } /** * visu_rendering_atomic_setElipsoidRatio: * @ele: a #VisuElement object. * @ratio: a float ; * * Set the ratio parameter of the elipsoid shape for the element @ele. * * Returns: TRUE if visu_rendering_createElement() should be called. */ gboolean visu_rendering_atomic_setElipsoidRatio(VisuElement *ele, float ratio) { struct atomicResources *str; g_return_val_if_fail(ele && (ratio >= 1.), FALSE); str = getRadiusAndShape(ele); g_return_val_if_fail(str, FALSE); if (ratio != str->ratio) { str->ratio = ratio; return (str->shape == VISU_RENDERING_ATOMIC_ELLIPSOID || str->shape == VISU_RENDERING_ATOMIC_TORUS); } return FALSE; } /** * visu_rendering_atomic_setElipsoidPhi: * @ele: a #VisuElement object. * @phi: a float ; * * Set the phi angle parameter of the elipsoid shape for the element @ele. * * Returns: TRUE if visu_rendering_createElement() should be called. */ gboolean visu_rendering_atomic_setElipsoidPhi(VisuElement *ele, float phi) { struct atomicResources *str; g_return_val_if_fail(ele, FALSE); str = getRadiusAndShape(ele); g_return_val_if_fail(str, FALSE); if (phi != str->phi) { str->phi = phi; return (str->shape == VISU_RENDERING_ATOMIC_ELLIPSOID || str->shape == VISU_RENDERING_ATOMIC_TORUS); } return FALSE; } /** * visu_rendering_atomic_setElipsoidTheta: * @ele: a #VisuElement object. * @theta: a float. * * Set the theta angle parameter of the elipsoid shape for the element @ele. * * Returns: TRUE if visu_rendering_createElement() should be called. */ gboolean visu_rendering_atomic_setElipsoidTheta(VisuElement *ele, float theta) { struct atomicResources *str; g_return_val_if_fail(ele, FALSE); str = getRadiusAndShape(ele); g_return_val_if_fail(str, FALSE); if (theta != str->theta) { str->theta = theta; return (str->shape == VISU_RENDERING_ATOMIC_ELLIPSOID || str->shape == VISU_RENDERING_ATOMIC_TORUS); } return FALSE; } /** * visu_rendering_atomic_getElipsoidRatio: * @ele: a #VisuElement object. * * Retrieve the ratio parameter of the elipsoid shape for the element @ele. * * Returns: the ratio of the elipsoid. */ float visu_rendering_atomic_getElipsoidRatio(VisuElement *ele) { struct atomicResources *str; g_return_val_if_fail(ele, RATIO_DEFAULT); str = (struct atomicResources*)g_object_get_data(G_OBJECT(ele), "radiusAndShape"); if (str) return str->ratio; else return RATIO_DEFAULT; } /** * visu_rendering_atomic_getElipsoidPhi: * @ele: a #VisuElement object. * * Retrieve the phi angle parameter of the elipsoid shape for the element @ele. * * Returns: the phi angle of the elipsoid. */ float visu_rendering_atomic_getElipsoidPhi(VisuElement *ele) { struct atomicResources *str; g_return_val_if_fail(ele, PHI_DEFAULT); str = (struct atomicResources*)g_object_get_data(G_OBJECT(ele), "radiusAndShape"); if (str) return str->phi; else return PHI_DEFAULT; } /** * visu_rendering_atomic_getElipsoidTheta: * @ele: a #VisuElement object. * * Retrieve the theta angle parameter of the elipsoid shape for the element @ele. * * Returns: the theta angle of the elipsoid. */ float visu_rendering_atomic_getElipsoidTheta(VisuElement *ele) { struct atomicResources *str; g_return_val_if_fail(ele, THETA_DEFAULT); str = (struct atomicResources*)g_object_get_data(G_OBJECT(ele), "radiusAndShape"); if (str) return str->theta; else return THETA_DEFAULT; } static gboolean readAtomicRadiusShape(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { VisuElement* ele; int shapeNum, i, token; float radius; gchar **shape; gchar **tokens; g_return_val_if_fail(nbLines == 1, FALSE); /* Tokenize the line of values. */ tokens = g_strsplit_set(g_strchug(lines[0]), " \n", TOOL_MAX_LINE_LENGTH); token = 0; DBG_fprintf(stderr, "Rendering Atomic: parse line.\n"); /* Get the two elements. */ if (!tool_config_file_readElementFromTokens(tokens, &token, &ele, 1, position, error)) { g_strfreev(tokens); return FALSE; } /* Read 1 int. */ if (!tool_config_file_readFloatFromTokens(tokens, &token, &radius, 1, position, error)) { g_strfreev(tokens); return FALSE; } radius = CLAMP(radius, 0., G_MAXFLOAT); /* Read 1 string. */ if (!tool_config_file_readStringFromTokens(tokens, &token, &shape, 1, position, error)) { g_strfreev(tokens); return FALSE; } g_strfreev(tokens); shapeNum = -1; for (i = 0; shapeName[i] && shapeNum < 0; i++) { if (!strcmp(shapeName[i], shape[0])) shapeNum = i; } if (shapeNum < 0) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d: the shape '%s' is unknown.\n"), position, shape[0]); return FALSE; } g_strfreev(shape); DBG_fprintf(stderr, "Rendering Atomic: store values.\n"); visu_rendering_atomic_setRadius(ele, radius); visu_rendering_atomic_setShape(ele, shapeNum); return TRUE; } /* These functions write all the element list to export there associated resources. */ static void exportAtomicRadiusShape(GString *data, VisuData *dataObj, VisuGlView *view _U_) { GList *eleList, *pos; struct atomicResources *str; VisuNodeArrayIter iter; visu_config_file_exportComment(data, DESC_RESOURCE_RADIUS_SHAPE); /* We create a list of elements, or get the whole list. */ if (dataObj) { eleList = (GList*)0; visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter); for (visu_node_array_iterStart(VISU_NODE_ARRAY(dataObj), &iter); iter.element; visu_node_array_iterNextElement(VISU_NODE_ARRAY(dataObj), &iter)) eleList = g_list_prepend(eleList, (gpointer)iter.element); } else eleList = g_list_copy((GList*)visu_element_getAllElements()); for (pos = eleList; pos; pos = g_list_next(pos)) { str = (struct atomicResources*)g_object_get_data(G_OBJECT(pos->data), "radiusAndShape"); if (str) visu_config_file_exportEntry(data, FLAG_RESOURCE_RADIUS_SHAPE, visu_element_getName(VISU_ELEMENT(pos->data)), "%10.3f %s", str->radius, shapeName[str->shape]); } visu_config_file_exportComment(data, ""); g_list_free(eleList); } static gboolean readAtomicShape(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { gchar **vals; guint i; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readString(lines[0], position, &vals, 1, FALSE, error)) return FALSE; for (i = 0; i < sphere_nb; i++) if (!strcmp(vals[0], sphereName[i])) { sphereMethod = i; break; } if (i == sphere_nb) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d: the sphere method '%s' is unknown.\n"), position, vals[0]); g_strfreev(vals); return FALSE; } g_strfreev(vals); return TRUE; } static void exportAtomicShape(GString *data, VisuData* dataObj _U_, VisuGlView *view _U_) { g_string_append_printf(data, "# %s\n", DESC_PARAMETER_SHAPE); g_string_append_printf(data, "%s: %s\n\n", FLAG_PARAMETER_SHAPE, sphereName[sphereMethod]); } /***************/ /* OpenGL part */ /***************/ static void positionShape(VisuData *visuData, VisuNode *node, VisuElement* ele, int eleGlId) { float rgba[4]; float xyz[3]; float scale; visu_data_getNodePosition(visuData, node, xyz); scale = visu_data_getNodeScalingFactor(visuData, node); glPushMatrix(); glTranslated(xyz[0], xyz[1], xyz[2]); if (visu_data_getUserColor(visuData, ele, node, rgba)) visu_gl_setColor(ele->material, rgba); else if (visu_data_hasUserColorFunc(visuData)) visu_gl_setColor(ele->material, ele->rgb); glScalef(scale, scale, scale); glCallList(eleGlId); glPopMatrix(); } static void drawtriangle(float *v1, float *v2, float *v3) { glBegin(GL_TRIANGLES); glNormal3fv(v1); glVertex3fv(v1); glNormal3fv(v2); glVertex3fv(v2); glNormal3fv(v3); glVertex3fv(v3); glEnd(); } static void normalize(float v[3]) { GLfloat d = 1.f / sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]); g_return_if_fail(d > 0.); v[0] *= d; v[1] *= d; v[2] *= d; } static void subdivide(float *v1, float *v2, float *v3, int depth) { GLfloat v12[3], v23[3], v31[3]; GLint i; if (depth == 0) { drawtriangle(v1, v2, v3); return; } for (i = 0; i < 3; i++) { v12[i] = v1[i]+v2[i]; v23[i] = v2[i]+v3[i]; v31[i] = v3[i]+v1[i]; } normalize(v12); normalize(v23); normalize(v31); subdivide(v1, v12, v31, depth - 1); subdivide(v2, v23, v12, depth - 1); subdivide(v3, v31, v23, depth - 1); subdivide(v12, v23, v31, depth - 1); } static int getShape(VisuElement *element) { struct atomicResources *str; str = getRadiusAndShape(element); g_return_val_if_fail(str, 0); return str->openGLIdentifier; } static int createShape(VisuElement* ele, VisuGlView *view) { struct atomicResources *str; int nlat, i, nfac; GLUquadricObj *obj; g_return_val_if_fail(ele, -1); str = getRadiusAndShape(ele); g_return_val_if_fail(str, -1); nlat = visu_gl_view_getDetailLevel(view, str->radius); DBG_fprintf(stderr, "Rendering Atomic: creating '%s' for %s (%d - OpenGL id" " %d - fac %d)\n", shapeName[str->shape], ele->name, ele->typeNumber, str->openGLIdentifier, nlat); if (nlat < 0) return -1; obj = gluNewQuadric(); glNewList(str->openGLIdentifier, GL_COMPILE); switch (str->shape) { case VISU_RENDERING_ATOMIC_SPHERE: DBG_fprintf(stderr, " | use sphere method %d\n", sphereMethod); if (sphereMethod == sphere_glu) gluSphere(obj, (double)str->radius, nlat, nlat); else if (sphereMethod == sphere_icosahedron) { nfac = (int)(log((float)(nlat + 2) / 4.f) / log(2.f)); DBG_fprintf(stderr, " | glusphere vs. icosahedron %dx%d\n", nlat * nlat, 20 * (int)pow(4, nfac)); glPushMatrix(); glScalef(str->radius, str->radius, str->radius); glBegin(GL_TRIANGLES); for (i = 0; i < 20; i++) subdivide(&vdata[tindices[i][0]][0], &vdata[tindices[i][1]][0], &vdata[tindices[i][2]][0], nfac); glEnd(); glPopMatrix(); } else g_warning("Wrong sphere method."); break; case VISU_RENDERING_ATOMIC_ELLIPSOID: glPushMatrix(); glRotatef(str->phi, 0., 0., 1.); glRotatef(str->theta, 0., 1., 0.); glScalef(1.0, 1.0, str->ratio); gluSphere(obj, (double)str->radius, nlat, nlat); glPopMatrix(); break; case VISU_RENDERING_ATOMIC_POINT: glPointSize(MAX(1, (int)(str->radius * view->camera->gross * 5.))); glBegin(GL_POINTS); glVertex3f(0., 0., 0.); glEnd(); break; case VISU_RENDERING_ATOMIC_CUBE: glBegin(GL_QUADS); glNormal3f(0., 0., 1.); glVertex3f(str->radius / 2., str->radius / 2., str->radius / 2.); glVertex3f(-str->radius / 2., str->radius / 2., str->radius / 2.); glVertex3f(-str->radius / 2., -str->radius / 2., str->radius / 2.); glVertex3f(str->radius / 2., -str->radius / 2., str->radius / 2.); glNormal3f(0., 0., -1.); glVertex3f(str->radius / 2.,str->radius / 2.,-str->radius / 2.); glVertex3f(str->radius / 2.,-str->radius / 2.,-str->radius / 2.); glVertex3f(-str->radius / 2.,-str->radius / 2.,-str->radius / 2.); glVertex3f(-str->radius / 2.,str->radius / 2.,-str->radius / 2.); glNormal3f(1., 0., 0.); glVertex3f(str->radius / 2.,str->radius / 2.,str->radius / 2.); glVertex3f(str->radius / 2.,-str->radius / 2.,str->radius / 2.); glVertex3f(str->radius / 2.,-str->radius / 2.,-str->radius / 2.); glVertex3f(str->radius / 2.,str->radius / 2.,-str->radius / 2.); glNormal3f(-1., 0., 0.); glVertex3f(-str->radius / 2.,str->radius / 2.,str->radius / 2.); glVertex3f(-str->radius / 2.,str->radius / 2.,-str->radius / 2.); glVertex3f(-str->radius / 2.,-str->radius / 2.,-str->radius / 2.); glVertex3f(-str->radius / 2.,-str->radius / 2.,str->radius / 2.); glNormal3f(0., 1., 0.); glVertex3f(-str->radius / 2.,str->radius / 2.,-str->radius / 2.); glVertex3f(-str->radius / 2.,str->radius / 2.,str->radius / 2.); glVertex3f(str->radius / 2.,str->radius / 2.,str->radius / 2.); glVertex3f(str->radius / 2.,str->radius / 2.,-str->radius / 2.); glNormal3f(0., -1., 0.); glVertex3f(-str->radius / 2.,-str->radius / 2.,-str->radius / 2.); glVertex3f(str->radius / 2.,-str->radius / 2.,-str->radius / 2.); glVertex3f(str->radius / 2.,-str->radius / 2.,str->radius / 2.); glVertex3f(-str->radius / 2.,-str->radius / 2.,str->radius / 2.); glEnd(); break; case VISU_RENDERING_ATOMIC_TORUS: glPushMatrix(); glRotatef(str->phi, 0., 0., 1.); glRotatef(str->theta, 0., 1., 0.); visu_gl_drawTorus(obj, 0, str->radius, str->ratio, nlat, nlat, FALSE); glPopMatrix(); break; default: g_warning("Unsupported shape id."); } glEndList(); gluDeleteQuadric(obj); DBG_fprintf(stderr, " | shape created %d\n", str->openGLIdentifier); return (str->openGLIdentifier); } v_sim-3.7.0/src/renderingMethods/renderingAtomic.h0000644000353400050620000001505612215546066017152 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef RENDERINGATOMIC_H #define RENDERINGATOMIC_H #include #include #include #include #include G_BEGIN_DECLS /* This method draws spheres to represent atoms. It introduces a new resource : the radius of the sphere. It can read data file either in d3 format or in ascii format. */ /** * VisuRenderingAtomicShapeId: * @VISU_RENDERING_ATOMIC_SPHERE: draw sphere ; * @VISU_RENDERING_ATOMIC_CUBE: draw cube ; * @VISU_RENDERING_ATOMIC_ELLIPSOID: draw elipsoid ; * @VISU_RENDERING_ATOMIC_POINT: draw square dot ; * @VISU_RENDERING_ATOMIC_TORUS: draw torus ; * @VISU_RENDERING_ATOMIC_N_SHAPES: number of shapes. * * This enum is used as identifier for shapes managed by the * attomic rendering method. */ typedef enum { VISU_RENDERING_ATOMIC_SPHERE, VISU_RENDERING_ATOMIC_CUBE, VISU_RENDERING_ATOMIC_ELLIPSOID, VISU_RENDERING_ATOMIC_POINT, VISU_RENDERING_ATOMIC_TORUS, VISU_RENDERING_ATOMIC_N_SHAPES } VisuRenderingAtomicShapeId; /** * VISU_TYPE_RENDERING_ATOMIC: * * return the type of #VisuRenderingAtomic. */ #define VISU_TYPE_RENDERING_ATOMIC (visu_rendering_atomic_get_type ()) /** * VISU_RENDERING_ATOMIC: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuRenderingAtomic type. */ #define VISU_RENDERING_ATOMIC(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_RENDERING_ATOMIC, VisuRenderingAtomic)) /** * VISU_RENDERING_ATOMIC_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuRenderingAtomicClass. */ #define VISU_RENDERING_ATOMIC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_RENDERING_ATOMIC, VisuRenderingAtomicClass)) /** * VISU_IS_RENDERING_ATOMIC_TYPE: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuRenderingAtomic object. */ #define VISU_IS_RENDERING_ATOMIC_TYPE(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_RENDERING_ATOMIC)) /** * VISU_IS_RENDERING_ATOMIC_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuRenderingAtomicClass class. */ #define VISU_IS_RENDERING_ATOMIC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_RENDERING_ATOMIC)) /** * VISU_RENDERING_ATOMIC_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. */ #define VISU_RENDERING_ATOMIC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_RENDERING_ATOMIC, VisuRenderingAtomicClass)) /** * visu_rendering_atomic_get_type: * * This method returns the type of #VisuRenderingAtomic, use * VISU_TYPE_RENDERING_ATOMIC instead. * * Returns: the type of #VisuRenderingAtomic. */ GType visu_rendering_atomic_get_type(void); /** * VISU_RENDERING_ATOMIC_NAME: * * Public name of the atomic rendering mode. */ #define VISU_RENDERING_ATOMIC_NAME "Atom visualisation" /** * VISU_RENDERING_ATOMIC_FORCES: * * Public name of the #VisuNodeProperty used to store forces on atoms. */ #define VISU_RENDERING_ATOMIC_FORCES "forces_id" /** * VISU_RENDERING_ATOMIC_FORCES_ELE_MAX: * * Public name of the #VisuNodeProperty used to store the max of forces per element. */ #define VISU_RENDERING_ATOMIC_FORCES_ELE_MAX "max_ele_forces_id" typedef struct _VisuRenderingAtomicClass VisuRenderingAtomicClass; typedef struct _VisuRenderingAtomic VisuRenderingAtomic; VisuRenderingAtomic* visu_rendering_atomic_new(); /***********************/ /* Different resources */ /***********************/ float visu_rendering_atomic_getRadius(VisuElement *ele); float visu_rendering_atomic_getRadiusDefault(); int visu_rendering_atomic_setRadius(VisuElement* ele, float value); VisuRenderingAtomicShapeId visu_rendering_atomic_getShape(VisuElement *ele); VisuRenderingAtomicShapeId visu_rendering_atomic_getShapeDefault(); const char* visu_rendering_atomic_getShapeName(VisuRenderingAtomicShapeId shape); const char* visu_rendering_atomic_getShapeNameDefault(); int visu_rendering_atomic_setShape(VisuElement *ele, VisuRenderingAtomicShapeId shape); int visu_rendering_atomic_setShapeFromName(VisuElement *ele, const char* shape); const char** visu_rendering_atomic_getAllShapes(); const char** visu_rendering_atomic_getAllShapesI18n(); gboolean visu_rendering_atomic_setElipsoidParameters(VisuElement *ele, float ratio, float phi, float theta); float visu_rendering_atomic_getElipsoidRatio(VisuElement *ele); float visu_rendering_atomic_getElipsoidPhi(VisuElement *ele); float visu_rendering_atomic_getElipsoidTheta(VisuElement *ele); gboolean visu_rendering_atomic_setElipsoidRatio(VisuElement *ele, float ratio); gboolean visu_rendering_atomic_setElipsoidPhi(VisuElement *ele, float phi); gboolean visu_rendering_atomic_setElipsoidTheta(VisuElement *ele, float theta); void visu_rendering_atomic_setForces(VisuData *dataObj, float *forces); float visu_rendering_atomic_getMaxForces(VisuData *dataObj); G_END_DECLS #endif v_sim-3.7.0/src/renderingMethods/renderingAtomic_ascii.c0000644000353400050620000005720012215546066020312 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "renderingAtomic_ascii.h" #include #include #include #include #include "renderingAtomic.h" #include #include #include #include #include /** * SECTION:renderingAtomic_ascii * @short_description: Method to load ascii position file. * * Ascii format is a plain text format to store elements and * their position. The first line is a commentary and is not * read. Then, the next two lines must contains each three numbers, * describing the box containing the data. The first number is the * length on x direction. The next two numbers are on one hand the * component on the same x direction and on the other hand the other * component on a direction orthogonal to the x direction, setting * thus the y direction. The three other numbers are the component of * the z direction on first, the x direction, then the y direction and * finally in a direction orthogonal both to x and y directions. After * these three first lines, all other lines can be blank, beginning * with a '#' character or containing three numbers and a label name * for the element. * * Some public methods here have been put for other loader which * wants to share the code of this loader (see the XYZ loader for * instance). */ typedef struct AsciiKeywordData_ { gboolean reduced; gboolean angdeg; ToolUnits unit; VisuBoxBoundaries bc; } AsciiKeywordData; typedef struct AsciiMetaData_ { guint nqpt; gdouble totalEnergy; gboolean forces; } AsciiMetaData; static double readTotalEnergy(const gchar *str); static gboolean loadAscii(VisuData *data, const gchar* filename, ToolFileFormat *format, int nSet, GCancellable *cancel, GError **error); static int read_ascii_file(VisuData *data, GIOChannel *flux, GError **error); static gboolean readFile_is_comment(char *str, AsciiKeywordData *kw, AsciiMetaData *md); /** * initAtomicAscii: (skip) * @method: the #VisuRendering method to be associated to. * * Create the structure that gives access to a load method and * some description of it (file formats associated, name...). Internal * use only */ void initAtomicAscii(VisuRendering *method) { const gchar *typeASCII[] = {"*.ascii", (char*)0}; visu_rendering_addFileFormat(method, 0, tool_file_format_new(_("'x y z Element' format"), typeASCII), 50, loadAscii); } /******************************************************************************/ static gboolean readFile_is_comment(char *str, AsciiKeywordData *kw, AsciiMetaData *md) { gchar **tokens; int i; if (kw && !strncmp(str + 1, "keyword", 7)) { tokens = g_strsplit_set(str + 9, " ,\n\t\r", -1); for (i = 0; tokens[i]; i++) if (tokens[i][0] != '\0') { /* tokens[i] = g_strstrip(tokens[i]); */ DBG_fprintf(stderr, "Atomic ASCII: get keyword '%s'.\n", tokens[i]); if (!g_ascii_strcasecmp(tokens[i], "reduced")) kw->reduced = TRUE; else if (!g_ascii_strcasecmp(tokens[i], "angdeg")) kw->angdeg = TRUE; else if (!g_ascii_strcasecmp(tokens[i], "atomic") || !g_ascii_strcasecmp(tokens[i], "atomicd0") || !g_ascii_strcasecmp(tokens[i], "bohr") || !g_ascii_strcasecmp(tokens[i], "bohrd0")) kw->unit = TOOL_UNITS_BOHR; else if (!g_ascii_strcasecmp(tokens[i], "angstroem") || !g_ascii_strcasecmp(tokens[i], "angstroemd0")) kw->unit = TOOL_UNITS_ANGSTROEM; else if (!g_ascii_strcasecmp(tokens[i], "periodic")) kw->bc = VISU_BOX_PERIODIC; else if (!g_ascii_strcasecmp(tokens[i], "surface")) kw->bc = VISU_BOX_SURFACE_ZX; else if (!g_ascii_strcasecmp(tokens[i], "surfaceXY")) kw->bc = VISU_BOX_SURFACE_XY; else if (!g_ascii_strcasecmp(tokens[i], "freeBC")) kw->bc = VISU_BOX_FREE; } g_strfreev(tokens); } if (md && !g_ascii_strncasecmp(str + 1, "metaData", 8)) { tokens = g_strsplit_set(str + 10, " ,\n\t\r", -1); for (i = 0; tokens[i]; i++) if (tokens[i][0] != '\0') { /* tokens[i] = g_strstrip(tokens[i]); */ DBG_fprintf(stderr, "Atomic ASCII: get meta data '%s'.\n", tokens[i]); if (!g_ascii_strncasecmp(tokens[i], "qpt", 3)) md->nqpt += 1; else if (!g_ascii_strncasecmp(tokens[i], "totalEnergy", 11)) md->totalEnergy = readTotalEnergy(str + 10); else if (!g_ascii_strncasecmp(tokens[i], "forces", 6)) md->forces = TRUE; } g_strfreev(tokens); } if(str[0] == '#' || str[0] == '!') return TRUE; str = g_strstrip(str); return (str[0] == '\0'); } static double readTotalEnergy(const gchar *str) { gchar *chr, *tmpStr; int res, pos; double val; chr = strstr(str, "totalEnergy"); chr = strchr(chr, '='); chr += 1; val = 999.; res = (chr)?sscanf(chr, "%lf%n", &val, &pos):0; if (res != 1) g_warning("syntax error for meta data 'totalEnergy' in '%s'.", chr); else if (chr[pos] != '\0') { tmpStr = g_strdup(chr + pos); tmpStr = g_strstrip(tmpStr); if (!g_ascii_strncasecmp(tmpStr, "Ht", 2)) val *= 27.21138386; else if (!g_ascii_strncasecmp(tmpStr, "Ry", 2)) val *= .5 * 27.21138386; g_free(tmpStr); } DBG_fprintf(stderr, "Atomic ASCII: found 'totalEnergy' at %geV.\n", val); return val; } static gboolean readQpt(gchar *str, float qpt[4], float *disp, guint natom) { gchar **values; gchar *ptr; guint j, k; ptr = strstr(str, "qpt"); if (!ptr) return FALSE; ptr = strstr(ptr, "="); if (!ptr) { g_warning("syntax error for meta data 'qpt' in '%s'.", str); return FALSE; } DBG_fprintf(stderr, "Atomic ASCII: read qpt from '%s'\n", ptr); memset(disp, 0, sizeof(float) * 6 * natom); values = g_strsplit_set(ptr + 1, " [];\n\r\\\t", -1); k = 0; for (j = 0; values[j] && k < 4; j++) if (values[j][0] != '\0') { if (sscanf(values[j], "%f", qpt + k) != 1) { g_warning("Can't read a float value from qpt" " keyword in '%s'.", values[j]); qpt[k] = 0.f; } DBG_fprintf(stderr, " | qpt[%d] = %g\n", k, qpt[k]); k += 1; } if (k != 4) g_warning("Can't read 4 float values from qpt" " keyword in '%s'.", ptr); for (k = 0; values[j] && k < 6 * natom; j++) if (values[j][0] != '\0') { if (sscanf(values[j], "%f", disp + k) == 1) k += 1; if (DEBUG && k % 6 == 5) DBG_fprintf(stderr, " | u[%d] = (%g,%g,%g) + i(%g,%g,%g)\n", k / 6, disp[(k / 6) * 6 + 0], disp[(k / 6) * 6 + 1], disp[(k / 6) * 6 + 2], disp[(k / 6) * 6 + 3], disp[(k / 6) * 6 + 4], disp[(k / 6) * 6 + 5]); } if (k != natom * 6) g_warning("Can't read enough displacement values," " %d read while %d were awaited.", k, natom * 6); g_strfreev(values); return TRUE; } static gboolean readForces(gchar *str, float *forces, guint natom) { gchar **values; gchar *ptr; guint j, k; ptr = strstr(str, "forces"); if (!ptr) return FALSE; ptr = strstr(ptr, "="); if (!ptr) { g_warning("syntax error for meta data 'forces' in '%s'.", str); return FALSE; } DBG_fprintf(stderr, "Atomic ASCII: read forces from '%s'\n", ptr); memset(forces, 0, sizeof(float) * 6 * natom); values = g_strsplit_set(ptr + 1, " [];\n\r\\\t", -1); for (k = 0, j = 0; values[j] && k < 6 * natom; j++) if (values[j][0] != '\0') { if (sscanf(values[j], "%f", forces + k) == 1) k += 1; if (DEBUG && k % 3 == 2) DBG_fprintf(stderr, " | f[%d] = (%g,%g,%g)\n", k / 3, forces[(k / 3) * 3 + 0], forces[(k / 3) * 3 + 1], forces[(k / 3) * 3 + 2]); } if (k != natom * 3) g_warning("Can't read enough force values," " %d read while %d were awaited.", k, natom * 3); g_strfreev(values); return TRUE; } gboolean continuousLine(GString *line) { gsize len; len = line->len - 1; while (line->str[len] == '\n' || line->str[len] == '\r' || line->str[len] == '\t' || line->str[len] == ' ') len -= 1; return (line->str[len] == '\\'); } /******************************************************************************/ /** * visu_meth_asciiFree: * @data: a pointer to #stuct VisuMethAscii instances. * * This method is used to free an allocated #stuct VisuMethAscii, and can * be used as a destructor when creating an hashtable with such datas. */ void visu_meth_asciiFree(gpointer data) { g_free((struct VisuMethAscii*)data); } /** * visu_meth_asciiValToType: * @key: a #VisuElement pointer ; * @value: a #struct VisuMethAscii pointer ; * @data: a pointer on array of pointers of #VisuElement. * * This method is used in a g_hash_table_foreach() method that work on @data. * @data is an array of pointers to #VisuElement and this method puts its * nth value to point to @key. The value nth is read from the @pos attribute of * the structure object pointed by @value. */ void visu_meth_asciiValToType(gpointer key _U_, gpointer value, gpointer data) { struct VisuMethAscii *infos; infos = (struct VisuMethAscii *)value; DBG_fprintf(stderr, " | %d -> '%s' (%p).\n", infos->pos, infos->ele->name, (gpointer)infos->ele); g_array_index((GArray*)data, VisuElement*, infos->pos) = infos->ele; } /** * visu_meth_asciiValToNb: * @key: a #VisuElement pointer ; * @value: a #struct VisuMethAscii pointer ; * @data: a pointer on array of int. * * This method is used in a g_hash_table_foreach() method that work on @data. * @data is an array of int and this method puts its * nth value to the value read from the @nbNodes attribute of * the structure object pointed by @value. */ void visu_meth_asciiValToNb(gpointer key _U_, gpointer value, gpointer data) { struct VisuMethAscii *infos; infos = (struct VisuMethAscii *)value; DBG_fprintf(stderr, " | %d -> %d.\n", infos->pos, infos->nbNodes); g_array_index((GArray*)data, guint, infos->pos) = infos->nbNodes; } /******************************************************************************/ static gboolean loadAscii(VisuData *data, const gchar* filename, ToolFileFormat *format _U_, int nSet _U_, GCancellable *cancel _U_, GError **error) { int res; GIOChannel *readFrom; GIOStatus status; g_return_val_if_fail(error && *error == (GError*)0, FALSE); g_return_val_if_fail(data && filename, FALSE); readFrom = g_io_channel_new_file(filename, "r", error); if (!readFrom) return FALSE; /* Do the job of parsing. */ res = read_ascii_file(data, readFrom, error); DBG_fprintf(stderr, "Atomic ASCII: parse return %d.\n", res); status = g_io_channel_shutdown(readFrom, FALSE, (GError**)0); g_io_channel_unref(readFrom); if (status != G_IO_STATUS_NORMAL) { DBG_fprintf(stderr, "Atomic ASCII: can't close file.\n"); return FALSE; } if (res < 0) { /* The file is not an ascii file. */ return FALSE; } else if (res > 0) { /* The file is an ascii file but some errors occured. */ return TRUE; } /* Everything is OK. */ *error = (GError*)0; return TRUE; } static int read_ascii_file(VisuData *data, GIOChannel *flux, GError **error) { gchar *info; GString *line, *bufLine; gsize term; double xu, yu, zu; guint i, iph; int pos; char nomloc[TOOL_MAX_LINE_LENGTH]; VisuElement *type; GArray *types; GArray *nattyp; guint ntype, nbLine, natom; GHashTable *elements; struct VisuMethAscii *infos; double boxGeometry[6], abc[3], ang[3]; float xyz[3], uvw[3]; gchar *infoUTF8, **nodeComments; gboolean hasNodeComments; GIOStatus status; float qpt[4], *dcoord, *forces; AsciiKeywordData kw; AsciiMetaData md; VisuBox *box; g_return_val_if_fail(error && *error == (GError*)0, FALSE); line = g_string_new(""); /* The first line is a commentry. */ if (g_io_channel_read_line_string(flux, line, &term, error) != G_IO_STATUS_NORMAL) { g_string_free(line, TRUE); /* The file doesn't conform to ascii norm, we exit with a wrong type flag. */ return -1; } info = g_strdup(line->str); /* The second line contains xx, xy and yy */ if (g_io_channel_read_line_string(flux, line, &term, error) != G_IO_STATUS_NORMAL) { g_string_free(line, TRUE); g_free(info); /* The file doesn't conform to ascii norm, we exit with a wrong type flag. */ return -2; } if(sscanf(line->str, "%lf %lf %lf", &(boxGeometry[0]), &(boxGeometry[1]), &(boxGeometry[2])) != 3) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Cannot read dxx dyx dyy" " on 2nd line of ASCII file.\n")); g_string_free(line, TRUE); g_free(info); /* The file doesn't conform to ascii norm, we exit with a wrong type flag. */ return -3; } /* The third line contains xz, yz and zz */ if (g_io_channel_read_line_string(flux, line, &term, error) != G_IO_STATUS_NORMAL) { g_string_free(line, TRUE); g_free(info); /* The file doesn't conform to ascii norm, we exit with a wrong type flag. */ return -4; } if(sscanf(line->str, "%lf %lf %lf", &boxGeometry[3], &boxGeometry[4], &boxGeometry[5]) != 3) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Cannot read dzx dzy dzz" " on 3rd line of ASCII file.\n")); g_string_free(line, TRUE); g_free(info); /* The file doesn't conform to ascii norm, we exit with a wrong type flag. */ return -5; } /* Ok, from this point we assert that the file is in ascii format. All following errors are treated as syntax errors and the corresponding flag is return. */ DBG_fprintf(stderr, "Atomic ASCII: read box is %f x %f x %f\n" " %f x %f x %f\n", boxGeometry[0], boxGeometry[1], boxGeometry[2], boxGeometry[3], boxGeometry[4], boxGeometry[5]); /* Set the commentary. */ g_strstrip(info); if (info[0] == '#') infoUTF8 = g_locale_to_utf8(info + 1, -1, NULL, NULL, NULL); else infoUTF8 = g_locale_to_utf8(info, -1, NULL, NULL, NULL); if (infoUTF8) { visu_data_setFileCommentary(data, infoUTF8, 0); g_free(infoUTF8); } else g_warning("Can't convert '%s' to UTF8.\n", info); /* 1st pass to count ntype */ kw.reduced = FALSE; kw.angdeg = FALSE; kw.unit = TOOL_UNITS_UNDEFINED; kw.bc = VISU_BOX_PERIODIC; md.nqpt = 0; md.totalEnergy = 999.; md.forces = FALSE; dcoord = (float*)0; forces = (float*)0; nbLine = 4; ntype = 0; elements = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, visu_meth_asciiFree); g_return_val_if_fail(elements, -1); for(status = g_io_channel_read_line_string(flux, line, &term, error); status == G_IO_STATUS_NORMAL; status = g_io_channel_read_line_string(flux, line, &term, error)) { nbLine += 1; if(readFile_is_comment(line->str, &kw, &md)) continue; if(sscanf(line->str, "%lf %lf %lf %s", &xu, &yu, &zu, nomloc) != 4) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Cannot read x, y, z," " name in ASCII file at line %d.\n\n" "Quoting '%s'.\n"), nbLine, line->str); g_string_free(line, TRUE); return 1; } nomloc[8] = '\0'; /* adding nomloc to the hashtable */ type = visu_element_retrieveFromName(nomloc, (gboolean*)0); infos = (struct VisuMethAscii*)g_hash_table_lookup(elements, (gconstpointer)type); if (!infos) { infos = g_malloc(sizeof(struct VisuMethAscii)); infos->ele = type; infos->pos = ntype; infos->nbNodes = 1; g_hash_table_insert(elements, (gpointer)type, (gpointer)infos); ntype++; } else infos->nbNodes += 1; } if (status != G_IO_STATUS_EOF) { g_string_free(line, TRUE); return 1; } if (ntype <= 0) { g_string_free(line, TRUE); *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("The file contains no atom coordinates.\n")); return 1; } DBG_fprintf(stderr, "Atomic ASCII: transfer to VisuData.\n"); /* Allocate the space for the nodes. */ types = g_array_sized_new(FALSE, FALSE, sizeof(VisuElement*), ntype); nattyp = g_array_sized_new(FALSE, FALSE, sizeof(guint), ntype); g_array_set_size(types, ntype); g_array_set_size(nattyp, ntype); g_hash_table_foreach(elements, (GHFunc)visu_meth_asciiValToType, (gpointer)types); g_hash_table_foreach(elements, (GHFunc)visu_meth_asciiValToNb, (gpointer)nattyp); g_hash_table_destroy(elements); natom = 0; for (i = 0; i < ntype; i++) natom += g_array_index(nattyp, guint, i); visu_node_array_allocate(VISU_NODE_ARRAY(data), types, nattyp); g_array_free(nattyp, TRUE); g_array_free(types, TRUE); /* We build boxGeometry according to angdeg flag. */ DBG_fprintf(stderr, "Atomic ASCII: build the box if any.\n"); if (kw.angdeg) { abc[0] = boxGeometry[0]; abc[1] = boxGeometry[1]; abc[2] = boxGeometry[2]; ang[0] = boxGeometry[3]; ang[1] = boxGeometry[4]; ang[2] = boxGeometry[5]; if (sin(ang[2]) == 0.f) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong (ab) angle, should be" " different from 0[pi].\n\n" " Quoting '%g'.\n"), ang[2]); g_string_free(line, TRUE); return 1; } boxGeometry[0] = abc[0]; boxGeometry[1] = abc[1] * cos(G_PI * ang[2] / 180.); boxGeometry[2] = abc[1] * sin(G_PI * ang[2] / 180.); boxGeometry[3] = abc[2] * cos(G_PI * ang[1] / 180.); boxGeometry[4] = abc[2] * (cos(G_PI * ang[0] / 180.) - cos(G_PI * ang[1] / 180.) * cos(G_PI * ang[2] / 180.)) / sin(G_PI * ang[2] / 180.); boxGeometry[5] = sqrt(abc[2] * abc[2] - boxGeometry[3] * boxGeometry[3] - boxGeometry[4] * boxGeometry[4]); boxGeometry[5] *= (ang[1] < 0.)?-1.:+1.; } /* Always set the given box, in case coordinates are reduced. */ box = visu_box_new(boxGeometry, kw.bc); visu_boxed_setBox(VISU_BOXED(data), VISU_BOXED(box), FALSE); g_object_unref(box); /* Test phonons. */ if (md.nqpt > 0) { DBG_fprintf(stderr, "Atomic ASCII: initialise phonon storage for %d data.\n", natom * 6); visu_vibration_init(data, md.nqpt, natom); dcoord = g_malloc(sizeof(float) * (natom * 6)); } if (md.forces) { DBG_fprintf(stderr, "Atomic ASCII: initialise forces storage for %d data.\n", natom * 6); forces = g_malloc(sizeof(float) * (natom * 6)); } DBG_fprintf(stderr, "Atomic ASCII: reread file for node positions.\n"); /* Allocate the storage of the node comments. */ nodeComments = g_malloc(sizeof(gchar*) * natom); hasNodeComments = FALSE; g_io_channel_seek_position(flux, 0, G_SEEK_SET, error); /* reread the file to store the coordinates */ g_io_channel_read_line_string(flux, line, &term, error); g_io_channel_read_line_string(flux, line, &term, error); g_io_channel_read_line_string(flux, line, &term, error); i = 0; iph = 0; bufLine = g_string_new((gchar*)0); for(status = g_io_channel_read_line_string(flux, line, &term, error); status == G_IO_STATUS_NORMAL; status = g_io_channel_read_line_string(flux, line, &term, error)) { if(readFile_is_comment(line->str, (AsciiKeywordData*)0, (AsciiMetaData*)0)) { while (continuousLine(line) && status == G_IO_STATUS_NORMAL) { status = g_io_channel_read_line_string(flux, bufLine, &term, error); g_string_append(line, bufLine->str); } if (md.nqpt > 0 && readQpt(line->str, qpt, dcoord, natom)) { visu_vibration_setCharacteristic(data, iph, qpt, qpt[3], 1.f); visu_vibration_setDisplacements(data, iph, dcoord, TRUE); iph += 1; } if (md.forces && readForces(line->str, forces, natom)) visu_rendering_atomic_setForces(data, forces); continue; } pos = 0; sscanf(line->str, "%lf %lf %lf %s %n", &xu, &yu, &zu, nomloc, &pos); nomloc[8] = '\0'; type = visu_element_lookup(nomloc); if (!type) { g_warning("The input file must" " have been modified when loading since" " at the second reading the element '%s'" " seems to be new.\n", nomloc); g_string_free(line, TRUE); g_string_free(bufLine, TRUE); return 1; } xyz[0] = uvw[0] = (float)xu; xyz[1] = uvw[1] = (float)yu; xyz[2] = uvw[2] = (float)zu; if (kw.reduced) visu_box_convertBoxCoordinatestoXYZ(box, xyz, uvw); visu_data_addNodeFromElement(data, type, xyz, FALSE, FALSE); /* Store a possible comment. */ if (line->str[pos] != '\0') { nodeComments[i] = (line->str[pos] == '#')?g_strdup(line->str + pos + 1): g_strdup(line->str + pos); g_strstrip(nodeComments[i]); if (nodeComments[i][0] == '\0') { g_free(nodeComments[i]); nodeComments[i] = (gchar*)0; } else hasNodeComments = TRUE; } else nodeComments[i] = (gchar*)0; i++; } g_string_free(line, TRUE); g_string_free(bufLine, TRUE); /* In free boundary conditions, find the bounding box. */ if (kw.bc != VISU_BOX_PERIODIC) visu_data_setTightBox(data); /* We finish with the box description. */ DBG_fprintf(stderr, "Atomic ASCII: apply the box geometry and set the unit.\n"); visu_box_setMargin(box, visu_node_array_getMaxElementSize(VISU_NODE_ARRAY(data)) + visu_data_getAllNodeExtens(data, box), TRUE); visu_box_setUnit(box, kw.unit); /* We apply the comments, if any. */ visu_extra_node_addLabel(data); if (hasNodeComments) { for (i = 0; i < natom; i++) if (nodeComments[i]) { visu_extra_node_setLabel(data, i, nodeComments[i]); g_free(nodeComments[i]); } } g_free(nodeComments); /* Add some other meta data. */ if (md.totalEnergy != 999.) g_object_set(G_OBJECT(data), "totalEnergy", md.totalEnergy, NULL); if (md.nqpt > 0) g_free(dcoord); if (md.forces) g_free(forces); DBG_fprintf(stderr, "Atomic ASCII: parse done.\n"); return 0; } v_sim-3.7.0/src/renderingMethods/renderingAtomic_ascii.h0000644000353400050620000000531412215546066020316 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef RENDERINGATOMIC_ASCII_H #define RENDERINGATOMIC_ASCII_H #include #include #include "renderingAtomic.h" /** * VisuMethAscii: * @ele: a #VisuElement object ; * @pos: the number of the read element @ele ; * @nbNodes: number of nodes for this @ele. * * This structure is used when the file is parsed. Each time a node is successfully * read, its #VisuElement is compared to those already found. If none is found, * a new instance of this structure is created with @ele pointing to the #VisuElement, * @pos is the nth #visuElement found and @nbPos is initialized to one. If the read * #VisuElement has already been found, the @nbPos is increased by one. */ struct VisuMethAscii { VisuElement *ele; int pos; int nbNodes; }; void visu_meth_asciiFree(gpointer data); void visu_meth_asciiValToType(gpointer key, gpointer value, gpointer data); void visu_meth_asciiValToNb(gpointer key, gpointer value, gpointer data); void initAtomicAscii(VisuRendering *method); #endif v_sim-3.7.0/src/renderingMethods/atomic_xyz.c0000644000353400050620000006105012215546066016214 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse mèl : BILLARD, non joignable par mèl ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "atomic_xyz.h" #include "renderingAtomic_ascii.h" #include "renderingAtomic.h" #include #include #include #include #include #include #include #include /*#define TESTNEW*/ /** * SECTION:atomic_xyz * @short_description: Method to load xyz position file. * * XYZ formats are plain text format to store atomic * positions. This format is quite simple, first line must contain the * number of element, then * the second usually store a commentary (but this is not required), * then all lines that are not beginning with a '#' are tried to match * "label x y z":. If succeed a node is added, if not, the next line * is read as much time as specified on first line. This scheme can be * repeated as much time as required to store animation for instance. */ static gboolean loadXyz(VisuData *data, const gchar* filename, ToolFileFormat *format, int nSet, GCancellable *cancel, GError **error); static int read_Xyz_File(VisuData *data, GIOChannel *flux, int nSet, GError **error); #ifdef TESTNEW static gboolean test_Routine(float* coords, float* dcoord, VisuElement **nodeTypes); #endif /******************************************************************************/ /** * initAtomicXyz: (skip) * @method: the #VisuRendering method to be associated to. * * Create the structure that gives access to a load method and * some description of it (file formats associated, name...). Internal * use only */ void initAtomicXyz(VisuRendering *method) { const gchar *typeXYZ[] = {"*.xyz", (char*)0}; visu_rendering_addFileFormat(method, 0, tool_file_format_new(_("'Element x y z' format"), typeXYZ), 100, loadXyz); } static gboolean loadXyz(VisuData *data, const gchar* filename, ToolFileFormat *format _U_, int nSet, GCancellable *cancel _U_, GError **error) { int res; GIOChannel *readFrom; GIOStatus status; g_return_val_if_fail(error && *error == (GError*)0, FALSE); g_return_val_if_fail(data && filename, FALSE); readFrom = g_io_channel_new_file(filename, "r", error); if (!readFrom) return FALSE; res = read_Xyz_File(data, readFrom, nSet, error); DBG_fprintf(stderr, "Atomic XYZ: parse return %d.\n", res); status = g_io_channel_shutdown(readFrom, TRUE, (GError**)0); g_io_channel_unref(readFrom); if (status != G_IO_STATUS_NORMAL) { DBG_fprintf(stderr, "Atomic XYZ: can't close file.\n"); return FALSE; } if (res < 0) { if (*error) g_error_free(*error); *error = (GError*)0; /* The file is not a XYZ file. */ return FALSE; } else if (res > 0) /* The file is a XYZ file but some errors occured. */ return TRUE; /* Everything is OK. */ *error = (GError*)0; return TRUE; } static gboolean readNextLine(GIOChannel *flux, gboolean mandatory, GString *line, GIOStatus *status, GError **error) { gsize terminator_pos; /*if there are commentaries */ do { *status = g_io_channel_read_line_string(flux, line, &terminator_pos, error); if (*status != G_IO_STATUS_NORMAL) { if (*status == G_IO_STATUS_EOF) { if (*error) g_error_free(*error); *error = (GError*)0; return !mandatory; } return FALSE; }; g_strstrip(line->str); } while (line->str[0] == '#' || line->str[0] == '!' || line->str[0] == '\0'); return TRUE; } static ToolUnits readUnit(const gchar *line) { ToolUnits unit; gchar *tmpStr; guint nNodes; unit = TOOL_UNITS_UNDEFINED; tmpStr = g_strdup(line); if (sscanf(line, "%u %s", &nNodes, tmpStr) == 2) unit = tool_physic_getUnitFromName(g_strstrip(tmpStr)); DBG_fprintf(stderr, " | units for the set is '%s' -> %d.\n", tmpStr, unit); g_free(tmpStr); return unit; } static gboolean readReduced(const gchar *line) { gboolean reduced; gchar *tmpStr; guint nNodes; reduced = FALSE; tmpStr = g_strdup(line); if (sscanf(line, "%u %s", &nNodes, tmpStr) == 2) reduced = (!g_ascii_strcasecmp(tmpStr, "reduced")); DBG_fprintf(stderr, " | coordinates are reduced %d.\n", reduced); g_free(tmpStr); return reduced; } static float readEnergy(const gchar *line) { gchar *tmpStr; guint nNodes; float ene; tmpStr = g_strdup(line); if (sscanf(line, "%u %s %f", &nNodes, tmpStr, &ene) != 3) ene = G_MAXFLOAT; else ene *= 27.21138386; g_free(tmpStr); DBG_fprintf(stderr, " | total energy for the set is %geV.\n", ene); return ene; } static void readFree(GList *lst, GHashTable *elements, GString *line, VisuElement **nodeTypes, float *coords, float *dcoord, float *forces, GList *labels) { GList *tmpLst; if (line) g_string_free(line, TRUE); g_hash_table_destroy(elements); for (tmpLst = lst; tmpLst; tmpLst = g_list_next(tmpLst)) g_free(tmpLst->data); if (lst) g_list_free(lst); if (nodeTypes) g_free(nodeTypes); if (coords) g_free(coords); if (dcoord) g_free(dcoord); if (forces) g_free(forces); for (tmpLst = labels; tmpLst; tmpLst = g_list_next(tmpLst)) { tmpLst = g_list_next(tmpLst); g_free(tmpLst->data); } if (labels) g_list_free(labels); } static void readCoord(const gchar *line, guint iNodes, guint nNodes, float *xyz, float **dxyz, GHashTable *elements, VisuElement **nodeTypes, gchar **label, GError **error) { guint nbcolumn; float dxyz_[3]; gchar nomloc[TOOL_MAX_LINE_LENGTH]; VisuElement *type; struct VisuMethAscii *infos; int pos; *label = (gchar*)0; nbcolumn = sscanf(line, "%s %f %f %f %f %f %f", nomloc, xyz + 3 * iNodes + 0, xyz + 3 * iNodes + 1, xyz + 3 * iNodes + 2, dxyz_ + 0, dxyz_ + 1, dxyz_ + 2); if (nbcolumn < 4) { DBG_fprintf(stderr, "Atomic XYZ: can't read line values.\n"); *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong XYZ format, 'Atom X Y Z' awaited.")); } else if (((*dxyz) && nbcolumn != 7) || (!(*dxyz) && iNodes > 0 && nbcolumn == 7)) { DBG_fprintf(stderr, "Atomic XYZ: can't read vibration values.\n"); *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong XYZ + vibration format," " 'Atom X Y Z vx vy vz' awaited.")); } if (nbcolumn == 7) { if (!(*dxyz)) *dxyz = g_malloc(sizeof(float) * 3 * nNodes); (*dxyz)[3 * iNodes + 0] = dxyz_[0]; (*dxyz)[3 * iNodes + 1] = dxyz_[1]; (*dxyz)[3 * iNodes + 2] = dxyz_[2]; } if (*error) return; nomloc[8] = '\0'; type = visu_element_retrieveFromName(nomloc, (gboolean*)0); if (!type) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Internal error, cannot create type for '%s'."), nomloc); return; } nodeTypes[iNodes] = type; infos = (struct VisuMethAscii*) g_hash_table_lookup(elements, (gconstpointer)type); if (!infos) { infos = g_malloc(sizeof(struct VisuMethAscii)); infos->ele = type; infos->pos = g_hash_table_size(elements); infos->nbNodes = 1; g_hash_table_insert(elements, (gpointer)type, (gpointer)infos); } else infos->nbNodes += 1; /* Store a possible comment. */ pos = 0; if (nbcolumn == 4) sscanf(line, "%s %f %f %f %n", nomloc, xyz + 3 * iNodes + 0, xyz + 3 * iNodes + 1, xyz + 3 * iNodes + 2, &pos); else sscanf(line, "%s %f %f %f %f %f %f %n", nomloc, xyz + 3 * iNodes + 0, xyz + 3 * iNodes + 1, xyz + 3 * iNodes + 2, dxyz_ + 0, dxyz_ + 1, dxyz_ + 2, &pos); if (line[pos] != '\0') { *label = g_strdup(line + pos + ((line[pos] == '#')?1:0)); g_strstrip(*label); if ((*label)[0] == '\0') { g_free(*label); *label = (gchar*)0; } } } static void readForces(GIOChannel *flux, GString *line, guint nNodes, float **forces, GIOStatus *status, GError **error) { guint iNodes; gchar nomloc[TOOL_MAX_LINE_LENGTH]; if (!strcmp(line->str, "forces")) { if (forces) *forces = g_malloc(sizeof(float) * nNodes * 3); for (iNodes = 0; iNodes < nNodes && *status == G_IO_STATUS_NORMAL; iNodes++) { if (!readNextLine(flux, TRUE, line, status, error)) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Missing forces (%d read but" " %d declared).\n"), iNodes, nNodes); return; } if (forces && sscanf(line->str, "%s %f %f %f", nomloc, *forces + 3 * iNodes + 0, *forces + 3 * iNodes + 1, *forces + 3 * iNodes + 2) != 4) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Cannot read forces in '%s'.\n"), line->str); return; } } /* Eat blank or commentary lines between Sets */ readNextLine(flux, FALSE, line, status, error); } } /******************************************************************************/ static int read_Xyz_File(VisuData *data, GIOChannel *flux, int nSet, GError **error) { GIOStatus status; GString *line; gsize terminator_pos; int i; int res, nNodes, iNodes, nNodesSet; int nSets; char *kwd; float *coords, *dcoord, *forces; gchar *infoUTF8; GList *lst, *tmpLst; GHashTable *elements; float qpt[3], omega, totalEnergy; double box[3], boxGeometry[6]; int ntype; ToolUnits unit; GArray *types, *nattyp; VisuElement **nodeTypes; guint natom; gchar *pt, *label; VisuBoxBoundaries bc; gboolean reduced; GList *nodeComments; VisuBox *boxObj; #if DEBUG == 1 GTimer *timer, *readTimer, *internalTimer; gulong fractionTimer; float time1, time2, time3; #endif DBG_fprintf(stderr, "Atomic xyz: reading file as an xyz file.\n"); line = g_string_new(""); unit = TOOL_UNITS_UNDEFINED; reduced = FALSE; /* Storage of number of elements per types. */ ntype = 0; elements = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_free); /* We read the file completely to find the number of sets of points and we store only the one corresponding to @nSet. */ #if DEBUG == 1 timer = g_timer_new(); readTimer = g_timer_new(); internalTimer = g_timer_new(); g_timer_start(timer); g_timer_start(internalTimer); g_timer_stop(internalTimer); time3 = 0.f; #endif nSets = 0; nNodesSet = 0; nodeTypes = (VisuElement**)0; coords = (float*)0; dcoord = (float*)0; forces = (float*)0; lst = (GList*)0; nodeComments = (GList*)0; totalEnergy = G_MAXFLOAT; status = g_io_channel_read_line_string(flux, line, &terminator_pos, error); if ( status != G_IO_STATUS_NORMAL ) { readFree(lst, elements, line, nodeTypes, coords, dcoord, forces, nodeComments); return -1; } while( status != ( G_IO_STATUS_EOF ) ) { DBG_fprintf(stderr, "Atomic xyz: read node set number %d.\n", nSets); /*The Number Of Nodes*/ nNodes=0; DBG_fprintf(stderr, "Atomic xyz: get n atoms from '%s'.\n", line->str); res = sscanf(line->str, "%d", &nNodes); if ( res != 1 ) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong XYZ format, no number on first line.\n")); readFree(lst, elements, line, nodeTypes, coords, dcoord, forces, nodeComments); return (nSets > 0)?1:-1; } DBG_fprintf(stderr, " | number of declared nodes is %d.\n", nNodes); #if DEBUG == 1 if (nSets == nSet) g_timer_start(readTimer); else g_timer_continue(internalTimer); #endif if (nSets == nSet) { unit = readUnit(line->str); reduced = readReduced(line->str); totalEnergy = readEnergy(line->str); } /*The Commentary line */ if ( g_io_channel_read_line_string(flux, line, &terminator_pos, error) != G_IO_STATUS_NORMAL ) { readFree(lst, elements, line, nodeTypes, coords, dcoord, forces, nodeComments); return -2; } g_strstrip(line->str); DBG_fprintf(stderr, " | set the commentary to '%s'.\n", line->str); if (line->str[0] == '#') infoUTF8 = g_locale_to_utf8(line->str + 1, -1, NULL, NULL, NULL); else infoUTF8 = g_locale_to_utf8(line->str, -1, NULL, NULL, NULL); if (infoUTF8) lst = g_list_append(lst, infoUTF8); else g_warning("Can't convert '%s' to UTF8.\n", line->str); /* The Data Lines.*/ if (nSets == nSet) { nNodesSet = nNodes; nodeTypes = g_malloc(sizeof(VisuElement*) * nNodes); coords = g_malloc(sizeof(float) * 3 * nNodes); dcoord = (float*)0; forces = (float*)0; qpt[0] = 0.f; qpt[1] = 0.f; qpt[2] = 0.f; } status = G_IO_STATUS_NORMAL; DBG_fprintf(stderr, " | read node coordinates.\n"); for (iNodes = 0; iNodes < nNodes && status == G_IO_STATUS_NORMAL; iNodes++) { if (!readNextLine(flux, TRUE, line, &status, error)) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Missing coordinates (%d read but" " %d declared).\n"), iNodes, nNodes); readFree(lst, elements, line, nodeTypes, coords, dcoord, forces, nodeComments); return 1; } /* if Reading the nSets, parse the data */ if (nSets == nSet) { /* Read the coordinates. */ readCoord(line->str, iNodes, nNodes, coords, &dcoord, elements, nodeTypes, &label, error); if (*error) { readFree(lst, elements, line, nodeTypes, coords, dcoord, forces, nodeComments); return 1; } if (label) { nodeComments = g_list_prepend(nodeComments, label); nodeComments = g_list_prepend(nodeComments, GINT_TO_POINTER(iNodes)); } } #if DEBUG == 1 if (nSets == nSet) g_timer_stop(readTimer); else g_timer_stop(internalTimer); #endif } #if DEBUG == 1 g_timer_stop(timer); #endif /* Eat blank or commentary lines after coordinates. */ if (!readNextLine(flux, FALSE, line, &status, error)) { readFree(lst, elements, line, nodeTypes, coords, dcoord, forces, nodeComments); return 1; } /* Maybe read forces (BigDFT addition). */ readForces(flux, line, nNodes, (nSets == nSet)?&forces:(float**)0, &status, error); if (*error) { readFree(lst, elements, line, nodeTypes, coords, dcoord, forces, nodeComments); return 1; } /* OK, one set of nodes have been read. */ nSets++; DBG_fprintf(stderr, " | read OK %d %d.\n", status, G_IO_STATUS_EOF); } g_string_free(line, TRUE); ntype = g_hash_table_size(elements); DBG_fprintf(stderr, " | finish to read the file (ntype = %d).\n", ntype); #if DEBUG == 1 g_timer_stop(timer); time1 = g_timer_elapsed(timer, &fractionTimer)/1e-6; time2 = g_timer_elapsed(readTimer, &fractionTimer)/1e-6; time3 = g_timer_elapsed(internalTimer, &fractionTimer)/1e-6; g_timer_destroy(readTimer); #endif #if DEBUG == 1 g_timer_start(timer); #endif /* Allocate the space for the nodes. */ if (ntype <= 0) { readFree(lst, elements, (GString*)0, nodeTypes, coords, dcoord, forces, nodeComments); *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("The file contains no atom coordinates.\n")); return -1; } types = g_array_sized_new(FALSE, FALSE, sizeof(VisuElement*), ntype); nattyp = g_array_sized_new(FALSE, FALSE, sizeof(guint), ntype); g_array_set_size(types, ntype); g_array_set_size(nattyp, ntype); DBG_fprintf(stderr, "Atomic xyz: transfer to VisuData (%p %p).\n", (gpointer)types, (gpointer)nattyp); g_hash_table_foreach(elements, (GHFunc)visu_meth_asciiValToType, (gpointer)types); DBG_fprintf(stderr, " | transfer to types OK.\n"); g_hash_table_foreach(elements, (GHFunc)visu_meth_asciiValToNb, (gpointer)nattyp); DBG_fprintf(stderr, " | transfer to nNodesPerEle OK.\n"); g_hash_table_destroy(elements); DBG_fprintf(stderr, " | populate nodes.\n"); /* Begin the storage into VisuData. */ visu_data_setNSubset(data, nSets); visu_node_array_allocate(VISU_NODE_ARRAY(data), types, nattyp); DBG_fprintf(stderr, "Atomic xyz: there are %d types in this file.\n", ntype); if (DEBUG) { for (i = 0; i < ntype; i++) DBG_fprintf(stderr, " | %d atom(s) for type %d.\n", g_array_index(nattyp, guint, i), i); } natom = 0; for (i = 0; i < ntype; i++) natom += g_array_index(nattyp, guint, i); g_array_free(nattyp, TRUE); g_array_free(types, TRUE); /* Set the commentary. */ bc = VISU_BOX_FREE; tmpLst = lst; for (i = 0; i < nSets; i++) { /* Try to see if the commentary contains some keywords. */ if (i == nSet) { kwd = strstr((char*)tmpLst->data, "periodic"); if (kwd && sscanf(kwd + 8, "%lf %lf %lf", box, box + 1, box + 2) == 3) bc = VISU_BOX_PERIODIC; kwd = strstr((char*)tmpLst->data, "surface"); if (kwd && sscanf(kwd + 8, "%lf %lf %lf", box, box + 1, box + 2) == 3) bc = VISU_BOX_SURFACE_ZX; } visu_data_setFileCommentary(data, (gchar*)tmpLst->data, i); g_free(tmpLst->data); tmpLst = g_list_next(tmpLst); } g_list_free(lst); boxObj = (VisuBox*)0; if (bc != VISU_BOX_FREE) { DBG_fprintf(stderr, "Atomic xyz: the elements are in %fx%fx%f.\n", box[0], box[1], box[2]); boxGeometry[0] = box[0]; boxGeometry[1] = 0.; boxGeometry[2] = box[1]; boxGeometry[3] = 0.; boxGeometry[4] = 0.; boxGeometry[5] = box[2]; boxObj = visu_box_new(boxGeometry, bc); visu_boxed_setBox(VISU_BOXED(data), VISU_BOXED(boxObj), FALSE); g_object_unref(boxObj); } /* Store the coordinates */ for(iNodes = 0; iNodes < nNodesSet; iNodes++) visu_data_addNodeFromElement(data, nodeTypes[iNodes], coords + 3 * iNodes, reduced, FALSE); #ifdef TESTNEW if ( test_Routine(coords, dcoord, nodeTypes) == FALSE ) return -1; #endif g_free(nodeTypes); g_free(coords); if (bc != VISU_BOX_PERIODIC) boxObj = visu_data_setTightBox(data); visu_box_setMargin(boxObj, visu_node_array_getMaxElementSize(VISU_NODE_ARRAY(data)) + visu_data_getAllNodeExtens(data, boxObj), TRUE); visu_box_setUnit(boxObj, unit); /* create the structure for phonons */ if (dcoord) { visu_vibration_init(data, nSets, natom); for (i = 0; i < nSets; i++) { omega = 1.f; pt = strstr(visu_data_getFileCommentary(data, i), "freq="); if (pt) sscanf(pt + 5, "%f", &omega); if (omega < 0.) g_warning("Negative phonon frequency (%f).", omega); visu_vibration_setCharacteristic(data, i, qpt, 0.f, omega); } visu_vibration_setDisplacements(data, nSet, dcoord, FALSE); g_free(dcoord); } /* Store the forces, if any. */ if (forces) { visu_rendering_atomic_setForces(data, forces); g_free(forces); } /* We apply the comments, if any. */ visu_extra_node_addLabel(data); if (nodeComments) { for (tmpLst = nodeComments; tmpLst; tmpLst = g_list_next(tmpLst)) { visu_extra_node_setLabel(data, GPOINTER_TO_INT(tmpLst->data), tmpLst->next->data); g_free(tmpLst->next->data); tmpLst = g_list_next(tmpLst); } g_list_free(nodeComments); } /* Add some other meta data. */ if (totalEnergy != G_MAXFLOAT) g_object_set(G_OBJECT(data), "totalEnergy", totalEnergy, NULL); #if DEBUG == 1 g_timer_stop(timer); fprintf(stderr, "Atomic XYZ: parse all file in %g micro-s.\n", time1); fprintf(stderr, "Atomic XYZ: parse coordinates in %g micro-s.\n", time2); fprintf(stderr, "Atomic XYZ: header parse in %g micro-s.\n", time3); fprintf(stderr, "Atomic XYZ: set all data in %g micro-s.\n", g_timer_elapsed(timer, &fractionTimer)/1e-6); g_timer_destroy(timer); #endif return 0; } /******************************************************************************/ #ifdef TESTNEW static gboolean test_Routine(float* coords, float* dcoord, VisuElement **nodeTypes) { float xyz[15] = {-0.440035, -0.000385, 2.123698, -1.765945, 0.000399, 2.377542, -2.249233, -0.001453, 3.679971, -1.338875, -0.004508, 4.739569, 0.024627, -0.005918, 4.466144}; float dxyz[15] = {0.001000, -0.151000, -0.002000, 0.001000, -0.175000, 0.000000, 0.003000, -0.198000, 0.001000, 0.005000, -0.183000, -0.000000, 0.005000, -0.146000, -0.003000}; char* waitedType[5]={ "N", "C", "C", "Co", "C"}; int i=0, j=0; /* Checking coordonates values and type values*/ DBG_fprintf(stderr, "+---------------------------------------------------------------+\n"); /* for each node : checking names and coordonates values using a difference.*/ while( (i<15) && (strcmp(nodeTypes[j]->name,waitedType[j])==0) && (ABS(coords[i]-xyz[i])<1e-6) && (ABS(dcoord[i]-dxyz[i])<1e-6) ) { if (i%3==0) { DBG_fprintf(stderr, "xyz parser : expected element: %s, found: %s \n", waitedType[j], nodeTypes[j]->name); DBG_fprintf(stderr, "xyz parser : expected x: %f, found: %f \t", xyz[i], coords[i]); DBG_fprintf(stderr, "xyz parser : expected dx: %f, found: %f \n", dxyz[i], dcoord[i]); } if (i%3==1) { DBG_fprintf(stderr, "xyz parser : expected y: %f, found: %f \t", xyz[i], coords[i]); DBG_fprintf(stderr, "xyz parser : expected dy: %f, found: %f \n", dxyz[i], dcoord[i]); } if (i%3==2) { DBG_fprintf(stderr, "xyz parser : expected z: %f, found: %f \t", xyz[i], coords[i]); DBG_fprintf(stderr, "xyz parser : expected dz: %f, found: %f \n", dxyz[i], dcoord[i]); j++; DBG_fprintf(stderr, "+---------------------------------------------------------------+\n"); } i++; } if (i!=15) { DBG_fprintf(stderr, "xyz parser : An error occured while reading the test file : node number %d encoutred an error \n", j+1); return FALSE; } else { DBG_fprintf(stderr, "xyz parser : parser ok ! \n"); return TRUE; } } #endif v_sim-3.7.0/src/renderingMethods/atomic_xyz.h0000644000353400050620000000353612215546066016226 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse m�l : BILLARD, non joignable par m�l ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant � visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est r�gi par la licence CeCILL soumise au droit fran�ais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffus�e par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez acc�der � cet en-t�te signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept� les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef ATOMIC_XYZ_H #define ATOMIC_XYZ_H #include void initAtomicXyz(VisuRendering *method); #endif v_sim-3.7.0/src/renderingMethods/atomic_yaml.c0000644000353400050620000002335612215546066016333 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2012) Adresse mèl : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2012) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include #include #include "atomic_yaml.h" #include "renderingAtomic.h" #include #include #include #ifdef HAVE_YAML static gboolean loadYaml(VisuData *data, const gchar* filename, ToolFileFormat *format, int nSet, GCancellable *cancel, GError **error); #endif /** * SECTION:atomic_yaml * @short_description: Method to load YAML position file. * * YAML format is a plain text format to store atomic * positions. This format is defined and used by BigDFT. It has * meta-data available to store forces, total energy, units, boundary * conditions... */ /** * visu_rendering_atomic_yaml_init: (skip) * @method: the #VisuRendering method to be associated to. * * Create the structure that gives access to a load method and * some description of it (file formats associated, name...). Internal * use only */ void visu_rendering_atomic_yaml_init(VisuRendering *method) { #ifdef HAVE_YAML const gchar *typeYAML[] = {"*.yaml", (char*)0}; visu_rendering_addFileFormat(method, 0, tool_file_format_new(_("BigDFT YAML format"), typeYAML), 110, loadYaml); #else g_warning("No YAML support for method '%s'.", visu_rendering_getName(method, FALSE)); #endif } #ifdef HAVE_YAML static gboolean loadYaml(VisuData *data, const gchar* filename, ToolFileFormat *format _U_, int nSet, GCancellable *cancel _U_, GError **error) { PosinpList *lst, *tmp; PosinpAtoms *atoms; guint nSets, i; GArray *types, *nattyp; VisuElement *type; double boxGeometry[6]; float xyz[3], uvw[3], *forces; char *message; VisuBox *box; g_return_val_if_fail(error && *error == (GError*)0, FALSE); g_return_val_if_fail(data && filename, FALSE); message = (char*)0; lst = posinp_yaml_parse(filename, &message); if (!lst) { if (message) free(message); return FALSE; } DBG_fprintf(stderr, "Atomic YAML: loading '%s' as a YAML file.\n", filename); for (nSets = 0, tmp = lst; tmp && nSets < (guint)nSet; tmp = tmp->next); if (tmp && ((tmp->data && tmp->data->nat > 0) || (message && !strstr(message, "")))) atoms = tmp->data; else { if (message) free(message); posinp_yaml_free_list(lst); return FALSE; } if (message) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, "%s", message); free(message); posinp_yaml_free_list(lst); return TRUE; } /* Counting the number of sets. */ nSets = 0; for (tmp = lst; tmp; tmp = tmp->next) nSets += 1; visu_data_setNSubset(data, nSets); /* Set comments. */ for (tmp = lst, i = 0; tmp; tmp = tmp->next, i++) visu_data_setFileCommentary(data, tmp->data->comment, i); /* Set metadata. */ if (!isnan(atoms->energy)) switch (atoms->eunits) { case (POSINP_ENERG_UNITS_HARTREE): g_object_set(G_OBJECT(data), "totalEnergy", atoms->energy * 27.2113834, NULL); break; case (POSINP_ENERG_UNITS_RYDBERG): g_object_set(G_OBJECT(data), "totalEnergy", atoms->energy * 0.5 * 27.2113834, NULL); break; case (POSINP_ENERG_UNITS_EV): default: g_object_set(G_OBJECT(data), "totalEnergy", atoms->energy, NULL); break; } /* Setup the population. */ types = g_array_sized_new(FALSE, FALSE, sizeof(VisuElement*), atoms->ntypes); for (i = 0; i < atoms->ntypes; i++) { type = visu_element_retrieveFromName(atoms->atomnames[i], (gboolean*)0); g_array_append_val(types, type); } nattyp = g_array_sized_new(FALSE, TRUE, sizeof(guint), atoms->ntypes); g_array_set_size(nattyp, atoms->ntypes); for (i = 0; i < atoms->nat; i++) *(&g_array_index(nattyp, guint, atoms->iatype[i])) += 1; visu_node_array_allocate(VISU_NODE_ARRAY(data), types, nattyp); DBG_fprintf(stderr, "Atomic YAML: there are %d types in this file.\n", atoms->ntypes); if (DEBUG) { for (i = 0; i < atoms->ntypes; i++) DBG_fprintf(stderr, " | %d atom(s) for type %d.\n", g_array_index(nattyp, guint, i), i); } g_array_free(nattyp, TRUE); g_array_free(types, TRUE); if (sin(atoms->angdeg[2]) == 0.f) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong (ab) angle, should be" " different from 0[pi].\n\n" " Quoting '%g'.\n"), atoms->angdeg[2]); posinp_yaml_free_list(lst); return TRUE; } /* We remove the infinity. */ switch (atoms->BC) { case (POSINP_BC_FREE): atoms->acell[0] = 1.; atoms->acell[1] = 1.; atoms->acell[2] = 1.; break; case (POSINP_BC_SURFACE_XZ): atoms->acell[1] = 1.; break; default: break; } boxGeometry[0] = atoms->acell[0]; boxGeometry[1] = atoms->acell[1] * cos(G_PI * atoms->angdeg[2] / 180.); boxGeometry[2] = atoms->acell[1] * sin(G_PI * atoms->angdeg[2] / 180.); boxGeometry[3] = atoms->acell[2] * cos(G_PI * atoms->angdeg[1] / 180.); boxGeometry[4] = atoms->acell[2] * (cos(G_PI * atoms->angdeg[0] / 180.) - cos(G_PI * atoms->angdeg[1] / 180.) * cos(G_PI * atoms->angdeg[2] / 180.)) / sin(G_PI * atoms->angdeg[2] / 180.); boxGeometry[5] = sqrt(atoms->acell[2] * atoms->acell[2] - boxGeometry[3] * boxGeometry[3] - boxGeometry[4] * boxGeometry[4]); boxGeometry[5] *= (atoms->angdeg[1] < 0.)?-1.:+1.; /* Always set the given box, in case coordinates are reduced. */ box = (VisuBox*)0; switch (atoms->BC) { case (POSINP_BC_PERIODIC): box = visu_box_new(boxGeometry, VISU_BOX_PERIODIC); break; case (POSINP_BC_FREE): box = visu_box_new(boxGeometry, VISU_BOX_FREE); break; case (POSINP_BC_SURFACE_XZ): box = visu_box_new(boxGeometry, VISU_BOX_SURFACE_ZX); break; default: *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Unsupported boundary conditions.\n")); posinp_yaml_free_list(lst); return TRUE; } visu_boxed_setBox(VISU_BOXED(data), VISU_BOXED(box), FALSE); g_object_unref(box); for (i = 0; i < atoms->nat; i++) { xyz[0] = uvw[0] = (float)atoms->rxyz[3 * i + 0]; xyz[1] = uvw[1] = (float)atoms->rxyz[3 * i + 1]; xyz[2] = uvw[2] = (float)atoms->rxyz[3 * i + 2]; if (atoms->units == 3) visu_box_convertBoxCoordinatestoXYZ(box, xyz, uvw); visu_data_addNodeFromIndex(data, atoms->iatype[i], xyz, FALSE, FALSE); } /* In free boundary conditions, find the bounding box. */ if (atoms->BC != POSINP_BC_PERIODIC) visu_data_setTightBox(data); /* We finish with the box description. */ DBG_fprintf(stderr, "Atomic YAML: apply the box geometry and set the unit.\n"); visu_box_setMargin(box, visu_node_array_getMaxElementSize(VISU_NODE_ARRAY(data)) + visu_data_getAllNodeExtens(data, box), TRUE); switch (atoms->Units) { case (POSINP_CELL_UNITS_ANGSTROEM): visu_box_setUnit(box, TOOL_UNITS_ANGSTROEM); break; case (POSINP_CELL_UNITS_BOHR): visu_box_setUnit(box, TOOL_UNITS_BOHR); break; default: *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Unsupported units.\n")); posinp_yaml_free_list(lst); return TRUE; } /* Store the forces, if any. */ if (atoms->fxyz) { forces = g_malloc(sizeof(float) * 3 * atoms->nat); for (i = 0; i < atoms->nat; i++) { forces[3 * i + 0] = (float)atoms->fxyz[3 * i + 0]; forces[3 * i + 1] = (float)atoms->fxyz[3 * i + 1]; forces[3 * i + 2] = (float)atoms->fxyz[3 * i + 2]; } visu_rendering_atomic_setForces(data, forces); g_free(forces); } posinp_yaml_free_list(lst); return TRUE; } #endif v_sim-3.7.0/src/renderingMethods/atomic_yaml.h0000644000353400050620000000340612215546066016332 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2012) Adresse mèl : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2012) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef ATOMIC_YAML_H #define ATOMIC_YAML_H #include void visu_rendering_atomic_yaml_init(VisuRendering *method); #endif v_sim-3.7.0/src/renderingMethods/renderingAtomic_d3.c0000644000353400050620000004412112215546066017526 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include #include "renderingAtomic_d3.h" #include "renderingAtomic.h" #include #include #include /** * SECTION:renderingAtomic_d3 * @short_description: Method to load d3 position file. * * D3 format is a binary format to store elements and their * position. */ static gboolean read_nattyp_natnom(FILE *flux, GError **error, ToolFortranEndianId endian, gboolean store); static gboolean read_npas_temps(FILE *flux, GError **error, ToolFortranEndianId endian); static int free_read_d3(); static int read_d3_file(VisuData *data, FILE *flux, int set, GError **error); static char title[129]; static guint nat, ntypeD3, npas; static gdouble energy; static GArray *nattyp; static char **natnom; static double *x, *y, *z; static float *xf, *yf, *zf; static GList *lst; static gboolean loadD3(VisuData *data, const gchar* filename, ToolFileFormat *format, int nSet, GCancellable *cancel, GError **error); /******************************************************************************/ /** * initAtomicD3: (skip) * @method: the #VisuRendering method to be associated to. * * Create the structure that gives access to a load method and * some description of it (file formats associated, name...). Internal * use only */ void initAtomicD3(VisuRendering *method) { const gchar *typeD3[] = {"*.d3", "*-posi.d3", "*.d3-posi", (char*)0}; visu_rendering_addFileFormat(method, 0, tool_file_format_new(_("Native binary format"), typeD3), 10, loadD3); } /******************************************************************************/ static gboolean read_nattyp_natnom(FILE *flux, GError **error, ToolFortranEndianId endian, gboolean store) { guint k; gboolean valid; guint ncheck, mcheck, *buf; gchar *name; g_return_val_if_fail((store && nattyp && natnom) || !store, FALSE); DBG_fprintf(stderr, "Atomic D3: read nattyp and nattom (%d).\n", store); valid = tool_fortran_readFlag(&ncheck, flux, error, endian); if (!valid) return valid; buf = (store)?(guint*)nattyp->data:(guint*)0; valid = tool_fortran_readInteger(buf, ntypeD3, flux, error, endian, FALSE, store); if (!valid) return valid; if (store) nattyp = g_array_set_size(nattyp, ntypeD3); for(k = 0; k < ntypeD3; k++) { name = (store)?natnom[k]:(gchar*)0; valid = tool_fortran_readCharacter(name, 8, flux, error, endian, FALSE, store); if (!valid) return valid; if (store) { natnom[k][8] = '\0'; g_strchomp(natnom[k]); } } valid = tool_fortran_readFlag(&mcheck, flux, error, endian); if (!valid) return valid; if (ncheck != mcheck) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("WARNING : wrong fortran syntax, flag size unmatched.\n")); return FALSE; } return TRUE; } static gboolean read_npas_temps(FILE *flux, GError **error, ToolFortranEndianId endian) { guint ncheck, mcheck; gboolean valid; double temps; valid = tool_fortran_readFlag(&ncheck, flux, error, endian); if (!valid) return valid; valid = tool_fortran_readInteger(&npas, 1, flux, error, endian, FALSE, TRUE); if (!valid) return valid; valid = tool_fortran_readDouble(&temps, 1, flux, error, endian, FALSE, TRUE); if (!valid) return valid; valid = tool_fortran_readFlag(&mcheck, flux, error, endian); if (!valid) return valid; if (ncheck != mcheck) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("WARNING : wrong fortran syntax, flag size unmatched.\n")); return FALSE; } return TRUE; } static gboolean read_npas_temps_energy(FILE *flux, GError **error, ToolFortranEndianId endian) { guint ncheck, mcheck; gboolean valid; double temps; valid = tool_fortran_readFlag(&ncheck, flux, error, endian); if (!valid) return valid; valid = tool_fortran_readInteger(&npas, 1, flux, error, endian, FALSE, TRUE); if (!valid) return valid; valid = tool_fortran_readDouble(&temps, 1, flux, error, endian, FALSE, TRUE); if (!valid) return valid; valid = tool_fortran_readDouble(&energy, 1, flux, error, endian, FALSE, TRUE); if (!valid) return valid; valid = tool_fortran_readFlag(&mcheck, flux, error, endian); if (!valid) return valid; if (ncheck != mcheck) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("WARNING : wrong fortran syntax, flag size unmatched.\n")); return FALSE; } return TRUE; } static gboolean read_unit(FILE *flux, GError **error, ToolFortranEndianId endian, ToolUnits *unit) { gboolean valid; gchar units[17]; DBG_fprintf(stderr, "Atomic D3 : read units.\n"); valid = tool_fortran_readCharacter(units, 16, flux, error, endian, TRUE, TRUE); if (!valid) return valid; units[16] = '\0'; g_strchomp(units); *unit = tool_physic_getUnitFromName(units); DBG_fprintf(stderr, " | '%s' (%d)\n", units, *unit); return TRUE; } static gboolean read_periodicity(FILE *flux, GError **error, ToolFortranEndianId endian, VisuBoxBoundaries *bc) { gboolean valid; gchar periodicity[5]; DBG_fprintf(stderr, "Atomic D3 : read periodicity.\n"); valid = tool_fortran_readCharacter(periodicity, 4, flux, error, endian, TRUE, TRUE); if (!valid) return valid; periodicity[4] = '\0'; g_strchomp(periodicity); DBG_fprintf(stderr, " | '%s'\n", periodicity); if (!g_ascii_strcasecmp(periodicity, "Oxyz")) *bc = VISU_BOX_PERIODIC; else if (!g_ascii_strcasecmp(periodicity, "Ozx")) *bc = VISU_BOX_SURFACE_ZX; else if (!g_ascii_strcasecmp(periodicity, "Oxy")) *bc = VISU_BOX_SURFACE_XY; else if (!g_ascii_strcasecmp(periodicity, "Oyz")) *bc = VISU_BOX_SURFACE_YZ; else if (!g_ascii_strcasecmp(periodicity, "Ox")) *bc = VISU_BOX_WIRE_X; else if (!g_ascii_strcasecmp(periodicity, "Oy")) *bc = VISU_BOX_WIRE_Y; else if (!g_ascii_strcasecmp(periodicity, "Oz")) *bc = VISU_BOX_WIRE_Z; else if (!g_ascii_strcasecmp(periodicity, "O")) *bc = VISU_BOX_FREE; else *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("unknwon peridicity flag '%s'"), periodicity); return (*error == (GError*)0); } /******************************************************************************/ static gboolean loadD3(VisuData *data, const gchar* filename, ToolFileFormat *format _U_, int nSet, GCancellable *cancel _U_, GError **error) { int res; FILE *readFrom; g_return_val_if_fail(error && *error == (GError*)0, FALSE); g_return_val_if_fail(data && filename, FALSE); readFrom = fopen(filename, "rb"); if (!readFrom) { *error = g_error_new(G_FILE_ERROR, g_file_error_from_errno(errno), _("Impossible to open this file.")); return FALSE; } res = read_d3_file(data, readFrom, nSet, error); fclose(readFrom); if (res < 0) /* The file is not a D3 file. */ return FALSE; else if (res > 0) /* The file is a D3 file but some errors occured. */ return TRUE; /* Everything is OK. */ *error = (GError*)0; return TRUE; } static int read_d3_file(VisuData *data, FILE *flux, int set, GError **error) { int iSet; guint snat; VisuElement *type; GArray *types; gchar *infoUTF8; gboolean valid, store, readDouble, storeDouble; ToolFortranEndianId endian; guint nn[2], i, j, ncheck; double boxGeometry[6]; float xyz[3]; long offset; GList *tmpLst; VisuBox *box; ToolUnits unit; VisuBoxBoundaries bc; g_return_val_if_fail(error && *error == (GError*)0, FALSE); natnom = (gchar**)0; nattyp = (GArray*)0; x = (double*)0; y = (double*)0; z = (double*)0; xf = (float*)0; yf = (float*)0; zf = (float*)0; iSet = 0; storeDouble = TRUE; unit = TOOL_UNITS_UNDEFINED; bc = VISU_BOX_PERIODIC; /* Check the first element to find the endianness. The first element is an int equal to 128. */ DBG_fprintf(stderr, "Atomic D3 : test for endianness.\n"); valid = tool_fortran_testEndianness(128, flux, error, &endian); if (!valid) return -1; /* We read the set number @set and store the number of sets in nSet. */ lst = (GList*)0; do { store = (iSet == set); /* TITLE */ DBG_fprintf(stderr, "Atomic D3 : read title.\n"); valid = tool_fortran_readCharacter(title, 128, flux, error, endian, TRUE, TRUE); if (!valid) return free_read_d3(); title[128] = '\0'; g_strchomp(title); DBG_fprintf(stderr, " | '%s'\n", title); /* NPAS-TEMPS(-ENERGY) (optional) */ offset = ftell(flux); energy = G_MAXDOUBLE; valid = read_npas_temps(flux, error, endian); if (!valid) { g_error_free(*error); *error = (GError*)0; fseek(flux, offset, SEEK_SET); valid = read_npas_temps_energy(flux, error, endian); } if (!valid) { g_error_free(*error); *error = (GError*)0; fseek(flux, offset, SEEK_SET); readDouble = TRUE; lst = g_list_prepend(lst, g_strdup(title)); } else { readDouble = FALSE; if (store && energy != G_MAXDOUBLE) g_object_set(G_OBJECT(data), "totalEnergy", energy, NULL); lst = g_list_prepend(lst, g_strdup_printf("%04d - %s", npas, title)); } /* NAT-NTYPE */ DBG_fprintf(stderr, "Atomic D3 : read nat and ntype.\n"); valid = tool_fortran_readInteger(nn, 2, flux, error, endian, TRUE, TRUE); if (!valid) return free_read_d3(); nat = nn[0]; ntypeD3 = nn[1]; DBG_fprintf(stderr, " | %d %d\n", nat, ntypeD3); /* NATI-NOM */ if (store) { DBG_fprintf(stderr, " | store nattyp and natom.\n"); nattyp = g_array_sized_new(FALSE, FALSE, sizeof(guint), ntypeD3); natnom = g_malloc(ntypeD3 * sizeof(char *)); for(i=0; imessage); return free_read_d3(); } if (store) { if (readDouble) { x = g_malloc(sizeof(double) * nat); y = g_malloc(sizeof(double) * nat); z = g_malloc(sizeof(double) * nat); } else { xf = g_malloc(sizeof(float) * nat); yf = g_malloc(sizeof(float) * nat); zf = g_malloc(sizeof(float) * nat); } storeDouble = readDouble; } /* X */ if (readDouble) valid = tool_fortran_readDouble(x, nat, flux, error, endian, TRUE, store); else valid = tool_fortran_readReal(xf, nat, flux, error, endian, TRUE, store); if (!valid) { DBG_fprintf(stderr, "! invalid x coordinates '%s'.\n", (*error)->message); return free_read_d3(); } /* Y */ if (readDouble) valid = tool_fortran_readDouble(y, nat, flux, error, endian, TRUE, store); else valid = tool_fortran_readReal(yf, nat, flux, error, endian, TRUE, store); if (!valid) { DBG_fprintf(stderr, "! invalid y coordinates '%s'.\n", (*error)->message); return free_read_d3(); } /* Z */ if (readDouble) valid = tool_fortran_readDouble(z, nat, flux, error, endian, TRUE, store); else valid = tool_fortran_readReal(zf, nat, flux, error, endian, TRUE, store); if (!valid) { DBG_fprintf(stderr, "! invalid z coordinates '%s'.\n", (*error)->message); return free_read_d3(); } iSet += 1; /* Go to the next fortran flag holding 128. */ do { /* There is a strange thing with Fortran file, they seems to finish with '0x0a' character... */ offset = ftell(flux); valid = tool_fortran_readFlag(&ncheck, flux, error, endian); if (!valid) g_error_free(*error); else if (ncheck == 16) { fseek(flux, offset, SEEK_SET); /* Special case of units. */ if (!read_unit(flux, error, endian, &unit)) return free_read_d3(); } else if (ncheck == 4) { fseek(flux, offset, SEEK_SET); /* Special case of periodicity. */ if (!read_periodicity(flux, error, endian, &bc)) return free_read_d3(); } else if (ncheck != 128) fseek(flux, offset + 4 + ncheck + 4, SEEK_SET); else fseek(flux, offset, SEEK_SET); valid = valid && (ncheck == 128); } while (!feof(flux) && !valid); } while (!feof(flux) && valid); lst = g_list_reverse(lst); if(iSet < set) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("input file has no dataset number %d" " (%d have been read).\n"), set + 1, iSet); return free_read_d3(); } DBG_fprintf(stderr, "Atomic d3 : nat = %d | ntypeD3 = %d\n", nat, ntypeD3); for(i = 0; i < ntypeD3; i++) DBG_fprintf(stderr, " | natnom %d = '%s', nb %d\n", i, natnom[i], g_array_index(nattyp, guint, i)); /* Now we have all the element and the number of atoms per element. So we allocate the memory. */ types = g_array_sized_new(FALSE, FALSE, sizeof(VisuElement*), ntypeD3); for(i = 0; i < ntypeD3; i++) { /* adding nomloc to the hashtable */ type = visu_element_retrieveFromName(natnom[i], (gboolean*)0); if (!type) { g_warning("Cannot create a new type for '%s'\n", natnom[i]); return 1; } g_array_insert_val(types, i, type); } DBG_fprintf(stderr, " | begin to transfer data to VisuData.\n"); /* Begin the storage into VisuData. */ visu_data_setNSubset(data, iSet); /* Set the commentaries. */ iSet = 0; tmpLst = lst; while (tmpLst) { infoUTF8 = g_locale_to_utf8((gchar*)tmpLst->data, -1, NULL, NULL, NULL); if (infoUTF8) { visu_data_setFileCommentary(data, infoUTF8, iSet); g_free(infoUTF8); } else g_warning("Can't convert '%s' to UTF8.\n", (gchar*)tmpLst->data); iSet += 1; tmpLst = g_list_next(tmpLst); } visu_node_array_allocate(VISU_NODE_ARRAY(data), types, nattyp); g_array_free(types, TRUE); nat = 0; for (i = 0; i < ntypeD3; i++) { for (j = 0; j < g_array_index(nattyp, guint, i); j++) { xyz[0] = (storeDouble)?(float)x[nat]:xf[nat]; xyz[1] = (storeDouble)?(float)y[nat]:yf[nat]; xyz[2] = (storeDouble)?(float)z[nat]:zf[nat]; visu_data_addNodeFromIndex(data, i, xyz, FALSE, FALSE); nat++; } } /* We finish with the geometry. */ box = visu_box_new(boxGeometry, bc); visu_box_setMargin(box, visu_node_array_getMaxElementSize(VISU_NODE_ARRAY(data)) + visu_data_getAllNodeExtens(data, box), TRUE); visu_box_setUnit(box, unit); visu_boxed_setBox(VISU_BOXED(data), VISU_BOXED(box), FALSE); g_object_unref(box); free_read_d3(); return 0; } static int free_read_d3() { guint i; GList *tmpLst; DBG_fprintf(stderr, "Atomic d3: freeing tmp variables.\n"); if (natnom) { for(i = 0; i < ntypeD3; i++) if (natnom[i]) g_free(natnom[i]); g_free(natnom); } if(nattyp) g_array_free(nattyp, TRUE); if (x) g_free(x); if (y) g_free(y); if (z) g_free(z); if (xf) g_free(xf); if (yf) g_free(yf); if (zf) g_free(zf); if (lst) { tmpLst = lst; while (tmpLst) { g_free(tmpLst->data); tmpLst = g_list_next(tmpLst); } g_list_free(lst); } return 1; } /******************************************************************************/ /******************************************************************************/ v_sim-3.7.0/src/renderingMethods/renderingAtomic_d3.h0000644000353400050620000000357712215546066017545 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef RENDERINGATOMIC_D3_H #define RENDERINGATOMIC_D3_H #include /* Method to read d3 atomic file. */ void initAtomicD3(VisuRendering *method); #endif v_sim-3.7.0/src/renderingMethods/renderingSpin.h0000644000353400050620000002671712215546066016655 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD, Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2005) Adresses ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD and Damien CALISTE and Olivier D'Astier, laboratoire L_Sim, (2001-2005) E-mail addresses : BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef RENDERINGSPIN_H #define RENDERINGSPIN_H #include #include #include #include /** * VisuRenderingSpinDrawingPolicy: * @VISU_RENDERING_SPIN_ALWAYS: Arrows are drawn whatever the modulus value. * @VISU_RENDERING_SPIN_HIDE_NULL: Spin with a null modulus are hidden. * @VISU_RENDERING_SPIN_ATOMIC_NULL: Follow atomic rendering for null modulus. * @VISU_RENDERING_SPIN_N_MODES: a flag to count the number of modes. * * Different policy to render the spin when the modulus is null. This * policy is applied for all #VisuElement. */ typedef enum { VISU_RENDERING_SPIN_ALWAYS, VISU_RENDERING_SPIN_HIDE_NULL, VISU_RENDERING_SPIN_ATOMIC_NULL, VISU_RENDERING_SPIN_N_MODES } VisuRenderingSpinDrawingPolicy; /** * VisuRenderingSpinModulusPolicy: * @VISU_RENDERING_SPIN_CONSTANT: arrows have all the same size, whatever the * modulus value. * @VISU_RENDERING_SPIN_PER_TYPE: arrows are scaled per node type. * @VISU_RENDERING_SPIN_GLOBAL: arrows are scaled globaly. * @VISU_RENDERING_SPIN_N_MODULUS_MODES: a flag to count the number of modes. * * Different policy to render the spin depending on the modulus. */ typedef enum { VISU_RENDERING_SPIN_CONSTANT, VISU_RENDERING_SPIN_PER_TYPE, VISU_RENDERING_SPIN_GLOBAL, VISU_RENDERING_SPIN_N_MODULUS_MODES } VisuRenderingSpinModulusPolicy; /** * VisuRenderingSpinShapeId: * @VISU_RENDERING_SPIN_ARROW_SMOOTH: the shape is smooth and rounded ; * @VISU_RENDERING_SPIN_ARROW_SHARP: the shape is built on squares ; * @VISU_RENDERING_SPIN_ELLIPSOID: the shape is an ellipsoid ; * @VISU_RENDERING_SPIN_TORUS: the shape is a torus (direction of the arrow is * normal to the torus plane). * @VISU_RENDERING_SPIN_N_SHAPES: private. * * An identifier for the different shapes to draw elements. */ typedef enum { VISU_RENDERING_SPIN_ARROW_SMOOTH, VISU_RENDERING_SPIN_ARROW_SHARP, VISU_RENDERING_SPIN_ELLIPSOID, VISU_RENDERING_SPIN_TORUS, /*< private >*/ VISU_RENDERING_SPIN_N_SHAPES } VisuRenderingSpinShapeId; /** * VisuRenderingSpinFileType: * @FILE_KIND_POSITION: define a position file ; * @FILE_KIND_SPIN: define a spin description file. * * These are keys for the storing of spin files in a VisuData object. */ typedef enum { FILE_KIND_POSITION, FILE_KIND_SPIN } VisuRenderingSpinFileType; /** * VISU_RENDERING_SPIN_VALUES_ID: * * This flag should be used when creating a new spin rendering method * as the flag for the spin values as node properties (see * visu_node_array_property_newPointer()). */ #define VISU_RENDERING_SPIN_VALUES_ID "spinRendering_values" /** * VISU_RENDERING_SPIN_MAX_MODULUS_ID: * * This flag should be used when creating a new spin rendering method * as the flag for the max modulus values as a #VisuNode property (see * visu_node_array_property_newPointer()). */ #define VISU_RENDERING_SPIN_MAX_MODULUS_ID "spinRendering_maxModulus" /** * VISU_RENDERING_SPIN_NAME: * * Public name of the spin rendering mode. */ #define VISU_RENDERING_SPIN_NAME "Spin visualisation" /** * VISU_TYPE_RENDERING_SPIN: * * return the type of #VisuRenderingSpin. */ #define VISU_TYPE_RENDERING_SPIN (visu_rendering_spin_get_type ()) /** * VISU_RENDERING_SPIN: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuRenderingSpin type. */ #define VISU_RENDERING_SPIN(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_RENDERING_SPIN, VisuRenderingSpin)) /** * VISU_RENDERING_SPIN_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuRenderingSpinClass. */ #define VISU_RENDERING_SPIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_RENDERING_SPIN, VisuRenderingSpinClass)) /** * VISU_IS_RENDERING_SPIN: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuRenderingSpin object. */ #define VISU_IS_RENDERING_SPIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_RENDERING_SPIN)) /** * VISU_IS_RENDERING_SPIN_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuRenderingSpinClass class. */ #define VISU_IS_RENDERING_SPIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_RENDERING_SPIN)) /** * VISU_RENDERING_SPIN_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. */ #define VISU_RENDERING_SPIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_RENDERING_SPIN, VisuRenderingSpinClass)) /** * visu_rendering_spin_get_type: * * This method returns the type of #VisuRenderingSpin, use * VISU_TYPE_RENDERING_SPIN instead. * * Returns: the type of #VisuRenderingSpin. */ GType visu_rendering_spin_get_type(void); /** * VisuRenderingSpinPrivate: * * An opaque structure. */ typedef struct _VisuRenderingSpinPrivate VisuRenderingSpinPrivate; typedef struct _VisuRenderingSpinClass VisuRenderingSpinClass; /** * VisuRenderingSpin: * * An opaque structure. */ struct _VisuRenderingSpin { VisuRendering method; VisuRenderingSpinPrivate *priv; }; typedef struct _VisuRenderingSpin VisuRenderingSpin; VisuRenderingSpin* visu_rendering_spin_new(); /***********************/ /* Different resources */ /***********************/ const char* visu_rendering_spin_getShapeNameI18n(VisuRenderingSpinShapeId n); VisuRenderingSpinDrawingPolicy visu_rendering_spin_getHidingPolicyFromName(const char *name); const char* visu_rendering_spin_getHidingPolicyName(VisuRenderingSpinDrawingPolicy n); const char* visu_rendering_spin_getHidingPolicyNameI18n(VisuRenderingSpinDrawingPolicy n); /** * VisuRenderingSpinResources: * @VISU_RENDERING_SPIN_HAT_LENGTH: the length of the pointing element ; * @spin_VISU_RENDERING_SPIN_TAIL_LENGTH: the length of the tail ; * @VISU_RENDERING_SPIN_HAT_RADIUS: the raidus of the pointing element ; * @VISU_RENDERING_SPIN_TAIL_RADIUS: the radius of the tail ; * @VISU_RENDERING_SPIN_HAT_COLOR: if TRUE, the pointing part use the color of the element ; * @VISU_RENDERING_SPIN_TAIL_COLOR: if TRUE, the tail uses the color of the element ; * @VISU_RENDERING_SPIN_A_AXIS: the size of the A axis (elipsoid shape) ; * @VISU_RENDERING_SPIN_B_AXIS: the size of the B axis (elipsoid shape) ; * @VISU_RENDERING_SPIN_ELIPSOID_COLOR: if TRUE, the elipsoid uses the color of the element ; * @VISU_RENDERING_SPIN_SHAPE: an id to defined the shape (rounded arrow, elipsoid...) ; * @VISU_RENDERING_SPIN_N_RESOURCES: number of resources per element. * * These are resources defined for each element. They can be accessed with * visu_rendering_spin_getResource() or visu_rendering_spin_getResourceBoolean() and other * methods of the same kind. */ typedef enum { VISU_RENDERING_SPIN_HAT_LENGTH, spin_VISU_RENDERING_SPIN_TAIL_LENGTH, VISU_RENDERING_SPIN_HAT_RADIUS, VISU_RENDERING_SPIN_TAIL_RADIUS, VISU_RENDERING_SPIN_HAT_COLOR, VISU_RENDERING_SPIN_TAIL_COLOR, VISU_RENDERING_SPIN_A_AXIS, VISU_RENDERING_SPIN_B_AXIS, VISU_RENDERING_SPIN_ELIPSOID_COLOR, VISU_RENDERING_SPIN_SHAPE, VISU_RENDERING_SPIN_N_RESOURCES } VisuRenderingSpinResources; void visu_rendering_spin_getResource(VisuElement *ele, VisuRenderingSpinResources property, GValue *val); gboolean visu_rendering_spin_setResource(VisuElement *ele, VisuRenderingSpinResources property, GValue *val); /** * visu_rendering_spin_setResourceBoolean: * @ele: a pointer to a #VisuElement object ; * @property: the id of the property to set ; * @value: its value. * * This method is used to change element resources that are boolean. * * Returns: TRUE if the value was changed. */ gboolean visu_rendering_spin_setResourceBoolean(VisuElement *ele, VisuRenderingSpinResources property, gboolean value); /** * visu_rendering_spin_setResourceUint: * @ele: a pointer to a #VisuElement object ; * @property: the id of the property to set ; * @value: its value. * * This method is used to change element resources that are guint. * * Returns: TRUE if the value was changed. */ gboolean visu_rendering_spin_setResourceUint(VisuElement *ele, VisuRenderingSpinResources property, guint value); /** * visu_rendering_spin_setResourceFloat: * @ele: a pointer to a #VisuElement object ; * @property: the id of the property to set ; * @value: its value. * * This method is used to change element resources that are floating point. * * Returns: TRUE if the value was changed. */ gboolean visu_rendering_spin_setResourceFloat(VisuElement *ele, VisuRenderingSpinResources property, gfloat value); /** * visu_rendering_spin_getResourceBoolean: * @ele: a pointer to a #VisuElement object ; * @property: the id of the property to get. * * This is the specific method to retrieve value of boolean element resources. * * Returns: the boolean value. */ gboolean visu_rendering_spin_getResourceBoolean(VisuElement *ele, VisuRenderingSpinResources property); /** * visu_rendering_spin_getResourceUint: * @ele: a pointer to a #VisuElement object ; * @property: the id of the property to get. * * This is the specific method to retrieve value of guint element resources. * * Returns: the guint value. */ guint visu_rendering_spin_getResourceUint(VisuElement *ele, VisuRenderingSpinResources property); /** * visu_rendering_spin_getResourceFloat: * @ele: a pointer to a #VisuElement object ; * @property: the id of the property to get. * * This is the specific method to retrieve value of floating point element resources. * * Returns: the floating point value. */ gfloat visu_rendering_spin_getResourceFloat(VisuElement *ele, VisuRenderingSpinResources property); #endif v_sim-3.7.0/src/renderingMethods/renderingSpin.c0000644000353400050620000020111712215546066016635 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD, Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2005) Adresses mèl : BILLARD, non joignable par mèl ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD and Damien CALISTE and Olivier D'Astier, laboratoire L_Sim, (2001-2005) E-mail addresses : BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include #include #include "renderingSpin.h" #include "renderingAtomic.h" #include #include #include #include #include #include #include #include #include #include #include #include #include /** * SECTION:renderingSpin * @short_description: A module able to represent atoms by their * position and spin. * * This method draws arrows to represent atoms. Each arrow has a * given orientation which is set acording to parameters. This is one * way to represent the spin of an atom. These arrows direction are * determined by the spin of each atom. It is designed to read two * separate files : one containing the position of the atoms, the * other containing the spin of each atom. Of course these two files * need to have the exact same number of atoms and also need to sort * atoms in the same order. */ #define FLAG_RESOURCES_SPIN "spin_resources" #define DESC_RESOURCES_SPIN "Global or element resource for rendering spin module" /* Parameters for each VisuElement. */ struct spinResources_struct { /* One of this structure is associated to each element. */ /* Params for the arrow shapes. */ /* The radius and the length of the hat. */ float length, height; /* The radius and the length of the tail. */ float u_length, u_height; /* The coloring pattern. */ gboolean use_element_color, use_element_color_hat; /* Params for the elipsoid shapes. */ /* The long and the short axis. */ float aAxis, bAxis; /* The coloring pattern. */ gboolean elipsoidColor; /* The shape used. */ VisuRenderingSpinShapeId shape; /* An id of the list associated with the form. */ int openGLIdentifier; /* The associated id for the atomic shape (when used). */ int openGLIdentifierAtomic; }; static GType spinElementResourcesTypes[VISU_RENDERING_SPIN_N_RESOURCES] = {G_TYPE_FLOAT, G_TYPE_FLOAT, G_TYPE_FLOAT, G_TYPE_FLOAT, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_FLOAT, G_TYPE_FLOAT, G_TYPE_BOOLEAN, G_TYPE_UINT}; /* Default values. */ #define SPIN_ELEMENT_HAT_RADIUS_DEFAULT 0.8 #define SPIN_ELEMENT_HAT_LENGTH_DEFAULT 2.0 #define SPIN_ELEMENT_TAIL_RADIUS_DEFAULT 0.33 #define SPIN_ELEMENT_TAIL_LENGTH_DEFAULT 0.8 #define SPIN_ELEMENT_HAT_COLOR_DEFAULT FALSE #define SPIN_ELEMENT_TAIL_COLOR_DEFAULT FALSE #define SPIN_ELEMENT_AAXIS_DEFAULT 1.5 #define SPIN_ELEMENT_BAXIS_DEFAULT 0.6 #define SPIN_ELEMENT_ELIP_COLOR_DEFAULT FALSE #define SPIN_ELEMENT_SHAPE_DEFAULT VISU_RENDERING_SPIN_ARROW_SMOOTH enum { spin_prop0, spin_globalConeTheta, spin_globalConePhi, spin_globalColorWheel, spin_globalHidingMode, spin_globalAtomic, spin_globalModulus }; struct _VisuRenderingSpinPrivate { float coneOrientation[2]; float colorWheel; VisuRenderingSpinDrawingPolicy spinPolicy; gboolean spinAndAtomicRendering; VisuRenderingSpinModulusPolicy spinModulusUsage; gboolean dispose_has_run; }; /* Internal variables. */ static GValue spinValue = {0, {{0}, {0}}}; static VisuDataNode *dataNode; /* Names as they appear in the gtk combo box when selecting an element shape. */ /* tab[i] element matches the above enum i-th element. */ const char* shapeNameSpin[VISU_RENDERING_SPIN_N_SHAPES + 1] = {"Rounded", "Edged", "Elipsoid", "Torus", (const char*)0}; const char** shapeNameSpin_UTF8; const char* policyNameSpin[VISU_RENDERING_SPIN_N_MODES + 1] = {"always", "never", "atomic", (const char*)0}; const char** policyNameSpin_UTF8; enum { COLOR_CHANGED, LAST_SIGNAL }; static guint signals[LAST_SIGNAL]; /* Local methods. */ static gboolean readSpinResources(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static void exportResourcesRenderingSpin(GString *data, VisuData *dataObj, VisuGlView *view); static void onRenderingChanged(GObject *visu, VisuRendering *method, gpointer data); static void onRenderingUpdated(VisuRendering *method, gpointer data); static struct spinResources_struct* getSpinResources(VisuElement *ele); static void onSpinParametersChanged(VisuData *dataObj, VisuNode *node, gpointer data); static void freeSpin(gpointer obj, gpointer data); static gpointer newOrCopySpin(gconstpointer obj, gpointer data); static float getSize(VisuElement *ele); static int createShape(VisuElement* ele, VisuGlView *view); static void positionShape(VisuData *visuData, VisuNode *node, VisuElement* ele, int eleGlId); static int getShape(VisuElement *element); /* Local loading methods. */ static const char* visu_rendering_spin_shape_number_to_name(VisuRenderingSpinShapeId n); static VisuRenderingSpinShapeId visu_rendering_spin_shape_name_to_number(const char *name); static void spinAsciiInit(VisuRendering *method); static void spinBinaryInit(VisuRendering *method); static gboolean read_spin_file(VisuData *data, const char* fileName, ToolFileFormat *format, int nSet, GCancellable *cancel, GError **error); static gboolean read_binary_file(VisuData *data, const char* fileName, ToolFileFormat *format, int nSet, GCancellable *cancel, GError **error); /* Local callbacks. */ static void visu_rendering_spin_dispose(GObject* obj); static void visu_rendering_spin_finalize(GObject* obj); static void visu_rendering_spin_get_property(GObject* obj, guint property_id, GValue *value, GParamSpec *pspec); static void visu_rendering_spin_set_property(GObject* obj, guint property_id, const GValue *value, GParamSpec *pspec); /** * VisuRenderingSpinClass: * * An opaque structure. */ struct _VisuRenderingSpinClass { VisuRenderingClass parent_class; }; static VisuRenderingSpin *spinMethod = (VisuRenderingSpin*)0; G_DEFINE_TYPE(VisuRenderingSpin, visu_rendering_spin, VISU_TYPE_RENDERING) static void visu_rendering_spin_class_init(VisuRenderingSpinClass *klass) { VisuConfigFileEntry *resourceEntry; DBG_fprintf(stderr, "Visu RenderingSpin: creating the class of the object.\n"); /* Connect freeing methods. */ G_OBJECT_CLASS(klass)->dispose = visu_rendering_spin_dispose; G_OBJECT_CLASS(klass)->finalize = visu_rendering_spin_finalize; G_OBJECT_CLASS(klass)->set_property = visu_rendering_spin_set_property; G_OBJECT_CLASS(klass)->get_property = visu_rendering_spin_get_property; VISU_RENDERING_CLASS(klass)->createElement = createShape; VISU_RENDERING_CLASS(klass)->getElementGlId = getShape; VISU_RENDERING_CLASS(klass)->createNode = positionShape; VISU_RENDERING_CLASS(klass)->getNodeExtend = getSize; /** * VisuRenderingSpin::colorisationChange: * @render: the object emitting the signal. * * This signal is emitted whenever a change occur in the * colourisation scheme of the spins. * * Since: 3.6 */ signals[COLOR_CHANGED] = g_signal_newv ("colorisationChange", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, NULL , NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE /* return_type */, 0, NULL); /** * VisuRenderingSpin::cone-theta: * * The theta angle to orientate the colourisation cone. * * Since: 3.6 */ g_object_class_install_property (G_OBJECT_CLASS(klass), spin_globalConeTheta, g_param_spec_float("cone-theta", _("Theta angle"), _("The theta angle to orientate the colourisation cone."), 0, 180, 0, G_PARAM_WRITABLE | G_PARAM_READABLE)); /** * VisuRenderingSpin::cone-phi: * * The phi angle to orientate the colourisation cone. * * Since: 3.6 */ g_object_class_install_property (G_OBJECT_CLASS(klass), spin_globalConePhi, g_param_spec_float("cone-phi", _("Phi angle"), _("The phi angle to orientate the colourisation cone."), 0, 360, 0, G_PARAM_WRITABLE | G_PARAM_READABLE)); /** * VisuRenderingSpin::cone-omega: * * The omega angle to orientate the colourisation cone. * * Since: 3.6 */ g_object_class_install_property (G_OBJECT_CLASS(klass), spin_globalColorWheel, g_param_spec_float("cone-omega", _("Omega angle"), _("The omega angle to orientate the colourisation cone."), 0, 360, 0, G_PARAM_WRITABLE | G_PARAM_READABLE)); /** * VisuRenderingSpin::hiding-mode: * * The hiding policy for spin with a null modulus. * * Since: 3.6 */ g_object_class_install_property (G_OBJECT_CLASS(klass), spin_globalHidingMode, g_param_spec_uint("hiding-mode", _("Hiding policy for null modulus"), _("The hiding policy for spin with a null modulus."), 0, VISU_RENDERING_SPIN_N_MODES, VISU_RENDERING_SPIN_ALWAYS, G_PARAM_WRITABLE | G_PARAM_READABLE)); /** * VisuRenderingSpin::modulus-scaling: * * The scaling policy based on modulus value. * * Since: 3.6 */ g_object_class_install_property (G_OBJECT_CLASS(klass), spin_globalModulus, g_param_spec_uint("modulus-scaling", _("Scaling of spin depending on modulus value"), _("The scaling policy based on modulus value."), 0, VISU_RENDERING_SPIN_N_MODULUS_MODES, VISU_RENDERING_SPIN_CONSTANT, G_PARAM_WRITABLE | G_PARAM_READABLE)); /** * VisuRenderingSpin::use-atomic: * * If atomic rendering is used in addition to spin rendering. * * Since: 3.6 */ g_object_class_install_property (G_OBJECT_CLASS(klass), spin_globalAtomic, g_param_spec_boolean("use-atomic", _("Use atomic rendering"), _("If atomic rendering is used in addition to spin rendering."), FALSE, G_PARAM_WRITABLE | G_PARAM_READABLE)); /* Dealing with config files. */ resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_RESOURCES_SPIN, DESC_RESOURCES_SPIN, 1, readSpinResources); visu_config_file_entry_setVersion(resourceEntry, 3.1f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_RESOURCE, exportResourcesRenderingSpin); shapeNameSpin_UTF8 = g_malloc(sizeof(gchar*) * VISU_RENDERING_SPIN_N_SHAPES); shapeNameSpin_UTF8[0] = _("Rounded arrow"); shapeNameSpin_UTF8[1] = _("Edged arrow"); shapeNameSpin_UTF8[2] = _("Elipsoid"); shapeNameSpin_UTF8[3] = _("Torus"); /* Register a new NodeData. */ dataNode = VISU_DATA_NODE(visu_data_node_new(VISU_RENDERING_SPIN_VALUES_ID, G_TYPE_FLOAT)); visu_data_node_setLabel(dataNode, _("Spin (\316\270, \317\206, mod.)")); visu_data_node_setCallback(dataNode, onSpinParametersChanged, (gpointer)0); /* We initialise the container GValue for the spin property. */ g_value_init(&spinValue, G_TYPE_POINTER); g_type_class_add_private(klass, sizeof(VisuRenderingSpinPrivate)); } static void visu_rendering_spin_dispose(GObject* obj) { DBG_fprintf(stderr, "Visu RenderingSpin: dispose object %p.\n", (gpointer)obj); if (VISU_RENDERING_SPIN(obj)->priv->dispose_has_run) return; VISU_RENDERING_SPIN(obj)->priv->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS(visu_rendering_spin_parent_class)->dispose(obj); } static void visu_rendering_spin_finalize(GObject* obj) { DBG_fprintf(stderr, "Visu RenderingSpin: finalize object %p.\n", (gpointer)obj); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_rendering_spin_parent_class)->finalize(obj); } static void visu_rendering_spin_get_property(GObject* obj, guint property_id, GValue *value, GParamSpec *pspec) { VisuRenderingSpinPrivate *self = VISU_RENDERING_SPIN(obj)->priv; DBG_fprintf(stderr, "Visu RenderingSpin: get property '%s' -> ", g_param_spec_get_name(pspec)); switch (property_id) { case spin_globalConeTheta: g_value_set_float(value, self->coneOrientation[0]); DBG_fprintf(stderr, "%f.\n", self->coneOrientation[0]); break; case spin_globalConePhi: g_value_set_float(value, self->coneOrientation[1]); DBG_fprintf(stderr, "%f.\n", self->coneOrientation[1]); break; case spin_globalColorWheel: g_value_set_float(value, self->colorWheel); DBG_fprintf(stderr, "%f.\n", self->colorWheel); break; case spin_globalHidingMode: g_value_set_uint(value, self->spinPolicy); DBG_fprintf(stderr, "%d.\n", self->spinPolicy); break; case spin_globalAtomic: g_value_set_boolean(value, self->spinAndAtomicRendering); DBG_fprintf(stderr, "%d.\n", self->spinAndAtomicRendering); break; case spin_globalModulus: g_value_set_uint(value, self->spinModulusUsage); DBG_fprintf(stderr, "%d.\n", self->spinModulusUsage); break; default: /* We don't have any other property... */ G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, property_id, pspec); break; } } static void visu_rendering_spin_set_property(GObject* obj, guint property_id, const GValue *value, GParamSpec *pspec) { VisuRenderingSpinPrivate *self = VISU_RENDERING_SPIN(obj)->priv; DBG_fprintf(stderr, "Visu RenderingSpin: set property '%s' -> ", g_param_spec_get_name(pspec)); switch (property_id) { case spin_globalConeTheta: self->coneOrientation[0] = g_value_get_float(value); g_signal_emit(G_OBJECT(obj), signals[COLOR_CHANGED], 0, NULL); DBG_fprintf(stderr, "%f.\n", self->coneOrientation[0]); break; case spin_globalConePhi: self->coneOrientation[1] = g_value_get_float(value); g_signal_emit(G_OBJECT(obj), signals[COLOR_CHANGED], 0, NULL); DBG_fprintf(stderr, "%f.\n", self->coneOrientation[1]); break; case spin_globalColorWheel: self->colorWheel = g_value_get_float(value); g_signal_emit(G_OBJECT(obj), signals[COLOR_CHANGED], 0, NULL); DBG_fprintf(stderr, "%f.\n", self->colorWheel); break; case spin_globalHidingMode: self->spinPolicy = g_value_get_uint(value); DBG_fprintf(stderr, "%d.\n", self->spinPolicy); break; case spin_globalAtomic: self->spinAndAtomicRendering = g_value_get_boolean(value); DBG_fprintf(stderr, "%d.\n", self->spinAndAtomicRendering); break; case spin_globalModulus: self->spinModulusUsage = g_value_get_uint(value); DBG_fprintf(stderr, "%d.\n", self->spinModulusUsage); break; default: /* We don't have any other property... */ G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, property_id, pspec); break; } } static void visu_rendering_spin_init(VisuRenderingSpin *obj) { DBG_fprintf(stderr, "Visu renderingSpin: initializing a new object (%p).\n", (gpointer)obj); obj->priv = G_TYPE_INSTANCE_GET_PRIVATE(obj, VISU_TYPE_RENDERING_SPIN, VisuRenderingSpinPrivate); obj->priv->spinPolicy = commandLineGet_spinHidingMode(); obj->priv->spinAndAtomicRendering = commandLineGet_spinAndAtomic(); obj->priv->spinModulusUsage = VISU_RENDERING_SPIN_CONSTANT; obj->priv->coneOrientation[0] = 0.; obj->priv->coneOrientation[1] = 0.; obj->priv->colorWheel = 0.; obj->priv->dispose_has_run = FALSE; g_return_if_fail((spinMethod == (VisuRenderingSpin*)0)); spinMethod = obj; } /** * visu_rendering_spin_new: * * Create the structure and initialise its values. * * Since: 3.6 * * Returns: a newly allocate #VisuRenderingSpin object. */ VisuRenderingSpin* visu_rendering_spin_new() { char *descr = _("It draws arrows at given positions to represent an atom " "and its spin."); gchar *iconPath; VisuRenderingSpin* spin; VisuRendering *atomic; DBG_fprintf(stderr,"Initialising the spin rendering method...\n"); /* We check that the atomic rendering has been already defined, to use its own loader and file formats. */ atomic = visu_rendering_getByName(VISU_RENDERING_ATOMIC_NAME); g_return_val_if_fail(atomic, (VisuRenderingSpin*)0); spin = VISU_RENDERING_SPIN(g_object_new(VISU_TYPE_RENDERING_SPIN, "name", VISU_RENDERING_SPIN_NAME, "label", _(VISU_RENDERING_SPIN_NAME), "description", descr, "nFiles", 2, NULL)); visu_rendering_setFileTypeLabel(VISU_RENDERING(spin), FILE_KIND_POSITION, _("Position files")); visu_rendering_setFileTypeLabel(VISU_RENDERING(spin), FILE_KIND_SPIN, _("Spin files")); iconPath = g_build_filename(V_SIM_PIXMAPS_DIR, "stock-spin.png", NULL); visu_rendering_setIcon(VISU_RENDERING(spin), iconPath); g_free(iconPath); spinAsciiInit(VISU_RENDERING(spin)); spinBinaryInit(VISU_RENDERING(spin)); visu_rendering_setFileFormat(VISU_RENDERING(spin), FILE_KIND_POSITION, atomic); /* Connect to the signal method changed to set or unset some variables when spin is current or not. */ g_signal_connect(VISU_OBJECT_INSTANCE, "renderingChanged", G_CALLBACK(onRenderingChanged), (gpointer)spin); g_signal_connect(G_OBJECT(atomic), "fileTypeChanged", G_CALLBACK(onRenderingUpdated), (gpointer)spin); return spin; } static VisuRenderingSpinShapeId visu_rendering_spin_shape_name_to_number(const char *name) { int i=0; g_return_val_if_fail(name, -1); for(i=0; i < VISU_RENDERING_SPIN_N_SHAPES; i++) if(strcmp(name, shapeNameSpin[i]) == 0) return i; return -1; } static const char* visu_rendering_spin_shape_number_to_name(VisuRenderingSpinShapeId n) { g_return_val_if_fail(n < VISU_RENDERING_SPIN_N_SHAPES, (const gchar*)0); return shapeNameSpin[n]; } /** * visu_rendering_spin_getShapeNameI18n: * @n: an id for spin shape. * * This routine returnes the translated name in UTF-8 corresponding to * the given shape id. * * Returns: (type utf8): a string owned by V_Sim. */ const char* visu_rendering_spin_getShapeNameI18n(VisuRenderingSpinShapeId n) { g_return_val_if_fail(n < VISU_RENDERING_SPIN_N_SHAPES, (const gchar*)0); return shapeNameSpin_UTF8[n]; } /** * visu_rendering_spin_getHidingPolicyFromName: * @name: (type filename): a string. * * In the config file, the hiding policy resource is stored with its name (untranslated). * This method is used to retrieve the id from the name. * * Returns: the maximum value if the name is invalid. */ VisuRenderingSpinDrawingPolicy visu_rendering_spin_getHidingPolicyFromName(const char *name) { int i=0; if(name == NULL) return -1; for(i=0; i=VISU_RENDERING_SPIN_N_MODES) return NULL; return policyNameSpin[n]; } /** * visu_rendering_spin_getHidingPolicyNameI18n: * @n: an id for hiding policy. * * Transform ids to translated names. * * Returns: (type utf8): the name associated to the id in UTF-8. */ const char* visu_rendering_spin_getHidingPolicyNameI18n(VisuRenderingSpinDrawingPolicy n) { if(n>=VISU_RENDERING_SPIN_N_MODES) return NULL; return policyNameSpin_UTF8[n]; } /*****************************************************************************/ /* */ /*****************************************************************************/ static void spinAsciiInit(VisuRendering *method) { const gchar *typeSpin[] = {"*.spin", "*.sp", NULL}; visu_rendering_addFileFormat(method, FILE_KIND_SPIN, tool_file_format_new(_("Ascii spin files"), typeSpin), 100, read_spin_file); } static void spinBinaryInit(VisuRendering *method) { const gchar *typeSpin[] = {"*.bspin", "*.bsp", NULL}; visu_rendering_addFileFormat(method, FILE_KIND_SPIN, tool_file_format_new(_("Binary spin files"), typeSpin), 10, read_binary_file); } static void onRenderingChanged(GObject *visu _U_, VisuRendering *method, gpointer data) { if (method == (VisuRendering*)data) visu_element_setUpdateNodesOnMaterialChange(); else visu_element_unsetUpdateNodesOnMaterialChange(); } static void onRenderingUpdated(VisuRendering *atomic, gpointer data) { DBG_fprintf(stderr, "Rendering Spin: update the atomic methods.\n"); visu_rendering_setFileFormat(VISU_RENDERING(data), FILE_KIND_POSITION, atomic); } /*****************************************************************************/ /* */ /*****************************************************************************/ /* The following are the methods responsible of dealing with the reading of files. */ /*****************************************************************************/ /* */ /*****************************************************************************/ static void freeSpin(gpointer obj, gpointer data _U_) { #if GLIB_MINOR_VERSION > 9 g_slice_free1(sizeof(float) * 3, obj); #else g_free(obj); #endif } static gpointer newOrCopySpin(gconstpointer obj, gpointer data _U_) { float *spinData; #if GLIB_MINOR_VERSION > 9 spinData = g_slice_alloc(sizeof(float) * 3); #else spinData = g_malloc(sizeof(float) * 3); #endif if (obj) memcpy(spinData, obj, sizeof(float) * 3); else memset(spinData, 0, sizeof(float) * 3); return (gpointer)spinData; } static void initMaxModulus(VisuElement *ele _U_, GValue *val) { DBG_fprintf(stderr, " | init max modulus of val %p.\n", (gpointer)val); g_value_init(val, G_TYPE_FLOAT); g_value_set_float(val, -G_MAXFLOAT); } /* This is the method associated to the reading of supported spin files. */ static gboolean read_spin_file(VisuData *data, const char* fileName, ToolFileFormat *format _U_, int nSet _U_, GCancellable *cancel _U_, GError **error) { char line[TOOL_MAX_LINE_LENGTH] = "\0"; float vals[3]; float *svgSpinValues; GValue *val; GValueArray *svgMaxSpinModulus; int itrash, iLine; VisuNodeArrayIter iter; FILE *readFrom; gboolean readContinue; VisuNodeProperty *spin; g_return_val_if_fail(error && *error == (GError*)0, FALSE); readFrom = fopen(fileName, "r"); if (!readFrom) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FILE, _("impossible to open this spin file.\n")); return FALSE; } iLine = 1; /* The first line is a commentry. */ if(!fgets(line, TOOL_MAX_LINE_LENGTH, readFrom) || feof(readFrom)) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("spin file should have one line at least.\n")); fclose(readFrom); return FALSE; } iLine += 1; /* Create a storage for max values of spin modulus for each element. */ svgMaxSpinModulus = visu_node_array_setElementProperty(VISU_NODE_ARRAY(data), VISU_RENDERING_SPIN_MAX_MODULUS_ID, initMaxModulus); spin = visu_node_array_property_newPointer(VISU_NODE_ARRAY(data), VISU_RENDERING_SPIN_VALUES_ID, freeSpin, newOrCopySpin, (gpointer)0); readContinue = TRUE; visu_node_array_iterNew(VISU_NODE_ARRAY(data), &iter); for(visu_node_array_iterStartNumber(VISU_NODE_ARRAY(data), &iter); iter.node; visu_node_array_iterNextNodeNumber(VISU_NODE_ARRAY(data), &iter)) { if (readContinue) { if(!fgets(line, TOOL_MAX_LINE_LENGTH, readFrom) || feof(readFrom)) readContinue = FALSE; else { if(sscanf(line, "%d %f %f %f", &itrash, vals + TOOL_MATRIX_SPHERICAL_MODULUS, vals + TOOL_MATRIX_SPHERICAL_THETA, vals + TOOL_MATRIX_SPHERICAL_PHI) != 4) { g_warning("line number #%d is invalid." " Setting node parameters to default ones...", iLine); vals[TOOL_MATRIX_SPHERICAL_THETA] = 0.f; vals[TOOL_MATRIX_SPHERICAL_PHI] = 0.f; vals[TOOL_MATRIX_SPHERICAL_MODULUS] = 0.f; } } iLine += 1; } else { vals[TOOL_MATRIX_SPHERICAL_THETA] = 0.f; vals[TOOL_MATRIX_SPHERICAL_PHI] = 0.f; vals[TOOL_MATRIX_SPHERICAL_MODULUS] = 0.f; } svgSpinValues = newOrCopySpin(vals, (gpointer)0); g_value_set_pointer(&spinValue, svgSpinValues); visu_node_property_setValue(spin, iter.node, &spinValue); val = g_value_array_get_nth(svgMaxSpinModulus, iter.iElement); g_value_set_float(val, MAX(vals[TOOL_MATRIX_SPHERICAL_MODULUS], g_value_get_float(val))); } fclose(readFrom); visu_data_node_setUsed(dataNode, data, 3); return TRUE; } /* This is the method associated to the reading of binary spin files. */ static gboolean read_binary_file(VisuData *data, const char* fileName, ToolFileFormat *format _U_, int nSet _U_, GCancellable *cancel _U_, GError **error) { FILE *readFrom; gboolean valid; ToolFortranEndianId endian; guint nspins; double *spins; int i; float *svgSpinValues, vals[3]; GValueArray *svgMaxSpinModulus; VisuNodeArrayIter iter; VisuNodeProperty *spin; GValue *val; g_return_val_if_fail(error && *error == (GError*)0, FALSE); readFrom = fopen(fileName, "r"); if (!readFrom) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FILE, _("impossible to open this spin file.\n")); return FALSE; } /* Try to find the endianness. */ valid = tool_fortran_testEndianness(4, readFrom, error, &endian); if (!valid) { fclose(readFrom); return FALSE; } /* Try to the number of spins. */ valid = tool_fortran_readInteger(&nspins, 1, readFrom, error, endian, TRUE, TRUE); if (!valid) { fclose(readFrom); return FALSE; } /* From now on, we consider to a have valid spin file. */ visu_node_array_iterNew(VISU_NODE_ARRAY(data), &iter); if (nspins != iter.nAllStoredNodes) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("number of spin differs from number of nodes.\n")); fclose(readFrom); return TRUE; } spins = g_malloc(sizeof(double) * 3 * nspins); /* Read module. */ valid = tool_fortran_readDouble(spins, nspins, readFrom, error, endian, TRUE, TRUE); if (!valid) { g_free(spins); fclose(readFrom); return TRUE; } /* Read theta. */ valid = tool_fortran_readDouble(spins + nspins, nspins, readFrom, error, endian, TRUE, TRUE); if (!valid) { g_free(spins); fclose(readFrom); return TRUE; } /* Read phi. */ valid = tool_fortran_readDouble(spins + 2 * nspins, nspins, readFrom, error, endian, TRUE, TRUE); if (!valid) { g_free(spins); fclose(readFrom); return TRUE; } /* Close the file. */ fclose(readFrom); /* Create a storage for max values of spin modulus for each element. */ svgMaxSpinModulus = visu_node_array_setElementProperty(VISU_NODE_ARRAY(data), VISU_RENDERING_SPIN_MAX_MODULUS_ID, initMaxModulus); spin = visu_node_array_property_newPointer(VISU_NODE_ARRAY(data), VISU_RENDERING_SPIN_VALUES_ID, freeSpin, newOrCopySpin, (gpointer)0); for(visu_node_array_iterStart(VISU_NODE_ARRAY(data), &iter), i = 0; iter.node; visu_node_array_iterNext(VISU_NODE_ARRAY(data), &iter), i++) { vals[TOOL_MATRIX_SPHERICAL_MODULUS] = (float)spins[i]; vals[TOOL_MATRIX_SPHERICAL_THETA] = (float)spins[nspins + i]; vals[TOOL_MATRIX_SPHERICAL_PHI] = (float)spins[2 * nspins + i]; svgSpinValues = newOrCopySpin(vals, (gpointer)0); g_value_set_pointer(&spinValue, svgSpinValues); visu_node_property_setValue(spin, iter.node, &spinValue); val = g_value_array_get_nth(svgMaxSpinModulus, iter.iElement); g_value_set_float(val, MAX((float)spins[i], g_value_get_float(val))); } g_free(spins); visu_data_node_setUsed(dataNode, data, 3); return TRUE; } /********************************/ /* Access to element resources. */ /********************************/ static float getSize(VisuElement *ele) { struct spinResources_struct *str; g_return_val_if_fail(ele, 1.f); str = getSpinResources(ele); if (str->shape == VISU_RENDERING_SPIN_ARROW_SMOOTH || str->shape == VISU_RENDERING_SPIN_ARROW_SHARP) return str->height + str->u_height; else return MAX(str->aAxis, str->bAxis); } static struct spinResources_struct* getSpinResources(VisuElement *ele) { struct spinResources_struct *str; g_return_val_if_fail(ele, (struct spinResources_struct*)0); str = (struct spinResources_struct *)g_object_get_data(G_OBJECT(ele), "spinElementResources"); if(!str) { str = g_malloc(sizeof(struct spinResources_struct)); str->shape = SPIN_ELEMENT_SHAPE_DEFAULT; str->length = SPIN_ELEMENT_HAT_RADIUS_DEFAULT; str->u_length = SPIN_ELEMENT_TAIL_RADIUS_DEFAULT; str->height = SPIN_ELEMENT_HAT_LENGTH_DEFAULT; str->u_height = SPIN_ELEMENT_TAIL_LENGTH_DEFAULT; str->use_element_color = SPIN_ELEMENT_TAIL_COLOR_DEFAULT; str->use_element_color_hat = SPIN_ELEMENT_HAT_COLOR_DEFAULT; str->aAxis = SPIN_ELEMENT_AAXIS_DEFAULT; str->bAxis = SPIN_ELEMENT_BAXIS_DEFAULT; str->elipsoidColor = SPIN_ELEMENT_ELIP_COLOR_DEFAULT; str->openGLIdentifier = visu_gl_objectlist_new(1); str->openGLIdentifierAtomic = -1; g_object_set_data(G_OBJECT(ele), "spinElementResources", (gpointer)str); } return str; } /** * visu_rendering_spin_getResource: * @ele: a pointer to a #VisuElement object ; * @property: the id of the resource (see * #VisuRenderingSpinResources); * @val: (out caller-allocates): a location to store the value. * * This is a generic method to access resources per element. Use * visu_rendering_spin_setResourceBoolean() is favored if the type of * the value is known (boolean in this exemple). * * Since: 3.7 */ void visu_rendering_spin_getResource(VisuElement *ele, VisuRenderingSpinResources property, GValue *val) { struct spinResources_struct *str; g_return_if_fail(property < VISU_RENDERING_SPIN_N_RESOURCES); g_return_if_fail(val); str = getSpinResources(ele); g_return_if_fail(str); memset(val, 0, sizeof(GValue)); g_value_init(val, spinElementResourcesTypes[property]); switch (property) { case VISU_RENDERING_SPIN_HAT_LENGTH: g_value_set_float(val, str->length); return; case spin_VISU_RENDERING_SPIN_TAIL_LENGTH: g_value_set_float(val, str->u_length); return; case VISU_RENDERING_SPIN_HAT_RADIUS: g_value_set_float(val, str->height); return; case VISU_RENDERING_SPIN_TAIL_RADIUS: g_value_set_float(val, str->u_height); return; case VISU_RENDERING_SPIN_HAT_COLOR: g_value_set_boolean(val, str->use_element_color_hat); return; case VISU_RENDERING_SPIN_TAIL_COLOR: g_value_set_boolean(val, str->use_element_color); return; case VISU_RENDERING_SPIN_A_AXIS: g_value_set_float(val, str->aAxis); return; case VISU_RENDERING_SPIN_B_AXIS: g_value_set_float(val, str->bAxis); return; case VISU_RENDERING_SPIN_ELIPSOID_COLOR: g_value_set_boolean(val, str->elipsoidColor); return; case VISU_RENDERING_SPIN_SHAPE: g_value_set_uint(val, str->shape); return; default: g_error("Wrong implementation, property value should be handled by the switch."); } return; } /** * visu_rendering_spin_setResource: * @ele: a #VisuElement object. * @property: an id for element property. * @val: the value. * * The spin rendering method has properties stored for each * element. Use this method to change the value of @property for @ele. * * Since: 3.7 * * Returns: TRUE if value is indeed changed. **/ gboolean visu_rendering_spin_setResource(VisuElement *ele, VisuRenderingSpinResources property, GValue *val) { struct spinResources_struct *str; gboolean ret; g_return_val_if_fail(property < VISU_RENDERING_SPIN_N_RESOURCES, FALSE); g_return_val_if_fail(val && (G_VALUE_TYPE(val) == spinElementResourcesTypes[property]), FALSE); str = getSpinResources(ele); ret = FALSE; switch (property) { case VISU_RENDERING_SPIN_HAT_LENGTH: ret = (str->length != g_value_get_float(val)); if (ret) { str->length = g_value_get_float(val); if (spinMethod) g_signal_emit_by_name(G_OBJECT(spinMethod), "elementSizeChanged", str->length + str->u_length, NULL); } return ret; case spin_VISU_RENDERING_SPIN_TAIL_LENGTH: ret = (str->u_length != g_value_get_float(val)); if (ret) { str->u_length = g_value_get_float(val); if (spinMethod) g_signal_emit_by_name(G_OBJECT(spinMethod), "elementSizeChanged", str->length + str->u_length, NULL); } return ret; case VISU_RENDERING_SPIN_HAT_RADIUS: ret = (str->height != g_value_get_float(val)); if (ret) str->height = g_value_get_float(val); return ret; case VISU_RENDERING_SPIN_TAIL_RADIUS: ret = (str->u_height != g_value_get_float(val)); if (ret) str->u_height = g_value_get_float(val); return ret; case VISU_RENDERING_SPIN_HAT_COLOR: ret = (str->use_element_color_hat != g_value_get_boolean(val)); if (ret) str->use_element_color_hat = g_value_get_boolean(val); return ret; case VISU_RENDERING_SPIN_TAIL_COLOR: ret = (str->use_element_color != g_value_get_boolean(val)); if (ret) str->use_element_color = g_value_get_boolean(val); return ret; case VISU_RENDERING_SPIN_A_AXIS: ret = (str->aAxis != g_value_get_float(val)); if (ret) { str->aAxis = g_value_get_float(val); if (spinMethod) g_signal_emit_by_name(G_OBJECT(spinMethod), "elementSizeChanged", MAX(str->aAxis, str->bAxis), NULL); } return ret; case VISU_RENDERING_SPIN_B_AXIS: ret = (str->bAxis != g_value_get_float(val)); if (ret) { str->bAxis = g_value_get_float(val); if (spinMethod) g_signal_emit_by_name(G_OBJECT(spinMethod), "elementSizeChanged", MAX(str->aAxis, str->bAxis), NULL); } return ret; case VISU_RENDERING_SPIN_ELIPSOID_COLOR: ret = (str->elipsoidColor != g_value_get_boolean(val)); if (ret) str->elipsoidColor = g_value_get_boolean(val); return ret; case VISU_RENDERING_SPIN_SHAPE: ret = (str->shape != g_value_get_uint(val)); if (ret) str->shape = g_value_get_uint(val); return ret; default: g_error("Wrong implementation, property value should be handled by the switch."); } return FALSE; } gboolean visu_rendering_spin_setResourceBoolean(VisuElement *ele, VisuRenderingSpinResources property, gboolean value) { GValue data; memset(&data, 0, sizeof(GValue)); g_value_init(&data, G_TYPE_BOOLEAN); g_value_set_boolean(&data, value); return visu_rendering_spin_setResource(ele, property, &data); } gboolean visu_rendering_spin_setResourceUint(VisuElement *ele, VisuRenderingSpinResources property, guint value) { GValue data; memset(&data, 0, sizeof(GValue)); g_value_init(&data, G_TYPE_UINT); g_value_set_uint(&data, value); return visu_rendering_spin_setResource(ele, property, &data); } gboolean visu_rendering_spin_setResourceFloat(VisuElement *ele, VisuRenderingSpinResources property, gfloat value) { GValue data; memset(&data, 0, sizeof(GValue)); g_value_init(&data, G_TYPE_FLOAT); g_value_set_float(&data, value); return visu_rendering_spin_setResource(ele, property, &data); } gboolean visu_rendering_spin_getResourceBoolean(VisuElement *ele, VisuRenderingSpinResources property) { GValue data; visu_rendering_spin_getResource(ele, property, &data); return g_value_get_boolean(&data); } guint visu_rendering_spin_getResourceUint(VisuElement *ele, VisuRenderingSpinResources property) { GValue data; visu_rendering_spin_getResource(ele, property, &data); return g_value_get_uint(&data); } gfloat visu_rendering_spin_getResourceFloat(VisuElement *ele, VisuRenderingSpinResources property) { GValue data; visu_rendering_spin_getResource(ele, property, &data); return g_value_get_float(&data); } /*****************************************************************************/ /* */ /*****************************************************************************/ /* Ok now we introduce the functions used to load/save resources of our module. */ /*****************************************************************************/ /* */ /*****************************************************************************/ #define FLAG_ELEMENT_ARROW "spin_element_arrow_params" static gboolean readElementArrow(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { float size[4]; gboolean color[2]; gboolean res; VisuElement *ele; struct spinResources_struct *str; gchar **tokens; int id; g_return_val_if_fail(error && (*error == (GError*)0), FALSE); g_return_val_if_fail(nbLines == 1, FALSE); tokens = g_strsplit_set(lines[0], " \n", TOOL_MAX_LINE_LENGTH); id = 0; /* Read the element. */ res = tool_config_file_readElementFromTokens(tokens, &id, &ele, 1, position, error); if (!res) { g_strfreev(tokens); return FALSE; } /* Read the size params : 4 floats. */ res = tool_config_file_readFloatFromTokens(tokens, &id, size, 4, position, error); if (!res) { g_strfreev(tokens); return FALSE; } /* Read the color params : 2 booleans. */ res = tool_config_file_readBooleanFromTokens(tokens, &id, color, 2, position, error); if (!res) { g_strfreev(tokens); return FALSE; } g_strfreev(tokens); /* All is OK, we store the values. */ str = getSpinResources(ele); str->height = size[0]; str->u_height = size[1]; str->length = size[2]; str->u_length = size[3]; str->use_element_color = color[0]; str->use_element_color_hat = color[1]; return TRUE; } #define FLAG_ELEMENT_ELIPSOID "spin_element_elipsoid_params" static gboolean readElementElipsoid(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { float size[2]; gboolean color[1]; gboolean res; VisuElement *ele; struct spinResources_struct *str; gchar **tokens; int id; g_return_val_if_fail(error && (*error == (GError*)0), FALSE); g_return_val_if_fail(nbLines == 1, FALSE); tokens = g_strsplit_set(lines[0], " \n", TOOL_MAX_LINE_LENGTH); id = 0; /* Read the element. */ res = tool_config_file_readElementFromTokens(tokens, &id, &ele, 1, position, error); if (!res) { g_strfreev(tokens); return FALSE; } /* Read the size params : 2 floats. */ res = tool_config_file_readFloatFromTokens(tokens, &id, size, 2, position, error); if (!res) { g_strfreev(tokens); return FALSE; } /* Read the color params : 1 boolean. */ res = tool_config_file_readBooleanFromTokens(tokens, &id, color, 1, position, error); if (!res) { g_strfreev(tokens); return FALSE; } g_strfreev(tokens); /* All is OK, we store the values. */ str = getSpinResources(ele); str->aAxis = size[0]; str->bAxis = size[1]; str->elipsoidColor = color[0]; return TRUE; } #define FLAG_ELEMENT_SHAPE "spin_element_shape" static gboolean readElementShape(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { gchar **shapes; int shapeId; gboolean res; VisuElement *ele; struct spinResources_struct *str; g_return_val_if_fail(error && (*error == (GError*)0), FALSE); g_return_val_if_fail(nbLines == 1, FALSE); /* Read a string.*/ res = tool_config_file_readStringWithElement(lines[0], position, &shapes, 1, &ele, error); if (*error) return FALSE; if (res) { /* All is OK, we store the values. */ shapeId = visu_rendering_spin_shape_name_to_number(shapes[0]); if (shapeId == -1) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_READ, _("Parse error at line %d, the shape '%s' is unknown.\n"), position, shapes[0]); g_strfreev(shapes); return FALSE; } g_strfreev(shapes); str = getSpinResources(ele); str->shape = shapeId; } return res; } #define FLAG_SPIN_CONE_ANGLE "spin_global_color_cone" static gboolean readSpinColorCone(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { float angles[2]; gboolean res; g_return_val_if_fail(error && (*error == (GError*)0), FALSE); g_return_val_if_fail(nbLines == 1, FALSE); /* Read one floating point values.*/ res = tool_config_file_readFloat(lines[0], position, angles, 2, error); if (*error) return FALSE; if (res) { /* All is OK, we store the values. */ spinMethod->priv->coneOrientation[0] = angles[0]; spinMethod->priv->coneOrientation[1] = angles[1]; } return res; } #define FLAG_SPIN_WHEEL_ANGLE "spin_global_color_wheel" static gboolean readSpinColorWheel(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { float angle; gboolean res; g_return_val_if_fail(error && (*error == (GError*)0), FALSE); g_return_val_if_fail(nbLines == 1, FALSE); /* Read one floating point values.*/ res = tool_config_file_readFloat(lines[0], position, &angle, 1, error); if (*error) return FALSE; if (res) /* All is OK, we store the values. */ spinMethod->priv->colorWheel = angle; return res; } #define FLAG_SPIN_HIDING_MODE "spin_global_hiding_mode" static gboolean readSpinHidingMode(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { gchar **mode; VisuRenderingSpinDrawingPolicy modeId; gboolean res; g_return_val_if_fail(error && (*error == (GError*)0), FALSE); g_return_val_if_fail(nbLines == 1, FALSE); /* Read a string.*/ res = tool_config_file_readString(lines[0], position, &mode, 1, FALSE, error); if (*error) return FALSE; if (res) { /* All is OK, we store the values. */ modeId = visu_rendering_spin_getHidingPolicyFromName(g_strstrip(mode[0])); if (modeId == VISU_RENDERING_SPIN_N_MODES) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_READ, _("Parse error at line %d," " the hiding mode '%s' is unknown.\n"), position, mode[0]); g_strfreev(mode); return FALSE; } g_strfreev(mode); spinMethod->priv->spinPolicy = modeId; } return res; } #define FLAG_SPIN_AND_ATOMIC "spin_global_atomic" static gboolean readSpinAndAtomic(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { gboolean use; gboolean res; g_return_val_if_fail(error && (*error == (GError*)0), FALSE); g_return_val_if_fail(nbLines == 1, FALSE); /* Read one floating point values.*/ res = tool_config_file_readBoolean(lines[0], position, &use, 1, error); if (*error) return FALSE; if (res) /* All is OK, we store the values. */ spinMethod->priv->spinAndAtomicRendering = use; return res; } #define FLAG_TOOL_MATRIX_SPHERICAL_MODULUS "spin_global_modulus" static gboolean readSpinModulus(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { int modeId; gboolean res; g_return_val_if_fail(error && (*error == (GError*)0), FALSE); g_return_val_if_fail(nbLines == 1, FALSE); /* Read a string.*/ res = tool_config_file_readInteger(lines[0], position, &modeId, 1, error); if (*error) return FALSE; if (res) { if (modeId < 0 || modeId >= VISU_RENDERING_SPIN_N_MODULUS_MODES) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_READ, _("Parse error at line %d," " the modulus mode '%d' is unknown.\n"), position, modeId); return FALSE; } spinMethod->priv->spinModulusUsage = (VisuRenderingSpinModulusPolicy)modeId; } return res; } static gboolean readSpinResources(VisuConfigFileEntry *entry, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error) { gchar **tokens; int i, token; gboolean ok; VisuElement* ele; char shape[TOOL_MAX_LINE_LENGTH]; float length, u_length, height, u_height; int use_color_element, use_element_color_hat; int shape_number; struct spinResources_struct *str; #define NB_SPIN_READ_METHODS 8 VisuConfigFileReadFunc readFuncs[NB_SPIN_READ_METHODS] = {readElementArrow, readElementElipsoid, readElementShape, readSpinColorCone, readSpinColorWheel, readSpinHidingMode, readSpinAndAtomic, readSpinModulus}; gchar *readFlags[NB_SPIN_READ_METHODS] = {FLAG_ELEMENT_ARROW, FLAG_ELEMENT_ELIPSOID, FLAG_ELEMENT_SHAPE, FLAG_SPIN_CONE_ANGLE, FLAG_SPIN_WHEEL_ANGLE, FLAG_SPIN_HIDING_MODE, FLAG_SPIN_AND_ATOMIC, FLAG_TOOL_MATRIX_SPHERICAL_MODULUS}; g_return_val_if_fail(nbLines == 1, FALSE); /* Read the first keyword. */ tokens = g_strsplit_set(g_strchug(lines[0]), " \n", 2); /* Try to find an element/global resource flag. */ for (i = 0; i < NB_SPIN_READ_METHODS; i++) { if (!strcmp(g_strstrip(tokens[0]), readFlags[i])) { ok = readFuncs[i](entry, tokens + 1, 1, position, dataObj, view, error); g_strfreev(tokens); return ok; } } if (!strcmp(g_strstrip(tokens[0]), "cone_phi_angle") || !strcmp(g_strstrip(tokens[0]), "cone_theta_angle") || !strcmp(g_strstrip(tokens[0]), "color_wheel_angle")) { g_warning("Deprecated flag at line %d, value ignored.", position); return TRUE; } /* Finaly fallback the old format "ele + values". */ token = 0; ok = tool_config_file_readElementFromTokens(tokens, &token, &ele, 1, nbLines, error); if (!ok) { g_strfreev(tokens); return FALSE; } /* Retrieving element's resources */ if(sscanf(tokens[1], "%s %f %f %f %f %d %d", shape, &height, &u_height, &length, &u_length, &use_color_element, &use_element_color_hat) != 7 || length <= 0. || u_length <= 0. || height <= 0. || u_height <= 0.) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_MISSING, _("Parse error at line %d: a shape with 4 floating points " "and 2 booleans must appear after the %s markup.\n"), position, FLAG_RESOURCES_SPIN); g_strfreev(tokens); return FALSE; } g_strfreev(tokens); if((shape_number = visu_rendering_spin_shape_name_to_number(shape)) == -1) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d: the shape '%s' is unknown.\n"), position, shape); return FALSE; } str = getSpinResources(ele); str->height = height; str->u_height = u_height; str->length = length; str->u_length = u_length; str->use_element_color = use_color_element; str->use_element_color_hat = use_element_color_hat; str->shape = shape_number; DBG_fprintf(stderr, "resources set successfully for element '%s'\n", ele->name); return TRUE; } static void exportResourcesRenderingSpin(GString *data, VisuData* dataObj, VisuGlView *view _U_) { GList *pos, *eleList; struct spinResources_struct *str; VisuElement *ele; VisuNodeArrayIter iter; /* If dataObj is given and the rendering method is not spin, we return. */ if (dataObj && (visu_object_getRendering(VISU_OBJECT_INSTANCE) == visu_rendering_getByName(VISU_RENDERING_SPIN_NAME))) return; DBG_fprintf(stderr, "Rendering Spin: exporting element resources...\n"); visu_config_file_exportComment(data, DESC_RESOURCES_SPIN); visu_config_file_exportEntry(data, FLAG_RESOURCES_SPIN, FLAG_SPIN_CONE_ANGLE, "%f %f", spinMethod->priv->coneOrientation[0], spinMethod->priv->coneOrientation[1]); visu_config_file_exportEntry(data, FLAG_RESOURCES_SPIN, FLAG_SPIN_WHEEL_ANGLE, "%f", spinMethod->priv->colorWheel); visu_config_file_exportEntry(data, FLAG_RESOURCES_SPIN, FLAG_SPIN_HIDING_MODE, "%s", policyNameSpin[spinMethod->priv->spinPolicy]); visu_config_file_exportEntry(data, FLAG_RESOURCES_SPIN, FLAG_SPIN_AND_ATOMIC, "%d", spinMethod->priv->spinAndAtomicRendering); visu_config_file_exportEntry(data, FLAG_RESOURCES_SPIN, FLAG_TOOL_MATRIX_SPHERICAL_MODULUS, "%d", spinMethod->priv->spinModulusUsage); /* We create a list of elements, or get the whole list. */ if (dataObj) { eleList = (GList*)0; visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter); for (visu_node_array_iterStart(VISU_NODE_ARRAY(dataObj), &iter); iter.element; visu_node_array_iterNextElement(VISU_NODE_ARRAY(dataObj), &iter)) eleList = g_list_prepend(eleList, (gpointer)iter.element); } else eleList = g_list_copy((GList*)visu_element_getAllElements()); for (pos = eleList; pos; pos = g_list_next(pos)) { ele = (VisuElement*)pos->data; str = getSpinResources(ele); if (str->shape != SPIN_ELEMENT_SHAPE_DEFAULT) visu_config_file_exportEntry(data, FLAG_RESOURCES_SPIN, FLAG_ELEMENT_SHAPE, "%s %s", ele->name, visu_rendering_spin_shape_number_to_name(str->shape)); if (ABS(str->height - SPIN_ELEMENT_HAT_LENGTH_DEFAULT) > 1e-6 || ABS(str->u_height - SPIN_ELEMENT_TAIL_LENGTH_DEFAULT) > 1e-6 || ABS(str->length - SPIN_ELEMENT_HAT_RADIUS_DEFAULT) > 1e-6 || ABS(str->u_length - SPIN_ELEMENT_TAIL_RADIUS_DEFAULT) > 1e-6 || str->use_element_color != SPIN_ELEMENT_TAIL_COLOR_DEFAULT || str->use_element_color_hat != SPIN_ELEMENT_HAT_COLOR_DEFAULT) visu_config_file_exportEntry(data, FLAG_RESOURCES_SPIN, FLAG_ELEMENT_ARROW, "%s %f %f %f %f %d %d", ele->name, str->height, str->u_height, str->length, str->u_length, str->use_element_color, str->use_element_color_hat); if (ABS(str->aAxis - SPIN_ELEMENT_AAXIS_DEFAULT) > 1e-6 || ABS(str->bAxis - SPIN_ELEMENT_BAXIS_DEFAULT) > 1e-6 || str->elipsoidColor != SPIN_ELEMENT_ELIP_COLOR_DEFAULT) visu_config_file_exportEntry(data, FLAG_RESOURCES_SPIN, FLAG_ELEMENT_ELIPSOID, "%s %f %f %d", ele->name, str->aAxis, str->bAxis, str->elipsoidColor); } visu_config_file_exportComment(data, ""); g_list_free(eleList); DBG_fprintf(stderr, "Rendering Spin: element resources succesfully exported\n"); } static void onSpinParametersChanged(VisuData *dataObj, VisuNode *node, gpointer data _U_) { g_return_if_fail(dataObj && node); DBG_fprintf(stderr, "Rendering Spin : callback when a spin parameter has been changed.\n"); g_signal_emit_by_name(G_OBJECT(dataObj), "RenderingChanged", visu_node_array_getElement(VISU_NODE_ARRAY(dataObj), node), NULL); } /***************/ /* OpenGL part */ /***************/ static int getShape(VisuElement *element) { struct spinResources_struct *str; str = getSpinResources(element); g_return_val_if_fail(str, 0); return str->openGLIdentifier; } static int createShape(VisuElement* ele, VisuGlView *view) { int nlatl=0, nlatul=0, nlatoh=0; float hatLength, hatRadius, tailLength, tailRadius; struct spinResources_struct *str; GLUquadricObj *obj; g_return_val_if_fail(ele, -1); str = getSpinResources(ele); hatRadius = str->length; tailRadius = str->u_length; hatLength = str->height; tailLength = str->u_height; nlatul = visu_gl_view_getDetailLevel(view, tailRadius) ; nlatl = visu_gl_view_getDetailLevel(view, hatRadius); nlatoh = visu_gl_view_getDetailLevel(view, hatLength); DBG_fprintf(stderr, "Rendering Spin : creating arrow for %s, nlatl = %d," " nlatul = %d, nlatoh = %d\n", ele->name, nlatl, nlatul, nlatoh); /* We always build atomic shapes in case we need them. */ str->openGLIdentifierAtomic = visu_rendering_createElement(visu_rendering_getByName(VISU_RENDERING_ATOMIC_NAME), ele, view); obj = gluNewQuadric(); glNewList(str->openGLIdentifier, GL_COMPILE); switch (str->shape) { case VISU_RENDERING_SPIN_ARROW_SMOOTH: visu_gl_drawSmoothArrow(obj, visu_element_getMaterialId(ele), VISU_GL_ARROW_CENTERED, tailLength, tailRadius, nlatul, str->use_element_color, hatLength, hatRadius, nlatl, str->use_element_color_hat); break; case VISU_RENDERING_SPIN_ARROW_SHARP: visu_gl_drawEdgeArrow(visu_element_getMaterialId(ele), VISU_GL_ARROW_CENTERED, tailLength, tailRadius, str->use_element_color, hatLength, hatRadius, str->use_element_color_hat); break; case VISU_RENDERING_SPIN_ELLIPSOID: nlatl = visu_gl_view_getDetailLevel(view, str->bAxis); visu_gl_drawEllipsoid(obj, visu_element_getMaterialId(ele), str->aAxis, str->bAxis, nlatl, str->elipsoidColor); break; case VISU_RENDERING_SPIN_TORUS: nlatul = visu_gl_view_getDetailLevel(view, str->aAxis); nlatl = visu_gl_view_getDetailLevel(view, str->bAxis); visu_gl_drawTorus(obj, visu_element_getMaterialId(ele), str->aAxis - str->bAxis, str->aAxis / str->bAxis, nlatul, nlatl, str->elipsoidColor); break; default: g_warning("Unknown shape."); break; } glEndList(); gluDeleteQuadric(obj); return str->openGLIdentifier; } /* This is a method called before the drawing of each node. It's needed to set the right positions of each atom but you can apply other treatments if you need. Here we also rotate our atom according to the spin theta and phi parameters. */ #ifndef DEG2RAD #define DEG2RAD(x) (0.01745329251994329509 * x) /* pi / 180 * x */ #endif static void positionShape(VisuData *visuData, VisuNode *node, VisuElement* ele, int eleGlId) { /* This is the part responsible for the colorisation of the atoms according to their spin. */ float mm[4]; float hsl[3]; float rgba[4]; float xyz[3]; float *spinValues, scale; float theta_prime; float phi_prime; float spherical[3]; float matrix_rot_theta[3][3]; float matrix_rot_phi[3][3]; float cartesian[3]; float cartesian_prime[3]; float cartesian_second[3]; float cosCone, sinCone; float ratio, globalMax; GValueArray *maxModulus; guint iele; struct spinResources_struct *str; /* Test the modulus. */ visu_node_array_getPropertyValue(VISU_NODE_ARRAY(visuData), node, VISU_RENDERING_SPIN_VALUES_ID, &spinValue); spinValues = (float*)g_value_get_pointer(&spinValue); scale = visu_data_getNodeScalingFactor(visuData, node); if (spinValues && (spinValues[TOOL_MATRIX_SPHERICAL_MODULUS] != 0. || spinMethod->priv->spinPolicy == VISU_RENDERING_SPIN_ALWAYS)) { /* Get the scaling factor for this element. */ globalMax = 0.f; if (spinMethod->priv->spinModulusUsage == VISU_RENDERING_SPIN_PER_TYPE) { maxModulus = visu_node_array_getElementProperty(VISU_NODE_ARRAY(visuData), VISU_RENDERING_SPIN_MAX_MODULUS_ID); g_return_if_fail(maxModulus); ratio = 1.f / g_value_get_float(g_value_array_get_nth(maxModulus, node->posElement)); } else if (spinMethod->priv->spinModulusUsage == VISU_RENDERING_SPIN_GLOBAL) { maxModulus = visu_node_array_getElementProperty(VISU_NODE_ARRAY(visuData), VISU_RENDERING_SPIN_MAX_MODULUS_ID); g_return_if_fail(maxModulus); globalMax = -G_MAXFLOAT; for (iele = 0; iele < maxModulus->n_values; iele++) globalMax = MAX(g_value_get_float(g_value_array_get_nth(maxModulus,iele)), globalMax); ratio = 1.f / globalMax; } else ratio = 1.f; /* We draw a spin shape. */ spherical[0] = 1; spherical[1] = spinValues[TOOL_MATRIX_SPHERICAL_THETA]; spherical[2] = spinValues[TOOL_MATRIX_SPHERICAL_PHI]; cosCone = cos(DEG2RAD(spinMethod->priv->coneOrientation[0])); sinCone = sin(DEG2RAD(spinMethod->priv->coneOrientation[0])); matrix_rot_theta[0][0] = cosCone; matrix_rot_theta[0][1] = 0; matrix_rot_theta[0][2] = -sinCone; matrix_rot_theta[1][0] = 0; matrix_rot_theta[1][1] = 1; matrix_rot_theta[1][2] = 0; matrix_rot_theta[2][0] = sinCone; matrix_rot_theta[2][1] = 0; matrix_rot_theta[2][2] = cosCone; cosCone = cos(DEG2RAD(-spinMethod->priv->coneOrientation[1])); sinCone = sin(DEG2RAD(-spinMethod->priv->coneOrientation[1])); matrix_rot_phi[0][0] = cosCone; matrix_rot_phi[0][1] = -sinCone; matrix_rot_phi[0][2] = 0; matrix_rot_phi[1][0] = sinCone; matrix_rot_phi[1][1] = cosCone; matrix_rot_phi[1][2] = 0; matrix_rot_phi[2][0] = 0; matrix_rot_phi[2][1] = 0; matrix_rot_phi[2][2] = 1; cartesian[0] = sin(DEG2RAD(spinValues[TOOL_MATRIX_SPHERICAL_THETA])) * cos(DEG2RAD(spinValues[TOOL_MATRIX_SPHERICAL_PHI])); cartesian[1] = sin(DEG2RAD(spinValues[TOOL_MATRIX_SPHERICAL_THETA])) * sin(DEG2RAD(spinValues[TOOL_MATRIX_SPHERICAL_PHI])); cartesian[2] = cos(DEG2RAD(spinValues[TOOL_MATRIX_SPHERICAL_THETA])); /* fprintf(stderr, "%f %f %f --> ", spherical[0], spherical[1], spherical[2]); */ tool_matrix_productVector(cartesian_prime, matrix_rot_phi, cartesian); tool_matrix_productVector(cartesian_second, matrix_rot_theta, cartesian_prime); /* square_matrix_product(matrix_rot_phi, cartesian_second, cartesian_ter, 3); */ tool_matrix_cartesianToSpherical(spherical, cartesian_second); /* fprintf(stderr, "%f %f %f \n", spherical[0], spherical[1], spherical[2]); */ /* theta_prime = spherical[1] - coneOrientation[0]; */ /* phi_prime = spherical[2]; */ /* /\* fin modifs *\/ */ /* theta_prime = tool_modulo_float(theta_prime, 360); */ /* if(theta_prime > 180) */ /* { */ /* theta_prime = 360 - theta_prime; */ /* phi_prime += 180; */ /* phi_prime = tool_modulo_float(phi_prime, 360); */ /* } */ /* phi_prime -= coneOrientation[1]; */ /* phi_prime = tool_modulo_float(phi_prime, 360); /\* Probably useless *\/ */ theta_prime = spherical[1]; phi_prime = spherical[2]; hsl[2] = 1 - theta_prime/180.; hsl[0] = tool_modulo_float(phi_prime - spinMethod->priv->colorWheel, 360) / 360.; /* FIN ALGO COLORISATION */ hsl[1] = 1; tool_color_convertHSLtoRGB(mm, hsl); mm[3] = ele->rgb[3]; /* The following is the part responsible for the rotation of the atoms according to their spins. */ visu_data_getNodePosition(visuData, node, xyz); glPushMatrix(); /* Translate to the rendering position. */ glTranslated(xyz[0], xyz[1], xyz[2]); /* If we need to draw also an atom shape. */ if (spinMethod->priv->spinAndAtomicRendering) { glCallList(visu_element_getMaterialId(ele)); str = (struct spinResources_struct*)getSpinResources(ele); glCallList(str->openGLIdentifierAtomic); } /* We rotate the spin shape into the right direction. */ glRotated(spinValues[TOOL_MATRIX_SPHERICAL_PHI], 0, 0, 1); glRotated(spinValues[TOOL_MATRIX_SPHERICAL_THETA], 0, 1, 0); /* We scale the shape if required. */ if (spinMethod->priv->spinModulusUsage != VISU_RENDERING_SPIN_CONSTANT) { glScalef(spinValues[TOOL_MATRIX_SPHERICAL_MODULUS], spinValues[TOOL_MATRIX_SPHERICAL_MODULUS], spinValues[TOOL_MATRIX_SPHERICAL_MODULUS]); /* glScalef(1.0, 1.0, str->modulusProp * spinValues[TOOL_MATRIX_SPHERICAL_MODULUS]); */ } /* We change its color if required. */ if (visu_data_getUserColor(visuData, ele, node, rgba)) visu_gl_setColor(ele->material, rgba); else visu_gl_setColor(ele->material, mm); /* We finaly put the spin shape. */ glScalef(scale * ratio, scale * ratio, scale * ratio); glCallList(eleGlId); glPopMatrix(); } else { /* Case modulus is null. */ if (spinMethod->priv->spinPolicy == VISU_RENDERING_SPIN_ATOMIC_NULL || spinMethod->priv->spinAndAtomicRendering) { visu_data_getNodePosition(visuData, node, xyz); glPushMatrix(); glTranslated(xyz[0], xyz[1], xyz[2]); glScalef(scale, scale, scale); glCallList(visu_element_getMaterialId(ele)); str = (struct spinResources_struct*)getSpinResources(ele); glCallList(str->openGLIdentifierAtomic); glPopMatrix(); } } } v_sim-3.7.0/src/Makefile.am0000644000353400050620000003642312215546501012415 00000000000000## Process this file with automake to produce Makefile.in vpath %.xpm $(top_srcdir) EXTRA_DIST = glade/v_sim.glade glade/v_sim.gladep AM_CPPFLAGS = -D'LOCALE_DIR="$(datadir)/locale"' -D'DATA_DIR="$(v_simresourcesdir)"' -D'LEGAL_DIR="$(v_simlegaldir)"' -D'PIXMAPS_DIR="$(v_simpixmapsdir)"' -D'PLUGINS_DIR="$(v_simpluginsdir)"' -D'ICONS_DIR="$(datadir)/icons"' -I$(top_srcdir) $(GTKS_CFLAGS) $(GLU_CFLAGS) $(LIB_YAML_CFLAGS) lib_LTLIBRARIES = libv_sim-3.la noinst_LTLIBRARIES = libv_sim-dev-3.la bin_PROGRAMS = v_sim EXTRA_PROGRAMS = v_sim v_sim-dev v_sim-test #noinst_LIBRARIES = libgui.a if OPENGL_BUILTIN_WIN32 GL_source = OSOpenGL/visu_WGL.c endif if OPENGL_BUILTIN_X11 GL_source = OSOpenGL/visu_GLX.c endif if OPENGL_GTKGLEXT GL_source = OSOpenGL/visu_GtkGlExt.c endif v_sim_sources = \ dumpModules/externalDumpModules.h \ dumpModules/dumpToTiff.c dumpModules/dumpToTiff.h\ dumpModules/dumpToGif.c dumpModules/dumpToGif.h\ dumpModules/dumpToPsAndPdf.c dumpModules/dumpToPsAndPdf.h \ dumpModules/dumpToAscii.c dumpModules/dumpToAscii.h \ dumpModules/dumpToSVG.c dumpModules/dumpToSVG.h \ dumpModules/dumpToXyz.c dumpModules/dumpToXyz.h \ dumpModules/dumpToABINIT.c dumpModules/dumpToABINIT.h \ dumpModules/dumpThroughGdkPixbuf.c dumpModules/dumpThroughGdkPixbuf.h \ extensions/nodes.c extensions/nodes.h\ extensions/box.c extensions/box.h\ extensions/axes.c extensions/axes.h\ extensions/fogAndBGColor.c extensions/fogAndBGColor.h \ extensions/scale.c extensions/scale.h \ extensions/infos.h extensions/infos.c \ extensions/legend.h extensions/legend.c \ extensions/rings.h extensions/rings.c \ extensions/marks.c extensions/marks.h \ extensions/pairs.c extensions/pairs.h \ extensions/shade.c extensions/shade.h \ extensions/frame.c extensions/frame.h \ extensions/node_vectors.c extensions/node_vectors.h \ extensions/planes.c extensions/planes.h \ extensions/surfs.c extensions/surfs.h \ extensions/maps.c extensions/maps.h \ extensions/paths.c extensions/paths.h \ extensions/forces.c extensions/forces.h \ $(GL_source) \ OSOpenGL/visu_openGL.c OSOpenGL/visu_openGL.h \ renderingBackend/visu_actionInterface.h \ coreTools/toolShade.c coreTools/toolShade.h \ coreTools/toolFileFormat.c coreTools/toolFileFormat.h \ coreTools/toolMatrix.c coreTools/toolMatrix.h \ coreTools/toolColor.c coreTools/toolColor.h \ coreTools/toolConfigFile.c coreTools/toolConfigFile.h \ coreTools/toolOptions.c coreTools/toolOptions.h \ coreTools/toolFortran.c coreTools/toolFortran.h \ coreTools/toolPhysic.c coreTools/toolPhysic.h \ coreTools/atoms_yaml.c coreTools/atoms_yaml.h \ pairsModeling/externalPairsExtensions.h \ pairsModeling/wire.c pairsModeling/wire.h\ pairsModeling/cylinder.c pairsModeling/cylinder.h \ renderingMethods/renderingAtomic.c renderingMethods/renderingAtomic.h\ renderingMethods/renderingAtomic_ascii.c renderingMethods/renderingAtomic_ascii.h\ renderingMethods/atomic_xyz.c renderingMethods/atomic_xyz.h\ renderingMethods/atomic_yaml.c renderingMethods/atomic_yaml.h\ renderingMethods/renderingAtomic_d3.c renderingMethods/renderingAtomic_d3.h\ renderingMethods/renderingSpin.h renderingMethods/renderingSpin.c \ openGLFunctions/light.c openGLFunctions/light.h \ openGLFunctions/renderingMode.c openGLFunctions/renderingMode.h \ openGLFunctions/text.c openGLFunctions/text.h \ openGLFunctions/view.c openGLFunctions/view.h \ openGLFunctions/interactive.c openGLFunctions/interactive.h \ openGLFunctions/objectList.c openGLFunctions/objectList.h \ extraFunctions/dataFile.c extraFunctions/dataFile.h\ extraFunctions/plane.c extraFunctions/plane.h\ extraFunctions/pot2surf.c extraFunctions/pot2surf.h\ extraFunctions/surfaces_resources.c extraFunctions/surfaces_resources.h \ extraFunctions/surfaces_points.c extraFunctions/surfaces_points.h \ extraFunctions/surfaces.c extraFunctions/surfaces.h \ extraFunctions/dataNode.c extraFunctions/dataNode.h \ extraFunctions/extraNode.c extraFunctions/extraNode.h \ extraFunctions/scalarFields.c extraFunctions/scalarFields.h \ extraFunctions/map.c extraFunctions/map.h \ extraFunctions/isoline.c extraFunctions/isoline.h \ extraFunctions/geometry.c extraFunctions/geometry.h \ extraFunctions/vibration.c extraFunctions/vibration.h \ iface_boxed.c iface_boxed.h\ visu_object.c visu_object.h\ visu_tools.c visu_tools.h\ visu_configFile.c visu_configFile.h \ visu_rendering.c visu_rendering.h\ visu_extension.c visu_extension.h\ visu_elements.c visu_elements.h \ visu_nodes.c visu_nodes.h \ visu_box.c visu_box.h\ visu_data.c visu_data.h\ visu_commandLine.c visu_commandLine.h\ visu_basic.c visu_basic.h\ visu_plugins.c visu_plugins.h \ visu_dump.c visu_dump.h\ opengl.c opengl.h\ visu_pairs.c visu_pairs.h \ extraGtkFunctions/gtk_dumpDialogWidget.c extraGtkFunctions/gtk_dumpDialogWidget.h \ gtk_renderingWindowWidget.c gtk_renderingWindowWidget.h\ gtk_openGLWidget.c gtk_openGLWidget.h \ visu_gtk.c visu_gtk.h interface_sources = \ panelModules/externalModules.h \ panelModules/panelElements.c panelModules/panelElements.h\ panelModules/gtkAtomic.c panelModules/gtkAtomic.h\ panelModules/gtkSpin.c panelModules/gtkSpin.h\ panelModules/panelConfig.c panelModules/panelConfig.h\ panelModules/panelOpenGL.c panelModules/panelOpenGL.h\ panelModules/panelGeometry.c panelModules/panelGeometry.h\ panelModules/panelAxes.c panelModules/panelAxes.h\ panelModules/panelFogBgColor.c panelModules/panelFogBgColor.h\ panelModules/panelBrowser.c panelModules/panelBrowser.h\ panelModules/panelDataFile.c panelModules/panelDataFile.h \ panelModules/panelPlanes.c panelModules/panelPlanes.h\ panelModules/panelSurfaces.c panelModules/panelSurfaces.h\ panelModules/panelSurfacesTools.c panelModules/panelSurfacesTools.h \ panelModules/panelMethod.c panelModules/panelMethod.h \ panelModules/panelMap.c panelModules/panelMap.h \ panelModules/panelVibration.c panelModules/panelVibration.h \ extraGtkFunctions/gtk_colorComboBoxWidget.c extraGtkFunctions/gtk_colorComboBoxWidget.h \ extraGtkFunctions/gtk_toolPanelWidget.c extraGtkFunctions/gtk_toolPanelWidget.h \ extraGtkFunctions/gtk_orientationChooser.c extraGtkFunctions/gtk_orientationChooser.h \ extraGtkFunctions/gtk_numericalEntryWidget.c extraGtkFunctions/gtk_numericalEntryWidget.h \ extraGtkFunctions/gtk_shadeComboBoxWidget.c extraGtkFunctions/gtk_shadeComboBoxWidget.h \ extraGtkFunctions/gtk_elementComboBox.c extraGtkFunctions/gtk_elementComboBox.h \ extraGtkFunctions/gtk_stippleComboBoxWidget.c extraGtkFunctions/gtk_stippleComboBoxWidget.h \ extraGtkFunctions/gtk_lineObjectWidget.c extraGtkFunctions/gtk_lineObjectWidget.h \ extraGtkFunctions/gtk_valueIOWidget.c extraGtkFunctions/gtk_valueIOWidget.h \ extraGtkFunctions/gtk_curveWidget.c extraGtkFunctions/gtk_curveWidget.h \ extraGtkFunctions/gtk_fieldChooser.c extraGtkFunctions/gtk_fieldChooser.h \ pairsModeling/externalGtkPairsExtensions.h \ pairsModeling/gtk_cylinder.c pairsModeling/gtk_cylinder.h \ pairsModeling/gtk_wire.c pairsModeling/gtk_wire.h \ gtk_main.c gtk_main.h \ gtk_about.c gtk_about.h\ gtk_save.c gtk_save.h \ support.c support.h\ interface.c interface.h \ gtk_interactive.c gtk_interactive.h \ gtk_pick.c gtk_pick.h \ gtk_move.c gtk_move.h \ gtk_pairs.c gtk_pairs.h libv_sim_3_la_SOURCES = $(v_sim_sources) $(interface_sources) libv_sim_3_la_LDFLAGS = @EXTRA_LDFLAGS@ -version-info $(lib_v_sim_version) libv_sim_dev_3_la_SOURCES = $(v_sim_sources) $(interface_sources) libv_sim_dev_3_la_LDFLAGS = @EXTRA_LDFLAGS@ -version-info $(lib_v_sim_version) #libgui_a_SOURCES = $(interface_sources) v_sim_dev_SOURCES = visu_main.c v_sim_dev_LDADD = lib@PACKAGE_TARNAME@-3.la v_sim_dev_LDFLAGS = @EXTRA_LDFLAGS@ v_sim_SOURCES = visu_main.c v_sim_LDADD = lib@PACKAGE_TARNAME@-3.la v_sim_LDFLAGS = @EXTRA_LDFLAGS@ v_sim_test_SOURCES = visu_test.c v_sim_test_LDADD = lib@PACKAGE_TARNAME@-3.la v_sim_test_LDFLAGS = @EXTRA_LDFLAGS@ AM_CFLAGS = @EXTRA_CFLAGS@ @GOBJECT_INTROSPECTION_CFLAGS@ LIBS += @GTKS_LIBS@ @FTGL_LIBS@ @GLU_LIBS@ @EXTRA_LIBS@ @GOBJECT_INTROSPECTION_LIBS@ @LIB_YAML_LIBS@ check_PROGRAMS = test_surfaces test_surfaces_SOURCES = extraFunctions/surfaces_tests.c test_surfaces_LDADD = $(links) test_surfaces_LDFLAGS = TESTS = test_surfaces # ------------------- introspection ------------------- if WITH_GOBJECT_INTROSPECTION BUILT_GIRSOURCES = v_sim-$(V_SIM_MAJOR_VERSION).$(V_SIM_MINOR_VERSION).gir gir_DATA = $(BUILT_GIRSOURCES) visutypelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib) USE_EXTERNAL = --library lib$(PACKAGE_TARNAME)-3.la $(gir_DATA): $(G_IR_SCANNER) $(PACKAGE_TARNAME) $(G_IR_SCANNER) -v --warn-all \ --namespace v_sim \ --symbol-prefix=visu --identifier-prefix=Visu \ --symbol-prefix=tool --identifier-prefix=Tool \ --nsversion "$(V_SIM_MAJOR_VERSION).$(V_SIM_MINOR_VERSION)" \ --add-include-path=$(girdir) \ --include GObject-2.0 \ --include GLib-2.0 \ --include GModule-2.0 \ --include cairo-1.0 \ --include xlib-2.0 \ --include GL-1.0 \ --include Gtk-3.0 \ --output=$(gir_DATA) $(USE_EXTERNAL) \ --program=$(builddir)/$(PACKAGE_TARNAME) \ -I$(srcdir) -I$(top_builddir) $(GTKS_CFLAGS) \ $(srcdir)/OSOpenGL/visu_openGL.c $(srcdir)/OSOpenGL/visu_openGL.h \ $(srcdir)/OSOpenGL/visu_GLX.c \ $(srcdir)/renderingBackend/visu_actionInterface.h \ $(srcdir)/coreTools/toolOptions.h $(srcdir)/coreTools/toolOptions.c \ $(srcdir)/coreTools/toolColor.h $(srcdir)/coreTools/toolColor.c \ $(srcdir)/coreTools/toolShade.h $(srcdir)/coreTools/toolShade.c \ $(srcdir)/coreTools/toolMatrix.h $(srcdir)/coreTools/toolMatrix.c \ $(srcdir)/coreTools/toolPhysic.h $(srcdir)/coreTools/toolPhysic.c \ $(srcdir)/coreTools/toolFileFormat.h $(srcdir)/coreTools/toolFileFormat.c \ $(srcdir)/coreTools/toolFortran.h $(srcdir)/coreTools/toolFortran.c \ $(srcdir)/extensions/nodes.h $(srcdir)/extensions/nodes.c \ $(srcdir)/extensions/infos.h $(srcdir)/extensions/infos.c \ $(srcdir)/extensions/marks.h $(srcdir)/extensions/marks.c \ $(srcdir)/extensions/axes.h $(srcdir)/extensions/axes.c \ $(srcdir)/extensions/box.h $(srcdir)/extensions/box.c \ $(srcdir)/extensions/legend.h $(srcdir)/extensions/legend.c \ $(srcdir)/extensions/pairs.h $(srcdir)/extensions/pairs.c \ $(srcdir)/extensions/shade.h $(srcdir)/extensions/shade.c \ $(srcdir)/extensions/frame.h $(srcdir)/extensions/frame.c \ $(srcdir)/extensions/planes.h $(srcdir)/extensions/planes.c \ $(srcdir)/extensions/node_vectors.h $(srcdir)/extensions/node_vectors.c \ $(srcdir)/extensions/fogAndBGColor.h $(srcdir)/extensions/fogAndBGColor.c \ $(srcdir)/extensions/scale.h $(srcdir)/extensions/scale.c \ $(srcdir)/extensions/surfs.h $(srcdir)/extensions/surfs.c \ $(srcdir)/extensions/maps.h $(srcdir)/extensions/maps.c \ $(srcdir)/extensions/paths.h $(srcdir)/extensions/paths.c \ $(srcdir)/extensions/forces.h $(srcdir)/extensions/forces.c \ $(srcdir)/extraFunctions/surfaces_points.h $(srcdir)/extraFunctions/surfaces_points.c \ $(srcdir)/extraFunctions/surfaces_resources.h $(srcdir)/extraFunctions/surfaces_resources.c \ $(srcdir)/extraFunctions/surfaces.h $(srcdir)/extraFunctions/surfaces.c \ $(srcdir)/extraFunctions/pot2surf.h $(srcdir)/extraFunctions/pot2surf.c \ $(srcdir)/extraFunctions/plane.h $(srcdir)/extraFunctions/plane.c \ $(srcdir)/extraFunctions/dataFile.h $(srcdir)/extraFunctions/dataFile.c \ $(srcdir)/extraFunctions/geometry.h $(srcdir)/extraFunctions/geometry.c \ $(srcdir)/extraFunctions/isoline.h $(srcdir)/extraFunctions/isoline.c \ $(srcdir)/extraFunctions/map.h $(srcdir)/extraFunctions/map.c \ $(srcdir)/extraFunctions/vibration.h $(srcdir)/extraFunctions/vibration.c \ $(srcdir)/extraFunctions/scalarFields.h $(srcdir)/extraFunctions/scalarFields.c \ $(srcdir)/extraFunctions/dataNode.h $(srcdir)/extraFunctions/dataNode.c \ $(srcdir)/extraFunctions/extraNode.h $(srcdir)/extraFunctions/extraNode.c \ $(srcdir)/openGLFunctions/renderingMode.h $(srcdir)/openGLFunctions/renderingMode.c \ $(srcdir)/openGLFunctions/light.c $(srcdir)/openGLFunctions/light.h \ $(srcdir)/openGLFunctions/text.c $(srcdir)/openGLFunctions/text.h \ $(srcdir)/openGLFunctions/objectList.c $(srcdir)/openGLFunctions/objectList.h \ $(srcdir)/openGLFunctions/interactive.c $(srcdir)/openGLFunctions/interactive.h \ $(srcdir)/openGLFunctions/view.c $(srcdir)/openGLFunctions/view.h \ $(srcdir)/renderingMethods/renderingAtomic.h $(srcdir)/renderingMethods/renderingAtomic.c\ $(srcdir)/renderingMethods/renderingSpin.h $(srcdir)/renderingMethods/renderingSpin.c\ $(srcdir)/dumpModules/dumpToAscii.c $(srcdir)/dumpModules/dumpToAscii.h \ $(srcdir)/dumpModules/dumpThroughGdkPixbuf.c $(srcdir)/dumpModules/dumpThroughGdkPixbuf.h \ $(srcdir)/dumpModules/dumpToTiff.c $(srcdir)/dumpModules/dumpToTiff.h \ $(srcdir)/dumpModules/dumpToSVG.c $(srcdir)/dumpModules/dumpToSVG.h \ $(srcdir)/dumpModules/dumpToXyz.c $(srcdir)/dumpModules/dumpToXyz.h \ $(srcdir)/dumpModules/dumpToABINIT.c $(srcdir)/dumpModules/dumpToABINIT.h \ $(srcdir)/dumpModules/dumpToSVG.c $(srcdir)/dumpModules/dumpToSVG.h \ $(srcdir)/dumpModules/dumpToPsAndPdf.c $(srcdir)/dumpModules/dumpToPsAndPdf.h \ $(srcdir)/iface_boxed.h $(srcdir)/iface_boxed.c \ $(srcdir)/visu_object.h $(srcdir)/visu_object.c \ $(srcdir)/visu_configFile.h $(srcdir)/visu_configFile.c \ $(srcdir)/visu_rendering.h $(srcdir)/visu_rendering.c \ $(srcdir)/visu_basic.h $(srcdir)/visu_basic.c \ $(srcdir)/visu_extension.h $(srcdir)/visu_extension.c \ $(srcdir)/visu_dump.h $(srcdir)/visu_dump.c \ $(srcdir)/visu_pairs.h $(srcdir)/visu_pairs.c \ $(srcdir)/visu_plugins.h $(srcdir)/visu_plugins.c \ $(srcdir)/visu_tools.h $(srcdir)/visu_tools.c \ $(srcdir)/visu_elements.c $(srcdir)/visu_elements.h \ $(srcdir)/visu_nodes.c $(srcdir)/visu_nodes.h \ $(srcdir)/visu_box.c $(srcdir)/visu_box.h \ $(srcdir)/visu_data.c $(srcdir)/visu_data.h \ $(srcdir)/visu_extension.c $(srcdir)/visu_extension.h \ $(srcdir)/opengl.c $(srcdir)/opengl.h \ $(srcdir)/extraGtkFunctions/gtk_dumpDialogWidget.h $(srcdir)/extraGtkFunctions/gtk_dumpDialogWidget.c \ $(srcdir)/extraGtkFunctions/gtk_toolPanelWidget.h $(srcdir)/extraGtkFunctions/gtk_toolPanelWidget.c \ $(srcdir)/extraGtkFunctions/gtk_numericalEntryWidget.h $(srcdir)/extraGtkFunctions/gtk_numericalEntryWidget.c \ $(srcdir)/extraGtkFunctions/gtk_colorComboBoxWidget.h $(srcdir)/extraGtkFunctions/gtk_colorComboBoxWidget.c \ $(srcdir)/extraGtkFunctions/gtk_elementComboBox.h $(srcdir)/extraGtkFunctions/gtk_elementComboBox.c \ $(srcdir)/panelModules/panelSurfaces.h $(srcdir)/panelModules/panelSurfaces.c \ $(srcdir)/panelModules/panelPlanes.h $(srcdir)/panelModules/panelPlanes.c \ $(srcdir)/panelModules/panelDataFile.h $(srcdir)/panelModules/panelDataFile.c \ $(srcdir)/panelModules/panelElements.h $(srcdir)/panelModules/panelElements.c \ $(srcdir)/panelModules/panelGeometry.h $(srcdir)/panelModules/panelGeometry.c \ $(srcdir)/panelModules/panelConfig.h $(srcdir)/panelModules/panelConfig.c \ $(srcdir)/panelModules/panelMap.h $(srcdir)/panelModules/panelMap.c \ $(srcdir)/gtk_renderingWindowWidget.c $(srcdir)/gtk_renderingWindowWidget.h \ $(srcdir)/visu_gtk.c $(srcdir)/visu_gtk.h \ $(srcdir)/gtk_openGLWidget.c $(srcdir)/gtk_openGLWidget.h \ $(srcdir)/gtk_pairs.c $(srcdir)/gtk_pairs.h \ $(srcdir)/gtk_main.c $(srcdir)/gtk_main.h $(visutypelibs_DATA): $(gir_DATA) $(G_IR_COMPILER) $(G_IR_COMPILER) \ --includedir=. \ --verbose \ -o $(visutypelibs_DATA) \ $(gir_DATA) CLEANFILES = $(gir_DATA) $(visutypelibs_DATA) endif # WITH_GOBJECT_INTROSPECTION v_sim-3.7.0/src/Makefile.in0000644000353400050620000052173612216330212012423 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = v_sim$(EXEEXT) EXTRA_PROGRAMS = v_sim$(EXEEXT) v_sim-dev$(EXEEXT) v_sim-test$(EXEEXT) check_PROGRAMS = test_surfaces$(EXEEXT) TESTS = test_surfaces$(EXEEXT) subdir = src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/abinit.m4 \ $(top_srcdir)/m4/ax_check_gl.m4 \ $(top_srcdir)/m4/ax_check_glu.m4 \ $(top_srcdir)/m4/ax_lang_compiler_ms.m4 \ $(top_srcdir)/m4/ax_lapack.m4 $(top_srcdir)/m4/bigdft.m4 \ $(top_srcdir)/m4/etsf_io.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/libxc.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/netcdf.m4 \ $(top_srcdir)/m4/python.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ "$(DESTDIR)$(girdir)" "$(DESTDIR)$(visutypelibsdir)" LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) libv_sim_3_la_LIBADD = am__libv_sim_3_la_SOURCES_DIST = dumpModules/externalDumpModules.h \ dumpModules/dumpToTiff.c dumpModules/dumpToTiff.h \ dumpModules/dumpToGif.c dumpModules/dumpToGif.h \ dumpModules/dumpToPsAndPdf.c dumpModules/dumpToPsAndPdf.h \ dumpModules/dumpToAscii.c dumpModules/dumpToAscii.h \ dumpModules/dumpToSVG.c dumpModules/dumpToSVG.h \ dumpModules/dumpToXyz.c dumpModules/dumpToXyz.h \ dumpModules/dumpToABINIT.c dumpModules/dumpToABINIT.h \ dumpModules/dumpThroughGdkPixbuf.c \ dumpModules/dumpThroughGdkPixbuf.h extensions/nodes.c \ extensions/nodes.h extensions/box.c extensions/box.h \ extensions/axes.c extensions/axes.h extensions/fogAndBGColor.c \ extensions/fogAndBGColor.h extensions/scale.c \ extensions/scale.h extensions/infos.h extensions/infos.c \ extensions/legend.h extensions/legend.c extensions/rings.h \ extensions/rings.c extensions/marks.c extensions/marks.h \ extensions/pairs.c extensions/pairs.h extensions/shade.c \ extensions/shade.h extensions/frame.c extensions/frame.h \ extensions/node_vectors.c extensions/node_vectors.h \ extensions/planes.c extensions/planes.h extensions/surfs.c \ extensions/surfs.h extensions/maps.c extensions/maps.h \ extensions/paths.c extensions/paths.h extensions/forces.c \ extensions/forces.h OSOpenGL/visu_WGL.c OSOpenGL/visu_GLX.c \ OSOpenGL/visu_GtkGlExt.c OSOpenGL/visu_openGL.c \ OSOpenGL/visu_openGL.h renderingBackend/visu_actionInterface.h \ coreTools/toolShade.c coreTools/toolShade.h \ coreTools/toolFileFormat.c coreTools/toolFileFormat.h \ coreTools/toolMatrix.c coreTools/toolMatrix.h \ coreTools/toolColor.c coreTools/toolColor.h \ coreTools/toolConfigFile.c coreTools/toolConfigFile.h \ coreTools/toolOptions.c coreTools/toolOptions.h \ coreTools/toolFortran.c coreTools/toolFortran.h \ coreTools/toolPhysic.c coreTools/toolPhysic.h \ coreTools/atoms_yaml.c coreTools/atoms_yaml.h \ pairsModeling/externalPairsExtensions.h pairsModeling/wire.c \ pairsModeling/wire.h pairsModeling/cylinder.c \ pairsModeling/cylinder.h renderingMethods/renderingAtomic.c \ renderingMethods/renderingAtomic.h \ renderingMethods/renderingAtomic_ascii.c \ renderingMethods/renderingAtomic_ascii.h \ renderingMethods/atomic_xyz.c renderingMethods/atomic_xyz.h \ renderingMethods/atomic_yaml.c renderingMethods/atomic_yaml.h \ renderingMethods/renderingAtomic_d3.c \ renderingMethods/renderingAtomic_d3.h \ renderingMethods/renderingSpin.h \ renderingMethods/renderingSpin.c openGLFunctions/light.c \ openGLFunctions/light.h openGLFunctions/renderingMode.c \ openGLFunctions/renderingMode.h openGLFunctions/text.c \ openGLFunctions/text.h openGLFunctions/view.c \ openGLFunctions/view.h openGLFunctions/interactive.c \ openGLFunctions/interactive.h openGLFunctions/objectList.c \ openGLFunctions/objectList.h extraFunctions/dataFile.c \ extraFunctions/dataFile.h extraFunctions/plane.c \ extraFunctions/plane.h extraFunctions/pot2surf.c \ extraFunctions/pot2surf.h extraFunctions/surfaces_resources.c \ extraFunctions/surfaces_resources.h \ extraFunctions/surfaces_points.c \ extraFunctions/surfaces_points.h extraFunctions/surfaces.c \ extraFunctions/surfaces.h extraFunctions/dataNode.c \ extraFunctions/dataNode.h extraFunctions/extraNode.c \ extraFunctions/extraNode.h extraFunctions/scalarFields.c \ extraFunctions/scalarFields.h extraFunctions/map.c \ extraFunctions/map.h extraFunctions/isoline.c \ extraFunctions/isoline.h extraFunctions/geometry.c \ extraFunctions/geometry.h extraFunctions/vibration.c \ extraFunctions/vibration.h iface_boxed.c iface_boxed.h \ visu_object.c visu_object.h visu_tools.c visu_tools.h \ visu_configFile.c visu_configFile.h visu_rendering.c \ visu_rendering.h visu_extension.c visu_extension.h \ visu_elements.c visu_elements.h visu_nodes.c visu_nodes.h \ visu_box.c visu_box.h visu_data.c visu_data.h \ visu_commandLine.c visu_commandLine.h visu_basic.c \ visu_basic.h visu_plugins.c visu_plugins.h visu_dump.c \ visu_dump.h opengl.c opengl.h visu_pairs.c visu_pairs.h \ extraGtkFunctions/gtk_dumpDialogWidget.c \ extraGtkFunctions/gtk_dumpDialogWidget.h \ gtk_renderingWindowWidget.c gtk_renderingWindowWidget.h \ gtk_openGLWidget.c gtk_openGLWidget.h visu_gtk.c visu_gtk.h \ panelModules/externalModules.h panelModules/panelElements.c \ panelModules/panelElements.h panelModules/gtkAtomic.c \ panelModules/gtkAtomic.h panelModules/gtkSpin.c \ panelModules/gtkSpin.h panelModules/panelConfig.c \ panelModules/panelConfig.h panelModules/panelOpenGL.c \ panelModules/panelOpenGL.h panelModules/panelGeometry.c \ panelModules/panelGeometry.h panelModules/panelAxes.c \ panelModules/panelAxes.h panelModules/panelFogBgColor.c \ panelModules/panelFogBgColor.h panelModules/panelBrowser.c \ panelModules/panelBrowser.h panelModules/panelDataFile.c \ panelModules/panelDataFile.h panelModules/panelPlanes.c \ panelModules/panelPlanes.h panelModules/panelSurfaces.c \ panelModules/panelSurfaces.h panelModules/panelSurfacesTools.c \ panelModules/panelSurfacesTools.h panelModules/panelMethod.c \ panelModules/panelMethod.h panelModules/panelMap.c \ panelModules/panelMap.h panelModules/panelVibration.c \ panelModules/panelVibration.h \ extraGtkFunctions/gtk_colorComboBoxWidget.c \ extraGtkFunctions/gtk_colorComboBoxWidget.h \ extraGtkFunctions/gtk_toolPanelWidget.c \ extraGtkFunctions/gtk_toolPanelWidget.h \ extraGtkFunctions/gtk_orientationChooser.c \ extraGtkFunctions/gtk_orientationChooser.h \ extraGtkFunctions/gtk_numericalEntryWidget.c \ extraGtkFunctions/gtk_numericalEntryWidget.h \ extraGtkFunctions/gtk_shadeComboBoxWidget.c \ extraGtkFunctions/gtk_shadeComboBoxWidget.h \ extraGtkFunctions/gtk_elementComboBox.c \ extraGtkFunctions/gtk_elementComboBox.h \ extraGtkFunctions/gtk_stippleComboBoxWidget.c \ extraGtkFunctions/gtk_stippleComboBoxWidget.h \ extraGtkFunctions/gtk_lineObjectWidget.c \ extraGtkFunctions/gtk_lineObjectWidget.h \ extraGtkFunctions/gtk_valueIOWidget.c \ extraGtkFunctions/gtk_valueIOWidget.h \ extraGtkFunctions/gtk_curveWidget.c \ extraGtkFunctions/gtk_curveWidget.h \ extraGtkFunctions/gtk_fieldChooser.c \ extraGtkFunctions/gtk_fieldChooser.h \ pairsModeling/externalGtkPairsExtensions.h \ pairsModeling/gtk_cylinder.c pairsModeling/gtk_cylinder.h \ pairsModeling/gtk_wire.c pairsModeling/gtk_wire.h gtk_main.c \ gtk_main.h gtk_about.c gtk_about.h gtk_save.c gtk_save.h \ support.c support.h interface.c interface.h gtk_interactive.c \ gtk_interactive.h gtk_pick.c gtk_pick.h gtk_move.c gtk_move.h \ gtk_pairs.c gtk_pairs.h @OPENGL_BUILTIN_WIN32_FALSE@@OPENGL_BUILTIN_X11_FALSE@@OPENGL_GTKGLEXT_TRUE@am__objects_1 = visu_GtkGlExt.lo @OPENGL_BUILTIN_WIN32_FALSE@@OPENGL_BUILTIN_X11_TRUE@am__objects_1 = visu_GLX.lo @OPENGL_BUILTIN_WIN32_TRUE@am__objects_1 = visu_WGL.lo am__objects_2 = dumpToTiff.lo dumpToGif.lo dumpToPsAndPdf.lo \ dumpToAscii.lo dumpToSVG.lo dumpToXyz.lo dumpToABINIT.lo \ dumpThroughGdkPixbuf.lo nodes.lo box.lo axes.lo \ fogAndBGColor.lo scale.lo infos.lo legend.lo rings.lo marks.lo \ pairs.lo shade.lo frame.lo node_vectors.lo planes.lo surfs.lo \ maps.lo paths.lo forces.lo $(am__objects_1) visu_openGL.lo \ toolShade.lo toolFileFormat.lo toolMatrix.lo toolColor.lo \ toolConfigFile.lo toolOptions.lo toolFortran.lo toolPhysic.lo \ atoms_yaml.lo wire.lo cylinder.lo renderingAtomic.lo \ renderingAtomic_ascii.lo atomic_xyz.lo atomic_yaml.lo \ renderingAtomic_d3.lo renderingSpin.lo light.lo \ renderingMode.lo text.lo view.lo interactive.lo objectList.lo \ dataFile.lo plane.lo pot2surf.lo surfaces_resources.lo \ surfaces_points.lo surfaces.lo dataNode.lo extraNode.lo \ scalarFields.lo map.lo isoline.lo geometry.lo vibration.lo \ iface_boxed.lo visu_object.lo visu_tools.lo visu_configFile.lo \ visu_rendering.lo visu_extension.lo visu_elements.lo \ visu_nodes.lo visu_box.lo visu_data.lo visu_commandLine.lo \ visu_basic.lo visu_plugins.lo visu_dump.lo opengl.lo \ visu_pairs.lo gtk_dumpDialogWidget.lo \ gtk_renderingWindowWidget.lo gtk_openGLWidget.lo visu_gtk.lo am__objects_3 = panelElements.lo gtkAtomic.lo gtkSpin.lo \ panelConfig.lo panelOpenGL.lo panelGeometry.lo panelAxes.lo \ panelFogBgColor.lo panelBrowser.lo panelDataFile.lo \ panelPlanes.lo panelSurfaces.lo panelSurfacesTools.lo \ panelMethod.lo panelMap.lo panelVibration.lo \ gtk_colorComboBoxWidget.lo gtk_toolPanelWidget.lo \ gtk_orientationChooser.lo gtk_numericalEntryWidget.lo \ gtk_shadeComboBoxWidget.lo gtk_elementComboBox.lo \ gtk_stippleComboBoxWidget.lo gtk_lineObjectWidget.lo \ gtk_valueIOWidget.lo gtk_curveWidget.lo gtk_fieldChooser.lo \ gtk_cylinder.lo gtk_wire.lo gtk_main.lo gtk_about.lo \ gtk_save.lo support.lo interface.lo gtk_interactive.lo \ gtk_pick.lo gtk_move.lo gtk_pairs.lo am_libv_sim_3_la_OBJECTS = $(am__objects_2) $(am__objects_3) libv_sim_3_la_OBJECTS = $(am_libv_sim_3_la_OBJECTS) libv_sim_3_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libv_sim_3_la_LDFLAGS) $(LDFLAGS) -o $@ libv_sim_dev_3_la_LIBADD = am__libv_sim_dev_3_la_SOURCES_DIST = \ dumpModules/externalDumpModules.h dumpModules/dumpToTiff.c \ dumpModules/dumpToTiff.h dumpModules/dumpToGif.c \ dumpModules/dumpToGif.h dumpModules/dumpToPsAndPdf.c \ dumpModules/dumpToPsAndPdf.h dumpModules/dumpToAscii.c \ dumpModules/dumpToAscii.h dumpModules/dumpToSVG.c \ dumpModules/dumpToSVG.h dumpModules/dumpToXyz.c \ dumpModules/dumpToXyz.h dumpModules/dumpToABINIT.c \ dumpModules/dumpToABINIT.h dumpModules/dumpThroughGdkPixbuf.c \ dumpModules/dumpThroughGdkPixbuf.h extensions/nodes.c \ extensions/nodes.h extensions/box.c extensions/box.h \ extensions/axes.c extensions/axes.h extensions/fogAndBGColor.c \ extensions/fogAndBGColor.h extensions/scale.c \ extensions/scale.h extensions/infos.h extensions/infos.c \ extensions/legend.h extensions/legend.c extensions/rings.h \ extensions/rings.c extensions/marks.c extensions/marks.h \ extensions/pairs.c extensions/pairs.h extensions/shade.c \ extensions/shade.h extensions/frame.c extensions/frame.h \ extensions/node_vectors.c extensions/node_vectors.h \ extensions/planes.c extensions/planes.h extensions/surfs.c \ extensions/surfs.h extensions/maps.c extensions/maps.h \ extensions/paths.c extensions/paths.h extensions/forces.c \ extensions/forces.h OSOpenGL/visu_WGL.c OSOpenGL/visu_GLX.c \ OSOpenGL/visu_GtkGlExt.c OSOpenGL/visu_openGL.c \ OSOpenGL/visu_openGL.h renderingBackend/visu_actionInterface.h \ coreTools/toolShade.c coreTools/toolShade.h \ coreTools/toolFileFormat.c coreTools/toolFileFormat.h \ coreTools/toolMatrix.c coreTools/toolMatrix.h \ coreTools/toolColor.c coreTools/toolColor.h \ coreTools/toolConfigFile.c coreTools/toolConfigFile.h \ coreTools/toolOptions.c coreTools/toolOptions.h \ coreTools/toolFortran.c coreTools/toolFortran.h \ coreTools/toolPhysic.c coreTools/toolPhysic.h \ coreTools/atoms_yaml.c coreTools/atoms_yaml.h \ pairsModeling/externalPairsExtensions.h pairsModeling/wire.c \ pairsModeling/wire.h pairsModeling/cylinder.c \ pairsModeling/cylinder.h renderingMethods/renderingAtomic.c \ renderingMethods/renderingAtomic.h \ renderingMethods/renderingAtomic_ascii.c \ renderingMethods/renderingAtomic_ascii.h \ renderingMethods/atomic_xyz.c renderingMethods/atomic_xyz.h \ renderingMethods/atomic_yaml.c renderingMethods/atomic_yaml.h \ renderingMethods/renderingAtomic_d3.c \ renderingMethods/renderingAtomic_d3.h \ renderingMethods/renderingSpin.h \ renderingMethods/renderingSpin.c openGLFunctions/light.c \ openGLFunctions/light.h openGLFunctions/renderingMode.c \ openGLFunctions/renderingMode.h openGLFunctions/text.c \ openGLFunctions/text.h openGLFunctions/view.c \ openGLFunctions/view.h openGLFunctions/interactive.c \ openGLFunctions/interactive.h openGLFunctions/objectList.c \ openGLFunctions/objectList.h extraFunctions/dataFile.c \ extraFunctions/dataFile.h extraFunctions/plane.c \ extraFunctions/plane.h extraFunctions/pot2surf.c \ extraFunctions/pot2surf.h extraFunctions/surfaces_resources.c \ extraFunctions/surfaces_resources.h \ extraFunctions/surfaces_points.c \ extraFunctions/surfaces_points.h extraFunctions/surfaces.c \ extraFunctions/surfaces.h extraFunctions/dataNode.c \ extraFunctions/dataNode.h extraFunctions/extraNode.c \ extraFunctions/extraNode.h extraFunctions/scalarFields.c \ extraFunctions/scalarFields.h extraFunctions/map.c \ extraFunctions/map.h extraFunctions/isoline.c \ extraFunctions/isoline.h extraFunctions/geometry.c \ extraFunctions/geometry.h extraFunctions/vibration.c \ extraFunctions/vibration.h iface_boxed.c iface_boxed.h \ visu_object.c visu_object.h visu_tools.c visu_tools.h \ visu_configFile.c visu_configFile.h visu_rendering.c \ visu_rendering.h visu_extension.c visu_extension.h \ visu_elements.c visu_elements.h visu_nodes.c visu_nodes.h \ visu_box.c visu_box.h visu_data.c visu_data.h \ visu_commandLine.c visu_commandLine.h visu_basic.c \ visu_basic.h visu_plugins.c visu_plugins.h visu_dump.c \ visu_dump.h opengl.c opengl.h visu_pairs.c visu_pairs.h \ extraGtkFunctions/gtk_dumpDialogWidget.c \ extraGtkFunctions/gtk_dumpDialogWidget.h \ gtk_renderingWindowWidget.c gtk_renderingWindowWidget.h \ gtk_openGLWidget.c gtk_openGLWidget.h visu_gtk.c visu_gtk.h \ panelModules/externalModules.h panelModules/panelElements.c \ panelModules/panelElements.h panelModules/gtkAtomic.c \ panelModules/gtkAtomic.h panelModules/gtkSpin.c \ panelModules/gtkSpin.h panelModules/panelConfig.c \ panelModules/panelConfig.h panelModules/panelOpenGL.c \ panelModules/panelOpenGL.h panelModules/panelGeometry.c \ panelModules/panelGeometry.h panelModules/panelAxes.c \ panelModules/panelAxes.h panelModules/panelFogBgColor.c \ panelModules/panelFogBgColor.h panelModules/panelBrowser.c \ panelModules/panelBrowser.h panelModules/panelDataFile.c \ panelModules/panelDataFile.h panelModules/panelPlanes.c \ panelModules/panelPlanes.h panelModules/panelSurfaces.c \ panelModules/panelSurfaces.h panelModules/panelSurfacesTools.c \ panelModules/panelSurfacesTools.h panelModules/panelMethod.c \ panelModules/panelMethod.h panelModules/panelMap.c \ panelModules/panelMap.h panelModules/panelVibration.c \ panelModules/panelVibration.h \ extraGtkFunctions/gtk_colorComboBoxWidget.c \ extraGtkFunctions/gtk_colorComboBoxWidget.h \ extraGtkFunctions/gtk_toolPanelWidget.c \ extraGtkFunctions/gtk_toolPanelWidget.h \ extraGtkFunctions/gtk_orientationChooser.c \ extraGtkFunctions/gtk_orientationChooser.h \ extraGtkFunctions/gtk_numericalEntryWidget.c \ extraGtkFunctions/gtk_numericalEntryWidget.h \ extraGtkFunctions/gtk_shadeComboBoxWidget.c \ extraGtkFunctions/gtk_shadeComboBoxWidget.h \ extraGtkFunctions/gtk_elementComboBox.c \ extraGtkFunctions/gtk_elementComboBox.h \ extraGtkFunctions/gtk_stippleComboBoxWidget.c \ extraGtkFunctions/gtk_stippleComboBoxWidget.h \ extraGtkFunctions/gtk_lineObjectWidget.c \ extraGtkFunctions/gtk_lineObjectWidget.h \ extraGtkFunctions/gtk_valueIOWidget.c \ extraGtkFunctions/gtk_valueIOWidget.h \ extraGtkFunctions/gtk_curveWidget.c \ extraGtkFunctions/gtk_curveWidget.h \ extraGtkFunctions/gtk_fieldChooser.c \ extraGtkFunctions/gtk_fieldChooser.h \ pairsModeling/externalGtkPairsExtensions.h \ pairsModeling/gtk_cylinder.c pairsModeling/gtk_cylinder.h \ pairsModeling/gtk_wire.c pairsModeling/gtk_wire.h gtk_main.c \ gtk_main.h gtk_about.c gtk_about.h gtk_save.c gtk_save.h \ support.c support.h interface.c interface.h gtk_interactive.c \ gtk_interactive.h gtk_pick.c gtk_pick.h gtk_move.c gtk_move.h \ gtk_pairs.c gtk_pairs.h am_libv_sim_dev_3_la_OBJECTS = $(am__objects_2) $(am__objects_3) libv_sim_dev_3_la_OBJECTS = $(am_libv_sim_dev_3_la_OBJECTS) libv_sim_dev_3_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libv_sim_dev_3_la_LDFLAGS) $(LDFLAGS) -o $@ PROGRAMS = $(bin_PROGRAMS) am_test_surfaces_OBJECTS = surfaces_tests.$(OBJEXT) test_surfaces_OBJECTS = $(am_test_surfaces_OBJECTS) test_surfaces_DEPENDENCIES = test_surfaces_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(test_surfaces_LDFLAGS) $(LDFLAGS) -o $@ am_v_sim_OBJECTS = visu_main.$(OBJEXT) v_sim_OBJECTS = $(am_v_sim_OBJECTS) v_sim_DEPENDENCIES = lib@PACKAGE_TARNAME@-3.la v_sim_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(v_sim_LDFLAGS) \ $(LDFLAGS) -o $@ am_v_sim_dev_OBJECTS = visu_main.$(OBJEXT) v_sim_dev_OBJECTS = $(am_v_sim_dev_OBJECTS) v_sim_dev_DEPENDENCIES = lib@PACKAGE_TARNAME@-3.la v_sim_dev_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(v_sim_dev_LDFLAGS) $(LDFLAGS) -o $@ am_v_sim_test_OBJECTS = visu_test.$(OBJEXT) v_sim_test_OBJECTS = $(am_v_sim_test_OBJECTS) v_sim_test_DEPENDENCIES = lib@PACKAGE_TARNAME@-3.la v_sim_test_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(v_sim_test_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libv_sim_3_la_SOURCES) $(libv_sim_dev_3_la_SOURCES) \ $(test_surfaces_SOURCES) $(v_sim_SOURCES) $(v_sim_dev_SOURCES) \ $(v_sim_test_SOURCES) DIST_SOURCES = $(am__libv_sim_3_la_SOURCES_DIST) \ $(am__libv_sim_dev_3_la_SOURCES_DIST) $(test_surfaces_SOURCES) \ $(v_sim_SOURCES) $(v_sim_dev_SOURCES) $(v_sim_test_SOURCES) DATA = $(gir_DATA) $(visutypelibs_DATA) ETAGS = etags CTAGS = ctags am__tty_colors = \ red=; grn=; lgn=; blu=; std= DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AB_CPPFLAGS = @AB_CPPFLAGS@ AB_LIBS = @AB_LIBS@ ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIGDFT_CPPFLAGS = @BIGDFT_CPPFLAGS@ BIGDFT_LIBS = @BIGDFT_LIBS@ BLAS_LIBS = @BLAS_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETSF_IO_LIBS = @ETSF_IO_LIBS@ EXEEXT = @EXEEXT@ EXTRA_CFLAGS = @EXTRA_CFLAGS@ EXTRA_LDFLAGS = @EXTRA_LDFLAGS@ EXTRA_LIBS = @EXTRA_LIBS@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ FCLIBS = @FCLIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLIBS = @FLIBS@ FONT_BOLD = @FONT_BOLD@ FONT_NORMAL = @FONT_NORMAL@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_BIGDFT_CFLAGS = @GLIB_BIGDFT_CFLAGS@ GLIB_BIGDFT_LIBS = @GLIB_BIGDFT_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GOBJECT_INTROSPECTION_REQUIRED = @GOBJECT_INTROSPECTION_REQUIRED@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTKS_CFLAGS = @GTKS_CFLAGS@ GTKS_LIBS = @GTKS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_SCANNER = @G_IR_SCANNER@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LAPACK_LIBS = @LAPACK_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ @GTKS_LIBS@ @FTGL_LIBS@ @GLU_LIBS@ @EXTRA_LIBS@ \ @GOBJECT_INTROSPECTION_LIBS@ @LIB_YAML_LIBS@ $(am__empty) LIBTOOL = @LIBTOOL@ LIBXC_LIBS = @LIBXC_LIBS@ LIB_ARCHIVE_CFLAGS = @LIB_ARCHIVE_CFLAGS@ LIB_ARCHIVE_LIBS = @LIB_ARCHIVE_LIBS@ LIB_YAML_CFLAGS = @LIB_YAML_CFLAGS@ LIB_YAML_LIBS = @LIB_YAML_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NC_CPPFLAGS = @NC_CPPFLAGS@ NC_LDFLAGS = @NC_LDFLAGS@ NC_LIBS = @NC_LIBS@ NC_NETCDF_3_CPPFLAG = @NC_NETCDF_3_CPPFLAG@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBABEL_CFLAGS = @OPENBABEL_CFLAGS@ OPENBABEL_LIBS = @OPENBABEL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PYGOBJECT_CFLAGS = @PYGOBJECT_CFLAGS@ PYGOBJECT_LIBS = @PYGOBJECT_LIBS@ PYGOBJECT_REQUIRED = @PYGOBJECT_REQUIRED@ PYGTK_CFLAGS = @PYGTK_CFLAGS@ PYGTK_LIBS = @PYGTK_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_INCLUDES = @PYTHON_INCLUDES@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ V_SIM_MAJOR_VERSION = @V_SIM_MAJOR_VERSION@ V_SIM_MICRO_VERSION = @V_SIM_MICRO_VERSION@ V_SIM_MINOR_VERSION = @V_SIM_MINOR_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ girdir = @girdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ lib_v_sim_version = @lib_v_sim_version@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typelibsdir = @typelibsdir@ v_simexamplesdir = @v_simexamplesdir@ v_simexedir = @v_simexedir@ v_simiconsdir = @v_simiconsdir@ v_simlegaldir = @v_simlegaldir@ v_simpixmapsdir = @v_simpixmapsdir@ v_simpluginsdir = @v_simpluginsdir@ v_simresourcesdir = @v_simresourcesdir@ visupyexecdir = @visupyexecdir@ visutypelibsdir = @visutypelibsdir@ EXTRA_DIST = glade/v_sim.glade glade/v_sim.gladep AM_CPPFLAGS = -D'LOCALE_DIR="$(datadir)/locale"' -D'DATA_DIR="$(v_simresourcesdir)"' -D'LEGAL_DIR="$(v_simlegaldir)"' -D'PIXMAPS_DIR="$(v_simpixmapsdir)"' -D'PLUGINS_DIR="$(v_simpluginsdir)"' -D'ICONS_DIR="$(datadir)/icons"' -I$(top_srcdir) $(GTKS_CFLAGS) $(GLU_CFLAGS) $(LIB_YAML_CFLAGS) lib_LTLIBRARIES = libv_sim-3.la noinst_LTLIBRARIES = libv_sim-dev-3.la #noinst_LIBRARIES = libgui.a @OPENGL_BUILTIN_WIN32_TRUE@GL_source = OSOpenGL/visu_WGL.c @OPENGL_BUILTIN_X11_TRUE@GL_source = OSOpenGL/visu_GLX.c @OPENGL_GTKGLEXT_TRUE@GL_source = OSOpenGL/visu_GtkGlExt.c v_sim_sources = \ dumpModules/externalDumpModules.h \ dumpModules/dumpToTiff.c dumpModules/dumpToTiff.h\ dumpModules/dumpToGif.c dumpModules/dumpToGif.h\ dumpModules/dumpToPsAndPdf.c dumpModules/dumpToPsAndPdf.h \ dumpModules/dumpToAscii.c dumpModules/dumpToAscii.h \ dumpModules/dumpToSVG.c dumpModules/dumpToSVG.h \ dumpModules/dumpToXyz.c dumpModules/dumpToXyz.h \ dumpModules/dumpToABINIT.c dumpModules/dumpToABINIT.h \ dumpModules/dumpThroughGdkPixbuf.c dumpModules/dumpThroughGdkPixbuf.h \ extensions/nodes.c extensions/nodes.h\ extensions/box.c extensions/box.h\ extensions/axes.c extensions/axes.h\ extensions/fogAndBGColor.c extensions/fogAndBGColor.h \ extensions/scale.c extensions/scale.h \ extensions/infos.h extensions/infos.c \ extensions/legend.h extensions/legend.c \ extensions/rings.h extensions/rings.c \ extensions/marks.c extensions/marks.h \ extensions/pairs.c extensions/pairs.h \ extensions/shade.c extensions/shade.h \ extensions/frame.c extensions/frame.h \ extensions/node_vectors.c extensions/node_vectors.h \ extensions/planes.c extensions/planes.h \ extensions/surfs.c extensions/surfs.h \ extensions/maps.c extensions/maps.h \ extensions/paths.c extensions/paths.h \ extensions/forces.c extensions/forces.h \ $(GL_source) \ OSOpenGL/visu_openGL.c OSOpenGL/visu_openGL.h \ renderingBackend/visu_actionInterface.h \ coreTools/toolShade.c coreTools/toolShade.h \ coreTools/toolFileFormat.c coreTools/toolFileFormat.h \ coreTools/toolMatrix.c coreTools/toolMatrix.h \ coreTools/toolColor.c coreTools/toolColor.h \ coreTools/toolConfigFile.c coreTools/toolConfigFile.h \ coreTools/toolOptions.c coreTools/toolOptions.h \ coreTools/toolFortran.c coreTools/toolFortran.h \ coreTools/toolPhysic.c coreTools/toolPhysic.h \ coreTools/atoms_yaml.c coreTools/atoms_yaml.h \ pairsModeling/externalPairsExtensions.h \ pairsModeling/wire.c pairsModeling/wire.h\ pairsModeling/cylinder.c pairsModeling/cylinder.h \ renderingMethods/renderingAtomic.c renderingMethods/renderingAtomic.h\ renderingMethods/renderingAtomic_ascii.c renderingMethods/renderingAtomic_ascii.h\ renderingMethods/atomic_xyz.c renderingMethods/atomic_xyz.h\ renderingMethods/atomic_yaml.c renderingMethods/atomic_yaml.h\ renderingMethods/renderingAtomic_d3.c renderingMethods/renderingAtomic_d3.h\ renderingMethods/renderingSpin.h renderingMethods/renderingSpin.c \ openGLFunctions/light.c openGLFunctions/light.h \ openGLFunctions/renderingMode.c openGLFunctions/renderingMode.h \ openGLFunctions/text.c openGLFunctions/text.h \ openGLFunctions/view.c openGLFunctions/view.h \ openGLFunctions/interactive.c openGLFunctions/interactive.h \ openGLFunctions/objectList.c openGLFunctions/objectList.h \ extraFunctions/dataFile.c extraFunctions/dataFile.h\ extraFunctions/plane.c extraFunctions/plane.h\ extraFunctions/pot2surf.c extraFunctions/pot2surf.h\ extraFunctions/surfaces_resources.c extraFunctions/surfaces_resources.h \ extraFunctions/surfaces_points.c extraFunctions/surfaces_points.h \ extraFunctions/surfaces.c extraFunctions/surfaces.h \ extraFunctions/dataNode.c extraFunctions/dataNode.h \ extraFunctions/extraNode.c extraFunctions/extraNode.h \ extraFunctions/scalarFields.c extraFunctions/scalarFields.h \ extraFunctions/map.c extraFunctions/map.h \ extraFunctions/isoline.c extraFunctions/isoline.h \ extraFunctions/geometry.c extraFunctions/geometry.h \ extraFunctions/vibration.c extraFunctions/vibration.h \ iface_boxed.c iface_boxed.h\ visu_object.c visu_object.h\ visu_tools.c visu_tools.h\ visu_configFile.c visu_configFile.h \ visu_rendering.c visu_rendering.h\ visu_extension.c visu_extension.h\ visu_elements.c visu_elements.h \ visu_nodes.c visu_nodes.h \ visu_box.c visu_box.h\ visu_data.c visu_data.h\ visu_commandLine.c visu_commandLine.h\ visu_basic.c visu_basic.h\ visu_plugins.c visu_plugins.h \ visu_dump.c visu_dump.h\ opengl.c opengl.h\ visu_pairs.c visu_pairs.h \ extraGtkFunctions/gtk_dumpDialogWidget.c extraGtkFunctions/gtk_dumpDialogWidget.h \ gtk_renderingWindowWidget.c gtk_renderingWindowWidget.h\ gtk_openGLWidget.c gtk_openGLWidget.h \ visu_gtk.c visu_gtk.h interface_sources = \ panelModules/externalModules.h \ panelModules/panelElements.c panelModules/panelElements.h\ panelModules/gtkAtomic.c panelModules/gtkAtomic.h\ panelModules/gtkSpin.c panelModules/gtkSpin.h\ panelModules/panelConfig.c panelModules/panelConfig.h\ panelModules/panelOpenGL.c panelModules/panelOpenGL.h\ panelModules/panelGeometry.c panelModules/panelGeometry.h\ panelModules/panelAxes.c panelModules/panelAxes.h\ panelModules/panelFogBgColor.c panelModules/panelFogBgColor.h\ panelModules/panelBrowser.c panelModules/panelBrowser.h\ panelModules/panelDataFile.c panelModules/panelDataFile.h \ panelModules/panelPlanes.c panelModules/panelPlanes.h\ panelModules/panelSurfaces.c panelModules/panelSurfaces.h\ panelModules/panelSurfacesTools.c panelModules/panelSurfacesTools.h \ panelModules/panelMethod.c panelModules/panelMethod.h \ panelModules/panelMap.c panelModules/panelMap.h \ panelModules/panelVibration.c panelModules/panelVibration.h \ extraGtkFunctions/gtk_colorComboBoxWidget.c extraGtkFunctions/gtk_colorComboBoxWidget.h \ extraGtkFunctions/gtk_toolPanelWidget.c extraGtkFunctions/gtk_toolPanelWidget.h \ extraGtkFunctions/gtk_orientationChooser.c extraGtkFunctions/gtk_orientationChooser.h \ extraGtkFunctions/gtk_numericalEntryWidget.c extraGtkFunctions/gtk_numericalEntryWidget.h \ extraGtkFunctions/gtk_shadeComboBoxWidget.c extraGtkFunctions/gtk_shadeComboBoxWidget.h \ extraGtkFunctions/gtk_elementComboBox.c extraGtkFunctions/gtk_elementComboBox.h \ extraGtkFunctions/gtk_stippleComboBoxWidget.c extraGtkFunctions/gtk_stippleComboBoxWidget.h \ extraGtkFunctions/gtk_lineObjectWidget.c extraGtkFunctions/gtk_lineObjectWidget.h \ extraGtkFunctions/gtk_valueIOWidget.c extraGtkFunctions/gtk_valueIOWidget.h \ extraGtkFunctions/gtk_curveWidget.c extraGtkFunctions/gtk_curveWidget.h \ extraGtkFunctions/gtk_fieldChooser.c extraGtkFunctions/gtk_fieldChooser.h \ pairsModeling/externalGtkPairsExtensions.h \ pairsModeling/gtk_cylinder.c pairsModeling/gtk_cylinder.h \ pairsModeling/gtk_wire.c pairsModeling/gtk_wire.h \ gtk_main.c gtk_main.h \ gtk_about.c gtk_about.h\ gtk_save.c gtk_save.h \ support.c support.h\ interface.c interface.h \ gtk_interactive.c gtk_interactive.h \ gtk_pick.c gtk_pick.h \ gtk_move.c gtk_move.h \ gtk_pairs.c gtk_pairs.h libv_sim_3_la_SOURCES = $(v_sim_sources) $(interface_sources) libv_sim_3_la_LDFLAGS = @EXTRA_LDFLAGS@ -version-info $(lib_v_sim_version) libv_sim_dev_3_la_SOURCES = $(v_sim_sources) $(interface_sources) libv_sim_dev_3_la_LDFLAGS = @EXTRA_LDFLAGS@ -version-info $(lib_v_sim_version) #libgui_a_SOURCES = $(interface_sources) v_sim_dev_SOURCES = visu_main.c v_sim_dev_LDADD = lib@PACKAGE_TARNAME@-3.la v_sim_dev_LDFLAGS = @EXTRA_LDFLAGS@ v_sim_SOURCES = visu_main.c v_sim_LDADD = lib@PACKAGE_TARNAME@-3.la v_sim_LDFLAGS = @EXTRA_LDFLAGS@ v_sim_test_SOURCES = visu_test.c v_sim_test_LDADD = lib@PACKAGE_TARNAME@-3.la v_sim_test_LDFLAGS = @EXTRA_LDFLAGS@ AM_CFLAGS = @EXTRA_CFLAGS@ @GOBJECT_INTROSPECTION_CFLAGS@ test_surfaces_SOURCES = extraFunctions/surfaces_tests.c test_surfaces_LDADD = $(links) test_surfaces_LDFLAGS = # ------------------- introspection ------------------- @WITH_GOBJECT_INTROSPECTION_TRUE@BUILT_GIRSOURCES = v_sim-$(V_SIM_MAJOR_VERSION).$(V_SIM_MINOR_VERSION).gir @WITH_GOBJECT_INTROSPECTION_TRUE@gir_DATA = $(BUILT_GIRSOURCES) @WITH_GOBJECT_INTROSPECTION_TRUE@visutypelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib) @WITH_GOBJECT_INTROSPECTION_TRUE@USE_EXTERNAL = --library lib$(PACKAGE_TARNAME)-3.la @WITH_GOBJECT_INTROSPECTION_TRUE@CLEANFILES = $(gir_DATA) $(visutypelibs_DATA) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libv_sim-3.la: $(libv_sim_3_la_OBJECTS) $(libv_sim_3_la_DEPENDENCIES) $(EXTRA_libv_sim_3_la_DEPENDENCIES) $(libv_sim_3_la_LINK) -rpath $(libdir) $(libv_sim_3_la_OBJECTS) $(libv_sim_3_la_LIBADD) $(LIBS) libv_sim-dev-3.la: $(libv_sim_dev_3_la_OBJECTS) $(libv_sim_dev_3_la_DEPENDENCIES) $(EXTRA_libv_sim_dev_3_la_DEPENDENCIES) $(libv_sim_dev_3_la_LINK) $(libv_sim_dev_3_la_OBJECTS) $(libv_sim_dev_3_la_LIBADD) $(LIBS) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test_surfaces$(EXEEXT): $(test_surfaces_OBJECTS) $(test_surfaces_DEPENDENCIES) $(EXTRA_test_surfaces_DEPENDENCIES) @rm -f test_surfaces$(EXEEXT) $(test_surfaces_LINK) $(test_surfaces_OBJECTS) $(test_surfaces_LDADD) $(LIBS) v_sim$(EXEEXT): $(v_sim_OBJECTS) $(v_sim_DEPENDENCIES) $(EXTRA_v_sim_DEPENDENCIES) @rm -f v_sim$(EXEEXT) $(v_sim_LINK) $(v_sim_OBJECTS) $(v_sim_LDADD) $(LIBS) v_sim-dev$(EXEEXT): $(v_sim_dev_OBJECTS) $(v_sim_dev_DEPENDENCIES) $(EXTRA_v_sim_dev_DEPENDENCIES) @rm -f v_sim-dev$(EXEEXT) $(v_sim_dev_LINK) $(v_sim_dev_OBJECTS) $(v_sim_dev_LDADD) $(LIBS) v_sim-test$(EXEEXT): $(v_sim_test_OBJECTS) $(v_sim_test_DEPENDENCIES) $(EXTRA_v_sim_test_DEPENDENCIES) @rm -f v_sim-test$(EXEEXT) $(v_sim_test_LINK) $(v_sim_test_OBJECTS) $(v_sim_test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atomic_xyz.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atomic_yaml.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atoms_yaml.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/axes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/box.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cylinder.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dataFile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dataNode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dumpThroughGdkPixbuf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dumpToABINIT.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dumpToAscii.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dumpToGif.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dumpToPsAndPdf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dumpToSVG.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dumpToTiff.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dumpToXyz.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/extraNode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fogAndBGColor.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/forces.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frame.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geometry.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtkAtomic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtkSpin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk_about.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk_colorComboBoxWidget.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk_curveWidget.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk_cylinder.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk_dumpDialogWidget.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk_elementComboBox.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk_fieldChooser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk_interactive.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk_lineObjectWidget.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk_main.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk_move.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk_numericalEntryWidget.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk_openGLWidget.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk_orientationChooser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk_pairs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk_pick.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk_renderingWindowWidget.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk_save.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk_shadeComboBoxWidget.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk_stippleComboBoxWidget.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk_toolPanelWidget.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk_valueIOWidget.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk_wire.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iface_boxed.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/infos.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interactive.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isoline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/legend.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/light.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/map.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/maps.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/marks.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/node_vectors.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nodes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/objectList.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/opengl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pairs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/panelAxes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/panelBrowser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/panelConfig.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/panelDataFile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/panelElements.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/panelFogBgColor.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/panelGeometry.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/panelMap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/panelMethod.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/panelOpenGL.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/panelPlanes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/panelSurfaces.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/panelSurfacesTools.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/panelVibration.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paths.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plane.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/planes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pot2surf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/renderingAtomic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/renderingAtomic_ascii.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/renderingAtomic_d3.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/renderingMode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/renderingSpin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rings.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scalarFields.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scale.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shade.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/support.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/surfaces.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/surfaces_points.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/surfaces_resources.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/surfaces_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/surfs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/text.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/toolColor.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/toolConfigFile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/toolFileFormat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/toolFortran.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/toolMatrix.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/toolOptions.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/toolPhysic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/toolShade.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vibration.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/view.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/visu_GLX.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/visu_GtkGlExt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/visu_WGL.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/visu_basic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/visu_box.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/visu_commandLine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/visu_configFile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/visu_data.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/visu_dump.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/visu_elements.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/visu_extension.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/visu_gtk.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/visu_main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/visu_nodes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/visu_object.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/visu_openGL.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/visu_pairs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/visu_plugins.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/visu_rendering.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/visu_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/visu_tools.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wire.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< dumpToTiff.lo: dumpModules/dumpToTiff.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dumpToTiff.lo -MD -MP -MF $(DEPDIR)/dumpToTiff.Tpo -c -o dumpToTiff.lo `test -f 'dumpModules/dumpToTiff.c' || echo '$(srcdir)/'`dumpModules/dumpToTiff.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/dumpToTiff.Tpo $(DEPDIR)/dumpToTiff.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dumpModules/dumpToTiff.c' object='dumpToTiff.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dumpToTiff.lo `test -f 'dumpModules/dumpToTiff.c' || echo '$(srcdir)/'`dumpModules/dumpToTiff.c dumpToGif.lo: dumpModules/dumpToGif.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dumpToGif.lo -MD -MP -MF $(DEPDIR)/dumpToGif.Tpo -c -o dumpToGif.lo `test -f 'dumpModules/dumpToGif.c' || echo '$(srcdir)/'`dumpModules/dumpToGif.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/dumpToGif.Tpo $(DEPDIR)/dumpToGif.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dumpModules/dumpToGif.c' object='dumpToGif.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dumpToGif.lo `test -f 'dumpModules/dumpToGif.c' || echo '$(srcdir)/'`dumpModules/dumpToGif.c dumpToPsAndPdf.lo: dumpModules/dumpToPsAndPdf.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dumpToPsAndPdf.lo -MD -MP -MF $(DEPDIR)/dumpToPsAndPdf.Tpo -c -o dumpToPsAndPdf.lo `test -f 'dumpModules/dumpToPsAndPdf.c' || echo '$(srcdir)/'`dumpModules/dumpToPsAndPdf.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/dumpToPsAndPdf.Tpo $(DEPDIR)/dumpToPsAndPdf.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dumpModules/dumpToPsAndPdf.c' object='dumpToPsAndPdf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dumpToPsAndPdf.lo `test -f 'dumpModules/dumpToPsAndPdf.c' || echo '$(srcdir)/'`dumpModules/dumpToPsAndPdf.c dumpToAscii.lo: dumpModules/dumpToAscii.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dumpToAscii.lo -MD -MP -MF $(DEPDIR)/dumpToAscii.Tpo -c -o dumpToAscii.lo `test -f 'dumpModules/dumpToAscii.c' || echo '$(srcdir)/'`dumpModules/dumpToAscii.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/dumpToAscii.Tpo $(DEPDIR)/dumpToAscii.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dumpModules/dumpToAscii.c' object='dumpToAscii.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dumpToAscii.lo `test -f 'dumpModules/dumpToAscii.c' || echo '$(srcdir)/'`dumpModules/dumpToAscii.c dumpToSVG.lo: dumpModules/dumpToSVG.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dumpToSVG.lo -MD -MP -MF $(DEPDIR)/dumpToSVG.Tpo -c -o dumpToSVG.lo `test -f 'dumpModules/dumpToSVG.c' || echo '$(srcdir)/'`dumpModules/dumpToSVG.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/dumpToSVG.Tpo $(DEPDIR)/dumpToSVG.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dumpModules/dumpToSVG.c' object='dumpToSVG.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dumpToSVG.lo `test -f 'dumpModules/dumpToSVG.c' || echo '$(srcdir)/'`dumpModules/dumpToSVG.c dumpToXyz.lo: dumpModules/dumpToXyz.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dumpToXyz.lo -MD -MP -MF $(DEPDIR)/dumpToXyz.Tpo -c -o dumpToXyz.lo `test -f 'dumpModules/dumpToXyz.c' || echo '$(srcdir)/'`dumpModules/dumpToXyz.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/dumpToXyz.Tpo $(DEPDIR)/dumpToXyz.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dumpModules/dumpToXyz.c' object='dumpToXyz.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dumpToXyz.lo `test -f 'dumpModules/dumpToXyz.c' || echo '$(srcdir)/'`dumpModules/dumpToXyz.c dumpToABINIT.lo: dumpModules/dumpToABINIT.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dumpToABINIT.lo -MD -MP -MF $(DEPDIR)/dumpToABINIT.Tpo -c -o dumpToABINIT.lo `test -f 'dumpModules/dumpToABINIT.c' || echo '$(srcdir)/'`dumpModules/dumpToABINIT.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/dumpToABINIT.Tpo $(DEPDIR)/dumpToABINIT.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dumpModules/dumpToABINIT.c' object='dumpToABINIT.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dumpToABINIT.lo `test -f 'dumpModules/dumpToABINIT.c' || echo '$(srcdir)/'`dumpModules/dumpToABINIT.c dumpThroughGdkPixbuf.lo: dumpModules/dumpThroughGdkPixbuf.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dumpThroughGdkPixbuf.lo -MD -MP -MF $(DEPDIR)/dumpThroughGdkPixbuf.Tpo -c -o dumpThroughGdkPixbuf.lo `test -f 'dumpModules/dumpThroughGdkPixbuf.c' || echo '$(srcdir)/'`dumpModules/dumpThroughGdkPixbuf.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/dumpThroughGdkPixbuf.Tpo $(DEPDIR)/dumpThroughGdkPixbuf.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dumpModules/dumpThroughGdkPixbuf.c' object='dumpThroughGdkPixbuf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dumpThroughGdkPixbuf.lo `test -f 'dumpModules/dumpThroughGdkPixbuf.c' || echo '$(srcdir)/'`dumpModules/dumpThroughGdkPixbuf.c nodes.lo: extensions/nodes.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT nodes.lo -MD -MP -MF $(DEPDIR)/nodes.Tpo -c -o nodes.lo `test -f 'extensions/nodes.c' || echo '$(srcdir)/'`extensions/nodes.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nodes.Tpo $(DEPDIR)/nodes.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extensions/nodes.c' object='nodes.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o nodes.lo `test -f 'extensions/nodes.c' || echo '$(srcdir)/'`extensions/nodes.c box.lo: extensions/box.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT box.lo -MD -MP -MF $(DEPDIR)/box.Tpo -c -o box.lo `test -f 'extensions/box.c' || echo '$(srcdir)/'`extensions/box.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/box.Tpo $(DEPDIR)/box.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extensions/box.c' object='box.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o box.lo `test -f 'extensions/box.c' || echo '$(srcdir)/'`extensions/box.c axes.lo: extensions/axes.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT axes.lo -MD -MP -MF $(DEPDIR)/axes.Tpo -c -o axes.lo `test -f 'extensions/axes.c' || echo '$(srcdir)/'`extensions/axes.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/axes.Tpo $(DEPDIR)/axes.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extensions/axes.c' object='axes.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o axes.lo `test -f 'extensions/axes.c' || echo '$(srcdir)/'`extensions/axes.c fogAndBGColor.lo: extensions/fogAndBGColor.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fogAndBGColor.lo -MD -MP -MF $(DEPDIR)/fogAndBGColor.Tpo -c -o fogAndBGColor.lo `test -f 'extensions/fogAndBGColor.c' || echo '$(srcdir)/'`extensions/fogAndBGColor.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/fogAndBGColor.Tpo $(DEPDIR)/fogAndBGColor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extensions/fogAndBGColor.c' object='fogAndBGColor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fogAndBGColor.lo `test -f 'extensions/fogAndBGColor.c' || echo '$(srcdir)/'`extensions/fogAndBGColor.c scale.lo: extensions/scale.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT scale.lo -MD -MP -MF $(DEPDIR)/scale.Tpo -c -o scale.lo `test -f 'extensions/scale.c' || echo '$(srcdir)/'`extensions/scale.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/scale.Tpo $(DEPDIR)/scale.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extensions/scale.c' object='scale.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o scale.lo `test -f 'extensions/scale.c' || echo '$(srcdir)/'`extensions/scale.c infos.lo: extensions/infos.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT infos.lo -MD -MP -MF $(DEPDIR)/infos.Tpo -c -o infos.lo `test -f 'extensions/infos.c' || echo '$(srcdir)/'`extensions/infos.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/infos.Tpo $(DEPDIR)/infos.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extensions/infos.c' object='infos.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o infos.lo `test -f 'extensions/infos.c' || echo '$(srcdir)/'`extensions/infos.c legend.lo: extensions/legend.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT legend.lo -MD -MP -MF $(DEPDIR)/legend.Tpo -c -o legend.lo `test -f 'extensions/legend.c' || echo '$(srcdir)/'`extensions/legend.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/legend.Tpo $(DEPDIR)/legend.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extensions/legend.c' object='legend.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o legend.lo `test -f 'extensions/legend.c' || echo '$(srcdir)/'`extensions/legend.c rings.lo: extensions/rings.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rings.lo -MD -MP -MF $(DEPDIR)/rings.Tpo -c -o rings.lo `test -f 'extensions/rings.c' || echo '$(srcdir)/'`extensions/rings.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/rings.Tpo $(DEPDIR)/rings.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extensions/rings.c' object='rings.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rings.lo `test -f 'extensions/rings.c' || echo '$(srcdir)/'`extensions/rings.c marks.lo: extensions/marks.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT marks.lo -MD -MP -MF $(DEPDIR)/marks.Tpo -c -o marks.lo `test -f 'extensions/marks.c' || echo '$(srcdir)/'`extensions/marks.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/marks.Tpo $(DEPDIR)/marks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extensions/marks.c' object='marks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o marks.lo `test -f 'extensions/marks.c' || echo '$(srcdir)/'`extensions/marks.c pairs.lo: extensions/pairs.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pairs.lo -MD -MP -MF $(DEPDIR)/pairs.Tpo -c -o pairs.lo `test -f 'extensions/pairs.c' || echo '$(srcdir)/'`extensions/pairs.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pairs.Tpo $(DEPDIR)/pairs.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extensions/pairs.c' object='pairs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pairs.lo `test -f 'extensions/pairs.c' || echo '$(srcdir)/'`extensions/pairs.c shade.lo: extensions/shade.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shade.lo -MD -MP -MF $(DEPDIR)/shade.Tpo -c -o shade.lo `test -f 'extensions/shade.c' || echo '$(srcdir)/'`extensions/shade.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/shade.Tpo $(DEPDIR)/shade.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extensions/shade.c' object='shade.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shade.lo `test -f 'extensions/shade.c' || echo '$(srcdir)/'`extensions/shade.c frame.lo: extensions/frame.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT frame.lo -MD -MP -MF $(DEPDIR)/frame.Tpo -c -o frame.lo `test -f 'extensions/frame.c' || echo '$(srcdir)/'`extensions/frame.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/frame.Tpo $(DEPDIR)/frame.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extensions/frame.c' object='frame.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o frame.lo `test -f 'extensions/frame.c' || echo '$(srcdir)/'`extensions/frame.c node_vectors.lo: extensions/node_vectors.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT node_vectors.lo -MD -MP -MF $(DEPDIR)/node_vectors.Tpo -c -o node_vectors.lo `test -f 'extensions/node_vectors.c' || echo '$(srcdir)/'`extensions/node_vectors.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/node_vectors.Tpo $(DEPDIR)/node_vectors.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extensions/node_vectors.c' object='node_vectors.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o node_vectors.lo `test -f 'extensions/node_vectors.c' || echo '$(srcdir)/'`extensions/node_vectors.c planes.lo: extensions/planes.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT planes.lo -MD -MP -MF $(DEPDIR)/planes.Tpo -c -o planes.lo `test -f 'extensions/planes.c' || echo '$(srcdir)/'`extensions/planes.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/planes.Tpo $(DEPDIR)/planes.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extensions/planes.c' object='planes.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o planes.lo `test -f 'extensions/planes.c' || echo '$(srcdir)/'`extensions/planes.c surfs.lo: extensions/surfs.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT surfs.lo -MD -MP -MF $(DEPDIR)/surfs.Tpo -c -o surfs.lo `test -f 'extensions/surfs.c' || echo '$(srcdir)/'`extensions/surfs.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/surfs.Tpo $(DEPDIR)/surfs.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extensions/surfs.c' object='surfs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o surfs.lo `test -f 'extensions/surfs.c' || echo '$(srcdir)/'`extensions/surfs.c maps.lo: extensions/maps.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT maps.lo -MD -MP -MF $(DEPDIR)/maps.Tpo -c -o maps.lo `test -f 'extensions/maps.c' || echo '$(srcdir)/'`extensions/maps.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/maps.Tpo $(DEPDIR)/maps.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extensions/maps.c' object='maps.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o maps.lo `test -f 'extensions/maps.c' || echo '$(srcdir)/'`extensions/maps.c paths.lo: extensions/paths.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT paths.lo -MD -MP -MF $(DEPDIR)/paths.Tpo -c -o paths.lo `test -f 'extensions/paths.c' || echo '$(srcdir)/'`extensions/paths.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/paths.Tpo $(DEPDIR)/paths.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extensions/paths.c' object='paths.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o paths.lo `test -f 'extensions/paths.c' || echo '$(srcdir)/'`extensions/paths.c forces.lo: extensions/forces.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT forces.lo -MD -MP -MF $(DEPDIR)/forces.Tpo -c -o forces.lo `test -f 'extensions/forces.c' || echo '$(srcdir)/'`extensions/forces.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/forces.Tpo $(DEPDIR)/forces.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extensions/forces.c' object='forces.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o forces.lo `test -f 'extensions/forces.c' || echo '$(srcdir)/'`extensions/forces.c visu_WGL.lo: OSOpenGL/visu_WGL.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT visu_WGL.lo -MD -MP -MF $(DEPDIR)/visu_WGL.Tpo -c -o visu_WGL.lo `test -f 'OSOpenGL/visu_WGL.c' || echo '$(srcdir)/'`OSOpenGL/visu_WGL.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/visu_WGL.Tpo $(DEPDIR)/visu_WGL.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='OSOpenGL/visu_WGL.c' object='visu_WGL.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o visu_WGL.lo `test -f 'OSOpenGL/visu_WGL.c' || echo '$(srcdir)/'`OSOpenGL/visu_WGL.c visu_GLX.lo: OSOpenGL/visu_GLX.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT visu_GLX.lo -MD -MP -MF $(DEPDIR)/visu_GLX.Tpo -c -o visu_GLX.lo `test -f 'OSOpenGL/visu_GLX.c' || echo '$(srcdir)/'`OSOpenGL/visu_GLX.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/visu_GLX.Tpo $(DEPDIR)/visu_GLX.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='OSOpenGL/visu_GLX.c' object='visu_GLX.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o visu_GLX.lo `test -f 'OSOpenGL/visu_GLX.c' || echo '$(srcdir)/'`OSOpenGL/visu_GLX.c visu_GtkGlExt.lo: OSOpenGL/visu_GtkGlExt.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT visu_GtkGlExt.lo -MD -MP -MF $(DEPDIR)/visu_GtkGlExt.Tpo -c -o visu_GtkGlExt.lo `test -f 'OSOpenGL/visu_GtkGlExt.c' || echo '$(srcdir)/'`OSOpenGL/visu_GtkGlExt.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/visu_GtkGlExt.Tpo $(DEPDIR)/visu_GtkGlExt.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='OSOpenGL/visu_GtkGlExt.c' object='visu_GtkGlExt.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o visu_GtkGlExt.lo `test -f 'OSOpenGL/visu_GtkGlExt.c' || echo '$(srcdir)/'`OSOpenGL/visu_GtkGlExt.c visu_openGL.lo: OSOpenGL/visu_openGL.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT visu_openGL.lo -MD -MP -MF $(DEPDIR)/visu_openGL.Tpo -c -o visu_openGL.lo `test -f 'OSOpenGL/visu_openGL.c' || echo '$(srcdir)/'`OSOpenGL/visu_openGL.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/visu_openGL.Tpo $(DEPDIR)/visu_openGL.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='OSOpenGL/visu_openGL.c' object='visu_openGL.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o visu_openGL.lo `test -f 'OSOpenGL/visu_openGL.c' || echo '$(srcdir)/'`OSOpenGL/visu_openGL.c toolShade.lo: coreTools/toolShade.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT toolShade.lo -MD -MP -MF $(DEPDIR)/toolShade.Tpo -c -o toolShade.lo `test -f 'coreTools/toolShade.c' || echo '$(srcdir)/'`coreTools/toolShade.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/toolShade.Tpo $(DEPDIR)/toolShade.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='coreTools/toolShade.c' object='toolShade.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o toolShade.lo `test -f 'coreTools/toolShade.c' || echo '$(srcdir)/'`coreTools/toolShade.c toolFileFormat.lo: coreTools/toolFileFormat.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT toolFileFormat.lo -MD -MP -MF $(DEPDIR)/toolFileFormat.Tpo -c -o toolFileFormat.lo `test -f 'coreTools/toolFileFormat.c' || echo '$(srcdir)/'`coreTools/toolFileFormat.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/toolFileFormat.Tpo $(DEPDIR)/toolFileFormat.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='coreTools/toolFileFormat.c' object='toolFileFormat.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o toolFileFormat.lo `test -f 'coreTools/toolFileFormat.c' || echo '$(srcdir)/'`coreTools/toolFileFormat.c toolMatrix.lo: coreTools/toolMatrix.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT toolMatrix.lo -MD -MP -MF $(DEPDIR)/toolMatrix.Tpo -c -o toolMatrix.lo `test -f 'coreTools/toolMatrix.c' || echo '$(srcdir)/'`coreTools/toolMatrix.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/toolMatrix.Tpo $(DEPDIR)/toolMatrix.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='coreTools/toolMatrix.c' object='toolMatrix.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o toolMatrix.lo `test -f 'coreTools/toolMatrix.c' || echo '$(srcdir)/'`coreTools/toolMatrix.c toolColor.lo: coreTools/toolColor.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT toolColor.lo -MD -MP -MF $(DEPDIR)/toolColor.Tpo -c -o toolColor.lo `test -f 'coreTools/toolColor.c' || echo '$(srcdir)/'`coreTools/toolColor.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/toolColor.Tpo $(DEPDIR)/toolColor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='coreTools/toolColor.c' object='toolColor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o toolColor.lo `test -f 'coreTools/toolColor.c' || echo '$(srcdir)/'`coreTools/toolColor.c toolConfigFile.lo: coreTools/toolConfigFile.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT toolConfigFile.lo -MD -MP -MF $(DEPDIR)/toolConfigFile.Tpo -c -o toolConfigFile.lo `test -f 'coreTools/toolConfigFile.c' || echo '$(srcdir)/'`coreTools/toolConfigFile.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/toolConfigFile.Tpo $(DEPDIR)/toolConfigFile.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='coreTools/toolConfigFile.c' object='toolConfigFile.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o toolConfigFile.lo `test -f 'coreTools/toolConfigFile.c' || echo '$(srcdir)/'`coreTools/toolConfigFile.c toolOptions.lo: coreTools/toolOptions.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT toolOptions.lo -MD -MP -MF $(DEPDIR)/toolOptions.Tpo -c -o toolOptions.lo `test -f 'coreTools/toolOptions.c' || echo '$(srcdir)/'`coreTools/toolOptions.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/toolOptions.Tpo $(DEPDIR)/toolOptions.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='coreTools/toolOptions.c' object='toolOptions.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o toolOptions.lo `test -f 'coreTools/toolOptions.c' || echo '$(srcdir)/'`coreTools/toolOptions.c toolFortran.lo: coreTools/toolFortran.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT toolFortran.lo -MD -MP -MF $(DEPDIR)/toolFortran.Tpo -c -o toolFortran.lo `test -f 'coreTools/toolFortran.c' || echo '$(srcdir)/'`coreTools/toolFortran.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/toolFortran.Tpo $(DEPDIR)/toolFortran.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='coreTools/toolFortran.c' object='toolFortran.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o toolFortran.lo `test -f 'coreTools/toolFortran.c' || echo '$(srcdir)/'`coreTools/toolFortran.c toolPhysic.lo: coreTools/toolPhysic.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT toolPhysic.lo -MD -MP -MF $(DEPDIR)/toolPhysic.Tpo -c -o toolPhysic.lo `test -f 'coreTools/toolPhysic.c' || echo '$(srcdir)/'`coreTools/toolPhysic.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/toolPhysic.Tpo $(DEPDIR)/toolPhysic.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='coreTools/toolPhysic.c' object='toolPhysic.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o toolPhysic.lo `test -f 'coreTools/toolPhysic.c' || echo '$(srcdir)/'`coreTools/toolPhysic.c atoms_yaml.lo: coreTools/atoms_yaml.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT atoms_yaml.lo -MD -MP -MF $(DEPDIR)/atoms_yaml.Tpo -c -o atoms_yaml.lo `test -f 'coreTools/atoms_yaml.c' || echo '$(srcdir)/'`coreTools/atoms_yaml.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/atoms_yaml.Tpo $(DEPDIR)/atoms_yaml.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='coreTools/atoms_yaml.c' object='atoms_yaml.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o atoms_yaml.lo `test -f 'coreTools/atoms_yaml.c' || echo '$(srcdir)/'`coreTools/atoms_yaml.c wire.lo: pairsModeling/wire.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wire.lo -MD -MP -MF $(DEPDIR)/wire.Tpo -c -o wire.lo `test -f 'pairsModeling/wire.c' || echo '$(srcdir)/'`pairsModeling/wire.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/wire.Tpo $(DEPDIR)/wire.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pairsModeling/wire.c' object='wire.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wire.lo `test -f 'pairsModeling/wire.c' || echo '$(srcdir)/'`pairsModeling/wire.c cylinder.lo: pairsModeling/cylinder.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cylinder.lo -MD -MP -MF $(DEPDIR)/cylinder.Tpo -c -o cylinder.lo `test -f 'pairsModeling/cylinder.c' || echo '$(srcdir)/'`pairsModeling/cylinder.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/cylinder.Tpo $(DEPDIR)/cylinder.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pairsModeling/cylinder.c' object='cylinder.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cylinder.lo `test -f 'pairsModeling/cylinder.c' || echo '$(srcdir)/'`pairsModeling/cylinder.c renderingAtomic.lo: renderingMethods/renderingAtomic.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT renderingAtomic.lo -MD -MP -MF $(DEPDIR)/renderingAtomic.Tpo -c -o renderingAtomic.lo `test -f 'renderingMethods/renderingAtomic.c' || echo '$(srcdir)/'`renderingMethods/renderingAtomic.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/renderingAtomic.Tpo $(DEPDIR)/renderingAtomic.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='renderingMethods/renderingAtomic.c' object='renderingAtomic.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o renderingAtomic.lo `test -f 'renderingMethods/renderingAtomic.c' || echo '$(srcdir)/'`renderingMethods/renderingAtomic.c renderingAtomic_ascii.lo: renderingMethods/renderingAtomic_ascii.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT renderingAtomic_ascii.lo -MD -MP -MF $(DEPDIR)/renderingAtomic_ascii.Tpo -c -o renderingAtomic_ascii.lo `test -f 'renderingMethods/renderingAtomic_ascii.c' || echo '$(srcdir)/'`renderingMethods/renderingAtomic_ascii.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/renderingAtomic_ascii.Tpo $(DEPDIR)/renderingAtomic_ascii.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='renderingMethods/renderingAtomic_ascii.c' object='renderingAtomic_ascii.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o renderingAtomic_ascii.lo `test -f 'renderingMethods/renderingAtomic_ascii.c' || echo '$(srcdir)/'`renderingMethods/renderingAtomic_ascii.c atomic_xyz.lo: renderingMethods/atomic_xyz.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT atomic_xyz.lo -MD -MP -MF $(DEPDIR)/atomic_xyz.Tpo -c -o atomic_xyz.lo `test -f 'renderingMethods/atomic_xyz.c' || echo '$(srcdir)/'`renderingMethods/atomic_xyz.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/atomic_xyz.Tpo $(DEPDIR)/atomic_xyz.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='renderingMethods/atomic_xyz.c' object='atomic_xyz.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o atomic_xyz.lo `test -f 'renderingMethods/atomic_xyz.c' || echo '$(srcdir)/'`renderingMethods/atomic_xyz.c atomic_yaml.lo: renderingMethods/atomic_yaml.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT atomic_yaml.lo -MD -MP -MF $(DEPDIR)/atomic_yaml.Tpo -c -o atomic_yaml.lo `test -f 'renderingMethods/atomic_yaml.c' || echo '$(srcdir)/'`renderingMethods/atomic_yaml.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/atomic_yaml.Tpo $(DEPDIR)/atomic_yaml.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='renderingMethods/atomic_yaml.c' object='atomic_yaml.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o atomic_yaml.lo `test -f 'renderingMethods/atomic_yaml.c' || echo '$(srcdir)/'`renderingMethods/atomic_yaml.c renderingAtomic_d3.lo: renderingMethods/renderingAtomic_d3.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT renderingAtomic_d3.lo -MD -MP -MF $(DEPDIR)/renderingAtomic_d3.Tpo -c -o renderingAtomic_d3.lo `test -f 'renderingMethods/renderingAtomic_d3.c' || echo '$(srcdir)/'`renderingMethods/renderingAtomic_d3.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/renderingAtomic_d3.Tpo $(DEPDIR)/renderingAtomic_d3.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='renderingMethods/renderingAtomic_d3.c' object='renderingAtomic_d3.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o renderingAtomic_d3.lo `test -f 'renderingMethods/renderingAtomic_d3.c' || echo '$(srcdir)/'`renderingMethods/renderingAtomic_d3.c renderingSpin.lo: renderingMethods/renderingSpin.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT renderingSpin.lo -MD -MP -MF $(DEPDIR)/renderingSpin.Tpo -c -o renderingSpin.lo `test -f 'renderingMethods/renderingSpin.c' || echo '$(srcdir)/'`renderingMethods/renderingSpin.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/renderingSpin.Tpo $(DEPDIR)/renderingSpin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='renderingMethods/renderingSpin.c' object='renderingSpin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o renderingSpin.lo `test -f 'renderingMethods/renderingSpin.c' || echo '$(srcdir)/'`renderingMethods/renderingSpin.c light.lo: openGLFunctions/light.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT light.lo -MD -MP -MF $(DEPDIR)/light.Tpo -c -o light.lo `test -f 'openGLFunctions/light.c' || echo '$(srcdir)/'`openGLFunctions/light.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/light.Tpo $(DEPDIR)/light.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='openGLFunctions/light.c' object='light.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o light.lo `test -f 'openGLFunctions/light.c' || echo '$(srcdir)/'`openGLFunctions/light.c renderingMode.lo: openGLFunctions/renderingMode.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT renderingMode.lo -MD -MP -MF $(DEPDIR)/renderingMode.Tpo -c -o renderingMode.lo `test -f 'openGLFunctions/renderingMode.c' || echo '$(srcdir)/'`openGLFunctions/renderingMode.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/renderingMode.Tpo $(DEPDIR)/renderingMode.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='openGLFunctions/renderingMode.c' object='renderingMode.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o renderingMode.lo `test -f 'openGLFunctions/renderingMode.c' || echo '$(srcdir)/'`openGLFunctions/renderingMode.c text.lo: openGLFunctions/text.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT text.lo -MD -MP -MF $(DEPDIR)/text.Tpo -c -o text.lo `test -f 'openGLFunctions/text.c' || echo '$(srcdir)/'`openGLFunctions/text.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/text.Tpo $(DEPDIR)/text.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='openGLFunctions/text.c' object='text.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o text.lo `test -f 'openGLFunctions/text.c' || echo '$(srcdir)/'`openGLFunctions/text.c view.lo: openGLFunctions/view.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT view.lo -MD -MP -MF $(DEPDIR)/view.Tpo -c -o view.lo `test -f 'openGLFunctions/view.c' || echo '$(srcdir)/'`openGLFunctions/view.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/view.Tpo $(DEPDIR)/view.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='openGLFunctions/view.c' object='view.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o view.lo `test -f 'openGLFunctions/view.c' || echo '$(srcdir)/'`openGLFunctions/view.c interactive.lo: openGLFunctions/interactive.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT interactive.lo -MD -MP -MF $(DEPDIR)/interactive.Tpo -c -o interactive.lo `test -f 'openGLFunctions/interactive.c' || echo '$(srcdir)/'`openGLFunctions/interactive.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/interactive.Tpo $(DEPDIR)/interactive.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='openGLFunctions/interactive.c' object='interactive.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o interactive.lo `test -f 'openGLFunctions/interactive.c' || echo '$(srcdir)/'`openGLFunctions/interactive.c objectList.lo: openGLFunctions/objectList.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT objectList.lo -MD -MP -MF $(DEPDIR)/objectList.Tpo -c -o objectList.lo `test -f 'openGLFunctions/objectList.c' || echo '$(srcdir)/'`openGLFunctions/objectList.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/objectList.Tpo $(DEPDIR)/objectList.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='openGLFunctions/objectList.c' object='objectList.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o objectList.lo `test -f 'openGLFunctions/objectList.c' || echo '$(srcdir)/'`openGLFunctions/objectList.c dataFile.lo: extraFunctions/dataFile.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dataFile.lo -MD -MP -MF $(DEPDIR)/dataFile.Tpo -c -o dataFile.lo `test -f 'extraFunctions/dataFile.c' || echo '$(srcdir)/'`extraFunctions/dataFile.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/dataFile.Tpo $(DEPDIR)/dataFile.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraFunctions/dataFile.c' object='dataFile.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dataFile.lo `test -f 'extraFunctions/dataFile.c' || echo '$(srcdir)/'`extraFunctions/dataFile.c plane.lo: extraFunctions/plane.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT plane.lo -MD -MP -MF $(DEPDIR)/plane.Tpo -c -o plane.lo `test -f 'extraFunctions/plane.c' || echo '$(srcdir)/'`extraFunctions/plane.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/plane.Tpo $(DEPDIR)/plane.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraFunctions/plane.c' object='plane.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o plane.lo `test -f 'extraFunctions/plane.c' || echo '$(srcdir)/'`extraFunctions/plane.c pot2surf.lo: extraFunctions/pot2surf.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pot2surf.lo -MD -MP -MF $(DEPDIR)/pot2surf.Tpo -c -o pot2surf.lo `test -f 'extraFunctions/pot2surf.c' || echo '$(srcdir)/'`extraFunctions/pot2surf.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pot2surf.Tpo $(DEPDIR)/pot2surf.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraFunctions/pot2surf.c' object='pot2surf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pot2surf.lo `test -f 'extraFunctions/pot2surf.c' || echo '$(srcdir)/'`extraFunctions/pot2surf.c surfaces_resources.lo: extraFunctions/surfaces_resources.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT surfaces_resources.lo -MD -MP -MF $(DEPDIR)/surfaces_resources.Tpo -c -o surfaces_resources.lo `test -f 'extraFunctions/surfaces_resources.c' || echo '$(srcdir)/'`extraFunctions/surfaces_resources.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/surfaces_resources.Tpo $(DEPDIR)/surfaces_resources.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraFunctions/surfaces_resources.c' object='surfaces_resources.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o surfaces_resources.lo `test -f 'extraFunctions/surfaces_resources.c' || echo '$(srcdir)/'`extraFunctions/surfaces_resources.c surfaces_points.lo: extraFunctions/surfaces_points.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT surfaces_points.lo -MD -MP -MF $(DEPDIR)/surfaces_points.Tpo -c -o surfaces_points.lo `test -f 'extraFunctions/surfaces_points.c' || echo '$(srcdir)/'`extraFunctions/surfaces_points.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/surfaces_points.Tpo $(DEPDIR)/surfaces_points.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraFunctions/surfaces_points.c' object='surfaces_points.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o surfaces_points.lo `test -f 'extraFunctions/surfaces_points.c' || echo '$(srcdir)/'`extraFunctions/surfaces_points.c surfaces.lo: extraFunctions/surfaces.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT surfaces.lo -MD -MP -MF $(DEPDIR)/surfaces.Tpo -c -o surfaces.lo `test -f 'extraFunctions/surfaces.c' || echo '$(srcdir)/'`extraFunctions/surfaces.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/surfaces.Tpo $(DEPDIR)/surfaces.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraFunctions/surfaces.c' object='surfaces.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o surfaces.lo `test -f 'extraFunctions/surfaces.c' || echo '$(srcdir)/'`extraFunctions/surfaces.c dataNode.lo: extraFunctions/dataNode.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dataNode.lo -MD -MP -MF $(DEPDIR)/dataNode.Tpo -c -o dataNode.lo `test -f 'extraFunctions/dataNode.c' || echo '$(srcdir)/'`extraFunctions/dataNode.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/dataNode.Tpo $(DEPDIR)/dataNode.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraFunctions/dataNode.c' object='dataNode.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dataNode.lo `test -f 'extraFunctions/dataNode.c' || echo '$(srcdir)/'`extraFunctions/dataNode.c extraNode.lo: extraFunctions/extraNode.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT extraNode.lo -MD -MP -MF $(DEPDIR)/extraNode.Tpo -c -o extraNode.lo `test -f 'extraFunctions/extraNode.c' || echo '$(srcdir)/'`extraFunctions/extraNode.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/extraNode.Tpo $(DEPDIR)/extraNode.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraFunctions/extraNode.c' object='extraNode.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o extraNode.lo `test -f 'extraFunctions/extraNode.c' || echo '$(srcdir)/'`extraFunctions/extraNode.c scalarFields.lo: extraFunctions/scalarFields.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT scalarFields.lo -MD -MP -MF $(DEPDIR)/scalarFields.Tpo -c -o scalarFields.lo `test -f 'extraFunctions/scalarFields.c' || echo '$(srcdir)/'`extraFunctions/scalarFields.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/scalarFields.Tpo $(DEPDIR)/scalarFields.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraFunctions/scalarFields.c' object='scalarFields.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o scalarFields.lo `test -f 'extraFunctions/scalarFields.c' || echo '$(srcdir)/'`extraFunctions/scalarFields.c map.lo: extraFunctions/map.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT map.lo -MD -MP -MF $(DEPDIR)/map.Tpo -c -o map.lo `test -f 'extraFunctions/map.c' || echo '$(srcdir)/'`extraFunctions/map.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/map.Tpo $(DEPDIR)/map.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraFunctions/map.c' object='map.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o map.lo `test -f 'extraFunctions/map.c' || echo '$(srcdir)/'`extraFunctions/map.c isoline.lo: extraFunctions/isoline.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isoline.lo -MD -MP -MF $(DEPDIR)/isoline.Tpo -c -o isoline.lo `test -f 'extraFunctions/isoline.c' || echo '$(srcdir)/'`extraFunctions/isoline.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/isoline.Tpo $(DEPDIR)/isoline.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraFunctions/isoline.c' object='isoline.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isoline.lo `test -f 'extraFunctions/isoline.c' || echo '$(srcdir)/'`extraFunctions/isoline.c geometry.lo: extraFunctions/geometry.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT geometry.lo -MD -MP -MF $(DEPDIR)/geometry.Tpo -c -o geometry.lo `test -f 'extraFunctions/geometry.c' || echo '$(srcdir)/'`extraFunctions/geometry.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/geometry.Tpo $(DEPDIR)/geometry.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraFunctions/geometry.c' object='geometry.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o geometry.lo `test -f 'extraFunctions/geometry.c' || echo '$(srcdir)/'`extraFunctions/geometry.c vibration.lo: extraFunctions/vibration.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vibration.lo -MD -MP -MF $(DEPDIR)/vibration.Tpo -c -o vibration.lo `test -f 'extraFunctions/vibration.c' || echo '$(srcdir)/'`extraFunctions/vibration.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/vibration.Tpo $(DEPDIR)/vibration.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraFunctions/vibration.c' object='vibration.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vibration.lo `test -f 'extraFunctions/vibration.c' || echo '$(srcdir)/'`extraFunctions/vibration.c gtk_dumpDialogWidget.lo: extraGtkFunctions/gtk_dumpDialogWidget.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gtk_dumpDialogWidget.lo -MD -MP -MF $(DEPDIR)/gtk_dumpDialogWidget.Tpo -c -o gtk_dumpDialogWidget.lo `test -f 'extraGtkFunctions/gtk_dumpDialogWidget.c' || echo '$(srcdir)/'`extraGtkFunctions/gtk_dumpDialogWidget.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/gtk_dumpDialogWidget.Tpo $(DEPDIR)/gtk_dumpDialogWidget.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraGtkFunctions/gtk_dumpDialogWidget.c' object='gtk_dumpDialogWidget.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gtk_dumpDialogWidget.lo `test -f 'extraGtkFunctions/gtk_dumpDialogWidget.c' || echo '$(srcdir)/'`extraGtkFunctions/gtk_dumpDialogWidget.c panelElements.lo: panelModules/panelElements.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT panelElements.lo -MD -MP -MF $(DEPDIR)/panelElements.Tpo -c -o panelElements.lo `test -f 'panelModules/panelElements.c' || echo '$(srcdir)/'`panelModules/panelElements.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/panelElements.Tpo $(DEPDIR)/panelElements.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='panelModules/panelElements.c' object='panelElements.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o panelElements.lo `test -f 'panelModules/panelElements.c' || echo '$(srcdir)/'`panelModules/panelElements.c gtkAtomic.lo: panelModules/gtkAtomic.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gtkAtomic.lo -MD -MP -MF $(DEPDIR)/gtkAtomic.Tpo -c -o gtkAtomic.lo `test -f 'panelModules/gtkAtomic.c' || echo '$(srcdir)/'`panelModules/gtkAtomic.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/gtkAtomic.Tpo $(DEPDIR)/gtkAtomic.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='panelModules/gtkAtomic.c' object='gtkAtomic.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gtkAtomic.lo `test -f 'panelModules/gtkAtomic.c' || echo '$(srcdir)/'`panelModules/gtkAtomic.c gtkSpin.lo: panelModules/gtkSpin.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gtkSpin.lo -MD -MP -MF $(DEPDIR)/gtkSpin.Tpo -c -o gtkSpin.lo `test -f 'panelModules/gtkSpin.c' || echo '$(srcdir)/'`panelModules/gtkSpin.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/gtkSpin.Tpo $(DEPDIR)/gtkSpin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='panelModules/gtkSpin.c' object='gtkSpin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gtkSpin.lo `test -f 'panelModules/gtkSpin.c' || echo '$(srcdir)/'`panelModules/gtkSpin.c panelConfig.lo: panelModules/panelConfig.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT panelConfig.lo -MD -MP -MF $(DEPDIR)/panelConfig.Tpo -c -o panelConfig.lo `test -f 'panelModules/panelConfig.c' || echo '$(srcdir)/'`panelModules/panelConfig.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/panelConfig.Tpo $(DEPDIR)/panelConfig.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='panelModules/panelConfig.c' object='panelConfig.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o panelConfig.lo `test -f 'panelModules/panelConfig.c' || echo '$(srcdir)/'`panelModules/panelConfig.c panelOpenGL.lo: panelModules/panelOpenGL.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT panelOpenGL.lo -MD -MP -MF $(DEPDIR)/panelOpenGL.Tpo -c -o panelOpenGL.lo `test -f 'panelModules/panelOpenGL.c' || echo '$(srcdir)/'`panelModules/panelOpenGL.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/panelOpenGL.Tpo $(DEPDIR)/panelOpenGL.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='panelModules/panelOpenGL.c' object='panelOpenGL.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o panelOpenGL.lo `test -f 'panelModules/panelOpenGL.c' || echo '$(srcdir)/'`panelModules/panelOpenGL.c panelGeometry.lo: panelModules/panelGeometry.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT panelGeometry.lo -MD -MP -MF $(DEPDIR)/panelGeometry.Tpo -c -o panelGeometry.lo `test -f 'panelModules/panelGeometry.c' || echo '$(srcdir)/'`panelModules/panelGeometry.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/panelGeometry.Tpo $(DEPDIR)/panelGeometry.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='panelModules/panelGeometry.c' object='panelGeometry.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o panelGeometry.lo `test -f 'panelModules/panelGeometry.c' || echo '$(srcdir)/'`panelModules/panelGeometry.c panelAxes.lo: panelModules/panelAxes.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT panelAxes.lo -MD -MP -MF $(DEPDIR)/panelAxes.Tpo -c -o panelAxes.lo `test -f 'panelModules/panelAxes.c' || echo '$(srcdir)/'`panelModules/panelAxes.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/panelAxes.Tpo $(DEPDIR)/panelAxes.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='panelModules/panelAxes.c' object='panelAxes.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o panelAxes.lo `test -f 'panelModules/panelAxes.c' || echo '$(srcdir)/'`panelModules/panelAxes.c panelFogBgColor.lo: panelModules/panelFogBgColor.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT panelFogBgColor.lo -MD -MP -MF $(DEPDIR)/panelFogBgColor.Tpo -c -o panelFogBgColor.lo `test -f 'panelModules/panelFogBgColor.c' || echo '$(srcdir)/'`panelModules/panelFogBgColor.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/panelFogBgColor.Tpo $(DEPDIR)/panelFogBgColor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='panelModules/panelFogBgColor.c' object='panelFogBgColor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o panelFogBgColor.lo `test -f 'panelModules/panelFogBgColor.c' || echo '$(srcdir)/'`panelModules/panelFogBgColor.c panelBrowser.lo: panelModules/panelBrowser.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT panelBrowser.lo -MD -MP -MF $(DEPDIR)/panelBrowser.Tpo -c -o panelBrowser.lo `test -f 'panelModules/panelBrowser.c' || echo '$(srcdir)/'`panelModules/panelBrowser.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/panelBrowser.Tpo $(DEPDIR)/panelBrowser.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='panelModules/panelBrowser.c' object='panelBrowser.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o panelBrowser.lo `test -f 'panelModules/panelBrowser.c' || echo '$(srcdir)/'`panelModules/panelBrowser.c panelDataFile.lo: panelModules/panelDataFile.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT panelDataFile.lo -MD -MP -MF $(DEPDIR)/panelDataFile.Tpo -c -o panelDataFile.lo `test -f 'panelModules/panelDataFile.c' || echo '$(srcdir)/'`panelModules/panelDataFile.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/panelDataFile.Tpo $(DEPDIR)/panelDataFile.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='panelModules/panelDataFile.c' object='panelDataFile.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o panelDataFile.lo `test -f 'panelModules/panelDataFile.c' || echo '$(srcdir)/'`panelModules/panelDataFile.c panelPlanes.lo: panelModules/panelPlanes.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT panelPlanes.lo -MD -MP -MF $(DEPDIR)/panelPlanes.Tpo -c -o panelPlanes.lo `test -f 'panelModules/panelPlanes.c' || echo '$(srcdir)/'`panelModules/panelPlanes.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/panelPlanes.Tpo $(DEPDIR)/panelPlanes.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='panelModules/panelPlanes.c' object='panelPlanes.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o panelPlanes.lo `test -f 'panelModules/panelPlanes.c' || echo '$(srcdir)/'`panelModules/panelPlanes.c panelSurfaces.lo: panelModules/panelSurfaces.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT panelSurfaces.lo -MD -MP -MF $(DEPDIR)/panelSurfaces.Tpo -c -o panelSurfaces.lo `test -f 'panelModules/panelSurfaces.c' || echo '$(srcdir)/'`panelModules/panelSurfaces.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/panelSurfaces.Tpo $(DEPDIR)/panelSurfaces.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='panelModules/panelSurfaces.c' object='panelSurfaces.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o panelSurfaces.lo `test -f 'panelModules/panelSurfaces.c' || echo '$(srcdir)/'`panelModules/panelSurfaces.c panelSurfacesTools.lo: panelModules/panelSurfacesTools.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT panelSurfacesTools.lo -MD -MP -MF $(DEPDIR)/panelSurfacesTools.Tpo -c -o panelSurfacesTools.lo `test -f 'panelModules/panelSurfacesTools.c' || echo '$(srcdir)/'`panelModules/panelSurfacesTools.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/panelSurfacesTools.Tpo $(DEPDIR)/panelSurfacesTools.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='panelModules/panelSurfacesTools.c' object='panelSurfacesTools.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o panelSurfacesTools.lo `test -f 'panelModules/panelSurfacesTools.c' || echo '$(srcdir)/'`panelModules/panelSurfacesTools.c panelMethod.lo: panelModules/panelMethod.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT panelMethod.lo -MD -MP -MF $(DEPDIR)/panelMethod.Tpo -c -o panelMethod.lo `test -f 'panelModules/panelMethod.c' || echo '$(srcdir)/'`panelModules/panelMethod.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/panelMethod.Tpo $(DEPDIR)/panelMethod.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='panelModules/panelMethod.c' object='panelMethod.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o panelMethod.lo `test -f 'panelModules/panelMethod.c' || echo '$(srcdir)/'`panelModules/panelMethod.c panelMap.lo: panelModules/panelMap.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT panelMap.lo -MD -MP -MF $(DEPDIR)/panelMap.Tpo -c -o panelMap.lo `test -f 'panelModules/panelMap.c' || echo '$(srcdir)/'`panelModules/panelMap.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/panelMap.Tpo $(DEPDIR)/panelMap.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='panelModules/panelMap.c' object='panelMap.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o panelMap.lo `test -f 'panelModules/panelMap.c' || echo '$(srcdir)/'`panelModules/panelMap.c panelVibration.lo: panelModules/panelVibration.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT panelVibration.lo -MD -MP -MF $(DEPDIR)/panelVibration.Tpo -c -o panelVibration.lo `test -f 'panelModules/panelVibration.c' || echo '$(srcdir)/'`panelModules/panelVibration.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/panelVibration.Tpo $(DEPDIR)/panelVibration.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='panelModules/panelVibration.c' object='panelVibration.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o panelVibration.lo `test -f 'panelModules/panelVibration.c' || echo '$(srcdir)/'`panelModules/panelVibration.c gtk_colorComboBoxWidget.lo: extraGtkFunctions/gtk_colorComboBoxWidget.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gtk_colorComboBoxWidget.lo -MD -MP -MF $(DEPDIR)/gtk_colorComboBoxWidget.Tpo -c -o gtk_colorComboBoxWidget.lo `test -f 'extraGtkFunctions/gtk_colorComboBoxWidget.c' || echo '$(srcdir)/'`extraGtkFunctions/gtk_colorComboBoxWidget.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/gtk_colorComboBoxWidget.Tpo $(DEPDIR)/gtk_colorComboBoxWidget.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraGtkFunctions/gtk_colorComboBoxWidget.c' object='gtk_colorComboBoxWidget.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gtk_colorComboBoxWidget.lo `test -f 'extraGtkFunctions/gtk_colorComboBoxWidget.c' || echo '$(srcdir)/'`extraGtkFunctions/gtk_colorComboBoxWidget.c gtk_toolPanelWidget.lo: extraGtkFunctions/gtk_toolPanelWidget.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gtk_toolPanelWidget.lo -MD -MP -MF $(DEPDIR)/gtk_toolPanelWidget.Tpo -c -o gtk_toolPanelWidget.lo `test -f 'extraGtkFunctions/gtk_toolPanelWidget.c' || echo '$(srcdir)/'`extraGtkFunctions/gtk_toolPanelWidget.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/gtk_toolPanelWidget.Tpo $(DEPDIR)/gtk_toolPanelWidget.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraGtkFunctions/gtk_toolPanelWidget.c' object='gtk_toolPanelWidget.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gtk_toolPanelWidget.lo `test -f 'extraGtkFunctions/gtk_toolPanelWidget.c' || echo '$(srcdir)/'`extraGtkFunctions/gtk_toolPanelWidget.c gtk_orientationChooser.lo: extraGtkFunctions/gtk_orientationChooser.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gtk_orientationChooser.lo -MD -MP -MF $(DEPDIR)/gtk_orientationChooser.Tpo -c -o gtk_orientationChooser.lo `test -f 'extraGtkFunctions/gtk_orientationChooser.c' || echo '$(srcdir)/'`extraGtkFunctions/gtk_orientationChooser.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/gtk_orientationChooser.Tpo $(DEPDIR)/gtk_orientationChooser.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraGtkFunctions/gtk_orientationChooser.c' object='gtk_orientationChooser.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gtk_orientationChooser.lo `test -f 'extraGtkFunctions/gtk_orientationChooser.c' || echo '$(srcdir)/'`extraGtkFunctions/gtk_orientationChooser.c gtk_numericalEntryWidget.lo: extraGtkFunctions/gtk_numericalEntryWidget.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gtk_numericalEntryWidget.lo -MD -MP -MF $(DEPDIR)/gtk_numericalEntryWidget.Tpo -c -o gtk_numericalEntryWidget.lo `test -f 'extraGtkFunctions/gtk_numericalEntryWidget.c' || echo '$(srcdir)/'`extraGtkFunctions/gtk_numericalEntryWidget.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/gtk_numericalEntryWidget.Tpo $(DEPDIR)/gtk_numericalEntryWidget.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraGtkFunctions/gtk_numericalEntryWidget.c' object='gtk_numericalEntryWidget.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gtk_numericalEntryWidget.lo `test -f 'extraGtkFunctions/gtk_numericalEntryWidget.c' || echo '$(srcdir)/'`extraGtkFunctions/gtk_numericalEntryWidget.c gtk_shadeComboBoxWidget.lo: extraGtkFunctions/gtk_shadeComboBoxWidget.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gtk_shadeComboBoxWidget.lo -MD -MP -MF $(DEPDIR)/gtk_shadeComboBoxWidget.Tpo -c -o gtk_shadeComboBoxWidget.lo `test -f 'extraGtkFunctions/gtk_shadeComboBoxWidget.c' || echo '$(srcdir)/'`extraGtkFunctions/gtk_shadeComboBoxWidget.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/gtk_shadeComboBoxWidget.Tpo $(DEPDIR)/gtk_shadeComboBoxWidget.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraGtkFunctions/gtk_shadeComboBoxWidget.c' object='gtk_shadeComboBoxWidget.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gtk_shadeComboBoxWidget.lo `test -f 'extraGtkFunctions/gtk_shadeComboBoxWidget.c' || echo '$(srcdir)/'`extraGtkFunctions/gtk_shadeComboBoxWidget.c gtk_elementComboBox.lo: extraGtkFunctions/gtk_elementComboBox.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gtk_elementComboBox.lo -MD -MP -MF $(DEPDIR)/gtk_elementComboBox.Tpo -c -o gtk_elementComboBox.lo `test -f 'extraGtkFunctions/gtk_elementComboBox.c' || echo '$(srcdir)/'`extraGtkFunctions/gtk_elementComboBox.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/gtk_elementComboBox.Tpo $(DEPDIR)/gtk_elementComboBox.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraGtkFunctions/gtk_elementComboBox.c' object='gtk_elementComboBox.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gtk_elementComboBox.lo `test -f 'extraGtkFunctions/gtk_elementComboBox.c' || echo '$(srcdir)/'`extraGtkFunctions/gtk_elementComboBox.c gtk_stippleComboBoxWidget.lo: extraGtkFunctions/gtk_stippleComboBoxWidget.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gtk_stippleComboBoxWidget.lo -MD -MP -MF $(DEPDIR)/gtk_stippleComboBoxWidget.Tpo -c -o gtk_stippleComboBoxWidget.lo `test -f 'extraGtkFunctions/gtk_stippleComboBoxWidget.c' || echo '$(srcdir)/'`extraGtkFunctions/gtk_stippleComboBoxWidget.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/gtk_stippleComboBoxWidget.Tpo $(DEPDIR)/gtk_stippleComboBoxWidget.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraGtkFunctions/gtk_stippleComboBoxWidget.c' object='gtk_stippleComboBoxWidget.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gtk_stippleComboBoxWidget.lo `test -f 'extraGtkFunctions/gtk_stippleComboBoxWidget.c' || echo '$(srcdir)/'`extraGtkFunctions/gtk_stippleComboBoxWidget.c gtk_lineObjectWidget.lo: extraGtkFunctions/gtk_lineObjectWidget.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gtk_lineObjectWidget.lo -MD -MP -MF $(DEPDIR)/gtk_lineObjectWidget.Tpo -c -o gtk_lineObjectWidget.lo `test -f 'extraGtkFunctions/gtk_lineObjectWidget.c' || echo '$(srcdir)/'`extraGtkFunctions/gtk_lineObjectWidget.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/gtk_lineObjectWidget.Tpo $(DEPDIR)/gtk_lineObjectWidget.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraGtkFunctions/gtk_lineObjectWidget.c' object='gtk_lineObjectWidget.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gtk_lineObjectWidget.lo `test -f 'extraGtkFunctions/gtk_lineObjectWidget.c' || echo '$(srcdir)/'`extraGtkFunctions/gtk_lineObjectWidget.c gtk_valueIOWidget.lo: extraGtkFunctions/gtk_valueIOWidget.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gtk_valueIOWidget.lo -MD -MP -MF $(DEPDIR)/gtk_valueIOWidget.Tpo -c -o gtk_valueIOWidget.lo `test -f 'extraGtkFunctions/gtk_valueIOWidget.c' || echo '$(srcdir)/'`extraGtkFunctions/gtk_valueIOWidget.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/gtk_valueIOWidget.Tpo $(DEPDIR)/gtk_valueIOWidget.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraGtkFunctions/gtk_valueIOWidget.c' object='gtk_valueIOWidget.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gtk_valueIOWidget.lo `test -f 'extraGtkFunctions/gtk_valueIOWidget.c' || echo '$(srcdir)/'`extraGtkFunctions/gtk_valueIOWidget.c gtk_curveWidget.lo: extraGtkFunctions/gtk_curveWidget.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gtk_curveWidget.lo -MD -MP -MF $(DEPDIR)/gtk_curveWidget.Tpo -c -o gtk_curveWidget.lo `test -f 'extraGtkFunctions/gtk_curveWidget.c' || echo '$(srcdir)/'`extraGtkFunctions/gtk_curveWidget.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/gtk_curveWidget.Tpo $(DEPDIR)/gtk_curveWidget.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraGtkFunctions/gtk_curveWidget.c' object='gtk_curveWidget.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gtk_curveWidget.lo `test -f 'extraGtkFunctions/gtk_curveWidget.c' || echo '$(srcdir)/'`extraGtkFunctions/gtk_curveWidget.c gtk_fieldChooser.lo: extraGtkFunctions/gtk_fieldChooser.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gtk_fieldChooser.lo -MD -MP -MF $(DEPDIR)/gtk_fieldChooser.Tpo -c -o gtk_fieldChooser.lo `test -f 'extraGtkFunctions/gtk_fieldChooser.c' || echo '$(srcdir)/'`extraGtkFunctions/gtk_fieldChooser.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/gtk_fieldChooser.Tpo $(DEPDIR)/gtk_fieldChooser.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraGtkFunctions/gtk_fieldChooser.c' object='gtk_fieldChooser.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gtk_fieldChooser.lo `test -f 'extraGtkFunctions/gtk_fieldChooser.c' || echo '$(srcdir)/'`extraGtkFunctions/gtk_fieldChooser.c gtk_cylinder.lo: pairsModeling/gtk_cylinder.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gtk_cylinder.lo -MD -MP -MF $(DEPDIR)/gtk_cylinder.Tpo -c -o gtk_cylinder.lo `test -f 'pairsModeling/gtk_cylinder.c' || echo '$(srcdir)/'`pairsModeling/gtk_cylinder.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/gtk_cylinder.Tpo $(DEPDIR)/gtk_cylinder.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pairsModeling/gtk_cylinder.c' object='gtk_cylinder.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gtk_cylinder.lo `test -f 'pairsModeling/gtk_cylinder.c' || echo '$(srcdir)/'`pairsModeling/gtk_cylinder.c gtk_wire.lo: pairsModeling/gtk_wire.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gtk_wire.lo -MD -MP -MF $(DEPDIR)/gtk_wire.Tpo -c -o gtk_wire.lo `test -f 'pairsModeling/gtk_wire.c' || echo '$(srcdir)/'`pairsModeling/gtk_wire.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/gtk_wire.Tpo $(DEPDIR)/gtk_wire.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pairsModeling/gtk_wire.c' object='gtk_wire.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gtk_wire.lo `test -f 'pairsModeling/gtk_wire.c' || echo '$(srcdir)/'`pairsModeling/gtk_wire.c surfaces_tests.o: extraFunctions/surfaces_tests.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT surfaces_tests.o -MD -MP -MF $(DEPDIR)/surfaces_tests.Tpo -c -o surfaces_tests.o `test -f 'extraFunctions/surfaces_tests.c' || echo '$(srcdir)/'`extraFunctions/surfaces_tests.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/surfaces_tests.Tpo $(DEPDIR)/surfaces_tests.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraFunctions/surfaces_tests.c' object='surfaces_tests.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o surfaces_tests.o `test -f 'extraFunctions/surfaces_tests.c' || echo '$(srcdir)/'`extraFunctions/surfaces_tests.c surfaces_tests.obj: extraFunctions/surfaces_tests.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT surfaces_tests.obj -MD -MP -MF $(DEPDIR)/surfaces_tests.Tpo -c -o surfaces_tests.obj `if test -f 'extraFunctions/surfaces_tests.c'; then $(CYGPATH_W) 'extraFunctions/surfaces_tests.c'; else $(CYGPATH_W) '$(srcdir)/extraFunctions/surfaces_tests.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/surfaces_tests.Tpo $(DEPDIR)/surfaces_tests.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='extraFunctions/surfaces_tests.c' object='surfaces_tests.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o surfaces_tests.obj `if test -f 'extraFunctions/surfaces_tests.c'; then $(CYGPATH_W) 'extraFunctions/surfaces_tests.c'; else $(CYGPATH_W) '$(srcdir)/extraFunctions/surfaces_tests.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-girDATA: $(gir_DATA) @$(NORMAL_INSTALL) test -z "$(girdir)" || $(MKDIR_P) "$(DESTDIR)$(girdir)" @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(girdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(girdir)" || exit $$?; \ done uninstall-girDATA: @$(NORMAL_UNINSTALL) @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(girdir)'; $(am__uninstall_files_from_dir) install-visutypelibsDATA: $(visutypelibs_DATA) @$(NORMAL_INSTALL) test -z "$(visutypelibsdir)" || $(MKDIR_P) "$(DESTDIR)$(visutypelibsdir)" @list='$(visutypelibs_DATA)'; test -n "$(visutypelibsdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(visutypelibsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(visutypelibsdir)" || exit $$?; \ done uninstall-visutypelibsDATA: @$(NORMAL_UNINSTALL) @list='$(visutypelibs_DATA)'; test -n "$(visutypelibsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(visutypelibsdir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list=' $(TESTS) '; \ $(am__tty_colors); \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ col=$$red; res=XPASS; \ ;; \ *) \ col=$$grn; res=PASS; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xfail=`expr $$xfail + 1`; \ col=$$lgn; res=XFAIL; \ ;; \ *) \ failed=`expr $$failed + 1`; \ col=$$red; res=FAIL; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ col=$$blu; res=SKIP; \ fi; \ echo "$${col}$$res$${std}: $$tst"; \ done; \ if test "$$all" -eq 1; then \ tests="test"; \ All=""; \ else \ tests="tests"; \ All="All "; \ fi; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="$$All$$all $$tests passed"; \ else \ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all $$tests failed"; \ else \ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ if test "$$skip" -eq 1; then \ skipped="($$skip test was not run)"; \ else \ skipped="($$skip tests were not run)"; \ fi; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ if test "$$failed" -eq 0; then \ col="$$grn"; \ else \ col="$$red"; \ fi; \ echo "$${col}$$dashes$${std}"; \ echo "$${col}$$banner$${std}"; \ test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \ test -z "$$report" || echo "$${col}$$report$${std}"; \ echo "$${col}$$dashes$${std}"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA) install-binPROGRAMS: install-libLTLIBRARIES installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(visutypelibsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ clean-libLTLIBRARIES clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-girDATA install-visutypelibsDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-girDATA \ uninstall-libLTLIBRARIES uninstall-visutypelibsDATA .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ clean-libLTLIBRARIES clean-libtool clean-noinstLTLIBRARIES \ ctags distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-girDATA install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip \ install-visutypelibsDATA installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-girDATA \ uninstall-libLTLIBRARIES uninstall-visutypelibsDATA vpath %.xpm $(top_srcdir) @WITH_GOBJECT_INTROSPECTION_TRUE@$(gir_DATA): $(G_IR_SCANNER) $(PACKAGE_TARNAME) @WITH_GOBJECT_INTROSPECTION_TRUE@ $(G_IR_SCANNER) -v --warn-all \ @WITH_GOBJECT_INTROSPECTION_TRUE@ --namespace v_sim \ @WITH_GOBJECT_INTROSPECTION_TRUE@ --symbol-prefix=visu --identifier-prefix=Visu \ @WITH_GOBJECT_INTROSPECTION_TRUE@ --symbol-prefix=tool --identifier-prefix=Tool \ @WITH_GOBJECT_INTROSPECTION_TRUE@ --nsversion "$(V_SIM_MAJOR_VERSION).$(V_SIM_MINOR_VERSION)" \ @WITH_GOBJECT_INTROSPECTION_TRUE@ --add-include-path=$(girdir) \ @WITH_GOBJECT_INTROSPECTION_TRUE@ --include GObject-2.0 \ @WITH_GOBJECT_INTROSPECTION_TRUE@ --include GLib-2.0 \ @WITH_GOBJECT_INTROSPECTION_TRUE@ --include GModule-2.0 \ @WITH_GOBJECT_INTROSPECTION_TRUE@ --include cairo-1.0 \ @WITH_GOBJECT_INTROSPECTION_TRUE@ --include xlib-2.0 \ @WITH_GOBJECT_INTROSPECTION_TRUE@ --include GL-1.0 \ @WITH_GOBJECT_INTROSPECTION_TRUE@ --include Gtk-3.0 \ @WITH_GOBJECT_INTROSPECTION_TRUE@ --output=$(gir_DATA) $(USE_EXTERNAL) \ @WITH_GOBJECT_INTROSPECTION_TRUE@ --program=$(builddir)/$(PACKAGE_TARNAME) \ @WITH_GOBJECT_INTROSPECTION_TRUE@ -I$(srcdir) -I$(top_builddir) $(GTKS_CFLAGS) \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/OSOpenGL/visu_openGL.c $(srcdir)/OSOpenGL/visu_openGL.h \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/OSOpenGL/visu_GLX.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/renderingBackend/visu_actionInterface.h \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/coreTools/toolOptions.h $(srcdir)/coreTools/toolOptions.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/coreTools/toolColor.h $(srcdir)/coreTools/toolColor.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/coreTools/toolShade.h $(srcdir)/coreTools/toolShade.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/coreTools/toolMatrix.h $(srcdir)/coreTools/toolMatrix.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/coreTools/toolPhysic.h $(srcdir)/coreTools/toolPhysic.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/coreTools/toolFileFormat.h $(srcdir)/coreTools/toolFileFormat.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/coreTools/toolFortran.h $(srcdir)/coreTools/toolFortran.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extensions/nodes.h $(srcdir)/extensions/nodes.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extensions/infos.h $(srcdir)/extensions/infos.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extensions/marks.h $(srcdir)/extensions/marks.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extensions/axes.h $(srcdir)/extensions/axes.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extensions/box.h $(srcdir)/extensions/box.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extensions/legend.h $(srcdir)/extensions/legend.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extensions/pairs.h $(srcdir)/extensions/pairs.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extensions/shade.h $(srcdir)/extensions/shade.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extensions/frame.h $(srcdir)/extensions/frame.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extensions/planes.h $(srcdir)/extensions/planes.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extensions/node_vectors.h $(srcdir)/extensions/node_vectors.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extensions/fogAndBGColor.h $(srcdir)/extensions/fogAndBGColor.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extensions/scale.h $(srcdir)/extensions/scale.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extensions/surfs.h $(srcdir)/extensions/surfs.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extensions/maps.h $(srcdir)/extensions/maps.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extensions/paths.h $(srcdir)/extensions/paths.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extensions/forces.h $(srcdir)/extensions/forces.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extraFunctions/surfaces_points.h $(srcdir)/extraFunctions/surfaces_points.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extraFunctions/surfaces_resources.h $(srcdir)/extraFunctions/surfaces_resources.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extraFunctions/surfaces.h $(srcdir)/extraFunctions/surfaces.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extraFunctions/pot2surf.h $(srcdir)/extraFunctions/pot2surf.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extraFunctions/plane.h $(srcdir)/extraFunctions/plane.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extraFunctions/dataFile.h $(srcdir)/extraFunctions/dataFile.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extraFunctions/geometry.h $(srcdir)/extraFunctions/geometry.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extraFunctions/isoline.h $(srcdir)/extraFunctions/isoline.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extraFunctions/map.h $(srcdir)/extraFunctions/map.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extraFunctions/vibration.h $(srcdir)/extraFunctions/vibration.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extraFunctions/scalarFields.h $(srcdir)/extraFunctions/scalarFields.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extraFunctions/dataNode.h $(srcdir)/extraFunctions/dataNode.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extraFunctions/extraNode.h $(srcdir)/extraFunctions/extraNode.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/openGLFunctions/renderingMode.h $(srcdir)/openGLFunctions/renderingMode.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/openGLFunctions/light.c $(srcdir)/openGLFunctions/light.h \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/openGLFunctions/text.c $(srcdir)/openGLFunctions/text.h \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/openGLFunctions/objectList.c $(srcdir)/openGLFunctions/objectList.h \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/openGLFunctions/interactive.c $(srcdir)/openGLFunctions/interactive.h \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/openGLFunctions/view.c $(srcdir)/openGLFunctions/view.h \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/renderingMethods/renderingAtomic.h $(srcdir)/renderingMethods/renderingAtomic.c\ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/renderingMethods/renderingSpin.h $(srcdir)/renderingMethods/renderingSpin.c\ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/dumpModules/dumpToAscii.c $(srcdir)/dumpModules/dumpToAscii.h \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/dumpModules/dumpThroughGdkPixbuf.c $(srcdir)/dumpModules/dumpThroughGdkPixbuf.h \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/dumpModules/dumpToTiff.c $(srcdir)/dumpModules/dumpToTiff.h \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/dumpModules/dumpToSVG.c $(srcdir)/dumpModules/dumpToSVG.h \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/dumpModules/dumpToXyz.c $(srcdir)/dumpModules/dumpToXyz.h \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/dumpModules/dumpToABINIT.c $(srcdir)/dumpModules/dumpToABINIT.h \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/dumpModules/dumpToSVG.c $(srcdir)/dumpModules/dumpToSVG.h \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/dumpModules/dumpToPsAndPdf.c $(srcdir)/dumpModules/dumpToPsAndPdf.h \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/iface_boxed.h $(srcdir)/iface_boxed.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/visu_object.h $(srcdir)/visu_object.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/visu_configFile.h $(srcdir)/visu_configFile.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/visu_rendering.h $(srcdir)/visu_rendering.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/visu_basic.h $(srcdir)/visu_basic.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/visu_extension.h $(srcdir)/visu_extension.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/visu_dump.h $(srcdir)/visu_dump.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/visu_pairs.h $(srcdir)/visu_pairs.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/visu_plugins.h $(srcdir)/visu_plugins.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/visu_tools.h $(srcdir)/visu_tools.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/visu_elements.c $(srcdir)/visu_elements.h \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/visu_nodes.c $(srcdir)/visu_nodes.h \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/visu_box.c $(srcdir)/visu_box.h \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/visu_data.c $(srcdir)/visu_data.h \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/visu_extension.c $(srcdir)/visu_extension.h \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/opengl.c $(srcdir)/opengl.h \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extraGtkFunctions/gtk_dumpDialogWidget.h $(srcdir)/extraGtkFunctions/gtk_dumpDialogWidget.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extraGtkFunctions/gtk_toolPanelWidget.h $(srcdir)/extraGtkFunctions/gtk_toolPanelWidget.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extraGtkFunctions/gtk_numericalEntryWidget.h $(srcdir)/extraGtkFunctions/gtk_numericalEntryWidget.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extraGtkFunctions/gtk_colorComboBoxWidget.h $(srcdir)/extraGtkFunctions/gtk_colorComboBoxWidget.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/extraGtkFunctions/gtk_elementComboBox.h $(srcdir)/extraGtkFunctions/gtk_elementComboBox.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/panelModules/panelSurfaces.h $(srcdir)/panelModules/panelSurfaces.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/panelModules/panelPlanes.h $(srcdir)/panelModules/panelPlanes.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/panelModules/panelDataFile.h $(srcdir)/panelModules/panelDataFile.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/panelModules/panelElements.h $(srcdir)/panelModules/panelElements.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/panelModules/panelGeometry.h $(srcdir)/panelModules/panelGeometry.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/panelModules/panelConfig.h $(srcdir)/panelModules/panelConfig.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/panelModules/panelMap.h $(srcdir)/panelModules/panelMap.c \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/gtk_renderingWindowWidget.c $(srcdir)/gtk_renderingWindowWidget.h \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/visu_gtk.c $(srcdir)/visu_gtk.h \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/gtk_openGLWidget.c $(srcdir)/gtk_openGLWidget.h \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/gtk_pairs.c $(srcdir)/gtk_pairs.h \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(srcdir)/gtk_main.c $(srcdir)/gtk_main.h @WITH_GOBJECT_INTROSPECTION_TRUE@$(visutypelibs_DATA): $(gir_DATA) $(G_IR_COMPILER) @WITH_GOBJECT_INTROSPECTION_TRUE@ $(G_IR_COMPILER) \ @WITH_GOBJECT_INTROSPECTION_TRUE@ --includedir=. \ @WITH_GOBJECT_INTROSPECTION_TRUE@ --verbose \ @WITH_GOBJECT_INTROSPECTION_TRUE@ -o $(visutypelibs_DATA) \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(gir_DATA) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: v_sim-3.7.0/src/iface_boxed.c0000644000353400050620000001016312215553327012752 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse mèl : BILLARD, non joignable par mèl ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "iface_boxed.h" #include "config.h" /** * SECTION:iface_boxed * @short_description: Defines a common interface for objects with a #VisuBox. * @See_also: #VisuBox, #VisuData, #VisuPlane, #VisuSurfaces, #VisuScalarField * and #VisuGlView * * */ /** * VisuBoxedInterface: * @parent: yet, its parent. * @get_box: a routine to get a pointer on the #VisuBox. * @set_box: a routine to set a #VisuBox to a #VisuBoxed object. * * The different routines common to objects implementing a #VisuBoxed interface. * * Since: 3.7 */ enum { SET_BOX_SIGNAL, NB_SIGNAL }; /* Internal variables. */ static guint _signals[NB_SIGNAL] = { 0 }; /* Boxed interface. */ G_DEFINE_INTERFACE(VisuBoxed, visu_boxed, G_TYPE_OBJECT) static void visu_boxed_default_init(VisuBoxedInterface *iface) { /** * VisuBoxed::setBox: * @boxed: the object which received the signal. * * Gets emitted when the bounding box is changed. * * Since: 3.7 */ _signals[SET_BOX_SIGNAL] = g_signal_new("setBox", G_TYPE_FROM_INTERFACE (iface), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } /** * visu_boxed_getBox: * @self: a #VisuBoxed object. * * Retrieves the #VisuBox of @self. * * Since: 3.7 * * Returns: (transfer none): the #VisuBox of @self. **/ VisuBox* visu_boxed_getBox(VisuBoxed *self) { g_return_val_if_fail(VISU_IS_BOXED(self), (VisuBox*)0); return VISU_BOXED_GET_INTERFACE(self)->get_box(self); } /** * visu_boxed_setBox: * @self: a #VisuBoxed object. * @box: (transfer none): a #VisuBoxed object. * @update: a boolean. * * Attach the #VisuBox of @box to @boxed. If @update is %TRUE, coordinates inside * @boxed are updated to fit into the new #VisuBox. A reference is * taken on the #VisuBox of @box. This routine emits #VisuBoxed::setBox * signal if the @self has changed its #VisuBox. * * Since: 3.7 * * Returns: FALSE @boxed was already boxed with the #VisuBox of @box. **/ gboolean visu_boxed_setBox(VisuBoxed *self, VisuBoxed *box, gboolean update) { VisuBox *boxObj; gboolean res; g_return_val_if_fail(VISU_IS_BOXED(self), FALSE); boxObj = visu_boxed_getBox(box); res = VISU_BOXED_GET_INTERFACE(self)->set_box(self, boxObj, update); if (res) g_signal_emit(G_OBJECT(self), _signals[SET_BOX_SIGNAL], 0, NULL); return res; } v_sim-3.7.0/src/iface_boxed.h0000644000353400050620000000527212215553640012762 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse mèl : BILLARD, non joignable par mèl ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef IFACE_BOXED_H #define IFACE_BOXED_H #include #include #include "visu_box.h" G_BEGIN_DECLS /* Boxed interface. */ #define VISU_TYPE_BOXED (visu_boxed_get_type ()) #define VISU_BOXED(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VISU_TYPE_BOXED, VisuBoxed)) #define VISU_IS_BOXED(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VISU_TYPE_BOXED)) #define VISU_BOXED_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), VISU_TYPE_BOXED, VisuBoxedInterface)) typedef struct _VisuBoxed VisuBoxed; /* dummy object */ typedef struct _VisuBoxedInterface VisuBoxedInterface; struct _VisuBoxedInterface { GTypeInterface parent; VisuBox* (*get_box) (VisuBoxed *self); gboolean (*set_box) (VisuBoxed *self, VisuBox *box, gboolean update); }; GType visu_boxed_get_type (void); VisuBox* visu_boxed_getBox(VisuBoxed *self); gboolean visu_boxed_setBox(VisuBoxed *self, VisuBoxed *box, gboolean update); G_END_DECLS #endif v_sim-3.7.0/src/visu_object.c0000644000353400050620000004350112215546105013034 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse mèl : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "visu_object.h" #include #include #include #include "renderingMethods/renderingAtomic.h" #include "visu_basic.h" /** * SECTION:visu_object * @short_description: A general object to store the signals. * * At the present time, the signals are global to all V_Sim, * owned by a variable include in each parts called visu. This is * wherre these signals are defined. */ /** * VisuObject: * * This structure describes a #VisuObject object. */ struct _VisuObjectPrivate { VisuRendering *render; gboolean loading; GFunc loadMessageFunc; gpointer loadMessageData; }; /** * VisuObjectClass: * @parent: an object to inherit from. * * This structure describes the class #VisuObjectClass. */ /* All signal emit by visu are handled by this ogbject. */ static VisuObject *visu = (VisuObject*)0; enum { COLORNEWAVAILABLE_SIGNAL, SHADENEWAVAILABLE_SIGNAL, DATANEW_SIGNAL, DATALOADED_SIGNAL, DATARENDERED_SIGNAL, DATAUNRENDERED_SIGNAL, VIEWNEW_SIGNAL, RENDERINGCHANGED_SIGNAL, RESOURCESLOADED_SIGNAL, ENTRYPARSED_SIGNAL, OPENGLASKFORREDRAW_SIGNAL, OPENGLFORCEREDRAW_SIGNAL, DIR_SIGNAL, VISU_NB_SIGNAL }; static guint signals[VISU_NB_SIGNAL]; G_DEFINE_TYPE(VisuObject, visu_object, G_TYPE_OBJECT) /* Private marshals. */ static void g_cclosure_marshal_VOID__OBJECT_OBJECT(GClosure *closure, GValue *return_value _U_, guint n_param_values, const GValue *param_values, gpointer invocation_hint _U_, gpointer marshal_data) { typedef void (*callbackFunc)(gpointer data1, gpointer arg_1, gpointer arg_2, gpointer data2); register callbackFunc callback; register GCClosure *cc = (GCClosure*)closure; register gpointer data1, data2; g_return_if_fail(n_param_values == 3); if (G_CCLOSURE_SWAP_DATA(closure)) { data1 = closure->data; data2 = g_value_peek_pointer(param_values + 0); } else { data1 = g_value_peek_pointer(param_values + 0); data2 = closure->data; } callback = (callbackFunc)(size_t)(marshal_data ? marshal_data : cc->callback); callback(data1, g_value_get_object(param_values + 1), g_value_get_object(param_values + 2), data2); } static void visu_object_class_init(VisuObjectClass *klass) { GType paramPointer[1] = {G_TYPE_POINTER}; GType paramObject[1] = {G_TYPE_OBJECT}; GType paramGuint[1] = {G_TYPE_UINT}; DBG_fprintf(stderr, "Visu Object: installing signals.\n"); /** * VisuObject::colorNewAvailable: * @visuObj: the object emitting the signal. * @color: the newly created #ToolColor. * * A new #ToolColor is available. * * Since: 3.2 */ signals[COLORNEWAVAILABLE_SIGNAL] = g_signal_newv ("colorNewAvailable", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, NULL /* class closure */, NULL /* accumulator */, NULL /* accu_data */, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE /* return_type */, 1 /* n_params */, paramPointer /* pointer to the added color */); /** * VisuObject::shadeNewAvailable: * @visuObj: the object emitting the signal. * @shade: the newly created #ToolShade. * * A new #ToolShade is available. * * Since: 3.7 */ signals[SHADENEWAVAILABLE_SIGNAL] = g_signal_new("shadeNewAvailable", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL /* accumulator */, NULL /* accu_data */, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE /* return_type */, 1, G_TYPE_POINTER); /** * VisuObject::dataNew: * @visuObj: the object emitting the signal. * @dataObj: the newly created #VisuData. * * A new #VisuData is available. * * Since: 3.2 */ signals[DATANEW_SIGNAL] = g_signal_newv("dataNew", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, NULL, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, paramObject); /** * VisuObject::dataLoaded: * @visuObj: the object emitting the signal. * @dataObj: the newly created #VisuData. * * The given @dataObj is fully populated and ready for usage. * * Since: 3.1 */ signals[DATALOADED_SIGNAL] = g_signal_newv("dataLoaded", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, NULL, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, paramObject); /** * VisuObject::dataRendered: * @visuObj: the object emitting the signal. * @dataObj: the #VisuData object to be rendered on @view. * @view: the view to render to. * * The given @dataObj is fully set up and ready for rendering (no * further internal modifications will occur). */ signals[DATARENDERED_SIGNAL] = g_signal_new("dataRendered", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0 , NULL, NULL, g_cclosure_marshal_VOID__OBJECT_OBJECT, G_TYPE_NONE, 2, G_TYPE_OBJECT, G_TYPE_OBJECT); /** * VisuObject::dataUnRendered: * @visuObj: the object emitting the signal. * @dataObj: the #VisuData object that was rendered on @view. * @view: the view @dataObj was rendered to. * * The given @dataObj is not rendered anymore on @view. * * Since: 3.7 */ signals[DATAUNRENDERED_SIGNAL] = g_signal_new("dataUnRendered", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0 , NULL, NULL, g_cclosure_marshal_VOID__OBJECT_OBJECT, G_TYPE_NONE, 2, G_TYPE_OBJECT, G_TYPE_OBJECT); /** * VisuObject::renderingChanged: * @visuObj: the object emitting the signal. * @meth: the newly chosen #VisuRendering method. * * The rendering method has been changed. */ signals[RENDERINGCHANGED_SIGNAL] = g_signal_newv ("renderingChanged", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, NULL /* class closure */, NULL /* accumulator */, NULL /* accu_data */, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE /* return_type */, 1 /* n_params */, paramPointer /* param_types */); /** * VisuObject::entryParsed: * @visuObj: the object emitting the signal. * @key: the key that has been parsed. * * The entry @key of a configuration file has just been successfully parsed. * * Since: 3.7 */ signals[ENTRYPARSED_SIGNAL] = g_signal_new("entryParsed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS | G_SIGNAL_DETAILED, 0 , NULL, NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); /** * VisuObject::resourcesLoaded: * @visuObj: the object emitting the signal. * @dataObj: the associated #VisuData. * * The resource file has been read. */ signals[RESOURCESLOADED_SIGNAL] = g_signal_newv ("resourcesLoaded", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, NULL /* class closure */, NULL /* accumulator */, NULL /* accu_data */, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE /* return_type */, 1 /* n_params */, paramObject /* param_types */); /** * VisuObject::OpenGLAskForReDraw: * @visuObj: the object emitting the signal. * * Internal signal, use VISU_REDRAW_ADD() instead. */ signals[OPENGLASKFORREDRAW_SIGNAL] = g_signal_newv ("OpenGLAskForReDraw", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, NULL /* class closure */, NULL /* accumulator */, NULL /* accu_data */, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE /* return_type */, 0 /* n_params */, NULL /* param_types */); /** * VisuObject::OpenGLForceReDraw: * @visuObj: the object emitting the signal. * * Internal signal, use VISU_REDRAW_FORCE() instead. */ signals[OPENGLFORCEREDRAW_SIGNAL] = g_signal_newv ("OpenGLForceReDraw", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, NULL /* class closure */, NULL /* accumulator */, NULL /* accu_data */, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE /* return_type */, 0 /* n_params */, NULL /* param_types */); /** * VisuObject::DirectoryChanged: * @visuObj: the object emitting the signal. * @kind: a flag. * * The current directory has been changed. The kind of directory is * defined by @kind (see #). * * Since: 3.6 */ signals[DIR_SIGNAL] = g_signal_newv ("DirectoryChanged", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, NULL , NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE /* return_type */, 1 /* n_params */, paramGuint /* param_types */); /** * VisuObject::viewNew: * @visuObj: the object emitting the signal. * @view: the newly created #VisuGlView. * * A new #VisuGlView is available. * * Since: 3.7 */ signals[DATANEW_SIGNAL] = g_signal_new("viewNew", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); g_type_class_add_private(klass, sizeof(VisuObjectPrivate)); } static void visu_object_init(VisuObject *obj) { DBG_fprintf(stderr, "Visu Object: creating a new visu (%p).\n", (gpointer)obj); /* Putting the default. */ obj->priv = G_TYPE_INSTANCE_GET_PRIVATE(obj, VISU_TYPE_OBJECT, VisuObjectPrivate); obj->priv->render = visu_rendering_getByName(VISU_RENDERING_ATOMIC_NAME); obj->priv->loading = FALSE; obj->priv->loadMessageFunc = (GFunc)0; obj->priv->loadMessageData = (gpointer)0; } /** * visu_object_redraw: * @data: (allow-none) (type utf8): a string. * * Call the signal OpenGLAskForReDraw. The API is adapted to the routine to be added * in the gloop. Use VISU_REDRAW_ADD instead of this routine. * * Returns: FALSE to stop the emission as soon as done. */ gboolean visu_object_redraw(gpointer data) { if (data) DBG_fprintf(stderr, "Visu Object: '%s' call for redraw.\n", (gchar*)data); g_signal_emit (visu, signals[OPENGLASKFORREDRAW_SIGNAL], 0 /* details */, NULL); return FALSE; } /** * visu_object_redrawForce: * @data: (allow-none) (type utf8): a string. * * Call the signal OpenGLForceReDraw. The API is adapted to the routine to be added * in the gloop. Use VISU_REDRAW_FORCE instead of this routine. * * Returns: FALSE to stop the emission as soon as done. */ gboolean visu_object_redrawForce(gpointer data) { if (data) DBG_fprintf(stderr, "Visu Object: '%s' call for force redraw.\n", (gchar*)data); g_signal_emit(visu, signals[OPENGLFORCEREDRAW_SIGNAL], 0 , NULL); return FALSE; } /** * visu_object_class_getStatic: * * Internal routine to access the #VisuObject object instanciated by * default. Use #VISU_OBJECT_INSTANCE instead. * * Returns: (transfer none): the default #VisuObject used by V_Sim. */ VisuObject* visu_object_class_getStatic() { if (!visu) /* Creating the visu object to handle the signals. */ visu = VISU_OBJECT(g_object_new(VISU_TYPE_OBJECT, NULL)); return visu; } /** * visu_object_setRendering: * @obj: a #VisuObject object. * @method: (transfer full): a #VisuRendering method. * * Choose the method used to render the data. * * Returns: TRUE if the rendering method of @obj is actually changed. */ gboolean visu_object_setRendering(VisuObject *obj, VisuRendering* method) { g_return_val_if_fail(VISU_IS_OBJECT_TYPE(obj), FALSE); g_return_val_if_fail(VISU_IS_RENDERING_TYPE(method), FALSE); DBG_fprintf(stderr, "Visu Object: set the rendering method to '%s' (%p).\n", visu_rendering_getName(method, TRUE), (gpointer)method); if (obj->priv->render == method) return FALSE; if (obj->priv->render) g_object_unref(obj->priv->render); obj->priv->render = method; g_object_ref(method); DBG_fprintf(stderr, "Visu Object: emit method changed (%p).\n", (gpointer)obj); g_signal_emit(obj, signals[RENDERINGCHANGED_SIGNAL], 0, (gpointer)method, NULL); return TRUE; } /** * visu_object_getRendering: * @obj: a #VisuObject object. * * Get the current method used to render the data. * * Returns: (transfer none): the rendering method attached to @obj. */ VisuRendering* visu_object_getRendering(VisuObject *obj) { g_return_val_if_fail(VISU_IS_OBJECT_TYPE(obj), (VisuRendering*)0); return obj->priv->render; } /** * visu_object_setLoadMessageFunc: * @obj: a #VisuObject object. * @func: (scope call): a function to print a message. * @data: user data. * * When a load process is running, on can defined a message function * that may be called to output message to the user using * visu_object_setLoadMessage(). * * Since: 3.6 */ void visu_object_setLoadMessageFunc(VisuObject *obj, GFunc func, gpointer data) { obj->priv->loadMessageFunc = func; obj->priv->loadMessageData = data; } /** * visu_object_setLoadMessage: * @obj: a #VisuObject object. * @mess: a string. * * If a message function on load action has been set by * visu_object_setLoadMessageFunc(), then the given @mess is given as * argument to this function. * * Since: 3.6 */ void visu_object_setLoadMessage(VisuObject *obj, const gchar *mess) { if (obj->priv->loadMessageFunc) obj->priv->loadMessageFunc((gpointer)mess, obj->priv->loadMessageData); } /** * visu_object_load: * @obj: a #VisuObject object. * @data: a #VisuData object ; * @nSet: an integer ; * @cancel: (allow-none): a #GCancellable object. * @error: a pointer to store a possible error, location must be * initialized to (GError*)0. * * This calls the load method of the current rendering * method. Some informations may be store in @error if the returned * value is FALSE. * The file(s) which is(are) opened is(are) stored in the * #VisuData. The @nSet argument is used to load a specific set of * nodes if the input format supports it. If @nSet is 0, then the * default set of nodes is loaded. * * Returns: TRUE if everithing is OK, if FALSE, the @error is set and * should be freed with g_error_free(). */ gboolean visu_object_load(VisuObject *obj, VisuData *data, int nSet, GCancellable *cancel, GError **error) { gboolean res; g_return_val_if_fail(error && *error == (GError*)0, FALSE); g_return_val_if_fail(VISU_IS_OBJECT_TYPE(obj), FALSE); g_return_val_if_fail(!obj->priv->loading, FALSE); g_return_val_if_fail(obj->priv->render, FALSE); DBG_fprintf(stderr, "##### Load process #####\n"); obj->priv->loading = TRUE; if (data) DBG_fprintf(stderr, " | %p has %d ref counts.\n", (gpointer)data, G_OBJECT(data)->ref_count); #if DEBUG == 1 g_mem_profile(); #endif DBG_fprintf(stderr, "Visu Object: load dataset %d.\n", nSet); res = visu_rendering_load(obj->priv->render, data, nSet, cancel, error); DBG_fprintf(stderr, "Visu Object: load OK from rendering method," " continue with basic parts.\n"); if (data) DBG_fprintf(stderr, " | %p has %d ref counts.\n", (gpointer)data, G_OBJECT(data)->ref_count); #if DEBUG == 1 g_mem_profile(); #endif /* Set flags... */ if (res) { DBG_fprintf(stderr, "##### Post-load signal emission #####\n"); if (data) DBG_fprintf(stderr, " | %p has %d ref counts.\n", (gpointer)data, G_OBJECT(data)->ref_count); DBG_fprintf(stderr, "Visu Object: emitting 'dataLoaded' signal for %p (%d).\n", (gpointer)data, res); g_signal_emit(G_OBJECT(obj), signals[DATALOADED_SIGNAL], 0, data, NULL); DBG_fprintf(stderr, "Visu Object: emittion done.\n"); } obj->priv->loading = FALSE; return res; } v_sim-3.7.0/src/visu_object.h0000644000353400050620000001153312215546105013041 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef VISU_OBJECT_H #define VISU_OBJECT_H /* This .c and .h is here to create a GObject that can emit signals when necessary. */ #include #include "visu_tools.h" #include "visu_rendering.h" #include "visu_data.h" G_BEGIN_DECLS /** * VISU_TYPE_OBJECT: * * return the type of #VisuObject. */ #define VISU_TYPE_OBJECT (visu_object_get_type ()) /** * VISU_OBJECT: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuObject type. */ #define VISU_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VISU_TYPE_OBJECT, VisuObject)) /** * VISU_OBJECT_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuObjectClass. */ #define VISU_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VISU_TYPE_OBJECT, VisuObjectClass)) /** * VISU_IS_OBJECT_TYPE: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuObject object. */ #define VISU_IS_OBJECT_TYPE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VISU_TYPE_OBJECT)) /** * VISU_IS_OBJECT_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuObjectClass class. */ #define VISU_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VISU_TYPE_OBJECT)) /** * VISU_OBJECT_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. */ #define VISU_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VISU_TYPE_OBJECT, VisuObjectClass)) typedef struct _VisuObjectClass VisuObjectClass; typedef struct _VisuObjectPrivate VisuObjectPrivate; typedef struct _VisuObject VisuObject; /** * visu_object_get_type: * * This method returns the type of #VisuObject, use #VISU_TYPE_OBJECT instead. * * Returns: the type of #VisuObject. */ GType visu_object_get_type (void); struct _VisuObject { GObject parent; VisuObjectPrivate *priv; }; struct _VisuObjectClass { GObjectClass parent; }; gboolean visu_object_setRendering(VisuObject *obj, VisuRendering* method); VisuRendering* visu_object_getRendering(VisuObject *obj); /* Load related methods. */ void visu_object_setLoadMessageFunc(VisuObject *obj, GFunc func, gpointer data); void visu_object_setLoadMessage (VisuObject *obj, const gchar *mess); gboolean visu_object_load (VisuObject *obj, VisuData *data, int nSet, GCancellable *cancel, GError **error); /** * VISU_OBJECT_INSTANCE: * * This routine is used to get the global #VisuObject object to listen * to its signals. */ #define VISU_OBJECT_INSTANCE visu_object_class_getStatic() VisuObject* visu_object_class_getStatic(); gboolean visu_object_redraw(gpointer data); gboolean visu_object_redrawForce(gpointer data); /** * VISU_REDRAW_ADD: * * A macro to ask V_Sim to redraw the rendering area at next idle * time, except if the deferred redraw option is set. */ #define VISU_REDRAW_ADD g_idle_add(visu_object_redraw, (gpointer)__func__) /** * VISU_REDRAW_FORCE: * * Force V_Sim to redraw at the next idle time, whatever value for the * deferred redraw option. */ #define VISU_REDRAW_FORCE g_idle_add(visu_object_redrawForce, (gpointer)__func__) G_END_DECLS #endif v_sim-3.7.0/src/visu_tools.c0000644000353400050620000002236212215546105012730 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "visu_tools.h" #include "visu_object.h" #include #include #include #include /* For the access markers R_OK, W_OK ... */ #include /** * tool_getValidPath: * @pathList: (element-type filename): a pointer to a GList with all the possible path, * @filenames: (array zero-terminated=1) (element-type filename): an array of strings, * @accessMode: a value from R_OK, W_OK and X_OK as described in unistd.h. * * @pathList contains a list of directories (first is most prefered) * and fileName is the file name which one likes have informations on. This routine * look for the first directory where fileName can be writen or read (depending * on accessMode parameter). The pointer to the GList indicates at the end the * first valid entry in the GList. * * Returns: (transfer full): the first valid complete path (from * @pathList plus an entry of @filenames) if one can be found depnding * on @accessMode or NULL if none found. Free it with g_free() after * use. */ gchar* tool_getValidPath(GList **pathList, const char **filenames, int accessMode) { gchar *validPath; int fileOk; guint i; validPath = (char*)0; /* look for a directory to save or read a file. */ fileOk = 0; while (*pathList && !fileOk) { for (i = 0; filenames[i]; i++) { validPath = g_build_filename((gchar*)(*pathList)->data, filenames[i], NULL); DBG_fprintf(stderr, "Visu Tools : test access (%d) for '%s' ... ", accessMode, validPath); fileOk = !access((char*)validPath, accessMode); /* return 0 if success */ if (fileOk) break; /* if access mode is write access and the file does not already exist : we test if the directory has written permitions. */ if ( accessMode == W_OK && !g_file_test(validPath, G_FILE_TEST_EXISTS) ) fileOk = !access((char*)(*pathList)->data, accessMode); if (fileOk) break; DBG_fprintf(stderr, " failed.\n"); g_free(validPath); } *pathList = g_list_next(*pathList); } if (fileOk) { DBG_fprintf(stderr, " OK.\n"); return validPath; } else return (gchar*)0; } /** * tool_modulo_float: * @a: a float ; * @b: an int. * * This function is just like a%b except it works with a float @a argument. * @a can be negative, but the return value of the function is always positive. * * Returns: the new float value after the modulo. */ float tool_modulo_float(float a, int b) { float fb = (float)b; while(a < fb) a += fb; while(a >= fb) a -= fb; return a; } /** * tool_path_normalize: * @path: a string, NULL terminated. * * This function normalizes the path, i.e. it removes all . and .. It should * work also on Windows. It must take an absolute path as argument, if not it is converted * assuming the current working directory. * * Returns: a newly created string. */ gchar* tool_path_normalize(const gchar* path) { #if SYSTEM_X11 == 1 #define FILE_SYSTEM_SEP "/" #endif #if SYSTEM_WIN32 == 1 #define FILE_SYSTEM_SEP "\\" #endif gchar **tokens; int i; GString *normPath; GList *lst, *tmplst; gchar *allPath, *dir; if (!path) return (gchar*)0; if (!g_path_is_absolute(path)) { dir = g_get_current_dir(); allPath = g_build_filename(dir, path, NULL); g_free(dir); } else allPath = g_strdup(path); tokens = g_strsplit(allPath, FILE_SYSTEM_SEP, -1); normPath = g_string_new(""); lst = (GList*)0; for (i = 0; tokens[i]; i++) { /* If tokens[i] == . or is empty (because of //), we ignore. */ if (!strcmp(tokens[i], ".")) continue; if (!tokens[i][0]) continue; /* If token[i] == .. then we pop one element from lst. */ if (!strcmp(tokens[i], "..")) { lst = g_list_delete_link(lst, lst); continue; } /* Token[i] is a valid chain, then we prepend it to the list. */ lst = g_list_prepend(lst, tokens[i]); } /* Write the lst to the string. */ tmplst = lst; while(tmplst) { g_string_prepend(normPath, (gchar*)tmplst->data); g_string_prepend(normPath, FILE_SYSTEM_SEP); tmplst = g_list_next(tmplst); } g_list_free(lst); #if SYSTEM_WIN32 == 1 g_string_erase(normPath, 0,1); #endif g_strfreev(tokens); g_free(allPath); if (!normPath->str[0]) g_string_append(normPath, FILE_SYSTEM_SEP); DBG_fprintf(stderr, "Visu Tools : normalizing path, from '%s' to '%s'.\n", path, normPath->str); return g_string_free(normPath, FALSE); } #if GLIB_MINOR_VERSION < 5 /** * g_file_set_contents: * @fileName: a string ; * @str: a string ; * @len: a length or -1 ; * @error: a location for an error. * * Compiled only if Glib is lower than 2.5. * * Returns: TRUE on success. */ gboolean g_file_set_contents(const gchar *fileName, const gchar *str, gsize len _U_, GError **error _U_) { FILE *f; f = fopen(fileName, "w"); if (!f) return FALSE; if (fwrite(str, strlen(str), 1, f) != strlen(str)) return FALSE; fclose(f); return TRUE; } #endif static gchar* tagLookup(const gchar *tag, const gchar *buffer) { char *ptTag, *ptStart, *ptEnd; ptTag = strstr(buffer, tag); if (!ptTag) return (gchar*)0; /* We check that tag was not in a commentary section. */ ptStart = g_strrstr_len(buffer, (gssize)(ptTag - buffer), ""); if (ptEnd) return ptTag; return tagLookup(tag, ptTag + strlen(tag)); } /** * tool_XML_substitute: * @output: a GString to store the substitution ; * @filename: the file to read the data from ; * @tag: the tag to substitute ; * @error: a location to store possible errors. * * Read @filename (must be XML file) and remove the @tag zone from * it. At that place, it puts the contain of @output. * * Returns: TRUE if no error occured. */ gboolean tool_XML_substitute(GString *output, const gchar *filename, const gchar *tag, GError **error) { gchar *contents, *ptStart, *ptStop; gchar *tgStart, *tgEnd; gboolean valid; /* If file does exist, we read it and replace only the tag part. */ contents = (gchar*)0; ptStart = (gchar*)0; if (g_file_test(filename, G_FILE_TEST_EXISTS)) { valid = g_file_get_contents(filename, &contents, (gsize*)0, error); if (!valid) return FALSE; tgStart = g_strdup_printf("<%s", tag); ptStart = tagLookup(tgStart, contents); if (ptStart) g_string_prepend_len(output, contents, (gssize)(ptStart - contents)); else { g_string_prepend(output, " "); ptStop = tagLookup("", contents); if (ptStop) g_string_prepend_len(output, contents, (gssize)(ptStop - contents)); else { ptStop = tagLookup("", contents); if (ptStop) g_string_prepend(output, contents); else { g_string_prepend(output, contents); g_string_prepend(output, "\n"); } } } g_free(tgStart); } else g_string_prepend(output, "\n\n "); /* If file does exist, we add the remaining parts. */ if (contents && ptStart) { tgEnd = g_strdup_printf("", tag); ptStop = tagLookup(tgEnd, ptStart); if (ptStop) g_string_append(output, ptStop + strlen(tgEnd)); else g_string_append(output, "\n"); g_free(tgEnd); } else g_string_append(output, "\n"); if (contents) g_free(contents); return TRUE; } v_sim-3.7.0/src/visu_tools.h0000644000353400050620000000672212215546105012737 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef VISUTOOLS_H #define VISUTOOLS_H #ifdef HAVE_CONFIG_H #include #endif #include #include #include G_BEGIN_DECLS #ifndef DEBUG #define DEBUG 0 #endif #define DBG_fprintf if(DEBUG) (void)fprintf #ifdef ENABLE_NLS # include # undef _ # define _(String) dgettext (PACKAGE, String) # ifdef gettext_noop # define N_(String) gettext_noop (String) # else # define N_(String) (String) # endif #else # define textdomain(String) (String) # define gettext(String) (String) # define dgettext(Domain,Message) (Message) # define dcgettext(Domain,Message,Type) (Message) # define bindtextdomain(Domain,Directory) (Domain) # define _(String) (String) # define N_(String) (String) #endif /** * TOOL_MAX_LINE_LENGTH * * This is the maximum number of characters read on a * line of an input file. */ #define TOOL_MAX_LINE_LENGTH 256 /** * ToolVoidDataFunc: * @data: a pointer to some user defined object. * * These methods are used when no specific argument is required except * a user-defined object and when void is the return type. */ typedef void (*ToolVoidDataFunc)(gpointer data); /** * ToolInitFunc: * * These methods are used by V_Sim to initialise some part of the * program. They are called once on start-up. */ typedef void (*ToolInitFunc)(void); gchar* tool_getValidPath(GList **pathList, const char **filenames, int accessMode); float tool_modulo_float(float a, int b); gchar* tool_path_normalize(const gchar* path); #if GLIB_MINOR_VERSION < 5 gboolean g_file_set_contents(const gchar *fileName, const gchar *str, gsize len, GError **error); #endif gboolean tool_XML_substitute(GString *output, const gchar *filename, const gchar *tag, GError **error); G_END_DECLS #endif v_sim-3.7.0/src/visu_configFile.c0000644000353400050620000014545112215546106013643 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse mèl : BILLARD, non joignable par mèl ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "visu_configFile.h" #include "visu_tools.h" #include "visu_basic.h" #include "visu_object.h" #include "coreTools/toolConfigFile.h" #include #include #include /* For the access markers R_OK, W_OK ... */ /** * SECTION:visu_configFile * @short_description: Defines methods to access (read/write) to * config files and to create different entries. * * V_Sim uses two different configuration files. The first * stores the configuration of the program itself and is called * parameters file. The second stores differents values that control * the way files are rendered. It is called resources file. For * example, their is an entry in the parameters file that controls * your favorite rendering method ; and there is an entry in the * resources file that codes that vacancy elements are rendered by * cube in the atomic rendering method. Most methods of this part uses * a first argument usually called 'kind', that control if the method * will apply on the parameters file or on the resources * file. #VISU_CONFIG_FILE_PARAMETER and #VISU_CONFIG_FILE_RESOURCE are * the two flags that should be used for the 'kind' argument. * * There are different paths where these files can be * stored. These paths are stored in V_Sim with an order : for example * parameters file are first looked for in the current working * directory, then in the $HOME/.v_sim directory and finally in the * installation directory. This is transparent for the user and * visu_config_file_getValidPath() is the right method to access to the * best readable configuration file. * * Different part of V_Sim can add entries in these files. The * method visu_config_file_addEntry() is designed to this purpose. The * entries are defined by their name and they appear in the * configuration file as 'name:' followed by the data associated to * this entry. In the parameters file, the data are on the same * line. In the resources file, the data begin the line after and can * be longer that one line. When a configuration file is read, the * method associated to each entry (VisuConfigFileReadFunc()) is * called with a copy of their data lines. The method * visu_config_file_addExportFunction() should be used to add a callback * when the configurations files are written, then each part of V_Sim * that have entries can put some lines in the configuration * files. */ #define PARAMETER_HEADER "#V_Sim parameters file" #define RESOURCE_HEADER "#V_Sim resources file" #define VERSION_HEADER "3.0" static const gchar *RESOURCES_FILENAMES[] = {"v_sim.res.xml", "v_sim.res", (gchar*)0}; static const gchar *PARAMETERS_FILENAMES[] = {"v_sim.par", (gchar*)0}; #define FLAG_RESOURCES_PATH "main_resourcesPath" #define DESC_RESOURCES_PATH "Favorite paths to find and save the resources file ; chain[:chain]" #define DEFAULT_RESOURCES_PATH "" static gboolean readResourcesPaths(VisuConfigFileEntry *entry, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static void exportResourcesPaths(GString *data, VisuData *dataObj, VisuGlView *view); /** * VisuConfigFileEntry: * * This is the common name of the structure. */ struct _VisuConfigFileEntry { /* Name of the key. */ gchar *key; gchar *description; GQuark kquark; /* Quark associated to the key. */ /* Version, default is 3.0. */ float version; /* If set, entry is obsolete and newKey should replaces it. */ gchar *newKey; /* A parameter or a resource */ int kind; /* Number of line used by this resources. This is not used if the entry is a parameter since, parameters are on the same line than the key and are one line. */ guint nbLines; /* This method is called when a file is read and the entry is found. */ VisuConfigFileReadFunc read; gpointer storage; guint nValues; float range[2]; /* Tag, tags are used to ignore or not some entries when a file is read. */ gchar *tag; }; typedef enum { _format_raw, _format_xml } _format_export; _format_export format = _format_raw; struct writeFunc_struct { VisuConfigFileExportFunc writeFunc; }; /* This hashtable stores all the known entries. The keys are the name of the entry (its key), and the value is a pointer to a VisuConfigFileEntry. */ static GHashTable *visuConfigFile_entryList = NULL; static GList *registeredResources = NULL, *registeredParameters = NULL; static GList *exportResourcesList, *exportParametersList; static GHashTable *knownTags = NULL; /* Store the paths to where it is possible to store and/or read resource files. This list is ordered and first element is the most prefered path. */ static GList *resourcesPath; static gchar *currentResPath; /* Store the paths to where it is possible to store parameters files. This list is ordered and first element is the most prefered path.*/ static GList *parametersPath; /* Local methods. */ static void visuConfigFileInit(); static VisuConfigFileEntry* entry_copy(VisuConfigFileEntry *entry); static void entry_free(VisuConfigFileEntry *entry); /* Generic reading routines. */ static gboolean _readBoolean(VisuConfigFileEntry *entry, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static gboolean _readFloatv(VisuConfigFileEntry *entry, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static gboolean _readString(VisuConfigFileEntry *entry, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error); static gint compareStringsInGList(gconstpointer a, gconstpointer b) { return strcmp((char*)a, (char*)b); } /** * visu_config_file_entry_get_type: * * Create and retrieve a #GType for a #VisuConfigFileEntry object. * * Since: 3.7 * * Returns: a new type for #VisuConfigFileEntry structures. */ GType visu_config_file_entry_get_type(void) { static GType g_define_type_id = 0; if (g_define_type_id == 0) g_define_type_id = g_boxed_type_register_static("VisuConfigFileEntry", (GBoxedCopyFunc)entry_copy, (GBoxedFreeFunc)entry_free); return g_define_type_id; } static VisuConfigFileEntry* entry_init(const gchar *key, const gchar *description, int kind, guint nbLines) { VisuConfigFileEntry *entry; g_return_val_if_fail(key && *key, (VisuConfigFileEntry*)0); g_return_val_if_fail(description, (VisuConfigFileEntry*)0); g_return_val_if_fail(nbLines > 0 && (kind == VISU_CONFIG_FILE_PARAMETER || kind == VISU_CONFIG_FILE_RESOURCE), (VisuConfigFileEntry*)0); entry = g_malloc(sizeof(VisuConfigFileEntry)); entry->key = g_strdup(key); entry->kquark = g_quark_from_static_string(entry->key); entry->description = g_strdup(description); entry->kind = kind; if (kind == VISU_CONFIG_FILE_PARAMETER) entry->nbLines = 1; else entry->nbLines = nbLines; entry->storage = (gpointer)0; entry->tag = (gchar*)0; entry->newKey = (gchar*)0; entry->version = 3.0f; return entry; } static gboolean entry_register(VisuConfigFileEntry *entry) { if (!visuConfigFile_entryList) visuConfigFileInit(); DBG_fprintf(stderr, "Visu ConfigFile: going to add key '%s'.\n", entry->key); if (g_hash_table_lookup(visuConfigFile_entryList, (gpointer)entry->key)) return FALSE; /* Store it. */ g_hash_table_insert(visuConfigFile_entryList, (gpointer)entry->key, (gpointer)entry); if (entry->kind == VISU_CONFIG_FILE_RESOURCE) registeredResources = g_list_append(registeredResources, (gpointer)entry); else if (entry->kind == VISU_CONFIG_FILE_PARAMETER) registeredParameters = g_list_append(registeredParameters, (gpointer)entry); return TRUE; } static VisuConfigFileEntry* entry_copy(VisuConfigFileEntry *entry) { VisuConfigFileEntry *out; out = g_malloc(sizeof(VisuConfigFileEntry)); *out = *entry; out->key = g_strdup(entry->key); if (entry->description) out->description = g_strdup(entry->description); if (entry->newKey) out->newKey = g_strdup(entry->newKey); if (entry->tag) out->tag = g_strdup(entry->tag); return out; } static void entry_free(VisuConfigFileEntry *entry) { g_free(entry->key); if (entry->description) g_free(entry->description); if (entry->newKey) g_free(entry->newKey); if (entry->tag) g_free(entry->tag); g_free(entry); } /** * visu_config_file_addEntry: * @kind: an integer ; * @key: a string (should not be NULL) ; * @description: (allow-none): a string (can be NULL) ; * @nbLines: an integer ; * @readFunc: (scope call): a VisuConfigFileReadFunc. * * This creates a new #VisuConfigFileEntry object with the given * values. The key and description arguments are copied. * * Returns: the newly created #VisuConfigFileEntry object. */ VisuConfigFileEntry* visu_config_file_addEntry(int kind, const gchar *key, const gchar* description, int nbLines, VisuConfigFileReadFunc readFunc) { VisuConfigFileEntry *entry; entry = entry_init(key, description, kind, nbLines); if (!entry) return (VisuConfigFileEntry*)0; entry->read = readFunc; if (!entry_register(entry)) { g_free(entry); g_warning("entry '%s' already exists!", key); } return entry; } /** * visu_config_file_addBooleanEntry: * @kind: an integer ; * @key: a string (should not be NULL) ; * @description: (allow-none): a string (can be NULL) ; * @location: a pointer where to store a boolean when the entry is * parsed. * * Defines a #VisuConfigFileEntry that will be a single boolean to * read and to store in @location. * * Since: 3.7 * * Returns: (transfer full): the newly created #VisuConfigFileEntry object. **/ VisuConfigFileEntry* visu_config_file_addBooleanEntry(int kind, const gchar *key, const gchar* description, gboolean *location) { VisuConfigFileEntry *entry; g_return_val_if_fail(location, (VisuConfigFileEntry*)0); entry = entry_init(key, description, kind, 1); if (!entry) return (VisuConfigFileEntry*)0; entry->read = _readBoolean; entry->storage = (gpointer)location; if (!entry_register(entry)) { g_free(entry); g_warning("entry '%s' already exists!", key); } return entry; } /** * visu_config_file_addFloatArrayEntry: * @kind: an integer ; * @key: a string (should not be NULL) ; * @description: (allow-none): a string (can be NULL) ; * @nValues: the number of floats to read. * @location: a pointer where to store floats when the entry is * parsed. * @clamp: the min and max values allowed. * * Defines a #VisuConfigFileEntry that will parse @nValues floats and * store them consecutively in @location. The parsed values are * checked to be in @clamp. * * Since: 3.7 * * Returns: (transfer full): the newly created #VisuConfigFileEntry object. **/ VisuConfigFileEntry* visu_config_file_addFloatArrayEntry(int kind, const gchar *key, const gchar* description, guint nValues, float *location, float clamp[2]) { VisuConfigFileEntry *entry; g_return_val_if_fail(location, (VisuConfigFileEntry*)0); entry = entry_init(key, description, kind, 1); if (!entry) return (VisuConfigFileEntry*)0; entry->read = _readFloatv; entry->storage = (gpointer)location; entry->nValues = nValues; entry->range[0] = clamp[0]; entry->range[1] = clamp[1]; if (!entry_register(entry)) { g_free(entry); g_warning("entry '%s' already exists!", key); } return entry; } /** * visu_config_file_addStringEntry: * @kind: an integer ; * @key: a string (should not be NULL) ; * @description: (allow-none): a string (can be NULL) ; * @location: a pointer where to store a string when the entry is * parsed. * * Defines a #VisuConfigFileEntry that will be a string to * read and to store in @location. If @location already contains a * string, it is g_free(). * * Since: 3.7 * * Returns: (transfer full): the newly created #VisuConfigFileEntry object. **/ VisuConfigFileEntry* visu_config_file_addStringEntry(int kind, const gchar *key, const gchar* description, gchar **location) { VisuConfigFileEntry *entry; g_return_val_if_fail(location, (VisuConfigFileEntry*)0); entry = entry_init(key, description, kind, 1); if (!entry) return (VisuConfigFileEntry*)0; entry->read = _readString; entry->storage = (gpointer)location; if (!entry_register(entry)) { g_free(entry); g_warning("entry '%s' already exists!", key); } return entry; } /** * visu_config_file_getEntries: * @kind: either #VISU_CONFIG_FILE_PARAMETER or * #VISU_CONFIG_FILE_RESOURCE ; * * This routine should be used for introspections purpose, to know * what resources or parameters are available. * * Returns: (element-type utf8) (transfer none): a #GList own by V_Sim. */ GList* visu_config_file_getEntries(int kind) { g_return_val_if_fail(kind == VISU_CONFIG_FILE_PARAMETER || kind == VISU_CONFIG_FILE_RESOURCE, (GList*)0); if (kind == VISU_CONFIG_FILE_PARAMETER) return registeredParameters; else return registeredResources; } /** * visu_config_file_addKnownTag: * @tag: a string (not nul or empty). * * If parameter entries have a tag, they are ignored except if their tag * has been declared using this method. */ void visu_config_file_addKnownTag(gchar* tag) { g_return_if_fail(tag && *tag); if (!knownTags) visuConfigFileInit(); g_hash_table_insert(knownTags, (gpointer)tag, GINT_TO_POINTER(1)); } /** * visu_config_file_addExportFunction: * @kind: an integer to identify resources or parameters ; * @writeFunc: (scope call): a VisuConfigFileExportFunc method. * * This stores the @writeFunc given. It will be called when resources or parameters * will be exported to disk. */ void visu_config_file_addExportFunction(int kind, VisuConfigFileExportFunc writeFunc) { struct writeFunc_struct *str; if (!writeFunc) return; g_return_if_fail(kind == VISU_CONFIG_FILE_PARAMETER || kind == VISU_CONFIG_FILE_RESOURCE); str = g_malloc(sizeof(struct writeFunc_struct)); str->writeFunc = writeFunc; if (kind == VISU_CONFIG_FILE_RESOURCE) exportResourcesList = g_list_append(exportResourcesList, (gpointer)str); else if (kind == VISU_CONFIG_FILE_PARAMETER) exportParametersList = g_list_append(exportParametersList, (gpointer)str); } static void freeConfigEntry(gpointer data) { VisuConfigFileEntry *entry; if (!data) return; entry = (VisuConfigFileEntry*)data; g_free(entry->key); g_free(entry->description); if (entry->tag) g_free(entry->tag); if (entry->newKey) g_free(entry->newKey); g_free(entry); } /** * visu_config_file_entry_setTag: * @entry: a #VisuConfigFileEntry object ; * @tag: a string. * * This method is used to set a tag to the given entry. This tag is used * to ignore or not the entry when the file is read. The @tag argument * is copied. */ void visu_config_file_entry_setTag(VisuConfigFileEntry *entry, const gchar *tag) { g_return_if_fail(entry); if (entry->tag) g_free(entry->tag); entry->tag = g_strdup(tag); } /** * visu_config_file_entry_setVersion: * @entry: a #VisuConfigFileEntry object ; * @version: the version the entry appear in. * * Set the version number the entry appear in. */ void visu_config_file_entry_setVersion(VisuConfigFileEntry *entry, float version) { g_return_if_fail(entry && version > 3.0f); entry->version = version; } /** * visu_config_file_entry_setReplace: * @newEntry: a #VisuConfigFileEntry object ; * @oldEntry: idem. * * Use this method to declare that @oldEntry has become obsolete and * has been replaced by @newEntry. */ void visu_config_file_entry_setReplace(VisuConfigFileEntry *newEntry, VisuConfigFileEntry *oldEntry) { g_return_if_fail(newEntry && oldEntry); if (oldEntry->newKey) g_free(oldEntry->newKey); oldEntry->newKey = g_strdup(newEntry->key); } static gchar* _getKey(const gchar *buf, gchar **key, gchar **tag, guint iLine, GError **error) { gchar *key_, *tag_, *end, *ret; *key = (gchar*)0; *tag = (gchar*)0; ret = strchr(buf, ':'); if (!ret) return (gchar*)0; key_ = g_strndup(buf, ret - buf); key_ = g_strstrip(key_); *key = key_; /* Look for the tag */ tag_ = strchr(key_, '['); if (tag_) { *tag_ = '\0'; tag_ += 1; end = strchr(tag_, ']'); if (end) { *end = '\0'; tag_ = g_strdup(tag_); *tag = tag_; } else *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_TAG, _("Parse error at line %d," " the tag '%s' is not closed.\n"), iLine, tag_); } DBG_fprintf(stderr,"Visu ConfigFile: read a flag (tag): '%s' (%s).\n", key_, tag_); return ret; } static VisuConfigFileEntry* _getEntry(const gchar *key, guint iLine, GError **error) { VisuConfigFileEntry *entry; entry = (VisuConfigFileEntry*)g_hash_table_lookup(visuConfigFile_entryList, (gpointer)key); if (!entry) *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_MARKUP, _("Parse error at line %d," " '%s' is an unknown markup.\n"), iLine, key); else if (entry->newKey) g_warning(_("Markup '%s' is obsolete, replaced by '%s'."), key, entry->newKey); return entry; } static void _appendMessage(GString *message, GError **error) { if (*error) { g_string_append(message, (*error)->message); g_error_free(*error); *error = (GError*)0; } } static gboolean _parse(VisuConfigFileEntry *entry, gchar **tokens, guint iLine, VisuData *dataObj, VisuGlView *view, GError **error) { gboolean ret; static guint sig = 0; if (!sig) sig = g_signal_lookup("entryParsed", VISU_TYPE_OBJECT); ret = TRUE; if (tokens) { if (entry->read) ret = entry->read(entry, tokens, entry->nbLines, iLine, dataObj, view, error); g_strfreev(tokens); if (ret) g_signal_emit(VISU_OBJECT_INSTANCE, sig, entry->kquark, entry->key); } return ret; } static gboolean _loadRaw(int kind, const char* fileName, VisuData *dataObj, VisuGlView *view, GError **error) { GIOChannel *ioFile; GString *line= (GString*)0; GIOStatus status; guint nbLine, i; gchar *deuxPoints; gchar **tokens; gchar *key, *tag; VisuConfigFileEntry *entry; GString *message; ioFile = g_io_channel_new_file(fileName, "r", error); if (*error) return FALSE; message = g_string_new(""); line = g_string_new(""); nbLine = 0; status = G_IO_STATUS_NORMAL; while (status == G_IO_STATUS_NORMAL) { status = g_io_channel_read_line_string(ioFile, line, NULL, error); if (*error) { g_string_free(line, TRUE); g_string_free(message, TRUE); return FALSE; } nbLine += 1; if (status == G_IO_STATUS_EOF || line->str[0] == '#' || line->str[0] == '\n') continue; entry = (VisuConfigFileEntry*)0; deuxPoints = _getKey(line->str, &key, &tag, nbLine, error); _appendMessage(message, error); if (key) { if (tag && !g_hash_table_lookup(knownTags, (gpointer)tag)) { entry = (VisuConfigFileEntry*)0; DBG_fprintf(stderr, "Visu ConfigFile: the entry '%s' has an unknown tag (%s)," " it will be dismissed.\n", key, tag); } else { entry = _getEntry(key, nbLine, error); _appendMessage(message, error); } g_free(key); if (tag) g_free(tag); } if (entry) { tokens = g_malloc0(sizeof(gchar*) * (entry->nbLines + 1)); if (kind == VISU_CONFIG_FILE_RESOURCE) for (i = 0; i < entry->nbLines; i++) { status = g_io_channel_read_line_string(ioFile, line, NULL, error); if (*error) { g_string_free(line, TRUE); g_string_free(message, TRUE); return FALSE; } nbLine += 1; if (status != G_IO_STATUS_NORMAL) { g_strfreev(tokens); tokens = (gchar**)0; *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_MISSING, _("Parse error at line %d," " '%s' needs %d lines but only %d were read.\n"), nbLine, entry->key, entry->nbLines, i); break; } tokens[i] = g_strdup(line->str); } else tokens[0] = g_strdup(deuxPoints + 1); _parse(entry, tokens, nbLine, dataObj, view, error); _appendMessage(message, error); } } g_string_free(line, TRUE); status = g_io_channel_shutdown(ioFile, FALSE, error); g_io_channel_unref(ioFile); if (status != G_IO_STATUS_NORMAL) { g_string_free(message, TRUE); return FALSE; } DBG_fprintf(stderr, "Visu ConfigFile: read OK (error len = %d).\n", (int)message->len); if (message->len > 0) { DBG_fprintf(stderr, " | %s\n", message->str); *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_READ, "%s", message->str); } g_string_free(message, TRUE); return (*error == (GError*)0); } struct _dt { gboolean parse; GString *message; VisuData *dataObj; VisuGlView *view; VisuConfigFileEntry *entry; gchar *tag, *id, *text; }; static void _element(GMarkupParseContext *context _U_, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer user_data, GError **error) { struct _dt *dt = (struct _dt*)user_data; guint i; if (!strcmp(element_name, "resources")) dt->parse = TRUE; else if (!strcmp(element_name, "entry")) { dt->tag = (gchar*)0; dt->id = (gchar*)0; dt->text = (gchar*)0; for (i = 0; attribute_names[i]; i++) { if (!strcmp(attribute_names[i], "name")) { dt->entry = _getEntry(attribute_values[i], 0, error); _appendMessage(dt->message, error); } else if (!strcmp(attribute_names[i], "id")) dt->id = g_strdup(attribute_values[i]); } } } static void _endElement(GMarkupParseContext *context _U_, const gchar *element_name, gpointer user_data, GError **error) { struct _dt *dt = (struct _dt*)user_data; gchar **tokens; if (!strcmp(element_name, "resources")) dt->parse = FALSE; else if (!strcmp(element_name, "entry") && dt->entry) { tokens = g_malloc0(sizeof(gchar*) * (dt->entry->nbLines + 1)); /* Tricks... */ if (!strcmp(dt->entry->key, "pair_link")) { tokens[0] = g_strdup(dt->id); tokens[1] = g_strdup(dt->text); } else if (!strcmp(dt->entry->key, "isosurface_color") || !strcmp(dt->entry->key, "isosurface_properties")) tokens[0] = g_strdup_printf("\"%s\" %s", (dt->id)?dt->id:"", dt->text); else tokens[0] = g_strdup_printf("%s %s", (dt->id)?dt->id:"", dt->text); _parse(dt->entry, tokens, 0, dt->dataObj, dt->view, error); _appendMessage(dt->message, error); dt->entry = (VisuConfigFileEntry*)0; if (dt->tag) g_free(dt->tag); if (dt->id) g_free(dt->id); if (dt->text) g_free(dt->text); } } static void _text(GMarkupParseContext *context _U_, const gchar *text, gsize text_len _U_, gpointer user_data, GError **error _U_) { struct _dt *dt = (struct _dt*)user_data; if (dt->entry) dt->text = g_strdup(text); } static gboolean _loadXML(const gchar *filename, VisuData *dataObj, VisuGlView *view, GError **error) { GMarkupParseContext* xmlContext; GMarkupParser parser; gsize size; gchar *buffer; struct _dt dt; /* Read file. */ buffer = (gchar*)0; if (!g_file_get_contents(filename, &buffer, &size, error)) return FALSE; /* Create context. */ parser.start_element = _element; parser.end_element = _endElement; parser.text = _text; parser.passthrough = NULL; parser.error = NULL; dt.parse = FALSE; dt.message = g_string_new(""); dt.dataObj = dataObj; dt.view = view; dt.entry = (VisuConfigFileEntry*)0; dt.tag = (gchar*)0; dt.id = (gchar*)0; dt.text = (gchar*)0; xmlContext = g_markup_parse_context_new(&parser, 0, &dt, NULL); /* Parse data. */ g_markup_parse_context_parse(xmlContext, buffer, size, error); /* Free buffers. */ g_markup_parse_context_free(xmlContext); g_free(buffer); if (!*error && dt.message->len > 0) *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_READ, "%s", dt.message->str); g_string_free(dt.message, TRUE); return (*error == (GError*)0); } /** * visu_config_file_load: * @kind: an integer to identify the kind of file ; * @filename: the path to file to read ; * @dataObj: (allow-none): a #VisuData object, sometime needed to * update values (can be NULL) ; * @view: (allow-none): a #VisuGlView object, sometime needed to * update values (can be NULL). * @error: (allow-none): a pointer to a GError pointer. * * Try to load the resources/parameters from the file name given in * parameter. * * Returns: TRUE if everything goes right. If @error is not NULL it * should be freed with g_error_free(). */ gboolean visu_config_file_load(int kind, const char* filename, VisuData *dataObj, VisuGlView *view, GError **error) { gboolean res; if (!visuConfigFile_entryList) visuConfigFileInit(); DBG_fprintf(stderr, "Visu ConfigFile: parsing '%s' file for" " resources/parameters...\n", filename); g_return_val_if_fail(kind == VISU_CONFIG_FILE_RESOURCE || kind == VISU_CONFIG_FILE_PARAMETER, FALSE); if (kind == VISU_CONFIG_FILE_RESOURCE && strstr(filename, ".xml")) res = _loadXML(filename, dataObj, view, error); else res = _loadRaw(kind, filename, dataObj, view, error); /* We save the current path. */ if (kind == VISU_CONFIG_FILE_RESOURCE) { if (currentResPath) g_free(currentResPath); currentResPath = g_strdup(filename); DBG_fprintf(stderr, "Gtk Save: emitting 'resourcesLoaded' signal.\n"); g_signal_emit_by_name(VISU_OBJECT_INSTANCE, "resourcesLoaded", (gpointer)dataObj, NULL); DBG_fprintf(stderr, "Gtk Save: emission done.\n"); } return res; } /** * visu_config_file_exportComment: * @buffer: the buffer to add a comment to. * @comment: a comment. * * Append to @buffer the given @comment, using the current output * style (raw text or XML as instance). * * Since: 3.7 **/ void visu_config_file_exportComment(GString *buffer, const gchar *comment) { g_return_if_fail(buffer && comment); if (!comment[0]) { g_string_append(buffer, "\n"); return; } switch (format) { case (_format_raw): g_string_append_printf(buffer, "# %s\n", comment); break; case (_format_xml): g_string_append_printf(buffer, " \n", comment); break; } } /** * visu_config_file_exportEntry: * @buffer: the buffer to write the entry to. * @name: the name of the entry. * @id_value: (allow-none): an id for the entry. * @format_: the formatting string for the message. * @...: the values to print. * * Append to @buffer the given @entry, using the current output * style (raw text or XML as instance). @id_value can be used to * specify the entry apply to, for instance, the name of the * #VisuElement the colour property entry apply to. * * Since: 3.7 **/ void visu_config_file_exportEntry(GString *buffer, const gchar *name, const gchar *id_value, const gchar *format_, ...) { va_list arglist; gchar *buf; g_return_if_fail(buffer && name && format_); va_start(arglist, format_); buf = g_strdup_vprintf(format_, arglist); va_end(arglist); switch (format) { case (_format_raw): /* Special case for backward compatibility. */ if (!strcmp(name, "pair_link")) g_string_append_printf(buffer, "%s:\n %s\n %s\n", name, (id_value)?id_value:"", buf); else if (!strcmp(name, "isosurface_color") || !strcmp(name, "isosurface_properties")) g_string_append_printf(buffer, "%s:\n \"%s\" %s\n", name, (id_value)?id_value:"", buf); else g_string_append_printf(buffer, "%s:\n %s %s\n", name, (id_value)?id_value:"", buf); break; case (_format_xml): g_string_append_printf(buffer, " %s\n", buf); break; } g_free(buf); } /** * visu_config_file_saveResourcesToXML: * @filename: the path to file to read ; * @lines: a pointer to an integer (can be NULL) ; * @dataObj: (allow-none): a #VisuData object (can be NULL) ; * @view: (allow-none): a #VisuGlView object (can be NULL) ; * @error: a location to store a possible error. * * Same routine as visu_config_file_save() but use an XML format instead. * * Since: 3.7 * * Returns: TRUE if everything goes right. */ gboolean visu_config_file_saveResourcesToXML(const char* filename, int *lines, VisuData *dataObj, VisuGlView *view, GError **error) { gchar *ptCh; GString *buffer; int nbLine; GList *pos; gboolean success; g_return_val_if_fail(error && !*error, FALSE); DBG_fprintf(stderr, "Visu ConfigFile: exporting '%s' file for" " XML resources...\n", filename); format = _format_xml; buffer = g_string_new("\n", VERSION_HEADER); for (pos = exportResourcesList; pos; pos = g_list_next(pos)) { /* g_string_append_printf(" \n", ((VisuConfigFileEntry*)pos->data)->key); */ ((struct writeFunc_struct*)(pos->data))->writeFunc(buffer, dataObj, view); } g_string_append(buffer, " "); nbLine = 0; ptCh = buffer->str; while ((ptCh = strchr(ptCh + 1, '\n'))) nbLine += 1; DBG_fprintf(stderr, "Visu ConfigFile: export OK to string," " preparing to write file.\n"); success = tool_XML_substitute(buffer, filename, "resources", error); if (!success) { g_string_free(buffer, TRUE); return FALSE; } success = g_file_set_contents(filename, buffer->str, -1, error); DBG_fprintf(stderr, "Visu ConfigFile: write %d lines (%d).\n", nbLine, success); g_string_free(buffer, TRUE); /* We save the current path. */ if (success) { DBG_fprintf(stderr, " | save path '%s' as current.\n", filename); if (currentResPath) g_free(currentResPath); currentResPath = g_strdup(filename); } if (lines) *lines = nbLine; return success; } /** * visu_config_file_save: * @kind: an integer to identify the kind of file ; * @fileName: the path to file to read ; * @lines: a pointer to an integer (can be NULL) ; * @dataObj: (allow-none): a #VisuData object (can be NULL) ; * @view: (allow-none): a #VisuGlView object (can be NULL) ; * @error: a location to store a possible error. * * Try to export the resources/parameters to the file name given in * parameter. If @lines argument * is not NULL, and everything went right, it stores the number of written lines. * If the argument @dataObj is not null, only resources related * to the #VisuData object should be exported (for parameters files, @dataObj is * always NULL). The same for @view. * * Returns: TRUE if everything goes right. */ gboolean visu_config_file_save(int kind, const char* fileName, int *lines, VisuData *dataObj, VisuGlView *view, GError **error) { gchar *ptCh; GString *exportString; int nbLine; GList *pos; gboolean success; g_return_val_if_fail(error && !*error, FALSE); DBG_fprintf(stderr, "Visu ConfigFile: exporting '%s' file for" " resources/parameters...\n", fileName); g_return_val_if_fail(kind == VISU_CONFIG_FILE_RESOURCE || kind == VISU_CONFIG_FILE_PARAMETER, FALSE); format = _format_raw; exportString = g_string_new(""); if (kind == VISU_CONFIG_FILE_RESOURCE) g_string_append_printf(exportString, RESOURCE_HEADER); else if (kind == VISU_CONFIG_FILE_PARAMETER) g_string_append_printf(exportString, PARAMETER_HEADER); g_string_append_printf(exportString, " v"VERSION_HEADER "\n" "#====================\n" "\n" "#WARNING: this file format is DIFFERENT from that for\n" "#standard v_sim version <= 2.x\n" "\n" "#Line beginning with a # are not parsed.\n" "\n"); if (kind == VISU_CONFIG_FILE_RESOURCE) g_string_append_printf(exportString, "#The only \"useful\" lines must have the following contents\n" "#several two or more lines patterns:\n" "#resource_name:\n" "#values separeted by blank characters\n" "\n" "#The following resource names are valid :\n"); else g_string_append_printf(exportString, "#The only \"useful\" lines must have the following pattern:\n" "#parameter_name: value\n" "\n" "#The following parameter names are valid :\n"); for (pos = (kind == VISU_CONFIG_FILE_RESOURCE)? registeredResources:registeredParameters; pos; pos = g_list_next(pos)) g_string_append_printf(exportString, "# %s\n", ((VisuConfigFileEntry*)(pos->data))->key); g_string_append_printf(exportString, "\n"); for (pos = (kind == VISU_CONFIG_FILE_RESOURCE)? exportResourcesList:exportParametersList; pos; pos = g_list_next(pos)) ((struct writeFunc_struct*)(pos->data))->writeFunc(exportString, dataObj, view); nbLine = 0; ptCh = exportString->str; while ((ptCh = strchr(ptCh + 1, '\n'))) nbLine += 1; DBG_fprintf(stderr, "Visu ConfigFile: export OK to string," " preparing to write file.\n"); success = g_file_set_contents(fileName, exportString->str, -1, error); g_string_free(exportString, TRUE); DBG_fprintf(stderr, "Visu ConfigFile: write %d lines (%d).\n", nbLine, success); /* We save the current path. */ if (kind == VISU_CONFIG_FILE_RESOURCE && success) { DBG_fprintf(stderr, " | save path '%s' as current.\n", fileName); if (currentResPath) g_free(currentResPath); currentResPath = g_strdup(fileName); } if (lines) *lines = nbLine; return success; } static gboolean _validateHeader(const gchar *filename, int kind) { FILE *file; float version; char *msg, *header; char line[TOOL_MAX_LINE_LENGTH]; DBG_fprintf(stderr, "Visu ConfigFile: looking for header of \n '%s' ... ", filename); if (strstr(filename, ".xml")) { DBG_fprintf(stderr, "accepted.\n"); return TRUE; } file = fopen(filename, "r"); if (!file) { g_warning("The file '%s' should be readable but something goes" " nasty when one wants to open it.\n", filename); return FALSE; } version = 0.; msg = fgets(line, TOOL_MAX_LINE_LENGTH, file); fclose(file); if (kind == VISU_CONFIG_FILE_RESOURCE) header = RESOURCE_HEADER; else header = PARAMETER_HEADER; if (msg && !strncmp(line, header, strlen(header)) && sscanf(line + strlen(header) + 2, "%f", &version)) if (version >= 3.) { DBG_fprintf(stderr, "ok.\n"); return TRUE; } DBG_fprintf(stderr, "wrong.\n"); return FALSE; } static gchar* getValidFileWithHeader(int mode, const gchar* filenames[], int kind, GList **list) { gchar *res; /* Look for a valid file. If it is for writing, a valid file is just given by a valid path. If it is for reading, a valid file is a valid path AND has a valid header. */ while (*list) { /* We get the next valid path. */ res = tool_getValidPath(list, filenames, mode); if (!res) { DBG_fprintf(stderr, "Visu ConfigFile: no file available.\n"); return (gchar*)0; } /* if we are in reading mode, we test the header. */ if (mode & R_OK) { if (_validateHeader(res, kind)) return res; else g_free(res); } /* We are in writing mode so the valid path is ok. */ else return res; *list = g_list_next(*list); } DBG_fprintf(stderr, "Visu ConfigFile: no file available.\n"); return (gchar*)0; } /** * visu_config_file_getPathToResources: * * The resource file can be read from different places. * * Since: 3.6 * * Returns: the path used to read the last resource file. */ const gchar* visu_config_file_getPathToResources() { return currentResPath; } /** * visu_config_file_getValidPath: * @kind: an integer identifier ; * @mode: a value from R_OK, W_OK and X_OK as described in unistd.h. * @utf8: if 1, the path is return in UTF-8 format, otherwise, the locale * of the file system is used. * * Test the entries of the hadoc list to find * a valid position to read or write a config file. * It tests access for the specified file. * * Returns: the first valid path find in the list of known paths. */ gchar* visu_config_file_getValidPath(int kind, int mode, int utf8) { GList *list; gchar* file; gchar* fileUTF8; g_return_val_if_fail(kind == VISU_CONFIG_FILE_RESOURCE || kind == VISU_CONFIG_FILE_PARAMETER, (gchar*)0); if (kind == VISU_CONFIG_FILE_RESOURCE) { list = resourcesPath; file = getValidFileWithHeader(mode, RESOURCES_FILENAMES, kind, &list); } else { list = parametersPath; file = getValidFileWithHeader(mode, PARAMETERS_FILENAMES, kind, &list); } if (!file) return file; if (utf8) { fileUTF8 = g_filename_from_utf8(file, -1, NULL, NULL, NULL); g_free(file); return fileUTF8; } else return file; } /** * visu_config_file_getNextValidPath: * @kind: an integer identifier ; * @accessMode: a value from R_OK, W_OK and X_OK as described in unistd.h ; * @list: (element-type filename) (inout) (transfer none): a pointer to a valid *GList ; * @utf8: if 1, the path is return in UTF-8 format, otherwise, the locale * of the file system is used. * * Test the entries of the given list to find * a valid position to read or write a config file. * It tests access for the specified file. After a call to this * method the @list argument points to the next entry in the list, after * the one found. * * Returns: the first valid path find in the given list of paths. */ gchar* visu_config_file_getNextValidPath(int kind, int accessMode, GList **list, int utf8) { gchar* file; gchar* fileUTF8; g_return_val_if_fail(kind == VISU_CONFIG_FILE_RESOURCE || kind == VISU_CONFIG_FILE_PARAMETER, (gchar*)0); g_return_val_if_fail(list, (gchar*)0); if (!*list) return (gchar*)0; if (kind == VISU_CONFIG_FILE_RESOURCE) file = getValidFileWithHeader(accessMode, RESOURCES_FILENAMES, kind, list); else file = getValidFileWithHeader(accessMode, PARAMETERS_FILENAMES, kind, list); if (*list) *list = g_list_next(*list); if (!file) return file; if (utf8) { fileUTF8 = g_filename_from_utf8(file, -1, NULL, NULL, NULL); g_free(file); return fileUTF8; } else return file; } /** * visu_config_file_getDefaultFilename: * @kind: an integer identifier. * * This methods is used to get the filename used for different * config files. * * Returns: the filename of config file. The returned *gchar is * owned by V_Sim and should not be freed or modified. */ const gchar* visu_config_file_getDefaultFilename(int kind) { g_return_val_if_fail(kind == VISU_CONFIG_FILE_RESOURCE || kind == VISU_CONFIG_FILE_PARAMETER, (const gchar*)0); if (kind == VISU_CONFIG_FILE_RESOURCE) return RESOURCES_FILENAMES[0]; else return PARAMETERS_FILENAMES[0]; } /** * visu_config_file_getPathList: * @kind: an integer identifier. * * V_Sim stores a list of paths where to look for resources or parameters * files, this method is used to get these lists. * * Returns: (transfer none) (element-type filename): the list of the * parameters or resources paths. This list is read-only. */ GList* visu_config_file_getPathList(int kind) { g_return_val_if_fail(kind == VISU_CONFIG_FILE_RESOURCE || kind == VISU_CONFIG_FILE_PARAMETER, (GList*)0); if (kind == VISU_CONFIG_FILE_RESOURCE) return resourcesPath; else return parametersPath; } GList* visuConfigFileAdd_resourcesPath(char* dir) { GList *element; if (!dir || !dir[0]) return (GList*)0; element = g_list_find_custom(resourcesPath, (gconstpointer)dir, compareStringsInGList); if (!element) { DBG_fprintf(stderr, "Visu ConfigFile: add a new resource directory" " to the path :\n '%s'\n", dir); resourcesPath = g_list_insert(resourcesPath, (gpointer)dir, 1); return resourcesPath->next; } else return (GList*)element; } /** * visu_config_file_exportToXML: * @filename: a string in the encoding of the file system ; * @kind: either #VISU_CONFIG_FILE_PARAMETER or * #VISU_CONFIG_FILE_RESOURCE ; * @error: a location to store an error. * * Export all the registered entries for resources or parameters to an * XML file. * * Returns: TRUE if the file is written with success. */ gboolean visu_config_file_exportToXML(const gchar *filename, int kind, GError **error) { GString *str; GList *tmpLst; VisuConfigFileEntry *entry; gboolean status; gchar *desc; g_return_val_if_fail(filename && *filename, FALSE); g_return_val_if_fail(kind == VISU_CONFIG_FILE_RESOURCE || kind == VISU_CONFIG_FILE_PARAMETER, FALSE); str = g_string_new("\n"); if (kind == VISU_CONFIG_FILE_PARAMETER) { tmpLst = registeredParameters; g_string_append_printf(str, "\n"); } else { tmpLst = registeredResources; g_string_append_printf(str, "\n"); } while (tmpLst) { entry = (VisuConfigFileEntry*)tmpLst->data; if (entry->tag) g_string_append_printf(str, " \n", entry->key, entry->tag, entry->version); else g_string_append_printf(str, " \n", entry->key, entry->version); desc = g_markup_escape_text(entry->description, -1); g_string_append_printf(str, " %s\n", desc); g_free(desc); if (entry->newKey) g_string_append_printf(str, " \n", entry->newKey); g_string_append_printf(str, " \n"); tmpLst = g_list_next(tmpLst); } g_string_append_printf(str, "\n"); status = g_file_set_contents(filename, str->str, -1, error); g_string_free(str, TRUE); return status; } static void visuConfigFileInit() { gchar *currentDir; DBG_fprintf(stderr, "Visu ConfigFile: initialization process ...\n"); visuConfigFile_entryList = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, freeConfigEntry); g_return_if_fail(visuConfigFile_entryList); registeredResources = (GList*)0; registeredParameters = (GList*)0; exportResourcesList = (GList*)0; exportParametersList = (GList*)0; knownTags = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL); g_return_if_fail(knownTags); currentResPath = (gchar*)0; resourcesPath = (GList*)0; parametersPath = (GList*)0; resourcesPath = g_list_prepend(resourcesPath, (gpointer)V_SIM_DATA_DIR); parametersPath = g_list_prepend(parametersPath, (gpointer)V_SIM_DATA_DIR); resourcesPath = g_list_prepend(resourcesPath, (gpointer)V_SIM_OLD_LOCAL_CONF_DIR); parametersPath = g_list_prepend(parametersPath, (gpointer)V_SIM_OLD_LOCAL_CONF_DIR); resourcesPath = g_list_prepend(resourcesPath, (gpointer)V_SIM_LOCAL_CONF_DIR); parametersPath = g_list_prepend(parametersPath, (gpointer)V_SIM_LOCAL_CONF_DIR); currentDir = g_get_current_dir(); resourcesPath = g_list_prepend(resourcesPath, (gpointer)currentDir); parametersPath = g_list_prepend(parametersPath, (gpointer)currentDir); visu_config_file_addEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_RESOURCES_PATH, DESC_RESOURCES_PATH, 1, readResourcesPaths); visu_config_file_addExportFunction(VISU_CONFIG_FILE_PARAMETER, exportResourcesPaths); } static gboolean readResourcesPaths(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position _U_, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error _U_) { int i; gchar **tokens; gchar *key; g_return_val_if_fail(nbLines == 1, FALSE); tokens = g_strsplit_set(lines[0], ":", -1); for (i = 0; tokens[i]; i++) { key = g_strdup(tokens[i]); key = g_strstrip(key); visuConfigFileAdd_resourcesPath(key); } g_strfreev(tokens); return TRUE; } static void exportResourcesPaths(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { GList *pnt; g_string_append_printf(data, "# %s\n", DESC_RESOURCES_PATH); g_string_append_printf(data, "%s: ", FLAG_RESOURCES_PATH); pnt = resourcesPath; while(pnt) { /* We cancel the first and the last because it's the current working dir and the install dir. */ if (pnt->prev && pnt->next && pnt->next->next) g_string_append_printf(data, "%s", (char*)pnt->data); if (pnt->prev && pnt->next && pnt->next->next && pnt->next->next->next) g_string_append_printf(data, ":"); pnt = g_list_next(pnt); } g_string_append_printf(data, "\n\n"); } /* Specific routines. */ static gboolean _readBoolean(VisuConfigFileEntry *entry, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { gboolean val; g_return_val_if_fail(nbLines == 1 && entry->storage, FALSE); if (!tool_config_file_readBoolean(lines[0], position, &val, 1, error)) return FALSE; *((gboolean*)entry->storage) = val; return TRUE; } static gboolean _readString(VisuConfigFileEntry *entry, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { gchar *str; g_return_val_if_fail(nbLines == 1, FALSE); lines[0] = g_strstrip(lines[0]); if (!lines[0][0]) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d: 1 string value must appear" " after the %s markup.\n"), position, entry->key); return FALSE; } str = *((gchar**)entry->storage); if (str) g_free(str); str = g_strdup(lines[0]); return TRUE; } static gboolean _readFloatv(VisuConfigFileEntry *entry, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { guint i; float *vals; g_return_val_if_fail(nbLines == 1 && entry->storage && entry->nValues > 0, FALSE); vals = g_malloc(sizeof(float) * entry->nValues); if (!tool_config_file_readFloat(lines[0], position, vals, entry->nValues, error)) { g_free(vals); return FALSE; } for (i = 0; i < entry->nValues; i++) if (tool_config_file_clampFloat(vals + i, vals[i], entry->range[0], entry->range[1])) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d: %d floating points" "(%g <= v <= %g) must appear after the %s markup.\n"), position, entry->nValues, entry->range[0], entry->range[1], entry->key); g_free(vals); return FALSE; } memcpy(entry->storage, vals, sizeof(float) * entry->nValues); g_free(vals); return TRUE; } v_sim-3.7.0/src/visu_configFile.h0000644000353400050620000001620612215546106013643 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef VISU_CONFIG_FILE_H #define VISU_CONFIG_FILE_H #include #include #include #include "visu_data.h" #include "openGLFunctions/view.h" typedef struct _VisuConfigFileEntry VisuConfigFileEntry; /** * VISU_CONFIG_FILE_PARAMETER: * * This defines a parameter entry in the config files. */ #define VISU_CONFIG_FILE_PARAMETER 0 /** * VISU_CONFIG_FILE_RESOURCE: * * This defines a resource entry in the config files. */ #define VISU_CONFIG_FILE_RESOURCE 1 /** * VisuConfigFileReadFunc: * @entry: the #VisuConfigFileEntry that raises this callback. * @lines: an array of strings ; * @nbLines: an integer ; * @position: an integer ; * @dataObj: (allow-none): a #VisuData object ; * @view: (allow-none): a #VisuGlView object. * @error: a pointer to a GError pointer. * * This prototype corresponds to methods called when an entry is * found. The @lines argument is an array of lines read from the files. * These strings are copies and can be modified but not freed. There are * @nbLines and this value correspond to the number of lines defined * for the entry. The @error argument is used to store some text * messages and error ids. They should be in UTF8. The @error argument * must be initialised with (GError*)0. The @position argument give the number * of the first line given in @lines argument. If the @dataObj argument is not null, * some updates should be done with read values. * * Returns: TRUE if everything goes right, FALSE otherwise. */ typedef gboolean (*VisuConfigFileReadFunc)(VisuConfigFileEntry *entry, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); /** * VisuConfigFileExportFunc: * @data: an empty GString to store the export ; * @dataObj: (allow-none): a #VisuData object ; * @view: (allow-none): a #VisuGlView object. * * This prototype defines a method that is used to export some resources * or parameters. The @data argument is an empty GString where the export has * to be written. If the argument @dataObj is not null, only resources related * to the #VisuData object should be exported (for parameters files, @dataObj is * always NULL). */ typedef void (*VisuConfigFileExportFunc)(GString *data, VisuData* dataObj, VisuGlView *view); /** * VisuConfigFileForeachFuncExport: * @data: the string where the values are exported to ; * @dataObj: the current #VisuData object, values are related to. * * This structure can be used to encapsulate the arguments of an export method * when used in a foreach glib loop. */ struct _VisuConfigFileForeachFuncExport { GString *data; VisuData *dataObj; }; GType visu_config_file_entry_get_type(void); #define VISU_TYPE_CONFIG_FILE_ENTRY (visu_config_file_entry_get_type()) VisuConfigFileEntry* visu_config_file_addEntry(int kind, const gchar *key, const gchar* description, int nbLines, VisuConfigFileReadFunc readFunc); VisuConfigFileEntry* visu_config_file_addBooleanEntry(int kind, const gchar *key, const gchar* description, gboolean *location); VisuConfigFileEntry* visu_config_file_addFloatArrayEntry(int kind, const gchar *key, const gchar* description, guint nValues, float *location, float clamp[2]); VisuConfigFileEntry* visu_config_file_addStringEntry(int kind, const gchar *key, const gchar* description, gchar **location); void visu_config_file_addExportFunction(int kind, VisuConfigFileExportFunc writeFunc); void visu_config_file_entry_setTag(VisuConfigFileEntry *entry, const gchar *tag); void visu_config_file_entry_setVersion(VisuConfigFileEntry *entry, float version); void visu_config_file_entry_setReplace(VisuConfigFileEntry *newEntry, VisuConfigFileEntry *oldEntry); gboolean visu_config_file_load(int kind, const char* filename, VisuData *dataObj, VisuGlView *view, GError **error); gboolean visu_config_file_save(int kind, const char* fileName, int *lines, VisuData *dataObj, VisuGlView *view, GError **error); gboolean visu_config_file_saveResourcesToXML(const char* filename, int *lines, VisuData *dataObj, VisuGlView *view, GError **error); void visu_config_file_addKnownTag(gchar* tag); void visu_config_file_exportComment(GString *buffer, const gchar *comment); void visu_config_file_exportEntry(GString *buffer, const gchar *name, const gchar *id_value, const gchar *format_, ...); gchar* visu_config_file_getValidPath(int kind, int mode, int utf8); gchar* visu_config_file_getNextValidPath(int kind, int accessMode, GList **list, int utf8); const gchar* visu_config_file_getDefaultFilename(int kind); GList* visu_config_file_getPathList(int kind); GList* visu_config_file_getEntries(int kind); gboolean visu_config_file_exportToXML(const gchar *filename, int kind, GError **error); const gchar* visu_config_file_getPathToResources(); #endif v_sim-3.7.0/src/visu_rendering.c0000644000353400050620000007761412215546106013560 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse m�l : BILLARD, non joignable par m�l ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant � visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est r�gi par la licence CeCILL soumise au droit fran�ais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffus�e par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez acc�der � cet en-t�te signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept� les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifdef HAVE_CONFIG_H #include #endif #include "visu_rendering.h" #include "visu_data.h" #include "visu_basic.h" #include "visu_tools.h" #include "visu_configFile.h" #include "coreTools/toolConfigFile.h" #include "renderingMethods/renderingAtomic.h" #include "renderingMethods/renderingSpin.h" #include #include #include #include #include /** * SECTION:visu_rendering * @short_description: Methods to create and add new rendering * methods. * * The way visu renders its data is done by modules. They are * called rendering methods and they describes how data are drawn on * the screen. Many can be defined but only one is used at a time to * render the data. * * One or more file type are associated with a rendering * method. And a rendering method must specify the way to load the * data it needs. Taking the example of a spin system representation, * there are two kinds of file. The first kind describes the position * the spin and the second contains their orientations. * * To create a new rendering method, subclass * #VisuRendering. The name is mandatory and must be * unique. The description is not compulsory. The number of file kinds * is also required. Use renderingMethodSet_fileType() to associated a * #GList of #ToolFileFormat. In our example of spin system, the first * kind of file is about positions, and the associated file formats * are *.ascii, *.d3 and *.xyz. * * The #VisuRendering_struct has to two pointers on methods * that are important. The first, createOpenGLElementFunc() is called * when V_Sim needs to create an OpenGL list corresponding to the * #VisuElement given as argument. This list then can be used to * render each node and thus accelerating the rendering * operations. The second method is createOpenGLNodeFunc() and is * called by V_Sim for each node of the system when the main OpenGL * list (the one for the nodes) is created. Thus, in the contrary of * the first method, thios one should not create an OpenGL list but * directly call OpenGL routines to draw the node. This method is also * responsible to put the node at the right position. Use * visu_data_getNodePosition() to retrieve the position and translate * the node accordingly. */ /** * VisuRendering: * * This structure is used to describe a rendering method. Besides * names, representing icon... this structure stores pointers to * method technically used to draw elements with this method. */ /** * VisuRenderingFormatLoad_struct: * @name: a descriptive name ; * @fmt: file formats associated to this load method ; * @load: the load method ; * @priority: an int. * * The priority argument is used when a file is tested to be opened. * The smaller, the earlier the load method is tested. */ typedef struct _LoadFormat { ToolFileFormat *fmt; VisuRenderingLoadFormatFunc load; int priority; } LoadFormat; struct _VisuRenderingPrivate { /* Some variable to describe this rendering method. The attribute name is mandatory since it is used to identify the method. */ gchar* name; gchar* label; gchar* desc; /* A path to a small 16x16 image to represent the method. If null, no image is used. */ gchar* icon; /* Dealing with file type. */ /* Number of files required to render one set of data. */ guint nFiles; GList **formats; gchar **fileTypeLabel; /* Pointers to useful openGL methods. */ /* VisuRenderingCreateElementFunc createElement; */ /* VisuRenderingCreateNodeFunc createNode; */ /* VisuRenderingGetNodeExtendFunc getExtend; */ gboolean dispose_has_run; }; enum { FILE_TYPE_CHANGED, ELEMENT_SIZE_CHANGED, LAST_SIGNAL }; enum { PROP_0, NAME_PROP, LABEL_PROP, DESC_PROP, NFILES_PROP }; /* Id of possible signals. */ static guint signals[LAST_SIGNAL]; static GQuark quark = (GQuark)0; /* A GHashTable to store all the available rendering methods in the system. The keys are the name of each method. */ static GHashTable *tableOfMethods = (GHashTable*)0; /* The list of the available rendering method. */ static GList *listOfMethods = (GList*)0; #define FLAG_FAV_RENDER "rendering_favoriteMethod" #define DESC_FAV_RENDER "Favorite method used to render files ; chain" #define DEFAULT_RENDER_FAV "" static gboolean readFavVisuRendering(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static void exportFavVisuRendering(GString *data, VisuData *dataObj, VisuGlView *view); /* Local callbacks. */ static void visu_rendering_dispose(GObject* obj); static void visu_rendering_finalize(GObject* obj); static void visu_rendering_get_property(GObject* obj, guint property_id, GValue *value, GParamSpec *pspec); static void visu_rendering_set_property(GObject* obj, guint property_id, const GValue *value, GParamSpec *pspec); /* Local methods. */ static void setupAllMethods(); static gint comparePriority(gconstpointer a, gconstpointer b); G_DEFINE_TYPE(VisuRendering, visu_rendering, G_TYPE_OBJECT) static void visu_rendering_class_init(VisuRenderingClass *klass) { GType paramFloat[1] = {G_TYPE_FLOAT}; DBG_fprintf(stderr, "Visu Rendering: creating the class of the object.\n"); /* Connect freeing methods. */ G_OBJECT_CLASS(klass)->dispose = visu_rendering_dispose; G_OBJECT_CLASS(klass)->finalize = visu_rendering_finalize; G_OBJECT_CLASS(klass)->set_property = visu_rendering_set_property; G_OBJECT_CLASS(klass)->get_property = visu_rendering_get_property; klass->createElement = NULL; klass->createNode = NULL; klass->getNodeExtend = NULL; klass->getElementGlId = NULL; /* Initialise statics. */ quark = g_quark_from_static_string("visu_rendering"); /** * VisuRendering::fileTypeChanged: * @obj: the object emitting the signal. * * TODO * * Since: 3.6 */ signals[FILE_TYPE_CHANGED] = g_signal_newv ("fileTypeChanged", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, NULL /* class closure */, NULL /* accumulator */, NULL /* accu_data */, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE /* return_type */, 0 /* n_params */, NULL /* param_types */); /** * VisuRendering::elementSizeChanged: * @obj: the object emitting the signal. * @size: the new size. * * Emitted when the size of a element is changed. * * Since: 3.6 */ signals[ELEMENT_SIZE_CHANGED] = g_signal_newv ("elementSizeChanged", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE, NULL /* class closure */, NULL /* accumulator */, NULL /* accu_data */, g_cclosure_marshal_VOID__FLOAT, G_TYPE_NONE /* return_type */, 1 /* n_params */, paramFloat /* param_types */); /** * VisuRendering::name: * * The name identifying the method. Can be used as an id. * * Since: 3.6 */ g_object_class_install_property (G_OBJECT_CLASS(klass), NAME_PROP, g_param_spec_string("name", _("Name"), _("Name of the method."), "", G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE | G_PARAM_READABLE)); /** * VisuRendering::label: * * The label describing the method, can be translate and used in a UI. * * Since: 3.6 */ g_object_class_install_property (G_OBJECT_CLASS(klass), LABEL_PROP, g_param_spec_string("label", _("Label"), _("Label of the method."), "", G_PARAM_WRITABLE | G_PARAM_READABLE)); /** * VisuRendering::description: * * A longer text describing the method, can be translate and used in a UI. * * Since: 3.6 */ g_object_class_install_property (G_OBJECT_CLASS(klass), DESC_PROP, g_param_spec_string("description", _("Description"), _("Description of the method."), "", G_PARAM_WRITABLE | G_PARAM_READABLE)); /** * VisuRendering::nFiles: * * Number of files to be read to get information for the rendering method. * * Since: 3.6 */ g_object_class_install_property (G_OBJECT_CLASS(klass), NFILES_PROP, g_param_spec_uint("nFiles", _("Number of input files"), _("Required number of input files to read to load a data."), 1, 100, 1, G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE | G_PARAM_READABLE)); /* Initialise internal variables. */ visu_config_file_addEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_FAV_RENDER, DESC_FAV_RENDER, 1, readFavVisuRendering); visu_config_file_addExportFunction(VISU_CONFIG_FILE_PARAMETER, exportFavVisuRendering); tableOfMethods = g_hash_table_new(g_str_hash, g_str_equal); listOfMethods = (GList*)0; g_type_class_add_private(klass, sizeof(VisuRenderingPrivate)); } static void visu_rendering_init(VisuRendering *obj) { DBG_fprintf(stderr, "Visu rendering: initializing a new object (%p).\n", (gpointer)obj); obj->priv = G_TYPE_INSTANCE_GET_PRIVATE(obj, VISU_TYPE_RENDERING, VisuRenderingPrivate); obj->priv->name = (gchar*)0; obj->priv->label = (gchar*)0; obj->priv->desc = (gchar*)0; obj->priv->icon = (gchar*)0; obj->priv->nFiles = 0; obj->priv->formats = (GList**)0; obj->priv->fileTypeLabel = (gchar**)0; obj->priv->dispose_has_run = FALSE; } /* This method can be called several times. It should unref all of its reference to GObjects. */ static void visu_rendering_dispose(GObject* obj) { DBG_fprintf(stderr, "Visu Rendering: dispose object %p.\n", (gpointer)obj); if (VISU_RENDERING(obj)->priv->dispose_has_run) return; VISU_RENDERING(obj)->priv->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS(visu_rendering_parent_class)->dispose(obj); } /* This method is called once only. */ static void visu_rendering_finalize(GObject* obj) { VisuRenderingPrivate *meth; GList *tmpLst; guint i; LoadFormat *format; g_return_if_fail(obj); DBG_fprintf(stderr, "Visu Rendering: finalize object %p.\n", (gpointer)obj); meth = VISU_RENDERING(obj)->priv; /* Remove object from class lists list. */ listOfMethods = g_list_remove(listOfMethods, (gpointer)obj); g_hash_table_remove(tableOfMethods, (gpointer)(meth->name)); if (meth->name) g_free(meth->name); if (meth->label) g_free(meth->label); if (meth->desc) g_free(meth->desc); if (meth->formats) { for (i = 0; i < meth->nFiles; i++) for (tmpLst = meth->formats[i]; tmpLst; tmpLst = g_list_next(tmpLst)) { format = (LoadFormat*)tmpLst->data; g_object_unref(format->fmt); g_free(format); } g_free(meth->formats); } if (meth->fileTypeLabel) g_strfreev(meth->fileTypeLabel); G_OBJECT_CLASS(visu_rendering_parent_class)->finalize(obj); } static void visu_rendering_get_property(GObject* obj, guint property_id, GValue *value, GParamSpec *pspec) { VisuRenderingPrivate *self = VISU_RENDERING(obj)->priv; DBG_fprintf(stderr, "Visu Rendering: get property '%s' -> ", g_param_spec_get_name(pspec)); switch (property_id) { case NAME_PROP: g_value_set_string(value, self->name); DBG_fprintf(stderr, "%s.\n", self->name); break; case LABEL_PROP: g_value_set_string(value, self->label); DBG_fprintf(stderr, "%s.\n", self->label); break; case DESC_PROP: g_value_set_string(value, self->desc); DBG_fprintf(stderr, "%s.\n", self->desc); break; case NFILES_PROP: g_value_set_uint(value, self->nFiles); DBG_fprintf(stderr, "%d.\n", self->nFiles); break; default: /* We don't have any other property... */ G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, property_id, pspec); break; } } static void visu_rendering_set_property(GObject* obj, guint property_id, const GValue *value, GParamSpec *pspec) { VisuRenderingPrivate *self = VISU_RENDERING(obj)->priv; DBG_fprintf(stderr, "Visu Rendering: set property '%s' -> ", g_param_spec_get_name(pspec)); switch (property_id) { case NAME_PROP: self->name = g_value_dup_string(value); DBG_fprintf(stderr, "%s.\n", self->name); DBG_fprintf(stderr, "Visu Rendering: registering this method.\n"); g_hash_table_insert(tableOfMethods, (gpointer)self->name, (gpointer)VISU_RENDERING(obj)); listOfMethods = g_list_append(listOfMethods, (gpointer)VISU_RENDERING(obj)); break; case LABEL_PROP: self->label = g_value_dup_string(value); DBG_fprintf(stderr, "%s.\n", self->label); break; case DESC_PROP: self->desc = g_value_dup_string(value); DBG_fprintf(stderr, "%s.\n", self->desc); break; case NFILES_PROP: self->nFiles = g_value_get_uint(value); DBG_fprintf(stderr, "%d.\n", self->nFiles); self->formats = g_malloc0(sizeof(GList*) * self->nFiles); self->fileTypeLabel = g_malloc0(sizeof(gchar*) * (self->nFiles + 1)); break; default: /* We don't have any other property... */ G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, property_id, pspec); break; } } static gint comparePriority(gconstpointer a, gconstpointer b) { if (((LoadFormat*)a)->priority < ((LoadFormat*)b)->priority) return (gint)-1; else if (((LoadFormat*)a)->priority > ((LoadFormat*)b)->priority) return (gint)+1; else return (gint)0; } static void setupAllMethods() { DBG_fprintf(stderr,"Visu Rendering: instantiate the rendering methods.\n"); /* Setup all methods. */ visu_rendering_atomic_new(); visu_rendering_spin_new(); } /** * visu_rendering_getNFileTypes: * @method: a method. * * This method is used to get the number of kind of files needed to * render a set of data. * * Returns: how many kind of files are handled by the given VisuRendering. */ guint visu_rendering_getNFileTypes(VisuRendering *method) { g_return_val_if_fail(VISU_IS_RENDERING_TYPE(method), -1); return method->priv->nFiles; } /** * visu_rendering_setFileTypeLabel: * @method: a method ; * @fileType: an integer used as a key, must >= 0 and < method->nFiles ; * @name: a string to shortly describe the kind of file type (not NULL). * * Store a list of #ToolFileFormat for the kind of file @fileType. The @name * argument is copied. but warning, the @fileTypeList GList* is not copied. */ void visu_rendering_setFileTypeLabel(VisuRendering *method, guint fileType, const gchar* name) { g_return_if_fail(VISU_IS_RENDERING_TYPE(method) && name && name[0]); g_return_if_fail(fileType < method->priv->nFiles); if (method->priv->fileTypeLabel[fileType]) g_free(method->priv->fileTypeLabel[fileType]); method->priv->fileTypeLabel[fileType] = g_strdup(name); } /** * visu_rendering_addFileFormat: * @method: a method ; * @fileType: an integer used as a key, must >= 0 and < method->nFiles. * @fmt: a #ToolFileFormat ; * @priority: the priority (lower sooner) ; * @loadFunc: (scope call): the loading routine. * * Add a file format descriptor to the list of already known file formats * of the key @fileType. */ void visu_rendering_addFileFormat(VisuRendering *method, guint fileType, ToolFileFormat *fmt, guint priority, VisuRenderingLoadFormatFunc loadFunc) { LoadFormat *format; g_return_if_fail(VISU_IS_RENDERING_TYPE(method) && fmt && loadFunc); g_return_if_fail(fileType < method->priv->nFiles); format = g_malloc(sizeof(LoadFormat)); format->fmt = fmt; format->load = loadFunc; format->priority = priority; method->priv->formats[fileType] = g_list_prepend(method->priv->formats[fileType], (gpointer)format); method->priv->formats[fileType] = g_list_sort(method->priv->formats[fileType], comparePriority); g_signal_emit(G_OBJECT(method), signals[FILE_TYPE_CHANGED], 0, NULL); } /** * visu_rendering_setFileFormat: * @meth: a #VisuRendering object. * @fileType: a file kind id. * @from: a #VisuRendering object. * * It copies the #ToolFileFormat of method @from to @meth for the * given @fileType. * * Since: 3.6 */ void visu_rendering_setFileFormat(VisuRendering *meth, guint fileType, VisuRendering *from) { GList *tmpLst; LoadFormat *format, *f; g_return_if_fail(VISU_IS_RENDERING_TYPE(meth) && VISU_IS_RENDERING_TYPE(from)); g_return_if_fail(fileType < meth->priv->nFiles); g_return_if_fail(fileType < from->priv->nFiles); for (tmpLst = meth->priv->formats[fileType]; tmpLst; tmpLst = g_list_next(tmpLst)) { format = (LoadFormat*)tmpLst->data; g_object_unref(G_OBJECT(format->fmt)); g_free(format); } g_list_free(meth->priv->formats[fileType]); meth->priv->formats[fileType] = (GList*)0; for (tmpLst = from->priv->formats[fileType]; tmpLst; tmpLst = g_list_next(tmpLst)) { f = (LoadFormat*)tmpLst->data; format = g_malloc(sizeof(LoadFormat)); format->fmt = tool_file_format_copy(f->fmt); format->load = f->load; format->priority = f->priority; meth->priv->formats[fileType] = g_list_prepend(meth->priv->formats[fileType], (gpointer)format); } meth->priv->formats[fileType] = g_list_sort(meth->priv->formats[fileType], comparePriority); g_signal_emit(G_OBJECT(meth), signals[FILE_TYPE_CHANGED], 0, NULL); } /** * visu_rendering_getFileFormat: * @method: this #VisuRendering object. * @fileType: the file kind of filee format to get from. * * This method is used to get the file formats associated to a kind of input file * handled by the rendering method. * * Returns: (transfer container) (element-type ToolFileFormat*): a * GList* with the #ToolFileFormat. This GList should been considered * read-only. * * Since: 3.6 */ GList* visu_rendering_getFileFormat(VisuRendering *method, guint fileType) { GList* lst, *tmpLst; g_return_val_if_fail(VISU_IS_RENDERING_TYPE(method), (GList*)0); g_return_val_if_fail(fileType < method->priv->nFiles, (GList*)0); lst = (GList*)0; for (tmpLst = method->priv->formats[fileType]; tmpLst; tmpLst = g_list_next(tmpLst)) lst = g_list_append(lst, (gpointer)((LoadFormat*)tmpLst->data)->fmt); return lst; } /** * visu_rendering_getFileTypeName: * @method: a method ; * @fileType: an integer used as a key, must >= 0 and < method->priv->nFiles. * * This method is used to get the name associated to a kind of input file * handled by the rendering method. * * Returns: a string own by V_Sim. This string should been considered read-only. */ const gchar* visu_rendering_getFileTypeName(VisuRendering *method, guint fileType) { g_return_val_if_fail(VISU_IS_RENDERING_TYPE(method), (gchar*)0); g_return_val_if_fail(fileType < method->priv->nFiles, (gchar*)0); return method->priv->fileTypeLabel[fileType]; } /** * visu_rendering_getSizeOfElement: * @method: a method ; * @ele: a #VisuElement to get the size of. * * This method is used to retrieve the radius of the sphere that contains * the @ele. * * Returns: the radius of the given element. */ float visu_rendering_getSizeOfElement(VisuRendering *method, VisuElement *ele) { g_return_val_if_fail(VISU_IS_RENDERING_TYPE(method) && VISU_IS_ELEMENT_TYPE(ele), 0.); g_return_val_if_fail(VISU_RENDERING_GET_CLASS(method)->getNodeExtend, 0.); DBG_fprintf(stderr, "Visu Rendering: get size for element '%s'.\n", ele->name); return VISU_RENDERING_GET_CLASS(method)->getNodeExtend(ele); } /** * visu_rendering_getElementGlId: * @method: a method ; * @ele: a #VisuElement object. * * This method is used to get the OpenGL identifier of a list for @ele. * * Since: 3.7 * * Returns: a OpenGL list identifier. **/ int visu_rendering_getElementGlId(VisuRendering *method, VisuElement *ele) { g_return_val_if_fail(VISU_IS_RENDERING_TYPE(method) && VISU_IS_ELEMENT_TYPE(ele), 0); g_return_val_if_fail(VISU_RENDERING_GET_CLASS(method)->getElementGlId, 0); DBG_fprintf(stderr, "Visu Rendering: get gl id for element '%s'.\n", ele->name); return VISU_RENDERING_GET_CLASS(method)->getElementGlId(ele); } /** * visu_rendering_createElement: * @method: a #VisuRendering method. * @element: a #VisuElement object. * @view: a #VisuGlView object. * * Use the create element function of @method to render @element for * the given zoom level. * * Since: 3.6 * * Returns: the OpenGL list id of this element. */ int visu_rendering_createElement(VisuRendering *method, VisuElement *element, VisuGlView *view) { g_return_val_if_fail(VISU_IS_RENDERING_TYPE(method), 0); return VISU_RENDERING_GET_CLASS(method)->createElement(element, view); } /** * visu_rendering_createNode: * @method: a #VisuRendering method. * @data: the #VisuData object the @node is taken from. * @node: a #VisuNode of @data. * @ele: (allow-none): the #VisuElement of @node or NULL. * @eleGlId: the OpenGL list id repsresenting @ele or -1 to get the * default one. * * Create @node at the right position calling OpenGL routines. * * Since: 3.6 */ void visu_rendering_createNode(VisuRendering *method, VisuData *data, VisuNode *node, VisuElement *ele, int eleGlId) { g_return_if_fail(VISU_IS_RENDERING_TYPE(method)); /* Default values. */ if (!ele) ele = visu_node_array_getElement(VISU_NODE_ARRAY(data), node); if (eleGlId == -1) eleGlId = visu_rendering_getElementGlId(method, ele); /* Active call. */ VISU_RENDERING_GET_CLASS(method)->createNode(data, node, ele, eleGlId); } /** * visu_rendering_getName: * @method: a #VisuRendering method. * @UTF8: a boolean. * * Get its name (in @UTF8 or not). * * Returns: a string, owned by V_Sim. */ const gchar* visu_rendering_getName(VisuRendering *method, gboolean UTF8) { g_return_val_if_fail(VISU_IS_RENDERING_TYPE(method), (const gchar*)0); if (UTF8) return method->priv->label; else return method->priv->name; } /** * visu_rendering_getDescription: * @method: a #VisuRendering method. * * Get its description (in UTF8). * * Returns: a string, owned by V_Sim. */ const gchar* visu_rendering_getDescription(VisuRendering *method) { g_return_val_if_fail(VISU_IS_RENDERING_TYPE(method), (const gchar*)0); return method->priv->desc; } /** * visu_rendering_getIconPath: * @method: a #VisuRendering method. * * Get the location where to find the icon of the method. * * Returns: a string, owned by V_Sim. */ const gchar* visu_rendering_getIconPath(VisuRendering *method) { g_return_val_if_fail(VISU_IS_RENDERING_TYPE(method), (const gchar*)0); return method->priv->icon; } /** * visu_rendering_setIcon: * @method: a method ; * @path: a path to an image file. * * This method is used to set the path to an icon for the specified method. * The path is copied, and the given name can be freed freely after a call to * this method. */ void visu_rendering_setIcon(VisuRendering *method, const char *path) { g_return_if_fail(VISU_IS_RENDERING_TYPE(method)); if (method->priv->icon) { g_free(method->priv->icon); method->priv->icon = (gchar*)0; } if (!path) return; method->priv->icon = g_strdup(path); } static gboolean loadFileType(VisuRendering *method, VisuData *data, guint fileType, int nSet, GCancellable *cancel, GError **error) { gchar *file; gboolean loadOk; GList *tmpLst; ToolFileFormat *fmt; LoadFormat *load; #if GLIB_MINOR_VERSION > 5 struct stat buf; #endif g_return_val_if_fail(error && *error == (GError*)0, FALSE); file = g_strdup(visu_data_getFile(data, fileType, &fmt)); if (!file) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FILE, _("No file name available.")); return FALSE; } if (!g_file_test(file, G_FILE_TEST_IS_REGULAR)) { g_free(file); *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FILE, _("The specified file is" " not a regular file or may not exist.")); return FALSE; } #if GLIB_MINOR_VERSION > 5 if (!g_stat(file, &buf) && buf.st_size == 0) { g_free(file); *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FILE, _("The specified file is" " an empty file.")); return FALSE; } #endif loadOk = FALSE; tmpLst = method->priv->formats[fileType]; while (tmpLst && !loadOk) { load = (LoadFormat*)(tmpLst->data); /* Each load may set error even if the format is not recognise and loadOK is FALSE, then we need to free the error. */ if (*error) g_error_free(*error); *error = (GError*)0; if (!fmt || load->fmt == fmt) { DBG_fprintf(stderr,"Visu Rendering: testing '%s' with format: %s.\n", file, tool_file_format_getName(load->fmt)); DBG_fprintf(stderr, " | %p has %d ref counts.\n", (gpointer)data, G_OBJECT(data)->ref_count); loadOk = load->load(data, file, load->fmt, nSet, cancel, error); DBG_fprintf(stderr,"Visu Rendering: with format '%s' returns %d.\n", tool_file_format_getName(load->fmt), loadOk); DBG_fprintf(stderr, " | %p has %d ref counts.\n", (gpointer)data, G_OBJECT(data)->ref_count); } if (*error && (*error)->domain == G_FILE_ERROR) { g_free(file); return FALSE; } if (fmt && load->fmt == fmt) tmpLst = (GList*)0; else tmpLst = g_list_next(tmpLst); } g_free(file); if (!loadOk) { if (*error) g_error_free(*error); *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FILE, _("Impossible to load this file, unrecognised format.\n")); return FALSE; } else if (*error) return FALSE; return TRUE; } /** * visu_rendering_load: * @method: a #VisuRendering method. * @data: a new #VisuData object to load into. * @nSet: the set id to read from. * @cancel: a cancellable. * @error: a location for possible error. * * Call the load routine of @method. Filenames to read from should * have been set to @data using visu_data_addFile(). If @format is * NULL, an automatic detection is used, trying all available file * formats. * * Returns: TRUE on success. */ gboolean visu_rendering_load(VisuRendering *method, VisuData *data, int nSet, GCancellable *cancel, GError **error) { guint i; VisuNodeArrayIter iter; ToolUnits unit, preferedUnit; g_return_val_if_fail(error && *error == (GError*)0, FALSE); g_return_val_if_fail(data, FALSE); DBG_fprintf(stderr, "Visu Rendering: starting load procedure...\n"); for (i = 0; i < method->priv->nFiles; i++) { if(!loadFileType(method, data, i, nSet, cancel, error)) return FALSE; /* If we have errors, we return. */ if (*error) return TRUE; } /* We do a last check on population... in case. */ visu_node_array_iterNew(VISU_NODE_ARRAY(data), &iter); g_return_val_if_fail(iter.nAllStoredNodes, FALSE); DBG_fprintf(stderr, "loading OK (%d nodes).\n", iter.nAllStoredNodes); /* Setup additional infos. */ visu_data_setISubset(data, nSet); visu_data_setChangeElementFlag(data, FALSE); unit = visu_box_getUnit(visu_boxed_getBox(VISU_BOXED(data))); preferedUnit = visu_basic_getPreferedUnit(); if (preferedUnit != TOOL_UNITS_UNDEFINED && unit != TOOL_UNITS_UNDEFINED && unit != preferedUnit) visu_box_setUnit(visu_boxed_getBox(VISU_BOXED(data)), preferedUnit); return TRUE; } /** * visu_rendering_getAllObjects: * * This method gives a GList with pointers to each rendering method. * Warning : the returned GList is not a copy, it must not be modified, * just read. * * Returns: (element-type VisuRendering*) (transfer none): A GList * containing all the registered rendering methods. */ GList* visu_rendering_getAllObjects(void) { if (!tableOfMethods) g_type_class_ref(VISU_TYPE_RENDERING); if (g_hash_table_size(tableOfMethods) == 0) setupAllMethods(); return listOfMethods; } /** * visu_rendering_getByName: * @name: (type filename): a string. * * Get the corresponding #VisuRendering method to @name. * * Returns: (transfer none): * * Since: 3.6 */ VisuRendering* visu_rendering_getByName(const gchar *name) { if (!tableOfMethods) g_type_class_ref(VISU_TYPE_RENDERING); if (g_hash_table_size(tableOfMethods) == 0) setupAllMethods(); return (VisuRendering*)g_hash_table_lookup(tableOfMethods, (gpointer)name); } /** * visu_rendering_class_getErrorQuark: * * Internal function to handle error. * * Returns: a #GQuark for #VisuRendering method errors. */ GQuark visu_rendering_class_getErrorQuark(void) { if (!quark) g_type_class_ref(VISU_TYPE_RENDERING); return quark; } /**************/ /* Parameters */ /**************/ static gboolean readFavVisuRendering(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { VisuRendering *meth; g_return_val_if_fail(nbLines == 1, FALSE); lines[0] = g_strstrip(lines[0]); if (!lines[0][0]) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d:" " there is no specified method.\n"), position); return FALSE; } else { meth = visu_rendering_getByName(lines[0]); if (!meth) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d:" " the specified method (%s) is unknown.\n"), position, lines[0]); return FALSE; } visu_object_setRendering(VISU_OBJECT_INSTANCE, meth); } return TRUE; } static void exportFavVisuRendering(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { VisuRendering *meth; meth = visu_object_getRendering(VISU_OBJECT_INSTANCE); g_return_if_fail(meth); g_string_append_printf(data, "# %s\n", DESC_FAV_RENDER); g_string_append_printf(data, "%s: %s\n\n", FLAG_FAV_RENDER, meth->priv->name); } v_sim-3.7.0/src/visu_rendering.h0000644000353400050620000002523112215546106013551 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef VISU_DRAWING_H #define VISU_DRAWING_H #include #include #include #include "visu_data.h" #include "openGLFunctions/view.h" #include "coreTools/toolFileFormat.h" G_BEGIN_DECLS /* The way visu renders its data is done by modules. They are called rendering methods and they describes how data are drawn on the screen. Many can be defined but only one is used at a time to render the data. One or more file type are associated with a rendering method. And a rendering method must specify the way to load the data it needs. A rendering method can introduced new resources and it must implement methods and create variable to deal with them : - one GHashTable that store as keys the name of all the resources introduced by the method and as value a description that is used as a commentary when the resources are exported to a file. - one method to read from a line the values of a specified resource. - one method to write to a file the values of a specified resource. */ /** * VISU_ERROR_RENDERING: (skip) * * Internal function for error handling. */ #define VISU_ERROR_RENDERING visu_rendering_class_getErrorQuark() GQuark visu_rendering_class_getErrorQuark(void); /** * VisuRenderingErrorFlag: * @RENDERING_ERROR_METHOD: Error from the rendering method. * @RENDERING_ERROR_FILE: Error when opening. * @RENDERING_ERROR_FORMAT: Wrongness in format. * @RENDERING_ERROR_CANCEL: the rendering operation has been cancelled. * * Thiese are flags used when reading a file with a rendering method. */ typedef enum { RENDERING_ERROR_METHOD, /* Error from the rendering method. */ RENDERING_ERROR_FILE, /* Error when opening. */ RENDERING_ERROR_FORMAT, /* Wrongness in format. */ RENDERING_ERROR_CANCEL /* Cancellation asked. */ } VisuRenderingErrorFlag; /** * VISU_TYPE_RENDERING: * * return the type of #VisuRendering. */ #define VISU_TYPE_RENDERING (visu_rendering_get_type ()) /** * VISU_RENDERING: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuRendering type. */ #define VISU_RENDERING(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_RENDERING, VisuRendering)) /** * VISU_RENDERING_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuRenderingClass. */ #define VISU_RENDERING_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_RENDERING, VisuRenderingClass)) /** * VISU_IS_RENDERING_TYPE: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuRendering object. */ #define VISU_IS_RENDERING_TYPE(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_RENDERING)) /** * VISU_IS_RENDERING_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuRenderingClass class. */ #define VISU_IS_RENDERING_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_RENDERING)) /** * VISU_RENDERING_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. */ #define VISU_RENDERING_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_RENDERING, VisuRenderingClass)) /** * VisuRenderingLoadFormatFunc: * @data: (transfer full): a #VisuData object ; * @filename: the access to the file to load ; * @format: a #ToolFileFormat object (can be NULL) ; * @nSet: an integer ; * @cancel: a cancellable. * @error: a pointer to store possible errors. * * This is an interface for a generic load method. This method read the file * positionned on @filename and populate or change the arrays in * @data. When enter this method, the @data argument is already * allocated but its arrays may be empty and unallocated (depending on * context). If the load method fails (because the format is wrong or * anything else), the @data argument should not be modified. If some * errors occur, the pointer @error will be instanciated. A * #VisuRendering can have several #VisuRenderingLoadFormatFunc methods * for each format they support. The @nSet argument is used to load a * specific set of nodes if the input format supports it. If @nSet is * 0, then the default set of nodes is loaded. * * Returns: FALSE if @data is unchanged (wrong format), TRUE otherwise (even if * some minor errors have happened). */ typedef gboolean (*VisuRenderingLoadFormatFunc) (VisuData *data, const gchar* filename, ToolFileFormat *format, int nSet, GCancellable *cancel, GError **error); /** * VisuRenderingCreateElementFunc: * @ele: a #VisuElement object ; * @view: a #VisuGlView object. * * Such functions are called whenever a newElement is registered. * * Returns: an id representing an OpenGL list in which the element * has been created. */ typedef int (*VisuRenderingCreateElementFunc) (VisuElement* ele, VisuGlView *view); /** * VisuRenderingCreateNodeFunc: * @visuData: a #VisuData object ; * @node: a #VisuElement ; * @ele: a #VisuElement ; * @eleGlId: an identifier. * * Such functions are called to draw @node at its right position. * The @ele parameter is the #VisuElement of the given @node and the @visuData one * points to the #VisuData object that contains this node. @eleGlId * additionnal parameter represent an identifier to the OpenGL list * @ele is represented by. One can use this parameter to avoid calling * visu_rendering_getElementGlId() for each node. */ typedef void (*VisuRenderingCreateNodeFunc) (VisuData *visuData, VisuNode* node, VisuElement* ele, int eleGlId); /** * VisuRenderingGetNodeExtendFunc: * @ele: a @VisuElement. * * This function is required to inform the OpenGL drawer * and to adapt the maximum size of the drawing area. * * Returns: the geometrical size of the element. */ typedef float (*VisuRenderingGetNodeExtendFunc) (VisuElement* ele); /** * VisuRenderingGetElementGlId: * @ele: a @VisuElement. * * This function is used to get the OpenGL list identifier for @ele. * * Since: 3.7 * * Returns: an id. */ typedef int (*VisuRenderingGetElementGlId) (VisuElement* ele); /** * VisuRenderingPrivate: * * An opaque structure. * * Since: 3.6 */ typedef struct _VisuRenderingPrivate VisuRenderingPrivate; typedef struct _VisuRendering VisuRendering; struct _VisuRendering { GObject parent; VisuRenderingPrivate *priv; }; /** * VisuRenderingClass: * @parent: the parent class. * @createElement: a virtual method to create OpenGL shape for a given * #VisuElement. * @getElementGlId: a virtual method to get the OpenGL list id used * for elements. * @createNode: a virtual method to position and draw a specific * #VisuNode. * @getNodeExtend: a virtual method to get the size of a given #VisuElement. * * The structure for the #VisuRenderingClass class. */ typedef struct _VisuRenderingClass VisuRenderingClass; struct _VisuRenderingClass { GObjectClass parent; VisuRenderingCreateElementFunc createElement; VisuRenderingGetElementGlId getElementGlId; VisuRenderingCreateNodeFunc createNode; VisuRenderingGetNodeExtendFunc getNodeExtend; }; /** * visu_rendering_get_type: * * This method returns the type of #VisuRendering, use VISU_TYPE_RENDERING instead. * * Returns: the type of #VisuRendering. */ GType visu_rendering_get_type(void); /***************/ /* Public area */ /***************/ void visu_rendering_addFileFormat(VisuRendering *method, guint fileType, ToolFileFormat *fmt, guint priority, VisuRenderingLoadFormatFunc loadFunc); void visu_rendering_setFileTypeLabel(VisuRendering *method, guint fileType, const gchar *name); void visu_rendering_setFileFormat(VisuRendering *meth, guint fileType, VisuRendering *from); void visu_rendering_setIcon(VisuRendering *method, const gchar *path); gboolean visu_rendering_load(VisuRendering *method, VisuData *data, int nSet, GCancellable *cancel, GError **error); const gchar* visu_rendering_getName(VisuRendering *method, gboolean UTF8); const gchar* visu_rendering_getDescription(VisuRendering *method); guint visu_rendering_getNFileTypes(VisuRendering *method); GList* visu_rendering_getFileFormat(VisuRendering *method, guint fileType); const gchar* visu_rendering_getFileTypeName(VisuRendering *method, guint fileType); const gchar* visu_rendering_getIconPath(VisuRendering *method); int visu_rendering_getElementGlId(VisuRendering *method, VisuElement *ele); float visu_rendering_getSizeOfElement(VisuRendering *method, VisuElement *ele); int visu_rendering_createElement(VisuRendering *method, VisuElement *element, VisuGlView *view); void visu_rendering_createNode(VisuRendering *method, VisuData *data, VisuNode *node, VisuElement *ele, int eleGlId); GList* visu_rendering_getAllObjects(void); VisuRendering* visu_rendering_getByName(const gchar *name); G_END_DECLS #endif v_sim-3.7.0/src/visu_extension.c0000644000353400050620000007027612215547157013623 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "visu_extension.h" #include "visu_configFile.h" #include "coreTools/toolConfigFile.h" #include "openGLFunctions/objectList.h" #include #include #include #include "visu_tools.h" /** * SECTION:visu_extension * @short_description: All objects drawn by V_Sim are defined in by a * #VisuGlExt object * * All objects that are drawn by V_Sim are handled by a * #VisuGlExt object. Such an object has an OpenGL list. This * list is only COMPILED. When V_Sim receives the 'OpenGLAskForReDraw' * or the 'OpenGLForceReDraw' signals, each list of all known * #VisuGlExt are excecuted. This excecution can be canceled if * the used flag of the #VisuGlExt object is set to FALSE. The * order in which the lists are called depends on the priority of the * #VisuGlExt object. This priority is set to * #VISU_GL_EXT_PRIORITY_NORMAL as default value, but it can be * tune by a call to visu_gl_ext_setPriority(). This priority is * an integer, the lower it is, the sooner the list is * excecuted. * * The method registerVisuGlExt() is used to declare to * V_Sim that there is a new #VisuGlExt object available. This * allows to create extension when V_Sim is already * running. Nevertheless, an extension must be initialized in the * initialisation process, it is better to add an * #initVisuGlExtFunc method in the listInitExtensionFunc array * declared in extensions/externalVisuGlExts.h. * * Once again, the OpenGL list corresponding to an OpenGL * extension is COMPILE only. Then, OpenGL methods like glIsenabled() * are totally unusefull because it is called when the list is * compiled not when the list is called. If the extension needs to * alter some OpenGL state, such as desable GL_LIGHTING, it needs to * set a flag for the extension. With this flag, V_Sim will save the * OpenGL states and restore it when the list is called. Use * visu_gl_ext_setSaveState() to set this flag. */ #define FLAG_PARAMETER_MODE "extension_render" #define DESC_PARAMETER_MODE "Rules the way OpenGl draws extensions (see opengl_render); name (string) value (string)" static gboolean readExtensionRendering(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static void exportParametersRendering(GString *data, VisuData *dataObj, VisuGlView *view); /* Method used to compare the priority of two extensions. */ static gint compareExtensionPriority(gconstpointer a, gconstpointer b); static void callList(GList *lst, VisuGlRenderingMode *renderingMode, VisuGlRenderingMode globalRenderingMode); enum { PROP_0, NAME_PROP, ACTIVE_PROP, LABEL_PROP, DESCRIPTION_PROP, PRIORITY_PROP, SAVE_STATE_PROP, NGLOBJ_PROP }; struct _VisuGlExtClassPrivate { /* This flag is TRUE when some priorities are new or have changed, and the list should be reordered. */ gboolean reorderingNeeded; /* A GList to store all the available OpenGL extensions in the system. */ GList *allExtensions; }; struct _VisuGlExtPrivate { gboolean dispose_has_run; /* Some variable to describe this OpenGL extension. The attribute name is mandatory since it is used to identify the method. */ gchar *name, *nameI18n; gchar *description; /* The id of the possible objects list brings by the extension is refered by this int. */ guint nGlObj; int objectListId; /* A priority for the extension. */ guint priority; /* If set, V_Sim save the OpenGL state before the list id is called and restore all states after. */ gboolean saveState; /* Fine tune of rendering mode (VISU_GL_RENDERING_WIREFRAME, smooth...). The flag isSensitiveToRenderingMode define is the extension cares about rendering mode. This flag is FALSE by default. When FALSE, the global value for rendering mode is used. Otherwise the value is stored in preferedRenderingMode. */ gboolean isSensitiveToRenderingMode; VisuGlRenderingMode preferedRenderingMode; /* A boolean to know if this extension is actually used or not. */ gboolean used; }; static VisuGlExtClass *my_class = NULL; static void visu_gl_ext_dispose (GObject* obj); static void visu_gl_ext_finalize (GObject* obj); static void visu_gl_ext_get_property(GObject* obj, guint property_id, GValue *value, GParamSpec *pspec); static void visu_gl_ext_set_property(GObject* obj, guint property_id, const GValue *value, GParamSpec *pspec); G_DEFINE_TYPE(VisuGlExt, visu_gl_ext, G_TYPE_OBJECT) static void visu_gl_ext_class_init(VisuGlExtClass *klass) { VisuConfigFileEntry *confEntry; DBG_fprintf(stderr, "Visu Extension: creating the class of the object.\n"); /* DBG_fprintf(stderr, " - adding new signals ;\n"); */ /* Connect the overloading methods. */ G_OBJECT_CLASS(klass)->dispose = visu_gl_ext_dispose; G_OBJECT_CLASS(klass)->finalize = visu_gl_ext_finalize; G_OBJECT_CLASS(klass)->set_property = visu_gl_ext_set_property; G_OBJECT_CLASS(klass)->get_property = visu_gl_ext_get_property; /* Default methods. */ klass->rebuild = NULL; /** * VisuGlExt::name: * * The name of the extension (used as an id). * * Since: 3.7 */ g_object_class_install_property (G_OBJECT_CLASS(klass), NAME_PROP, g_param_spec_string("name", "Name", "name (id) of extension", "", G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * VisuGlExt::active: * * The extension is used or not. * * Since: 3.7 */ g_object_class_install_property (G_OBJECT_CLASS(klass), ACTIVE_PROP, g_param_spec_boolean("active", "Active", "extension is used or not", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * VisuGlExt::label: * * The label of extension (translated). * * Since: 3.7 */ g_object_class_install_property (G_OBJECT_CLASS(klass), LABEL_PROP, g_param_spec_string("label", "Label", "label (translated) of extension", "", G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * VisuGlExt::description: * * The description of the extension. * * Since: 3.7 */ g_object_class_install_property (G_OBJECT_CLASS(klass), DESCRIPTION_PROP, g_param_spec_string("description", "Description", "description of extension", "", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * VisuGlExt::priority: * * The drawing priority of the extension. * * Since: 3.7 */ g_object_class_install_property (G_OBJECT_CLASS(klass), PRIORITY_PROP, g_param_spec_uint("priority", "Priority", "drawing priority of extension", VISU_GL_EXT_PRIORITY_BACKGROUND, VISU_GL_EXT_PRIORITY_LAST, VISU_GL_EXT_PRIORITY_NORMAL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * VisuGlExt::saveState: * * When set, save the OpenGL state, so the extension can modify * OpenGL parameters like light, depth test... * * Since: 3.7 */ g_object_class_install_property (G_OBJECT_CLASS(klass), SAVE_STATE_PROP, g_param_spec_boolean("saveState", "Save state", "save OpenGL state", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /** * VisuGlExt::nGlObj: * * The number of GL list the extension is dealing with. * * Since: 3.7 */ g_object_class_install_property (G_OBJECT_CLASS(klass), NGLOBJ_PROP, g_param_spec_uint("nGlObj", "N GL objects", "number of GL lists dealt with", 1, 2048, 1, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)); klass->priv = g_malloc(sizeof(VisuGlExtClassPrivate)); klass->priv->reorderingNeeded = FALSE; klass->priv->allExtensions = (GList*)0; confEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_MODE, DESC_PARAMETER_MODE, 1, readExtensionRendering); visu_config_file_entry_setVersion(confEntry, 3.4f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_PARAMETER, exportParametersRendering); g_type_class_add_private(klass, sizeof(VisuGlExtPrivate)); my_class = klass; } static void visu_gl_ext_init(VisuGlExt *ext) { VisuGlExtClass *klass; DBG_fprintf(stderr, "Visu Extension: initializing a new object (%p).\n", (gpointer)ext); ext->priv = G_TYPE_INSTANCE_GET_PRIVATE(ext, VISU_TYPE_GL_EXT, VisuGlExtPrivate); ext->priv->dispose_has_run = FALSE; /* Set-up all not parameters attributes. */ ext->priv->used = TRUE; ext->priv->objectListId = 0; ext->priv->isSensitiveToRenderingMode = FALSE; ext->priv->preferedRenderingMode = VISU_GL_RENDERING_FOLLOW; /* We add it to the known extension list. */ klass = VISU_GL_EXT_GET_CLASS(ext); klass->priv->allExtensions = g_list_append(klass->priv->allExtensions, (gpointer)ext); klass->priv->reorderingNeeded = TRUE; } /* This method can be called several times. It should unref all of its reference to GObjects. */ static void visu_gl_ext_dispose(GObject* obj) { VisuGlExt *ext; DBG_fprintf(stderr, "Visu Extension: dispose object %p.\n", (gpointer)obj); ext = VISU_GL_EXT(obj); if (ext->priv->dispose_has_run) return; ext->priv->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS(visu_gl_ext_parent_class)->dispose(obj); } /* This method is called once only. */ static void visu_gl_ext_finalize(GObject* obj) { VisuGlExtClass *klass; VisuGlExtPrivate *ext; g_return_if_fail(obj); DBG_fprintf(stderr, "Visu Extension: finalize object %p.\n", (gpointer)obj); ext = VISU_GL_EXT(obj)->priv; if (ext->name) g_free(ext->name); if (ext->nameI18n) g_free(ext->nameI18n); if (ext->description) g_free(ext->description); glDeleteLists(ext->objectListId, ext->nGlObj); klass = VISU_GL_EXT_GET_CLASS(obj); klass->priv->allExtensions = g_list_remove_all(klass->priv->allExtensions, (gpointer)obj); /* Chain up to the parent class */ DBG_fprintf(stderr, "Visu Extension: chain to parent.\n"); G_OBJECT_CLASS(visu_gl_ext_parent_class)->finalize(obj); DBG_fprintf(stderr, "Visu Extension: freeing ... OK.\n"); } static void visu_gl_ext_get_property(GObject* obj, guint property_id, GValue *value, GParamSpec *pspec) { VisuGlExtPrivate *self = VISU_GL_EXT(obj)->priv; DBG_fprintf(stderr, "Visu Extension: get property '%s' -> ", g_param_spec_get_name(pspec)); switch (property_id) { case NAME_PROP: g_value_set_string(value, self->name); DBG_fprintf(stderr, "%s.\n", self->name); break; case LABEL_PROP: g_value_set_string(value, self->nameI18n); DBG_fprintf(stderr, "%s.\n", self->nameI18n); break; case DESCRIPTION_PROP: g_value_set_string(value, self->description); DBG_fprintf(stderr, "%s.\n", self->description); break; case ACTIVE_PROP: g_value_set_boolean(value, self->used); DBG_fprintf(stderr, "%d.\n", self->used); break; case SAVE_STATE_PROP: g_value_set_boolean(value, self->saveState); DBG_fprintf(stderr, "%d.\n", self->saveState); break; case PRIORITY_PROP: g_value_set_uint(value, self->priority); DBG_fprintf(stderr, "%d.\n", self->priority); break; case NGLOBJ_PROP: g_value_set_uint(value, self->nGlObj); DBG_fprintf(stderr, "%d.\n", self->nGlObj); break; default: /* We don't have any other property... */ G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, property_id, pspec); break; } } static void visu_gl_ext_set_property(GObject* obj, guint property_id, const GValue *value, GParamSpec *pspec) { VisuGlExtPrivate *self = VISU_GL_EXT(obj)->priv; DBG_fprintf(stderr, "Visu Extension: set property '%s' -> ", g_param_spec_get_name(pspec)); switch (property_id) { case NAME_PROP: self->name = g_value_dup_string(value); DBG_fprintf(stderr, "%s.\n", self->name); break; case LABEL_PROP: self->nameI18n = g_value_dup_string(value); DBG_fprintf(stderr, "%s.\n", self->nameI18n); break; case DESCRIPTION_PROP: self->description = g_value_dup_string(value); DBG_fprintf(stderr, "%s.\n", self->description); break; case ACTIVE_PROP: self->used = g_value_get_boolean(value); DBG_fprintf(stderr, "%d.\n", self->used); break; case SAVE_STATE_PROP: self->saveState = g_value_get_boolean(value); DBG_fprintf(stderr, "%d.\n", self->saveState); break; case PRIORITY_PROP: self->priority = g_value_get_uint(value); my_class->priv->reorderingNeeded = TRUE; DBG_fprintf(stderr, "%d.\n", self->priority); break; case NGLOBJ_PROP: self->nGlObj = g_value_get_uint(value); DBG_fprintf(stderr, "%d.\n", self->nGlObj); self->objectListId = visu_gl_objectlist_new(self->nGlObj); break; default: /* We don't have any other property... */ G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, property_id, pspec); break; } } /** * visu_gl_ext_getActive: * @extension: the extension. * * Get if the extension is used or not. If not its ObjectList * is not rendered. * * Returns: TRUE if used, FALSE otherwise. */ gboolean visu_gl_ext_getActive(VisuGlExt* extension) { if (extension) return extension->priv->used; else return FALSE; } /** * visu_gl_ext_setActive: * @extension: the extension, * @value: the new value. * * Set if an extension is actually used or not. */ gboolean visu_gl_ext_setActive(VisuGlExt* extension, gboolean value) { g_return_val_if_fail(VISU_IS_GL_EXT_TYPE(extension), FALSE); if (extension->priv->used == value) return FALSE; g_object_set(G_OBJECT(extension), "active", value, NULL); return TRUE; } /** * visu_gl_ext_setPriority: * @extension: a #VisuGlExt object ; * @priority: an integer value. * * Extentions are drawn in an order that depends on their priority. * The lower is the number, the sooner the extension is drawn. Flags, * such as #VISU_GL_EXT_PRIORITY_NORMAL or #VISU_GL_EXT_PRIORITY_LOW, * can be used or user defined values are also possible. */ void visu_gl_ext_setPriority(VisuGlExt* extension, guint priority) { g_return_if_fail(VISU_IS_GL_EXT_TYPE(extension)); g_object_set(G_OBJECT(extension), "priority", priority, NULL); } /** * visu_gl_ext_setSaveState: * @extension: a #VisuGlExt object ; * @saveState: an boolean value. * * If the extension needs to change some OpenGL state (to disable the fog for example, * or the cullface), a flag should be set to enable V_Sim to restore the right values after * the extensio have been called. Because the OpenGL list of an extension is just GL_COMPILE * the extension can't just save and restore state itself because when the list is called, * the state can have been changed. */ void visu_gl_ext_setSaveState(VisuGlExt *extension, gboolean saveState) { g_return_if_fail(VISU_IS_GL_EXT_TYPE(extension)); g_object_set(G_OBJECT(extension), "saveState", saveState, NULL); } /** * visu_gl_ext_setSensitiveToRenderingMode: * @extension: a #VisuGlExt object ; * @status: an boolean value. * * If @status is TRUE, when the extension is rendered, OpenGL context is * switched to the rendering mode preferd for the extension. Use * visu_gl_ext_setPreferedRenderingMode() to choose one. */ void visu_gl_ext_setSensitiveToRenderingMode(VisuGlExt* extension, gboolean status) { g_return_if_fail(extension); extension->priv->isSensitiveToRenderingMode = status; } /** * visu_gl_ext_getSensitiveToRenderingMode: * @extension: a #VisuGlExt object. * * Each #VisuGlExt method can follow or not the global setting for * the rendering mode, see #VisuGlRenderingMode. See also * visu_gl_ext_setSensitiveToRenderingMode(). * * Since: 3.7 * * Returns: TRUE if @extension can change its rendering mode according * to global settings. */ gboolean visu_gl_ext_getSensitiveToRenderingMode(VisuGlExt* extension) { g_return_val_if_fail(VISU_IS_GL_EXT_TYPE(extension), FALSE); return extension->priv->isSensitiveToRenderingMode; } /** * visu_gl_ext_setPreferedRenderingMode: * @extension: a #VisuGlExt object ; * @value: see #VisuGlRenderingMode to choose one. * * This method is used to specify the rendering mode that the extension should use * to be drawn (if the sensitive flag has been set, see * visu_gl_ext_setSensitiveToRenderingMode()). If the @value is set * to VISU_GL_RENDERING_FOLLOW, the extension follows the global setting * for rendering mode. * * Returns: TRUE if the "OpenGLAskForReDraw" should be emitted. */ gboolean visu_gl_ext_setPreferedRenderingMode(VisuGlExt* extension, VisuGlRenderingMode value) { g_return_val_if_fail(VISU_IS_GL_EXT_TYPE(extension), FALSE); g_return_val_if_fail(value < VISU_GL_RENDERING_N_MODES || value == VISU_GL_RENDERING_FOLLOW, FALSE); if (extension->priv->preferedRenderingMode == value) return FALSE; extension->priv->preferedRenderingMode = value; return TRUE; } /** * visu_gl_ext_getPreferedRenderingMode: * @extension: a #VisuGlExt method. * * Each #VisuGlExt method can draw in a mode different from the * global one, see #VisuGlRenderingMode. See also * visu_gl_ext_setPreferedRenderingMode(). * * Since: 3.7 * * Returns: the prefered rendering mode of this @extension. **/ VisuGlRenderingMode visu_gl_ext_getPreferedRenderingMode(VisuGlExt* extension) { g_return_val_if_fail(VISU_IS_GL_EXT_TYPE(extension), VISU_GL_RENDERING_FOLLOW); return extension->priv->preferedRenderingMode; } /** * visu_gl_ext_getGlList: * @extension: a #VisuGlExt method. * * All #VisuGlExt objects have a master OpenGL list to draw * to. This routine gets the identifier of this list. * * Since: 3.7 * * Returns: an OpenGL identifier id for @extension. **/ guint visu_gl_ext_getGlList(VisuGlExt *extension) { g_return_val_if_fail(VISU_IS_GL_EXT_TYPE(extension), 0); return extension->priv->objectListId; } /********************/ /* Class functions. */ /********************/ /** * visu_gl_ext_getFromName: * @name: a string identifying a #VisuGlExt object. * * #VisuGlExt objects are identified by an id. * * Since: 3.7 * * Returns: (transfer none): a #VisuGlExt object matching @name. **/ VisuGlExt* visu_gl_ext_getFromName(const gchar* name) { GList *pnt; VisuGlExt *ext; DBG_fprintf(stderr, "Visu Extension: get '%s' from list.\n", name); if (!my_class) g_type_class_ref(VISU_TYPE_GL_EXT); for (pnt = my_class->priv->allExtensions; pnt; pnt = g_list_next(pnt)) { ext = (VisuGlExt*)pnt->data; if (!strcmp(ext->priv->name, name)) return ext; } return (VisuGlExt*)0; } static void mayReorder() { if (!my_class) g_type_class_ref(VISU_TYPE_GL_EXT); if (my_class->priv->reorderingNeeded) { DBG_fprintf(stderr, "Visu Extension: sorting known extension" " depending on their priority.\n"); my_class->priv->allExtensions = g_list_sort(my_class->priv->allExtensions, compareExtensionPriority); my_class->priv->reorderingNeeded = FALSE; } } /** * visu_gl_ext_call: * @extension: a #VisuGlExt object. * @lastOnly: a boolean. * * Select the #VisuGlExt matching the given @name and call * it. The call is indeed done only if the extension is used. If * @lastOnly is TRUE, the list is called only if it has a * #VISU_GL_EXT_PRIORITY_LAST priority. On the contrary the list * is called only if its priority is lower than * #VISU_GL_EXT_PRIORITY_LAST. */ void visu_gl_ext_call(VisuGlExt *ext, gboolean lastOnly) { VisuGlRenderingMode renderingMode, globalRenderingMode; GList lst; g_return_if_fail(VISU_IS_GL_EXT_TYPE(ext)); /* DBG_fprintf(stderr, "Visu Extension: call '%s' list.\n", ext->priv->name); */ /* DBG_fprintf(stderr, "| has %d ref counts.\n", G_OBJECT(ext)->ref_count); */ globalRenderingMode = visu_gl_rendering_getGlobalMode(); renderingMode = globalRenderingMode; if (ext->priv->used && ((lastOnly && ext->priv->priority == VISU_GL_EXT_PRIORITY_LAST) || (!lastOnly && ext->priv->priority < VISU_GL_EXT_PRIORITY_LAST)) && ext->priv->objectListId > 1000) { lst.data = (gpointer)ext; lst.next = lst.prev = (GList*)0; callList(&lst, &renderingMode, globalRenderingMode); if (renderingMode != globalRenderingMode) /* Return the rendering mode to normal. */ visu_gl_rendering_applyMode(globalRenderingMode); } } /** * visu_gl_ext_rebuildAll: * * For each registered extension that has a valid rebuild method, * it calls it. */ void visu_gl_ext_rebuildAll() { GList *pnt; mayReorder(); DBG_fprintf(stderr, "Visu Extension: Rebuilding all lists...\n"); for (pnt = my_class->priv->allExtensions; pnt; pnt = g_list_next(pnt)) visu_gl_ext_rebuild(VISU_GL_EXT(pnt->data)); } /** * visu_gl_ext_rebuild: * @self: a #VisuGlExt object. * * This routine does not sort the extension on their priority and * should be used only to draw some selected extensions. To draw all * of them, use visu_gl_ext_rebuildAll() instead. */ void visu_gl_ext_rebuild(VisuGlExt *self) { g_return_if_fail(VISU_IS_GL_EXT_TYPE(self)); DBG_fprintf(stderr, "Visu Extension: rebuilding '%s' list.\n", self->priv->name); if (self->priv->used && VISU_GL_EXT_GET_CLASS(self)->rebuild) VISU_GL_EXT_GET_CLASS(self)->rebuild(self); } /** * visu_gl_ext_getAll: * * This method is used to get the list of all registered VisuGlExt. * This list is own by V_Sim and should not be freed. * * Returns: (element-type VisuGlExt*) (transfer none): the list of * all #VisuGlExt. */ GList* visu_gl_ext_getAll(void) { mayReorder(); return my_class->priv->allExtensions; } /****************/ /* Private area */ /****************/ static void callList(GList *lst, VisuGlRenderingMode *renderingMode, VisuGlRenderingMode globalRenderingMode) { VisuGlExt *ext; GTimer *timer; gulong fractionTimer; #if DEBUG == 1 timer = g_timer_new(); g_timer_start(timer); #endif for (; lst; lst = g_list_next(lst)) { ext = (VisuGlExt*)lst->data; /* The extension needs its own rendering mode. */ if (ext->priv->isSensitiveToRenderingMode && ext->priv->preferedRenderingMode < VISU_GL_RENDERING_N_MODES) { if (ext->priv->preferedRenderingMode != *renderingMode) { visu_gl_rendering_applyMode(ext->priv->preferedRenderingMode); *renderingMode = ext->priv->preferedRenderingMode; } } else { if (*renderingMode != globalRenderingMode) { visu_gl_rendering_applyMode(globalRenderingMode); *renderingMode = globalRenderingMode; } } /* Save OpenGL state if necessary. */ if (ext->priv->saveState) { DBG_fprintf(stderr, "Visu Extension: save state.\n"); glPushAttrib(GL_ENABLE_BIT); } if (ext->priv->isSensitiveToRenderingMode && *renderingMode == VISU_GL_RENDERING_SMOOTH_AND_EDGE) { glPushAttrib(GL_ENABLE_BIT); glEnable(GL_POLYGON_OFFSET_FILL); glPolygonOffset(1.0, 1.0); } /* Call the compiled list. */ DBG_fprintf(stderr, "Visu Extension: call list %d (%s)", ext->priv->objectListId, ext->priv->name); glCallList(ext->priv->objectListId); DBG_fprintf(stderr, " at %g micro-s", g_timer_elapsed(timer, &fractionTimer)*1e6); DBG_fprintf(stderr, ".\n"); /* Add a wireframe draw if renderingMode is VISU_GL_RENDERING_SMOOTH_AND_EDGE. */ if (ext->priv->isSensitiveToRenderingMode && *renderingMode == VISU_GL_RENDERING_SMOOTH_AND_EDGE) { glDisable(GL_POLYGON_OFFSET_FILL); glDisable(GL_LIGHTING); glColor3f (0.0, 0.0, 0.0); glLineWidth(1); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glCallList(ext->priv->objectListId); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glPopAttrib(); } if (ext->priv->saveState) { DBG_fprintf(stderr, "Visu Extension: restore state.\n"); glPopAttrib(); } } #if DEBUG == 1 g_timer_stop(timer); g_timer_destroy(timer); #endif } static gint compareExtensionPriority(gconstpointer a, gconstpointer b) { if (((VisuGlExt*)a)->priv->priority < ((VisuGlExt*)b)->priv->priority) return (gint)-1; else if (((VisuGlExt*)a)->priv->priority > ((VisuGlExt*)b)->priv->priority) return (gint)+1; else return (gint)0; } static gboolean readExtensionRendering(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { gchar **val; VisuGlExt *ext; VisuGlRenderingMode id; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readString(lines[0], position, &val, 2, FALSE, error)) return FALSE; ext = visu_gl_ext_getFromName(val[0]); if (!ext) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d: the extension" " '%s' is unknown.\n"), position, val[0]); g_strfreev(val); return FALSE; } if (!visu_gl_rendering_getModeFromName(val[1], &id)) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d: the rendering mode" " '%s' is unknown.\n"), position, val[1]); g_strfreev(val); return FALSE; } g_strfreev(val); visu_gl_ext_setPreferedRenderingMode(ext, id); return TRUE; } static void exportParametersRendering(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { GList *tmp; VisuGlExt *ext; const char **names; if (!my_class) g_type_class_ref(VISU_TYPE_GL_EXT); g_string_append_printf(data, "# %s\n", DESC_PARAMETER_MODE); names = visu_gl_rendering_getAllModes(); for (tmp = my_class->priv->allExtensions; tmp; tmp = g_list_next(tmp)) { ext = (VisuGlExt*)tmp->data; if (ext->priv->isSensitiveToRenderingMode && ext->priv->preferedRenderingMode < VISU_GL_RENDERING_N_MODES) g_string_append_printf(data, "%s: %s %s\n", FLAG_PARAMETER_MODE, ext->priv->name, names[ext->priv->preferedRenderingMode]); } g_string_append_printf(data, "\n"); } v_sim-3.7.0/src/visu_extension.h0000644000353400050620000001370612215546106013614 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef VISU_GL_EXT_H #define VISU_GL_EXT_H #include #include #include "openGLFunctions/renderingMode.h" /***************/ /* Public part */ /***************/ /** * VISU_GL_EXT_PRIORITY_BACKGROUND * * An extension with this priority is drawn first. */ #define VISU_GL_EXT_PRIORITY_BACKGROUND 0 /** * VISU_GL_EXT_PRIORITY_NODES * * An extension with this priority is drawn alsmost first with the nodes. */ #define VISU_GL_EXT_PRIORITY_NODES 2 /** * VISU_GL_EXT_PRIORITY_NODE_DECORATIONS * * An extension with this priority is drawn just after the nodes. */ #define VISU_GL_EXT_PRIORITY_NODE_DECORATIONS 5 /** * VISU_GL_EXT_PRIORITY_HIGH * * An extension with this priority is drawn after the higher priorities. */ #define VISU_GL_EXT_PRIORITY_HIGH 20 /** * VISU_GL_EXT_PRIORITY_NORMAL * * An extension with this priority is drawn after the higher priorities. */ #define VISU_GL_EXT_PRIORITY_NORMAL 50 /** * VISU_GL_EXT_PRIORITY_LOW * * An extension with this priority is drawn among last extensions. */ #define VISU_GL_EXT_PRIORITY_LOW 80 /** * VISU_GL_EXT_PRIORITY_LAST * * An extension with this priority is drawn last. */ #define VISU_GL_EXT_PRIORITY_LAST 100 /** * VISU_TYPE_GL_EXT: * * return the type of #VisuGlExt. */ #define VISU_TYPE_GL_EXT (visu_gl_ext_get_type ()) /** * VISU_GL_EXT: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuGlExt type. */ #define VISU_GL_EXT(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_GL_EXT, VisuGlExt)) /** * VISU_GL_EXT_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuGlExtClass. */ #define VISU_GL_EXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_GL_EXT, VisuGlExtClass)) /** * VISU_IS_GL_EXT_TYPE: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuGlExt object. */ #define VISU_IS_GL_EXT_TYPE(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_GL_EXT)) /** * VISU_IS_GL_EXT_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuGlExtClass class. */ #define VISU_IS_GL_EXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_GL_EXT)) /** * VISU_GL_EXT_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. */ #define VISU_GL_EXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_GL_EXT, VisuGlExtClass)) /** * VisuGlExtPrivate: * * Private data for #VisuGlExt objects. */ typedef struct _VisuGlExtPrivate VisuGlExtPrivate; /** * VisuGlExtClassPrivate : * * Private data for #VisuGlExtClass classes. */ typedef struct _VisuGlExtClassPrivate VisuGlExtClassPrivate; /** * VisuGlExt: * * Common name to refer to a #_VisuGlExt. */ typedef struct _VisuGlExt VisuGlExt; struct _VisuGlExt { GObject parent; VisuGlExtPrivate *priv; }; /** * VisuGlExtClass: * @parent: private. * @rebuild: a rebuilding function for this extension. * @priv: private. * * Common name to refer to a #_VisuGlExtClass. */ typedef struct _VisuGlExtClass VisuGlExtClass; struct _VisuGlExtClass { GObjectClass parent; void (*rebuild)(VisuGlExt *self); VisuGlExtClassPrivate *priv; }; /** * visu_gl_ext_get_type: * * This method returns the type of #VisuGlExt, use * VISU_TYPE_GL_EXT instead. * * Since: 3.7 * * Returns: the type of #VisuGlExt. */ GType visu_gl_ext_get_type(void); void visu_gl_ext_setPriority(VisuGlExt* extension, guint priority); void visu_gl_ext_setSaveState(VisuGlExt *extension, gboolean saveState); void visu_gl_ext_setSensitiveToRenderingMode(VisuGlExt* extension, gboolean status); gboolean visu_gl_ext_getSensitiveToRenderingMode(VisuGlExt* extension); gboolean visu_gl_ext_getActive(VisuGlExt* extension); gboolean visu_gl_ext_setActive(VisuGlExt* extension, gboolean value); gboolean visu_gl_ext_setPreferedRenderingMode(VisuGlExt* extension, VisuGlRenderingMode value); VisuGlRenderingMode visu_gl_ext_getPreferedRenderingMode(VisuGlExt* extension); guint visu_gl_ext_getGlList(VisuGlExt *extension); void visu_gl_ext_call(VisuGlExt *extension, gboolean lastOnly); void visu_gl_ext_rebuild(VisuGlExt *self); /* Class methods. */ VisuGlExt* visu_gl_ext_getFromName(const char *name); GList* visu_gl_ext_getAll(void); void visu_gl_ext_rebuildAll(void); #endif v_sim-3.7.0/src/visu_elements.c0000644000353400050620000007774012215546105013416 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "visu_elements.h" #include "visu_object.h" #include "visu_configFile.h" #include #include #include "openGLFunctions/objectList.h" #include "opengl.h" #include "coreTools/toolColor.h" #include "coreTools/toolConfigFile.h" #include #include /** * SECTION:visu_elements * @short_description: defines methods to create and acccess to * #VisuElement. * * V_Sim is used to rendered at given position several object of * the same kind. The #VisuElement object is used to control that * kind. Typically, it corresponds to chemical element. It can * represent the silicon, the iron... * * #VisuElement are defined by their name and have some * characteristic like their color or if they are rendered or not. The * color characteristic is defined by an RGBA array and different * value for the behavior of the light, as defined in OpenGL : * diffusivity, shiningness, emissivity, specular and ambient. These * values can be controlled with the following methods : * visu_element_setAllColorValues(), visu_element_setAllRGBValues(), * visu_element_setRGBValue(), visu_element_setAllMaterialValues() and * visu_element_setMaterialValue(). * * If the OpenGL representation of one element is not dependent * of its position, it is recommended to use the OpenGL list * associated to each #VisuElement that can be accessed by a call to * visu_element_getMaterialId(). */ /** * VisuElement: * * Structure to stores #VisuElement objects. */ /** * _VisuElement: * @parent: the parent. * @name: Name of the key used in the hashtable to find * this element. The int variable is the number * of this type. * @typeNumber: An integer unique for each VisuElement, it is * used as a name for the opengl material associated * with it. * @rgb: main color of the element in [r, g, b, a] format. * @material: lighting effects for material in [amb, dif, shi, spe, * emi] format. * @glMaterialId: the identifier for the material of this element. * @materialIsUpToDate: A flag that is TRUE when the OpenGL list of * the material is up to date. * @rendered: A flag to store if all nodes of this element are rendered or not. * Its default value is TRUE. * @sensitiveToPlanes: a flag to say if nodes of this element are sensitive * to the masking effect of planes (default is TRUE). * @physical: TRUE if the element is a physical one. * @dispose_has_run: internal. * * Structure to store the description of an element. */ enum { ELEMENT_NEW_SIGNAL, ELEMENT_VISIBILITY_CHANGED_SIGNAL, ELEMENT_MATERIAL_CHANGED_SIGNAL, ELEMENT_RENDERING_CHANGED_SIGNAL, ELEMENT_VISU_PLANE_CHANGED_SIGNAL, LAST_SIGNAL }; struct _VisuElementClass { GObjectClass parent; /* This hashtable contains a list of all different elements loaded in visu. */ GHashTable *allElements_table; GList *allElements_list; /* This int stores how many user functions have needs to recreate the nodes of an element when its material has been changed. */ int flagCreateNodesAfterMaterialChange; }; #define FLAG_ELEMENT_COLOR "element_color" #define DESC_ELEMENT_COLOR "Codes the main color in RedGreenBlueAlpha format" \ "and the light effects on material, nine floats between 0. and 1." #define FLAG_ELEMENT_PROPERTIES "element_properties" #define DESC_ELEMENT_PROPERTIES "Define some properties ; rendered (0 or 1) masked" \ "(0 or 1)." /* These functions detail how to read the RGB resource and the material resource introduced by this part. These routines are obsolete but kept for backward compatibility. */ static gboolean readMaterial(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static gboolean readRendered(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); /* Read routines for the config file. */ static gboolean readElementColor(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static gboolean readElementProperties(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); /* These functions write all the element list to export there associated resources. */ static void exportResourcesRenderingBase(GString *data, VisuData *dataObj, VisuGlView *view); static void visu_element_dispose(GObject* obj); static void visu_element_finalize(GObject* obj); static VisuElementClass *my_class = (VisuElementClass*)0; static guint visu_element_signals[LAST_SIGNAL] = { 0 }; G_DEFINE_TYPE(VisuElement, visu_element, G_TYPE_OBJECT) static void visu_element_class_init(VisuElementClass *klass) { VisuConfigFileEntry *resourceEntry, *oldEntry; DBG_fprintf(stderr, "Visu Element: creating the class of the object.\n"); DBG_fprintf(stderr, " - adding new signals ;\n"); /** * VisuElement::ElementVisibilityChanged: * @element: the object which emit the signal ; * * Gets emitted when one of the rendered #VisuElement is made * visible or hidden. * * Since: 3.6 */ visu_element_signals[ELEMENT_VISIBILITY_CHANGED_SIGNAL] = g_signal_new("ElementVisibilityChanged", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * VisuElement::ElementMaterialChanged: * @element: the object which emit the signal ; * * Gets emitted when the material or color properties of a VisuElement * are modified. * * Since: 3.6 */ visu_element_signals[ELEMENT_MATERIAL_CHANGED_SIGNAL] = g_signal_new("ElementMaterialChanged", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * VisuElement::ElementRenderingChanged: * @element: the object which emit the signal ; * * Gets emitted when the rendering characteristics of an element are * changed, like their shape or specific colour. For a signal on * generic colours (like the element colour), listen to * VisuElement::ElementMaterialChanged signal instead. * * Since: 3.7 */ visu_element_signals[ELEMENT_RENDERING_CHANGED_SIGNAL] = g_signal_new("ElementRenderingChanged", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * VisuElement::ElementPlaneChanged: * @element: the object which emit the signal ; * * Gets emitted when the property of masking by plane is modified. * * Since: 3.6 */ visu_element_signals[ELEMENT_VISU_PLANE_CHANGED_SIGNAL] = g_signal_new("ElementPlaneChanged", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * VisuElement::ElementNew: * @element: the object emitting the signal. * * A new element is available. * * Since: 3.6 */ visu_element_signals[ELEMENT_NEW_SIGNAL] = g_signal_new("ElementNew", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /* Connect the overloading methods. */ G_OBJECT_CLASS(klass)->dispose = visu_element_dispose; G_OBJECT_CLASS(klass)->finalize = visu_element_finalize; /* Set internal parameters. */ klass->allElements_table = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, (GDestroyNotify)g_object_unref); klass->allElements_list = (GList*)0; /* Create a VisuModule to registered the new resources as rgb and material. */ oldEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, "material", "Obsolete entry for element_color", 1, readMaterial); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_ELEMENT_COLOR, DESC_ELEMENT_COLOR, 1, readElementColor); visu_config_file_entry_setVersion(resourceEntry, 3.4f); visu_config_file_entry_setReplace(resourceEntry, oldEntry); oldEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, "element_is_rendered", "Obsolete entry included in element_properties", 1, readRendered); visu_config_file_entry_setVersion(resourceEntry, 3.1f); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_RESOURCE, FLAG_ELEMENT_PROPERTIES, DESC_ELEMENT_PROPERTIES, 1, readElementProperties); visu_config_file_entry_setVersion(resourceEntry, 3.4f); visu_config_file_entry_setReplace(resourceEntry, oldEntry); visu_config_file_addExportFunction(VISU_CONFIG_FILE_RESOURCE, exportResourcesRenderingBase); /* Get an OpenGL identifier to store all the materials. */ klass->flagCreateNodesAfterMaterialChange = 0; my_class = klass; } static void visu_element_init(VisuElement *ele) { int i; DBG_fprintf(stderr, "Visu Element: initializing a new object (%p).\n", (gpointer)ele); ele->materialIsUpToDate = FALSE; ele->rendered = TRUE; ele->sensitiveToPlanes = TRUE; ele->physical = TRUE; ele->glMaterialId = visu_gl_objectlist_new(1); for (i = 0; i < 4; i++) ele->rgb[i] = 1.; for (i = 0; i < 5; i++) ele->material[i] = 0.25; } /* This method can be called several times. It should unref all of its reference to GObjects. */ static void visu_element_dispose(GObject* obj) { DBG_fprintf(stderr, "Visu Element: dispose object %p.\n", (gpointer)obj); if (VISU_ELEMENT(obj)->dispose_has_run) return; VISU_ELEMENT(obj)->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS(visu_element_parent_class)->dispose(obj); } /* This method is called once only. */ static void visu_element_finalize(GObject* obj) { VisuElement *ele; VisuElementClass *klass; g_return_if_fail(obj); DBG_fprintf(stderr, "Visu Element: finalize object %p.\n", (gpointer)obj); ele = VISU_ELEMENT(obj); klass = VISU_ELEMENT_GET_CLASS(ele); g_free(ele->name); g_hash_table_steal(klass->allElements_table, ele); klass->allElements_list = g_list_remove(klass->allElements_list, ele); glDeleteLists(ele->glMaterialId, 1); /* Chain up to the parent class */ DBG_fprintf(stderr, "Visu Element: chain to parent.\n"); G_OBJECT_CLASS(visu_element_parent_class)->finalize(obj); DBG_fprintf(stderr, "Visu Element: freeing ... OK.\n"); } /** * visu_element_new: * @key: the name of the new element to create. * * Allocate a new visuElement with the specified name. Remember * that names must be unique since they identify the element. * * Returns: (transfer none): the newly created VisuElement or 0 if something goes * wrong in the process (if the name already exist for example). */ VisuElement *visu_element_new(const char *key) { VisuElement *ele; if (!my_class) g_type_class_ref(VISU_TYPE_ELEMENT); ele = visu_element_lookup(key); if (ele) { g_warning("Element '%s' already exists.", key); return ele; } ele = VISU_ELEMENT(g_object_new(VISU_TYPE_ELEMENT, NULL)); ele->name = g_strdup((key[0] == '%')?key + 1:key); ele->physical = (key[0] != '%') && strcmp(key, "g") && strcmp(key, "G"); g_hash_table_insert(my_class->allElements_table, (gpointer)ele->name, (gpointer)ele); my_class->allElements_list = g_list_append(my_class->allElements_list, (gpointer)ele); DBG_fprintf(stderr, "Visu Elements: create a new VisuElement '%s' -> %p.\n", key, (gpointer)ele); g_signal_emit(G_OBJECT(ele), visu_element_signals[ELEMENT_NEW_SIGNAL], 0, NULL); DBG_fprintf(stderr, "Visu Elements: new element signal OK.\n"); return ele; } /** * visu_element_getAllElements: * * This method returns a list of all the registered #VisuElement. * The returned list is read-only. * * Returns: (element-type VisuElement) (transfer none): the list of * all known #VisuElement. */ const GList *visu_element_getAllElements(void) { if (!my_class) g_type_class_ref(VISU_TYPE_ELEMENT); return my_class->allElements_list; } /** * visu_element_retrieveFromName: * @name: a string that identify the #VisuElement (in UTF8) ; * @nw: (out caller-allocates): a location to store a boolean. * * Try to find a #VisuElement already associated to that @name or * create a new one if none has been found. If @nw is not NULL it is * set to FALSE if @name was found. * * Returns: (transfer none): a #VisuElement associated to this @name. */ VisuElement *visu_element_retrieveFromName(const gchar *name, gboolean *nw) { VisuElement *ele; if (!my_class) g_type_class_ref(VISU_TYPE_ELEMENT); DBG_fprintf(stderr, "Visu Element: retrieve '%s' (%d).\n", name, g_hash_table_size(my_class->allElements_table)); if (nw) *nw = FALSE; ele = g_hash_table_lookup(my_class->allElements_table, (name[0] == '%')?name + 1:name); if (ele) return ele; if (nw) *nw = TRUE; return visu_element_new(name); } /** * visu_element_lookup: * @name: a string. * * Lookup for element @name in the base. Do not create it if not * found. To do this, use visu_element_retrieveFromName(). * * Since: 3.6 * * Returns: (transfer none): the found #VisuElement or NULL. */ VisuElement *visu_element_lookup(const gchar *name) { if (!my_class) g_type_class_ref(VISU_TYPE_ELEMENT); DBG_fprintf(stderr, "Visu Element: lookup '%s' (%d).\n", name, g_hash_table_size(my_class->allElements_table)); return g_hash_table_lookup(my_class->allElements_table, (name[0] == '%')?name + 1:name); } /** * visu_element_getName: * @ele: a #VisuElement object. * * This routines returns the name of the given @ele. * * Since: 3.7 * * Returns: a string owned by V_Sim. */ const gchar* visu_element_getName(const VisuElement *ele) { g_return_val_if_fail(VISU_IS_ELEMENT_TYPE(ele), (const gchar*)0); return ele->name; } /** * visu_element_getPhysical: * @ele: a #VisuElement object. * * This routine gets if @ele is physical or not. A not physical * element can be used for instance to represent specific points... * * Since: 3.7 * * Returns: TRUE if @ele is indeed physical. */ gboolean visu_element_getPhysical(VisuElement *ele) { g_return_val_if_fail(VISU_IS_ELEMENT_TYPE(ele), FALSE); return ele->physical; } /** * visu_element_setAllColorValues: * @ele: the element of which the color must be changed ; * @rgb: (in) (array fixed-size=4): the new color given by a {red, green, blue} array ; * @material: (in) (array fixed-size=5): the new values to define the lighting. * * This method is used to set all the values that define the color * and the lighting of the given element. * * Returns: > 0 if values for @ele have changed. */ gint visu_element_setAllColorValues(VisuElement* ele, float rgb[4], float material[5]) { int chgt; chgt = (ele->rgb[0] != rgb[0]) || (ele->rgb[1] != rgb[1]) || (ele->rgb[2] != rgb[2]) || (ele->rgb[3] != rgb[3]); ele->rgb[0] = rgb[0]; ele->rgb[1] = rgb[1]; ele->rgb[2] = rgb[2]; ele->rgb[3] = rgb[3]; chgt = chgt || (ele->material[0] != material[0]) || (ele->material[1] != material[1]) || (ele->material[2] != material[2]) || (ele->material[3] != material[3]) || (ele->material[4] != material[4]); ele->material[0] = material[0]; ele->material[1] = material[1]; ele->material[2] = material[2]; ele->material[3] = material[3]; ele->material[4] = material[4]; if (chgt) { visu_element_createMaterial(ele); DBG_fprintf(stderr, "Visu Element: %p(%s) emit the 'ElementMaterialChanged'.\n", (gpointer)ele, ele->name); g_signal_emit(ele, visu_element_signals[ELEMENT_MATERIAL_CHANGED_SIGNAL], 0, NULL); } if (chgt && ele->rendered) return 2 * VISU_ELEMENT_GET_CLASS(ele)->flagCreateNodesAfterMaterialChange - 1; else return 0; } /** * visu_element_setAllRGBValues: * @ele: the element of which the color must be changed, * @rgb: (in) (array fixed-size=4): the new color given by a {red, green, blue} array. * * It saves the values of rgb in the specified VisuElement. * * Returns: > 0 if values for @ele have changed. */ gint visu_element_setAllRGBValues(VisuElement* ele, float rgb[4]) { g_return_val_if_fail(ele, 0); DBG_fprintf(stderr, "Visu Element: '%s' set color (%f, %f, %f, %f)\n", ele->name, ele->rgb[0], ele->rgb[1], ele->rgb[2], ele->rgb[3]); if (ele->rgb[0] == rgb[0] && ele->rgb[1] == rgb[1] && ele->rgb[2] == rgb[2] && ele->rgb[3] == rgb[3]) return 0; DBG_fprintf(stderr, " -> (%f, %f, %f, %f).\n", rgb[0], rgb[1], rgb[2], rgb[3]); ele->rgb[0] = rgb[0]; ele->rgb[1] = rgb[1]; ele->rgb[2] = rgb[2]; ele->rgb[3] = rgb[3]; visu_element_createMaterial(ele); DBG_fprintf(stderr, "Visu Element: %p(%s) emit the 'ElementMaterialChanged'.\n", (gpointer)ele, ele->name); g_signal_emit(ele, visu_element_signals[ELEMENT_MATERIAL_CHANGED_SIGNAL], 0, NULL); if (ele->rendered) return 2 * VISU_ELEMENT_GET_CLASS(ele)->flagCreateNodesAfterMaterialChange - 1; else return 0; } /** * visu_element_setRGBValue: * @ele: the element of which the color must be changed, * @rgb: the component to change, 0 for red, 1 for green and 2 * for blue, * @value: the value for one of the red, green or blue component. * * It saves the specific value of rgb (0 for red, 1 for green and 2 * for bluein the specified VisuElement. * * Returns: > 0 if values for @ele have changed. */ gint visu_element_setRGBValue(VisuElement* ele, int rgb, float value) { if (rgb < 0 || rgb > 3) return 0; if (value == ele->rgb[rgb]) return 0; ele->rgb[rgb] = value; visu_element_createMaterial(ele); DBG_fprintf(stderr, "Visu Element: %p(%s) emit the 'ElementMaterialChanged'.\n", (gpointer)ele, ele->name); g_signal_emit(ele, visu_element_signals[ELEMENT_MATERIAL_CHANGED_SIGNAL], 0, NULL); if (ele->rendered) return 2 * VISU_ELEMENT_GET_CLASS(ele)->flagCreateNodesAfterMaterialChange - 1; else return 0; } /** * visu_element_setAllMaterialValues: * @ele: the element of which the color must be changed, * @material: (in) (array fixed-size=5): the new values to define the lighting. * * It saves the values of material in the specified VisuElement. * * Returns: > 0 if values for @ele have changed. */ gint visu_element_setAllMaterialValues(VisuElement* ele, float material[5]) { if (!ele) return 0; ele->material[0] = material[0]; ele->material[1] = material[1]; ele->material[2] = material[2]; ele->material[3] = material[3]; ele->material[4] = material[4]; visu_element_createMaterial(ele); DBG_fprintf(stderr, "Visu Element: %p(%s) emit the 'ElementMaterialChanged'.\n", (gpointer)ele, ele->name); g_signal_emit(ele, visu_element_signals[ELEMENT_MATERIAL_CHANGED_SIGNAL], 0, NULL); if (ele->rendered) return 2 * VISU_ELEMENT_GET_CLASS(ele)->flagCreateNodesAfterMaterialChange - 1; else return 0; } /** * visu_element_setMaterialValue: * @ele: the element of which the color must be changed, * @material: the component to change, * @value: the new value of the specified component. * * It saves the specific value of material (use the enum as the parameter * material) in the specified VisuElement. * * Returns: > 0 if values for @ele have changed. */ gboolean visu_element_setMaterialValue(VisuElement* ele, int material, float value) { if (material < 0 || material > 4) return 0; if (value == ele->material[material]) return 0; ele->material[material] = value; visu_element_createMaterial(ele); DBG_fprintf(stderr, "Visu Element: %p(%s) emit the 'ElementMaterialChanged'.\n", (gpointer)ele, ele->name); g_signal_emit(ele, visu_element_signals[ELEMENT_MATERIAL_CHANGED_SIGNAL], 0, NULL); if (ele->rendered) return 2 * VISU_ELEMENT_GET_CLASS(ele)->flagCreateNodesAfterMaterialChange - 1; else return 0; } /** * visu_element_setSensitiveToPlanes: * @element: a #VisuElement object ; * @status: TRUE or FALSE. * * This method sets the private attribute 'sensitiveToPlanes' to TRUE or FALSE * for the specified #visuElement. If TRUE, all the nodes of that #VisuElement * are not sensitive to the masking property of planes. * * Returns: TRUE if values for @ele have changed. */ gboolean visu_element_setSensitiveToPlanes(VisuElement *element, gboolean status) { g_return_val_if_fail(element, FALSE); DBG_fprintf(stderr, "Visu Element: '%s' set sensitiveToPlanes %d\n", element->name, element->sensitiveToPlanes); if (element->sensitiveToPlanes == status) return FALSE; element->sensitiveToPlanes = status; DBG_fprintf(stderr, " -> %d\n", status); DBG_fprintf(stderr, "Visu Element: %p(%s) emit the 'ElementPlaneChanged'.\n", (gpointer)element, element->name); g_signal_emit(element, visu_element_signals[ELEMENT_VISU_PLANE_CHANGED_SIGNAL], 0, NULL); return TRUE; } /** * visu_element_getSensitiveToPlanes: * @element: a #VisuElement object. * * This method is used to retrieve if nodes of the element are sensitive to * the masking property of planes, or not. * * Returns: TRUE if nodes are masked by planes. */ gboolean visu_element_getSensitiveToPlanes(VisuElement *element) { g_return_val_if_fail(element, TRUE); return element->sensitiveToPlanes; } /** * visu_element_createMaterial: * @ele: a pointer to a valid %VisuElement. * * Create a list whose number is defined by @ele->glMaterialId * that stores the definition of light and color for this #VisuElement. The previous * OpenGL object list with the same identifier is deleted. */ void visu_element_createMaterial(VisuElement *ele) { g_return_if_fail(ele); DBG_fprintf(stderr, "Visu Element: create material for %s (OpenGL id %d)\n", ele->name, ele->glMaterialId); /* fprintf(stderr, "%f %f %f - %f %f %f %f %f\n", ele->rgb[0], ele->rgb[1], ele->rgb[2], ele->material[0], ele->material[1], ele->material[2], ele->material[3], ele->material[4]); */ glDeleteLists(ele->glMaterialId, 1); glNewList(ele->glMaterialId, GL_COMPILE); visu_gl_setColor(ele->material, ele->rgb); glEndList(); ele->materialIsUpToDate = TRUE; } /** * visu_element_getMaterialId: * @ele: an element. * * This method is useful for the rendering method to get the * OpenGl identifier of the material of the specified element. * * Returns: the OpenGL identifier of the specified #VisuElement. */ int visu_element_getMaterialId(VisuElement *ele) { if (!ele) return 0; /* if (!ele->materialIsUpToDate) */ /* visu_element_createMaterial(ele); */ return ele->glMaterialId; } /** * visu_element_setRendered: * @element: a #VisuElement object ; * @rendered: TRUE or FALSE. * * This method sets the private attribute 'rendered' to TRUE or FALSE * for the specified #visuElement. If FALSE, all the nodes of that #VisuElement * are not included in the nodes OpenGL list. * * Returns: TRUE if values for @ele have changed. */ gboolean visu_element_setRendered(VisuElement *element, gboolean rendered) { g_return_val_if_fail(element, FALSE); if (element->rendered == rendered) return FALSE; element->rendered = rendered; DBG_fprintf(stderr, "Visu Element: %p(%s) emit the 'ElementVisibilityChanged'.\n", (gpointer)element, element->name); g_signal_emit(element, visu_element_signals[ELEMENT_VISIBILITY_CHANGED_SIGNAL], 0, NULL); return TRUE; } /** * visu_element_getRendered: * @element: a #VisuElement object. * * This gets the value of the private attribute 'rendered' for * the specified #VisuElement. * * Returns: the value of attribute 'rendered'. */ gboolean visu_element_getRendered(VisuElement *element) { g_return_val_if_fail(element, FALSE); return element->rendered; } /** * visu_element_setUpdateNodesOnMaterialChange: * * If this method is called, whenever a change occurs to a #VisuElement material * description (color and light) the corresponding OpenGl list of nodes of the * currentVisuData is rebuilt. This is usefull if the nodes can't use the list material * because the color is node dependant for example. Use * visu_element_unsetUpdateNodesOnMaterialChange() to return to the normal behavior. */ void visu_element_setUpdateNodesOnMaterialChange(void) { if (!my_class) g_type_class_ref(VISU_TYPE_ELEMENT); my_class->flagCreateNodesAfterMaterialChange += 1; DBG_fprintf(stderr, "Visu Element : set flagCreateNodesAfterMaterialChange to %d.\n", my_class->flagCreateNodesAfterMaterialChange); } /** * visu_element_unsetUpdateNodesOnMaterialChange: * * If this method is called (and no other method has used * visu_element_setUpdateNodesOnMaterialChange(), a changement * in the material description only change the list of the material. */ void visu_element_unsetUpdateNodesOnMaterialChange(void) { if (!my_class) g_type_class_ref(VISU_TYPE_ELEMENT); my_class->flagCreateNodesAfterMaterialChange -= 1; if (my_class->flagCreateNodesAfterMaterialChange < 0) my_class->flagCreateNodesAfterMaterialChange = 0; DBG_fprintf(stderr, "Visu Element : set flagCreateNodesAfterMaterialChange to %d.\n", my_class->flagCreateNodesAfterMaterialChange); } /** * visu_element_getUpdateNodesOnMaterialChange: * * Retrieve if one the #VisuElement is sensitive to the material * values. See visu_element_setUpdateNodesOnMaterialChange(). * * Returns: TRUE if a #VisuGlExtNodes object should rebuild its nodes when the * material values are changed. */ gboolean visu_element_getUpdateNodesOnMaterialChange(void) { if (!my_class) g_type_class_ref(VISU_TYPE_ELEMENT); return (my_class->flagCreateNodesAfterMaterialChange > 0); } /******************/ /* Resources part */ /******************/ static gboolean readElementColor(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { VisuElement* ele; float all[9]; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readFloatWithElement(lines[0], position, all, 9, &ele, error)) return FALSE; ele->rgb[0] = CLAMP(all[0], 0., 1.); ele->rgb[1] = CLAMP(all[1], 0., 1.); ele->rgb[2] = CLAMP(all[2], 0., 1.); ele->rgb[3] = CLAMP(all[3], 0., 1.); ele->material[0] = CLAMP(all[4], 0., 1.); ele->material[1] = CLAMP(all[5], 0., 1.); ele->material[2] = CLAMP(all[6], 0., 1.); ele->material[3] = CLAMP(all[7], 0., 1.); ele->material[4] = CLAMP(all[8], 0., 1.); tool_color_addFloatRGBA(ele->rgb, (int*)0); return TRUE; } static gboolean readElementProperties(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { VisuElement* ele; float values[2]; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readFloatWithElement(lines[0], position, values, 2, &ele, error)) return FALSE; visu_element_setRendered(ele, (gboolean)values[0]); visu_element_setSensitiveToPlanes(ele, (gboolean)values[1]); return TRUE; } static gboolean readMaterial(VisuConfigFileEntry *entry, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error) { return readElementColor(entry, lines, nbLines, position, dataObj, view, error); } static gboolean readRendered(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { VisuElement* ele; float value; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readFloatWithElement(lines[0], position, &value, 1, &ele, error)) return FALSE; visu_element_setRendered(ele, (gboolean)value); return TRUE; } /* These functions read all the element list to export there associated resources. */ static void exportResourcesRenderingBase(GString *data, VisuData *dataObj, VisuGlView *view _U_) { GList *pos, *eleList; VisuNodeArrayIter iter; visu_config_file_exportComment(data, DESC_ELEMENT_COLOR); /* We create a list of elements, or get the whole list. */ if (dataObj) { eleList = (GList*)0; visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter); for (visu_node_array_iterStart(VISU_NODE_ARRAY(dataObj), &iter); iter.element; visu_node_array_iterNextElement(VISU_NODE_ARRAY(dataObj), &iter)) eleList = g_list_prepend(eleList, (gpointer)iter.element); } else eleList = g_list_copy((GList*)visu_element_getAllElements()); for (pos = eleList; pos; pos = g_list_next(pos)) visu_config_file_exportEntry(data, FLAG_ELEMENT_COLOR, ((VisuElement*)pos->data)->name, "%4.3f %4.3f %4.3f %4.3f %4.2f %4.2f %4.2f %4.2f %4.2f", ((VisuElement*)pos->data)->rgb[0], ((VisuElement*)pos->data)->rgb[1], ((VisuElement*)pos->data)->rgb[2], ((VisuElement*)pos->data)->rgb[3], ((VisuElement*)pos->data)->material[0], ((VisuElement*)pos->data)->material[1], ((VisuElement*)pos->data)->material[2], ((VisuElement*)pos->data)->material[3], ((VisuElement*)pos->data)->material[4]); visu_config_file_exportComment(data, DESC_ELEMENT_PROPERTIES); for (pos = eleList; pos; pos = g_list_next(pos)) visu_config_file_exportEntry(data, FLAG_ELEMENT_PROPERTIES, ((VisuElement*)pos->data)->name, "%d %d", ((VisuElement*)pos->data)->rendered, ((VisuElement*)pos->data)->sensitiveToPlanes); g_list_free(eleList); visu_config_file_exportComment(data, ""); } v_sim-3.7.0/src/visu_elements.h0000644000353400050620000001346112215546105013411 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef VISU_ELEMENTS_H #define VISU_ELEMENTS_H #include #include #include "visu_tools.h" G_BEGIN_DECLS /** * VISU_TYPE_ELEMENT: * * return the type of #VisuElement. */ #define VISU_TYPE_ELEMENT (visu_element_get_type ()) /** * VISU_ELEMENT: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuElement type. */ #define VISU_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_ELEMENT, VisuElement)) /** * VISU_ELEMENT_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuElementClass. */ #define VISU_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_ELEMENT, VisuElementClass)) /** * VISU_IS_ELEMENT_TYPE: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuElement object. */ #define VISU_IS_ELEMENT_TYPE(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_ELEMENT)) /** * VISU_IS_ELEMENT_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuElementClass class. */ #define VISU_IS_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_ELEMENT)) /** * VISU_ELEMENT_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. */ #define VISU_ELEMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_ELEMENT, VisuElementClass)) /** * VisuElementClass: * * An opaque structure representing the class of #VisuElement objects. */ typedef struct _VisuElementClass VisuElementClass; typedef struct _VisuElement VisuElement; struct _VisuElement { GObject parent; /* Name of the key used in the hashtable to find this element. The int variable is the number of this type. */ char* name; /* An integer unique for each VisuElement, it is used as a name for the opengl material associated with it. */ int typeNumber; /* OpenGl part */ /* main color of the element in [r, g, b, a] format*/ float rgb[4]; /* lighting effects for material in [amb, dif, shi, spe, emi] format. */ float material[5]; /* the identifier that stores the glObjectList that draw this VisuElement. */ int glMaterialId; /* A flag that is TRUE when the OpenGL list of the material is up to date. */ gboolean materialIsUpToDate; /* A flag to store if all nodes of this element are rendered or not. Its default value is TRUE. */ gboolean rendered; /* A flag to say if the element is masked by planes. Default is TRUE. */ gboolean sensitiveToPlanes; /* If the element should appear in the display list of elements or if this element is an internal substitute. */ gboolean physical; gboolean dispose_has_run; }; /** * visu_element_get_type: * * This method returns the type of #VisuElement, use VISU_TYPE_ELEMENT instead. * * Returns: the type of #VisuElement. */ GType visu_element_get_type(void); const GList *visu_element_getAllElements(void); VisuElement *visu_element_retrieveFromName(const gchar *name, gboolean *nw); VisuElement *visu_element_lookup(const gchar *name); VisuElement *visu_element_new(const char *key); gint visu_element_setAllColorValues(VisuElement* ele, float rgb[4], float material[5]); gint visu_element_setAllRGBValues(VisuElement* ele, float rgb[4]); gint visu_element_setRGBValue(VisuElement* ele, int rgb, float value); gint visu_element_setAllMaterialValues(VisuElement* ele, float material[5]); gint visu_element_setMaterialValue(VisuElement* ele, int material, float value); gboolean visu_element_setRendered(VisuElement *element, gboolean rendered); gboolean visu_element_setSensitiveToPlanes(VisuElement *element, gboolean status); void visu_element_createMaterial(VisuElement *ele); const gchar* visu_element_getName(const VisuElement *ele); int visu_element_getMaterialId(VisuElement *ele); gboolean visu_element_getRendered(VisuElement *element); gboolean visu_element_getSensitiveToPlanes(VisuElement *element); gboolean visu_element_getPhysical(VisuElement *ele); void visu_element_setUpdateNodesOnMaterialChange(void); void visu_element_unsetUpdateNodesOnMaterialChange(void); gboolean visu_element_getUpdateNodesOnMaterialChange(void); G_END_DECLS #endif v_sim-3.7.0/src/visu_nodes.c0000644000353400050620000024616012215546105012704 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "visu_nodes.h" #include #include #include "visu_tools.h" #include "visu_rendering.h" #include "visu_object.h" /** * SECTION:visu_nodes * @short_description: Defines the elementary structure to store * informations about an element in a box. * * In V_Sim, elements are drawn in a box. The #VisuNode * structure is used to represent an instance of an element position * somewhere in the box. This element can have several characteristics * such as its translation or its visibility. * * All nodes are stored in a #VisuData object in a two * dimensional array. The first dimension is indexed by the * #VisuElement of the node and the second corresponds to the number * of this node for this element. When a node is own by a #VisuData, * the two integers, that control the indexes in this array, are not * negative. See the #VisuNode structure for further * explanations. * * The only basic informations own by the #VisuNode structure is * basicaly its position. To add further informations (such as * orientation for the spin), define a node property using * visu_node_array_property_newPointer(). */ /** * VisuNode: * @xyz: (in) (array fixed-size=3): an array of three floating point values that positions the node in (x, y, z) ; * @translation: (in) (array fixed-size=3): an array of three floating point values that translates the * node to its drawn position from (x, y, z) ; * @number: an integer that corresponds to its position in the entry file, it references * also the node itself in the array 'fromNumberToVisuNode' of the #VisuData * that contains the node ; * @posElement: an integer that is the position of the #VisuElement of the node * in the array 'fromIntToVisuElement' of the #VisuData object that * contains the node ; * @posNode: an integer that is the position of the node itself in the array * 'nodes' of the #VisuData object that contains the node ; * @rendered: a boolean to store if the node is drwn or not. * * Structure to store primary data of a node. */ /* Local routines. */ static gpointer node_copy(gpointer boxed); static void freeNodePropStruct(gpointer data); static void removeNodeProperty(gpointer key, gpointer value, gpointer data); static void removeNodePropertyForElement(gpointer key, gpointer value, gpointer data); static void reallocNodeProperty(gpointer key, gpointer value, gpointer data); static void allocateNodeProp(gpointer key, gpointer value, gpointer data); static void createNodeproperty(gpointer key, gpointer value, gpointer data); static VisuNode* newOrCopyNode(VisuNodeArray *nodeArray, int iEle, int oldNodeId); static void freeElePropStruct(gpointer data); /* The number of nodes to be reallocated each time the visu_node_array_getNewNode() is called. */ #define REALLOCATION_STEP 100 /* The key of the original node property. */ #define ORIGINAL_ID "originalId" struct twoNodes { VisuNode *oldNode; VisuNode *newNode; }; struct _VisuNodeProperty { /* A label to define the property. */ gchar *name; /* A pointer to the array of nodes these properties are related to. */ VisuNodeArray *array; /* The type of the property. */ GType gtype; /* This table has the same size and structure than the node array object it is related to. Only one of the following data array is allocated. */ gpointer **data_pointer; int **data_int; /* In the case of pointer data, one can give the new, copy and free routine. */ /* This method is called for each stored token, if not NULL when the table is freed. */ GFunc freeTokenFunc; /* This method is used to create/copy a token of the data array. */ GCopyFunc newOrCopyTokenFunc; /* This value stores a pointer on a user data given when the object is created. This pointer is given to the copy or the free function. */ gpointer user_data; }; struct _ElementProperty { VisuNodeArrayElementPropertyInit init; GValueArray *array; }; GType visu_node_get_type(void) { static GType g_define_type_id = 0; if (g_define_type_id == 0) g_define_type_id = g_boxed_type_register_static("VisuNode", node_copy, g_free); return g_define_type_id; } /** * visu_node_setCoordinates: * @node: a #VisuNode object ; * @xyz: (array fixed-size=3): new cartesian coordinates. * * This method is used to change coordinates of @node. * * Since: 3.7 * * Returns: TRUE if the calling method should emit * #VisuNodeArray::PositionChanged signal. */ gboolean visu_node_setCoordinates(VisuNode* node, float xyz[3]) { g_return_val_if_fail(node, FALSE); if (node->xyz[0] == xyz[0] && node->xyz[1] == xyz[1] && node->xyz[2] == xyz[2]) return FALSE; node->xyz[0] = xyz[0]; node->xyz[1] = xyz[1]; node->xyz[2] = xyz[2]; return TRUE; } /** * visu_node_setVisibility: * @node: a #VisuNode object ; * @visibility: a boolean. * * This method is used to turn on or off the drawing of the specified node. * * Returns: true if the calling method should emit the * VisuNodeArray::VisibilityChanged signal. */ gboolean visu_node_setVisibility(VisuNode* node, gboolean visibility) { g_return_val_if_fail(node, FALSE); if (node->rendered == visibility) return FALSE; node->rendered = visibility; return TRUE; } /** * visu_node_getVisibility: * @node: a #VisuNode object. * * This method is used get the status of the drawing state of a node. * * Returns: true if the node is rendered, false otherwise. */ gboolean visu_node_getVisibility(VisuNode* node) { g_return_val_if_fail(node, FALSE); return node->rendered; } /** * visu_node_newValues: * @node: an allocated #VisuNode object ; * @xyz: (in) (array fixed-size=3): the coordinates to set. * * Set the coordinates and set all other values to default. */ void visu_node_newValues(VisuNode *node, float xyz[3]) { g_return_if_fail(node); DBG_fprintf(stderr, "Visu Node: set new position for node %d (%g;%g;%g).\n", node->number, xyz[0], xyz[1], xyz[2]); node->xyz[0] = xyz[0]; node->xyz[1] = xyz[1]; node->xyz[2] = xyz[2]; node->translation[0] = 0.; node->translation[1] = 0.; node->translation[2] = 0.; node->rendered = TRUE; } static gpointer node_copy(gpointer boxed) { VisuNode *node; node = g_malloc(sizeof(VisuNode)); DBG_fprintf(stderr, "Visu Node: copying node %p to %p.\n", boxed, (gpointer)node); visu_node_copy(node, (VisuNode*)boxed); return (gpointer)node; } /** * visu_node_copy: * @nodeTo: an allocated #VisuNode object ; * @nodeFrom: an allocated #VisuNode object. * * Copy all attributes of the object @nodeFrom to @nodeTo. */ void visu_node_copy(VisuNode *nodeTo, VisuNode *nodeFrom) { g_return_if_fail(nodeTo && nodeFrom); *nodeTo = *nodeFrom; } /***************/ /* Node Arrays */ /***************/ /** * VisuNodeArray: * * Opaque structure to stores #VisuNodeArray object. */ /** * VisuNodeArrayClass: * @parent: private. * * Class structure of #VisuNodeArray objects. */ typedef struct _eleArr { VisuElement *ele; /* Listeners on VisuElement signals. */ gulong rendered, material, rendering; /* Number of nodes allocated (size of the nodes array) and number of nodes physically present in the array for this element. */ guint nNodes, nStoredNodes; /* Allocated space for nodes of this element. */ VisuNode *nodes; } EleArr; typedef struct _nodeTable { /* A counter. */ guint idCounter; /* This array gives access to the good VisuNode when one has its number. This number is an integer ranging in [0;idCounter[. This value is readable in the #VisuNode structure as the number attribute. The current allocated size is stored in @nNodes. */ /* GArray *array. */ VisuNode **array; /* The total of allocated VisuNodes. */ guint nNodes; /* The total of stored VisuNodes. */ guint nStoredNodes; } NodeTable; /* Local methods. */ static void onAskForShowHideSignal(VisuNodeArray *nodeArray, gboolean *redraw, gpointer data); static void onElementRenderChanged(VisuNodeArray *data, VisuElement *element); static void onElementMaterialChanged(VisuNodeArray *data, VisuElement *element); static void onElementRenderingChanged(VisuNodeArray *data, VisuElement *element); static void _freeNodes(VisuNodeArray *nodeArray); #define _getEleArr(dataObj, i) (&g_array_index(dataObj->priv->elements, EleArr, i)) #define _getElement(dataObj, i) _getEleArr(dataObj, i)->ele static void allocateEleProp(gpointer key, gpointer value, gpointer data); /* static void freeEleProp(gpointer key, gpointer value, gpointer data); */ /** * VisuNodeArrayPrivate: * * Opaque structure to store private attributes of #VisuNodeArray objects. */ struct _VisuNodeArrayPrivate { gboolean dispose_has_run; /****************/ /* The elements */ /****************/ /* Stores for each element some related informations (see EleArr). */ GArray *elements; /*************/ /* The nodes */ /*************/ NodeTable nodeTable; /***********************/ /* The property arrays */ /***********************/ /* Properties of elements. */ GHashTable *eleProp; /* This is a table to store data, reachable with string keys. It should be accessed via visu_node_setproperty() and visu_node_array_getProperty(). */ GHashTable *nodeProp; /* A convenient pointer on the original node property. */ VisuNodeProperty *origProp; guint nOrigNodes; }; enum { ASK_FOR_SHOW_HIDE_SIGNAL, POPULATION_DEFINED_SIGNAL, POPULATION_INCREASE_SIGNAL, POPULATION_DECREASE_SIGNAL, POSITION_CHANGED_SIGNAL, VISIBILITY_CHANGED_SIGNAL, MATERIAL_CHANGED_SIGNAL, RENDERING_CHANGED_SIGNAL, ELEMENT_RENDERING_CHANGED_SIGNAL, LAST_SIGNAL }; static guint visu_node_array_signals[LAST_SIGNAL] = { 0 }; static void visu_node_array_dispose (GObject* obj); static void visu_node_array_finalize (GObject* obj); G_DEFINE_TYPE(VisuNodeArray, visu_node_array, G_TYPE_OBJECT) static void visu_node_array_class_init(VisuNodeArrayClass *klass) { DBG_fprintf(stderr, "Visu NodeArray: creating the class of the object.\n"); DBG_fprintf(stderr, " - adding new signals ;\n"); /** * VisuNodeArray::AskForShowHide: * @nodes: the object which received the signal ; * @redraw: (out caller-allocates) (type gboolean): a location on a boolean. * * Gets emitted when external modules should recompute their masking * effect on nodes. Location pointed by @redraw must be set to TRUE * if the visibility of at least one node is changed. * * Since: 3.2 */ visu_node_array_signals[ASK_FOR_SHOW_HIDE_SIGNAL] = g_signal_new("AskForShowHide", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0 , NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); /** * VisuNodeArray::PopulationDefined: * @nodes: the object which received the signal ; * @nEle: the actual allocated number of #VisuElement of @nodes. * * Gets emitted when the population of nodes is created or * destroyed. It is possible then to associate new #VisuNodeProperty * for instance. * * Since: 3.5 */ visu_node_array_signals[POPULATION_DEFINED_SIGNAL] = g_signal_new("PopulationDefined", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * VisuNodeArray::PopulationDecrease: * @nodes: the object which received the signal ; * @ids: (element-type gint) (array): an array of #VisuNode ids. * * Gets emitted when the number of nodes has changed, * decreasing. @ids contains all removed ids and is -1 terminated. * When emitted, nodes have already been removed, so no external * routines should keep pointers on these nodes. * * Since: 3.4 */ visu_node_array_signals[POPULATION_DECREASE_SIGNAL] = g_signal_new("PopulationDecrease", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); /** * VisuNodeArray::PopulationIncrease: * @nodes: the object which received the signal ; * @ids: (element-type gint) (array): an array of #VisuNode ids. * * Gets emitted when the number of nodes has changed, * increasing. @ids contains all new ids and is -1 terminated. * * Since: 3.4 */ visu_node_array_signals[POPULATION_INCREASE_SIGNAL] = g_signal_new("PopulationIncrease", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); /** * VisuNodeArray::PositionChanged: * @nodes: the object which received the signal ; * @ele: (allow-none): the #VisuElement nodes have moved or NULL for * all elements. * * Gets emitted when one or more nodes have moved, because of * translations or because the user has moved them manually. * * Since: 3.2 */ visu_node_array_signals[POSITION_CHANGED_SIGNAL] = g_signal_new("PositionChanged", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT, NULL); /** * VisuNodeArray::VisibilityChanged: * @nodes: the object which received the signal ; * * Gets emitted when one or more nodes have changed of * visibility. Some may have appeared, some may have disappeared. * * Since: 3.2 */ visu_node_array_signals[VISIBILITY_CHANGED_SIGNAL] = g_signal_newv("VisibilityChanged", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, NULL, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, NULL); /** * VisuNodeArray::MaterialChanged: * @nodes: the object which received the signal ; * * Gets emitted when one or more nodes have changed of * color or material. * * Since: 3.6 */ visu_node_array_signals[MATERIAL_CHANGED_SIGNAL] = g_signal_newv("MaterialChanged", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, NULL, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, NULL); /** * VisuNodeArray::RenderingChanged: * @nodes: the object which received the signal ; * @ele: (allow-none): the #VisuElement nodes have changed or NULL for * all elements. * * Gets emitted when the rendering characteristic of nodes are * changed, like their shape or specific colour. For a signal on * generic colours (like the inherited element colour), listen to * VisuNodeArray::MaterialChanged signal instead. * * Since: 3.7 */ visu_node_array_signals[RENDERING_CHANGED_SIGNAL] = g_signal_new("RenderingChanged", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT, NULL); /** * VisuNodeArray::ElementRenderingChanged: * @nodes: the object which received the signal ; * @ele: (allow-none): the #VisuElement nodes have changed or NULL for * all elements. * * Gets emitted when the rendering characteristic of elements are * changed, like their shape or specific colour. * * Since: 3.7 */ visu_node_array_signals[ELEMENT_RENDERING_CHANGED_SIGNAL] = g_signal_new("ElementRenderingChanged", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT, NULL); /* Connect the overloading methods. */ G_OBJECT_CLASS(klass)->dispose = visu_node_array_dispose; G_OBJECT_CLASS(klass)->finalize = visu_node_array_finalize; g_type_class_add_private(klass, sizeof(VisuNodeArrayPrivate)); /* Create the boxed type of nodes. */ visu_node_get_type(); } static void visu_node_array_init(VisuNodeArray *array) { DBG_fprintf(stderr, "Visu NodeArray: initializing a new object (%p).\n", (gpointer)array); array->priv = G_TYPE_INSTANCE_GET_PRIVATE(array, VISU_TYPE_NODE_ARRAY, VisuNodeArrayPrivate); array->priv->dispose_has_run = FALSE; array->priv->elements = g_array_new(FALSE, FALSE, sizeof(EleArr)); array->priv->nodeTable.idCounter = 0; array->priv->nodeTable.nNodes = 0; array->priv->nodeTable.nStoredNodes = 0; array->priv->nodeTable.array = (VisuNode**)0; array->priv->eleProp = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, freeElePropStruct); array->priv->nodeProp = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, freeNodePropStruct); /* We add a node property that is > 0 if the node is a duplicate node and negative if not. The value is the node id that the duplicate refers to. */ DBG_fprintf(stderr, " | create the original node property.\n"); array->priv->origProp = visu_node_array_property_newInteger(array, ORIGINAL_ID); array->priv->nOrigNodes = 0; /* Connect a method to make all nodes rendered attribute to TRUE when the AskForShowHide signal is emited. */ g_signal_connect(G_OBJECT(array), "AskForShowHide", G_CALLBACK(onAskForShowHideSignal), (gpointer)0); } /* This method can be called several times. It should unref all of its reference to GObjects. */ static void visu_node_array_dispose(GObject* obj) { VisuNodeArray *nodes; guint i; EleArr *ele; DBG_fprintf(stderr, "Visu NodeArray: dispose object %p.\n", (gpointer)obj); nodes = VISU_NODE_ARRAY(obj); if (nodes->priv->dispose_has_run) return; nodes->priv->dispose_has_run = TRUE; for (i = 0; i < nodes->priv->elements->len; i++) { ele = _getEleArr(nodes, i); g_signal_handler_disconnect(G_OBJECT(ele->ele), ele->rendered); g_signal_handler_disconnect(G_OBJECT(ele->ele), ele->material); } /* Chain up to the parent class */ G_OBJECT_CLASS(visu_node_array_parent_class)->dispose(obj); } /* This method is called once only. */ static void visu_node_array_finalize(GObject* obj) { VisuNodeArrayPrivate *nodeArray; g_return_if_fail(obj); DBG_fprintf(stderr, "Visu NodeArray: finalize object %p.\n", (gpointer)obj); nodeArray = VISU_NODE_ARRAY(obj)->priv; /* We first remove the properties, before the node description because these descriptions may be relevant. */ if (nodeArray->nodeProp) g_hash_table_destroy(nodeArray->nodeProp); if (nodeArray->eleProp) g_hash_table_destroy(nodeArray->eleProp); _freeNodes(VISU_NODE_ARRAY(obj)); g_array_free(nodeArray->elements, TRUE); /* Chain up to the parent class */ DBG_fprintf(stderr, "Visu NodeArray: chain to parent.\n"); G_OBJECT_CLASS(visu_node_array_parent_class)->finalize(obj); DBG_fprintf(stderr, "Visu NodeArray: freeing ... OK.\n"); } #if DEBUG == 1 static void _checkNodeTable(NodeTable *table) { guint j; for (j = 0; j < table->idCounter; j++) if (table->array[j] && table->array[j]->number != j) g_warning("inconsistency on node number %d.", j); } #endif static gboolean _validNodeTableId(NodeTable *table, guint id) { g_return_val_if_fail(table, FALSE); return id < table->idCounter; } static void _increaseNodeTable(NodeTable *table, guint delta) { table->nNodes += delta; table->array = g_realloc(table->array, sizeof(VisuNode*) * table->nNodes); memset(table->array + table->nNodes - delta, '\0', sizeof(VisuNode*) * delta); } static void _compactNodeTable(NodeTable *table) { DBG_fprintf(stderr, "Visu NodeArray: compaction required (%d %d).\n", table->idCounter, table->nNodes); g_return_if_fail(table && table->idCounter <= table->nNodes); /* We get the last non NULL node pointer in the array array to make the idCounter having this value to avoid to much reallocation of the array array. */ for (; table->idCounter > 0 && !table->array[table->idCounter - 1]; table->idCounter -= 1); DBG_fprintf(stderr, "Visu NodeArray: idCounter is set to %d.\n", table->idCounter); } static VisuNode* _getFromId(NodeTable *table, guint number) { g_return_val_if_fail(table && number < table->nNodes, (VisuNode*)0); return table->array[number]; } static void _setAtId(NodeTable *table, guint number, VisuNode *node) { g_return_if_fail(table && number < table->nNodes); if (node && !table->array[number]) table->nStoredNodes += 1; else if (!node && table->array[number]) table->nStoredNodes -= 1; table->array[number] = node; } static void _addNodeTable(NodeTable *table, VisuNode *node) { g_return_if_fail(table && node); if (table->idCounter == table->nNodes) _increaseNodeTable(table, REALLOCATION_STEP); node->number = table->idCounter; _setAtId(table, node->number, node); table->idCounter += 1; } /** * visu_node_array_allocate: * @array: a #VisuNodeArray object. * @elements: (in) (element-type VisuElement*):the size of nNodes. * @nNodes: (in) (element-type guint): an array giving the number of nodes per element. * * Reallocate the internal arrays to match @elements and @nNodes. */ void visu_node_array_allocate(VisuNodeArray *array, GArray *elements, GArray *nNodes) { guint i, j; EleArr ele; VisuElement *element; g_return_if_fail(VISU_IS_NODE_ARRAY(array)); g_return_if_fail(nNodes && nNodes->len > 0); g_return_if_fail(elements && elements->len > 0); g_return_if_fail(nNodes->len == elements->len); DBG_fprintf(stderr, "Visu NodeArray: allocating VisuElement data (+%d elements).\n", elements->len); for(i = 0; i < elements->len; i++) { element = g_array_index(elements, VisuElement*, i); if (visu_node_array_getElementId(array, element) < 0) { /* Create new element. */ ele.ele = element; ele.rendered = g_signal_connect_swapped(G_OBJECT(element), "ElementVisibilityChanged", G_CALLBACK(onElementRenderChanged), array); ele.material = g_signal_connect_swapped(G_OBJECT(element), "ElementMaterialChanged", G_CALLBACK(onElementMaterialChanged), array); ele.rendering = g_signal_connect_swapped(G_OBJECT(element), "ElementRenderingChanged", G_CALLBACK(onElementRenderingChanged), array); ele.nNodes = g_array_index(nNodes, guint, i); ele.nStoredNodes = 0; ele.nodes = g_malloc(sizeof(VisuNode) * ele.nNodes); for (j = 0; j < ele.nNodes; j++) { ele.nodes[j].posElement = array->priv->elements->len; ele.nodes[j].posNode = j; } array->priv->elements = g_array_append_val(array->priv->elements, ele); /* Increase the node table. */ _increaseNodeTable(&array->priv->nodeTable, ele.nNodes); /* Expand element properties for new element. */ g_hash_table_foreach(array->priv->eleProp, allocateEleProp, (gpointer)ele.ele); /* Expand node properties for new element. */ g_hash_table_foreach(array->priv->nodeProp, allocateNodeProp, (gpointer)0); DBG_fprintf(stderr, " | add VisuElement '%p' -> '%s' (%ld %ld) at %p.\n", (gpointer)element, element->name, ele.rendered, ele.material, (gpointer)_getEleArr(array, array->priv->elements->len - 1)); DBG_fprintf(stderr, " | %d nodes allocated.\n", ele.nNodes); } else /* Reallocate existing element. */ visu_node_array_allocateNodesForElement(array, i, g_array_index(nNodes, guint, i)); } DBG_fprintf(stderr, " | has now %d elements.\n", array->priv->elements->len); DBG_fprintf(stderr, " | total number of allocated nodes %d.\n", array->priv->nodeTable.nNodes); DBG_fprintf(stderr, " | size = %do\n", (int)(array->priv->elements->len * sizeof(EleArr) + sizeof(GArray) + sizeof(VisuNode) * array->priv->nodeTable.nNodes + sizeof(VisuNode*) * array->priv->nodeTable.nNodes + sizeof(VisuNodeArray))); DBG_fprintf(stderr, "Visu NodeArray: emit PopulationDefined.\n"); g_signal_emit(G_OBJECT(array), visu_node_array_signals[POPULATION_DEFINED_SIGNAL], 0, array->priv->elements->len, NULL); DBG_fprintf(stderr, "Visu NodeArray: emission done (PopulationDefined).\n"); } /** * visu_node_array_allocateByNames: * @array: a #VisuNodeArray object; * @nNodesPerElement: (in) (element-type guint): number of #VisuNode per VisuElement; * @elementNames: (in) (element-type utf8): names of elements; * * This method allocates the storing part of the given #VisuNodeArray structure and * store all the #VisuNodes. */ void visu_node_array_allocateByNames(VisuNodeArray *array, GArray *nNodesPerElement, GArray *elementNames) { GArray *elements; guint i; VisuElement *ele; DBG_fprintf(stderr, "Visu NodeArray: allocating %p from names.\n", (gpointer)array); elements = g_array_sized_new(FALSE, FALSE, sizeof(VisuElement*), elementNames->len); for (i = 0; i < elementNames->len; i++) { ele = visu_element_retrieveFromName(g_array_index(elementNames, gchar*, i), (gboolean*)0); g_array_append_val(elements, ele); } visu_node_array_allocate(array, elements, nNodesPerElement); g_array_free(elements, TRUE); } static void _freeNodes(VisuNodeArray *nodeArray) { guint i; EleArr *ele; DBG_fprintf(stderr, "Visu NodeArray: free storages of %p.\n", (gpointer)nodeArray); if (nodeArray->priv->elements) { for (i = 0; i < nodeArray->priv->elements->len; i++) { ele = _getEleArr(nodeArray, i); if (!nodeArray->priv->dispose_has_run) { g_signal_handler_disconnect(G_OBJECT(ele->ele), ele->rendered); g_signal_handler_disconnect(G_OBJECT(ele->ele), ele->material); } g_free(ele->nodes); } g_array_set_size(nodeArray->priv->elements, 0); } if (nodeArray->priv->nodeTable.array) g_free(nodeArray->priv->nodeTable.array); nodeArray->priv->nodeTable.array = (VisuNode**)0; nodeArray->priv->nodeTable.idCounter = 0; nodeArray->priv->nodeTable.nNodes = 0; nodeArray->priv->nodeTable.nStoredNodes = 0; DBG_fprintf(stderr, "Visu NodeArray: freeing node array ... OK.\n"); } /** * visu_node_array_freeNodes: * @nodeArray: a #VisuNodeArray object. * * Deallocate all nodes of the object and related properties but keep * the object alive. **/ void visu_node_array_freeNodes(VisuNodeArray *nodeArray) { /* We first remove the properties, before the node description because these descriptions may be relevant. */ if (nodeArray->priv->nodeProp) g_hash_table_remove_all(nodeArray->priv->nodeProp); if (nodeArray->priv->eleProp) g_hash_table_remove_all(nodeArray->priv->eleProp); _freeNodes(nodeArray); nodeArray->priv->origProp = visu_node_array_property_newInteger(nodeArray, ORIGINAL_ID); nodeArray->priv->nOrigNodes = 0; } /** * visu_node_array_removeNodes: * @nodeArray: a #VisuNodeArray object. * @nodeNumbers: (in) (array): an array of integers (negative terminated). * * Remove the given #VisuNode from the @nodeArray. The properties * are also updated. */ void visu_node_array_removeNodes(VisuNodeArray *nodeArray, int *nodeNumbers) { VisuNode *node; guint i, iEle, iNode; EleArr *ele; g_return_if_fail(nodeArray && nodeNumbers); /* For each element in the given node array, we take the last node of the same element and it takes it position. */ DBG_fprintf(stderr, "Visu Node: removing nodes from array %p.\n", (gpointer)nodeArray); for (i = 0; nodeNumbers[i] >= 0; i++) { node = _getFromId(&nodeArray->priv->nodeTable, nodeNumbers[i]); if (!node) continue; g_return_if_fail(node->number == (guint)nodeNumbers[i]); iEle = node->posElement; iNode = node->posNode; ele = _getEleArr(nodeArray, iEle); ele->nStoredNodes -= 1; if (ele->nStoredNodes > 0) { /* First, we copy the properties following the same scheme, the last node of the given element is copy instead of the given one. */ g_hash_table_foreach(nodeArray->priv->nodeProp, removeNodeProperty, ele->nodes + iNode); /* Then, we copy the node values themselves. */ visu_node_copy(ele->nodes + iNode, ele->nodes + ele->nStoredNodes); /* We update the index values. */ ele->nodes[iNode].posNode = iNode; ele->nodes[iNode].number = ele->nodes[ele->nStoredNodes].number; _setAtId(&nodeArray->priv->nodeTable, ele->nodes[iNode].number, ele->nodes + iNode); } /* Nullify the removed node. */ _setAtId(&nodeArray->priv->nodeTable, nodeNumbers[i], (VisuNode*)0); DBG_fprintf(stderr, "Visu NodeArray: %d removed, population for element %d is now:", nodeNumbers[i], iEle); DBG_fprintf(stderr, " %d/%d # %d/%d\n", nodeArray->priv->nodeTable.nStoredNodes, nodeArray->priv->nodeTable.nNodes, ele->nStoredNodes, ele->nNodes); } _compactNodeTable(&nodeArray->priv->nodeTable); DBG_fprintf(stderr, " | size = %do\n", (int)(nodeArray->priv->elements->len * sizeof(EleArr) + sizeof(GArray) + sizeof(VisuNode) * nodeArray->priv->nodeTable.nNodes + sizeof(VisuNode*) * nodeArray->priv->nodeTable.nNodes + sizeof(VisuNodeArray))); DBG_fprintf(stderr, "Visu NodeArray: emit a 'NodePopulationDecrease' signal.\n"); g_signal_emit(G_OBJECT(nodeArray), visu_node_array_signals[POPULATION_DECREASE_SIGNAL], 0, (gpointer)nodeNumbers, NULL); } /** * visu_node_array_removeNodesOfElement: * @nodeArray: a #VisuNodeArray object. * @element: a #VisuElement object. * * Remove all the #VisuNode from the element @element. The properties * are also updated. * * Since: 3.7 */ void visu_node_array_removeNodesOfElement(VisuNodeArray *nodeArray, VisuElement *element) { guint i; gint iEle, stop = -1; EleArr *ele; GArray *nodeNumbers; g_return_if_fail(nodeArray && element); iEle = visu_node_array_getElementId(nodeArray, element); if (iEle < 0) return; /* We keep the allocation to avoid deallocating, reallocating. */ /* Begin by removing the the node properties. */ g_hash_table_foreach(nodeArray->priv->nodeProp, removeNodePropertyForElement, GINT_TO_POINTER(iEle)); ele = _getEleArr(nodeArray, iEle); /* We update the node table. */ nodeNumbers = g_array_new(FALSE, FALSE, sizeof(gint)); for (i = 0; i < ele->nStoredNodes; i++) { g_array_append_val(nodeNumbers, ele->nodes[i].number); _setAtId(&nodeArray->priv->nodeTable, ele->nodes[i].number, (VisuNode*)0); } g_array_append_val(nodeNumbers, stop); ele->nStoredNodes = 0; _compactNodeTable(&nodeArray->priv->nodeTable); DBG_fprintf(stderr, "Visu NodeArray: emit a 'NodePopulationDecrease' signal.\n"); g_signal_emit(G_OBJECT(nodeArray), visu_node_array_signals[POPULATION_DECREASE_SIGNAL], 0, (gpointer)nodeNumbers->data, NULL); g_array_free(nodeNumbers, TRUE); } /** * visu_node_array_removeAllDuplicateNodes: * @nodeArray: a #VisuNodeArray object. * * Remove all nodes that are not original in the box. * * Returns: TRUE if some nodes have been removed. */ gboolean visu_node_array_removeAllDuplicateNodes(VisuNodeArray *nodeArray) { GArray *tmp; guint i, j; EleArr *ele; int stop; g_return_val_if_fail(VISU_IS_NODE_ARRAY(nodeArray), FALSE); tmp = g_array_new(FALSE, FALSE, sizeof(int)); for (i = 0; i < nodeArray->priv->elements->len; i++) { ele = _getEleArr(nodeArray, i); for (j = 0; j < ele->nStoredNodes; j++) if (nodeArray->priv->origProp->data_int[i][j] >= 0) tmp = g_array_append_val(tmp, ele->nodes[j].number); } if (tmp->len > 0) { stop = -1; tmp = g_array_append_val(tmp, stop); visu_node_array_removeNodes(nodeArray, (int*)tmp->data); g_array_free(tmp, TRUE); return TRUE; } g_array_free(tmp, TRUE); return FALSE; } /** * visu_node_array_getFromId: * @array: a #VisuNodeArray structure which stores the nodes. * @number: an integer. * * This methods retrieves the #VisuNode identified by the integer @number. * The number must be strictly positive. No error is raised if no node corresponds * to the given number. * * Returns: (transfer none): the found #VisuNode or NULL if none corresponds to number. */ VisuNode* visu_node_array_getFromId(VisuNodeArray *array, guint number) { g_return_val_if_fail(VISU_IS_NODE_ARRAY(array), (VisuNode*)0); DBG_fprintf(stderr, "Visu NodeArray: get VisuNode from number %d.\n", number); if (_validNodeTableId(&array->priv->nodeTable, number)) return _getFromId(&array->priv->nodeTable, number); else return (VisuNode*)0; } /** * visu_node_array_getOriginal: * @nodeArray: a #VisuNodeArray object. * @nodeId: a node id. * * Test if the given @nodeId is an original or a replica for the * periodisation. * * Returns: TRUE for an original node. */ gint visu_node_array_getOriginal(VisuNodeArray *nodeArray, guint nodeId) { VisuNode *node; gint orig; g_return_val_if_fail(nodeArray && nodeArray->priv->origProp, -1); g_return_val_if_fail(_validNodeTableId(&nodeArray->priv->nodeTable, nodeId), -1); orig = (gint)nodeId; do { node = _getFromId(&nodeArray->priv->nodeTable, orig); orig = nodeArray->priv->origProp->data_int[node->posElement][node->posNode]; } while (orig >= 0); /* DBG_fprintf(stderr, "Visu Node: get original from %d: %d (%d).\n", */ /* nodeId, node->number, */ /* nodeArray->priv->origProp->data_int[node->posElement][node->posNode]); */ return (node->number == nodeId)?-1:(gint)node->number; } /** * visu_node_array_setOriginal: * @nodeArray: a #VisuNodeArray object. * @nodeId: a node id. * * Test if the given @nodeId is an original or a replica for the * periodisation. * * Returns: TRUE for an original node. */ gboolean visu_node_array_setOriginal(VisuNodeArray *nodeArray, guint nodeId) { VisuNode *node; gint orig; g_return_val_if_fail(nodeArray && nodeArray->priv->origProp, -1); g_return_val_if_fail(_validNodeTableId(&nodeArray->priv->nodeTable, nodeId), -1); node = _getFromId(&nodeArray->priv->nodeTable, nodeId); g_return_val_if_fail(node, FALSE); orig = nodeArray->priv->origProp->data_int[node->posElement][node->posNode]; nodeArray->priv->origProp->data_int[node->posElement][node->posNode] = -1; DBG_fprintf(stderr, "Visu Node: set original for %d (%d).\n", nodeId, orig); return (orig != -1); } /** * visu_node_array_switchNumber: * @nodeArray: a #VisuNodeArray object. * @from: a node id. * @to: another node id. * * Two nodes of @nodeArray switches their number. * * Since: 3.6 * * Returns: TRUE if number is switched. */ gboolean visu_node_array_switchNumber(VisuNodeArray *nodeArray, guint from, guint to) { VisuNode *nodeFrom, *nodeTo; if (from == to) return FALSE; nodeFrom = _getFromId(&nodeArray->priv->nodeTable, from); nodeTo = _getFromId(&nodeArray->priv->nodeTable, to); _setAtId(&nodeArray->priv->nodeTable, from, nodeTo); _setAtId(&nodeArray->priv->nodeTable, to, nodeFrom); nodeFrom->number = to; nodeTo->number = from; return TRUE; } /** * visu_node_array_compareElements: * @data1: a #VisuData object ; * @data2: an other #VisuData object. * * This method is used to compare the composition of the given two #VisuData objects. * The test is only done on #VisuElement lists. * * Returns: TRUE if the two objects contains exactly the same #VisuElement objects (not * one more or one less or one different), FALSE otherwise. */ gboolean visu_node_array_compareElements(VisuNodeArray *data1, VisuNodeArray *data2) { guint i, j; gboolean found; g_return_val_if_fail(data1 && data2, FALSE); DBG_fprintf(stderr, "Visu NodeArray: comparing composition of '%p' and '%p'.\n", (gpointer)data1, (gpointer)data2); if (data1 == data2) return TRUE; if (data1->priv->elements->len != data2->priv->elements->len) return FALSE; for (i = 0; i < data1->priv->elements->len; i++) { found = FALSE; for (j = 0; !found && j < data2->priv->elements->len; j++) found = (_getElement(data1, i) == _getElement(data2, j)); if (!found) return FALSE; } return TRUE; } /** * visu_node_array_getMaxElementSize: * @nodes: a #VisuNodeArray object. * * Calculate the maximum size of all #VisuElement used in these * @nodes. * * Returns: a positive size. */ float visu_node_array_getMaxElementSize(VisuNodeArray *nodes) { float ext, ext_; VisuNodeArrayIter iter; VisuRendering *method; g_return_val_if_fail(VISU_IS_NODE_ARRAY(nodes), 0.f); DBG_fprintf(stderr, "Visu NodeArray: get extens of all elements.\n"); /* Compute the max size of a drawn node. */ method = visu_object_getRendering(VISU_OBJECT_INSTANCE); g_return_val_if_fail(VISU_IS_RENDERING_TYPE(method), 0.f); ext = 0.f; visu_node_array_iterNew(nodes, &iter); for (visu_node_array_iterStart(nodes, &iter); iter.element; visu_node_array_iterNextElement(nodes, &iter)) { ext_ = visu_rendering_getSizeOfElement(method, iter.element); ext = MAX(ext, ext_); } DBG_fprintf(stderr, " | %g.\n", ext); return ext; } /** * visu_node_array_getElement: * @data: a #VisuNodeArray object ; * @node: a #VisuNode of this array. * * This routine gets the #VisuElement the @node belongs to. * * Since: 3.7 * * Returns: (transfer none): a #VisuElement, owned by V_Sim. */ VisuElement* visu_node_array_getElement(VisuNodeArray *data, VisuNode *node) { g_return_val_if_fail(VISU_IS_NODE_ARRAY(data) && node, (VisuElement*)0); return _getElement(data, node->posElement); } /** * visu_node_array_getElementId: * @array: a #VisuNodeArray object ; * @element: a #VisuElement object. * * This routines returns the internal id used to represent @element, * or -1 if not found. * * Since: 3.7 * * Returns: a positive number or -1 if not found. */ gint visu_node_array_getElementId(VisuNodeArray *array, VisuElement *element) { guint i; g_return_val_if_fail(VISU_IS_NODE_ARRAY(array), -1); for (i = 0; i < array->priv->elements->len; i++) if (_getElement(array, i) == element) return i; return -1; } /** * visu_node_array_getNNodes: * @array: a #VisuNodeArray object. * * This routines returns the number of #VisuNode stored in @array. * * Since: 3.7 * * Returns: a positive number. */ guint visu_node_array_getNNodes(VisuNodeArray *array) { g_return_val_if_fail(VISU_IS_NODE_ARRAY(array), 0); return array->priv->nodeTable.nStoredNodes; } /** * visu_node_array_getNElements: * @array: a #VisuNodeArray object ; * @physical: a boolean. * * The parameter @array stores several #VisuNode of #VisuElement. This * routine is used to get the number of #VisuElement that are used by * this @array. Depending on @physical value, the number of * #VisuElement representing physical element or not is retrieved. The * actual returned number of #VisuElement take into account only * elements with a positive number of nodes. * * Since: 3.7 * * Returns: a positive number. */ guint visu_node_array_getNElements(VisuNodeArray *array, gboolean physical) { guint nEle, i; g_return_val_if_fail(VISU_IS_NODE_ARRAY(array), 0); nEle = 0; for (i = 0; i < array->priv->elements->len; i++) if (_getEleArr(array, i)->nStoredNodes > 0) { if (physical && visu_element_getPhysical(_getElement(array, i))) nEle += 1; else if (!physical) nEle += 1; } return nEle; } /** * visu_node_array_allocateNodesForElement: * @array: a #VisuNodeArray object ; * @eleId: an internal #VisuElement id ; * @nNodes: a positive number of nodes. * * This routine is used to allocate space for @nNodes of a * #VisuElement. This #VisuElement is identified by its internal id, * see visu_node_array_getElementId(). If this #VisuElement has * already enough space in this @array, nothing is done, otherwise * space is reallocated. * * Since: 3.7 */ void visu_node_array_allocateNodesForElement(VisuNodeArray *array, guint eleId, guint nNodes) { guint j, delta; VisuNode *oldNodeList; EleArr *ele; g_return_if_fail(VISU_IS_NODE_ARRAY(array) && eleId < array->priv->elements->len); ele = _getEleArr(array, eleId); if (ele->nNodes >= nNodes) return; delta = nNodes - ele->nNodes; oldNodeList = ele->nodes; DBG_fprintf(stderr, "Visu Node: reallocation needed for element " "%d with %d nodes.\n", eleId, delta); ele->nNodes = nNodes; ele->nodes = g_realloc(ele->nodes, sizeof(VisuNode) * ele->nNodes); _increaseNodeTable(&array->priv->nodeTable, delta); DBG_fprintf(stderr, " | (all)%d/%d # (%d)%d/%d\n", array->priv->nodeTable.nStoredNodes, array->priv->nodeTable.nNodes, eleId, ele->nStoredNodes, ele->nNodes); /* We set the default values for the new nodes. */ for (j = ele->nStoredNodes; j < ele->nNodes; j++) { ele->nodes[j].posElement = eleId; ele->nodes[j].posNode = j; } /* If the node list has been moved, we need to reassign pointers of array nodeTable. */ if (oldNodeList != ele->nodes) for (j = 0; j < ele->nStoredNodes; j++) _setAtId(&array->priv->nodeTable, ele->nodes[j].number, ele->nodes + j); /* We reallocate the table properties. */ g_hash_table_foreach(array->priv->nodeProp, reallocNodeProperty, GINT_TO_POINTER(eleId)); /* Test part for the nodeTable array. */ #if DEBUG == 1 _checkNodeTable(&array->priv->nodeTable); #endif DBG_fprintf(stderr, "Visu Node: reallocation OK.\n"); DBG_fprintf(stderr, " | size = %do\n", (int)(array->priv->elements->len * sizeof(EleArr) + sizeof(GArray) + sizeof(VisuNode) * array->priv->nodeTable.nNodes + sizeof(VisuNode*) * array->priv->nodeTable.nNodes + sizeof(VisuNodeArray))); } /** * visu_node_array_getNewNode: * @nodeArray: a #VisuNodeArray object ; * @iEle: an integer between 0 and @nodeArray->priv->elements->lens - 1. * * Return the location of an unstored node for the given #VisuElement. * The returned node is then added in the list of used nodes. * * Returns: (transfer none): the location of a newly used node. */ VisuNode* visu_node_array_getNewNode(VisuNodeArray *nodeArray, guint iEle) { DBG_fprintf(stderr, "Visu Node: create a new node of element %d.\n", iEle); return newOrCopyNode(nodeArray, iEle, -1); } /** * visu_node_array_getCopyNode: * @nodeArray: a #VisuNodeArray object ; * @node: a node of the given #VisuNodeArray. * * Return the location of an unstored node that is the deep copy of the given node. * The returned node is then added in the list of used nodes. * * Returns: (transfer none): the location of a newly used node. */ VisuNode* visu_node_array_getCopyNode(VisuNodeArray *nodeArray, VisuNode *node) { VisuNode* out; DBG_fprintf(stderr, "Visu Node: copy a new node from node %d (%d-%d).\n", node->number, node->posElement, node->posNode); out = newOrCopyNode(nodeArray, node->posElement, node->number); DBG_fprintf(stderr, "Visu Node: copy a new node from node -> %d.\n", out->number); return out; } static VisuNode* newOrCopyNode(VisuNodeArray *nodeArray, int iEle, int oldNodeId) { EleArr *ele; VisuNode *node, *oldNode; int j; struct twoNodes nodes; GValue idValue = {0, {{0}, {0}}}; g_return_val_if_fail(nodeArray, (VisuNode*)0); g_return_val_if_fail((oldNodeId >= 0 && _validNodeTableId(&nodeArray->priv->nodeTable, (guint)oldNodeId)) || (iEle >= 0 && iEle < (int)nodeArray->priv->elements->len), (VisuNode*)0); ele = _getEleArr(nodeArray, iEle); if (ele->nStoredNodes == ele->nNodes) /* We need to realloc... */ visu_node_array_allocateNodesForElement(nodeArray, iEle, ele->nNodes + REALLOCATION_STEP); /* Get the new node. */ node = ele->nodes + ele->nStoredNodes; _addNodeTable(&nodeArray->priv->nodeTable, node); /* Update the node internal values. */ ele->nStoredNodes += 1; /* We copy the values from oldNode. */ oldNode = (VisuNode*)0; if (oldNodeId >= 0) { oldNode = _getFromId(&nodeArray->priv->nodeTable, oldNodeId); for ( j = 0; j < 3; j++) { node->xyz[j] = oldNode->xyz[j]; node->translation[j] = oldNode->translation[j]; } node->rendered = oldNode->rendered; } /* Create new properties for the node. */ nodes.newNode = node; nodes.oldNode = oldNode; g_hash_table_foreach(nodeArray->priv->nodeProp, createNodeproperty, (gpointer)&nodes); /* If we have an old node, we use it as original node id, or we put -1 if not. */ g_value_init(&idValue, G_TYPE_INT); g_value_set_int(&idValue, oldNodeId); visu_node_property_setValue(nodeArray->priv->origProp, node, &idValue); nodeArray->priv->nOrigNodes += (oldNodeId < 0)?1:0; return node; } /** * visu_node_array_askForShowHide: * @array: a #VisuNodeArray object. * * This function emits the "AskForShowHide" signal of @array. This * signal will make all the nodes visible and each hiding objects will * have to switch off nodes. * * Since: 3.7 * * Returns: TRUE if "VisibilityChanged" signal should be emitted. **/ gboolean visu_node_array_askForShowHide(VisuNodeArray *array) { gboolean redraw; g_signal_emit_by_name(G_OBJECT(array), "AskForShowHide", &redraw, NULL); return redraw; } /*******************/ /* Local routines. */ /*******************/ static void onAskForShowHideSignal(VisuNodeArray *nodeArray, gboolean *redraw, gpointer data _U_) { guint i, j; EleArr *ele; DBG_fprintf(stderr, "Visu NodeArray: caught the 'AskForShowHide' signal," " setting all node rendered attribute to TRUE.\n"); for (i = 0; i < nodeArray->priv->elements->len; i++) for(ele = _getEleArr(nodeArray, i), j = 0; j < ele->nStoredNodes; j++) *redraw = visu_node_setVisibility(ele->nodes + j, TRUE) || *redraw; DBG_fprintf(stderr, " - returned redraw value : %d.\n", *redraw); } static void onElementRenderChanged(VisuNodeArray *data, VisuElement *element _U_) { DBG_fprintf(stderr, "Visu NodeArray: caught the 'ElementVisibilityChanged' signal," " emitting node render signal.\n"); g_signal_emit(G_OBJECT(data), visu_node_array_signals[VISIBILITY_CHANGED_SIGNAL], 0, NULL); } static void onElementMaterialChanged(VisuNodeArray *data, VisuElement *element _U_) { DBG_fprintf(stderr, "Visu NodeArray: caught the 'ElementMaterialChanged' signal," " emitting node material signal.\n"); g_signal_emit(G_OBJECT(data), visu_node_array_signals[MATERIAL_CHANGED_SIGNAL], 0, NULL); DBG_fprintf(stderr, "Visu NodeArray: emittion node material done.\n"); } static void onElementRenderingChanged(VisuNodeArray *data, VisuElement *element) { DBG_fprintf(stderr, "Visu NodeArray: caught the 'ElementRenderingChanged' signal," " emitting node material signal.\n"); g_signal_emit(G_OBJECT(data), visu_node_array_signals[RENDERING_CHANGED_SIGNAL], 0, element, NULL); DBG_fprintf(stderr, "Visu NodeArray: emittion node material done.\n"); } /**************************/ /* The property routines. */ /**************************/ static void freeNodePropStruct(gpointer data) { VisuNodeProperty *prop; guint i, j; EleArr *ele; prop = (VisuNodeProperty*)data; DBG_fprintf(stderr, "Visu Node: freeing node property '%s'.\n", prop->name); g_free(prop->name); /* The pointer case. */ if (prop->data_pointer) { for (i = 0; i < prop->array->priv->elements->len; i++) { for (ele = _getEleArr(prop->array, i), j = 0; j < ele->nNodes; j++) if (prop->data_pointer[i][j]) { if (prop->freeTokenFunc) prop->freeTokenFunc(prop->data_pointer[i][j], prop->user_data); else g_free(prop->data_pointer[i][j]); } g_free(prop->data_pointer[i]); } g_free(prop->data_pointer); } /* The integer case */ if (prop->data_int) { for (i = 0; i < prop->array->priv->elements->len; i++) g_free(prop->data_int[i]); g_free(prop->data_int); } g_free(prop); DBG_fprintf(stderr, "Visu Node: freeing property ... OK.\n"); } /* Remove the property of all nodes of the element given in data. */ static void removeNodePropertyForElement(gpointer key, gpointer value, gpointer data) { gint iEle; guint j; EleArr *ele; VisuNodeProperty *prop; prop = (VisuNodeProperty*)value; iEle= GPOINTER_TO_INT(data); ele = _getEleArr(prop->array, iEle); DBG_fprintf(stderr, "Visu Node: remove node property '%s' for all nodes of element '%s'.\n", (gchar*)key, ele->ele->name); /* We first remove the property tokens. */ switch (prop->gtype) { case G_TYPE_POINTER: for (j = 0; j < ele->nNodes; j++) if (prop->data_pointer[iEle][j]) { if (prop->freeTokenFunc) prop->freeTokenFunc(prop->data_pointer[iEle][j], prop->user_data); else g_free(prop->data_pointer[iEle][j]); prop->data_pointer[iEle][j] = (gpointer)0; } break; case G_TYPE_INT: for (j = 0; j < ele->nNodes; j++) prop->data_int[iEle][j] = 0; break; default: g_warning("Unsupported GValue type for property '%s'.", prop->name); } } /* Remove the property of the node given in data and move the last property of this element at the place of the removed node. */ static void removeNodeProperty(gpointer key, gpointer value, gpointer data) { EleArr *ele; VisuNode *node; VisuNodeProperty *prop; node = (VisuNode*)data; prop = (VisuNodeProperty*)value; ele = _getEleArr(prop->array, node->posElement); g_return_if_fail(ele->nStoredNodes > 0); DBG_fprintf(stderr, "Visu Node: remove node property '%s' from %d %d.\n", (gchar*)key, node->posElement, node->posNode); /* We first remove the property token. */ switch (prop->gtype) { case G_TYPE_POINTER: if (prop->data_pointer[node->posElement][node->posNode]) { if (prop->freeTokenFunc) prop->freeTokenFunc(prop->data_pointer[node->posElement][node->posNode], prop->user_data); else g_free(prop->data_pointer[node->posElement][node->posNode]); } break; case G_TYPE_INT: prop->data_int[node->posElement][node->posNode] = 0; break; default: g_warning("Unsupported GValue type for property '%s'.", prop->name); } /* Then we copy the pointer from the last position to the given one. The last position is given by nStoredNodesPerEle since this counter has already been lowered. */ switch (prop->gtype) { case G_TYPE_POINTER: prop->data_pointer[node->posElement][node->posNode] = prop->data_pointer[node->posElement][ele->nStoredNodes]; prop->data_pointer[node->posElement][ele->nStoredNodes] = (gpointer)0; break; case G_TYPE_INT: prop->data_int[node->posElement][node->posNode] = prop->data_int[node->posElement][ele->nStoredNodes]; prop->data_int[node->posElement][ele->nStoredNodes] = 0; break; default: g_warning("Unsupported GValue type for property '%s'.", prop->name); } } static void reallocNodeProperty(gpointer key, gpointer value, gpointer data) { EleArr *ele; VisuNodeProperty *prop; guint iEle, j; iEle = (guint)GPOINTER_TO_INT(data); prop = (VisuNodeProperty*)value; DBG_fprintf(stderr, "Visu Node: realloc node property '%s' for element %d.\n", (gchar*)key, iEle); g_return_if_fail(iEle < prop->array->priv->elements->len); ele = _getEleArr(prop->array, iEle); switch (prop->gtype) { case G_TYPE_POINTER: prop->data_pointer[iEle] = g_realloc(prop->data_pointer[iEle], sizeof(gpointer) * ele->nNodes); /* We nullify the newly created properties. */ for (j = ele->nStoredNodes; j < ele->nNodes; j++) prop->data_pointer[iEle][j] = (gpointer)0; break; case G_TYPE_INT: prop->data_int[iEle] = g_realloc(prop->data_int[iEle], sizeof(int) * ele->nNodes); /* We nullify the newly created properties. */ for (j = ele->nStoredNodes; j < ele->nNodes; j++) prop->data_int[iEle][j] = 0; break; default: g_warning("Unsupported GValue type for property '%s'.", prop->name); } } static void allocateNodeProp(gpointer key, gpointer value, gpointer data _U_) { guint i; VisuNodeProperty *prop; prop = (VisuNodeProperty*)value; DBG_fprintf(stderr, "Visu Node: realloc node property '%s' for 1 new element.\n", (gchar*)key); switch (prop->gtype) { case G_TYPE_POINTER: prop->data_pointer = g_realloc(prop->data_pointer, sizeof(gpointer*) * prop->array->priv->elements->len); i = prop->array->priv->elements->len - 1; prop->data_pointer[i] = g_malloc0(sizeof(gpointer) * _getEleArr(prop->array, i)->nNodes); break; case G_TYPE_INT: prop->data_int = g_realloc(prop->data_int, sizeof(int*) * prop->array->priv->elements->len); i = prop->array->priv->elements->len - 1; prop->data_int[i] = g_malloc0(sizeof(int) * _getEleArr(prop->array, i)->nNodes); break; default: g_warning("Unsupported GValue type for property '%s'.", prop->name); } } static void createNodeproperty(gpointer key, gpointer value, gpointer data) { VisuNodeProperty *prop; struct twoNodes *nodes; prop = (VisuNodeProperty*)value; nodes = (struct twoNodes*)data; DBG_fprintf(stderr, "Visu Node: create/copy node property '%s' for node %d-%d.\n", (gchar*)key, nodes->newNode->posElement, nodes->newNode->posNode); switch (prop->gtype) { case G_TYPE_POINTER: if (nodes->oldNode) prop->data_pointer[nodes->newNode->posElement][nodes->newNode->posNode] = prop->newOrCopyTokenFunc((gconstpointer)prop->data_pointer[nodes->oldNode->posElement][nodes->oldNode->posNode], prop->user_data); else prop->data_pointer[nodes->newNode->posElement][nodes->newNode->posNode] = prop->newOrCopyTokenFunc((gconstpointer)0, prop->user_data); break; case G_TYPE_INT: if (nodes->oldNode) prop->data_int[nodes->newNode->posElement][nodes->newNode->posNode] = prop->data_int[nodes->oldNode->posElement][nodes->oldNode->posNode]; else prop->data_int[nodes->newNode->posElement][nodes->newNode->posNode] = 0; break; default: g_warning("Unsupported GValue type for property '%s'.", prop->name); } } /*****************************/ /* Public property routines. */ /*****************************/ /** * visu_node_property_setValue: * @nodeProp: a #VisuNodeProperty object ; * @node: a #VisuNode object ; * @value: A GValue pointer this the value to be stored. * * This method is used to store some values associated with * the given @node of the given @nodeArray. These values can be pointers to * anything allocated (will be free automatically when the property is deleted) or * they can be static values. This depends on the construction of the node property. * These values can be retrieved with the visu_node_property_getValue() method. * * See visu_node_array_getProperty() to get a property by its name. */ void visu_node_property_setValue(VisuNodeProperty* nodeProp, VisuNode* node, GValue *value) { g_return_if_fail(nodeProp && value && nodeProp->gtype == G_VALUE_TYPE(value)); g_return_if_fail(node && node->posElement < nodeProp->array->priv->elements->len && node->posNode < _getEleArr(nodeProp->array, node->posElement)->nStoredNodes); switch (nodeProp->gtype) { case G_TYPE_POINTER: /* We free previous pointer. */ if (nodeProp->freeTokenFunc) nodeProp->freeTokenFunc(nodeProp->data_pointer[node->posElement][node->posNode], nodeProp->user_data); else g_free(nodeProp->data_pointer[node->posElement][node->posNode]); /* We set the value. */ nodeProp->data_pointer[node->posElement][node->posNode] = g_value_get_pointer(value); break; case G_TYPE_INT: nodeProp->data_int[node->posElement][node->posNode] = g_value_get_int(value); break; default: g_warning("Unsupported GValue type for property '%s'.", nodeProp->name); } } /** * visu_node_property_getValue: * @nodeProp: a #VisuNodeArray object ; * @node: a #VisuNode object ; * @value: an initialise GValue location. * * This method is used to retrieve some data associated to * the specified @node, stored in the given @data. These return data * should not be freed after used. The read value is stored in the given * GValue pointer. This GValue must be of the right type, depending on the * creation of the #VisuNodeProperty. * * Returns: some data associated to the key, stored the given GValue location. */ GValue* visu_node_property_getValue(VisuNodeProperty* nodeProp, VisuNode* node, GValue *value) { g_return_val_if_fail(nodeProp && value && nodeProp->gtype == G_VALUE_TYPE(value), value); g_return_val_if_fail(node && node->posElement < nodeProp->array->priv->elements->len && node->posNode < _getEleArr(nodeProp->array, node->posElement)->nStoredNodes, value); switch (nodeProp->gtype) { case G_TYPE_POINTER: DBG_fprintf(stderr, "Visu Node: get '%s' for node %d(%d,%d) as pointer %p.\n", nodeProp->name, node->number, node->posElement, node->posNode, (gpointer)nodeProp->data_pointer[node->posElement][node->posNode]); g_value_set_pointer(value, nodeProp->data_pointer[node->posElement][node->posNode]); return value; case G_TYPE_INT: DBG_fprintf(stderr, "Visu Node: get property '%s' for node %d as integer %d.\n", nodeProp->name, node->number, nodeProp->data_int[node->posElement][node->posNode]); g_value_set_int(value, nodeProp->data_int[node->posElement][node->posNode]); return value; break; default: g_warning("Unsupported GValue type for property '%s'.", nodeProp->name); } return value; } /** * visu_node_array_getProperty: * @nodeArray: a #VisuNodeArray object ; * @key: a string. * * This method is used to retrieve the node property associated to the given @key. * * Returns: (transfer none): a #VisuNodeProperty. */ VisuNodeProperty* visu_node_array_getProperty(VisuNodeArray* nodeArray, const char* key) { VisuNodeProperty *prop; g_return_val_if_fail(nodeArray && key, (VisuNodeProperty*)0); prop = (VisuNodeProperty*)g_hash_table_lookup(nodeArray->priv->nodeProp, (gpointer)key); return prop; } /** * visu_node_array_freeProperty: * @nodeArray: a #VisuNodeArray object. * @key: the name of the property to be removed. * * This method free the given property and all associated data. */ void visu_node_array_freeProperty(VisuNodeArray* nodeArray, const char* key) { g_return_if_fail(nodeArray && key); g_hash_table_remove(nodeArray->priv->nodeProp, key); DBG_fprintf(stderr, "Visu Node: removing the property called '%s'.\n", key); } /** * visu_node_array_property_newPointer: * @nodeArray: a #VisuNodeArray object ; * @key: a string ; * @freeFunc: (allow-none) (scope call): a method to free each token (can be NULL). * @newAndCopyFunc: (scope call): a method to create or copy each token. * @user_data: (closure): a user defined pointer that will be given to * the free and copy routine. * * This method creates and allocates a new area to store nodes associated data that * can be retrieve with the @key. These data are pointers on allocated memory * locations. When the property is removed with the #visu_node_freePropertry (or the * associated #VisuNodeArray is free) the area is free and @freeFunc is called for * each token (or g_free() if @freeFunc is NULL). * * The method @newAndCopyFunc is used when the number of nodes is increased, * if the const gpointer of the GCopyFunc is not NULL, then we require a copy, * if it is NULL, then the routine must create a new token with * default values. * * If the property already exists, it is returned. * * Returns: (transfer none): the newly created #VisuNodeProperty * object or the existing one. */ VisuNodeProperty* visu_node_array_property_newPointer(VisuNodeArray* nodeArray, const char* key, GFunc freeFunc, GCopyFunc newAndCopyFunc, gpointer user_data) { VisuNodeProperty *prop; EleArr *ele; guint i; g_return_val_if_fail(nodeArray && key && newAndCopyFunc, (VisuNodeProperty*)0); prop = (VisuNodeProperty*)g_hash_table_lookup(nodeArray->priv->nodeProp, key); if (prop) return prop; DBG_fprintf(stderr, "Visu Node: adding a new pointer" " property, called '%s'.\n", key); prop = g_malloc(sizeof(VisuNodeProperty)); prop->gtype = G_TYPE_POINTER; prop->name = g_strdup(key); prop->array = nodeArray; prop->data_pointer = (gpointer**)0; prop->data_int = (int**)0; if (nodeArray->priv->elements->len > 0) prop->data_pointer = g_malloc(sizeof(gpointer*) * nodeArray->priv->elements->len); for (i = 0; i < nodeArray->priv->elements->len; i++) { ele = _getEleArr(nodeArray, i); DBG_fprintf(stderr, " | allocate (%d,%d)\n", i, ele->nNodes); prop->data_pointer[i] = g_malloc0(sizeof(gpointer) * ele->nNodes); } prop->freeTokenFunc = freeFunc; prop->newOrCopyTokenFunc = newAndCopyFunc; prop->user_data = user_data; g_hash_table_insert(nodeArray->priv->nodeProp, (gpointer)key, (gpointer)prop); return prop; } /** * visu_node_array_property_newInteger: * @nodeArray: a #VisuNodeArray object ; * @key: a string. * * This method creates and allocates a new area to store nodes associated integer * values. This is the same than visu_node_array_property_newPointer() but for static * integers instead of pointers as data. * * Returns: (transfer none): the newly created #VisuNodeProperty object. */ VisuNodeProperty* visu_node_array_property_newInteger(VisuNodeArray* nodeArray, const char* key) { VisuNodeProperty *prop; EleArr *ele; guint i; g_return_val_if_fail(nodeArray && key, (VisuNodeProperty*)0); prop = (VisuNodeProperty*)g_hash_table_lookup(nodeArray->priv->nodeProp, key); g_return_val_if_fail(!prop, (VisuNodeProperty*)0); DBG_fprintf(stderr, "Visu Node: adding a new int property, called '%s'.\n", key); prop = g_malloc(sizeof(VisuNodeProperty)); prop->gtype = G_TYPE_INT; prop->name = g_strdup(key); prop->array = nodeArray; prop->data_pointer = (gpointer**)0; prop->data_int = (int**)0; if (nodeArray->priv->elements->len > 0) prop->data_int = g_malloc(sizeof(int*) * nodeArray->priv->elements->len); for (i = 0; i < nodeArray->priv->elements->len; i++) { ele = _getEleArr(nodeArray, i); DBG_fprintf(stderr, " | allocate (%d,%d)\n", i, ele->nNodes); prop->data_int[i] = g_malloc0(sizeof(int) * ele->nNodes); } prop->freeTokenFunc = (GFunc)0; prop->newOrCopyTokenFunc = (GCopyFunc)0; prop->user_data = (gpointer)0; g_hash_table_insert(nodeArray->priv->nodeProp, (gpointer)key, (gpointer)prop); return prop; } /** * visu_node_array_traceProperty: * @array: a #VisuNodeArray object ; * @id: a property name. * * This is a debug method. It outputs on stderr the values for all * nodes of the property @id. */ void visu_node_array_traceProperty(VisuNodeArray *array, const gchar *id) { VisuNodeProperty* prop; EleArr *ele; guint i, j; prop = visu_node_array_getProperty(array, id); fprintf(stderr, "Visu Node: output node property '%s'.\n", id); fprintf(stderr, " | type= %d\n", (int)prop->gtype); if (prop->data_int) { for (i = 0; i < prop->array->priv->elements->len; i++) for (ele = _getEleArr(array, i), j = 0; j < ele->nStoredNodes; j++) fprintf(stderr, " | %7d %3d %7d -> %d\n", ele->nodes[j].number, i, j, prop->data_int[i][j]); } if (prop->data_pointer) { for (i = 0; i < prop->array->priv->elements->len; i++) for (ele = _getEleArr(array, i), j = 0; j < ele->nStoredNodes; j++) fprintf(stderr, " | %7d %3d %7d -> %p\n", ele->nodes[j].number, i, j, prop->data_pointer[i][j]); } } /**********************/ /* Element properties */ /**********************/ static void allocateEleProp(gpointer key, gpointer value, gpointer data) { struct _ElementProperty *prop = (struct _ElementProperty*)value; VisuElement *ele = VISU_ELEMENT(data); GValue val; DBG_fprintf(stderr, "Visu Data: allocate element property '%s'.\n", (gchar*)key); memset(&val, '\0', sizeof(GValue)); prop->init(ele, &val); g_value_array_append(prop->array, &val); DBG_fprintf(stderr, " | now has %d elements.\n", prop->array->n_values); } /* static void freeEleProp(gpointer key, gpointer value, gpointer data _U_) */ /* { */ /* struct _ElementProperty *prop = (struct _ElementProperty*)value; */ /* gint i; */ /* DBG_fprintf(stderr, "Visu Data: free element property '%s'.\n", (gchar*)key); */ /* for (i = prop->array->priv->n_values - 1; i >= 0; i--) */ /* g_value_array_remove(prop->array, i); */ /* } */ static void freeElePropStruct(gpointer data) { struct _ElementProperty *prop = (struct _ElementProperty*)data; g_value_array_free(prop->array); g_free(data); } /** * visu_node_array_setElementProperty: * @data: a #VisuNodeArray object. * @name: a string to identify the property. * @init: (scope call): an init routine. * * Create a new array to stores properties related to elements. If the * property @name already exists the previous one is destroyed. The * @init routine is called for each #VisuElement of the @data. * * Since: 3.7 * * Returns: (transfer none): a newly allocated array. **/ GValueArray* visu_node_array_setElementProperty(VisuNodeArray *data, const gchar *name, VisuNodeArrayElementPropertyInit init) { struct _ElementProperty *prop; guint i; GValue val; g_return_val_if_fail(VISU_IS_NODE_ARRAY(data), (GValueArray*)0); g_return_val_if_fail(name && name[0] && init, (GValueArray*)0); DBG_fprintf(stderr, "Visu Data: add a new element property '%s'.\n", name); prop = g_malloc(sizeof(struct _ElementProperty)); prop->init = init; prop->array = g_value_array_new(data->priv->elements->len); g_hash_table_insert(data->priv->eleProp, (gpointer)name, (gpointer)prop); for (i = 0; i < data->priv->elements->len; i++) { memset(&val, '\0', sizeof(GValue)); init(_getElement(data, i), &val); g_value_array_insert(prop->array, i, &val); } return prop->array; } /** * visu_node_array_getElementProperty: * @data: a #VisuNodeArray object ; * @name: an identifier string. * * This routine is used to retrieve an array of #GValue for each * element of the @data array. * * Since: 3.7 * * Returns: (transfer none): an array of #GValue, indexed by the id of * each #VisuElement of @data. */ GValueArray* visu_node_array_getElementProperty(VisuNodeArray *data, const gchar *name) { struct _ElementProperty *prop; g_return_val_if_fail(VISU_IS_NODE_ARRAY(data), (GValueArray*)0); DBG_fprintf(stderr, "Visu Data: get element property '%s'.\n", name); prop = (struct _ElementProperty*)g_hash_table_lookup(data->priv->eleProp, name); return prop->array; } /****************/ /* The iterator */ /****************/ /** * visu_node_array_iterNew: * @array: a #VisuNodeArray object ; * @iter: (out caller-allocates) (transfer full): an alocated iterator. * * Set values to a #VisuNodeArrayIter object to iterate over nodes. * Its contain is initialised with the array size (number of elements, * number of nodes per element...). */ void visu_node_array_iterNew(VisuNodeArray *array, VisuNodeArrayIter *iter) { g_return_if_fail(iter); iter->nAllStoredNodes = 0; iter->nElements = 0; iter->nStoredNodes = 0; iter->node = (VisuNode*)0; iter->element = (VisuElement*)0; iter->type = ITER_NODES_BY_TYPE; iter->init = FALSE; g_return_if_fail(VISU_IS_NODE_ARRAY(array)); iter->array = array; iter->idMax = array->priv->nodeTable.idCounter - 1; iter->nAllStoredNodes = array->priv->nodeTable.nStoredNodes; iter->nElements = array->priv->elements->len; iter->iElement = -1; iter->lst = (GList*)0; iter->itLst = (GList*)0; g_return_if_fail(array->priv->nodeTable.idCounter >= array->priv->nodeTable.nStoredNodes); } /** * visu_node_array_iterStart: * @array: a #VisuNodeArray object ; * @iter: a #VisuNodeArrayIter object. * * Initialise the node and element internal pointers for a run over the nodes. */ void visu_node_array_iterStart(VisuNodeArray *array, VisuNodeArrayIter *iter) { EleArr *ele; g_return_if_fail(VISU_IS_NODE_ARRAY(array) && iter && array == iter->array); iter->init = TRUE; iter->iElement = -1; iter->node = (VisuNode*)0; iter->element = (VisuElement*)0; if (array->priv->elements->len == 0) return; ele = _getEleArr(array, 0); iter->iElement = 0; iter->element = ele->ele; /* We look for an element with stored nodes. */ while (ele->nStoredNodes == 0) { iter->iElement += 1; if (iter->iElement >= array->priv->elements->len) { /* We found nothing. */ iter->iElement = -1; iter->element = (VisuElement*)0; return; } ele = _getEleArr(array, iter->iElement); iter->element = ele->ele; iter->nStoredNodes = ele->nStoredNodes; } iter->node = ele->nodes; iter->nStoredNodes = ele->nStoredNodes; } /** * visu_node_array_iterStartNumber: * @array: a #VisuNodeArray object ; * @iter: a #VisuNodeArrayIter object. * * Initialise the node and element internal pointers for a run * following the node oder. */ void visu_node_array_iterStartNumber(VisuNodeArray *array, VisuNodeArrayIter *iter) { guint i; g_return_if_fail(VISU_IS_NODE_ARRAY(array) && iter && array == iter->array); g_return_if_fail(iter->lst == (GList*)0); iter->init = TRUE; iter->iElement = -1; iter->node = (VisuNode*)0; iter->element = (VisuElement*)0; if (array->priv->elements->len == 0) return; i = 0; iter->node = (VisuNode*)0; do { iter->node = visu_node_array_getFromId(VISU_NODE_ARRAY(array), i); i += 1; } while (!iter->node && i < array->priv->nodeTable.idCounter); if (!iter->node) return; iter->iElement = iter->node->posElement; iter->element = _getElement(array, iter->iElement); iter->nStoredNodes = _getEleArr(array, iter->iElement)->nStoredNodes; } /** * visu_node_array_iterStartVisible: * @array: a #VisuNodeArray object ; * @iter: a #VisuNodeArrayIter object. * * Initialise the node and element internal pointers for a run over the * visible nodes (see visu_node_array_iterNextVisible). */ void visu_node_array_iterStartVisible(VisuNodeArray *array, VisuNodeArrayIter *iter) { g_return_if_fail(iter->lst == (GList*)0); visu_node_array_iterStart(array, iter); if (iter->node && iter->node->rendered && iter->element->rendered) /* Ok, first is good. */ return; /* First was not visible, we go next. */ visu_node_array_iterNextVisible(array, iter); } /** * visu_node_array_iterStartList: * @array: a #VisuNodeArray object ; * @iter: (out caller-allocates) (transfer full): an alocated * iterator. * @lst: (element-type guint) (transfer full): a list of node ids to * iterate on. * * Set values to a #VisuNodeArrayIter object to iterate over nodes of * the given list. * * Since: 3.7 */ void visu_node_array_iterStartList(VisuNodeArray *array, VisuNodeArrayIter *iter, GList *lst) { GList init; g_return_if_fail(iter); iter->init = TRUE; iter->lst = lst; init.next = lst; iter->itLst = &init; visu_node_array_iterNextList(array, iter); } /** * visu_node_array_iterRestartNode: * @array: a #VisuNodeArray object ; * @iter: a #VisuNodeArrayIter object. * * The element internal pointer must be associated. Then, it returns the * node pointer to the first node for this element. */ void visu_node_array_iterRestartNode(VisuNodeArray *array, VisuNodeArrayIter *iter) { gint iEle; EleArr *ele; g_return_if_fail(VISU_IS_NODE_ARRAY(array) && iter && array == iter->array); g_return_if_fail(iter->lst == (GList*)0); iEle = visu_node_array_getElementId(array, iter->element); g_return_if_fail(iEle >= 0); iter->init = TRUE; iter->iElement = (guint)iEle; ele = _getEleArr(array, iEle); iter->node = ele->nodes; iter->nStoredNodes = ele->nStoredNodes; } /** * visu_node_array_iterNext: * @array: a #VisuNodeArray object ; * @iter: a #VisuNodeArrayIter object. * * Modify node and element internal pointers to the next node, or NULL if * none remains. */ void visu_node_array_iterNext(VisuNodeArray *array, VisuNodeArrayIter *iter) { guint iNode; EleArr *ele; g_return_if_fail(VISU_IS_NODE_ARRAY(array) && iter && array == iter->array); g_return_if_fail(iter->init && iter->node && iter->iElement == iter->node->posElement); ele = _getEleArr(array, iter->iElement); iNode = iter->node->posNode + 1; if (iNode < ele->nStoredNodes) iter->node = ele->nodes + iNode; else { iter->iElement += 1; if (iter->iElement >= array->priv->elements->len) { iter->node = (VisuNode*)0; iter->iElement = -1; iter->element = (VisuElement*)0; iter->nStoredNodes = 0; } else { ele = _getEleArr(array, iter->iElement); iter->node = ele->nodes; iter->element = ele->ele; iter->nStoredNodes = ele->nStoredNodes; } } } /** * visu_node_array_iterNextList: * @array: a #VisuNodeArray object ; * @iter: a #VisuNodeArrayIter object. * * Modify node and element internal pointers to the next node from the * starting list, or NULL if none remains. * * Since: 3.7 */ void visu_node_array_iterNextList(VisuNodeArray *array, VisuNodeArrayIter *iter) { EleArr *ele; g_return_if_fail(VISU_IS_NODE_ARRAY(array) && iter && array == iter->array); g_return_if_fail(iter->init && iter->itLst); do { iter->itLst = g_list_next(iter->itLst); iter->node = (iter->itLst)?visu_node_array_getFromId(array, GPOINTER_TO_INT(iter->itLst->data)):(VisuNode*)0; } while (iter->itLst && !iter->node); if (!iter->itLst) { if (iter->lst) g_list_free(iter->lst); iter->lst = iter->itLst = (GList*)0; iter->node = (VisuNode*)0; } /* We set additional elements. */ if (!iter->node) { iter->iElement = -1; iter->element = (VisuElement*)0; iter->nStoredNodes = 0; } else { ele = _getEleArr(array, iter->node->posElement); iter->element = ele->ele; iter->nStoredNodes = ele->nStoredNodes; } } /** * visu_node_array_iterNextVisible: * @array: a #VisuNodeArray object ; * @iter: a #VisuNodeArrayIter object. * * Go to the next rendered node (changing element if required). */ void visu_node_array_iterNextVisible(VisuNodeArray *array, VisuNodeArrayIter *iter) { g_return_if_fail(VISU_IS_NODE_ARRAY(array) && iter && array == iter->array); /* Get the next node, and test if it is rendered. */ visu_node_array_iterNext(array, iter); if (!iter->node || (iter->element->rendered && iter->node->rendered)) return; /* From the current node, we go next to find one that is rendred. */ for (; iter->element; visu_node_array_iterNextElement(array, iter)) if (iter->element->rendered) for (; iter->node; visu_node_array_iterNextNode(array, iter)) if (iter->node->rendered) return; } /** * visu_node_array_iterNextNode: * @array: a #VisuNodeArray object ; * @iter: a #VisuNodeArrayIter object. * * Modify node internal pointer to the next node, or NULL if * none remains. Contrary to visu_node_array_iterNext() it does not go to the * next element if one exists. */ void visu_node_array_iterNextNode(VisuNodeArray *array, VisuNodeArrayIter *iter) { EleArr *ele; g_return_if_fail(VISU_IS_NODE_ARRAY(array) && iter && array == iter->array); g_return_if_fail(iter->init && iter->node); ele = _getEleArr(array, iter->node->posElement); if (iter->node->posNode + 1 < ele->nStoredNodes) iter->node = iter->node + 1; else iter->node = (VisuNode*)0; } /** * visu_node_array_iterNextNodeOriginal: * @array: a #VisuNodeArray object ; * @iter: a #VisuNodeArrayIter object. * * Modify node internal pointer to the next original node, or NULL if * none remains. Contrary to visu_node_array_iterNext() it does not go to the * next element if one exists. * * Since: 3.6 */ void visu_node_array_iterNextNodeOriginal(VisuNodeArray *array, VisuNodeArrayIter *iter) { EleArr *ele; g_return_if_fail(VISU_IS_NODE_ARRAY(array) && iter && array == iter->array); g_return_if_fail(iter->init && iter->node); do { ele = _getEleArr(array, iter->node->posElement); if (iter->node->posNode + 1 < ele->nStoredNodes) iter->node = iter->node + 1; else iter->node = (VisuNode*)0; } while (iter->node && visu_node_array_getOriginal(array, iter->node->number) >= 0); } /** * visu_node_array_iterNextNodeNumber: * @array: a #VisuNodeArray object ; * @iter: a #VisuNodeArrayIter object. * * Modify node internal pointer to the next node, increasing the id of * the current node. The element internal pointer is also updated * accordingly. If no more nodes exist after the given one, node and * element internal pointers are set to NULL. */ void visu_node_array_iterNextNodeNumber(VisuNodeArray *array, VisuNodeArrayIter *iter) { guint i; EleArr *ele; g_return_if_fail(VISU_IS_NODE_ARRAY(array) && iter && array == iter->array); g_return_if_fail(iter->init && iter->node); for (i = iter->node->number + 1; !(iter->node = visu_node_array_getFromId(VISU_NODE_ARRAY(array), i)) && (i < array->priv->nodeTable.idCounter) ; i++); if (iter->node) { ele = _getEleArr(array, iter->node->posElement); iter->iElement = iter->node->posElement; iter->element = ele->ele; iter->nStoredNodes = ele->nStoredNodes; } else { iter->element = (VisuElement*)0; iter->nStoredNodes = 0; } } /** * visu_node_array_iterNextElement: * @array: a #VisuNodeArray object ; * @iter: a #VisuNodeArrayIter object. * * Modify element internal pointer to the next element and set node * to the first one, or NULL if none remains. */ void visu_node_array_iterNextElement(VisuNodeArray *array, VisuNodeArrayIter *iter) { EleArr *ele; g_return_if_fail(VISU_IS_NODE_ARRAY(array) && iter && array == iter->array); g_return_if_fail(iter->init && iter->iElement < array->priv->elements->len); do iter->iElement += 1; while(iter->iElement < array->priv->elements->len && _getEleArr(array, iter->iElement)->nStoredNodes == 0); if (iter->iElement == array->priv->elements->len) { iter->iElement = -1; iter->node = (VisuNode*)0; iter->element = (VisuElement*)0; iter->nStoredNodes = 0; } else { ele = _getEleArr(array, iter->iElement); iter->node = ele->nodes; iter->element = ele->ele; iter->nStoredNodes = ele->nStoredNodes; } } /*************************************/ /* Additionnal routines for bindings */ /*************************************/ /** * visu_node_array_iter_next: * @iter: a #VisuNodeArrayIter object. * * Run the iterator to go to next item. * * Since: 3.6 * * Returns: TRUE if any item is found, FALSE otherwise. */ gboolean visu_node_array_iter_next(VisuNodeArrayIter *iter) { if (!iter->init) switch (iter->type) { case ITER_NODES_BY_TYPE: case ITER_ELEMENTS: visu_node_array_iterStart(iter->array, iter); break; case ITER_NODES_BY_NUMBER: case ITER_NODES_ORIGINAL: visu_node_array_iterStartNumber(iter->array, iter); break; case ITER_NODES_VISIBLE: visu_node_array_iterStartVisible(iter->array, iter); break; } else switch (iter->type) { case ITER_NODES_BY_TYPE: visu_node_array_iterNext(iter->array, iter); break; case ITER_NODES_BY_NUMBER: visu_node_array_iterNextNodeNumber(iter->array, iter); break; case ITER_NODES_VISIBLE: visu_node_array_iterNextVisible(iter->array, iter); break; case ITER_NODES_ORIGINAL: visu_node_array_iterNextNodeOriginal(iter->array, iter); break; case ITER_ELEMENTS: visu_node_array_iterNextElement(iter->array, iter); break; } if (iter->node) return TRUE; else return FALSE; } /** * visu_node_array_iter_next2: * @iter1: a #VisuNodeArrayIter object. * @iter2: a #VisuNodeArrayIter object. * * Iterator to run on a pair of different nodes. * * Returns: TRUE if any item is found, FALSE otherwise. * * Since: 3.6 */ gboolean visu_node_array_iter_next2(VisuNodeArrayIter *iter1, VisuNodeArrayIter *iter2) { if (!iter1->init) { visu_node_array_iterStart(iter1->array, iter1); visu_node_array_iterStart(iter1->array, iter2); } else { if (!iter1->node) return FALSE; /* DBG_fprintf(stderr, "go next %p-%p ->", (gpointer)iter1->node, (gpointer)iter2->node); */ visu_node_array_iterNext(iter1->array, iter2); if (!iter2->node || iter2->node->posElement > iter1->node->posElement || (iter2->node->posElement == iter1->node->posElement && iter2->node->posNode >= iter1->node->posNode)) { visu_node_array_iterNext(iter1->array, iter1); if (iter1->node) visu_node_array_iterStart(iter1->array, iter2); else iter2->node = (VisuNode*)0; } /* DBG_fprintf(stderr, " %p-%p\n", (gpointer)iter1->node, (gpointer)iter2->node); */ } if (!iter1->node && !iter2->node) return FALSE; else return TRUE; } v_sim-3.7.0/src/visu_nodes.h0000644000353400050620000003171412215546105012706 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef VISU_NODES_H #define VISU_NODES_H #include #include #include "visu_elements.h" G_BEGIN_DECLS typedef struct _VisuNode VisuNode; struct _VisuNode { /* coordinates of the node in cartesian coordinates. */ float xyz[3]; /* translation */ float translation[3]; /* Number of this element in the input file. */ guint number; /* Position in the #VisuData structure. */ guint posElement, posNode; /* A boolean to specify if this node is rendered or not. */ gboolean rendered; }; /** * VisuNodeProperty: * * This structure defines a storage for one property for each node of a given * #VisuNodeArray. Use visu_node_array_property_newPointer() or * visu_node_array_property_newInteger() to create one property. */ typedef struct _VisuNodeProperty VisuNodeProperty; /** * VisuNodeInfo: * @id: an id; * @dist: a float. * * Some data. * * Since: 3.5 */ typedef struct VisuNodeInfo_struct VisuNodeInfo; struct VisuNodeInfo_struct { guint id; float dist; }; GType visu_node_get_type(void); #define VISU_TYPE_NODE (visu_node_get_type()) void visu_node_newValues(VisuNode *node, float xyz[3]); void visu_node_copy(VisuNode *nodeTo, VisuNode *nodeFrom); gboolean visu_node_setVisibility(VisuNode* node, gboolean visibility); gboolean visu_node_getVisibility(VisuNode* node); gboolean visu_node_setCoordinates(VisuNode* node, float xyz[3]); /** * VISU_TYPE_NODE_ARRAY: * * return the type of #VisuNodeArray. */ #define VISU_TYPE_NODE_ARRAY (visu_node_array_get_type ()) /** * VISU_NODE_ARRAY: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuNodeArray type. */ #define VISU_NODE_ARRAY(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_NODE_ARRAY, VisuNodeArray)) /** * VISU_NODE_ARRAY_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuNodeArrayClass. */ #define VISU_NODE_ARRAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_NODE_ARRAY, VisuNodeArrayClass)) /** * VISU_IS_NODE_ARRAY: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuNodeArray object. */ #define VISU_IS_NODE_ARRAY(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_NODE_ARRAY)) /** * VISU_IS_NODE_ARRAY_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuNodeArrayClass class. */ #define VISU_IS_NODE_ARRAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_NODE_ARRAY)) /** * VISU_NODE_ARRAY_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. */ #define VISU_NODE_ARRAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_NODE_ARRAY, VisuNodeArrayClass)) typedef struct _VisuNodeArrayClass VisuNodeArrayClass; typedef struct _VisuNodeArray VisuNodeArray; typedef struct _VisuNodeArrayPrivate VisuNodeArrayPrivate; /** * visu_node_array_get_type: * * This method returns the type of #VisuNodeArray, use VISU_TYPE_NODE_ARRAY instead. * * Returns: the type of #VisuNodeArray. */ GType visu_node_array_get_type(void); /** * VisuNodeArrayElementPropertyInit: * @element: a #VisuElement object ; * @value: a #GValue. * * Prototype of routine used to initialise an element property. * * Since: 3.7 */ typedef void (*VisuNodeArrayElementPropertyInit)(VisuElement *element, GValue *value); /** * _VisuNodeArray: * @parent: parent. * @priv: private data. * * This structure describes a set of nodes of different #VisuElement types. * It is optimized for quick access, allocation and reallocation. */ struct _VisuNodeArray { GObject parent; VisuNodeArrayPrivate *priv; }; struct _VisuNodeArrayClass { GObjectClass parent; }; void visu_node_array_allocate(VisuNodeArray *array, GArray *elements, GArray *nNodes); void visu_node_array_allocateByNames(VisuNodeArray *array, GArray *nNodesPerElement, GArray *elementNames); void visu_node_array_freeNodes(VisuNodeArray *nodeArray); void visu_node_array_allocateNodesForElement(VisuNodeArray *array, guint eleId, guint nNodes); void visu_node_array_removeNodes(VisuNodeArray *nodeArray, int *nodeNumbers); void visu_node_array_removeNodesOfElement(VisuNodeArray *nodeArray, VisuElement *element); gboolean visu_node_array_removeAllDuplicateNodes(VisuNodeArray *nodeArray); gint visu_node_array_getOriginal(VisuNodeArray *nodeArray, guint nodeId); gboolean visu_node_array_setOriginal(VisuNodeArray *nodeArray, guint nodeId); gboolean visu_node_array_compareElements(VisuNodeArray *data1, VisuNodeArray *data2); VisuElement* visu_node_array_getElement(VisuNodeArray *data, VisuNode *node); gint visu_node_array_getElementId(VisuNodeArray *array, VisuElement *element); guint visu_node_array_getNNodes(VisuNodeArray *array); guint visu_node_array_getNElements(VisuNodeArray *array, gboolean physical); GValueArray* visu_node_array_setElementProperty(VisuNodeArray *data, const gchar *name, VisuNodeArrayElementPropertyInit init); GValueArray* visu_node_array_getElementProperty(VisuNodeArray *data, const gchar *name); float visu_node_array_getMaxElementSize(VisuNodeArray *nodes); VisuNode* visu_node_array_getNewNode(VisuNodeArray *nodeArray, guint iEle); gboolean visu_node_array_switchNumber(VisuNodeArray *nodeArray, guint from, guint to); VisuNode* visu_node_array_getCopyNode(VisuNodeArray *nodeArray, VisuNode *node); VisuNode* visu_node_array_getFromId(VisuNodeArray *array, guint number); gboolean visu_node_array_askForShowHide(VisuNodeArray *array); /*************************/ /* The property methods. */ /*************************/ VisuNodeProperty* visu_node_array_property_newPointer(VisuNodeArray* nodeArray, const char* key, GFunc freeFunc, GCopyFunc newAndCopyFunc, gpointer user_data); VisuNodeProperty* visu_node_array_property_newInteger(VisuNodeArray* nodeArray, const char* key); void visu_node_array_freeProperty(VisuNodeArray* nodeArray, const char* key); void visu_node_array_traceProperty(VisuNodeArray *array, const gchar *id); VisuNodeProperty* visu_node_array_getProperty(VisuNodeArray* nodeArray, const char* key); /** * visu_node_setpropertyValue: * @nodeArray: a #VisuNodeArray object ; * @node: a #VisuNode object ; * @key: a string ; * @value: A GValue pointer this the value to be stored. * * This method is used to store some values associated with * the given @node of the given @nodeArray. These values can be pointers to * anything allocated (will be free automatically when the property is deleted) or * they can be static values. This depends on the construction of the node property. * These values are described by the @key, and can be retrieved with the * visu_node_array_getPropertyValue() method. * * See visu_node_property_setValue() to directly set a value associated to a node. */ #define visu_node_setpropertyValue(nodeArray, node, key, value) \ visu_node_property_setValue(visu_node_array_getProperty(nodeArray, key), node, value) void visu_node_property_setValue(VisuNodeProperty* nodeProp, VisuNode* node, GValue *value); /** * visu_node_array_getPropertyValue: * @nodeArray: a #VisuNodeArray object ; * @node: a #VisuNode object ; * @key: a string ; * @value: an initialise GValue location. * * This method is used to retrieve some data associated to * the specified @node, stored in the given @data. These return data * should not be freed after used. The read value is stored in the given * GValue pointer. This GValue must be of the right type, depending on the * creation of the #VisuNodeProperty. * * Returns: some data associated to the key, stored the given GValue location. */ #define visu_node_array_getPropertyValue(nodeArray, node, key, value) \ visu_node_property_getValue(visu_node_array_getProperty(nodeArray, key), node, value) GValue* visu_node_property_getValue(VisuNodeProperty* nodeProp, VisuNode* node, GValue *value); /* Iterators. */ /** * VisuNodeArrayIterType: * @ITER_NODES_BY_TYPE: run on nodes, as V_Sim internal storage, * fastest. * @ITER_NODES_BY_NUMBER: run on nodes as entered in the input file. * @ITER_NODES_VISIBLE: run on visible nodes only (internal sort). * @ITER_NODES_ORIGINAL: run on original nodes only (internal sort). * @ITER_ELEMENTS: run on elements only. * * The kind of iterator to be used on #VisuData objects. * * Since: 3.6 */ typedef enum { ITER_NODES_BY_TYPE, ITER_NODES_BY_NUMBER, ITER_NODES_VISIBLE, ITER_NODES_ORIGINAL, ITER_ELEMENTS } VisuNodeArrayIterType; /** * VisuNodeArrayIter: * @array: a pointer the iterator is associated to ; * @idMax: current higher id used to identified nodes. * @nAllStoredNodes: the total number of stored nodes for the * associated #VisuData ; * @nElements: the number of #VisuElement for the associated #VisuData ; * @nStoredNodes: the number of stored nodes for the current @element ; * @iElement: the index corresponding to @element (or -1 if no set); * @node: a pointer on a current node ; * @element: a pointer on a current element. * @type: the kind of iterator, see #VisuNodeArrayIterType. * @init: an internal flag. * @lst: an internal list. * @itLst: an internal list iterator. * * This structure is an iterator over the nodes of a #VisuData object. * Create it with visu_node_array_iterNew(). Then the numbers are allocated and * correspond to the value of the #VisuData object. Use visu_node_array_iterStart() * to initialise the iterator for a run over the nodes, visu_node_array_iterNext() * to associate @node and @element to the next node, or NULL if there is no * more node to run over. */ typedef struct _VisuNodeArrayIter VisuNodeArrayIter; struct _VisuNodeArrayIter { VisuNodeArray *array; guint idMax; guint nAllStoredNodes; guint nElements; guint iElement; guint nStoredNodes; VisuNode *node; VisuElement *element; VisuNodeArrayIterType type; gboolean init; GList *lst, *itLst; }; void visu_node_array_iterNew(VisuNodeArray *array, VisuNodeArrayIter *iter); void visu_node_array_iterStart(VisuNodeArray *array, VisuNodeArrayIter *iter); void visu_node_array_iterStartVisible(VisuNodeArray *array, VisuNodeArrayIter *iter); void visu_node_array_iterStartNumber(VisuNodeArray *array, VisuNodeArrayIter *iter); void visu_node_array_iterStartList(VisuNodeArray *array, VisuNodeArrayIter *iter, GList *lst); void visu_node_array_iterRestartNode(VisuNodeArray *array, VisuNodeArrayIter *iter); void visu_node_array_iterNext(VisuNodeArray *array, VisuNodeArrayIter *iter); void visu_node_array_iterNextNode(VisuNodeArray *array, VisuNodeArrayIter *iter); void visu_node_array_iterNextNodeNumber(VisuNodeArray *array, VisuNodeArrayIter *iter); void visu_node_array_iterNextNodeOriginal(VisuNodeArray *array, VisuNodeArrayIter *iter); void visu_node_array_iterNextList(VisuNodeArray *array, VisuNodeArrayIter *iter); void visu_node_array_iterNextElement(VisuNodeArray *array, VisuNodeArrayIter *iter); void visu_node_array_iterNextVisible(VisuNodeArray *array, VisuNodeArrayIter *iter); gboolean visu_node_array_iter_next(VisuNodeArrayIter *iter); gboolean visu_node_array_iter_next2(VisuNodeArrayIter *iter1, VisuNodeArrayIter *iter2); G_END_DECLS #endif v_sim-3.7.0/src/visu_box.c0000644000353400050620000011175412216053245012363 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse mèl : BILLARD, non joignable par mèl ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "visu_box.h" #include #include "visu_tools.h" #include "iface_boxed.h" #include "coreTools/toolMatrix.h" /** * SECTION:visu_box * @short_description: Defines a bounding box. * * */ /** * VisuBox: * * Opaque structure to stores #VisuBox object. */ /** * VisuBoxClass: * @parent: private. * * Class structure of #VisuBox objects. */ /* Local methods. */ static gfloat _getBoxExtens(const VisuBox *box, gboolean withExt); static void _setUpGeometry(VisuBox *box, gboolean emit); static void _setUpMatrixFromCell(VisuBox *box); /** * VisuBoxPrivate: * * Opaque structure to store private attributes of #VisuBox objects. */ struct _VisuBoxPrivate { gboolean dispose_has_run; /* The unit for length. */ ToolUnits units; /* The periodicity. */ VisuBoxBoundaries bc; /* The extension of the box. */ float extension[3]; /* This is the geometry of the box. Array position 1 to 6 correspond to xx, xy, yy, zx, zy and zz. */ double cell[6]; /* The longest length in the box (with or without extension), and the margin to add. */ float extens[2], margin; /* Transformation matrices. */ /* This is the matrix that transform cartesian coordinates to coordinates in the box geometry. Use visu_data_convertXYZtoBoxCoordinates() to access this matrix. */ double fromXYZtoBox[3][3]; /* This is the matrix that transform box coordinates to cartesian coordinates. Use visu_data_convertBoxCoordinatestoXYZ() to access this matrix. */ double fromBoxtoXYZ[3][3]; /* This matrix is set up if the box was given in full [3][3] matrix and that cartesian coordinates need rotation before storing them. */ float fromFullToCell[3][3]; }; enum { SIZE_CHANGED_SIGNAL, UNIT_CHANGED_SIGNAL, BOUNDARY_CHANGED_SIGNAL, EXTENSION_CHANGED_SIGNAL, LAST_SIGNAL }; static guint visu_box_signals[LAST_SIGNAL] = { 0 }; static void visu_box_dispose (GObject* obj); static void visu_box_finalize (GObject* obj); static void visu_boxed_interface_init(VisuBoxedInterface *iface); G_DEFINE_TYPE_WITH_CODE(VisuBox, visu_box, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE(VISU_TYPE_BOXED, visu_boxed_interface_init)) static VisuBox* _getBox(VisuBoxed *self); static void visu_box_class_init(VisuBoxClass *klass) { DBG_fprintf(stderr, "Visu Box: creating the class of the object.\n"); DBG_fprintf(stderr, " - adding new signals ;\n"); /** * VisuBox::SizeChanged: * @box: the object which received the signal ; * @extens: the new longuest distance in the box taking into account * the extension. * * Gets emitted when the box size is changed (because of box * duplication for instance). * * Since: 3.7 */ visu_box_signals[SIZE_CHANGED_SIGNAL] = g_signal_new("SizeChanged", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__FLOAT, G_TYPE_NONE, 1, G_TYPE_FLOAT, NULL); /** * VisuBox::UnitChanged: * @box: the object which received the signal ; * @factor: the factor that has been applied. * * Gets emitted when the units are changed. * * Since: 3.7 */ visu_box_signals[UNIT_CHANGED_SIGNAL] = g_signal_new("UnitChanged", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__FLOAT, G_TYPE_NONE, 1, G_TYPE_FLOAT, NULL); /** * VisuBox::BoundaryChanged: * @box: the object which received the signal ; * * Gets emitted when the boundary conditions are changed. * * Since: 3.7 */ visu_box_signals[BOUNDARY_CHANGED_SIGNAL] = g_signal_new("BoundaryChanged", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, NULL); /** * VisuBox::ExtensionChanged: * @box: the object which received the signal ; * * Gets emitted when the extension of the box is changed. The new * size of the box is not yet computed, listen to * VisuBox::SizeChanged instead. * * Since: 3.7 */ visu_box_signals[EXTENSION_CHANGED_SIGNAL] = g_signal_new("ExtensionChanged", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, NULL); /* Connect the overloading methods. */ G_OBJECT_CLASS(klass)->dispose = visu_box_dispose; G_OBJECT_CLASS(klass)->finalize = visu_box_finalize; g_type_class_add_private(klass, sizeof(VisuBoxPrivate)); } static void visu_boxed_interface_init(VisuBoxedInterface *iface) { iface->get_box = _getBox; } static void visu_box_init(VisuBox *box) { guint i; DBG_fprintf(stderr, "Visu Box: initializing a new object (%p).\n", (gpointer)box); box->priv = G_TYPE_INSTANCE_GET_PRIVATE(box, VISU_TYPE_BOX, VisuBoxPrivate); box->priv->dispose_has_run = FALSE; for (i = 0; i < 3; i++) box->priv->extension[i] = 0.; for (i = 0; i < 6; i++) box->priv->cell[i] = G_MAXFLOAT; box->priv->bc = VISU_BOX_FREE; box->priv->extens[0] = G_MAXFLOAT; box->priv->extens[1] = G_MAXFLOAT; box->priv->margin = G_MAXFLOAT; box->priv->fromFullToCell[0][0] = G_MAXFLOAT; box->priv->units = TOOL_UNITS_UNDEFINED; } /* This method can be called several times. It should unref all of its reference to GObjects. */ static void visu_box_dispose(GObject* obj) { VisuBox *box; DBG_fprintf(stderr, "Visu Box: dispose object %p.\n", (gpointer)obj); box = VISU_BOX(obj); if (box->priv->dispose_has_run) return; box->priv->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS(visu_box_parent_class)->dispose(obj); } /* This method is called once only. */ static void visu_box_finalize(GObject* obj) { /* VisuBoxPrivate *box; */ g_return_if_fail(obj); DBG_fprintf(stderr, "Visu Box: finalize object %p.\n", (gpointer)obj); /* box = VISU_BOX(obj)->priv; */ /* Chain up to the parent class */ DBG_fprintf(stderr, "Visu Box: chain to parent.\n"); G_OBJECT_CLASS(visu_box_parent_class)->finalize(obj); DBG_fprintf(stderr, "Visu Box: freeing ... OK.\n"); } /** * visu_box_new: * @geometry: (array fixed-size=6): a cell definition. * @bc: a boundary condition. * * A #VisuBox object store the definition of a cell. * * Since: 3.7 * * Returns: (transfer full): create a new #VisuBox object. **/ VisuBox* visu_box_new(double geometry[VISU_BOX_N_VECTORS], VisuBoxBoundaries bc) { VisuBox *box; DBG_fprintf(stderr, "Visu Box: create a new VisuBox object of type %d.\n", (int)VISU_TYPE_BOX); box = VISU_BOX(g_object_new(VISU_TYPE_BOX, NULL)); visu_box_setBoundary(box, bc); visu_box_setGeometry(box, geometry); return box; } /** * visu_box_new_full: * @full: (array fixed-size=9): a cell definition (full matrix). * @bc: a boundary condition. * * A #VisuBox object store the definition of a cell. * * Since: 3.7 * * Returns: (transfer full): create a new #VisuBox object. **/ VisuBox* visu_box_new_full(double full[3][3], VisuBoxBoundaries bc) { VisuBox *box; DBG_fprintf(stderr, "Visu Box: create a new VisuBox object of type %d.\n", (int)VISU_TYPE_BOX); box = VISU_BOX(g_object_new(VISU_TYPE_BOX, NULL)); visu_box_setBoundary(box, bc); if (!visu_box_setGeometryFull(box, full)) g_warning("The basis is not 3D."); return box; } /** * visu_box_setBoundary: * @box: a #VisuBox object. * @bc: a boundary condition. * * Set up the boundary conditions of @box. * * Since: 3.7 * * Returns: TRUE if the boundary conditions of @box are changed. **/ gboolean visu_box_setBoundary(VisuBox *box, VisuBoxBoundaries bc) { g_return_val_if_fail(VISU_IS_BOX(box), FALSE); DBG_fprintf(stderr, "Visu Box: setting bounding box.\n"); if (box->priv->bc == bc) return FALSE; box->priv->bc = bc; DBG_fprintf(stderr, "Visu Box: emit 'BoundaryChanged'.\n"); g_signal_emit(box, visu_box_signals[BOUNDARY_CHANGED_SIGNAL], 0, NULL); DBG_fprintf(stderr, "Visu Box: emission done (BoundaryChanged).\n"); return TRUE; } /** * visu_box_getBoundary: * @box: a #VisuBox object. * * Get the boundary conditions defined for @box. * * Since: 3.7 * * Returns: a #VisuBoxBoundaries flag. */ VisuBoxBoundaries visu_box_getBoundary(VisuBox *box) { g_return_val_if_fail(VISU_IS_BOX(box), VISU_BOX_FREE); return box->priv->bc; } /** * visu_box_getPeriodicity: * @box: a #VisuBox object. * @per: (out caller-allocates) (array fixed-size=3): a location to * store three periodicties. * * Get for each {x, y, z} directions if the @box is periodic. * * Since: 3.7 */ void visu_box_getPeriodicity(VisuBox *box, gboolean per[3]) { g_return_if_fail(VISU_IS_BOX(box)); per[0] = !(box->priv->bc == VISU_BOX_FREE || box->priv->bc == VISU_BOX_SURFACE_YZ); per[1] = !(box->priv->bc == VISU_BOX_FREE || box->priv->bc == VISU_BOX_SURFACE_ZX); per[2] = !(box->priv->bc == VISU_BOX_FREE || box->priv->bc == VISU_BOX_SURFACE_XY); } /** * visu_box_setGeometryFull: * @box: a #VisuBox object. * @full: a matrix defining a basis-set. * * As visu_box_setGeometry(), but using a full matrix. * * Since: 3.7 * * Returns: TRUE if the geometry is valid and changed. **/ gboolean visu_box_setGeometryFull(VisuBox *box, double full[3][3]) { double geometry[VISU_BOX_N_VECTORS]; if (tool_matrix_reducePrimitiveVectors(geometry, full)) { tool_matrix_getRotationFromFull(box->priv->fromFullToCell, full, geometry); visu_box_setGeometry(box, geometry); return TRUE; } return FALSE; } /** * visu_box_setGeometry: * @box: a #VisuBox object ; * @geometry: (in) (array fixed-size=6):a 6 floating point array ; * * This methods set the size of the box. * * Returns: TRUE if the geometry is indeed changed. * * Since: 3.7 */ gboolean visu_box_setGeometry(VisuBox *box, double geometry[VISU_BOX_N_VECTORS]) { int i; g_return_val_if_fail(VISU_IS_BOX(box), FALSE); for (i = 0; i < VISU_BOX_N_VECTORS; i++) box->priv->cell[i] = geometry[i]; _setUpGeometry(box, TRUE); return TRUE; } /** * visu_box_getGeometry: * @box: a #VisuBox object ; * @vector: an int corresponding to a vector of the box. * * Retrieve the value of a vector defining the bounding box. The vector * is chosen with an int, see the #VisuBoxVector enum for more * details. * * Since: 3.7 * * Returns: the value of the required vector (always a positive value * for vector = 0, 2 or 5 !), or G_MAXFLOAT if the box has not been initialised. */ double visu_box_getGeometry(VisuBox *box, VisuBoxVector vector) { g_return_val_if_fail(VISU_IS_BOX(box) && vector < VISU_BOX_N_VECTORS, G_MAXFLOAT); return (float)box->priv->cell[vector]; } static void _setUpGeometry(VisuBox *box, gboolean emit) { DBG_fprintf(stderr, "Visu Box: the bounding box is set to:\n %f %f %f\n %f %f %f\n", box->priv->cell[0], box->priv->cell[1], box->priv->cell[2], box->priv->cell[3], box->priv->cell[4], box->priv->cell[5]); _setUpMatrixFromCell(box); box->priv->extens[0] = _getBoxExtens(box, FALSE); box->priv->extens[1] = _getBoxExtens(box, TRUE); DBG_fprintf(stderr, "Visu Box: set box geometry done.\n"); if (box->priv->cell[0] != G_MAXFLOAT && box->priv->margin != G_MAXFLOAT && emit) { DBG_fprintf(stderr, "Visu Box: emit SizeChanged.\n"); g_signal_emit(box, visu_box_signals[SIZE_CHANGED_SIGNAL], 0, box->priv->extens[1] + box->priv->margin, NULL); DBG_fprintf(stderr, "Visu Box: emission done (SizeChanged).\n"); } } static void _setUpMatrixFromCell(VisuBox *box) { /* Create the transformation matrix. */ box->priv->fromXYZtoBox[0][0] = 1. / box->priv->cell[VISU_BOX_DXX]; box->priv->fromXYZtoBox[0][1] = - box->priv->cell[VISU_BOX_DYX] / box->priv->cell[VISU_BOX_DXX] / box->priv->cell[VISU_BOX_DYY]; box->priv->fromXYZtoBox[0][2] = - (box->priv->cell[VISU_BOX_DZX] / box->priv->cell[VISU_BOX_DXX] - box->priv->cell[VISU_BOX_DYX] * box->priv->cell[VISU_BOX_DZY] / box->priv->cell[VISU_BOX_DXX] / box->priv->cell[VISU_BOX_DYY] ) / box->priv->cell[VISU_BOX_DZZ]; box->priv->fromXYZtoBox[1][0] = 0.; box->priv->fromXYZtoBox[1][1] = 1. / box->priv->cell[VISU_BOX_DYY]; box->priv->fromXYZtoBox[1][2] = - box->priv->cell[VISU_BOX_DZY] / box->priv->cell[VISU_BOX_DYY] / box->priv->cell[VISU_BOX_DZZ]; box->priv->fromXYZtoBox[2][0] = 0.; box->priv->fromXYZtoBox[2][1] = 0.; box->priv->fromXYZtoBox[2][2] = 1. / box->priv->cell[VISU_BOX_DZZ]; box->priv->fromBoxtoXYZ[0][0] = box->priv->cell[VISU_BOX_DXX]; box->priv->fromBoxtoXYZ[0][1] = box->priv->cell[VISU_BOX_DYX]; box->priv->fromBoxtoXYZ[0][2] = box->priv->cell[VISU_BOX_DZX]; box->priv->fromBoxtoXYZ[1][0] = 0.; box->priv->fromBoxtoXYZ[1][1] = box->priv->cell[VISU_BOX_DYY]; box->priv->fromBoxtoXYZ[1][2] = box->priv->cell[VISU_BOX_DZY]; box->priv->fromBoxtoXYZ[2][0] = 0.; box->priv->fromBoxtoXYZ[2][1] = 0.; box->priv->fromBoxtoXYZ[2][2] = box->priv->cell[VISU_BOX_DZZ]; } static gfloat _getBoxExtens(const VisuBox *box, gboolean withExt) { float dz2, dy2, dx, dy, dz, su, sc; float geometry[VISU_BOX_N_VECTORS]; /* calculate bare = 1/2 radius of centered sample */ geometry[VISU_BOX_DXX] = (withExt)?box->priv->cell[VISU_BOX_DXX] * (1. + 2. * box->priv->extension[0]):box->priv->cell[VISU_BOX_DXX]; geometry[VISU_BOX_DYX] = (withExt)?box->priv->cell[VISU_BOX_DYX] * (1. + 2. * box->priv->extension[1]):box->priv->cell[VISU_BOX_DYX]; geometry[VISU_BOX_DZX] = (withExt)?box->priv->cell[VISU_BOX_DZX] * (1. + 2. * box->priv->extension[2]):box->priv->cell[VISU_BOX_DZX]; geometry[VISU_BOX_DYY] = (withExt)?box->priv->cell[VISU_BOX_DYY] * (1. + 2. * box->priv->extension[1]):box->priv->cell[VISU_BOX_DYY]; geometry[VISU_BOX_DZY] = (withExt)?box->priv->cell[VISU_BOX_DZY] * (1. + 2. * box->priv->extension[2]):box->priv->cell[VISU_BOX_DZY]; geometry[VISU_BOX_DZZ] = (withExt)?box->priv->cell[VISU_BOX_DZZ] * (1. + 2. * box->priv->extension[2]):box->priv->cell[VISU_BOX_DZZ]; dz = geometry[VISU_BOX_DZZ]; dz2 = dz * dz; dy = (geometry[VISU_BOX_DYY] + geometry[VISU_BOX_DZY]); dy2 = dy * dy; dx = (geometry[VISU_BOX_DXX] + geometry[VISU_BOX_DYX] + geometry[VISU_BOX_DZX]); su = dx * dx + dy2 + dz2; dx = (-geometry[VISU_BOX_DXX] + geometry[VISU_BOX_DYX] + geometry[VISU_BOX_DZX]); sc = dx * dx + dy2 + dz2; if (sc > su) su = sc; dx = (geometry[VISU_BOX_DXX] - geometry[VISU_BOX_DYX] + geometry[VISU_BOX_DZX]); dy = (geometry[VISU_BOX_DYY] - geometry[VISU_BOX_DZY]); dy2 = dy * dy; sc = dx * dx + dy2 + dz2; if (sc > su) su = sc; dx = (geometry[VISU_BOX_DXX] + geometry[VISU_BOX_DYX] - geometry[VISU_BOX_DZX]); sc = dx * dx + dy2 + dz2; if (sc > su) su = sc; return sqrt(su) * 0.5f; } /** * visu_box_setMargin: * @box: a #VisuBox object. * @margin: a float value. * @emit: TRUE to emit #VisuBox::SizeChanged signal. * * This routine add some margin to defined the OpenGL rendering zone * of @box. * * Since: 3.7 * * Returns: TRUE if the margin is actually changed. **/ gboolean visu_box_setMargin(VisuBox *box, gfloat margin, gboolean emit) { g_return_val_if_fail(VISU_IS_BOX(box), FALSE); if (margin < 0.f || margin == box->priv->margin) return FALSE; box->priv->margin = margin; if (box->priv->cell[0] != G_MAXFLOAT && box->priv->margin != G_MAXFLOAT && emit) { DBG_fprintf(stderr, "Visu Box: emit SizeChanged.\n"); g_signal_emit(box, visu_box_signals[SIZE_CHANGED_SIGNAL], 0, box->priv->extens[1] + box->priv->margin, NULL); DBG_fprintf(stderr, "Visu Box: emission done (SizeChanged).\n"); } return TRUE; } /** * visu_box_getCentre: * @box: a #VisuBox object ; * @centre: (out) (array fixed-size=3): coordinates of the centre. * * @centre contains on output the cartesian coordinates of the centre * of the bounding box. * * Since: 3.7 */ void visu_box_getCentre(VisuBox *box, float centre[3]) { g_return_if_fail(VISU_IS_BOX(box)); centre[0] = 0.5f * (box->priv->cell[VISU_BOX_DXX] + box->priv->cell[VISU_BOX_DYX] + box->priv->cell[VISU_BOX_DZX]); centre[1] = 0.5f * (box->priv->cell[VISU_BOX_DYY] + box->priv->cell[VISU_BOX_DZY]); centre[2] = 0.5f * (box->priv->cell[VISU_BOX_DZZ]); } /** * visu_box_convertFullToCell: * @box: a #VisuBox object. * @cell: (out caller-allocates) (array fixed-size=3): * @full: (in) (array fixed-size=3): * * Convert given cartesian coordinates of a full matrix definition * (see visu_box_setGeometryFull()) to cartesian coordinates in the * cell definition used by V_Sim. It corresponds to two applied rotations. * * Since: 3.7 */ void visu_box_convertFullToCell(VisuBox *box, float cell[3], float full[3]) { g_return_if_fail(VISU_IS_BOX(box)); if (box->priv->fromFullToCell[0][0] != G_MAXFLOAT) tool_matrix_productVector(cell, box->priv->fromFullToCell, full); else { cell[0] = full[0]; cell[1] = full[1]; cell[2] = full[2]; } } /** * visu_box_convertXYZtoBoxCoordinates: (skip) * @box: a #VisuBox object ; * @boxCoord:an array of floating point values to store the result ; * @xyz: an array of floating point values describing coordinates in cartesian. * * Use this method to transform cartesian coordinates to the box * coordinates. * * Since: 3.7 */ void visu_box_convertXYZtoBoxCoordinates(VisuBox *box, float boxCoord[3], float xyz[3]) { int i, j; g_return_if_fail(VISU_IS_BOX(box) && boxCoord && xyz); for (i = 0; i < 3; i++) { boxCoord[i] = 0.; for (j = 0; j < 3; j++) boxCoord[i] += (float)box->priv->fromXYZtoBox[i][j] * xyz[j]; } } /** * visu_box_convertXYZToReduced: * @box: a #VisuBox object ; * @xyz: (in) (array fixed-size=3) (element-type gfloat): floating * point values that describes the cartesian coordinates. * @u: (out caller-allocates): the x coordinate. * @v: (out caller-allocates): the y coordinate. * @w: (out caller-allocates): the z coordinate. * * Use this method to transform cartesian into box coordinates. * * Since: 3.7 */ void visu_box_convertXYZToReduced(VisuBox *box, GArray *xyz, float *u, float *v, float *w) { float red_[3]; g_return_if_fail(xyz && u && v && w && xyz->len == 3); visu_box_convertXYZtoBoxCoordinates(box, red_, (float*)xyz->data); *u = red_[0]; *v = red_[1]; *w = red_[2]; } /** * visu_box_convertBoxCoordinatestoXYZ: (skip) * @box: a #VisuBox object ; * @xyz: an array of floating point values to store the result ; * @boxCoord: an array of floating point values that describes the box coordinates. * * Use this method to transform box coordinates into cartesian. * * Since: 3.7 */ void visu_box_convertBoxCoordinatestoXYZ(VisuBox *box, float xyz[3], float boxCoord[3]) { int i, j; g_return_if_fail(VISU_IS_BOX(box) && boxCoord && xyz); for (i = 0; i < 3; i++) { xyz[i] = 0.; for (j = 0; j < 3; j++) xyz[i] += (float)box->priv->fromBoxtoXYZ[i][j] * boxCoord[j]; } } /** * visu_box_convertReducedToXYZ: * @box: a #VisuBox object ; * @red: (in) (array fixed-size=3) (element-type gfloat): floating * point values that describes the cartesian coordinates. * @x: (out caller-allocates): the x coordinate. * @y: (out caller-allocates): the y coordinate. * @z: (out caller-allocates): the z coordinate. * * Use this method to transform box coordinates into cartesian. * * Since: 3.7 */ void visu_box_convertReducedToXYZ(VisuBox *box, GArray *red, float *x, float *y, float *z) { float xyz_[3]; g_return_if_fail(red && x && y && z && red->len == 3); visu_box_convertBoxCoordinatestoXYZ(box, xyz_, (float*)red->data); *x = xyz_[0]; *y = xyz_[1]; *z = xyz_[2]; } /** * visu_box_getInvMatrix: (skip) * @box: a #VisuBox object ; * @matrix: an area to store the matrix. * * This method is used when the inverse box matrix is required. This matrix can transform * a vector given in cartesian coordinates into a box vector. If a simple vector * multication is required, then the use of visu_box_convertXYZtoBoxCoordinates() * should be prefered. * * Since: 3.7 */ void visu_box_getInvMatrix(VisuBox *box, double matrix[3][3]) { int i, j; g_return_if_fail(VISU_IS_BOX(box) && matrix); /* Mind the transposition here. */ for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) matrix[i][j] = box->priv->fromXYZtoBox[i][j]; } /** * visu_box_getCellMatrix: (skip) * @box: a #VisuBox object ; * @matrix: an area to store the matrix. * * This method is used when the box matrix is required. This matrix can transform * a vector given in box coordinates into a cartesian vector. If a simple vector * multication is required, then the use of visu_box_convertBoxCoordinatestoXYZ() * should be prefered. * * Since: 3.7 */ void visu_box_getCellMatrix(VisuBox *box, double matrix[3][3]) { int i, j; g_return_if_fail(VISU_IS_BOX(box) && matrix); /* Mind the transposition here. */ for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) matrix[i][j] = box->priv->fromBoxtoXYZ[i][j]; } /** * visu_box_getCellMatrixv: * @box: a #VisuBox object ; * @m11: (out): an area to store the matrix. * @m12: (out): an area to store the matrix. * @m13: (out): an area to store the matrix. * @m21: (out): an area to store the matrix. * @m22: (out): an area to store the matrix. * @m23: (out): an area to store the matrix. * @m31: (out): an area to store the matrix. * @m32: (out): an area to store the matrix. * @m33: (out): an area to store the matrix. * * This method is a binding method for visu_box_getCellMatrix(). * * Rename to: visu_box_getCellMatrix * * Since: 3.7 */ void visu_box_getCellMatrixv(VisuBox *box, double *m11, double *m12, double *m13, double *m21, double *m22, double *m23, double *m31, double *m32, double *m33) { double m[3][3]; g_return_if_fail(m11 && m12 && m13 && m21 && m22 && m23 && m31 && m32 && m33); visu_box_getCellMatrix(box, m); *m11 = m[0][0]; *m12 = m[0][1]; *m13 = m[0][2]; *m21 = m[1][0]; *m22 = m[1][1]; *m23 = m[1][2]; *m31 = m[2][0]; *m32 = m[2][1]; *m33 = m[2][2]; } /** * visu_box_constrainInside: * @box: a #VisuBox object. * @translat: a translation in cartesian coordinates (out values). * @xyz: a set of cartesian coordinates. * @withExt: TRUE to take into account the box expansions. * * Given the box defintion @box and the initial @xyz cartesian coordinates, it * returns the translation @translat to be applied to @xyz to move the * node into the box. * * Since: 3.7 * * Returns: TRUE if @translat is not (0;0;0). */ gboolean visu_box_constrainInside(VisuBox *box, float translat[3], float xyz[3], gboolean withExt) { float boxCoord[3], bounds[3], size[3]; gboolean moved; int k; if (withExt) { bounds[0] = ceil(box->priv->extension[0]); bounds[1] = ceil(box->priv->extension[1]); bounds[2] = ceil(box->priv->extension[2]); } else { bounds[0] = 0.f; bounds[1] = 0.f; bounds[2] = 0.f; } size[0] = 1. + 2. * bounds[0]; size[1] = 1. + 2. * bounds[1]; size[2] = 1. + 2. * bounds[2]; visu_box_convertXYZtoBoxCoordinates(box, boxCoord, xyz); moved = FALSE; for (k = 0; k < 3; k++) { while (boxCoord[k] < - bounds[k]) { moved = TRUE; boxCoord[k] += size[k]; } while (boxCoord[k] >= 1. + bounds[k]) { moved = TRUE; boxCoord[k] -= size[k]; } } if (moved) { visu_box_convertBoxCoordinatestoXYZ(box, translat, boxCoord); translat[0] -= xyz[0]; translat[1] -= xyz[1]; translat[2] -= xyz[2]; DBG_fprintf(stderr, "Tool Matrix: move coord. from %gx%gx%g to %gx%gx%g.\n", xyz[0], xyz[1], xyz[2], boxCoord[0], boxCoord[1], boxCoord[2]); } else { translat[0] = 0.f; translat[1] = 0.f; translat[2] = 0.f; } return moved; } /** * visu_box_getVertices: * @box: a #VisuBox object. * @v: (out caller-allocates) (type VisuBoxVertices*): the position of * the eight vertices of the bounding box. * @withExtension: a boolean. * * All nodes are rendered inside a bounding box, this method can be used to retrieve * it. This box is not the drawn box but the box containing all the * nodes, included possible extension. To get the box itself, use * visu_box_getCellMatrix() instead. One can also get the vertices of * the box itself using FALSE as @withExtension argument. */ void visu_box_getVertices(VisuBox *box, float v[8][3], gboolean withExtension) { float transX[3], transY[3], transZ[3], ext[3]; double *boxGeometry; g_return_if_fail(VISU_IS_BOX(box)); if (withExtension) { ext[0] = box->priv->extension[0]; ext[1] = box->priv->extension[1]; ext[2] = box->priv->extension[2]; } else { ext[0] = 0.f; ext[1] = 0.f; ext[2] = 0.f; } DBG_fprintf(stderr, "Visu Box: get the box vertices with" " extension %d (%g;%g;%g).\n", withExtension, ext[0], ext[1], ext[2]); boxGeometry = box->priv->cell; transX[0] = ext[0] * boxGeometry[0]; transX[1] = 0.f; transX[2] = 0.f; transY[0] = ext[1] * boxGeometry[1]; transY[1] = ext[1] * boxGeometry[2]; transY[2] = 0.f; transZ[0] = ext[2] * boxGeometry[3]; transZ[1] = ext[2] * boxGeometry[4]; transZ[2] = ext[2] * boxGeometry[5]; /* [0;0;0] */ DBG_fprintf(stderr, " | v is %p.\n", (gpointer)v); DBG_fprintf(stderr, " | v[0] is %p.\n", (gpointer)v[0]); v[0][0] = 0.f - transX[0] - transY[0] - transZ[0]; v[0][1] = 0.f - transX[1] - transY[1] - transZ[1]; v[0][2] = 0.f - transX[2] - transY[2] - transZ[2]; /* [1;0;0] */ DBG_fprintf(stderr, " | v[1] is %p.\n", (gpointer)v[1]); v[1][0] = boxGeometry[0] + transX[0] - transY[0] - transZ[0]; v[1][1] = 0.f + transX[1] - transY[1] - transZ[1]; v[1][2] = 0.f + transX[2] - transY[2] - transZ[2]; /* [0;1;0] */ DBG_fprintf(stderr, " | v[3] is %p.\n", (gpointer)v[3]); v[3][0] = boxGeometry[1] - transX[0] + transY[0] - transZ[0]; v[3][1] = boxGeometry[2] - transX[1] + transY[1] - transZ[1]; v[3][2] = 0.f - transX[2] + transY[2] - transZ[2]; /* [0;0;1] */ DBG_fprintf(stderr, " | v[4] is %p.\n", (gpointer)v[4]); v[4][0] = boxGeometry[3] - transX[0] - transY[0] + transZ[0]; v[4][1] = boxGeometry[4] - transX[1] - transY[1] + transZ[1]; v[4][2] = boxGeometry[5] - transX[2] - transY[2] + transZ[2]; /* [1;1;0] */ v[2][0] = boxGeometry[0] + boxGeometry[1] + transX[0] + transY[0] - transZ[0]; v[2][1] = 0.f + boxGeometry[2] + transX[1] + transY[1] - transZ[1]; v[2][2] = 0.f + 0.f + transX[2] + transY[2] - transZ[2]; /* [1;0;1] */ v[5][0] = boxGeometry[3] + boxGeometry[0] + transX[0] - transY[0] + transZ[0]; v[5][1] = boxGeometry[4] + 0.f + transX[1] - transY[1] + transZ[1]; v[5][2] = boxGeometry[5] + 0.f + transX[2] - transY[2] + transZ[2]; /* [1;1;1] */ v[6][0] = boxGeometry[3] + boxGeometry[0] + boxGeometry[1] + transX[0] + transY[0] + transZ[0]; v[6][1] = boxGeometry[4] + boxGeometry[2] + transX[1] + transY[1] + transZ[1]; v[6][2] = boxGeometry[5] + 0.f + transX[2] + transY[2] + transZ[2]; /* [0;1;1] */ v[7][0] = boxGeometry[3] + boxGeometry[1] - transX[0] + transY[0] + transZ[0]; v[7][1] = boxGeometry[4] + boxGeometry[2] - transX[1] + transY[1] + transZ[1]; v[7][2] = boxGeometry[5] + 0.f - transX[2] + transY[2] + transZ[2]; DBG_fprintf(stderr, " | done.\n"); } /** * visu_box_getExtension: * @boxObj: a #VisuBox object ; * @extension: (out) (array fixed-size=3): an allocated array to store the values. * * Using visu_data_replicate(), it is possible to duplicate the primitive box * in each directions. Use this method to know the current extension. Returned * values are positive floating point values. An extension of 0. means that * only the primitive box exists, while a value of one means a duplication of * one box in each direction of the coordinate. * * Since: 3.7 */ void visu_box_getExtension(const VisuBox *boxObj, float extension[3]) { g_return_if_fail(VISU_IS_BOX(boxObj)); extension[0] = boxObj->priv->extension[0]; extension[1] = boxObj->priv->extension[1]; extension[2] = boxObj->priv->extension[2]; } /** * visu_box_setExtension: * @boxObj: a #VisuBox object ; * @extension: (in) (array fixed-size=3): an allocated array to store the values. * * Using visu_data_replicate(), it is possible to duplicate the primitive box * in each directions. Use this method to know the current extension. Returned * values are positive floating point values. An extension of 0. means that * only the primitive box exists, while a value of one means a duplication of * one box in each direction of the coordinate. * * Since: 3.7 * * Returns: TRUE if the extension of @box is actually changed. */ gboolean visu_box_setExtension(VisuBox *boxObj, float extension[3]) { g_return_val_if_fail(VISU_IS_BOX(boxObj), FALSE); if (extension[0] == boxObj->priv->extension[0] && extension[1] == boxObj->priv->extension[1] && extension[2] == boxObj->priv->extension[2]) return FALSE; boxObj->priv->extension[0] = extension[0]; boxObj->priv->extension[1] = extension[1]; boxObj->priv->extension[2] = extension[2]; DBG_fprintf(stderr, "Visu Box: emit ExtensionChanged.\n"); g_signal_emit(boxObj, visu_box_signals[EXTENSION_CHANGED_SIGNAL], 0, NULL); DBG_fprintf(stderr, "Visu Box: emission done (ExtensionChanged).\n"); boxObj->priv->extens[1] = _getBoxExtens(boxObj, TRUE); if (boxObj->priv->cell[0] != G_MAXFLOAT && boxObj->priv->margin != G_MAXFLOAT) { DBG_fprintf(stderr, "Visu Box: emit SizeChanged.\n"); g_signal_emit(boxObj, visu_box_signals[SIZE_CHANGED_SIGNAL], 0, boxObj->priv->extens[1] + boxObj->priv->margin, NULL); DBG_fprintf(stderr, "Visu Box: emission done (SizeChanged).\n"); } return TRUE; } /** * visu_box_getGlobalSize: * @box: a #VisuBox object. * @withExt: a boolean. * * The box has a whole size that contains it (including margin, see * visu_box_setMargin()), this size can be retrieve taking into * account the extension of the box, or not. * * Since: 3.7 * * Returns: #G_MAXFLOAT on failure, otherwise a length for the biggest * diagonal distance of the box, with or without extension. **/ float visu_box_getGlobalSize(VisuBox *box, gboolean withExt) { g_return_val_if_fail(VISU_IS_BOX(box), G_MAXFLOAT); if (withExt) return box->priv->extens[1] + box->priv->margin; else return box->priv->extens[0]; } /** * visu_box_getUnit: * @box: a #VisuBox object. * * The lengths of @box may be given in a certain unit using * visu_box_setUnit(). * * Since: 3.7 * * Returns: the #ToolUnits of @box or #TOOL_UNITS_UNDEFINED. */ ToolUnits visu_box_getUnit(VisuBox *box) { g_return_val_if_fail(VISU_IS_BOX(box), TOOL_UNITS_UNDEFINED); return box->priv->units; } /** * visu_box_setUnit: * @box: a #VisuBox object. * @unit: a #ToolUnits flag. * * The lengths of @box may be given in a certain unit by calling this * routine. If the unit is different from the previously defined, the * coordinate are scaled accordingly. * * Since: 3.7 * * Returns: TRUE if the unit has been changed. */ gboolean visu_box_setUnit(VisuBox *box, ToolUnits unit) { ToolUnits unit_; double fact; g_return_val_if_fail(VISU_IS_BOX(box), FALSE); DBG_fprintf(stderr, "Visu Box: set unit to %d (%d).\n", unit, box->priv->units); if (box->priv->units == unit) return FALSE; unit_ = box->priv->units; box->priv->units = unit; if (unit_ == TOOL_UNITS_UNDEFINED || unit == TOOL_UNITS_UNDEFINED) { DBG_fprintf(stderr, "Visu Box: emit UnitChanged.\n"); g_signal_emit(box, visu_box_signals[UNIT_CHANGED_SIGNAL], 0, 1.f, NULL); DBG_fprintf(stderr, "Visu Box: emission done (UnitChanged).\n"); return TRUE; } fact = (double)tool_physic_getUnitValueInMeter(unit_) / tool_physic_getUnitValueInMeter(unit); DBG_fprintf(stderr, "Visu Box: multiplying factor is %g.\n", fact); /* We do an homothety on the box. */ box->priv->cell[0] *= fact; box->priv->cell[1] *= fact; box->priv->cell[2] *= fact; box->priv->cell[3] *= fact; box->priv->cell[4] *= fact; box->priv->cell[5] *= fact; _setUpGeometry(box, FALSE); DBG_fprintf(stderr, "Visu Box: emit UnitChanged.\n"); g_signal_emit(box, visu_box_signals[UNIT_CHANGED_SIGNAL], 0, fact, NULL); DBG_fprintf(stderr, "Visu Box: emission done (UnitChanged).\n"); if (box->priv->cell[0] != G_MAXFLOAT && box->priv->margin != G_MAXFLOAT) { DBG_fprintf(stderr, "Visu Box: emit SizeChanged.\n"); g_signal_emit(box, visu_box_signals[SIZE_CHANGED_SIGNAL], 0, box->priv->extens[1] + box->priv->margin, NULL); DBG_fprintf(stderr, "Visu Box: emission done (SizeChanged).\n"); } return TRUE; } /** * visu_box_getPeriodicVector: (skip) * @box: a #VisuBox object. * @vect: (inout) (array fixed-size=3): a vector. * * Modify @vect to get the shortest equivalent vector, taking into * account the periodicity. * * Since: 3.7 **/ void visu_box_getPeriodicVector(VisuBox *box, float vect[3]) { float red[3]; VisuBoxBoundaries bc; g_return_if_fail(VISU_IS_BOX(box)); bc = box->priv->bc; if (bc == VISU_BOX_FREE) return; visu_box_convertXYZtoBoxCoordinates(box, red, vect); /* DBG_fprintf(stderr, "Visu Box: transform %gx%gx%g into", red[0], red[1], red[2]); */ if (bc != VISU_BOX_SURFACE_YZ) { while (red[0] >= 0.5f) red[0] -= 1.f; while (red[0] < -0.5f) red[0] += 1.f; } if (bc != VISU_BOX_SURFACE_ZX) { while (red[1] >= 0.5f) red[1] -= 1.f; while (red[1] < -0.5f) red[1] += 1.f; } if (bc != VISU_BOX_SURFACE_XY) { while (red[2] >= 0.5f) red[2] -= 1.f; while (red[2] < -0.5f) red[2] += 1.f; } /* DBG_fprintf(stderr, " %gx%gx%g.\n", red[0], red[1], red[2]); */ visu_box_convertBoxCoordinatestoXYZ(box, vect, red); } /** * visu_box_getPeriodicVectorv: * @box: a #VisuBox object. * @x: (out): the new x part. * @y: (out): the new y part. * @z: (out): the new z part. * @vect: (array fixed-size=3): a vector. * * Equivalent of visu_box_getPeriodicVector() used for bindings. * * Rename to: visu_box_getPeriodicVector * * Since: 3.7 **/ void visu_box_getPeriodicVectorv(VisuBox *box, float *x, float *y, float *z, float vect[3]) { g_return_if_fail(x && y && z); visu_box_getPeriodicVector(box, vect); *x = vect[0]; *y = vect[1]; *z = vect[2]; } /** * visu_box_getPeriodicArray: * @box: a #VisuBox object. * @array: (type gint64): an array of @nEle * 3 floats. * @nEle: number of elements in @array * * Used for bindings. * * Since: 3.7 **/ void visu_box_getPeriodicArray(VisuBox *box, float *array, guint nEle) { guint i; DBG_fprintf(stderr, "Visu Box: apply periodic distance on array %p (%d).\n", (gpointer)array, nEle); for (i = 0; i < nEle; i++) visu_box_getPeriodicVector(box, array + i * 3); DBG_fprintf(stderr, " | done.\n"); } static VisuBox* _getBox(VisuBoxed *self) { return VISU_BOX(self); } v_sim-3.7.0/src/visu_box.h0000644000353400050620000001652312215546106012370 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse mèl : BILLARD, non joignable par mèl ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef VISU_BOX_H #define VISU_BOX_H #include #include #include "coreTools/toolPhysic.h" G_BEGIN_DECLS /** * VISU_TYPE_BOX: * * return the type of #VisuBox. */ #define VISU_TYPE_BOX (visu_box_get_type ()) /** * VISU_BOX: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuBox type. */ #define VISU_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_BOX, VisuBox)) /** * VISU_BOX_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuBoxClass. */ #define VISU_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_BOX, VisuBoxClass)) /** * VISU_IS_BOX: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuBox object. */ #define VISU_IS_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_BOX)) /** * VISU_IS_BOX_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuBoxClass class. */ #define VISU_IS_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_BOX)) /** * VISU_BOX_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. */ #define VISU_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_BOX, VisuBoxClass)) typedef struct _VisuBoxClass VisuBoxClass; typedef struct _VisuBox VisuBox; typedef struct _VisuBoxPrivate VisuBoxPrivate; /** * visu_box_get_type: * * This method returns the type of #VisuBox, use VISU_TYPE_BOX instead. * * Returns: the type of #VisuBox. */ GType visu_box_get_type(void); /** * _VisuBox: * @parent: parent. * @priv: private data. * * This structure describes a box. */ struct _VisuBox { GObject parent; VisuBoxPrivate *priv; }; struct _VisuBoxClass { GObjectClass parent; }; /** * VisuBoxVector: * @VISU_BOX_DXX: x box vector along X; * @VISU_BOX_DYX: y box vector along X; * @VISU_BOX_DYY: y box vector along Y; * @VISU_BOX_DZX: z box vector along X; * @VISU_BOX_DZY: z box vector along Y; * @VISU_BOX_DZZ: z box vector along Z; * @VISU_BOX_N_VECTORS: number of elements. * * Identifier of every projection of the box super-cell on an * orthogonal basis-set. * * Since: 3.7 **/ typedef enum { VISU_BOX_DXX, VISU_BOX_DYX, VISU_BOX_DYY, VISU_BOX_DZX, VISU_BOX_DZY, VISU_BOX_DZZ, VISU_BOX_N_VECTORS } VisuBoxVector; /** * VisuBoxBoundaries: * @VISU_BOX_PERIODIC: the full 3D periodicity ; * @VISU_BOX_SURFACE_XY: the Z axis is a free axis ; * @VISU_BOX_SURFACE_YZ: the X axis is a free axis ; * @VISU_BOX_SURFACE_ZX: the Y axis is a free axis ; * @VISU_BOX_WIRE_X: the periodicity is along X axis only ; * @VISU_BOX_WIRE_Y: the periodicity is along Y axis only ; * @VISU_BOX_WIRE_Z: the periodicity is along Z axis only ; * @VISU_BOX_FREE: the system is isolated. * * This describes the periodicity of the bounding box in the three directions. */ typedef enum { VISU_BOX_PERIODIC, VISU_BOX_SURFACE_XY, VISU_BOX_SURFACE_YZ, VISU_BOX_SURFACE_ZX, VISU_BOX_WIRE_X, VISU_BOX_WIRE_Y, VISU_BOX_WIRE_Z, VISU_BOX_FREE } VisuBoxBoundaries; /* These structures are used for bindings. */ typedef struct _VisuBoxVertices VisuBoxVertices; struct _VisuBoxVertices { float vertices[8][3]; }; typedef struct _VisuBoxCell VisuBoxCell; struct _VisuBoxCell { double box[VISU_BOX_N_VECTORS]; }; VisuBox* visu_box_new(double geometry[VISU_BOX_N_VECTORS], VisuBoxBoundaries bc); VisuBox* visu_box_new_full(double full[3][3], VisuBoxBoundaries bc); void visu_box_convertFullToCell(VisuBox *box, float cell[3], float full[3]); void visu_box_convertXYZtoBoxCoordinates(VisuBox *box, float boxCoord[3], float xyz[3]); void visu_box_convertXYZToReduced(VisuBox *box, GArray *xyz, float *u, float *v, float *w); void visu_box_convertBoxCoordinatestoXYZ(VisuBox *box, float xyz[3], float boxCoord[3]); void visu_box_convertReducedToXYZ(VisuBox *box, GArray *red, float *x, float *y, float *z); gboolean visu_box_constrainInside(VisuBox *box, float translat[3], float xyz[3], gboolean withExt); void visu_box_getInvMatrix(VisuBox *box, double matrix[3][3]); void visu_box_getCellMatrix(VisuBox *box, double matrix[3][3]); void visu_box_getCellMatrixv(VisuBox *box, double *m11, double *m12, double *m13, double *m21, double *m22, double *m23, double *m31, double *m32, double *m33); void visu_box_getVertices(VisuBox *box, float v[8][3], gboolean withExtension); void visu_box_getExtension(const VisuBox *boxObj, float extension[3]); VisuBoxBoundaries visu_box_getBoundary(VisuBox *box); void visu_box_getPeriodicity(VisuBox *box, gboolean per[3]); double visu_box_getGeometry(VisuBox *box, VisuBoxVector vector); void visu_box_getCentre(VisuBox *box, float centre[3]); float visu_box_getGlobalSize(VisuBox *box, gboolean withExt); ToolUnits visu_box_getUnit(VisuBox *box); void visu_box_getPeriodicVector(VisuBox *box, float vect[3]); void visu_box_getPeriodicVectorv(VisuBox *box, float *x, float *y, float *z, float vect[3]); void visu_box_getPeriodicArray(VisuBox *box, float *array, guint nEle); gboolean visu_box_setBoundary(VisuBox *box, VisuBoxBoundaries bc); gboolean visu_box_setGeometry(VisuBox *box, double geometry[VISU_BOX_N_VECTORS]); gboolean visu_box_setGeometryFull(VisuBox *box, double full[3][3]); gboolean visu_box_setMargin(VisuBox *box, gfloat margin, gboolean emit); gboolean visu_box_setExtension(VisuBox *boxObj, float extension[3]); gboolean visu_box_setUnit(VisuBox *box, ToolUnits unit); G_END_DECLS #endif v_sim-3.7.0/src/visu_data.c0000644000353400050620000021731012215546105012500 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "visu_data.h" #include #include #include #include #include "visu_object.h" #include "extraFunctions/dataNode.h" #include "extraFunctions/geometry.h" #include "coreTools/toolMatrix.h" /** * SECTION:visu_data * @short_description: Give methods to store and manage data from * input file(s). * * The main goal of V_Sim is to draw lists of elements. For * example, when used to render atoms, a box that contains 24 silicon * atoms and 46 germanium atoms is a box with two elements (silicon * and germanium) where the silicon element has 24 nodes and the * germanium element has 46 nodes. This module gives then methods to * create nodes (see #VisuElement to create and managed * elements). * * All nodes are stored in a structure called #VisuNodes and * #VisuNodes is encapsulated in a #VisuData for all not-node related * information. V_Sim uses one #VisuData per input file(s). This * structure contains a list of pointers on all the #VisuElement used * in this file. * * To iterate on nodes, one should use the provided iterators * (see #VisuNodeArrayIter) methods, like visu_node_array_iter_next(). */ struct FileDescription_struct { /* Identity. */ int kind; /* The name of a file. */ gchar *name; /* The format of the file. This format can be null, if the file has not been parsed yet and the format is unknown. If the file file is not parsed but the format is set, then it is just an indication and may not be the right format. */ ToolFileFormat *format; }; enum { FILES_CHANGED_SIGNAL, TRANSLATIONS_CHANGED_SIGNAL, VISU_DATA_FREED_SIGNAL, LAST_SIGNAL }; enum { PROP_0, TOTAL_ENERGY_PROP }; /* Define a key for a VisuDataNode value. */ #define COORDINATES_ID "visu_data_coordinates" /* Local variables. */ static VisuDataNode *dataNodeCoord; /** * VisuData: * * Opaque structure for #VisuData objects. */ /** * VisuDataPrivate: * * Private fields for #VisuData objects. */ struct _VisuDataPrivate { gboolean dispose_has_run; /*******************/ /* Drawing Methods */ /*******************/ /* This function is used to scale the nodes before drawing them. */ VisuDataScalingFunc scaling; /* Define a method to set the color of each node. If this method is NULL, the color of the element is used. */ VisuDataColorFunc setColor; /********************/ /* Files attributes */ /********************/ /* Files that correspond to that VisuData. They are identified by a kind which is an integer. The list is pointers to FileDescription_struct. */ GList *files; /* Commentary associated to the rendered data, this commentary can be different for each set of nodes. */ gchar** commentary; /* The number of set of nodes in one file, and the currently loaded one. */ int nSets, iSet; /******************/ /* Box attributes */ /******************/ VisuBox *box; gulong unit_signal; /* Translation applied to all nodes when rendered. */ gboolean translationApply; float translation[3]; /********************/ /* Misc. attributes */ /********************/ /* This list contains pointers on source id, to be removed when the object is finalized. */ GList *timeoutList; /* The total energy of the system in eV. */ gdouble totalEnergy; }; static void visu_data_dispose (GObject* obj); static void visu_data_finalize (GObject* obj); static void visu_data_get_property(GObject* obj, guint property_id, GValue *value, GParamSpec *pspec); static void visu_data_set_property(GObject* obj, guint property_id, const GValue *value, GParamSpec *pspec); static void visu_boxed_interface_init(VisuBoxedInterface *iface); /* Local callbacks. */ static void onBoxUnitChanged(VisuBox *box, gfloat fact, gpointer user_data); /* Local routines. */ static VisuBox* visu_data_getBox(VisuBoxed *self); static gboolean visu_data_setBox(VisuBoxed *self, VisuBox *box, gboolean update); static gboolean setCoordFromString(VisuDataNode *dataNode, VisuData *dataObj, VisuNode *node, gchar* labelIn, gchar **labelOut, gboolean *modify); static gchar* getCoordFromString(VisuDataNode *dataNode, VisuData *dataObj, VisuNode *node); static int* shrinkNodeList(VisuData *data, int coord, float valueTo); static int* extendNodeList(VisuData *data, int coord, float valueFrom, float valueTo); static float defaultScaling(VisuData *data, VisuNode *node); static guint visu_data_signals[LAST_SIGNAL] = { 0 }; static GList* allObjects; G_DEFINE_TYPE_WITH_CODE(VisuData, visu_data, VISU_TYPE_NODE_ARRAY, G_IMPLEMENT_INTERFACE(VISU_TYPE_BOXED, visu_boxed_interface_init)) static void visu_data_class_init(VisuDataClass *klass) { DBG_fprintf(stderr, "Visu Data: creating the class of the object.\n"); DBG_fprintf(stderr, " - adding new signals ;\n"); /** * VisuData::objectFreed: * @dataObj: the object which received the signal ; * * Gets emitted when the object is been destroyed. All external * objects having a reference on this #VisuData should clean it. * * Since: 3.3 */ visu_data_signals[VISU_DATA_FREED_SIGNAL] = g_signal_newv ("objectFreed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, NULL , NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, NULL); /** * VisuData::FilesChanged: * @dataObj: the object which received the signal ; * * Gets emitted when one file of @dataObj is set. * * Since: 3.7 */ visu_data_signals[FILES_CHANGED_SIGNAL] = g_signal_new("FilesChanged", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT, NULL); /** * VisuData::TranslationsChanged: * @dataObj: the object which received the signal ; * * Gets emitted when translations are changed. At that point, node * coordinates are all different, but to update on node positions, * it's better to listen to VisuNodeArray::PositionChanged. * * Since: 3.7 */ visu_data_signals[TRANSLATIONS_CHANGED_SIGNAL] = g_signal_new("TranslationsChanged", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, NULL); /* Connect the overloading methods. */ G_OBJECT_CLASS(klass)->dispose = visu_data_dispose; G_OBJECT_CLASS(klass)->finalize = visu_data_finalize; G_OBJECT_CLASS(klass)->set_property = visu_data_set_property; G_OBJECT_CLASS(klass)->get_property = visu_data_get_property; /** * VisuData::totalEnergy: * * Store the total energy of the system in eV. * * Since: 3.6 */ g_object_class_install_property(G_OBJECT_CLASS(klass), TOTAL_ENERGY_PROP, g_param_spec_double("totalEnergy", "Total energy", "Total energy of" " the system (eV)", -G_MAXFLOAT, G_MAXFLOAT, G_MAXFLOAT, G_PARAM_CONSTRUCT | G_PARAM_READWRITE)); /* Initialise internal variables. */ allObjects = (GList*)0; /* Register a new NodeData. */ dataNodeCoord = VISU_DATA_NODE(visu_data_node_newWithCallbacks (COORDINATES_ID, setCoordFromString, getCoordFromString)); visu_data_node_setLabel(dataNodeCoord, _("Coord. (x, y, z)")); visu_data_node_setEditable(dataNodeCoord, TRUE); } static void visu_boxed_interface_init(VisuBoxedInterface *iface) { iface->get_box = visu_data_getBox; iface->set_box = visu_data_setBox; } static void visu_data_init(VisuData *obj) { int i; DBG_fprintf(stderr, "Visu Data: initializing a new object (%p).\n", (gpointer)obj); obj->priv = g_malloc(sizeof(VisuDataPrivate)); obj->priv->dispose_has_run = FALSE; /* Private data. */ obj->priv->files = (GList*)0; obj->priv->commentary = g_malloc(sizeof(gchar*) * 2); obj->priv->commentary[0] = g_strdup(""); obj->priv->commentary[1] = (gchar*)0; obj->priv->box = (VisuBox*)0; obj->priv->unit_signal = 0; obj->priv->translationApply = FALSE; for (i = 0; i < 3; i++) obj->priv->translation[i] = 0.; obj->priv->nSets = 1; obj->priv->iSet = -1; obj->priv->timeoutList = (GList*)0; obj->priv->scaling = defaultScaling; obj->priv->setColor = (VisuDataColorFunc)0; visu_data_node_setUsed(dataNodeCoord, obj, 3); /* Add object from allObjects list. */ allObjects = g_list_append(allObjects, (gpointer)obj); g_signal_emit_by_name(VISU_OBJECT_INSTANCE, "dataNew", obj, NULL); } /* This method can be called several times. It should unref all of its reference to GObjects. */ static void visu_data_dispose(GObject* obj) { VisuData *data; DBG_fprintf(stderr, "Visu Data: dispose object %p.\n", (gpointer)obj); data = VISU_DATA(obj); if (data->priv->dispose_has_run) return; data->priv->dispose_has_run = TRUE; #if DEBUG == 1 g_mem_profile(); #endif DBG_fprintf(stderr, "Visu Data: emit a 'objectFreed' signal.\n"); g_signal_emit(obj, visu_data_signals[VISU_DATA_FREED_SIGNAL], 0, NULL); visu_data_setBox(VISU_BOXED(data), (VisuBox*)0, FALSE); visu_data_node_setUsed(dataNodeCoord, data, 0); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_data_parent_class)->dispose(obj); } /* This method is called once only. */ static void visu_data_finalize(GObject* obj) { VisuData *data; GList *lst; g_return_if_fail(obj); DBG_fprintf(stderr, "Visu Data: finalize object %p.\n", (gpointer)obj); /* Remove object from allObjects list. */ allObjects = g_list_remove(allObjects, (gpointer)obj); data = VISU_DATA(obj); /* Free privs elements. */ if (data->priv) { DBG_fprintf(stderr, "Visu data: free private data.\n"); if (data->priv->files) { lst = data->priv->files; while (lst) { g_free(((struct FileDescription_struct*)lst->data)->name); g_free(lst->data); lst = g_list_next(lst); } g_list_free(data->priv->files); } if (data->priv->commentary) g_strfreev(data->priv->commentary); if (data->priv->timeoutList) { lst = data->priv->timeoutList; while (lst) { g_source_remove(*(guint*)lst->data); g_free(lst->data); lst = g_list_next(lst); } g_list_free(data->priv->timeoutList); } g_free(data->priv); } /* The free is called by g_type_free_instance... */ /* g_free(data); */ /* Chain up to the parent class */ DBG_fprintf(stderr, "Visu data: chain to parent.\n"); G_OBJECT_CLASS(visu_data_parent_class)->finalize(obj); DBG_fprintf(stderr, "Visu data: freeing ... OK.\n"); #if DEBUG == 1 g_mem_profile(); #endif } static void visu_data_get_property(GObject* obj, guint property_id, GValue *value, GParamSpec *pspec) { VisuData *self = VISU_DATA(obj); DBG_fprintf(stderr, "Visu Data: get property '%s' -> ", g_param_spec_get_name(pspec)); switch (property_id) { case TOTAL_ENERGY_PROP: g_value_set_double(value, self->priv->totalEnergy); DBG_fprintf(stderr, "%geV.\n", self->priv->totalEnergy); break; default: /* We don't have any other property... */ G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, property_id, pspec); break; } } static void visu_data_set_property(GObject* obj, guint property_id, const GValue *value, GParamSpec *pspec) { VisuData *self = VISU_DATA(obj); DBG_fprintf(stderr, "Visu Data: set property '%s' -> ", g_param_spec_get_name(pspec)); switch (property_id) { case TOTAL_ENERGY_PROP: self->priv->totalEnergy = g_value_get_double(value); DBG_fprintf(stderr, "%geV.\n", self->priv->totalEnergy); break; default: /* We don't have any other property... */ G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, property_id, pspec); break; } } /** * visu_data_new: * * This creates an empty #VisuData object. * * Returns: a newly created #VisuData object (its ref count is set to 1). */ VisuData* visu_data_new(void) { VisuData *data; #if DEBUG == 1 g_mem_profile(); #endif DBG_fprintf(stderr, "Visu Data: create a new VisuData object of type %d.\n", (int)VISU_TYPE_DATA); data = VISU_DATA(g_object_new(VISU_TYPE_DATA, NULL)); if (!data) return (VisuData*)0; #if DEBUG == 1 g_mem_profile(); #endif return data; } /** * visu_data_new_withFiles: * @files: (element-type filename) (array zero-terminated=1): a list * of names. * * This creates an empty #VisuData object with filename set to be * ready to be loaded. * * Since: 3.7 * * Returns: a newly created #VisuData object (its ref count is set to 1). */ VisuData* visu_data_new_withFiles(const gchar **files) { VisuData *data; guint i; #if DEBUG == 1 g_mem_profile(); #endif DBG_fprintf(stderr, "Visu Data: create a new VisuData object of type %d.\n", (int)VISU_TYPE_DATA); data = VISU_DATA(g_object_new(VISU_TYPE_DATA, NULL)); for (i = 0; files[i]; i++) visu_data_addFile(data, files[i], i, (ToolFileFormat*)0); #if DEBUG == 1 g_mem_profile(); #endif return data; } static gboolean setCoordFromString(VisuDataNode *dataNode, VisuData *dataObj, VisuNode *node, gchar* labelIn, gchar **labelOut, gboolean *modify) { int res, ln, i; gchar **datas; gboolean error; float valueFloat; VisuElement *ele; g_return_val_if_fail(VISU_IS_DATA_NODE_TYPE(dataNode) && VISU_IS_DATA(dataObj) && node, FALSE); g_return_val_if_fail(labelIn && labelOut && modify, FALSE); /* Parse the given labelIn. remove first and last parenthesis. */ if (labelIn[0] == '(') labelIn += 1; ln = strlen(labelIn); if (labelIn[ln - 1] == ')') labelIn[ln - 1] = '\0'; datas = g_strsplit(labelIn, ";", 3); *modify = FALSE; for (i = 0; datas[i]; i++) { error = FALSE; res = sscanf(datas[i], "%f", &valueFloat); if (res != 1) error = TRUE; else if (node->xyz[i] != valueFloat) { node->xyz[i] = valueFloat; *modify = TRUE; } if (error) { *labelOut = getCoordFromString(dataNode, dataObj, node); g_strfreev(datas); return FALSE; } } if (i != 3) error = TRUE; else error = FALSE; *labelOut = getCoordFromString(dataNode, dataObj, node); g_strfreev(datas); if (*modify) { ele = visu_node_array_getElement(VISU_NODE_ARRAY(dataObj), node); g_signal_emit_by_name(G_OBJECT(dataObj), "PositionChanged", ele, NULL); } return !error; } static gchar* getCoordFromString(VisuDataNode *dataNode, VisuData *dataObj, VisuNode *node) { GString *str; gchar *value; g_return_val_if_fail(VISU_IS_DATA_NODE_TYPE(dataNode) && VISU_IS_DATA(dataObj) && node, (gchar*)0); /* Check if the given property has an association with the given VisuData. */ DBG_fprintf(stderr, "Visu Data: get label for node coordinates.\n"); /* Set the format attribute. */ str = g_string_new(""); g_string_append_printf(str, "( %g ; %g ; %g )", node->xyz[0], node->xyz[1], node->xyz[2]); value = str->str; g_string_free(str, FALSE); DBG_fprintf(stderr, "Visu Data: get values '%s'.\n", value); return value; } /** * visu_data_freePopulation: * @data: a VisuData to be freed. * * This method frees only the allocated memory that deals with * the nodes (i.e. everything except the data of the files, * the properties and the setColor method. */ void visu_data_freePopulation(VisuData *data) { float zeros[3] = {0.f, 0.f, 0.f}; if (!data) return; DBG_fprintf(stderr, "Visu Data: freeing the population of VisuData %p ...\n", (gpointer)data); visu_node_array_freeNodes(VISU_NODE_ARRAY(data)); data->priv->iSet = -1; visu_box_setExtension(data->priv->box, zeros); visu_data_setXYZtranslation(data, zeros); DBG_fprintf(stderr, "Visu Data: freeing ... OK.\n"); } /** * visu_data_addFile: * @data: a #VisuData object ; * @file: a string that points to a file ; * @kind: an integer to qualify the file to add ; * @format: (allow-none): a file format. * * This method is used to add files * of type @kind to the @data. The @file * attribute is copied. The @format argument can be null. */ void visu_data_addFile(VisuData *data, const gchar* file, int kind, ToolFileFormat *format) { struct FileDescription_struct *dt; GList *lst; gchar *oldName; g_return_if_fail(data && file); DBG_fprintf(stderr, "Visu Data: adding '%s' filename (key: %d) to the VisuData %p.\n", file, kind, (gpointer)data); oldName = (gchar*)0; dt = (struct FileDescription_struct*)0; for (lst = data->priv->files; lst; lst = g_list_next(lst)) if (((struct FileDescription_struct*)lst->data)->kind == kind) dt = (struct FileDescription_struct*)lst->data; if (!dt) { dt = g_malloc(sizeof(struct FileDescription_struct)); dt->kind = kind; data->priv->files = g_list_prepend(data->priv->files, (gpointer)dt); } else oldName = dt->name; dt->name = tool_path_normalize(file); dt->format = format; if (oldName) { DBG_fprintf(stderr, "Visu Data: freeing name %p.\n", (gpointer)dt->name); g_free(oldName); } g_signal_emit(G_OBJECT(data), visu_data_signals[FILES_CHANGED_SIGNAL], 0, kind, NULL); } /** * visu_data_removeAllFiles: * @data: a #VisuData object. * * This method is used to empty the list of * known file from the given @data. */ void visu_data_removeAllFiles(VisuData *data) { GList *lst; g_return_if_fail(VISU_IS_DATA(data)); lst = data->priv->files; while (lst) { g_free(((struct FileDescription_struct*)lst->data)->name); g_free(lst->data); lst = g_list_next(lst); } g_list_free(data->priv->files); data->priv->files = (GList*)0; visu_data_setNSubset(data, 1); } /** * visu_data_getFile: * @data: a #VisuData object. * @kind: an integer to qualify the required file ; * @format: a location for a file format (can be NULL). * * This prototype is used to retrieve stored * files identify by their @kind. * * Returns: the name of a file (it should not be deleted). */ const gchar* visu_data_getFile(VisuData *data, int kind, ToolFileFormat **format) { GList *lst; g_return_val_if_fail(VISU_IS_DATA(data), (gchar*)0); DBG_fprintf(stderr, "Visu Data: retrieve filename with key %d" " from the VisuData %p.\n", kind, (gpointer)data); if (format) *format = (ToolFileFormat*)0; for (lst = data->priv->files; lst; lst = g_list_next(lst)) if (((struct FileDescription_struct*)lst->data)->kind == kind) { if (format) *format = ((struct FileDescription_struct*)lst->data)->format; DBG_fprintf(stderr, " | '%s'\n", ((struct FileDescription_struct*)lst->data)->name); return ((struct FileDescription_struct*)lst->data)->name; } return (gchar*)0; } /** * visu_data_getFilesAsLabel: * @data: a #VisuData object. * * Creates a label using the list of files used to defined this @data * separated by dashes. * * Since: 3.6 * * Returns: a newly created string with the filenames. If no filename * were used to defined @data, the function returns NULL. */ gchar* visu_data_getFilesAsLabel(const VisuData *data) { GList *lst; GString *str; gchar *s; g_return_val_if_fail(VISU_IS_DATA(data), (gchar*)0); if (!data->priv->files) return (gchar*)0; DBG_fprintf(stderr, "Visu Data: retrieve all filenames" " from the VisuData %p.\n", (gpointer)data); str = g_string_new(""); for (lst = data->priv->files->next; lst; lst = g_list_next(lst)) { s = g_path_get_basename(((struct FileDescription_struct*)lst->data)->name); g_string_append_printf(str, "\302\240\342\200\224 %s", s); g_free(s); } s = g_path_get_basename(((struct FileDescription_struct*)data->priv->files->data)->name); g_string_prepend(str, s); g_free(s); DBG_fprintf(stderr, " | '%s'\n", str->str); return g_string_free(str, FALSE); } /** * visu_data_setFileCommentary: * @data: a #VisuData object ; * @commentary: the message to be stored (null terminated) ; * @iSet: an integer. * * This method is used to store a description of the given @data. This * string is copied and @commentary can be freed. Before using this * method, the number of possible node sets must have been defined * using visu_data_setNSubset(), if not, only iSet == 0 is allowed. */ void visu_data_setFileCommentary(VisuData *data, gchar* commentary, gint iSet) { g_return_if_fail(VISU_IS_DATA(data) && iSet >= 0 && iSet < data->priv->nSets); g_free(data->priv->commentary[iSet]); data->priv->commentary[iSet] = g_strdup(commentary); } /** * visu_data_getFileCommentary: * @data: a #VisuData object ; * @iSet: an integer (>= 0). * * Get the commentary associated to the given @data, for the given * node set. * * Returns: a string description (possibly empty). This string is own by V_Sim * and should not be freed. */ gchar* visu_data_getFileCommentary(VisuData *data, gint iSet) { g_return_val_if_fail(VISU_IS_DATA(data) && iSet >= 0 && iSet < data->priv->nSets, (gchar*)0); return data->priv->commentary[iSet]; } /** * visu_data_setNSubset: * @data: a #VisuData object ; * @nSet: an integer. * * Change the number of available sets of nodes for this * #VisuData. This has a side effect to delete all previously saved * file commentaries (see visu_data_setFileCommentary()). */ void visu_data_setNSubset(VisuData *data, int nSet) { int i; g_return_if_fail(VISU_IS_DATA(data) && nSet > 0); data->priv->nSets = nSet; if (data->priv->commentary) g_strfreev(data->priv->commentary); data->priv->commentary = g_malloc(sizeof(gchar*) * (nSet + 1)); for (i = 0; i < nSet; i++) data->priv->commentary[i] = g_strdup(""); data->priv->commentary[nSet] = (gchar*)0; } /** * visu_data_getNSubset: * @data: a #VisuData object. * * Retrieve the number of available sets of nodes for this #VisuData, * see visu_data_setNSubset(). * * Returns: the number of set of nodes (1 is default). */ int visu_data_getNSubset(VisuData *data) { g_return_val_if_fail(VISU_IS_DATA(data), 1); return data->priv->nSets; } /** * visu_data_setISubset: * @data: a #VisuData object ; * @iSet: an integer. * * Change the current id of the set of data (ordered as in C, * beginning at 0). */ void visu_data_setISubset(VisuData *data, int iSet) { g_return_if_fail(VISU_IS_DATA(data)); DBG_fprintf(stderr, "Visu Data: set id to %d (%d).\n", iSet, data->priv->nSets); g_return_if_fail(iSet >= 0 && iSet < data->priv->nSets); data->priv->iSet = iSet; } /** * visu_data_getISubset: * @data: a #VisuData object. * * Retrieve the id of the current set of data (ordered as in C, * beginning at 0). * * Returns: the id of the set of nodes currently loaded, -1 if none. */ int visu_data_getISubset(VisuData *data) { g_return_val_if_fail(VISU_IS_DATA(data), -1); DBG_fprintf(stderr, "Visu Data: get current set id %d.\n", data->priv->iSet); return data->priv->iSet; } /** * visu_data_setChangeElementFlag: * @data: a #VisuData object ; * @changeElement: a boolean. * * This method is mainly used by internal gears to set a flag. This flag control * if the @data object has the same #VisuElement objects than the previously rendered one. */ void visu_data_setChangeElementFlag(VisuData *data, gboolean changeElement) { gboolean *val; g_return_if_fail(data); /* Test if already exists */ val = (gboolean*)g_object_get_data(G_OBJECT(data), "changeElementListFlag"); if (!val) { val = g_malloc(sizeof(gboolean)); g_object_set_data_full(G_OBJECT(data), "changeElementListFlag", val, g_free); } *val = changeElement; } /** * visu_data_getChangeElementFlag: * @data: a #VisuData object. * * V_Sim can use a flag set on @data object to know if @data has exactly the same * #VisuElement list than the previously rendered one. * * Returns: TRUE if the previously rendered #VisuData object has had the same * #VisuElement list than the given one, FALSE otherwise. */ gboolean visu_data_getChangeElementFlag(VisuData *data) { gboolean *val; g_return_val_if_fail(data, FALSE); val = (gboolean*)g_object_get_data(G_OBJECT(data), "changeElementListFlag"); if (val) return *val; else return FALSE; } /*************************/ /* The geometry routines */ /*************************/ static VisuBox* visu_data_getBox(VisuBoxed *self) { g_return_val_if_fail(VISU_IS_DATA(self), (VisuBox*)0); if (!VISU_DATA(self)->priv->box) { g_error("No box."); } return VISU_DATA(self)->priv->box; } static gboolean visu_data_setBox(VisuBoxed *self, VisuBox *box, gboolean update _U_) { VisuData *data; g_return_val_if_fail(VISU_IS_DATA(self), FALSE); data = VISU_DATA(self); if (data->priv->box == box) return FALSE; if (data->priv->box) { if (data->priv->unit_signal) g_signal_handler_disconnect(G_OBJECT(data->priv->box), data->priv->unit_signal); g_object_unref(data->priv->box); } data->priv->box = box; if (box) { g_object_ref(box); data->priv->unit_signal = g_signal_connect(G_OBJECT(data->priv->box), "UnitChanged", G_CALLBACK(onBoxUnitChanged), (gpointer)data); } return TRUE; } /** * visu_data_getXYZtranslation: * @data: a #VisuData object. * * The nodes are rendered at thier coordinates plus a translation. This method * allows to retrieve that translation. * * Returns: (array fixed-size=3) (transfer full): a newly allocated * array of 3 floats. It should be freed with a call to free() after * use. */ float* visu_data_getXYZtranslation(VisuData* data) { float *trans; g_return_val_if_fail(VISU_IS_DATA(data), (float*)0); trans = g_malloc(sizeof(float) * 3); trans[0] = data->priv->translation[0]; trans[1] = data->priv->translation[1]; trans[2] = data->priv->translation[2]; return trans; } /** * visu_data_forceXYZtranslation: * @data: a #VisuData object. * @xyz: (in) (array fixed-size=3): three floats in cartesian representation. * * Apply the given box translation without paying attention to the box * boundary conditions. See visu_data_setXYZtranslation() for a method * respecting the periodicity. * * Since: 3.7 * * Returns: if returns TRUE, the VisuNodeArray::PositionChanged signal should be emitted. */ gboolean visu_data_forceXYZtranslation(VisuData* data, float xyz[3]) { gboolean res; g_return_val_if_fail(VISU_IS_DATA(data) && xyz, 0); res = FALSE; if (data->priv->translation[0] != xyz[0]) { data->priv->translation[0] = xyz[0]; res = TRUE; } if (data->priv->translation[1] != xyz[1]) { data->priv->translation[1] = xyz[1]; res = TRUE; } if (data->priv->translation[2] != xyz[2]) { data->priv->translation[2] = xyz[2]; res = TRUE; } DBG_fprintf(stderr, "Visu Data: force translation to: %f %f %f\n", data->priv->translation[0], data->priv->translation[1], data->priv->translation[2]); if (res) g_signal_emit(data, visu_data_signals[TRANSLATIONS_CHANGED_SIGNAL], 0, NULL); return res; } /** * visu_data_setXYZtranslation: * @data: a #VisuData object ; * @xyz: (in) (array fixed-size=3): an array of floating point values. * * This set the translations of the specified #VisuData whatever previous values. * The translation is done in the orthonormal referential, not the referential of * the box. * * Returns: if returns TRUE, the VisuNodeArray::PositionChanged signal should be emitted. */ gboolean visu_data_setXYZtranslation(VisuData* data, float xyz[3]) { VisuBoxBoundaries bc; float xyz_[3]; g_return_val_if_fail(VISU_IS_DATA(data) && xyz, 0); xyz_[0] = data->priv->translation[0]; xyz_[1] = data->priv->translation[1]; xyz_[2] = data->priv->translation[2]; bc = visu_box_getBoundary(data->priv->box); if (bc != VISU_BOX_FREE && bc != VISU_BOX_SURFACE_YZ) xyz_[0] = xyz[0]; if (bc != VISU_BOX_FREE && bc != VISU_BOX_SURFACE_ZX) xyz_[1] = xyz[1]; if (bc != VISU_BOX_FREE && bc != VISU_BOX_SURFACE_XY) xyz_[2] = xyz[2]; return visu_data_forceXYZtranslation(data, xyz_); } /** * visu_data_getNodeBoxFromNumber: * @data: a #VisuData object. * @nodeId: the index of the node considered. * @nodeBox: (in) (array fixed-size=3): the array to store the box of the node. * * This method retrieves the value of the box associated to a node (with respect to the unit cell). * * Returns: TRUE if everything went well, FALSE otherwise. The box is stored in the nodeBox array. */ gboolean visu_data_getNodeBoxFromNumber(VisuData *data, guint nodeId, int nodeBox[3]) { float xcart[3]; g_return_val_if_fail(VISU_IS_DATA(data), FALSE); visu_data_getNodePosition(data, visu_node_array_getFromId(VISU_NODE_ARRAY(data),nodeId), xcart); visu_data_getNodeBoxFromCoord(data, xcart, nodeBox); return TRUE; } /** * visu_data_getNodeBoxFromCoord: * @data: a #VisuData object. * @xcart: (in) (array fixed-size=3): the coordinates of a node. * @nodeBox: (in) (array fixed-size=3): the array to store the box of the node. * * This method retrieves the value of the box associated to the coordinates of the node (with respect to the unit cell). * * Returns: TRUE if everything went well, FALSE otherwise. The box is stored in the nodeBox array. */ gboolean visu_data_getNodeBoxFromCoord(VisuData *data, float xcart[3], int nodeBox[3]) { float xred[3]; visu_box_convertXYZtoBoxCoordinates(data->priv->box, xred, xcart); nodeBox[0] = floor(xred[0]); nodeBox[1] = floor(xred[1]); nodeBox[2] = floor(xred[2]); DBG_fprintf(stderr, "Visu Data: nodeBox found for atom at %f %f %f : %d %d %d.\n", xcart[0], xcart[1], xcart[2], nodeBox[0], nodeBox[1], nodeBox[2]); return TRUE; } static void onBoxUnitChanged(VisuBox *box, gfloat fact, gpointer user_data) { VisuData *data = VISU_DATA(user_data); VisuNodeArrayIter iter; DBG_fprintf(stderr, "Visu Data: caught 'UnitChanged' signal with factor %g.\n", fact); /* We do an homothety on the nodes. */ data->priv->translation[0] *= fact; data->priv->translation[1] *= fact; data->priv->translation[2] *= fact; visu_node_array_iterNew(VISU_NODE_ARRAY(data), &iter); for( visu_node_array_iterStart(VISU_NODE_ARRAY(data), &iter); iter.node; visu_node_array_iterNext(VISU_NODE_ARRAY(data), &iter)) { iter.node->xyz[0] *= fact; iter.node->xyz[1] *= fact; iter.node->xyz[2] *= fact; iter.node->translation[0] *= fact; iter.node->translation[1] *= fact; iter.node->translation[2] *= fact; } /* We raise the signals. */ g_signal_emit_by_name(G_OBJECT(data), "PositionChanged", (VisuElement*)0, NULL); /* Update the margin with the new AllNodeExtens. */ visu_box_setMargin(box, visu_node_array_getMaxElementSize(VISU_NODE_ARRAY(data)) + visu_data_getAllNodeExtens(data, (VisuBox*)0), FALSE); DBG_fprintf(stderr, "Visu Data: done 'UnitChanged'.\n"); } /** * visu_data_constrainedElementInTheBox: * @data: a #VisuData object ; * @element: a #VisuElement object. * * Check all the nodes of the specified @element and change their coordinates if they are out * of the bounding box. The position of each node is the result of the * sum of their own position and of the box translation. * * Returns: if returns TRUE, the VisuNodeArray::PositionChanged signal should be emitted. */ gboolean visu_data_constrainedElementInTheBox(VisuData *data, VisuElement *element) { gboolean changed; float cartCoord[3], t[3]; VisuNodeArrayIter iter; g_return_val_if_fail(VISU_IS_DATA(data) && element, FALSE); if (!element->rendered) return FALSE; DBG_fprintf(stderr, "Visu Data: Checking for nodes of element '%s'" " to be in the box.\n", element->name); changed = FALSE; visu_node_array_iterNew(VISU_NODE_ARRAY(data), &iter); iter.element = element; for(visu_node_array_iterRestartNode(VISU_NODE_ARRAY(data), &iter); iter.node; visu_node_array_iterNextNode(VISU_NODE_ARRAY(data), &iter)) { visu_data_getNodePosition(data, iter.node, cartCoord); if (visu_box_constrainInside(data->priv->box, t, cartCoord, TRUE)) { changed = TRUE; iter.node->translation[0] += t[0]; iter.node->translation[1] += t[1]; iter.node->translation[2] += t[2]; } } data->priv->translationApply = TRUE; return changed; } /** * visu_data_constrainedInTheBox: * @data: a #VisuData object. * * It does the same things that visu_data_constrainedElementInTheBox() but for all * the #VisuElement of the given @data. I.e. it checks all the nodes and changes * their coordinates if they are out of the bounding box. * The position of each node is the result of the * sum of their own position and of the box translation. * * Returns: if returns TRUE, the VisuNodeArray::PositionChanged signal should be emitted. */ gboolean visu_data_constrainedInTheBox(VisuData *data) { VisuNodeArrayIter iter; gboolean changed; g_return_val_if_fail(VISU_IS_DATA(data), 0); changed = FALSE; visu_node_array_iterNew(VISU_NODE_ARRAY(data), &iter); for (visu_node_array_iterStart(VISU_NODE_ARRAY(data), &iter); iter.element; visu_node_array_iterNextElement(VISU_NODE_ARRAY(data), &iter)) changed = visu_data_constrainedElementInTheBox (data, iter.element) || changed; data->priv->translationApply = TRUE; return changed; } /** * visu_data_constrainedFree: * @data: a #VisuData object. * * Return all the nodes to their original position, except for the * global translation. * * Returns: if returns TRUE, the VisuNodeArray::PositionChanged signal should be emitted. */ gboolean visu_data_constrainedFree(VisuData *data) { VisuNodeArrayIter iter; g_return_val_if_fail(VISU_IS_DATA(data), 0); visu_node_array_iterNew(VISU_NODE_ARRAY(data), &iter); for (visu_node_array_iterStart(VISU_NODE_ARRAY(data), &iter); iter.node; visu_node_array_iterNext(VISU_NODE_ARRAY(data), &iter)) { iter.node->translation[0] = 0.; iter.node->translation[1] = 0.; iter.node->translation[2] = 0.; } data->priv->translationApply = FALSE; return TRUE; } /** * visu_data_getTranslationStatus: * @data: a #VisuData object. * * When a translation is applied (even with a [0,0,0] vector), the * nodes are shifted to be in the box. This routine returns the * translation status of all nodes. If one of them is translated, then * return value is TRUE. * * Returns: if one of the nodes is shifted. */ gboolean visu_data_getTranslationStatus(VisuData *data) { g_return_val_if_fail(VISU_IS_DATA(data), FALSE); DBG_fprintf(stderr, "Visu Data: retrieve translation status (%d).\n", data->priv->translationApply); return data->priv->translationApply; } /** * visu_data_setTightBox: * @data: a #VisuData object. * * Calculate the box geometry to have a tight box in directions that * are not periodic. If some directions are still periodic, the box * size in these directions should be setup first with * visu_box_setGeometry(). * * Returns: (transfer none): a new #VisuBox if @data had not one * before, or the modified box of @data. */ VisuBox* visu_data_setTightBox(VisuData *data) { double xMin, yMin, zMin, xMax, yMax, zMax, xFree, yFree, zFree; double boxGeometry[6], boxGeometry_[6]; float xyz[3]; VisuNodeArrayIter iter; VisuBoxBoundaries bc; guint i; VisuBox *box; g_return_val_if_fail(VISU_IS_DATA(data), (VisuBox*)0); if (!data->priv->box) { for (i = 0; i < VISU_BOX_N_VECTORS; i++) boxGeometry_[i] = 0.; box = visu_box_new(boxGeometry_, VISU_BOX_FREE); visu_boxed_setBox(VISU_BOXED(data), VISU_BOXED(box), FALSE); g_object_unref(box); } bc = visu_box_getBoundary(data->priv->box); if (bc == VISU_BOX_PERIODIC) return data->priv->box; /* Store the coordinates */ xMin = 1e5; yMin = 1e5; zMin = 1e5; xMax = -1e5; yMax = -1e5; zMax = -1e5; xFree = (bc == VISU_BOX_FREE || bc == VISU_BOX_SURFACE_YZ)?1.:0.; yFree = (bc == VISU_BOX_FREE || bc == VISU_BOX_SURFACE_ZX)?1.:0.; zFree = (bc == VISU_BOX_FREE || bc == VISU_BOX_SURFACE_XY)?1.:0.; visu_node_array_iterNew(VISU_NODE_ARRAY(data), &iter); for (visu_node_array_iterStart(VISU_NODE_ARRAY(data), &iter); iter.node; visu_node_array_iterNext(VISU_NODE_ARRAY(data), &iter)) { xMin = MIN(xMin, iter.node->xyz[0]); yMin = MIN(yMin, iter.node->xyz[1]); zMin = MIN(zMin, iter.node->xyz[2]); xMax = MAX(xMax, iter.node->xyz[0]); yMax = MAX(yMax, iter.node->xyz[1]); zMax = MAX(zMax, iter.node->xyz[2]); } DBG_fprintf(stderr, "Visu Data: the elements are in [%f, %f]x[%f, %f]x[%f, %f].\n", xMin, xMax, yMin, yMax, zMin, zMax); for (i = 0; i < VISU_BOX_N_VECTORS; i++) boxGeometry_[i] = visu_box_getGeometry(data->priv->box, i); boxGeometry[0] = (xMax - xMin + 1e-5) * xFree + (1. - xFree) * boxGeometry_[0]; boxGeometry[1] = 0. + (1. - yFree) * boxGeometry_[1]; boxGeometry[2] = (yMax - yMin + 1e-5) * yFree + (1. - yFree) * boxGeometry_[2]; boxGeometry[3] = 0. + (1. - zFree) * boxGeometry_[3]; boxGeometry[4] = 0. + (1. - zFree) * boxGeometry_[4]; boxGeometry[5] = (zMax - zMin + 1e-5) * zFree + (1. - zFree) * boxGeometry_[5]; visu_box_setGeometry(data->priv->box, boxGeometry); xyz[0] = -xMin * xFree; xyz[1] = -yMin * yFree; xyz[2] = -zMin * zFree; data->priv->translationApply = TRUE; visu_data_forceXYZtranslation(data, xyz); return data->priv->box; } /** * visu_data_replicate: * @data: a #VisuData object ; * @extension: (in) (array fixed-size=3): three floating point values ; * * This routine will create (or remove) nodes to expand the initial box to * the required size. An extension of 0 means no extension, i.e. the initial * box. The extension is done symmetrically in each direction toward negative * and positive direction. * * To remove added nodes, see visu_data_restore(). * * returns: TRUE if the redraw should be done. */ gboolean visu_data_replicate(VisuData *data, float extension[3]) { int i; gboolean changed; /* Will store the index of removed or added nodes, always finish by -1. The two first values are specific and used to store: - the current number of index ; - the allocated size of the array (not including these two specific values and the -1 at the end. */ int *index; float extension0[3]; g_return_val_if_fail(VISU_IS_DATA(data), FALSE); g_return_val_if_fail(extension[0] >= 0. && extension[1] >= 0. && extension[2] >= 0., FALSE); /* Keep only three digits for the extension to avoid rounding troubles. */ extension[0] = (float)((int)(extension[0] * 1000)) / 1000; extension[1] = (float)((int)(extension[1] * 1000)) / 1000; extension[2] = (float)((int)(extension[2] * 1000)) / 1000; DBG_fprintf(stderr, "Visu Data: modify extension (%g, %g, %g).\n", extension[0], extension[1], extension[2]); visu_box_getExtension(data->priv->box, extension0); for (i = 0; i < 3; i++) { if (extension0[i] > extension[i]) { index = shrinkNodeList(data, i, extension[i]); if (index) { /* We finish the list with -1. */ index[index[0] + 2] = -1; visu_node_array_removeNodes(VISU_NODE_ARRAY(data), index + 2); g_free(index); } } else if (extension0[i] < extension[i]) { index = extendNodeList(data, i, extension0[i], extension[i]); if (index) { /* We finish the list with -1. */ index[index[0] + 2] = -1; DBG_fprintf(stderr, "Visu Data: emit a " "'PopulationIncrease' signal.\n"); g_signal_emit_by_name(G_OBJECT(data), "PopulationIncrease", (gpointer)index, NULL); g_free(index); } } } changed = visu_box_setExtension(data->priv->box, extension); if (DEBUG) visu_node_array_traceProperty(VISU_NODE_ARRAY(data), "originalId"); return changed; } /** * visu_data_restore: * @data: a #VisuData object. * * Remove all nodes that have been added by a visu_data_replicate() * call. * * Returns: TRUE if some nodes has been indeed removed. */ gboolean visu_data_restore(VisuData *data) { float zeros[3] = {0.f, 0.f, 0.f}; g_return_val_if_fail(VISU_IS_DATA(data), FALSE); visu_box_setExtension(data->priv->box, zeros); return visu_node_array_removeAllDuplicateNodes(VISU_NODE_ARRAY(data)); } static int* reallocIndexList(int *index, int size) { int currentSize; if (index) currentSize = index[1]; else currentSize = 0; index = g_realloc(index, sizeof(int) * (currentSize + size + 3)); index[0] = currentSize; index[1] = currentSize + size; DBG_fprintf(stderr, "Visu Data: realloc internal index list (%d %d).\n", index[0], index[1]); return index; } static int* addIndexList(int *index, int value, int size) { if (!index || index[0] == index[1]) index = reallocIndexList(index, size); index[index[0] + 2] = value; index[0] += 1; return index; } static int* shrinkNodeList(VisuData *data, int coord, float valueTo) { float cartCoord[3], boxCoord[3]; int *index; VisuNodeArrayIter iter; g_return_val_if_fail(coord == 0 || coord == 1 || coord == 2, FALSE); g_return_val_if_fail(valueTo >= 0.f, FALSE); DBG_fprintf(stderr, "Visu Data: shrink to %g (%d).\n", valueTo, coord); index = (int*)0; visu_node_array_iterNew(VISU_NODE_ARRAY(data), &iter); for (visu_node_array_iterStart(VISU_NODE_ARRAY(data), &iter); iter.node; visu_node_array_iterNext(VISU_NODE_ARRAY(data), &iter)) { cartCoord[0] = iter.node->xyz[0] + data->priv->translation[0] + iter.node->translation[0]; cartCoord[1] = iter.node->xyz[1] + data->priv->translation[1] + iter.node->translation[1]; cartCoord[2] = iter.node->xyz[2] + data->priv->translation[2] + iter.node->translation[2]; visu_box_convertXYZtoBoxCoordinates(data->priv->box, boxCoord, cartCoord); if ((boxCoord[coord] < - valueTo - 1e-6 || /* We are out on the low coord. */ boxCoord[coord] >= 1.f + valueTo -1e-6) && /* We are out on the high coord. */ visu_node_array_getOriginal(VISU_NODE_ARRAY(data), iter.node->number) >= 0) /* We remove the element. */ index = addIndexList(index, iter.node->number, visu_node_array_getNNodes(VISU_NODE_ARRAY(data))); DBG_fprintf(stderr, "Visu Data: test shrink for %d: %d %15.12fx%15.12fx%15.12f.\n", iter.node->number, (index)?index[0]:0, boxCoord[0], boxCoord[1], boxCoord[2]); } return index; } static int* extendNodeList(VisuData *data, int coord, float valueFrom, float valueTo) { int k, id; unsigned nb, nbInit; VisuNode *newNode; float cartCoord[3], boxCoord[3], ratio; int *index; VisuNodeArrayIter iter; g_return_val_if_fail(coord == 0 || coord == 1 || coord == 2, FALSE); g_return_val_if_fail(valueTo > valueFrom, FALSE); DBG_fprintf(stderr, "Visu Data: expand in %d direction to %g.\n", coord, valueTo); DBG_fprintf(stderr, " | k runs in [%d %d[ ]%d %d].\n", (int)floor(-valueTo), -(int)valueFrom, (int)valueFrom, (int)ceil(valueTo)); DBG_fprintf(stderr, " | keeps new ele in [%g %g] [%g %g].\n", -valueTo, -valueFrom, valueFrom + 1.f, valueTo + 1.f); index = (int*)0; /* We estimate the number of data to be added and we call a realloc of this amount now to avoid to much small reallocations. The slab of box to be extend is 2*(valueTo-extension[coord]). So the volume in box coordinates is the same value and since the volume in box coordinates is product(1+2*extension), the ratio of new space is the fraction. So we realloc all elements on this ratio. */ ratio = (2.f * (valueTo - valueFrom)) / (1.f + 2.f * valueFrom); visu_node_array_iterNew(VISU_NODE_ARRAY(data), &iter); for (visu_node_array_iterStart(VISU_NODE_ARRAY(data), &iter); iter.element; visu_node_array_iterNextElement(VISU_NODE_ARRAY(data), &iter)) { nb = (int)ceil((float)iter.nStoredNodes * ratio); visu_node_array_allocateNodesForElement(VISU_NODE_ARRAY(data), iter.iElement, iter.nStoredNodes + nb); } /* All node with an id higher than nbInit are considered as new nodes. */ nbInit = G_MAXUINT; for (visu_node_array_iterStartNumber(VISU_NODE_ARRAY(data), &iter); iter.node; visu_node_array_iterNextNodeNumber(VISU_NODE_ARRAY(data), &iter)) { /* Do not duplicate the new nodes. */ if (iter.node->number > nbInit) continue; cartCoord[0] = iter.node->xyz[0] + data->priv->translation[0] + iter.node->translation[0]; cartCoord[1] = iter.node->xyz[1] + data->priv->translation[1] + iter.node->translation[1]; cartCoord[2] = iter.node->xyz[2] + data->priv->translation[2] + iter.node->translation[2]; visu_box_convertXYZtoBoxCoordinates(data->priv->box, boxCoord, cartCoord); for (k = (int)floor(-valueTo); k < (int)ceil(valueTo) + 1; k++) { if (k >= -(int)valueFrom && k < (int)valueFrom + 1) continue; boxCoord[coord] += (float)k; if ((boxCoord[coord] >= -valueTo && boxCoord[coord] < -valueFrom ) || (boxCoord[coord] < valueTo + 1.f && boxCoord[coord] >= valueFrom + 1.f)) { DBG_fprintf(stderr, "Visu Data: replicating node %d, (%d)" " (%15.12fx%15.12fx%15.12f).\n", iter.node->number, coord, boxCoord[0], boxCoord[1], boxCoord[2]); /* We save the current node id, because the pointer may be relocated by the visu_node_array_getCopyNode() call. */ id = iter.node->number; /* We create and add a new element. */ newNode = visu_node_array_getCopyNode(VISU_NODE_ARRAY(data), iter.node); index = addIndexList(index, newNode->number, visu_node_array_getNNodes(VISU_NODE_ARRAY(data))); if (nbInit == G_MAXUINT) nbInit = newNode->number - 1; visu_box_convertBoxCoordinatestoXYZ(data->priv->box, newNode->xyz, boxCoord); newNode->xyz[0] -= data->priv->translation[0] + newNode->translation[0]; newNode->xyz[1] -= data->priv->translation[1] + newNode->translation[1]; newNode->xyz[2] -= data->priv->translation[2] + newNode->translation[2]; /* We reset the iter.node pointer. */ iter.node = visu_node_array_getFromId(VISU_NODE_ARRAY(data), id); } boxCoord[coord] -= (float)k; } } return index; } /** * visu_data_getAllNodeExtens: * @dataObj: a #VisuData object. * @box: (allow-none): a #VisuBox object. * * Calculate the longest distance between the surface of @box (without * extension) and all the nodes. If @box is NULL, then the internal * box of @dataObj is used. * * Since: 3.7 * * Returns: the longest distance between the surface of @box (without * extension) and all the nodes. **/ gfloat visu_data_getAllNodeExtens(VisuData *dataObj, VisuBox *box) { VisuNodeArrayIter iter; float xyz[2][3], t[3], lg[2], coord[3]; g_return_val_if_fail(VISU_IS_DATA(dataObj), 0.f); if (!box) box = dataObj->priv->box; t[0] = (float)(visu_box_getGeometry(box, VISU_BOX_DXX) + visu_box_getGeometry(box, VISU_BOX_DYX) + visu_box_getGeometry(box, VISU_BOX_DZX)); t[1] = (float)(visu_box_getGeometry(box, VISU_BOX_DYY) + visu_box_getGeometry(box, VISU_BOX_DZY)); t[2] = (float)(visu_box_getGeometry(box, VISU_BOX_DZZ)); xyz[0][0] = xyz[0][1] = xyz[0][2] = 0.f; xyz[1][0] = xyz[1][1] = xyz[1][2] = 0.f; visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter); for (visu_node_array_iterStart(VISU_NODE_ARRAY(dataObj), &iter); iter.node; visu_node_array_iterNext(VISU_NODE_ARRAY(dataObj), &iter)) { visu_data_getNodePosition(dataObj, iter.node, coord); xyz[0][0] = MIN(xyz[0][0], coord[0]); xyz[0][1] = MIN(xyz[0][1], coord[1]); xyz[0][2] = MIN(xyz[0][2], coord[2]); xyz[1][0] = MAX(xyz[1][0], coord[0]); xyz[1][1] = MAX(xyz[1][1], coord[1]); xyz[1][2] = MAX(xyz[1][2], coord[2]); } xyz[1][0] -= t[0]; xyz[1][1] -= t[1]; xyz[1][2] -= t[2]; /* Compute the longest vector out of the box. */ lg[0] = sqrt(xyz[0][0] * xyz[0][0] + xyz[0][1] * xyz[0][1] + xyz[0][2] * xyz[0][2]); lg[1] = sqrt(xyz[1][0] * xyz[1][0] + xyz[1][1] * xyz[1][1] + xyz[1][2] * xyz[1][2]); DBG_fprintf(stderr, "VisuData: vectors outside of the box %g %g.\n", lg[0], lg[1]); return MAX(lg[0], lg[1]); } /** * visu_data_getDistanceList: * @data: a #VisuData object ; * @nodeId: a node id. * @minVal: a location for a float. * * This routine creates an array of #VisuNodeInfo, storing for each * node its node id and its distance to @nodeId. The periodicity is * NOT taken into account. The array is not distance sorted, but if * @minVal is provided, it will contain the minimal distance between * @nodeId and the other nodes. * * Since: 3.5 * * Returns: an array of #VisuNodeInfo of size the number of nodes. It * is terminated by @nodeId value itself. */ VisuNodeInfo* visu_data_getDistanceList(VisuData *data, guint nodeId, float *minVal) { VisuNodeInfo *infos; int nNodes; VisuNodeArrayIter iter; VisuNode *nodeRef; float xyz[3], xyzRef[3], min; g_return_val_if_fail(VISU_IS_DATA(data), (VisuNodeInfo*)0); DBG_fprintf(stderr, "Visu Data: get distance list for node %d.\n", nodeId); nodeRef = visu_node_array_getFromId(VISU_NODE_ARRAY(data), nodeId); g_return_val_if_fail(nodeRef, (VisuNodeInfo*)0); nNodes = visu_node_array_getNNodes(VISU_NODE_ARRAY(data)); infos = g_malloc(sizeof(VisuNodeInfo) * nNodes); visu_data_getNodePosition(data, nodeRef, xyzRef); min = G_MAXFLOAT; nNodes = 0; visu_node_array_iterNew(VISU_NODE_ARRAY(data), &iter); for (visu_node_array_iterStart(VISU_NODE_ARRAY(data), &iter); iter.node; visu_node_array_iterNextVisible(VISU_NODE_ARRAY(data), &iter)) { infos[nNodes].id = iter.node->number; visu_data_getNodePosition(data, iter.node, xyz); infos[nNodes].dist = (xyz[0] - xyzRef[0]) * (xyz[0] - xyzRef[0]) + (xyz[1] - xyzRef[1]) * (xyz[1] - xyzRef[1]) + (xyz[2] - xyzRef[2]) * (xyz[2] - xyzRef[2]); if (infos[nNodes].dist > 0.0001f) { min = MIN(min, infos[nNodes].dist); nNodes += 1; } } infos[nNodes].id = nodeId; DBG_fprintf(stderr, " | min value = %g.\n", min); if (minVal) *minVal = min; return infos; } /** * visu_data_setNewBasisFromNodes: * @data: a #VisuData object. * @nO: the index of node as origin. * @nA: the index of node on X axis. * @nB: the index of node as Y axis. * @nC: the index of node as Z axis. * * Change the basis set by providing the new basis set from a list of * nodes. See also visu_data_setNewBasis(). Nodes outside the new box * are killed. * * Since: 3.6 * * Returns: TRUE if the new basis set is valid. */ gboolean visu_data_setNewBasisFromNodes(VisuData *data, guint nO, guint nA, guint nB, guint nC) { VisuNode *orig, *nodeA, *nodeB, *nodeC; float matA[3][3], O[3], xyz[3]; orig = visu_node_array_getFromId(VISU_NODE_ARRAY(data), nO); DBG_fprintf(stderr, " orig = %p\n", (gpointer)orig); nodeA = visu_node_array_getFromId(VISU_NODE_ARRAY(data), nA); DBG_fprintf(stderr, " nodeA = %p\n", (gpointer)nodeA); nodeB = visu_node_array_getFromId(VISU_NODE_ARRAY(data), nB); DBG_fprintf(stderr, " nodeB = %p\n", (gpointer)nodeB); nodeC = visu_node_array_getFromId(VISU_NODE_ARRAY(data), nC); DBG_fprintf(stderr, " nodeC = %p\n", (gpointer)nodeC); g_return_val_if_fail(orig && nodeA && nodeB && nodeC, FALSE); visu_data_getNodePosition(data, orig, O); visu_data_getNodePosition(data, nodeA, xyz); matA[0][0] = xyz[0] - O[0]; matA[1][0] = xyz[1] - O[1]; matA[2][0] = xyz[2] - O[2]; visu_data_getNodePosition(data, nodeB, xyz); matA[0][1] = xyz[0] - O[0]; matA[1][1] = xyz[1] - O[1]; matA[2][1] = xyz[2] - O[2]; visu_data_getNodePosition(data, nodeC, xyz); matA[0][2] = xyz[0] - O[0]; matA[1][2] = xyz[1] - O[1]; matA[2][2] = xyz[2] - O[2]; return visu_data_setNewBasis(data, matA, O); } /** * visu_data_setNewBasis: * @data: a #VisuData object. * @matA: a basis set definition. * @O: the origin cartesian coordinates. * * Change the basis set of @data according to the new definition given * by @matA and @O. Nodes outside the new box are killed. See also * visu_data_setNewBasisFromNodes() for a convenient function using * nodes as basis set definition. * * Since: 3.6 * * Returns: TRUE if the new basis set is valid. */ gboolean visu_data_setNewBasis(VisuData *data, float matA[3][3], float O[3]) { double mat_[3][3]; float inv[3][3], vect[3], xred[3]; double box[6]; float vectEps[3], deltaEps[3]; VisuNodeArrayIter iter; int *rmNodes, i; float zeros[3] = {0.f, 0.f, 0.f}; #define EPS 1.e-5 DBG_fprintf(stderr, "Visu Data: basis matrice:\n"); DBG_fprintf(stderr, " (%10.5f %10.5f %10.5f)\n", matA[0][0], matA[0][1], matA[0][2]); DBG_fprintf(stderr, " (%10.5f %10.5f %10.5f)\n", matA[1][0], matA[1][1], matA[1][2]); DBG_fprintf(stderr, " (%10.5f %10.5f %10.5f)\n", matA[2][0], matA[2][1], matA[2][2]); if (!tool_matrix_invert(inv, matA)) return FALSE; DBG_fprintf(stderr, "Visu Data: transformation matrice:\n"); DBG_fprintf(stderr, " (%10.5f %10.5f %10.5f)\n", inv[0][0], inv[0][1], inv[0][2]); DBG_fprintf(stderr, " (%10.5f %10.5f %10.5f)\n", inv[1][0], inv[1][1], inv[1][2]); DBG_fprintf(stderr, " (%10.5f %10.5f %10.5f)\n", inv[2][0], inv[2][1], inv[2][2]); mat_[0][0] = (double)matA[0][0]; mat_[1][0] = (double)matA[0][1]; mat_[2][0] = (double)matA[0][2]; mat_[0][1] = (double)matA[1][0]; mat_[1][1] = (double)matA[1][1]; mat_[2][1] = (double)matA[1][2]; mat_[0][2] = (double)matA[2][0]; mat_[1][2] = (double)matA[2][1]; mat_[2][2] = (double)matA[2][2]; if (!tool_matrix_reducePrimitiveVectors(box, mat_)) return FALSE; DBG_fprintf(stderr, "Visu Data: new box:\n"); DBG_fprintf(stderr, " (%10.5f %10.5f %10.5f)\n", box[0], box[1], box[2]); DBG_fprintf(stderr, " (%10.5f %10.5f %10.5f)\n", box[3], box[4], box[5]); visu_box_setBoundary(data->priv->box, VISU_BOX_PERIODIC); /* Trick to avoid the emission of SizeChanged signal. */ visu_box_setMargin(data->priv->box, G_MAXFLOAT, FALSE); visu_box_setGeometry(data->priv->box, box); /* Remove possible extension. */ visu_box_setExtension(data->priv->box, zeros); /* We need to move all the atoms of (eps, eps, eps) in the new box to avoid rounding problems. */ xred[0] = 1.f; xred[1] = 1.f; xred[2] = 1.f; tool_matrix_productVector(vect, matA, xred); vectEps[0] = (vect[0] >= 0.f)?EPS:-EPS; vectEps[1] = (vect[1] >= 0.f)?EPS:-EPS; vectEps[2] = (vect[2] >= 0.f)?EPS:-EPS; tool_matrix_productVector(xred, inv, vectEps); visu_box_convertBoxCoordinatestoXYZ(data->priv->box, deltaEps, xred); DBG_fprintf(stderr, "Visu Data: applied epsilon (%10.5f %10.5f %10.5f)\n", vectEps[0], vectEps[1], vectEps[2]); /* Transform each atomic coordinates using this matrice. */ DBG_fprintf(stderr, "Visu Data: reset the coordinates for all nodes.\n"); visu_node_array_iterNew(VISU_NODE_ARRAY(data), &iter); rmNodes = g_malloc(sizeof(int) * iter.nAllStoredNodes); i = 0; for (visu_node_array_iterStart(VISU_NODE_ARRAY(data), &iter); iter.node; visu_node_array_iterNext(VISU_NODE_ARRAY(data), &iter)) { visu_data_getNodePosition(data, iter.node, vect); vect[0] += - O[0] + vectEps[0]; vect[1] += - O[1] + vectEps[1]; vect[2] += - O[2] + vectEps[2]; tool_matrix_productVector(xred, inv, vect); if (xred[0] < 0.f || xred[0] >= 1.f || xred[1] < 0.f || xred[1] >= 1.f || xred[2] < 0.f || xred[2] >= 1.f) { rmNodes[i] = (int)iter.node->number; DBG_fprintf(stderr, " | %d (%6.1f %6.1f %6.1f)" " %10.5f %10.5f %10.5f -> removed\n", iter.node->number, vect[0], vect[1], vect[2], xred[0], xred[1], xred[2]); i+= 1; } else { visu_box_convertBoxCoordinatestoXYZ(data->priv->box, iter.node->xyz, xred); iter.node->xyz[0] -= deltaEps[0]; iter.node->xyz[1] -= deltaEps[1]; iter.node->xyz[2] -= deltaEps[2]; iter.node->translation[0] = 0.f; iter.node->translation[1] = 0.f; iter.node->translation[2] = 0.f; visu_node_array_setOriginal(VISU_NODE_ARRAY(data), iter.node->number); DBG_fprintf(stderr, " | %d (%6.1f %6.1f %6.1f)" " %10.5f %10.5f %10.5f -> %10.5f %10.5f %10.5f\n", iter.node->number, vect[0], vect[1], vect[2], xred[0], xred[1], xred[2], iter.node->xyz[0], iter.node->xyz[1], iter.node->xyz[2]); } } rmNodes[i] = -1; visu_node_array_removeNodes(VISU_NODE_ARRAY(data), rmNodes); g_free(rmNodes); /* Raise the SizeChanged signal at last. */ visu_box_setMargin(data->priv->box, visu_node_array_getMaxElementSize(VISU_NODE_ARRAY(data)) + visu_data_getAllNodeExtens(data, data->priv->box), TRUE); /* Remove possible translation. */ data->priv->translationApply = FALSE; visu_data_forceXYZtranslation(data, zeros); g_signal_emit_by_name(G_OBJECT(data), "PositionChanged", (VisuElement*)0, NULL); return TRUE; } /** * visu_data_reorder: * @data: a #VisuData object, to reorder. * @dataRef: a #VisuData object, to take the order from. * * This routine modifies the node ordering of @data using the order in * @dataRef. The association is done by nearest neigbours conditions. * * Since: 3.6 * * Returns: TRUE is the reordering is successfull (i.e. all nodes of * @data correspond to one of @dataRef). */ gboolean visu_data_reorder(VisuData *data, VisuData *dataRef) { VisuNodeArrayIter iter, iterRef; float d, diff[3], dMin; guint id; g_return_val_if_fail(VISU_IS_DATA(dataRef), FALSE); g_return_val_if_fail(VISU_IS_DATA(data), FALSE); DBG_fprintf(stderr, "Geometry: reorder between %p and %p.\n", (gpointer)dataRef, (gpointer)data); DBG_fprintf(stderr, " | %d - %d.\n", visu_node_array_getNNodes(VISU_NODE_ARRAY(data)), visu_node_array_getNNodes(VISU_NODE_ARRAY(dataRef))); if (visu_node_array_getNNodes(VISU_NODE_ARRAY(data)) != visu_node_array_getNNodes(VISU_NODE_ARRAY(dataRef))) return FALSE; visu_node_array_iterNew(VISU_NODE_ARRAY(data), &iter); for (visu_node_array_iterStart(VISU_NODE_ARRAY(data), &iter); iter.node; visu_node_array_iterNext(VISU_NODE_ARRAY(data), &iter)) { id = 0; dMin = G_MAXFLOAT; visu_node_array_iterNew(VISU_NODE_ARRAY(dataRef), &iterRef); for (visu_node_array_iterStart(VISU_NODE_ARRAY(dataRef), &iterRef); iterRef.node; visu_node_array_iterNext(VISU_NODE_ARRAY(dataRef), &iterRef)) { visu_geodiff_getPeriodicDistance(diff, data, iter.node, iterRef.node); d = diff[0] * diff[0] + diff[1] * diff[1] + diff[2] * diff[2]; if (d < dMin) { id = iterRef.node->number; dMin = d; } } visu_node_array_switchNumber(VISU_NODE_ARRAY(data), iter.node->number, id); } return TRUE; } /*****************************/ /* The node related routines */ /*****************************/ /** * visu_data_addNodeFromIndex: * @data: the #VisuData where to add the new #VisuNode ; * @position: a integer corresponding to the position of * a #VisuElement in the array **nodes in the structure; * @xyz: (in) (array fixed-size=3): its coordinates ; * @reduced: coordinates are in reduced coordinates ; * @emitSignal: a boolean. * * This method adds a new #VisuNode to the specified #VisuData. Position must be * chosen between 0 and (ntype - 1) and corresponds to the position of the array * of #VisuNodes of a #VisuElement. If @emitSignal is TRUE, then * PopulationIncrease signal is triggered. * * Returns: (transfer none): a pointer to the newly created node. */ VisuNode* visu_data_addNodeFromIndex(VisuData *data, guint position, float xyz[3], gboolean reduced, gboolean emitSignal) { VisuNode *node; int index[4]; float coord[3]; g_return_val_if_fail(VISU_IS_DATA(data), (VisuNode*)0); node = visu_node_array_getNewNode(VISU_NODE_ARRAY(data), position); g_return_val_if_fail(node, (VisuNode*)0); /* If coordinates are reduced, we expand them. */ DBG_fprintf(stderr, "Visu Data: set node coordinates from (%g;%g;%g).\n", xyz[0], xyz[1], xyz[2]); if (reduced) visu_box_convertBoxCoordinatestoXYZ(data->priv->box, coord, xyz); else { coord[0] = xyz[0]; coord[1] = xyz[1]; coord[2] = xyz[2]; } visu_node_newValues(node, coord); if (emitSignal) { index[0] = 1; index[1] = 2; index[2] = node->number; index[3] = -1; DBG_fprintf(stderr, "Visu Data: emit a " "'PopulationIncrease' signal.\n"); g_signal_emit_by_name(G_OBJECT(data), "PopulationIncrease", (gpointer)(&index), NULL); } return node; } /** * visu_data_addNodeFromElement: * @data: the #VisuData where to add the new #VisuNode ; * @ele: the #VisuElement kind of the new #VisuNode ; * @xyz: (in) (array fixed-size=3): its coordinates ; * @reduced: coordinates are in reduced coordinates ; * @emitSignal: a boolean. * * This method adds a new #VisuNode to the specified #VisuData. If * @emitSignal is TRUE, then PopulationIncrease signal is * triggered. * * Returns: (transfer none): a pointer to the newly created node. */ VisuNode* visu_data_addNodeFromElement(VisuData *data, VisuElement *ele, float xyz[3], gboolean reduced, gboolean emitSignal) { int pos; g_return_val_if_fail(VISU_IS_DATA(data) && ele, (VisuNode*)0); pos = visu_node_array_getElementId(VISU_NODE_ARRAY(data), ele); g_return_val_if_fail(pos >= 0, (VisuNode*)0); return visu_data_addNodeFromIndex(data, (guint)pos, xyz, reduced, emitSignal); } /** * visu_data_addNodeFromElementName: * @data: the #VisuData where to add the new #VisuNode ; * @name: the name of the element ; * @xyz: (in) (array fixed-size=3): its coordinates ; * @reduced: coordinates are in reduced coordinates ; * @emitSignal: a boolean. * * This method adds a new #VisuNode to the specified #VisuData. If * @emitSignal is TRUE, then PopulationIncrease signal is * triggered. * * Returns: (transfer none): a pointer to the newly created node. * * Since: 3.6 */ VisuNode* visu_data_addNodeFromElementName(VisuData *data, const gchar *name, float xyz[3], gboolean reduced, gboolean emitSignal) { VisuElement *ele; g_return_val_if_fail(VISU_IS_DATA(data) && name, (VisuNode*)0); ele = visu_element_lookup(name); g_return_val_if_fail(ele, (VisuNode*)0); return visu_data_addNodeFromElement(data, ele, xyz, reduced, emitSignal); } /** * visu_data_getNodeCoordinates: * @data: a #VisuData object ; * @node: a #VisuNode object ; * @x: (out caller-allocates): the x coordinate. * @y: (out caller-allocates): the y coordinate. * @z: (out caller-allocates): the z coordinate. * * Wrapper for the function visu_data_getNodePosition() in case of call * from python. * * Since: 3.6 */ void visu_data_getNodeCoordinates(VisuData *data, VisuNode *node, float *x, float *y, float *z) { float xyz[3]; g_return_if_fail(x && y && z); visu_data_getNodePosition(data, node, xyz); *x = xyz[0]; *y = xyz[1]; *z = xyz[2]; } /** * visu_data_getNodePosition: (skip) * @data: a #VisuData object ; * @node: a #VisuNode object ; * @coord: (array fixed-size=3) (out caller-allocates): an array of 3 * floating point values to store the position. * * Position of nodes are subject to various translations and different transformations. * Their coordinates should not be access directly through node.[xyz]. This method * is used to retrieve the given node position. * */ void visu_data_getNodePosition(VisuData *data, VisuNode *node, float coord[3]) { g_return_if_fail(VISU_IS_DATA(data) && node && coord); coord[0] = node->xyz[0] + node->translation[0] + data->priv->translation[0]; coord[1] = node->xyz[1] + node->translation[1] + data->priv->translation[1]; coord[2] = node->xyz[2] + node->translation[2] + data->priv->translation[2]; } /** * visu_data_getNodeUserPosition: (skip) * @data: a #VisuData object ; * @node: a #VisuNode object ; * @coord: (array fixed-size=3) (out caller-allocates): an array of 3 * floating point values to store the position. * * This routine is equivalent to visu_data_getNodePosition() except * that it's not applying internal box translation for non periodic * directions. * * Since: 3.7 */ void visu_data_getNodeUserPosition(VisuData *data, VisuNode *node, float coord[3]) { VisuBoxBoundaries bc; g_return_if_fail(VISU_IS_DATA(data) && node && coord); visu_data_getNodePosition(data, node, coord); bc = visu_box_getBoundary(data->priv->box); if (bc == VISU_BOX_FREE || bc == VISU_BOX_SURFACE_YZ) coord[0] -= data->priv->translation[0]; if (bc == VISU_BOX_FREE || bc == VISU_BOX_SURFACE_ZX) coord[1] -= data->priv->translation[1]; if (bc == VISU_BOX_FREE || bc == VISU_BOX_SURFACE_XY) coord[2] -= data->priv->translation[2]; } /****************/ /* The timeouts */ /****************/ /** * visu_data_addTimeout: * @data: a valid #VisuData object ; * @time: the period of call in milliseconds ; * @func: (scope call): the callback function to be called ; * @user_data: (closure): a pointer to some user defined informations. * * This method is used to add the @func method to be called regularly at the period * @time. This methos calls in fact g_timeout_add() with the given arguments. But * the source id is stored internaly and the timeout function is removed automatically * when the object @data is destroyed. It is convienient to add a method working * on the #VisuData object that is called periodically during the life of te object. * * Returns: the source id if the calling method need to work with it. To remove * the callback, don't use g_source_remove() but visu_data_removeTimeout() * to inform the #VisuData object that this source has been removed and * not to remove it when the object will be destroyed. */ guint visu_data_addTimeout(VisuData *data, guint time, GSourceFunc func, gpointer user_data) { guint *id; g_return_val_if_fail(VISU_IS_DATA(data) && func, (guint)0); id = g_malloc(sizeof(guint)); *id = g_timeout_add(time, func, user_data); data->priv->timeoutList = g_list_prepend(data->priv->timeoutList, (gpointer)id); DBG_fprintf(stderr, "Visu Data: create a new timeout callback : %d.\n", *id); return *id; } /** * visu_data_removeTimeout: * @data: a valid #VisuData object ; * @timeoutId: a source id. * * This method is used to remove a timeout that has been associated to the given * @data (see visu_data_addTimeout()). * * Returns: TRUE if the source has been found and removed. */ gboolean visu_data_removeTimeout(VisuData *data, guint timeoutId) { GList *lst; gboolean found; g_return_val_if_fail(VISU_IS_DATA(data), FALSE); DBG_fprintf(stderr, "Visu Data: trying to remove a timeout callback (%d) ... ", timeoutId); found = FALSE; lst = data->priv->timeoutList; while(lst) { if (*(guint*)lst->data == timeoutId) { found = g_source_remove(timeoutId); data->priv->timeoutList = g_list_delete_link(data->priv->timeoutList, lst); DBG_fprintf(stderr, "OK (%d).\n", found); return found; } lst = g_list_next(lst); } DBG_fprintf(stderr, "not found.\n"); return found; } /*****************/ /* Miscellaneous */ /*****************/ /** * visu_data_class_getAllObjects: * * This methods is used to retrieve all #VisuObject currently allocated * in V_Sim. It is usefull to apply some changes on all objects (resources * for example). * * Returns: (transfer none) (element-type VisuData*): a list of V_Sim * own #VisuData objects. */ GList* visu_data_class_getAllObjects(void) { DBG_fprintf(stderr, "Visu Data: get the allObjects list.\n"); return allObjects; } /** * visu_data_setColorFunc: * @data: a #VisuData object ; * @func: (scope call): a method that colorize the nodes. * * This is a little trick to colorized the nodes. It should not be used since it * will probably be different in future release. */ void visu_data_setColorFunc(VisuData *data, VisuDataColorFunc func) { g_return_if_fail(data); DBG_fprintf(stderr, "Visu Data: set the color method to %d.\n", GPOINTER_TO_INT(func)); data->priv->setColor = func; } /** * visu_data_getUserColor: * @data: a #VisuData object ; * @ele: a #VisuElement object ; * @node: a #VisuNode object ; * @rgba: (array fixed-size=4): a location to store the color. * * If a user defined color has been set (see * visu_data_setColorFunc()), then call this method to obtain a color * for the given node. * * Returns: TRUE if a user color has been defined. * * Since: 3.6 */ gboolean visu_data_getUserColor(VisuData *data, VisuElement *ele, VisuNode *node, float rgba[4]) { if (!data->priv->setColor) return FALSE; return data->priv->setColor(data, rgba, ele, node); } /** * visu_data_hasUserColorFunc: * @data: a #VisuData object. * * Test the existence of a user defined colourisation function. * * Returns: TRUE if a user color function has been defined with * visu_data_setColorFunc(). * * Since: 3.6 */ gboolean visu_data_hasUserColorFunc(VisuData *data) { return (data->priv->setColor)?TRUE:FALSE; } /** * visu_data_setNodeScalingFunc: * @data: a #VisuData object ; * @scaling: (scope call): a scaling routine. * * Change the scaling routine when nodes are drawn. * * Since: 3.5 */ void visu_data_setNodeScalingFunc(VisuData *data, VisuDataScalingFunc scaling) { g_return_if_fail(VISU_IS_DATA(data)); if (scaling) data->priv->scaling = scaling; else data->priv->scaling = defaultScaling; } /** * visu_data_getNodeScalingFactor: * @data: a #VisuData object. * @node: a #VisuNode object. * * One can modify the size of a given node using a routine set by * visu_data_setNodeScalingFunc(). By default the scaling is 1. * * Since: 3.5 * * Returns: the scaling factor to be applied to node @node. */ float visu_data_getNodeScalingFactor(VisuData *data, VisuNode *node) { g_return_val_if_fail(VISU_IS_DATA(data), 0.f); return data->priv->scaling(data, node); } static float defaultScaling(VisuData *data _U_, VisuNode *node _U_) { return 1.f; } v_sim-3.7.0/src/visu_data.h0000644000353400050620000001775412215546105012517 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef VISU_DATA_H #define VISU_DATA_H #include #include #include "visu_tools.h" #include "visu_elements.h" #include "visu_nodes.h" #include "visu_box.h" #include "iface_boxed.h" #include "coreTools/toolPhysic.h" #include "coreTools/toolFileFormat.h" G_BEGIN_DECLS /** * VISU_TYPE_DATA: * * return the type of #VisuData. */ #define VISU_TYPE_DATA (visu_data_get_type ()) /** * VISU_DATA: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuData type. */ #define VISU_DATA(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_DATA, VisuData)) /** * VISU_DATA_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuDataClass. */ #define VISU_DATA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_DATA, VisuDataClass)) /** * VISU_IS_DATA: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuData object. */ #define VISU_IS_DATA(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_DATA)) /** * VISU_IS_DATA_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuDataClass class. */ #define VISU_IS_DATA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_DATA)) /** * VISU_DATA_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. */ #define VISU_DATA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_DATA, VisuDataClass)) typedef struct _VisuDataPrivate VisuDataPrivate; typedef struct _VisuData VisuData; struct _VisuData { VisuNodeArray parent; VisuDataPrivate *priv; }; /** * VisuDataClass: * @parent: the parent class. * * A short way to identify #_VisuDataClass structure. */ typedef struct _VisuDataClass VisuDataClass; struct _VisuDataClass { VisuNodeArrayClass parent; }; /** * VisuDataColorFunc: * @visuData: a pointer to the calling object ; * @ele: a #VisuElement ; * @node: a #VisuNode ; * @rgba: (in) (array fixed-size=4): an 4 allocated float area to store the return values. * * This prototype is used to specify an optional method * to associate a color with external values to each node. * * Returns: TRUE if the node should take colour read in @rgba. */ typedef gboolean (*VisuDataColorFunc)(VisuData *visuData, float rgba[4], VisuElement *ele, VisuNode* node); /** * VisuDataScalingFunc: * @visuData: a pointer to the calling object ; * @node: a #VisuNode ; * * Interface for routine that need to rescale @node before drawing * them. * * Returns: the scaling factor. */ typedef float (*VisuDataScalingFunc)(VisuData *visuData, VisuNode* node); /** * visu_data_get_type: * * This method returns the type of #VisuData, use VISU_TYPE_DATA instead. * * Returns: the type of #VisuData. */ GType visu_data_get_type(void); VisuData* visu_data_new(void); VisuData* visu_data_new_withFiles(const gchar **files); void visu_data_freePopulation(VisuData *data); /* Methods to deal with file representation of VisuData objects. */ void visu_data_addFile(VisuData *data, const gchar* file, int kind, ToolFileFormat *format); void visu_data_removeAllFiles(VisuData *data); const gchar* visu_data_getFile(VisuData *data, int kind, ToolFileFormat **format); gchar* visu_data_getFilesAsLabel(const VisuData *data); void visu_data_setFileCommentary(VisuData *data, gchar* commentary, gint iSet); gchar* visu_data_getFileCommentary(VisuData *data, gint iSet); void visu_data_setNSubset(VisuData *data, int nSet); int visu_data_getNSubset(VisuData *data); void visu_data_setISubset(VisuData *data, int iSet); int visu_data_getISubset(VisuData *data); void visu_data_setChangeElementFlag(VisuData *data, gboolean changeElement); gboolean visu_data_getChangeElementFlag(VisuData *data); gfloat visu_data_getAllNodeExtens(VisuData *dataObj, VisuBox *box); VisuNode* visu_data_addNodeFromElement(VisuData *data, VisuElement *ele, float xyz[3], gboolean reduced, gboolean emitSignal); VisuNode* visu_data_addNodeFromElementName(VisuData *data, const gchar *name, float xyz[3], gboolean reduced, gboolean emitSignal); VisuNode* visu_data_addNodeFromIndex(VisuData *data, guint position, float xyz[3], gboolean reduced, gboolean emitSignal); void visu_data_setColorFunc(VisuData *data, VisuDataColorFunc func); gboolean visu_data_hasUserColorFunc(VisuData *data); gboolean visu_data_getUserColor(VisuData *data, VisuElement *ele, VisuNode *node, float rgba[4]); float* visu_data_getXYZtranslation(VisuData* data); gboolean visu_data_setXYZtranslation(VisuData* data, float xyz[3]); gboolean visu_data_forceXYZtranslation(VisuData* data, float xyz[3]); gboolean visu_data_getTranslationStatus(VisuData *data); VisuBox* visu_data_setTightBox(VisuData *data); gboolean visu_data_getNodeBoxFromNumber(VisuData *data, guint nodeId, int nodeBox[3]); gboolean visu_data_getNodeBoxFromCoord(VisuData *data, float xcart[3], int nodeBox[3]); gboolean visu_data_constrainedElementInTheBox(VisuData *data, VisuElement *element); gboolean visu_data_constrainedInTheBox(VisuData *data); gboolean visu_data_constrainedFree(VisuData *data); gboolean visu_data_replicate(VisuData *data, float extension[3]); gboolean visu_data_restore(VisuData *data); void visu_data_getNodeCoordinates(VisuData *data, VisuNode *node, float *x, float *y, float *z); void visu_data_getNodePosition(VisuData *data, VisuNode *node, float coord[3]); void visu_data_getNodeUserPosition(VisuData *data, VisuNode *node, float coord[3]); VisuNodeInfo* visu_data_getDistanceList(VisuData *data, guint nodeId, float *minVal); gboolean visu_data_setNewBasisFromNodes(VisuData *data, guint nO, guint nA, guint nB, guint nC); gboolean visu_data_setNewBasis(VisuData *data, float matA[3][3], float O[3]); gboolean visu_data_reorder(VisuData *data, VisuData *dataRef); void visu_data_setNodeScalingFunc(VisuData *data, VisuDataScalingFunc scaling); float visu_data_getNodeScalingFactor(VisuData *data, VisuNode *node); guint visu_data_addTimeout(VisuData *data, guint time, GSourceFunc func, gpointer user_data); gboolean visu_data_removeTimeout(VisuData *data, guint timeoutId); GList* visu_data_class_getAllObjects(void); G_END_DECLS #endif v_sim-3.7.0/src/visu_commandLine.c0000644000353400050620000011214412215556716014025 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse m�l : BILLARD, non joignable par m�l ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant � visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est r�gi par la licence CeCILL soumise au droit fran�ais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffus�e par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez acc�der � cet en-t�te signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept� les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "visu_commandLine.h" #include "visu_tools.h" #include "visu_basic.h" #include #include #include #include #include /** * SECTION:visu_commandLine * @short_description: All methods needed to parse options from the * command line. * * V_Sim parses the command line at startup and store data in * private variables. All this values can be retrieve later by the * program through calls to commandLineGet_* methods. */ static char *argFileName, *argProgName; /* Forced resources file. */ static gchar *argResources; /* Spin arguments. */ static char *argSpinFileName; static int spinHidingMode; static gboolean spinAndAtomic; /* Miscelaneous arguments. */ static gchar *argExportFileName; static gchar *argWindowMode; static guint argISet; static gchar *argValueFile; /* Colorisation tool. */ static gchar *argColorizeFileName; static int argColorizeColUsed[3]; static int argColorizePresetColor; static GArray *argColorizeRange; static gboolean argColorizeColUsed_isPresent; static int argScalingColumn; /* Iso-surfaces tool. */ static gchar *argVisuScalarFieldFileName; static gchar *argIsoVisuSurfacesFileName; static float *argIsoValues; static gchar **argIsoNames; static float argNbIsoValues; static gboolean argFitToBox; /* Translations stuffs. */ static gboolean argTranslationsIsSet; static float argTranslations[3]; /* Extension stuffs. */ static gboolean argExpandIsSet; static float argExtension[3]; /* Colored map. */ static int *argMapVisuPlaneId; static ToolMatrixScalingFlag argLogScale; static int argNIsoLines; static float *argIsoLinesColor; static guint argMapPrecision; static float *argMapMinMax; /* Background image. */ static gchar *argBgImageFile; /* Extended options. */ static GHashTable *argOptionTable; /* Miscelaneous options */ static gchar* argVisuPlanesFileName; static gchar *argIntrospect; static int withGtk; static int xWindowWidth, xWindowHeight; struct option_desc { struct option *opt; const gchar *desc; const gchar *arg; const gchar *def; float version; }; /* Remaining letters... j, k, l, q, y, z */ #define N_OPTIONS 32 static GString *short_options; static struct option *long_options; static struct option_desc *ext_options; void alignPrint(GString *str, const gchar* value, int ln, gchar *pad) { gchar *sp; gchar *tmp; if (g_utf8_strlen(value, -1) <= ln) { g_string_append_printf(str, "%s%s", pad, value); return; } sp = g_utf8_strrchr(value, ln, ' '); g_return_if_fail(sp); tmp = g_strndup(value, (gsize)(sp - value)); g_string_append_printf(str, "%s%s\n", pad, tmp); g_free(tmp); alignPrint(str, sp + 1, ln, pad); } #define OUT stdout #define P fprintf #define offset 25 void printInfoMessage(void) { int i; GString *desc, *expl; gchar format[128], pad[128], arg[128]; P(OUT, _("V_Sim is a software to visualize atomic structures with" " OpenGl rendering.\n\n")); desc = g_string_new(_("usage:")); g_string_append_printf(desc, " %s [", PACKAGE_TARNAME); for (i = 0; ext_options[i].opt->name; i++) if (ext_options[i].opt->val) { if (i > 0) g_string_append(desc, " | "); g_string_append_printf(desc, "-%c", ext_options[i].opt->val); if (ext_options[i].arg) g_string_append_printf(desc, " %s", ext_options[i].arg); } g_string_append_printf(desc, "] [fileToRender]\n\n"); P(OUT, "%s", desc->str); expl = g_string_new(""); sprintf(format, "%%%ds", offset); sprintf(pad, format, " "); for (i = 0; ext_options[i].opt->name; i++) { if (ext_options[i].opt->val) g_string_printf(desc, " -%c,", ext_options[i].opt->val); else g_string_assign(desc, " "); if (ext_options[i].arg) sprintf(arg, "%s %s", ext_options[i].opt->name, ext_options[i].arg); else sprintf(arg, "%s", ext_options[i].opt->name); g_string_erase(expl, 0, -1); alignPrint(expl, ext_options[i].desc, 80 - offset, pad); g_string_append_printf(desc, " --%s (from v%3.1f.0)\n%s\n", arg, ext_options[i].version, expl->str); sprintf(format, "%%%ds", offset); g_string_append_printf(desc, format, " "); if (ext_options[i].def) g_string_append_printf(desc, _("(Default value: %s)\n\n"), ext_options[i].def); else g_string_append(desc, _("(Default value: unset)\n\n")); P(OUT, "%s", desc->str); } g_string_free(expl, TRUE); g_string_free(desc, TRUE); } void optionSet(int i, const gchar *lg, gchar sh, const gchar *desc, const gchar *arg, const gchar *def, float version) { long_options[i].name = lg; long_options[i].has_arg = (arg)?required_argument:no_argument; long_options[i].flag = (int*)0; long_options[i].val = (int)sh; ext_options[i].opt = long_options + i; ext_options[i].desc = desc; ext_options[i].arg = arg; ext_options[i].def = def; ext_options[i].version = version; if (arg && sh) g_string_append_printf(short_options, "%c:", sh); else if (sh) g_string_append_printf(short_options, "%c", sh); } void optionsInit(void) { int i; short_options = g_string_new(""); ext_options = g_malloc(sizeof(struct option_desc) * N_OPTIONS); long_options = g_malloc(sizeof(struct option) * N_OPTIONS); i = 0; optionSet(i++, "export", 'e', _("make an image from the fileToRender argument. The format is" " specified through the extension of the argument or by the" " -o fileFormatId=id option (get the id of available file" " formats with -o list)."), _("file"), (gchar*)0, 3.0f); optionSet(i++, "resources", 'r', _("load the given resources file on startup instead of looking" " for a valid resources file in the standard locations."), _("file"), (gchar*)0, 3.4f); optionSet(i++, "help", 'h', _("show this little help."), (gchar*)0, (gchar*)0, 3.0f); optionSet(i++, "geometry", 'g', _("specify the size of the rendering window, the size argument must" " have the following format: x with positive non null" " values."), _("x"), "600x600", 3.0f); optionSet(i++, "spin-file", 's', _("use the given argument as a spin indicator. If this option is used," " V_Sim switches automatically to spin rendering whatever method" " is specified in the parameter file."), _("file"), (gchar*)0, 3.1f); optionSet(i++, "hiding-mode", 'm', _("policy used to show or not null modulus spins possible values are" " positives."), _("id"), "0", 3.2f); optionSet(i++, "spin-and-atomic", 'a', _("always draws atomic rendering on node position in addition to spin" " rendering."), (gchar*)0, (gchar*)0, 3.3f); optionSet(i++, "colorize", 'c', _("the argument fileToRender must be called, then the given file of" " the option is used to colorize the elements."), _("file"), (gchar*)0, 3.1f); optionSet(i++, "use-column", 'u', _("it specifies the columns to use from the data file for the three colour" " channels [l;m;n]. Columns are counted from 1. Use -3, -2, -1 and 0" " to use the special values, constant 1, coord. x, coord. y," " and coord. z, respectively."), "l:m:n", (gchar*)0, 3.1f); optionSet(i++, "color-preset", 'd', _("this option can be used with the '--colorize' one or the" " '--build-map' one. It chooses a preset color scheme. The id" " argument is an integer that corresponds to a defined color" " shade (ranging from 0)."), _("id"), (gchar*)0, 3.1f); optionSet(i++, "translate", 't', _("a file must be loaded. It applies the given translations to the" " loaded file. The units are those of the file. This is available" " for periodic file formats only."), "x:y:z", (gchar*)0, 3.3f); optionSet(i++, "expand", 'x', _("a file must be loaded. It applies the given expansion to the loaded" " file. The values are given in box coordinates. This is available" " for periodic file formats only."), "x:y:z", (gchar*)0, 3.4f); optionSet(i++, "planes", 'p', _("the argument fileToRender must be called, then the given file of" " the option is parsed as a list of planes and they are rendered."), _("file"), (gchar*)0, 3.2f); optionSet(i++, "scalar-field", 'f', _("the argument fileToRender must be called, then the given file of" " the option is parsed as a scalar field and loaded."), _("file"), (gchar*)0, 3.3f); optionSet(i++, "iso-values", 'v', _("must be used with the '--scalar-field' option, then the given" " surfaces are built and rendered. If a name is appended to a" " value using '#' as a separator, this name is used as the name" " for the iso-surface (i.e. 0.25#Blue)."), "v[:v]", (gchar*)0, 3.3f); optionSet(i++, "iso-surfaces", 'i', _("the argument fileToRender must be given, then the given file of" " the option is parsed and surfaces are rendered."), _("file"), (gchar*)0, 3.2f); optionSet(i++, "build-map", 'b', _("the argument fileToRender must be given, as the '--planes'," " '--color-preset' and '--scalar-field' options used, then the" " given plane 'id' is replaced by a coloured map using given" " scalar field and shade. 'id' ranges from 0. If several ids" " are given, several maps are built."), _("id[:id]"), (gchar*)0, 3.4f); optionSet(i++, "log-scale", 0, _("select the scaling method to use with gradients (0: linear," " 1: log scaled and 2 is zero-centred log scale), default is linear scale."), _("id"), (gchar*)0, 3.4f); optionSet(i++, "n-iso-lines", 'n', _("when positive, val isolines are plotted on the coloured map."), _("val"), (gchar*)0, 3.4f); optionSet(i++, "color-iso-lines", 0, _("when given, generated iso-lines are colourised [R:G:B] or auto" " with the values. The specific value 'auto' will produced" " iso-lines in inversed colours."), _("[R:G:B] or auto"), "[0:0:0]", 3.5f); optionSet(i++, "fit-to-box", 0, _("if val is not TRUE, the surfaces use their own bounding box."), _("val"), "TRUE", 3.3f); optionSet(i++, "bg-image", 0, _("draw the given image on the background."), _("file"), (gchar*)0, 3.4f); optionSet(i++, "option", 'o', _("this is a generic way to give extended option. to V_Sim. As much" " as -o can be used. Each one store a key and its value (boolean," " integer or float)."), _("id=value"), (gchar*)0, 3.3f); optionSet(i++, "window-mode", 'w', _("used to choose the windowing mode. By default the command panel " "and the rendering window are separated. In the 'oneWindow' mode " "they are joined. In the 'renderOnly' mode, the command panel is " "not used."), _("mode"), "classic", 3.5f); optionSet(i++, "i-set", 0, _("this flag is used to choose the id of the loaded file if the" " format has support for multiple ids in one file (see XYZ" " format or -posi.d3 ones)."), _("i"), "0", 3.5f); optionSet(i++, "value-file", 0, _("specify an XML file with some value information for V_Sim," " like a list of planes, highlighted nodes... It replaces" " and extend the previous --planes option."), _("file"), (gchar*)0, 3.5f); optionSet(i++, "map-precision", 0, _("Give the precision in percent to render the coloured map."), _("prec"), "100", 3.5f); optionSet(i++, "map-clamp", 0, _("Set the minimum and maximum values for the coloured map rendering."), _("min:max or auto"), "auto", 3.6f); optionSet(i++, "introspect-dump", 0, _("Dump object signals and properties for introspection."), _("fileToDump"), (gchar*)0, 3.6f); optionSet(i++, "color-clamp", 0, _("Range to adjust values into for colourisation. col specifies" "the column to apply the range to. Use -2, -1 and 0 for x, y" "and z directions respectively."), _("col#min:max or auto"), "auto", 3.7f); optionSet(i++, "scaling-column", 0, _("used with a data file (see -c), it specifies the " "column id to be used to scale the nodes."), _("id"), (gchar*)0, 3.7f); optionSet(i++, NULL, 0, NULL, NULL, NULL, 0.f); g_return_if_fail(i == N_OPTIONS); } gboolean commandLineExport(const gchar *filename, GError **error) { GString *xml; int i; gboolean status; gchar *desc, *def, *arg; xml = g_string_new("\n"); xml = g_string_append(xml, "\n"); for (i = 0; ext_options[i].opt->name; i++) { if (ext_options[i].opt->val) g_string_append_printf (xml, " \n"); } g_string_append(xml, "\n"); status = g_file_set_contents(filename, xml->str, -1, error); g_string_free(xml, TRUE); return status; } int commandLineParse(int argc, char **argv) { int res, i, nb, valueInt; int option_index; gchar **tokens, **tokens2; ToolOption *option; float valueFloat, min, max; /* We want to read . as floating point separator : in french it is , */ setlocale(LC_NUMERIC, "C"); argProgName = g_strdup(argv[0]); argFileName = (char*)0; argSpinFileName = (char *)0; spinHidingMode = 1; spinAndAtomic = FALSE; argExportFileName = (char*)0; argColorizeFileName = (gchar*)0; for (i = 0; i < 2; i++) argColorizeColUsed[i] = 0; argColorizeColUsed_isPresent = FALSE; argColorizePresetColor = -1; argColorizeRange = g_array_new(FALSE, FALSE, sizeof(float)); argTranslationsIsSet = FALSE; argExpandIsSet = FALSE; xWindowWidth = 600; xWindowHeight = 600; argVisuPlanesFileName = (gchar*)0; argVisuScalarFieldFileName = (gchar*)0; argIsoVisuSurfacesFileName = (gchar*)0; argIsoValues = (float*)0; argFitToBox = TRUE; argOptionTable = (GHashTable*)0; argMapVisuPlaneId = (int*)0; argLogScale = FALSE; argNIsoLines = 0; argBgImageFile = (gchar*)0; argIsoLinesColor = g_malloc0(sizeof(float) * 3); argMapMinMax = (float*)0; argWindowMode = g_strdup("classic"); argISet = 0; argValueFile = (gchar*)0; argMapPrecision = 100; argIntrospect = (gchar*)0; argScalingColumn = -1; withGtk = 1; optionsInit(); option = (ToolOption*)0; option_index = 0; opterr = 0; DBG_fprintf(stderr, "Visu CommandLine: short options '%s'.\n", short_options->str); while (1) { res = getopt_long (argc, argv, short_options->str, long_options, &option_index); /* test if there's no more option available. */ if (res == -1) break; switch (res) { case 'e': DBG_fprintf(stderr, "Visu Command: option '%s' found with arg '%s'.\n", long_options[option_index].name, optarg); if (!optarg) g_error("The option 'export' needs a parameter.\n"); else argExportFileName = g_strdup(optarg); /* This option does not need gtk. */ withGtk = 0; break; case 'r': DBG_fprintf(stderr, "Visu Command: option '%s' found with arg '%s'.\n", long_options[option_index].name, optarg); if (!optarg) g_error("The option 'resources' needs a parameter.\n"); else argResources = g_strdup(optarg); break; case 'h': DBG_fprintf(stderr, "Visu Command: option '%s' found.\n", long_options[option_index].name); printInfoMessage(); exit(0); break; case 'g': DBG_fprintf(stderr, "Visu Command: set the geometry of the X window (%s).\n", optarg); res = sscanf(optarg, "%dx%d", &xWindowWidth, &xWindowHeight); if (res != 2 || xWindowWidth <= 0 || xWindowHeight <=0) { g_warning("Wrong format for geometry" " option (x awaited).\n"); xWindowWidth = 600; xWindowHeight = 600; break; } break; case 's': DBG_fprintf(stderr, "Visu Command: set the filenane for" " spin rendering to '%s'.\n", optarg); if (!optarg) { g_error("The option 'spin-file' needs a parameter.\n"); } argSpinFileName = g_strdup(optarg); break; case 'm': DBG_fprintf(stderr, "Visu Command: set hiding-mode to '%s' in spin rendering.\n", optarg); res = sscanf(optarg, "%d", &spinHidingMode); if (res != 1 || spinHidingMode < 0) { g_warning("Wrong format for hiding-mode" " option (integer awaited).\n"); spinHidingMode = 0; } break; case 'a': DBG_fprintf(stderr, "Visu Command: set spin-and-atomic to TRUE in spin rendering.\n"); spinAndAtomic = TRUE; break; case 'b': DBG_fprintf(stderr, "Visu Command: get the values for" " maps '%s'.\n", optarg); if (!optarg) { g_error("The option 'build-map' needs a parameter.\n"); } tokens = g_strsplit(optarg, ":", -1); /* Count number of tokens. */ for (nb = 0; tokens[nb]; nb++); DBG_fprintf(stderr, " | allocate %d ids.\n", nb + 1); argMapVisuPlaneId = g_malloc(sizeof(int) * (nb + 1)); nb = 1; for (i = 0; tokens[i]; i++) { res = sscanf(tokens[i], "%d", argMapVisuPlaneId + nb); if (res != 1 || argMapVisuPlaneId[nb] < 0) g_warning("Parse error reading values from option " "'build-map', unknown plane id '%s'.\n", tokens[i]); else nb += 1; } DBG_fprintf(stderr, " | found %d valid ids.\n", nb - 1); argMapVisuPlaneId[0] = nb - 1; g_strfreev(tokens); break; case 'n': res = sscanf(optarg, "%d", &argNIsoLines); if (res != 1 || argNIsoLines < 0) { g_warning("Wrong format for n-iso-lines option (id >= 0 awaited).\n"); argNIsoLines = 0; break; } DBG_fprintf(stderr, "Visu Command: set the number of isolines" " for coloured map '%d'.\n", argNIsoLines); break; case 'c': DBG_fprintf(stderr, "Visu Command: set the filenane for colorization to '%s'.\n", optarg); if (!optarg) { g_error("The option 'colorize' needs a parameter.\n"); } argColorizeFileName = g_strdup(optarg); break; case 'u': DBG_fprintf(stderr, "Visu Command: set the used columns for" " colorize data (%s).\n", optarg); res = sscanf(optarg, "%d:%d:%d", argColorizeColUsed, argColorizeColUsed + 1, argColorizeColUsed + 2); if (res != 3 || argColorizeColUsed[0] < -3 || argColorizeColUsed[1] < -3 || argColorizeColUsed[2] < -3) { g_warning("Wrong format for use-column" " option (:: awaited).\n"); for (i = 0; i < 2; i++) argColorizeColUsed[i] = -3; break; } argColorizeColUsed_isPresent = TRUE; break; case 'd': DBG_fprintf(stderr, "Visu Command: set a previously defined color scheme (%s).\n", optarg); res = sscanf(optarg, "%d", &argColorizePresetColor); if (res != 1 || argColorizePresetColor < 0) { g_warning("Wrong format for color-preset" " option (positive integer awaited).\n"); argColorizePresetColor = -1; break; } break; case 't': DBG_fprintf(stderr, "Visu Command: set the translations (%s).\n", optarg); res = sscanf(optarg, "%f:%f:%f", argTranslations, argTranslations + 1, argTranslations + 2); if (res != 3) { g_warning("Wrong format for translation" " option (:: awaited).\n"); break; } else argTranslationsIsSet = TRUE; break; case 'x': DBG_fprintf(stderr, "Visu Command: set the extension (%s).\n", optarg); res = sscanf(optarg, "%f:%f:%f", argExtension, argExtension + 1, argExtension + 2); if (res != 3 || argExtension[0] < 0. || argExtension[1] < 0. || argExtension[2] < 0.) { g_warning("Wrong format for expand" " option (:: awaited >= 0.).\n"); break; } else argExpandIsSet = TRUE; break; case 'p': DBG_fprintf(stderr, "Visu Command: set the filenane for planes to '%s'.\n", optarg); if (!optarg) { g_error("The option 'planes' needs a parameter.\n"); } argVisuPlanesFileName = g_strdup(optarg); break; case 'f': DBG_fprintf(stderr, "Visu Command: set the filenane for" " a scalar field '%s'.\n", optarg); if (!optarg) { g_error("The option 'field' needs a parameter.\n"); } if (strcmp(".", optarg)) argVisuScalarFieldFileName = g_strdup(optarg); else argVisuScalarFieldFileName = g_strdup(argv[argc - 1]); break; case 'v': DBG_fprintf(stderr, "Visu Command: get the values for" " a scalar field '%s'.\n", optarg); if (!optarg) { g_error("The option 'iso-values' needs a parameter.\n"); } tokens = g_strsplit(optarg, ":", -1); /* Count number of tokens. */ for (nb = 0; tokens[nb]; nb++); argIsoValues = g_malloc(sizeof(float) * (nb + 1)); argIsoNames = g_malloc(sizeof(gchar*) * (nb + 1)); nb = 0; for (i = 0; tokens[i]; i++) { tokens2 = g_strsplit(tokens[i], "#", 2); res = sscanf(tokens2[0], "%f", argIsoValues + nb); if (res != 1) g_warning("Parse error reading values from option " "'iso-values', unknown number '%s'.\n", tokens[i]); else { if (tokens2[1]) /* A name for the value is given. */ argIsoNames[nb] = g_strdup(tokens2[1]); else argIsoNames[nb] = (gchar*)0; nb += 1; } g_strfreev(tokens2); } argNbIsoValues = nb; g_strfreev(tokens); break; case 'i': DBG_fprintf(stderr, "Visu Command: set the filenane for" " an isosurfaces '%s'.\n", optarg); if (!optarg) { g_error("The option 'iso-surfaces' needs a parameter.\n"); } argIsoVisuSurfacesFileName = g_strdup(optarg); break; case 'o': DBG_fprintf(stderr, "Visu Command: read an extended option.\n"); if (!optarg) { g_error("The option 'option' needs a parameter.\n"); } tokens = g_strsplit(optarg, "=", 2); if (!argOptionTable) argOptionTable = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, \ (GDestroyNotify)tool_option_free); if (tokens[1] && tokens[1][0] == 'T' && !tokens[1][1]) { option = tool_option_new(tokens[0], tokens[0], G_TYPE_BOOLEAN); g_value_set_boolean(tool_option_getValue(option), TRUE); DBG_fprintf(stderr, " | boolean : T\n"); } else if (tokens[1] && tokens[1][0] == 'F' && !tokens[1][1]) { option = tool_option_new(tokens[0], tokens[0], G_TYPE_BOOLEAN); g_value_set_boolean(tool_option_getValue(option), FALSE); DBG_fprintf(stderr, " | boolean : F\n"); } else if (tokens[1] && sscanf(tokens[1], "%d", &valueInt) == 1) { option = tool_option_new(tokens[0], tokens[0], G_TYPE_INT); g_value_set_int(tool_option_getValue(option), valueInt); DBG_fprintf(stderr, " | int : %d\n", valueInt); } else if (tokens[1] && sscanf(tokens[1], "%f", &valueFloat) == 1) { option = tool_option_new(tokens[0], tokens[0], G_TYPE_FLOAT); g_value_set_float(tool_option_getValue(option), valueFloat); DBG_fprintf(stderr, " | float : %f\n", valueFloat); } else if (tokens[1]) { option = tool_option_new(tokens[0], tokens[0], G_TYPE_STRING); g_value_set_string(tool_option_getValue(option), tokens[1]); DBG_fprintf(stderr, " | string : '%s'\n", tokens[1]); } else if (!tokens[1]) { option = tool_option_new(tokens[0], tokens[0], G_TYPE_BOOLEAN); g_value_set_boolean(tool_option_getValue(option), TRUE); DBG_fprintf(stderr, " | boolean : T\n"); } else { g_error("Unparsable value for option 'option'.\n"); } g_hash_table_insert(argOptionTable, (gpointer)tool_option_getName(option), (gpointer)option); g_strfreev(tokens); break; case 'w': DBG_fprintf(stderr, "Visu Command: set the window mode to" " '%s'.\n", optarg); if (!optarg) { g_error("The option 'window-mode' needs a parameter.\n"); } argWindowMode = g_strdup(optarg); if (strcmp(argWindowMode, "classic") && strcmp(argWindowMode, "renderOnly") && strcmp(argWindowMode, "oneWindow")) { g_error("The option 'window-mode' accepts only 'calssic'" ", 'oneWindow' and 'renderOnly' as a parameter.\n"); } break; case 0: /* Long option only. */ if (!strcmp(long_options[option_index].name, "fit-to-box")) argFitToBox = (!strcmp(optarg, "TRUE")); else if (!strcmp(long_options[option_index].name, "log-scale")) { if (sscanf(optarg, "%ud", &argLogScale) != 1) argLogScale = TOOL_MATRIX_SCALING_LINEAR; if (argLogScale >= TOOL_MATRIX_SCALING_N_VALUES) argLogScale = TOOL_MATRIX_SCALING_LINEAR; } else if (!strcmp(long_options[option_index].name, "bg-image")) { if (strcmp(optarg, "V_Sim")) argBgImageFile = g_strdup(optarg); else argBgImageFile = g_build_filename(V_SIM_PIXMAPS_DIR, "logo_grey.png", NULL); } else if (!strcmp(long_options[option_index].name, "color-iso-lines")) { if (sscanf(optarg, "[%f:%f:%f]", argIsoLinesColor, argIsoLinesColor + 1, argIsoLinesColor + 2) != 3) { if (!strcmp(optarg, "auto") || !strcmp(optarg, "Auto")) { g_free(argIsoLinesColor); argIsoLinesColor = (float*)0; } else { g_error("Can't read any color from '%s' following" " the [R:G:B] scheme or the 'auto' keyword.\n", optarg); } } if (argIsoLinesColor) { argIsoLinesColor[0] = CLAMP(argIsoLinesColor[0], 0.f, 1.f); argIsoLinesColor[1] = CLAMP(argIsoLinesColor[1], 0.f, 1.f); argIsoLinesColor[2] = CLAMP(argIsoLinesColor[2], 0.f, 1.f); } } else if (!strcmp(long_options[option_index].name, "i-set")) { if (sscanf(optarg, "%u", &argISet)) { g_warning("Wrong format for i-set" " option (integer awaited >= 0).\n"); break; } else argISet = 0; } else if (!strcmp(long_options[option_index].name, "value-file")) argValueFile = g_strdup(optarg); else if (!strcmp(long_options[option_index].name, "map-precision")) { if (sscanf(optarg, "%u", &argMapPrecision) != 1 || argMapPrecision == 0) { g_warning("Wrong value for map-precision" " option (integer awaited > 0).\n"); argMapPrecision = 100; break; } else argMapPrecision = 100; } else if (!strcmp(long_options[option_index].name, "map-clamp")) { argMapMinMax = g_malloc0(sizeof(float) * 2); if (sscanf(optarg, "%f:%f", argMapMinMax, argMapMinMax + 1) != 2) { if (!strcmp(optarg, "auto") || !strcmp(optarg, "Auto")) { g_free(argMapMinMax); argMapMinMax = (float*)0; } else { g_error("Can't read any bounds from '%s' following" " the min:max scheme or the 'auto' keyword.\n", optarg); } } if (argMapMinMax && argMapMinMax[1] <= argMapMinMax[0]) { g_error("Bounds given in '%s' are wrong," " min value is greater than max value.\n", optarg); g_free(argMapMinMax); argMapMinMax = (float*)0; } } else if (!strcmp(long_options[option_index].name, "color-clamp")) { if (sscanf(optarg, "%d#%f:%f", &i, &min, &max) == 3) { if (max <= min) { g_error("Bounds given in '%s' are wrong," " min value is greater than max value.\n", optarg); } g_array_append_val(argColorizeRange, i); g_array_append_val(argColorizeRange, min); g_array_append_val(argColorizeRange, max); } else { g_error("Can't read any bounds from '%s' following" " the col#min:max scheme or the 'auto' keyword.\n", optarg); } } else if (!strcmp(long_options[option_index].name, "introspect-dump")) { argIntrospect = g_strdup(optarg); DBG_fprintf(stderr, "Visu CommandLine: introspect with '%s'.\n", argIntrospect); } else if (!strcmp(long_options[option_index].name, "scaling-column")) { if (sscanf(optarg, "%d", &argScalingColumn) != 1 || argScalingColumn < 1) { g_warning("Wrong value for scaling-column" " option (integer awaited > -3).\n"); argScalingColumn = -1; break; } else argScalingColumn -= 1; } else { g_error("Unknown long option '--%s'.\n", long_options[option_index].name); } break; default: g_warning("Unknown option '%s'.", argv[optind - 1]); printInfoMessage(); exit(0); } } if (argc - optind == 1) { DBG_fprintf(stderr, "Visu Command: there is one argument '%s'.\n", argv[optind]); argFileName = tool_path_normalize(argv[optind]); } else if (argc - optind == 0) return 0; else g_warning("This program allows only up to one argument.\n"); /* Consistency check between options. */ if (argVisuScalarFieldFileName && argIsoVisuSurfacesFileName) { g_error("The options --iso-surfaces and --scalar-field are exclusive."); } if (argValueFile && argVisuPlanesFileName) { g_error("The options --planes and --value-file are exclusive."); } return 0; } char* commandLineGet_ArgFilename(void) { return argFileName; } char* commandLineGet_ArgSpinFileName(void) { return argSpinFileName; } int commandLineGet_WithGtk(void) { return withGtk; } char* commandLineGet_ExportFileName(void) { return argExportFileName; } void commandLineGet_XWindowGeometry(int *width, int *height) { *width = xWindowWidth; *height = xWindowHeight; } gchar* commandLineGet_colorizeFileName(void) { return argColorizeFileName; } int* commandLineGet_colorizeColUsed(void) { if (argColorizeColUsed_isPresent) return argColorizeColUsed; else return (int*)0; } float* commandLineGet_translation(void) { if (argTranslationsIsSet) return argTranslations; else return (float*)0; } float* commandLineGet_extension(void) { if (argExpandIsSet) return argExtension; else return (float*)0; } int commandLineGet_presetColor(void) { return argColorizePresetColor; } gchar* commandLineGet_planesFileName(void) { return argVisuPlanesFileName; } int commandLineGet_spinHidingMode(void) { return spinHidingMode; } gboolean commandLineGet_spinAndAtomic(void) { return spinAndAtomic; } float* commandLineGet_isoValues(int *nb) { g_return_val_if_fail(nb, (float*)0); *nb = argNbIsoValues; return argIsoValues; } gchar** commandLineGet_isoNames(int *nb) { g_return_val_if_fail(nb, (gchar**)0); *nb = argNbIsoValues; return argIsoNames; } gchar* commandLineGet_scalarFieldFileName(void) { return argVisuScalarFieldFileName; } gchar* commandLineGet_isoVisuSurfacesFileName(void) { return argIsoVisuSurfacesFileName; } gboolean commandLineGet_fitToBox(void) { return argFitToBox; } GHashTable* commandLineGet_options(void) { return argOptionTable; } gchar* commandLineGet_resourcesFile(void) { return argResources; } /** * commandLineGet_coloredMap: * * One can pass options on the command line to create colored maps on planes. * * Returns: an array of plane indexes to be maped, -1 terminated. * * Since: 3.6 */ int* commandLineGet_coloredMap(void) { if (argMapVisuPlaneId && argMapVisuPlaneId[0]) return argMapVisuPlaneId; else return (int*)0; } ToolMatrixScalingFlag commandLineGet_logScale(void) { return argLogScale; } guint commandLineGet_nIsoLines(void) { return (guint)argNIsoLines; } gchar* commandLineGet_bgImage(void) { return argBgImageFile; } float* commandLineGet_isoLinesColor(void) { return argIsoLinesColor; } gchar* commandLineGet_windowMode(void) { return argWindowMode; } guint commandLineGet_iSet(void) { return (guint)argISet; } gchar* commandLineGet_valueFile(void) { return argValueFile; } /** * commandLineGet_mapPrecision: * * The coloured maps can be rendered with more or less accuracy. * * Since: 3.6 * * Returns: the precision requested by the user. */ guint commandLineGet_mapPrecision(void) { return argMapPrecision; } /** * commandLineGet_mapMinMax: * * The coloured maps can be manually scaled. * * Since: 3.6 * * Returns: the scaling values for manual scaling of coloured maps. */ float* commandLineGet_mapMinMax(void) { return argMapMinMax; } /** * commandLineGet_colorMinMax: * * The external data file colourisation can be manually scaled. * * Since: 3.7 * * Returns: the scaling values for manual scaling of external data values. */ GArray* commandLineGet_colorMinMax(void) { return argColorizeRange; } /** * commandLineGet_introspect: * * Used only by introspection scanner. * * Since: 3.6 * * Returns: the parameters of the introspection option. */ gchar* commandLineGet_introspect(void) { return argIntrospect; } /** * commandLineGet_programName: * * Get argv[0]. * * Since: 3.7 * * Returns: the program name used to run V_Sim. */ const gchar* commandLineGet_programName(void) { return argProgName; } /** * commandLineGet_scalingColumn: * * Get the column used to scale nodes, if any given. * * Since: 3.7 * * Returns: -1 if not provided, or a column id. */ int commandLineGet_scalingColumn(void) { return argScalingColumn; } /** * commandLineFree_all: * * Release all allocated memory related to the command line options. * * Since: 3.5 */ void commandLineFree_all(void) { DBG_fprintf(stderr, "Command Line: free all.\n - the arguments\n"); if (argProgName) g_free(argProgName); if (argFileName) g_free(argFileName); if (argResources) g_free(argResources); if (argSpinFileName) g_free(argSpinFileName); if (argExportFileName) g_free(argExportFileName); if (argWindowMode) g_free(argWindowMode); if (argValueFile) g_free(argValueFile); if (argColorizeFileName) g_free(argColorizeFileName); if (argColorizeRange) g_array_free(argColorizeRange, TRUE); if (argVisuScalarFieldFileName) g_free(argVisuScalarFieldFileName); if (argIsoVisuSurfacesFileName) g_free(argIsoVisuSurfacesFileName); if (argIsoValues) g_free(argIsoValues); if (argIsoNames) g_strfreev(argIsoNames); if (argMapVisuPlaneId) g_free(argMapVisuPlaneId); if (argIsoLinesColor) g_free(argIsoLinesColor); if (argBgImageFile) g_free(argBgImageFile); if (argOptionTable) g_hash_table_destroy(argOptionTable); if (argVisuPlanesFileName) g_free(argVisuPlanesFileName); if (argIntrospect) g_free(argIntrospect); DBG_fprintf(stderr, " - the descriptions\n"); g_string_free(short_options, TRUE); g_free(ext_options); g_free(long_options); } v_sim-3.7.0/src/visu_commandLine.h0000644000353400050620000002405012215546105014017 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef VISU_COMMANDLINE_H #define VISU_COMMANDLINE_H /* This .h and .c are here to read parameters from the command line. */ #include #include #include /** * commandLineParse: * @argc: the number of arguments. * @argv: the values of all arguments. * * This method is called at startup to parse the command line * and store all important information. If --help is given, or an unknown * option, a little help is printed on the standard output. * * Returns: 0 if everything goes well. */ int commandLineParse(int argc, char **argv); /** * commandLineExport: * @filename: a path to a filename to create ; * @error: a location to store a possible error. * * Export the known command line options to an XML file. * * Returns: TRUE on success. * * Since: 3.5 */ gboolean commandLineExport(const gchar *filename, GError **error); /** * commandLineGet_ArgFilename: * * This method retrieves the first argument. All other arguments are ignored. * * Returns: the value of the first argument. */ char* commandLineGet_ArgFilename(void); /** * commandLineGet_ArgSpinFileName: * * This method retrieves the second argument. All other arguments are ignored. * * Returns: the value of the second argument. */ char* commandLineGet_ArgSpinFileName(void); /** * commandLineGet_ExportFileName: * * This method retrieves the value of the option --export or -e. This value must * be a valid filename, with an extension known by V_Sim to do the export. * * Returns: the value of the option --export. */ char* commandLineGet_ExportFileName(void); /** * commandLineGet_WithGtk: * * This method tells V_Sim is the GTK interface is needed or not. * * Returns: 1 if the interface is needed. */ int commandLineGet_WithGtk(void); /** * commandLineGet_XWindowGeometry: * @width: an integer to stores the desired width. * @height: an integer to stores the desired height. * * This method retrieves the values of the option --geometry or -g. * These values must be formatted with the following format : &dx&d and they give * the size of the rendering window. * */ void commandLineGet_XWindowGeometry(int *width, int *height); /** * commandLineGet_colorizeFileName: * * This method retrieves the value of the option --colorize or -c. This value must * be a valid filename. If this option is called, V_Sim actually enable * the colorization, even if parameter file doesn't. * * Returns: the value of the option --colorize. */ gchar* commandLineGet_colorizeFileName(void); /** * commandLineGet_colorizeColUsed: * * This method retrieves the value of the option --use-column or -u. This value consists * of three integer values. * * Returns: the three values of the option --use-column, or NULL if this option * is not present. */ int* commandLineGet_colorizeColUsed(void); /** * commandLineGet_colorizePresetColor: * * DEPRECATED, use commandLineGet_presetColor() instead. * * Returns: the value of option --color-preset if set, -1 if not. */ #define commandLineGet_colorizePresetColor() commandLineGet_presetColor(); /** * commandLineGet_presetColor: * * This method returns the value of option --color-preset. * * Returns: the value of option --color-preset if set, -1 if not. */ int commandLineGet_presetColor(void); /** * commandLineGet_translation: * * This method retrieves the value of the option --translate or -t. This value consists * of three floating values. * * Returns: the three values of the option --translate. */ float* commandLineGet_translation(void); /** * commandLineGet_extension: * * This method retrieves the value of the option --expand or -x. This value consists * of three floating values. * * Returns: the three values of the option --expand. */ float* commandLineGet_extension(void); /** * commandLineGet_planesFileName: * * This method retrieves the value of the option --planes or -p. This value must * be a valid filename. * * Returns: the value of the option --planes. */ gchar* commandLineGet_planesFileName(void); /** * commandLineGet_spinHidingMode: * * This method retrieves if the option --hiding-mode or -m has been set. * * Returns: the value of the option. */ int commandLineGet_spinHidingMode(void); /** * commandLineGet_spinAndAtomic: * * This method retrieves if the option --spin-and-atomic or -a has been set. * * Returns: the TRUE if the option exists. */ gboolean commandLineGet_spinAndAtomic(void); /** * commandLineGet_isoValues: * @nb: a location to store an integer. * * This method retrieves the values of the option --ios-values or -v. * * Returns: an array with the values of a size stored in @nb. */ float* commandLineGet_isoValues(int *nb); /** * commandLineGet_isoNames: * @nb: a location to store an integer. * * This method retrieves the names associated to the values of the option --ios-values or -v. * It returns an array of size @nb, but not all element are set since names are not * mandatory. The @nb value is guarantied to by equal to the one returned by * commandLineGet_isoValues(void); * * Returns: an array with the values of a size stored in @nb. */ gchar** commandLineGet_isoNames(int *nb); /** * commandLineGet_scalarFieldFileName: * * This method retrieves the filename given by the option --scalar-field or -f. * * Returns: a filename, the string is owned by V_Sim. */ gchar* commandLineGet_scalarFieldFileName(void); /** * commandLineGet_isoVisuSurfacesFileName: * * This method retrieves the filename given by the option --iso-surfaces or -i. * * Returns: a filename, the string is owned by V_Sim. */ gchar* commandLineGet_isoVisuSurfacesFileName(void); /** * commandLineGet_fitToBox: * * This method gets if the surface should be adapted to the bounding box of the structure. * * Returns: TRUE if the surface should be fitted. */ gboolean commandLineGet_fitToBox(void); /** * commandLineGet_resourcesFile: * * This method gets if a resources file has been given. * * Returns: the name (owned by V_Sim) of the given resources file or NULL if none * was present. */ gchar* commandLineGet_resourcesFile(void); /** * commandLineGet_options: * * This method gets the contents of all -o options. The value is first parsed as * letters to check for a boolean value (F/T), then, a float is used and finally * an integer. If nothing parsed, the option is dismissed. * * Returns: a #GHashTable pointer owned by V_Sim. */ GHashTable* commandLineGet_options(void); int* commandLineGet_coloredMap(void); /** * commandLineGet_logScale: * * Retrieve if a log scale is required for various plots. * * Returns: the logscale method. */ ToolMatrixScalingFlag commandLineGet_logScale(void); /** * commandLineGet_nIsoLines: * * Retrieve if the user asked for isolines on the coloured map (see * commandLineGet_coloredMap()). * * Returns: a positive number if some isolines are required, 0 if not. */ guint commandLineGet_nIsoLines(void); /** * commandLineGet_bgImage: * * Retrieve if the filename to be loaded as a background image. * * Returns: a string or NULL if option is not used. */ gchar* commandLineGet_bgImage(void); /** * commandLineGet_isoLinesColor: * * Retrieve the chosen colour for the iso-lines. * * Returns: an array of three floats or NULL if the colour is auto. * * Since: 3.5 */ float* commandLineGet_isoLinesColor(void); /** * commandLineGet_windowMode: * * Retrieve the windowing mode for V_Sim, 'classic' with the two * rendering and command panel windows ; 'oneWindow' with a joined * version of the two windows or 'renderOnly' with only the rendering window. * * Returns: one of the three strings. * * Since: 3.5 */ gchar* commandLineGet_windowMode(void); /** * commandLineGet_iSet: * * Retrieve the desired id for multi dataset file to render. * * Returns: 0 as default value. * * Since: 3.5 */ guint commandLineGet_iSet(void); /** * commandLineGet_valueFile: * * Retrieve the name of a possible value file, if any has been given. * * Returns: a path (absolute) or NULL if the option has not been * passed. Data are static. * * Since: 3.5 */ gchar* commandLineGet_valueFile(void); void commandLineFree_all(void); guint commandLineGet_mapPrecision(void); float* commandLineGet_mapMinMax(void); gchar* commandLineGet_introspect(void); GArray* commandLineGet_colorMinMax(void); const gchar* commandLineGet_programName(void); int commandLineGet_scalingColumn(void); #endif v_sim-3.7.0/src/visu_basic.c0000644000353400050620000015214112216251070012643 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse mèl : BILLARD, non joignable par mèl ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "visu_basic.h" #include "visu_object.h" #include "visu_rendering.h" #include "visu_extension.h" #include "visu_data.h" #include "visu_elements.h" #include "visu_commandLine.h" #include "opengl.h" #include "visu_dump.h" #include "visu_pairs.h" #include "visu_tools.h" #include "visu_configFile.h" #include "extraFunctions/dataFile.h" #include "extraFunctions/plane.h" #include "extraFunctions/pot2surf.h" #include "extraFunctions/extraNode.h" #include "extraFunctions/map.h" #include "openGLFunctions/objectList.h" #include "openGLFunctions/text.h" #include "openGLFunctions/interactive.h" #include "OSOpenGL/visu_openGL.h" #include "extensions/fogAndBGColor.h" #include "extensions/scale.h" #include "extensions/marks.h" #include "extensions/axes.h" #include "extensions/box.h" #include "extensions/legend.h" #include "extensions/pairs.h" #include "extensions/shade.h" #include "extensions/node_vectors.h" #include "extensions/planes.h" #include "extensions/surfs.h" #include "extensions/maps.h" #include "extensions/forces.h" #include "coreTools/toolConfigFile.h" #include "extraFunctions/geometry.h" #include "renderingMethods/renderingAtomic.h" #include "renderingMethods/renderingSpin.h" #include #include #include /* For the access markers R_OK, W_OK ... */ #include #include /* For the GdkPixbuf, to be removed later. */ #include /** * SECTION:visu_basic * @short_description: Main functions of V_Sim (except graphical * ones). * * There are here the main functions of V_Sim (except for * graphical methods) such as open file. */ /* Valeurs par d�faut pour les chemins utiles dans V_Sim. */ #if SYSTEM_X11 == 1 #define V_SIM_DATA_DIR_DEFAULT "/usr/local/share/v_sim" #define V_SIM_LEGAL_DIR_DEFAULT "/usr/local/share/v_sim" #define V_SIM_PIXMAPS_DIR_DEFAULT "/usr/local/share/v_sim/pixmaps" #define V_SIM_ICONS_DIR_DEFAULT "/usr/local/share/icons" #define V_SIM_PLUGINS_DIR_DEFAULT "/usr/local/lib/v_sim/plug-ins" #define V_SIM_LOCALE_DIR_DEFAULT "/usr/local/share/locale" #endif #if SYSTEM_WIN32 == 1 #define V_SIM_DATA_DIR_DEFAULT "C:\\PROGRAM FILES\\V_Sim\\share\\v_sim" #define V_SIM_LEGAL_DIR_DEFAULT "C:\\PROGRAM FILES\\V_Sim\\share\\doc\\v_sim" #define V_SIM_PIXMAPS_DIR_DEFAULT "C:\\PROGRAM FILES\\V_Sim\\share\\v_sim\\pixmaps" #define V_SIM_ICONS_DIR_DEFAULT "C:\\PROGRAM FILES\\V_Sim\\share\\icons" #define V_SIM_PLUGINS_DIR_DEFAULT "C:\\PROGRAM FILES\\V_Sim\\lib\\v_sim\\plug-ins" #define V_SIM_LOCALE_DIR_DEFAULT "C:\\PROGRAM FILES\\V_Sim\\share\\locale" #endif static gchar *exeLocation = NULL; static gchar *v_sim_data_dir = NULL; static gchar *v_sim_legal_dir = NULL; static gchar *v_sim_pixmaps_dir = NULL; static gchar *v_sim_icons_dir = NULL; static gchar *v_sim_local_conf_dir = NULL; static gchar *v_sim_old_local_conf_dir = NULL; static gchar *v_sim_plugins_dir = NULL; static gchar *v_sim_locale_dir = NULL; static ToolUnits preferedUnit; /* Local methods. */ static gboolean dumpData(gpointer data); static void freeExtension(gpointer data); static void onDataLoaded(VisuObject* obj, VisuData *dataObj, gpointer data); static void setToolFileFormatOption(gpointer key, gpointer value, gpointer data); #define FLAG_PARAMETER_UNIT "main_unit" #define DESC_PARAMETER_UNIT "Define the prefered unit to display files ; string" static gboolean readUnit(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static void exportParameters(GString *data, VisuData *dataObj, VisuGlView *view); /** * visu_basic_init: * * A call to this method is done at startup after having probe the locale of the file * system and having initialized the rendering window. It makes the following actions : * create the visu object to store the signals, initialize the module part (parameters, * and resources), initialize the dump part, the OpenGL part and its extensions, the * storage of elements and the 'colorize with data' part. */ void visu_basic_init(void) { int res; VisuConfigFileEntry *entry; DBG_fprintf(stderr,"--- Initialising variables ---\n"); /* We want to read . as floating point separator : in french it is , */ setlocale(LC_NUMERIC, "C"); tool_matrix_init(); tool_shade_get_type(); preferedUnit = TOOL_UNITS_UNDEFINED; /* Force the creation of the main object class. */ g_type_class_ref(VISU_TYPE_OBJECT); g_signal_connect(VISU_OBJECT_INSTANCE, "dataLoaded", G_CALLBACK(onDataLoaded), (gpointer)0); /* initialise OpenGL. */ DBG_fprintf(stderr,"--- Initialising OpenGL ---\n"); visu_gl_init(); DBG_fprintf(stderr,"--- Initialising dataFile modules ---\n"); res = visu_colorization_init(); if (!res) exit(1); /* Initialise extra functions. */ DBG_fprintf(stderr,"--- Initialising extra functions ---\n"); g_type_class_ref(VISU_TYPE_SURFACES); g_type_class_ref(VISU_TYPE_SCALAR_FIELD); visu_geometry_init(); visu_map_init(); /* Force the creation of some internal classes. */ DBG_fprintf(stderr,"--- Initialising internal classes ---\n"); g_type_class_ref(VISU_TYPE_PAIR_LINK); g_type_class_ref(VISU_TYPE_RENDERING); g_type_class_ref(VISU_TYPE_GL_EXT); visu_gl_ext_axes_getDefault(); visu_gl_ext_box_getDefault(); visu_gl_ext_box_legend_getDefault(); visu_gl_ext_legend_getDefault(); visu_gl_ext_pairs_getDefault(); visu_gl_ext_planes_getDefault(); visu_gl_ext_surfaces_getDefault(); visu_gl_ext_bg_getDefault(); visu_gl_ext_fog_init(); g_type_class_ref(VISU_TYPE_GL_EXT_MARKS); g_type_class_ref(VISU_TYPE_GL_EXT_NODE_VECTORS); g_type_class_ref(VISU_TYPE_GL_EXT_INFOS); g_type_class_ref(VISU_TYPE_GL_EXT_SCALE); g_type_class_ref(VISU_TYPE_GL_EXT_FORCES); g_type_class_ref(VISU_TYPE_DATA); entry = visu_config_file_addEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_UNIT, DESC_PARAMETER_UNIT, 1, readUnit); visu_config_file_entry_setVersion(entry, 3.5f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_PARAMETER, exportParameters); } /** * visu_basic_parseConfigFiles: * @view: (allow-none): current #VisuGlView if any. * * Parse the parameter and the resource file. Used once at startup. * * Returns: a newly allocated #GString if some error occured. */ gchar* visu_basic_parseConfigFiles(VisuGlView *view) { GString *message; char* path; GError *error; gboolean res; char *resFile; message = (GString*)0; DBG_fprintf(stderr,"--- Initialising the parameters ---\n"); /* Look for parameters file */ path = visu_config_file_getValidPath(VISU_CONFIG_FILE_PARAMETER, R_OK, 0); if (path) { error = (GError*)0; res = visu_config_file_load(VISU_CONFIG_FILE_PARAMETER, path, (VisuData*)0, (VisuGlView*)0, &error); if (!res && error) { message = g_string_new(""); g_string_append_printf(message, _("While parsing parameter file '%s':\n\n%s"), path, error->message); g_error_free(error); } g_free(path); } else message = g_string_new("Unable to find a valid parameters file." " Starting with defaults.\n"); DBG_fprintf(stderr,"--- Initialising resources ---\n"); /* Look for resources file */ resFile = commandLineGet_resourcesFile(); if (!resFile) path = visu_config_file_getValidPath(VISU_CONFIG_FILE_RESOURCE, R_OK, 0); else path = g_strdup(resFile); if (path) { error = (GError*)0; res = visu_config_file_load(VISU_CONFIG_FILE_RESOURCE, path, (VisuData*)0, view, &error); if (!res && error) { if (message) g_string_append(message, "\n\n"); else message = g_string_new(""); g_string_append_printf(message, _("While parsing resource file '%s':\n\n%s"), path, error->message); g_error_free(error); } g_free(path); } if (message) return g_string_free(message, FALSE); else return (gchar*)0; } /** * visu_basic_setDataFromCommandLine: * * Read the command line option and set the filenames for a new * #VisuData. The object is not loaded (files are not parsed), just prepared. * * Returns: (transfer full): a newly allocated #VisuData if required. */ VisuData* visu_basic_setDataFromCommandLine(void) { char* filename, *spin_filename; VisuData *newData; newData = (VisuData*)0; DBG_fprintf(stderr, "Visu Basic: create VisuData from command line arguments.\n"); filename = commandLineGet_ArgFilename(); spin_filename = commandLineGet_ArgSpinFileName(); if (filename && !spin_filename) { newData = visu_data_new(); visu_object_setRendering(VISU_OBJECT_INSTANCE, visu_rendering_getByName(VISU_RENDERING_ATOMIC_NAME)); visu_data_addFile(newData, filename, FILE_KIND_POSITION, (ToolFileFormat*)0); } else if(filename && spin_filename) { newData = visu_data_new(); visu_object_setRendering(VISU_OBJECT_INSTANCE, visu_rendering_getByName(VISU_RENDERING_SPIN_NAME)); visu_data_addFile(newData, filename, FILE_KIND_POSITION, (ToolFileFormat*)0); visu_data_addFile(newData, spin_filename, FILE_KIND_SPIN, (ToolFileFormat*)0); } return newData; } static void onDataLoaded(VisuObject* obj _U_, VisuData *dataObj, gpointer data _U_) { visu_extra_node_addLabel(VISU_DATA(dataObj)); } struct _dump { VisuData *data; VisuGlView *view; VisuDump *format; gchar *exportFileName; int width, height; /* Bitmap export only. */ VisuPixmapContext *dumpData; GMainLoop *loop; /* Return. */ int status; }; /** * visu_basic_mainExport: * * This method is called when V_Sim is in export mode from the command line. * * Returns: 0 if everything is normal, 1 if an error occured. */ int visu_basic_mainExport(void) { gchar *message; VisuData *newData; GError *error; gboolean res; struct _dump dt; GList *pnt; GHashTable *opts; VisuBasicCLISet *set; ToolOption *id; VisuGlExtNodes *extNodes; dt.exportFileName = commandLineGet_ExportFileName(); if (!dt.exportFileName) { g_error("This method should be called with" " an argument that is the file name to export to.\n"); } id = (ToolOption*)0; opts = commandLineGet_options(); if (opts) id = (ToolOption*)g_hash_table_lookup(opts, "fileFormatId"); pnt = visu_dump_getAllModules(); if (!id) while (pnt && !tool_file_format_match(TOOL_FILE_FORMAT(pnt->data), dt.exportFileName)) pnt = g_list_next(pnt); else pnt = g_list_nth(pnt, g_value_get_int(tool_option_getValue(id)) - 1); if (!pnt) { g_warning(_("The format can't be found from the" " filename '%s' entered.\n"), dt.exportFileName); g_print(_("Use -o fileFormatId=id to specify a file format" " when the autodetection fails. Get a list of ids" " with option -o list:\n\n")); visu_basic_showOptionHelp(TRUE); return 1; } dt.format = VISU_DUMP(pnt->data); /* We transfer some options to file format. */ if (opts) g_hash_table_foreach(opts, setToolFileFormatOption, (gpointer)dt.format); /* Start the elements related to the main loop. */ dt.loop = g_main_loop_new(NULL, FALSE); g_type_init(); visu_basic_init(); commandLineGet_XWindowGeometry((int*)&(dt.width), (int*)&(dt.height)); if (visu_dump_getGlStatus(dt.format)) { visu_gl_initGraphics(); /* We need to initialise the OpenGL surface as soon as possible to avoid crash in some OpenGL implementations when OpenGL routines may be called while parsing files. */ dt.dumpData = visu_pixmap_context_new((guint)dt.width, (guint)dt.height); if (!dt.dumpData) { g_error("can't create off-screen rendering. Command line" " exportation is not available."); } /* We set the glViewport of this new context. */ glViewport(0, 0, dt.width, dt.height); /* We call the given draw method. */ visu_gl_initContext(); } newData = visu_basic_setDataFromCommandLine(); if (!newData) { if (visu_dump_getGlStatus(dt.format)) visu_pixmap_context_free(dt.dumpData); g_error(_("a file to render is mandatory with the '--export' option.")); } dt.view = visu_gl_view_new(); dt.data = newData; error = (GError*)0; res = visu_object_load(VISU_OBJECT_INSTANCE, newData, 0, (GCancellable*)0, &error); if (!res) { if (visu_dump_getGlStatus(dt.format)) visu_pixmap_context_free(dt.dumpData); g_object_unref(newData); g_error("%s", (error)?error->message:"No error message!"); } error = (GError*)0; dt.status = 0; if (visu_dump_getGlStatus(dt.format)) { message = visu_basic_parseConfigFiles(dt.view); if (message) { g_warning("%s", message); g_free(message); } /* Load extensions by hand. */ extNodes = visu_gl_ext_nodes_new(); visu_gl_ext_nodes_setData(extNodes, dt.view, dt.data); visu_gl_ext_pairs_setData(visu_gl_ext_pairs_getDefault(), dt.view, dt.data); visu_gl_ext_axes_setGlView(visu_gl_ext_axes_getDefault(), dt.view); visu_gl_ext_box_setBox(visu_gl_ext_box_getDefault(), visu_boxed_getBox(VISU_BOXED(dt.data))); visu_gl_ext_frame_setGlView(VISU_GL_EXT_FRAME(visu_gl_ext_box_legend_getDefault()), dt.view); visu_gl_ext_box_legend_setBox(visu_gl_ext_box_legend_getDefault(), visu_boxed_getBox(VISU_BOXED(dt.data))); visu_gl_ext_frame_setGlView(VISU_GL_EXT_FRAME(visu_gl_ext_legend_getDefault()), dt.view); visu_gl_ext_legend_setNodes(visu_gl_ext_legend_getDefault(), VISU_NODE_ARRAY(dt.data)); /* Run a main loop to load everything. */ DBG_fprintf(stderr, "Visu Basic: emitting the " "'dataRendered' signal.\n"); g_signal_emit_by_name(VISU_OBJECT_INSTANCE, "dataRendered", newData, dt.view, NULL); DBG_fprintf(stderr, "Visu Basic: emitting done.\n"); DBG_fprintf(stderr, "Visu Basic: adding the load call back in the queue.\n"); g_idle_add(dumpData, (gpointer)&dt); g_main_loop_run(dt.loop); } else { /* Direct export. */ set = g_malloc0(sizeof(VisuBasicCLISet)); if (!visu_basic_applyCommandLine(dt.data, dt.view, set, &error)) { g_warning("%s", error->message); g_error_free(error); dt.status = 1; } else if (!visu_dump_write(dt.format, dt.exportFileName, dt.width, dt.height, dt.data, (GArray*)0, (ToolVoidDataFunc)0, (gpointer)0, &error) && error) { g_warning("%s", error->message); g_error_free(error); dt.status = 1; } freeExtension(set); } g_object_unref(G_OBJECT(dt.data)); g_object_unref(G_OBJECT(dt.view)); return dt.status; } /** * visu_basic_setExtInfos: * @dataObj: a #VisuData object ; * @view: a #VisuGlView object. * @method: where to draw information ; * @nodes: a possible list of selected nodes, or NULL ; * @data: the information to draw. * * Create and draw possible information on nodes. This method * is mainly used when V_Sim run without the command panel. */ void visu_basic_setExtInfos(VisuData *dataObj, VisuGlView *view, VisuGlExtInfosDrawMethod method, int *nodes, VisuDataNode *data) { gboolean redraw; g_return_if_fail(VISU_IS_DATA(dataObj)); g_return_if_fail((method == EXT_DRAW_METH_OTHER && VISU_IS_DATA_NODE_TYPE(data)) || method != EXT_DRAW_METH_OTHER); DBG_fprintf(stderr, "VisuBasic: set the extension infos with method %d.\n", method); visu_gl_ext_setActive(VISU_GL_EXT(visu_gl_ext_infos_getDefault()), (method != EXT_DRAW_METH_NONE)); redraw = FALSE; switch (method) { case EXT_DRAW_METH_NONE: break; case EXT_DRAW_METH_ID: redraw = visu_gl_ext_infos_drawIds(visu_gl_ext_infos_getDefault(), nodes); break; case EXT_DRAW_METH_TYPE: redraw = visu_gl_ext_infos_drawElements(visu_gl_ext_infos_getDefault(), nodes); break; default: redraw = visu_gl_ext_infos_drawData(visu_gl_ext_infos_getDefault(), data, nodes); } redraw = visu_gl_ext_infos_setGlView(visu_gl_ext_infos_getDefault(), view) || redraw; redraw = visu_gl_ext_infos_setData(visu_gl_ext_infos_getDefault(), dataObj) || redraw; if (redraw) visu_gl_ext_infos_draw(visu_gl_ext_infos_getDefault()); } static void setBgImage(const gchar *filename) { GError *error; GdkPixbuf *pixbuf; gchar *title; gboolean fit; DBG_fprintf(stderr, "Visu Basic: set the background image to '%s'.\n", filename); error = (GError*)0; pixbuf = gdk_pixbuf_new_from_file(filename, &error); if (!pixbuf) { g_warning("%s", error->message); g_error_free(error); return; } fit = TRUE; title = g_path_get_basename(filename); if (!strcmp(title, "logo_grey.png")) { fit = FALSE; g_free(title); title = (gchar*)0; } visu_gl_ext_bg_setImage(visu_gl_ext_bg_getDefault(), gdk_pixbuf_get_pixels(pixbuf), gdk_pixbuf_get_width(pixbuf), gdk_pixbuf_get_height(pixbuf), gdk_pixbuf_get_has_alpha(pixbuf), title, fit); g_object_unref(pixbuf); g_free(title); } static void computeMap(VisuBasicCLISet *set, VisuGlExtMaps *maps, VisuGlExtShade *shade) { int i; float *mM, *marks; float drawnMinMax[2], minmax[2]; g_return_if_fail(set); drawnMinMax[0] = + G_MAXFLOAT; drawnMinMax[1] = - G_MAXFLOAT; /* We create the maps. */ for (i = 0; set->mapsList[i]; i++) { visu_gl_ext_maps_add(maps, set->mapsList[i], (float)commandLineGet_mapPrecision(), set->shade, set->isoLinesColor, FALSE); visu_map_compute(set->mapsList[i]); mM = visu_map_getScaledMinMax(set->mapsList[i]); drawnMinMax[0] = MIN(drawnMinMax[0], mM[0]); drawnMinMax[1] = MAX(drawnMinMax[1], mM[1]); } mM = commandLineGet_mapMinMax(); for (i = 0; set->mapsList[i]; i++) visu_map_setLines(set->mapsList[i], set->nIsolines, (mM)?mM:drawnMinMax); DBG_fprintf(stderr, "Visu Basic: set two marks [%g; %g].\n", drawnMinMax[0], drawnMinMax[1]); if (mM) { minmax[0] = 0.; minmax[1] = 1.; } else { minmax[0] = drawnMinMax[0]; minmax[1] = drawnMinMax[1]; } marks = g_malloc(sizeof(float) * (2 + set->nIsolines)); for (i = 0; i < (gint)set->nIsolines; i++) marks[1 + i] = (minmax[1] - minmax[0]) * (float)(i + 1) / (float)(set->nIsolines + 1) + minmax[0]; marks[0] = drawnMinMax[0]; marks[1 + set->nIsolines] = drawnMinMax[1]; visu_gl_ext_shade_setMarks(shade, marks, 2 + set->nIsolines); g_free(marks); } /** * visu_basic_createExtensions: * @data: a #VisuData object ; * @view: a #VisuGlView object. * @set: a table of options ; * @rebuild: a boolean. * * Create all extensions (planes, surfaces...) for the given data. Use * static values read from visu_basic_applyCommandLine(). This method * is mainly used when V_Sim run without the command panel. */ void visu_basic_createExtensions(VisuData *data, VisuGlView *view, VisuBasicCLISet *set, gboolean rebuild) { VisuGlExtShade *legExt, *dtExt; VisuGlExtPlanes *planeExt; VisuGlExtSurfaces *surfExt; VisuGlExtMaps *mapExt; VisuColorization *dt; double minMax[2]; gint id; /* We create the colourisation extensions, if necessary. */ dt = visu_colorization_get(data, FALSE, (gboolean*)0); if (dt && visu_colorization_getSingleColumnId(dt, &id)) { dtExt = visu_gl_ext_shade_new("Colourisation legend"); visu_gl_ext_shade_setMinMax(dtExt, visu_colorization_getMin(dt, id), visu_colorization_getMax(dt, id)); visu_gl_ext_shade_setShade(dtExt, set->shade); visu_gl_ext_frame_setGlView(VISU_GL_EXT_FRAME(dtExt), view); if (rebuild) visu_gl_ext_frame_draw(VISU_GL_EXT_FRAME(dtExt)); } /* We create the plane extension if necessary. */ if (set->planesList) { DBG_fprintf(stderr, "Visu Basic: create plane extension.\n"); planeExt = visu_gl_ext_planes_new(NULL); visu_gl_ext_setActive(VISU_GL_EXT(planeExt), TRUE); for (id = 0; set->planesList[id]; id++) visu_gl_ext_planes_add(planeExt, set->planesList[id]); if (rebuild) visu_gl_ext_planes_draw(planeExt); } /* We create the surface extension. */ if (set->surfsList) { DBG_fprintf(stderr, "Visu Basic: create surface extension.\n"); surfExt = visu_gl_ext_surfaces_new(NULL); visu_gl_ext_setActive(VISU_GL_EXT(surfExt), TRUE); for (id = 0; set->surfsList[id]; id++) visu_gl_ext_surfaces_add(surfExt, set->surfsList[id]); if (rebuild) visu_gl_ext_surfaces_draw(surfExt); } /* We create the map extension. */ if (set->mapPlaneId) { visu_scalar_field_getMinMax((VisuScalarField*)set->fieldsList->data, minMax); DBG_fprintf(stderr, "Visu Basic: create map extension.\n"); legExt = visu_gl_ext_shade_new("MapLegend"); visu_gl_ext_frame_setScale(VISU_GL_EXT_FRAME(legExt), visu_map_legendScale); visu_gl_ext_frame_setPosition(VISU_GL_EXT_FRAME(legExt), visu_map_legendPosition[0], visu_map_legendPosition[1]); visu_gl_ext_frame_setGlView(VISU_GL_EXT_FRAME(legExt), view); visu_gl_ext_shade_setShade(legExt, set->shade); visu_gl_ext_shade_setMinMax(legExt, minMax[0], minMax[1]); visu_gl_ext_shade_setScaling(legExt, set->logScale); mapExt = visu_gl_ext_maps_new(NULL); visu_gl_ext_maps_setGlView(mapExt, view); computeMap(set, mapExt, legExt); if (rebuild) { visu_gl_ext_maps_draw(mapExt); visu_gl_ext_frame_draw(VISU_GL_EXT_FRAME(legExt)); } } /* We set the background image. */ if (set->bgImage) setBgImage(set->bgImage); } static gboolean dumpData(gpointer data) { GMainContext *context; GError *error; VisuBasicCLISet *set; struct _dump *dt; GArray* image; double *zoomLevel; dt = (struct _dump*)data; /* Here the dump is bitmap only. */ g_return_val_if_fail(visu_dump_getGlStatus(dt->format), FALSE); DBG_fprintf(stderr, "Visu Basic: begin dump exportation.\n"); set = g_malloc0(sizeof(VisuBasicCLISet)); g_object_set_data_full(G_OBJECT(dt->data), "optionSet", set, freeExtension); error = (GError*)0; if (!visu_basic_applyCommandLine(dt->data, dt->view, set, &error)) { g_warning("%s", error->message); g_error_free(error); } else { visu_gl_view_setViewport(dt->view, (guint)dt->width, (guint)dt->height); visu_boxed_setBox(VISU_BOXED(dt->view), VISU_BOXED(dt->data), TRUE); if (visu_dump_getGlStatus(dt->format) && !visu_dump_getBitmapStatus(dt->format)) { /* We unzoom to allow GL to render out-of-the-box points. */ zoomLevel = g_malloc(sizeof(double)); *zoomLevel = MAX(dt->view->camera->gross, 1.f); g_object_set_data_full(G_OBJECT(dt->format), "zoomLevel", zoomLevel, g_free); visu_gl_view_setGross(dt->view, MIN(dt->view->camera->gross, 1.f)); } visu_basic_createExtensions(dt->data, dt->view, set, FALSE); context = g_main_loop_get_context(dt->loop); while(g_main_context_pending(context)) g_main_context_iteration(context, FALSE); visu_gl_ext_rebuildAll(); if (visu_dump_getBitmapStatus(dt->format)) { visu_gl_redraw(dt->view, (GList*)0); /* We copy the pixmap into generic data. */ image = visu_pixmap_getData((guint)dt->width, (guint)dt->height, visu_dump_getAlphaStatus(dt->format)); } else image = (GArray*)0; DBG_fprintf(stderr, "Visu Basic: calling exportation routine.\n"); error = (GError*)0; if (!visu_dump_write(dt->format, dt->exportFileName, dt->width, dt->height, dt->data, image, (ToolVoidDataFunc)0, (gpointer)0, &error) && error) { g_warning("%s", error->message); g_error_free(error); dt->status = 1; } else dt->status = 0; if (image) g_array_free(image, TRUE); } /* We free the pixmap context. */ DBG_fprintf(stderr, "Visu Basic: going to free the context.\n"); visu_pixmap_context_free(dt->dumpData); DBG_fprintf(stderr, "Visu Basic: stopping the main loop.\n"); g_main_loop_quit(dt->loop); return FALSE; } /** * visu_basic_applyCommandLine: * @data: a #VisuData object to apply the options on ; * @view: a #VisuGlView object. * @set: a table of options ; * @error: a location for error report. * * Call all the get methods on the command line options to tune the * given @data. * * Returns: TRUE if complete without error. */ gboolean visu_basic_applyCommandLine(VisuData *visuData, VisuGlView *view, VisuBasicCLISet *set, GError **error) { gchar *planesFile, *surfFile, *fieldFile, *valueFile; int i, j, presetToolShade, nb, surfNb; gboolean somethingIsLoaded, res, new; int *colUsed; float *translations, *extension; float *values; gchar **names; GList *tmplst, *list; GHashTable *table; int *nodes; VisuGlExtInfosDrawId mode; guint info; VisuDataNode *dt; VisuGlExtInfosDrawMethod method; GArray *minMax; VisuColorization *dataFile; g_return_val_if_fail(visuData && set, FALSE); g_return_val_if_fail(error && !*error, FALSE); set->colorFile = (gchar*)0; set->planesList = (VisuPlane**)0; set->surfsList = (VisuSurfaces**)0; set->mapsList = (VisuMap**)0; set->shade = (ToolShade*)0; set->mapPlaneId = (gint*)0; set->logScale = TOOL_MATRIX_SCALING_LINEAR; set->nIsolines = 0; set->isoLinesColor = (ToolColor*)0; set->fieldsList = (GList*)0; set->bgImage = (gchar*)0; surfNb = 0; /* commandLineGet_XWindowGeometry((int*)&width, (int*)&height); */ /* visu_gl_view_setViewport(visuData, width, height); */ /* The value File, maybe used later. */ valueFile = commandLineGet_valueFile(); /* translate argument */ translations = commandLineGet_translation(); if (translations) { visu_data_setXYZtranslation(visuData, translations); visu_data_constrainedInTheBox(visuData); } /* expand argument */ extension = commandLineGet_extension(); if (extension) { if (!translations) visu_data_constrainedInTheBox(visuData); visu_data_replicate(visuData, extension); } /* The shade option. */ presetToolShade = commandLineGet_presetColor(); list = tool_shade_getList(); if (presetToolShade >= 0) { if (presetToolShade >= (int)g_list_length(list)) { g_warning(_("unknown shade id (max is %d)."), g_list_length(list) - 1); set->shade = (ToolShade*)g_list_nth_data(list, 0); } else set->shade = (ToolShade*)g_list_nth_data(list, presetToolShade); DBG_fprintf(stderr, "Visu Basic: load a shade from command line %p.\n", (gpointer)set->shade); } else set->shade = (ToolShade*)g_list_nth_data(list, 0); /* colorize argument */ set->colorFile = commandLineGet_colorizeFileName(); colUsed = commandLineGet_colorizeColUsed(); if (set->colorFile || colUsed) { DBG_fprintf(stderr, "Visu basic : loading a new data file '%s'.\n", set->colorFile); somethingIsLoaded = FALSE; if (set->colorFile) somethingIsLoaded = (visu_colorization_new_fromFile(visuData, set->colorFile, &new, error) != (VisuColorization*)0); else for (i = 0; i < 3; i++) { somethingIsLoaded = somethingIsLoaded || (colUsed[i] <= 0); if (colUsed[i] > 0) g_warning(_("Assign a column data without specifying a data file." " Use -c option or change the value %d."), colUsed[i]); } /* Print errors if necessary. */ if (*error) { g_warning("%s", (*error)->message); g_error_free(*error); *error = (GError*)0; } if (somethingIsLoaded) { dataFile = visu_colorization_get(visuData, FALSE, (gboolean*)0); minMax = commandLineGet_colorMinMax(); if (minMax->len > 0) { visu_colorization_setScaleType(dataFile, VISU_COLORIZATION_MINMAX); for (i = 0; i < (int)minMax->len / 3; i++) { j = g_array_index(minMax, int, 3 * i) - 1; visu_colorization_setMin(dataFile, g_array_index(minMax, float, 3 * i + 1), j); visu_colorization_setMax(dataFile, g_array_index(minMax, float, 3 * i + 2), j); } } for (i = 0; i < 3; i++) visu_colorization_setColUsed(dataFile, (colUsed)?colUsed[i] - 1:0, i); visu_colorization_setShade(dataFile, set->shade); if (commandLineGet_scalingColumn() >= 0) visu_colorization_setScalingUsed(dataFile, commandLineGet_scalingColumn()); visu_colorization_setUsed(visuData, TRUE); } } /* VisuPlanes argument. */ planesFile = (valueFile)?valueFile:commandLineGet_planesFileName(); if (planesFile) { somethingIsLoaded = visu_plane_class_parseXMLFile(planesFile, &set->planesList, error); if (!somethingIsLoaded) return FALSE; else { for (i = 0; set->planesList[i]; i++) visu_boxed_setBox(VISU_BOXED(set->planesList[i]), VISU_BOXED(visuData), TRUE); /* Hide nodes if required. */ res = visu_plane_class_showHideAll(set->planesList, visuData); if (res) g_signal_emit_by_name(G_OBJECT(visuData), "VisibilityChanged", NULL); } } /* Iso-surfaces arguments. */ surfFile = commandLineGet_isoVisuSurfacesFileName(); if (surfFile) { surfNb = 1; set->surfsList = g_malloc(sizeof(VisuSurfaces*) * (surfNb + 1)); somethingIsLoaded = visu_surfaces_loadFile(surfFile, set->surfsList, error); if (!somethingIsLoaded) { surfNb = 0; return FALSE; } else if (commandLineGet_fitToBox()) visu_boxed_setBox(VISU_BOXED(set->surfsList[0]), VISU_BOXED(visuData), TRUE); visu_surfaces_setShowAll(set->surfsList[0], TRUE); set->surfsList[surfNb] = (VisuSurfaces*)0; } /* Scalar-field arguments. */ fieldFile = commandLineGet_scalarFieldFileName(); if (fieldFile) { /* Create an option table for possible spin or complex modifiers. */ table = commandLineGet_options(); /* Call the load method. */ somethingIsLoaded = visu_scalar_field_new_fromFile(fieldFile, &set->fieldsList, table, error); if (!somethingIsLoaded) { surfNb = 0; return FALSE; } else { if (commandLineGet_fitToBox()) for (tmplst = set->fieldsList; tmplst; tmplst = g_list_next(tmplst)) visu_boxed_setBox(VISU_BOXED(tmplst->data), VISU_BOXED(visuData), FALSE); nb = g_list_length(set->fieldsList); set->surfsList = g_malloc0(sizeof(VisuSurfaces*) * (nb + 1)); surfNb = 0; values = commandLineGet_isoValues(&nb); names = commandLineGet_isoNames(&nb); if (values) { tmplst = set->fieldsList; while(tmplst) { for (i = 0; i < nb; i++) res = visu_surfaces_createFromScalarField(set->surfsList, (VisuScalarField*)tmplst->data, values[i], i, names[i]); visu_surfaces_setShowAll(set->surfsList[surfNb++], TRUE); tmplst = g_list_next(tmplst); } } /* We may add the iso-values from a file. */ if (valueFile) { somethingIsLoaded = visu_surfaces_parseXMLFile(valueFile, set->surfsList, (VisuScalarField*)set->fieldsList->data, error); if (!somethingIsLoaded) return FALSE; } } } /* We apply the masking effect of planes, if necessary. */ if (set->surfsList && set->planesList) for (i = 0; set->surfsList[i]; i++) visu_surfaces_hide(set->surfsList[i], set->planesList); /* The coloured map argument. */ set->mapPlaneId = (gint*)commandLineGet_coloredMap(); if (set->mapPlaneId) { if (!set->planesList) g_warning(_("option '--build-map' has been given but" " no plane is available (use '--planes').")); if (!set->fieldsList) g_warning(_("option '--build-map' has been given but" " no scalar field is available (use '--scalar-field').")); if (!set->shade) g_warning(_("option '--build-map' has been given but" " no shade is available (use '--color-preset').")); set->logScale = commandLineGet_logScale(); set->nIsolines = commandLineGet_nIsoLines(); set->isoLinesColor = tool_color_new(commandLineGet_isoLinesColor()); if (set->planesList && set->fieldsList && set->shade) { set->mapsList = g_malloc(sizeof(VisuMap*) * (set->mapPlaneId[0] + 1)); for (i = 1; i <= set->mapPlaneId[0]; i++) { /* We create the maps. */ set->mapsList[i - 1] = visu_map_newFromPlane(set->planesList[set->mapPlaneId[i]]); if (set->mapsList[i - 1]) { visu_map_setField(set->mapsList[i - 1], (VisuScalarField*)set->fieldsList->data, set->logScale, commandLineGet_mapMinMax()); /* We change the visibility of the selected planes. */ visu_plane_setRendered(set->planesList[set->mapPlaneId[i]], FALSE); } } set->mapsList[i - 1] = (VisuMap*)0; } } /* The bg image. */ set->bgImage = commandLineGet_bgImage(); /* The pick information. */ if (valueFile) { if (!visu_gl_ext_marks_parseXMLFile((VisuGlExtMarks*)0, valueFile, &list, &mode, &info, error)) return FALSE; nb = g_list_length(list) + 1; if (mode == DRAW_SELECTED) { nodes = g_malloc(sizeof(int) * nb); nodes[nb] = -1; i = 0; for (tmplst = list; tmplst; tmplst = g_list_next(tmplst)) { if (GPOINTER_TO_INT(tmplst->data) == PICK_SELECTED) { tmplst = g_list_next(tmplst); nodes[i++] = GPOINTER_TO_INT(tmplst->data) - 1; } else if (GPOINTER_TO_INT(tmplst->data) == PICK_REFERENCE_1) { tmplst = g_list_next(tmplst); /* We add the last selection. */ tmplst = g_list_next(tmplst); nodes[i++] = GPOINTER_TO_INT(tmplst->data) - 1; } else if (GPOINTER_TO_INT(tmplst->data) == PICK_HIGHLIGHT) tmplst = g_list_next(tmplst); } g_list_free(list); nodes[i] = -1; } else nodes = (int*)0; if (mode != DRAW_NEVER) { dt = (VisuDataNode*)0; switch (info) { case 0: method = EXT_DRAW_METH_ID; break; case 1: method = EXT_DRAW_METH_TYPE; break; default: method = EXT_DRAW_METH_OTHER; i = 2; for (tmplst = visu_data_node_class_getAll(); tmplst; tmplst = g_list_next(tmplst)) { if (visu_data_node_getUsed(VISU_DATA_NODE(tmplst->data), visuData)) { if (i == (int)info) break; i += 1; } } if (tmplst) dt = VISU_DATA_NODE(tmplst->data); break; } visu_basic_setExtInfos(visuData, view, method, nodes, dt); } } return TRUE; } static void freeExtension(gpointer data) { int i; GList *tmplst; VisuBasicCLISet *set; set = (VisuBasicCLISet*)data; /* Free allocated memory. */ if (set->fieldsList) { for (tmplst = set->fieldsList; tmplst; tmplst = g_list_next(tmplst)) g_object_unref(G_OBJECT(tmplst->data)); g_list_free(set->fieldsList); } if (set->planesList) { for (i = 0; set->planesList[i]; i++) g_object_unref(G_OBJECT(set->planesList[i])); g_free(set->planesList); } if (set->surfsList) { for (i = 0; set->surfsList[i]; i++) g_object_unref(set->surfsList[i]); g_free(set->surfsList); } if (set->mapsList) { for (i = 0; set->mapsList[i]; i++) visu_map_free(set->mapsList[i]); g_free(set->mapsList); } g_free(set); } static void setToolFileFormatOption(gpointer key, gpointer value, gpointer data) { ToolOption *prop; DBG_fprintf(stderr, "Visu Basic: transfer option '%s' to file format.\n", (gchar*)key); prop = tool_file_format_getPropertyByName(TOOL_FILE_FORMAT(data), (const gchar*)key); if (!prop) return; fprintf(stderr, "%p %p\n", (gpointer)tool_option_getValue((ToolOption*)value), (gpointer)tool_option_getValue(prop)); g_value_copy(tool_option_getValue((ToolOption*)value), tool_option_getValue(prop)); } /** * visu_basic_showOptionHelp: * @force: a boolean. * * Display a small help for some options. The output is different from * the -h command line options, here some details about running time * options is displayed like the available file format for * exportation... If @force is TRUE, all possible values are output, * otherwise only those relevant to the user provided command line * options. * * Since: 3.6 * * Returns: TRUE if something is displayed. */ gboolean visu_basic_showOptionHelp(gboolean force) { ToolFileFormatIter iter; GList *pnt; GHashTable *opts; ToolFileFormat *format; guint i; if (!force) { opts = commandLineGet_options(); if (!opts || !g_hash_table_lookup(opts, "list")) return FALSE; } i = 1; for (pnt = visu_dump_getAllModules(); pnt; pnt = g_list_next(pnt)) { format = TOOL_FILE_FORMAT(pnt->data); fprintf(stdout, _("\n#%2d - file format '%s':\n"), i++, tool_file_format_getName(format)); iter.lst = (GList*)0; for (tool_file_format_iterNextProperty(format, &iter); iter.lst; tool_file_format_iterNextProperty(format, &iter)) { fprintf(stdout, " - '%25s'", iter.name); switch (G_VALUE_TYPE(iter.val)) { case G_TYPE_INT: fprintf(stdout, " %10s (%5d): ", _("integer"), g_value_get_int(iter.val)); break; case G_TYPE_BOOLEAN: fprintf(stdout, " %10s (%5d): ", _("boolean"), g_value_get_boolean(iter.val)); break; case G_TYPE_STRING: fprintf(stdout, " %10s: ", _("string")); break; default: g_warning("Unknown type for file format property."); break; } fprintf(stdout, "%s.\n", iter.label); } tool_file_format_iterNextProperty(format, &iter); if (!iter.lst) fprintf(stdout, _("No option for this file format.\n")); } return TRUE; } static gchar* setDir(const gchar* const *sysDirs, const gchar *prefix, const gchar* subDir, const gchar* defaultDir) { gchar *dir; int i; dir = g_build_filename(prefix, subDir, NULL); if (!g_file_test(dir, G_FILE_TEST_IS_DIR)) { g_free(dir); dir = (gchar*)0; /* We try the XDG stuff. */ for (i = 0; sysDirs[i]; i++) { dir = g_build_filename(sysDirs[i], subDir, NULL); if (g_file_test(dir, G_FILE_TEST_IS_DIR)) break; else g_free(dir); dir = (gchar*)0; } } if (!dir) dir = g_strdup(defaultDir); return dir; } /** * visu_basic_setExePath: * @exePath: a path where the V_Sim executable is running in. * * This method is used to tell V_Sim where V_Sim is running (usually * reading from argv[0]. This makes it possible to relocate everything * on the fly. @exePath is copied. * * Since: 3.6 */ void visu_basic_setExePath(const gchar *exePath) { if (exeLocation) g_free(exeLocation); exeLocation = g_strdup(exePath); } /** * setVisuPaths: * * This method sets the paths. On Unix systems, this method sets the paths * from macros defined by configure. On Win32 systems, it reads paths in * a v_sim.ini file found in the current directory or in the C:\windows. */ static void setVisuPaths(void) { #if SYSTEM_WIN32 == 1 #define V_SIM_INI_FILE PACKAGE".ini" GIOChannel *iniFile; gchar *iniPath, *tmp, *me, *prefix; gchar *buffer, *line; GIOStatus res; GError *err; gchar **tokens; gsize length; if (!exeLocation) exeLocation = g_strdup(PACKAGE_TARNAME); v_sim_data_dir = g_strdup(V_SIM_DATA_DIR_DEFAULT); v_sim_legal_dir = g_strdup(V_SIM_LEGAL_DIR_DEFAULT); v_sim_pixmaps_dir = g_strdup(V_SIM_PIXMAPS_DIR_DEFAULT); v_sim_icons_dir = g_strdup(V_SIM_ICONS_DIR_DEFAULT); v_sim_plugins_dir = g_strdup(V_SIM_PLUGINS_DIR_DEFAULT); v_sim_locale_dir = g_strdup(V_SIM_LOCALE_DIR_DEFAULT); iniPath = g_strdup(V_SIM_INI_FILE); /* Try to find the INI file from cwd. */ prefix = (gchar*)0; iniFile = g_io_channel_new_file(iniPath, "r", (GError**)0); if (iniFile) prefix = g_get_current_dir(); /* Try to find the INI file from the name of the executable. */ if (!iniFile) { g_free(iniPath); if (g_file_test(exeLocation, G_FILE_TEST_IS_SYMLINK)) tmp = g_file_read_link(exeLocation, (GError**)0); else tmp = g_strdup(exeLocation); me = tool_path_normalize(tmp); g_free(tmp); DBG_fprintf(stderr, "Visu Basic: running program is '%s'.\n", me); /* From the location of the executable, we take the base dir. */ prefix = g_path_get_dirname(me); g_free(me); iniPath = g_build_filename(prefix, V_SIM_INI_FILE, NULL); iniFile = g_io_channel_new_file(iniPath, "r", (GError**)0); } /* Try to find the INI file in the Windows directory. */ if (!iniFile) { g_free(iniPath); prefix = g_strdup("C:\\WINDOWS"); iniPath = g_build_filename(prefix, V_SIM_INI_FILE, NULL); iniFile = g_io_channel_new_file(iniPath, "r", (GError**)0); } if (iniFile) { buffer = (gchar*)0; err = (GError*)0; do { res = g_io_channel_read_line(iniFile, &line, &length, NULL, &err); if (line && res == G_IO_STATUS_NORMAL) { tokens = g_strsplit(line, "=", 2); if (!strcmp(g_strstrip(tokens[0]), "data_dir") && tokens[1]) { g_free(v_sim_data_dir); tmp = g_strstrip(tokens[1]); if (g_path_is_absolute(tmp)) v_sim_data_dir = g_strdup(tmp); else v_sim_data_dir = g_build_filename(prefix, tmp, NULL); } if (!strcmp(g_strstrip(tokens[0]), "legal_dir") && tokens[1]) { g_free(v_sim_legal_dir); tmp = g_strstrip(tokens[1]); if (g_path_is_absolute(tmp)) v_sim_legal_dir = g_strdup(tmp); else v_sim_legal_dir = g_build_filename(prefix, tmp, NULL); } if (!strcmp(g_strstrip(tokens[0]), "pixmaps_dir") && tokens[1]) { g_free(v_sim_pixmaps_dir); tmp = g_strstrip(tokens[1]); if (g_path_is_absolute(tmp)) v_sim_pixmaps_dir = g_strdup(tmp); else v_sim_pixmaps_dir = g_build_filename(prefix, tmp, NULL); } if (!strcmp(g_strstrip(tokens[0]), "icons_dir") && tokens[1]) { g_free(v_sim_icons_dir); tmp = g_strstrip(tokens[1]); if (g_path_is_absolute(tmp)) v_sim_icons_dir = g_strdup(tmp); else v_sim_icons_dir = g_build_filename(prefix, tmp, NULL); } if (!strcmp(g_strstrip(tokens[0]), "plugins_dir") && tokens[1]) { g_free(v_sim_plugins_dir); tmp = g_strstrip(tokens[1]); if (g_path_is_absolute(tmp)) v_sim_plugins_dir = g_strdup(tmp); else v_sim_plugins_dir = g_build_filename(prefix, tmp, NULL); } if (!strcmp(g_strstrip(tokens[0]), "locale_dir") && tokens[1]) { g_free(v_sim_locale_dir); tmp = g_strstrip(tokens[1]); if (g_path_is_absolute(tmp)) v_sim_locale_dir = g_strdup(tmp); else v_sim_locale_dir = g_build_filename(prefix, tmp, NULL); } g_strfreev(tokens); g_free(line); } } while (res != G_IO_STATUS_EOF); g_io_channel_shutdown (iniFile, FALSE, (GError**)0); g_io_channel_unref (iniFile); } g_free(iniPath); #endif #if SYSTEM_X11 == 1 const gchar* const *sysDirs; gchar *me, *prefix, *tmp; #if DEBUG == 1 int i; #endif /* We try to get the dirs from XDG specs, otherwise we fall back to hard coded values at compilation time. */ #if GLIB_MINOR_VERSION > 5 sysDirs = g_get_system_data_dirs(); #if DEBUG == 1 fprintf(stderr, "Visu Basic: available data dirs:\n"); for (i = 0; sysDirs[i]; i++) fprintf(stderr, " | '%s'.\n", sysDirs[i]); #endif #else sysDirs = g_malloc(sizeof(const gchar*)); sysDirs[0] = (const gchar*)0; #endif if (!exeLocation) exeLocation = g_strdup(PACKAGE_TARNAME); if (g_file_test(exeLocation, G_FILE_TEST_IS_SYMLINK)) tmp = g_file_read_link(exeLocation, (GError**)0); else tmp = g_strdup(exeLocation); me = tool_path_normalize(tmp); g_free(tmp); DBG_fprintf(stderr, "Visu Basic: running program is '%s'.\n", me); /* From the location of the executable, we take the base dir or its parents if the basedir is bin. */ prefix = g_path_get_dirname(me); g_free(me); me = g_path_get_basename(prefix); if (!strcmp(me, "bin")) { g_free(me); me = prefix; prefix = g_path_get_dirname(me); } g_free(me); DBG_fprintf(stderr, " | prefix is '%s'.\n", prefix); v_sim_data_dir = setDir(sysDirs, prefix, "share/" PACKAGE, DATA_DIR); v_sim_legal_dir = setDir(sysDirs, prefix, "share/doc/" PACKAGE, LEGAL_DIR); v_sim_pixmaps_dir = setDir(sysDirs, prefix, "share/" PACKAGE "/pixmaps", PIXMAPS_DIR); v_sim_icons_dir = setDir(sysDirs, prefix, "share/icons", ICONS_DIR); v_sim_plugins_dir = setDir(sysDirs, prefix, "lib/" PACKAGE "/plug-ins", PLUGINS_DIR); v_sim_locale_dir = setDir(sysDirs, prefix, "share/locale", LOCALE_DIR); g_free(prefix); #endif /* Create the local dirs. */ #if GLIB_MINOR_VERSION > 5 v_sim_local_conf_dir = g_build_filename(g_get_user_config_dir(), "v_sim", NULL); #else v_sim_local_conf_dir = g_build_filename(g_get_home_dir(), ".config/v_sim", NULL); #endif if (!v_sim_local_conf_dir) g_warning("WARNING! Impossible to get the default" " path $XDG_CONFIG_HOME/v_sim.\n"); v_sim_old_local_conf_dir = g_build_filename(g_get_home_dir(), ".v_sim", NULL); DBG_fprintf(stderr, "Visu Basic: data directory : '%s'.\n", v_sim_data_dir); DBG_fprintf(stderr, "Visu Basic: local conf directory: '%s'.\n", v_sim_local_conf_dir); DBG_fprintf(stderr, "Visu Basic: legal directory : '%s'.\n", v_sim_legal_dir); DBG_fprintf(stderr, "Visu Basic: pixmaps directory : '%s'.\n", v_sim_pixmaps_dir); DBG_fprintf(stderr, "Visu Basic: icons directory : '%s'.\n", v_sim_icons_dir); DBG_fprintf(stderr, "Visu Basic: plug-ins directory : '%s'.\n", v_sim_plugins_dir); DBG_fprintf(stderr, "Visu Basic: locale directory : '%s'.\n", v_sim_locale_dir); } /** * visu_basic_getDataDir: * * Get the static string where V_Sim looks for its data files. * * Since: 3.4 * * Returns: (transfer none): a string owned by V_Sim. */ const gchar* visu_basic_getDataDir(void) { if (!v_sim_data_dir) setVisuPaths(); return v_sim_data_dir; } /** * visu_basic_getLegalDir: * * Get the static string where V_Sim looks for its legal files. * * Since: 3.4 * * Returns: (transfer none): a string owned by V_Sim. */ const gchar* visu_basic_getLegalDir(void) { if (!v_sim_legal_dir) setVisuPaths(); return v_sim_legal_dir; } /** * visu_basic_getPixmapsDir: * * Get the static string where V_Sim looks for its pixmap files. * * Since: 3.4 * * Returns: (transfer none): a string owned by V_Sim. */ const gchar* visu_basic_getPixmapsDir(void) { if (!v_sim_pixmaps_dir) setVisuPaths(); return v_sim_pixmaps_dir; } /** * visu_basic_getIconsDir: * * Get the static string where V_Sim looks for its icon files. * * Since: 3.4 * * Returns: (transfer none): a string owned by V_Sim. */ const gchar* visu_basic_getIconsDir(void) { if (!v_sim_icons_dir) setVisuPaths(); return v_sim_icons_dir; } /** * visu_basic_getLocalDir: * * Get the static string where V_Sim looks for its user configuration files. * * Since: 3.4 * * Returns: (transfer none): a string owned by V_Sim. */ const gchar* visu_basic_getLocalDir(void) { if (!v_sim_local_conf_dir) setVisuPaths(); return v_sim_local_conf_dir; } /** * visu_basic_getOldLocalDir: * * Get the static string where V_Sim looks for its user configuration * files (old location). * * Since: 3.4 * * Returns: (transfer none): a string owned by V_Sim. */ const gchar* visu_basic_getOldLocalDir(void) { if (!v_sim_old_local_conf_dir) setVisuPaths(); return v_sim_old_local_conf_dir; } /** * visu_basic_getPluginsDir: * * Get the static string where V_Sim looks for its plug-in files. * * Since: 3.4 * * Returns: (transfer none): a string owned by V_Sim. */ const gchar* visu_basic_getPluginsDir(void) { if (!v_sim_plugins_dir) setVisuPaths(); return v_sim_plugins_dir; } /** * visu_basic_getLocaleDir: * * Get the static string where V_Sim looks for its localisation files. * * Since: 3.4 * * Returns: (transfer none): a string owned by V_Sim. */ const gchar* visu_basic_getLocaleDir(void) { if (!v_sim_locale_dir) setVisuPaths(); return v_sim_locale_dir; } /** * visu_basic_freeAll: * * This routine is called by V_Sim when quiting and it frees the memory * used by visu_basic. * * Since: 3.5 */ void visu_basic_freeAll(void) { DBG_fprintf(stderr, "Visu Basic: free all.\n - the paths\n"); g_free(v_sim_data_dir); g_free(v_sim_legal_dir); g_free(v_sim_pixmaps_dir); g_free(v_sim_plugins_dir); g_free(v_sim_locale_dir); g_free(v_sim_local_conf_dir); g_free(v_sim_old_local_conf_dir); DBG_fprintf(stderr, " - the color storage\n"); tool_color_freeAll(); g_object_unref(visu_gl_ext_axes_getDefault()); g_object_unref(visu_gl_ext_box_getDefault()); g_object_unref(visu_gl_ext_box_legend_getDefault()); g_object_unref(visu_gl_ext_legend_getDefault()); g_object_unref(visu_gl_ext_pairs_getDefault()); g_object_unref(visu_gl_ext_planes_getDefault()); g_object_unref(visu_gl_ext_surfaces_getDefault()); } /** * visu_basic_getMainContext: * * Even without GUI, V_Sim requires to run a main loop. This method is * to get the main loop. * * Since: 3.6 * * Returns: (transfer none): the main loop, as defined in GLib. */ GMainContext* visu_basic_getMainContext(void) { return g_main_context_default(); } /* Resources. */ /** * visu_basic_getPreferedUnit: * * By setting the prefered unit, when a file is load, V_Sim tries to * render it in this prefered unit. * * Since: 3.5 * * Returns: the prefered unit set by the user (default is * #TOOL_UNITS_UNDEFINED). */ ToolUnits visu_basic_getPreferedUnit(void) { return preferedUnit; } /** * visu_basic_setPreferedUnit: * @unit: a #ToolUnits value. * * By setting the prefered unit, when a file is load, V_Sim tries to * render it in this prefered unit. * * Since: 3.5 * * Returns: TRUE if the prefered unit is actually changed. */ gboolean visu_basic_setPreferedUnit(ToolUnits unit) { if (unit == preferedUnit) return FALSE; preferedUnit = unit; return TRUE; } static gboolean readUnit(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { gchar **tokens; ToolUnits unit; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readString(lines[0], position, &tokens, 1, FALSE, error)) return FALSE; unit = tool_physic_getUnitFromName(tokens[0]); if (unit == TOOL_UNITS_UNDEFINED) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d: unit '%s' is unknown.\n"), position, tokens[0]); g_strfreev(tokens); return FALSE; } g_strfreev(tokens); preferedUnit = unit; return TRUE; } static void exportParameters(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { const gchar **units; if (preferedUnit != TOOL_UNITS_UNDEFINED) { units = tool_physic_getUnitNames(); g_string_append_printf(data, "# %s\n", DESC_PARAMETER_UNIT); g_string_append_printf(data, "%s: %s\n\n", FLAG_PARAMETER_UNIT, units[preferedUnit]); } } v_sim-3.7.0/src/visu_basic.h0000644000353400050620000001274612215546105012663 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef VISU_BASIC_H #define VISU_BASIC_H #include #include "visu_data.h" #include "visu_tools.h" #include "coreTools/toolFileFormat.h" #include "coreTools/toolOptions.h" #include "coreTools/toolShade.h" #include "coreTools/toolPhysic.h" #include "extraFunctions/plane.h" #include "extraFunctions/surfaces.h" #include "extraFunctions/scalarFields.h" #include "extraFunctions/map.h" #include "extensions/infos.h" G_BEGIN_DECLS /** * VisuBasicCLISet: * @colorFile: TODO * @planesList: TODO * @surfsList: TODO * @fieldsList: TODO * @mapsList: TODO * @shade: TODO * @mapPlaneId: TODO * @logScale: TODO * @nIsolines: TODO * @isoLinesColor: TODO * @bgImage: TODO * * Internal object to store values read from command line. */ typedef struct _VisuBasicCLISet VisuBasicCLISet; struct _VisuBasicCLISet { gchar *colorFile; VisuPlane **planesList; VisuSurfaces **surfsList; GList *fieldsList; VisuMap **mapsList; ToolShade *shade; gint *mapPlaneId; ToolMatrixScalingFlag logScale; guint nIsolines; ToolColor* isoLinesColor; gchar *bgImage; }; void visu_basic_init(void); /* Common parse routines. */ gchar* visu_basic_parseConfigFiles(VisuGlView *view); gboolean visu_basic_applyCommandLine(VisuData *data, VisuGlView *view, VisuBasicCLISet *set, GError **error); gboolean visu_basic_showOptionHelp(gboolean force); /* Export routines. */ void visu_basic_createExtensions(VisuData *data, VisuGlView *view, VisuBasicCLISet *set, gboolean rebuild); VisuData* visu_basic_setDataFromCommandLine(void); void visu_basic_setExtInfos(VisuData *dataObj, VisuGlView *view, VisuGlExtInfosDrawMethod method, int *nodes, VisuDataNode *data); int visu_basic_mainExport(void); /* Some resources. */ ToolUnits visu_basic_getPreferedUnit(void); gboolean visu_basic_setPreferedUnit(ToolUnits unit); /** * VISU_VERSION: * * The value of current compiled version. */ #define VISU_VERSION VERSION /** * VISU_WEB_SITE: * * URL where to find info on V_Sim. */ #define VISU_WEB_SITE "http://inac.cea.fr/L_Sim/V_Sim" /* Main paths. */ void visu_basic_setExePath(const gchar *exePath); /** * V_SIM_DATA_DIR: * * The directory where data files are stored. */ #define V_SIM_DATA_DIR visu_basic_getDataDir() /** * V_SIM_LEGAL_DIR: * * The directory where copyright and author files are stored. */ #define V_SIM_LEGAL_DIR visu_basic_getLegalDir() /** * V_SIM_PIXMAPS_DIR: * * The directory where pixmap files are stored. */ #define V_SIM_PIXMAPS_DIR visu_basic_getPixmapsDir() /** * V_SIM_ICONS_DIR: * * The directory where icon files are stored. */ #define V_SIM_ICONS_DIR visu_basic_getIconsDir() /** * V_SIM_LOCAL_CONF_DIR: * * The directory where user configuration files are stored. */ #define V_SIM_LOCAL_CONF_DIR visu_basic_getLocalDir() /** * V_SIM_OLD_LOCAL_CONF_DIR: * * Old value of #V_SIM_LOCAL_CONF_DIR. */ #define V_SIM_OLD_LOCAL_CONF_DIR visu_basic_getOldLocalDir() /** * V_SIM_PLUGINS_DIR: * * The directory where plugin files are stored. */ #define V_SIM_PLUGINS_DIR visu_basic_getPluginsDir() /** * V_SIM_LOCALE_DIR: * * The directory where locale files are stored. */ #define V_SIM_LOCALE_DIR visu_basic_getLocaleDir() const gchar* visu_basic_getDataDir(void); const gchar* visu_basic_getLegalDir(void); const gchar* visu_basic_getPixmapsDir(void); const gchar* visu_basic_getIconsDir(void); const gchar* visu_basic_getLocalDir(void); const gchar* visu_basic_getOldLocalDir(void); const gchar* visu_basic_getPluginsDir(void); const gchar* visu_basic_getLocaleDir(void); /* Miscellaneous. */ GMainContext* visu_basic_getMainContext(void); void visu_basic_freeAll(void); G_END_DECLS #endif v_sim-3.7.0/src/visu_plugins.c0000644000353400050620000002620112215546105013245 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include "visu_plugins.h" #include "visu_tools.h" #include "visu_basic.h" /** * SECTION:visu_plugins * @short_description: Introduces the basic handling of plug-ins. * * * Plug-ins are made of shared library presenting some common routines. These routines are of kind: * * * pluginsInitFunc(), such a routine is called at V_Sim startup. It should initialise all things required by the module. For instance, if the module is used to add a load method for atomic rendering, it should call visu_rendering_addFileFormat() to declare itself to V_Sim. * * * pluginsDescriptionFunc(), is used to get a short description of the plug-in. * * * pluginsAuthorsFunc(), gives a list of authors for the plug-in. * * * pluginsIconFunc(), returns a path where a small icon representing the plug-in can be found. * * * All these routines must be named using the name of the module. When the module is loaded into memory, V_Sim will try to find these methods and will store them into the #VisuPlugin structure for future calls. * * * At the present time, only the Unix version is functional. Moreover, currently, no stable API is available from the main program. This should be corrected quickly. * */ /** * VisuPlugin_struct: * @hook: a pointer to the opened shared library ; * @name: the name of the module (on UNIX it is lib{name}.so) ; * @init: a pointer on the init method ; * @getDescription: a pointer to the description method ; * @getAuthors: a pointer to the author method. * @getIcon: a pointer to the icon method. * * This structure is used to deals with a plugin. It gives handles * to the public method of the plugin. */ struct _VisuPlugin { GModule *hook; gchar *name; VisuPluginInitFunc init; VisuPluginInitFunc initGtk; VisuPluginInfoFunc getDescription; VisuPluginInfoFunc getAuthors; VisuPluginInfoFunc getIcon; VisuPluginFreeFunc finalise; }; /* Local variables. */ GList *presentPlugins = NULL; /* Local methods. */ static gboolean visuPluginLoad_byPath(const gchar* path); /** * visu_plugins_getListLoaded: * * On startup, plugins are loaded according to a list present in the configuration * file. It is possible to access the list of all loaded plugins with this method. * * Returns: (element-type VisuPlugin) (transfer none): a #GList owned by V_Sim of #VisuPlugin objects. */ GList* visu_plugins_getListLoaded() { if (!presentPlugins) visu_plugins_init(); return presentPlugins; } static gboolean visuPluginLoad_byPath(const gchar* path) { gchar *func, *name, *ptChar, *libname; VisuPlugin *plugin; gboolean res; plugin = g_malloc(sizeof(VisuPlugin)); plugin->hook = g_module_open(path, 0); /* G_MODULE_BIND_LOCAL); */ if (plugin->hook) { libname = g_path_get_basename(path); name = g_strdup(libname + 3); g_free(libname); #if SYSTEM_WIN32 == 1 ptChar = g_strrstr(name, "-"); #endif #if SYSTEM_X11 == 1 ptChar = strchr(name, '.'); #endif if (ptChar) *ptChar = '\0'; func = g_strdup_printf("%sInit", name); res = g_module_symbol(plugin->hook, func, (void*)&(plugin->init)); g_free(func); if (!res) { g_warning("The plugin '%s' doesn't have any %sInit() method.", name, name); g_free(plugin); g_free(name); return FALSE; } func = g_strdup_printf("%sGet_description", name); res = g_module_symbol(plugin->hook, func, (void*)&(plugin->getDescription)); g_free(func); if (!res) { g_warning("The plugin '%s' doesn't have any %sGet_description() method.", name, name); g_free(plugin); g_free(name); return FALSE; } func = g_strdup_printf("%sGet_authors", name); res = g_module_symbol(plugin->hook, func, (void*)&(plugin->getAuthors)); g_free(func); if (!res) { g_warning("The plugin '%s' doesn't have any %sGet_authors() method.", name, name); g_free(plugin); g_free(name); return FALSE; } func = g_strdup_printf("%sGet_icon", name); res = g_module_symbol(plugin->hook, func, (void*)&(plugin->getIcon)); if (!res) plugin->getIcon = (VisuPluginInfoFunc)0; g_free(func); func = g_strdup_printf("%sInitGtk", name); res = g_module_symbol(plugin->hook, func, (void*)&(plugin->initGtk)); g_free(func); if (!res) plugin->initGtk = (VisuPluginInitFunc)0; func = g_strdup_printf("%sFree", name); res = g_module_symbol(plugin->hook, func, (void*)&(plugin->finalise)); g_free(func); if (!res) plugin->finalise = (VisuPluginFreeFunc)0; plugin->name = g_strdup(name); g_free(name); presentPlugins = g_list_prepend(presentPlugins, (gpointer)plugin); } else { g_warning("The plugin '%s' is not a loadable module, error:\n%s.", path, g_module_error()); g_free(plugin); return FALSE; } return TRUE; } static GList* visuPluginsParseDir(const gchar* path) { GDir *gdir; const gchar *fileFromDir; GPatternSpec *pattern; GList* lst; lst = (GList*)0; gdir = g_dir_open(path, 0, NULL); if (!gdir) return lst; pattern = g_pattern_spec_new("lib*."G_MODULE_SUFFIX); fileFromDir = g_dir_read_name(gdir); while (fileFromDir) { if (g_pattern_match_string(pattern, fileFromDir)) lst = g_list_prepend(lst, g_build_filename(path, fileFromDir, NULL)); fileFromDir = g_dir_read_name(gdir); } g_dir_close(gdir); g_pattern_spec_free(pattern); return lst; } /* Parse install directory and $XDG_CONFIG_HOME/v_sim/plugins to find files and create a gchar** array of names (as full path). */ static gchar** visuPluginsGet_installedPlugins() { gchar **data, *path; GList* lst_install, *lst_home, *tmpLst; int size; /* Try the install dir. */ lst_install = visuPluginsParseDir(V_SIM_PLUGINS_DIR); /* Try the home dir. */ path = g_build_filename(V_SIM_LOCAL_CONF_DIR, "plugins", NULL); lst_home = visuPluginsParseDir(path); g_free(path); size = g_list_length(lst_install) + g_list_length(lst_home) + 1; data = g_malloc(sizeof(gchar*) * size); size = 0; tmpLst = lst_install; while(tmpLst) { data[size] = (gchar*)tmpLst->data; size += 1; tmpLst = g_list_next(tmpLst); } g_list_free(lst_install); tmpLst = lst_home; while(tmpLst) { data[size] = (gchar*)tmpLst->data; size += 1; tmpLst = g_list_next(tmpLst); } g_list_free(lst_home); data[size] = (gchar*)0; return data; } /** * visu_plugins_init: * * Initialise this part of code. Should not be called (called once * by V_Sim on startup only). It try to load * all plugins found in the installation directory and in the user directory. */ void visu_plugins_init() { gchar **plugins; gboolean res; int i; if (g_module_supported() && !presentPlugins) { plugins = visuPluginsGet_installedPlugins(); for (i = 0; plugins[i]; i++) { DBG_fprintf(stderr, "Visu Plugins : try to load the plugin '%s'.\n", plugins[i]); res = visuPluginLoad_byPath(plugins[i]); if (res) ((VisuPlugin*)presentPlugins->data)->init(); } g_strfreev(plugins); } } /** * visu_plugins_free: * * Finalise the part of V_Sim related to plug-ins. Should not be * called (called once by V_Sim on stopping only). * * Since: 3.7 */ void visu_plugins_free() { GList *plugins; plugins = visu_plugins_getListLoaded(); for (plugins = visu_plugins_getListLoaded(); plugins; plugins = g_list_next(plugins)) { DBG_fprintf(stderr, "Visu Plugins: try to finalise the plugin '%s'.\n", ((VisuPlugin*)plugins->data)->name); if (((VisuPlugin*)plugins->data)->finalise) ((VisuPlugin*)plugins->data)->finalise(); } } /** * visu_plugin_getName: * @plug: a #VisuPlugin object. * * Return a string with the name. * * Returns: a private string. * * Since: 3.6 */ const gchar* visu_plugin_getName(VisuPlugin *plug) { g_return_val_if_fail(plug, (const gchar*)0); return plug->name; } /** * visu_plugin_getDescription: * @plug: a #VisuPlugin object. * * Return a string with the description of the plugin. * * Returns: a private string. * * Since: 3.6 */ const gchar* visu_plugin_getDescription(VisuPlugin *plug) { g_return_val_if_fail(plug, (const gchar*)0); if (plug->getDescription) return plug->getDescription(); else return (const gchar*)0; } /** * visu_plugin_getIconPath: * @plug: a #VisuPlugin object. * * Return a string with the path to find an icon representing the plugin. * * Returns: a private string. * * Since: 3.6 */ const gchar* visu_plugin_getIconPath(VisuPlugin *plug) { g_return_val_if_fail(plug, (const gchar*)0); if (plug->getIcon) return plug->getIcon(); else return (const gchar*)0; } /** * visu_plugin_getAuthors: * @plug: a #VisuPlugin object. * * Return a string with the list of authors. * * Returns: a private string. * * Since: 3.6 */ const gchar* visu_plugin_getAuthors(VisuPlugin *plug) { g_return_val_if_fail(plug, (const gchar*)0); if (plug->getAuthors) return plug->getAuthors(); else return (const gchar*)0; } /** * visu_plugin_initGtk: * @plug: a #VisuPlugin object. * * Run the initGtk() method of the plugin, if it exists. * * Since: 3.6 */ void visu_plugin_initGtk(VisuPlugin *plug) { g_return_if_fail(plug); if (plug->initGtk) plug->initGtk(); } v_sim-3.7.0/src/visu_plugins.h0000644000353400050620000000573712215546105013265 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include /** * VisuPluginInitFunc: * * This kind of method should exist in all plugins with the * name '{module_name}Init'. It is called by V_Sim when the module is loaded. * * Returns: TRUE if it loads correctly. */ typedef gboolean (*VisuPluginInitFunc)(void); /** * VisuPluginFreeFunc: * * This kind of method may exist in all plugins with the * name '{module_name}Free'. It is called by V_Sim when it stops. * * Since: 3.7 */ typedef void (*VisuPluginFreeFunc)(void); /** * VisuPluginInfoFunc: * * This kind of method should exist in all plugins it give a description of * what the plugin does. It must be named '{module_name}Get_description'. * * Returns: a string in UTF-8 owned by the plugin. */ typedef const gchar* (*VisuPluginInfoFunc)(void); struct _VisuPlugin; /** * VisuPlugin: * * Short way to address #_VisuPlugin objects. */ typedef struct _VisuPlugin VisuPlugin; void visu_plugins_init(); GList* visu_plugins_getListLoaded(); void visu_plugins_free(); const gchar* visu_plugin_getName(VisuPlugin *plug); const gchar* visu_plugin_getDescription(VisuPlugin *plug); const gchar* visu_plugin_getIconPath(VisuPlugin *plug); const gchar* visu_plugin_getAuthors(VisuPlugin *plug); void visu_plugin_initGtk(VisuPlugin *plug); v_sim-3.7.0/src/visu_dump.c0000644000353400050620000002412612215546105012535 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "visu_dump.h" #include "visu_tools.h" #include "dumpModules/externalDumpModules.h" /** * SECTION:visu_dump * @short_description: Some resources to add the ability to export the * rendered data to an other format (usually image format). * * V_Sim can export loaded data to othe formats. This module * descibes the methods and structure to create a dumping * extension. Basically, a dumping extension is just a #FileFormat and * a method that is called when exporting is required. No method * exists to create a dumping extension, just allocate and initialize * the #DumpType structure. * * The #writeDumpFunc should suspend its process to allow the * calling program to refresh itself if the dump process is * slow. Ideally, the argument @waitFunction should be called exactly * 100 times. */ static GQuark quark; static GList *allDumpModuleList = (GList*)0; static int nbDumpModules = 0; static gboolean internalInit = FALSE; static VisuDumpClass *my_class = (VisuDumpClass*)0; /** * VisuDump: * @bitmap: (in): TRUE if the format requires to export the view * into a bitmap ; * @glRequired: (in): TRUE if the method requires to run OpenGL. * @fileType: a #ToolFileFormat ; * @hasAlpha: TRUE if the format support alpha channel ; * @writeFunc: (scope call): a pointer to a write func. * * This structure is used to store a dumping extension. Such an * extension is characterized by its #ToolFileFormat and a method that can * write a file from the current rendered data. */ struct _VisuDump { ToolFileFormat parent; gboolean bitmap, glRequired; gboolean hasAlpha; VisuDumpWriteFunc writeFunc; gboolean dispose_has_run; }; struct _VisuDumpClass { ToolFileFormatClass parent; }; static void visu_dump_dispose(GObject* obj); static void visu_dump_finalize(GObject* obj); static void initDumpList(); G_DEFINE_TYPE(VisuDump, visu_dump, TOOL_TYPE_FILE_FORMAT) static void visu_dump_class_init(VisuDumpClass *klass) { DBG_fprintf(stderr, "Visu Dump: creating the class of the object.\n"); /* Connect freeing methods. */ G_OBJECT_CLASS(klass)->dispose = visu_dump_dispose; G_OBJECT_CLASS(klass)->finalize = visu_dump_finalize; my_class = klass; quark = g_quark_from_static_string("visu_dump"); } static void visu_dump_dispose(GObject* obj) { DBG_fprintf(stderr, "Visu Dump: dispose object %p.\n", (gpointer)obj); if (VISU_DUMP(obj)->dispose_has_run) return; VISU_DUMP(obj)->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS(visu_dump_parent_class)->dispose(obj); } static void visu_dump_finalize(GObject* obj) { DBG_fprintf(stderr, "Visu Dump: finalize object %p.\n", (gpointer)obj); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_dump_parent_class)->finalize(obj); } static void visu_dump_init(VisuDump *obj) { DBG_fprintf(stderr, "Visu Dump: initializing a new object (%p).\n", (gpointer)obj); obj->dispose_has_run = FALSE; obj->writeFunc = (VisuDumpWriteFunc)0; obj->hasAlpha = TRUE; obj->bitmap = TRUE; obj->glRequired = TRUE; nbDumpModules += 1; allDumpModuleList = g_list_append(allDumpModuleList, obj); } /** * visu_dump_new: * @descr: an UTF8 translated string ; * @patterns: (array zero-terminated=1): a NULL terminated list of * pattern for this dump format ; * @method: (scope call): a method used to dump the current #VisuData ; * @bitmap: a flag for bitmap export. * * Create a new dump format. * * Since: 3.7 * * Returns: a newly created dump format. */ VisuDump* visu_dump_new(const gchar* descr, const gchar** patterns, VisuDumpWriteFunc method, gboolean bitmap) { VisuDump *meth; g_return_val_if_fail(descr && method && patterns, (VisuDump*)0); meth = VISU_DUMP(g_object_new(VISU_TYPE_DUMP, "name", descr, "ignore-type", FALSE, NULL)); tool_file_format_addPatterns(TOOL_FILE_FORMAT(meth), patterns); meth->writeFunc = method; meth->bitmap = bitmap; meth->hasAlpha = bitmap; meth->glRequired = bitmap; return meth; } /** * visu_dump_setHasAlpha: * @dump: a #VisuDump method. * @hasAlpha: a boolean. * * Set if @dump has an alpha channel or not. **/ void visu_dump_setHasAlpha(VisuDump *dump, gboolean hasAlpha) { g_return_if_fail(VISU_IS_DUMP(dump)); dump->hasAlpha = hasAlpha; } /** * visu_dump_setGl: * @dump: a #VisuDump method. * @needGl: a boolean * * Set if @dump requires OpenGL or not. **/ void visu_dump_setGl(VisuDump *dump, gboolean needGl) { g_return_if_fail(VISU_IS_DUMP(dump)); dump->glRequired = needGl; } /** * visu_dump_getBitmapStatus: * @dump: a #VisuDump method. * * Retrieve if @dump is exporting a bitmap or not (like to a new input * file format...). * * Returns: TRUE if the output is a bitmap indeed. **/ gboolean visu_dump_getBitmapStatus(VisuDump *dump) { g_return_val_if_fail(VISU_IS_DUMP(dump), FALSE); return dump->bitmap; } /** * visu_dump_getGlStatus: * @dump: a #VisuDump method. * * Retrieve if @dump requires OpenGL to export or not. * * Returns: TRUE if OpenGL is required. **/ gboolean visu_dump_getGlStatus(VisuDump *dump) { g_return_val_if_fail(VISU_IS_DUMP(dump), FALSE); return dump->glRequired; } /** * visu_dump_getAlphaStatus: * @dump: a #VisuDump method. * * Retrieve if @dump use alpha channel or not. * * Returns: TRUE if @dump has an alpha channel. **/ gboolean visu_dump_getAlphaStatus(VisuDump *dump) { g_return_val_if_fail(VISU_IS_DUMP(dump), FALSE); return dump->hasAlpha; } /** * visu_dump_getAllModules: * * All dumping extensions are stored in an opaque way in V_Sim. But * they can be listed by a call to this method. * * Returns: (transfer none) (element-type VisuDump*): a list of all * the known dumping extensions. This list is own by V_Sim and should * be considered read-only. */ GList* visu_dump_getAllModules() { if (!internalInit) initDumpList(); DBG_fprintf(stderr, "Visu Dump: give list of dumps (%p).\n", (gpointer)allDumpModuleList); return allDumpModuleList; } /** * visu_dump_getNModules: * * A convenient way to know how many dumping extensions are registered. * * Returns: the number of known dumping extensions. */ gint visu_dump_getNModules() { if (!internalInit) initDumpList(); return nbDumpModules; } /** * visu_dump_write: * @dump: a #VisuDump object ; * @fileName: (type filename): a string that defined the file to write to ; * @width: an integer ; * @height: an integer ; * @dataObj: the #VisuData to be exported ; * @image: (allow-none) (element-type gint8): the data to be written ; * @error: a location to store some error (not NULL) ; * @functionWait: (allow-none) (closure data) (scope call): a method * to call periodically during the dump ; * @data: (closure): some pointer on object to be passed to the wait * function. * * Use the write function of @dump to export the current @dataObj to * file @fileName. * * Since: 3.6 * * Returns: TRUE if dump succeed. */ gboolean visu_dump_write(VisuDump *dump, const char* fileName, int width, int height, VisuData *dataObj, GArray* image, ToolVoidDataFunc functionWait, gpointer data, GError **error) { g_return_val_if_fail(dump && dump->writeFunc, FALSE); if (dump->bitmap) { g_return_val_if_fail(image, FALSE); return dump->writeFunc(TOOL_FILE_FORMAT(dump), fileName, width, height, dataObj, (guchar*)image->data, error, functionWait, data); } else return dump->writeFunc(TOOL_FILE_FORMAT(dump), fileName, width, height, dataObj, (guchar*)0, error, functionWait, data); } static void initDumpList() { int i; const VisuDump *dump; DBG_fprintf(stderr, "Visu Dump: Init export list.\n"); for (i = 0; listInitDumpModuleFunc[i]; i++) { dump = listInitDumpModuleFunc[i](); if (dump) DBG_fprintf(stderr, " | %s\n", tool_file_format_getLabel(TOOL_FILE_FORMAT(dump))); } internalInit = TRUE; DBG_fprintf(stderr, "Visu Dump: %d valid dump module(s) found.\n", nbDumpModules); } /** * visu_dump_getQuark: (skip) * * Internal routine to get the #GQuark to handle error related to dump * actions. */ GQuark visu_dump_getQuark() { return quark; } void visu_dump_abort(GObject *obj _U_, gpointer data) { /* TODO : mettre un stop dans le fichier en cours. */ DBG_fprintf(stderr, "Visu dump : abortion requested.\n"); *((int*)data) = 1; } v_sim-3.7.0/src/visu_dump.h0000644000353400050620000001413312215546106012540 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef VISU_DUMP_H #define VISU_DUMP_H #include #include #include "visu_tools.h" #include "coreTools/toolFileFormat.h" #include "visu_data.h" G_BEGIN_DECLS /** * VisuDumpWriteFunc: * @format: a #ToolFileFormat object, corresponding to the write method ; * @fileName: a string that defined the file to write to ; * @width: an integer ; * @height: an integer. * @dataObj: the #VisuData to be exported ; * @image: the data to be written ; * @error: (allow-none): a location to store some error (not NULL) ; * @functionWait: (allow-none) (scope call): a method to call * periodically during the dump ; * @data: (closure): some pointer on object to be passed to the wait function. * * This is a prototype of a method implemented by a dumping extension that is called * when the current rendering must be dumped to a file. * * Returns: TRUE if everything went right. */ typedef gboolean (*VisuDumpWriteFunc) (ToolFileFormat *format, const char* fileName, int width, int height, VisuData *dataObj, guchar* image, GError **error, ToolVoidDataFunc functionWait, gpointer data); /** * VISU_TYPE_DUMP: * * Return the associated #GType to the VisuDump objects. */ #define VISU_TYPE_DUMP (visu_dump_get_type ()) /** * VISU_DUMP: * @obj: the widget to cast. * * Cast the given object to a #VisuDump object. */ #define VISU_DUMP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VISU_TYPE_DUMP, VisuDump)) /** * VISU_DUMP_CLASS: * @klass: the class to cast. * * Cast the given class to a #VisuDumpClass object. */ #define VISU_DUMP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VISU_TYPE_DUMP, VisuDumpClass)) /** * VISU_IS_DUMP: * @obj: the object to test. * * Return if the given object is a valid #VisuDump object. */ #define VISU_IS_DUMP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VISU_TYPE_DUMP)) /** * VISU_IS_DUMP_CLASS: * @klass: the class to test. * * Return if the given class is a valid #VisuDumpClass class. */ #define VISU_IS_DUMP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VISU_TYPE_DUMP)) /** * VISU_DUMP_GET_CLASS: * @obj: the widget to get the class of. * * Get the class of the given object. */ #define VISU_DUMP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_DUMP, VisuDumpClass)) /** * VisuDump: * * An opaque structure. */ typedef struct _VisuDump VisuDump; /** * VisuDumpClass: * * An opaque structure. */ typedef struct _VisuDumpClass VisuDumpClass; /** * visu_dump_get_type * * #GType are unique numbers to identify objects. * * Returns: the #GType associated with #VisuDump objects. */ GType visu_dump_get_type(void); /** * VISU_ERROR_DUMP: (skip) * * Internal function for error handling. */ #define VISU_ERROR_DUMP visu_dump_getQuark() GQuark visu_dump_getQuark(); /** * VisuDumpErrorFlag: * @DUMP_ERROR_OPENGL: Error with OpenGL dumping. * @DUMP_ERROR_FILE: Error when opening. * @DUMP_ERROR_ENCODE: Wrongness when computing the encoding format. * * These are flags used when dumping to a file. */ typedef enum { DUMP_ERROR_OPENGL, DUMP_ERROR_FILE, DUMP_ERROR_ENCODE } VisuDumpErrorFlag; /** * VisuDumpInitFunc: (skip) * * This protoype defines initializing function for dumping extension. * Create such a function and add its name in the list #listInitDumpModuleFunc * defined in dumpModules/externalDumpModules.h thus the new dumping extension * will be initialized on startup. * * Returns: a newly allocated #VisuDump. */ typedef const VisuDump* (*VisuDumpInitFunc) (); VisuDump* visu_dump_new(const gchar* descr, const gchar** patterns, VisuDumpWriteFunc method, gboolean bitmap); void visu_dump_setHasAlpha(VisuDump *dump, gboolean hasAlpha); void visu_dump_setGl(VisuDump *dump, gboolean needGl); gboolean visu_dump_getBitmapStatus(VisuDump *dump); gboolean visu_dump_getGlStatus(VisuDump *dump); gboolean visu_dump_getAlphaStatus(VisuDump *dump); gboolean visu_dump_write(VisuDump *dump, const char* fileName, int width, int height, VisuData *dataObj, GArray* image, ToolVoidDataFunc functionWait, gpointer data, GError **error); GList* visu_dump_getAllModules(); gint visu_dump_getNModules(); /** * visu_dump_abort: * @obj: an object ; * @data: some data. * * Does nothing for the moment. */ void visu_dump_abort(GObject *obj, gpointer data); G_END_DECLS #endif v_sim-3.7.0/src/opengl.c0000644000353400050620000005325012215546105012006 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include #include #include #include "opengl.h" #include "visu_extension.h" #include "visu_tools.h" #include "visu_object.h" #include "visu_configFile.h" #include "openGLFunctions/renderingMode.h" #include "openGLFunctions/interactive.h" #include "openGLFunctions/view.h" #include "openGLFunctions/objectList.h" #include "coreTools/toolConfigFile.h" #include "coreTools/toolColor.h" /** * SECTION:opengl * @short_description: This part is responsible for the pseudo3D * rendering through OpenGl and gives methods to adapt the view. * * There is a last parameter which controls when render is * done. There are two states : whenever a changing occurs (in fact * when the OpenGLAskForReDraw signal is received) or only the * OpenGLForceReDraw is received. * * Except when high performances are required, this module never * makes a redraw by itself, even when parameters such as the camera * position are changed. The redraw must be asked by the client by * emitting the OpenGLAskForReDraw signal or the OpenGLForceReDraw * signal. This is to avoid situations when the client makes different * changes but want just only one redraw at the end. All set methods * return a boolean which informs the client of the opportunity to * redraw after the set occurs. For example, if the client call a set * change on theta or phi but the server returns FALSE, it means that * not emission of OpenGLAskForReDraw is needed (for example because * theta or phi had already these values). */ /******************************************************************************/ /* static int stereo; */ static VisuGlLights *currentLights = NULL; #define FLAG_PARAMETER_OPENGL_IMMEDIATE "opengl_immediateDrawing" #define DESC_PARAMETER_OPENGL_IMMEDIATE "If true, changes of parameters means immediate redrawing ; boolean 0 or 1" #define PARAMETER_OPENGL_IMMEDIATE_DEFAULT 1 static gboolean opengl_immediate; static gboolean readOpenGLImmediate(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); #define FLAG_PARAMETER_OPENGL_ANTIALIAS "opengl_antialias" #define DESC_PARAMETER_OPENGL_ANTIALIAS "If true, lines are drawn smoother ; boolean 0 or 1" #define PARAMETER_OPENGL_ANTIALIAS_DEFAULT 0 static gboolean antialias; static gboolean readOpenGLAntialias(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); #define FLAG_PARAMETER_OPENGL_FAKEBS "opengl_fakeBackingStore" #define DESC_PARAMETER_OPENGL_FAKEBS "If true, V_Sim catches the Expose event from the X server and calls a redraw ; boolean 0 or 1" #define PARAMETER_OPENGL_FAKEBS_DEFAULT 0 static int fakeBackingStore; #define FLAG_PARAMETER_OPENGL_TRANS "opengl_trueTransparency" #define DESC_PARAMETER_OPENGL_TRANSS "If true, the transparency rendering is enhanced ; boolean 0 or 1" static gboolean trueTransparency = FALSE; static gboolean readOpenGLTransparency(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); #define FLAG_PARAMETER_OPENGL_ANGLE "opengl_stereoAngle" #define DESC_PARAMETER_OPENGL_ANGLE "Give the angle of the two receivers in stereo output ; float positive" static float stereoAngles[2]; #define PARAMETER_OPENGL_ANGLE_DEFAULT 5.f static gboolean readOpenGLStereoAngle(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); #define FLAG_PARAMETER_OPENGL_STEREO "opengl_stereo" #define DESC_PARAMETER_OPENGL_STEREO "If true, try to draw in stereo ; boolean 0 or 1" static gboolean stereoStatus = FALSE; static gboolean readOpenGLStereo(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); /* Local methods. */ static void exportParametersOpenGL(GString *data, VisuData *dataObj, VisuGlView *view); static void glSetAntiAlias(); /******************************************************************************/ /** * visu_gl_init: * * This initialises the drawing window and all the variables used * by this module. It must be called once by the main program and should * not be used otherwise. */ void visu_gl_init() { VisuConfigFileEntry *resourceEntry; DBG_fprintf(stderr, "OpenGl: initialization.\n"); /* Parameters */ resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_OPENGL_TRANS, DESC_PARAMETER_OPENGL_TRANSS, 1, readOpenGLTransparency); visu_config_file_entry_setVersion(resourceEntry, 3.4f); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_OPENGL_ANTIALIAS, DESC_PARAMETER_OPENGL_ANTIALIAS, 1, readOpenGLAntialias); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_OPENGL_IMMEDIATE, DESC_PARAMETER_OPENGL_IMMEDIATE, 1, readOpenGLImmediate); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_OPENGL_ANGLE, DESC_PARAMETER_OPENGL_ANGLE, 1, readOpenGLStereoAngle); visu_config_file_entry_setVersion(resourceEntry, 3.4f); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_OPENGL_STEREO, DESC_PARAMETER_OPENGL_STEREO, 1, readOpenGLStereo); visu_config_file_entry_setVersion(resourceEntry, 3.4f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_PARAMETER, exportParametersOpenGL); g_type_class_ref(visu_interactive_get_type()); antialias = PARAMETER_OPENGL_ANTIALIAS_DEFAULT; fakeBackingStore = PARAMETER_OPENGL_FAKEBS_DEFAULT; opengl_immediate = PARAMETER_OPENGL_IMMEDIATE_DEFAULT; stereoAngles[0] = +PARAMETER_OPENGL_ANGLE_DEFAULT; stereoAngles[1] = -PARAMETER_OPENGL_ANGLE_DEFAULT; visu_gl_objectlist_init(); } /** * visu_gl_initGraphics: * * Internal use only. Call at startup to call OpenGL initialisation routines. * * Since: 3.6 */ void visu_gl_initGraphics() { /* Deals with lights. */ currentLights = visu_gl_lights_new(); visu_gl_lights_add(currentLights, visu_gl_light_newDefault()); /* Initialise others sub-modules dealing with OpenGL. */ visu_gl_rendering_init(); g_type_class_ref(VISU_TYPE_GL_VIEW); } /** * visu_gl_getLights: * * V_Sim proposes a wrapper around the OpenGL light definitions. * * Returns: the set of current lights. */ VisuGlLights* visu_gl_getLights() { if (!currentLights) visu_gl_initGraphics(); return currentLights; } /******************************************************************************/ /** * visu_gl_setColor: * @material: a 5 elements array with the material properties ; * @rgba: a 4 elements array with the color values. * * This method call glMaterial to create the right shiningness, emission, diffuse... */ void visu_gl_setColor(float* material, float* rgba) { float mm[4] = {0.0f, 0.0f, 0.0f, 0.0f}; DBG_fprintf(stderr, "OpenGL: set rgba colours %gx%gx%gx%g.\n", rgba[0], rgba[1], rgba[2], rgba[3]); glColor4fv(rgba); mm[3] = rgba[3]; mm[0] = material[VISU_GL_LIGHT_MATERIAL_AMB] * rgba[0]; mm[1] = material[VISU_GL_LIGHT_MATERIAL_AMB] * rgba[1]; mm[2] = material[VISU_GL_LIGHT_MATERIAL_AMB] * rgba[2]; glMaterialfv(GL_FRONT, GL_AMBIENT, mm); mm[0] = material[VISU_GL_LIGHT_MATERIAL_DIF] * rgba[0]; mm[1] = material[VISU_GL_LIGHT_MATERIAL_DIF] * rgba[1]; mm[2] = material[VISU_GL_LIGHT_MATERIAL_DIF] * rgba[2]; glMaterialfv(GL_FRONT, GL_DIFFUSE, mm); glMaterialf(GL_FRONT, GL_SHININESS, material[VISU_GL_LIGHT_MATERIAL_SHI] * 128.0f); mm[0] = material[VISU_GL_LIGHT_MATERIAL_SPE]; mm[1] = material[VISU_GL_LIGHT_MATERIAL_SPE]; mm[2] = material[VISU_GL_LIGHT_MATERIAL_SPE]; glMaterialfv(GL_FRONT, GL_SPECULAR, mm); mm[0] = material[VISU_GL_LIGHT_MATERIAL_EMI] * rgba[0]; mm[1] = material[VISU_GL_LIGHT_MATERIAL_EMI] * rgba[1]; mm[2] = material[VISU_GL_LIGHT_MATERIAL_EMI] * rgba[2]; glMaterialfv(GL_FRONT, GL_EMISSION, mm); } /** * visu_gl_setHighlightColor: * @material: a 5 elements array with the material properties ; * @rgb: a 3 elements array with the color values. * @alpha: the alpha channel. * * This method try to set a colour that will contrast with @rgb. */ void visu_gl_setHighlightColor(float material[5], float rgb[3], float alpha) { float rgba[4], hsl[3]; tool_color_convertRGBtoHSL(hsl, rgb); hsl[0] = tool_modulo_float(0.5f + hsl[0], 1); hsl[1] = 1.f; hsl[2] = .5f; tool_color_convertHSLtoRGB(rgba, hsl); rgba[3] = alpha; visu_gl_setColor(material, rgba); } /** * visu_gl_initContext: * * This method is called when an OpenGL surface is created for the first time. * It sets basic OpenGL options and calls other OpenGLFunctions used in V_Sim. */ void visu_gl_initContext() { if (!currentLights) visu_gl_initGraphics(); /* Set the openGL flags. */ glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glDepthRange(0.0, 1.0); glClearDepth(1.0); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glEnable(GL_NORMALIZE); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); visu_gl_lights_apply(currentLights); visu_gl_rendering_applyMode(visu_gl_rendering_getGlobalMode()); glSetAntiAlias(); } /******************************************************************************/ /** * visu_gl_redraw: * @view: (transfer none): a #VisuGlView object with the camera settings. * @lists: (element-type v_sim.GlExt) (transfer none) (allow-none): a * #VisuGlExt array or %NULL. * * Basic drawing method : it clears the OpenGL area and call all lists if @lists * is %NULL, or draw only the given lists. */ void visu_gl_redraw(VisuGlView *view, GList *lists) { int i_stereo, stereo; static int stereo_buf[2] = {GL_BACK_LEFT, GL_BACK_RIGHT}; GLboolean glStereo; float centre[3]; GList *ext, *lst; VisuBox *box; #if DEBUG == 1 GTimer *timer; gulong fractionTimer; #endif #if DEBUG == 1 timer = g_timer_new(); g_timer_start(timer); #endif box = visu_boxed_getBox(VISU_BOXED(view)); if (box) visu_box_getCentre(box, centre); else { centre[0] = 0.f; centre[1] = 0.f; centre[2] = 0.f; } ext = lists; if (!lists) ext = visu_gl_ext_getAll(); glGetBooleanv(GL_STEREO, &glStereo); stereo = (view && glStereo && stereoStatus)?1:0; for(i_stereo = 0; i_stereo <= stereo; i_stereo++) { if (stereo == 1) { glRotatef(stereoAngles[i_stereo], view->camera->up[0], view->camera->up[1], view->camera->up[2]); glDrawBuffer(stereo_buf[i_stereo]); DBG_fprintf(stderr, "OpenGL: draw on buffer %d.\n", i_stereo); } else glDrawBuffer(GL_BACK); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glTranslated(-centre[0], -centre[1], -centre[2]); glEnable(GL_DEPTH_TEST); /* if (!lists && !trueTransparency) */ /* { */ /* visu_gl_ext_callAll(FALSE); */ /* visu_gl_ext_callAll(TRUE); */ /* } */ /* else if (!lists && trueTransparency) */ /* { */ /* glDepthMask(1); */ /* glEnable(GL_ALPHA_TEST); */ /* glAlphaFunc(GL_EQUAL, 1.); */ /* visu_gl_ext_callAll(FALSE); */ /* DBG_fprintf(stderr, "OpenGL: second pass for transparency.\n"); */ /* glAlphaFunc(GL_LESS, 1.); */ /* glDepthMask(0); */ /* visu_gl_ext_callAll(FALSE); */ /* glDepthMask(1); */ /* glAlphaFunc(GL_ALWAYS, 1.); */ /* glDisable(GL_ALPHA_TEST); */ /* visu_gl_ext_callAll(TRUE); */ /* } */ /* else */ if (!trueTransparency) for (lst = ext; lst; lst = g_list_next(lst)) visu_gl_ext_call(VISU_GL_EXT(lst->data), FALSE); else { glDepthMask(1); glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_EQUAL, 1.); for (lst = ext; lst; lst = g_list_next(lst)) visu_gl_ext_call(VISU_GL_EXT(lst->data), FALSE); DBG_fprintf(stderr, "OpenGL: second pass for transparency.\n"); glAlphaFunc(GL_LESS, 1.); glDepthMask(0); for (lst = ext; lst; lst = g_list_next(lst)) visu_gl_ext_call(VISU_GL_EXT(lst->data), FALSE); glDepthMask(1); glAlphaFunc(GL_ALWAYS, 1.); glDisable(GL_ALPHA_TEST); } for (lst = ext; lst; lst = g_list_next(lst)) visu_gl_ext_call(VISU_GL_EXT(lst->data), TRUE); glPopMatrix(); } #if DEBUG == 1 glFlush(); g_timer_stop(timer); fprintf(stderr, "OpenGL: lists drawn in %g micro-s.\n", g_timer_elapsed(timer, &fractionTimer)*1e6); g_timer_destroy(timer); #endif } /******************************************************************************/ /* To set the antialiasing on lines. */ static void glSetAntiAlias() { if (antialias) { /* Set blend if not present */ glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); /* glBlendFunc(GL_SRC_ALPHA_SATURATE,GL_ONE); */ /* Antialias */ glEnable(GL_LINE_SMOOTH); glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE); } else { glDisable(GL_LINE_SMOOTH); /* glDisable(GL_BLEND); */ } } /** * visu_gl_setAntialias: * @value: a boolean to activate or not the lines antialias. * * To set the antialiasing on lines. * * Returns: TRUE if the signal OpenGLAskForReDraw should be emitted. */ gboolean visu_gl_setAntialias(gboolean value) { if (value == antialias) return FALSE; antialias = value; glSetAntiAlias(); return TRUE; } /** * visu_gl_getAntialias: * * Get the value of the antialiasing parameter. * * Returns: wether or not the antialising for lines is activated. */ gboolean visu_gl_getAntialias() { return antialias; } /** * visu_gl_setTrueTransparency: * @status: a boolean. * * If true the rendering is done twice to respect the transparency. * * Returns: TRUE if redraw should be done. */ gboolean visu_gl_setTrueTransparency(gboolean status) { if (status == trueTransparency) return FALSE; trueTransparency = status; return TRUE; } /** * visu_gl_getTrueTransparency: * * The drawing can be done in one pass or two to respect transparency. * * Returns: TRUE if the drawing is done twice. */ gboolean visu_gl_getTrueTransparency() { return trueTransparency; } /** * visu_gl_setImmediate: * @bool: a boolean to set or not the immediateDrawing option. * * If true all changes are applied only when the refresh button * is pushed. * * Returns: TRUE if the value is changed. */ gboolean visu_gl_setImmediate(gboolean bool) { if (bool == opengl_immediate) return FALSE; opengl_immediate = bool; return TRUE; } /** * visu_gl_getImmediate: * * Get the value of the immediateDrawing option. * * Returns: the value of the immediateDrawing option. */ gboolean visu_gl_getImmediate() { return opengl_immediate; } /** * visu_gl_setStereoAngle: * @angle: a positive floating point value. * * Change the angle of the eyes in the stereo output. * * Returns: TRUE if redraw should be done. */ gboolean visu_gl_setStereoAngle(float angle) { g_return_val_if_fail(angle > 0.f, FALSE); if (stereoAngles[0] == angle) return FALSE; stereoAngles[0] = angle; stereoAngles[1] = -angle; return stereoStatus; } /** * visu_gl_getStereoAngle: * * Retrieve the angle of the eyes in the stereo output. * * Returns: the angle. */ float visu_gl_getStereoAngle() { return stereoAngles[0]; } /** * visu_gl_getStereoCapability: * * Retrieve if the OpenGL window can render in stereo or not. * * Returns: TRUE if the OpenGL surface can draw in stereo. */ gboolean visu_gl_getStereoCapability() { GLboolean glStereo; glGetBooleanv(GL_STEREO, &glStereo); return (gboolean)glStereo; } /** * visu_gl_setStereo: * @status: a boolean. * * Change the type of rendering. The surface can be switch to stereo, * only if the OpenGL has stereo capabilities (see * visu_gl_getStereoCapability()). */ gboolean visu_gl_setStereo(gboolean status) { if (stereoStatus == status) return FALSE; stereoStatus = status; return TRUE; } /** * visu_gl_getStereo: * * Retrieve the status of the OpenGL surface. * * Returns: TRUE if the surface try to draw in stereo (may be TRUE, * even if visu_gl_getStereoCapability() returns FALSE, in * that case the stereo capability is not used). */ gboolean visu_gl_getStereo() { return stereoStatus; } /***************************/ /* Dealing with parameters */ /***************************/ static gboolean readOpenGLAntialias(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { gboolean val; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readBoolean(lines[0], position, &val, 1, error)) return FALSE; visu_gl_setAntialias((int)val); return TRUE; } static gboolean readOpenGLImmediate(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { gboolean val; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readBoolean(lines[0], position, &val, 1, error)) return FALSE; visu_gl_setImmediate((int)val); return TRUE; } static gboolean readOpenGLTransparency(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { gboolean val; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readBoolean(lines[0], position, &val, 1, error)) return FALSE; visu_gl_setTrueTransparency(val); return TRUE; } static gboolean readOpenGLStereo(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { gboolean val; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readBoolean(lines[0], position, &val, 1, error)) return FALSE; visu_gl_setStereo(val); return TRUE; } static gboolean readOpenGLStereoAngle(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { float val; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readFloat(lines[0], position, &val, 1, error)) return FALSE; if (val <= 0.f) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d: angle must be positive.\n"), position); return FALSE; } visu_gl_setStereoAngle(val); return TRUE; } static void exportParametersOpenGL(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { g_string_append_printf(data, "# %s\n", DESC_PARAMETER_OPENGL_ANTIALIAS); g_string_append_printf(data, "%s: %d\n\n", FLAG_PARAMETER_OPENGL_ANTIALIAS, antialias); g_string_append_printf(data, "# %s\n", DESC_PARAMETER_OPENGL_IMMEDIATE); g_string_append_printf(data, "%s: %d\n\n", FLAG_PARAMETER_OPENGL_IMMEDIATE, opengl_immediate); g_string_append_printf(data, "# %s\n", DESC_PARAMETER_OPENGL_TRANSS); g_string_append_printf(data, "%s: %d\n\n", FLAG_PARAMETER_OPENGL_TRANS, trueTransparency); g_string_append_printf(data, "# %s\n", DESC_PARAMETER_OPENGL_STEREO); g_string_append_printf(data, "%s: %d\n\n", FLAG_PARAMETER_OPENGL_STEREO, stereoStatus); g_string_append_printf(data, "# %s\n", DESC_PARAMETER_OPENGL_ANGLE); g_string_append_printf(data, "%s: %f\n\n", FLAG_PARAMETER_OPENGL_ANGLE, stereoAngles[0]); } v_sim-3.7.0/src/opengl.h0000644000353400050620000000531112215546105012006 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef OPENGL_H #define OPENGL_H #include #include "visu_box.h" #include "openGLFunctions/view.h" #include "openGLFunctions/light.h" /***************/ /* Public part */ /***************/ void visu_gl_setColor(float* material, float* rgba); void visu_gl_setHighlightColor(float material[5], float rgb[3], float alpha); void visu_gl_init(); void visu_gl_initGraphics(); /* Objects to play with lights. */ VisuGlLights* visu_gl_getLights(); gboolean visu_gl_setAntialias(gboolean value); gboolean visu_gl_getAntialias(); gboolean visu_gl_setImmediate(gboolean bool); gboolean visu_gl_getImmediate(); gboolean visu_gl_setTrueTransparency(gboolean status); gboolean visu_gl_getTrueTransparency(); gboolean visu_gl_setStereo(gboolean status); gboolean visu_gl_getStereo(); gboolean visu_gl_setStereoAngle(float angle); float visu_gl_getStereoAngle(); gboolean visu_gl_getStereoCapability(); /* redraw methods */ void visu_gl_redraw(VisuGlView *view, GList *lists); void visu_gl_initContext(); #endif v_sim-3.7.0/src/visu_pairs.c0000644000353400050620000007243212215546105012711 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse m�l : BILLARD, non joignable par m�l ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant � visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est r�gi par la licence CeCILL soumise au droit fran�ais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffus�e par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez acc�der � cet en-t�te signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept� les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "visu_pairs.h" #include #include #include "visu_tools.h" #include "visu_object.h" #include "visu_nodes.h" #include "openGLFunctions/objectList.h" #include "openGLFunctions/text.h" #include "visu_configFile.h" #include "coreTools/toolConfigFile.h" /** * SECTION:visu_pairs * @short_description: V_Sim can draw link between nodes. This part * defines a pair object and interface to draw pairs. * * The visu_pairs.c defines only general methods to draw * pairs. It introduces a new object called #VisuPairLink. This stores * some characteristics on links between two #VisuElement. The main * characteristic is that pairs are drawn only if the length between * two nodes is in a specific range. Use visu_pair_link_setDistance() and * visu_pair_link_getDistance() to tune this range. * * This file does not draw any pairs. But it gives some * interface to create rendering capabilities. To create a new pair * rendering module, called #VisuPairExtension, use * visu_pair_extension_new(). Basically, a #VisuPairExtension is characterized * by it drawing method. But it can have other methods that are called * in different cases. See main() and * startStop() prototypes to have more informations. */ /** * _Property: * @name: a pointer to a string, only used when DEBUG is on ; * @data: a pointer to an allocated memory area ; * @freeFunc: a destroy functon (can be NULL). * * This container can be used in hashtable to store whatever kind of * data that requires specific free functions. */ struct _Property { /* A convenient debug pointer on the name. */ const gchar *name; /* This is a pointer to the data stored. */ gpointer data; /* This method is called when the table is freed. */ GDestroyNotify freeFunc; }; typedef struct _Property Property; /* This structure is made to store pairs information between two elements. */ struct _VisuPair { VisuElement *ele1; VisuElement *ele2; /* This is a GList of link (VisuPairLink). */ GList *pairs; /* A list of properties. */ GHashTable *properties; }; /** * VisuPairLinkClass: * @parent: the parent class; * * A short way to identify #_VisuPairLinkClass structure. */ /** * VisuPairLink: * * An opaque structure. */ /** * VisuPairLinkPrivate: * @minMax: storage for the length bounds for drawn pairs ; * @drawn: a boolean to say if the pair is drawn or not ; * @printLength: a boolean to say if length of pairs are drawn near * them ; * * This structure is used to describe a link between two elements. A * link is drawn only its length is between the minimum and the * maximum value stored in the minMax array. */ struct _VisuPairLinkPrivate { VisuPair *parent; gboolean dispose_has_run; float minMax[2]; gboolean drawn; gboolean printLength; ToolColor color; }; static void visu_pair_link_finalize(GObject* obj); static void visu_pair_link_dispose(GObject* obj); struct foreachPairsData_struct { VisuPairForeachFunc func; gpointer userData; }; #define BONDHISTOGRAM_ID "bondDistribution_data" #define BONDHISTOGRAM_STEP 0.1f #define BONDHISTOGRAM_MIN 0.f #define BONDHISTOGRAM_MAX 10.f /* This hashtable as VisuElement* as keys and pointer to other hashtable as value. The main idea is to have an hashtable of 2 dimension, each two keys are VisuElement* and the final values are PairsData. Nevertheless, this hashtable must not be access directly but through the get and put methods. */ static GHashTable *DminDmax = NULL; /* Parameters */ static ToolColor *defaultPairColor = NULL; /* Local methods. */ static void freePair(gpointer ele); static void freeHistoData(gpointer data); static VisuPair* newPair(VisuElement *ele1, VisuElement *ele2); /** * visu_pair_init: (skip) * * Initialise the hashtable storing pairs. */ static void visu_pair_init() { DminDmax = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, freePair); } /*************************/ /* VisuPairLink methods. */ /*************************/ enum { PARAMETER_CHANGED_SIGNAL, LAST_SIGNAL }; static guint _signals[LAST_SIGNAL] = { 0 }; G_DEFINE_TYPE(VisuPairLink, visu_pair_link, G_TYPE_OBJECT) static void visu_pair_link_class_init(VisuPairLinkClass *klass) { float rgbOfPairs[4] = {1.0, 0.6, 0.2, 1.}; DBG_fprintf(stderr, "Visu Pair Data: creating the class of the object.\n"); DBG_fprintf(stderr, " - adding new signals ;\n"); /** * VisuPairLink::ParameterChanged: * @data: the object which received the signal ; * * Gets emitted when some rendering parameter of @data has been changed. * * Since: 3.7 */ _signals[PARAMETER_CHANGED_SIGNAL] = g_signal_new("ParameterChanged", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, NULL); /* Connect the overloading methods. */ G_OBJECT_CLASS(klass)->dispose = visu_pair_link_dispose; G_OBJECT_CLASS(klass)->finalize = visu_pair_link_finalize; defaultPairColor = tool_color_new(rgbOfPairs); tool_color_addColor(defaultPairColor); } static void visu_pair_link_init(VisuPairLink *obj) { DBG_fprintf(stderr, "Visu Pair Data: initializing a new object (%p).\n", (gpointer)obj); obj->priv = g_malloc(sizeof(VisuPairLinkPrivate)); obj->priv->dispose_has_run = FALSE; /* Private data. */ obj->priv->parent = (VisuPair*)0; obj->priv->minMax[VISU_PAIR_DISTANCE_MIN] = G_MAXFLOAT; obj->priv->minMax[VISU_PAIR_DISTANCE_MAX] = G_MAXFLOAT; obj->priv->drawn = TRUE; obj->priv->printLength = FALSE; tool_color_copy(&obj->priv->color, defaultPairColor); } static void visu_pair_link_dispose(GObject* obj) { VisuPairLink *data; DBG_fprintf(stderr, "Visu Pair Data: dispose object %p.\n", (gpointer)obj); data = VISU_PAIR_LINK(obj); if (data->priv->dispose_has_run) return; data->priv->dispose_has_run = TRUE; /* Chain up to the parent class */ G_OBJECT_CLASS(visu_pair_link_parent_class)->dispose(obj); } static void visu_pair_link_finalize(GObject* obj) { VisuPairLink *data; g_return_if_fail(obj); DBG_fprintf(stderr, "Visu Pair Data: finalize object %p.\n", (gpointer)obj); data = VISU_PAIR_LINK(obj); /* Free privs elements. */ if (data->priv) { DBG_fprintf(stderr, "Visu Pair Data: free private legend.\n"); g_free(data->priv); } /* Chain up to the parent class */ DBG_fprintf(stderr, "Visu Pair Data: chain to parent.\n"); G_OBJECT_CLASS(visu_pair_link_parent_class)->finalize(obj); DBG_fprintf(stderr, "Visu Pair Data: freeing ... OK.\n"); } /** * visu_pair_link_getAll: * @ele1: a #VisuElement object ; * @ele2: a #VisuElement object. * * There can be one or several links between elements, retrieve them * with this routine. * * Returns: (element-type VisuPairLink*) (transfer none): a list of * #VisuPairLink. The list is owned by V_Sim and should not be freed. */ GList* visu_pair_link_getAll(VisuElement *ele1, VisuElement *ele2) { VisuPair *pair; VisuPairLink *data; pair = visu_pair_getPair(ele1, ele2); DBG_fprintf(stderr, "Visu Pairs: links for key '%s %s' -> %p.\n", ele1->name, ele2->name, (gpointer)pair->pairs); if (!pair->pairs) { data = VISU_PAIR_LINK(g_object_new(VISU_TYPE_PAIR_LINK, NULL)); data->priv->minMax[VISU_PAIR_DISTANCE_MIN] = 0.f; data->priv->minMax[VISU_PAIR_DISTANCE_MAX] = 0.f; data->priv->parent = pair; pair->pairs = g_list_append(pair->pairs, (gpointer)data); } return pair->pairs; } /** * visu_pair_link_getFromId: * @ele1: a #VisuElement object ; * @ele2: a #VisuElement object ; * @pos: the position in the list of links. * * A link can also be retrieved by its position. * * Returns: (transfer none): the #VisuPairLink object associated to the given two * elements and distances. If none exists NULL is returned. */ VisuPairLink* visu_pair_link_getFromId(VisuElement *ele1, VisuElement *ele2, guint pos) { VisuPair *pair; pair = visu_pair_getPair(ele1, ele2); g_return_val_if_fail(pair->pairs, (VisuPairLink*)0); return (VisuPairLink*)(g_list_nth(pair->pairs, pos)->data); } /** * visu_pair_link_new: * @ele1: a #VisuElement object ; * @ele2: a #VisuElement object ; * @minMax: (array fixed-size=2): the two min and max distances. * * A link between two elements is characterized by its boundary distances. * * Returns: (transfer none): the #VisuPairLink object associated to the given two * elements and distances. If none exists it is created. The * returned value should not be freed. */ VisuPairLink* visu_pair_link_new(VisuElement *ele1, VisuElement *ele2, float minMax[2]) { VisuPair *pair; GList *tmpLst; VisuPairLink *data; g_return_val_if_fail(minMax, (VisuPairLink*)0); pair = visu_pair_getPair(ele1, ele2); g_return_val_if_fail(pair, (VisuPairLink*)0); for (tmpLst = pair->pairs; tmpLst; tmpLst = g_list_next(tmpLst)) { data = (VisuPairLink*)tmpLst->data; DBG_fprintf(stderr, " | test %p (%g %g).\n", tmpLst->data, data->priv->minMax[0], data->priv->minMax[1]); if (data->priv->minMax[0] == minMax[0] && data->priv->minMax[1] == minMax[1]) return data; } data = VISU_PAIR_LINK(g_object_new(VISU_TYPE_PAIR_LINK, NULL)); data->priv->minMax[VISU_PAIR_DISTANCE_MIN] = minMax[VISU_PAIR_DISTANCE_MIN]; data->priv->minMax[VISU_PAIR_DISTANCE_MAX] = minMax[VISU_PAIR_DISTANCE_MAX]; data->priv->parent = pair; pair->pairs = g_list_append(pair->pairs, (gpointer)data); DBG_fprintf(stderr, " | new %p (%g %g).\n", (gpointer)data, data->priv->minMax[0], data->priv->minMax[1]); return data; } /** * visu_pair_link_setDrawn: * @data: a #VisuPairLink object ; * @drawn: a boolean. * * A pair can or cannot be drawn, use this method to tune it. * * Returns: TRUE if parameter has been changed. */ gboolean visu_pair_link_setDrawn(VisuPairLink *data, gboolean drawn) { g_return_val_if_fail(VISU_IS_PAIR_LINK(data), FALSE); DBG_fprintf(stderr, "Visu Pairs: set drawn status %d (%d) for %p.\n", (int)drawn, (int)data->priv->drawn, (gpointer)data); if (data->priv->drawn == drawn) return FALSE; data->priv->drawn = drawn; if (visu_pair_link_isDrawn(data)) g_signal_emit(data, _signals[PARAMETER_CHANGED_SIGNAL], 0, NULL); return TRUE; } /** * visu_pair_link_setPrintLength: * @data: a #VisuPairLink object ; * @status: TRUE to print length near pairs. * * Set the attribute that controls if the length of pairs are drawn near pairs. * * Returns: TRUE if parameter has been changed. */ gboolean visu_pair_link_setPrintLength(VisuPairLink *data, gboolean status) { g_return_val_if_fail(VISU_IS_PAIR_LINK(data), FALSE); DBG_fprintf(stderr, "Visu Pairs: set print length status %d (%d) for %p.\n", (int)status, (int)data->priv->printLength, (gpointer)data); if (data->priv->printLength == status) return FALSE; data->priv->printLength = status; if (visu_pair_link_isDrawn(data)) g_signal_emit(data, _signals[PARAMETER_CHANGED_SIGNAL], 0, NULL); return TRUE; } /** * visu_pair_link_getDrawn: * @data: a #VisuPairLink object ; * * A pair can or cannot be drawn, use this method to retrieve its state. * * Returns: TRUE if pairs can be drawn. */ gboolean visu_pair_link_getDrawn(const VisuPairLink *data) { g_return_val_if_fail(VISU_IS_PAIR_LINK(data), FALSE); return data->priv->drawn; } /** * visu_pair_link_setColor: * @data: a #VisuPairLink object ; * @destColor: a #ToolColor object. * * Set the color of the given pair. * * Returns: TRUE if parameter has been changed. */ gboolean visu_pair_link_setColor(VisuPairLink *data, ToolColor* destColor) { g_return_val_if_fail(VISU_IS_PAIR_LINK(data) && destColor, FALSE); DBG_fprintf(stderr, "Visu Pairs: set color [%g;%g;%g] for %p.\n", destColor->rgba[0], destColor->rgba[1], destColor->rgba[2], (gpointer)data); if (tool_color_equal(&data->priv->color, destColor)) return FALSE; /* Copy values of dest to current color. */ tool_color_copy(&data->priv->color, destColor); if (visu_pair_link_isDrawn(data)) g_signal_emit(data, _signals[PARAMETER_CHANGED_SIGNAL], 0, NULL); return TRUE; } /** * visu_pair_link_getColor: * @data: a #VisuPairLink object. * * Look for the properties of the pair @data to find if a colour has * been defined. If none, the default colour is returned instead. * * Returns: (transfer none): a colour (don't free it). */ ToolColor* visu_pair_link_getColor(const VisuPairLink *data) { g_return_val_if_fail(VISU_IS_PAIR_LINK(data), defaultPairColor); return &data->priv->color; } /** * visu_pair_link_setDistance: * @val: a floating point value ; * @data: a #VisuPairLink object ; * @minOrMax: #VISU_PAIR_DISTANCE_MAX or #VISU_PAIR_DISTANCE_MIN. * * Set the minimum or the maximum length for the given pair. * * Returns: TRUE if parameter has been changed. */ gboolean visu_pair_link_setDistance(VisuPairLink *data, float val, int minOrMax) { g_return_val_if_fail(VISU_IS_PAIR_LINK(data) && (minOrMax == VISU_PAIR_DISTANCE_MIN || minOrMax == VISU_PAIR_DISTANCE_MAX), FALSE); if (data->priv->minMax[minOrMax] == val) return FALSE; data->priv->minMax[minOrMax] = val; if (visu_pair_link_isDrawn(data)) g_signal_emit(data, _signals[PARAMETER_CHANGED_SIGNAL], 0, NULL); return TRUE; } /** * visu_pair_link_getPrintLength: * @data: a #VisuPairLink object. * * Get the print length parameter of a pair. This parameter is used to tell if * length should be drawn near pairs of this kind. * * Returns: TRUE if length are printed. */ gboolean visu_pair_link_getPrintLength(const VisuPairLink *data) { g_return_val_if_fail(VISU_IS_PAIR_LINK(data), FALSE); return data->priv->printLength; } /** * visu_pair_link_getDistance: * @data: a #VisuPairLink object ; * @minOrMax: #VISU_PAIR_DISTANCE_MIN or #VISU_PAIR_DISTANCE_MAX. * * A pair between @ele1 and @ele2 is drawn only if its length is between * a minimum and a maximum value. This method can get these values. * * Returns: the minimum or the maximum value for the pair between @ele1 and @ele2. */ float visu_pair_link_getDistance(const VisuPairLink *data, int minOrMax) { g_return_val_if_fail(VISU_IS_PAIR_LINK(data), 0.f); g_return_val_if_fail(minOrMax == VISU_PAIR_DISTANCE_MIN || minOrMax == VISU_PAIR_DISTANCE_MAX, 0.); return data->priv->minMax[minOrMax]; } /** * visu_pair_link_getPair: * @data: a #VisuPairLink object. * * A link object is always associated to a #VisuPair. * * Since: 3.7 * * Returns: (transfer none): the #VisuPair this link is related to. **/ VisuPair* visu_pair_link_getPair(const VisuPairLink *data) { g_return_val_if_fail(VISU_IS_PAIR_LINK(data), (VisuPair*)0); return data->priv->parent; } /** * visu_pair_link_isDrawn: * @data: a #VisuPairLink object. * * A link is used or not depending on a distance criterion and a flag, * see visu_pair_link_setDrawn() and visu_pair_link_setDistance(). * * Since: 3.7 * * Returns: TRUE if the @data is indeed drawn or not. **/ gboolean visu_pair_link_isDrawn(const VisuPairLink *data) { g_return_val_if_fail(VISU_IS_PAIR_LINK(data), FALSE); return (data->priv->drawn && data->priv->minMax[VISU_PAIR_DISTANCE_MAX] > data->priv->minMax[VISU_PAIR_DISTANCE_MIN]); } /********************/ /* Visu pair stuff. */ /********************/ /** * visu_pair_setProperty: * @pair: a #VisuPair object ; * @key: a static string ; * @value: a pointer to some allocated data ; * @freeFunc: a destroying method (can be NULL). * * Each element/element can have associated data. */ void visu_pair_setProperty(VisuPair *pair, const gchar* key, gpointer value, GDestroyNotify freeFunc) { Property *prop; g_return_if_fail(pair && key && *key); prop = g_malloc(sizeof(Property)); prop->name = key; prop->data = value; prop->freeFunc = freeFunc; g_hash_table_insert(pair->properties, (gpointer)key, (gpointer)prop); } /** * visu_pair_getProperty: * @pair: a #VisuPair object ; * @key: a string. * * Retrieve the property associated to the @key or NULL if none exist. * * Returns: (transfer none): the associated data. */ gpointer visu_pair_getProperty(VisuPair *pair, const gchar* key) { Property *prop; g_return_val_if_fail(pair, (gpointer)0); prop = (Property*)g_hash_table_lookup(pair->properties, (gpointer)key); if (prop) return prop->data; else return (gpointer)0; } static void freePair(gpointer ele) { VisuPair *pair; GList *tmpLst; pair = (VisuPair*)ele; DBG_fprintf(stderr, "Visu Pairs: freeing pair between '%s' and '%s'.\n", pair->ele1->name, pair->ele2->name); for (tmpLst = pair->pairs; tmpLst; tmpLst = g_list_next(tmpLst)) g_object_unref(tmpLst->data); g_list_free(pair->pairs); g_hash_table_destroy(pair->properties); } /* Create a new PairsData structure with default values. The newly created structure can be freed by a call to free. */ static VisuPair* newPair(VisuElement *ele1, VisuElement *ele2) { VisuPair *pair; g_return_val_if_fail(ele1 && ele2, (VisuPair*)0); DBG_fprintf(stderr, "Visu Pairs: create a new pair between '%s' and '%s'.\n", ele1->name, ele2->name); pair = g_malloc(sizeof(VisuPair)); pair->ele1 = ele1; pair->ele2 = ele2; pair->pairs = (GList*)0; pair->properties = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free); g_return_val_if_fail(pair->properties, (VisuPair*)0); /* pair->pairs = g_list_prepend(pair->pairs, (gpointer)newPairData(minMax)); */ return pair; } /** * visu_pair_getPair: * @ele1: a #VisuElement object ; * @ele2: a #VisuElement object. * * The object #VisuPair is used to characterized links between two elements. * * Returns: (transfer none): the #VisuPair object associated to the * given two elements. If none exists it is created. The returned * value should not be freed. */ VisuPair* visu_pair_getPair(VisuElement *ele1, VisuElement *ele2) { VisuPair *pair; gchar *key; g_return_val_if_fail(ele1 && ele2, (VisuPair*)0); if (!DminDmax) visu_pair_init(); if (strcmp(ele1->name, ele2->name) < 0) key = g_strdup_printf("%s %s", ele1->name, ele2->name); else key = g_strdup_printf("%s %s", ele2->name, ele1->name); pair = (VisuPair*)g_hash_table_lookup(DminDmax, (gpointer)key); DBG_fprintf(stderr, "Visu Pairs: test key '%s' -> %p.\n", key, (gpointer)pair); if (!pair) { /* Ok, create one if none found. */ pair = newPair(ele1, ele2); g_hash_table_insert(DminDmax, (gpointer)key, (gpointer)pair); } else g_free(key); return pair; } /** * visu_pair_removePairLink: * @ele1: a #VisuElement object ; * @ele2: a #VisuElement object ; * @data: a link object. * * Delete the given link. * * Returns: TRUE if the link exists and has been successfully removed. */ gboolean visu_pair_removePairLink(VisuElement *ele1, VisuElement *ele2, VisuPairLink *data) { VisuPair *pair; GList *tmpLst; g_return_val_if_fail(data, FALSE); pair = visu_pair_getPair(ele1, ele2); g_return_val_if_fail(pair, FALSE); tmpLst = g_list_find(pair->pairs, data); if (tmpLst) pair->pairs = g_list_delete_link(pair->pairs, tmpLst); g_signal_emit_by_name(G_OBJECT(data), "ParameterChanged", NULL); g_object_unref(data); return (tmpLst != (GList*)0); } /** * visu_pair_getElements: * @pair: a #VisuPair object. * @ele1: (out) (allow-none) (transfer none): a location to store a * #VisuElement object pointer. * @ele2: (out) (allow-none) (transfer none): a location to store a * #VisuElement object pointer. * * Retrieve the #VisuElement constituting the pair. * * Since: 3.7 **/ void visu_pair_getElements(const VisuPair *pair, VisuElement **ele1, VisuElement **ele2) { g_return_if_fail(pair); if (ele1) *ele1 = pair->ele1; if (ele2) *ele2 = pair->ele2; } static void freeHistoData(gpointer data) { DBG_fprintf(stderr, "Visu Pairs: free '%s' data.\n", BONDHISTOGRAM_ID); g_free(((VisuPairDistribution*)data)->histo); g_free(data); } /** * visu_pair_getDistanceDistribution: * @pair: a #VisuPair ; * @dataObj: a #VisuData ; * @step: a float for the distance mesh (negative value to use * built-in default) ; * @min: a float for the minimum scanning value (negative value to use * built-in default). * @max: a float for the maximum scanning value (negative value to use * built-in default). * * This will compute the distnace distribution of nodes for the given * @pair. * * Returns: a structure defining the distance distribution. This * structure is private and should not be freed. */ VisuPairDistribution* visu_pair_getDistanceDistribution(VisuPair *pair, VisuData *dataObj, float step, float min, float max) { VisuPairDistribution *dd; guint i; VisuNodeArrayIter iter1, iter2; float d2, inv; float xyz1[3], xyz2[3]; #if DEBUG == 1 guint nRef; GTimer *timer; gulong fractionTimer; #endif g_return_val_if_fail(pair && VISU_IS_DATA(dataObj), (VisuPairDistribution*)0); #if DEBUG == 1 timer = g_timer_new(); g_timer_start(timer); #endif /* We create the storage structure. */ dd = (VisuPairDistribution*) visu_pair_getProperty(pair, BONDHISTOGRAM_ID); if (dd) g_free(dd->histo); else { dd = g_malloc(sizeof(VisuPairDistribution)); visu_pair_setProperty(pair, BONDHISTOGRAM_ID, (gpointer)dd, freeHistoData); } dd->ele1 = pair->ele1; dd->ele2 = pair->ele2; dd->nNodesEle1 = 0; dd->nNodesEle2 = 0; dd->stepValue = (step > 0.f)?step:BONDHISTOGRAM_STEP; dd->initValue = (min > 0.f)?min:BONDHISTOGRAM_MIN; dd->nValues = (int)((((max > 0.f)?max:BONDHISTOGRAM_MAX) - dd->initValue) / dd->stepValue) + 1; dd->histo = g_malloc0(sizeof(int) * dd->nValues); DBG_fprintf(stderr, "Visu Pairs: compute distance distribution (%p %g %d).\n", (gpointer)dd, dd->stepValue, dd->nValues); /* We compute the distribution. */ visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter1); inv = 1.f / dd->stepValue; iter1.element = pair->ele1; for(visu_node_array_iterRestartNode(VISU_NODE_ARRAY(dataObj), &iter1); iter1.node; visu_node_array_iterNextNodeOriginal(VISU_NODE_ARRAY(dataObj), &iter1)) { if (!iter1.node->rendered) continue; dd->nNodesEle1 += 1; visu_data_getNodePosition(dataObj, iter1.node, xyz1); visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter2); iter2.element = pair->ele2; /* fprintf(stderr, "## %d\n", dd->histo[177]); */ for(visu_node_array_iterRestartNode(VISU_NODE_ARRAY(dataObj), &iter2); iter2.node; visu_node_array_iterNextNode(VISU_NODE_ARRAY(dataObj), &iter2)) { if (!iter2.node->rendered) continue; /* Don't count the inter element pairs two times. */ if (iter1.element == iter2.element && iter2.node == iter1.node) continue; visu_data_getNodePosition(dataObj, iter2.node, xyz2); d2 = (xyz1[0] - xyz2[0]) * (xyz1[0] - xyz2[0]) + (xyz1[1] - xyz2[1]) * (xyz1[1] - xyz2[1]) + (xyz1[2] - xyz2[2]) * (xyz1[2] - xyz2[2]); /* We put the distance into the histogram. */ dd->histo[MIN((guint)((sqrt(d2) - dd->initValue) * inv), dd->nValues - 1)] += 1; /* fprintf(stderr, "%d-%d %d\n", iter1.node->number, iter2.node->number, dd->histo[177]); */ } /* fprintf(stderr, "-> %d\n", dd->histo[177]); */ } for(visu_node_array_iterRestartNode(VISU_NODE_ARRAY(dataObj), &iter2); iter2.node; visu_node_array_iterNextNode(VISU_NODE_ARRAY(dataObj), &iter2)) if (iter2.node->rendered) dd->nNodesEle2 += 1; if (iter1.element == iter2.element) for (i = 0; i < dd->nValues; i++) dd->histo[i] /= 2; #if DEBUG == 1 g_timer_stop(timer); for (nRef = 0; nRef < dd->nValues; nRef++) fprintf(stderr, " | %03d -> %6.3f, %5d\n", nRef, dd->initValue + dd->stepValue * nRef, dd->histo[nRef]); fprintf(stderr, "Visu Pairs: distances analysed in %g micro-s.\n", g_timer_elapsed(timer, &fractionTimer)/1e-6); g_timer_destroy(timer); #endif return dd; } /** * visu_pair_distribution_getNextPick: * @dd: a #VisuPairDistribution object. * @startStopId: two ids. * @integral: a location for a guint value, can be NULL. * @max: a location to store the value ; * @posMax: a location to store the position of the pick. * * Try to find the next pick in the distribution. A pick is a group of * consecutive non-null values, with a significant integral. On enter, * @startStopId contains the span to look into for the pick, and on * output, it contains the span of the pick itself. * * Since: 3.6 * * Returns: TRUE if a pick is found. */ gboolean visu_pair_distribution_getNextPick(VisuPairDistribution *dd, guint startStopId[2], guint *integral, guint *max, guint *posMax) { float min, start, stop; guint i, iStart, iStop, sum, _posMax, _max; g_return_val_if_fail(dd, FALSE); g_return_val_if_fail(startStopId[1] < dd->nValues, FALSE); iStart = startStopId[0]; iStop = startStopId[1]; _max = 0; _posMax = 0; min = 1.5f * MIN(dd->nNodesEle1, dd->nNodesEle2); DBG_fprintf(stderr, "Visu Pairs: look for one pick in %d-%d.\n", startStopId[0], startStopId[1]); do { min *= 0.5f; start = -1.f; stop = -1.f; sum = 0; for (i = startStopId[0] ; i < startStopId[1]; i++) { if (start < 0.f && dd->histo[i] > 0) { start = dd->stepValue * i + dd->initValue; sum = dd->histo[i]; iStart = i; _max = dd->histo[i]; _posMax = i; } else if (start > 0.f) { if (dd->histo[i] == 0) { if (sum >= min) { stop = dd->stepValue * i + dd->initValue; iStop = i; break; } else start = -1.f; } else { sum += dd->histo[i]; if (dd->histo[i] > _max) { _max = dd->histo[i]; _posMax = i; } } } } DBG_fprintf(stderr, "Visu Pairs: found one pick at %d-%d (%d).\n", iStart, iStop, sum); } while (start < 0.f && min > 0.1f * MIN(dd->nNodesEle1, dd->nNodesEle2)); DBG_fprintf(stderr, "Visu Pairs: set start and stop at %f, %f (%f %d).\n", start, stop, min, sum); if (start <= 0.f || stop <= 0.f) return FALSE; startStopId[0] = iStart; startStopId[1] = iStop; if (integral) *integral = sum; if (max) *max = _max; if (posMax) *posMax = _posMax; return TRUE; } static void foreachLevel2(gpointer key _U_, gpointer value, gpointer userData) { VisuPair *pair; GList *tmpLst; struct foreachPairsData_struct *storage; pair = (VisuPair*)value; storage = (struct foreachPairsData_struct *)userData; for (tmpLst = pair->pairs; tmpLst; tmpLst = g_list_next(tmpLst)) storage->func(pair->ele1, pair->ele2, (VisuPairLink*)tmpLst->data, storage->userData); } /** * visu_pair_foreach: * @whatToDo: (scope call): a VisuPairForeachFunc() method ; * @user_data: some user defined data. * * The way #VisuPairLink are stored in V_Sim is private and could changed between version. * This method is used to apply some method each pairs. */ void visu_pair_foreach(VisuPairForeachFunc whatToDo, gpointer user_data) { struct foreachPairsData_struct storage; if (!DminDmax) visu_pair_init(); storage.func = whatToDo; storage.userData = user_data; g_hash_table_foreach(DminDmax, (GHFunc)foreachLevel2, (gpointer)(&storage)); } v_sim-3.7.0/src/visu_pairs.h0000644000353400050620000002042412215546105012710 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef VISU_PAIRS #define VISU_PAIRS #include "openGLFunctions/view.h" #include "visu_data.h" #include "coreTools/toolColor.h" G_BEGIN_DECLS /** * VISU_PAIR_DISTANCE_MIN * * Flag used to define the minimum length to draw pair. This is useful with * the visu_pair_link_getDistance() and the visu_pair_link_setDistance() methods. */ #define VISU_PAIR_DISTANCE_MIN 0 /** * VISU_PAIR_DISTANCE_MAX * * Flag used to define the maximum length to draw pair. This is useful with * the visu_pair_link_getDistance() and the visu_pair_link_setDistance() methods. */ #define VISU_PAIR_DISTANCE_MAX 1 /** * VisuPair: * * An opaque structure to define links (i.e. several #VisuPairLink) * between elements. */ typedef struct _VisuPair VisuPair; /** * VISU_TYPE_PAIR_LINK: * * return the type of #VisuPairLink. * * Since: 3.7 */ #define VISU_TYPE_PAIR_LINK (visu_pair_link_get_type ()) /** * VISU_PAIR_LINK: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuPairLink type. * * Since: 3.7 */ #define VISU_PAIR_LINK(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_TYPE_PAIR_LINK, VisuPairLink)) /** * VISU_PAIR_LINK_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuPairLinkClass. * * Since: 3.7 */ #define VISU_PAIR_LINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_TYPE_PAIR_LINK, VisuPairLinkClass)) /** * VISU_IS_PAIR_LINK: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuPairLink object. * * Since: 3.7 */ #define VISU_IS_PAIR_LINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_TYPE_PAIR_LINK)) /** * VISU_IS_PAIR_LINK_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuPairLinkClass class. * * Since: 3.7 */ #define VISU_IS_PAIR_LINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_TYPE_PAIR_LINK)) /** * VISU_PAIR_LINK_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. * * Since: 3.7 */ #define VISU_PAIR_LINK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_TYPE_PAIR_LINK, VisuPairLinkClass)) typedef struct _VisuPairLink VisuPairLink; typedef struct _VisuPairLinkPrivate VisuPairLinkPrivate; typedef struct _VisuPairLinkClass VisuPairLinkClass; struct _VisuPairLink { GObject parent; VisuPairLinkPrivate *priv; }; struct _VisuPairLinkClass { GObjectClass parent; }; /** * visu_pair_link_get_type: * * This method returns the type of #VisuPairLink, use * VISU_TYPE_PAIR_LINK instead. * * Since: 3.7 * * Returns: the type of #VisuPairLink. */ GType visu_pair_link_get_type(void); GList* visu_pair_link_getAll (VisuElement *ele1, VisuElement *ele2); VisuPairLink* visu_pair_link_new (VisuElement *ele1, VisuElement *ele2, float minMax[2]); VisuPairLink* visu_pair_link_getFromId (VisuElement *ele1, VisuElement *ele2, guint pos); gboolean visu_pair_link_setDrawn (VisuPairLink *data, gboolean drawn); gboolean visu_pair_link_getDrawn (const VisuPairLink *data); gboolean visu_pair_link_setColor (VisuPairLink *data, ToolColor* destColor); ToolColor* visu_pair_link_getColor (const VisuPairLink *data); gboolean visu_pair_link_setPrintLength(VisuPairLink *data, gboolean status); gboolean visu_pair_link_getPrintLength(const VisuPairLink *data); gboolean visu_pair_link_setDistance (VisuPairLink *data, float val, int minOrMax); float visu_pair_link_getDistance (const VisuPairLink *data, int minOrMax); VisuPair* visu_pair_link_getPair (const VisuPairLink *data); gboolean visu_pair_link_isDrawn (const VisuPairLink *data); /** * VisuPairDistribution: * @ele1: one #VisuElement. * @ele2: one #VisuElement. * @histo: an array containing the distribution ; * @nValues: the size of the array ; * @initValue: the initial distance value (usualy 0) ; * @stepValue: the step increase in distance at each value ; * @nNodesEle1: the number of nodes used during the computation ; * @nNodesEle2: idem for #VisuElement 2. * * This structure stores for a given pair, the distance distribution * on a given range [@initValue;@nValues * @stepValue[. */ typedef struct _VisuPairDistribution VisuPairDistribution; struct _VisuPairDistribution { VisuElement *ele1, *ele2; guint *histo; guint nValues; float initValue, stepValue; guint nNodesEle1, nNodesEle2; }; VisuPair* visu_pair_getPair(VisuElement *ele1, VisuElement *ele2); void visu_pair_setProperty(VisuPair *pair, const gchar* key, gpointer value, GDestroyNotify freeFunc); gpointer visu_pair_getProperty(VisuPair *pair, const gchar* key); void visu_pair_getElements(const VisuPair *pair, VisuElement **ele1, VisuElement **ele2); gboolean visu_pair_removePairLink(VisuElement *ele1, VisuElement *ele2, VisuPairLink *data); VisuPairDistribution* visu_pair_getDistanceDistribution(VisuPair *pair, VisuData *dataObj, float step, float min, float max); gboolean visu_pair_distribution_getNextPick(VisuPairDistribution *dd, guint startStopId[2], guint *integral, guint *max, guint *posMax); /** * VisuPairForeachFunc: * @ele1: a #VisuElement object ; * @ele2: a #VisuElement object ; * @data: a #VisuPairLink object ; * @user_data: some user defined data. * * Prototype of functions called with the foreach method apply to each * pairs. */ typedef void (*VisuPairForeachFunc)(VisuElement *ele1, VisuElement *ele2, VisuPairLink *data, gpointer user_data); void visu_pair_foreach(VisuPairForeachFunc whatToDo, gpointer user_data); /** * visu_pair_readLinkFromTokens: * @tokens: array of tokens resulting from a call to g_strsplit() with " " as separator ; * @index: IN, the position of the beginning in @tokens ; OUT, one token * after the last read ; * @data: a pointer to return an allocated link object ; * @position: the number of the line of the config * file which the @line argument is taken from ; * @error: a location to store a possible reading error. * * This routine is used to read the resource file. Given @tokens, it * associate a link object by reading the two elements and the two * distances that characterised this link. * * Returns: TRUE if succeed. */ gboolean visu_pair_readLinkFromTokens(gchar **tokens, int *index, VisuPairLink **data, int position, GError **error); G_END_DECLS #endif v_sim-3.7.0/src/gtk_renderingWindowWidget.c0000644000353400050620000032103412215612670015677 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2006) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2006) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifdef HAVE_CONFIG_H #include #endif #include "gtk_renderingWindowWidget.h" #include #include #include /* for sqrt function... */ #include #include #include "support.h" #include "visu_gtk.h" #include "visu_tools.h" #include "visu_object.h" #include "visu_basic.h" #include "visu_data.h" #include "visu_configFile.h" #include "visu_extension.h" #include "OSOpenGL/visu_openGL.h" #include "renderingBackend/visu_actionInterface.h" #include "gtk_openGLWidget.h" #include "extraFunctions/extraNode.h" #include "coreTools/toolFileFormat.h" #include "coreTools/toolConfigFile.h" #include "extraGtkFunctions/gtk_dumpDialogWidget.h" #include "extraGtkFunctions/gtk_orientationChooser.h" #include "openGLFunctions/objectList.h" #include "openGLFunctions/interactive.h" #include "opengl.h" #include "extensions/axes.h" #include "extensions/nodes.h" #include "extensions/pairs.h" #include "dumpModules/dumpToSVG.h" /** * SECTION:gtk_renderingWindowWidget * @short_description: Defines a complex widget used to render files * and print information. * * This is a complex widget, inheriting from #GtkWindow, with a * rendering area and a status bar area. A #VisuData is always * attached to this widget, see visu_ui_rendering_window_setData(). If not * the V_Sim logo is displayed. * * The rendering area can receive keyboard or mouse events, see * visu_ui_rendering_window_class_getInteractive. * * The status bar area has different buttons to load or export a * file. It also display some usefull information like the number of * rendered nodes. It has also a real status bar location displaying * tips about current available actions. One can add news using * visu_ui_rendering_window_pushMessage(). */ typedef enum { event_button_press, event_button_release, event_motion_notify, event_key_press, event_key_release, event_scroll } InteractiveEventsId; struct InteractiveEvents_struct { gulong callbackId; InteractiveEventsId id; }; typedef struct InteractiveEvents_struct InteractiveEvents; struct GtkInfoArea_struct { GtkWidget *area; GtkWidget *infoBar; GtkWidget *searchEntry; GtkWidget *hboxFileInfo; GtkWidget *labelSize; GtkWidget *labelNb; GtkWidget *labelFileInfo; gboolean fileInfoFreeze; GtkWidget *hboxTools; GtkWidget *dumpButton; GtkWidget *loadButton; GtkWidget *raiseButton; GtkWidget *reloadButton; GtkWidget *statusInfo, *progress; guint progressId; GtkWidget *cancelButton; GCancellable *cancel; GtkWidget *hboxInteractive; GtkWidget *clearMarksButton; GtkWidget *infoButton; gulong infoClicked; guint statusInfoId; }; typedef struct GtkInfoArea_struct GtkInfoArea; #define GTK_STATUSINFO_NOFILEINFO _("No description is available") #define GTK_STATUSINFO_NONB _("Nothing is loaded") #define FLAG_PARAMETER_RED_COORD "config_showReducedCoordinates" #define DESC_PARAMETER_RED_COORD "Display coordinates in reduced values when picking a node ; boolean 0 or 1" #define FLAG_PARAMETER_AUTO_ADJUST "config_autoAdjustCamera" #define DESC_PARAMETER_AUTO_ADJUST "Auto adjust zoom capability for the box to be full size at zoom level 1 ; boolean 0 or 1" #define MENU_CAMERA_SAVE "/Camera/Save" #define MENU_CAMERA_RESTORE "/Camera/Restore" #define MENU_CAMERA_ORIENT "/Camera/Orientation" #define MENU_CAMERA_1 "/Camera/select1" #define MENU_CAMERA_2 "/Camera/select2" #define MENU_CAMERA_3 "/Camera/select3" #define MENU_CAMERA_4 "/Camera/select4" #define MENU_CAMERA_5 "/Camera/select5" #define MENU_CAMERA_6 "/Camera/select6" #define MENU_CAMERA_7 "/Camera/select7" #define MENU_CAMERA_8 "/Camera/select8" #define MENU_CAMERA_9 "/Camera/select9" static const gchar* cameraAccels[] = {MENU_CAMERA_1, MENU_CAMERA_2, MENU_CAMERA_3, MENU_CAMERA_4, MENU_CAMERA_5, MENU_CAMERA_6, MENU_CAMERA_7, MENU_CAMERA_8, MENU_CAMERA_9}; static guint cameraKeys[] = {GDK_KEY_1, GDK_KEY_2, GDK_KEY_3, GDK_KEY_4, GDK_KEY_5, GDK_KEY_6, GDK_KEY_7, GDK_KEY_8, GDK_KEY_9}; enum { EXPORT_SIGNAL, OPEN_SIGNAL, RELOAD_SIGNAL, SHOW_ACTION_DIALOG_SIGNAL, SHOW_MAIN_PANEL_SIGNAL, SHOW_ORIENTATION_SIGNAL, LOAD_NEXT_FILE_SIGNAL, LOAD_PREV_FILE_SIGNAL, SEARCH_SIGNAL, LAST_SIGNAL }; enum { TEXT_PLAIN, TEXT_URI_LIST }; /* Local variables. */ static VisuInteractive *inter; static guint _signals[LAST_SIGNAL] = { 0 }; /* Local methods. */ static void exportParameters(GString *data, VisuData *dataObj, VisuGlView *view); static GtkInfoArea *gtkStatusInfo_createBar(VisuUiRenderingWindow *window, gint width, gint height, gboolean withToolBar); static gulong addInteractiveEventListeners(VisuUiRenderingWindow *window, InteractiveEventsId id); static GtkWidget* buildCameraMenu(VisuUiRenderingWindow *window); static void _setLabelSize(GtkInfoArea *info, gint width, gint height); static void _setFileDescription(GtkInfoArea *info, gchar *message); static void _setNNodes(GtkInfoArea *info, gint nb); static void getOpenGLAreaSize(VisuUiRenderingWindow *window, guint *width, guint *height); static void _redraw(VisuUiRenderingWindow *window, gboolean forceRedraw); /* Local callbacks */ static void visu_ui_rendering_window_dispose (GObject* obj); static void visu_ui_rendering_window_finalize(GObject* obj); static void onMarkClearClicked(GtkButton *button, gpointer data); static void onNodeInfoClicked(GtkToggleButton *button, gpointer data); static void onRaiseButtonClicked(VisuUiRenderingWindow *window, gpointer user_data); static void displayFileInfoOnDataLoaded(VisuUiRenderingWindow *window); static void onRenderingMethodChanged(VisuUiRenderingWindow *window, VisuRendering *method, gpointer data); static void setFileButtonsSensitive(VisuUiRenderingWindow *window); static void onNodePopulationChanged(VisuData *data, int *nodes, gpointer user_data); static gboolean onDragMotion(GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint t, gpointer user_data); static void onDropData(VisuUiRenderingWindow *window, GdkDragContext *context, gint x, gint y, GtkSelectionData *selection_data, guint target_type, guint time, GtkWidget *glArea); static gboolean onCameraMenu(VisuUiRenderingWindow *window, GdkEventButton *event, GtkEventBox *ev); static void onCameraMenuSelected(GtkMenuShell *menushell, gpointer user_data); static void onCameraMenuClicked(GtkMenuItem *menuitem, gpointer user_data); static void onCameraMenuCurrentClicked(GtkMenuItem *menuitem, gpointer user_data); static void onCameraMenuOrientationClicked(GtkMenuItem *menuitem, gpointer user_data); static void minimalPickInfo(VisuInteractive *inter, VisuInteractivePick pick, VisuNode *node0, VisuNode *node1, VisuNode *node2, gpointer data); static void minimalPickError(VisuInteractive *inter, VisuInteractivePickError error, gpointer data); static void onCancelButtonClicked(GtkButton *button, gpointer data); static gboolean onCameraAccel(GtkAccelGroup *accel, GObject *obj, guint key, GdkModifierType mod, gpointer data); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 17 static void _onSearchClose(GtkInfoBar *bar, gint response, gpointer data); static void _onSearchEdited(GtkEntry *entry, gpointer data); #endif struct _VisuUiRenderingWindow { GtkVBox generalVBox; gboolean dispose_has_run; /*********************************/ /* Dealing with the OpenGL area. */ /*********************************/ /* The OpenGL area and it's notification zone. */ GtkWidget *openGLArea; /* Stored size of the OpenGL area. */ gint socketWidth, socketHeight; /* This pointer give the handle to rule all interactive actions. */ GList *inters; /* Printed marks. */ VisuGlExtMarks *marks; /* This is a list of currently connected signal for the interactive mode. */ GList *interactiveEvents; /* A pointer on the current used cursor. */ GdkCursor *currentCursor; GdkCursor *refCursor; /* Rendered extensions. */ VisuGlExtNodes *extNodes; /*************************************/ /* Dealing with the information bar. */ /*************************************/ /* TO BE INTEGRATED. */ GtkInfoArea *info; /* TO BE INTEGRATED. */ int nbStatusMessage; GtkAccelGroup *accel; /* A pointer to the currently loaded VisuData. */ VisuData *currentData; /* Id of signals currently connected, related to the current #VisuData object. */ gulong populationIncrease_id, populationDecrease_id; /* A pointer on the VisuGlView used for the rendering area. */ VisuGlView *view; }; struct _VisuUiRenderingWindowClass { GtkVBoxClass parent_class; void (*renderingWindow) (VisuUiRenderingWindow *window); /* Action signals for keybindings, do not connect to these */ void (*export) (VisuUiRenderingWindow *window); void (*open) (VisuUiRenderingWindow *window); void (*reload) (VisuUiRenderingWindow *window); void (*orient) (VisuUiRenderingWindow *window); void (*search) (VisuUiRenderingWindow *window); GdkCursor *cursorRotate; GdkCursor *cursorWatch; GdkCursor *cursorPointer; GdkCursor *cursorPirate; GdkCursor *cursorGrab; GdkCursor *currentCursor; gboolean useReducedCoordinates; gboolean autoAdjust; /* To be removed when redraw is a signal object. */ VisuUiRenderingWindow *redrawWidget; }; static VisuUiRenderingWindowClass *my_class = NULL; G_DEFINE_TYPE(VisuUiRenderingWindow, visu_ui_rendering_window, GTK_TYPE_VBOX) /* Local callbacks */ static gboolean timeOutPopMessage(gpointer data); static void onSizeChangeEvent(GtkWidget *widget, GtkAllocation *allocation, gpointer user_data); static void onRedraw(VisuUiRenderingWindow *window, gpointer data); static void onForceRedraw(VisuUiRenderingWindow *window, gpointer data); static void onRealiseEvent(GtkWidget *wd, gpointer data); static void onExport(VisuUiRenderingWindow *window); static void onOpen(VisuUiRenderingWindow *window); static void _onSearch(VisuUiRenderingWindow *window); static void _orientationChooser(VisuUiRenderingWindow *window); static gboolean _onSearchEsc(GtkWidget *widget, GdkEventKey *event, gpointer data); /* Interactive mode listeners. */ static gboolean onKeyPressed(GtkWidget *widget, GdkEventKey *event, gpointer data); static gboolean onKeyRelease(GtkWidget *widget, GdkEventKey *event, gpointer data); static gboolean onMouseMotion(GtkWidget *widget, GdkEventMotion *event, gpointer user_data); static gboolean onScrollEvent(GtkWidget *widget, GdkEventScroll *event, gpointer user_data); static gboolean onButtonAction(VisuUiRenderingWindow *window, GdkEventButton *event, gpointer user_data); static void visu_ui_rendering_window_class_init(VisuUiRenderingWindowClass *klass) { GtkBindingSet *binding_set; VisuConfigFileEntry *resourceEntry; DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: creating the class of the widget.\n"); /* Initialisation des curseurs utiles. */ klass->cursorPirate = gdk_cursor_new(GDK_PIRATE); klass->cursorRotate = gdk_cursor_new(GDK_EXCHANGE); klass->cursorWatch = gdk_cursor_new(GDK_WATCH); klass->cursorPointer = gdk_cursor_new(GDK_DOTBOX); klass->cursorGrab = gdk_cursor_new(GDK_FLEUR); klass->export = onExport; klass->reload = visu_ui_rendering_window_reload; klass->open = onOpen; klass->orient = _orientationChooser; klass->search = _onSearch; klass->useReducedCoordinates = FALSE; klass->autoAdjust = TRUE; inter = visu_interactive_new(interactive_measureAndObserve); DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: connect the signals.\n"); G_OBJECT_CLASS(klass)->dispose = visu_ui_rendering_window_dispose; G_OBJECT_CLASS(klass)->finalize = visu_ui_rendering_window_finalize; /** * VisuUiRenderingWindow::export: * @window: the object emitting the signal. * * Signal emitted when the user ask for data export. * * Since: 3.6 */ _signals[EXPORT_SIGNAL] = g_signal_new("export", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(VisuUiRenderingWindowClass, export), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * VisuUiRenderingWindow::open: * @window: the object emitting the signal. * * Signal emitted when the user ask to open new data. * * Since: 3.6 */ _signals[OPEN_SIGNAL] = g_signal_new("open", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(VisuUiRenderingWindowClass, open), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * VisuUiRenderingWindow::reload: * @window: the object emitting the signal. * * Signal emitted when the user ask to reload current data. * * Since: 3.6 */ _signals[RELOAD_SIGNAL] = g_signal_new("reload", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(VisuUiRenderingWindowClass, reload), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * VisuUiRenderingWindow::search: * @window: the object emitting the signal. * * Signal emitted when the user ask to search info in current data. * * Since: 3.7 */ _signals[SEARCH_SIGNAL] = g_signal_new("search", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(VisuUiRenderingWindowClass, search), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * VisuUiRenderingWindow::show-action-dialog: * @window: the object emitting the signal. * * Signal emitted when the user ask to show the action dialog. * * Since: 3.6 */ _signals[SHOW_ACTION_DIALOG_SIGNAL] = g_signal_new("show-action-dialog", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS | G_SIGNAL_ACTION, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * VisuUiRenderingWindow::show-main-panel: * @window: the object emitting the signal. * * Signal emitted when the user ask to raise the main panel. * * Since: 3.6 */ _signals[SHOW_MAIN_PANEL_SIGNAL] = g_signal_new("show-main-panel", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS | G_SIGNAL_ACTION, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * VisuUiRenderingWindow::show-orientation-chooser: * @window: the object emitting the signal. * * Signal emitted when the user ask to precisely select a camera angle. * * Since: 3.7 */ _signals[SHOW_ORIENTATION_SIGNAL] = g_signal_new("show-orientation-chooser", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(VisuUiRenderingWindowClass, orient), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * VisuUiRenderingWindow::load-next-file: * @window: the object emitting the signal. * * Signal emitted when the user ask to load next file of a given list. * * Since: 3.7 */ _signals[LOAD_NEXT_FILE_SIGNAL] = g_signal_new("load-next-file", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS | G_SIGNAL_ACTION, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * VisuUiRenderingWindow::load-prev-file: * @window: the object emitting the signal. * * Signal emitted when the user ask to load previous file of a given list. * * Since: 3.7 */ _signals[LOAD_PREV_FILE_SIGNAL] = g_signal_new("load-prev-file", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS | G_SIGNAL_ACTION, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: connect the bindings.\n"); binding_set = gtk_binding_set_by_class(klass); gtk_binding_entry_add_signal(binding_set, GDK_KEY_s, GDK_CONTROL_MASK, "export", 0); gtk_binding_entry_add_signal(binding_set, GDK_KEY_o, GDK_CONTROL_MASK, "open", 0); gtk_binding_entry_add_signal(binding_set, GDK_KEY_r, GDK_CONTROL_MASK, "reload", 0); gtk_binding_entry_add_signal(binding_set, GDK_KEY_v, GDK_CONTROL_MASK, "show-orientation-chooser", 0); gtk_binding_entry_add_signal(binding_set, GDK_KEY_i, GDK_CONTROL_MASK, "show-action-dialog", 0); gtk_binding_entry_add_signal(binding_set, GDK_KEY_f, GDK_CONTROL_MASK, "search", 0); gtk_binding_entry_add_signal(binding_set, GDK_KEY_Home, 0, "show-main-panel", 0); gtk_binding_entry_add_signal(binding_set, GDK_KEY_n, 0, "load-next-file", 0); gtk_binding_entry_add_signal(binding_set, GDK_KEY_p, 0, "load-prev-file", 0); DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: add the resources.\n"); resourceEntry = visu_config_file_addBooleanEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_RED_COORD, DESC_PARAMETER_RED_COORD, &klass->useReducedCoordinates); visu_config_file_entry_setVersion(resourceEntry, 3.6f); resourceEntry = visu_config_file_addBooleanEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_AUTO_ADJUST, DESC_PARAMETER_AUTO_ADJUST, &klass->autoAdjust); visu_config_file_entry_setVersion(resourceEntry, 3.6f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_PARAMETER, exportParameters); my_class = klass; } static void visu_ui_rendering_window_dispose(GObject* obj) { GList *ptList; InteractiveEvents *event; VisuUiRenderingWindow *window; VisuData *dataObj; DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: dispose object %p.\n", (gpointer)obj); window = VISU_UI_RENDERING_WINDOW(obj); if (window->dispose_has_run) return; window->dispose_has_run = TRUE; dataObj = window->currentData; window->currentData = (VisuData*)0; if (dataObj) DBG_fprintf(stderr, " | current data has %d ref counts.\n", G_OBJECT(dataObj)->ref_count); for (ptList = window->inters; ptList; ptList = g_list_next(ptList)) visu_ui_rendering_window_popInteractive(window, VISU_INTERACTIVE(ptList->data)); DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: releasing current handles.\n"); if (window->info->progressId) g_source_remove(window->info->progressId); visu_gl_ext_marks_setData(window->marks, (VisuData*)0); DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: release current data handle.\n"); if (dataObj) { DBG_fprintf(stderr, " | current data has %d ref counts.\n", G_OBJECT(dataObj)->ref_count); g_object_unref(dataObj); } if (window->marks) g_object_unref(window->marks); g_object_unref(window->info->cancel); if (window->view) g_object_unref(window->view); DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: removing interactive listeners.\n"); for (ptList = window->interactiveEvents; ptList; ptList = g_list_next(ptList)) { event = (InteractiveEvents*)ptList->data; DBG_fprintf(stderr, " | disconnecting %d signal.\n", event->id); g_signal_handler_disconnect(G_OBJECT(window->openGLArea), event->callbackId); g_free(ptList->data); } if (window->interactiveEvents) g_list_free(window->interactiveEvents); window->interactiveEvents = (GList*)0; g_object_unref(window->accel); DBG_fprintf(stderr, " | ext nodes has %d ref counts.\n", G_OBJECT(window->extNodes)->ref_count); g_object_unref(window->extNodes); if (DEBUG && dataObj) DBG_fprintf(stderr, " | current data has %d ref counts.\n", G_OBJECT(dataObj)->ref_count); DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: chain to parent.\n"); G_OBJECT_CLASS(visu_ui_rendering_window_parent_class)->dispose(obj); DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: dispose done.\n"); } static void visu_ui_rendering_window_finalize(GObject* obj) { DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: finalize object %p.\n", (gpointer)obj); g_free(VISU_UI_RENDERING_WINDOW(obj)->info); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_rendering_window_parent_class)->finalize(obj); } static void visu_ui_rendering_window_init(VisuUiRenderingWindow *renderingWindow) { guint n; GClosure *closure; DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: initializing new object (%p).\n", (gpointer)renderingWindow); renderingWindow->currentData = (VisuData*)0; renderingWindow->populationDecrease_id = 0; renderingWindow->populationIncrease_id = 0; renderingWindow->view = (VisuGlView*)0; /* Binding for the camera menu. */ DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: connect the camera bindings.\n"); renderingWindow->accel = gtk_accel_group_new(); gtk_accel_map_add_entry(g_intern_static_string(MENU_CAMERA_RESTORE), GDK_KEY_r, 0); gtk_accel_map_add_entry(g_intern_static_string(MENU_CAMERA_SAVE), GDK_KEY_s, 0); gtk_accel_map_add_entry(g_intern_static_string(MENU_CAMERA_ORIENT), GDK_KEY_v, GDK_CONTROL_MASK); DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: connect the camera numbered bindings.\n"); for (n = 0; n < 9; n++) { gtk_accel_map_add_entry(g_intern_static_string(cameraAccels[n]), cameraKeys[n], GDK_CONTROL_MASK); closure = g_cclosure_new(G_CALLBACK(onCameraAccel), (gpointer)renderingWindow, (GClosureNotify)0); gtk_accel_group_connect_by_path(renderingWindow->accel, g_intern_static_string(cameraAccels[n]), closure); g_closure_unref(closure); } g_signal_connect(G_OBJECT(inter), "node-selection", G_CALLBACK(minimalPickInfo), (gpointer)renderingWindow); g_signal_connect(G_OBJECT(inter), "selection-error", G_CALLBACK(minimalPickError), (gpointer)renderingWindow); /* Add VisuGlExt to the OpenGL area. */ renderingWindow->extNodes = visu_gl_ext_nodes_new(); visu_interactive_setNodeList(inter, renderingWindow->extNodes); DBG_fprintf(stderr, " | ext nodes has %d ref counts.\n", G_OBJECT(renderingWindow->extNodes)->ref_count); } /** * visu_ui_rendering_window_new: * @width: its desired width ; * @height: its desired height ; * @withFrame: a boolean ; * @withToolBar: a boolean. * * A #VisuUiRenderingWindow widget is a GtkWindow that have an area for * OpenGL drawing and a statusBar with many stuff like action buttons, * real status bar for notifications, ... The rendering area can be * drawn with a frame or not. With this routine, only the * #VisuUiRenderingWindow widget is created. * * Returns: a newly created #VisuUiRenderingWindow widget. */ GtkWidget* visu_ui_rendering_window_new(int width, int height, gboolean withFrame, gboolean withToolBar) { VisuUiRenderingWindow *renderingWindow; GtkWidget *wd; GtkTargetList *target_list; DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: create a new VisuUiRenderingWindow object.\n"); renderingWindow = VISU_UI_RENDERING_WINDOW(g_object_new(visu_ui_rendering_window_get_type(), NULL)); /* We create the statusinfo area. */ renderingWindow->info = gtkStatusInfo_createBar(renderingWindow, width, height, withToolBar); wd = renderingWindow->info->area; gtk_box_pack_end(GTK_BOX(renderingWindow), wd, FALSE, FALSE, 0); renderingWindow->openGLArea = visu_ui_gl_widget_new(TRUE); gtk_widget_set_can_focus(renderingWindow->openGLArea, TRUE); g_signal_connect_swapped(G_OBJECT(renderingWindow->openGLArea), "realize", G_CALLBACK(onRealiseEvent), (gpointer)renderingWindow); /* DnD */ gtk_drag_dest_set(renderingWindow->openGLArea, (GTK_DEST_DEFAULT_ALL), NULL, 0, GDK_ACTION_COPY); target_list = gtk_target_list_new(NULL, 0); gtk_target_list_add_uri_targets(target_list, TEXT_URI_LIST); gtk_target_list_add_text_targets(target_list, TEXT_PLAIN); gtk_drag_dest_set_target_list(renderingWindow->openGLArea, target_list); gtk_target_list_unref(target_list); g_signal_connect(renderingWindow->openGLArea, "drag-motion", G_CALLBACK(onDragMotion), NULL); g_signal_connect_swapped(renderingWindow->openGLArea, "drag-data-received", G_CALLBACK(onDropData), (gpointer)renderingWindow); gtk_widget_set_size_request(renderingWindow->openGLArea, width, height); /* Attach no redraw redraw method. */ visu_ui_gl_widget_setRedraw(VISU_UI_GL_WIDGET(renderingWindow->openGLArea), (VisuUiGlWidgetRedrawMethod)0, (VisuGlView*)0); if (withFrame) { wd = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(wd), GTK_SHADOW_ETCHED_IN); gtk_box_pack_start(GTK_BOX(renderingWindow), wd, TRUE, TRUE, 0); gtk_container_add(GTK_CONTAINER(wd), renderingWindow->openGLArea); } else gtk_box_pack_start(GTK_BOX(renderingWindow), renderingWindow->openGLArea, TRUE, TRUE, 0); /* We physically show the vbox. */ gtk_widget_show_all(GTK_WIDGET(renderingWindow)); /* Unset the size request. */ renderingWindow->socketWidth = width; renderingWindow->socketHeight = height; /* Set a listener on the size to show the warning icon accordingly. */ g_signal_connect(G_OBJECT(renderingWindow->openGLArea), "size-allocate", G_CALLBACK(onSizeChangeEvent), (gpointer)renderingWindow); /* Set local variables. */ DBG_fprintf(stderr, " - setup the local variables.\n"); renderingWindow->nbStatusMessage = 0; renderingWindow->interactiveEvents = (GList*)0; renderingWindow->inters = (GList*)0; renderingWindow->marks = visu_gl_ext_marks_new(NULL); renderingWindow->currentCursor = VISU_UI_RENDERING_WINDOW_CLASS(G_OBJECT_GET_CLASS(renderingWindow))->cursorPirate; renderingWindow->refCursor = VISU_UI_RENDERING_WINDOW_CLASS(G_OBJECT_GET_CLASS(renderingWindow))->cursorPirate; g_signal_connect_swapped(VISU_OBJECT_INSTANCE, "OpenGLAskForReDraw", G_CALLBACK(onRedraw), (gpointer)renderingWindow); g_signal_connect_swapped(VISU_OBJECT_INSTANCE, "OpenGLForceReDraw", G_CALLBACK(onForceRedraw), (gpointer)renderingWindow); g_signal_connect_swapped(VISU_OBJECT_INSTANCE, "renderingChanged", G_CALLBACK(onRenderingMethodChanged), (gpointer)renderingWindow); onRenderingMethodChanged(renderingWindow, visu_object_getRendering(VISU_OBJECT_INSTANCE), (gpointer)0); /* Additional initialisations. */ renderingWindow->view = visu_gl_view_new_withSize(width, height); DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: Building OK.\n"); return GTK_WIDGET(renderingWindow); } static GtkInfoArea *gtkStatusInfo_createBar(VisuUiRenderingWindow *window, gint width, gint height, gboolean withToolBar) { GtkWidget *hbox; GtkWidget *wd, *image, *ev; GtkInfoArea *info; #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkTooltips *tooltips; tooltips = gtk_tooltips_new (); #endif info = g_malloc(sizeof(GtkInfoArea)); info->area = gtk_vbox_new(FALSE, 0); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 17 info->infoBar = gtk_info_bar_new(); wd = gtk_info_bar_add_button(GTK_INFO_BAR(info->infoBar), GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE); gtk_button_set_focus_on_click(GTK_BUTTON(wd), FALSE); gtk_widget_set_no_show_all(info->infoBar, TRUE); g_signal_connect(G_OBJECT(info->infoBar), "response", G_CALLBACK(_onSearchClose), (gpointer)window); g_signal_connect(G_OBJECT(info->infoBar), "key-press-event", G_CALLBACK(_onSearchEsc), (gpointer)window); gtk_box_pack_start(GTK_BOX(info->area), info->infoBar, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(gtk_info_bar_get_content_area(GTK_INFO_BAR(info->infoBar))), hbox); wd = gtk_label_new(_("Toggle highlight for node: ")); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); info->searchEntry = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(info->searchEntry), 20); g_signal_connect(G_OBJECT(info->searchEntry), "activate", G_CALLBACK(_onSearchEdited), (gpointer)window); gtk_box_pack_start(GTK_BOX(hbox), info->searchEntry, FALSE, FALSE, 0); gtk_widget_show_all(hbox); #endif info->fileInfoFreeze = FALSE; info->hboxFileInfo = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(info->area), info->hboxFileInfo, FALSE, FALSE, 1); /* Size info */ wd = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(info->hboxFileInfo), wd, FALSE, FALSE, 5); info->labelSize = gtk_label_new(""); gtk_label_set_use_markup(GTK_LABEL(info->labelSize), TRUE); _setLabelSize(info, width, height); gtk_box_pack_start(GTK_BOX(wd), info->labelSize, FALSE, FALSE, 0); wd = gtk_vseparator_new(); gtk_box_pack_start(GTK_BOX(info->hboxFileInfo), wd, FALSE, FALSE, 0); /* Nb nodes */ info->labelNb = gtk_label_new(""); gtk_label_set_use_markup(GTK_LABEL(info->labelNb), TRUE); _setNNodes(info, -1); gtk_box_pack_start(GTK_BOX(info->hboxFileInfo), info->labelNb, FALSE, FALSE, 5); wd = gtk_vseparator_new(); gtk_box_pack_start(GTK_BOX(info->hboxFileInfo), wd, FALSE, FALSE, 0); /* File info */ wd = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(info->hboxFileInfo), wd, TRUE, TRUE, 5); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 7 image = gtk_image_new_from_stock(GTK_STOCK_INFO, GTK_ICON_SIZE_MENU); #else image = gtk_image_new_from_stock(GTK_STOCK_SAVE, GTK_ICON_SIZE_MENU); #endif gtk_box_pack_start(GTK_BOX(wd), image, FALSE, FALSE, 1); info->labelFileInfo = gtk_label_new(""); gtk_label_set_use_markup(GTK_LABEL(info->labelFileInfo), TRUE); gtk_misc_set_alignment(GTK_MISC(info->labelFileInfo), 0., 0.5); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 gtk_label_set_ellipsize(GTK_LABEL(info->labelFileInfo), PANGO_ELLIPSIZE_END); #endif _setFileDescription(info, GTK_STATUSINFO_NOFILEINFO); gtk_box_pack_start(GTK_BOX(wd), info->labelFileInfo, TRUE, TRUE, 0); ev = gtk_event_box_new(); gtk_widget_set_tooltip_text(ev, _("Click here to get the list of" " saved camera positions.\n" "Use 's' and 'r' keys to save and" " restore camera settings. + 's'" " remove the current camera from the list.")); g_signal_connect_swapped(G_OBJECT(ev), "button-release-event", G_CALLBACK(onCameraMenu), (gpointer)window); gtk_box_pack_end(GTK_BOX(wd), ev, FALSE, FALSE, 0); image = gtk_image_new_from_stock(GTK_STOCK_ZOOM_FIT, GTK_ICON_SIZE_MENU); gtk_container_add(GTK_CONTAINER(ev), image); /* Status */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(info->area), hbox, FALSE, FALSE, 0); /* Handle box for action buttons. */ if (withToolBar) { /* The container */ info->hboxTools = gtk_hbox_new(TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), info->hboxTools, FALSE, FALSE, 0); /* Load button */ info->loadButton = gtk_button_new(); g_object_set(G_OBJECT(info->loadButton), "can-default", FALSE, "can-focus", FALSE, "has-default", FALSE, "has-focus", FALSE, NULL); gtk_widget_set_sensitive(info->loadButton, FALSE); gtk_button_set_focus_on_click(GTK_BUTTON(info->loadButton), FALSE); gtk_widget_set_tooltip_text(info->loadButton, _("Open Ctrl+o")); g_signal_connect_swapped(G_OBJECT(info->loadButton), "clicked", G_CALLBACK(onOpen), (gpointer)window); image = gtk_image_new_from_stock(GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU); gtk_container_add(GTK_CONTAINER(info->loadButton), image); gtk_box_pack_start(GTK_BOX(info->hboxTools), info->loadButton, FALSE, FALSE, 0); /* Refresh button */ wd = gtk_button_new(); g_object_set(G_OBJECT(wd), "can-default", FALSE, "can-focus", FALSE, "has-default", FALSE, "has-focus", FALSE, NULL); gtk_button_set_focus_on_click(GTK_BUTTON(wd), FALSE); gtk_widget_set_tooltip_text(wd, _("Reload the current file Ctrl+r")); g_signal_connect_swapped(G_OBJECT(wd), "clicked", G_CALLBACK(visu_ui_rendering_window_reload), (gpointer)window); image = gtk_image_new_from_stock(GTK_STOCK_REFRESH, GTK_ICON_SIZE_MENU); gtk_container_add(GTK_CONTAINER(wd), image); gtk_box_pack_start(GTK_BOX(info->hboxTools), wd, FALSE, FALSE, 0); info->reloadButton = wd; /* Save button */ info->dumpButton = gtk_button_new(); g_object_set(G_OBJECT(info->dumpButton), "can-default", FALSE, "can-focus", FALSE, "has-default", FALSE, "has-focus", FALSE, NULL); gtk_button_set_focus_on_click(GTK_BUTTON(info->dumpButton), FALSE); gtk_widget_set_tooltip_text(info->dumpButton, _("Export Ctrl+s")); g_signal_connect_swapped(G_OBJECT(info->dumpButton), "clicked", G_CALLBACK(onExport), (gpointer)window); gtk_widget_set_sensitive(info->dumpButton, FALSE); image = gtk_image_new_from_stock(GTK_STOCK_SAVE_AS, GTK_ICON_SIZE_MENU); gtk_container_add(GTK_CONTAINER(info->dumpButton), image); gtk_box_pack_start(GTK_BOX(info->hboxTools), info->dumpButton, FALSE, FALSE, 0); /* Auto-raise command panel button */ info->raiseButton = gtk_button_new(); g_object_set(G_OBJECT(info->raiseButton), "can-default", FALSE, "can-focus", FALSE, "has-default", FALSE, "has-focus", FALSE, NULL); gtk_button_set_focus_on_click(GTK_BUTTON(info->raiseButton), FALSE); gtk_widget_set_tooltip_text(info->raiseButton, _("Raise the command panel window.\n" " Use as key binding.")); g_signal_connect_swapped(G_OBJECT(info->raiseButton), "clicked", G_CALLBACK(onRaiseButtonClicked), (gpointer)window); image = gtk_image_new_from_stock(GTK_STOCK_GO_UP, GTK_ICON_SIZE_MENU); gtk_widget_show(image); gtk_container_add(GTK_CONTAINER(info->raiseButton), image); /* gtk_widget_set_no_show_all(info->raiseButton, TRUE); */ gtk_box_pack_start(GTK_BOX(info->hboxTools), info->raiseButton, FALSE, FALSE, 0); } else { info->loadButton = (GtkWidget*)0; info->dumpButton = (GtkWidget*)0; info->raiseButton = (GtkWidget*)0; } /* The status bar or progress */ info->statusInfo = gtk_statusbar_new(); gtk_box_pack_start(GTK_BOX(hbox), info->statusInfo, TRUE, TRUE, 0); #if GTK_MAJOR_VERSION < 3 gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(info->statusInfo), FALSE); #endif info->statusInfoId = gtk_statusbar_get_context_id(GTK_STATUSBAR(info->statusInfo), "OpenGL statusbar."); gtk_widget_set_no_show_all(info->statusInfo, TRUE); gtk_widget_show(info->statusInfo); info->progressId = 0; info->progress = gtk_progress_bar_new(); gtk_box_pack_start(GTK_BOX(hbox), info->progress, TRUE, TRUE, 0); gtk_widget_set_no_show_all(info->progress, TRUE); info->cancelButton = gtk_button_new_from_stock(GTK_STOCK_CANCEL); gtk_box_pack_start(GTK_BOX(hbox), info->cancelButton, FALSE, FALSE, 0); gtk_widget_set_no_show_all(info->cancelButton, TRUE); g_signal_connect(G_OBJECT(info->cancelButton), "clicked", G_CALLBACK(onCancelButtonClicked), (gpointer)window); info->cancel = g_cancellable_new(); /* The interactive button zone. */ info->hboxInteractive = gtk_hbox_new(TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), info->hboxInteractive, FALSE, FALSE, 0); /* Action button */ wd = gtk_toggle_button_new(); gtk_widget_set_sensitive(wd, FALSE); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wd), FALSE); gtk_button_set_focus_on_click(GTK_BUTTON(wd), FALSE); g_object_set(G_OBJECT(wd), "can-default", FALSE, "can-focus", FALSE, "has-default", FALSE, "has-focus", FALSE, NULL); info->infoClicked = g_signal_connect(G_OBJECT(wd), "clicked", G_CALLBACK(onNodeInfoClicked), (gpointer)window); gtk_widget_set_tooltip_text(wd, _("Measure / remove information" " for the selected node.")); image = gtk_image_new_from_stock(GTK_STOCK_PROPERTIES, GTK_ICON_SIZE_MENU); gtk_container_add(GTK_CONTAINER(wd), image); gtk_box_pack_end(GTK_BOX(info->hboxInteractive), wd, FALSE, FALSE, 0); info->infoButton = wd; g_object_set_data_full(G_OBJECT(wd), "selectedNodeId", g_malloc(sizeof(gint)), g_free); /* Clean marks button */ wd = gtk_button_new(); gtk_widget_set_sensitive(wd, FALSE); gtk_button_set_focus_on_click(GTK_BUTTON(wd), FALSE); g_object_set(G_OBJECT(wd), "can-default", FALSE, "can-focus", FALSE, "has-default", FALSE, "has-focus", FALSE, NULL); g_signal_connect(G_OBJECT(wd), "clicked", G_CALLBACK(onMarkClearClicked), (gpointer)window); gtk_widget_set_tooltip_text(wd, _("Remove all measurement marks.")); image = gtk_image_new_from_stock(GTK_STOCK_CLEAR, GTK_ICON_SIZE_MENU); gtk_container_add(GTK_CONTAINER(wd), image); gtk_box_pack_end(GTK_BOX(info->hboxInteractive), wd, FALSE, FALSE, 0); info->clearMarksButton = wd; return info; } static void onSizeChangeEvent(GtkWidget *widget _U_, GtkAllocation *allocation, gpointer user_data) { VisuUiRenderingWindow *window; window = VISU_UI_RENDERING_WINDOW(user_data); g_return_if_fail(window); /* Return if no changes in size (this event is called even the size is not really changed but has been negociated. */ if (window->socketWidth == allocation->width && window->socketHeight == allocation->height) return; window->socketWidth = allocation->width; window->socketHeight = allocation->height; _setLabelSize(window->info, window->socketWidth, window->socketHeight); /* If data are currently rendered on this window, we ask these data to update to the new size. */ if (window->view) visu_gl_view_setViewport(window->view, allocation->width, allocation->height); } static void onRealiseEvent(GtkWidget *wd, gpointer data _U_) { guint w, h; VisuUiRenderingWindow *window; DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: initializing OpenGL variable for" "the new OpenGL area.\n"); /* Set V_Sim OpenGL options. */ visu_gl_initContext(); DBG_fprintf(stderr, " | openGL context OK\n"); window = VISU_UI_RENDERING_WINDOW(wd); /* If we have a VisuData object attached, we set its size. */ if (window->view) { w = h = 0; getOpenGLAreaSize(window, &w, &h); visu_gl_view_setViewport(window->view, w, h); if (window->currentData) { visu_boxed_setBox(VISU_BOXED(window->view), VISU_BOXED(window->currentData), VISU_UI_RENDERING_WINDOW_GET_CLASS(window)->autoAdjust); visu_gl_ext_rebuildAll(); } } DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: changing the cursor.\n"); /* We set the cursor. */ gdk_window_set_cursor(gtk_widget_get_window(window->openGLArea), window->currentCursor); DBG_fprintf(stderr, " | cursor OK.\n"); DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: changing the minimum size.\n"); gtk_widget_set_size_request(window->openGLArea, 100, 100); gtk_widget_grab_focus(wd); } static gboolean onDragMotion(GtkWidget *widget, GdkDragContext *context, gint x _U_, gint y _U_, guint t, gpointer data _U_) { /* GList *tmpLst; */ GdkAtom atom; /* DBG_fprintf(stderr, "VisuUiRenderingWindow: Hey ! You dnd move something !\n"); */ /* for (tmpLst = context->targets; tmpLst; tmpLst = g_list_next(tmpLst)) */ /* { */ /* DBG_fprintf(stderr, " | dnd: '%s'\n", */ /* gdk_atom_name(GDK_POINTER_TO_ATOM(tmpLst->data))); */ /* } */ atom = gtk_drag_dest_find_target(widget, context, gtk_drag_dest_get_target_list(widget)); if (atom != GDK_NONE) gdk_drag_status(context, GDK_ACTION_COPY, t); else gdk_drag_status(context, 0, t); return (atom != GDK_NONE); } static void onDropData(VisuUiRenderingWindow *window, GdkDragContext *context, gint x _U_, gint y _U_, GtkSelectionData *data, guint type, guint time _U_, GtkWidget *glArea _U_) { gchar **filenames; int i, n, delta; VisuData *newData; if (window == NULL || context == NULL || data == NULL || gtk_selection_data_get_length(data) < 0) return; #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 21 if (gdk_drag_context_get_suggested_action(context) != GDK_ACTION_COPY) return; #else if (context->action != GDK_ACTION_COPY) return; #endif DBG_fprintf(stderr, " | data: '%d' -> '%s'\n", type, gtk_selection_data_get_data(data)); switch (type) { case TEXT_URI_LIST: filenames = gtk_selection_data_get_uris(data); break; case TEXT_PLAIN: filenames = g_strsplit((gchar*)gtk_selection_data_get_data(data), "\n", -1); break; default: filenames = g_malloc(sizeof(gchar*)); filenames[0] = (gchar*)0; break; } gtk_drag_finish(context, TRUE, TRUE, time); newData = visu_data_new(); n = 0; for (i = 0; filenames[i]; i++) { g_strstrip(filenames[i]); if (filenames[i][0] != '\0') { delta = (strncmp("file://", filenames[i], 7))?0:7; visu_data_addFile(newData, filenames[i] + delta, n, (ToolFileFormat*)0); n += 1; } } g_strfreev(filenames); visu_ui_rendering_window_loadFile(window, newData, 0); VISU_REDRAW_ADD; } static void minimalPickInfo(VisuInteractive *inter _U_, VisuInteractivePick pick, VisuNode *node0, VisuNode *node1, VisuNode *node2 _U_, gpointer data) { float posSelect[3], posRef[3], dist; GString *str; VisuUiRenderingWindow *window; int i; gint *id; const gchar *comment; VisuElement *ele; window = VISU_UI_RENDERING_WINDOW(data); g_return_if_fail(window); while (window->nbStatusMessage > 1) visu_ui_rendering_window_popMessage(window); gtk_widget_set_sensitive(window->info->infoButton, FALSE); DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: update the status bar after pick.\n"); switch (pick) { case PICK_SELECTED: gtk_widget_set_sensitive(window->info->infoButton, TRUE); id = (gint*)g_object_get_data(G_OBJECT(window->info->infoButton), "selectedNodeId"); *id = (gint)node0->number; g_signal_handler_block(G_OBJECT(window->info->infoButton), window->info->infoClicked); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(window->info->infoButton), visu_gl_ext_marks_getActive(window->marks, *id)); g_signal_handler_unblock(G_OBJECT(window->info->infoButton), window->info->infoClicked); if (VISU_UI_RENDERING_WINDOW_GET_CLASS(window)->useReducedCoordinates) { visu_data_getNodeUserPosition(window->currentData, node0, posRef); visu_box_convertXYZtoBoxCoordinates(visu_boxed_getBox(VISU_BOXED(window->currentData)), posSelect, posRef); } else visu_data_getNodeUserPosition(window->currentData, node0, posSelect); str = g_string_new(_("Selected node number ")); ele = visu_node_array_getElement(VISU_NODE_ARRAY(window->currentData), node0); g_string_append_printf(str, "%d - %s (%7.3g;%7.3g;%7.3g)", node0->number + 1, ele->name, posSelect[0], posSelect[1], posSelect[2]); comment = visu_extra_node_getLabel(window->currentData, node0); if (comment) g_string_append_printf(str, " %s", comment); visu_ui_rendering_window_pushMessage(window, str->str); g_string_free(str, TRUE); return; case PICK_DISTANCE: /* Have a ref and a selected node, then distance informations is compued. */ visu_data_getNodePosition(window->currentData, node0, posSelect); visu_data_getNodePosition(window->currentData, node1, posRef); str = g_string_new(_("Distance between nodes ")); dist = 0.; for (i = 0; i < 3; i++) dist += (posRef[i] - posSelect[i]) * (posRef[i] - posSelect[i]); dist = sqrt(dist); g_string_append_printf(str, _("%d and %d : %7.3f"), node1->number + 1, node0->number + 1, dist); visu_ui_rendering_window_pushMessage(window, str->str); g_string_free(str, TRUE); return; case PICK_REFERENCE_1: visu_ui_rendering_window_pushMessage(window, _(" right-click on" " background to unset reference.")); return; case PICK_REFERENCE_2: visu_ui_rendering_window_pushMessage(window, _(" right-click on" " background to unset second reference.")); return; case PICK_UNREFERENCE_1: case PICK_UNREFERENCE_2: return; default: return; } } static void minimalPickError(VisuInteractive *inter _U_, VisuInteractivePickError error, gpointer data) { VisuUiRenderingWindow *window; window = VISU_UI_RENDERING_WINDOW(data); switch (error) { case PICK_ERROR_NO_SELECTION: visu_ui_rendering_window_pushMessage(window, _("No node has been selected.")); return; case PICK_ERROR_SAME_REF: visu_ui_rendering_window_pushMessage(window, _("Picked node is already used" " as a reference.")); return; case PICK_ERROR_REF1: visu_ui_rendering_window_pushMessage(window, _("Can't pick a second reference" " without any first one" " (use right-click).")); return; case PICK_ERROR_REF2: visu_ui_rendering_window_pushMessage(window, _("Can't remove first reference" " before removing the second one.")); return; default: return; } } static gulong addInteractiveEventListeners(VisuUiRenderingWindow *window, InteractiveEventsId id) { GList* ptList; InteractiveEvents *event; gboolean found; g_return_val_if_fail(VISU_UI_IS_RENDERING_WINDOW(window), (gulong)0); found = FALSE; for (ptList = window->interactiveEvents; ptList && !found; ptList = g_list_next(ptList)) { event = (InteractiveEvents*)ptList->data; if (event->id == id) found = TRUE; } if (found) return (gulong)0; event = g_malloc(sizeof(InteractiveEvents)); event->id = id; switch (id) { case event_button_press: event->callbackId = g_signal_connect_swapped(G_OBJECT(window->openGLArea), "button-press-event", G_CALLBACK(onButtonAction), (gpointer)window); break; case event_button_release: event->callbackId = g_signal_connect_swapped(G_OBJECT(window->openGLArea), "button-release-event", G_CALLBACK(onButtonAction), (gpointer)window); break; case event_motion_notify: event->callbackId = g_signal_connect(G_OBJECT(window->openGLArea), "motion-notify-event", G_CALLBACK(onMouseMotion), (gpointer)window); break; case event_key_press: event->callbackId = g_signal_connect(G_OBJECT(window->openGLArea), "key-press-event", G_CALLBACK(onKeyPressed), (gpointer)window); break; case event_key_release: event->callbackId = g_signal_connect(G_OBJECT(window->openGLArea), "key-release-event", G_CALLBACK(onKeyRelease), (gpointer)window); break; case event_scroll: event->callbackId = g_signal_connect(G_OBJECT(window->openGLArea), "scroll-event", G_CALLBACK(onScrollEvent), (gpointer)window); break; default: g_warning("Unknown event to add."); g_free(event); return (gulong)0; }; window->interactiveEvents = g_list_prepend(window->interactiveEvents, (gpointer)event); return event->callbackId; } static void setInteractiveType(VisuUiRenderingWindow *window, VisuInteractiveId type) { VisuUiRenderingWindowClass *klass; InteractiveEvents *event; gulong id; GList *ptList; g_return_if_fail(VISU_UI_IS_RENDERING_WINDOW(window)); klass = VISU_UI_RENDERING_WINDOW_CLASS(G_OBJECT_GET_CLASS(window)); g_return_if_fail(klass); /* We set the cursors. */ switch (type) { case interactive_observe: case interactive_measureAndObserve: if (gtk_widget_get_visible(GTK_WIDGET(window))) gdk_window_set_cursor(gtk_widget_get_window(window->openGLArea), klass->cursorRotate); window->currentCursor = klass->cursorRotate; window->refCursor = klass->cursorRotate; break; case interactive_measure: case interactive_pick: case interactive_move: case interactive_mark: if (gtk_widget_get_visible(GTK_WIDGET(window))) gdk_window_set_cursor(gtk_widget_get_window(window->openGLArea), klass->cursorPointer); window->currentCursor = klass->cursorPointer; window->refCursor = klass->cursorPointer; break; case interactive_none: if (gtk_widget_get_visible(GTK_WIDGET(window))) gdk_window_set_cursor(gtk_widget_get_window(window->openGLArea), klass->cursorPirate); window->currentCursor = klass->cursorPirate; window->refCursor = klass->cursorPirate; break; } /* We set the listeners. */ if (type != interactive_none) { DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: setup signals.\n"); id = addInteractiveEventListeners(window, event_button_release); if (id) DBG_fprintf(stderr, " | connecting %ld signal.\n", id); id = addInteractiveEventListeners(window, event_button_press); if (id) DBG_fprintf(stderr, " | connecting %ld signal.\n", id); id = addInteractiveEventListeners(window, event_motion_notify); if (id) DBG_fprintf(stderr, " | connecting %ld signal.\n", id); id = addInteractiveEventListeners(window, event_key_press); if (id) DBG_fprintf(stderr, " | connecting %ld signal.\n", id); id = addInteractiveEventListeners(window, event_key_release); if (id) DBG_fprintf(stderr, " | connecting %ld signal.\n", id); id = addInteractiveEventListeners(window, event_scroll); if (id) DBG_fprintf(stderr, " | connecting %ld signal.\n", id); } else { DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: removing interactive listeners.\n"); for (ptList = window->interactiveEvents; ptList; ptList = g_list_next(ptList)) { event = (InteractiveEvents*)ptList->data; DBG_fprintf(stderr, " | disconnecting %d signal.\n", event->id); g_signal_handler_disconnect(G_OBJECT(window->openGLArea), event->callbackId); g_free(ptList->data); } if (window->interactiveEvents) g_list_free(window->interactiveEvents); window->interactiveEvents = (GList*)0; } } /** * visu_ui_rendering_window_pushInteractive: * @window: a #VisuUiRenderingWindow object. * @inter: a #VisuInteractive object. * * It adds @inter to the stack of interactive sessions currently * attached to @window and launch it. * * Since: 3.6 */ void visu_ui_rendering_window_pushInteractive(VisuUiRenderingWindow *window, VisuInteractive *inter) { VisuInteractiveId type; g_return_if_fail(VISU_UI_IS_RENDERING_WINDOW(window) && VISU_IS_INTERACTIVE(inter)); type = visu_interactive_getType(inter); DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: push a new interactive" " session (%d / %d).\n", type, g_list_length(window->inters)); window->inters = g_list_prepend(window->inters, inter); g_object_ref(G_OBJECT(inter)); visu_interactive_setNodeList(inter, window->extNodes); DBG_fprintf(stderr, " | ext nodes has %d ref counts.\n", G_OBJECT(window->extNodes)->ref_count); visu_gl_ext_marks_setInteractive(window->marks, inter); setInteractiveType(window, type); } /** * visu_ui_rendering_window_popInteractive: * @window: a #VisuUiRenderingWindow object. * @inter: a #VisuInteractive object. * * It removes @inter from the stack of interactive sessions currently * attached to @window. If @inter was first on the stack, the next * session is launched. * * Since: 3.6 */ void visu_ui_rendering_window_popInteractive(VisuUiRenderingWindow *window, VisuInteractive *inter) { g_return_if_fail(VISU_UI_IS_RENDERING_WINDOW(window)); window->inters = g_list_remove(window->inters, inter); g_object_unref(G_OBJECT(inter)); visu_interactive_setNodeList(inter, (VisuGlExtNodes*)0); DBG_fprintf(stderr, " | ext nodes has %d ref counts.\n", G_OBJECT(window->extNodes)->ref_count); DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: pop an old interactive" " session (%d).\n", g_list_length(window->inters)); if (window->inters) { visu_gl_ext_marks_setInteractive(window->marks, VISU_INTERACTIVE(window->inters->data)); setInteractiveType(window, visu_interactive_getType(VISU_INTERACTIVE(window->inters->data))); } else { visu_gl_ext_marks_setInteractive(window->marks, (VisuInteractive*)0); setInteractiveType(window, interactive_none); } } static gboolean onButtonAction(VisuUiRenderingWindow *window, GdkEventButton *event, gpointer user_data _U_) { ToolSimplifiedEvents ev; if (!window->inters) return TRUE; ev.button = 0; ev.motion = 0; ev.letter = '\0'; ev.specialKey = Key_None; ev.x = event->x; ev.y = event->y; ev.button = event->button; ev.shiftMod = event->state & GDK_SHIFT_MASK; ev.controlMod = event->state & GDK_CONTROL_MASK; ev.buttonType = 0; if (event->type == GDK_BUTTON_PRESS) ev.buttonType = TOOL_BUTTON_TYPE_PRESS; else if (event->type == GDK_BUTTON_RELEASE) ev.buttonType = TOOL_BUTTON_TYPE_RELEASE; gdk_window_set_cursor(gtk_widget_get_window(window->openGLArea), VISU_UI_RENDERING_WINDOW_CLASS(G_OBJECT_GET_CLASS(window))->cursorWatch); visu_interactive_handleEvent(VISU_INTERACTIVE(window->inters->data), window->view, &ev); gdk_window_set_cursor(gtk_widget_get_window(window->openGLArea), window->currentCursor); return TRUE; } static gboolean onScrollEvent(GtkWidget *widget _U_, GdkEventScroll *event, gpointer user_data) { ToolSimplifiedEvents ev; VisuUiRenderingWindow *window; window = VISU_UI_RENDERING_WINDOW(user_data); g_return_val_if_fail(window, TRUE); if (!window->inters) return TRUE; ev.button = 0; ev.motion = 0; ev.letter = '\0'; ev.specialKey = Key_None; ev.x = event->x; ev.y = event->y; if (event->direction == GDK_SCROLL_UP) ev.button = 4; else if (event->direction == GDK_SCROLL_DOWN) ev.button = 5; ev.shiftMod = event->state & GDK_SHIFT_MASK; ev.controlMod = event->state & GDK_CONTROL_MASK; if (ev.button) { gdk_window_set_cursor(gtk_widget_get_window(window->openGLArea), VISU_UI_RENDERING_WINDOW_CLASS(G_OBJECT_GET_CLASS(window))->cursorWatch); visu_interactive_handleEvent(VISU_INTERACTIVE(window->inters->data), window->view, &ev); gdk_window_set_cursor(gtk_widget_get_window(window->openGLArea), window->currentCursor); } return TRUE; } static gboolean onMouseMotion(GtkWidget *widget _U_, GdkEventMotion *event, gpointer user_data) { ToolSimplifiedEvents ev; VisuUiRenderingWindow *window; /* #if DEBUG == 1 */ /* GTimer *timer; */ /* gulong fractionTimer; */ /* #endif */ window = VISU_UI_RENDERING_WINDOW(user_data); g_return_val_if_fail(window, TRUE); if (!window->inters) return TRUE; /* #if DEBUG == 1 */ /* timer = g_timer_new(); */ /* g_timer_start(timer); */ /* #endif */ ev.button = 0; ev.motion = 1; ev.letter = '\0'; ev.specialKey = Key_None; /* DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: motion at %gx%g.\n", event->x, event->y); */ ev.x = event->x; ev.y = event->y; gdk_window_get_root_coords(event->window, ev.x, ev.y, &ev.root_x, &ev.root_y); if (event->state & GDK_BUTTON1_MASK) ev.button = 1; else if (event->state & GDK_BUTTON2_MASK) ev.button = 2; else if (event->state & GDK_BUTTON3_MASK) ev.button = 3; ev.buttonType = TOOL_BUTTON_TYPE_PRESS; ev.shiftMod = event->state & GDK_SHIFT_MASK; ev.controlMod = event->state & GDK_CONTROL_MASK; if (ev.button) { gdk_window_set_cursor(gtk_widget_get_window(window->openGLArea), VISU_UI_RENDERING_WINDOW_CLASS(G_OBJECT_GET_CLASS(window))->cursorWatch); visu_interactive_handleEvent(VISU_INTERACTIVE(window->inters->data), window->view, &ev); gdk_window_set_cursor(gtk_widget_get_window(window->openGLArea), window->currentCursor); } if (event->is_hint) { #if GDK_MAJOR_VERSION > 2 || GDK_MINOR_VERSION > 11 gdk_event_request_motions(event); #else gdk_window_get_pointer(event->window, NULL, NULL, NULL); #endif } /* #if DEBUG == 1 */ /* g_timer_stop(timer); */ /* fprintf(stderr, "Gtk VisuUiRenderingWindow: handling mouse motion in %g micro-s.\n", */ /* g_timer_elapsed(timer, &fractionTimer)*1e6); */ /* g_timer_destroy(timer); */ /* #endif */ return TRUE; } static gboolean onKeyPressed(GtkWidget *widget _U_, GdkEventKey *event, gpointer data) { ToolSimplifiedEvents ev; VisuUiRenderingWindow *window; GList *cameras, *head; window = VISU_UI_RENDERING_WINDOW(data); g_return_val_if_fail(window, TRUE); if (!window->inters) return FALSE; ev.button = 0; ev.buttonType = 0; ev.motion = 0; ev.letter = '\0'; ev.specialKey = Key_None; if ((event->keyval == GDK_KEY_r || event->keyval == GDK_KEY_R) && !(event->state & GDK_CONTROL_MASK)) { ev.letter = 'r'; /* If any camera, print a message. */ visu_interactive_getSavedCameras(VISU_INTERACTIVE(window->inters->data), &cameras, &head); if (cameras) visu_ui_rendering_window_pushMessage(window, _("Restore saved camera position.")); else visu_ui_rendering_window_pushMessage(window, _("No saved camera. Use 's' to save one.")); #if GLIB_MINOR_VERSION > 13 g_timeout_add_seconds(3, timeOutPopMessage, (gpointer)window); #else g_timeout_add(3000, timeOutPopMessage, (gpointer)window); #endif } else if ((event->keyval == GDK_KEY_s || event->keyval == GDK_KEY_S) && !(event->state & GDK_CONTROL_MASK)) { ev.letter = 's'; visu_ui_rendering_window_pushMessage(window, _("Save current camera position.")); #if GLIB_MINOR_VERSION > 13 g_timeout_add_seconds(3, timeOutPopMessage, (gpointer)window); #else g_timeout_add(3000, timeOutPopMessage, (gpointer)window); #endif } else if(event->keyval == GDK_KEY_space) ev.letter = ' '; else if(event->keyval == GDK_KEY_Page_Up) ev.specialKey = Key_Page_Up; else if(event->keyval == GDK_KEY_Page_Down) ev.specialKey = Key_Page_Down; else if(event->keyval == GDK_KEY_Down) ev.specialKey = Key_Arrow_Down; else if(event->keyval == GDK_KEY_Up) ev.specialKey = Key_Arrow_Up; else if(event->keyval == GDK_KEY_Left) ev.specialKey = Key_Arrow_Left; else if(event->keyval == GDK_KEY_Right) ev.specialKey = Key_Arrow_Right; #if GTK_MAJOR_VERSION > 2 else if(event->keyval == GDK_KEY_Menu) { gdk_window_get_device_position(event->window, gdk_device_manager_get_client_pointer (gdk_display_get_device_manager (gdk_window_get_display(event->window))), &ev.x, &ev.y, NULL); gdk_window_get_root_coords(event->window, ev.x, ev.y, &ev.root_x, &ev.root_y); ev.specialKey = Key_Menu; } #endif ev.shiftMod = event->state & GDK_SHIFT_MASK; ev.controlMod = event->state & GDK_CONTROL_MASK; if (ev.letter != '\0' || ev.specialKey != Key_None) { gdk_window_set_cursor(gtk_widget_get_window(window->openGLArea), VISU_UI_RENDERING_WINDOW_CLASS(G_OBJECT_GET_CLASS(window))->cursorWatch); visu_interactive_handleEvent(VISU_INTERACTIVE(window->inters->data), window->view, &ev); gdk_window_set_cursor(gtk_widget_get_window(window->openGLArea), window->currentCursor); return TRUE; } else if (event->keyval == GDK_KEY_Shift_L || event->keyval == GDK_KEY_Shift_R) { gdk_window_set_cursor(gtk_widget_get_window(window->openGLArea), VISU_UI_RENDERING_WINDOW_CLASS(G_OBJECT_GET_CLASS(window))->cursorGrab); window->currentCursor = VISU_UI_RENDERING_WINDOW_CLASS(G_OBJECT_GET_CLASS(window))->cursorGrab; return TRUE; } return FALSE; } static gboolean onKeyRelease(GtkWidget *widget _U_, GdkEventKey *event, gpointer data) { VisuUiRenderingWindow *window; window = VISU_UI_RENDERING_WINDOW(data); g_return_val_if_fail(window, TRUE); if (event->keyval == GDK_KEY_Shift_L || event->keyval == GDK_KEY_Shift_R) { gdk_window_set_cursor(gtk_widget_get_window(window->openGLArea), window->refCursor); window->currentCursor = window->refCursor; } return TRUE; } static gboolean timeOutPopMessage(gpointer data) { visu_ui_rendering_window_popMessage(VISU_UI_RENDERING_WINDOW(data)); return FALSE; } /** * visu_ui_rendering_window_pushMessage: * @window: a valid #VisuUiRenderingWindow object ; * @message: an UTF8 string to print on the status bar. * * Use this method to add some informations on the status bar. */ void visu_ui_rendering_window_pushMessage(VisuUiRenderingWindow *window, const gchar *message) { g_return_if_fail(VISU_UI_IS_RENDERING_WINDOW(window)); gtk_statusbar_push(GTK_STATUSBAR(window->info->statusInfo), window->info->statusInfoId, message); window->nbStatusMessage += 1; } /** * visu_ui_rendering_window_popMessage: * @window: a valid #VisuUiRenderingWindow object. * * Remove the last message. */ void visu_ui_rendering_window_popMessage(VisuUiRenderingWindow *window) { g_return_if_fail(VISU_UI_IS_RENDERING_WINDOW(window)); gtk_statusbar_pop(GTK_STATUSBAR(window->info->statusInfo), window->info->statusInfoId); window->nbStatusMessage -= 1; } static void getOpenGLAreaSize(VisuUiRenderingWindow *window, guint *width, guint *height) { GtkAllocation alloc; g_return_if_fail(VISU_UI_IS_RENDERING_WINDOW(window) && width && height); gtk_widget_get_allocation(window->openGLArea, &alloc); *width = alloc.width; *height = alloc.height; } /** * visu_ui_rendering_window_setData: * @window: a valid #VisuUiRenderingWindow object ; * @data: (allow-none): a #VisuData to render in the given @window. * * This method is used to attach a #VisuData object to a given window. * When, @data is not NULL, this method emit the #VisuObject::dataRendered signal, * and all modules that needs to draw something should catch this signal and * draw in the rendering window. */ void visu_ui_rendering_window_setData(VisuUiRenderingWindow *window, VisuData* data) { VisuData *oldData; g_return_if_fail(VISU_UI_IS_RENDERING_WINDOW(window)); DBG_fprintf(stderr, "Gtk renderingWindow: attach %p (%p) VisuData to %p window.\n", (gpointer)data, (gpointer)window->currentData, (gpointer)window); oldData = window->currentData; if (oldData != data) { if (window->currentData) { g_signal_handler_disconnect(G_OBJECT(window->currentData), window->populationIncrease_id); g_signal_handler_disconnect(G_OBJECT(window->currentData), window->populationDecrease_id); DBG_fprintf(stderr, "Gtk renderingWindow:" " emitting the 'dataUnRendered' signal.\n"); g_signal_emit_by_name(VISU_OBJECT_INSTANCE, "dataUnRendered", window->currentData, window->view, NULL); DBG_fprintf(stderr, "Gtk renderingWindow: emition done.\n"); } } /* Change the rendering window with the new data (may be the same but with a different content). */ window->currentData = data; displayFileInfoOnDataLoaded(window); setFileButtonsSensitive(window); DBG_fprintf(stderr, "##### VisuData association to a window #####\n"); if (data) { /* Ref the object. */ g_object_ref(G_OBJECT(data)); DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: ref new object %p.\n", (gpointer)data); if (gtk_widget_get_visible(GTK_WIDGET(window))) /* Adapt the view to the box. */ visu_boxed_setBox(VISU_BOXED(window->view), VISU_BOXED(data), VISU_UI_RENDERING_WINDOW_GET_CLASS(window)->autoAdjust); /* Attach the default redraw method. */ visu_ui_gl_widget_setRedraw(VISU_UI_GL_WIDGET(window->openGLArea), visu_gl_redraw, window->view); /* Attach signals to the new #VisuData object. */ window->populationIncrease_id = g_signal_connect(G_OBJECT(data), "PopulationIncrease", G_CALLBACK(onNodePopulationChanged), window); window->populationDecrease_id = g_signal_connect(G_OBJECT(data), "PopulationDecrease", G_CALLBACK(onNodePopulationChanged), window); visu_gl_ext_nodes_setData(window->extNodes, window->view, data); visu_gl_ext_nodes_draw(window->extNodes); if (visu_gl_ext_pairs_setData(visu_gl_ext_pairs_getDefault(), window->view, data)) visu_gl_ext_pairs_draw(visu_gl_ext_pairs_getDefault()); DBG_fprintf(stderr, "Gtk renderingWindow: emitting the 'dataRendered' signal.\n"); g_signal_emit_by_name(VISU_OBJECT_INSTANCE, "dataRendered", data, window->view, NULL); DBG_fprintf(stderr, "Gtk renderingWindow: emition done.\n"); } else { visu_gl_ext_nodes_setData(window->extNodes, window->view, NULL); visu_gl_ext_pairs_setData(visu_gl_ext_pairs_getDefault(), window->view, NULL); DBG_fprintf(stderr, "Gtk renderingWindow: emitting the 'dataRendered' signal.\n"); g_signal_emit_by_name(VISU_OBJECT_INSTANCE, "dataRendered", NULL, window->view, NULL); DBG_fprintf(stderr, "Gtk renderingWindow: emition done.\n"); if (oldData) { /* Attach the default redraw method. */ visu_ui_gl_widget_setRedraw(VISU_UI_GL_WIDGET(window->openGLArea), (VisuUiGlWidgetRedrawMethod)0, (VisuGlView*)0); /* Ask for redraw. */ _redraw(window, TRUE); } } visu_gl_ext_marks_setData(window->marks, data); visu_gl_ext_marks_setGlView(window->marks, window->view); /* All extensions. */ if (visu_gl_ext_axes_setGlView(visu_gl_ext_axes_getDefault(), window->view)) visu_gl_ext_axes_draw(visu_gl_ext_axes_getDefault()); /* Reset the statusbar informations and other GUI parameters. */ while (window->nbStatusMessage > 0) visu_ui_rendering_window_popMessage(window); if (data) { /* Put a commentary in the statusbar. */ visu_ui_rendering_window_pushMessage(window, _("Rotate with left b.," " pick with right b.," " setup ref. with" " or b.")); visu_ui_rendering_window_pushInteractive(window, inter); gtk_widget_set_sensitive(window->info->clearMarksButton, TRUE); } else { if (oldData) visu_ui_rendering_window_popInteractive(window, inter); gtk_widget_set_sensitive(window->info->clearMarksButton, FALSE); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 17 gtk_widget_hide(GTK_WIDGET(window->info->infoBar)); gtk_widget_grab_focus(window->openGLArea); #endif } if (oldData) { DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: unref old object %p.\n", (gpointer)oldData); g_object_unref(oldData); } } /** * visu_ui_rendering_window_getData: * @window: a valid #VisuUiRenderingWindow object. * * This method is used to get the #VisuData attached to a window. * * Returns: (transfer none): the #VisuData attached to the @window or NULL if none. */ VisuData* visu_ui_rendering_window_getData(VisuUiRenderingWindow *window) { g_return_val_if_fail(VISU_UI_IS_RENDERING_WINDOW(window), (VisuData*)0); return window->currentData; } /** * visu_ui_rendering_window_getGlView: * @window: a valid #VisuUiRenderingWindow object. * * This method is used to get the #VisuGlView attached to the * rendering window. * * Since: 3.7 * * Returns: (transfer none): the #VisuGlView attached to the @window * or NULL on error. */ VisuGlView* visu_ui_rendering_window_getGlView(VisuUiRenderingWindow *window) { g_return_val_if_fail(VISU_UI_IS_RENDERING_WINDOW(window), (VisuGlView*)0); return window->view; } /** * visu_ui_rendering_window_getAccelGroup: * @window: a #VisuUiRenderingWindow object. * * Retrieve the accelerator group of @window. * * Since: 3.7 * * Returns: (transfer none): the #GtkAccelGroup object of @window. **/ GtkAccelGroup* visu_ui_rendering_window_getAccelGroup(VisuUiRenderingWindow *window) { g_return_val_if_fail(VISU_UI_IS_RENDERING_WINDOW(window), (GtkAccelGroup*)0); return window->accel; } /***************************/ /* GtkStatusInfo functions */ /***************************/ static void _setLabelSize(GtkInfoArea *info, gint width, gint height) { gchar *str; g_return_if_fail(info); if (info->fileInfoFreeze) return; str = g_strdup_printf("%s %dx%d", _("Size:"), width, height); gtk_label_set_markup(GTK_LABEL(info->labelSize), str); g_free(str); } static void _setFileDescription(GtkInfoArea *info, gchar* message) { gchar *str; g_return_if_fail(info); str = g_strdup_printf("%s", message); gtk_label_set_markup(GTK_LABEL(info->labelFileInfo), str); g_free(str); } static void _setNNodes(GtkInfoArea *info, gint nb) { GString *str; g_return_if_fail(info); str = g_string_new(""); if (nb > 0) g_string_append_printf(str, _("Nb nodes: %d"), nb); else g_string_append(str, GTK_STATUSINFO_NONB); g_string_append_printf(str, ""); gtk_label_set_markup(GTK_LABEL(info->labelNb), str->str); g_string_free(str, TRUE); } static void onNodeInfoClicked(GtkToggleButton *button, gpointer data) { VisuUiRenderingWindow *window; gint *id; window = VISU_UI_RENDERING_WINDOW(data); g_return_if_fail(window); id = (gint*)g_object_get_data(G_OBJECT(button), "selectedNodeId"); g_return_if_fail(id && *id >= 0); if (visu_gl_ext_marks_setInfos(window->marks, *id, gtk_toggle_button_get_active(button))) VISU_REDRAW_FORCE; } static void onMarkClearClicked(GtkButton *button _U_, gpointer data) { VisuUiRenderingWindow *window; window = VISU_UI_RENDERING_WINDOW(data); g_return_if_fail(window); if (visu_gl_ext_marks_removeMeasures(window->marks, -1)) VISU_REDRAW_FORCE; } static gboolean onCameraMenu(VisuUiRenderingWindow *window, GdkEventButton *event, GtkEventBox *ev _U_) { GtkWidget *wd; DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: click on the camera menu.\n"); wd = buildCameraMenu(window); if (!wd) return TRUE; g_signal_connect(G_OBJECT(wd), "selection-done", G_CALLBACK(onCameraMenuSelected), (gpointer)window); gtk_widget_show_all(wd); gtk_menu_popup(GTK_MENU(wd), NULL, NULL, NULL, NULL, 1, event->time); return TRUE; } static GtkWidget* buildCameraMenu(VisuUiRenderingWindow *window) { GtkWidget *menu, *item; gchar *lbl; GList *cameras, *head, *tmpLst, *rCameras; VisuGlCamera *current; guint n; if (!window->currentData || !window->inters) return (GtkWidget*)0; /* All camera. */ DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: get the cameras.\n"); visu_interactive_getSavedCameras(VISU_INTERACTIVE(window->inters->data), &cameras, &head); /* if (!cameras) */ /* return (GtkWidget*)0; */ DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: build the menu.\n"); menu = gtk_menu_new(); gtk_menu_set_accel_group(GTK_MENU(menu), window->accel); DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: create the camera menu %p.\n", (gpointer)menu); /* Set a title. */ item = gtk_menu_item_new_with_label(_("Camera menu (saved in 'v_sim.par'):")); gtk_widget_set_sensitive(item, FALSE); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); item = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); /* Put the current camera. */ current = window->view->camera; lbl = g_strdup_printf(_("save current camera:\n" "(\316\270 %6.1f\302\260 ; \317\206 %6.1f\302\260 ; \317\211 %6.1f\302\260) " "dx %4.1f dy %4.1f"), current->theta, current->phi, current->omega, current->xs, current->ys); item = gtk_menu_item_new_with_label(lbl); g_free(lbl); g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(onCameraMenuCurrentClicked), window); gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), g_intern_static_string(MENU_CAMERA_SAVE)); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); /* Put an option to open the view selector. */ item = gtk_menu_item_new_with_label(_("select precisely a camera view")); g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(onCameraMenuOrientationClicked), window); gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), g_intern_static_string(MENU_CAMERA_ORIENT)); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); /* Separator. */ item = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); if (!cameras) { item = gtk_menu_item_new_with_label(_("No saved camera. Use 's' to save one.")); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); } else { item = gtk_menu_item_new_with_label(_("List of saved cameras:")); gtk_widget_set_sensitive(item, FALSE); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); } rCameras = g_list_reverse(g_list_copy(cameras)); for (tmpLst = rCameras, n = 0; tmpLst; tmpLst = g_list_next(tmpLst), n+= 1) { current = (VisuGlCamera*)tmpLst->data; lbl = g_strdup_printf(_("(\316\270 %6.1f\302\260 ; \317\206 %6.1f\302\260 ; \317\211 %6.1f\302\260) " "dx %4.1f dy %4.1f"), current->theta, current->phi, current->omega, current->xs, current->ys); item = gtk_menu_item_new_with_label(lbl); DBG_fprintf(stderr, " | add menu item %p (%p)\n", (gpointer)item, (gpointer)window); g_free(lbl); if (current == (VisuGlCamera*)head->data) gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), g_intern_static_string(MENU_CAMERA_RESTORE)); else if (n < 9) gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), g_intern_static_string(cameraAccels[n])); g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(onCameraMenuClicked), window); g_object_set_data(G_OBJECT(item), "Camera", (gpointer)current); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); } g_list_free(rCameras); return menu; } static void _setCamera(VisuUiRenderingWindow *window, VisuGlCamera *camera) { gboolean reDrawNeeded; g_return_if_fail(VISU_UI_IS_RENDERING_WINDOW(window)); if (!window->currentData || !window->inters || !camera) return; visu_interactive_pushSavedCamera(VISU_INTERACTIVE(window->inters->data), camera); reDrawNeeded = visu_gl_view_setThetaPhiOmega(window->view, camera->theta, camera->phi, camera->omega, VISU_GL_CAMERA_THETA | VISU_GL_CAMERA_PHI | VISU_GL_CAMERA_OMEGA); reDrawNeeded = visu_gl_view_setXsYs(window->view, camera->xs, camera->ys, VISU_GL_CAMERA_XS | VISU_GL_CAMERA_YS) || reDrawNeeded; reDrawNeeded = visu_gl_view_setGross(window->view, camera->gross) || reDrawNeeded; reDrawNeeded = visu_gl_view_setPersp(window->view, camera->d_red) || reDrawNeeded; if (reDrawNeeded) VISU_REDRAW_FORCE; } static gboolean onCameraAccel(GtkAccelGroup *accel _U_, GObject *obj, guint key, GdkModifierType mod _U_, gpointer data) { VisuUiRenderingWindow *window; GList *cameras, *head, *rCameras; VisuGlCamera *camera; DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: get accelerator for object %p.\n", (gpointer)obj); window = VISU_UI_RENDERING_WINDOW(data); /* All camera. */ DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: get the cameras.\n"); visu_interactive_getSavedCameras(VISU_INTERACTIVE(window->inters->data), &cameras, &head); if (!cameras) return TRUE; rCameras = g_list_reverse(g_list_copy(cameras)); camera = g_list_nth_data(rCameras, key - GDK_KEY_1); g_list_free(rCameras); _setCamera(window, camera); return TRUE; } static void onCameraMenuSelected(GtkMenuShell *menushell, gpointer user_data _U_) { DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: destroy the camera menu %p.\n", (gpointer)menushell); gtk_widget_destroy(GTK_WIDGET(menushell)); } static void onCameraMenuClicked(GtkMenuItem *menuitem, gpointer user_data) { _setCamera(VISU_UI_RENDERING_WINDOW(user_data), (VisuGlCamera*)g_object_get_data(G_OBJECT(menuitem), "Camera")); } static void onCameraMenuCurrentClicked(GtkMenuItem *menuitem _U_, gpointer user_data) { visu_interactive_pushSavedCamera(VISU_INTERACTIVE(VISU_UI_RENDERING_WINDOW(user_data)->inters->data), VISU_UI_RENDERING_WINDOW(user_data)->view->camera); } static void onOrientationChanged(VisuUiOrientationChooser *orientationChooser, gpointer data) { float values[2]; gboolean reDrawNeeded; DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: orientation changed.\n"); visu_ui_orientation_chooser_getAnglesValues(orientationChooser, values); reDrawNeeded = visu_gl_view_setThetaPhiOmega(VISU_UI_RENDERING_WINDOW(data)->view, values[0], values[1], 0., VISU_GL_CAMERA_THETA | VISU_GL_CAMERA_PHI); if (reDrawNeeded) VISU_REDRAW_ADD; } static void _orientationChooser(VisuUiRenderingWindow *window) { GtkWidget *orientationChooser; VisuGlCamera *current; float values[2]; gboolean reDrawNeeded; orientationChooser = visu_ui_orientation_chooser_new (VISU_UI_ORIENTATION_DIRECTION, TRUE, window->currentData, NULL); gtk_window_set_modal(GTK_WINDOW(orientationChooser), TRUE); current = window->view->camera; values[0] = current->theta; values[1] = current->phi; visu_ui_orientation_chooser_setAnglesValues(VISU_UI_ORIENTATION_CHOOSER(orientationChooser), values); g_signal_connect(G_OBJECT(orientationChooser), "values-changed", G_CALLBACK(onOrientationChanged), window); gtk_widget_show(orientationChooser); switch (gtk_dialog_run(GTK_DIALOG(orientationChooser))) { case GTK_RESPONSE_ACCEPT: DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: accept changings on orientation.\n"); break; default: DBG_fprintf(stderr, "Gtk Observe: reset values on orientation.\n"); reDrawNeeded = visu_gl_view_setThetaPhiOmega(window->view, values[0], values[1], 0., VISU_GL_CAMERA_THETA | VISU_GL_CAMERA_PHI); if (reDrawNeeded) VISU_REDRAW_ADD; } DBG_fprintf(stderr, "Gtk Observe: orientation object destroy.\n"); gtk_widget_destroy(orientationChooser); } static void onCameraMenuOrientationClicked(GtkMenuItem *menuitem _U_, gpointer data) { _orientationChooser(VISU_UI_RENDERING_WINDOW(data)); } static void displayFileInfoOnDataLoaded(VisuUiRenderingWindow *window) { gchar* message; VisuNodeArrayIter iter; g_return_if_fail(window); if (window->currentData) { message = visu_data_getFileCommentary(window->currentData, visu_data_getISubset(window->currentData)); visu_node_array_iterNew(VISU_NODE_ARRAY(window->currentData), &iter); _setNNodes(window->info, iter.nAllStoredNodes); } else { message = (gchar*)0; _setNNodes(window->info, -1); } if (message && message[0]) _setFileDescription(window->info, message); else _setFileDescription(window->info, GTK_STATUSINFO_NOFILEINFO); } void visu_ui_rendering_window_lockUI(VisuUiRenderingWindow *window, gboolean status) { g_return_if_fail(VISU_UI_IS_RENDERING_WINDOW(window)); gtk_widget_set_sensitive(window->info->hboxTools, !status); gtk_widget_set_sensitive(window->info->hboxInteractive, !status); gtk_widget_set_sensitive(window->info->hboxFileInfo, !status); } struct _load_struct { VisuUiRenderingWindow *window; VisuData *data; guint iSet; }; static void stopProgress(VisuUiRenderingWindow *window) { if (window->info->progressId) g_source_remove(window->info->progressId); window->info->progressId = 0; visu_ui_rendering_window_lockUI(window, FALSE); } static gboolean popProgress(gpointer data) { VisuUiRenderingWindow *window; window = VISU_UI_RENDERING_WINDOW(data); gtk_progress_bar_pulse(GTK_PROGRESS_BAR(window->info->progress)); return TRUE; } static gboolean showProgress(gpointer data) { VisuUiRenderingWindow *window; window = VISU_UI_RENDERING_WINDOW(data); visu_ui_rendering_window_lockUI(window, TRUE); gtk_widget_show(window->info->progress); gtk_widget_show(window->info->cancelButton); gtk_widget_hide(window->info->statusInfo); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(window->info->progress), _("Loading file...")); if (window->info->progressId) g_source_remove(window->info->progressId); window->info->progressId = g_timeout_add(100, popProgress, data); return FALSE; } static void messProgress(gpointer mess, gpointer progress) { gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress), (const gchar*)mess); } static void onCancelButtonClicked(GtkButton *button _U_, gpointer data) { gtk_progress_bar_set_text(GTK_PROGRESS_BAR(VISU_UI_RENDERING_WINDOW(data)->info->progress), _("Cancellation request, waiting for reply...")); g_cancellable_cancel(VISU_UI_RENDERING_WINDOW(data)->info->cancel); } static void _storeRecent(const gchar *filename) { #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 9 GtkRecentManager *manager; gchar *uri; GError *error; manager = gtk_recent_manager_get_default(); error = (GError*)0; uri = g_filename_to_uri(filename, NULL, &error); if (error) { g_warning("%s", error->message); g_error_free(error); return; } DBG_fprintf(stderr, "VisuUiRenderingWindow: add '%s' to recent files.\n", uri); gtk_recent_manager_add_item(manager, uri); g_free(uri); #endif } static gboolean _visu_ui_rendering_window_loadFile(gpointer data) { VisuObject *o; VisuData *obj; GError *error; gboolean changeElement, res; VisuUiRenderingWindow *window; struct _load_struct *pt; int iSet; guint waitId; /* obj is the new object and main the panel that handle the loading. */ pt = (struct _load_struct*)data; window = pt->window; obj = pt->data; iSet = (int)pt->iSet; o = VISU_OBJECT_INSTANCE; DBG_fprintf(stderr, "VisuUiRenderingWindow: loading process ... %p points to" " previous VisuData.\n", (gpointer)window->currentData); g_cancellable_reset(window->info->cancel); waitId = g_timeout_add(500, showProgress, data); visu_object_setLoadMessageFunc(o, messProgress, (gpointer)window->info->progress); error = (GError*)0; res = visu_object_load(o, obj, iSet, window->info->cancel, &error); DBG_fprintf(stderr, "VisuUiRenderingWindow: basic load OK, " "continue with Gtk loading parts.\n"); g_source_remove(waitId); stopProgress(window); g_free(pt); gtk_widget_hide(window->info->progress); gtk_widget_hide(window->info->cancelButton); gtk_widget_show(window->info->statusInfo); if (!res) { g_object_unref(obj); obj = (VisuData*)0; if (error) { visu_ui_raiseWarning(_("Loading a file"), error->message, NULL); g_error_free(error); } else g_warning("No error message."); } else if (obj) { _storeRecent(visu_data_getFile(obj, 0, (ToolFileFormat**)0)); if (window->currentData) { changeElement = visu_node_array_compareElements(VISU_NODE_ARRAY(window->currentData), VISU_NODE_ARRAY(obj)); visu_data_setChangeElementFlag(obj, changeElement); } } DBG_fprintf(stderr, "VisuUiRenderingWindow: loading process ... try to load %p.\n", (gpointer)obj); if (obj) DBG_fprintf(stderr, " | %p has %d ref counts.\n", (gpointer)obj, G_OBJECT(obj)->ref_count); visu_ui_rendering_window_setData(window, obj); if (obj) DBG_fprintf(stderr, " | %p has %d ref counts.\n", (gpointer)obj, G_OBJECT(obj)->ref_count); if (!obj) return FALSE; /* We release a ref on obj, since visu_ui_rendering_window_setData has increased it. */ DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: release current data.\n"); g_object_unref(G_OBJECT(obj)); /* A redraw here is necessary since the load is finished. A redraw in the parent may not work since the redraw queue may be emptied before. */ VISU_REDRAW_ADD; return FALSE; } /** * visu_ui_rendering_window_loadFile: * @window: a valid #VisuUiRenderingWindow object. * @data: the #VisuData to be loaded. * @iSet: the id of @data to load. * * This method calls the general function to load data from file * and deals with errors with gtkDialogs. The filenames must have * already been set into @data using visu_data_addFile(). */ void visu_ui_rendering_window_loadFile(VisuUiRenderingWindow *window, VisuData *data, guint iSet) { struct _load_struct *pt; pt = g_malloc(sizeof(struct _load_struct)); pt->window = window; pt->data = data; pt->iSet = iSet; g_idle_add(_visu_ui_rendering_window_loadFile, pt); } /** * visu_ui_rendering_window_open: * @window: the window the file will by rendered on ; * @parent: (allow-none): the parent window for the filechooser dialog. * * Do as if the load button has been pushed, i.e. open a filechooser * dialog on the @parent window, and load the resulting file, * refreshing the view if necessary. */ void visu_ui_rendering_window_open(VisuUiRenderingWindow *window, GtkWindow *parent) { gboolean res; VisuUiSetFilesFunc loadAction; VisuData *newData; loadAction = visu_ui_getRenderingSpecificOpen(visu_object_getRendering(VISU_OBJECT_INSTANCE)); g_return_if_fail(loadAction); newData = visu_data_new(); visu_ui_setRenderWidget(window); res = loadAction(newData, parent); DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: 'loadAction' OK.\n"); if (res) visu_ui_rendering_window_loadFile(window, newData, 0); else g_object_unref(newData); } static void onOpen(VisuUiRenderingWindow *window) { visu_ui_rendering_window_open(window, (GtkWindow*)0); } /** * visu_ui_rendering_window_reload: * @window: a #VisuUiRenderingWindow object. * * This routines reloads the current #VisuData object by rereading it * on disk. If there is no current #VisuData object, it reports an * error. * * Since: 3.7 */ void visu_ui_rendering_window_reload(VisuUiRenderingWindow *window) { VisuData *dataObj; int id; g_return_if_fail(VISU_UI_IS_RENDERING_WINDOW(window)); /* if (VISU_UI_RENDERING_WINDOW(data)->currentData) */ /* rebuildAllExtensionsLists(VISU_UI_RENDERING_WINDOW(data)->currentData); */ /* _redraw(VISU_UI_RENDERING_WINDOW(data), TRUE); */ dataObj = window->currentData; g_return_if_fail(dataObj); DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: reload current file.\n"); id = visu_data_getISubset(dataObj); visu_data_freePopulation(dataObj); g_object_ref(dataObj); DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: call load file.\n"); visu_ui_rendering_window_loadFile(window, dataObj, id); VISU_REDRAW_FORCE; } static void onRenderingMethodChanged(VisuUiRenderingWindow *window, VisuRendering *method, gpointer data _U_) { if (window->currentData) /* First free attached visuData. */ visu_ui_rendering_window_setData(window, (VisuData*)0); /* Customize interface according to new method. */ if (method) { visu_ui_rendering_window_popMessage(window); if (window->info->loadButton) gtk_widget_set_sensitive(window->info->loadButton, TRUE); visu_ui_rendering_window_pushMessage(window, _("Use the 'open' button to render a file.")); } else { if (window->info->loadButton) gtk_widget_set_sensitive(window->info->loadButton, FALSE); visu_ui_rendering_window_popMessage(window); } } static void onNodePopulationChanged(VisuData *data, int *nodes _U_, gpointer user_data) { VisuNodeArrayIter iter; if (data != VISU_UI_RENDERING_WINDOW(user_data)->currentData) return; /* Change the count of nodes. */ visu_node_array_iterNew(VISU_NODE_ARRAY(data), &iter); _setNNodes(VISU_UI_RENDERING_WINDOW(user_data)->info, iter.nAllStoredNodes); } static void setFileButtonsSensitive(VisuUiRenderingWindow *window) { g_return_if_fail(window); if (!window->info->dumpButton || !window->info->reloadButton) return; if (window->currentData) { gtk_widget_set_sensitive(window->info->dumpButton, TRUE); gtk_widget_set_sensitive(window->info->reloadButton, TRUE); } else { gtk_widget_set_sensitive(window->info->dumpButton, FALSE); gtk_widget_set_sensitive(window->info->reloadButton, FALSE); } } void updateDumpProgressBar(gpointer data) { gdouble val; g_return_if_fail(GTK_PROGRESS_BAR(data)); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(data), _("Saving image...")); val = gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR(data)); if (val + 0.01 <= 1.0 && val >= 0.) gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(data), val + 0.01); visu_ui_wait(); } /** * visu_ui_rendering_window_dump: * @window:a valid #VisuUiRenderingWindow object ; * @format: a #VisuDump object, corresponding to the write method ; * @fileName: (type filename): a string that defined the file to write to ; * @width: an integer ; * @height: an integer ; * @functionWait: (allow-none) (closure data) (scope call): a method to call * periodically during the dump ; * @data: (closure): some pointer on object to be passed to the wait function. * @error: a location to store some error (not NULL) ; * * Call this method to dump the given @window to a file. * * Returns: TRUE if everything went right. */ gboolean visu_ui_rendering_window_dump(VisuUiRenderingWindow *window, VisuDump *format, const char* fileName, gint width, gint height, ToolVoidDataFunc functionWait, gpointer data, GError **error) { GArray *imageData; gboolean res; double *zoomLevel, gross; g_return_val_if_fail(VISU_UI_IS_RENDERING_WINDOW(window), FALSE); g_return_val_if_fail(window->currentData, FALSE); g_return_val_if_fail(error && !*error, FALSE); g_return_val_if_fail(format && fileName, FALSE); if (visu_dump_getBitmapStatus(format)) { DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: dumping current OpenGL area.\n"); DBG_fprintf(stderr, " | requested size %dx%d.\n", width, height); imageData = visu_ui_gl_widget_getPixmapData(VISU_UI_GL_WIDGET(window->openGLArea), &width, &height, TRUE, visu_dump_getAlphaStatus(format)); /* visu_gl_view_setViewport(VISU_DATA(window->currentData), */ /* window->socketWidth, window->socketHeight); */ /* visu_ui_gl_widget_setRedraw(VISU_UI_GL_WIDGET(window->openGLArea), */ /* visu_gl_redraw, window->currentData); */ DBG_fprintf(stderr, " | allocated size %dx%d.\n", width, height); if (!imageData) { *error = g_error_new(VISU_ERROR_DUMP, DUMP_ERROR_OPENGL, _("Can't dump OpenGL area to data.\n")); return FALSE; } } else imageData = (GArray*)0; gross = window->view->camera->gross; if (visu_dump_getGlStatus(format) && !visu_dump_getBitmapStatus(format)) { /* We must change the viewport... */ visu_gl_view_setViewport(window->view, (width > 0)?width:window->socketWidth, (height > 0)?height:window->socketHeight); /* We unzoom to allow GL to render out-of-the-box points. */ zoomLevel = g_malloc(sizeof(double)); *zoomLevel = MAX(window->view->camera->gross, 1.f); g_object_set_data_full(G_OBJECT(format), "zoomLevel", zoomLevel, g_free); visu_gl_view_setGross(window->view, MIN(window->view->camera->gross, 1.f)); } /* g_message("%p %s %d %d %p %p %s %p %p",(gpointer)format->fileType, fileName, */ /* width, height, (gpointer)window->currentData, */ /* (gpointer)imageData, error, (gpointer)functionWait, (gpointer)data); */ DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: call dump routine.\n"); res = visu_dump_write(format, fileName, width, height, window->currentData, imageData, functionWait, data, error); if (imageData) g_array_free(imageData, TRUE); if (visu_dump_getGlStatus(format) && !visu_dump_getBitmapStatus(format)) { /* We must put back the viewport... */ visu_gl_view_setViewport(window->view, window->socketWidth, window->socketHeight); /* We must put back the gross also. */ visu_gl_view_setGross(window->view, gross); } if (res) /* Save file as recent. */ _storeRecent(fileName); return res; } static void onExport(VisuUiRenderingWindow *window) { GtkWidget *dump; char *filename; VisuDump *format; gboolean res; GError *error; GdkCursor *cursorWatch; GtkProgressBar *dumpBar; g_return_if_fail(VISU_UI_IS_RENDERING_WINDOW(window)); dump = visu_ui_dump_dialog_new(window->currentData, (GtkWindow*)0, (const gchar*)0, window->view->window->width, window->view->window->height); if (gtk_dialog_run(GTK_DIALOG(dump)) != GTK_RESPONSE_ACCEPT) { gtk_widget_destroy(dump); return; } filename = visu_ui_dump_dialog_getFilename(VISU_UI_DUMP_DIALOG(dump)); format = visu_ui_dump_dialog_getType(VISU_UI_DUMP_DIALOG(dump)); g_return_if_fail(format && filename); DBG_fprintf(stderr, "Gtk VisuUiRenderingWindow: dump image to file '%s' (format : %s)\n", filename, tool_file_format_getName(TOOL_FILE_FORMAT(format))); cursorWatch = gdk_cursor_new(GDK_WATCH); dumpBar = visu_ui_dump_dialog_getProgressBar(VISU_UI_DUMP_DIALOG(dump)); visu_ui_dump_dialog_start(VISU_UI_DUMP_DIALOG(dump)); gtk_progress_bar_set_fraction(dumpBar, 0.); if (visu_dump_getBitmapStatus(format)) gtk_progress_bar_set_text(dumpBar, _("Waiting for generating image in memory...")); visu_ui_wait(); gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(dump)), cursorWatch); error = (GError*)0; DBG_fprintf(stderr, " | starting dump.\n"); res = visu_ui_rendering_window_dump(window, format, filename, visu_ui_dump_dialog_getWidth(VISU_UI_DUMP_DIALOG(dump)), visu_ui_dump_dialog_getHeight(VISU_UI_DUMP_DIALOG(dump)), updateDumpProgressBar, (gpointer)dumpBar, &error); if (!res && error) visu_ui_raiseWarning(_("Saving a file"), error->message, (GtkWindow*)0); gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(dump)), NULL); if (error) g_error_free(error); DBG_fprintf(stderr, " | release UI resources.\n"); gtk_widget_destroy(dump); } static void onRaiseButtonClicked(VisuUiRenderingWindow *window, gpointer user_data _U_) { g_signal_emit(G_OBJECT(window), _signals[SHOW_MAIN_PANEL_SIGNAL], 0 /* details */, NULL); } static void _redraw(VisuUiRenderingWindow *window, gboolean forceRedraw) { VisuUiRenderingWindow *current; g_return_if_fail(VISU_UI_IS_RENDERING_WINDOW(window)); if (!gtk_widget_get_visible(GTK_WIDGET(window))) return; current = VISU_UI_RENDERING_WINDOW_GET_CLASS(window)->redrawWidget; if (!current || current != window) return; if (!visu_gl_getImmediate() && !forceRedraw) { DBG_fprintf(stderr, "Redraw rejected since drawing is deferred and not forced.\n"); return; } DBG_fprintf(stderr, "Redraw accepted let's go...\n"); visu_ui_gl_widget_redraw(VISU_UI_GL_WIDGET(window->openGLArea)); } /** * visu_ui_rendering_window_setCurrent: * @window: a valid #VisuUiRenderingWindow object ; * @force: a boolean. * * Set the OpenGL area as the current rendering area. If @force is TRUE * then the context is switched whatever buffered value. * * Since: 3.5 */ void visu_ui_rendering_window_setCurrent(VisuUiRenderingWindow *window, gboolean status) { g_return_if_fail(VISU_UI_IS_RENDERING_WINDOW(window)); visu_ui_gl_widget_setCurrent(VISU_UI_GL_WIDGET(window->openGLArea), status); VISU_UI_RENDERING_WINDOW_GET_CLASS(window)->redrawWidget = window; } static void onRedraw(VisuUiRenderingWindow *window, gpointer data _U_) { _redraw(window, FALSE); } static void onForceRedraw(VisuUiRenderingWindow *window, gpointer data _U_) { _redraw(window, TRUE); } static void _onSearch(VisuUiRenderingWindow *window) { if (!window->currentData) return; #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 17 gtk_widget_show(window->info->infoBar); gtk_widget_grab_focus(window->info->searchEntry); gtk_entry_set_icon_from_stock(GTK_ENTRY(window->info->searchEntry), GTK_ENTRY_ICON_SECONDARY, NULL); gtk_entry_set_text(GTK_ENTRY(window->info->searchEntry), ""); #endif } #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 17 static void _onSearchClose(GtkInfoBar *bar, gint response, gpointer data) { if (response == GTK_RESPONSE_CLOSE) { gtk_widget_hide(GTK_WIDGET(bar)); gtk_widget_grab_focus(VISU_UI_RENDERING_WINDOW(data)->openGLArea); } } static void _onSearchEdited(GtkEntry *entry, gpointer data) { VisuUiRenderingWindow *window = VISU_UI_RENDERING_WINDOW(data); gint i; gchar *end; const gchar *val; VisuNode *node; gtk_entry_set_icon_from_stock(entry, GTK_ENTRY_ICON_SECONDARY, NULL); val = gtk_entry_get_text(entry); DBG_fprintf(stderr, "Gtk RenderingWindow: search on '%s'.\n", val); i = strtol(val, &end, 10); if (end == val || i <= 0) { gtk_entry_set_icon_from_stock(entry, GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_DIALOG_WARNING); return; } i -= 1; node = visu_node_array_getFromId(VISU_NODE_ARRAY(window->currentData), i); if (!node) { gtk_entry_set_icon_from_stock(entry, GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_DIALOG_WARNING); return; } visu_interactive_highlight(inter, window->currentData, i); } static gboolean _onSearchEsc(GtkWidget *widget, GdkEventKey *event, gpointer data _U_) { if (event->keyval == GDK_KEY_Escape) { gtk_info_bar_response(GTK_INFO_BAR(widget), GTK_RESPONSE_CLOSE); return TRUE; } return FALSE; } #endif /** * visu_ui_rendering_window_getMarks: * @window: a #VisuUiRenderingWindow object ; * * Get the #VisuGlExtMarks of the given @window. * * Returns: (transfer none): a #VisuGlExtMarks object owned by V_Sim. * * Since: 3.6 */ VisuGlExtMarks* visu_ui_rendering_window_getMarks(VisuUiRenderingWindow *window) { g_return_val_if_fail(VISU_UI_IS_RENDERING_WINDOW(window), (VisuGlExtMarks*)0); return window->marks; } /** * visu_ui_rendering_window_class_getInteractive: * * The user actions on the rendering area are handled by a * #VisuInteractive object. * * Since: 3.6 * * Returns: (transfer none): the #VisuInteractive object used by the rendering window of * V_Sim. This object is owned by V_Sim. */ VisuInteractive* visu_ui_rendering_window_class_getInteractive() { return inter; } /** * visu_ui_rendering_window_class_setDisplayCoordinatesInReduce: * @status: a boolean. * * If set, the coordinates of picked nodes are displayed in reduced values. * * Returns: TRUE if the value has been changed. * * Since: 3.6 */ gboolean visu_ui_rendering_window_class_setDisplayCoordinatesInReduce(gboolean status) { if (!my_class) g_type_class_ref(VISU_UI_TYPE_RENDERING_WINDOW); if (status == my_class->useReducedCoordinates) return FALSE; my_class->useReducedCoordinates = status; return TRUE; } /** * visu_ui_rendering_window_class_getDisplayCoordinatesInReduce: * * Picked nodes have their coordinates displayed in the status bar of the rendering * window. This methods retrieves if they are printed in reduced values or not. * * Returns: TRUE if the coordinates are displayed in reduced values. * * Since: 3.6 */ gboolean visu_ui_rendering_window_class_getDisplayCoordinatesInReduce() { if (!my_class) g_type_class_ref(VISU_UI_TYPE_RENDERING_WINDOW); return my_class->useReducedCoordinates; } /** * visu_ui_rendering_window_class_setAutoAdjust: * @status: a boolean. * * If set, the camera auto adjust its zoom capability for the data to be * full size at zoom level 1. * * Returns: TRUE if the value has been changed. * * Since: 3.6 */ gboolean visu_ui_rendering_window_class_setAutoAdjust(gboolean status) { if (!my_class) g_type_class_ref(VISU_UI_TYPE_RENDERING_WINDOW); if (status == my_class->autoAdjust) return FALSE; my_class->autoAdjust = status; return TRUE; } /** * visu_ui_rendering_window_class_getAutoAdjust: * * The camera can be set to auto adjust its zoom capability for the data to be * full size at zoom level 1. * * Returns: TRUE if the camera auto adjust on data loading. * * Since: 3.6 */ gboolean visu_ui_rendering_window_class_getAutoAdjust() { if (!my_class) g_type_class_ref(VISU_UI_TYPE_RENDERING_WINDOW); return my_class->autoAdjust; } /*************************************/ /* Routines related to config files. */ /*************************************/ static void exportParameters(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { g_string_append_printf(data, "# %s\n", DESC_PARAMETER_RED_COORD); g_string_append_printf(data, "%s[gtk]: %d\n\n", FLAG_PARAMETER_RED_COORD, visu_ui_rendering_window_class_getDisplayCoordinatesInReduce()); g_string_append_printf(data, "# %s\n", DESC_PARAMETER_AUTO_ADJUST); g_string_append_printf(data, "%s[gtk]: %d\n\n", FLAG_PARAMETER_AUTO_ADJUST, visu_ui_rendering_window_class_getAutoAdjust()); } v_sim-3.7.0/src/gtk_renderingWindowWidget.h0000644000353400050620000001377312215546106015714 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2006) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2006) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef GTK_RENDERINGWINDOW_H #define GTK_RENDERINGWINDOW_H #include #include #include #include "visu_data.h" #include "visu_dump.h" #include "extensions/marks.h" #include "openGLFunctions/interactive.h" #include "openGLFunctions/view.h" G_BEGIN_DECLS /** * VISU_UI_TYPE_RENDERING_WINDOW: * * Return the associated #GType to the Renderingwindow objects. */ #define VISU_UI_TYPE_RENDERING_WINDOW (visu_ui_rendering_window_get_type()) /** * VISU_UI_RENDERING_WINDOW: * @obj: the widget to cast. * * Cast the given object to a #VisuUiRenderingWindow object. */ #define VISU_UI_RENDERING_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), VISU_UI_TYPE_RENDERING_WINDOW, VisuUiRenderingWindow)) /** * VISU_UI_RENDERING_WINDOW_CLASS: * @klass: the class to cast. * * Cast the given class to a #VisuUiRenderingWindowClass object. */ #define VISU_UI_RENDERING_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), VISU_UI_TYPE_RENDERING_WINDOW, VisuUiRenderingWindowClass)) /** * VISU_UI_IS_RENDERING_WINDOW: * @obj: the object to test. * * Return if the given object is a valid #VisuUiRenderingWindow object. */ #define VISU_UI_IS_RENDERING_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), VISU_UI_TYPE_RENDERING_WINDOW)) /** * VISU_UI_IS_RENDERING_WINDOW_CLASS: * @klass: the class to test. * * Return if the given class is a valid #VisuUiRenderingWindowClass class. */ #define VISU_UI_IS_RENDERING_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), VISU_UI_TYPE_RENDERING_WINDOW)) /** * VISU_UI_RENDERING_WINDOW_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. */ #define VISU_UI_RENDERING_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_UI_TYPE_RENDERING_WINDOW, VisuUiRenderingWindowClass)) /** * VisuUiRenderingWindow: * * Short form for a #VisuUiRenderingWindow_struct structure. */ typedef struct _VisuUiRenderingWindow VisuUiRenderingWindow; /** * VisuUiRenderingWindowClass: * * Opaque structure. */ typedef struct _VisuUiRenderingWindowClass VisuUiRenderingWindowClass; /** * visu_ui_rendering_window_get_type * * #GType are unique numbers to identify objects. * * Returns: the #GType associated with #VisuUiRenderingWindow objects. */ GType visu_ui_rendering_window_get_type (void); GtkWidget* visu_ui_rendering_window_new(int width, int height, gboolean withFrame, gboolean withToolBar); void visu_ui_rendering_window_pushMessage(VisuUiRenderingWindow *window, const gchar *message); void visu_ui_rendering_window_popMessage(VisuUiRenderingWindow *window); void visu_ui_rendering_window_setData(VisuUiRenderingWindow *window, VisuData* data); VisuData* visu_ui_rendering_window_getData(VisuUiRenderingWindow *window); VisuGlView* visu_ui_rendering_window_getGlView(VisuUiRenderingWindow *window); void visu_ui_rendering_window_loadFile(VisuUiRenderingWindow *window, VisuData *data, guint iSet); void visu_ui_rendering_window_open(VisuUiRenderingWindow *window, GtkWindow *parent); gboolean visu_ui_rendering_window_dump(VisuUiRenderingWindow *window, VisuDump *format, const char* fileName, gint width, gint height, ToolVoidDataFunc functionWait, gpointer data, GError **error); void visu_ui_rendering_window_reload(VisuUiRenderingWindow *window); GtkAccelGroup* visu_ui_rendering_window_getAccelGroup(VisuUiRenderingWindow *window); void visu_ui_rendering_window_setCurrent(VisuUiRenderingWindow *window, gboolean force); void visu_ui_rendering_window_pushInteractive(VisuUiRenderingWindow *window, VisuInteractive *inter); void visu_ui_rendering_window_popInteractive(VisuUiRenderingWindow *window, VisuInteractive *inter); VisuGlExtMarks* visu_ui_rendering_window_getMarks(VisuUiRenderingWindow *window); VisuInteractive* visu_ui_rendering_window_class_getInteractive(); gboolean visu_ui_rendering_window_class_setDisplayCoordinatesInReduce(gboolean status); gboolean visu_ui_rendering_window_class_getDisplayCoordinatesInReduce(); gboolean visu_ui_rendering_window_class_setAutoAdjust(gboolean status); gboolean visu_ui_rendering_window_class_getAutoAdjust(); G_END_DECLS #endif v_sim-3.7.0/src/gtk_openGLWidget.c0000644000353400050620000010725712215546105013726 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2006) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2006) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifdef HAVE_CONFIG_H #include #endif #include "gtk/gtk.h" #include #include #include "support.h" #include "gtk_openGLWidget.h" #include "OSOpenGL/visu_openGL.h" #include "visu_tools.h" #include "visu_extension.h" #include "visu_gtk.h" #include "opengl.h" #include "openGLFunctions/text.h" /* OpenGL implementation dependencies */ #ifdef HAVE_GTKGLEXT #include #include #define IMPL_GTKGLEXT #else #if SYSTEM_X11 == 1 #include #include #define IMPL_BUILTIN_X11 #endif #if SYSTEM_WIN32 == 1 #include #include #define IMPL_BUILTIN_WIN32 #endif #if SYSTEM_QUARTZ == 1 #include #include #define IMPL_BUILTIN_QUARTZ #endif #endif /** * SECTION:gtk_openGLWidget * @short_description: defines an OpenGL capable GtkWidget. * * This is a simple implementation of GtkGlExt to create an * OpenGL surface that is a full GtkWidget. When creating such a * widget, one should give then a VisuUiGlWidgetRedrawMethod() to tell the widget * how to redraw itself when needed. * * The current implementation is working on X11 (built-in or * with GtkGlExt) and Win32. */ struct _VisuUiGlWidget { GtkWidget parent; gboolean sizeAllocation_has_run; gboolean dispose_has_run; /* Redraw method and user data. */ VisuUiGlWidgetRedrawMethod redraw; VisuGlView *redrawView; /* Default background pixbuf. */ GdkPixbuf *backLogo; /* OpenGL part, OS dependent. */ gboolean isContextDirect; GdkVisual *visual; #ifdef IMPL_GTKGLEXT GdkGLConfig *glconfig; GdkGLWindow *glwindow; GdkGLContext *context; #endif #ifdef IMPL_BUILTIN_X11 Display *dpy; XVisualInfo *vinfo; GLXContext context; #endif #ifdef IMPL_BUILTIN_WIN32 HDC hdc; HGLRC context; HWND windowId; #endif #ifdef IMPL_BUILTIN_QUARTZ NSWindow windowId; AGLContext context; AGLPixelFmtID pxlfmt; #endif }; struct _VisuUiGlWidgetClass { GtkWidgetClass parent_class; VisuUiGlWidget *contextCurrent; }; G_DEFINE_TYPE(VisuUiGlWidget, visu_ui_gl_widget, GTK_TYPE_WIDGET) /* Local variables. */ static VisuUiGlWidgetClass *myClass = (VisuUiGlWidgetClass*)0; /* Local callbacks. */ #if GTK_MAJOR_VERSION < 3 && GTK_MINOR_VERSION < 26 static gboolean visu_ui_gl_widgetEvent_expose(GtkWidget *widget, GdkEventExpose *event); static void visu_ui_gl_widgetEvent_sizeRequest(GtkWidget *widget, GtkRequisition *requisition); #else static gboolean visu_ui_gl_widgetEvent_draw(GtkWidget *widget, cairo_t *cr); static void visu_ui_gl_widgetEvent_getWidth(GtkWidget *widget, gint *minWidth, gint *width); static void visu_ui_gl_widgetEvent_getHeight(GtkWidget *widget, gint *minHeight, gint *height); #endif static gboolean visu_ui_gl_widgetEvent_visibility(GtkWidget *widget, GdkEventVisibility *event); static void visu_ui_gl_widgetEvent_sizeAllocate(GtkWidget *widget, GtkAllocation *allocation); static void visu_ui_gl_widgetEvent_realise(GtkWidget *widget); /* Initialisation methods. */ static void visu_ui_gl_widgetInit_context(VisuUiGlWidget *render, gboolean contextIsDirect); /* Freeing methods. */ static void visu_ui_gl_widgetEvent_dispose(GObject *obj); static void visu_ui_gl_widgetEvent_finalize(GObject *obj); static void visu_ui_gl_widgetFree_openGL(VisuUiGlWidget *render); /* Miscellaneous methods. */ static void setViewport(VisuUiGlWidget *render, guint width, guint height, gboolean redraw); static void visu_ui_gl_widgetSet_pixelFormat(VisuUiGlWidget *render); #if GTK_MAJOR_VERSION < 3 && GTK_MINOR_VERSION < 26 static GdkColormap* visu_ui_gl_widgetGet_openGLColormap(VisuUiGlWidget *render); #endif static void visu_ui_gl_widget_class_init(VisuUiGlWidgetClass *class) { GtkWidgetClass *widget_class; GObjectClass *gobject_class; /* Dealing with GObject events. */ gobject_class = G_OBJECT_CLASS(class); gobject_class->dispose = visu_ui_gl_widgetEvent_dispose; gobject_class->finalize = visu_ui_gl_widgetEvent_finalize; /* Dealing with widget events. */ widget_class = GTK_WIDGET_CLASS(class); #if GTK_MAJOR_VERSION < 3 && GTK_MINOR_VERSION < 26 widget_class->expose_event = visu_ui_gl_widgetEvent_expose; widget_class->size_request = visu_ui_gl_widgetEvent_sizeRequest; #else widget_class->draw = visu_ui_gl_widgetEvent_draw; widget_class->get_preferred_width = visu_ui_gl_widgetEvent_getWidth; widget_class->get_preferred_height = visu_ui_gl_widgetEvent_getHeight; #endif widget_class->visibility_notify_event = visu_ui_gl_widgetEvent_visibility; widget_class->realize = visu_ui_gl_widgetEvent_realise; widget_class->size_allocate = visu_ui_gl_widgetEvent_sizeAllocate; class->contextCurrent = (VisuUiGlWidget*)0; myClass = class; } static void visu_ui_gl_widget_init(VisuUiGlWidget *render) { DBG_fprintf(stderr, "Gtk OpenGL (init) : create object %p.\n", (gpointer)render); render->sizeAllocation_has_run = FALSE; render->dispose_has_run = FALSE; render->redraw = (VisuUiGlWidgetRedrawMethod)0; render->redrawView = (VisuGlView*)0; render->backLogo = (GdkPixbuf*)0; render->isContextDirect = FALSE; render->visual = (GdkVisual*)0; #ifdef IMPL_GTKGLEXT render->glconfig = (GdkGLConfig*)0; render->glwindow = (GdkGLWindow*)0; render->context = (GdkGLContext*)0; #endif #ifdef IMPL_BUILTIN_X11 render->dpy = (Display*)0; render->vinfo = (XVisualInfo*)0; render->context = (GLXContext)0; #endif #ifdef IMPL_BUILTIN_WIN32 render->hdc = (HDC)0; render->context = (HGLRC)0; render->windowId = (HWND)0; #endif /* Cancel the GTK double buffering since it is taken into account by OpenGL itself. */ gtk_widget_set_double_buffered(GTK_WIDGET(render), FALSE); gtk_widget_set_has_window(GTK_WIDGET(render), TRUE); } GtkWidget* visu_ui_gl_widget_new(gboolean contextIsDirect) { VisuUiGlWidget *render; render = VISU_UI_GL_WIDGET(g_object_new(VISU_UI_TYPE_GL_WIDGET, NULL)); render->isContextDirect = contextIsDirect; return GTK_WIDGET(render); } /* Methods to deals with the events. */ static void visu_ui_gl_widgetEvent_dispose(GObject *obj) { DBG_fprintf(stderr, "Gtk OpenGL (events) : dispose event for object %p.\n", (gpointer)obj); if (VISU_UI_GL_WIDGET(obj)->dispose_has_run) return; VISU_UI_GL_WIDGET(obj)->dispose_has_run = TRUE; if (VISU_UI_GL_WIDGET(obj)->backLogo) g_object_unref(VISU_UI_GL_WIDGET(obj)->backLogo); visu_ui_gl_widgetFree_openGL(VISU_UI_GL_WIDGET(obj)); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_gl_widget_parent_class)->dispose(obj); } static void visu_ui_gl_widgetEvent_finalize(GObject *obj) { DBG_fprintf(stderr, "Gtk OpenGL (events): finalize event for object %p.\n", (gpointer)obj); /* Chain up to the parent class */ G_OBJECT_CLASS(visu_ui_gl_widget_parent_class)->finalize(obj); } #if GTK_MAJOR_VERSION < 3 && GTK_MINOR_VERSION < 26 static gboolean visu_ui_gl_widgetEvent_expose(GtkWidget *widget, GdkEventExpose *event _U_) { DBG_fprintf(stderr, "Gtk OpenGL (events): expose event for object %p.\n", (gpointer)widget); visu_ui_gl_widget_redraw(VISU_UI_GL_WIDGET(widget)); return FALSE; } #else static gboolean visu_ui_gl_widgetEvent_draw(GtkWidget *widget, cairo_t *cr _U_) { DBG_fprintf(stderr, "Gtk OpenGL (events): draw event for object %p.\n", (gpointer)widget); visu_ui_gl_widget_redraw(VISU_UI_GL_WIDGET(widget)); return FALSE; } #endif static gboolean visu_ui_gl_widgetEvent_visibility(GtkWidget *widget, GdkEventVisibility *event) { if (event->state != GDK_VISIBILITY_UNOBSCURED) return FALSE; DBG_fprintf(stderr, "Gtk OpenGL (events): visibility event for object %p.\n", (gpointer)widget); visu_ui_gl_widget_redraw(VISU_UI_GL_WIDGET(widget)); DBG_fprintf(stderr, "Gtk OpenGL (events): visibility OK.\n"); return FALSE; } #if GTK_MAJOR_VERSION < 3 && GTK_MINOR_VERSION < 26 static void visu_ui_gl_widgetEvent_sizeRequest(GtkWidget *widget, GtkRequisition *requisition) { VisuUiGlWidget *render; GtkAllocation allocation; DBG_fprintf(stderr, "Gtk OpenGL (events): size request event.\n"); render = VISU_UI_GL_WIDGET(widget); if (render->sizeAllocation_has_run) { gtk_widget_get_allocation(widget, &allocation); requisition->width = allocation.width; requisition->height = allocation.height; } else { requisition->width = 200; requisition->height = 200; } /* Chain up to default that simply reads current requisition */ /* GTK_WIDGET_CLASS(visu_ui_gl_widget_parent_class)->size_request(widget, requisition); */ DBG_fprintf(stderr, "Gtk OpenGL (events): size request event (%dx%d).\n", requisition->width, requisition->height); } #else static void visu_ui_gl_widgetEvent_getSize(GtkWidget *widget _U_, GtkOrientation orientation, gint *minSize, gint *size) { DBG_fprintf(stderr, "Gtk OpenGL (events): size request event.\n"); if (orientation == GTK_ORIENTATION_HORIZONTAL) { *minSize = 200; *size = 450; } else { *minSize = 200; *size = 450; } } static void visu_ui_gl_widgetEvent_getWidth(GtkWidget *widget, gint *minWidth, gint *width) { visu_ui_gl_widgetEvent_getSize(widget, GTK_ORIENTATION_HORIZONTAL, minWidth, width); } static void visu_ui_gl_widgetEvent_getHeight(GtkWidget *widget, gint *minHeight, gint *height) { visu_ui_gl_widgetEvent_getSize(widget, GTK_ORIENTATION_HORIZONTAL, minHeight, height); } #endif static void visu_ui_gl_widgetEvent_sizeAllocate(GtkWidget *widget, GtkAllocation *allocation) { VisuUiGlWidget *render; GtkAllocation wdAllocation; render = VISU_UI_GL_WIDGET(widget); gtk_widget_get_allocation(widget, &wdAllocation); if ((wdAllocation.width == allocation->width) && (wdAllocation.height == allocation->height)) return; DBG_fprintf(stderr, "Gtk OpenGL (events): size allocation event (%dx%d).\n", allocation->width, allocation->height); render->sizeAllocation_has_run = TRUE; /* Chain up to default that simply reads current requisition */ GTK_WIDGET_CLASS(visu_ui_gl_widget_parent_class)->size_allocate(widget, allocation); #ifdef IMPL_BUILTIN_X11 glXWaitX(); #endif setViewport(render, allocation->width, allocation->height, FALSE); } static void visu_ui_gl_widgetEvent_realise(GtkWidget *widget) { VisuUiGlWidget *render; GdkWindowAttr attributes; gint attributes_mask; #if GTK_MAJOR_VERSION < 3 && GTK_MINOR_VERSION < 26 GdkColormap *colormap; #else #define GDK_WA_COLORMAP 0 #endif GdkWindow *window; GtkAllocation allocation; DBG_fprintf(stderr, "Gtk OpenGL (events): realise event for %p.\n", (gpointer)widget); gtk_widget_set_realized(widget, TRUE); render = VISU_UI_GL_WIDGET(widget); #ifndef IMPL_BUILTIN_WIN32 visu_ui_gl_widgetSet_pixelFormat(render); #endif gtk_widget_get_allocation(widget, &allocation); attributes.window_type = GDK_WINDOW_CHILD; attributes.x = allocation.x; attributes.y = allocation.y; attributes.width = allocation.width; attributes.height = allocation.height; attributes.wclass = GDK_INPUT_OUTPUT; #if GTK_MAJOR_VERSION < 3 && GTK_MINOR_VERSION < 26 colormap = visu_ui_gl_widgetGet_openGLColormap(render); DBG_fprintf(stderr, "Gtk OpenGL (debug): colormap is %p.\n", (gpointer)colormap); attributes.visual = gdk_colormap_get_visual(colormap); attributes.colormap = colormap; #else attributes.visual = render->visual; #endif attributes.event_mask = GDK_EXPOSURE_MASK | GDK_VISIBILITY_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_SCROLL_MASK | GDK_KEY_PRESS_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK; #ifdef IMPL_GTKGLEXT attributes_mask = GDK_WA_X | GDK_WA_Y; #else attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; #endif window = gdk_window_new(gtk_widget_get_parent_window(widget), &attributes, attributes_mask); gtk_widget_set_window(widget, window); #if GTK_MAJOR_VERSION < 3 && GTK_MINOR_VERSION < 26 gdk_window_set_back_pixmap(window, NULL, FALSE); #else gdk_window_set_background_pattern(window, NULL); #endif gdk_window_set_user_data(window, widget); DBG_fprintf(stderr, "Gtk OpenGL (debug): GdkWindow is %p.\n", (gpointer)window); gtk_widget_style_attach(widget); gdk_window_set_background(window, >k_widget_get_style(widget)->base[GTK_STATE_NORMAL]); gtk_widget_set_can_focus(widget, TRUE); gtk_widget_set_can_default(widget, TRUE); gdk_display_sync(gtk_widget_get_display(widget)); #ifdef IMPL_BUILTIN_X11 glXWaitX(); #endif /* Initialize context for OpenGL, OS dependent. */ #ifdef IMPL_BUILTIN_WIN32 visu_ui_gl_widgetSet_pixelFormat(render); #endif visu_ui_gl_widgetInit_context(render, render->isContextDirect); visu_ui_gl_widget_setCurrent(render, FALSE); } /** * visu_ui_gl_widget_class_getCurrentContext: * * Class routine that returns the OpenGL widget which has the current context. * * Returns: (transfer none): the #VisuUiGlWidget with the current OpenGL context. */ VisuUiGlWidget* visu_ui_gl_widget_class_getCurrentContext() { g_return_val_if_fail(myClass, (VisuUiGlWidget*)0); return myClass->contextCurrent; } static void setViewport(VisuUiGlWidget *render, guint width, guint height, gboolean redraw) { g_return_if_fail(VISU_UI_IS_GL_WIDGET(render)); if (VISU_UI_GL_WIDGET_GET_CLASS(render)->contextCurrent != render) return; DBG_fprintf(stderr, " | adjusting viewport to %dx%d.\n", width, height); glViewport(0, 0, width, height); if (redraw) { /* We synchronize the rendering area. */ gdk_display_sync(gtk_widget_get_display(GTK_WIDGET(render))); /* We clear the back buffer and swap because this buffer has still the wrong size. */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); visu_ui_gl_widget_swapBuffers(render); } } static void drawToEmpty(VisuUiGlWidget *render) { int widthImg, heightImg; guchar *imageData; gboolean alpha; int x, y; float rgb[3]; int viewport[4]; GtkStyle *style; DBG_fprintf(stderr, "Gtk OpenGL (action): Rebuild default background.\n"); style = gtk_widget_get_style(GTK_WIDGET(render)); rgb[0] = (float)style->bg[0].red / 65536.; rgb[1] = (float)style->bg[0].green / 65536.; rgb[2] = (float)style->bg[0].blue / 65536.; DBG_fprintf(stderr, "Gtk OpenGL (action): set background color to (%f,%f,%f).\n", rgb[0], rgb[1], rgb[2]); if (!render->backLogo) { DBG_fprintf(stderr, "Gtk OpenGL (action): load the pixbuf 'logo_grey.png'.\n"); render->backLogo = visu_ui_createPixbuf("logo_grey.png"); } glPushAttrib(GL_ENABLE_BIT); glClearColor(rgb[0], rgb[1], rgb[2], 0.25f); glDrawBuffer(GL_BACK); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if (render->backLogo) { imageData = gdk_pixbuf_get_pixels(render->backLogo); alpha = gdk_pixbuf_get_has_alpha(render->backLogo); widthImg = gdk_pixbuf_get_width(render->backLogo); heightImg = gdk_pixbuf_get_height(render->backLogo); glDisable(GL_FOG); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); /* We can use fixed value for widthImg and heightImg since we project then in a 2D ortho with these values. */ glGetIntegerv(GL_VIEWPORT, viewport); DBG_fprintf(stderr, "Gtk OpenGL (action): Get viewport %dx%d.\n", viewport[2], viewport[3]); x = (viewport[2] - widthImg) / 2; y = (viewport[3] + heightImg) / 2; DBG_fprintf(stderr, "Gtk OpenGL (action): draw at %dx%d.\n", x, y); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluOrtho2D(0.0, (float)viewport[2], 0., (float)viewport[3]); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glRasterPos2i(x, y); glPixelZoom(1., -1.); if (alpha) glDrawPixels(widthImg, heightImg, GL_RGBA, GL_UNSIGNED_BYTE, imageData); else glDrawPixels(widthImg, heightImg, GL_RGB, GL_UNSIGNED_BYTE, imageData); glPixelZoom(1., 1.); glPopMatrix(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); } glPopAttrib(); } /** * visu_ui_gl_widget_setRedraw: * @render: a #VisuUiGlWidget object ; * @method: (scope call): a redraw method ; * @view: the #VisuGlView object. * * This method is used to defined a redraw method for the OpenGL area. By doing this * the area will automatically redraw itself when necessary. Before doing it * it calls visu_ui_gl_widget_setCurrent(), and after it calls * visu_ui_gl_widget_swapBuffers(). */ void visu_ui_gl_widget_setRedraw(VisuUiGlWidget *render, VisuUiGlWidgetRedrawMethod method, VisuGlView *view) { g_return_if_fail(VISU_UI_IS_GL_WIDGET(render)); DBG_fprintf(stderr, "Gtk OpenGL (action) : set redraw method for OpenGL area %p.\n", (gpointer)render); render->redraw = method; render->redrawView = view; } /** * visu_ui_gl_widget_redraw: * @render: a #VisuUiGlWidget object. * * Force redraw on the given surface, if a redraw method have been given (see * visu_ui_gl_widget_setRedraw()). */ void visu_ui_gl_widget_redraw(VisuUiGlWidget *render) { #if DEBUG == 1 GTimer *timer; gulong fractionTimer; #endif g_return_if_fail(VISU_UI_IS_GL_WIDGET(render)); #if DEBUG == 1 timer = g_timer_new(); g_timer_start(timer); #endif DBG_fprintf(stderr, "Gtk OpenGL (action) : redraw OpenGL area for %p.\n", (gpointer)render); DBG_fprintf(stderr, " | set current.\n"); visu_ui_gl_widget_setCurrent(render, FALSE); DBG_fprintf(stderr, " | redraw inside.\n"); if (render->redraw) render->redraw(render->redrawView, (GList*)0); else drawToEmpty(render); DBG_fprintf(stderr, " | swap buffers.\n"); visu_ui_gl_widget_swapBuffers(render); #if DEBUG == 1 g_timer_stop(timer); fprintf(stderr, "Gtk OpenGL: total redraw in %g micro-s.\n", g_timer_elapsed(timer, &fractionTimer)*1e6); g_timer_destroy(timer); #endif } /** * visu_ui_gl_widget_getPixmapData: * @render: a #VisuUiGlWidget object ; * @width: a pointer to the desired width or -1 ; * @height: a pointer to the desired height or -1 ; * @offScreen: a boolean ; * @hasAlpha: if TRUE, the returned data is RGBA, else only RGB. * * Create an image from the OpenGL area. The size can be changed, using @width and * @height. If these pointers contains positive values, then they are used to set the * size for the image. If not, the current size is used and stored in these pointers. * The boolean offScreen is used to tell if the image is taken from current context * or if an offscreen pixmap is created for the rendering. * * Returns: (transfer full): image data, row by row. */ GArray* visu_ui_gl_widget_getPixmapData(VisuUiGlWidget *render, int *width, int *height, gboolean offScreen, gboolean hasAlpha) { GtkWidget *wd; GArray *image; VisuPixmapContext *dumpData; GtkAllocation allocation; g_return_val_if_fail(VISU_UI_IS_GL_WIDGET(render), (GArray*)0); g_return_val_if_fail(VISU_UI_GL_WIDGET_GET_CLASS(render)->contextCurrent == render, (GArray*)0); g_return_val_if_fail(render->redraw, (GArray*)0); g_return_val_if_fail(width && height, (GArray*)0); g_return_val_if_fail(render->redrawView, (GArray*)0); wd = GTK_WIDGET(render); gtk_widget_get_allocation(wd, &allocation); if (!offScreen) { *width = allocation.width; *height = allocation.height; return visu_pixmap_getData(*width, *height, hasAlpha); } /* If a method is given, then we draw in memory to a pixmap. */ *width = (*width > 0)?*width:allocation.width; *height = (*height > 0)?*height:allocation.height; /* We create a pixmap context and make this context current. */ dumpData = visu_pixmap_context_new((guint)*width, (guint)*height); if (!dumpData) { /* Switch back to on-screen copy. */ g_warning("can't create off-screen pixmap, will screenshot" " the rendering area instead. Make sure that it is" " free of any other windows."); *width = allocation.width; *height = allocation.height; return visu_pixmap_getData(*width, *height, hasAlpha); } /* We set the glViewport of this new context. */ visu_gl_initContext(); visu_gl_camera_modelize(render->redrawView->camera); visu_gl_view_setViewport(render->redrawView, (guint)*width, (guint)*height); visu_gl_window_project(render->redrawView->window, render->redrawView->camera); visu_gl_ext_rebuildAll(); /* We call the given draw method. */ render->redraw(render->redrawView, (GList*)0); /* We copy the pixmap into generic data. */ image = visu_pixmap_getData((guint)*width, (guint)*height, hasAlpha); /* We change back the context to the current rendering area. */ visu_ui_gl_widget_setCurrent(render, TRUE); /* We free the pixmap context. */ visu_pixmap_context_free(dumpData); return image; } /* OpenGL functions, OS dependent. */ #ifdef IMPL_GTKGLEXT static void visu_ui_gl_widgetSet_pixelFormat(VisuUiGlWidget *render) { GdkScreen *screen; DBG_fprintf(stderr, "Gtk OpenGL (glext): choose visual for %p.\n", render); /* Get the screen. */ if (gtk_widget_get_visible(GTK_WIDGET(render))) screen = gtk_widget_get_screen(GTK_WIDGET(render)); else screen = gdk_screen_get_default(); DBG_fprintf(stderr, " | get a screen number %d.\n", gdk_x11_screen_get_screen_number(screen)); render->glconfig = visu_gl_getGLConfig(screen); DBG_fprintf(stderr, " | get a visual.\n"); } static void visu_ui_gl_widgetInit_context(VisuUiGlWidget *render, gboolean contextIsDirect) { GtkWidget *wd; DBG_fprintf(stderr, "Gtk OpenGL (glext): create an OpenGL context (%d).\n", contextIsDirect); wd = GTK_WIDGET(render); /* Create a GL area on the widget window. */ render->glwindow = gdk_gl_window_new(render->glconfig, wd->window, NULL); /* Finaly, create the context. */ if (contextIsDirect) { render->context = gdk_gl_context_new(GDK_GL_DRAWABLE(render->glwindow), (GdkGLContext*)0, TRUE, GDK_GL_RGBA_TYPE); if (!render->context) { g_warning("Can't create a direct rendering context, try an inderect one.\n"); render->context = gdk_gl_context_new(GDK_GL_DRAWABLE(render->glwindow), (GdkGLContext*)0, FALSE, GDK_GL_RGBA_TYPE); render->isContextDirect = FALSE; } } else render->context = gdk_gl_context_new(GDK_GL_DRAWABLE(render->glwindow), (GdkGLContext*)0, FALSE, GDK_GL_RGBA_TYPE); DBG_fprintf(stderr, " | create the context %p (%d).\n", (gpointer)render->context, (int)render->isContextDirect); if (!render->context) { g_error("Cannot create a GtkGLExt context.\n"); } } static void visu_ui_gl_widgetFree_openGL(VisuUiGlWidget *render) { g_return_if_fail(VISU_UI_IS_GL_WIDGET(render)); DBG_fprintf(stderr, "Gtk OpenGL (glext): freeing context & window.\n"); if (render->glwindow) gdk_gl_window_destroy(render->glwindow); if (render->context) gdk_gl_context_destroy(render->context); } gboolean visu_ui_gl_widget_setCurrent(VisuUiGlWidget *render, gboolean force) { gboolean res; GtkWidget *wd; g_return_val_if_fail(VISU_UI_IS_GL_WIDGET(render), FALSE); if (!force && VISU_UI_GL_WIDGET_GET_CLASS(render)->contextCurrent == render) return TRUE; DBG_fprintf(stderr, "Gtk OpenGL (glext): %p is set current.\n", (gpointer)render); res = gdk_gl_drawable_make_current(GDK_GL_DRAWABLE(render->glwindow), render->context); visu_gl_text_onNewContext(); if (!res) { g_warning("Cannot make the visu_ui_gl_widget object %p current.\n", (gpointer)render); return FALSE; } DBG_fprintf(stderr, "Gtk OpenGL (glext): OK context changed.\n"); VISU_UI_GL_WIDGET_GET_CLASS(render)->contextCurrent = render; wd = GTK_WIDGET(render); setViewport(render, wd->allocation.width, wd->allocation.height, FALSE); return TRUE; } void visu_ui_gl_widget_swapBuffers(VisuUiGlWidget *render) { g_return_if_fail(VISU_UI_GL_WIDGET_GET_CLASS(render)->contextCurrent == render); DBG_fprintf(stderr, "Gtk OpenGL (glext): swap buffers of area %p.\n", (gpointer)render); gdk_gl_drawable_swap_buffers(GDK_GL_DRAWABLE(render->glwindow)); } static GdkColormap* visu_ui_gl_widgetGet_openGLColormap(VisuUiGlWidget *render) { g_return_val_if_fail(render->glconfig, (GdkColormap*)0); return gdk_gl_config_get_colormap(render->glconfig); } #endif #ifdef IMPL_BUILTIN_X11 static void visu_ui_gl_widgetSet_pixelFormat(VisuUiGlWidget *render) { gint screenId; gboolean built; GdkScreen *screen; built = gtk_widget_get_visible(GTK_WIDGET(render)); DBG_fprintf(stderr, "Gtk OpenGL (X11): choose visual for %p.\n", (gpointer)render); if (built) render->dpy = GDK_DISPLAY_XDISPLAY(gtk_widget_get_display(GTK_WIDGET(render))); else render->dpy = gdk_x11_get_default_xdisplay(); DBG_fprintf(stderr, " | get the display %p.\n", (gpointer)render->dpy); /* XSynchronize(render->dpy, True); */ /* Get the screen id. */ if (built) screen = gtk_widget_get_screen(GTK_WIDGET(render)); else screen = gdk_screen_get_default(); screenId = gdk_screen_get_number(screen); DBG_fprintf(stderr, " | get a screen number %d.\n", screenId); render->vinfo = visu_gl_getVisualInfo(render->dpy, screenId); DBG_fprintf(stderr, " | get a visual %d.\n", (int)render->vinfo->visualid); render->visual = gdk_x11_screen_lookup_visual(screen, render->vinfo->visualid); } static void visu_ui_gl_widgetInit_context(VisuUiGlWidget *render, gboolean contextIsDirect) { DBG_fprintf(stderr, "Gtk OpenGL (X11): create an OpenGL context (%d).\n", contextIsDirect); /* Check for GLX. */ if (!glXQueryExtension(render->dpy, 0, 0)) { g_error("No GLX extension.\nYour X server" " does not support OpenGL extension. Please contact your" " system administrator to ask him to add the 'glx'" " extension to your X server.\n"); } /* Finaly, create the context. */ if (contextIsDirect) { render->context = glXCreateContext(render->dpy, render->vinfo, 0, GL_TRUE); if (!render->context) { g_warning("Can't create a direct rendering context, try an inderect one.\n"); render->context = glXCreateContext(render->dpy, render->vinfo, 0, GL_FALSE); render->isContextDirect = FALSE; } } else render->context = glXCreateContext(render->dpy, render->vinfo, 0, GL_FALSE); DBG_fprintf(stderr, " | create the context %p (%d).\n", (gpointer)render->context, (int)render->isContextDirect); if (!render->context) { g_error("Cannot create a GLX context.\n"); } } static void visu_ui_gl_widgetFree_openGL(VisuUiGlWidget *render) { g_return_if_fail(VISU_UI_IS_GL_WIDGET(render)); if (render->dpy) { DBG_fprintf(stderr, "Free (X11): freeing context.\n"); if (render->context) glXDestroyContext(render->dpy, render->context); /* We do NOT close the display since it is shared by all the application and thus dpy structure is unique and will be closed by GTK when quiting. */ /* XCloseDisplay(render->dpy); */ } } gboolean visu_ui_gl_widget_setCurrent(VisuUiGlWidget *render, gboolean force) { int res; GtkWidget *wd; XID windowId; GtkAllocation alloc; g_return_val_if_fail(VISU_UI_IS_GL_WIDGET(render), FALSE); if (!force && VISU_UI_GL_WIDGET_GET_CLASS(render)->contextCurrent == render) return TRUE; DBG_fprintf(stderr, "Gtk OpenGL (X11): unset the context.\n"); glXMakeCurrent(render->dpy, None, NULL); glXWaitX(); DBG_fprintf(stderr, "Gtk OpenGL (X11): widget visualID %d.\n", (int)gdk_x11_visual_get_xvisual (gtk_widget_get_visual(GTK_WIDGET(render)))->visualid); DBG_fprintf(stderr, "Gtk OpenGL (X11): %p is set current.\n", (gpointer)render); windowId = GDK_WINDOW_XID(GDK_WINDOW(gtk_widget_get_window(GTK_WIDGET(render)))); DBG_fprintf(stderr, "Gtk OpenGL (X11): widget windowID 0x%x.\n", (int)windowId); res = glXMakeCurrent(render->dpy, (GLXDrawable)windowId, render->context); if (!res) { g_warning("Cannot make the visu_ui_gl_widget object %p current.\n", (gpointer)render); return FALSE; } glXWaitX(); DBG_fprintf(stderr, "Gtk OpenGL (X11): OK context changed.\n"); visu_gl_text_onNewContext(); /* Now that the glx tunnel has been added, we need to specify again that we want a backing store because until now the backing store is only for the X window (and thus is black) but not for the glx screen. */ /* wattrs.backing_store = Always; */ /* XChangeWindowAttributes(render->dpy, windowId, */ /* CWBackingStore, &wattrs); */ VISU_UI_GL_WIDGET_GET_CLASS(render)->contextCurrent = render; wd = GTK_WIDGET(render); gtk_widget_get_allocation(wd, &alloc); setViewport(render, alloc.width, alloc.height, FALSE); return TRUE; } void visu_ui_gl_widget_swapBuffers(VisuUiGlWidget *render) { g_return_if_fail(VISU_UI_GL_WIDGET_GET_CLASS(render)->contextCurrent == render); DBG_fprintf(stderr, "Gtk OpenGL (X11): swap buffers of area %p.\n", (gpointer)render); glXSwapBuffers(render->dpy, (GLXDrawable)GDK_WINDOW_XID(GDK_WINDOW(gtk_widget_get_window(GTK_WIDGET(render))))); DBG_fprintf(stderr, "Gtk OpenGL (X11): swap OK.\n"); } #if GTK_MAJOR_VERSION < 3 && GTK_MINOR_VERSION < 26 static GdkColormap* visu_ui_gl_widgetGet_openGLColormap(VisuUiGlWidget *render) { g_return_val_if_fail(VISU_UI_IS_GL_WIDGET(render), (GdkColormap*)0); g_return_val_if_fail(render->vinfo, (GdkColormap*)0); return gdk_colormap_new(gdkx_visual_get(render->vinfo->visualid), FALSE); } #endif #endif #ifdef IMPL_BUILTIN_WIN32 static void visu_ui_gl_widgetSet_pixelFormat(VisuUiGlWidget *render) { DBG_fprintf(stderr, "Gtk OpenGL (Win32): choose visual for %p.\n", render); render->windowId = (HWND)gdk_win32_drawable_get_handle(GDK_DRAWABLE(GTK_WIDGET(render)->window)); render->hdc = GetDC(render->windowId); DBG_fprintf(stderr, " | get the hdc %d.\n", (int)render->hdc); visu_gl_setupPixelFormat(render->hdc); render->visual = gdk_screen_get_system_visual(gdk_screen_get_default()); } static void visu_ui_gl_widgetInit_context(VisuUiGlWidget *render, gboolean contextIsDirect) { DBG_fprintf(stderr, "Gtk OpenGL (Win32): create an OpenGL context (%d).\n", contextIsDirect); /* Finaly, create the context. */ render->context = wglCreateContext(render->hdc); } static void visu_ui_gl_widgetFree_openGL(VisuUiGlWidget *render) { g_return_if_fail(VISU_UI_IS_GL_WIDGET(render)); if (render->context) wglDeleteContext(render->context); /* if (render->hdc) */ /* DeleteDC(render->hdc); */ } gboolean visu_ui_gl_widget_setCurrent(VisuUiGlWidget *render, gboolean force _U_) { GtkWidget *wd; g_return_val_if_fail(VISU_UI_IS_GL_WIDGET(render), FALSE); DBG_fprintf(stderr, "Gtk OpenGL (action) : %p is set current.\n", (gpointer)render); wglMakeCurrent(NULL, NULL); wglMakeCurrent(render->hdc, render->context); visu_gl_text_onNewContext(); VISU_UI_GL_WIDGET_GET_CLASS(render)->contextCurrent = render; wd = GTK_WIDGET(render); setViewport(render, wd->allocation.width, wd->allocation.height, FALSE); return TRUE; } void visu_ui_gl_widget_swapBuffers(VisuUiGlWidget *render) { g_return_if_fail(VISU_UI_GL_WIDGET_GET_CLASS(render)->contextCurrent == render); DBG_fprintf(stderr, "Gtk OpenGL (action) : swap buffers of area %p.\n", (gpointer)render); SwapBuffers(render->hdc); } #if GTK_MAJOR_VERSION < 3 && GTK_MINOR_VERSION < 26 static GdkColormap* visu_ui_gl_widgetGet_openGLColormap(VisuUiGlWidget *render) { g_return_val_if_fail(VISU_UI_IS_GL_WIDGET(render), (GdkColormap*)0); return gdk_screen_get_system_colormap(gdk_screen_get_default()); } #endif #endif #ifdef IMPL_BUILTIN_QUARTZ static AGLPixelFmtID visu_gl_setupPixelFormat() { AGLPixelFmtID id; int list[] = { AGL_RGBA, AGL_RED_SIZE, 1, AGL_GREEN_SIZE, 1, AGL_BLUE_SIZE, 1, AGL_DEPTH_SIZE, 1, AGL_DOUBLEBUFFER, AGL_STEREO, AGL_NONE }; if ( (id = aglChoosePixelFmt(NULL, 0, list)) == NULL ) { list[10] = AGL_NONE; if ( (id = aglChoosePixelFmt(NULL, 0, list)) == NULL ) { g_error("Cannot find a pixel format."); } DBG_fprintf(stderr, " | not a stereo buffer.\n"); } else DBG_fprintf(stderr, " | stereo buffer.\n"); return id; } static void visu_ui_gl_widgetSet_pixelFormat(VisuUiGlWidget *render) { DBG_fprintf(stderr, "Gtk OpenGL (Quartz): choose visual for %p.\n", render); render->windowId = (NSWindow)gdk_quartz_window_get_nswindow(GDK_WINDOW(GTK_WIDGET(render)->window)); render->pxlfmt = visu_gl_setupPixelFormat(); render->visual = gdk_screen_get_system_visual(gdk_screen_get_default()); } static void visu_ui_gl_widgetInit_context(VisuUiGlWidget *render, gboolean contextIsDirect) { DBG_fprintf(stderr, "Gtk OpenGL (Quartz): create an OpenGL context (%d).\n", contextIsDirect); /* Finaly, create the context. */ render->context = aglCreateContext(render->pxlfmt, 0); } static void visu_ui_gl_widgetFree_openGL(VisuUiGlWidget *render) { g_return_if_fail(VISU_UI_IS_GL_WIDGET(render)); if (render->context) aglDestroyContext(render->context); /* if (render->hdc) */ /* DeleteDC(render->hdc); */ } gboolean visu_ui_gl_widget_setCurrent(VisuUiGlWidget *render, gboolean force _U_) { GtkWidget *wd; g_return_val_if_fail(VISU_UI_IS_GL_WIDGET(render), FALSE); DBG_fprintf(stderr, "Gtk OpenGL (Quartz): %p is set current.\n", (gpointer)render); aglMakeCurrent((AGLDrawable)render->windowId, render->context); /* visu_gl_text_onNewContext(); */ VISU_UI_GL_WIDGET_GET_CLASS(render)->contextCurrent = render; wd = GTK_WIDGET(render); setViewport(render, wd->allocation.width, wd->allocation.height, FALSE); return TRUE; } void visu_ui_gl_widget_swapBuffers(VisuUiGlWidget *render) { g_return_if_fail(VISU_UI_GL_WIDGET_GET_CLASS(render)->contextCurrent == render); DBG_fprintf(stderr, "Gtk OpenGL (Quartz): swap buffers of area %p.\n", (gpointer)render); aglSwapBuffers((AGLDrawable)render->windowId); } #if GTK_MAJOR_VERSION < 3 && GTK_MINOR_VERSION < 26 static GdkColormap* visu_ui_gl_widgetGet_openGLColormap(VisuUiGlWidget *render) { g_return_val_if_fail(VISU_UI_IS_GL_WIDGET(render), (GdkColormap*)0); return gdk_screen_get_system_colormap(gdk_screen_get_default()); } #endif #endif v_sim-3.7.0/src/gtk_openGLWidget.h0000644000353400050620000001264512215546105013727 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2006) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2006) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef GTK_OPENGLWIDGET_H #define GTK_OPENGLWIDGET_H #include "openGLFunctions/view.h" #include "visu_data.h" /** * VisuUiGlWidget: * * Short name to address VisuUiGlWidget_struct objects. */ typedef struct _VisuUiGlWidget VisuUiGlWidget; /** * VisuUiGlWidgetClass: * * Short name to address VisuUiGlWidgetClass_struct objects. */ typedef struct _VisuUiGlWidgetClass VisuUiGlWidgetClass; /** * VisuUiGlWidgetRedrawMethod: * @view: a #VisuGlView object with the camera settings. * @lists: (allow-none) (type VisuGlExt*): a #VisuGlExt array or %NULL. * * Methods of this prototype are called when the redraw of the OpenGL zone * should be done. */ typedef void (*VisuUiGlWidgetRedrawMethod)(VisuGlView *view, GList *lists); /** * VISU_UI_TYPE_GL_WIDGET: * * The type of VisuUiGlWidget objects. */ #define VISU_UI_TYPE_GL_WIDGET (visu_ui_gl_widget_get_type()) /** * VISU_UI_GL_WIDGET: * @obj: a pointer. * * Cast @obj to VisuUiGlWidget if possible. */ #define VISU_UI_GL_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), \ VISU_UI_TYPE_GL_WIDGET, \ VisuUiGlWidget)) /** * VISU_UI_GL_WIDGET_CLASS: * @obj: a pointer. * * Cast @obj to VisuUiGlWidgetClass if possible. */ #define VISU_UI_GL_WIDGET_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST((obj), \ VISU_UI_TYPE_GL_WIDGET, \ VisuUiGlWidgetClass)) /** * VISU_UI_IS_GL_WIDGET: * @obj: a pointer. * * Return TRUE is @obj is an VisuUiGlWidget object (or inherit from). */ #define VISU_UI_IS_GL_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), \ VISU_UI_TYPE_GL_WIDGET)) /** * VISU_UI_IS_GL_WIDGET_CLASS: * @obj: a pointer. * * Return TRUE is @obj is an VisuUiGlWidgetClass object (or inherit from). */ #define VISU_UI_IS_GL_WIDGET_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((obj), \ VISU_UI_TYPE_GL_WIDGET)) /** * VISU_UI_GL_WIDGET_GET_CLASS: * @obj: a pointer. * * Return the class of the given VisuUiGlWidget object. */ #define VISU_UI_GL_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), \ VISU_UI_TYPE_GL_WIDGET, \ VisuUiGlWidgetClass)) /** * visu_ui_gl_widget_get_type: * * Retrive the type of VisuUiGlWidget objects. * * Returns: the id used by OBjects for VisuUiGlWidget objects. */ GType visu_ui_gl_widget_get_type(void); /** * visu_ui_gl_widget_new: * @contextIsDirect: a boolean. * * Create a new OpenGL area inside a GTK widget. If @contextIsDirect then * it tries to initialise the OpenGL context to a direct one. * * Returns: a newly created widget. */ GtkWidget* visu_ui_gl_widget_new(gboolean contextIsDirect); /** * visu_ui_gl_widget_setCurrent: * @render: a #VisuUiGlWidget object ; * @force: a boolean. * * Make this object current. This means that all future OpenGL primitive will be * rendered on this surface. If @force is TRUE, the GL routine is * actually called whereas in other cases, if @render believe being * already current, nothing is done. * * Returns: TRUE if succeed. */ gboolean visu_ui_gl_widget_setCurrent(VisuUiGlWidget *render, gboolean force); void visu_ui_gl_widget_setRedraw(VisuUiGlWidget *render, VisuUiGlWidgetRedrawMethod method, VisuGlView *view); void visu_ui_gl_widget_redraw(VisuUiGlWidget *render); /** * visu_ui_gl_widget_swapBuffers: * @render: a #VisuUiGlWidget object. * * Swap the buffers of the OpenGL area. */ void visu_ui_gl_widget_swapBuffers(VisuUiGlWidget *render); GArray* visu_ui_gl_widget_getPixmapData(VisuUiGlWidget *render, int *width, int *height, gboolean offScreen, gboolean hasAlpha); VisuUiGlWidget* visu_ui_gl_widget_class_getCurrentContext(); #endif v_sim-3.7.0/src/visu_gtk.c0000644000353400050620000012422412215546106012356 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse m�l : BILLARD, non joignable par m�l ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant � visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est r�gi par la licence CeCILL soumise au droit fran�ais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffus�e par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez acc�der � cet en-t�te signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept� les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #ifdef HAVE_LIBGTKGLEXT_X11_1_0 #include #endif #include /* For the access markers R_OK, W_OK ... */ #include #include "support.h" #include "opengl.h" #include "visu_gtk.h" #include "visu_object.h" #include "visu_basic.h" #include "visu_commandLine.h" #include "visu_configFile.h" #include "visu_rendering.h" #include "visu_extension.h" #include "visu_plugins.h" #include "renderingMethods/renderingAtomic.h" #include "renderingMethods/renderingSpin.h" #include "coreTools/toolShade.h" #include "coreTools/toolConfigFile.h" #include "extraFunctions/plane.h" #include "extraFunctions/dataFile.h" #include "panelModules/panelSurfaces.h" #include "gtk_renderingWindowWidget.h" #include "extraGtkFunctions/gtk_colorComboBoxWidget.h" #include "OSOpenGL/visu_openGL.h" #include "extensions/fogAndBGColor.h" #include "extensions/nodes.h" #include "extensions/box.h" #include "extensions/scale.h" #include /** * SECTION: visu_gtk * @short_description: Basic GUI routines, for preview, standard * dialogs... * * There are some common UI routines here. The preview widget * can be called with visu_ui_preview_add(). Error messages can be * displayed via dialogs, see visu_ui_raiseWarning()... */ /* Parameters. */ #define FLAG_PARAMETER_PREVIEW "main_usePreview" #define DESC_PARAMETER_PREVIEW "Automatically compute preview in filechooser ; boolean" static gboolean usePreview; /* Static variables. */ static gint gtkFileChooserWidth = -1, gtkFileChooserHeight = -1; /* This hashtable associate a #RenderingMethod with a Gtk dialog to choose files. */ static GHashTable *visuGtkLoadMethods = NULL; /* Store the last open directory. It is initialised to current working directory. */ static gchar *visuGtkLastDir; static GtkWindow *visuGtkPanel; static GtkWindow *visuGtkRender; static GtkWidget *visuGtkRenderArea = (GtkWidget*)0; /* Local routines. */ static void exportParameters(GString *data, VisuData *dataObj, VisuGlView *view); static void onPreviewToggled(GtkToggleButton *button, gpointer data); static void initVisuGtk(); /** * visu_ui_raiseWarning: * @action: a string ; * @message: another string ; * @window: the parent window to raise the warning on. * * Raise a warning window with the action in bold and the message written * underneath. */ void visu_ui_raiseWarning(gchar *action, gchar *message, GtkWindow *window) { GtkWidget *alert; gchar *str; if (!window) window = visuGtkRender; DBG_fprintf(stderr, "Visu Gtk: raise the error dialog (parent %p).\n", (gpointer)window); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 str = action; #else str = message; #endif alert = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "%s", str); gtk_window_set_title(GTK_WINDOW(alert), _("V_Sim error message")); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 gtk_widget_set_name(alert, "error"); #else gtk_widget_set_name(alert, action); #endif #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(alert), "%s", message); #endif gtk_widget_show_all(alert); /* block in a loop waiting for reply. */ gtk_dialog_run(GTK_DIALOG(alert)); gtk_widget_destroy(alert); } /** * visu_ui_raiseWarningLong: * @action: a string ; * @message: another string ; * @window: the parent window to raise the warning on. * * Same as visu_ui_raiseWarning() except that the message is displayed * in a text buffer, ideal for a log. */ void visu_ui_raiseWarningLong(gchar *action, gchar *message, GtkWindow *window) { GtkWidget *alert; GtkWidget *text, *scroll; GtkTextBuffer *buf; if (!window) window = visuGtkRender; alert = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "%s", action); gtk_window_set_resizable(GTK_WINDOW(alert), TRUE); gtk_widget_set_name(alert, "error"); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(alert), _("Output errors:")); #endif scroll = gtk_scrolled_window_new((GtkAdjustment*)0, (GtkAdjustment*)0); gtk_widget_set_size_request(scroll, 300, 200); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scroll), GTK_SHADOW_ETCHED_IN); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(alert))), scroll, TRUE, TRUE, 2); text = gtk_text_view_new(); gtk_text_view_set_editable(GTK_TEXT_VIEW(text), FALSE); gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(text), FALSE); gtk_container_add(GTK_CONTAINER(scroll), text); buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW(text)); gtk_text_buffer_set_text(GTK_TEXT_BUFFER(buf), message, -1); gtk_widget_show_all(alert); /* block in a loop waiting for reply. */ gtk_dialog_run (GTK_DIALOG (alert)); gtk_widget_destroy(alert); } /** * visu_ui_wait: * * It runs the Gtk event loop, flushing it before returning. */ void visu_ui_wait(void) { while(gtk_events_pending()) gtk_main_iteration(); } struct _VisuUiSetFilesFunc { VisuUiSetFilesFunc load; }; /** * visu_ui_setRenderingSpecificMethod: * @method: a #RenderingMethod object; * @methodLoad: (scope call): a #VisuUiSetFilesFunc method (can be NULL). * * This function is used by a client to add gtk methods to a rendering method. * The @methodLoad argument is called to when the 'load' button is pushed. */ void visu_ui_setRenderingSpecificMethod(VisuRendering *method, VisuUiSetFilesFunc methodLoad) { struct _VisuUiSetFilesFunc *ct; g_return_if_fail(method); if (!visuGtkLoadMethods) initVisuGtk(); DBG_fprintf(stderr, "Visu Gtk: set rendering specific for method '%s'.\n", visu_rendering_getName(method, FALSE)); ct = g_malloc(sizeof(struct _VisuUiSetFilesFunc)); ct->load = methodLoad; g_hash_table_insert(visuGtkLoadMethods, method, ct); } /** * visu_ui_getRenderingSpecificOpen: (skip) * @method: a #RenderingMethod object. * * This method is used to retrieve the #VisuUiSetFilesFunc associate with * the specified @method. * * Returns: a load method if one has been specified for @method * or visu_ui_getFileFromDefaultFileChooser(). */ VisuUiSetFilesFunc visu_ui_getRenderingSpecificOpen(VisuRendering *method) { struct _VisuUiSetFilesFunc *ct; g_return_val_if_fail(method, (VisuUiSetFilesFunc)0); if (!visuGtkLoadMethods) initVisuGtk(); DBG_fprintf(stderr, "Visu Gtk: looking for a specific load interface for rendering" " method '%s'...\n", visu_rendering_getName(method, FALSE)); ct = (struct _VisuUiSetFilesFunc *)g_hash_table_lookup(visuGtkLoadMethods, method); return (ct && ct->load)?ct->load:visu_ui_getFileFromDefaultFileChooser; } /** * visu_ui_getSelectedDirectory: * @parent: (allow-none): if NULL, the command panel window is used ; * @multiple: if TRUE, multiple directories can be selected ; * @dir: (allow-none): if not NULL, give the opening directory. * * General procedure to get the location of one or more directories. * In the multiple case, all selected directories shares a common ancestor * since the selection is done through the same selector that for single * directory but with multiple selection activated. If @dir is NULL * the last opened (and stored) directory is used (see * visu_ui_getLastOpenDirectory() and visu_ui_setLastOpenDirectory()). * * Returns: (array zero-terminated=1) (transfer full): a newly * allocated array of paths, NULL terminated. Use g_strfreev() to free * it after use. If no directory is selected, then NULL is returned. */ gchar** visu_ui_getSelectedDirectory(GtkWindow *parent, gboolean multiple, const gchar *dir) { GtkWidget *file_selector, *hbox, *wd; gchar **dirnames; char *directory; GSList* names, *tmpLst; int i; /* Create the selector */ if (!parent) parent = visuGtkRender; file_selector = gtk_file_chooser_dialog_new(_("Choose a directory"), parent, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); if (gtkFileChooserWidth > 0 || gtkFileChooserHeight > 0) gtk_window_set_default_size(GTK_WINDOW(file_selector), gtkFileChooserWidth, gtkFileChooserHeight); if (multiple) { hbox = gtk_hbox_new(FALSE, 0); gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(file_selector), hbox); wd = gtk_image_new_from_stock(GTK_STOCK_HELP, GTK_ICON_SIZE_MENU); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); wd = gtk_label_new(""); gtk_box_pack_start(GTK_BOX(hbox), wd, TRUE, TRUE, 5); gtk_misc_set_alignment(GTK_MISC(wd), 0., 0.5); gtk_label_set_use_markup(GTK_LABEL(wd), TRUE); gtk_label_set_markup(GTK_LABEL(wd), _("Choose several" " directories using the" " " "Control key.")); gtk_widget_show_all(hbox); } if (!dir) directory = visu_ui_getLastOpenDirectory(); else directory = (char*)dir; if (directory) { DBG_fprintf(stderr, "Visu Gtk: open a directory chooser, set on '%s'.\n", directory); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(file_selector), directory); } gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(file_selector), multiple); gtk_widget_set_name(file_selector, "filesel"); gtk_window_set_position(GTK_WINDOW(file_selector), GTK_WIN_POS_CENTER_ON_PARENT); gtk_window_set_modal(GTK_WINDOW (file_selector), TRUE); if (gtk_dialog_run (GTK_DIALOG (file_selector)) == GTK_RESPONSE_OK) { names = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(file_selector)); dirnames = g_malloc(sizeof(gchar*) * (g_slist_length(names) + 1)); tmpLst = names; i = 0; while(tmpLst) { dirnames[i] = (gchar*)tmpLst->data; i += 1; tmpLst = g_slist_next(tmpLst); } dirnames[i] = (gchar*)0; g_slist_free(names); } else dirnames = (gchar**)0; gtk_window_get_size(GTK_WINDOW(file_selector), >kFileChooserWidth, >kFileChooserHeight); gtk_widget_destroy (file_selector); return dirnames; } static void free_image(guchar *image, gpointer data _U_) { DBG_fprintf(stderr, "Visu Gtk: free the preview image data.\n"); g_free(image); } static gboolean preview_update(gpointer user_data) { VisuUiPreview *preview = (VisuUiPreview*)user_data; gchar *text, *comment; VisuData *data; gboolean valid; GError *error; VisuPixmapContext *dumpData; GArray* image; GdkPixbuf *pixbuf; VisuRendering *method; VisuNodeArrayIter iter; GtkWidget *wd; VisuUiRenderingWindow *currentWindow; VisuGlView *view; float centre[3]; VisuGlExtNodes *nodes; VisuGlExtBox *box; VisuGlExtBg *bg; g_return_val_if_fail(preview, FALSE); DBG_fprintf(stderr, "Visu Gtk: do a preview %p for VisuData %p.\n", user_data, (gpointer)preview->data); data = preview->data; method = visu_object_getRendering(VISU_OBJECT_INSTANCE); g_return_val_if_fail(method, FALSE); /* We save the current rendering context. */ currentWindow = VISU_UI_RENDERING_WINDOW(visuGtkRenderArea); /* We change the context since loading a new data will generate some changes on the OpenGL rendering. */ dumpData = visu_pixmap_context_new((guint)150, (guint)150); if (!dumpData) { /* We free the VisuData. */ g_object_unref(data); gtk_image_set_from_stock(GTK_IMAGE(preview->image), GTK_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_DIALOG); wd = gtk_label_new(_("Internal error,\nno preview available")); gtk_box_pack_start(GTK_BOX(preview->vbox), wd, FALSE, FALSE, 0); gtk_widget_show_all(wd); preview->table = wd; /* Set the rendering window current for OpenGL. */ visu_ui_rendering_window_setCurrent(currentWindow, TRUE); return FALSE; } error = (GError*)0; valid = visu_rendering_load(method, data, 0, (GCancellable*)0, &error); if (!valid) { gtk_image_set_from_stock(GTK_IMAGE(preview->image), GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG); wd = gtk_label_new(_("Not a V_Sim file")); gtk_box_pack_start(GTK_BOX(preview->vbox), wd, FALSE, FALSE, 0); gtk_widget_show_all(wd); preview->table = wd; } else { if (error) { gtk_image_set_from_stock(GTK_IMAGE(preview->image), GTK_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_DIALOG); wd = gtk_label_new(_("This file has errors")); gtk_box_pack_start(GTK_BOX(preview->vbox), wd, FALSE, FALSE, 0); gtk_widget_show_all(wd); preview->table = wd; g_error_free(error); } else { view = preview->view; g_return_val_if_fail(view, FALSE); visu_gl_initContext(); visu_boxed_setBox(VISU_BOXED(view), VISU_BOXED(data), TRUE); /* Setup extensions for the preview. */ nodes = visu_gl_ext_nodes_new(); visu_gl_ext_nodes_setData(nodes, view, data); box = visu_gl_ext_box_new("box preview"); visu_gl_ext_box_setBox(box, visu_boxed_getBox(VISU_BOXED(data))); bg = visu_gl_ext_bg_new("bg preview"); visu_gl_ext_rebuild(VISU_GL_EXT(nodes)); visu_gl_ext_rebuild(VISU_GL_EXT(box)); visu_gl_ext_fog_create(view, visu_boxed_getBox(VISU_BOXED(data))); visu_gl_ext_rebuild(VISU_GL_EXT(bg)); /* We call the given draw method. */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); visu_box_getCentre(visu_boxed_getBox(VISU_BOXED(data)), centre); glTranslated(-centre[0], -centre[1], -centre[2]); visu_gl_ext_call(VISU_GL_EXT(bg), FALSE); visu_gl_ext_call(VISU_GL_EXT(nodes), FALSE); visu_gl_ext_call(VISU_GL_EXT(box), FALSE); /* We copy the pixmap into generic data. */ image = visu_pixmap_getData((guint)150, (guint)150, FALSE); pixbuf = gdk_pixbuf_new_from_data((guchar*)image->data, GDK_COLORSPACE_RGB, FALSE, 8, 150, 150, 3 * 150, free_image, (gpointer)0); g_array_free(image, FALSE); gtk_image_set_from_pixbuf(GTK_IMAGE(preview->image), pixbuf); g_object_unref(pixbuf); DBG_fprintf(stderr, "Visu GTK: copy data to pixbuf.\n"); /* We reset the flag of material. */ comment = visu_data_getFileCommentary(data, 0); visu_node_array_iterNew(VISU_NODE_ARRAY(data), &iter); preview->table = gtk_table_new(iter.nElements + 1, 2, FALSE); wd = gtk_label_new(_("Box composition:")); gtk_label_set_use_markup(GTK_LABEL(wd), TRUE); gtk_misc_set_alignment(GTK_MISC(wd), 0., 0.5); gtk_table_attach(GTK_TABLE(preview->table), wd, 0, 2, 0, 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 2, 5); for (visu_node_array_iterStart(VISU_NODE_ARRAY(data), &iter); iter.element; visu_node_array_iterNextElement(VISU_NODE_ARRAY(data), &iter)) { DBG_fprintf(stderr, "Visu GTK: setup comment for element '%s' (%p).\n", iter.element->name, (gpointer)iter.element); iter.element->materialIsUpToDate = FALSE; wd = gtk_label_new(""); text = g_markup_printf_escaped (_("%s:"), iter.element->name); gtk_label_set_markup(GTK_LABEL(wd), text); gtk_misc_set_alignment(GTK_MISC(wd), 1., 0.5); g_free(text); gtk_table_attach(GTK_TABLE(preview->table), wd, 0, 1, iter.iElement + 1, iter.iElement + 2, GTK_FILL, GTK_SHRINK, 2, 0); wd = gtk_label_new(""); if (iter.nStoredNodes > 1) text = g_markup_printf_escaped (_("%d nodes"), iter.nStoredNodes); else if (iter.nStoredNodes == 1) text = g_strdup(_("1 node")); else text = g_strdup_printf("negative node number %d", iter.nStoredNodes); gtk_label_set_markup(GTK_LABEL(wd), text); gtk_misc_set_alignment(GTK_MISC(wd), 0., 0.5); g_free(text); gtk_table_attach(GTK_TABLE(preview->table), wd, 1, 2, iter.iElement + 1, iter.iElement + 2, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 2, 0); } if (comment && comment[0]) { wd = gtk_label_new(_("Description:")); gtk_label_set_use_markup(GTK_LABEL(wd), TRUE); gtk_misc_set_alignment(GTK_MISC(wd), 0., 0.5); gtk_table_attach(GTK_TABLE(preview->table), wd, 0, 2, iter.nElements + 2, iter.nElements + 3, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 2, 5); wd = gtk_label_new(""); text = g_markup_printf_escaped("%s", comment); gtk_label_set_markup(GTK_LABEL(wd), text); g_free(text); gtk_misc_set_alignment(GTK_MISC(wd), 0., 0.5); gtk_label_set_justify(GTK_LABEL(wd), GTK_JUSTIFY_FILL); gtk_label_set_line_wrap(GTK_LABEL(wd), TRUE); gtk_widget_set_size_request(wd, 150, -1); gtk_table_attach(GTK_TABLE(preview->table), wd, 0, 2, iter.nElements + 3, iter.nElements + 4, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 2, 0); } gtk_box_pack_start(GTK_BOX(preview->vbox), preview->table, FALSE, FALSE, 0); gtk_widget_show_all(preview->table); g_object_unref(nodes); g_object_unref(box); g_object_unref(bg); } } /* Set the rendering window current for OpenGL. */ visu_ui_rendering_window_setCurrent(currentWindow, TRUE); /* We free the pixmap context. */ visu_pixmap_context_free(dumpData); /* We free the VisuData. */ g_object_unref(data); g_object_unref(preview->view); DBG_fprintf(stderr, "Visu Gtk: end of preview creation.\n"); return FALSE; } /** * visu_ui_preview_update: * @preview: a location on #VisuUiPreview (initialised) ; * @filenames: an array of filenames. * * This routine update the content of the given @preview by making a * rendering in a pixmap of the given filenames. The number of given * filenames must match the number required by the current rendering * method. Only the nodes, the box and the background (plus fog) is * actually previewed. */ void visu_ui_preview_update(VisuUiPreview *preview, const char *filenames[]) { VisuRendering *method; gint nFiles, nb; VisuData *data; VisuGlView *view; DBG_fprintf(stderr, "Visu Gtk: update preview with given filenames.\n"); if (preview->table) { gtk_widget_destroy(preview->table); preview->table = (GtkWidget*)0; } if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(preview->check))) { gtk_image_set_from_pixbuf(GTK_IMAGE(preview->image), (GdkPixbuf*)0); return; } method = visu_object_getRendering(VISU_OBJECT_INSTANCE); g_return_if_fail(method); nb = visu_rendering_getNFileTypes(method); for (nFiles = 0; filenames[nFiles]; nFiles++); if (nFiles < nb) gtk_image_set_from_pixbuf(GTK_IMAGE(preview->image), (GdkPixbuf*)0); else { view = visu_gl_view_new_withSize(150, 150); data = visu_data_new(); for (nFiles = 0; filenames[nFiles]; nFiles++) visu_data_addFile(data, (char*)filenames[nFiles], nFiles, (ToolFileFormat*)0); DBG_fprintf(stderr, "Visu Gtk: create a local" " VisuData %p for preview %p.\n", (gpointer)data, (gpointer)preview); preview->data = data; preview->view = view; preview_update((gpointer)preview); } } static void onPreviewToggled(GtkToggleButton *button, gpointer data _U_) { usePreview = gtk_toggle_button_get_active(button); } /** * visu_ui_preview_add: * @preview: a location on #VisuUiPreview (uninitialised) ; * @chooser: the filechooser the preview must be attached to. * * Create the widgets to have a preview attached to @filechooser. But * the signal raised by @filechooser when previewing is needed is not * attached and this must be done by the user with custom routine. * * Returns: @preview itself. */ VisuUiPreview* visu_ui_preview_add(VisuUiPreview *preview, GtkFileChooser *chooser) { GtkWidget *wd, *frame; g_return_val_if_fail(preview, (VisuUiPreview*)0); preview->vbox = gtk_vbox_new(FALSE, 0); preview->check = gtk_check_button_new_with_mnemonic(_("_Preview:")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(preview->check), usePreview); g_signal_connect(G_OBJECT(preview->check), "toggled", G_CALLBACK(onPreviewToggled), (gpointer)0); gtk_box_pack_start(GTK_BOX(preview->vbox), preview->check, FALSE, FALSE, 5); wd = gtk_alignment_new(0.5, 0.5, 0., 0.); gtk_box_pack_start(GTK_BOX(preview->vbox), wd, TRUE, TRUE, 0); frame = gtk_frame_new(NULL); gtk_widget_set_size_request(frame, 150, 150); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN); gtk_container_add(GTK_CONTAINER(wd), frame); preview->image = gtk_image_new(); gtk_container_add(GTK_CONTAINER(frame), preview->image); preview->table = NULL; gtk_widget_show_all(preview->vbox); gtk_file_chooser_set_preview_widget(chooser, preview->vbox); gtk_file_chooser_set_use_preview_label(chooser, FALSE); gtk_file_chooser_set_preview_widget_active(chooser, TRUE); return preview; } static void update_preview(GtkFileChooser *chooser, VisuUiPreview *preview) { const char *filenames[2]; filenames[0] = gtk_file_chooser_get_preview_filename(chooser); filenames[1] = (char*)0; /* We test if the selected filename is a directory or not. */ if (filenames[0] && !g_file_test(filenames[0], G_FILE_TEST_IS_DIR)) visu_ui_preview_update(preview, filenames); if (filenames[0]) g_free((char*)filenames[0]); } /** * visu_ui_getFileFromDefaultFileChooser: * @data: an allocated #VisuData to store the file names ; * @parent: the parent window of the dialog. * * This method is a default method to launch a file chooser that select * a single file, with the filters of the current RenderingMethod. It creates a * modal dialog, and wait for its reponse. If OK is clicked, the selected * filename is stored. If Cancel is clicked, nothing is done. The * dialog is destroyed after use. * * Returns: FALSE if no file has been set, TRUE if the calling method should * call visu_ui_rendering_window_loadFile(). */ gboolean visu_ui_getFileFromDefaultFileChooser(VisuData *data, GtkWindow *parent) { GtkWidget *fileSelection; GList *filters, *tmpLst; VisuRendering *method; gchar* directory, *filename; ToolFileFormat *selectedFormat; GtkFileFilter *filterDefault; gboolean res; VisuUiPreview preview; g_return_val_if_fail(data, FALSE); DBG_fprintf(stderr, "Visu Gtk: default filechooser for file opening.\n"); method = visu_object_getRendering(VISU_OBJECT_INSTANCE); g_return_val_if_fail(method, FALSE); fileSelection = gtk_file_chooser_dialog_new(_("Load session"), GTK_WINDOW(parent), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); if (gtkFileChooserWidth > 0 || gtkFileChooserHeight > 0) gtk_window_set_default_size(GTK_WINDOW(fileSelection), gtkFileChooserWidth, gtkFileChooserHeight); directory = visu_ui_getLastOpenDirectory(); if (directory) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(fileSelection), directory); gtk_widget_set_name(fileSelection, "filesel"); gtk_window_set_position(GTK_WINDOW(fileSelection), GTK_WIN_POS_CENTER_ON_PARENT); gtk_window_set_modal(GTK_WINDOW(fileSelection), TRUE); /* Create and add the filters. */ tmpLst = visu_rendering_getFileFormat(method, 0); filters = visu_ui_createFilter(tmpLst, fileSelection); g_list_free(tmpLst); /* Create and add the preview. */ visu_ui_preview_add(&preview, GTK_FILE_CHOOSER(fileSelection)); g_signal_connect(GTK_FILE_CHOOSER(fileSelection), "update-preview", G_CALLBACK(update_preview), &preview); if (gtk_dialog_run(GTK_DIALOG(fileSelection)) == GTK_RESPONSE_OK) { /* Get the selected filter. */ selectedFormat = (ToolFileFormat*)0; filterDefault = gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(fileSelection)); tmpLst = filters; while(tmpLst) { if (filterDefault == ((VisuUiFileFilter*)tmpLst->data)->gtkFilter) selectedFormat = ((VisuUiFileFilter*)tmpLst->data)->visuFilter; tmpLst = g_list_next(tmpLst); } filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fileSelection)); visu_data_addFile(data, filename, 0, selectedFormat); g_free(filename); res = TRUE; } else res = FALSE; directory = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(fileSelection)); visu_ui_setLastOpenDirectory((char*)directory, VISU_UI_DIR_FILE); g_free(directory); gtk_window_get_size(GTK_WINDOW(fileSelection), >kFileChooserWidth, >kFileChooserHeight); gtk_widget_destroy(fileSelection); /* Free the filters list. */ tmpLst = filters; while(tmpLst) { g_free(tmpLst->data); tmpLst = g_list_next(tmpLst); } g_list_free(filters); DBG_fprintf(stderr, "Visu Gtk: free load dialog OK.\n"); return res; } static void onDataRendered(VisuObject *obj _U_, VisuData *dataObj, VisuGlView *view _U_, gpointer data) { visu_ui_setWindowTitle(GTK_WINDOW(data), dataObj); } /** * visu_ui_setWindowTitle: * @window: a #GtkWindow object. * @dataObj: a #VisuData object. * * Change the title of the given window, according to @dataObj * (setting usually the name of the loaded file). * * Since: 3.7 **/ void visu_ui_setWindowTitle(GtkWindow *window, const VisuData *dataObj) { gchar *file; if (dataObj) { file = visu_data_getFilesAsLabel(dataObj); if (!file) { g_warning("Can't find the filename to label the rendering window."); file = g_strdup(_("No filename")); } gtk_window_set_title(window, file); g_free(file); } else gtk_window_set_title(window, _("No file loaded")); } /** * visu_ui_createInterface: * @panel: always NULL here. * @renderWindow: a location for a #GtkWindow ; * @renderArea: a location for a #GtkWidget. * * A convenient routine that creates a #VisuUiRenderingWindow alone. To * create also a command panel, visu_ui_main_class_createMain() should be * used instead. */ void visu_ui_createInterface(GtkWindow **panel, GtkWindow **renderWindow, GtkWidget **renderArea) { int width, height; /* Force the creation of the Scale class. */ commandLineGet_XWindowGeometry(&width, &height); DBG_fprintf(stderr,"Visu Gtk: create a rendering window (%dx%d).\n", width, height); *renderArea = visu_ui_rendering_window_new(width, height, FALSE, TRUE); *renderWindow = GTK_WINDOW(visu_ui_buildRenderingWindow(VISU_UI_RENDERING_WINDOW(*renderArea))); g_signal_connect(G_OBJECT(*renderWindow), "delete-event", G_CALLBACK(gtk_main_quit), (gpointer)0); g_signal_connect(G_OBJECT(*renderWindow), "destroy-event", G_CALLBACK(gtk_main_quit), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "dataRendered", G_CALLBACK(onDataRendered), (gpointer)(*renderWindow)); gtk_widget_show(GTK_WIDGET(*renderWindow)); *panel = (GtkWindow*)0; return; } static gboolean onFocus(GtkWidget *wd _U_, GdkEvent *event _U_, gpointer data) { visu_ui_rendering_window_setCurrent(VISU_UI_RENDERING_WINDOW(data), FALSE); return FALSE; } /** * visu_ui_buildRenderingWindow: * @renderWindow: a #VisuUiRenderingWindow object. * * Create a #GtkWindow with V_sim render window icon and wmclass set * to "V_Sim:v_sim_render". It also set the accelerators of * @renderWindow to the newly created window and pack @renderWindow inside. * * Returns: (transfer full): a newly created #GtkWindow. * * Since: 3.7 **/ GtkWidget* visu_ui_buildRenderingWindow(VisuUiRenderingWindow *renderWindow) { GtkWidget *window; gchar *windowRef = "V_Sim"; gchar *window_name = "v_sim_render"; gchar *class_name = "V_Sim"; GdkPixbuf *iconPixBuf; /* We create the rendering window. */ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), windowRef); #if GTK_MAJOR_VERSION > 2 gtk_window_set_has_resize_grip(GTK_WINDOW(window), FALSE); #endif gtk_window_set_wmclass(GTK_WINDOW(window), window_name, class_name); iconPixBuf = gdk_pixbuf_new_from_xpm_data((const char**)icone_observe_xpm); gtk_window_set_icon(GTK_WINDOW(window), iconPixBuf); g_object_unref(iconPixBuf); gtk_window_add_accel_group(GTK_WINDOW(window), visu_ui_rendering_window_getAccelGroup(renderWindow)); gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(renderWindow)); g_signal_connect(G_OBJECT(window), "enter-notify-event", G_CALLBACK(onFocus), (gpointer)renderWindow); return window; } static void initVisuGtk(void) { VisuConfigFileEntry *entry; /* Retrieve the current working directory. */ visuGtkLastDir = g_get_current_dir(); /* Set private variables. */ usePreview = TRUE; entry = visu_config_file_addBooleanEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_PREVIEW, DESC_PARAMETER_PREVIEW, &usePreview); visu_config_file_entry_setVersion(entry, 3.4f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_PARAMETER, exportParameters); visuGtkLoadMethods = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_free); } /** * visu_ui_mainCreate: * @panelFunc: (scope call): function to be called to create the different windows. * * It initializses the GTK part of V_Sim. During this initialisation, * the @panelFunc is called. It should create all the windows needed * by V_Sim, like the command panel and the rendering area. The return * widget is the widget returned itself by @panelFunc. It must be the * main widget: it is the command panel if used, the window containing * the rendering area if no command panel or the rendering area itself * if no container window. * * Returns: the main widget for V_Sim, returned itself by @panelFunc. */ void visu_ui_mainCreate(VisuUiInitWidgetFunc panelFunc) { gchar *message; g_return_if_fail(panelFunc); if (!visuGtkLoadMethods) initVisuGtk(); panelFunc(&visuGtkPanel, &visuGtkRender, &visuGtkRenderArea); g_return_if_fail(visuGtkRender && visuGtkRenderArea); DBG_fprintf(stderr,"--- Initialising plugins ---\n"); visu_plugins_init(); message = visu_basic_parseConfigFiles(visu_ui_rendering_window_getGlView(VISU_UI_RENDERING_WINDOW(visuGtkRenderArea))); if (message) { visu_ui_raiseWarningLong(_("Reading the configuration files"), message, visuGtkRender); g_free(message); } return; } /** * visu_ui_runCommandLine: * @data: a pointer to the command panel (see #VisuUiMain). * * Call the get routines from the command line module and deal with * them. This method is not aware of the panels and is intended to be * called only when the command panel is not used. In the opposite * case, use visu_ui_main_runCommandLine() instead. * * Returns: FALSE always. */ gboolean visu_ui_runCommandLine(gpointer data _U_) { VisuData *obj; VisuGlView *view; VisuBasicCLISet *set; GError *error; obj = visu_ui_rendering_window_getData(VISU_UI_RENDERING_WINDOW(visuGtkRenderArea)); view = visu_ui_rendering_window_getGlView(VISU_UI_RENDERING_WINDOW(visuGtkRenderArea)); if (!obj || !view) return FALSE; set = g_malloc(sizeof(VisuBasicCLISet)); error = (GError*)0; if (!visu_basic_applyCommandLine(obj, view, set, &error)) { visu_ui_raiseWarning(_("Parsing command line"), error->message, (GtkWindow*)0); g_error_free(error); } else visu_basic_createExtensions(obj, view, set, TRUE); VISU_REDRAW_ADD; return FALSE; } /** * visu_ui_createFilter: * @list: (element-type ToolFileFormat*): a GList of #ToolFileFormat ; * @fileChooser: a file chooser to associate filters with. * * Create a list of GtkFileFilter created from the given list of file formats * and attach it to the given @fileChooser. * * Returns: (element-type VisuUiFileFilter) (transfer full): a list of * #VisuUiFileFilter. This list should be freed after use. */ GList* visu_ui_createFilter(GList *list, GtkWidget *fileChooser) { GtkFileFilter *filter, *filterAll; GList *tmpLst; const GList *tmpLst2; const char *name; VisuUiFileFilter *data; GList *returnedFilters; DBG_fprintf(stderr, "Visu Gtk: creating list of filters.\n"); returnedFilters = (GList*)0; filterAll = gtk_file_filter_new (); gtk_file_filter_set_name(filterAll, _("All supported formats")); for (tmpLst = list; tmpLst; tmpLst = g_list_next(tmpLst)) { filter = gtk_file_filter_new (); name = tool_file_format_getLabel((ToolFileFormat*)tmpLst->data); if (name) gtk_file_filter_set_name(filter, name); else gtk_file_filter_set_name(filter, _("No description")); for (tmpLst2 = tool_file_format_getFilePatterns((ToolFileFormat*)tmpLst->data); tmpLst2; tmpLst2 = g_list_next(tmpLst2)) { gtk_file_filter_add_pattern (filter, (gchar*)tmpLst2->data); gtk_file_filter_add_pattern (filterAll, (gchar*)tmpLst2->data); } data = g_malloc(sizeof(VisuUiFileFilter)); data->gtkFilter = filter; data->visuFilter = (ToolFileFormat*)tmpLst->data; returnedFilters = g_list_append(returnedFilters, (gpointer)data); } data = g_malloc(sizeof(VisuUiFileFilter)); data->gtkFilter = filterAll; data->visuFilter = (ToolFileFormat*)0; returnedFilters = g_list_append(returnedFilters, (gpointer)data); filter = gtk_file_filter_new (); gtk_file_filter_set_name(filter, _("All files")); gtk_file_filter_add_pattern (filter, "*"); data = g_malloc(sizeof(VisuUiFileFilter)); data->gtkFilter = filter; data->visuFilter = (ToolFileFormat*)0; returnedFilters = g_list_append(returnedFilters, (gpointer)data); DBG_fprintf(stderr, "Gtk Main : attach list to the given filechooser.\n"); tmpLst = returnedFilters; while(tmpLst) { gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(fileChooser), ((VisuUiFileFilter*)tmpLst->data)->gtkFilter); tmpLst = g_list_next(tmpLst); } gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(fileChooser), filterAll); return returnedFilters; } static void exportParameters(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { g_string_append_printf(data, "# %s\n", DESC_PARAMETER_PREVIEW); g_string_append_printf(data, "%s[gtk]: %d\n\n", FLAG_PARAMETER_PREVIEW, usePreview); } /** * visu_ui_getLastOpenDirectory: * * V_Sim stores the last open directory to set the file chooser to * this one the next time it will come. Use * visu_ui_setLastOpenDirectory() to store it after a GTK_RESPONSE_OK * has been returned by a file chooser and then initialise each new * with this routine. * * Returns: (transfer none): a string owned by V_Sim. */ char* visu_ui_getLastOpenDirectory(void) { DBG_fprintf(stderr, "Visu Gtk: get the last open directory : '%s'.\n", visuGtkLastDir); return visuGtkLastDir; } /** * visu_ui_setLastOpenDirectory: * @directory: a full path to a directory ; * @type: the kind of directory to set the remember flag on. * * V_Sim stores the last open directory to set the file chooser to * this one the next time it will come. Use this routine each time a * file chooser returns GTK_RESPONSE_OK. The given string will be * copied and can be freed after use. */ void visu_ui_setLastOpenDirectory(const char* directory, VisuUiDirectoryType type) { if (visuGtkLastDir) g_free(visuGtkLastDir); if (!g_path_is_absolute(directory)) visuGtkLastDir = g_build_filename(g_get_current_dir(), directory, NULL); else visuGtkLastDir = g_build_filename(directory, NULL); DBG_fprintf(stderr, "Visu Gtk: set the last open directory to '%s', emit signal.\n", visuGtkLastDir); g_signal_emit_by_name(VISU_OBJECT_INSTANCE, "DirectoryChanged", type, NULL); DBG_fprintf(stderr, "Visu Gtk: emission done (DirectoryChanged).\n"); } /** * visu_ui_createPixbuf: * @filename: (type filename): a file name (must be a base name). * * Replace the create_pixbuf() routine from Glade. It looks only in * the default pixmap directory of V_Sim to find the given file. * * Returns: (transfer full): a newly created GdkPixbuf on success. */ GdkPixbuf* visu_ui_createPixbuf(const gchar *filename) { gchar *pathname = NULL; GdkPixbuf *pixbuf; GError *error = NULL; g_return_val_if_fail(filename && filename[0], (GdkPixbuf*)0); pathname = g_build_filename(V_SIM_PIXMAPS_DIR, filename, NULL); pixbuf = gdk_pixbuf_new_from_file(pathname, &error); if (!pixbuf) { g_warning(_("failed to load pixbuf file '%s': %s\n"), pathname, error->message); g_error_free(error); } g_free(pathname); return pixbuf; } /** * visu_ui_getRenderWindow: * * A convenient function to get the rendering area window. * * Returns: (transfer none): a #GtkWindow. */ GtkWindow* visu_ui_getRenderWindow(void) { return visuGtkRender; } /** * visu_ui_getPanel: * * A convenient function to get the command panel window. * * Returns: (transfer none): a #GtkWindow. */ GtkWindow* visu_ui_getPanel(void) { return visuGtkPanel; } /** * visu_ui_getRenderWidget: * * A convenient function to get the rendering area widget. * * Returns: (transfer none): a #GtkWidget. */ GtkWidget* visu_ui_getRenderWidget(void) { return visuGtkRenderArea; } /** * visu_ui_setRenderWidget: * @render: a #VisuUiRenderingWindow widget. * * A convenient function to set the rendering area widget. * * Since: 3.7 */ void visu_ui_setRenderWidget(VisuUiRenderingWindow *render) { visuGtkRenderArea = GTK_WIDGET(render); } /* Store a tree model to remember colors. */ #define COLOR_BOX_WIDTH 16 #define COLOR_BOX_HEIGHT 16 #define COLOR_BOX_BITS 8 /** * tool_color_get_stamp: * @color: a #ToolColor object ; * @alpha: a boolean. * * This method is used by #VisuUiColorCombobox object to create little stamps * representing the color. If the pixbuf of such stamps are needed, use * visu_ui_color_combobox_getPixbufFromColor() if the color is registered in an * already existing #VisuUiColorCombobox object or use this method to create * a new stamp. * * Returns: (transfer full): a pixbuf pointer corresponding to the * little image as shown on a @colorComboBox (use g_object_unref() to * free this pixbuf). * * Since: 3.7 */ GdkPixbuf* tool_color_get_stamp(const ToolColor *color, gboolean alpha) { GdkPixbuf *pixbufColorBox; int rowstride, x, y; guchar *pixels, *p; float grey; pixbufColorBox = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, COLOR_BOX_BITS, COLOR_BOX_WIDTH, COLOR_BOX_HEIGHT); rowstride = gdk_pixbuf_get_rowstride(pixbufColorBox); pixels = gdk_pixbuf_get_pixels(pixbufColorBox); for (y = 0; y < COLOR_BOX_HEIGHT; y++) for (x = 0; x < COLOR_BOX_WIDTH; x++) { p = pixels + y * rowstride + x * 3; if (x < COLOR_BOX_WIDTH / 2) { if (y < COLOR_BOX_HEIGHT / 2) grey = 0.75; else grey = 0.5; } else { if (y < COLOR_BOX_HEIGHT / 2) grey = 0.5; else grey = 0.75; } if (alpha) { p[0] = (guchar)((color->rgba[0] * color->rgba[3] + (1. - color->rgba[3]) * grey) * 255.); p[1] = (guchar)((color->rgba[1] * color->rgba[3] + (1. - color->rgba[3]) * grey) * 255.); p[2] = (guchar)((color->rgba[2] * color->rgba[3] + (1. - color->rgba[3]) * grey) * 255.); } else { p[0] = (guchar)(color->rgba[0] * 255.); p[1] = (guchar)(color->rgba[1] * 255.); p[2] = (guchar)(color->rgba[2] * 255.); } } return pixbufColorBox; } v_sim-3.7.0/src/visu_gtk.h0000644000353400050620000001517612215546105012367 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef VISU_GTK_H #define VISU_GTK_H #include #include #include #include "coreTools/toolColor.h" #include "coreTools/toolFileFormat.h" #include "visu_data.h" #include "visu_rendering.h" #include "gtk_renderingWindowWidget.h" /** * VisuUiNewWidgetFunc: * * This prototype is used whenever a method is required to create a GtkWidget. * * Returns: (transfer full): a newly created GtkWidget. */ typedef GtkWidget* (*VisuUiNewWidgetFunc)(void); /** * VisuUiInitWidgetFunc: * @panel: a location for a #GtkWindow describing the panel. * @renderWindow: a location for a #GtkWindow ; * @renderArea: a location for a #GtkWidget. * * This prototype is used whenever a method is required to initialise * the GTK interface of V_Sim. @panel must be set to point on the * window of the command panel, @renderWindow must point to the window * containing the rendering area (can be the same than @panel) and * @renderArea contains the widget that does the OpenGL rendering. */ typedef void (*VisuUiInitWidgetFunc)(GtkWindow **panel, GtkWindow **renderWindow, GtkWidget **renderArea); void visu_ui_raiseWarning(gchar *action, gchar *message, GtkWindow *window); void visu_ui_raiseWarningLong(gchar *action, gchar *message, GtkWindow *window); /** * VisuUiSetFilesFunc: * @data: a #VisuData to store the informations ; * @parent: the parent window of the dialog. * * Methods that conform to this prototype is used to set filename(s) * to be loaded when the 'load' button is pushed. They can use a * #GtkFileChooser to prompt the user for file names. * * Returns: FALSE if no filename as been set, TRUE if the calling method should * call visu_ui_rendering_window_loadFile(). */ typedef gboolean (*VisuUiSetFilesFunc)(VisuData *data, GtkWindow *parent); void visu_ui_setRenderingSpecificMethod(VisuRendering *method, VisuUiSetFilesFunc methodLoad); VisuUiSetFilesFunc visu_ui_getRenderingSpecificOpen(VisuRendering *method); /** * VisuUiPreview: * @check: the widget used to allow or not preview ; * @image: the #GtkImage with the preview ; * @table: a #GtkTable with file informations ; * @vbox: the #GtkVBox with all the stuff for previewing. * @data: a #VisuData object. * @view: a #VisuGlView object. * * A container for the relevant widgets of the preview area. */ typedef struct _VisuUiPreview VisuUiPreview; struct _VisuUiPreview { GtkWidget *check; GtkWidget *image; GtkWidget *table; GtkWidget *vbox; VisuData *data; VisuGlView *view; }; VisuUiPreview* visu_ui_preview_add(VisuUiPreview *preview, GtkFileChooser *chooser); void visu_ui_preview_update(VisuUiPreview *preview, const char *filenames[]); gchar** visu_ui_getSelectedDirectory(GtkWindow *parent, gboolean multiple, const gchar *dir); gboolean visu_ui_getFileFromDefaultFileChooser(VisuData *data, GtkWindow *parent); void visu_ui_mainCreate(VisuUiInitWidgetFunc panelFunc); gboolean visu_ui_runCommandLine(gpointer data); void visu_ui_wait(void); /** * VisuUiFileFilter: * @gtkFilter: the #GtkFileFilter associate to @visuFilter. * @visuFilter: a #ToolFileFormat object. * * Structure used to associate the V_Sim way to store file filters * with the Gtk way. */ typedef struct _VisuUiFileFilter VisuUiFileFilter; struct _VisuUiFileFilter { GtkFileFilter *gtkFilter; ToolFileFormat* visuFilter; }; GList* visu_ui_createFilter(GList *list, GtkWidget *fileChooser); /** * VisuUiDirectoryType: * @VISU_UI_DIR_FILE: default kind of directory ; * @VISU_UI_DIR_SURFACE: directory for surfaces ; * @VISU_UI_DIR_DATAFILE: directory for data files ; * @VISU_UI_DIR_CONF: directory for configuration files ; * @VISU_UI_DIR_BROWSER: directory used in the browser. * @VISU_UI_DIR_N_VALUES: private. * * V_Sim remembers the last open directory when presenting a new file * selector. This enum is used to specify different kind of * directories. Like that saving a configuration file in a given * directory will not affect the prefered directory for browsing a * list of files. */ typedef enum { VISU_UI_DIR_FILE, VISU_UI_DIR_SURFACE, VISU_UI_DIR_DATAFILE, VISU_UI_DIR_CONF, VISU_UI_DIR_BROWSER, /*< private >*/ VISU_UI_DIR_N_VALUES } VisuUiDirectoryType; gchar* visu_ui_getLastOpenDirectory(void); void visu_ui_setLastOpenDirectory(const char* directory, VisuUiDirectoryType type); GdkPixbuf* visu_ui_createPixbuf(const gchar *filename); GdkPixbuf* tool_color_get_stamp(const ToolColor *color, gboolean alpha); void visu_ui_createInterface(GtkWindow **panel, GtkWindow **renderWindow, GtkWidget **renderArea); void visu_ui_setWindowTitle(GtkWindow *window, const VisuData *dataObj); GtkWidget* visu_ui_buildRenderingWindow(VisuUiRenderingWindow *renderWindow); GtkWindow* visu_ui_getPanel(void); GtkWindow* visu_ui_getRenderWindow(void); GtkWidget* visu_ui_getRenderWidget(void); void visu_ui_setRenderWidget(VisuUiRenderingWindow *render); #endif v_sim-3.7.0/src/gtk_main.c0000644000353400050620000014727612216252211012320 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2006) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include #include #include #include #include #include /* For the access markers R_OK, W_OK ... */ #include #include #include "interface.h" #include "support.h" #include "gtk_main.h" #include "gtk_interactive.h" #include "gtk_pick.h" #include "gtk_pairs.h" #include "gtk_about.h" #include "gtk_save.h" #include "gtk_renderingWindowWidget.h" #include "extraGtkFunctions/gtk_colorComboBoxWidget.h" #include "extraGtkFunctions/gtk_shadeComboBoxWidget.h" #include "extraGtkFunctions/gtk_fieldChooser.h" #include "panelModules/externalModules.h" #include "panelModules/panelBrowser.h" #include "panelModules/panelDataFile.h" #include "panelModules/panelPlanes.h" #include "panelModules/gtkAtomic.h" #include "panelModules/gtkSpin.h" #include "visu_gtk.h" #include "opengl.h" #include "visu_object.h" #include "visu_data.h" #include "visu_configFile.h" #include "visu_basic.h" /* To have loadDataFromFile */ #include "visu_commandLine.h" /* To have getArgFilename and getXWindowGeometry*/ #include "visu_extension.h" #include "visu_plugins.h" #include "coreTools/toolOptions.h" #include "coreTools/toolConfigFile.h" #include "extraFunctions/dataFile.h" #include "extensions/pairs.h" /** * SECTION: gtk_main * @short_description: The command panel definition. * * This is the main interface in V_Sim. It hosts the common action * buttons, like open a file, save resources, switch to interactive * session... It also hosts the different panels. */ /** * VisuUiMain: * * Structure to describe the main interface of V_Sim. */ /* Functions used to set some methods, related to visu_uiMain, such as a * custom load file chooser for each rendering method. */ ToolInitFunc listInitRendenringGtkFunc[] = { visu_ui_panel_elements_atomic_initOpen, visu_ui_panel_elements_spin_initOpen, (ToolInitFunc)0}; enum { DATA_FOCUSED_SIGNAL, LAST_SIGNAL }; static guint visu_ui_main_signals[LAST_SIGNAL]; struct _VisuUiMainClass { GtkWindowClass parent; /* Gestion of the main window positioning. */ gboolean rememberWindowPosition; GHashTable *windowPosition; /* Alert or not when quiting. */ gboolean warningWhenQuit; }; struct VisuUiMain_private_struct { gboolean dispose_has_run; /* Pointers on different inside widgets. */ GtkWidget *loadButton; GtkWidget *checkPairs; GtkWidget *pairsButton; GtkWidget *mouseActions; GtkWidget *saveButton; GtkWidget *quitButton; GtkWidget *aboutButton; GtkWidget *vboxMain; /* Variables. */ gboolean oneWindow; gboolean actionDialogIsShown; }; /* Local object method. */ static void visu_uiMainBase_init (VisuUiMainClass *klass); static void visu_uiMainBase_finalise (VisuUiMainClass *klass); static void visu_uiMainClass_init (VisuUiMainClass *klass); static void visu_ui_main_init (VisuUiMain *obj); static void visu_ui_main_dispose (GObject *obj); static void visu_ui_main_finalize (GObject *obj); /* Local variables. */ static GtkWindowClass *parent_class = NULL; static VisuUiMainClass *my_class = NULL; static VisuUiMain *currentVisuUiMain = NULL; /* Miscelaneous functions with gtk */ static void setRenderingButtonSensitive(VisuUiMain *main, gboolean bool); static void hideWindow(GtkWindow *win); static void showWindow(GtkWindow *win); /* Local callbacks */ static gboolean onHomePressed(GtkWidget *widget _U_, GdkEventKey *event, gpointer data); static void onLoadButtonClicked(VisuUiMain *main, GtkButton *button); static void onPairsCheckToggled(VisuUiMain *main, GtkToggleButton *toggle); static void onPairsButtonClicked(VisuUiMain *main, GtkButton *button); static void onMouseActionsClicked(VisuUiMain *main, GtkButton *button); static void onSaveButtonClicked(VisuUiMain *main, GtkButton *button); static void onQuitButtonClicked(VisuUiMain *main, GtkButton *button); static void onAboutButtonClicked(VisuUiMain *main, GtkButton *button); static void onResourcesLoaded(VisuUiMain *main, VisuData *dataObj, gpointer data); static void onRenderingChanged(VisuUiMain *main, VisuRendering *method, gpointer data); static void onDataReady(VisuObject *obj, VisuData *dataObj, VisuGlView *view, gpointer data); static void onShowActionDialog(VisuUiMain *main, VisuUiRenderingWindow *window); static void onShowMainPanel(VisuUiMain *main, VisuUiRenderingWindow *window); static gboolean onKillPairsDialog(VisuUiMain *main, GdkEvent *event, gpointer data); static gboolean onKillAboutDialog(VisuUiMain *main, GdkEvent *event, gpointer data); static gboolean onKillInteractiveDialog(VisuUiMain *main, GdkEvent *event, gpointer data); static gboolean onKillMainWindowEvent(GtkWidget *widget, GdkEvent *event, gpointer user_data); void onHideNextTime(GtkToggleButton *button, gpointer data); /* Parameter to store the position of windows. */ #define PARAMETER_GTKMAIN_REMEMBER_DEFAULT TRUE /* Parameter to change the policy of the warning quit dialog. */ #define FLAG_PARAMETER_GTKMAIN_QUIT "main_confirmQuit" #define DESC_PARAMETER_GTKMAIN_QUIT "Show up a dialog to confirm when quit button is clicked ; boolean 0 or 1" #define PARAMETER_GTKMAIN_QUIT_DEFAULT TRUE #define FLAG_PARAMETER_GTKMAIN_PANEL "main_panelStatus" #define DESC_PARAMETER_GTKMAIN_PANEL "Attach a panel to a tool window ; panel_name window_name (or None or Main)" static gboolean readMainPanelStatus(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); #define FLAG_PARAMETER_GTKMAIN_DOCK "main_dock" #define DESC_PARAMETER_GTKMAIN_DOCK "Define the characteristic of a dock window ; visibility size(x,y) position(w,h) window_name" static gboolean readMainDock(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static void exportParametersVisuUiMain(GString *data, VisuData *dataObj, VisuGlView *view); /* Number of time V_Sim try to attach the OpenGL context. */ #define VISU_UI_MAIN_N_MAX_OPENGL 10 /*******************/ /* Object methods. */ /*******************/ GType visu_ui_main_get_type(void) { static GType visu_ui_main_type = 0; if (!visu_ui_main_type) { static const GTypeInfo visu_ui_main_info = { sizeof (VisuUiMainClass), (GBaseInitFunc)visu_uiMainBase_init, (GBaseFinalizeFunc)visu_uiMainBase_finalise, (GClassInitFunc)visu_uiMainClass_init, NULL, /* class_finalise */ NULL, /* class_data */ sizeof (VisuUiMain), 0, /* number of prealloc instances */ (GInstanceInitFunc)visu_ui_main_init, NULL }; visu_ui_main_type = g_type_register_static(GTK_TYPE_WINDOW, "VisuUiMain", &visu_ui_main_info, 0); DBG_fprintf(stderr, "Gtk Main: creating the type VisuUiMain %d.\n", (int)visu_ui_main_type); } return visu_ui_main_type; } static void visu_uiMainBase_init (VisuUiMainClass *klass) { DBG_fprintf(stderr, "Gtk Main: creating the base class of the object.\n"); DBG_fprintf(stderr, " - allocate dynamic pointers ;\n"); /* Create the hashtable to store windows and their position. */ klass->windowPosition = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_free); DBG_fprintf(stderr, " - OK\n"); } static void visu_uiMainBase_finalise (VisuUiMainClass *klass) { g_hash_table_destroy(klass->windowPosition); } static void visu_uiMainClass_init(VisuUiMainClass *klass) { int i; VisuConfigFileEntry *resourceEntry; DBG_fprintf(stderr, "Gtk Main: creating the class of the object.\n"); parent_class = g_type_class_peek_parent(klass); my_class = klass; /** * VisuUiMain::DataFocused: * @ui: the object which received the signal ; * @dataObj: the newly associated #VisuData object. * * This signal is emitted when @dataObj has been displayed on the * rendering window and is ready for use. * * Since: 3.7 */ visu_ui_main_signals[DATA_FOCUSED_SIGNAL] = g_signal_new("DataFocused", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0 , NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); /* Connect freeing methods. */ G_OBJECT_CLASS(klass)->dispose = visu_ui_main_dispose; G_OBJECT_CLASS(klass)->finalize = visu_ui_main_finalize; /* Initialise internal variables. */ DBG_fprintf(stderr, " - initialise the panel specific areas ;\n"); for (i = 0; listInitRendenringGtkFunc[i]; i++) listInitRendenringGtkFunc[i](); /* Add the config file entries. */ DBG_fprintf(stderr, " - add config file entries ;\n"); resourceEntry = visu_config_file_addBooleanEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_GTKMAIN_QUIT, DESC_PARAMETER_GTKMAIN_QUIT, &klass->warningWhenQuit); visu_config_file_entry_setVersion(resourceEntry, 3.3f); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_GTKMAIN_PANEL, DESC_PARAMETER_GTKMAIN_PANEL, 1, readMainPanelStatus); visu_config_file_entry_setVersion(resourceEntry, 3.3f); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_GTKMAIN_DOCK, DESC_PARAMETER_GTKMAIN_DOCK, 1, readMainDock); visu_config_file_entry_setVersion(resourceEntry, 3.3f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_PARAMETER, exportParametersVisuUiMain); /* Set static parameters. */ DBG_fprintf(stderr, " - miscelaneous ;\n"); klass->rememberWindowPosition = PARAMETER_GTKMAIN_REMEMBER_DEFAULT; klass->warningWhenQuit = PARAMETER_GTKMAIN_QUIT_DEFAULT; /* Set the pixmap directory for the Glade stuff. */ add_pixmap_directory(V_SIM_PIXMAPS_DIR); /* Force the creation of the VisuUiColorComboboxClass. */ g_type_class_ref(visu_ui_color_combobox_get_type()); g_type_class_ref(VISU_UI_TYPE_FIELD_CHOOSER); } static void _buildWidgets(VisuUiMain *obj, gboolean oneWindow) { int width, height; int i; GtkWidget *vbox, *hbox, *hbox2, *wd, *align, *image, *label, *pane; VisuUiPanel *panel; VisuUiDockWindow *dockMain; #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkTooltips *tooltips; tooltips = gtk_tooltips_new (); #endif currentVisuUiMain = obj; /* Private data. */ DBG_fprintf(stderr, "--- Initialising the GTK interface ---\n"); DBG_fprintf(stderr, " | Gtk Main"); gtk_window_set_title(GTK_WINDOW(obj), _("Command panel")); gtk_window_set_wmclass(GTK_WINDOW(obj), "v_sim_commandPanel", "V_Sim"); obj->private->vboxMain = gtk_vbox_new(FALSE, 0); gtk_widget_set_size_request(obj->private->vboxMain, 350, -1); gtk_container_set_border_width(GTK_CONTAINER(obj->private->vboxMain), 7); obj->private->oneWindow = oneWindow; DBG_fprintf(stderr,"--- Initialising the rendering window ---\n"); commandLineGet_XWindowGeometry(&width, &height); obj->renderingWindow = visu_ui_rendering_window_new(width, height, obj->private->oneWindow, TRUE); g_signal_connect_swapped(G_OBJECT(obj->renderingWindow), "show-action-dialog", G_CALLBACK(onShowActionDialog), (gpointer)obj); g_signal_connect_swapped(G_OBJECT(obj->renderingWindow), "show-main-panel", G_CALLBACK(onShowMainPanel), (gpointer)obj); if (oneWindow) { pane = gtk_hpaned_new(); gtk_container_add(GTK_CONTAINER(obj), pane); gtk_widget_show(pane); gtk_paned_pack1(GTK_PANED(pane), obj->private->vboxMain, FALSE, FALSE); gtk_paned_pack2(GTK_PANED(pane), obj->renderingWindow, TRUE, TRUE); } else gtk_container_add(GTK_CONTAINER(obj), obj->private->vboxMain); wd = gtk_frame_new(_("Actions")); gtk_box_pack_end(GTK_BOX(obj->private->vboxMain), wd, FALSE, FALSE, 0); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(wd), vbox); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(hbox), 5); obj->private->loadButton = gtk_button_new_from_stock(GTK_STOCK_OPEN); gtk_box_pack_start(GTK_BOX(hbox), obj->private->loadButton, TRUE, TRUE, 0); gtk_widget_set_sensitive(obj->private->loadButton, FALSE); gtk_widget_set_tooltip_text(obj->private->loadButton, _("Select a file to render.")); align = gtk_alignment_new(0.5, 0.5, 1., 0.); gtk_box_pack_start(GTK_BOX(hbox), align, TRUE, TRUE, 10); hbox2 = gtk_hbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(align), hbox2); obj->private->checkPairs = gtk_check_button_new(); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(obj->private->checkPairs), visu_gl_ext_getActive(VISU_GL_EXT(visu_gl_ext_pairs_getDefault()))); gtk_box_pack_start(GTK_BOX(hbox2), obj->private->checkPairs, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(obj->private->checkPairs, _("Check to draw pairs between elements.")); obj->private->pairsButton = gtk_button_new(); gtk_widget_set_sensitive(obj->private->pairsButton, FALSE); gtk_box_pack_start(GTK_BOX(hbox2), obj->private->pairsButton, TRUE, TRUE, 0); gtk_widget_set_tooltip_text(obj->private->pairsButton, _("Configure parameters for bindings such as color, thickness...")); align = gtk_alignment_new(0.5, 0.5, 0., 0.); gtk_container_add(GTK_CONTAINER(obj->private->pairsButton), align); wd = gtk_hbox_new(FALSE, 2); gtk_container_add(GTK_CONTAINER(align), wd); image = gtk_image_new_from_stock(GTK_STOCK_CONVERT, GTK_ICON_SIZE_BUTTON); gtk_box_pack_start(GTK_BOX(wd), image, FALSE, FALSE, 0); label = gtk_label_new_with_mnemonic(_("_Pairs")); gtk_box_pack_start(GTK_BOX(wd), label, FALSE, FALSE, 0); obj->private->mouseActions = gtk_button_new(); gtk_widget_set_sensitive(obj->private->mouseActions, FALSE); gtk_box_pack_start(GTK_BOX(hbox), obj->private->mouseActions, TRUE, TRUE, 0); gtk_widget_set_tooltip_text(obj->private->mouseActions, _("Use the mouse to change the view and get position informations.")); align = gtk_alignment_new(0.5, 0.5, 0., 0.); gtk_container_add(GTK_CONTAINER(obj->private->mouseActions), align); wd = gtk_hbox_new(FALSE, 2); gtk_container_add(GTK_CONTAINER(align), wd); image = gtk_image_new_from_stock(GTK_STOCK_ZOOM_FIT, GTK_ICON_SIZE_BUTTON); gtk_box_pack_start(GTK_BOX(wd), image, FALSE, FALSE, 0); label = gtk_label_new_with_mnemonic(_("Mouse _actions")); gtk_box_pack_start(GTK_BOX(wd), label, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(hbox), 5); obj->private->saveButton = gtk_button_new(); gtk_box_pack_start(GTK_BOX(hbox), obj->private->saveButton, TRUE, TRUE, 5); gtk_widget_set_tooltip_text(obj->private->saveButton, _("Click to save the parameters or the resources.")); align = gtk_alignment_new(0.5, 0.5, 0., 0.); gtk_container_add(GTK_CONTAINER(obj->private->saveButton), align); wd = gtk_hbox_new(FALSE, 2); gtk_container_add(GTK_CONTAINER(align), wd); image = gtk_image_new_from_stock(GTK_STOCK_EDIT, GTK_ICON_SIZE_BUTTON); gtk_box_pack_start(GTK_BOX(wd), image, FALSE, FALSE, 0); label = gtk_label_new_with_mnemonic(_("_Config. files")); gtk_box_pack_start(GTK_BOX(wd), label, FALSE, FALSE, 0); obj->private->quitButton = gtk_button_new_from_stock(GTK_STOCK_QUIT); gtk_box_pack_start(GTK_BOX(hbox), obj->private->quitButton, TRUE, TRUE, 5); obj->private->aboutButton = gtk_button_new(); gtk_box_pack_start(GTK_BOX(hbox), obj->private->aboutButton, FALSE, FALSE, 15); gtk_widget_set_tooltip_text(obj->private->aboutButton, _("V_Sim program. Written by L. Billard, modified by D. Caliste.")); gtk_button_set_relief(GTK_BUTTON(obj->private->aboutButton), GTK_RELIEF_NONE); image = create_pixmap(GTK_WIDGET(obj), "logo_petit.png"); gtk_container_add(GTK_CONTAINER(obj->private->aboutButton), image); g_signal_connect_swapped(G_OBJECT(obj->private->loadButton), "clicked", G_CALLBACK(onLoadButtonClicked), (gpointer)obj); g_signal_connect_swapped(G_OBJECT(obj->private->checkPairs), "toggled", G_CALLBACK(onPairsCheckToggled), (gpointer)obj); g_signal_connect_swapped(G_OBJECT(obj->private->pairsButton), "clicked", G_CALLBACK(onPairsButtonClicked), (gpointer)obj); g_signal_connect_swapped(G_OBJECT(obj->private->mouseActions), "clicked", G_CALLBACK(onMouseActionsClicked), (gpointer)obj); g_signal_connect_swapped(G_OBJECT(obj->private->saveButton), "clicked", G_CALLBACK(onSaveButtonClicked), (gpointer)obj); g_signal_connect_swapped(G_OBJECT(obj->private->quitButton), "clicked", G_CALLBACK(onQuitButtonClicked), (gpointer)obj); g_signal_connect_swapped(G_OBJECT(obj->private->aboutButton), "clicked", G_CALLBACK(onAboutButtonClicked), (gpointer)obj); g_signal_connect(G_OBJECT(obj), "delete-event", G_CALLBACK(onKillMainWindowEvent), (gpointer)obj); g_signal_connect(G_OBJECT(obj), "destroy-event", G_CALLBACK(onKillMainWindowEvent), (gpointer)obj); g_signal_connect_swapped(VISU_OBJECT_INSTANCE, "resourcesLoaded", G_CALLBACK(onResourcesLoaded), (gpointer)obj); g_signal_connect_after(VISU_OBJECT_INSTANCE, "dataRendered", G_CALLBACK(onDataReady), (gpointer)obj); g_signal_connect_swapped(VISU_OBJECT_INSTANCE, "renderingChanged", G_CALLBACK(onRenderingChanged), (gpointer)obj); onRenderingChanged(obj, visu_object_getRendering(VISU_OBJECT_INSTANCE), (gpointer)0); DBG_fprintf(stderr, " ... OK.\n"); /* init the sub panel contains. */ dockMain = visu_ui_panel_class_getCommandPanel(); wd = visu_ui_dock_window_getContainer(dockMain); gtk_box_pack_start(GTK_BOX(obj->private->vboxMain), wd, TRUE, TRUE, 0); /* Show all. */ gtk_widget_show_all(obj->private->vboxMain); for (i = 0; panelListAll[i]; i++) { panel = panelListAll[i](obj); if (!panel) { g_error("Can't initialise subpanel number %d.\n", i); } visu_ui_panel_attach(panel, dockMain); if (i == 0) gtk_notebook_set_current_page(GTK_NOTEBOOK(visu_ui_dock_window_getNotebook(dockMain)), 0); DBG_fprintf(stderr, "Gtk Main: initialise '%s' subpanel OK.\n", visu_ui_panel_getLabel(panel)); } DBG_fprintf(stderr, "Gtk Main: build widgets OK.\n"); } static void visu_ui_main_init(VisuUiMain *obj) { DBG_fprintf(stderr, "Gtk Main: initializing a new object (%p).\n", (gpointer)obj); obj->private = g_malloc(sizeof(VisuUiMain_private)); obj->private->dispose_has_run = FALSE; /* Public data. */ obj->renderingWindow = (GtkWidget*)0; obj->pairsDialog = (GtkWidget*)0; obj->interactiveDialog = (GtkWidget*)0; obj->aboutDialog = (GtkWidget*)0; /* Private variables. */ obj->private->oneWindow = FALSE; obj->private->actionDialogIsShown = FALSE; g_signal_connect(G_OBJECT(obj), "key-press-event", G_CALLBACK(onHomePressed), (gpointer)obj); /* Others elements linked to the main window. */ DBG_fprintf(stderr, " | Gtk Interactive\n"); visu_ui_interactive_init(); DBG_fprintf(stderr, " | Gtk Pairs\n"); visu_ui_pairs_init(); } /* This method can be called several times. It should unref all of its reference to GObjects. */ static void visu_ui_main_dispose(GObject* obj) { VisuUiMain *mainUI; DBG_fprintf(stderr, "Gtk Main: dispose object %p.\n", (gpointer)obj); mainUI = VISU_UI_MAIN(obj); if (mainUI->private->dispose_has_run) return; mainUI->private->dispose_has_run = TRUE; if (mainUI->renderingWindow && !mainUI->private->oneWindow) { DBG_fprintf(stderr, "Gtk Main: destroying the rendering window.\n"); gtk_widget_destroy(mainUI->renderingWindow); } DBG_fprintf(stderr, "Gtk Main: destroying the dialogs.\n"); if (mainUI->pairsDialog) gtk_widget_destroy(mainUI->pairsDialog); if (mainUI->interactiveDialog) gtk_widget_destroy(mainUI->interactiveDialog); if (mainUI->aboutDialog) gtk_widget_destroy(mainUI->aboutDialog); /* Finish panels. */ visu_ui_panel_axes_setAxesExtension((VisuGlExtAxes*)0); DBG_fprintf(stderr, "Gtk Main: chain to parent.\n"); G_OBJECT_CLASS(parent_class)->dispose(obj); DBG_fprintf(stderr, "Gtk Main: dispose done.\n"); } /* This method is called once only. */ static void visu_ui_main_finalize(GObject* obj) { g_return_if_fail(obj); DBG_fprintf(stderr, "Gtk Main: finalize object %p.\n", (gpointer)obj); /* Chain up to the parent class */ G_OBJECT_CLASS(parent_class)->finalize(obj); DBG_fprintf(stderr, "Gtk Main: freeing ... OK.\n"); } GtkWidget* visu_ui_main_new(gboolean oneWindow) { VisuUiMain *commandPanel; commandPanel = VISU_UI_MAIN(g_object_new(VISU_UI_TYPE_MAIN, NULL)); if (!commandPanel) return (GtkWidget*)0; _buildWidgets(commandPanel, oneWindow); return GTK_WIDGET(commandPanel); } /*******************/ /* Local callbacks */ /*******************/ static gboolean onHomePressed(GtkWidget *widget, GdkEventKey *event, gpointer data _U_) { GtkWidget *focus; DBG_fprintf(stderr, "Gtk Main: get key pressed.\n"); if(event->keyval == GDK_KEY_Home && !VISU_UI_MAIN(data)->private->oneWindow) { focus = gtk_window_get_focus(GTK_WINDOW(widget)); if (GTK_IS_EDITABLE(focus)) return FALSE; gtk_window_present(visu_ui_getRenderWindow()); return TRUE; } return FALSE; } static void onShowMainPanel(VisuUiMain *main, VisuUiRenderingWindow *window _U_) { if (main->private->actionDialogIsShown) gtk_window_present(GTK_WINDOW(main->interactiveDialog)); else gtk_window_present(GTK_WINDOW(main)); } static void onLoadButtonClicked(VisuUiMain *main, GtkButton *button _U_) { visu_ui_rendering_window_open(VISU_UI_RENDERING_WINDOW(main->renderingWindow), GTK_WINDOW(main)); } static void onPairsCheckToggled(VisuUiMain *main, GtkToggleButton *toggle) { gboolean res; VisuUiRenderingWindow *window; VisuData *dataObj; VisuGlView *view; res = gtk_toggle_button_get_active(toggle); visu_gl_ext_setActive(VISU_GL_EXT(visu_gl_ext_pairs_getDefault()), res); if (res) { window = VISU_UI_RENDERING_WINDOW(main->renderingWindow); dataObj = visu_ui_rendering_window_getData(window); view = visu_ui_rendering_window_getGlView(window); if (dataObj && view) { visu_gl_ext_pairs_draw(visu_gl_ext_pairs_getDefault()); VISU_REDRAW_ADD; } } else VISU_REDRAW_ADD; } static void onPairsCloseClicked(VisuUiMain *main, GtkButton *button _U_) { hideWindow(GTK_WINDOW(main->pairsDialog)); } static gboolean onKillPairsDialog(VisuUiMain *main, GdkEvent *event _U_, gpointer data _U_) { hideWindow(GTK_WINDOW(main->pairsDialog)); return TRUE; } static void onPairsButtonClicked(VisuUiMain *main, GtkButton *button _U_) { GtkWidget *wd; if (!main->pairsDialog) { visu_ui_pairs_initBuild(main); wd = lookup_widget(main->pairsDialog, "closebutton3"); g_signal_connect_swapped(G_OBJECT(wd), "clicked", G_CALLBACK(onPairsCloseClicked), (gpointer)main); g_signal_connect_swapped(G_OBJECT(main->pairsDialog), "delete-event", G_CALLBACK(onKillPairsDialog), (gpointer)main); g_signal_connect_swapped(G_OBJECT(main->pairsDialog), "destroy-event", G_CALLBACK(onKillPairsDialog), (gpointer)main); } visu_ui_pairs_update (main, visu_ui_rendering_window_getData(VISU_UI_RENDERING_WINDOW(main->renderingWindow)), TRUE); showWindow(GTK_WINDOW(main->pairsDialog)); visu_ui_pairs_show(main); } static void onActionsCloseClicked(VisuUiMain *main, GtkButton *button _U_) { hideWindow(GTK_WINDOW(main->interactiveDialog)); main->private->actionDialogIsShown = FALSE; if (!main->private->oneWindow) showWindow(GTK_WINDOW(main)); } static gboolean onKillInteractiveDialog(VisuUiMain *main, GdkEvent *event _U_, gpointer data _U_) { onActionsCloseClicked(main, (GtkButton*)0); return TRUE; } static void _raiseMouseActionDialog(VisuUiMain *main, VisuUiRenderingWindow *window) { gint posx, posy; if (!main->interactiveDialog) visu_ui_main_buildInteractiveDialog(main); /* Start new pick & observe session. */ visu_ui_interactive_start(window); if (!main->private->oneWindow) { gtk_window_get_position(GTK_WINDOW(main), &posx, &posy); DBG_fprintf(stderr, "Gtk Main: get command panel position" " (%d,%d).\n", posx, posy); hideWindow(GTK_WINDOW(main)); DBG_fprintf(stderr, "Gtk Main: set observe position (%d,%d).\n", posx, posy); gtk_window_move(GTK_WINDOW(main->interactiveDialog), posx, posy); } showWindow(GTK_WINDOW(main->interactiveDialog)); main->private->actionDialogIsShown = TRUE; } static void onMouseActionsClicked(VisuUiMain *main, GtkButton *button _U_) { _raiseMouseActionDialog(main, VISU_UI_RENDERING_WINDOW(main->renderingWindow)); } static void onShowActionDialog(VisuUiMain *main, VisuUiRenderingWindow *window) { _raiseMouseActionDialog(main, window); } static void onSaveButtonClicked(VisuUiMain *main _U_, GtkButton *button _U_) { visu_ui_save_initBuild(); } static void onQuitButtonClicked(VisuUiMain *main, GtkButton *button _U_) { visu_ui_main_quit(main, FALSE); } static gboolean onKillAboutDialog(VisuUiMain *main, GdkEvent *event _U_, gpointer data _U_) { hideWindow(GTK_WINDOW(main->aboutDialog)); return TRUE; } static void onAboutButtonClicked(VisuUiMain *main, GtkButton *button _U_) { if (!main->aboutDialog) { visu_ui_about_initBuild(main); g_signal_connect_swapped(G_OBJECT(main->aboutDialog), "delete-event", G_CALLBACK(onKillAboutDialog), (gpointer)main); g_signal_connect_swapped(G_OBJECT(main->aboutDialog), "destroy-event", G_CALLBACK(onKillAboutDialog), (gpointer)main); } showWindow(GTK_WINDOW(main->aboutDialog)); } static void setRenderingButtonSensitive(VisuUiMain *main, gboolean bool) { g_return_if_fail(VISU_UI_IS_MAIN_TYPE(main)); gtk_widget_set_sensitive(main->private->pairsButton, bool); gtk_widget_set_sensitive(main->private->mouseActions, bool); } static void onDataReady(VisuObject *obj _U_, VisuData *dataObj, VisuGlView *view, gpointer data) { VisuUiMain *mainObj = VISU_UI_MAIN(data); setRenderingButtonSensitive(mainObj, (dataObj != (VisuData*)0)); visu_ui_panel_class_setCurrent(dataObj, view); g_signal_emit(G_OBJECT(mainObj), visu_ui_main_signals[DATA_FOCUSED_SIGNAL], 0, dataObj, NULL); } static void onResourcesLoaded(VisuUiMain *main, VisuData *dataObj _U_, gpointer data _U_) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(main->private->checkPairs), visu_gl_ext_getActive(VISU_GL_EXT(visu_gl_ext_pairs_getDefault()))); } static void onRenderingChanged(VisuUiMain *main, VisuRendering *method, gpointer data _U_) { DBG_fprintf(stderr, "Gtk Main: caught 'renderingChanged' signal.\n"); gtk_widget_set_sensitive(main->private->loadButton, (method != (VisuRendering*)0)); setRenderingButtonSensitive(main, FALSE); } static gboolean onKillMainWindowEvent(GtkWidget *widget _U_, GdkEvent *event _U_, gpointer user_data) { visu_ui_main_quit(VISU_UI_MAIN(user_data), FALSE); return TRUE; } /*****************/ /* Miscellaneous */ /*****************/ void visu_ui_main_buildInteractiveDialog(VisuUiMain *main) { GtkWidget *wd; g_return_if_fail(VISU_UI_IS_MAIN_TYPE(main) && !main->interactiveDialog); visu_ui_interactive_initBuild(main); wd = lookup_widget(main->interactiveDialog, "buttonBackToCommandPanel"); g_signal_connect_swapped(G_OBJECT(wd), "clicked", G_CALLBACK(onActionsCloseClicked), (gpointer)main); g_signal_connect_swapped(G_OBJECT(main->interactiveDialog), "delete-event", G_CALLBACK(onKillInteractiveDialog), (gpointer)main); g_signal_connect_swapped(G_OBJECT(main->interactiveDialog), "destroy-event", G_CALLBACK(onKillInteractiveDialog), (gpointer)main); } /* This method hides the specified window and save its coordinates if it is specified by a parameter. */ static void hideWindow(GtkWindow *win) { int *val; if (!win) return; if (my_class->rememberWindowPosition) { val = (int*)g_hash_table_lookup(my_class->windowPosition, win); if (!val) { val = g_malloc(sizeof(int) * 2); g_hash_table_insert(my_class->windowPosition, (gpointer)win, (gpointer)val); } gtk_window_get_position(win, &val[0], &val[1]); DBG_fprintf(stderr, "Gtk Main : store position (%d,%d) for window %d.\n", val[0], val[1], GPOINTER_TO_INT(win)); } gtk_widget_hide(GTK_WIDGET(win)); } /* This method shows the specified window and try to put it at its former position if the good parameter is used. */ static void showWindow(GtkWindow *win) { int *val; if (!win) return; if (my_class->rememberWindowPosition) { val = (int*)g_hash_table_lookup(my_class->windowPosition, win); if (val) { gtk_window_move(win, val[0], val[1]); DBG_fprintf(stderr, "Gtk Main : set position (%d,%d) for window %d.\n", val[0], val[1], GPOINTER_TO_INT(win)); } } gtk_window_present(win); } void onHideNextTime(GtkToggleButton *button, gpointer data) { char *posNext; gchar *path, *bufferR, *pos; GString *bufferW, *bufferW2; gboolean resOk; int lines; GIOChannel *file; GError *err; gsize taille; GIOStatus statOK; g_return_if_fail(data); path = (gchar*)data; DBG_fprintf(stderr, "Gtk Main : change the warning dialog parameter in file '%s'.\n", path); my_class->warningWhenQuit = !gtk_toggle_button_get_active(button); /* If no file exists in the given path, we create it. */ if (!g_file_test(path, G_FILE_TEST_EXISTS)) { err = (GError*)0; resOk = visu_config_file_save(VISU_CONFIG_FILE_PARAMETER, path, &lines, (VisuData*)0, (VisuGlView*)0, &err); if (!resOk) { visu_ui_raiseWarningLong(_("Saving a file"), err->message, (GtkWindow*)0); g_error_free(err); } return; } /* If a parameter file already exist, we then just change the right line. */ bufferR = (gchar*)0; err = (GError*)0; if (!g_file_get_contents(path, &bufferR, &taille, &err)) { visu_ui_raiseWarningLong(_("Saving a file"), err->message, (GtkWindow*)0); g_error_free(err); return; } /* We reopen the channel in write acces. */ err = (GError*)0; file = g_io_channel_new_file(path, "w", &err); if (err) { visu_ui_raiseWarningLong(_("Saving a file"), err->message, (GtkWindow*)0); g_error_free(err); return; } g_return_if_fail(bufferR); bufferW = g_string_new(bufferR); g_free(bufferR); /* Try to find the flag of the parameter. */ pos = g_strrstr(bufferW->str, "\n"FLAG_PARAMETER_GTKMAIN_QUIT); if (!pos) { /* We append it at the end of the file. */ DBG_fprintf(stderr, " | Can't find the option, appending it.\n"); exportParametersVisuUiMain(bufferW, (VisuData*)0, (VisuGlView*)0); err = (GError*)0; statOK = g_io_channel_write_chars(file, bufferW->str, -1, &taille, &err); if (statOK != G_IO_STATUS_NORMAL && err) { visu_ui_raiseWarningLong(_("Saving a file"), err->message, (GtkWindow*)0); g_error_free(err); } } else { DBG_fprintf(stderr, " | ToolOption found, changing its value.\n"); /* We erase the line and rewrite it. */ *(pos + 1) = '\0'; bufferW2 = g_string_new(bufferW->str); g_string_append_printf(bufferW2, "%s[gtk]: %i\n", FLAG_PARAMETER_GTKMAIN_QUIT, (int)my_class->warningWhenQuit); posNext = strstr(pos + 2, "\n"); if (posNext) g_string_append(bufferW2, posNext + 1); err = (GError*)0; statOK = g_io_channel_write_chars(file, bufferW2->str, -1, &taille, &err); if (err) { visu_ui_raiseWarningLong(_("Saving a file"), err->message, (GtkWindow*)0); g_error_free(err); } g_string_free(bufferW2, TRUE); } g_io_channel_shutdown(file, TRUE, (GError**)0); g_io_channel_unref(file); g_string_free(bufferW, TRUE); } static void onAddHomedir(GtkButton *button _U_, gpointer quitDialog) { GtkWidget *wd; GList *dirs, *tmplst; gchar *path; #if SYSTEM_X11 == 1 #define PERMS (S_IRWXU | S_IRGRP | S_IXGRP) #endif #if SYSTEM_WIN32 == 1 #define PERMS 0 #endif DBG_fprintf(stderr, "Gtk Main: try to create the local home directory.\n"); #if GLIB_MINOR_VERSION > 7 if (g_mkdir_with_parents(V_SIM_LOCAL_CONF_DIR, PERMS)) #else #if SYSTEM_X11 == 1 if (mkdir(V_SIM_LOCAL_CONF_DIR, PERMS)) #endif #if SYSTEM_WIN32 == 1 if (mkdir(V_SIM_LOCAL_CONF_DIR)) #endif #endif /* Failed. */ visu_ui_raiseWarning(_("I/O"), _("Can't create the directory '$XDG_CONFIG_HOME/v_sim'."), (GtkWindow*)0); else { /* Succeed hide the warning. */ wd = lookup_widget(GTK_WIDGET(quitDialog), "hboxHomedir"); gtk_widget_hide(wd); /* Retest the path. */ dirs = (GList*)0; dirs = g_list_prepend(dirs, (gpointer)V_SIM_DATA_DIR); dirs = g_list_prepend(dirs, (gpointer)V_SIM_LOCAL_CONF_DIR); tmplst = dirs; path = (gchar*)0; path = visu_config_file_getNextValidPath(VISU_CONFIG_FILE_PARAMETER, W_OK, &tmplst, 0); if (path) { wd = lookup_widget(GTK_WIDGET(quitDialog), "hboxWarning"); gtk_widget_hide(wd); wd = lookup_widget(GTK_WIDGET(quitDialog), "checkbuttonHideNextTime"); gtk_widget_set_sensitive(wd, TRUE); g_signal_connect(G_OBJECT(wd), "toggled", G_CALLBACK(onHideNextTime), (gpointer)path); } g_list_free(dirs); } } static void freeAllAndStop(VisuUiMain *main) { DBG_fprintf(stderr, "Gtk Main: kill command panel.\n"); gtk_widget_destroy(GTK_WIDGET(main)); DBG_fprintf(stderr, "Gtk Main: stopping GTK and that's all.\n"); gtk_main_quit(); } void visu_ui_main_quit(VisuUiMain *main, gboolean force) { GtkWidget *quitDialog, *wd; GList *dirs, *tmplst; gchar *path; if (force || !my_class->warningWhenQuit) { freeAllAndStop(main); return; } quitDialog = create_quitDialog(); gtk_window_set_transient_for(GTK_WINDOW(quitDialog), GTK_WINDOW(main)); /* Try to find installDir/v_sim.par or $XDG_CONFIG_HOME/v_sim/v_sim.par that is writable to store the preference of the hiding mode of the dialog. */ dirs = (GList*)0; dirs = g_list_prepend(dirs, (gpointer)V_SIM_DATA_DIR); dirs = g_list_prepend(dirs, (gpointer)V_SIM_LOCAL_CONF_DIR); tmplst = dirs; path = (gchar*)0; path = visu_config_file_getNextValidPath(VISU_CONFIG_FILE_PARAMETER, W_OK, &tmplst, 0); if (!path) { wd = lookup_widget(quitDialog, "hboxWarning"); gtk_widget_show(wd); } g_list_free(dirs); /* Attach a create the homedir method to the button. */ wd = lookup_widget(quitDialog, "buttonAddHomedir"); g_signal_connect(G_OBJECT(wd), "clicked", G_CALLBACK(onAddHomedir), (gpointer)quitDialog); /* Show the warning if the homedir is not existing and no path was found. */ if (!g_file_test(V_SIM_LOCAL_CONF_DIR, G_FILE_TEST_IS_DIR) && !path) { wd = lookup_widget(quitDialog, "hboxHomedir"); gtk_widget_show(wd); } /* Attach a modify the parameter to the checkbox. */ wd = lookup_widget(quitDialog, "checkbuttonHideNextTime"); if (!path) gtk_widget_set_sensitive(wd, FALSE); else g_signal_connect(G_OBJECT(wd), "toggled", G_CALLBACK(onHideNextTime), (gpointer)path); if (gtk_dialog_run(GTK_DIALOG(quitDialog)) == GTK_RESPONSE_OK) freeAllAndStop(main); else gtk_widget_destroy(quitDialog); } static gboolean readMainPanelStatus(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { gchar **tokens; VisuUiPanel *toolpanel; char *pt; g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readString(lines[0], position, &tokens, 2, TRUE, error)) return FALSE; toolpanel = visu_ui_panel_class_getPanelById(tokens[0]); if (toolpanel) { pt = strchr(tokens[1], '\n'); if (pt) *pt = ' '; visu_ui_panel_setContainerId(toolpanel, g_strchomp(tokens[1])); } g_strfreev(tokens); return TRUE; } static gboolean readMainDock(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { int res; gchar **tokens, *values; gboolean visible; int x, y, width, height; VisuUiDockWindow *dock; g_return_val_if_fail(nbLines == 1, FALSE); tokens = g_strsplit(g_strchug(lines[0]), " ", 4); if (!tokens[0] || !tokens[1] || !tokens[2] || !tokens[3]) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d: awaited " "'id visible pos size'.\n"), position); g_strfreev(tokens); return FALSE; } values = g_strjoin(" ", tokens[0], tokens[1], tokens[2], NULL); res = sscanf(values, "%d %dx%d %dx%d", (int*)&visible, &x, &y, &width, &height); if (res != 5) { *error = g_error_new(TOOL_CONFIG_FILE_ERROR, TOOL_CONFIG_FILE_ERROR_VALUE, _("Parse error at line %d: can't read dock" " characteristic values from '%s'.\n"), position, values); g_strfreev(tokens); g_free(values); return FALSE; } g_free(values); /* Get the dock window associated to id, or create a new one. */ dock = visu_ui_panel_class_getDockById(g_strchomp(tokens[3])); visu_ui_dock_window_setSize(dock, (guint)width, (guint)height); visu_ui_dock_window_setPosition(dock, (guint)x, (guint)y); visu_ui_dock_window_setVisibility(dock, visible); g_strfreev(tokens); return TRUE; } static void exportParametersVisuUiMain(GString *data, VisuData* dataObj _U_, VisuGlView *view _U_) { GList *tmplst, *panelLst, *dockLst; gint x, y, width, height; gboolean visilibity; gchar *id; g_string_append_printf(data, "# %s\n", DESC_PARAMETER_GTKMAIN_QUIT); g_string_append_printf(data, "%s[gtk]: %i\n\n", FLAG_PARAMETER_GTKMAIN_QUIT, (int)my_class->warningWhenQuit); /* Write the panel list. */ panelLst = visu_ui_panel_class_getAllPanels(); if (panelLst) { g_string_append_printf(data, "# %s\n", DESC_PARAMETER_GTKMAIN_PANEL); for (tmplst = panelLst; tmplst; tmplst = g_list_next(tmplst)) g_string_append_printf(data, "%s[gtk]: %s %s\n", FLAG_PARAMETER_GTKMAIN_PANEL, visu_ui_panel_getId(VISU_UI_PANEL(tmplst->data)), visu_ui_panel_getContainerId(VISU_UI_PANEL(tmplst->data))); g_string_append_printf(data, "\n"); g_list_free(panelLst); } /* Write the panel list. */ dockLst = visu_ui_panel_class_getAllWindows(); if (dockLst) { g_string_append_printf(data, "# %s\n", DESC_PARAMETER_GTKMAIN_DOCK); for (tmplst = dockLst; tmplst; tmplst = g_list_next(tmplst)) { visu_ui_dock_window_getCharacteristics ((VisuUiDockWindow*)(tmplst->data), &id, &visilibity, &x, &y, &width, &height); g_string_append_printf(data, "%s[gtk]: %d %dx%d %dx%d %s\n", FLAG_PARAMETER_GTKMAIN_DOCK, (int)visilibity, x, y, width, height, id); } g_string_append_printf(data, "\n"); g_list_free(dockLst); } } gboolean visu_ui_main_initPanels(gpointer data _U_) { GList *pnt; DBG_fprintf(stderr, "Gtk Main: initialise panels.\n"); for (pnt = visu_plugins_getListLoaded(); pnt; pnt = g_list_next(pnt)) visu_plugin_initGtk((VisuPlugin*)pnt->data); visu_ui_panel_browser_setCurrentDirectory(visu_ui_getLastOpenDirectory()); DBG_fprintf(stderr, " | done.\n"); return FALSE; } gboolean visu_ui_main_runCommandLine(gpointer data) { int i, somethingIsLoaded, presetToolShade, nb; int *mapPlaneId; gboolean new, createNodes, redraw; gchar *planeFile, *surfFile, *bgFile, *colorizeFilename, *valueFile; float *values; int *colUsed; float *translations, *extension; GList *list; ToolShade *shade; VisuData *obj; GError *error; GHashTable *table; gchar **names; VisuPlane **planes; VisuUiMain *commandPanel; GArray *minMax; VisuColorization *dataFile; g_return_val_if_fail(VISU_UI_IS_MAIN_TYPE(data), FALSE); DBG_fprintf(stderr, "Gtk Main: run command line options.\n"); commandPanel = VISU_UI_MAIN(data); obj = visu_ui_rendering_window_getData(VISU_UI_RENDERING_WINDOW(commandPanel->renderingWindow)); DBG_fprintf(stderr, " | for data %p.\n", (gpointer)obj); if (!obj) return FALSE; createNodes = FALSE; redraw = FALSE; /* Post loading sequence, corresponding to all other arguments given to command line. */ DBG_fprintf(stderr, " | get value file.\n"); /* The value File, maybe used later. */ valueFile = commandLineGet_valueFile(); /* translate argument */ DBG_fprintf(stderr, " | apply translations.\n"); translations = commandLineGet_translation(); if (translations) { visu_data_setXYZtranslation(obj, translations); visu_data_constrainedInTheBox(obj); createNodes = TRUE; } /* A possible shade. */ DBG_fprintf(stderr, " | get shade.\n"); presetToolShade = commandLineGet_colorizePresetColor(); if (presetToolShade < 0) presetToolShade = 0; /* colorize argument */ DBG_fprintf(stderr, " | apply colourisation.\n"); colorizeFilename = commandLineGet_colorizeFileName(); colUsed = commandLineGet_colorizeColUsed(); if (colorizeFilename || colUsed) { somethingIsLoaded = FALSE; if (colorizeFilename) somethingIsLoaded = visu_ui_panel_colorization_load(obj, colorizeFilename, &new); else for (i = 0; i < 3; i++) somethingIsLoaded = somethingIsLoaded || (colUsed[i] <= 0); if (somethingIsLoaded) { dataFile = visu_colorization_get(obj, TRUE, (gboolean*)0); minMax = commandLineGet_colorMinMax(); for (i = 0; i < (int)minMax->len / 3; i++) visu_ui_panel_colorization_setManualRange (g_array_index(minMax, float, 3 * i + 1), g_array_index(minMax, float, 3 * i + 2), g_array_index(minMax, int, 3 * i) - 1); if (minMax->len > 0) visu_ui_panel_colorization_setRangeMode(VISU_COLORIZATION_MINMAX); list = tool_shade_getList(); if (list) { shade = (ToolShade*)g_list_nth_data(list, presetToolShade); if (shade) visu_ui_panel_colorization_setPresetShade(shade); } if (colUsed) for (i = 0; i < 3; i++) visu_colorization_setColUsed(dataFile, colUsed[i] - 1, i); else for (i = 0; i < 3; i++) visu_colorization_setColUsed(dataFile, 0, i); if (commandLineGet_scalingColumn() >= 0) visu_colorization_setScalingUsed(dataFile, commandLineGet_scalingColumn()); visu_ui_panel_colorization_setUsed(TRUE); createNodes = TRUE; } } /* plane file argument */ DBG_fprintf(stderr, " | apply planes.\n"); planeFile = (valueFile)?valueFile:commandLineGet_planesFileName(); if (planeFile) { error = (GError*)0; visu_ui_panel_planes_load(obj, planeFile, &error); if (error) { if (error->code != G_MARKUP_ERROR_EMPTY) visu_ui_raiseWarning(_("Loading a value file"), error->message, (GtkWindow*)0); g_clear_error(&error); } else visu_ui_panel_planes_setUsed(TRUE); } /* iso-surface argument. */ table = commandLineGet_options(); surfFile = commandLineGet_isoVisuSurfacesFileName(); if (surfFile) { if (visu_ui_panel_surfaces_loadFile (surfFile, (commandLineGet_fitToBox())?visu_boxed_getBox(VISU_BOXED(obj)):(VisuBox*)0, table, (VisuScalarFieldMethod*)0)) { visu_ui_panel_surfaces_showAll(TRUE); planes = visu_ui_panel_planes_getAll(TRUE); visu_ui_panel_surfaces_hide(planes); g_free(planes); visu_ui_panel_surfaces_setUsed(TRUE); } } /* scalar field argument. */ DBG_fprintf(stderr, " | apply scalar fields.\n"); surfFile = commandLineGet_scalarFieldFileName(); if (surfFile) { if (visu_ui_panel_surfaces_loadFile (surfFile, (commandLineGet_fitToBox())?visu_boxed_getBox(VISU_BOXED(obj)):(VisuBox*)0, table, (VisuScalarFieldMethod*)0)) { values = commandLineGet_isoValues(&nb); names = commandLineGet_isoNames(&nb); for (i = 0; i < nb; i++) visu_ui_panel_surfaces_add(surfFile, values[i], names[i]); visu_ui_panel_surfaces_showAll(TRUE); /* Mask the surfaces with planes. */ planes = visu_ui_panel_planes_getAll(TRUE); visu_ui_panel_surfaces_hide(planes); g_free(planes); /* Add possible values from a file. */ if (valueFile) { error = (GError*)0; if (!visu_ui_panel_surfaces_parseXMLFile(valueFile, &error)) { if (error->code != G_MARKUP_ERROR_EMPTY) visu_ui_raiseWarning(_("Loading a value file"), error->message, (GtkWindow*)0); g_clear_error(&error); } } visu_ui_panel_surfaces_setUsed(TRUE); } } /* The extension. */ DBG_fprintf(stderr, " | apply box extension.\n"); extension = commandLineGet_extension(); if (extension) { if (!translations) visu_data_constrainedInTheBox(obj); visu_data_replicate(obj, extension); createNodes = TRUE; } /* The coloured map argument. */ DBG_fprintf(stderr, " | apply map.\n"); mapPlaneId = commandLineGet_coloredMap(); if (mapPlaneId) { DBG_fprintf(stderr, "Gtk Main: set a colour map.\n"); visu_ui_panel_map_setScale(commandLineGet_logScale()); visu_ui_panel_map_setNIsolines(commandLineGet_nIsoLines()); visu_ui_panel_map_setIsolinesColor(commandLineGet_isoLinesColor()); visu_ui_panel_map_setPrecision(commandLineGet_mapPrecision()); visu_ui_panel_map_setMinMax(commandLineGet_mapMinMax()); for (i = 1; i <= mapPlaneId[0]; i++) { DBG_fprintf(stderr, " | for plane %d (%d).\n", mapPlaneId[i], i); visu_ui_panel_map_setData((guint)mapPlaneId[i], 0, (guint)presetToolShade); } redraw = TRUE; } /* The background image. */ DBG_fprintf(stderr, " | apply background image.\n"); bgFile = commandLineGet_bgImage(); if (bgFile) visu_ui_panel_bg_setImage(bgFile); /* The pick information. */ DBG_fprintf(stderr, " | apply pick.\n"); if (valueFile) { visu_ui_main_buildInteractiveDialog(commandPanel); error = (GError*)0; if (!visu_ui_interactive_pick_parseXMLFile(valueFile, obj, &error)) { if (error->code != G_MARKUP_ERROR_EMPTY) visu_ui_raiseWarning(_("Loading a value file"), error->message, (GtkWindow*)0); g_clear_error(&error); } } DBG_fprintf(stderr, " | createnodes (%d).\n", createNodes); if (createNodes) g_signal_emit_by_name(G_OBJECT(obj), "PositionChanged", (VisuElement*)0, NULL); DBG_fprintf(stderr, " | redraw (%d).\n", redraw); if (redraw) VISU_REDRAW_ADD; return FALSE; } /*******************/ /* Class routines. */ /*******************/ /** * visu_ui_main_class_getCurrentPanel: * * This routine can be used to get the command panel, everywhere from * V_Sim. * * Returns: (transfer none): the command Panel. */ VisuUiMain* visu_ui_main_class_getCurrentPanel() { return currentVisuUiMain; } /** * visu_ui_main_class_setCurrentPanel: * @main: a command panel. * * After having created the command panel with visu_ui_main_new(), use this * routine to declare it as the current command panel. */ void visu_ui_main_class_setCurrentPanel(VisuUiMain *main) { g_return_if_fail(VISU_UI_IS_MAIN_TYPE(main)); currentVisuUiMain = main; } void visu_ui_main_class_setRememberPosition(gboolean val) { g_return_if_fail(my_class); DBG_fprintf(stderr, "Gtk Main: set the remember parameter to %d.\n", val); my_class->rememberWindowPosition = val; } gboolean visu_ui_main_class_getRememberPosition() { g_return_val_if_fail(my_class, PARAMETER_GTKMAIN_REMEMBER_DEFAULT); return my_class->rememberWindowPosition; } static void onDataRendered(VisuObject *obj _U_, VisuData *dataObj, VisuGlView *view _U_, gpointer data) { visu_ui_setWindowTitle(GTK_WINDOW(data), dataObj); } /** * visu_ui_main_class_createMain: * @panel: a location for a #VisuUiMain panel ; * @renderWindow: a location for a #GtkWindow ; * @renderArea: a location for a #GtkWidget. * * A convenience routine to create a command panel, a rendering window * and links them together. */ void visu_ui_main_class_createMain(GtkWindow **panel, GtkWindow **renderWindow, GtkWidget **renderArea) { gboolean oneWindow; oneWindow = (!strcmp(commandLineGet_windowMode(), "oneWindow")); *panel = GTK_WINDOW(visu_ui_main_new(oneWindow)); *renderArea = GTK_WIDGET(VISU_UI_MAIN(*panel)->renderingWindow); DBG_fprintf(stderr, "Gtk Main: command panel -> %p.\n", (gpointer)(*panel)); if (!oneWindow) { *renderWindow = GTK_WINDOW(visu_ui_buildRenderingWindow(VISU_UI_RENDERING_WINDOW(*renderArea))); g_signal_connect(G_OBJECT(*renderWindow), "delete-event", G_CALLBACK(onKillMainWindowEvent), (gpointer)(*panel)); g_signal_connect(G_OBJECT(*renderWindow), "destroy-event", G_CALLBACK(onKillMainWindowEvent), (gpointer)(*panel)); gtk_widget_show(GTK_WIDGET(*renderWindow)); } else *renderWindow = *panel; g_signal_connect(VISU_OBJECT_INSTANCE, "dataRendered", G_CALLBACK(onDataRendered), (gpointer)(*renderWindow)); visu_ui_interactive_pick_init(); g_type_class_ref(visu_ui_shade_combobox_get_type()); gtk_widget_show(GTK_WIDGET(*panel)); /* Add the gtk tag as a known tag to allow to read such parameters. */ visu_config_file_addKnownTag("gtk"); return; } /** * visu_ui_main_class_getDefaultRendering: * * Get the rendering window of V_Sim. * * Returns: (transfer none): the rendering window. */ VisuUiRenderingWindow* visu_ui_main_class_getDefaultRendering() { g_return_val_if_fail(currentVisuUiMain, (VisuUiRenderingWindow*)0); DBG_fprintf(stderr, "Gtk Main: access the rendering window %p.\n", (gpointer)currentVisuUiMain->renderingWindow); return VISU_UI_RENDERING_WINDOW(currentVisuUiMain->renderingWindow); } v_sim-3.7.0/src/gtk_main.h0000644000353400050620000001542412215546106012322 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef VISU_PUBLIC_H #define VISU_PUBLIC_H #include #include #include #include "visu_tools.h" #include "visu_dump.h" #include "visu_rendering.h" #include "extraGtkFunctions/gtk_toolPanelWidget.h" #include "gtk_renderingWindowWidget.h" /** * VISU_UI_TYPE_MAIN: * * return the type of #VisuUiMain. */ #define VISU_UI_TYPE_MAIN (visu_ui_main_get_type ()) /** * VISU_UI_MAIN: * @obj: a #GObject to cast. * * Cast the given @obj into #VisuUiMain type. */ #define VISU_UI_MAIN(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, VISU_UI_TYPE_MAIN, VisuUiMain)) /** * VISU_UI_MAIN_CLASS: * @klass: a #GObjectClass to cast. * * Cast the given @klass into #VisuUiMainClass. */ #define VISU_UI_MAIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST(klass, VISU_UI_TYPE_MAIN, VisuUiMainClass)) /** * VISU_UI_IS_MAIN_TYPE: * @obj: a #GObject to test. * * Test if the given @ogj is of the type of #VisuUiMain object. */ #define VISU_UI_IS_MAIN_TYPE(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, VISU_UI_TYPE_MAIN)) /** * VISU_UI_IS_MAIN_CLASS: * @klass: a #GObjectClass to test. * * Test if the given @klass is of the type of #VisuUiMainClass class. */ #define VISU_UI_IS_MAIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE(klass, VISU_UI_TYPE_MAIN)) /** * VISU_UI_MAIN_GET_CLASS: * @obj: a #GObject to get the class of. * * It returns the class of the given @obj. */ #define VISU_UI_MAIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, VISU_UI_TYPE_MAIN, VisuUiMainClass)) /** * VisuUiMain_private: * * Private fields for #VisuUiMain objects. */ typedef struct VisuUiMain_private_struct VisuUiMain_private; /** * _VisuUiMain: * @parent: the parent object, a #GtkWindow here ; * @renderingWindow: a pointer on the associated rendering window ; * @pairsDialog: a pointer to the corresponding pair dialog, or NULL * if not yet built ; * @interactiveDialog: idem for the interactive dialog ; * @aboutDialog: idem for the about dialog ; * @private: a pointer to the private data. * * This structure describes a #VisuUiMain object. */ typedef struct _VisuUiMain VisuUiMain; struct _VisuUiMain { GtkWindow parent; /* Pointers on permanent windows. */ GtkWidget *renderingWindow; GtkWidget *pairsDialog; GtkWidget *interactiveDialog; GtkWidget *aboutDialog; /* Private data. */ VisuUiMain_private *private; }; /** * VisuUiMainClass: * * A short way to identify #_VisuUiMainClass structure. */ typedef struct _VisuUiMainClass VisuUiMainClass; /** * visu_ui_main_get_type: * * This method returns the type of #VisuUiMain, use VISU_UI_TYPE_MAIN instead. * * Returns: the type of #VisuUiMain. */ GType visu_ui_main_get_type(void); /** * visu_ui_main_new: * @oneWindow: a boolean. * * Create the command panel window and is dependencies, such as the * associated rendering window... WARNING: some part are still currently * static, so only once instance can be created at a time. If * @oneWindow argument is TRUE, then the rendering area is creating in * the same #GtkWindow on the right of the panel. * * Returns: a newly create command panel. */ GtkWidget* visu_ui_main_new(gboolean oneWindow); /** * visu_ui_main_quit: * @main: a pointer to the main interface. * @force: if TRUE, override the preference of a quiting dialog and quit. * * Quit the program. If the preference to have a confirm dialog is set, * then it raises the little warning window before quiting (or not). */ void visu_ui_main_quit(VisuUiMain *main, gboolean force); /** * visu_ui_main_buildInteractiveDialog: * @main: a #VisuUiMain object. * * Create the mouse action dialog window (if not already done). */ void visu_ui_main_buildInteractiveDialog(VisuUiMain *main); /** * visu_ui_main_runCommandLine: * @data: a pointer on a #VisuUiMain object. * * Call the get routines from the command line module and associate * the different tasks to the different panels. For a version that do * not use the panels, call visu_ui_runCommandLine() instead. * * Returns: always FALSE. */ gboolean visu_ui_main_runCommandLine(gpointer data); /** * visu_ui_main_initPanels: * @data: a pointer on a #VisuUiMain object. * * Call the init routines for the different panels. * * Returns: always FALSE. */ gboolean visu_ui_main_initPanels(gpointer data); /** * visu_ui_main_class_setRememberPosition: * @val: an boolean. * * V_Sim can try to remember the position of its main windows, then * open them again will result in a positioning on screen equivalent * to previous position. */ void visu_ui_main_class_setRememberPosition(gboolean val); /** * visu_ui_main_class_getRememberPosition: * * V_Sim can store the position of its main windows. Use this routine * to get the status of this capability. * * Returns: TRUE if set. */ gboolean visu_ui_main_class_getRememberPosition(); VisuUiMain* visu_ui_main_class_getCurrentPanel(); void visu_ui_main_class_setCurrentPanel(VisuUiMain *main); void visu_ui_main_class_createMain(GtkWindow **panel, GtkWindow **renderWindow, GtkWidget **renderArea); VisuUiRenderingWindow* visu_ui_main_class_getDefaultRendering(); #endif v_sim-3.7.0/src/gtk_about.c0000644000353400050620000004604512216004577012510 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "gtk_about.h" #include #include #include "interface.h" #include "support.h" #include "visu_object.h" #include "visu_tools.h" #include "visu_basic.h" #include "visu_plugins.h" /** * SECTION: gtk_about * @short_description: The about dialog with a readme, the copyright, * the author list, the plug-in list and the version notes. * * The about dialog window is activated when clicking on the V_Sim * icon on bottom right part of the command panel. It contains a * summary of V_Sim purpose and capabilities, the list of authors, the * list of loaded plug-ins, the list of changes since the previous * version, and the licence file. It displays also the version of * V_Sim and provide a link to the web site. */ #define VISU_UI_ABOUT_LICENCE_FILE _("licence.en.txt") /* Translate if there is a authors file in another language. */ #define VISU_UI_ABOUT_AUTHORS_FILE _("authors") /* Translate if there is a readme file in another language. */ #define VISU_UI_ABOUT_README_FILE _("readme") /* Translate if there is a readme file in another language. */ #define VISU_UI_ABOUT_CHANGELOG_FILE _("ChangeLog.en") enum { GTK_PLUGINS_COLUMN_ICON, GTK_PLUGINS_COLUMN_NAME, GTK_PLUGINS_COLUMN_DESCRIPTION, GTK_PLUGINS_COLUMN_AUTHORS, N_GTK_PLUGINS_COLUMNS }; static void buildPluginsTab(); /* static gboolean onUrlClicked(GtkTextTag *tag, GObject *object, */ /* GdkEvent *event, GtkTextIter *iter, */ /* gpointer user_data); */ /* static gboolean onMouseMotion(GtkWidget *wd, GdkEventMotion *event, */ /* gpointer user_data); */ static void setChangelog(const gchar* buffer, gssize size, GtkTextBuffer *text); /** * visu_ui_about_initBuild: (skip) * @main: the command panel the about dialog is associated to. * * Create the about window. */ void visu_ui_about_initBuild(VisuUiMain *main) { GtkWidget *wd, *note; gchar *buffer, *utf8Buffer, *start, *end; GtkTextBuffer *text; GtkTextIter startIter, endIter; GtkTextTag *monoTag, *boldTag, *linkTag; gsize taille; GError *err; gchar *chemin; DBG_fprintf(stderr, "Gtk About : creating the dialog window.\n"); main->aboutDialog = create_infoDialog(); gtk_widget_set_name(main->aboutDialog, "message"); wd = lookup_widget(main->aboutDialog, "labelInfoVersion"); gtk_label_set_text(GTK_LABEL(wd), VISU_VERSION); wd = lookup_widget(main->aboutDialog, "labelInfoReleaseDate"); gtk_label_set_text(GTK_LABEL(wd), V_SIM_RELEASE_DATE); wd = lookup_widget(main->aboutDialog, "labelInfoWebSite"); /* #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 9 */ /* gtk_widget_destroy(wd); */ /* wd = lookup_widget(main->aboutDialog, "table4"); */ /* gtk_table_attach(GTK_TABLE(wd), gtk_link_button_new(VISU_WEB_SITE), */ /* 1, 2, 2, 3, GTK_SHRINK, GTK_SHRINK, 5, 0); */ /* gtk_widget_show_all(wd); */ /* #else */ gtk_label_set_markup(GTK_LABEL(wd), "" VISU_WEB_SITE""); /* #endif */ note = lookup_widget(main->aboutDialog, "notebookAbout"); gtk_widget_set_name(note, "message_notebook"); /* Create the interior of the tabs. */ chemin = g_build_filename(V_SIM_LEGAL_DIR, VISU_UI_ABOUT_LICENCE_FILE, NULL); buffer = (gchar*)0; err = (GError*)0; if (!g_file_get_contents(chemin, &buffer, &taille, &err)) g_warning("Can't find the licence file, normally" " it should be in '%s'.\n", chemin); else { utf8Buffer = g_convert(buffer, taille, "UTF-8", "ISO-8859-1", NULL, NULL, NULL); g_free(buffer); wd = lookup_widget(main->aboutDialog, "textviewLicence"); text = gtk_text_view_get_buffer(GTK_TEXT_VIEW(wd)); gtk_text_buffer_get_start_iter(text, &startIter); monoTag = gtk_text_buffer_create_tag(text, "typewriter", "family", "monospace", NULL); gtk_text_buffer_insert_with_tags(text, &startIter, utf8Buffer, -1, monoTag, NULL); g_free(utf8Buffer); } g_free(chemin); chemin = g_build_filename(V_SIM_LEGAL_DIR, VISU_UI_ABOUT_README_FILE, NULL); buffer = (gchar*)0; err = (GError*)0; if (!g_file_get_contents(chemin, &buffer, &taille, &err)) g_warning("Can't find the readme file, normally it" " should be in '%s'.\n", chemin); else { utf8Buffer = g_convert(buffer, taille, "UTF-8", "ISO-8859-1", NULL, NULL, NULL); g_free(buffer); wd = lookup_widget(main->aboutDialog, "textviewReadme"); gtk_widget_add_events(wd, GDK_POINTER_MOTION_MASK); text = gtk_text_view_get_buffer(GTK_TEXT_VIEW(wd)); gtk_text_buffer_set_text (text, utf8Buffer, -1); start = strstr(utf8Buffer, "http://"); end = g_utf8_strchr(start, -1, ' '); if (*g_utf8_prev_char(end) == '.') end = g_utf8_prev_char(end); linkTag = gtk_text_buffer_create_tag(text, "link", "underline", PANGO_UNDERLINE_SINGLE, NULL); /* "foreground", "blue", NULL); */ /* g_signal_connect(G_OBJECT(linkTag), "event", */ /* G_CALLBACK(onUrlClicked), NULL); */ /* g_signal_connect(G_OBJECT(wd), "motion-notify-event", */ /* G_CALLBACK(onMouseMotion), (gpointer)linkTag); */ gtk_text_buffer_get_iter_at_offset (text, &startIter,(gint)g_utf8_pointer_to_offset(utf8Buffer, start)); gtk_text_buffer_get_iter_at_offset (text, &endIter, (gint)g_utf8_pointer_to_offset(utf8Buffer, end)); gtk_text_buffer_apply_tag(text, linkTag, &startIter, &endIter); g_free(utf8Buffer); } g_free(chemin); chemin = g_build_filename(V_SIM_LEGAL_DIR, VISU_UI_ABOUT_CHANGELOG_FILE, NULL); buffer = (gchar*)0; err = (GError*)0; if (!g_file_get_contents(chemin, &buffer, &taille, &err)) g_warning("Can't find the changelog file, normally" " it should be in '%s'.\n", chemin); else { wd = lookup_widget(main->aboutDialog, "textviewChangelog"); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(wd), GTK_WRAP_WORD); gtk_text_view_set_justification (GTK_TEXT_VIEW(wd), GTK_JUSTIFY_LEFT); text = gtk_text_view_get_buffer(GTK_TEXT_VIEW(wd)); /* Parse here the XML to get only the relevant entries. */ setChangelog(buffer, taille, text); g_free(buffer); } chemin = g_build_filename(V_SIM_LEGAL_DIR, VISU_UI_ABOUT_AUTHORS_FILE, NULL); buffer = (gchar*)0; err = (GError*)0; if (!g_file_get_contents(chemin, &buffer, &taille, &err)) g_warning("Can't find the authors file, normally" " it should be in '%s'.\n", chemin); else { utf8Buffer = g_convert(buffer, taille, "UTF-8", "ISO-8859-1", NULL, NULL, NULL); g_free(buffer); wd = lookup_widget(main->aboutDialog, "textviewAuthors"); text = gtk_text_view_get_buffer(GTK_TEXT_VIEW(wd)); gtk_text_buffer_get_start_iter(text, &startIter); monoTag = gtk_text_buffer_create_tag(text, "typewriter", "family", "monospace", NULL); gtk_text_buffer_insert_with_tags(text, &startIter, utf8Buffer, -1, monoTag, NULL); boldTag = gtk_text_buffer_create_tag(text, "bold", "weight", PANGO_WEIGHT_BOLD, NULL); end = utf8Buffer; do { start = g_utf8_strchr(end, -1, '*'); if (start) { end = g_utf8_strchr(g_utf8_next_char(start), -1, '*'); if (end) { gtk_text_buffer_get_iter_at_offset (text, &startIter,(gint)g_utf8_pointer_to_offset(utf8Buffer, start)); gtk_text_buffer_get_iter_at_offset (text, &endIter, (gint)g_utf8_pointer_to_offset(utf8Buffer, end)); gtk_text_buffer_apply_tag(text, boldTag, &startIter, &endIter); end = g_utf8_next_char(end); } } } while (start); g_free(utf8Buffer); } g_free(chemin); buildPluginsTab(main); } /* static gboolean onMouseMotion(GtkWidget *wd, GdkEventMotion *event, */ /* gpointer user_data) */ /* { */ /* gint x, y; */ /* GtkTextIter iter; */ /* static GdkCursor *cur = NULL; */ /* gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(wd), GTK_TEXT_WINDOW_WIDGET, */ /* event->x, event->y, &x, &y); */ /* gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(wd), &iter, x, y); */ /* if (gtk_text_iter_has_tag(&iter, GTK_TEXT_TAG(user_data))) */ /* { */ /* if (!cur) */ /* cur = gdk_cursor_new(GDK_HAND1); */ /* gdk_window_set_cursor(event->window, cur); */ /* g_object_set(G_OBJECT(user_data), "underline", PANGO_UNDERLINE_SINGLE, NULL); */ /* } */ /* else */ /* { */ /* gdk_window_set_cursor(event->window, NULL); */ /* g_object_set(G_OBJECT(user_data), "underline", PANGO_UNDERLINE_NONE, NULL); */ /* } */ /* return FALSE; */ /* } */ /* static gboolean onUrlClicked(GtkTextTag *tag _U_, GObject *object _U_, */ /* GdkEvent *event, GtkTextIter *iter _U_, */ /* gpointer user_data _U_) */ /* { */ /* if (event->type == GDK_BUTTON_RELEASE) */ /* { */ /* if (((GdkEventButton*)event)->button != 1) */ /* return FALSE; */ /* DBG_fprintf(stderr, "Gtk About: clicked on URL.\n"); */ /* } */ /* return FALSE; */ /* } */ static void buildPluginsTab(VisuUiMain *main) { GtkListStore *liststore; GtkTreeIter iter; GList *pnt; GtkWidget *tree, *wd; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GdkPixbuf *pixbuf; const gchar *str; VisuPlugin *plug; liststore = gtk_list_store_new(N_GTK_PLUGINS_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(liststore), GTK_PLUGINS_COLUMN_NAME, GTK_SORT_ASCENDING); for (pnt = visu_plugins_getListLoaded(); pnt; pnt = g_list_next(pnt)) { plug = (VisuPlugin*)pnt->data; str = visu_plugin_getIconPath(plug); if (str) pixbuf = gdk_pixbuf_new_from_file_at_size(str, 32, 32, (GError**)0); else pixbuf = (GdkPixbuf*)0; gtk_list_store_append(liststore, &iter); gtk_list_store_set(liststore, &iter, GTK_PLUGINS_COLUMN_ICON, pixbuf, GTK_PLUGINS_COLUMN_NAME, visu_plugin_getName(plug), GTK_PLUGINS_COLUMN_DESCRIPTION, visu_plugin_getDescription(plug), GTK_PLUGINS_COLUMN_AUTHORS, visu_plugin_getAuthors(plug), -1); } /* Build the treeview. */ tree= gtk_tree_view_new_with_model(GTK_TREE_MODEL(liststore)); gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(tree)), GTK_SELECTION_NONE); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), TRUE); renderer = gtk_cell_renderer_pixbuf_new(); column = gtk_tree_view_column_new_with_attributes("", renderer, "pixbuf", GTK_PLUGINS_COLUMN_ICON, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); renderer = gtk_cell_renderer_text_new(); g_object_set(renderer, "weight", 600, "weight-set", TRUE, NULL); column = gtk_tree_view_column_new_with_attributes(_("Name"), renderer, "text", GTK_PLUGINS_COLUMN_NAME, NULL); gtk_tree_view_column_set_alignment(column, 0.5); gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); renderer = gtk_cell_renderer_text_new(); g_object_set(renderer, "xalign", 0., NULL); column = gtk_tree_view_column_new_with_attributes(_("Description"), renderer, "markup", GTK_PLUGINS_COLUMN_DESCRIPTION, NULL); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_alignment(column, 0.5); gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Authors"), renderer, "text", GTK_PLUGINS_COLUMN_AUTHORS, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); gtk_widget_show(tree); wd = lookup_widget(main->aboutDialog, "scrolledwindowPlugins"); gtk_container_add(GTK_CONTAINER(wd), tree); } /****************************/ /* XML files for changelog. */ /****************************/ /* All changes leading to 3.5.x series.
  • Implement a visualisation for the difference
  • */ /* Known elements. */ #define PICK_PARSER_ELEMENT_CHANGELOG "ChangeLog" #define PICK_PARSER_ELEMENT_MILESTONE "milestone" #define PICK_PARSER_ELEMENT_ENTRY "entry" #define PICK_PARSER_ELEMENT_LI "li" /* Known attributes. */ #define PICK_PARSER_ATTRIBUTES_VERSION "version" #define PICK_PARSER_ATTRIBUTES_TITRE "titre" #define PICK_PARSER_ATTRIBUTES_TYPE "type" static gboolean startAbout, startLi; /* This method is called for every element that is parsed. The user_data must be the text buffer to write into. */ static void aboutXML_element(GMarkupParseContext *context _U_, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer user_data, GError **error _U_) { GtkTextBuffer *text; GtkTextIter iter; gchar **version, **refVersion; int minor, refMinor, i; g_return_if_fail(user_data); text = GTK_TEXT_BUFFER(user_data); DBG_fprintf(stderr, "ChangeLog parser: found '%s' element.\n", element_name); if (!strcmp(element_name, PICK_PARSER_ELEMENT_MILESTONE)) { startAbout = FALSE; /* Should have 1 mandatory attribute. */ for (i = 0; attribute_names[i]; i++) { if (!strcmp(attribute_names[i], PICK_PARSER_ATTRIBUTES_VERSION)) { refVersion = g_strsplit_set(VISU_VERSION, ".-", 4); version = g_strsplit_set(attribute_values[i], ".", 3); refMinor = (atoi(refVersion[2]) == 99)? atoi(refVersion[1]) + 1:atoi(refVersion[1]); minor = (version[1])?atoi(version[1]):-1; startAbout = (minor == refMinor); g_strfreev(version); g_strfreev(refVersion); } } } else if (!strcmp(element_name, PICK_PARSER_ELEMENT_ENTRY)) { if (startAbout) { /* Should have 1 mandatory attribute. */ for (i = 0; attribute_names[i]; i++) { if (!strcmp(attribute_names[i], PICK_PARSER_ATTRIBUTES_TITRE)) { gtk_text_buffer_get_end_iter(text, &iter); gtk_text_buffer_insert_with_tags_by_name(text, &iter, attribute_values[i], -1, "bold", NULL); gtk_text_buffer_get_end_iter(text, &iter); gtk_text_buffer_insert(text, &iter, _(":\n\n"), -1); } } } } else if (!strcmp(element_name, PICK_PARSER_ELEMENT_LI)) { if (startAbout) { gtk_text_buffer_get_end_iter(text, &iter); gtk_text_buffer_insert(text, &iter, "\342\200\242\t", -1); /* May have the type attribute. */ for (i = 0; attribute_names[i]; i++) { if (!strcmp(attribute_names[i], PICK_PARSER_ATTRIBUTES_TYPE)) { gtk_text_buffer_get_end_iter(text, &iter); gtk_text_buffer_insert_with_tags_by_name(text, &iter, attribute_values[i], -1, "italic", NULL); gtk_text_buffer_get_end_iter(text, &iter); gtk_text_buffer_insert(text, &iter, _(": "), -1); } } startLi = TRUE; } } } /* Check when a element is closed that everything required has been set. */ static void aboutXML_end(GMarkupParseContext *context _U_, const gchar *element_name, gpointer user_data, GError **error _U_) { GtkTextBuffer *text; GtkTextIter iter; g_return_if_fail(user_data); text = GTK_TEXT_BUFFER(user_data); if (!strcmp(element_name, PICK_PARSER_ELEMENT_MILESTONE)) startAbout = FALSE; else if (!strcmp(element_name, PICK_PARSER_ELEMENT_ENTRY) && startAbout) { gtk_text_buffer_get_end_iter(text, &iter); gtk_text_buffer_insert(text, &iter, "\n", -1); } else if (!strcmp(element_name, PICK_PARSER_ELEMENT_LI) && startAbout) { startLi = FALSE; gtk_text_buffer_get_end_iter(text, &iter); gtk_text_buffer_insert(text, &iter, "\n", -1); } } static void aboutXML_text(GMarkupParseContext *context _U_, const gchar *buf, gsize text_len, gpointer user_data, GError **error _U_) { GtkTextBuffer *text; GtkTextIter iter; g_return_if_fail(user_data); text = GTK_TEXT_BUFFER(user_data); if (startAbout && startLi) { gtk_text_buffer_get_end_iter(text, &iter); gtk_text_buffer_insert(text, &iter, buf, text_len); /* gtk_text_buffer_get_end_iter(text, &iter); */ /* gtk_text_buffer_insert(text, &iter, "\n", -1); */ } } static void setChangelog(const gchar* buffer, gssize size, GtkTextBuffer *text) { GMarkupParseContext* xmlContext; GMarkupParser parser; gboolean status; GError *error; /* Create context. */ parser.start_element = aboutXML_element; parser.end_element = aboutXML_end; parser.text = aboutXML_text; parser.passthrough = NULL; parser.error = NULL; xmlContext = g_markup_parse_context_new(&parser, 0, text, NULL); gtk_text_buffer_create_tag(text, "bold", "weight", PANGO_WEIGHT_BOLD, NULL); gtk_text_buffer_create_tag(text, "italic", "style", PANGO_STYLE_ITALIC, NULL); /* Parse data. */ startAbout = FALSE; startLi = FALSE; error = (GError*)0; status = g_markup_parse_context_parse(xmlContext, buffer, size, &error); /* Free buffers. */ g_markup_parse_context_free(xmlContext); if (!status && error) g_warning("%s", error->message); if (error) g_error_free(error); } v_sim-3.7.0/src/gtk_about.h0000644000353400050620000000353512215546106012510 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef GTK_ABOUT_H #define GTK_ABOUT_H #include #include "gtk_main.h" void visu_ui_about_initBuild(VisuUiMain *main); #endif v_sim-3.7.0/src/gtk_save.c0000644000353400050620000005603412215546105012330 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse mèl : BILLARD, non joignable par mèl ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifdef HAVE_CONFIG_H #include #endif #include /* For the access markers R_OK, W_OK ... */ #include #include "gtk_save.h" #include "visu_gtk.h" #include "gtk_main.h" #include "visu_configFile.h" #include "visu_object.h" #include "visu_tools.h" #include "visu_basic.h" #include "gtk_renderingWindowWidget.h" #include "visu_commandLine.h" #include "gtk_pick.h" #include "panelModules/panelPlanes.h" #include "panelModules/panelSurfaces.h" #include "panelModules/panelGeometry.h" /** * SECTION: gtk_save * @short_description: The load/save dialog for resources and * parameters. * * The save dialog proposes to load or save resources, both * parameters or resources. */ static guint saveResourcesContextId, saveParametersContextId; static gchar *lastParsedDir; static GtkWidget *checkXMLResources, *checkXMLParameters, *checkXMLCommandLine; static GtkWidget *checkExportXML; /* Local Callbacks. */ static void onLoadResButtonClicked(GtkButton *button, gpointer data); static void onSaveResButtonClicked(GtkButton *button, gpointer data); static void onSelectionResourcesChange(GtkFileChooser *fileChooser, gpointer *data); static void onLoadResourcesSelected(GtkFileChooser *fileChooser, gpointer *data); static void onTextEntryChange(GtkEditable *entry, gpointer data); static void onSaveParButtonClicked(GtkButton *button, gpointer data); /* Local methods. */ static void showAlertMessage(GtkWidget *saveDialog, gchar* message, gboolean warning, int type); static void saveAction(int type, GtkWidget *saveDialog, GtkEntry *entry); /* The completion tree model. */ enum { GTK_SAVE_FILE_NAME, GTK_SAVE_NB_COLUMNS }; /** * visu_ui_save_initBuild: (skip) * * Create the save window, conect the signals and run it as a modal dialog. */ void visu_ui_save_initBuild() { GtkWidget *saveDialog; GtkWidget *wd, *label; GtkEntryCompletion *completion; gchar *directory, *file; GList *resList; GtkListStore *listOfFiles; const gchar *currentResPath; int i, j; GDir *gdir; const gchar *fileFromDir; saveDialog = create_saveDialog(); gtk_widget_set_name(saveDialog, "message"); /* Set style. */ wd = lookup_widget(saveDialog, "labelSaveDialog"); gtk_widget_set_name(wd, "message_title"); wd = lookup_widget(saveDialog, "notebookSave"); gtk_widget_set_name(wd, "message_notebook"); wd = lookup_widget(saveDialog, "labelResources"); gtk_widget_set_name(wd, "label_head"); wd = lookup_widget(saveDialog, "labelParameters"); gtk_widget_set_name(wd, "label_head"); wd = lookup_widget(saveDialog, "imageWarningResources"); gtk_widget_hide(wd); wd = lookup_widget(saveDialog, "imageWarningParameters"); gtk_widget_hide(wd); wd = lookup_widget(saveDialog, "statusbarResources"); gtk_widget_set_name(wd, "message_statusbar"); wd = lookup_widget(saveDialog, "statusbarParameters"); gtk_widget_set_name(wd, "message_statusbar"); wd = lookup_widget(saveDialog, "labelHelp"); gtk_widget_set_name(wd, "label_info"); wd = lookup_widget(saveDialog, "labelHelpTips"); gtk_widget_set_name(wd, "label_info"); /* Set default values. */ wd = lookup_widget(saveDialog, "checkLimitOnVisuData"); if (visu_ui_rendering_window_getData(visu_ui_main_class_getDefaultRendering())) gtk_widget_set_sensitive(wd, TRUE); else gtk_widget_set_sensitive(wd, FALSE); gtk_widget_set_name(wd, "message_radio"); wd = lookup_widget(saveDialog, "notebookResources"); gtk_notebook_set_current_page(GTK_NOTEBOOK(wd), 1); gtk_widget_set_name(wd, "message_notebook"); /* Local variables. */ listOfFiles = gtk_list_store_new(GTK_SAVE_NB_COLUMNS, G_TYPE_STRING); gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(listOfFiles), GTK_SAVE_FILE_NAME, GTK_SORT_ASCENDING); lastParsedDir = (gchar*)0; /* Set initial values. */ wd = lookup_widget(saveDialog, "filechooserwidgetResources"); directory = visu_ui_getLastOpenDirectory(); if (directory) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(wd), directory); g_signal_connect(G_OBJECT(wd), "selection-changed", G_CALLBACK(onSelectionResourcesChange), (gpointer)lookup_widget(saveDialog, "buttonLoadResources")); g_signal_connect(G_OBJECT(wd), "file-activated", G_CALLBACK(onLoadResourcesSelected), (gpointer)saveDialog); wd = lookup_widget(saveDialog, "statusbarResources"); saveResourcesContextId = gtk_statusbar_get_context_id(GTK_STATUSBAR(wd), "Resources"); wd = lookup_widget(saveDialog, "comboboxentryParameters"); gtk_widget_set_name(wd, "message_entry"); resList = visu_config_file_getPathList(VISU_CONFIG_FILE_PARAMETER); for (file = visu_config_file_getNextValidPath(VISU_CONFIG_FILE_PARAMETER, W_OK, &resList, 1); file; file = visu_config_file_getNextValidPath(VISU_CONFIG_FILE_PARAMETER, W_OK, &resList, 1)) gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(wd), (const gchar*)0, file); completion = gtk_entry_completion_new(); gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(listOfFiles)); gtk_entry_completion_set_text_column(completion, GTK_SAVE_FILE_NAME); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 gtk_entry_completion_set_inline_completion(completion, TRUE); #endif gtk_entry_set_completion(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(wd))), completion); g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN(wd))), "changed", G_CALLBACK(onTextEntryChange), (gpointer)0); gtk_combo_box_set_active(GTK_COMBO_BOX(wd), 0); wd = lookup_widget(saveDialog, "comboboxentryResources"); gtk_widget_set_name(wd, "message_entry"); currentResPath = visu_config_file_getPathToResources(); DBG_fprintf(stderr, " | current resource path '%s'.\n", currentResPath); j = i = 0; resList = visu_config_file_getPathList(VISU_CONFIG_FILE_RESOURCE); for (file = visu_config_file_getNextValidPath(VISU_CONFIG_FILE_RESOURCE, W_OK, &resList, 1); file; file = visu_config_file_getNextValidPath(VISU_CONFIG_FILE_RESOURCE, W_OK, &resList, 1)) { if (!strcmp(file, currentResPath)) j = i; DBG_fprintf(stderr, " | '%s' (%s).\n", file, currentResPath); gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(wd), (const gchar*)0, file); i += 1; } /* Add all res file of the cwd. */ DBG_fprintf(stderr, "Gtk Save: looking for res files in '%s'.\n", currentResPath); directory = g_get_current_dir(); gdir = g_dir_open(directory, 0, NULL); if (gdir) { fileFromDir = g_dir_read_name(gdir); while(fileFromDir) { if (g_strrstr(fileFromDir, ".res") && strcmp(fileFromDir, "v_sim.res") && !access(fileFromDir, W_OK)) { file = g_build_filename(directory, fileFromDir, NULL); DBG_fprintf(stderr, " | '%s'.\n", file); gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(wd), (const gchar*)0, file); g_free(file); } fileFromDir = g_dir_read_name(gdir); } g_dir_close(gdir); } g_free(directory); completion = gtk_entry_completion_new(); gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(listOfFiles)); gtk_entry_completion_set_text_column(completion, GTK_SAVE_FILE_NAME); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 gtk_entry_completion_set_inline_completion(completion, TRUE); #endif gtk_entry_set_completion(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(wd))), completion); g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN(wd))), "changed", G_CALLBACK(onTextEntryChange), (gpointer)0); gtk_combo_box_set_active(GTK_COMBO_BOX(wd), j); wd = lookup_widget(saveDialog, "labelTipsResources"); gtk_label_set_line_wrap(GTK_LABEL(wd), FALSE); gtk_label_set_markup(GTK_LABEL(wd), _("A description of all resource markups is" " available on:" "\n " VISU_WEB_SITE"/sample.html#resources" ".")); /* Set callbacks. */ wd = lookup_widget(saveDialog, "buttonLoadResources"); g_signal_connect(G_OBJECT(wd), "clicked", G_CALLBACK(onLoadResButtonClicked), (gpointer)saveDialog); wd = lookup_widget(saveDialog, "buttonSaveResources"); g_signal_connect(G_OBJECT(wd), "clicked", G_CALLBACK(onSaveResButtonClicked), (gpointer)saveDialog); wd = lookup_widget(saveDialog, "buttonSaveParameters"); g_signal_connect(G_OBJECT(wd), "clicked", G_CALLBACK(onSaveParButtonClicked), (gpointer)saveDialog); #if DEBUG == 1 wd = lookup_widget(saveDialog, "vbox16"); checkXMLResources = gtk_check_button_new_with_mnemonic(_("Export all resource descriptions" " to an _XML file")); gtk_box_pack_start(GTK_BOX(wd), checkXMLResources, FALSE, FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(checkXMLResources), 5); gtk_widget_set_name(checkXMLResources, "message_radio"); gtk_widget_show(checkXMLResources); wd = lookup_widget(saveDialog, "vbox18"); checkXMLParameters = gtk_check_button_new_with_mnemonic(_("Export all parameter descriptions" " to an _XML file")); gtk_box_pack_start(GTK_BOX(wd), checkXMLParameters, FALSE, FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(checkXMLParameters), 5); gtk_widget_set_name(checkXMLParameters, "message_radio"); gtk_widget_show(checkXMLParameters); checkXMLCommandLine = gtk_check_button_new_with_mnemonic(_("Export all command line _options" " to an XML file")); gtk_box_pack_start(GTK_BOX(wd), checkXMLCommandLine, FALSE, FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(checkXMLCommandLine), 5); gtk_widget_set_name(checkXMLCommandLine, "message_radio"); gtk_widget_show(checkXMLCommandLine); #else checkXMLResources = (GtkWidget*)0; checkXMLParameters = (GtkWidget*)0; checkXMLCommandLine = (GtkWidget*)0; #endif wd = lookup_widget(saveDialog, "vbox16"); checkExportXML = gtk_check_button_new_with_mnemonic(_("Append all settings in a single XML file (including planes, surfaces…)")); gtk_box_pack_start(GTK_BOX(wd), checkExportXML, FALSE, FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(checkExportXML), 5); gtk_widget_set_name(checkExportXML, "message_radio"); gtk_widget_show(checkExportXML); wd = lookup_widget(saveDialog, "vbox18"); label = gtk_label_new(""); gtk_label_set_line_wrap(GTK_LABEL(label), FALSE); gtk_label_set_markup(GTK_LABEL(label), _("A description of all parameter markups is" " available on:\n" " " VISU_WEB_SITE"/sample.html#parameters" ".")); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_box_pack_end(GTK_BOX(wd), label, FALSE, FALSE, 10); gtk_widget_show(label); /* Run the dialog. */ gtk_dialog_run(GTK_DIALOG(saveDialog)); g_object_unref(listOfFiles); if (lastParsedDir) g_free(lastParsedDir); gtk_widget_destroy(saveDialog); } static void onLoadResourcesSelected(GtkFileChooser *fileChooser _U_, gpointer *data) { onLoadResButtonClicked((GtkButton*)0, data); } static void onSelectionResourcesChange(GtkFileChooser *fileChooser, gpointer *data) { gchar *filename; g_return_if_fail(GTK_BUTTON(data)); filename = gtk_file_chooser_get_filename(fileChooser); if (!filename) { gtk_widget_set_sensitive(GTK_WIDGET(data), FALSE); return; } DBG_fprintf(stderr, "Gtk Save : selected a new potential" " resources file : '%s'.\n", filename); gtk_widget_set_sensitive(GTK_WIDGET(data), !g_file_test(filename, G_FILE_TEST_IS_DIR)); g_free(filename); } static void onLoadResButtonClicked(GtkButton *button _U_, gpointer data) { GtkWidget *file_selector; gchar *filename, *basename; gchar *directory; int res; GString *message; GError *error; VisuUiRenderingWindow *window; VisuData *dataObj; VisuGlView *view; g_return_if_fail(GTK_DIALOG(data)); file_selector = lookup_widget(GTK_WIDGET(data), "filechooserwidgetResources"); g_return_if_fail(file_selector); filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file_selector)); directory = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(file_selector)); visu_ui_setLastOpenDirectory(directory, VISU_UI_DIR_CONF); g_free(directory); window = visu_ui_main_class_getDefaultRendering(); dataObj = visu_ui_rendering_window_getData(window); view = visu_ui_rendering_window_getGlView(window); error = (GError*)0; res = visu_config_file_load(VISU_CONFIG_FILE_RESOURCE, filename, dataObj, view, &error); if (error) { visu_ui_raiseWarningLong(_("Loading a file"), error->message, GTK_WINDOW(data)); g_error_free(error); } basename = g_path_get_basename(filename); g_free (filename); message = g_string_new(""); if (res) g_string_append_printf(message, _("File '%s' succesfully loaded."), basename); else g_string_append_printf(message, _("File '%s' not or partially loaded."), basename); showAlertMessage(GTK_WIDGET(data), message->str, !res, VISU_CONFIG_FILE_RESOURCE); g_string_free(message, TRUE); g_free(basename); if (res && dataObj) { /* We rebuild all list. */ visu_gl_ext_rebuildAll(); VISU_REDRAW_ADD; } } static void onSaveResButtonClicked(GtkButton *button _U_, gpointer data) { GtkWidget *entry; g_return_if_fail(GTK_IS_DIALOG(data)); entry = gtk_bin_get_child (GTK_BIN(lookup_widget(GTK_WIDGET(data), "comboboxentryResources"))); if (!strstr(gtk_entry_get_text(GTK_ENTRY(entry)), ".xml") && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkExportXML))) { showAlertMessage(GTK_WIDGET(data), _("Choose a filename with '.xml' to append other settings."), TRUE, VISU_CONFIG_FILE_RESOURCE); } else { saveAction(VISU_CONFIG_FILE_RESOURCE, GTK_WIDGET(data), GTK_ENTRY(entry)); gtk_widget_grab_default(lookup_widget(GTK_WIDGET(data), "closeButtonSave")); } } static void onSaveParButtonClicked(GtkButton *button _U_, gpointer data) { GtkWidget *entry; g_return_if_fail(GTK_IS_DIALOG(data)); entry = gtk_bin_get_child (GTK_BIN(lookup_widget(GTK_WIDGET(data), "comboboxentryParameters"))); saveAction(VISU_CONFIG_FILE_PARAMETER, GTK_WIDGET(data), GTK_ENTRY(entry)); gtk_widget_grab_default(lookup_widget(GTK_WIDGET(data), "closeButtonSave")); } static gboolean _appendAllSettings(const gchar *filename, GError **error) { VisuPlane **planes; VisuPaths *paths; planes = visu_ui_panel_planes_getAll(FALSE); if (!visu_plane_class_exportXMLFile(filename, planes, error)) { g_free(planes); return FALSE; } g_free(planes); if (!visu_ui_interactive_pick_exportXMLFile(filename, error)) return FALSE; if (!visu_ui_panel_surfaces_exportXMLFile(filename, error)) return FALSE; paths = visu_ui_panel_geometry_getPaths(); if (!visu_paths_exportXMLFile(paths, filename, error)) return FALSE; return TRUE; } static void saveAction(int type, GtkWidget *saveDialog, GtkEntry *entry) { GtkWidget *wd; gchar *file, *tmpFile, *basename, *fileUTF8; GString *message; gboolean resOk; gsize ecrit, lu; int lines; VisuUiRenderingWindow *window; VisuData *dataObj; VisuGlView *view; GError *error; GtkTreeIter iter; GtkListStore *listOfFiles; GtkEntryCompletion *completion; g_return_if_fail(type == VISU_CONFIG_FILE_RESOURCE || type == VISU_CONFIG_FILE_PARAMETER); g_return_if_fail(saveDialog && entry); file = g_filename_from_utf8(gtk_entry_get_text(entry), -1, &lu, &ecrit, NULL); if (g_file_test(file, G_FILE_TEST_IS_DIR)) { tmpFile= g_build_filename(file, visu_config_file_getDefaultFilename(type), NULL); g_free(file); file = tmpFile; } wd = lookup_widget(saveDialog, "checkLimitOnVisuData"); dataObj = (VisuData*)0; view = (VisuGlView*)0; if (type == VISU_CONFIG_FILE_RESOURCE) { window = visu_ui_main_class_getDefaultRendering(); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wd))) dataObj = visu_ui_rendering_window_getData(window); view = visu_ui_rendering_window_getGlView(window); } error = (GError*)0; lines = 0; if (type == VISU_CONFIG_FILE_RESOURCE && checkXMLResources && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkXMLResources))) resOk = visu_config_file_exportToXML(file, VISU_CONFIG_FILE_RESOURCE, &error); else if (type == VISU_CONFIG_FILE_RESOURCE && strstr(file, ".xml")) { resOk = visu_config_file_saveResourcesToXML(file, &lines, dataObj, view, &error); resOk = resOk && _appendAllSettings(file, &error); } else if (type == VISU_CONFIG_FILE_PARAMETER && checkXMLParameters && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkXMLParameters))) resOk = visu_config_file_exportToXML(file, VISU_CONFIG_FILE_PARAMETER, &error); else if (type == VISU_CONFIG_FILE_PARAMETER && checkXMLCommandLine && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkXMLCommandLine))) resOk = commandLineExport(file, &error); else resOk = visu_config_file_save(type, file, &lines, dataObj, view, &error); if (!resOk) { visu_ui_raiseWarningLong(_("Saving a file"), error->message, GTK_WINDOW(saveDialog)); g_error_free(error); } basename = g_path_get_basename(file); message = g_string_new(""); if (resOk) g_string_append_printf(message, _("File '%s' succesfully written (%d lines)."), basename, lines); else g_string_append_printf(message, _("File '%s' not written."), basename); showAlertMessage(saveDialog, message->str, !resOk, type); g_string_free(message, TRUE); g_free(basename); /* If file is written, we add it to the completion list. */ if (resOk) { completion = gtk_entry_get_completion(GTK_ENTRY(entry)); g_return_if_fail(completion); listOfFiles = GTK_LIST_STORE(gtk_entry_completion_get_model(completion)); g_return_if_fail(listOfFiles); fileUTF8 = g_filename_from_utf8(file, -1, NULL, NULL, NULL); if(fileUTF8) { gtk_list_store_append(listOfFiles, &iter); gtk_list_store_set(listOfFiles, &iter, GTK_SAVE_FILE_NAME, fileUTF8, -1); g_free(fileUTF8); } } g_free(file); } static void showAlertMessage(GtkWidget *saveDialog, gchar* message, gboolean warning, int type) { GtkWidget *wd; g_return_if_fail(type == VISU_CONFIG_FILE_RESOURCE || type == VISU_CONFIG_FILE_PARAMETER); g_return_if_fail(saveDialog); if (type == VISU_CONFIG_FILE_RESOURCE) wd = lookup_widget(saveDialog, "imageWarningResources"); else wd = lookup_widget(saveDialog, "imageWarningParameters"); if (warning) gtk_widget_show(wd); else gtk_widget_hide(wd); if (type == VISU_CONFIG_FILE_RESOURCE) { wd = lookup_widget(saveDialog, "statusbarResources"); gtk_statusbar_pop(GTK_STATUSBAR(wd), saveResourcesContextId); gtk_statusbar_push(GTK_STATUSBAR(wd), saveResourcesContextId, message); } else { wd = lookup_widget(saveDialog, "statusbarParameters"); gtk_statusbar_pop(GTK_STATUSBAR(wd), saveParametersContextId); gtk_statusbar_push(GTK_STATUSBAR(wd), saveParametersContextId, message); } } static void onTextEntryChange(GtkEditable *entry, gpointer data _U_) { gboolean reParse; GtkTreeIter iter; GtkListStore *listOfFiles; GtkEntryCompletion *completion; gchar *dirEntry, *dirBrowsed; GDir *gdir; const gchar *fileFromDir, *fileEntry; gsize ecrit, lu; gchar *fileUTF8, *saveFile, *saveFileUTF8; fileEntry = gtk_entry_get_text(GTK_ENTRY(entry)); if (!fileEntry || !fileEntry[0]) return; DBG_fprintf(stderr, "Gtk Save : browse directory to populate the completion.\n"); completion = gtk_entry_get_completion(GTK_ENTRY(entry)); g_return_if_fail(completion); listOfFiles = GTK_LIST_STORE(gtk_entry_completion_get_model(completion)); g_return_if_fail(listOfFiles); reParse = FALSE; if (!lastParsedDir) reParse = TRUE; else { dirEntry = g_path_get_dirname(fileEntry); DBG_fprintf(stderr, "Gtk Save : current and last directories...\n %s\n %s\n", dirEntry, lastParsedDir); if (strcmp(dirEntry, lastParsedDir)) reParse = TRUE; g_free(dirEntry); } DBG_fprintf(stderr, "Gtk Save : reparse is needed : %d.\n", reParse); if (!reParse) { gtk_entry_completion_complete(completion); return; } gtk_list_store_clear(listOfFiles); dirEntry = g_path_get_dirname(fileEntry); g_free(lastParsedDir); lastParsedDir = dirEntry; dirBrowsed = g_filename_from_utf8(dirEntry, -1, &lu, &ecrit, NULL); gdir = g_dir_open(dirBrowsed, 0, NULL); if (!gdir) { g_free(dirBrowsed); return; } fileFromDir = g_dir_read_name(gdir); while (fileFromDir) { /* DBG_fprintf(stderr, "Gtk Save : adding '%s' to completion list.\n", fileFromDir); */ fileUTF8 = g_filename_from_utf8(fileFromDir, -1, NULL, NULL, NULL); if(fileUTF8) { saveFile = g_build_filename(dirBrowsed, fileFromDir, NULL); if (g_file_test(saveFile, G_FILE_TEST_IS_DIR)) saveFileUTF8 = g_build_filename(dirEntry, fileUTF8, "/", NULL); else saveFileUTF8 = g_build_filename(dirEntry, fileUTF8, NULL); gtk_list_store_append(listOfFiles, &iter); gtk_list_store_set(listOfFiles, &iter, GTK_SAVE_FILE_NAME, saveFileUTF8, -1); g_free(fileUTF8); g_free(saveFile); } fileFromDir = g_dir_read_name(gdir); } g_free(dirBrowsed); DBG_fprintf(stderr, "Gtk Save : summiting new list of completion.\n"); gtk_entry_completion_complete(completion); DBG_fprintf(stderr, "Gtk Save : summition OK.\n"); } v_sim-3.7.0/src/gtk_save.h0000644000353400050620000000354112215546105012330 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef GTK_SAVE_H #define GTK_SAVE_H #include #include "interface.h" #include "support.h" void visu_ui_save_initBuild(); #endif v_sim-3.7.0/src/support.c0000644000353400050620000000715212215546105012236 00000000000000/* * DO NOT EDIT THIS FILE - it is generated by Glade. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include "support.h" GtkWidget* lookup_widget (GtkWidget *widget, const gchar *widget_name) { GtkWidget *parent, *found_widget; for (;;) { if (GTK_IS_MENU (widget)) parent = gtk_menu_get_attach_widget (GTK_MENU (widget)); else parent = gtk_widget_get_parent(widget); if (!parent) parent = (GtkWidget*) g_object_get_data (G_OBJECT (widget), "GladeParentKey"); if (parent == NULL) break; widget = parent; } found_widget = (GtkWidget*) g_object_get_data (G_OBJECT (widget), widget_name); if (!found_widget) g_warning ("Widget not found: %s", widget_name); return found_widget; } static GList *pixmaps_directories = NULL; /* Use this function to set the directory containing installed pixmaps. */ void add_pixmap_directory (const gchar *directory) { pixmaps_directories = g_list_prepend (pixmaps_directories, g_strdup (directory)); } /* This is an internally used function to find pixmap files. */ static gchar* find_pixmap_file (const gchar *filename) { GList *elem; /* We step through each of the pixmaps directory to find it. */ elem = pixmaps_directories; while (elem) { gchar *pathname = g_strdup_printf ("%s%s%s", (gchar*)elem->data, G_DIR_SEPARATOR_S, filename); if (g_file_test (pathname, G_FILE_TEST_EXISTS)) return pathname; g_free (pathname); elem = elem->next; } return NULL; } /* This is an internally used function to create pixmaps. */ GtkWidget* create_pixmap (GtkWidget *widget _U_, const gchar *filename) { gchar *pathname = NULL; GtkWidget *pixmap; if (!filename || !filename[0]) return gtk_image_new (); pathname = find_pixmap_file (filename); if (!pathname) { g_warning (_("Couldn't find pixmap file: %s"), filename); return gtk_image_new (); } pixmap = gtk_image_new_from_file (pathname); g_free (pathname); return pixmap; } /* This is an internally used function to create pixmaps. */ GdkPixbuf* create_pixbuf (const gchar *filename) { gchar *pathname = NULL; GdkPixbuf *pixbuf; GError *error = NULL; if (!filename || !filename[0]) return NULL; pathname = find_pixmap_file (filename); if (!pathname) { g_warning (_("Couldn't find pixmap file: %s"), filename); return NULL; } pixbuf = gdk_pixbuf_new_from_file (pathname, &error); if (!pixbuf) { fprintf (stderr, "Failed to load pixbuf file: %s: %s\n", pathname, error->message); g_error_free (error); } g_free (pathname); return pixbuf; } /* This is used to set ATK action descriptions. */ void glade_set_atk_action_description (AtkAction *action, const gchar *action_name, const gchar *description) { gint n_actions, i; n_actions = atk_action_get_n_actions (action); for (i = 0; i < n_actions; i++) { if (!strcmp (atk_action_get_name (action, i), action_name)) atk_action_set_description (action, i, description); } } v_sim-3.7.0/src/support.h0000644000353400050620000001431512215546105012242 00000000000000/* * DO NOT EDIT THIS FILE - it is generated by Glade. */ #ifdef HAVE_CONFIG_H # include #endif #include /* * Standard gettext macros. */ #ifdef ENABLE_NLS # include # undef _ # define _(String) dgettext (PACKAGE, String) # define Q_(String) g_strip_context ((String), gettext (String)) # ifdef gettext_noop # define N_(String) gettext_noop (String) # else # define N_(String) (String) # endif #else # define textdomain(String) (String) # define gettext(String) (String) # define dgettext(Domain,Message) (Message) # define dcgettext(Domain,Message,Type) (Message) # define bindtextdomain(Domain,Directory) (Domain) # define _(String) (String) # define Q_(String) g_strip_context ((String), (String)) # define N_(String) (String) #endif #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION > 2 #define gtk_hbox_new(A, B) gtk_box_new(GTK_ORIENTATION_HORIZONTAL, B) #define gtk_vbox_new(A, B) gtk_box_new(GTK_ORIENTATION_VERTICAL, B) #define gtk_hseparator_new() gtk_separator_new(GTK_ORIENTATION_HORIZONTAL) #define gtk_vseparator_new() gtk_separator_new(GTK_ORIENTATION_VERTICAL) #define gtk_hscale_new_with_range(A, B, C) gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, A, B, C) #define gtk_vscale_new_with_range(A, B, C) gtk_scale_new_with_range(GTK_ORIENTATION_VERTICAL, A, B, C) #define gtk_hpaned_new() gtk_paned_new(GTK_ORIENTATION_HORIZONTAL) #define gtk_vpaned_new() gtk_paned_new(GTK_ORIENTATION_VERTICAL) #endif #if GTK_MAJOR_VERSION < 3 #define cairo_region_t GdkRegion #define cairo_region_destroy(Obj) gdk_region_destroy(Obj) #define gdk_window_get_clip_region(Obj) gdk_drawable_get_clip_region(GDK_DRAWABLE(Obj)) #endif #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 26 && GTK_MINOR_VERSION > 23 #define gtk_combo_box_text_append(Obj, id, tt) gtk_combo_box_text_append_text(Obj, tt) #define gtk_combo_box_text_remove(Obj, id) gtk_combo_box_remove_text(GTK_COMBO_BOX(Obj), id) #endif #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 24 #define GTK_COMBO_BOX_TEXT(Obj) GTK_COMBO_BOX(Obj) #define gtk_combo_box_text_new() gtk_combo_box_new_text() #define gtk_combo_box_text_new_with_entry() gtk_combo_box_entry_new_text() #define gtk_combo_box_text_append_text(Obj, tt) gtk_combo_box_append_text(Obj, tt) #define gtk_combo_box_text_append(Obj, id, tt) gtk_combo_box_append_text(Obj, tt) #define gtk_combo_box_text_remove(Obj, id) gtk_combo_box_remove_text(GTK_COMBO_BOX(Obj), id) #define gdk_window_get_screen(Obj) gdk_drawable_get_screen(Obj) #endif #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 22 #define gtk_dialog_get_content_area(Obj) (Obj->vbox) #define gtk_dialog_get_action_area(Obj) (Obj->action_area) #define gtk_color_selection_dialog_get_color_selection(Obj) (Obj->colorsel) #define GDK_KEY_Home GDK_Home #define GDK_KEY_0 GDK_0 #define GDK_KEY_1 GDK_1 #define GDK_KEY_2 GDK_2 #define GDK_KEY_3 GDK_3 #define GDK_KEY_4 GDK_4 #define GDK_KEY_5 GDK_5 #define GDK_KEY_6 GDK_6 #define GDK_KEY_7 GDK_7 #define GDK_KEY_8 GDK_8 #define GDK_KEY_9 GDK_9 #define GDK_KEY_f GDK_f #define GDK_KEY_F GDK_F #define GDK_KEY_i GDK_i #define GDK_KEY_I GDK_I #define GDK_KEY_n GDK_n #define GDK_KEY_o GDK_o #define GDK_KEY_p GDK_p #define GDK_KEY_r GDK_r #define GDK_KEY_R GDK_R #define GDK_KEY_s GDK_s #define GDK_KEY_S GDK_S #define GDK_KEY_v GDK_v #define GDK_KEY_V GDK_V #define GDK_KEY_Menu GDK_Menu #define GDK_KEY_Escape GDK_Escape #define GDK_KEY_space GDK_space #define GDK_KEY_Page_Up GDK_Page_Up #define GDK_KEY_Page_Down GDK_Page_Down #define GDK_KEY_Up GDK_Up #define GDK_KEY_Down GDK_Down #define GDK_KEY_Right GDK_Right #define GDK_KEY_Left GDK_Left #define GDK_KEY_Shift_L GDK_Shift_L #define GDK_KEY_Shift_R GDK_Shift_R #define GDK_KEY_Delete GDK_Delete #define GDK_KEY_BackSpace GDK_BackSpace #define gtk_widget_is_drawable(Obj) GDK_IS_DRAWABLE(Obj->window) #define gtk_widget_get_window(Obj) (Obj->window) #define gtk_widget_get_visible(Obj) GTK_WIDGET_VISIBLE(Obj) #define gtk_widget_get_allocation(Obj, alloc) {(alloc)->x = Obj->allocation.x; (alloc)->y = Obj->allocation.y; (alloc)->width = Obj->allocation.width; (alloc)->height = Obj->allocation.height;} #define gtk_widget_set_can_default(Obj, test) {if (test) {GTK_WIDGET_SET_FLAGS(Obj, GTK_CAN_DEFAULT);};} #define gtk_widget_set_can_focus(Obj, test) {if (test) {GTK_WIDGET_SET_FLAGS(Obj, GTK_CAN_FOCUS);};} #define gtk_widget_set_window(Obj, win) {Obj->window = win;} #define gtk_widget_set_realized(Obj, test) {if (test) {GTK_WIDGET_SET_FLAGS(Obj, GTK_REALIZED);};} #define gtk_widget_set_has_window(Obj, test) {} #endif #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 20 #define gtk_widget_style_attach(Obj) {Obj->style = gtk_style_attach(Obj->style, Obj->window);} #define gtk_widget_get_mapped(Obj) GTK_WIDGET_MAPPED(Obj) #endif #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 #define gtk_widget_set_tooltip_text(Obj, tt) gtk_tooltips_set_tip(tooltips, Obj, tt, NULL) #define gtk_tool_item_set_tooltip_text(Obj, tt) gtk_tool_item_set_tooltip(Obj, tooltips, tt, NULL) #endif #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 5 #define GTK_STOCK_EDIT GTK_STOCK_PROPERTIES #endif /* * Public Functions. */ /* * This function returns a widget in a component created by Glade. * Call it with the toplevel widget in the component (i.e. a window/dialog), * or alternatively any widget in the component, and the name of the widget * you want returned. */ GtkWidget* lookup_widget (GtkWidget *widget, const gchar *widget_name); /* Use this function to set the directory containing installed pixmaps. */ void add_pixmap_directory (const gchar *directory); /* * Private Functions. */ /* This is used to create the pixmaps used in the interface. */ GtkWidget* create_pixmap (GtkWidget *widget, const gchar *filename); /* This is used to create the pixbufs used in the interface. */ GdkPixbuf* create_pixbuf (const gchar *filename); /* This is used to set ATK action descriptions. */ void glade_set_atk_action_description (AtkAction *action, const gchar *action_name, const gchar *description); v_sim-3.7.0/src/interface.c0000644000353400050620000025303312215546105012463 00000000000000/* * DO NOT EDIT THIS FILE - it is generated by Glade. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include "interface.h" #include "support.h" #define GLADE_HOOKUP_OBJECT(component,widget,name) \ g_object_set_data_full (G_OBJECT (component), name, \ gtk_widget_ref (widget), (GDestroyNotify) gtk_widget_unref) #define GLADE_HOOKUP_OBJECT_NO_REF(component,widget,name) \ g_object_set_data (G_OBJECT (component), name, widget) GtkWidget* create_saveDialog (void) { GtkWidget *saveDialog; GdkPixbuf *saveDialog_icon_pixbuf; GtkWidget *dialog_vbox1; GtkWidget *hbox30; GtkWidget *image25; GtkWidget *vbox4; GtkWidget *labelSaveDialog; GtkWidget *notebookSave; GtkWidget *vbox14; GtkWidget *notebookResources; GtkWidget *alignment17; GtkWidget *vbox15; GtkWidget *label75; GtkWidget *filechooserwidgetResources; GtkWidget *alignment18; GtkWidget *buttonLoadResources; GtkWidget *image48; GtkWidget *alignment32; GtkWidget *vbox16; GtkWidget *label76; GtkWidget *hbox65; GtkWidget *alignment31; GtkWidget *comboboxentryResources; GtkWidget *buttonSaveResources; GtkWidget *checkLimitOnVisuData; GtkWidget *image49; GtkWidget *labelTipsResources; GtkWidget *hbox55; GtkWidget *imageWarningResources; GtkWidget *statusbarResources; GtkWidget *labelResources; GtkWidget *vbox18; GtkWidget *hbox54; GtkWidget *image42; GtkWidget *label83; GtkWidget *hbox66; GtkWidget *alignment25; GtkWidget *comboboxentryParameters; GtkWidget *buttonSaveParameters; GtkWidget *hbox56; GtkWidget *imageWarningParameters; GtkWidget *statusbarParameters; GtkWidget *labelParameters; GtkWidget *frame6; GtkWidget *vbox17; GtkWidget *labelHelp; GtkWidget *labelHelpTips; GtkWidget *hbox51; GtkWidget *image40; GtkWidget *label80; GtkWidget *dialog_action_area1; GtkWidget *closeButtonSave; saveDialog = gtk_dialog_new (); gtk_window_set_title (GTK_WINDOW (saveDialog), _("Save session")); gtk_window_set_position (GTK_WINDOW (saveDialog), GTK_WIN_POS_CENTER_ON_PARENT); gtk_window_set_modal (GTK_WINDOW (saveDialog), TRUE); gtk_window_set_default_size (GTK_WINDOW (saveDialog), 450, -1); saveDialog_icon_pixbuf = create_pixbuf ("icone-dialog.png"); if (saveDialog_icon_pixbuf) { gtk_window_set_icon (GTK_WINDOW (saveDialog), saveDialog_icon_pixbuf); g_object_unref (saveDialog_icon_pixbuf); } dialog_vbox1 = gtk_dialog_get_content_area(GTK_DIALOG(saveDialog)); gtk_widget_show (dialog_vbox1); hbox30 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox30); gtk_box_pack_start (GTK_BOX (dialog_vbox1), hbox30, TRUE, TRUE, 0); image25 = create_pixmap (saveDialog, "save-bandeau.png"); gtk_widget_show (image25); gtk_box_pack_start (GTK_BOX (hbox30), image25, FALSE, FALSE, 0); gtk_misc_set_alignment (GTK_MISC (image25), 0.5, 1); gtk_misc_set_padding (GTK_MISC (image25), 10, 5); vbox4 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox4); gtk_box_pack_start (GTK_BOX (hbox30), vbox4, TRUE, TRUE, 0); labelSaveDialog = gtk_label_new (_("Manage configuration files")); gtk_widget_show (labelSaveDialog); gtk_box_pack_start (GTK_BOX (vbox4), labelSaveDialog, FALSE, FALSE, 1); gtk_label_set_use_markup (GTK_LABEL (labelSaveDialog), TRUE); notebookSave = gtk_notebook_new (); gtk_widget_show (notebookSave); gtk_box_pack_start (GTK_BOX (vbox4), notebookSave, TRUE, TRUE, 5); gtk_widget_set_size_request (notebookSave, 600, -1); vbox14 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox14); gtk_container_add (GTK_CONTAINER (notebookSave), vbox14); gtk_container_set_border_width (GTK_CONTAINER (vbox14), 2); notebookResources = gtk_notebook_new (); gtk_widget_show (notebookResources); gtk_box_pack_start (GTK_BOX (vbox14), notebookResources, TRUE, TRUE, 0); gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebookResources), GTK_POS_LEFT); alignment17 = gtk_alignment_new (0.5, 0.5, 1, 1); gtk_widget_show (alignment17); gtk_container_add (GTK_CONTAINER (notebookResources), alignment17); gtk_alignment_set_padding (GTK_ALIGNMENT (alignment17), 0, 0, 15, 0); vbox15 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox15); gtk_container_add (GTK_CONTAINER (alignment17), vbox15); label75 = gtk_label_new (_("Load from file")); gtk_widget_show (label75); gtk_box_pack_start (GTK_BOX (vbox15), label75, FALSE, FALSE, 0); gtk_label_set_use_markup (GTK_LABEL (label75), TRUE); gtk_misc_set_alignment (GTK_MISC (label75), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label75), 25, 10); filechooserwidgetResources = gtk_file_chooser_widget_new (GTK_FILE_CHOOSER_ACTION_OPEN); gtk_widget_show (filechooserwidgetResources); gtk_box_pack_start (GTK_BOX (vbox15), filechooserwidgetResources, TRUE, TRUE, 0); gtk_widget_set_size_request (filechooserwidgetResources, -1, 250); alignment18 = gtk_alignment_new (0.9, 0.5, 0, 1); gtk_widget_show (alignment18); gtk_box_pack_start (GTK_BOX (vbox15), alignment18, FALSE, FALSE, 0); gtk_alignment_set_padding (GTK_ALIGNMENT (alignment18), 3, 0, 0, 0); buttonLoadResources = gtk_button_new_from_stock ("gtk-open"); gtk_widget_show (buttonLoadResources); gtk_container_add (GTK_CONTAINER (alignment18), buttonLoadResources); gtk_widget_set_sensitive (buttonLoadResources, FALSE); gtk_widget_set_can_default (buttonLoadResources, TRUE); image48 = gtk_image_new_from_stock ("gtk-open", GTK_ICON_SIZE_LARGE_TOOLBAR); gtk_widget_show (image48); gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebookResources), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebookResources), 0), image48); alignment32 = gtk_alignment_new (0.5, 0.5, 1, 1); gtk_widget_show (alignment32); gtk_container_add (GTK_CONTAINER (notebookResources), alignment32); gtk_alignment_set_padding (GTK_ALIGNMENT (alignment32), 0, 0, 15, 0); vbox16 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox16); gtk_container_add (GTK_CONTAINER (alignment32), vbox16); label76 = gtk_label_new (_("Save to file")); gtk_widget_show (label76); gtk_box_pack_start (GTK_BOX (vbox16), label76, FALSE, FALSE, 0); gtk_label_set_use_markup (GTK_LABEL (label76), TRUE); gtk_misc_set_alignment (GTK_MISC (label76), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label76), 25, 10); hbox65 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox65); gtk_box_pack_start (GTK_BOX (vbox16), hbox65, FALSE, FALSE, 0); alignment31 = gtk_alignment_new (0.5, 0.5, 1, 0); gtk_widget_show (alignment31); gtk_box_pack_start (GTK_BOX (hbox65), alignment31, TRUE, TRUE, 0); comboboxentryResources = gtk_combo_box_text_new_with_entry(); gtk_widget_show (comboboxentryResources); gtk_container_add (GTK_CONTAINER (alignment31), comboboxentryResources); buttonSaveResources = gtk_button_new_from_stock ("gtk-save"); gtk_widget_show (buttonSaveResources); gtk_box_pack_start (GTK_BOX (hbox65), buttonSaveResources, FALSE, FALSE, 5); gtk_widget_set_can_default (buttonSaveResources, TRUE); checkLimitOnVisuData = gtk_check_button_new_with_mnemonic (_("Export resources related to rendered file only")); gtk_widget_show (checkLimitOnVisuData); gtk_box_pack_start (GTK_BOX (vbox16), checkLimitOnVisuData, FALSE, FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (checkLimitOnVisuData), 5); gtk_widget_set_sensitive (checkLimitOnVisuData, FALSE); image49 = gtk_image_new_from_stock ("gtk-save", GTK_ICON_SIZE_LARGE_TOOLBAR); gtk_widget_show (image49); gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebookResources), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebookResources), 1), image49); labelTipsResources = gtk_label_new (""); gtk_widget_show (labelTipsResources); gtk_box_pack_start (GTK_BOX (vbox14), labelTipsResources, FALSE, FALSE, 0); gtk_widget_set_can_focus (labelTipsResources, TRUE); gtk_label_set_use_markup (GTK_LABEL (labelTipsResources), TRUE); gtk_label_set_justify (GTK_LABEL (labelTipsResources), GTK_JUSTIFY_FILL); gtk_label_set_selectable (GTK_LABEL (labelTipsResources), TRUE); gtk_misc_set_alignment (GTK_MISC (labelTipsResources), 0, 0.5); gtk_misc_set_padding (GTK_MISC (labelTipsResources), 0, 10); hbox55 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox55); gtk_box_pack_end (GTK_BOX (vbox14), hbox55, FALSE, FALSE, 0); imageWarningResources = gtk_image_new_from_icon_name ("gtk-dialog-warning", GTK_ICON_SIZE_MENU); gtk_widget_show (imageWarningResources); gtk_box_pack_start (GTK_BOX (hbox55), imageWarningResources, FALSE, FALSE, 0); statusbarResources = gtk_statusbar_new (); gtk_widget_show (statusbarResources); gtk_box_pack_start (GTK_BOX (hbox55), statusbarResources, TRUE, TRUE, 0); #if GTK_MAJOR_VERSION < 3 && GTK_MINOR_VERSION < 24 gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (statusbarResources), FALSE); #endif labelResources = gtk_label_new (_("Resources (values related to rendering aspects)")); gtk_widget_show (labelResources); gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebookSave), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebookSave), 0), labelResources); gtk_label_set_use_markup (GTK_LABEL (labelResources), TRUE); vbox18 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox18); gtk_container_add (GTK_CONTAINER (notebookSave), vbox18); gtk_container_set_border_width (GTK_CONTAINER (vbox18), 2); hbox54 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox54); gtk_box_pack_start (GTK_BOX (vbox18), hbox54, FALSE, FALSE, 3); image42 = gtk_image_new_from_stock ("gtk-floppy", GTK_ICON_SIZE_LARGE_TOOLBAR); gtk_widget_show (image42); gtk_box_pack_start (GTK_BOX (hbox54), image42, FALSE, FALSE, 0); label83 = gtk_label_new (_("Save to file")); gtk_widget_show (label83); gtk_box_pack_start (GTK_BOX (hbox54), label83, FALSE, FALSE, 0); gtk_label_set_use_markup (GTK_LABEL (label83), TRUE); gtk_misc_set_padding (GTK_MISC (label83), 25, 10); hbox66 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox66); gtk_box_pack_start (GTK_BOX (vbox18), hbox66, FALSE, FALSE, 0); alignment25 = gtk_alignment_new (0.5, 0.5, 1, 0); gtk_widget_show (alignment25); gtk_box_pack_start (GTK_BOX (hbox66), alignment25, TRUE, TRUE, 0); gtk_alignment_set_padding (GTK_ALIGNMENT (alignment25), 0, 0, 15, 0); comboboxentryParameters = gtk_combo_box_text_new_with_entry(); gtk_widget_show (comboboxentryParameters); gtk_container_add (GTK_CONTAINER (alignment25), comboboxentryParameters); buttonSaveParameters = gtk_button_new_from_stock ("gtk-save"); gtk_widget_show (buttonSaveParameters); gtk_box_pack_start (GTK_BOX (hbox66), buttonSaveParameters, FALSE, FALSE, 5); gtk_widget_set_can_default(buttonSaveParameters, TRUE); hbox56 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox56); gtk_box_pack_end (GTK_BOX (vbox18), hbox56, FALSE, FALSE, 0); imageWarningParameters = gtk_image_new_from_icon_name ("gtk-dialog-warning", GTK_ICON_SIZE_MENU); gtk_widget_show (imageWarningParameters); gtk_box_pack_start (GTK_BOX (hbox56), imageWarningParameters, FALSE, FALSE, 0); statusbarParameters = gtk_statusbar_new (); gtk_widget_show (statusbarParameters); gtk_box_pack_start (GTK_BOX (hbox56), statusbarParameters, TRUE, TRUE, 0); #if GTK_MAJOR_VERSION < 3 && GTK_MINOR_VERSION < 24 gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (statusbarParameters), FALSE); #endif labelParameters = gtk_label_new (_("Parameters (Interface options)")); gtk_widget_show (labelParameters); gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebookSave), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebookSave), 1), labelParameters); gtk_label_set_use_markup (GTK_LABEL (labelParameters), TRUE); frame6 = gtk_frame_new (NULL); gtk_widget_show (frame6); gtk_box_pack_end (GTK_BOX (vbox4), frame6, FALSE, FALSE, 0); vbox17 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox17); gtk_container_add (GTK_CONTAINER (frame6), vbox17); labelHelp = gtk_label_new (_("When saving, if you just specify a directory 'dir/', it will be save to 'dir/v_sim.[res][par]' by default, ortherwise speficy a full path.")); gtk_widget_show (labelHelp); gtk_box_pack_start (GTK_BOX (vbox17), labelHelp, FALSE, FALSE, 0); gtk_label_set_use_markup (GTK_LABEL (labelHelp), TRUE); gtk_label_set_justify (GTK_LABEL (labelHelp), GTK_JUSTIFY_FILL); gtk_label_set_line_wrap (GTK_LABEL (labelHelp), TRUE); gtk_misc_set_alignment (GTK_MISC (labelHelp), 0, 0.5); gtk_misc_set_padding (GTK_MISC (labelHelp), 5, 5); labelHelpTips = gtk_label_new (_("Tips: think to create a $XDG_CONFIG_HOME/v_sim directory and put your resource and parameter files in it. It is scanned at startup.")); gtk_widget_show (labelHelpTips); gtk_box_pack_start (GTK_BOX (vbox17), labelHelpTips, FALSE, FALSE, 0); gtk_widget_set_can_focus(labelHelpTips, TRUE); gtk_label_set_use_markup (GTK_LABEL (labelHelpTips), TRUE); gtk_label_set_line_wrap (GTK_LABEL (labelHelpTips), TRUE); gtk_label_set_selectable (GTK_LABEL (labelHelpTips), TRUE); gtk_misc_set_alignment (GTK_MISC (labelHelpTips), 0, 0.5); gtk_misc_set_padding (GTK_MISC (labelHelpTips), 5, 5); hbox51 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox51); gtk_frame_set_label_widget (GTK_FRAME (frame6), hbox51); image40 = gtk_image_new_from_stock ("gtk-help", GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_widget_show (image40); gtk_box_pack_start (GTK_BOX (hbox51), image40, TRUE, TRUE, 0); label80 = gtk_label_new (_("Help")); gtk_widget_show (label80); gtk_box_pack_start (GTK_BOX (hbox51), label80, FALSE, FALSE, 0); dialog_action_area1 = gtk_dialog_get_action_area(GTK_DIALOG (saveDialog)); gtk_widget_show (dialog_action_area1); gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END); closeButtonSave = gtk_button_new_from_stock ("gtk-close"); gtk_widget_show (closeButtonSave); gtk_dialog_add_action_widget (GTK_DIALOG (saveDialog), closeButtonSave, GTK_RESPONSE_CLOSE); gtk_widget_set_can_default(closeButtonSave, TRUE); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (saveDialog, saveDialog, "saveDialog"); GLADE_HOOKUP_OBJECT_NO_REF (saveDialog, dialog_vbox1, "dialog_vbox1"); GLADE_HOOKUP_OBJECT (saveDialog, hbox30, "hbox30"); GLADE_HOOKUP_OBJECT (saveDialog, image25, "image25"); GLADE_HOOKUP_OBJECT (saveDialog, vbox4, "vbox4"); GLADE_HOOKUP_OBJECT (saveDialog, labelSaveDialog, "labelSaveDialog"); GLADE_HOOKUP_OBJECT (saveDialog, notebookSave, "notebookSave"); GLADE_HOOKUP_OBJECT (saveDialog, vbox14, "vbox14"); GLADE_HOOKUP_OBJECT (saveDialog, notebookResources, "notebookResources"); GLADE_HOOKUP_OBJECT (saveDialog, alignment17, "alignment17"); GLADE_HOOKUP_OBJECT (saveDialog, vbox15, "vbox15"); GLADE_HOOKUP_OBJECT (saveDialog, label75, "label75"); GLADE_HOOKUP_OBJECT (saveDialog, filechooserwidgetResources, "filechooserwidgetResources"); GLADE_HOOKUP_OBJECT (saveDialog, alignment18, "alignment18"); GLADE_HOOKUP_OBJECT (saveDialog, buttonLoadResources, "buttonLoadResources"); GLADE_HOOKUP_OBJECT (saveDialog, image48, "image48"); GLADE_HOOKUP_OBJECT (saveDialog, alignment32, "alignment32"); GLADE_HOOKUP_OBJECT (saveDialog, vbox16, "vbox16"); GLADE_HOOKUP_OBJECT (saveDialog, label76, "label76"); GLADE_HOOKUP_OBJECT (saveDialog, hbox65, "hbox65"); GLADE_HOOKUP_OBJECT (saveDialog, alignment31, "alignment31"); GLADE_HOOKUP_OBJECT (saveDialog, comboboxentryResources, "comboboxentryResources"); GLADE_HOOKUP_OBJECT (saveDialog, buttonSaveResources, "buttonSaveResources"); GLADE_HOOKUP_OBJECT (saveDialog, checkLimitOnVisuData, "checkLimitOnVisuData"); GLADE_HOOKUP_OBJECT (saveDialog, image49, "image49"); GLADE_HOOKUP_OBJECT (saveDialog, labelTipsResources, "labelTipsResources"); GLADE_HOOKUP_OBJECT (saveDialog, hbox55, "hbox55"); GLADE_HOOKUP_OBJECT (saveDialog, imageWarningResources, "imageWarningResources"); GLADE_HOOKUP_OBJECT (saveDialog, statusbarResources, "statusbarResources"); GLADE_HOOKUP_OBJECT (saveDialog, labelResources, "labelResources"); GLADE_HOOKUP_OBJECT (saveDialog, vbox18, "vbox18"); GLADE_HOOKUP_OBJECT (saveDialog, hbox54, "hbox54"); GLADE_HOOKUP_OBJECT (saveDialog, image42, "image42"); GLADE_HOOKUP_OBJECT (saveDialog, label83, "label83"); GLADE_HOOKUP_OBJECT (saveDialog, hbox66, "hbox66"); GLADE_HOOKUP_OBJECT (saveDialog, alignment25, "alignment25"); GLADE_HOOKUP_OBJECT (saveDialog, comboboxentryParameters, "comboboxentryParameters"); GLADE_HOOKUP_OBJECT (saveDialog, buttonSaveParameters, "buttonSaveParameters"); GLADE_HOOKUP_OBJECT (saveDialog, hbox56, "hbox56"); GLADE_HOOKUP_OBJECT (saveDialog, imageWarningParameters, "imageWarningParameters"); GLADE_HOOKUP_OBJECT (saveDialog, statusbarParameters, "statusbarParameters"); GLADE_HOOKUP_OBJECT (saveDialog, labelParameters, "labelParameters"); GLADE_HOOKUP_OBJECT (saveDialog, frame6, "frame6"); GLADE_HOOKUP_OBJECT (saveDialog, vbox17, "vbox17"); GLADE_HOOKUP_OBJECT (saveDialog, labelHelp, "labelHelp"); GLADE_HOOKUP_OBJECT (saveDialog, labelHelpTips, "labelHelpTips"); GLADE_HOOKUP_OBJECT (saveDialog, hbox51, "hbox51"); GLADE_HOOKUP_OBJECT (saveDialog, image40, "image40"); GLADE_HOOKUP_OBJECT (saveDialog, label80, "label80"); GLADE_HOOKUP_OBJECT_NO_REF (saveDialog, dialog_action_area1, "dialog_action_area1"); GLADE_HOOKUP_OBJECT (saveDialog, closeButtonSave, "closeButtonSave"); gtk_widget_grab_default (buttonLoadResources); return saveDialog; } GtkWidget* create_observeDialog (void) { GtkWidget *observeDialog; GdkPixbuf *observeDialog_icon_pixbuf; GtkWidget *dialog_vbox3; GtkWidget *hbox20; GtkWidget *image15; GtkWidget *vbox20; GtkWidget *hbox60; GtkWidget *radioObserve; GSList *radioObserve_group = NULL; GtkWidget *alignment8; GtkWidget *hbox21; GtkWidget *image16; GtkWidget *labelObserve; GtkWidget *hboxObserve; GtkWidget *label66; GtkWidget *radioObserveConstrained; GSList *radioObserveConstrained_group = NULL; GtkWidget *radioObserveWalker; GtkWidget *label67; GtkWidget *tableObserve; GtkWidget *labelTranslation; GtkWidget *labelZoom; GtkWidget *spinOmega; GtkWidget *spinPhi; GtkWidget *spinDx; GtkWidget *spinGross; GtkWidget *spinTheta; GtkWidget *label58; GtkWidget *label32; GtkWidget *label33; GtkWidget *label35; GtkWidget *label31; GtkWidget *buttonVisuUiOrientationChooser; GtkWidget *image51; GtkWidget *label34; GtkWidget *label36; GtkWidget *spinDy; GtkWidget *spinPersp; GtkWidget *notebookAction; GtkWidget *vbox7; GtkWidget *hboxPick; GtkWidget *radioPick; GSList *radioPick_group = NULL; GtkWidget *alignment9; GtkWidget *hbox22; GtkWidget *image17; GtkWidget *labelPick; GtkWidget *alignment39; GtkWidget *vpaned1; GtkWidget *vbox26; GtkWidget *scrolledwindow6; GtkWidget *viewportPick; GtkWidget *vbox24; GtkWidget *pickInfo; GtkWidget *pickComment; GtkWidget *hbox57; GtkWidget *checkDrawDistance; GtkWidget *buttonEraseDistances; GtkWidget *image54; GtkWidget *labelMarks; GtkWidget *hboxMarks; GtkWidget *buttonSetMarks; GtkWidget *image56; GtkWidget *buttonEraseMarks; GtkWidget *image55; GtkWidget *vbox25; GtkWidget *hbox64; GtkWidget *labelList; GtkWidget *image47; GtkWidget *label118; GtkWidget *hbox74; GtkWidget *label128; GtkWidget *hbox70; GtkWidget *alignment40; GtkWidget *radioDrawNever; GSList *radioDrawNever_group = NULL; GtkWidget *radioDrawSelected; GtkWidget *radioDrawAlways; GtkWidget *comboboxShowInfos; GtkWidget *label87; GtkWidget *vbox27; GtkWidget *radioMove; GSList *radioMove_group = NULL; GtkWidget *alignment28; GtkWidget *hbox59; GtkWidget *image44; GtkWidget *label111; GtkWidget *alignment41; GtkWidget *vbox21; GtkWidget *hbox72; GtkWidget *label90; GtkWidget *radioMovePick; GSList *radioMovePick_group = NULL; GtkWidget *alignment42; GtkWidget *radioMoveRegion; GtkWidget *labelNMoves; GtkWidget *alignment44; GtkWidget *label136; GtkWidget *alignment27; GtkWidget *tableMovePick; GtkWidget *label138; GtkWidget *label95; GtkWidget *label94; GtkWidget *label93; GtkWidget *label102; GtkWidget *labelOriginalX; GtkWidget *labelOriginalY; GtkWidget *labelOriginalZ; GtkWidget *label125; GtkWidget *hboxAddNode; GtkWidget *label126; GtkWidget *hbox67; GtkWidget *label120; GtkWidget *label121; GtkWidget *labelHorizontalAxe; GtkWidget *label123; GtkWidget *labelVerticalAxe; GtkWidget *label88; GtkWidget *frame2; GtkWidget *labelInfoObservePick; GtkWidget *hbox23; GtkWidget *image18; GtkWidget *label39; GtkWidget *dialog_action_area3; GtkWidget *buttonBackToCommandPanel; GtkWidget *alignment12; GtkWidget *hbox41; GtkWidget *image31; GtkWidget *label68; GtkAccelGroup *accel_group; #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkTooltips *tooltips; tooltips = gtk_tooltips_new (); #endif accel_group = gtk_accel_group_new (); observeDialog = gtk_dialog_new (); gtk_window_set_title (GTK_WINDOW (observeDialog), _("Pick and observe session")); gtk_window_set_position (GTK_WINDOW (observeDialog), GTK_WIN_POS_CENTER_ON_PARENT); observeDialog_icon_pixbuf = create_pixbuf ("icone-dialog.png"); if (observeDialog_icon_pixbuf) { gtk_window_set_icon (GTK_WINDOW (observeDialog), observeDialog_icon_pixbuf); g_object_unref (observeDialog_icon_pixbuf); } dialog_vbox3 = gtk_dialog_get_content_area(GTK_DIALOG(observeDialog)); gtk_widget_show (dialog_vbox3); hbox20 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox20); gtk_box_pack_start (GTK_BOX (dialog_vbox3), hbox20, TRUE, TRUE, 0); image15 = create_pixmap (observeDialog, "observe-bandeau.png"); gtk_widget_show (image15); gtk_box_pack_start (GTK_BOX (hbox20), image15, FALSE, FALSE, 10); gtk_widget_set_size_request (image15, -1, 400); gtk_misc_set_alignment (GTK_MISC (image15), 0.5, 1); vbox20 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox20); gtk_box_pack_start (GTK_BOX (hbox20), vbox20, TRUE, TRUE, 0); hbox60 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox60); gtk_box_pack_start (GTK_BOX (vbox20), hbox60, FALSE, FALSE, 0); radioObserve = gtk_radio_button_new (NULL); gtk_widget_show (radioObserve); gtk_box_pack_start (GTK_BOX (hbox60), radioObserve, TRUE, TRUE, 0); gtk_widget_add_accelerator (radioObserve, "clicked", accel_group, GDK_KEY_o, (GdkModifierType) GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); gtk_radio_button_set_group (GTK_RADIO_BUTTON (radioObserve), radioObserve_group); radioObserve_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radioObserve)); alignment8 = gtk_alignment_new (0.5, 0.5, 0, 0); gtk_widget_show (alignment8); gtk_container_add (GTK_CONTAINER (radioObserve), alignment8); hbox21 = gtk_hbox_new (FALSE, 2); gtk_widget_show (hbox21); gtk_container_add (GTK_CONTAINER (alignment8), hbox21); image16 = gtk_image_new_from_stock ("gtk-zoom-fit", GTK_ICON_SIZE_BUTTON); gtk_widget_show (image16); gtk_box_pack_start (GTK_BOX (hbox21), image16, FALSE, FALSE, 0); labelObserve = gtk_label_new_with_mnemonic (_("Observe")); gtk_widget_show (labelObserve); gtk_box_pack_start (GTK_BOX (hbox21), labelObserve, FALSE, FALSE, 0); hboxObserve = gtk_hbox_new (FALSE, 0); gtk_widget_show (hboxObserve); gtk_box_pack_start (GTK_BOX (hbox60), hboxObserve, FALSE, FALSE, 0); label66 = gtk_label_new ("("); gtk_widget_show (label66); gtk_box_pack_start (GTK_BOX (hboxObserve), label66, FALSE, FALSE, 0); radioObserveConstrained = gtk_radio_button_new_with_mnemonic (NULL, _("constrained")); gtk_widget_show (radioObserveConstrained); gtk_box_pack_start (GTK_BOX (hboxObserve), radioObserveConstrained, FALSE, FALSE, 0); gtk_tooltips_set_tip (tooltips, radioObserveConstrained, _("Movement are along meridians when the mouse is dragged along y axis and along parallels when the movement is along x axis."), NULL); gtk_radio_button_set_group (GTK_RADIO_BUTTON (radioObserveConstrained), radioObserveConstrained_group); radioObserveConstrained_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radioObserveConstrained)); radioObserveWalker = gtk_radio_button_new_with_mnemonic (NULL, _("walker")); gtk_widget_show (radioObserveWalker); gtk_box_pack_start (GTK_BOX (hboxObserve), radioObserveWalker, FALSE, FALSE, 0); gtk_tooltips_set_tip (tooltips, radioObserveWalker, _("Movements are those of a walking ant on a sphere, when mouse move along y axis, the ant goes strait on, when mouse is dragged along x axis, the ant translates on its right or on its left."), NULL); gtk_radio_button_set_group (GTK_RADIO_BUTTON (radioObserveWalker), radioObserveConstrained_group); radioObserveConstrained_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radioObserveWalker)); label67 = gtk_label_new (")"); gtk_widget_show (label67); gtk_box_pack_start (GTK_BOX (hboxObserve), label67, FALSE, FALSE, 0); tableObserve = gtk_table_new (3, 7, FALSE); gtk_widget_show (tableObserve); gtk_box_pack_start (GTK_BOX (vbox20), tableObserve, FALSE, FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (tableObserve), 3); gtk_table_set_col_spacings (GTK_TABLE (tableObserve), 2); labelTranslation = gtk_label_new (_("Translations")); gtk_widget_show (labelTranslation); gtk_table_attach (GTK_TABLE (tableObserve), labelTranslation, 0, 2, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (labelTranslation), 0, 0.5); labelZoom = gtk_label_new (_("Scale")); gtk_widget_show (labelZoom); gtk_table_attach (GTK_TABLE (tableObserve), labelZoom, 0, 2, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (labelZoom), 0, 0.5); spinOmega = gtk_spin_button_new_with_range(-360, 360, 5); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinOmega), 0); gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinOmega), 1); gtk_entry_set_width_chars(GTK_ENTRY(spinOmega), 6); gtk_widget_show (spinOmega); gtk_table_attach (GTK_TABLE (tableObserve), spinOmega, 5, 6, 0, 1, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinOmega), TRUE); spinPhi = gtk_spin_button_new_with_range(-360, 360, 5); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinPhi), -50); gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinPhi), 1); gtk_entry_set_width_chars(GTK_ENTRY(spinPhi), 6); gtk_widget_show (spinPhi); gtk_table_attach (GTK_TABLE (tableObserve), spinPhi, 3, 4, 0, 1, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinPhi), TRUE); spinDx = gtk_spin_button_new_with_range(-3, 3, 0.05); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinDx), 0.5); gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinDx), 3); gtk_entry_set_width_chars(GTK_ENTRY(spinDx), 6); gtk_widget_show (spinDx); gtk_table_attach (GTK_TABLE (tableObserve), spinDx, 3, 4, 1, 2, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinDx), TRUE); spinGross = gtk_spin_button_new_with_range(0.02, 999, 0.1); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinGross), 1); gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinGross), 3); gtk_entry_set_width_chars(GTK_ENTRY(spinGross), 6); gtk_widget_show (spinGross); gtk_table_attach (GTK_TABLE (tableObserve), spinGross, 3, 4, 2, 3, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinGross), TRUE); spinTheta = gtk_spin_button_new_with_range(-360, 360, 5); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinTheta), 40); gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinTheta), 1); gtk_entry_set_width_chars(GTK_ENTRY(spinTheta), 6); gtk_widget_show (spinTheta); gtk_table_attach (GTK_TABLE (tableObserve), spinTheta, 1, 2, 0, 1, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinTheta), TRUE); label58 = gtk_label_new (_("omega:")); gtk_widget_show (label58); gtk_table_attach (GTK_TABLE (tableObserve), label58, 4, 5, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label58), 1, 0.5); label32 = gtk_label_new (_("phi:")); gtk_widget_show (label32); gtk_table_attach (GTK_TABLE (tableObserve), label32, 2, 3, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label32), 1, 0.5); label33 = gtk_label_new (_("dx:")); gtk_widget_show (label33); gtk_table_attach (GTK_TABLE (tableObserve), label33, 2, 3, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label33), 1, 0.5); label35 = gtk_label_new (_("zoom:")); gtk_widget_show (label35); gtk_table_attach (GTK_TABLE (tableObserve), label35, 2, 3, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label35), 1, 0.5); label31 = gtk_label_new (_("theta:")); gtk_widget_show (label31); gtk_table_attach (GTK_TABLE (tableObserve), label31, 0, 1, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label31), 1, 0.5); buttonVisuUiOrientationChooser = gtk_button_new (); gtk_widget_show (buttonVisuUiOrientationChooser); gtk_table_attach (GTK_TABLE (tableObserve), buttonVisuUiOrientationChooser, 6, 7, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); image51 = create_pixmap (observeDialog, "axes-button.png"); gtk_widget_show (image51); gtk_container_add (GTK_CONTAINER (buttonVisuUiOrientationChooser), image51); label34 = gtk_label_new (_("dy:")); gtk_widget_show (label34); gtk_table_attach (GTK_TABLE (tableObserve), label34, 4, 5, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label34), 1, 0.5); label36 = gtk_label_new (_("persp.:")); gtk_widget_show (label36); gtk_table_attach (GTK_TABLE (tableObserve), label36, 4, 5, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label36), 1, 0.5); spinDy = gtk_spin_button_new_with_range(-3, 3, 0.05); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinDy), 0.5); gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinDy), 3); gtk_entry_set_width_chars(GTK_ENTRY(spinDy), 6); gtk_widget_show (spinDy); gtk_table_attach (GTK_TABLE (tableObserve), spinDy, 5, 6, 1, 2, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinDy), TRUE); spinPersp = gtk_spin_button_new_with_range(1.1, 100, 0.5); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinPersp), 5); gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinPersp), 1); gtk_entry_set_width_chars(GTK_ENTRY(spinPersp), 6); gtk_widget_show (spinPersp); gtk_table_attach (GTK_TABLE (tableObserve), spinPersp, 5, 6, 2, 3, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinPersp), TRUE); notebookAction = gtk_notebook_new (); gtk_widget_show (notebookAction); gtk_box_pack_start (GTK_BOX (vbox20), notebookAction, TRUE, TRUE, 0); vbox7 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox7); gtk_container_add (GTK_CONTAINER (notebookAction), vbox7); hboxPick = gtk_hbox_new (FALSE, 0); gtk_widget_show (hboxPick); gtk_box_pack_start (GTK_BOX (vbox7), hboxPick, FALSE, FALSE, 0); radioPick = gtk_radio_button_new (NULL); gtk_widget_show (radioPick); gtk_box_pack_start (GTK_BOX (hboxPick), radioPick, TRUE, TRUE, 0); gtk_widget_add_accelerator (radioPick, "clicked", accel_group, GDK_KEY_p, (GdkModifierType) GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); gtk_radio_button_set_group (GTK_RADIO_BUTTON (radioPick), radioPick_group); radioPick_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radioPick)); alignment9 = gtk_alignment_new (0.5, 0.5, 0, 0); gtk_widget_show (alignment9); gtk_container_add (GTK_CONTAINER (radioPick), alignment9); hbox22 = gtk_hbox_new (FALSE, 2); gtk_widget_show (hbox22); gtk_container_add (GTK_CONTAINER (alignment9), hbox22); image17 = gtk_image_new_from_stock ("gtk-color-picker", GTK_ICON_SIZE_BUTTON); gtk_widget_show (image17); gtk_box_pack_start (GTK_BOX (hbox22), image17, FALSE, FALSE, 0); labelPick = gtk_label_new_with_mnemonic (_("Pick")); gtk_widget_show (labelPick); gtk_box_pack_start (GTK_BOX (hbox22), labelPick, FALSE, FALSE, 0); alignment39 = gtk_alignment_new (0.5, 0.5, 1, 1); gtk_widget_show (alignment39); gtk_box_pack_start (GTK_BOX (vbox7), alignment39, TRUE, TRUE, 0); gtk_alignment_set_padding (GTK_ALIGNMENT (alignment39), 0, 0, 10, 10); vpaned1 = gtk_vpaned_new (); gtk_widget_show (vpaned1); gtk_container_add (GTK_CONTAINER (alignment39), vpaned1); vbox26 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox26); gtk_paned_pack1 (GTK_PANED (vpaned1), vbox26, TRUE, FALSE); scrolledwindow6 = gtk_scrolled_window_new (NULL, NULL); gtk_widget_show (scrolledwindow6); gtk_box_pack_start (GTK_BOX (vbox26), scrolledwindow6, TRUE, TRUE, 0); gtk_widget_set_size_request (scrolledwindow6, -1, 100); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow6), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); viewportPick = gtk_viewport_new (NULL, NULL); gtk_widget_show (viewportPick); gtk_container_add (GTK_CONTAINER (scrolledwindow6), viewportPick); vbox24 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox24); gtk_container_add (GTK_CONTAINER (viewportPick), vbox24); pickInfo = gtk_label_new (""); gtk_widget_show (pickInfo); gtk_box_pack_start (GTK_BOX (vbox24), pickInfo, FALSE, FALSE, 0); gtk_widget_set_can_focus (pickInfo, TRUE); gtk_label_set_line_wrap (GTK_LABEL (pickInfo), TRUE); gtk_label_set_selectable (GTK_LABEL (pickInfo), TRUE); gtk_misc_set_alignment (GTK_MISC (pickInfo), 0, 0.5); gtk_misc_set_padding (GTK_MISC (pickInfo), 15, 0); pickComment = gtk_label_new (""); gtk_widget_show (pickComment); gtk_box_pack_start (GTK_BOX (vbox24), pickComment, FALSE, FALSE, 0); gtk_label_set_justify (GTK_LABEL (pickComment), GTK_JUSTIFY_CENTER); gtk_label_set_line_wrap (GTK_LABEL (pickComment), TRUE); hbox57 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox57); gtk_box_pack_end (GTK_BOX (vbox26), hbox57, FALSE, FALSE, 0); checkDrawDistance = gtk_check_button_new_with_mnemonic (_("Persistent measures")); gtk_widget_show (checkDrawDistance); gtk_box_pack_start (GTK_BOX (hbox57), checkDrawDistance, FALSE, FALSE, 0); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkDrawDistance), TRUE); buttonEraseDistances = gtk_button_new (); gtk_widget_show (buttonEraseDistances); gtk_box_pack_start (GTK_BOX (hbox57), buttonEraseDistances, FALSE, FALSE, 0); gtk_tooltips_set_tip (tooltips, buttonEraseDistances, _("Remove all drawn measurements."), NULL); gtk_button_set_focus_on_click (GTK_BUTTON (buttonEraseDistances), FALSE); image54 = gtk_image_new_from_stock ("gtk-clear", GTK_ICON_SIZE_MENU); gtk_widget_show (image54); gtk_container_add (GTK_CONTAINER (buttonEraseDistances), image54); labelMarks = gtk_label_new (_("Highlights (none):")); gtk_widget_show (labelMarks); gtk_box_pack_start (GTK_BOX (hbox57), labelMarks, TRUE, TRUE, 0); gtk_label_set_use_markup (GTK_LABEL (labelMarks), TRUE); gtk_misc_set_alignment (GTK_MISC (labelMarks), 1, 0.5); gtk_misc_set_padding (GTK_MISC (labelMarks), 5, 0); hboxMarks = gtk_hbox_new (FALSE, 0); gtk_widget_show (hboxMarks); gtk_box_pack_start (GTK_BOX (hbox57), hboxMarks, FALSE, FALSE, 0); buttonSetMarks = gtk_button_new (); gtk_widget_show (buttonSetMarks); gtk_box_pack_start (GTK_BOX (hboxMarks), buttonSetMarks, FALSE, FALSE, 0); gtk_tooltips_set_tip (tooltips, buttonSetMarks, _("Add highlighted nodes to the list below."), NULL); image56 = gtk_image_new_from_stock ("gtk-go-down", GTK_ICON_SIZE_MENU); gtk_widget_show (image56); gtk_container_add (GTK_CONTAINER (buttonSetMarks), image56); buttonEraseMarks = gtk_button_new (); gtk_widget_show (buttonEraseMarks); gtk_box_pack_end (GTK_BOX (hboxMarks), buttonEraseMarks, FALSE, FALSE, 0); gtk_tooltips_set_tip (tooltips, buttonEraseMarks, _("Remove all highlight marks."), NULL); image55 = gtk_image_new_from_stock ("gtk-clear", GTK_ICON_SIZE_MENU); gtk_widget_show (image55); gtk_container_add (GTK_CONTAINER (buttonEraseMarks), image55); vbox25 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox25); gtk_paned_pack2 (GTK_PANED (vpaned1), vbox25, TRUE, FALSE); gtk_widget_set_size_request (vbox25, -1, 152); hbox64 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox64); gtk_box_pack_start (GTK_BOX (vbox25), hbox64, FALSE, FALSE, 0); labelList = gtk_label_new (_("List of nodes (none)")); gtk_widget_show (labelList); gtk_box_pack_start (GTK_BOX (hbox64), labelList, TRUE, TRUE, 0); gtk_label_set_use_markup (GTK_LABEL (labelList), TRUE); gtk_misc_set_alignment (GTK_MISC (labelList), 0, 0.5); image47 = gtk_image_new_from_stock ("gtk-help", GTK_ICON_SIZE_MENU); gtk_widget_show (image47); gtk_box_pack_start (GTK_BOX (hbox64), image47, FALSE, FALSE, 0); gtk_misc_set_padding (GTK_MISC (image47), 3, 0); label118 = gtk_label_new (_("Values in blue are editable")); gtk_widget_show (label118); gtk_box_pack_start (GTK_BOX (hbox64), label118, FALSE, FALSE, 0); gtk_label_set_use_markup (GTK_LABEL (label118), TRUE); hbox74 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox74); gtk_box_pack_start (GTK_BOX (vbox25), hbox74, TRUE, TRUE, 0); label128 = gtk_label_new (_("Draw data on nodes")); gtk_widget_show (label128); gtk_box_pack_start (GTK_BOX (vbox25), label128, FALSE, FALSE, 0); gtk_label_set_use_markup (GTK_LABEL (label128), TRUE); gtk_misc_set_alignment (GTK_MISC (label128), 0, 0.5); hbox70 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox70); gtk_box_pack_start (GTK_BOX (vbox25), hbox70, FALSE, FALSE, 0); alignment40 = gtk_alignment_new (0.5, 0.5, 1, 1); gtk_widget_show (alignment40); gtk_box_pack_start (GTK_BOX (hbox70), alignment40, FALSE, FALSE, 0); gtk_alignment_set_padding (GTK_ALIGNMENT (alignment40), 0, 0, 5, 0); radioDrawNever = gtk_radio_button_new_with_mnemonic (NULL, _("none")); gtk_widget_show (radioDrawNever); gtk_container_add (GTK_CONTAINER (alignment40), radioDrawNever); gtk_radio_button_set_group (GTK_RADIO_BUTTON (radioDrawNever), radioDrawNever_group); radioDrawNever_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radioDrawNever)); radioDrawSelected = gtk_radio_button_new_with_mnemonic (NULL, _("listed")); gtk_widget_show (radioDrawSelected); gtk_box_pack_start (GTK_BOX (hbox70), radioDrawSelected, FALSE, FALSE, 0); gtk_radio_button_set_group (GTK_RADIO_BUTTON (radioDrawSelected), radioDrawNever_group); radioDrawNever_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radioDrawSelected)); radioDrawAlways = gtk_radio_button_new_with_mnemonic (NULL, _("all")); gtk_widget_show (radioDrawAlways); gtk_box_pack_start (GTK_BOX (hbox70), radioDrawAlways, TRUE, TRUE, 0); gtk_radio_button_set_group (GTK_RADIO_BUTTON (radioDrawAlways), radioDrawNever_group); radioDrawNever_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radioDrawAlways)); comboboxShowInfos = gtk_combo_box_text_new(); gtk_widget_show (comboboxShowInfos); gtk_box_pack_start (GTK_BOX (hbox70), comboboxShowInfos, TRUE, TRUE, 0); label87 = gtk_label_new (_("Pick")); gtk_widget_show (label87); gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebookAction), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebookAction), 0), label87); vbox27 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox27); gtk_container_add (GTK_CONTAINER (notebookAction), vbox27); radioMove = gtk_radio_button_new (NULL); gtk_widget_show (radioMove); gtk_box_pack_start (GTK_BOX (vbox27), radioMove, FALSE, FALSE, 0); gtk_radio_button_set_group (GTK_RADIO_BUTTON (radioMove), radioMove_group); radioMove_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radioMove)); alignment28 = gtk_alignment_new (0.5, 0.5, 0, 0); gtk_widget_show (alignment28); gtk_container_add (GTK_CONTAINER (radioMove), alignment28); hbox59 = gtk_hbox_new (FALSE, 2); gtk_widget_show (hbox59); gtk_container_add (GTK_CONTAINER (alignment28), hbox59); image44 = gtk_image_new_from_stock ("gtk-jump-to", GTK_ICON_SIZE_BUTTON); gtk_widget_show (image44); gtk_box_pack_start (GTK_BOX (hbox59), image44, FALSE, FALSE, 0); label111 = gtk_label_new_with_mnemonic (_("Modify nodes (position, numbers...)")); gtk_widget_show (label111); gtk_box_pack_start (GTK_BOX (hbox59), label111, FALSE, FALSE, 0); alignment41 = gtk_alignment_new (0.5, 0.5, 1, 1); gtk_widget_show (alignment41); gtk_box_pack_start (GTK_BOX (vbox27), alignment41, TRUE, TRUE, 0); gtk_alignment_set_padding (GTK_ALIGNMENT (alignment41), 0, 0, 10, 10); vbox21 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox21); gtk_container_add (GTK_CONTAINER (alignment41), vbox21); hbox72 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox72); gtk_box_pack_start (GTK_BOX (vbox21), hbox72, FALSE, FALSE, 0); label90 = gtk_label_new (_("Move or delete:")); gtk_widget_show (label90); gtk_box_pack_start (GTK_BOX (hbox72), label90, FALSE, FALSE, 0); gtk_label_set_use_markup (GTK_LABEL (label90), TRUE); gtk_misc_set_alignment (GTK_MISC (label90), 0, 0.5); radioMovePick = gtk_radio_button_new_with_mnemonic (NULL, _("picked _node")); gtk_widget_show (radioMovePick); gtk_box_pack_start (GTK_BOX (hbox72), radioMovePick, FALSE, FALSE, 0); gtk_radio_button_set_group (GTK_RADIO_BUTTON (radioMovePick), radioMovePick_group); radioMovePick_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radioMovePick)); alignment42 = gtk_alignment_new (0.5, 0.5, 1, 1); gtk_widget_show (alignment42); gtk_box_pack_start (GTK_BOX (hbox72), alignment42, FALSE, FALSE, 0); gtk_alignment_set_padding (GTK_ALIGNMENT (alignment42), 0, 0, 0, 10); radioMoveRegion = gtk_radio_button_new_with_mnemonic (NULL, _("_selected nodes")); gtk_widget_show (radioMoveRegion); gtk_container_add (GTK_CONTAINER (alignment42), radioMoveRegion); gtk_radio_button_set_group (GTK_RADIO_BUTTON (radioMoveRegion), radioMovePick_group); radioMovePick_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radioMoveRegion)); labelNMoves = gtk_label_new ("nb"); gtk_widget_show (labelNMoves); gtk_box_pack_start (GTK_BOX (hbox72), labelNMoves, FALSE, FALSE, 0); gtk_label_set_use_markup (GTK_LABEL (labelNMoves), TRUE); gtk_misc_set_alignment (GTK_MISC (labelNMoves), 1, 0.5); alignment44 = gtk_alignment_new (0.5, 0.5, 1, 1); gtk_widget_show (alignment44); gtk_box_pack_start (GTK_BOX (vbox21), alignment44, FALSE, FALSE, 0); gtk_alignment_set_padding (GTK_ALIGNMENT (alignment44), 0, 10, 0, 0); label136 = gtk_label_new (_("(selected nodes are listed in the pick tab)")); gtk_widget_show (label136); gtk_container_add (GTK_CONTAINER (alignment44), label136); gtk_label_set_use_markup (GTK_LABEL (label136), TRUE); gtk_misc_set_alignment (GTK_MISC (label136), 1, 0.5); alignment27 = gtk_alignment_new (0.5, 0.5, 1, 1); gtk_widget_show (alignment27); gtk_box_pack_start (GTK_BOX (vbox21), alignment27, FALSE, FALSE, 0); gtk_alignment_set_padding (GTK_ALIGNMENT (alignment27), 0, 0, 5, 0); tableMovePick = gtk_table_new (3, 8, FALSE); gtk_widget_show (tableMovePick); gtk_container_add (GTK_CONTAINER (alignment27), tableMovePick); gtk_table_set_col_spacings (GTK_TABLE (tableMovePick), 5); label138 = gtk_label_new (_("Specific moving axis:")); gtk_widget_show (label138); gtk_table_attach (GTK_TABLE (tableMovePick), label138, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_label_set_use_markup (GTK_LABEL (label138), TRUE); gtk_misc_set_alignment (GTK_MISC (label138), 1, 0.5); gtk_misc_set_padding (GTK_MISC (label138), 15, 0); label95 = gtk_label_new ("z"); gtk_widget_show (label95); gtk_table_attach (GTK_TABLE (tableMovePick), label95, 5, 7, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_label_set_use_markup (GTK_LABEL (label95), TRUE); gtk_misc_set_alignment (GTK_MISC (label95), 0.5, 1); gtk_misc_set_padding (GTK_MISC (label95), 0, 2); label94 = gtk_label_new ("y"); gtk_widget_show (label94); gtk_table_attach (GTK_TABLE (tableMovePick), label94, 3, 5, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_label_set_use_markup (GTK_LABEL (label94), TRUE); gtk_misc_set_alignment (GTK_MISC (label94), 0.5, 1); gtk_misc_set_padding (GTK_MISC (label94), 0, 2); label93 = gtk_label_new ("x"); gtk_widget_show (label93); gtk_table_attach (GTK_TABLE (tableMovePick), label93, 1, 3, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_label_set_use_markup (GTK_LABEL (label93), TRUE); gtk_misc_set_alignment (GTK_MISC (label93), 0.5, 1); gtk_misc_set_padding (GTK_MISC (label93), 0, 2); label102 = gtk_label_new (_("Current pos./trans.:")); gtk_widget_show (label102); gtk_table_attach (GTK_TABLE (tableMovePick), label102, 0, 1, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label102), 1, 0.5); gtk_misc_set_padding (GTK_MISC (label102), 15, 0); labelOriginalX = gtk_label_new (""); gtk_widget_show (labelOriginalX); gtk_table_attach (GTK_TABLE (tableMovePick), labelOriginalX, 2, 3, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_widget_set_size_request (labelOriginalX, 35, -1); gtk_label_set_use_markup (GTK_LABEL (labelOriginalX), TRUE); gtk_misc_set_alignment (GTK_MISC (labelOriginalX), 0, 0.5); labelOriginalY = gtk_label_new (""); gtk_widget_show (labelOriginalY); gtk_table_attach (GTK_TABLE (tableMovePick), labelOriginalY, 4, 5, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_widget_set_size_request (labelOriginalY, 35, -1); gtk_label_set_use_markup (GTK_LABEL (labelOriginalY), TRUE); gtk_misc_set_alignment (GTK_MISC (labelOriginalY), 0, 0.5); labelOriginalZ = gtk_label_new (""); gtk_widget_show (labelOriginalZ); gtk_table_attach (GTK_TABLE (tableMovePick), labelOriginalZ, 6, 7, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_widget_set_size_request (labelOriginalZ, 35, -1); gtk_label_set_use_markup (GTK_LABEL (labelOriginalZ), TRUE); gtk_misc_set_alignment (GTK_MISC (labelOriginalZ), 0, 0.5); label125 = gtk_label_new (_("Add a new node:")); gtk_widget_show (label125); gtk_box_pack_start (GTK_BOX (vbox21), label125, FALSE, FALSE, 0); gtk_label_set_use_markup (GTK_LABEL (label125), TRUE); gtk_misc_set_alignment (GTK_MISC (label125), 0, 1); gtk_misc_set_padding (GTK_MISC (label125), 0, 5); hboxAddNode = gtk_hbox_new (FALSE, 5); gtk_widget_show (hboxAddNode); gtk_box_pack_start (GTK_BOX (vbox21), hboxAddNode, FALSE, FALSE, 0); label126 = gtk_label_new (_("position:")); gtk_widget_show (label126); gtk_box_pack_start (GTK_BOX (hboxAddNode), label126, TRUE, TRUE, 0); gtk_misc_set_alignment (GTK_MISC (label126), 1, 0.5); gtk_misc_set_padding (GTK_MISC (label126), 15, 0); hbox67 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox67); gtk_box_pack_end (GTK_BOX (vbox21), hbox67, FALSE, FALSE, 0); label120 = gtk_label_new (_("Screen basis set:")); gtk_widget_show (label120); gtk_box_pack_start (GTK_BOX (hbox67), label120, FALSE, FALSE, 0); gtk_label_set_use_markup (GTK_LABEL (label120), TRUE); gtk_misc_set_alignment (GTK_MISC (label120), 0, 1); label121 = gtk_label_new (_("horiz.")); gtk_widget_show (label121); gtk_box_pack_start (GTK_BOX (hbox67), label121, TRUE, TRUE, 0); gtk_label_set_use_markup (GTK_LABEL (label121), TRUE); gtk_misc_set_alignment (GTK_MISC (label121), 1, 0.5); gtk_misc_set_padding (GTK_MISC (label121), 5, 0); labelHorizontalAxe = gtk_label_new (""); gtk_widget_show (labelHorizontalAxe); gtk_box_pack_start (GTK_BOX (hbox67), labelHorizontalAxe, FALSE, FALSE, 0); label123 = gtk_label_new (_("vert.")); gtk_widget_show (label123); gtk_box_pack_start (GTK_BOX (hbox67), label123, TRUE, TRUE, 0); gtk_label_set_use_markup (GTK_LABEL (label123), TRUE); gtk_misc_set_alignment (GTK_MISC (label123), 1, 0.5); gtk_misc_set_padding (GTK_MISC (label123), 5, 0); labelVerticalAxe = gtk_label_new (""); gtk_widget_show (labelVerticalAxe); gtk_box_pack_start (GTK_BOX (hbox67), labelVerticalAxe, FALSE, FALSE, 0); label88 = gtk_label_new (_("Geometry changes")); gtk_widget_show (label88); gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebookAction), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebookAction), 1), label88); frame2 = gtk_frame_new (NULL); gtk_widget_show (frame2); gtk_box_pack_end (GTK_BOX (vbox20), frame2, FALSE, FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (frame2), 3); labelInfoObservePick = gtk_label_new (""); gtk_widget_show (labelInfoObservePick); gtk_container_add (GTK_CONTAINER (frame2), labelInfoObservePick); gtk_label_set_use_markup (GTK_LABEL (labelInfoObservePick), TRUE); gtk_label_set_line_wrap (GTK_LABEL (labelInfoObservePick), TRUE); gtk_misc_set_alignment (GTK_MISC (labelInfoObservePick), 0, 0.5); gtk_misc_set_padding (GTK_MISC (labelInfoObservePick), 2, 0); hbox23 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox23); gtk_frame_set_label_widget (GTK_FRAME (frame2), hbox23); image18 = gtk_image_new_from_stock ("gtk-help", GTK_ICON_SIZE_MENU); gtk_widget_show (image18); gtk_box_pack_start (GTK_BOX (hbox23), image18, TRUE, TRUE, 0); label39 = gtk_label_new (_("Help")); gtk_widget_show (label39); gtk_box_pack_start (GTK_BOX (hbox23), label39, FALSE, FALSE, 0); dialog_action_area3 = gtk_dialog_get_action_area (GTK_DIALOG (observeDialog)); gtk_widget_show (dialog_action_area3); gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area3), GTK_BUTTONBOX_END); buttonBackToCommandPanel = gtk_button_new (); gtk_widget_show (buttonBackToCommandPanel); gtk_dialog_add_action_widget (GTK_DIALOG (observeDialog), buttonBackToCommandPanel, GTK_RESPONSE_CLOSE); gtk_widget_set_can_default (buttonBackToCommandPanel, TRUE); alignment12 = gtk_alignment_new (0.5, 0.5, 0, 0); gtk_widget_show (alignment12); gtk_container_add (GTK_CONTAINER (buttonBackToCommandPanel), alignment12); hbox41 = gtk_hbox_new (FALSE, 2); gtk_widget_show (hbox41); gtk_container_add (GTK_CONTAINER (alignment12), hbox41); image31 = gtk_image_new_from_stock ("gtk-go-back", GTK_ICON_SIZE_BUTTON); gtk_widget_show (image31); gtk_box_pack_start (GTK_BOX (hbox41), image31, FALSE, FALSE, 0); label68 = gtk_label_new_with_mnemonic (_("Back to command panel")); gtk_widget_show (label68); gtk_box_pack_start (GTK_BOX (hbox41), label68, FALSE, FALSE, 0); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (observeDialog, observeDialog, "observeDialog"); GLADE_HOOKUP_OBJECT_NO_REF (observeDialog, dialog_vbox3, "dialog_vbox3"); GLADE_HOOKUP_OBJECT (observeDialog, hbox20, "hbox20"); GLADE_HOOKUP_OBJECT (observeDialog, image15, "image15"); GLADE_HOOKUP_OBJECT (observeDialog, vbox20, "vbox20"); GLADE_HOOKUP_OBJECT (observeDialog, hbox60, "hbox60"); GLADE_HOOKUP_OBJECT (observeDialog, radioObserve, "radioObserve"); GLADE_HOOKUP_OBJECT (observeDialog, alignment8, "alignment8"); GLADE_HOOKUP_OBJECT (observeDialog, hbox21, "hbox21"); GLADE_HOOKUP_OBJECT (observeDialog, image16, "image16"); GLADE_HOOKUP_OBJECT (observeDialog, labelObserve, "labelObserve"); GLADE_HOOKUP_OBJECT (observeDialog, hboxObserve, "hboxObserve"); GLADE_HOOKUP_OBJECT (observeDialog, label66, "label66"); GLADE_HOOKUP_OBJECT (observeDialog, radioObserveConstrained, "radioObserveConstrained"); GLADE_HOOKUP_OBJECT (observeDialog, radioObserveWalker, "radioObserveWalker"); GLADE_HOOKUP_OBJECT (observeDialog, label67, "label67"); GLADE_HOOKUP_OBJECT (observeDialog, tableObserve, "tableObserve"); GLADE_HOOKUP_OBJECT (observeDialog, labelTranslation, "labelTranslation"); GLADE_HOOKUP_OBJECT (observeDialog, labelZoom, "labelZoom"); GLADE_HOOKUP_OBJECT (observeDialog, spinOmega, "spinOmega"); GLADE_HOOKUP_OBJECT (observeDialog, spinPhi, "spinPhi"); GLADE_HOOKUP_OBJECT (observeDialog, spinDx, "spinDx"); GLADE_HOOKUP_OBJECT (observeDialog, spinGross, "spinGross"); GLADE_HOOKUP_OBJECT (observeDialog, spinTheta, "spinTheta"); GLADE_HOOKUP_OBJECT (observeDialog, label58, "label58"); GLADE_HOOKUP_OBJECT (observeDialog, label32, "label32"); GLADE_HOOKUP_OBJECT (observeDialog, label33, "label33"); GLADE_HOOKUP_OBJECT (observeDialog, label35, "label35"); GLADE_HOOKUP_OBJECT (observeDialog, label31, "label31"); GLADE_HOOKUP_OBJECT (observeDialog, buttonVisuUiOrientationChooser, "buttonVisuUiOrientationChooser"); GLADE_HOOKUP_OBJECT (observeDialog, image51, "image51"); GLADE_HOOKUP_OBJECT (observeDialog, label34, "label34"); GLADE_HOOKUP_OBJECT (observeDialog, label36, "label36"); GLADE_HOOKUP_OBJECT (observeDialog, spinDy, "spinDy"); GLADE_HOOKUP_OBJECT (observeDialog, spinPersp, "spinPersp"); GLADE_HOOKUP_OBJECT (observeDialog, notebookAction, "notebookAction"); GLADE_HOOKUP_OBJECT (observeDialog, vbox7, "vbox7"); GLADE_HOOKUP_OBJECT (observeDialog, hboxPick, "hboxPick"); GLADE_HOOKUP_OBJECT (observeDialog, radioPick, "radioPick"); GLADE_HOOKUP_OBJECT (observeDialog, alignment9, "alignment9"); GLADE_HOOKUP_OBJECT (observeDialog, hbox22, "hbox22"); GLADE_HOOKUP_OBJECT (observeDialog, image17, "image17"); GLADE_HOOKUP_OBJECT (observeDialog, labelPick, "labelPick"); GLADE_HOOKUP_OBJECT (observeDialog, alignment39, "alignment39"); GLADE_HOOKUP_OBJECT (observeDialog, vpaned1, "vpaned1"); GLADE_HOOKUP_OBJECT (observeDialog, vbox26, "vbox26"); GLADE_HOOKUP_OBJECT (observeDialog, scrolledwindow6, "scrolledwindow6"); GLADE_HOOKUP_OBJECT (observeDialog, viewportPick, "viewportPick"); GLADE_HOOKUP_OBJECT (observeDialog, vbox24, "vbox24"); GLADE_HOOKUP_OBJECT (observeDialog, pickInfo, "pickInfo"); GLADE_HOOKUP_OBJECT (observeDialog, pickComment, "pickComment"); GLADE_HOOKUP_OBJECT (observeDialog, hbox57, "hbox57"); GLADE_HOOKUP_OBJECT (observeDialog, checkDrawDistance, "checkDrawDistance"); GLADE_HOOKUP_OBJECT (observeDialog, buttonEraseDistances, "buttonEraseDistances"); GLADE_HOOKUP_OBJECT (observeDialog, image54, "image54"); GLADE_HOOKUP_OBJECT (observeDialog, labelMarks, "labelMarks"); GLADE_HOOKUP_OBJECT (observeDialog, hboxMarks, "hboxMarks"); GLADE_HOOKUP_OBJECT (observeDialog, buttonSetMarks, "buttonSetMarks"); GLADE_HOOKUP_OBJECT (observeDialog, image56, "image56"); GLADE_HOOKUP_OBJECT (observeDialog, buttonEraseMarks, "buttonEraseMarks"); GLADE_HOOKUP_OBJECT (observeDialog, image55, "image55"); GLADE_HOOKUP_OBJECT (observeDialog, vbox25, "vbox25"); GLADE_HOOKUP_OBJECT (observeDialog, hbox64, "hbox64"); GLADE_HOOKUP_OBJECT (observeDialog, labelList, "labelList"); GLADE_HOOKUP_OBJECT (observeDialog, image47, "image47"); GLADE_HOOKUP_OBJECT (observeDialog, label118, "label118"); GLADE_HOOKUP_OBJECT (observeDialog, hbox74, "hbox74"); GLADE_HOOKUP_OBJECT (observeDialog, label128, "label128"); GLADE_HOOKUP_OBJECT (observeDialog, hbox70, "hbox70"); GLADE_HOOKUP_OBJECT (observeDialog, alignment40, "alignment40"); GLADE_HOOKUP_OBJECT (observeDialog, radioDrawNever, "radioDrawNever"); GLADE_HOOKUP_OBJECT (observeDialog, radioDrawSelected, "radioDrawSelected"); GLADE_HOOKUP_OBJECT (observeDialog, radioDrawAlways, "radioDrawAlways"); GLADE_HOOKUP_OBJECT (observeDialog, comboboxShowInfos, "comboboxShowInfos"); GLADE_HOOKUP_OBJECT (observeDialog, label87, "label87"); GLADE_HOOKUP_OBJECT (observeDialog, vbox27, "vbox27"); GLADE_HOOKUP_OBJECT (observeDialog, radioMove, "radioMove"); GLADE_HOOKUP_OBJECT (observeDialog, alignment28, "alignment28"); GLADE_HOOKUP_OBJECT (observeDialog, hbox59, "hbox59"); GLADE_HOOKUP_OBJECT (observeDialog, image44, "image44"); GLADE_HOOKUP_OBJECT (observeDialog, label111, "label111"); GLADE_HOOKUP_OBJECT (observeDialog, alignment41, "alignment41"); GLADE_HOOKUP_OBJECT (observeDialog, vbox21, "vbox21"); GLADE_HOOKUP_OBJECT (observeDialog, hbox72, "hbox72"); GLADE_HOOKUP_OBJECT (observeDialog, label90, "label90"); GLADE_HOOKUP_OBJECT (observeDialog, radioMovePick, "radioMovePick"); GLADE_HOOKUP_OBJECT (observeDialog, alignment42, "alignment42"); GLADE_HOOKUP_OBJECT (observeDialog, radioMoveRegion, "radioMoveRegion"); GLADE_HOOKUP_OBJECT (observeDialog, labelNMoves, "labelNMoves"); GLADE_HOOKUP_OBJECT (observeDialog, alignment44, "alignment44"); GLADE_HOOKUP_OBJECT (observeDialog, label136, "label136"); GLADE_HOOKUP_OBJECT (observeDialog, alignment27, "alignment27"); GLADE_HOOKUP_OBJECT (observeDialog, tableMovePick, "tableMovePick"); GLADE_HOOKUP_OBJECT (observeDialog, label138, "label138"); GLADE_HOOKUP_OBJECT (observeDialog, label95, "label95"); GLADE_HOOKUP_OBJECT (observeDialog, label94, "label94"); GLADE_HOOKUP_OBJECT (observeDialog, label93, "label93"); GLADE_HOOKUP_OBJECT (observeDialog, label102, "label102"); GLADE_HOOKUP_OBJECT (observeDialog, labelOriginalX, "labelOriginalX"); GLADE_HOOKUP_OBJECT (observeDialog, labelOriginalY, "labelOriginalY"); GLADE_HOOKUP_OBJECT (observeDialog, labelOriginalZ, "labelOriginalZ"); GLADE_HOOKUP_OBJECT (observeDialog, label125, "label125"); GLADE_HOOKUP_OBJECT (observeDialog, hboxAddNode, "hboxAddNode"); GLADE_HOOKUP_OBJECT (observeDialog, label126, "label126"); GLADE_HOOKUP_OBJECT (observeDialog, hbox67, "hbox67"); GLADE_HOOKUP_OBJECT (observeDialog, label120, "label120"); GLADE_HOOKUP_OBJECT (observeDialog, label121, "label121"); GLADE_HOOKUP_OBJECT (observeDialog, labelHorizontalAxe, "labelHorizontalAxe"); GLADE_HOOKUP_OBJECT (observeDialog, label123, "label123"); GLADE_HOOKUP_OBJECT (observeDialog, labelVerticalAxe, "labelVerticalAxe"); GLADE_HOOKUP_OBJECT (observeDialog, label88, "label88"); GLADE_HOOKUP_OBJECT (observeDialog, frame2, "frame2"); GLADE_HOOKUP_OBJECT (observeDialog, labelInfoObservePick, "labelInfoObservePick"); GLADE_HOOKUP_OBJECT (observeDialog, hbox23, "hbox23"); GLADE_HOOKUP_OBJECT (observeDialog, image18, "image18"); GLADE_HOOKUP_OBJECT (observeDialog, label39, "label39"); GLADE_HOOKUP_OBJECT_NO_REF (observeDialog, dialog_action_area3, "dialog_action_area3"); GLADE_HOOKUP_OBJECT (observeDialog, buttonBackToCommandPanel, "buttonBackToCommandPanel"); GLADE_HOOKUP_OBJECT (observeDialog, alignment12, "alignment12"); GLADE_HOOKUP_OBJECT (observeDialog, hbox41, "hbox41"); GLADE_HOOKUP_OBJECT (observeDialog, image31, "image31"); GLADE_HOOKUP_OBJECT (observeDialog, label68, "label68"); gtk_widget_grab_default (buttonBackToCommandPanel); gtk_window_add_accel_group (GTK_WINDOW (observeDialog), accel_group); return observeDialog; } GtkWidget* create_infoDialog (void) { GtkWidget *infoDialog; GdkPixbuf *infoDialog_icon_pixbuf; GtkWidget *dialog_vbox4; GtkWidget *vbox10; GtkWidget *hbox31; GtkWidget *image26; GtkWidget *vbox11; GtkWidget *table4; GtkWidget *label55; GtkWidget *label56; GtkWidget *label57; GtkWidget *labelInfoVersion; GtkWidget *labelInfoReleaseDate; GtkWidget *labelInfoWebSite; GtkWidget *notebookAbout; GtkWidget *scrolledwindow4; GtkWidget *textviewReadme; GtkWidget *label46; GtkWidget *scrolledwindow3; GtkWidget *textviewAuthors; GtkWidget *label47; GtkWidget *scrolledwindow2; GtkWidget *textviewLicence; GtkWidget *labelLicense; GtkWidget *vbox23; GtkWidget *label116; GtkWidget *scrolledwindowPlugins; GtkWidget *label115; GtkWidget *scrolledwindow7; GtkWidget *textviewChangelog; GtkWidget *label137; GtkWidget *dialog_action_area4; GtkWidget *closebutton2; infoDialog = gtk_dialog_new (); gtk_window_set_title (GTK_WINDOW (infoDialog), _("About V_Sim")); gtk_window_set_position (GTK_WINDOW (infoDialog), GTK_WIN_POS_CENTER); gtk_window_set_modal (GTK_WINDOW (infoDialog), TRUE); infoDialog_icon_pixbuf = create_pixbuf ("icone-about.png"); if (infoDialog_icon_pixbuf) { gtk_window_set_icon (GTK_WINDOW (infoDialog), infoDialog_icon_pixbuf); g_object_unref (infoDialog_icon_pixbuf); } gtk_window_set_type_hint (GTK_WINDOW (infoDialog), GDK_WINDOW_TYPE_HINT_DIALOG); dialog_vbox4 = gtk_dialog_get_content_area(GTK_DIALOG(infoDialog)); gtk_widget_show (dialog_vbox4); vbox10 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox10); gtk_box_pack_start (GTK_BOX (dialog_vbox4), vbox10, TRUE, TRUE, 0); hbox31 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox31); gtk_box_pack_start (GTK_BOX (vbox10), hbox31, TRUE, TRUE, 0); image26 = create_pixmap (infoDialog, "logo_rectangle.png"); gtk_widget_show (image26); gtk_box_pack_start (GTK_BOX (hbox31), image26, FALSE, FALSE, 0); gtk_misc_set_padding (GTK_MISC (image26), 10, 10); vbox11 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox11); gtk_box_pack_start (GTK_BOX (hbox31), vbox11, TRUE, TRUE, 0); table4 = gtk_table_new (3, 2, FALSE); gtk_widget_show (table4); gtk_box_pack_start (GTK_BOX (vbox11), table4, TRUE, FALSE, 0); label55 = gtk_label_new (_("Version :")); gtk_widget_show (label55); gtk_table_attach (GTK_TABLE (table4), label55, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_label_set_use_markup (GTK_LABEL (label55), TRUE); gtk_misc_set_alignment (GTK_MISC (label55), 1, 0.5); label56 = gtk_label_new (_("Release Date :")); gtk_widget_show (label56); gtk_table_attach (GTK_TABLE (table4), label56, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_label_set_use_markup (GTK_LABEL (label56), TRUE); gtk_misc_set_alignment (GTK_MISC (label56), 1, 0.5); label57 = gtk_label_new (_("Web site :")); gtk_widget_show (label57); gtk_table_attach (GTK_TABLE (table4), label57, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_label_set_use_markup (GTK_LABEL (label57), TRUE); gtk_misc_set_alignment (GTK_MISC (label57), 1, 0.5); labelInfoVersion = gtk_label_new ("2.99"); gtk_widget_show (labelInfoVersion); gtk_table_attach (GTK_TABLE (table4), labelInfoVersion, 1, 2, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (labelInfoVersion), 0, 0.5); gtk_misc_set_padding (GTK_MISC (labelInfoVersion), 5, 0); labelInfoReleaseDate = gtk_label_new ("AAAA-MM-JJ"); gtk_widget_show (labelInfoReleaseDate); gtk_table_attach (GTK_TABLE (table4), labelInfoReleaseDate, 1, 2, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (labelInfoReleaseDate), 0, 0.5); gtk_misc_set_padding (GTK_MISC (labelInfoReleaseDate), 5, 0); labelInfoWebSite = gtk_label_new ("http://"); gtk_widget_show (labelInfoWebSite); gtk_table_attach (GTK_TABLE (table4), labelInfoWebSite, 1, 2, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_widget_set_can_focus (labelInfoWebSite, TRUE); gtk_label_set_use_markup (GTK_LABEL (labelInfoWebSite), TRUE); gtk_label_set_selectable (GTK_LABEL (labelInfoWebSite), TRUE); gtk_misc_set_alignment (GTK_MISC (labelInfoWebSite), 0, 0.5); gtk_misc_set_padding (GTK_MISC (labelInfoWebSite), 5, 0); notebookAbout = gtk_notebook_new (); gtk_widget_show (notebookAbout); gtk_box_pack_start (GTK_BOX (vbox10), notebookAbout, TRUE, TRUE, 0); gtk_widget_set_size_request (notebookAbout, 475, 300); scrolledwindow4 = gtk_scrolled_window_new (NULL, NULL); gtk_widget_show (scrolledwindow4); gtk_container_add (GTK_CONTAINER (notebookAbout), scrolledwindow4); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow4), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow4), GTK_SHADOW_ETCHED_IN); textviewReadme = gtk_text_view_new (); gtk_widget_show (textviewReadme); gtk_container_add (GTK_CONTAINER (scrolledwindow4), textviewReadme); gtk_text_view_set_editable (GTK_TEXT_VIEW (textviewReadme), FALSE); gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (textviewReadme), GTK_WRAP_WORD); gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (textviewReadme), FALSE); gtk_text_view_set_left_margin (GTK_TEXT_VIEW (textviewReadme), 2); gtk_text_view_set_right_margin (GTK_TEXT_VIEW (textviewReadme), 2); label46 = gtk_label_new (_("Readme")); gtk_widget_show (label46); gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebookAbout), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebookAbout), 0), label46); scrolledwindow3 = gtk_scrolled_window_new (NULL, NULL); gtk_widget_show (scrolledwindow3); gtk_container_add (GTK_CONTAINER (notebookAbout), scrolledwindow3); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow3), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow3), GTK_SHADOW_ETCHED_IN); textviewAuthors = gtk_text_view_new (); gtk_widget_show (textviewAuthors); gtk_container_add (GTK_CONTAINER (scrolledwindow3), textviewAuthors); gtk_text_view_set_editable (GTK_TEXT_VIEW (textviewAuthors), FALSE); gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (textviewAuthors), GTK_WRAP_WORD); gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (textviewAuthors), FALSE); gtk_text_view_set_left_margin (GTK_TEXT_VIEW (textviewAuthors), 2); gtk_text_view_set_right_margin (GTK_TEXT_VIEW (textviewAuthors), 2); label47 = gtk_label_new (_("Authors")); gtk_widget_show (label47); gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebookAbout), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebookAbout), 1), label47); scrolledwindow2 = gtk_scrolled_window_new (NULL, NULL); gtk_widget_show (scrolledwindow2); gtk_container_add (GTK_CONTAINER (notebookAbout), scrolledwindow2); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow2), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow2), GTK_SHADOW_ETCHED_IN); textviewLicence = gtk_text_view_new (); gtk_widget_show (textviewLicence); gtk_container_add (GTK_CONTAINER (scrolledwindow2), textviewLicence); gtk_text_view_set_editable (GTK_TEXT_VIEW (textviewLicence), FALSE); gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (textviewLicence), FALSE); gtk_text_view_set_left_margin (GTK_TEXT_VIEW (textviewLicence), 2); gtk_text_view_set_right_margin (GTK_TEXT_VIEW (textviewLicence), 2); labelLicense = gtk_label_new (_("License")); gtk_widget_show (labelLicense); gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebookAbout), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebookAbout), 2), labelLicense); vbox23 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox23); gtk_container_add (GTK_CONTAINER (notebookAbout), vbox23); label116 = gtk_label_new (_("Loaded plug-ins:")); gtk_widget_show (label116); gtk_box_pack_start (GTK_BOX (vbox23), label116, FALSE, FALSE, 0); gtk_misc_set_alignment (GTK_MISC (label116), 0, 0.5); gtk_misc_set_padding (GTK_MISC (label116), 15, 5); scrolledwindowPlugins = gtk_scrolled_window_new (NULL, NULL); gtk_widget_show (scrolledwindowPlugins); gtk_box_pack_start (GTK_BOX (vbox23), scrolledwindowPlugins, TRUE, TRUE, 0); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindowPlugins), GTK_POLICY_ALWAYS, GTK_POLICY_AUTOMATIC); label115 = gtk_label_new (_("Plug-ins")); gtk_widget_show (label115); gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebookAbout), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebookAbout), 3), label115); scrolledwindow7 = gtk_scrolled_window_new (NULL, NULL); gtk_widget_show (scrolledwindow7); gtk_container_add (GTK_CONTAINER (notebookAbout), scrolledwindow7); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow7), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow7), GTK_SHADOW_ETCHED_IN); textviewChangelog = gtk_text_view_new (); gtk_widget_show (textviewChangelog); gtk_container_add (GTK_CONTAINER (scrolledwindow7), textviewChangelog); gtk_text_view_set_editable (GTK_TEXT_VIEW (textviewChangelog), FALSE); gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (textviewChangelog), FALSE); gtk_text_view_set_left_margin (GTK_TEXT_VIEW (textviewChangelog), 2); gtk_text_view_set_right_margin (GTK_TEXT_VIEW (textviewChangelog), 2); label137 = gtk_label_new (_("Changelog")); gtk_widget_show (label137); gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebookAbout), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebookAbout), 4), label137); dialog_action_area4 = gtk_dialog_get_action_area(GTK_DIALOG (infoDialog)); gtk_widget_show (dialog_action_area4); gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area4), GTK_BUTTONBOX_END); closebutton2 = gtk_button_new_from_stock ("gtk-close"); gtk_widget_show (closebutton2); gtk_dialog_add_action_widget (GTK_DIALOG (infoDialog), closebutton2, GTK_RESPONSE_CLOSE); gtk_widget_set_can_default (closebutton2, TRUE); g_signal_connect_swapped ((gpointer) closebutton2, "clicked", G_CALLBACK (gtk_widget_hide), G_OBJECT(infoDialog)); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (infoDialog, infoDialog, "infoDialog"); GLADE_HOOKUP_OBJECT_NO_REF (infoDialog, dialog_vbox4, "dialog_vbox4"); GLADE_HOOKUP_OBJECT (infoDialog, vbox10, "vbox10"); GLADE_HOOKUP_OBJECT (infoDialog, hbox31, "hbox31"); GLADE_HOOKUP_OBJECT (infoDialog, image26, "image26"); GLADE_HOOKUP_OBJECT (infoDialog, vbox11, "vbox11"); GLADE_HOOKUP_OBJECT (infoDialog, table4, "table4"); GLADE_HOOKUP_OBJECT (infoDialog, label55, "label55"); GLADE_HOOKUP_OBJECT (infoDialog, label56, "label56"); GLADE_HOOKUP_OBJECT (infoDialog, label57, "label57"); GLADE_HOOKUP_OBJECT (infoDialog, labelInfoVersion, "labelInfoVersion"); GLADE_HOOKUP_OBJECT (infoDialog, labelInfoReleaseDate, "labelInfoReleaseDate"); GLADE_HOOKUP_OBJECT (infoDialog, labelInfoWebSite, "labelInfoWebSite"); GLADE_HOOKUP_OBJECT (infoDialog, notebookAbout, "notebookAbout"); GLADE_HOOKUP_OBJECT (infoDialog, scrolledwindow4, "scrolledwindow4"); GLADE_HOOKUP_OBJECT (infoDialog, textviewReadme, "textviewReadme"); GLADE_HOOKUP_OBJECT (infoDialog, label46, "label46"); GLADE_HOOKUP_OBJECT (infoDialog, scrolledwindow3, "scrolledwindow3"); GLADE_HOOKUP_OBJECT (infoDialog, textviewAuthors, "textviewAuthors"); GLADE_HOOKUP_OBJECT (infoDialog, label47, "label47"); GLADE_HOOKUP_OBJECT (infoDialog, scrolledwindow2, "scrolledwindow2"); GLADE_HOOKUP_OBJECT (infoDialog, textviewLicence, "textviewLicence"); GLADE_HOOKUP_OBJECT (infoDialog, labelLicense, "labelLicense"); GLADE_HOOKUP_OBJECT (infoDialog, vbox23, "vbox23"); GLADE_HOOKUP_OBJECT (infoDialog, label116, "label116"); GLADE_HOOKUP_OBJECT (infoDialog, scrolledwindowPlugins, "scrolledwindowPlugins"); GLADE_HOOKUP_OBJECT (infoDialog, label115, "label115"); GLADE_HOOKUP_OBJECT (infoDialog, scrolledwindow7, "scrolledwindow7"); GLADE_HOOKUP_OBJECT (infoDialog, textviewChangelog, "textviewChangelog"); GLADE_HOOKUP_OBJECT (infoDialog, label137, "label137"); GLADE_HOOKUP_OBJECT_NO_REF (infoDialog, dialog_action_area4, "dialog_action_area4"); GLADE_HOOKUP_OBJECT (infoDialog, closebutton2, "closebutton2"); return infoDialog; } GtkWidget* create_pairsDialog (void) { GtkWidget *pairsDialog; GdkPixbuf *pairsDialog_icon_pixbuf; GtkWidget *vbox; GtkWidget *hbox33; GtkWidget *image32; GtkWidget *vbox12; GtkWidget *labelTitlePairs; GtkWidget *hboxPairsModel; GtkWidget *notebookPairs; GtkWidget *vboxPairsDialog; GtkWidget *hbox73; GtkWidget *scrolledwindowPairs; GtkWidget *viewport1; GtkWidget *hboxViewportPairs; GtkWidget *label139; GtkWidget *vboxDistances; GtkWidget *label140; GtkWidget *dialog_action_area5; GtkWidget *closebutton3; pairsDialog = gtk_dialog_new (); gtk_window_set_title (GTK_WINDOW (pairsDialog), _("set and customize pairs")); pairsDialog_icon_pixbuf = create_pixbuf ("icone-dialog.png"); if (pairsDialog_icon_pixbuf) { gtk_window_set_icon (GTK_WINDOW (pairsDialog), pairsDialog_icon_pixbuf); g_object_unref (pairsDialog_icon_pixbuf); } vbox = gtk_dialog_get_content_area(GTK_DIALOG(pairsDialog)); gtk_widget_show (vbox); hbox33 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox33); gtk_box_pack_start (GTK_BOX (vbox), hbox33, FALSE, FALSE, 0); image32 = create_pixmap (pairsDialog, "liaison-bandeau.png"); gtk_widget_show (image32); gtk_box_pack_start (GTK_BOX (hbox33), image32, FALSE, FALSE, 0); vbox12 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox12); gtk_box_pack_start (GTK_BOX (hbox33), vbox12, TRUE, TRUE, 0); labelTitlePairs = gtk_label_new (_("Set parameters for pairs")); gtk_widget_show (labelTitlePairs); gtk_box_pack_start (GTK_BOX (vbox12), labelTitlePairs, TRUE, TRUE, 0); gtk_label_set_use_markup (GTK_LABEL (labelTitlePairs), TRUE); gtk_misc_set_alignment (GTK_MISC (labelTitlePairs), 0.5, 0.25); hboxPairsModel = gtk_hbox_new (FALSE, 0); gtk_widget_show (hboxPairsModel); gtk_box_pack_end (GTK_BOX (vbox12), hboxPairsModel, FALSE, FALSE, 0); notebookPairs = gtk_notebook_new (); gtk_widget_show (notebookPairs); gtk_box_pack_start (GTK_BOX (vbox), notebookPairs, TRUE, TRUE, 0); gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebookPairs), GTK_POS_LEFT); vboxPairsDialog = gtk_vbox_new (FALSE, 0); gtk_widget_show (vboxPairsDialog); gtk_container_add (GTK_CONTAINER (notebookPairs), vboxPairsDialog); hbox73 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox73); gtk_box_pack_start (GTK_BOX (vboxPairsDialog), hbox73, TRUE, TRUE, 0); scrolledwindowPairs = gtk_scrolled_window_new (NULL, NULL); gtk_widget_show (scrolledwindowPairs); gtk_box_pack_start (GTK_BOX (hbox73), scrolledwindowPairs, TRUE, TRUE, 0); gtk_widget_set_size_request (scrolledwindowPairs, -1, 150); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindowPairs), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); viewport1 = gtk_viewport_new (NULL, NULL); gtk_widget_show (viewport1); gtk_container_add (GTK_CONTAINER (scrolledwindowPairs), viewport1); hboxViewportPairs = gtk_hbox_new (FALSE, 0); gtk_widget_show (hboxViewportPairs); gtk_container_add (GTK_CONTAINER (viewport1), hboxViewportPairs); label139 = gtk_label_new (_("Pairs")); gtk_widget_show (label139); gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebookPairs), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebookPairs), 0), label139); gtk_label_set_angle (GTK_LABEL (label139), 90); vboxDistances = gtk_vbox_new (FALSE, 0); gtk_widget_show (vboxDistances); gtk_container_add (GTK_CONTAINER (notebookPairs), vboxDistances); label140 = gtk_label_new (_("Distances")); gtk_widget_show (label140); gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebookPairs), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebookPairs), 1), label140); gtk_label_set_angle (GTK_LABEL (label140), 90); dialog_action_area5 = gtk_dialog_get_action_area (GTK_DIALOG (pairsDialog)); gtk_widget_show (dialog_action_area5); gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area5), GTK_BUTTONBOX_END); closebutton3 = gtk_button_new_from_stock ("gtk-close"); gtk_widget_show (closebutton3); gtk_dialog_add_action_widget (GTK_DIALOG (pairsDialog), closebutton3, GTK_RESPONSE_CLOSE); gtk_widget_set_can_default (closebutton3, TRUE); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (pairsDialog, pairsDialog, "pairsDialog"); GLADE_HOOKUP_OBJECT_NO_REF (pairsDialog, vbox, "vbox"); GLADE_HOOKUP_OBJECT (pairsDialog, hbox33, "hbox33"); GLADE_HOOKUP_OBJECT (pairsDialog, image32, "image32"); GLADE_HOOKUP_OBJECT (pairsDialog, vbox12, "vbox12"); GLADE_HOOKUP_OBJECT (pairsDialog, labelTitlePairs, "labelTitlePairs"); GLADE_HOOKUP_OBJECT (pairsDialog, hboxPairsModel, "hboxPairsModel"); GLADE_HOOKUP_OBJECT (pairsDialog, notebookPairs, "notebookPairs"); GLADE_HOOKUP_OBJECT (pairsDialog, vboxPairsDialog, "vboxPairsDialog"); GLADE_HOOKUP_OBJECT (pairsDialog, hbox73, "hbox73"); GLADE_HOOKUP_OBJECT (pairsDialog, scrolledwindowPairs, "scrolledwindowPairs"); GLADE_HOOKUP_OBJECT (pairsDialog, viewport1, "viewport1"); GLADE_HOOKUP_OBJECT (pairsDialog, hboxViewportPairs, "hboxViewportPairs"); GLADE_HOOKUP_OBJECT (pairsDialog, label139, "label139"); GLADE_HOOKUP_OBJECT (pairsDialog, vboxDistances, "vboxDistances"); GLADE_HOOKUP_OBJECT (pairsDialog, label140, "label140"); GLADE_HOOKUP_OBJECT_NO_REF (pairsDialog, dialog_action_area5, "dialog_action_area5"); GLADE_HOOKUP_OBJECT (pairsDialog, closebutton3, "closebutton3"); return pairsDialog; } GtkWidget* create_quitDialog (void) { GtkWidget *quitDialog; GtkWidget *dialog_vbox5; GtkWidget *hbox44; GtkWidget *image35; GtkWidget *vbox13; GtkWidget *label71; GtkWidget *alignment15; GtkWidget *checkbuttonHideNextTime; GtkWidget *hboxHomedir; GtkWidget *image50; GtkWidget *label119; GtkWidget *alignment33; GtkWidget *buttonAddHomedir; GtkWidget *hboxWarning; GtkWidget *image46; GtkWidget *label114; GtkWidget *frame5; GtkWidget *label73; GtkWidget *hbox45; GtkWidget *image36; GtkWidget *label72; GtkWidget *dialog_action_area6; GtkWidget *cancelbutton1; GtkWidget *okbutton1; quitDialog = gtk_dialog_new (); gtk_window_set_title (GTK_WINDOW (quitDialog), _("Quit V_Sim")); gtk_window_set_position (GTK_WINDOW (quitDialog), GTK_WIN_POS_CENTER_ON_PARENT); gtk_window_set_modal (GTK_WINDOW (quitDialog), TRUE); gtk_window_set_icon_name (GTK_WINDOW (quitDialog), "gtk-dialog-question"); gtk_window_set_type_hint (GTK_WINDOW (quitDialog), GDK_WINDOW_TYPE_HINT_DIALOG); dialog_vbox5 = gtk_dialog_get_content_area(GTK_DIALOG(quitDialog)); gtk_widget_show (dialog_vbox5); hbox44 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox44); gtk_box_pack_start (GTK_BOX (dialog_vbox5), hbox44, TRUE, TRUE, 0); image35 = gtk_image_new_from_icon_name ("gtk-dialog-question", GTK_ICON_SIZE_DIALOG); gtk_widget_show (image35); gtk_box_pack_start (GTK_BOX (hbox44), image35, FALSE, FALSE, 0); gtk_misc_set_padding (GTK_MISC (image35), 6, 0); vbox13 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox13); gtk_box_pack_start (GTK_BOX (hbox44), vbox13, TRUE, TRUE, 0); label71 = gtk_label_new (_("Quit V_Sim?")); gtk_widget_show (label71); gtk_box_pack_start (GTK_BOX (vbox13), label71, FALSE, FALSE, 0); gtk_label_set_use_markup (GTK_LABEL (label71), TRUE); gtk_misc_set_padding (GTK_MISC (label71), 0, 10); alignment15 = gtk_alignment_new (0.5, 0.5, 1, 0); gtk_widget_show (alignment15); gtk_box_pack_start (GTK_BOX (vbox13), alignment15, TRUE, TRUE, 0); checkbuttonHideNextTime = gtk_check_button_new_with_mnemonic (_("Don't show this warning again.")); gtk_widget_show (checkbuttonHideNextTime); gtk_container_add (GTK_CONTAINER (alignment15), checkbuttonHideNextTime); hboxHomedir = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox13), hboxHomedir, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (hboxHomedir), 15); image50 = gtk_image_new_from_stock ("gtk-dialog-warning", GTK_ICON_SIZE_LARGE_TOOLBAR); gtk_widget_show (image50); gtk_box_pack_start (GTK_BOX (hboxHomedir), image50, FALSE, FALSE, 5); label119 = gtk_label_new (_("Can't find a local configuration directory $XDG_CONFIG_HOME/v_sim. Should one be added?")); gtk_widget_show (label119); gtk_box_pack_start (GTK_BOX (hboxHomedir), label119, FALSE, FALSE, 0); gtk_label_set_use_markup (GTK_LABEL (label119), TRUE); gtk_label_set_justify (GTK_LABEL (label119), GTK_JUSTIFY_FILL); gtk_label_set_line_wrap (GTK_LABEL (label119), TRUE); alignment33 = gtk_alignment_new (0.5, 0.5, 1, 0); gtk_widget_show (alignment33); gtk_box_pack_start (GTK_BOX (hboxHomedir), alignment33, FALSE, FALSE, 0); buttonAddHomedir = gtk_button_new_from_stock ("gtk-add"); gtk_widget_show (buttonAddHomedir); gtk_container_add (GTK_CONTAINER (alignment33), buttonAddHomedir); hboxWarning = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox13), hboxWarning, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (hboxWarning), 15); image46 = gtk_image_new_from_stock ("gtk-dialog-warning", GTK_ICON_SIZE_LARGE_TOOLBAR); gtk_widget_show (image46); gtk_box_pack_start (GTK_BOX (hboxWarning), image46, FALSE, FALSE, 5); label114 = gtk_label_new (_("Can't find a v_sim.par file with enough write permissions to store the preference, neither in the installation directory nor in the $XDG_CONFIG_HOME/v_sim one.")); gtk_widget_show (label114); gtk_box_pack_start (GTK_BOX (hboxWarning), label114, FALSE, FALSE, 0); gtk_label_set_use_markup (GTK_LABEL (label114), TRUE); gtk_label_set_justify (GTK_LABEL (label114), GTK_JUSTIFY_FILL); gtk_label_set_line_wrap (GTK_LABEL (label114), TRUE); frame5 = gtk_frame_new (NULL); gtk_widget_show (frame5); gtk_box_pack_start (GTK_BOX (vbox13), frame5, FALSE, FALSE, 0); label73 = gtk_label_new (_("If you check the above box but you want to have this warning dialog again before closing, you can change this by editing the parameter file (v_sim.par). The option is called 'main_confirmQuit'.")); gtk_widget_show (label73); gtk_container_add (GTK_CONTAINER (frame5), label73); gtk_label_set_use_markup (GTK_LABEL (label73), TRUE); gtk_label_set_line_wrap (GTK_LABEL (label73), TRUE); gtk_misc_set_alignment (GTK_MISC (label73), 0, 0); gtk_misc_set_padding (GTK_MISC (label73), 2, 2); hbox45 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox45); gtk_frame_set_label_widget (GTK_FRAME (frame5), hbox45); image36 = gtk_image_new_from_icon_name ("gtk-help", GTK_ICON_SIZE_MENU); gtk_widget_show (image36); gtk_box_pack_start (GTK_BOX (hbox45), image36, TRUE, TRUE, 0); label72 = gtk_label_new (_("Help")); gtk_widget_show (label72); gtk_box_pack_start (GTK_BOX (hbox45), label72, FALSE, FALSE, 0); gtk_misc_set_padding (GTK_MISC (label72), 5, 0); dialog_action_area6 = gtk_dialog_get_action_area (GTK_DIALOG (quitDialog)); gtk_widget_show (dialog_action_area6); gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area6), GTK_BUTTONBOX_END); cancelbutton1 = gtk_button_new_from_stock ("gtk-cancel"); gtk_widget_show (cancelbutton1); gtk_dialog_add_action_widget (GTK_DIALOG (quitDialog), cancelbutton1, GTK_RESPONSE_CANCEL); gtk_widget_set_can_default (cancelbutton1, TRUE); okbutton1 = gtk_button_new_from_stock ("gtk-quit"); gtk_widget_show (okbutton1); gtk_dialog_add_action_widget (GTK_DIALOG (quitDialog), okbutton1, GTK_RESPONSE_OK); gtk_widget_set_can_default (okbutton1, TRUE); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (quitDialog, quitDialog, "quitDialog"); GLADE_HOOKUP_OBJECT_NO_REF (quitDialog, dialog_vbox5, "dialog_vbox5"); GLADE_HOOKUP_OBJECT (quitDialog, hbox44, "hbox44"); GLADE_HOOKUP_OBJECT (quitDialog, image35, "image35"); GLADE_HOOKUP_OBJECT (quitDialog, vbox13, "vbox13"); GLADE_HOOKUP_OBJECT (quitDialog, label71, "label71"); GLADE_HOOKUP_OBJECT (quitDialog, alignment15, "alignment15"); GLADE_HOOKUP_OBJECT (quitDialog, checkbuttonHideNextTime, "checkbuttonHideNextTime"); GLADE_HOOKUP_OBJECT (quitDialog, hboxHomedir, "hboxHomedir"); GLADE_HOOKUP_OBJECT (quitDialog, image50, "image50"); GLADE_HOOKUP_OBJECT (quitDialog, label119, "label119"); GLADE_HOOKUP_OBJECT (quitDialog, alignment33, "alignment33"); GLADE_HOOKUP_OBJECT (quitDialog, buttonAddHomedir, "buttonAddHomedir"); GLADE_HOOKUP_OBJECT (quitDialog, hboxWarning, "hboxWarning"); GLADE_HOOKUP_OBJECT (quitDialog, image46, "image46"); GLADE_HOOKUP_OBJECT (quitDialog, label114, "label114"); GLADE_HOOKUP_OBJECT (quitDialog, frame5, "frame5"); GLADE_HOOKUP_OBJECT (quitDialog, label73, "label73"); GLADE_HOOKUP_OBJECT (quitDialog, hbox45, "hbox45"); GLADE_HOOKUP_OBJECT (quitDialog, image36, "image36"); GLADE_HOOKUP_OBJECT (quitDialog, label72, "label72"); GLADE_HOOKUP_OBJECT_NO_REF (quitDialog, dialog_action_area6, "dialog_action_area6"); GLADE_HOOKUP_OBJECT (quitDialog, cancelbutton1, "cancelbutton1"); GLADE_HOOKUP_OBJECT (quitDialog, okbutton1, "okbutton1"); return quitDialog; } v_sim-3.7.0/src/interface.h0000644000353400050620000000155612215546105012471 00000000000000/* * DO NOT EDIT THIS FILE - it is generated by Glade. */ #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 5 #define gtk_image_new_from_icon_name(name, size) gtk_image_new_from_stock(name,size) #define gtk_window_set_icon_name(window, name) gtk_window_set_icon(window, (GdkPixbuf*)0) #endif #ifndef gtk_widget_ref #define gtk_widget_ref(Obj) g_object_ref(G_OBJECT(Obj)) #endif #ifndef gtk_widget_unref #define gtk_widget_unref g_object_unref #endif #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 10 #define gtk_tooltips_set_tip(T, Obj, tt, ctx) gtk_widget_set_tooltip_text(Obj, tt) #define gtk_tool_item_set_tooltip(Obj, T, tt, ctx) gtk_tool_item_set_tooltip_text(Obj, tt) #endif GtkWidget* create_saveDialog (void); GtkWidget* create_observeDialog (void); GtkWidget* create_infoDialog (void); GtkWidget* create_pairsDialog (void); GtkWidget* create_quitDialog (void); v_sim-3.7.0/src/gtk_interactive.c0000644000353400050620000006760312215546105013713 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include "support.h" #include "interface.h" #include "gtk_interactive.h" #include "gtk_main.h" #include "visu_gtk.h" #include "visu_object.h" #include "gtk_pick.h" #include "gtk_move.h" #include "gtk_renderingWindowWidget.h" #include "openGLFunctions/interactive.h" #include "extraGtkFunctions/gtk_numericalEntryWidget.h" #include "extraGtkFunctions/gtk_orientationChooser.h" /** * SECTION: gtk_interactive * @short_description: The interactive dialog. * * This is the second main interface for V_Sim after the command * panel. It provides widgets to interact with the nodes. There is * three built-in interactive modes : the observe one (as in normal * behaviour), the pick one and the move one. * It is possible to add new action thanks to * visu_ui_interactive_addAction() function. It is also possible to * show a small warning message with visu_ui_interactive_setMessage() * that shows a GtkInfoBar. */ /* Local types. */ typedef struct ActionInterface_ { guint id; gchar *label; gchar *help; GtkWidget *radio; VisuUiInteractiveBuild build; VisuInteractiveId mode; VisuUiInteractiveStartStop onStart, onStop; } ActionInterface; /* Local variables. */ static ActionInterface* currentAction; static guint n_actions = 0; static GList *actions; static VisuInteractive *interObserve; static gulong angles_signal, trans_signal, gross_signal, persp_signal; /* Callbacks. */ static gboolean onHomePressed(GtkWidget *widget _U_, GdkEventKey *event, gpointer data); static void onDataReady(GObject *obj, VisuData *dataObj, VisuGlView *view, gpointer data); static void onDataNotReady(GObject *obj, VisuData *dataObj, VisuGlView *view, gpointer data); static void observeMethodChanged(GtkToggleButton* button, gpointer data); static void radioObserveToggled(GtkToggleButton *togglebutton, gpointer user_data); static void onCloseButtonClicked(GtkButton *button, gpointer user_data); static void onCameraChanged(VisuGlView *view, gpointer data); static void onTabActionChanged(GtkNotebook *book, GtkWidget *child, gint num, gpointer data); static void onVisuUiOrientationChooser(GtkButton *button, gpointer data); static void onAngleChanged(GtkSpinButton *spin, gpointer data); static void onTranslationChanged(GtkSpinButton *spin, gpointer data); static void onZoomChanged(GtkSpinButton *spin, gpointer data); static void onPerspChanged(GtkSpinButton *spin, gpointer data); static gboolean onKillWindowEvent(GtkWidget *widget, GdkEvent *event, gpointer user_data); static void onRadioToggled(GtkToggleButton *toggle, gpointer data); static void onObserveStart(VisuUiRenderingWindow *window); static void onObserveStop(VisuUiRenderingWindow *window); static void onObserveClickStop(VisuInteractive *inter _U_, gpointer data); /* Local methods. */ static void connectSignalsObservePick(); static void setNamesGtkWidgetObservePick(VisuUiMain *main); static GtkWidget* gtkObserveBuild_interface(VisuUiMain *main, gchar **label, gchar **help, GtkWidget **radio); /* Widgets */ static GtkWidget *observeWindow, *infoBar; static GtkWidget *orientationChooser; static GtkWidget *spinTheta, *spinPhi, *spinOmega; static GtkWidget *spinXs, *spinYs; static GtkWidget *spinGross; static GtkWidget *spinPersp; /* Help message used in the help area. */ #define GTK_PICKOBSERVE_OBSERVE_INFO \ _("left-[control]-button\t\t\t: rotations " \ "(\316\270, \317\206, [control]\317\211)\n" \ "shift-left-button\t\t\t\t: translations (dx, dy)\n" \ "middle-[shift]-button or wheel\t: zoom or [shift]perspective\n" \ "key 's' / 'r'\t\t\t\t\t: save/restore camera position\n" \ "right-button\t\t\t\t\t: switch to current tabbed action") /** * visu_ui_interactive_init: (skip) * * Initialise the observe/pick window, connect the * signals, give names to widgets... */ void visu_ui_interactive_init() { orientationChooser = (GtkWidget*)0; /* Set the actions tabs. */ actions = (GList*)0; visu_ui_interactive_addAction(gtkObserveBuild_interface, onObserveStart, onObserveStop); currentAction = (ActionInterface*)actions->data; visu_ui_interactive_addAction(visu_ui_interactive_pick_initBuild, visu_ui_interactive_pick_start, visu_ui_interactive_pick_stop); visu_ui_interactive_addAction(visu_ui_interactive_move_initBuild, visu_ui_interactive_move_start, visu_ui_interactive_move_stop); } /** * visu_ui_interactive_addAction: * @build: a routine to build a tab. * @start: a routine to run when session is selected. * @stop: a routine to run when session is stopped. * * One can add new interactive mode with specific tab in the * interactive dialog. * * Since: 3.6 * * Returns: an id for this new action. */ guint visu_ui_interactive_addAction(VisuUiInteractiveBuild build, VisuUiInteractiveStartStop start, VisuUiInteractiveStartStop stop) { ActionInterface *action; g_return_val_if_fail(build && start && stop, 0); action = g_malloc(sizeof(ActionInterface)); action->id = n_actions; action->build = build; action->onStart = start; action->onStop = stop; actions = g_list_append(actions, action); n_actions += 1; return action->id; } static GtkWidget* gtkObserveBuild_interface(VisuUiMain *main _U_, gchar **label, gchar **help, GtkWidget **radio) { *label = g_strdup("Observe"); *help = g_strdup(GTK_PICKOBSERVE_OBSERVE_INFO); *radio = lookup_widget(observeWindow, "radioObserve"); return (GtkWidget*)0; } /** * visu_ui_interactive_initBuild: (skip) * @main: the command panel the about dialog is associated to. * * create the window. */ void visu_ui_interactive_initBuild(VisuUiMain *main) { GtkWidget *labelHelp, *wd; VisuUiRenderingWindow *window; VisuData *data; VisuGlView *view; GList *tmpLst; ActionInterface *action; gchar *msg; GSList *lst; window = visu_ui_main_class_getDefaultRendering(); data = visu_ui_rendering_window_getData(window); view = visu_ui_rendering_window_getGlView(window); interObserve = visu_interactive_new(interactive_observe); g_object_ref(G_OBJECT(interObserve)); g_signal_connect(G_OBJECT(interObserve), "stop", G_CALLBACK(onObserveClickStop), (gpointer)window); DBG_fprintf(stderr, "Gtk observePick: creating the window.\n"); main->interactiveDialog = create_observeDialog(); observeWindow = main->interactiveDialog; gtk_window_set_type_hint(GTK_WINDOW(main->interactiveDialog), GDK_WINDOW_TYPE_HINT_NORMAL); setNamesGtkWidgetObservePick(main); g_signal_connect(G_OBJECT(observeWindow), "key-press-event", G_CALLBACK(onHomePressed), (gpointer)observeWindow); /* Create the actions parts. */ DBG_fprintf(stderr, "Gtk Interactive: Create the actions parts.\n"); lst = (GSList*)0; for (tmpLst = actions; tmpLst; tmpLst = g_list_next(tmpLst)) { action = ((ActionInterface*)tmpLst->data); g_return_if_fail(action->build); wd = action->build(main, &action->label, &msg, &action->radio); DBG_fprintf(stderr, " | action '%s'\n", action->label); action->help = g_markup_printf_escaped("%s", msg); g_free(msg); if (wd) gtk_notebook_append_page (GTK_NOTEBOOK(lookup_widget(observeWindow, "notebookAction")), wd, gtk_label_new(action->label)); if (action->id > 0) gtk_radio_button_set_group(GTK_RADIO_BUTTON(action->radio), lst); lst = gtk_radio_button_get_group(GTK_RADIO_BUTTON(action->radio)); g_signal_connect(G_OBJECT(action->radio), "toggled", G_CALLBACK(onRadioToggled), (gpointer)action); DBG_fprintf(stderr, " | action '%s' OK\n", action->label); } /* Create and Set the help text. */ action = ((ActionInterface*)actions->data); labelHelp = lookup_widget(main->interactiveDialog, "labelInfoObservePick"); gtk_label_set_markup(GTK_LABEL(labelHelp), action->help); /* Add an info bar for warning and so on. */ #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 17 infoBar = gtk_info_bar_new(); gtk_widget_set_no_show_all(infoBar, TRUE); gtk_info_bar_add_button(GTK_INFO_BAR(infoBar), GTK_STOCK_OK, GTK_RESPONSE_OK); g_signal_connect(infoBar, "response", G_CALLBACK(gtk_widget_hide), NULL); wd = gtk_label_new(""); gtk_misc_set_alignment(GTK_MISC(wd), 0., 0.5); gtk_container_add(GTK_CONTAINER(gtk_info_bar_get_content_area(GTK_INFO_BAR(infoBar))), wd); gtk_widget_show(wd); #else infoBar = gtk_label_new(""); gtk_misc_set_alignment(GTK_MISC(infoBar), 0., 0.5); #endif gtk_box_pack_end(GTK_BOX(lookup_widget(observeWindow, "vbox20")), infoBar, FALSE, FALSE, 2); /* connect the signals to the spins. */ connectSignalsObservePick(main); DBG_fprintf(stderr, "Gtk Interactive: Setup initial values.\n"); if (data) { visu_interactive_apply(interObserve, VISU_NODE_ARRAY(data)); onDataReady((GObject*)0, data, view, (gpointer)0); } /* set the initial values for the spins. */ onCameraChanged(view, (gpointer)0); } /** * visu_ui_interactive_toggle: * * The user can switch between a current specific interactive action * and the observe mode. This routine is used to do this.* * * Since: 3.6 */ void visu_ui_interactive_toggle() { GtkWidget *wd; guint id; ActionInterface *action; if (currentAction->id == VISU_UI_ACTION_OBSERVE) { wd = lookup_widget(observeWindow, "notebookAction"); id = gtk_notebook_get_current_page(GTK_NOTEBOOK(wd)) + 1; } else id = VISU_UI_ACTION_OBSERVE; action = (ActionInterface*)g_list_nth_data(actions, id); /* We toggle on the radio of the new action. */ if (action->radio) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(action->radio), TRUE); } /** * visu_ui_interactive_start: * @window: the current rendering widget. * * Start the observe & pick session. */ void visu_ui_interactive_start(VisuUiRenderingWindow *window) { DBG_fprintf(stderr, "Gtk Interactive: initialise session.\n"); /* We empty the status bar. */ visu_ui_rendering_window_pushMessage(window, ""); /* We start the new mode. */ currentAction->onStart(window); } static void gtkInteractiveStop() { VisuUiRenderingWindow *window; window = visu_ui_main_class_getDefaultRendering(); visu_ui_rendering_window_popMessage(window); currentAction->onStop(window); } /** * visu_ui_interactive_setMessage: * @message: a string. * @type: the type of message. * * Show a message in the interactive dialog. * * Since: 3.6 */ void visu_ui_interactive_setMessage(const gchar *message, GtkMessageType type) { #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 17 GList *lst; gtk_info_bar_set_message_type(GTK_INFO_BAR(infoBar), type); lst = gtk_container_get_children(GTK_CONTAINER(gtk_info_bar_get_content_area(GTK_INFO_BAR(infoBar)))); gtk_label_set_text(GTK_LABEL(lst->data), message); g_list_free(lst); #else gtk_label_set_text(GTK_LABEL(infoBar), message); #endif gtk_widget_show(infoBar); } /** * visu_ui_interactive_unsetMessage: * * Hide any message from the interactive dialog. See also * visu_ui_interactive_setMessage(). * * Since: 3.6 */ void visu_ui_interactive_unsetMessage() { gtk_widget_hide(infoBar); } static gboolean onKillWindowEvent(GtkWidget *widget _U_, GdkEvent *event _U_, gpointer user_data _U_) { DBG_fprintf(stderr, "Gtk interactive: window killed.\n"); gtkInteractiveStop(); return FALSE; } static void onCloseButtonClicked(GtkButton *button _U_, gpointer user_data _U_) { DBG_fprintf(stderr, "Gtk interactive: click on close button.\n"); if (!gtk_widget_get_visible(observeWindow)) return; gtkInteractiveStop(); } /****************/ /* Private part */ /****************/ /* Connect the listeners on the signal emitted by the OpenGL server. */ static void connectSignalsObservePick() { GtkWidget *wd; g_signal_connect(G_OBJECT(observeWindow), "delete-event", G_CALLBACK(onKillWindowEvent), (gpointer)0); g_signal_connect(G_OBJECT(observeWindow), "destroy-event", G_CALLBACK(onKillWindowEvent), (gpointer)0); wd = lookup_widget(observeWindow, "buttonBackToCommandPanel"); g_signal_connect(G_OBJECT(wd), "clicked", G_CALLBACK(onCloseButtonClicked), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "dataRendered", G_CALLBACK(onDataReady), (gpointer)wd); g_signal_connect(VISU_OBJECT_INSTANCE, "dataUnRendered", G_CALLBACK(onDataNotReady), (gpointer)wd); wd = lookup_widget(observeWindow, "radioObserve"); g_signal_connect(G_OBJECT(wd), "toggled", G_CALLBACK(radioObserveToggled), (gpointer)0); wd = lookup_widget(observeWindow, "buttonVisuUiOrientationChooser"); g_signal_connect(G_OBJECT(wd), "clicked", G_CALLBACK(onVisuUiOrientationChooser), (gpointer)0); /* The observe widgets. */ wd = lookup_widget(observeWindow, "spinTheta"); g_signal_connect(G_OBJECT(wd), "value_changed", G_CALLBACK(onAngleChanged), GINT_TO_POINTER(VISU_GL_CAMERA_THETA)); wd = lookup_widget(observeWindow, "spinPhi"); g_signal_connect(G_OBJECT(wd), "value_changed", G_CALLBACK(onAngleChanged), GINT_TO_POINTER(VISU_GL_CAMERA_PHI)); wd = lookup_widget(observeWindow, "spinOmega"); g_signal_connect(G_OBJECT(wd), "value_changed", G_CALLBACK(onAngleChanged), GINT_TO_POINTER(VISU_GL_CAMERA_OMEGA)); wd = lookup_widget(observeWindow, "spinDx"); g_signal_connect(G_OBJECT(wd), "value_changed", G_CALLBACK(onTranslationChanged), GINT_TO_POINTER(VISU_GL_CAMERA_XS)); wd = lookup_widget(observeWindow, "spinDy"); g_signal_connect(G_OBJECT(wd), "value_changed", G_CALLBACK(onTranslationChanged), GINT_TO_POINTER(VISU_GL_CAMERA_YS)); wd = lookup_widget(observeWindow, "spinGross"); g_signal_connect(G_OBJECT(wd), "value_changed", G_CALLBACK(onZoomChanged), (gpointer)0); wd = lookup_widget(observeWindow, "spinPersp"); g_signal_connect(G_OBJECT(wd), "value_changed", G_CALLBACK(onPerspChanged), (gpointer)0); wd = lookup_widget(observeWindow, "radioObserveConstrained"); g_signal_connect(G_OBJECT(wd), "toggled", G_CALLBACK(observeMethodChanged), GINT_TO_POINTER(interactive_constrained)); wd = lookup_widget(observeWindow, "radioObserveWalker"); g_signal_connect(G_OBJECT(wd), "toggled", G_CALLBACK(observeMethodChanged), GINT_TO_POINTER(interactive_walker)); wd = lookup_widget(observeWindow, "notebookAction"); g_signal_connect(G_OBJECT(wd), "switch-page", G_CALLBACK(onTabActionChanged), (gpointer)0); } static void onDataReady(GObject *obj _U_, VisuData *dataObj, VisuGlView *view, gpointer data) { if (!dataObj) gtk_button_clicked(GTK_BUTTON(data)); if (dataObj && view) { angles_signal = g_signal_connect(G_OBJECT(view), "ThetaPhiOmegaChanged", G_CALLBACK(onCameraChanged), (gpointer)0); trans_signal = g_signal_connect(G_OBJECT(view), "XsYsChanged", G_CALLBACK(onCameraChanged), (gpointer)0); gross_signal = g_signal_connect(G_OBJECT(view), "GrossChanged", G_CALLBACK(onCameraChanged), (gpointer)0); persp_signal = g_signal_connect(G_OBJECT(view), "PerspChanged", G_CALLBACK(onCameraChanged), (gpointer)0); } } static void onDataNotReady(GObject *obj _U_, VisuData *dataObj _U_, VisuGlView *view, gpointer data _U_) { DBG_fprintf(stderr, "Gtk Interactive: caught the 'dataUnRendered' signal.\n"); g_signal_handler_disconnect(G_OBJECT(view), angles_signal); g_signal_handler_disconnect(G_OBJECT(view), trans_signal); g_signal_handler_disconnect(G_OBJECT(view), gross_signal); g_signal_handler_disconnect(G_OBJECT(view), persp_signal); } static void onObserveClickStop(VisuInteractive *inter _U_, gpointer data) { visu_ui_interactive_toggle(VISU_UI_RENDERING_WINDOW(data)); } static void onObserveStart(VisuUiRenderingWindow *window) { visu_ui_rendering_window_pushInteractive(window, interObserve); } static void onObserveStop(VisuUiRenderingWindow *window) { visu_ui_rendering_window_popInteractive(window, interObserve); } static void observeMethodChanged(GtkToggleButton* button, gpointer data) { VisuInteractiveMethod method; if (!gtk_toggle_button_get_active(button)) return; method = (VisuInteractiveMethod)GPOINTER_TO_INT(data); visu_interactive_class_setPreferedObserveMethod(method); if (method == interactive_constrained) { gtk_widget_set_sensitive(spinOmega, FALSE); if (visu_gl_view_setThetaPhiOmega(visu_ui_rendering_window_getGlView (visu_ui_main_class_getDefaultRendering()), 0., 0., 0., VISU_GL_CAMERA_OMEGA)) VISU_REDRAW_ADD; } else gtk_widget_set_sensitive(spinOmega, TRUE); } /* Ask the OpenGL server to refresh the values of the spins controlling the position of the camera. */ static void onCameraChanged(VisuGlView *view, gpointer data _U_) { g_return_if_fail(view && view->camera); DBG_fprintf(stderr, "Gtk Observe/pick : set values of spins.\n"); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinTheta), (gdouble)view->camera->theta); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinPhi), (gdouble)view->camera->phi); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinOmega), (gdouble)view->camera->omega); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinXs), (gdouble)view->camera->xs); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinYs), (gdouble)view->camera->ys); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinGross), (gdouble)view->camera->gross); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinPersp), (gdouble)view->camera->d_red); } /* Give a name to the widgets present in this window to be able to affect them with a theme. */ static void setNamesGtkWidgetObservePick(VisuUiMain *main) { GtkWidget *wd; int method; gtk_widget_set_name(main->interactiveDialog, "message"); /* wd = lookup_widget(main->interactiveDialog, "titreObserve"); */ /* gtk_widget_set_name(wd, "message_title"); */ wd = lookup_widget(main->interactiveDialog, "labelInfoObservePick"); gtk_widget_set_name(wd, "label_info"); wd = lookup_widget(main->interactiveDialog, "labelTranslation"); gtk_widget_set_name(wd, "label_head_2"); wd = lookup_widget(main->interactiveDialog, "labelZoom"); gtk_widget_set_name(wd, "label_head_2"); wd = lookup_widget(main->interactiveDialog, "radioObserve"); gtk_widget_set_name(wd, "message_radio"); wd = lookup_widget(main->interactiveDialog, "radioPick"); gtk_widget_set_name(wd, "message_radio"); wd = lookup_widget(main->interactiveDialog, "radioMove"); gtk_widget_set_name(wd, "message_radio"); spinTheta = lookup_widget(main->interactiveDialog, "spinTheta"); spinPhi = lookup_widget(main->interactiveDialog, "spinPhi"); spinOmega = lookup_widget(main->interactiveDialog, "spinOmega"); spinXs = lookup_widget(main->interactiveDialog, "spinDx"); spinYs = lookup_widget(main->interactiveDialog, "spinDy"); spinGross = lookup_widget(main->interactiveDialog, "spinGross"); spinPersp = lookup_widget(main->interactiveDialog, "spinPersp"); method = visu_interactive_class_getPreferedObserveMethod(); if (method == interactive_constrained) gtk_widget_set_sensitive(spinOmega, FALSE); wd = lookup_widget(main->interactiveDialog, "notebookAction"); gtk_widget_set_name(wd, "message_notebook"); wd = lookup_widget(main->interactiveDialog, "radioObserveConstrained"); gtk_widget_set_name(wd, "message_radio"); if (method == interactive_constrained) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wd), TRUE); wd = lookup_widget(main->interactiveDialog, "radioObserveWalker"); gtk_widget_set_name(wd, "message_radio"); if (method == interactive_walker) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wd), TRUE); } static gboolean onHomePressed(GtkWidget *widget _U_, GdkEventKey *event, gpointer data _U_) { GtkWindow *window; DBG_fprintf(stderr, "Gtk Interactive: get key pressed.\n"); if(event->keyval == GDK_KEY_Home) { window = visu_ui_getRenderWindow(); g_return_val_if_fail(window, FALSE); /* We raised the rendering window, if required. */ gtk_window_present(window); return TRUE; } return FALSE; } static void onAngleChanged(GtkSpinButton *spin, gpointer data) { int reDrawNeeded; if (!gtk_window_is_active(GTK_WINDOW(observeWindow))) return; reDrawNeeded = visu_gl_view_setThetaPhiOmega(visu_ui_rendering_window_getGlView (visu_ui_main_class_getDefaultRendering()), (float)gtk_spin_button_get_value(spin), (float)gtk_spin_button_get_value(spin), (float)gtk_spin_button_get_value(spin), GPOINTER_TO_INT(data)); if (reDrawNeeded) VISU_REDRAW_ADD; } static void onTranslationChanged(GtkSpinButton *spin, gpointer data) { int reDrawNeeded; if (!gtk_window_is_active(GTK_WINDOW(observeWindow))) return; reDrawNeeded = visu_gl_view_setXsYs(visu_ui_rendering_window_getGlView (visu_ui_main_class_getDefaultRendering()), (float)gtk_spin_button_get_value(spin), (float)gtk_spin_button_get_value(spin), GPOINTER_TO_INT(data)); if (reDrawNeeded) VISU_REDRAW_ADD; } static void onZoomChanged(GtkSpinButton *spin, gpointer data _U_) { int reDrawNeeded; if (!gtk_window_is_active(GTK_WINDOW(observeWindow))) return; reDrawNeeded = visu_gl_view_setGross(visu_ui_rendering_window_getGlView (visu_ui_main_class_getDefaultRendering()), (float)gtk_spin_button_get_value(spin)); if (reDrawNeeded) VISU_REDRAW_ADD; } static void onPerspChanged(GtkSpinButton *spin, gpointer data _U_) { int reDrawNeeded; if (!gtk_window_is_active(GTK_WINDOW(observeWindow))) return; reDrawNeeded = visu_gl_view_setPersp(visu_ui_rendering_window_getGlView (visu_ui_main_class_getDefaultRendering()), (float)gtk_spin_button_get_value(spin)); if (reDrawNeeded) VISU_REDRAW_ADD; } static void onRadioToggled(GtkToggleButton *toggle, gpointer data) { GtkWidget *labelHelp; VisuUiRenderingWindow *window; if (!gtk_toggle_button_get_active(toggle)) return; window = visu_ui_main_class_getDefaultRendering(); /* Before setting up the current action, we pop the previous one. */ if (currentAction) currentAction->onStop(window); /* Get the new action. */ currentAction = (ActionInterface*)data; DBG_fprintf(stderr, "Gtk Interactive: set the action %d current.\n", currentAction->id); labelHelp = lookup_widget(observeWindow, "labelInfoObservePick"); gtk_label_set_markup(GTK_LABEL(labelHelp), currentAction->help); currentAction->onStart(window); } static void radioObserveToggled(GtkToggleButton *togglebutton, gpointer user_data _U_) { gboolean value; GtkWidget *wd; value = gtk_toggle_button_get_active(togglebutton); wd = lookup_widget(observeWindow, "hboxObserve"); gtk_widget_set_sensitive(wd, value); wd = lookup_widget(observeWindow, "tableObserve"); gtk_widget_set_sensitive(wd, value); if (visu_interactive_class_getPreferedObserveMethod() == interactive_constrained) gtk_widget_set_sensitive(spinOmega, FALSE); else gtk_widget_set_sensitive(spinOmega, value); } static void onTabActionChanged(GtkNotebook *book _U_, GtkWidget *child _U_, gint num, gpointer data _U_) { ActionInterface *action; DBG_fprintf(stderr, "Gtk Interactive: change the action tab to %d.\n", num); action = (ActionInterface*)g_list_nth_data(actions, num + 1); if (action->radio) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(action->radio), TRUE); } static void onOrientationChanged(VisuUiOrientationChooser *orientationChooser, gpointer data _U_) { float values[2]; gboolean reDrawNeeded; DBG_fprintf(stderr, "Gtk Observe: orientation changed.\n"); visu_ui_orientation_chooser_getAnglesValues(orientationChooser, values); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinTheta), values[0]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinPhi), values[1]); reDrawNeeded = visu_gl_view_setThetaPhiOmega(visu_ui_rendering_window_getGlView (visu_ui_main_class_getDefaultRendering()), values[0], values[1], 0., VISU_GL_CAMERA_THETA | VISU_GL_CAMERA_PHI); if (reDrawNeeded) VISU_REDRAW_ADD; } static void onVisuUiOrientationChooser(GtkButton *button _U_, gpointer data _U_) { float values[2]; gboolean reDrawNeeded; VisuUiRenderingWindow *window; VisuData *dataObj; VisuGlView *view; window = visu_ui_main_class_getDefaultRendering(); dataObj = visu_ui_rendering_window_getData(window); view = visu_ui_rendering_window_getGlView(window); if (!orientationChooser) { orientationChooser = visu_ui_orientation_chooser_new (VISU_UI_ORIENTATION_DIRECTION, TRUE, dataObj, GTK_WINDOW(observeWindow)); /* gtk_window_set_modal(GTK_WINDOW(orientationChooser), TRUE); */ values[0] = (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinTheta)); values[1] = (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinPhi)); visu_ui_orientation_chooser_setAnglesValues(VISU_UI_ORIENTATION_CHOOSER(orientationChooser), values); g_signal_connect(G_OBJECT(orientationChooser), "values-changed", G_CALLBACK(onOrientationChanged), (gpointer)0); gtk_widget_show(orientationChooser); } else gtk_window_present(GTK_WINDOW(orientationChooser)); switch (gtk_dialog_run(GTK_DIALOG(orientationChooser))) { case GTK_RESPONSE_ACCEPT: DBG_fprintf(stderr, "Gtk Observe: accept changings on orientation.\n"); break; default: DBG_fprintf(stderr, "Gtk Observe: reset values on orientation.\n"); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinTheta), values[0]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinPhi), values[1]); reDrawNeeded = visu_gl_view_setThetaPhiOmega (view, values[0], values[1], 0., VISU_GL_CAMERA_THETA | VISU_GL_CAMERA_PHI); if (reDrawNeeded) VISU_REDRAW_ADD; } DBG_fprintf(stderr, "Gtk Observe: orientation object destroy.\n"); gtk_widget_destroy(orientationChooser); orientationChooser = (GtkWidget*)0; } v_sim-3.7.0/src/gtk_interactive.h0000644000353400050620000000730512215546105013711 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef GTK_INTERACTIVE_H #define GTK_INTERACTIVE_H #include #include "gtk_main.h" #include "gtk_renderingWindowWidget.h" /** * VisuUiInteractiveActionId: * @VISU_UI_ACTION_OBSERVE: interactive session is observe ; * @VISU_UI_ACTION_PICK: interactive session is pick ; * @VISU_UI_ACTION_MOVE: interactive session is geometry changes. * @VISU_UI_ACTION_N_PRESET: private. * * Possibe actions. */ typedef enum { VISU_UI_ACTION_OBSERVE, VISU_UI_ACTION_PICK, VISU_UI_ACTION_MOVE, /*< private >*/ VISU_UI_ACTION_N_PRESET } VisuUiInteractiveActionId; /** * VisuUiInteractiveBuild: * @main: the main interface. * @label: a location to store the name of the tab ; * @help: a location to store the help message to be shown at the * bottom of the window ; * @radio: a location on the radio button that will be toggled when * the desired action is used. * * One can create new tab in the interactive dialog window by * providing routines with this prototype. * * Returns: a new container to be include as a tab in the interactive * dialog window. */ typedef GtkWidget* (*VisuUiInteractiveBuild)(VisuUiMain *main, gchar **label, gchar **help, GtkWidget **radio); /** * VisuUiInteractiveStartStop: * @window: the rendering window that starts or stops the interaction * defined in the tab. * * Routines of this prototype are called each time the interactive * mode should be changed. */ typedef void (*VisuUiInteractiveStartStop)(VisuUiRenderingWindow *window); guint visu_ui_interactive_addAction(VisuUiInteractiveBuild build, VisuUiInteractiveStartStop start, VisuUiInteractiveStartStop stop); void visu_ui_interactive_init(); void visu_ui_interactive_toggle(); void visu_ui_interactive_initBuild(VisuUiMain *main); void visu_ui_interactive_start(VisuUiRenderingWindow *window); void visu_ui_interactive_setMessage(const gchar *message, GtkMessageType type); void visu_ui_interactive_unsetMessage(); #endif v_sim-3.7.0/src/gtk_pick.c0000644000353400050620000020255212215546105012316 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include #include "support.h" #include "gtk_interactive.h" #include "visu_gtk.h" #include "gtk_main.h" #include "gtk_pick.h" #include "visu_object.h" #include "visu_basic.h" #include "gtk_renderingWindowWidget.h" #include "extraFunctions/dataNode.h" #include "extensions/infos.h" #include "extensions/marks.h" #include "openGLFunctions/interactive.h" #include "extraGtkFunctions/gtk_valueIOWidget.h" /** * SECTION: gtk_pick * @short_description: The pick and measurement tab in the interactive * dialog. * * This action tab provides widgets to display information about * selected atoms, like distances or angles. In addition, measured * distances and angles are kept in a list when new files are * loaded. * With the list of selected nodes, one can modify properties * associated to nodes like their coordinates, the value of * colourisation if any, the forces on them, if any... One can also * decide to display information directly on nodes. */ /* The ids of the column used in the data treeview. This treeview is made on a list with NB_COLUMN_BASE + n * NB_COLUMN_DATA, where n is the number of data associated per node. */ enum { COLUMN_BASE_NUMBER, COLUMN_BASE_ELEMENT, COLUMN_BASE_HIGHLIGHT, NB_COLUMN_BASE }; enum { COLUMN_DATA_LABEL, COLUMN_DATA_EDITABLE, COLUMN_DATA_COLOR, NB_COLUMN_DATA }; /* The ids of the columns used in the combobox that identify each data node. */ enum { COLUMN_COMBO_LABEL, COLUMN_COMBO_STOCK, COLUMN_COMBO_POINTER, NB_COLUMN_COMBO }; #define HIDE_HIGHLIGHT 0 #define HIDE_NON_HIGHLIGHT 1 static GtkWidget *comboDraw; #define GTK_PICK_INFO \ _("left-button\t\t\t: standard pick\n" \ "control-left-button\t\t: toggle highlihgt node\n" \ "middle-button\t\t: measure node neighbouring\n" \ "shift-middle-button\t: pick 1st reference\n" \ "ctrl-middle-button\t\t: pick 2nd reference\n" \ "drag-left-button\t\t: make a rectangular selection\n" \ "right-button\t\t\t: switch to observe") /* Treeview used to print data of nodes. */ static GtkListStore *listDataNode; static GtkWidget *treeviewDataNode; #define GTK_PICK_EDITABLE_NODE "blue" #define GTK_PICK_UNEDITABLE_NODE "black" static GtkTreeViewColumn** dataCols; /* Draw data widgets. */ static GtkWidget *radioDrawNever, *radioDrawSelected, *radioDrawAlways; static GtkListStore *listComboInfos; static GtkWidget *lblList; static GtkWidget *valueIO; static GtkWidget *hboxMarks, *tglMarks, *lblMarks; static VisuInteractive *interPick; /* The pick viewport. */ static GtkWidget *labelPickOut, *labelPickHistory = (GtkWidget*)0, *labelPickError; struct _PickHistory { VisuData *dataObj; gchar *str; }; static GList *pickHistory = (GList*)0; /* Signals that need to be suspended */ static gulong radioInfosSignals[3]; static gulong comboInfosSignal; static gulong hide_signal, popDec_signal; /* Local callbacks. */ static void onEditedPick(GtkCellRendererText *cellrenderertext, gchar *path, gchar *text, gpointer user_data); static void onNodePropertyUsed(VisuDataNode* data, VisuData *dataObj, gpointer user_data); static void onNodePropertyUnused(VisuDataNode* data, VisuData *dataObj, gpointer user_data); static void onNodePropertyChanged(VisuDataNode* data, VisuData *dataObj, gpointer user_data); static void onRadioDrawInfos(GtkToggleButton *togglebutton, gpointer user_data); static void onDrawDistanceChecked(GtkToggleButton* button, gpointer data); static void onEraseDistanceClicked(GtkButton *button, gpointer user_data); static void onDataReady(GObject *obj, VisuData *dataObj, VisuGlView *view, gpointer bool); static void onDataNotReady(GObject *obj, VisuData *dataObj, VisuGlView *view, gpointer bool); static void onNodeRemoved(VisuData *visuData, int *nodeNumbers, gpointer data); static void onComboInfosChanged(GtkComboBox *combo, gpointer data); static gboolean onTreeviewInfosKey(GtkWidget *widget, GdkEventKey *event, gpointer user_data); static void onAskForHideNodes(VisuData *visuData, gboolean *redraw, gpointer data); static void onHighlightEraseClicked(GtkButton *button, gpointer user_data); static void onHighlightToggled(GtkCellRendererToggle *cell_renderer, gchar *path, gpointer user_data); static void onHighlightClicked(GtkButton *button, gpointer user_data); static void onHighlightSetClicked(GtkButton *button, gpointer user_data); static void onHighlightHideToggled(GtkButton *button, gpointer user_data); static void onHighlightHideStatus(GtkButton *button, gpointer user_data); static void onNodeSelection(VisuInteractive *inter, VisuInteractivePick pick, VisuNode *node0, VisuNode *node1, VisuNode *node2, gpointer data); static void onRegionSelection(VisuInteractive *inter, GList *nodes, gpointer data); static void onSelectionError(VisuInteractive *inter, VisuInteractivePickError error, gpointer data); static void onClickStop(VisuInteractive *inter, gpointer data); static void onHighlightList(VisuGlExtMarks *marks, GList *lst, gpointer data); static void onMeasurementList(VisuGlExtMarks *marks, gpointer data); /* Local routines. */ static int* getListedNodes(); static void updateLabelMarks(GList *hl); static void updateLabelList(); static gboolean getIterPick(guint nodeId, GtkTreeIter *iter); static void drawDataOnNode(VisuData *data, VisuGlView *view, VisuGlExtInfosDrawId item); static void addNodeAtIter(VisuData *dataObj, VisuNode *node, GtkTreeIter *iter, gboolean highlight); static void populateComboInfos(VisuData *dataObj); static gboolean applyHidingScheme(VisuData *data); static gboolean onLoadXML(const gchar *filename, GError **error); /********************/ /* Public routines. */ /********************/ /** * visu_ui_interactive_pick_init: (skip) * * Internal routine to setup the pick action of the interactive dialog. * * Since: 3.6 */ void visu_ui_interactive_pick_init() { listDataNode = (GtkListStore*)0; radioDrawNever = (GtkWidget*)0; radioDrawAlways = (GtkWidget*)0; radioDrawSelected = (GtkWidget*)0; comboDraw = (GtkWidget*)0; g_signal_connect (G_OBJECT(visu_ui_rendering_window_getMarks(visu_ui_main_class_getDefaultRendering())), "measurementChanged", G_CALLBACK(onMeasurementList), (gpointer)0); } /** * visu_ui_interactive_pick_initBuild: (skip) * @main: the main interface. * @label: a location to store the name of the pick tab ; * @help: a location to store the help message to be shown at the * bottom of the window ; * @radio: a location on the radio button that will be toggled when * the pick action is used. * * This routine should be called in conjonction to the * visu_ui_interactive_move_initBuild() one. It completes the creation of widgets * (and also initialisation of values) for the pick tab. */ GtkWidget* visu_ui_interactive_pick_initBuild(VisuUiMain *main, gchar **label, gchar **help, GtkWidget **radio) { int i, j, nb, nbData; GList *tmpLst; GType *dataTypes; GtkTreeViewColumn *column; GtkCellRenderer *renderer; const gchar *title; GtkWidget *lbl, *wd, *wd2, *hbox, *vbox, *image; gchar *markup; VisuData *dataObj; VisuUiRenderingWindow *window; VisuGlExtMarks *marks; #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkTooltips *tooltips; tooltips = gtk_tooltips_new (); #endif DBG_fprintf(stderr, "Gtk Pick: setup new action tab.\n"); window = visu_ui_main_class_getDefaultRendering(); interPick = visu_interactive_new(interactive_measure); g_object_ref(G_OBJECT(interPick)); marks = visu_ui_rendering_window_getMarks(window); g_signal_connect(G_OBJECT(interPick), "node-selection", G_CALLBACK(onNodeSelection), (gpointer)window); g_signal_connect(G_OBJECT(interPick), "selection-error", G_CALLBACK(onSelectionError), (gpointer)0); g_signal_connect(G_OBJECT(interPick), "region-selection", G_CALLBACK(onRegionSelection), (gpointer)window); g_signal_connect(G_OBJECT(interPick), "stop", G_CALLBACK(onClickStop), (gpointer)0); g_signal_connect(G_OBJECT(marks), "highlightChanged", G_CALLBACK(onHighlightList), (gpointer)0); *label = g_strdup("Pick"); *help = g_strdup(GTK_PICK_INFO); *radio = lookup_widget(main->interactiveDialog, "radioPick"); /* Get the current VisuData object. */ dataObj = visu_ui_rendering_window_getData(window); /* Create the liststore used for the VisuDataNode. */ DBG_fprintf(stderr, "Gtk Pick: Create the liststore used for the VisuDataNode.\n"); tmpLst = visu_data_node_class_getAll(); nbData = g_list_length(tmpLst); DBG_fprintf(stderr, " | %d columns.\n", nbData); dataCols = g_malloc(sizeof(GtkTreeViewColumn*) * nbData); nb = nbData * NB_COLUMN_DATA + NB_COLUMN_BASE; dataTypes = g_malloc(sizeof(GType) * nb); dataTypes[COLUMN_BASE_NUMBER] = G_TYPE_UINT; dataTypes[COLUMN_BASE_ELEMENT] = G_TYPE_STRING; dataTypes[COLUMN_BASE_HIGHLIGHT] = G_TYPE_BOOLEAN; for (i = NB_COLUMN_BASE; tmpLst; tmpLst = g_list_next(tmpLst)) { DBG_fprintf(stderr, " | add dataNode %p '%s'\n", tmpLst->data, visu_data_node_getLabel(VISU_DATA_NODE(tmpLst->data))); /* The string to put on screen. */ dataTypes[i + COLUMN_DATA_LABEL] = G_TYPE_STRING; /* Wether this string is editable or not. */ dataTypes[i + COLUMN_DATA_EDITABLE] = G_TYPE_BOOLEAN; /* Give the color used to render the string. */ dataTypes[i + COLUMN_DATA_COLOR] = G_TYPE_STRING; i += NB_COLUMN_DATA; } listDataNode = gtk_list_store_newv(nb, dataTypes); g_free(dataTypes); /* Create the treeview and related buttons. */ DBG_fprintf(stderr, "Gtk Pick: Create the treeview and related buttons.\n"); hbox = lookup_widget(main->interactiveDialog, "hbox74"); wd = gtk_scrolled_window_new(NULL, NULL); gtk_box_pack_start(GTK_BOX(hbox), wd, TRUE, TRUE, 0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(wd), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(wd), GTK_SHADOW_IN); treeviewDataNode = gtk_tree_view_new (); gtk_container_add(GTK_CONTAINER(wd), treeviewDataNode); gtk_widget_set_size_request(treeviewDataNode, -1, 100); gtk_tree_view_set_model(GTK_TREE_VIEW(treeviewDataNode), GTK_TREE_MODEL(listDataNode)); g_signal_connect(G_OBJECT(treeviewDataNode), "key-press-event", G_CALLBACK(onTreeviewInfosKey), (gpointer)0); gtk_tree_selection_set_mode (gtk_tree_view_get_selection(GTK_TREE_VIEW(treeviewDataNode)), GTK_SELECTION_MULTIPLE); vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 2); wd = gtk_button_new(); gtk_widget_set_tooltip_text(wd, _("Remove all highlight marks for" " the nodes of the list.")); gtk_box_pack_start(GTK_BOX(vbox), wd, FALSE, FALSE, 1); image = create_pixmap((GtkWidget*)0, "stock-unselect-all_20.png"); gtk_container_add(GTK_CONTAINER(wd), image); g_signal_connect(G_OBJECT(wd), "clicked", G_CALLBACK(onHighlightClicked), GINT_TO_POINTER(FALSE)); wd = gtk_button_new(); gtk_widget_set_tooltip_text(wd, _("Put a highlight mark on all" " the nodes of the list.")); gtk_box_pack_end(GTK_BOX(vbox), wd, FALSE, FALSE, 1); image = create_pixmap((GtkWidget*)0, "stock-select-all_20.png"); gtk_container_add(GTK_CONTAINER(wd), image); g_signal_connect(G_OBJECT(wd), "clicked", G_CALLBACK(onHighlightClicked), GINT_TO_POINTER(TRUE)); gtk_widget_show_all(hbox); /* Create the list for the combobox of data node. */ DBG_fprintf(stderr, "Gtk Pick: Create the list store.\n"); listComboInfos = gtk_list_store_new(NB_COLUMN_COMBO, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); /* Building headers. */ DBG_fprintf(stderr, "Gtk Pick: Build the tree view.\n"); /* Id colum. */ renderer = gtk_cell_renderer_text_new(); g_object_set(G_OBJECT(renderer), "scale", 0.75, NULL); lbl = gtk_label_new(""); title = _("Id"); markup = g_markup_printf_escaped("%s", title); gtk_label_set_markup(GTK_LABEL(lbl), markup); gtk_widget_show(lbl); g_free(markup); column = gtk_tree_view_column_new_with_attributes(_("Node"), renderer, "text", COLUMN_BASE_NUMBER, NULL); gtk_tree_view_column_set_sort_column_id(column, COLUMN_BASE_NUMBER); gtk_tree_view_column_set_sort_indicator(column, TRUE); gtk_tree_view_column_set_widget(column, lbl); gtk_tree_view_append_column (GTK_TREE_VIEW(treeviewDataNode), column); /* Highlight colum. */ renderer = gtk_cell_renderer_toggle_new(); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(onHighlightToggled), (gpointer)0); g_object_set(G_OBJECT(renderer), "indicator-size", 10, NULL); column = gtk_tree_view_column_new_with_attributes("", renderer, "active", COLUMN_BASE_HIGHLIGHT, NULL); gtk_tree_view_column_set_sort_column_id(column, COLUMN_BASE_HIGHLIGHT); gtk_tree_view_append_column (GTK_TREE_VIEW(treeviewDataNode), column); /* Element column. */ renderer = gtk_cell_renderer_text_new(); g_object_set(G_OBJECT(renderer), "scale", 0.75, NULL); lbl = gtk_label_new(""); title = _("Type"); markup = g_markup_printf_escaped("%s", title); gtk_label_set_markup(GTK_LABEL(lbl), markup); gtk_widget_show(lbl); g_free(markup); column = gtk_tree_view_column_new_with_attributes(_("Node"), renderer, "text", COLUMN_BASE_ELEMENT, NULL); gtk_tree_view_column_set_sort_column_id(column, COLUMN_BASE_ELEMENT); gtk_tree_view_column_set_widget(column, lbl); gtk_tree_view_append_column (GTK_TREE_VIEW(treeviewDataNode), column); DBG_fprintf(stderr, "Gtk Pick: Build data node columns.\n"); i = 0; for (tmpLst = visu_data_node_class_getAll(); tmpLst; tmpLst = g_list_next(tmpLst)) { j = i * NB_COLUMN_DATA + NB_COLUMN_BASE; renderer = gtk_cell_renderer_text_new(); g_signal_connect(G_OBJECT(renderer), "edited", G_CALLBACK(onEditedPick), GINT_TO_POINTER(i)); g_object_set(G_OBJECT(renderer), "scale", 0.75, NULL); title = visu_data_node_getLabel(VISU_DATA_NODE(tmpLst->data)); DBG_fprintf(stderr, " | add column '%s'.\n", title); lbl = gtk_label_new(""); markup = g_markup_printf_escaped("%s", title); gtk_label_set_markup(GTK_LABEL(lbl), markup); gtk_widget_show(lbl); g_free(markup); dataCols[i] = gtk_tree_view_column_new_with_attributes ("", renderer, "markup", j + COLUMN_DATA_LABEL, "editable", j + COLUMN_DATA_EDITABLE, "foreground", j + COLUMN_DATA_COLOR, NULL); /* g_object_set(G_OBJECT(column), "editable-set", TRUE, NULL); */ gtk_tree_view_column_set_widget(dataCols[i], lbl); gtk_tree_view_column_set_visible(dataCols[i], FALSE); gtk_tree_view_append_column(GTK_TREE_VIEW(treeviewDataNode), dataCols[i]); g_signal_connect_object(G_OBJECT(tmpLst->data), "propertyUsed", G_CALLBACK(onNodePropertyUsed), (gpointer)window, 0); g_signal_connect_object(G_OBJECT(tmpLst->data), "propertyUnused", G_CALLBACK(onNodePropertyUnused), (gpointer)window, 0); g_signal_connect_object(G_OBJECT(tmpLst->data), "valueChanged", G_CALLBACK(onNodePropertyChanged), (gpointer)window, 0); i += 1; } /* Set the load/save widget. */ DBG_fprintf(stderr, "Gtk Pick: Add some widgets.\n"); valueIO = visu_ui_value_io_new(GTK_WINDOW(main->interactiveDialog), _("Import picked nodes from an existing XML file."), _("Export listed picked nodes to the current XML file."), _("Export listed picked nodes to a new XML file.")); visu_ui_value_io_setSensitiveOpen(VISU_UI_VALUE_IO(valueIO), TRUE); visu_ui_value_io_connectOnOpen(VISU_UI_VALUE_IO(valueIO), onLoadXML); visu_ui_value_io_connectOnSave(VISU_UI_VALUE_IO(valueIO), visu_ui_interactive_pick_exportXMLFile); gtk_widget_show_all(valueIO); wd = lookup_widget(main->interactiveDialog, "hboxPick"); gtk_box_pack_end(GTK_BOX(wd), valueIO, TRUE, TRUE, 10); /* Set the names and load the widgets. */ comboDraw = lookup_widget(main->interactiveDialog, "comboboxShowInfos"); gtk_combo_box_set_model(GTK_COMBO_BOX(comboDraw), GTK_TREE_MODEL(listComboInfos)); gtk_cell_layout_clear(GTK_CELL_LAYOUT(comboDraw)); renderer = gtk_cell_renderer_pixbuf_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(comboDraw), renderer, FALSE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(comboDraw), renderer, "stock-id", COLUMN_COMBO_STOCK); renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(comboDraw), renderer, FALSE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(comboDraw), renderer, "markup", COLUMN_COMBO_LABEL); gtk_combo_box_set_active(GTK_COMBO_BOX(comboDraw), 0); comboInfosSignal = g_signal_connect(G_OBJECT(comboDraw), "changed", G_CALLBACK(onComboInfosChanged), (gpointer)0); labelPickOut = lookup_widget(main->interactiveDialog, "pickInfo"); labelPickHistory = gtk_label_new(""); gtk_widget_show(labelPickHistory); gtk_box_pack_start(GTK_BOX(lookup_widget(main->interactiveDialog, "vbox24")), labelPickHistory, FALSE, FALSE, 0); gtk_label_set_use_markup(GTK_LABEL(labelPickHistory), TRUE); gtk_label_set_selectable(GTK_LABEL(labelPickHistory), TRUE); gtk_misc_set_padding(GTK_MISC(labelPickHistory), 15, 0); labelPickError = lookup_widget(main->interactiveDialog, "pickComment"); gtk_widget_set_name(labelPickError, "label_error"); wd = lookup_widget(main->interactiveDialog, "viewportPick"); gtk_widget_set_name(wd, "message_viewport"); wd = lookup_widget(main->interactiveDialog, "checkDrawDistance"); gtk_widget_set_name(wd, "message_radio"); radioDrawNever = lookup_widget(main->interactiveDialog, "radioDrawNever"); gtk_widget_set_name(radioDrawNever, "message_radio"); radioInfosSignals[DRAW_NEVER] = g_signal_connect(G_OBJECT(radioDrawNever), "toggled", G_CALLBACK(onRadioDrawInfos), GINT_TO_POINTER(DRAW_NEVER)); radioDrawSelected = lookup_widget(main->interactiveDialog, "radioDrawSelected"); gtk_widget_set_name(radioDrawSelected, "message_radio"); radioInfosSignals[DRAW_SELECTED] = g_signal_connect(G_OBJECT(radioDrawSelected), "toggled", G_CALLBACK(onRadioDrawInfos), GINT_TO_POINTER(DRAW_SELECTED)); radioDrawAlways = lookup_widget(main->interactiveDialog, "radioDrawAlways"); gtk_widget_set_name(radioDrawAlways, "message_radio"); radioInfosSignals[DRAW_ALWAYS] = g_signal_connect(G_OBJECT(radioDrawAlways), "toggled", G_CALLBACK(onRadioDrawInfos), GINT_TO_POINTER(DRAW_ALWAYS)); wd = lookup_widget(main->interactiveDialog, "checkDrawDistance"); g_signal_connect(G_OBJECT(wd), "toggled", G_CALLBACK(onDrawDistanceChecked), (gpointer)0); wd = lookup_widget(main->interactiveDialog, "buttonEraseDistances"); g_signal_connect(G_OBJECT(wd), "clicked", G_CALLBACK(onEraseDistanceClicked), (gpointer)0); hboxMarks = lookup_widget(main->interactiveDialog, "hboxMarks"); gtk_widget_set_sensitive(hboxMarks, FALSE); wd = lookup_widget(main->interactiveDialog, "buttonEraseMarks"); g_signal_connect(G_OBJECT(wd), "clicked", G_CALLBACK(onHighlightEraseClicked), (gpointer)0); wd = lookup_widget(main->interactiveDialog, "buttonSetMarks"); g_signal_connect(G_OBJECT(wd), "clicked", G_CALLBACK(onHighlightSetClicked), (gpointer)0); tglMarks = gtk_toggle_button_new(); gtk_widget_set_tooltip_text(tglMarks, _("Hide nodes depending on highlight status.")); image = create_pixmap((GtkWidget*)0, "stock-masking.png"); gtk_container_add(GTK_CONTAINER(tglMarks), image); gtk_box_pack_start(GTK_BOX(hboxMarks), tglMarks, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(tglMarks), "toggled", G_CALLBACK(onHighlightHideToggled), (gpointer)0); gtk_box_pack_start(GTK_BOX(hboxMarks), gtk_label_new("("), FALSE, FALSE, 0); wd = gtk_radio_button_new_with_mnemonic((GSList*)0, _("_h.")); gtk_widget_set_tooltip_text(wd, _("Hide button will hide highlighted nodes.")); gtk_widget_set_name(wd, "message_radio"); gtk_box_pack_start(GTK_BOX(hboxMarks), wd, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(wd), "toggled", G_CALLBACK(onHighlightHideStatus), GINT_TO_POINTER(HIDE_HIGHLIGHT)); wd2 = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(wd), _("_non-h.")); gtk_widget_set_tooltip_text(wd2, _("Hide button will hide non-highlighted nodes.")); gtk_widget_set_name(wd2, "message_radio"); gtk_box_pack_start(GTK_BOX(hboxMarks), wd2, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(wd2), "toggled", G_CALLBACK(onHighlightHideStatus), GINT_TO_POINTER(HIDE_NON_HIGHLIGHT)); gtk_box_pack_start(GTK_BOX(hboxMarks), gtk_label_new(")"), FALSE, FALSE, 0); lblMarks = lookup_widget(main->interactiveDialog, "labelMarks"); gtk_widget_show_all(hboxMarks); lblList = lookup_widget(main->interactiveDialog, "labelList"); wd = lookup_widget(main->interactiveDialog, "notebookAction"); g_signal_connect(VISU_OBJECT_INSTANCE, "dataRendered", G_CALLBACK(onDataReady), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "dataUnRendered", G_CALLBACK(onDataNotReady), (gpointer)0); if (dataObj) { DBG_fprintf(stderr, "Gtk Pick: Initial setup.\n"); visu_interactive_apply(interPick, VISU_NODE_ARRAY(dataObj)); onDataReady((GObject*)0, dataObj, (VisuGlView*)0, (gpointer)0); tmpLst = visu_gl_ext_marks_getHighlightedList(marks); updateLabelMarks(tmpLst); g_list_free(tmpLst); onMeasurementList(marks, (gpointer)0); } return (GtkWidget*)0; } /** * visu_ui_interactive_pick_start: * @window: a #VisuUiRenderingWindow object. * * Initialise a pick session. */ void visu_ui_interactive_pick_start(VisuUiRenderingWindow *window) { VisuInteractive *inter; visu_ui_rendering_window_pushInteractive(window, interPick); inter = visu_ui_rendering_window_class_getInteractive(); visu_interactive_setReferences(interPick, inter); } /** * visu_ui_interactive_pick_stop: * @window: a #VisuUiRenderingWindow object. * * Finalise a pick session. */ void visu_ui_interactive_pick_stop(VisuUiRenderingWindow *window) { VisuInteractive *inter; visu_ui_rendering_window_popInteractive(window, interPick); inter = visu_ui_rendering_window_class_getInteractive(); visu_interactive_setReferences(inter, interPick); } static void onNodeSelection(VisuInteractive *inter _U_, VisuInteractivePick pick, VisuNode *node0, VisuNode *node1, VisuNode *node2, gpointer data) { gchar *errors; GtkTreeIter iter; VisuData *dataObj; VisuGlExtMarks *marks; VisuGlView *view; GString *infos; float posRef1[3], posRef2[3], posSelect[3]; double dx, dy, dz, dr, dx1, dy1, dz1, dr1, dx2, dy2, dz2, dr2; double ang; dataObj = visu_ui_rendering_window_getData(VISU_UI_RENDERING_WINDOW(data)); g_return_if_fail(dataObj); DBG_fprintf(stderr, "Gtk Pick: one measurement done (%d).\n", pick); gtk_tree_selection_unselect_all(gtk_tree_view_get_selection (GTK_TREE_VIEW(treeviewDataNode))); /* Update the texts. */ infos = g_string_new(""); errors = (gchar*)0; if (pick == PICK_DISTANCE || pick == PICK_ANGLE || pick == PICK_REFERENCE_1 || pick == PICK_REFERENCE_2) g_string_append_printf(infos, _("Reference node\t" " #%d\n" "" " ( x = %7.3f ; y = %7.3f ; z = %7.3f)\n" ""), node1->number + 1, node1->xyz[0], node1->xyz[1], node1->xyz[2]); if (pick == PICK_ANGLE || pick == PICK_REFERENCE_2) { visu_data_getNodePosition(dataObj, node1, posRef1); visu_data_getNodePosition(dataObj, node2, posRef2); dx = posRef2[0] - posRef1[0]; dy = posRef2[1] - posRef1[1]; dz = posRef2[2] - posRef1[2]; dr = sqrt(dx*dx + dy*dy + dz*dz); g_string_append_printf(infos, _("2nd Reference node\t" " #%d\t" " (i.e. dr = %7.3f)\n" "" " ( x = %7.3f ; y = %7.3f ; z = %7.3f)\n" " (\316\264x = %7.3f ; \316\264y = %7.3f ; \316\264z = %7.3f)\n" ""), node2->number + 1, dr, node2->xyz[0], node2->xyz[1], node2->xyz[2], dx, dy, dz); } if (pick == PICK_SELECTED) g_string_append_printf(infos, _("Newly picked node\t" " #%d\n" "" " ( x = %7.3f ; y = %7.3f ; z = %7.3f)\n" ""), node0->number + 1, node0->xyz[0], node0->xyz[1], node0->xyz[2]); else if (pick == PICK_DISTANCE) { visu_data_getNodePosition(dataObj, node0, posSelect); visu_data_getNodePosition(dataObj, node1, posRef1); dx = posSelect[0] - posRef1[0]; dy = posSelect[1] - posRef1[1]; dz = posSelect[2] - posRef1[2]; dr = sqrt(dx*dx + dy*dy + dz*dz); g_string_append_printf(infos, _("Newly picked node\t" " #%d\t" " (i.e. dr = %7.3f)\n" "" " ( x = %7.3f ; y = %7.3f ; z = %7.3f)\n" " (\316\264x = %7.3f ; \316\264y = %7.3f ; \316\264z = %7.3f)\n" ""), node0->number + 1, dr, node0->xyz[0], node0->xyz[1], node0->xyz[2], dx, dy, dz); } else if (pick == PICK_ANGLE) { visu_data_getNodePosition(dataObj, node0, posSelect); visu_data_getNodePosition(dataObj, node1, posRef1); visu_data_getNodePosition(dataObj, node2, posRef2); dx1 = posSelect[0] - posRef1[0]; dy1 = posSelect[1] - posRef1[1]; dz1 = posSelect[2] - posRef1[2]; dx2 = posRef2[0] - posRef1[0]; dy2 = posRef2[1] - posRef1[1]; dz2 = posRef2[2] - posRef1[2]; dr1 = sqrt(dx1*dx1 + dy1*dy1 + dz1*dz1); g_string_append_printf(infos, _("Newly picked node\t" " #%d\t" " (i.e. dr = %7.3f)\n" "" " ( x = %7.3f ; y = %7.3f ; z = %7.3f)\n" " (\316\264x1 = %7.3f ; \316\264y1 = %7.3f ; \316\264z1 = %7.3f)\n" " (\316\264x2 = %7.3f ; \316\264y2 = %7.3f ; \316\264z2 = %7.3f)\n"), node0->number + 1, dr1, node0->xyz[0], node0->xyz[1], node0->xyz[2], dx1, dy1, dz1, dx2, dy2, dz2); dr2 = sqrt(dx2*dx2 + dy2*dy2 + dz2*dz2); ang = acos((dx2*dx1+dy2*dy1+dz2*dz1)/(dr2*dr1))/TOOL_PI180; g_string_append_printf(infos, _(" angle (Ref-Ref2, Ref-New) = %5.2f degrees" ""), ang); } if (pick == PICK_UNREFERENCE_1 || pick == PICK_UNREFERENCE_2) errors = g_strdup_printf(_("Unset reference %d."), (pick == PICK_UNREFERENCE_1)?1:2); /* Update the remaining of the interface. */ marks = visu_ui_rendering_window_getMarks(VISU_UI_RENDERING_WINDOW(data)); view = visu_ui_rendering_window_getGlView(VISU_UI_RENDERING_WINDOW(data)); switch (pick) { case PICK_SELECTED: case PICK_DISTANCE: case PICK_ANGLE: /* Add clicked node to list. */ getIterPick(node0->number, &iter); addNodeAtIter(dataObj, node0, &iter, visu_gl_ext_marks_getHighlightStatus(marks, node0->number)); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioDrawSelected))) { drawDataOnNode(dataObj, view, DRAW_SELECTED); VISU_REDRAW_ADD; } case PICK_UNREFERENCE_1: case PICK_UNREFERENCE_2: case PICK_REFERENCE_1: case PICK_REFERENCE_2: if (infos) { gtk_label_set_markup(GTK_LABEL(labelPickOut), infos->str); g_string_free(infos, TRUE); } gtk_label_set_text(GTK_LABEL(labelPickError), errors); if (errors) g_free(errors); return; case PICK_HIGHLIGHT: getIterPick(node0->number, &iter); addNodeAtIter(dataObj, node0, &iter, visu_gl_ext_marks_getHighlightStatus(marks, node0->number)); return; case PICK_INFORMATION: break; default: g_warning("Not a pick event!"); } return; } static void onRegionSelection(VisuInteractive *inter _U_, GList *nodes, gpointer data) { VisuData *dataObj; GtkTreeIter iter; VisuNodeArrayIter it; VisuGlExtMarks *marks; VisuGlView *view; dataObj = visu_ui_rendering_window_getData(VISU_UI_RENDERING_WINDOW(data)); g_return_if_fail(dataObj); marks = visu_ui_rendering_window_getMarks(VISU_UI_RENDERING_WINDOW(data)); view = visu_ui_rendering_window_getGlView(VISU_UI_RENDERING_WINDOW(data)); /* We first empty the list. */ /* gtk_list_store_clear(listDataNode); */ /* Update the visibility of valueIO. */ visu_ui_value_io_setSensitiveSave(VISU_UI_VALUE_IO(valueIO), FALSE); /* We add the new elements. */ visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &it); for (visu_node_array_iterStartList(VISU_NODE_ARRAY(dataObj), &it, nodes), it.lst = (GList*)0; it.node; visu_node_array_iterNextList(VISU_NODE_ARRAY(dataObj), &it)) { getIterPick(it.node->number, &iter); addNodeAtIter(dataObj, it.node, &iter, visu_gl_ext_marks_getHighlightStatus(marks, it.node->number)); } if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioDrawSelected))) { drawDataOnNode(dataObj, view, DRAW_SELECTED); VISU_REDRAW_ADD; } return; } static void onSelectionError(VisuInteractive *inter _U_, VisuInteractivePickError error, gpointer data _U_) { switch (error) { case PICK_ERROR_NO_SELECTION: gtk_label_set_text(GTK_LABEL(labelPickError), _("No node has been selected.")); return; case PICK_ERROR_SAME_REF: gtk_label_set_text(GTK_LABEL(labelPickError), _("Picked reference and second" " reference are the same.")); return; case PICK_ERROR_REF1: gtk_label_set_text(GTK_LABEL(labelPickError), _("Can't pick a second reference" " without any existing first one.")); return; case PICK_ERROR_REF2: gtk_label_set_text(GTK_LABEL(labelPickError), _("Can't remove first reference" " before removing the second one.")); return; default: return; } } static void onClickStop(VisuInteractive *inter _U_, gpointer data _U_) { visu_ui_interactive_toggle(); } /** * visu_ui_interactive_pick_getNodeSelection: * * Compute a list of #VisuNode currently listed. * * Returns: (transfer container) (element-type guint): a newly created * list. Should be freed with g_list_free() after use. */ GList* visu_ui_interactive_pick_getNodeSelection() { GList *lst; gboolean validIter; GtkTreeIter iter; guint currentNodeId; lst = (GList*)0; validIter = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(listDataNode), &iter); while (validIter) { gtk_tree_model_get(GTK_TREE_MODEL(listDataNode), &iter, COLUMN_BASE_NUMBER, ¤tNodeId, -1); lst = g_list_prepend(lst, GINT_TO_POINTER((int)(currentNodeId - 1))); validIter = gtk_tree_model_iter_next(GTK_TREE_MODEL(listDataNode), &iter); } return lst; } /*********************/ /* Private routines. */ /*********************/ static gboolean getIterPick(guint nodeId, GtkTreeIter *iter) { gboolean validIter, found; guint currentNodeId; g_return_val_if_fail(iter, FALSE); /* Search if @node is already in the tree. */ found = FALSE; validIter = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(listDataNode), iter); while (validIter) { gtk_tree_model_get(GTK_TREE_MODEL(listDataNode), iter, COLUMN_BASE_NUMBER, ¤tNodeId, -1); if (nodeId + 1 == currentNodeId) { found = TRUE; validIter = FALSE; } else validIter = gtk_tree_model_iter_next(GTK_TREE_MODEL(listDataNode), iter); } if (!found) { gtk_list_store_append(listDataNode, iter); updateLabelList(); } return !found; } static void populateComboInfos(VisuData *dataObj) { gchar *markup; const gchar *title; GtkTreeIter iter; GList *tmpLst; gint i, n; gboolean visibility, set; DBG_fprintf(stderr, "Gtk Pick: rebuild the data combo list.\n"); n = gtk_combo_box_get_active(GTK_COMBO_BOX(comboDraw)); DBG_fprintf(stderr, "Gtk Pick: combo list previously %d.\n", n); g_signal_handler_block(G_OBJECT(comboDraw), comboInfosSignal); gtk_list_store_clear(listComboInfos); title = _("Id"); markup = g_markup_printf_escaped("%s", title); gtk_list_store_append(listComboInfos, &iter); gtk_list_store_set(listComboInfos, &iter, COLUMN_COMBO_LABEL, markup, COLUMN_COMBO_POINTER, GINT_TO_POINTER(1), -1); DBG_fprintf(stderr, " | add '%s'\n", title); g_free(markup); title = _("Type"); markup = g_markup_printf_escaped("%s", title); gtk_list_store_append(listComboInfos, &iter); gtk_list_store_set(listComboInfos, &iter, COLUMN_COMBO_LABEL, markup, COLUMN_COMBO_POINTER, GINT_TO_POINTER(2), -1); DBG_fprintf(stderr, " | add '%s'\n", title); g_free(markup); i = 0; for (tmpLst = visu_data_node_class_getAll(); tmpLst; tmpLst = g_list_next(tmpLst)) { visibility = visu_data_node_getUsed(VISU_DATA_NODE(tmpLst->data), dataObj); DBG_fprintf(stderr, " | col %d -> %d (%p)\n", i, visibility, (gpointer)dataCols[i]); if (visibility) { title = visu_data_node_getLabel(VISU_DATA_NODE(tmpLst->data)); markup = g_markup_printf_escaped("%s", title); gtk_list_store_append(listComboInfos, &iter); gtk_list_store_set(listComboInfos, &iter, COLUMN_COMBO_LABEL, markup, COLUMN_COMBO_POINTER, tmpLst->data, -1); if (visu_data_node_getEditable(VISU_DATA_NODE(tmpLst->data))) gtk_list_store_set(listComboInfos, &iter, COLUMN_COMBO_STOCK, GTK_STOCK_EDIT, -1); DBG_fprintf(stderr, " | add '%s'\n", title); g_free(markup); } /* Update the column visibility. */ gtk_tree_view_column_set_visible(dataCols[i], visibility); i += 1; } g_signal_handler_unblock(G_OBJECT(comboDraw), comboInfosSignal); set = (n >= 0 && n < gtk_tree_model_iter_n_children(GTK_TREE_MODEL(listComboInfos), (GtkTreeIter*)0)); gtk_combo_box_set_active(GTK_COMBO_BOX(comboDraw), (set)?n:0); DBG_fprintf(stderr, "Gtk Pick: combo list is now %d.\n", (set)?n:0); } static void updateLabelMarks(GList *hl) { gboolean st; gchar *str; guint nbMarks; DBG_fprintf(stderr, "Gtk Pick: Update marks related widgets.\n"); nbMarks = g_list_length(hl); st = (nbMarks > 0); /* Update the visibility of highlight buttons. */ gtk_widget_set_sensitive(hboxMarks, st); if (!st) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tglMarks), FALSE); if (st) str = g_strdup_printf(_("Highlights (%d):"), nbMarks); else str = g_strdup(_("Highlights (none):")); gtk_label_set_markup(GTK_LABEL(lblMarks), str); g_free(str); } static void updateLabelList() { gchar *str; gint n; n = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(listDataNode), NULL); if (n > 0) str = g_strdup_printf(_("List of nodes (%d):"), n); else str = g_strdup(_("List of nodes (none):")); gtk_label_set_markup(GTK_LABEL(lblList), str); g_free(str); } static void addNodeAtIter(VisuData *dataObj, VisuNode *node, GtkTreeIter *iter, gboolean highlight) { GList *tmpLst; gchar *values, *label, *color; int i; gboolean editable; GtkTreePath *path; VisuElement *ele; /* Store the base data. */ ele = visu_node_array_getElement(VISU_NODE_ARRAY(dataObj), node); gtk_list_store_set(listDataNode, iter, COLUMN_BASE_NUMBER, node->number + 1, COLUMN_BASE_ELEMENT, ele->name, COLUMN_BASE_HIGHLIGHT, highlight, -1); /* Store the additional data informations. */ i = NB_COLUMN_BASE; for (tmpLst = visu_data_node_class_getAll(); tmpLst; tmpLst = g_list_next(tmpLst)) { editable = visu_data_node_getEditable((VisuDataNode*)tmpLst->data); label = visu_data_node_getValueAsString((VisuDataNode*)tmpLst->data, dataObj, node); if (!label) { values = _("None"); editable = FALSE; } else if (label[0] == '\0') values = _("None"); else values = label; if (editable) color = GTK_PICK_EDITABLE_NODE; else color = GTK_PICK_UNEDITABLE_NODE; gtk_list_store_set(listDataNode, iter, i + COLUMN_DATA_LABEL, values, i + COLUMN_DATA_EDITABLE, editable, i + COLUMN_DATA_COLOR, color, -1); if (label) g_free(label); i += NB_COLUMN_DATA; } /* Update the selection. */ gtk_tree_selection_select_iter(gtk_tree_view_get_selection (GTK_TREE_VIEW(treeviewDataNode)), iter); path = gtk_tree_model_get_path(GTK_TREE_MODEL(listDataNode), iter); gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(treeviewDataNode), path, NULL, FALSE, 0., 0.); gtk_tree_path_free(path); /* Update the visibility of valueIO. */ visu_ui_value_io_setSensitiveSave(VISU_UI_VALUE_IO(valueIO), TRUE); } static int* getListedNodes() { GtkTreeIter iter; gboolean valid; int *nodes, i; DBG_fprintf(stderr, "Gtk Pick: get the list of node ids:\n"); if (!listDataNode) { nodes = g_malloc(sizeof(int) * 1); nodes[0] = -1; return nodes; } nodes = g_malloc(sizeof(int) * (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(listDataNode), (GtkTreeIter*)0) + 1)); i = 0; valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(listDataNode), &iter); while (valid) { gtk_tree_model_get(GTK_TREE_MODEL(listDataNode), &iter, COLUMN_BASE_NUMBER, nodes + i, -1); nodes[i] -= 1; DBG_fprintf(stderr, " | id %d.\n", nodes[i]); i += 1; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(listDataNode), &iter); } nodes[i] = -1; return nodes; } static void drawDataOnNode(VisuData *data, VisuGlView *view, VisuGlExtInfosDrawId item) { GtkTreeIter iter; gpointer infos; gboolean valid; int *nodes; VisuGlExtInfosDrawMethod method; VisuDataNode *dt; /* We get what data to draw. */ valid = gtk_combo_box_get_active_iter(GTK_COMBO_BOX(comboDraw), &iter); g_return_if_fail(valid); gtk_tree_model_get(GTK_TREE_MODEL(listComboInfos), &iter, COLUMN_COMBO_POINTER, &infos, -1); /* We build the list of elements to be drawn in DRAW_SELECTED mode. */ if (item == DRAW_SELECTED) nodes = getListedNodes(); else nodes = (int*)0; if (GPOINTER_TO_INT(infos) > 2) dt = VISU_DATA_NODE(infos); else dt = (VisuDataNode*)0; if (item == DRAW_NEVER) method = EXT_DRAW_METH_NONE; else { switch (GPOINTER_TO_INT(infos)) { case 1: method = EXT_DRAW_METH_ID; break; case 2: method = EXT_DRAW_METH_TYPE; break; default: method = EXT_DRAW_METH_OTHER; break; } } visu_basic_setExtInfos(data, view, method, nodes, dt); } /*************/ /* Callbacks */ /*************/ static void onEditedPick(GtkCellRendererText *cellrenderertext _U_, gchar *path, gchar *text, gpointer user_data) { gboolean valid; GtkTreeIter iter; gchar *label, *values; GList *lst; VisuDataNode *data; VisuData *dataObj; gint number; valid = gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(listDataNode), &iter, path); if (!valid) { g_warning("Wrong 'path' argument for 'onEditedPick'."); return; } gtk_tree_model_get(GTK_TREE_MODEL(listDataNode), &iter, COLUMN_BASE_NUMBER, &number, -1); DBG_fprintf(stderr, "Gtk Pick: edited value on the fly.\n"); lst = visu_data_node_class_getAll(); data = (VisuDataNode*)g_list_nth_data(lst, GPOINTER_TO_INT(user_data)); dataObj = visu_ui_rendering_window_getData(visu_ui_main_class_getDefaultRendering()); valid = visu_data_node_setValueAsString (data, dataObj,visu_node_array_getFromId(VISU_NODE_ARRAY(dataObj), number - 1), text, &label); if (!valid) visu_ui_raiseWarning(_("Reading values"), _("Wrong format. Impossible to parse the data associated" " to the selected node."), (GtkWindow*)0); /* Change the value of the text in the list store. */ if (label[0] == '\0') values = _("None"); else values = label; gtk_list_store_set(listDataNode, &iter, GPOINTER_TO_INT(user_data) * NB_COLUMN_DATA + NB_COLUMN_BASE, values, -1); g_free(label); visu_data_node_emitValueChanged(data, dataObj); VISU_REDRAW_ADD; } static void highlightChange(GtkTreeIter *iter, VisuGlExtMarksStatus status) { GtkTreeIter iter_; gboolean valid, hl, only; guint node; VisuData *current; VisuGlExtMarks *marks; GList *lst; only = (iter != (GtkTreeIter*)0); if (!iter) iter = &iter_; DBG_fprintf(stderr, "Gtk Pick: change highlight status.\n"); current = visu_ui_rendering_window_getData(visu_ui_main_class_getDefaultRendering()); marks = visu_ui_rendering_window_getMarks(visu_ui_main_class_getDefaultRendering()); lst = (GList*)0; for (valid = (!only)?gtk_tree_model_get_iter_first(GTK_TREE_MODEL(listDataNode), &iter_):TRUE; valid; valid = (!only)?gtk_tree_model_iter_next(GTK_TREE_MODEL(listDataNode), &iter_):FALSE) { gtk_tree_model_get(GTK_TREE_MODEL(listDataNode), iter, COLUMN_BASE_HIGHLIGHT, &hl, COLUMN_BASE_NUMBER, &node, -1); DBG_fprintf(stderr, " | process %d\n", node - 1); if (status == MARKS_STATUS_TOGGLE) gtk_list_store_set(listDataNode, iter, COLUMN_BASE_HIGHLIGHT, !hl, -1); else if (status == MARKS_STATUS_SET) gtk_list_store_set(listDataNode, iter, COLUMN_BASE_HIGHLIGHT, TRUE, -1); else if (status == MARKS_STATUS_UNSET) gtk_list_store_set(listDataNode, iter, COLUMN_BASE_HIGHLIGHT, FALSE, -1); lst = g_list_prepend(lst, GINT_TO_POINTER(node - 1)); } visu_gl_ext_marks_setHighlightedList(marks, lst, status); g_list_free(lst); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tglMarks))) applyHidingScheme(current); } static void onMeasurementList(VisuGlExtMarks *marks, gpointer data _U_) { gchar *lbl; VisuData *dataObj; struct _PickHistory *hist; GString *str; GList *lst, *rev; dataObj = visu_ui_rendering_window_getData(visu_ui_main_class_getDefaultRendering()); if (!dataObj) return; lbl = visu_gl_ext_marks_getMeasurementStrings(marks, dataObj); if (!lbl) return; if (!pickHistory || ((struct _PickHistory*)pickHistory->data)->dataObj != dataObj) { hist = g_malloc(sizeof(struct _PickHistory)); hist->dataObj = dataObj; pickHistory = g_list_prepend(pickHistory, (gpointer)hist); } else { hist = (struct _PickHistory*)pickHistory->data; g_free(hist->str); } hist->str = lbl; if (labelPickHistory) { lbl = visu_gl_ext_marks_getMeasurementLabels(marks); str = g_string_new(lbl); g_free(lbl); rev = g_list_reverse(pickHistory); for (lst = rev; lst; lst = g_list_next(lst)) g_string_append(str, ((struct _PickHistory*)lst->data)->str); pickHistory = g_list_reverse(rev); lbl = g_markup_printf_escaped ("Measurement history, first 6 values (%d entry(ies)):\n" "%s", g_list_length(pickHistory), str->str); g_string_free(str, TRUE); gtk_label_set_markup(GTK_LABEL(labelPickHistory), lbl); g_free(lbl); } } static void onHighlightList(VisuGlExtMarks *marks _U_, GList *lst, gpointer data _U_) { DBG_fprintf(stderr, "Gtk Pick: caught highlight list change (%d).\n", g_list_length(lst)); updateLabelMarks(lst); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tglMarks))) { data = visu_ui_rendering_window_getData(visu_ui_main_class_getDefaultRendering()); applyHidingScheme(data); } } static void onHighlightClicked(GtkButton *button _U_, gpointer user_data) { highlightChange((GtkTreeIter*)0, GPOINTER_TO_INT(user_data)?MARKS_STATUS_SET:MARKS_STATUS_UNSET); VISU_REDRAW_ADD; } static void onHighlightToggled(GtkCellRendererToggle *cell_renderer _U_, gchar *path, gpointer user_data _U_) { gboolean valid; GtkTreeIter iter; valid = gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(listDataNode), &iter, path); g_return_if_fail(valid); highlightChange(&iter, MARKS_STATUS_TOGGLE); VISU_REDRAW_ADD; } static void onHighlightSetClicked(GtkButton *button _U_, gpointer user_data _U_) { GList *lst, *tmpLst; VisuUiRenderingWindow *window; VisuData *current; VisuGlExtMarks *marks; VisuGlView *view; VisuNode *node; GtkTreeIter iter; window = visu_ui_main_class_getDefaultRendering(); current = visu_ui_rendering_window_getData(window); marks = visu_ui_rendering_window_getMarks(window); view = visu_ui_rendering_window_getGlView(window); lst = visu_gl_ext_marks_getHighlightedList(marks); for (tmpLst = lst; tmpLst; tmpLst = g_list_next(tmpLst)) { node = visu_node_array_getFromId(VISU_NODE_ARRAY(current), GPOINTER_TO_INT(tmpLst->data)); if (node) { getIterPick(node->number, &iter); addNodeAtIter(current, node, &iter, TRUE); } } if (lst && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioDrawSelected))) { drawDataOnNode(current, view, DRAW_SELECTED); VISU_REDRAW_ADD; } g_list_free(lst); } static gboolean applyHidingScheme(VisuData *data) { gboolean redraw; g_signal_emit_by_name(G_OBJECT(data), "AskForShowHide", &redraw, NULL); if (redraw) g_signal_emit_by_name(G_OBJECT(data), "VisibilityChanged", NULL); return redraw; } static void onHighlightHideToggled(GtkButton *button _U_, gpointer user_data _U_) { VisuData *data; data = visu_ui_rendering_window_getData(visu_ui_main_class_getDefaultRendering()); if (applyHidingScheme(data)) VISU_REDRAW_ADD; } static void onHighlightHideStatus(GtkButton *button, gpointer user_data) { VisuData *data; if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)) || !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tglMarks))) return; g_object_set_data(G_OBJECT(tglMarks), "hide-status", user_data); data = visu_ui_rendering_window_getData(visu_ui_main_class_getDefaultRendering()); if (applyHidingScheme(data)) VISU_REDRAW_ADD; } static void onNodePropertyUsed(VisuDataNode* data _U_, VisuData *dataObj, gpointer user_data) { VisuData *current; current = visu_ui_rendering_window_getData(VISU_UI_RENDERING_WINDOW(user_data)); DBG_fprintf(stderr, "Gtk Pick: caught 'PropertyUsed' for %p (current %p).\n", (gpointer)dataObj, (gpointer)current); if (current == dataObj) /* We update the combo for properties. */ populateComboInfos(dataObj); } static void onNodePropertyUnused(VisuDataNode* data _U_, VisuData *dataObj, gpointer user_data) { VisuData *current; current = visu_ui_rendering_window_getData(VISU_UI_RENDERING_WINDOW(user_data)); DBG_fprintf(stderr, "Gtk Pick: caught 'PropertyUnused' for %p (current %p).\n", (gpointer)dataObj, (gpointer)current); if (current == dataObj) /* We update the combo for properties. */ populateComboInfos(dataObj); } static void onNodePropertyChanged(VisuDataNode* data, VisuData *dataObj, gpointer user_data) { GtkTreeIter iter; gboolean valid; int i, nodeId; GList *tmpLst; gchar *label, *values; VisuNode *node; VisuData *current; current = visu_ui_rendering_window_getData(VISU_UI_RENDERING_WINDOW(user_data)); DBG_fprintf(stderr, "Gtk Pick: caught 'valueChanged' for %p (current %p).\n", (gpointer)dataObj, (gpointer)current); if (current != dataObj) return; valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(listDataNode), &iter); while (valid) { gtk_tree_model_get(GTK_TREE_MODEL(listDataNode), &iter, COLUMN_BASE_NUMBER, &nodeId, -1); node = visu_node_array_getFromId(VISU_NODE_ARRAY(dataObj), nodeId - 1); g_return_if_fail(node); /* Store the additional data informations. */ tmpLst = visu_data_node_class_getAll(); i = NB_COLUMN_BASE + NB_COLUMN_DATA * g_list_index(tmpLst, data); label = visu_data_node_getValueAsString(data, dataObj, node); if (!label || label[0] == '\0') values = _("None"); else values = label; gtk_list_store_set(listDataNode, &iter, i + COLUMN_DATA_LABEL, values, -1); if (label) g_free(label); valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(listDataNode), &iter); } } static void onComboInfosChanged(GtkComboBox *combo, gpointer data _U_) { VisuData *dataObj; VisuGlView *view; dataObj = visu_ui_rendering_window_getData(visu_ui_main_class_getDefaultRendering()); g_return_if_fail(dataObj); view = visu_ui_rendering_window_getGlView(visu_ui_main_class_getDefaultRendering()); if (gtk_combo_box_get_active(combo) >= 0) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioDrawNever))) return; else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioDrawSelected))) drawDataOnNode(dataObj, view, DRAW_SELECTED); else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioDrawAlways))) drawDataOnNode(dataObj, view, DRAW_ALWAYS); } else drawDataOnNode(dataObj, view, DRAW_NEVER); VISU_REDRAW_ADD; } static void onRadioDrawInfos(GtkToggleButton *togglebutton, gpointer user_data) { VisuData *data; VisuGlView *view; if (!gtk_toggle_button_get_active(togglebutton)) return; data = visu_ui_rendering_window_getData(visu_ui_main_class_getDefaultRendering()); g_return_if_fail(data); view = visu_ui_rendering_window_getGlView(visu_ui_main_class_getDefaultRendering()); drawDataOnNode(data, view, GPOINTER_TO_INT(user_data)); VISU_REDRAW_ADD; } static void onDrawDistanceChecked(GtkToggleButton* button, gpointer data _U_) { VisuGlExtMarks *marks; marks = visu_ui_rendering_window_getMarks(visu_ui_main_class_getDefaultRendering()); visu_gl_ext_marks_setDrawValues(marks, gtk_toggle_button_get_active(button)); } static void onEraseDistanceClicked(GtkButton *button _U_, gpointer user_data _U_) { VisuGlExtMarks *marks; marks = visu_ui_rendering_window_getMarks(visu_ui_main_class_getDefaultRendering()); DBG_fprintf(stderr, "Gtk Pick: clicked on 'erase all measures' button.\n"); if (visu_gl_ext_marks_removeMeasures(marks, -1)) VISU_REDRAW_FORCE; } static void onAskForHideNodes(VisuData *visuData, gboolean *redraw, gpointer data _U_) { VisuUiRenderingWindow *window; VisuGlExtMarks *marks; VisuData *dataObj; GList *lst, *tmpLst; guint nHl, *hl, j; guint min, max; VisuNodeArrayIter iter; gboolean hide; gint status; DBG_fprintf(stderr, "Gtk Pick: caught the 'AskForShowHide' signal for" " VisuData %p.\n", (gpointer)visuData); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tglMarks))) { status = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(tglMarks), "hide-status")); window = visu_ui_main_class_getDefaultRendering(); dataObj = visu_ui_rendering_window_getData(window); marks = visu_ui_rendering_window_getMarks(window); lst = visu_gl_ext_marks_getHighlightedList(marks); if (status == HIDE_NON_HIGHLIGHT) { /* We switch off all nodes except the highlighted ones. To avoid to run the list of highlighted nodes to many times, we create a temporary array and store the min and max indexes. */ nHl = g_list_length(lst); if (nHl == 0) return; visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter); hl = g_malloc(sizeof(gint) * nHl); nHl = 0; min = iter.nAllStoredNodes; max = 0; for (tmpLst = lst; tmpLst; tmpLst = g_list_next(tmpLst)) { hl[nHl] = (guint)GPOINTER_TO_INT(tmpLst->data); min = MIN(min, hl[nHl]); max = MAX(max, hl[nHl]); nHl += 1; } for (visu_node_array_iterStart(VISU_NODE_ARRAY(dataObj), &iter); iter.node; visu_node_array_iterNext(VISU_NODE_ARRAY(dataObj), &iter)) if (iter.node->number >= min && iter.node->number <= max) { hide = TRUE; for (j = 0; hide && j < nHl; j++) hide = (iter.node->number != hl[j]); if (hide) *redraw = visu_node_setVisibility(iter.node, FALSE) || *redraw; } else *redraw = visu_node_setVisibility(iter.node, FALSE) || *redraw; g_free(hl); } else for (tmpLst = lst; tmpLst; tmpLst = g_list_next(tmpLst)) { *redraw = visu_node_setVisibility (visu_node_array_getFromId(VISU_NODE_ARRAY(dataObj), (guint)GPOINTER_TO_INT(tmpLst->data)), FALSE) || *redraw; } } } static void onDataReady(GObject *obj _U_, VisuData *dataObj, VisuGlView *view _U_, gpointer data _U_) { GtkTreeIter iter, removedIter; gboolean valid, removed; int number; VisuNode *node; DBG_fprintf(stderr, "Gtk Pick: caught 'dataRendered'" " signal for %p.\n", (gpointer)dataObj); if (dataObj) { popDec_signal = g_signal_connect(G_OBJECT(dataObj), "PopulationDecrease", G_CALLBACK(onNodeRemoved), (gpointer)0); hide_signal = g_signal_connect(G_OBJECT(dataObj), "AskForShowHide", G_CALLBACK(onAskForHideNodes), (gpointer)0); /* Try to match the selected nodes to new ones in the new visuData. */ valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(listDataNode), &iter); while (valid) { removed = FALSE; gtk_tree_model_get(GTK_TREE_MODEL(listDataNode), &iter, COLUMN_BASE_NUMBER, &number, -1); node = visu_node_array_getFromId(VISU_NODE_ARRAY(dataObj), number - 1); if (node) addNodeAtIter(dataObj, node, &iter, FALSE); else { removed = TRUE; removedIter = iter; } DBG_fprintf(stderr, " | %d -> %p\n", number - 1, (gpointer)node); valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(listDataNode), &iter); if (removed) gtk_list_store_remove(listDataNode, &removedIter); } /* Rebuild the combo of properties and update drawing. */ populateComboInfos(dataObj); } else { /* Clear the node data. */ gtk_list_store_clear(listDataNode); /* Update the visibility of valueIO. */ visu_ui_value_io_setSensitiveSave(VISU_UI_VALUE_IO(valueIO), FALSE); /* Clear the combobox of properties. */ g_signal_handler_block(G_OBJECT(comboDraw), comboInfosSignal); gtk_list_store_clear(listComboInfos); g_signal_handler_unblock(G_OBJECT(comboDraw), comboInfosSignal); } updateLabelList(); DBG_fprintf(stderr, "Gtk Pick: Done\n"); } static void onDataNotReady(GObject *obj _U_, VisuData *dataObj, VisuGlView *view _U_, gpointer data _U_) { DBG_fprintf(stderr, "Gtk Pick: caught the 'dataUnRendered' signal.\n"); g_signal_handler_disconnect(G_OBJECT(dataObj), popDec_signal); g_signal_handler_disconnect(G_OBJECT(dataObj), hide_signal); } static void onNodeRemoved(VisuData *visuData _U_, int *nodeNumbers, gpointer data _U_) { GtkTreeIter iter, removeIter; gboolean valid; int number, i; gboolean found; DBG_fprintf(stderr, "Gtk Pick: caught the 'PopulationDecrease' signal.\n"); valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(listDataNode), &iter); while (valid) { gtk_tree_model_get(GTK_TREE_MODEL(listDataNode), &iter, 0, &number, -1); found = FALSE; for (i = 0; !found && nodeNumbers[i] >= 0; i++) if (number == (nodeNumbers[i] + 1)) { removeIter = iter; found = TRUE; } valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(listDataNode), &iter); if (found) gtk_list_store_remove(listDataNode, &removeIter); }; updateLabelList(); } static gboolean onTreeviewInfosKey(GtkWidget *widget, GdkEventKey *event, gpointer user_data _U_) { VisuData *data; VisuGlView *view; GList *selectedPaths, *tmpLst; GtkTreeIter iter, *iterCpy; GtkTreeModel *model; gboolean valid; DBG_fprintf(stderr, "Gtk Pick: key pressed on treeview '%d'.\n", event->keyval); if (event->keyval != GDK_KEY_Delete && event->keyval != GDK_KEY_BackSpace) return FALSE; selectedPaths = gtk_tree_selection_get_selected_rows (gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)), &model); /* Transform all paths to iters in the list. */ DBG_fprintf(stderr, "Gtk Pick: possible removing.\n"); tmpLst = selectedPaths; while (tmpLst) { DBG_fprintf(stderr, " | remove path '%s'.\n", gtk_tree_path_to_string((GtkTreePath*)tmpLst->data)); valid = gtk_tree_model_get_iter(model, &iter, (GtkTreePath*)tmpLst->data); g_return_val_if_fail(valid, FALSE); gtk_tree_path_free((GtkTreePath*)tmpLst->data); iterCpy = gtk_tree_iter_copy(&iter); /* Replace the path with the tree iter. */ tmpLst->data = (gpointer)iterCpy; tmpLst = g_list_next(tmpLst); }; /* Then remove all iters. */ DBG_fprintf(stderr, "Gtk Pick: actualy remove the iters.\n"); tmpLst = selectedPaths; while (tmpLst && tmpLst->next) { gtk_list_store_remove(listDataNode, (GtkTreeIter*)tmpLst->data); gtk_tree_iter_free((GtkTreeIter*)tmpLst->data); tmpLst = g_list_next(tmpLst); }; if (tmpLst) { gtk_list_store_remove(listDataNode, (GtkTreeIter*)tmpLst->data); gtk_tree_iter_free((GtkTreeIter*)tmpLst->data); } g_list_free(selectedPaths); updateLabelList(); /* If the draw informations is on selected nodes, we need to redraw. */ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioDrawSelected))) { DBG_fprintf(stderr, "Gtk Pick: ask for redraw.\n"); data = visu_ui_rendering_window_getData(visu_ui_main_class_getDefaultRendering()); g_return_val_if_fail(data, FALSE); view = visu_ui_rendering_window_getGlView(visu_ui_main_class_getDefaultRendering()); drawDataOnNode(data, view, DRAW_SELECTED); VISU_REDRAW_ADD; } return TRUE; } static void onHighlightEraseClicked(GtkButton *button _U_, gpointer user_data _U_) { VisuGlExtMarks *marks; gboolean valid, redraw; GtkTreeIter iter; GList *lst; DBG_fprintf(stderr, "Gtk Pick: remove all highlights.\n"); /* Remove all the check box in the model. */ for (valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(listDataNode), &iter); valid; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(listDataNode), &iter)) gtk_list_store_set(listDataNode, &iter, COLUMN_BASE_HIGHLIGHT, FALSE, -1); marks = visu_ui_rendering_window_getMarks(visu_ui_main_class_getDefaultRendering()); lst = visu_gl_ext_marks_getHighlightedList(marks); redraw = visu_gl_ext_marks_setHighlightedList(marks, lst, MARKS_STATUS_UNSET); g_list_free(lst); if (redraw) VISU_REDRAW_ADD; } static gboolean onLoadXML(const gchar *filename, GError **error) { VisuData *dataObj; dataObj = visu_ui_rendering_window_getData(visu_ui_main_class_getDefaultRendering()); if (visu_ui_interactive_pick_parseXMLFile(filename, dataObj, error)) { /* Update the sensitivity. */ visu_ui_value_io_setSensitiveSave(VISU_UI_VALUE_IO(valueIO), TRUE); /* We ask for redraw. */ VISU_REDRAW_ADD; return TRUE; } else return FALSE; } /** * visu_ui_interactive_pick_parseXMLFile: * @filename: a filename ; * @data: a #VisuData object to take the pick information from ; * @error: a location to store possible errors. * * Parse the given V_Sim value file and update the dialog accordingly. * * Returns: TRUE if no error. */ gboolean visu_ui_interactive_pick_parseXMLFile(const gchar* filename, VisuData *data, GError **error) { gboolean set, highlight; GList *list, *tmpLst; VisuNode *node; VisuGlExtInfosDrawId mode; guint info; VisuGlExtMarks *marks; VisuGlView *view; GtkTreeIter iter; view = visu_ui_rendering_window_getGlView(visu_ui_main_class_getDefaultRendering()); marks = visu_ui_rendering_window_getMarks(visu_ui_main_class_getDefaultRendering()); set = visu_gl_ext_marks_parseXMLFile(marks, filename, &list, &mode, &info, error); if (!set) return FALSE; /* We stop the callbacks during upgrade. */ g_signal_handler_block(G_OBJECT(radioDrawNever), radioInfosSignals[DRAW_NEVER]); g_signal_handler_block(G_OBJECT(radioDrawSelected), radioInfosSignals[DRAW_SELECTED]); g_signal_handler_block(G_OBJECT(radioDrawAlways), radioInfosSignals[DRAW_ALWAYS]); g_signal_handler_block(G_OBJECT(comboDraw), comboInfosSignal); /* We set the general options. */ DBG_fprintf(stderr, "Gtk Pick: set the general options (%d %d).\n", mode, info); switch (mode) { case DRAW_NEVER: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioDrawNever), TRUE); break; case DRAW_SELECTED: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioDrawSelected), TRUE); break; case DRAW_ALWAYS: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioDrawAlways), TRUE); break; } set = (info < (guint)gtk_tree_model_iter_n_children(GTK_TREE_MODEL(listComboInfos), (GtkTreeIter*)0)); gtk_combo_box_set_active(GTK_COMBO_BOX(comboDraw), (set)?info:0); /* Convert the list to new pick. */ DBG_fprintf(stderr, "Pick parser: create %d new pick for %p.\n", g_list_length(list), (gpointer)data); for (tmpLst = list; tmpLst; tmpLst = g_list_next(tmpLst)) { highlight = FALSE; if (GPOINTER_TO_INT(tmpLst->data) == PICK_SELECTED) tmpLst = g_list_next(tmpLst); else if (GPOINTER_TO_INT(tmpLst->data) == PICK_HIGHLIGHT) { tmpLst = g_list_next(tmpLst); highlight = TRUE; } else if (GPOINTER_TO_INT(tmpLst->data) == PICK_DISTANCE) { tmpLst = g_list_next(tmpLst); /* We add the last selection. */ tmpLst = g_list_next(tmpLst); } else if (GPOINTER_TO_INT(tmpLst->data) == PICK_ANGLE) { tmpLst = g_list_next(tmpLst); tmpLst = g_list_next(tmpLst); /* We add the last selection. */ tmpLst = g_list_next(tmpLst); } node = visu_node_array_getFromId(VISU_NODE_ARRAY(data), GPOINTER_TO_INT(tmpLst->data) - 1); if (node) { if (getIterPick(node->number, &iter) || highlight) addNodeAtIter(data, node, &iter, highlight); } } g_list_free(list); /* We reset the callbacks during upgrade. */ g_signal_handler_unblock(G_OBJECT(radioDrawNever), radioInfosSignals[DRAW_NEVER]); g_signal_handler_unblock(G_OBJECT(radioDrawSelected), radioInfosSignals[DRAW_SELECTED]); g_signal_handler_unblock(G_OBJECT(radioDrawAlways), radioInfosSignals[DRAW_ALWAYS]); g_signal_handler_unblock(G_OBJECT(comboDraw), comboInfosSignal); /* We update the list. */ drawDataOnNode(data, view, mode); return TRUE; } /** * visu_ui_interactive_pick_exportXMLFile: * @filename: a filename to export to. * @error: (allow-none): a location to store an error. * * Export to @filename the list of currently picked nodes. * * Since: 3.7 * * Returns: TRUE if everything goes right. **/ gboolean visu_ui_interactive_pick_exportXMLFile(const gchar *filename, GError **error) { VisuGlExtMarks *marks; int *nodes; VisuGlExtInfosDrawId mode; int info; gboolean valid; marks = visu_ui_rendering_window_getMarks(visu_ui_main_class_getDefaultRendering()); nodes = getListedNodes(); mode = DRAW_NEVER; if (radioDrawNever && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioDrawNever))) mode = DRAW_NEVER; else if (radioDrawSelected && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioDrawSelected))) mode = DRAW_SELECTED; else if (radioDrawAlways && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioDrawAlways))) mode = DRAW_ALWAYS; info = (comboDraw)?gtk_combo_box_get_active(GTK_COMBO_BOX(comboDraw)):-1; valid = visu_gl_ext_marks_exportXMLFile(marks, filename, nodes, mode, info, error); g_free(nodes); return valid; } v_sim-3.7.0/src/gtk_pick.h0000644000353400050620000000470012215546105012316 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef GTK_PICK_H #define GTK_PICK_H #include #include "gtk_main.h" #include "gtk_renderingWindowWidget.h" GtkWidget* visu_ui_interactive_pick_initBuild(VisuUiMain *main, gchar **label, gchar **help, GtkWidget **radio); void visu_ui_interactive_pick_start(VisuUiRenderingWindow *window); void visu_ui_interactive_pick_stop(VisuUiRenderingWindow *window); GList* visu_ui_interactive_pick_getNodeSelection(); gboolean visu_ui_interactive_pick_parseXMLFile(const gchar* filename, VisuData *data, GError **error); gboolean visu_ui_interactive_pick_exportXMLFile(const gchar *filename, GError **error); void visu_ui_interactive_pick_init(); #endif v_sim-3.7.0/src/gtk_move.c0000644000353400050620000014627612215546105012350 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "math.h" #include "support.h" #include "interface.h" #include "gtk_main.h" #include "visu_object.h" #include "gtk_move.h" #include "gtk_pick.h" #include "gtk_interactive.h" #include "gtk_renderingWindowWidget.h" #include "openGLFunctions/interactive.h" #include "extensions/marks.h" #include "extraFunctions/plane.h" #include "extraGtkFunctions/gtk_numericalEntryWidget.h" #include "extraGtkFunctions/gtk_elementComboBox.h" #include "coreTools/toolMatrix.h" #include "extensions/box.h" /** * SECTION: gtk_move * @short_description: The move tab in the interactive dialog. * * This action tab provides widgets to move single or group of * atoms. It provides also widgets to remove or add atoms. And finally * it provides a way to change the basis-set by picking atoms to form * vertices of a new basis-set. */ /* Callbacks. */ static void onDataReady(GObject *obj, VisuData *dataObj, VisuGlView *view, gpointer bool); static void onDataNotReady(GObject *obj, VisuData *dataObj, VisuGlView *view, gpointer bool); static void refreshMoveAxesValues(VisuGlView *view, gpointer data); static void onMovePositionChanged(VisuUiNumericalEntry *entry, double oldValue, gpointer data); static void onAxeChoosen(VisuUiNumericalEntry *entry, double oldValue, gpointer data); static void onMoveToOriginalClicked(GtkButton *button, gpointer data); static void onRemoveNodeClicked(GtkButton *button, gpointer user_data); static void onAddNodeClicked(GtkButton *button, gpointer user_data); static void onMoveMethod(GtkToggleButton *toggle, gpointer data); static void onPageEnter(GtkNotebook *notebook, GtkWidget *child, gint page_num, gpointer user_data); static void onCheckDuplicate(GtkToggleButton *button, gpointer data); static void onDuplicate(GtkButton *button, gpointer data); static void onMoveToggled(GtkToggleButton *toggle, gpointer data); static void onSpinBasis(GtkSpinButton *spin, gpointer data); static gboolean removeHighlight(gpointer data); static void onChooseBasis(GtkToggleButton *toggle, gpointer data); static void onBasisSelected(VisuInteractive *inter, VisuInteractivePick pick, VisuNode *nodes0, VisuNode *node1, VisuNode *node2, gpointer data); static void onApplyBasis(GtkButton *button, gpointer data); static void onPopulationChanged(VisuData *dataObj, gint *nodes, gpointer data); static void onPositionChanged(VisuData *dataObj, VisuElement *ele, gpointer data); static void onStartMove(VisuInteractive *inter, GList* nodeIds, gpointer data); static void onMove(VisuInteractive *inter, float drag[3], gpointer data); static void onGetAxisClicked(GtkButton *button, gpointer data); static void onMoveClickStop(VisuInteractive *inter, gpointer data); static void onPickClickStop(VisuInteractive *inter, gpointer data); /* Local methods. */ static void setLabelsOrigin(VisuData *data, GList *nodeIds); static void drawBasisCell(VisuBox *box, float O[3], float mat[3][3]); #define GTK_MOVE_INFO \ _("left-button\t\t\t\t: drag node(s) in the screen plane\n" \ "middle-button (wheel)\t\t: drag node(s) along specific axis\n" \ "shift-left-button\t\t\t: drag node(s) along x axis\n" \ "control-left-button\t\t\t: drag node(s) along y axis\n" \ "control-shift-left-button\t: drag node(s) along z axis\n" \ "right-button\t\t\t\t: switch to observe") /* Pick informations hook */ static VisuInteractive *interPick, *interMove; static int movedNode = -1; static float moveNodeOrigin[3]; #define GTK_MOVE_NO_NODE _("(none)") static gulong onSpin_id[4]; static VisuInteractiveId currentMode = interactive_move; static guint currentAxe; static gulong angles_signal, popInc_signal, popDec_signal, popChg_signal; /* Widgets */ static GtkWidget *notebookAction; static GtkWidget *observeWindow; static GtkWidget *entryMoveXYZ[3]; static GtkWidget *entryAddXYZ[3]; static GtkWidget *entryAxeXYZ[3]; static GtkWidget *removeButton, *cancelButton; static GtkWidget *comboElements; static GtkWidget *labelNMoves; static GtkWidget *radioMovePick, *radioMoveRegion; enum { COLUMN_NAME, /* The label shown */ COLUMN_POINTER_TO_DATA, /* Pointer to the VisuElement. */ N_COLUMNS }; static GtkWidget *checkDuplicate, *comboDuplicate, *buttonDupplicate; static GtkWidget *labelOriginX, *labelOriginY, *labelOriginZ; static GtkWidget *labelScreenHorizontal, *labelScreenVertical; static GtkWidget *spinABC[4], *toggleABC[4], *applyBasis; static gchar *lblSpinABC[4] = {"orig.:", "X:", "Y:", "Z:"}; static gint prevBasis[4] = {0, 0, 0, 0}; static guint timeoutBasis[4]; static VisuGlExtBox *extBasis; /********************/ /* Public routines. */ /********************/ /** * visu_ui_interactive_move_initBuild: (skip) * @main: the main interface. * @label: a location to store the name of the move tab ; * @help: a location to store the help message to be shown at the * bottom of the window ; * @radio: a location on the radio button that will be toggled when * the move action is used. * * This routine should be called in conjonction to the * visu_ui_interactive_pick_initBuild() one. It completes the creation of widgets * (and also initialisation of values) for the move tab. */ GtkWidget* visu_ui_interactive_move_initBuild(VisuUiMain *main, gchar **label, gchar **help, GtkWidget **radio) { GtkWidget *wd, *hbox, *vbox, *bt; VisuData *data; VisuGlView *view; VisuNodeArrayIter dataIter; guint i, idmax; VisuUiRenderingWindow *window; #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkTooltips *tooltips; tooltips = gtk_tooltips_new (); #endif extBasis = visu_gl_ext_box_new("New basis set highlight"); visu_gl_ext_box_setLineWidth(extBasis, 1.f); visu_gl_ext_box_setLineStipple(extBasis, 57568); visu_gl_ext_box_setExpandStipple(extBasis, 57568); visu_gl_ext_setActive(VISU_GL_EXT(extBasis), FALSE); *label = g_strdup("Pick"); *help = g_strdup(GTK_MOVE_INFO); *radio = lookup_widget(main->interactiveDialog, "radioMove"); g_signal_connect(G_OBJECT(*radio), "toggled", G_CALLBACK(onMoveToggled), (gpointer)main->interactiveDialog); window = visu_ui_main_class_getDefaultRendering(); view = visu_ui_rendering_window_getGlView(window); data = visu_ui_rendering_window_getData(window); if (data) { visu_node_array_iterNew(VISU_NODE_ARRAY(data), &dataIter); idmax = dataIter.idMax + 1; } else idmax = 1; /* We create here the two interactives. */ interMove = visu_interactive_new(interactive_move); g_object_ref(G_OBJECT(interMove)); g_signal_connect(G_OBJECT(interMove), "move", G_CALLBACK(onMove), (gpointer)0); g_signal_connect(G_OBJECT(interMove), "start-move", G_CALLBACK(onStartMove), (gpointer)window); g_signal_connect(G_OBJECT(interMove), "stop", G_CALLBACK(onMoveClickStop), (gpointer)0); interPick = visu_interactive_new(interactive_pick); g_object_ref(G_OBJECT(interPick)); g_signal_connect(G_OBJECT(interPick), "node-selection", G_CALLBACK(onBasisSelected), (gpointer)0); g_signal_connect(G_OBJECT(interPick), "stop", G_CALLBACK(onPickClickStop), (gpointer)0); observeWindow = main->interactiveDialog; vbox = lookup_widget(main->interactiveDialog, "vbox21"); notebookAction = lookup_widget(main->interactiveDialog, "notebookAction"); g_signal_connect(G_OBJECT(notebookAction), "switch-page", G_CALLBACK(onPageEnter), (gpointer)0); /* The move node action. */ removeButton = gtk_button_new(); gtk_box_pack_end(GTK_BOX(lookup_widget(main->interactiveDialog, "hbox72")), removeButton, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(removeButton, _("Suppress node (either picked one or selected ones).")); gtk_container_add(GTK_CONTAINER(removeButton), gtk_image_new_from_stock(GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU)); g_signal_connect(G_OBJECT(removeButton), "clicked", G_CALLBACK(onRemoveNodeClicked), (gpointer)0); gtk_widget_show_all(removeButton); labelNMoves = lookup_widget(main->interactiveDialog, "labelNMoves"); gtk_label_set_markup(GTK_LABEL(labelNMoves), GTK_MOVE_NO_NODE); radioMovePick = lookup_widget(main->interactiveDialog, "radioMovePick"); gtk_widget_set_name(radioMovePick, "message_radio"); radioMoveRegion = lookup_widget(main->interactiveDialog, "radioMoveRegion"); gtk_widget_set_name(radioMoveRegion, "message_radio"); labelOriginX = lookup_widget(main->interactiveDialog, "labelOriginalX"); labelOriginY = lookup_widget(main->interactiveDialog, "labelOriginalY"); labelOriginZ = lookup_widget(main->interactiveDialog, "labelOriginalZ"); labelScreenHorizontal = lookup_widget(main->interactiveDialog, "labelHorizontalAxe"); labelScreenVertical = lookup_widget(main->interactiveDialog, "labelVerticalAxe"); wd = lookup_widget(main->interactiveDialog, "tableMovePick"); entryMoveXYZ[0] = visu_ui_numerical_entry_new(0.); gtk_entry_set_width_chars(GTK_ENTRY(entryMoveXYZ[0]), 8); gtk_table_attach(GTK_TABLE(wd), entryMoveXYZ[0], 1, 2, 2, 3, GTK_SHRINK, GTK_SHRINK, 0, 0); entryMoveXYZ[1] = visu_ui_numerical_entry_new(0.); gtk_entry_set_width_chars(GTK_ENTRY(entryMoveXYZ[1]), 8); gtk_table_attach(GTK_TABLE(wd), entryMoveXYZ[1], 3, 4, 2, 3, GTK_SHRINK, GTK_SHRINK, 0, 0); entryMoveXYZ[2] = visu_ui_numerical_entry_new(0.); gtk_entry_set_width_chars(GTK_ENTRY(entryMoveXYZ[2]), 8); gtk_table_attach(GTK_TABLE(wd), entryMoveXYZ[2], 5, 6, 2, 3, GTK_SHRINK, GTK_SHRINK, 0, 0); entryAxeXYZ[0] = visu_ui_numerical_entry_new(0.); gtk_entry_set_width_chars(GTK_ENTRY(entryAxeXYZ[0]), 8); gtk_table_attach(GTK_TABLE(wd), entryAxeXYZ[0], 1, 2, 1, 2, GTK_SHRINK, GTK_SHRINK, 0, 0); entryAxeXYZ[1] = visu_ui_numerical_entry_new(0.); gtk_entry_set_width_chars(GTK_ENTRY(entryAxeXYZ[1]), 8); gtk_table_attach(GTK_TABLE(wd), entryAxeXYZ[1], 3, 4, 1, 2, GTK_SHRINK, GTK_SHRINK, 0, 0); entryAxeXYZ[2] = visu_ui_numerical_entry_new(0.); gtk_entry_set_width_chars(GTK_ENTRY(entryAxeXYZ[2]), 8); gtk_table_attach(GTK_TABLE(wd), entryAxeXYZ[2], 5, 6, 1, 2, GTK_SHRINK, GTK_SHRINK, 0, 0); bt = gtk_button_new(); gtk_table_attach(GTK_TABLE(wd), bt, 7, 8, 1, 2, GTK_FILL, GTK_SHRINK, 0, 0); gtk_widget_set_tooltip_text(bt, _("Capture the perpendicular axis to the current view.")); gtk_container_add(GTK_CONTAINER(bt), gtk_image_new_from_stock(GTK_STOCK_ZOOM_FIT, GTK_ICON_SIZE_MENU)); g_signal_connect(G_OBJECT(bt), "clicked", G_CALLBACK(onGetAxisClicked), (gpointer)window); cancelButton = gtk_button_new(); gtk_table_attach(GTK_TABLE(wd), cancelButton, 7, 8, 2, 3, GTK_FILL, GTK_SHRINK, 0, 0); gtk_widget_set_tooltip_text(cancelButton, _("Return coordinates to initial values.")); gtk_container_add(GTK_CONTAINER(cancelButton), gtk_image_new_from_stock(GTK_STOCK_UNDO, GTK_ICON_SIZE_MENU)); g_signal_connect(G_OBJECT(cancelButton), "clicked", G_CALLBACK(onMoveToOriginalClicked), (gpointer)0); gtk_widget_show_all(wd); /* The add line. */ wd = lookup_widget(main->interactiveDialog, "hboxAddNode"); entryAddXYZ[0] = visu_ui_numerical_entry_new(0.); gtk_entry_set_width_chars(GTK_ENTRY(entryAddXYZ[0]), 6); gtk_box_pack_start(GTK_BOX(wd), entryAddXYZ[0], FALSE, FALSE, 0); entryAddXYZ[1] = visu_ui_numerical_entry_new(0.); gtk_entry_set_width_chars(GTK_ENTRY(entryAddXYZ[1]), 6); gtk_box_pack_start(GTK_BOX(wd), entryAddXYZ[1], FALSE, FALSE, 0); entryAddXYZ[2] = visu_ui_numerical_entry_new(0.); gtk_entry_set_width_chars(GTK_ENTRY(entryAddXYZ[2]), 6); gtk_box_pack_start(GTK_BOX(wd), entryAddXYZ[2], FALSE, FALSE, 0); /* We create the structure that store the VisuElements */ comboElements = visu_ui_element_combobox_new(FALSE, FALSE, (const gchar*)0); gtk_box_pack_start(GTK_BOX(wd), comboElements, FALSE, FALSE, 0); gtk_box_reorder_child(GTK_BOX(wd), comboElements, 0); bt = gtk_button_new(); gtk_box_pack_end(GTK_BOX(wd), bt, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(bt, _("Add a new node.")); gtk_container_add(GTK_CONTAINER(bt), gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_MENU)); g_signal_connect(G_OBJECT(bt), "clicked", G_CALLBACK(onAddNodeClicked), (gpointer)0); gtk_widget_show_all(wd); /* The duplicate line. */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5); wd = gtk_label_new(_("Duplicate nodes:")); gtk_label_set_use_markup(GTK_LABEL(wd), TRUE); gtk_misc_set_alignment(GTK_MISC(wd), 0., 0.5); gtk_box_pack_start(GTK_BOX(hbox), wd, TRUE, TRUE, 0); wd = gtk_label_new(_("(the nodes listed in the pick tab)")); gtk_label_set_use_markup(GTK_LABEL(wd), TRUE); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); gtk_widget_show_all(hbox); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); wd = gtk_check_button_new_with_mnemonic(_("du_plicate nodes as they are")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wd), TRUE); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); checkDuplicate = wd; wd = gtk_label_new(_(" or as new: ")); gtk_label_set_use_markup(GTK_LABEL(wd), TRUE); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); wd = visu_ui_element_combobox_new(FALSE, FALSE, (const gchar*)0); gtk_widget_set_sensitive(wd, FALSE); comboDuplicate = wd; gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); wd = gtk_button_new_with_mnemonic(_("_duplicate")); gtk_box_pack_end(GTK_BOX(hbox), wd, FALSE, FALSE, 0); buttonDupplicate = wd; gtk_widget_show_all(hbox); /* The Basis line. */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5); wd = gtk_label_new(_("Change the basis set:")); gtk_label_set_use_markup(GTK_LABEL(wd), TRUE); gtk_misc_set_alignment(GTK_MISC(wd), 0., 0.5); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); gtk_widget_show_all(hbox); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); for (i = 0; i < 4; i++) { /* if (i == 1) */ /* { */ /* gtk_widget_show_all(hbox); */ /* hbox = gtk_hbox_new(FALSE, 0); */ /* gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); */ /* } */ wd = gtk_label_new(_(lblSpinABC[i])); gtk_misc_set_alignment(GTK_MISC(wd), 1., 0.5); gtk_box_pack_start(GTK_BOX(hbox), wd, TRUE, TRUE, 5); spinABC[i] = gtk_spin_button_new_with_range(0, idmax, 1); onSpin_id[i] = g_signal_connect(G_OBJECT(spinABC[i]), "value-changed", G_CALLBACK(onSpinBasis), GINT_TO_POINTER(i)); gtk_box_pack_start(GTK_BOX(hbox), spinABC[i], FALSE, FALSE, 0); toggleABC[i] = gtk_toggle_button_new(); gtk_button_set_relief(GTK_BUTTON(toggleABC[i]), GTK_RELIEF_NONE); gtk_box_pack_start(GTK_BOX(hbox), toggleABC[i], FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(toggleABC[i]), gtk_image_new_from_stock(GTK_STOCK_FIND, GTK_ICON_SIZE_MENU)); gtk_widget_set_tooltip_text(toggleABC[i], _("Select node by picking it on the rendering area.")); g_signal_connect(G_OBJECT(toggleABC[i]), "toggled", G_CALLBACK(onChooseBasis), GINT_TO_POINTER(i)); } applyBasis = gtk_button_new(); gtk_box_pack_start(GTK_BOX(hbox), applyBasis, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(applyBasis), gtk_image_new_from_stock(GTK_STOCK_APPLY, GTK_ICON_SIZE_MENU)); gtk_widget_set_sensitive(applyBasis, FALSE); g_signal_connect(G_OBJECT(applyBasis), "clicked", G_CALLBACK(onApplyBasis), (gpointer)0); gtk_widget_show_all(hbox); g_signal_connect(VISU_OBJECT_INSTANCE, "dataRendered", G_CALLBACK(onDataReady), (gpointer)0); g_signal_connect(VISU_OBJECT_INSTANCE, "dataUnRendered", G_CALLBACK(onDataNotReady), (gpointer)0); if (data && view) { visu_interactive_apply(interMove, VISU_NODE_ARRAY(data)); visu_interactive_apply(interPick, VISU_NODE_ARRAY(data)); onDataReady((GObject*)0, data, view, (gpointer)0); } for (i = 0; i < 3; i++) { g_signal_connect(G_OBJECT(entryMoveXYZ[i]), "value-changed", G_CALLBACK(onMovePositionChanged), GINT_TO_POINTER(i)); g_signal_connect(G_OBJECT(entryAxeXYZ[i]), "value-changed", G_CALLBACK(onAxeChoosen), (gpointer)0); } wd = lookup_widget(main->interactiveDialog, "radioMovePick"); g_signal_connect(G_OBJECT(wd), "toggled", G_CALLBACK(onMoveMethod), (gpointer)0); wd = lookup_widget(main->interactiveDialog, "radioMoveRegion"); g_signal_connect(G_OBJECT(wd), "toggled", G_CALLBACK(onMoveMethod), (gpointer)window); g_signal_connect(G_OBJECT(checkDuplicate), "toggled", G_CALLBACK(onCheckDuplicate), comboDuplicate); g_signal_connect(G_OBJECT(buttonDupplicate), "clicked", G_CALLBACK(onDuplicate), (gpointer)0); return (GtkWidget*)0; } static void setLabelsOrigin(VisuData *data, GList *nodeIds) { gchar numero[256]; VisuNode *node; if (nodeIds) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioMovePick))) { movedNode = GPOINTER_TO_INT(nodeIds->data); node = visu_node_array_getFromId(VISU_NODE_ARRAY(data), GPOINTER_TO_INT(nodeIds->data)); g_return_if_fail(node); sprintf(numero, _("(node %d)"), GPOINTER_TO_INT(nodeIds->data) + 1); gtk_label_set_markup(GTK_LABEL(labelNMoves), numero); /* Set the origin position values. */ moveNodeOrigin[0] = node->xyz[0]; moveNodeOrigin[1] = node->xyz[1]; moveNodeOrigin[2] = node->xyz[2]; sprintf(numero, "/ %5.2f", moveNodeOrigin[0]); gtk_label_set_markup(GTK_LABEL(labelOriginX), numero); sprintf(numero, "/ %5.2f", moveNodeOrigin[1]); gtk_label_set_markup(GTK_LABEL(labelOriginY), numero); sprintf(numero, "/ %5.2f", moveNodeOrigin[2]); gtk_label_set_markup(GTK_LABEL(labelOriginZ), numero); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryMoveXYZ[0]), node->xyz[0]); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryMoveXYZ[1]), node->xyz[1]); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryMoveXYZ[2]), node->xyz[2]); } else { movedNode = -1; sprintf(numero, _("(%d nodes)"), g_list_length(nodeIds)); gtk_label_set_markup(GTK_LABEL(labelNMoves), numero); gtk_label_set_markup(GTK_LABEL(labelOriginX), ""); gtk_label_set_markup(GTK_LABEL(labelOriginY), ""); gtk_label_set_markup(GTK_LABEL(labelOriginZ), ""); } } else { movedNode = -1; gtk_label_set_markup(GTK_LABEL(labelNMoves), GTK_MOVE_NO_NODE); gtk_label_set_markup(GTK_LABEL(labelOriginX), ""); gtk_label_set_markup(GTK_LABEL(labelOriginY), ""); gtk_label_set_markup(GTK_LABEL(labelOriginZ), ""); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryMoveXYZ[0]), 0.); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryMoveXYZ[1]), 0.); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryMoveXYZ[2]), 0.); } /* Set the sensitivity. */ gtk_widget_set_sensitive(removeButton, (nodeIds != (GList*)0)); gtk_widget_set_sensitive(cancelButton, (nodeIds != (GList*)0)); } static void setMovingNodes() { GList *nodeIds; DBG_fprintf(stderr, "Gtk Move: set the moving list.\n"); nodeIds = (GList*)0; if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioMovePick))) nodeIds = visu_ui_interactive_pick_getNodeSelection(); visu_interactive_setMovingNodes(interMove, nodeIds); setLabelsOrigin((VisuData*)0, nodeIds); if (nodeIds) g_list_free(nodeIds); } /** * visu_ui_interactive_move_start: * @window: a #VisuUiRenderingWindow object. * * Initialise a moving session. */ void visu_ui_interactive_move_start(VisuUiRenderingWindow *window) { DBG_fprintf(stderr, "Gtk Move: start the move panel.\n"); visu_ui_rendering_window_pushInteractive(window, (currentMode == interactive_move)? interMove:interPick); if (currentMode == interactive_pick) visu_ui_rendering_window_pushMessage(window, _("Pick a node with the mouse")); /* Set the moving list. */ setMovingNodes(); } /** * visu_ui_interactive_move_stop: * @window: a #VisuUiRenderingWindow object. * * Finalise a moving session. */ void visu_ui_interactive_move_stop(VisuUiRenderingWindow *window) { DBG_fprintf(stderr, "Gtk Move: unset the move panel.\n"); visu_ui_rendering_window_popInteractive(window, (currentMode == interactive_move)? interMove:interPick); if (currentMode == interactive_pick) visu_ui_rendering_window_popMessage(window); } static void onMove(VisuInteractive *inter _U_, float drag[3], gpointer data _U_) { /* GList *nodes; */ float val; /* VisuNode *node; */ DBG_fprintf(stderr, "Gtk Move: callback on move action.\n"); /* Modify the entry labels. */ DBG_fprintf(stderr, "Gtk Move: update label of positions.\n"); val = visu_ui_numerical_entry_getValue(VISU_UI_NUMERICAL_ENTRY(entryMoveXYZ[0])); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryMoveXYZ[0]), val + drag[0]); val = visu_ui_numerical_entry_getValue(VISU_UI_NUMERICAL_ENTRY(entryMoveXYZ[1])); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryMoveXYZ[1]), val + drag[1]); val = visu_ui_numerical_entry_getValue(VISU_UI_NUMERICAL_ENTRY(entryMoveXYZ[2])); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryMoveXYZ[2]), val + drag[2]); return; } static void onStartMove(VisuInteractive *inter _U_, GList* nodeIds, gpointer data) { DBG_fprintf(stderr, "Gtk Move: callback on start-move action.\n"); setLabelsOrigin(visu_ui_rendering_window_getData(VISU_UI_RENDERING_WINDOW(data)), nodeIds); return; } static void onMoveClickStop(VisuInteractive *inter _U_, gpointer data _U_) { visu_ui_interactive_toggle(); } /****************/ /* Private part */ /****************/ static void onPageEnter(GtkNotebook *notebook _U_, GtkWidget *child _U_, gint page_num, gpointer user_data _U_) { gchar numero[256]; GList *lst; if (page_num != 1) return; if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioMovePick))) { lst = visu_ui_interactive_pick_getNodeSelection(); sprintf(numero, _("(%d nodes)"), g_list_length(lst)); gtk_label_set_markup(GTK_LABEL(labelNMoves), numero); g_list_free(lst); } } static void onDataReady(GObject *obj _U_, VisuData *dataObj, VisuGlView *view, gpointer data _U_) { int i; VisuNodeArrayIter dataIter; DBG_fprintf(stderr, "Gtk Move: caught 'dataRendered' signal.\n"); if (dataObj) { visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &dataIter); for (i = 0; i < 4; i++) gtk_spin_button_set_range(GTK_SPIN_BUTTON(spinABC[i]), 0, dataIter.idMax); } /* We remove the basisset drawing. */ visu_gl_ext_setActive(VISU_GL_EXT(extBasis), FALSE); if (view && dataObj) { angles_signal = g_signal_connect(G_OBJECT(view), "ThetaPhiOmegaChanged", G_CALLBACK(refreshMoveAxesValues), (gpointer)0); popDec_signal = g_signal_connect(G_OBJECT(dataObj), "PopulationDecrease", G_CALLBACK(onPopulationChanged), (gpointer)0); popInc_signal = g_signal_connect(G_OBJECT(dataObj), "PopulationIncrease", G_CALLBACK(onPopulationChanged), (gpointer)0); popChg_signal = g_signal_connect(G_OBJECT(dataObj), "PositionChanged", G_CALLBACK(onPositionChanged), (gpointer)0); } } static void onDataNotReady(GObject *obj _U_, VisuData *dataObj, VisuGlView *view, gpointer data _U_) { DBG_fprintf(stderr, "Gtk Move: caught 'dataUnRendered' signal.\n"); g_signal_handler_disconnect(G_OBJECT(view), angles_signal); g_signal_handler_disconnect(G_OBJECT(dataObj), popDec_signal); g_signal_handler_disconnect(G_OBJECT(dataObj), popInc_signal); g_signal_handler_disconnect(G_OBJECT(dataObj), popChg_signal); } static void refreshMoveAxesValues(VisuGlView *view, gpointer data) { gint id; float x[3], y[3]; char tmpChr[20]; id = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebookAction)); DBG_fprintf(stderr, "Gtk Move: refresh screen basis set.\n"); DBG_fprintf(stderr, " | %d %d\n", id + 1, VISU_UI_ACTION_MOVE); if (id + 1 == VISU_UI_ACTION_MOVE || GPOINTER_TO_INT(data)) { visu_gl_camera_getScreenAxes(view->camera, x, y); sprintf(tmpChr, "(%4.2f;%4.2f;%4.2f)", x[0], x[1], x[2]); gtk_label_set_text(GTK_LABEL(labelScreenHorizontal), tmpChr); sprintf(tmpChr, "(%4.2f;%4.2f;%4.2f)", y[0], y[1], y[2]); gtk_label_set_text(GTK_LABEL(labelScreenVertical), tmpChr); } } static void onMoveMethod(GtkToggleButton *toggle, gpointer data _U_) { if (!gtk_toggle_button_get_active(toggle)) return; visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryMoveXYZ[0]), 0.); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryMoveXYZ[1]), 0.); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryMoveXYZ[2]), 0.); /* Set the moving list. */ setMovingNodes(); } static void onMovePositionChanged(VisuUiNumericalEntry *entry, double oldValue, gpointer data) { float *valOfNode; VisuData *dataObj; VisuNodeArray *array; VisuNode *node; VisuElement *ele; VisuNodeArrayIter iter; g_return_if_fail(GPOINTER_TO_INT(data) >= 0 && GPOINTER_TO_INT(data) < 3); /* We are not typing. */ if (!gtk_widget_is_focus(GTK_WIDGET(entry))) return; dataObj = visu_ui_rendering_window_getData(visu_ui_main_class_getDefaultRendering()); array = VISU_NODE_ARRAY(dataObj); ele = (VisuElement*)0; DBG_fprintf(stderr, "Gtk Move: move nodes of delta = %g (%d).\n", visu_ui_numerical_entry_getValue(entry) - oldValue, GPOINTER_TO_INT(data)); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioMovePick))) { if (movedNode < 0) return; node = visu_node_array_getFromId(array, movedNode); g_return_if_fail(node); valOfNode = node->xyz + GPOINTER_TO_INT(data); if (*valOfNode == (float)visu_ui_numerical_entry_getValue(entry)) return; *valOfNode = (float)visu_ui_numerical_entry_getValue(entry); ele = visu_node_array_getElement(VISU_NODE_ARRAY(dataObj), node); } else { visu_node_array_iterNew(array, &iter); for (visu_node_array_iterStartList(array, &iter, visu_ui_interactive_pick_getNodeSelection()); iter.node; visu_node_array_iterNextList(array, &iter)) iter.node->xyz[GPOINTER_TO_INT(data)] += visu_ui_numerical_entry_getValue(entry); } g_signal_emit_by_name(G_OBJECT(dataObj), "PositionChanged", ele, NULL); VISU_REDRAW_ADD; } static void onMoveToOriginalClicked(GtkButton *button _U_, gpointer data _U_) { VisuData *dataObj; VisuNode *node; float trans[3]; VisuNodeArray *array; VisuElement *ele; VisuNodeArrayIter iter; dataObj = visu_ui_rendering_window_getData(visu_ui_main_class_getDefaultRendering()); array = VISU_NODE_ARRAY(dataObj); ele = (VisuElement*)0; /* We are not typing. */ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioMovePick))) { if (movedNode < 0) return; node = visu_node_array_getFromId(array, movedNode); g_return_if_fail(node); node->xyz[0] = moveNodeOrigin[0]; node->xyz[1] = moveNodeOrigin[1]; node->xyz[2] = moveNodeOrigin[2]; ele = visu_node_array_getElement(VISU_NODE_ARRAY(dataObj), node); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryMoveXYZ[0]), moveNodeOrigin[0]); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryMoveXYZ[1]), moveNodeOrigin[1]); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryMoveXYZ[2]), moveNodeOrigin[2]); } else { trans[0] = (float)visu_ui_numerical_entry_getValue(VISU_UI_NUMERICAL_ENTRY(entryMoveXYZ[0])); trans[1] = (float)visu_ui_numerical_entry_getValue(VISU_UI_NUMERICAL_ENTRY(entryMoveXYZ[1])); trans[2] = (float)visu_ui_numerical_entry_getValue(VISU_UI_NUMERICAL_ENTRY(entryMoveXYZ[2])); visu_node_array_iterNew(array, &iter); for (visu_node_array_iterStartList(array, &iter, visu_ui_interactive_pick_getNodeSelection()); iter.node; visu_node_array_iterNextList(array, &iter)) { iter.node->xyz[0] -= trans[0]; iter.node->xyz[1] -= trans[1]; iter.node->xyz[2] -= trans[2]; } visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryMoveXYZ[0]), 0.); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryMoveXYZ[1]), 0.); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryMoveXYZ[2]), 0.); } g_signal_emit_by_name(G_OBJECT(dataObj), "PositionChanged", ele, NULL); VISU_REDRAW_ADD; } static void onRemoveNodeClicked(GtkButton *button _U_, gpointer user_data _U_) { int *nodes; VisuData *dataObj; VisuNode *node; int i, n; GList *lst, *tmpLst; VisuElement *ele; DBG_fprintf(stderr, "Gtk Observe/pick: remove the selected node %d.\n", movedNode); dataObj = visu_ui_rendering_window_getData(visu_ui_main_class_getDefaultRendering()); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioMovePick))) { if (movedNode < 0) return; node = visu_node_array_getFromId(VISU_NODE_ARRAY(dataObj), movedNode); if (!node) return; ele = visu_node_array_getElement(VISU_NODE_ARRAY(dataObj), node); nodes = g_malloc(sizeof(int) * 2); nodes[0] = movedNode; nodes[1] = -1; visu_node_array_removeNodes(VISU_NODE_ARRAY(dataObj), nodes); g_free(nodes); /* Copy the coordinates to the add entries. */ for (i = 0; i < 3; i++) visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryAddXYZ[i]), visu_ui_numerical_entry_getValue(VISU_UI_NUMERICAL_ENTRY(entryMoveXYZ[i]))); visu_ui_element_combobox_setSelection(VISU_UI_ELEMENT_COMBOBOX(comboElements), ele->name); g_signal_emit_by_name(G_OBJECT(dataObj), "RenderingChanged", ele, NULL); } else { DBG_fprintf(stderr, "Gtk Move: get list of selected nodes.\n"); tmpLst = lst = visu_ui_interactive_pick_getNodeSelection(); n = g_list_length(lst); if (n > 0) { nodes = g_malloc(sizeof(int) * (n + 1)); i = 0; while(tmpLst) { nodes[i] = GPOINTER_TO_INT(tmpLst->data); DBG_fprintf(stderr, " | will remove %3d %d\n", i, nodes[i]); i += 1; tmpLst = g_list_next(tmpLst); } nodes[i] = -1; visu_node_array_removeNodes(VISU_NODE_ARRAY(dataObj), nodes); g_free(nodes); } g_list_free(lst); } /* We remove the node as selected one. */ setLabelsOrigin((VisuData*)0, (GList*)0); VISU_REDRAW_ADD; } static void onAddNodeClicked(GtkButton *button _U_, gpointer user_data _U_) { VisuData *dataObj; GList *elements; VisuElement *element; float xyz[3]; dataObj = visu_ui_rendering_window_getData(visu_ui_main_class_getDefaultRendering()); elements = visu_ui_element_combobox_getSelection(VISU_UI_ELEMENT_COMBOBOX(comboElements)); g_return_if_fail(elements); element = (VisuElement*)elements->data; g_list_free(elements); xyz[0] = (float)visu_ui_numerical_entry_getValue(VISU_UI_NUMERICAL_ENTRY(entryAddXYZ[0])); xyz[1] = (float)visu_ui_numerical_entry_getValue(VISU_UI_NUMERICAL_ENTRY(entryAddXYZ[1])); xyz[2] = (float)visu_ui_numerical_entry_getValue(VISU_UI_NUMERICAL_ENTRY(entryAddXYZ[2])); visu_data_addNodeFromElement(dataObj, element, xyz, FALSE, TRUE); /* We update all drawings. */ g_signal_emit_by_name(G_OBJECT(dataObj), "PositionChanged", element, NULL); VISU_REDRAW_ADD; } static void onCheckDuplicate(GtkToggleButton *button, gpointer data) { gtk_widget_set_sensitive(GTK_WIDGET(data), !gtk_toggle_button_get_active(button)); } static void onDuplicate(GtkButton *button _U_, gpointer data _U_) { VisuData *dataObj; GList *lst; gboolean custom; VisuElement *element; float coord[3], *trans; VisuNodeArrayIter iter; DBG_fprintf(stderr, "Gtk Move: duplicate selected nodes.\n"); dataObj = visu_ui_rendering_window_getData(visu_ui_main_class_getDefaultRendering()); element = (VisuElement*)0; custom = !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkDuplicate)); if (custom) { lst = visu_ui_element_combobox_getSelection(VISU_UI_ELEMENT_COMBOBOX(comboDuplicate)); g_return_if_fail(lst); element = (VisuElement*)lst->data; DBG_fprintf(stderr, "Gtk Move: change element to '%s'.\n", element->name); g_list_free(lst); } lst = visu_ui_interactive_pick_getNodeSelection(); if (!lst) return; trans = visu_data_getXYZtranslation(dataObj); visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter); for (visu_node_array_iterStartList(VISU_NODE_ARRAY(dataObj), &iter, lst); iter.node; visu_node_array_iterNextList(VISU_NODE_ARRAY(dataObj), &iter)) { visu_data_getNodePosition(dataObj, iter.node, coord); coord[0] -= trans[0]; coord[1] -= trans[1]; coord[2] -= trans[2]; if (element) visu_data_addNodeFromElement(dataObj, element, coord, FALSE, !iter.itLst->next); else visu_data_addNodeFromIndex(dataObj, iter.iElement, coord, FALSE, !iter.itLst->next); } g_free(trans); /* We update all drawings. */ /* g_signal_emit_by_name(G_OBJECT(dataObj), "PositionChanged", element, NULL); */ VISU_REDRAW_ADD; } static void onMoveToggled(GtkToggleButton *toggle, gpointer data) { GtkWidget *wd; gboolean value; value = gtk_toggle_button_get_active(toggle); wd = lookup_widget(GTK_WIDGET(data), "alignment41"); gtk_widget_set_sensitive(wd, value); } static gboolean setupBasisMatrix(VisuData *dataObj, float mat[3][3], float O[3]) { VisuNode *orig, *nodeA, *nodeB, *nodeC; float xyz[3]; orig = visu_node_array_getFromId(VISU_NODE_ARRAY(dataObj), (guint)gtk_spin_button_get_value (GTK_SPIN_BUTTON(spinABC[0])) - 1); nodeA = visu_node_array_getFromId(VISU_NODE_ARRAY(dataObj), (guint)gtk_spin_button_get_value (GTK_SPIN_BUTTON(spinABC[1])) - 1); nodeB = visu_node_array_getFromId(VISU_NODE_ARRAY(dataObj), (guint)gtk_spin_button_get_value (GTK_SPIN_BUTTON(spinABC[2])) - 1); nodeC = visu_node_array_getFromId(VISU_NODE_ARRAY(dataObj), (guint)gtk_spin_button_get_value (GTK_SPIN_BUTTON(spinABC[3])) - 1); if (!orig || !nodeA || !nodeB || !nodeC) return FALSE; visu_data_getNodePosition(dataObj, orig, O); visu_data_getNodePosition(dataObj, nodeA, xyz); mat[0][0] = xyz[0] - O[0]; mat[1][0] = xyz[1] - O[1]; mat[2][0] = xyz[2] - O[2]; visu_data_getNodePosition(dataObj, nodeB, xyz); mat[0][1] = xyz[0] - O[0]; mat[1][1] = xyz[1] - O[1]; mat[2][1] = xyz[2] - O[2]; visu_data_getNodePosition(dataObj, nodeC, xyz); mat[0][2] = xyz[0] - O[0]; mat[1][2] = xyz[1] - O[1]; mat[2][2] = xyz[2] - O[2]; return TRUE; } static void onSpinBasis(GtkSpinButton *spin, gpointer data) { int i; VisuUiRenderingWindow *window; VisuGlExtMarks *marks; gboolean valid; VisuData *dataObj; GList lst; float mat[3][3], O[3]; i = GPOINTER_TO_INT(data); window = visu_ui_main_class_getDefaultRendering(); dataObj = visu_ui_rendering_window_getData(window); marks = visu_ui_rendering_window_getMarks(window); lst.next = (GList*)0; lst.prev = (GList*)0; /* Remove the previous one. */ if (prevBasis[i] > 0) { lst.data = GINT_TO_POINTER(prevBasis[i] - 1); visu_gl_ext_marks_setHighlightedList(marks, &lst, MARKS_STATUS_UNSET); } if (timeoutBasis[i] > 0) g_source_remove(timeoutBasis[i]); prevBasis[i] = (gint)gtk_spin_button_get_value(spin); if (prevBasis[i] > 0 && visu_node_array_getFromId(VISU_NODE_ARRAY(dataObj), prevBasis[i])) { lst.data = GINT_TO_POINTER(prevBasis[i] - 1); visu_gl_ext_marks_setHighlightedList(marks, &lst, MARKS_STATUS_SET); /* Add a new highlight. */ #if GLIB_MINOR_VERSION > 13 timeoutBasis[i] = g_timeout_add_seconds(1, removeHighlight, GINT_TO_POINTER(prevBasis[i])); #else timeoutBasis[i] = g_timeout_add(1000, removeHighlight, GINT_TO_POINTER(prevBasis[i])); #endif } valid = TRUE; for(i = 0; i < 4; i++) valid = valid && (gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinABC[i])) > 0.); gtk_widget_set_sensitive(applyBasis, valid); if (valid && setupBasisMatrix(dataObj, mat, O)) { visu_gl_ext_setActive(VISU_GL_EXT(extBasis), TRUE); drawBasisCell(visu_boxed_getBox(VISU_BOXED(dataObj)), O, mat); if (tool_matrix_determinant(mat) < 0.f) visu_ui_interactive_setMessage(_("The new basis set will be indirect."), GTK_MESSAGE_WARNING); else visu_ui_interactive_unsetMessage(); } else visu_gl_ext_setActive(VISU_GL_EXT(extBasis), FALSE); VISU_REDRAW_FORCE; } static gboolean removeHighlight(gpointer data) { int i; VisuGlExtMarks *marks; GList lst; i = GPOINTER_TO_INT(data); g_return_val_if_fail(i > 0, FALSE); marks = visu_ui_rendering_window_getMarks(visu_ui_main_class_getDefaultRendering()); /* Remove the previous one. */ lst.next = (GList*)0; lst.prev = (GList*)0; lst.data = GINT_TO_POINTER(i - 1); visu_gl_ext_marks_setHighlightedList(marks, &lst, MARKS_STATUS_UNSET); VISU_REDRAW_FORCE; return FALSE; } static void onChooseBasis(GtkToggleButton *toggle, gpointer data) { guint i; VisuUiRenderingWindow *window; gboolean valid; window = visu_ui_main_class_getDefaultRendering(); DBG_fprintf(stderr, "Gtk Move: one toggle chooser has been toggled.\n"); valid = gtk_toggle_button_get_active(toggle); if (valid) { currentMode = interactive_pick; currentAxe = GPOINTER_TO_INT(data); visu_ui_rendering_window_pushInteractive(window, interPick); visu_ui_rendering_window_pushMessage(window, _("Pick a node with the mouse")); } else { currentMode = interactive_move; visu_ui_rendering_window_popInteractive(window, interPick); visu_ui_rendering_window_popMessage(window); } for(i = 0; i < 4; i++) gtk_widget_set_sensitive(toggleABC[i], (!valid || (i == currentAxe))); gtk_widget_set_sensitive(lookup_widget(observeWindow, "hbox72"), !valid); gtk_widget_set_sensitive(lookup_widget(observeWindow, "alignment44"), !valid); gtk_widget_set_sensitive(lookup_widget(observeWindow, "alignment27"), !valid); gtk_widget_set_sensitive(lookup_widget(observeWindow, "hboxAddNode"), !valid); } static void onBasisSelected(VisuInteractive *inter _U_, VisuInteractivePick pick _U_, VisuNode *node0, VisuNode *node1 _U_, VisuNode *node2 _U_, gpointer data _U_) { g_return_if_fail(node0); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinABC[currentAxe]), node0->number + 1); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(toggleABC[currentAxe]), FALSE); } static void onPickClickStop(VisuInteractive *inter _U_, gpointer data _U_) { int i; for(i = 0; i < 4; i++) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggleABC[i]), FALSE); } static void onApplyBasis(GtkButton *button _U_, gpointer data _U_) { VisuData *dataObj; float matA[3][3], O[3]; dataObj = visu_ui_rendering_window_getData(visu_ui_main_class_getDefaultRendering()); if (setupBasisMatrix(dataObj, matA, O)) { if (visu_data_setNewBasis(dataObj, matA, O)) VISU_REDRAW_FORCE; else visu_ui_interactive_setMessage (_("Cannot change the basis: given matrix is singular."), GTK_MESSAGE_ERROR); } g_signal_handler_block(G_OBJECT(spinABC[0]), onSpin_id[0]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinABC[0]), 0); g_signal_handler_unblock(G_OBJECT(spinABC[0]), onSpin_id[0]); g_signal_handler_block(G_OBJECT(spinABC[1]), onSpin_id[1]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinABC[1]), 0); g_signal_handler_unblock(G_OBJECT(spinABC[1]), onSpin_id[1]); g_signal_handler_block(G_OBJECT(spinABC[2]), onSpin_id[2]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinABC[2]), 0); g_signal_handler_unblock(G_OBJECT(spinABC[2]), onSpin_id[2]); g_signal_handler_block(G_OBJECT(spinABC[3]), onSpin_id[3]); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinABC[3]), 0); g_signal_handler_unblock(G_OBJECT(spinABC[3]), onSpin_id[3]); visu_gl_ext_setActive(VISU_GL_EXT(extBasis), FALSE); } static void onPopulationChanged(VisuData *dataObj, gint *nodes _U_, gpointer data _U_) { VisuNodeArrayIter iter; visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter); DBG_fprintf(stderr, "Gtk Move: caught 'population changed', update spin up to %d.\n", iter.idMax + 1); g_signal_handler_block(G_OBJECT(spinABC[0]), onSpin_id[0]); gtk_spin_button_set_range(GTK_SPIN_BUTTON(spinABC[0]), 0, iter.idMax + 1); g_signal_handler_unblock(G_OBJECT(spinABC[0]), onSpin_id[0]); g_signal_handler_block(G_OBJECT(spinABC[1]), onSpin_id[1]); gtk_spin_button_set_range(GTK_SPIN_BUTTON(spinABC[1]), 0, iter.idMax + 1); g_signal_handler_unblock(G_OBJECT(spinABC[1]), onSpin_id[1]); g_signal_handler_block(G_OBJECT(spinABC[2]), onSpin_id[2]); gtk_spin_button_set_range(GTK_SPIN_BUTTON(spinABC[2]), 0, iter.idMax + 1); g_signal_handler_unblock(G_OBJECT(spinABC[2]), onSpin_id[2]); g_signal_handler_block(G_OBJECT(spinABC[3]), onSpin_id[3]); gtk_spin_button_set_range(GTK_SPIN_BUTTON(spinABC[3]), 0, iter.idMax + 1); g_signal_handler_unblock(G_OBJECT(spinABC[3]), onSpin_id[3]); } static void onPositionChanged(VisuData *dataObj, VisuElement *ele _U_, gpointer data _U_) { float mat[3][3], O[3]; if (setupBasisMatrix(dataObj, mat, O)) drawBasisCell(visu_boxed_getBox(VISU_BOXED(dataObj)), O, mat); } static void onAxeChoosen(VisuUiNumericalEntry *entry _U_, double oldValue _U_, gpointer data _U_) { float axe[3]; axe[0] = (float)visu_ui_numerical_entry_getValue(VISU_UI_NUMERICAL_ENTRY(entryAxeXYZ[0])); axe[1] = (float)visu_ui_numerical_entry_getValue(VISU_UI_NUMERICAL_ENTRY(entryAxeXYZ[1])); axe[2] = (float)visu_ui_numerical_entry_getValue(VISU_UI_NUMERICAL_ENTRY(entryAxeXYZ[2])); visu_interactive_setMovingAxe(interMove, axe); } static void onGetAxisClicked(GtkButton *button _U_, gpointer data) { VisuGlView *view; view = visu_ui_rendering_window_getGlView(VISU_UI_RENDERING_WINDOW(data)); g_return_if_fail(view); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryAxeXYZ[0]), view->camera->eye[0]); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryAxeXYZ[1]), view->camera->eye[1]); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryAxeXYZ[2]), view->camera->eye[2]); } /********************/ /* Drawing methods. */ /********************/ static void drawBasisCell(VisuBox *box _U_, float O[3], float mat[3][3]) { /* VisuPlane *dataBox[7]; */ /* int i, j; */ /* float ext[3], u[3], n[3], m[3], v[12][2][3], b[8][3]; */ DBG_fprintf(stderr, "Gtk Move: draw the new basis cell.\n"); visu_gl_ext_box_setBasis(extBasis, O, mat); /* /\* We build the planes of the bounding box. *\/ */ /* visu_box_getExtension(box, ext); */ /* j = 0; */ /* for (i = 0; i < 3; i++) */ /* { */ /* u[0] = 0.f; */ /* u[1] = 0.f; */ /* u[2] = 0.f; */ /* u[i] = 1.f; */ /* visu_box_convertBoxCoordinatestoXYZ(box, n, u); */ /* dataBox[j] = visu_plane_newUndefined(); */ /* visu_plane_setNormalVector(dataBox[j], n); */ /* u[i] = 1 + ext[i]; */ /* visu_box_convertBoxCoordinatestoXYZ(box, m, u); */ /* visu_plane_setDistanceFromOrigin(dataBox[j], sqrt(m[0] * m[0] + m[1] * m[1] + m[2] * m[2])); */ /* j += 1; */ /* dataBox[j] = visu_plane_newUndefined(); */ /* visu_plane_setNormalVector(dataBox[j], n); */ /* u[i] = - ext[i]; */ /* visu_box_convertBoxCoordinatestoXYZ(box, m, u); */ /* visu_plane_setDistanceFromOrigin(dataBox[j], -sqrt(m[0] * m[0] + m[1] * m[1] + m[2] * m[2])); */ /* j += 1; */ /* } */ /* dataBox[j] = (VisuPlane*)0; */ /* /\* We build the vertex array. *\/ */ /* b[0][0] = O[0]; */ /* b[0][1] = O[1]; */ /* b[0][2] = O[2]; */ /* b[1][0] = O[0] + mat[0][0]; */ /* b[1][1] = O[1] + mat[1][0]; */ /* b[1][2] = O[2] + mat[2][0]; */ /* b[2][0] = O[0] + mat[0][0] + mat[0][1]; */ /* b[2][1] = O[1] + mat[1][0] + mat[1][1]; */ /* b[2][2] = O[2] + mat[2][0] + mat[2][1]; */ /* b[3][0] = O[0] + mat[0][1]; */ /* b[3][1] = O[1] + mat[1][1]; */ /* b[3][2] = O[2] + mat[2][1]; */ /* b[4][0] = O[0] + mat[0][2]; */ /* b[4][1] = O[1] + mat[1][2]; */ /* b[4][2] = O[2] + mat[2][2]; */ /* b[5][0] = O[0] + mat[0][0] + mat[0][2]; */ /* b[5][1] = O[1] + mat[1][0] + mat[1][2]; */ /* b[5][2] = O[2] + mat[2][0] + mat[2][2]; */ /* b[6][0] = O[0] + mat[0][0] + mat[0][1] + mat[0][2]; */ /* b[6][1] = O[1] + mat[1][0] + mat[1][1] + mat[1][2]; */ /* b[6][2] = O[2] + mat[2][0] + mat[2][1] + mat[2][2]; */ /* b[7][0] = O[0] + mat[0][1] + mat[0][2]; */ /* b[7][1] = O[1] + mat[1][1] + mat[1][2]; */ /* b[7][2] = O[2] + mat[2][1] + mat[2][2]; */ /* visu_plane_class_getIntersection(dataBox, b[0], b[1], v[0][0], FALSE); */ /* visu_plane_class_getIntersection(dataBox, b[1], b[0], v[0][1], FALSE); */ /* visu_plane_class_getIntersection(dataBox, b[1], b[2], v[1][0], FALSE); */ /* visu_plane_class_getIntersection(dataBox, b[2], b[1], v[1][1], FALSE); */ /* visu_plane_class_getIntersection(dataBox, b[2], b[3], v[2][0], FALSE); */ /* visu_plane_class_getIntersection(dataBox, b[3], b[2], v[2][1], FALSE); */ /* visu_plane_class_getIntersection(dataBox, b[3], b[0], v[3][0], FALSE); */ /* visu_plane_class_getIntersection(dataBox, b[0], b[3], v[3][1], FALSE); */ /* visu_plane_class_getIntersection(dataBox, b[4], b[5], v[4][0], FALSE); */ /* visu_plane_class_getIntersection(dataBox, b[5], b[4], v[4][1], FALSE); */ /* visu_plane_class_getIntersection(dataBox, b[5], b[6], v[5][0], FALSE); */ /* visu_plane_class_getIntersection(dataBox, b[6], b[5], v[5][1], FALSE); */ /* visu_plane_class_getIntersection(dataBox, b[6], b[7], v[6][0], FALSE); */ /* visu_plane_class_getIntersection(dataBox, b[7], b[6], v[6][1], FALSE); */ /* visu_plane_class_getIntersection(dataBox, b[7], b[4], v[7][0], FALSE); */ /* visu_plane_class_getIntersection(dataBox, b[4], b[7], v[7][1], FALSE); */ /* visu_plane_class_getIntersection(dataBox, b[0], b[4], v[8][0], FALSE); */ /* visu_plane_class_getIntersection(dataBox, b[4], b[0], v[8][1], FALSE); */ /* visu_plane_class_getIntersection(dataBox, b[1], b[5], v[9][0], FALSE); */ /* visu_plane_class_getIntersection(dataBox, b[5], b[1], v[9][1], FALSE); */ /* visu_plane_class_getIntersection(dataBox, b[2], b[6], v[10][0], FALSE); */ /* visu_plane_class_getIntersection(dataBox, b[6], b[2], v[10][1], FALSE); */ /* visu_plane_class_getIntersection(dataBox, b[3], b[7], v[11][0], FALSE); */ /* visu_plane_class_getIntersection(dataBox, b[7], b[3], v[11][1], FALSE); */ /* DBG_fprintf(stderr, "Gtk Move: new basis axes.\n"); */ /* for (i = 0; i < 12; i++) */ /* DBG_fprintf(stderr, " | %6.2f x %6.2f x %6.2f -> %6.2f x %6.2f x %6.2f\n", */ /* v[i][0][0], v[i][0][1], v[i][0][2], v[i][1][0], v[i][1][1], v[i][1][2]); */ /* for (i = 0; i < 6; i++) */ /* g_object_unref(G_OBJECT(dataBox[i])); */ visu_gl_ext_box_draw(extBasis); /* glDeleteLists(visu_gl_ext_getGlList(extBasis), 1); */ /* glNewList(visu_gl_ext_getGlList(extBasis), GL_COMPILE); */ /* glDisable(GL_LIGHTING); */ /* glDisable(GL_DITHER); */ /* glEnable(GL_BLEND); */ /* glLineWidth(1); */ /* glColor3f(1.f, 1.f, 1.f); */ /* glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_SRC_COLOR); */ /* glEnable(GL_LINE_STIPPLE); */ /* glLineStipple(1, 57568); */ /* glBegin(GL_LINES); */ /* glVertex3fv(v[0][0]); */ /* glVertex3fv(v[0][1]); */ /* glVertex3fv(v[1][0]); */ /* glVertex3fv(v[1][1]); */ /* glVertex3fv(v[2][0]); */ /* glVertex3fv(v[2][1]); */ /* glVertex3fv(v[3][0]); */ /* glVertex3fv(v[3][1]); */ /* glVertex3fv(v[4][0]); */ /* glVertex3fv(v[4][1]); */ /* glVertex3fv(v[5][0]); */ /* glVertex3fv(v[5][1]); */ /* glVertex3fv(v[6][0]); */ /* glVertex3fv(v[6][1]); */ /* glVertex3fv(v[7][0]); */ /* glVertex3fv(v[7][1]); */ /* glVertex3fv(v[8][0]); */ /* glVertex3fv(v[8][1]); */ /* glVertex3fv(v[9][0]); */ /* glVertex3fv(v[9][1]); */ /* glVertex3fv(v[10][0]); */ /* glVertex3fv(v[10][1]); */ /* glVertex3fv(v[11][0]); */ /* glVertex3fv(v[11][1]); */ /* glEnd(); */ /* glDisable(GL_LINE_STIPPLE); */ /* glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); */ /* glDisable(GL_CULL_FACE); */ /* glColor4f(0.f, 0.f, 0.f, 0.2f); */ /* glBegin(GL_POLYGON); */ /* glVertex3fv(b[0]); */ /* glVertex3fv(b[1]); */ /* glVertex3fv(b[2]); */ /* glVertex3fv(b[3]); */ /* glEnd(); */ /* glBegin(GL_POLYGON); */ /* glVertex3fv(b[0]); */ /* glVertex3fv(b[1]); */ /* glVertex3fv(b[5]); */ /* glVertex3fv(b[4]); */ /* glEnd(); */ /* glBegin(GL_POLYGON); */ /* glVertex3fv(b[0]); */ /* glVertex3fv(b[3]); */ /* glVertex3fv(b[7]); */ /* glVertex3fv(b[4]); */ /* glEnd(); */ /* glBegin(GL_POLYGON); */ /* glVertex3fv(b[4]); */ /* glVertex3fv(b[5]); */ /* glVertex3fv(b[6]); */ /* glVertex3fv(b[7]); */ /* glEnd(); */ /* glBegin(GL_POLYGON); */ /* glVertex3fv(b[6]); */ /* glVertex3fv(b[5]); */ /* glVertex3fv(b[1]); */ /* glVertex3fv(b[2]); */ /* glEnd(); */ /* glBegin(GL_POLYGON); */ /* glVertex3fv(b[6]); */ /* glVertex3fv(b[7]); */ /* glVertex3fv(b[3]); */ /* glVertex3fv(b[2]); */ /* glEnd(); */ /* glEnable(GL_CULL_FACE); */ /* glCullFace(GL_BACK); */ /* glEnable(GL_LIGHTING); */ /* glEnable(GL_DITHER); */ /* glEndList(); */ } v_sim-3.7.0/src/gtk_move.h0000644000353400050620000000412112215546105012333 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef GTK_MOVE_H #define GTK_MOVE_H #include #include "gtk_main.h" #include "gtk_renderingWindowWidget.h" GtkWidget* visu_ui_interactive_move_initBuild(VisuUiMain *main, gchar **label, gchar **help, GtkWidget **radio); void visu_ui_interactive_move_start(VisuUiRenderingWindow *window); void visu_ui_interactive_move_stop(VisuUiRenderingWindow *window); #endif v_sim-3.7.0/src/gtk_pairs.c0000644000353400050620000022100212215546105012475 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "gtk_pairs.h" #include "pairsModeling/externalGtkPairsExtensions.h" #include "extraGtkFunctions/gtk_colorComboBoxWidget.h" #include "extraGtkFunctions/gtk_curveWidget.h" #include "extraGtkFunctions/gtk_elementComboBox.h" #include "gtk_renderingWindowWidget.h" #include "interface.h" #include "support.h" #include #include #include "visu_tools.h" #include "visu_object.h" #include "visu_data.h" #include "visu_pairs.h" #include "extensions/pairs.h" /** * SECTION: gtk_pairs * @short_description: The pairs dialog. * * The pair dialog provides a list of pairs as min/max * distances between species to draw pairs. A set of two species can * have several pairs drawn. * This dialog also hosts widgets that depend on the pair method * that is used for a given link. * Finally, it has also a second tab where a graph of g(r) can * be drawn. */ /** * VisuUiPairsIter: * @ele1: the #VisuElement on one side ; * @ele2: the #VisuElement on the other side ; * @data: the #VisuPairLink information on the link between @ele1 and * @ele2 ; * @iter: the #GtkTreeIter corresponding to this link ; * @selected: a private attribute ; * @current: an other private attribute. * * An iterator on pairs. */ static GtkWidget *vboxPairsDialog; static gulong unit_signal; /* Current pair list is out of date. */ static gboolean pairsNeedBuild; struct specBuildFunc_struct { GtkWidget *wd; VisuUiPairsBuildWidgetsFunc area; VisuUiPairsToLabelFunc label; VisuUiPairsSetValuesFunc selected; }; static GtkWidget *gtkPairs_treeView; static GtkWidget *widgetColor; static GtkWidget *parameterWidget, *alignWidget; static GtkWidget *comboFilter, *btAdd, *btRemove, *btHide; static gulong widgetColorSignalId, methodSignalId; static GtkWidget *curve; static GtkWidget *spinDMin, *spinDMax, *spinDZoom; static GtkWidget *rangeHlStart, *rangeHlEnd, *checkHighlight, *labelIntegralDistance, *labelMeanDistance; static gulong gtkPairs_spinMinSignalId, gtkPairs_spinMaxSignalId; static GtkWidget *gtkPairs_spinMin, *gtkPairs_spinMax; static gboolean disableCallbacks = FALSE; /* This enum is used to access the column of the liststore have the data of pairs. */ enum { GTK_PAIRS_COLUMN_DRAWN, /* GTK_PAIRS_COLUMN_LABEL_DISTANCE, */ GTK_PAIRS_COLUMN_DISTANCE_FROM, GTK_PAIRS_COLUMN_DISTANCE_TO, GTK_PAIRS_COLUMN_PIXBUF_COLOR, GTK_PAIRS_COLUMN_LABEL_USER, GTK_PAIRS_COLUMN_PRINT_LENGTH, GTK_PAIRS_COLUMN_POINTER_TO_LINK, GTK_PAIRS_COLUMN_POINTER_TO_ELE1, GTK_PAIRS_COLUMN_POINTER_TO_ELE2, N_GTK_PAIRS_COLUMN }; static GtkTreeStore *pairsTreeStore; /* The list store that controls the drawing of the pairs data. */ static GtkTreeModel *pairsFilter, *pairsSortable; static GtkTreeSelection *pairsSelection; /* Combobox model. */ static GtkListStore *gtkPairs_comboModel; enum { GTK_PAIRS_COLUMN_PAIRS_ICON, /* A pixmap to represent the pairs */ GTK_PAIRS_COLUMN_PAIRS_NAME, /* The label shown */ GTK_PAIRS_COLUMN_PAIRS_POINTER, /* Pointer to the pairs extension. */ GTK_PAIRS_COLUMN_PAIRS_SPEC_BUILD, /* Pointer to the pairs specBuildFunc_struct. */ N_GTK_PAIRS_METHODS_PAIRS }; /* Local routines. */ static void minMaxChanged(GtkSpinButton *spin, GtkTreeSelection *tree, int minMax); static void addPairAllData(VisuElement *ele1, VisuElement *ele2); static gint sortPairs(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data); static gboolean curveReplot(gpointer data); static void curveSetData(VisuData *dataObj); static gboolean setHlRange(gboolean set); static void selectByPairMethod(GtkComboBox *combo, VisuPairExtension *meth); static struct specBuildFunc_struct* getSpecBuildFuncs(VisuPairLink *data); /* Callbacks. */ static void onGtkPairsDrawnToggled(GtkCellRendererToggle *cell_renderer, gchar *path, gpointer user_data); static void onDistanceValueEdited(GtkCellRendererText *cellrenderertext, gchar *path, gchar *text, gpointer user_data); static void onGtkPairsLengthToggled(GtkCellRendererToggle *cell_renderer, gchar *path, gpointer user_data); static void selectionChanged(GtkTreeSelection *tree, gpointer data); static void minChanged(GtkSpinButton *spin, gpointer userData); static void maxChanged(GtkSpinButton *spin, gpointer userData); static void pairsMethodChanged(GtkComboBox *combobox, gpointer userData); static void filterChanged(VisuUiElementCombobox *combobox, GList *elements, gpointer userData); static void colorChanged(VisuUiColorCombobox *colorWd, ToolColor *color, gpointer userData); static void onDataReady(GObject *obj, VisuData *dataObj, VisuGlView *view, gpointer data); static void onDataNotReady(GObject *obj, VisuData *dataObj, VisuGlView *view, gpointer data); static void rebuildPairsOnResources(GObject *obj, VisuData *dataObj, gpointer bool); static gboolean pairsRowIsVisible(GtkTreeModel *model, GtkTreeIter *iter, gpointer data); static void onBtAdd(GtkButton *button, gpointer user_data); static void onBtRemove(GtkButton *button, gpointer user_data); static void onBtHide(GtkToggleButton *button, gpointer user_data); static void onDistanceAutoSet(GtkButton *button, gpointer data); static void onDistSpanChanged(GtkSpinButton *spin, gpointer userData); static void onHlRangeToggled(GtkToggleButton *button, gpointer user_data); static void onRangeChanged(GtkRange *rg, gpointer data); static gboolean onElementChanged(GSignalInvocationHint *ihint, guint n_param_values, const GValue *param_values, gpointer data); static void onUnitChanged(VisuData *dataObj, gfloat factor, gpointer data); #define GTK_PAIRS_HELP_TEXT _("Modifications, as color or wire width, are applied only to selected rows. Use to select more than one row at a time.") #define NO_DIST_INTEGRAL _("No distance analysis") #define DIST_INTEGRAL _("\342\200\242 there are %.3f neighbours per '%s'") #define NO_DIST_MEAN "" #define DIST_MEAN _("\342\200\242 mean distance is %.3f") /* Create the label for the distance, need to free result. */ gchar* createDistanceLabel(VisuPairLink *data); /* Connect the signal and initialise values. */ void visu_ui_pairs_init() { GList *pnt; int i; struct specBuildFunc_struct *specBuild; GtkTreeIter iter; /* Create the listModel for pairs method*/ gtkPairs_comboModel = gtk_list_store_new(N_GTK_PAIRS_METHODS_PAIRS, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_POINTER); gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(gtkPairs_comboModel), GTK_PAIRS_COLUMN_PAIRS_NAME, GTK_SORT_ASCENDING); for (i = 0, pnt = visu_pair_extension_getAllMethods(); pnt; i++, pnt = g_list_next(pnt)) if (listVisuUiPairsInitFunc[i] && listGtkPairsBuildFunc[i] && listGtkPairsLabelFunc[i] && listGtkPairsSignalFunc[i]) { listVisuUiPairsInitFunc[i](); specBuild = g_malloc(sizeof(struct specBuildFunc_struct)); specBuild->wd = (GtkWidget*)0; specBuild->area = listGtkPairsBuildFunc[i]; specBuild->label = listGtkPairsLabelFunc[i]; specBuild->selected = listGtkPairsSignalFunc[i]; gtk_list_store_append(gtkPairs_comboModel, &iter); DBG_fprintf(stderr, " | '%s' method...\n", visu_pair_extension_getName((VisuPairExtension*)pnt->data, TRUE)); gtk_list_store_set(gtkPairs_comboModel, &iter, GTK_PAIRS_COLUMN_PAIRS_ICON, (GdkPixbuf*)0, GTK_PAIRS_COLUMN_PAIRS_NAME, visu_pair_extension_getName((VisuPairExtension*)pnt->data, TRUE), GTK_PAIRS_COLUMN_PAIRS_POINTER, pnt->data, GTK_PAIRS_COLUMN_PAIRS_SPEC_BUILD, (gpointer)specBuild, -1); DBG_fprintf(stderr, " | method OK.\n"); } pairsSelection = (GtkTreeSelection*)0; } static void formatDistances(GtkTreeViewColumn *column _U_, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { gchar dist[8]; float val; gtk_tree_model_get(model, iter, GPOINTER_TO_INT(data), &val, -1); sprintf(dist, "%6.3f", val); g_object_set(G_OBJECT(cell), "text", dist, NULL); } static void formatElements(GtkTreeViewColumn *column _U_, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data _U_) { gchar lbl[128]; VisuElement *ele1, *ele2; GtkTreeIter parent; if (gtk_tree_model_iter_parent(model, &parent, iter)) lbl[0] = '\0'; else { gtk_tree_model_get(model, iter, GTK_PAIRS_COLUMN_POINTER_TO_ELE1, &ele1, GTK_PAIRS_COLUMN_POINTER_TO_ELE2, &ele2, -1); g_return_if_fail(ele1 && ele2); sprintf(lbl, "%s - %s", ele1->name, ele2->name); } g_object_set(G_OBJECT(cell), "text", lbl, NULL); } /** * visu_ui_pairs_show: * @main: the container for pairs dialog. * * Shows the pairs dialog and run possible update of the interface. * * Since: 3.6 */ void visu_ui_pairs_show(VisuUiMain *main _U_) { VisuData *dataObj; dataObj = visu_ui_rendering_window_getData(visu_ui_main_class_getDefaultRendering()); g_return_if_fail(dataObj); if (!visu_ui_curve_frame_hasData(VISU_UI_CURVE_FRAME(curve))) g_idle_add(curveReplot, (gpointer)dataObj); } void visu_ui_pairs_initBuild(VisuUiMain *main) { GtkWidget *wd, *image, *vbox, *hbox, *vbox2; GtkWidget *viewport, *align, *combo; GtkWidget *label; VisuData *dataObj; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkTreeSelection *sel; #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 11 GList *lst; #endif #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 12 GtkTooltips *tooltips; tooltips = gtk_tooltips_new (); #endif dataObj = visu_ui_rendering_window_getData(visu_ui_main_class_getDefaultRendering()); /* Create the listModel for pairs data*/ pairsTreeStore = gtk_tree_store_new(N_GTK_PAIRS_COLUMN, G_TYPE_BOOLEAN, G_TYPE_FLOAT, G_TYPE_FLOAT, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER); main->pairsDialog = create_pairsDialog(); gtk_window_set_type_hint(GTK_WINDOW(main->pairsDialog), GDK_WINDOW_TYPE_HINT_UTILITY); gtk_widget_set_name(main->pairsDialog, "message"); wd = lookup_widget(main->pairsDialog, "labelTitlePairs"); gtk_widget_set_name(wd, "message_title"); wd = lookup_widget(main->pairsDialog, "scrolledwindowPairs"); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(wd), GTK_SHADOW_ETCHED_IN); viewport = lookup_widget(main->pairsDialog, "viewport1"); gtk_widget_set_name(viewport, "message_viewport"); gtk_widget_set_name(lookup_widget(main->pairsDialog, "notebookPairs"), "message_notebook"); wd = gtk_bin_get_child(GTK_BIN(viewport)); if (wd) gtk_widget_destroy(wd); /* Create the TreeView to represent the pairs data. */ gtkPairs_treeView = gtk_tree_view_new(); /* gtk_tooltips_set_tip(tooltips, gtkPairs_treeView, GTK_PAIRS_HELP_TEXT, NULL); */ g_object_set(G_OBJECT(gtkPairs_treeView), "rules-hint", TRUE, NULL); pairsSelection = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkPairs_treeView)); gtk_widget_show(gtkPairs_treeView); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(gtkPairs_treeView), TRUE); gtk_container_add(GTK_CONTAINER(viewport), gtkPairs_treeView); vboxPairsDialog = lookup_widget(main->pairsDialog, "vboxPairsDialog"); /* Create a filter for the treeview. */ pairsFilter = gtk_tree_model_filter_new(GTK_TREE_MODEL(pairsTreeStore), NULL); pairsSortable = gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL(pairsFilter)); gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(pairsSortable), GTK_PAIRS_COLUMN_POINTER_TO_ELE1, GTK_SORT_ASCENDING); gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(pairsSortable), GTK_PAIRS_COLUMN_POINTER_TO_ELE1, sortPairs, (gpointer)pairsSortable, NULL); /* Set parameters for the tree */ gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkPairs_treeView)), GTK_SELECTION_MULTIPLE); gtk_tree_view_set_model(GTK_TREE_VIEW(gtkPairs_treeView), pairsSortable); /* Create a filter selector for the shown pairs. */ wd = lookup_widget(main->pairsDialog, "hbox73"); vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(wd), vbox, FALSE, FALSE, 0); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 5 label = gtk_label_new(_("Manage links: ")); gtk_label_set_angle(GTK_LABEL(label), 90.); gtk_box_pack_end(GTK_BOX(vbox), label, FALSE, FALSE, 0); #endif btRemove = gtk_button_new(); gtk_widget_set_sensitive(btRemove, FALSE); image = gtk_image_new_from_stock(GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU); gtk_container_add(GTK_CONTAINER(btRemove), image); gtk_box_pack_end(GTK_BOX(vbox), btRemove, FALSE, FALSE, 3); g_signal_connect(G_OBJECT(btRemove), "clicked", G_CALLBACK(onBtRemove), (gpointer)0); gtk_tooltips_set_tip(tooltips, btRemove, _("Remove a link definition."), NULL); btAdd = gtk_button_new(); gtk_widget_set_sensitive(btAdd, FALSE); image = gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_MENU); gtk_container_add(GTK_CONTAINER(btAdd), image); gtk_box_pack_end(GTK_BOX(vbox), btAdd, FALSE, FALSE, 3); g_signal_connect(G_OBJECT(btAdd), "clicked", G_CALLBACK(onBtAdd), (gpointer)0); gtk_tooltips_set_tip(tooltips, btAdd, _("Add a new link definition using (0., 0.) if" " it does not already exist."), NULL); btHide = gtk_toggle_button_new(); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(btHide), FALSE); image = gtk_image_new_from_stock(GTK_STOCK_FIND, GTK_ICON_SIZE_MENU); gtk_container_add(GTK_CONTAINER(btHide), image); gtk_box_pack_end(GTK_BOX(vbox), btHide, FALSE, FALSE, 8); g_signal_connect(G_OBJECT(btHide), "toggled", G_CALLBACK(onBtHide), (gpointer)pairsFilter); gtk_tooltips_set_tip(tooltips, btHide, _("Show/hide the undrawn pairs."), NULL); gtk_widget_show_all(vbox); /* Create the part for the link parameters. */ label = gtk_label_new(_("Link parameters:\t " "(apply to one or more selected rows)")); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_box_pack_start(GTK_BOX(vboxPairsDialog), label, FALSE, FALSE, 5); gtk_widget_show_all(label); /* Create widgets that apply to all checked pairs. */ alignWidget = gtk_alignment_new(0.5, 0.5, 1.0, 1.0); gtk_widget_set_sensitive(alignWidget, FALSE); gtk_alignment_set_padding(GTK_ALIGNMENT(alignWidget), 0, 0, 10, 10); gtk_box_pack_start(GTK_BOX(vboxPairsDialog), alignWidget, FALSE, FALSE, 0); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(alignWidget), vbox); hbox = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("From: ")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); gtkPairs_spinMin = gtk_spin_button_new_with_range(0, 100, 0.05); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(gtkPairs_spinMin), TRUE); gtk_entry_set_width_chars(GTK_ENTRY(gtkPairs_spinMin), 4); gtk_box_pack_start(GTK_BOX(hbox), gtkPairs_spinMin, FALSE, FALSE, 0); label = gtk_label_new(_(" to: ")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); gtkPairs_spinMax = gtk_spin_button_new_with_range(0, 100, 0.05); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(gtkPairs_spinMax), TRUE); gtk_entry_set_width_chars(GTK_ENTRY(gtkPairs_spinMax), 4); gtk_box_pack_start(GTK_BOX(hbox), gtkPairs_spinMax, FALSE, FALSE, 0); wd = gtk_button_new_with_mnemonic(_("_Auto set")); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(wd), "clicked", G_CALLBACK(onDistanceAutoSet), (gpointer)0); gtk_tooltips_set_tip(tooltips, wd, _("Set the distance criterion to select the first" " pick in the distance distribution between all" " nodes of the selected types."), NULL); /* label = gtk_label_new (_("Color: ")); */ /* gtk_box_pack_start (GTK_BOX (hboxCheckWidgets), label, TRUE, TRUE, 0); */ /* gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); */ widgetColor = visu_ui_color_combobox_new(FALSE); gtk_box_pack_end(GTK_BOX(hbox), widgetColor, FALSE, FALSE, 0); /* The pair method line. */ hbox = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); align = gtk_alignment_new(0.5, 0., 1.0, 0.); gtk_box_pack_start(GTK_BOX(hbox), align, FALSE, FALSE, 0); combo = gtk_combo_box_new(); /* renderer = gtk_cell_renderer_pixbuf_new(); */ /* gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), renderer, FALSE); */ /* gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(combo), */ /* renderer, "pixbuf", */ /* GTK_PAIRS_COLUMN_PAIRS_ICON); */ renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), renderer, FALSE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(combo), renderer, "text", GTK_PAIRS_COLUMN_PAIRS_NAME); gtk_combo_box_set_model(GTK_COMBO_BOX(combo), GTK_TREE_MODEL(gtkPairs_comboModel)); gtk_container_add(GTK_CONTAINER(align), combo); parameterWidget = gtk_vbox_new(FALSE, 0); gtk_box_pack_end(GTK_BOX(hbox), parameterWidget, TRUE, TRUE, 0); methodSignalId = g_signal_connect(G_OBJECT(combo), "changed", G_CALLBACK(pairsMethodChanged), (gpointer)0); selectByPairMethod(GTK_COMBO_BOX(combo), visu_pair_extension_getDefault()); gtk_widget_show_all(alignWidget); /* Render the associated tree */ renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, _("Pair")); gtk_tree_view_column_set_sort_indicator(column, TRUE); gtk_tree_view_column_set_sort_order(column, GTK_SORT_ASCENDING); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func (column, renderer, formatElements, GINT_TO_POINTER(GTK_PAIRS_COLUMN_POINTER_TO_ELE1), (GDestroyNotify)0); gtk_tree_view_column_set_sort_column_id(column, GTK_PAIRS_COLUMN_POINTER_TO_ELE1); gtk_tree_view_append_column(GTK_TREE_VIEW(gtkPairs_treeView), column); renderer = gtk_cell_renderer_toggle_new (); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(onGtkPairsDrawnToggled), (gpointer)0); column = gtk_tree_view_column_new_with_attributes ("", renderer, "active", GTK_PAIRS_COLUMN_DRAWN, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(gtkPairs_treeView), column); renderer = gtk_cell_renderer_text_new(); g_object_set(G_OBJECT(renderer), "editable", TRUE, "foreground", "blue", NULL); g_signal_connect(G_OBJECT(renderer), "edited", G_CALLBACK(onDistanceValueEdited), GINT_TO_POINTER(GTK_PAIRS_COLUMN_DISTANCE_FROM)); column = gtk_tree_view_column_new_with_attributes(_("From"), renderer, "text", GTK_PAIRS_COLUMN_DISTANCE_FROM, NULL); gtk_tree_view_column_set_cell_data_func (column, renderer, formatDistances, GINT_TO_POINTER(GTK_PAIRS_COLUMN_DISTANCE_FROM), (GDestroyNotify)0); gtk_tree_view_append_column(GTK_TREE_VIEW(gtkPairs_treeView), column); renderer = gtk_cell_renderer_text_new(); g_object_set(G_OBJECT(renderer), "editable", TRUE, "foreground", "blue", NULL); g_signal_connect(G_OBJECT(renderer), "edited", G_CALLBACK(onDistanceValueEdited), GINT_TO_POINTER(GTK_PAIRS_COLUMN_DISTANCE_TO)); column = gtk_tree_view_column_new_with_attributes(_("To"), renderer, "text", GTK_PAIRS_COLUMN_DISTANCE_TO, NULL); gtk_tree_view_column_set_cell_data_func (column, renderer, formatDistances, GINT_TO_POINTER(GTK_PAIRS_COLUMN_DISTANCE_TO), (GDestroyNotify)0); gtk_tree_view_append_column(GTK_TREE_VIEW(gtkPairs_treeView), column); renderer = gtk_cell_renderer_toggle_new (); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(onGtkPairsLengthToggled), (gpointer)0); column = gtk_tree_view_column_new_with_attributes (_("Lg."), renderer, "active", GTK_PAIRS_COLUMN_PRINT_LENGTH, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(gtkPairs_treeView), column); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, _("Parameters")); renderer = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_attributes(column, renderer, "pixbuf", GTK_PAIRS_COLUMN_PIXBUF_COLOR, NULL); renderer = gtk_cell_renderer_text_new (); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_attributes(column, renderer, "text", GTK_PAIRS_COLUMN_LABEL_USER, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(gtkPairs_treeView), column); wd = lookup_widget(main->pairsDialog, "hboxPairsModel"); label = gtk_label_new("]"); gtk_box_pack_end(GTK_BOX(wd), label, FALSE, FALSE, 0); align = gtk_alignment_new(0.5, 0.5, 1., 0.); gtk_box_pack_end(GTK_BOX(wd), align, FALSE, FALSE, 0); comboFilter = visu_ui_element_combobox_new(FALSE, TRUE, (const gchar*)0); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 11 lst = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(comboFilter)); if (lst) { g_object_set(G_OBJECT(lst->data), "scale", 0.75, NULL); g_list_free(lst); } #endif /* gtk_box_pack_end(GTK_BOX(wd), comboFilter, FALSE, FALSE, 0); */ gtk_container_add(GTK_CONTAINER(align), comboFilter); g_signal_connect(G_OBJECT(comboFilter), "element-selected", G_CALLBACK(filterChanged), (gpointer)pairsFilter); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(pairsFilter), pairsRowIsVisible, (gpointer)comboFilter, (GDestroyNotify)0); label = gtk_label_new(_("filter: ")); gtk_box_pack_end(GTK_BOX(wd), label, FALSE, FALSE, 0); align = gtk_alignment_new(0.5, 0.5, 1., 1.); gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, 10, 0); gtk_box_pack_end(GTK_BOX(wd), align, FALSE, FALSE, 0); label = gtk_label_new("["); gtk_container_add(GTK_CONTAINER(align), label); gtk_widget_show_all(wd); /* Connect local signals. */ sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkPairs_treeView)); g_signal_connect(G_OBJECT(sel), "changed", G_CALLBACK(selectionChanged), (gpointer)combo); widgetColorSignalId = g_signal_connect(G_OBJECT(widgetColor), "color-selected", G_CALLBACK(colorChanged), (gpointer)0); gtkPairs_spinMinSignalId = g_signal_connect(G_OBJECT(gtkPairs_spinMin), "value_changed", G_CALLBACK(minChanged), (gpointer)sel); gtkPairs_spinMaxSignalId = g_signal_connect(G_OBJECT(gtkPairs_spinMax), "value_changed", G_CALLBACK(maxChanged), (gpointer)sel); /* The "Distances" page. */ vbox = lookup_widget(main->pairsDialog, "vboxDistances"); curve = visu_ui_curve_frame_new(0., 5.); gtk_widget_set_name(curve, "message_notebook"); visu_ui_curve_frame_setStyle(VISU_UI_CURVE_FRAME(curve), CURVE_LINEAR); gtk_box_pack_start(GTK_BOX(vbox), curve, TRUE, TRUE, 0); g_signal_add_emission_hook(g_signal_lookup("ElementMaterialChanged", VISU_TYPE_ELEMENT), 0, onElementChanged, (gpointer)curve, (GDestroyNotify)0); label = gtk_label_new(_("Parameters:")); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("min:")); gtk_misc_set_alignment(GTK_MISC(label), 1., 0.5); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); spinDMin = gtk_spin_button_new_with_range(0., 50., 0.1); gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinDMin), 2); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinDMin), 0.); g_signal_connect(G_OBJECT(spinDMin), "value_changed", G_CALLBACK(onDistSpanChanged), (gpointer)0); gtk_box_pack_start(GTK_BOX(hbox), spinDMin, FALSE, FALSE, 0); label = gtk_label_new(_("max:")); gtk_misc_set_alignment(GTK_MISC(label), 1., 0.5); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); spinDMax = gtk_spin_button_new_with_range(0., 50., 0.1); gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinDMax), 2); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinDMax), 5.); g_signal_connect(G_OBJECT(spinDMax), "value_changed", G_CALLBACK(onDistSpanChanged), (gpointer)0); gtk_box_pack_start(GTK_BOX(hbox), spinDMax, FALSE, FALSE, 0); label = gtk_label_new(_("step size:")); gtk_misc_set_alignment(GTK_MISC(label), 1., 0.5); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); spinDZoom = gtk_spin_button_new_with_range(1., 20., 1.); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinDZoom), 5.); g_signal_connect(G_OBJECT(spinDZoom), "value_changed", G_CALLBACK(onDistSpanChanged), (gpointer)0); gtk_box_pack_start(GTK_BOX(hbox), spinDZoom, FALSE, FALSE, 0); label = gtk_label_new(_("Measurement tools:")); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0., 0.5); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Range")); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 1., 0.); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); vbox2 = gtk_vbox_new(TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox2, TRUE, TRUE, 0); rangeHlStart = gtk_hscale_new_with_range(0., 5., .05); gtk_range_set_value(GTK_RANGE(rangeHlStart), 2.); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 11 gtk_range_set_restrict_to_fill_level(GTK_RANGE(rangeHlStart), TRUE); gtk_range_set_fill_level(GTK_RANGE(rangeHlStart), 3.5); gtk_range_set_show_fill_level(GTK_RANGE(rangeHlStart), TRUE); #endif gtk_scale_set_draw_value(GTK_SCALE(rangeHlStart), FALSE); gtk_box_pack_start(GTK_BOX(vbox2), rangeHlStart, FALSE, FALSE, 0); rangeHlEnd = gtk_hscale_new_with_range(0., 5., .05); gtk_range_set_value(GTK_RANGE(rangeHlEnd), 3.5); gtk_scale_set_draw_value(GTK_SCALE(rangeHlEnd), FALSE); g_signal_connect(G_OBJECT(rangeHlStart), "value-changed", G_CALLBACK(onRangeChanged), (gpointer)rangeHlEnd); g_signal_connect(G_OBJECT(rangeHlEnd), "value-changed", G_CALLBACK(onRangeChanged), (gpointer)rangeHlStart); gtk_box_pack_start(GTK_BOX(vbox2), rangeHlEnd, FALSE, FALSE, 0); vbox2 = gtk_vbox_new(TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox2, FALSE, FALSE, 0); checkHighlight = gtk_check_button_new_with_mnemonic(_("_Highlight nodes in range")); g_signal_connect(G_OBJECT(checkHighlight), "toggled", G_CALLBACK(onHlRangeToggled), (gpointer)curve); gtk_box_pack_start(GTK_BOX(vbox2), checkHighlight, FALSE, FALSE, 0); labelIntegralDistance = gtk_label_new(NO_DIST_INTEGRAL); gtk_label_set_use_markup(GTK_LABEL(labelIntegralDistance), TRUE); gtk_misc_set_alignment(GTK_MISC(labelIntegralDistance), 0., 0.5); gtk_misc_set_padding(GTK_MISC(labelIntegralDistance), 10, 0); gtk_box_pack_start(GTK_BOX(vbox), labelIntegralDistance, FALSE, FALSE, 0); labelMeanDistance = gtk_label_new(NO_DIST_MEAN); gtk_label_set_use_markup(GTK_LABEL(labelMeanDistance), TRUE); gtk_misc_set_alignment(GTK_MISC(labelMeanDistance), 0., 0.5); gtk_misc_set_padding(GTK_MISC(labelMeanDistance), 10, 0); gtk_box_pack_start(GTK_BOX(vbox), labelMeanDistance, FALSE, FALSE, 0); gtk_widget_show_all(vbox); /* Set the flag that indicates that interior is not built yet. */ pairsNeedBuild = TRUE; setHlRange(TRUE); g_signal_connect(VISU_OBJECT_INSTANCE, "dataRendered", G_CALLBACK(onDataReady), (gpointer)main); g_signal_connect(VISU_OBJECT_INSTANCE, "dataUnRendered", G_CALLBACK(onDataNotReady), (gpointer)main); g_signal_connect(VISU_OBJECT_INSTANCE, "resourcesLoaded", G_CALLBACK(rebuildPairsOnResources), (gpointer)main); if (dataObj) onDataReady((GObject*)0, dataObj, (VisuGlView*)0, (gpointer)main); DBG_fprintf(stderr, "Gtk Pairs: Pairs are first built.\n"); } static void addPairAllData(VisuElement *ele1, VisuElement *ele2) { gboolean first; GList *tmpLst; GtkTreeIter iter, iterParent; gboolean drawn; ToolColor *color; GdkPixbuf *pixColor; gchar *label; VisuPairLink *data; struct specBuildFunc_struct *spec; first = TRUE; for (tmpLst = visu_pair_link_getAll(ele1, ele2); tmpLst; tmpLst = g_list_next(tmpLst)) { data = (VisuPairLink*)tmpLst->data; /* Add the VisuPairLink to the liststore. */ drawn = visu_pair_link_getDrawn(data); /* lblDist = createDistanceLabel(data); */ color = visu_pair_link_getColor(data); pixColor = visu_ui_color_combobox_getPixbufFromColor(VISU_UI_COLOR_COMBOBOX(widgetColor), color); spec = getSpecBuildFuncs(data); if (spec && spec->label) label = spec->label(data); else label = (gchar*)0; if (first) { DBG_fprintf(stderr, "Gtk Pairs: add all pairs (%d) for %s - %s.\n", g_list_length(tmpLst), ele1->name, ele2->name); DBG_fprintf(stderr, " | pairs %s - %s (%g/%g).\n", ele1->name, ele2->name, visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MIN), visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MAX)); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 9 gtk_tree_store_insert_with_values (pairsTreeStore, &iterParent, (GtkTreeIter*)0, 0, GTK_PAIRS_COLUMN_POINTER_TO_ELE1, ele1, GTK_PAIRS_COLUMN_POINTER_TO_ELE2, ele2, GTK_PAIRS_COLUMN_DRAWN, drawn, GTK_PAIRS_COLUMN_DISTANCE_FROM, visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MIN), GTK_PAIRS_COLUMN_DISTANCE_TO, visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MAX), GTK_PAIRS_COLUMN_PIXBUF_COLOR, pixColor, GTK_PAIRS_COLUMN_LABEL_USER, label, GTK_PAIRS_COLUMN_PRINT_LENGTH, visu_pair_link_getPrintLength(data), GTK_PAIRS_COLUMN_POINTER_TO_LINK, (gpointer)data, -1); #else gtk_tree_store_append(pairsTreeStore, &iterParent, (GtkTreeIter*)0); gtk_tree_store_set(pairsTreeStore, &iterParent, GTK_PAIRS_COLUMN_POINTER_TO_ELE1, ele1, GTK_PAIRS_COLUMN_POINTER_TO_ELE2, ele2, GTK_PAIRS_COLUMN_DRAWN, drawn, GTK_PAIRS_COLUMN_DISTANCE_FROM, visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MIN), GTK_PAIRS_COLUMN_DISTANCE_TO, visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MAX), GTK_PAIRS_COLUMN_PIXBUF_COLOR, pixColor, GTK_PAIRS_COLUMN_LABEL_USER, label, GTK_PAIRS_COLUMN_PRINT_LENGTH, visu_pair_link_getPrintLength(data), GTK_PAIRS_COLUMN_POINTER_TO_LINK, (gpointer)data, -1); #endif first = FALSE; } else { DBG_fprintf(stderr, " | subpair %s - %s (%g/%g).\n", ele1->name, ele2->name, visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MIN), visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MAX)); #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 9 gtk_tree_store_insert_with_values (pairsTreeStore, &iter, &iterParent, 0, GTK_PAIRS_COLUMN_POINTER_TO_ELE1, ele1, GTK_PAIRS_COLUMN_POINTER_TO_ELE2, ele2, GTK_PAIRS_COLUMN_DRAWN, drawn, GTK_PAIRS_COLUMN_DISTANCE_FROM, visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MIN), GTK_PAIRS_COLUMN_DISTANCE_TO, visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MAX), GTK_PAIRS_COLUMN_PIXBUF_COLOR, pixColor, GTK_PAIRS_COLUMN_LABEL_USER, label, GTK_PAIRS_COLUMN_PRINT_LENGTH, visu_pair_link_getPrintLength(data), GTK_PAIRS_COLUMN_POINTER_TO_LINK, (gpointer)data, -1); #else gtk_tree_store_append(pairsTreeStore, &iter, &iterParent); gtk_tree_store_set(pairsTreeStore, &iter, GTK_PAIRS_COLUMN_POINTER_TO_ELE1, ele1, GTK_PAIRS_COLUMN_POINTER_TO_ELE2, ele2, GTK_PAIRS_COLUMN_DRAWN, drawn, GTK_PAIRS_COLUMN_DISTANCE_FROM, visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MIN), GTK_PAIRS_COLUMN_DISTANCE_TO, visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MAX), GTK_PAIRS_COLUMN_PIXBUF_COLOR, pixColor, GTK_PAIRS_COLUMN_LABEL_USER, label, GTK_PAIRS_COLUMN_PRINT_LENGTH, visu_pair_link_getPrintLength(data), GTK_PAIRS_COLUMN_POINTER_TO_LINK, (gpointer)data, -1); #endif } if (label) g_free(label); } DBG_fprintf(stderr, " | pair done.\n"); } static void selectByPairMethod(GtkComboBox *combo, VisuPairExtension *meth) { GtkTreeModel *model; GtkTreeIter iter; gboolean valid; VisuPairExtension *meth_; model = gtk_combo_box_get_model(combo); valid = gtk_tree_model_get_iter_first(model, &iter); while (valid) { gtk_tree_model_get(model, &iter, GTK_PAIRS_COLUMN_PAIRS_POINTER, &meth_, -1); if (meth_ == meth) { gtk_combo_box_set_active_iter(combo, &iter); valid = FALSE; } else valid = gtk_tree_model_iter_next(model, &iter); } } static gint sortPairs(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer data) { VisuElement *a_ele1, *a_ele2; VisuElement *b_ele1, *b_ele2; int cmp1, cmp2; gint id, diff; float a_from, a_to, b_from, b_to; GtkSortType sortDir; id = 0; sortDir = GTK_SORT_ASCENDING; gtk_tree_sortable_get_sort_column_id(GTK_TREE_SORTABLE(data), &id, &sortDir); gtk_tree_model_get(model, a, GTK_PAIRS_COLUMN_POINTER_TO_ELE1, &a_ele1, GTK_PAIRS_COLUMN_POINTER_TO_ELE2, &a_ele2, GTK_PAIRS_COLUMN_DISTANCE_FROM, &a_from, GTK_PAIRS_COLUMN_DISTANCE_TO, &a_to, -1); gtk_tree_model_get(model, b, GTK_PAIRS_COLUMN_POINTER_TO_ELE1, &b_ele1, GTK_PAIRS_COLUMN_POINTER_TO_ELE2, &b_ele2, GTK_PAIRS_COLUMN_DISTANCE_FROM, &b_from, GTK_PAIRS_COLUMN_DISTANCE_TO, &b_to, -1); g_return_val_if_fail(a_ele1 && a_ele2 && b_ele1 && b_ele2, 0); cmp1 = strcmp(a_ele1->name, b_ele1->name); cmp2 = strcmp(a_ele2->name, b_ele2->name); DBG_fprintf(stderr, "Gtk Pairs: comparing %d - %d.\n", cmp1, cmp2); if (sortDir == GTK_SORT_ASCENDING) diff = (cmp1 == 0)?cmp2:cmp1; else diff = (cmp2 == 0)?cmp1:cmp2; if (diff == 0) { DBG_fprintf(stderr, "Gtk Pairs: compare distances %g / %g.\n", (a_to + a_from), (b_to + b_from)); if ((a_to + a_from) == (b_to + b_from)) diff = 0; else diff = ((a_to + a_from) < (b_to + b_from))?-1:+1; } if (sortDir != GTK_SORT_ASCENDING) diff *= -1; DBG_fprintf(stderr, "Gtk Pairs: sort '%s - %s' with '%s - %s' column %d -> %d.\n", a_ele1->name, a_ele2->name, b_ele1->name, b_ele2->name, id, diff); return diff; } void visu_ui_pairs_update(VisuUiMain *main, VisuData *dataObj, gboolean force) { gboolean visible; VisuNodeArrayIter iter1, iter2; /* GtkTreeIter iter; */ /* gboolean validIter; */ DBG_fprintf(stderr, "Gtk Pairs: build the list of pairs.\n"); /* Not show and not force, so we do nothing. */ g_object_get(G_OBJECT(main->pairsDialog), "visible", &visible, NULL); if (!force && (!main->pairsDialog || !visible)) { DBG_fprintf(stderr, "Gtk Pairs: Pairs become out of date.\n"); pairsNeedBuild = TRUE; return; } /* We are visible, or forced but we are up to date, so we return. */ if (!pairsNeedBuild) return; pairsNeedBuild = FALSE; DBG_fprintf(stderr, "Gtk Pairs: Reset all lists.\n"); /* We free the list of pairs. */ gtk_tree_store_clear(pairsTreeStore); DBG_fprintf(stderr, " | OK.\n"); /* If there is no data, we return. */ if (!dataObj) return; visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter1); visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter2); for(visu_node_array_iterStart(VISU_NODE_ARRAY(dataObj), &iter1); iter1.element; visu_node_array_iterNextElement(VISU_NODE_ARRAY(dataObj), &iter1)) for(visu_node_array_iterStart(VISU_NODE_ARRAY(dataObj), &iter2); iter2.element && iter2.iElement <= iter1.iElement ; visu_node_array_iterNextElement(VISU_NODE_ARRAY(dataObj), &iter2)) addPairAllData(iter1.element, iter2.element); DBG_fprintf(stderr, "Gtk Pairs: Pairs tree rebuilt, expanding.\n"); gtk_tree_view_expand_all(GTK_TREE_VIEW(gtkPairs_treeView)); /* If we have only one element, we make the filter insensitive. */ gtk_widget_set_sensitive(comboFilter, (iter1.nElements > 1)); /* We select the first link, if any. */ /* validIter = gtk_tree_model_get_iter_first(pairsSortable, &iter); */ /* if (validIter) */ /* gtk_tree_selection_select_iter(pairsSelection, &iter); */ DBG_fprintf(stderr, "Gtk Pairs: Pairs are rebuilt.\n"); } static void rebuildPairsOnResources(GObject *obj _U_, VisuData *dataObj, gpointer data) { DBG_fprintf(stderr, "Gtk Pairs: caught the 'resourcesLoaded' signal.\n"); pairsNeedBuild = TRUE; /* Update the viewport with the first list element only. */ if (dataObj) visu_ui_pairs_update(VISU_UI_MAIN(data), dataObj, FALSE); /* TODO: Update the pair specific area. */ g_message("TODO: update the specific area on resources.\n"); } static void onDataReady(GObject *obj _U_, VisuData *dataObj, VisuGlView *view _U_, gpointer data) { gboolean visible; DBG_fprintf(stderr, "Gtk Pairs: caught the 'dataRendered' signal.\n"); pairsNeedBuild = TRUE; visu_ui_pairs_update(VISU_UI_MAIN(data), dataObj, FALSE); /* Unset previous g(r). */ #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 17 visible = gtk_widget_get_visible(VISU_UI_MAIN(data)->pairsDialog); #else visible = GTK_WIDGET_VISIBLE(VISU_UI_MAIN(data)->pairsDialog); #endif DBG_fprintf(stderr, "Gtk Pairs: curve is visible (%d), replot.\n", visible); if (visible) g_idle_add(curveReplot, (gpointer)dataObj); else visu_ui_curve_frame_setData(VISU_UI_CURVE_FRAME(curve), 0.f, 0., 10.); if (dataObj) unit_signal = g_signal_connect(G_OBJECT(visu_boxed_getBox(VISU_BOXED(dataObj))), "UnitChanged", G_CALLBACK(onUnitChanged), (gpointer)0); } static void onDataNotReady(GObject *obj _U_, VisuData *dataObj, VisuGlView *view _U_, gpointer data _U_) { g_signal_handler_disconnect(G_OBJECT(visu_boxed_getBox(VISU_BOXED(dataObj))), unit_signal); } gchar* createDistanceLabel(VisuPairLink *data) { GString *label; g_return_val_if_fail(data, (gchar*)0); label = g_string_new(""); g_string_printf(label, _("from %7.3f to %7.3f"), visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MIN), visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MAX)); return g_string_free(label, FALSE); } static struct specBuildFunc_struct* getSpecBuildFuncs(VisuPairLink *data) { gboolean valid; GtkTreeIter iter; GtkTreeModel *model; VisuPairExtension *meth; gpointer meth_; struct specBuildFunc_struct *spec; meth = visu_gl_ext_pairs_getDrawMethod(visu_gl_ext_pairs_getDefault(), data); model = GTK_TREE_MODEL(gtkPairs_comboModel); for (valid = gtk_tree_model_get_iter_first(model, &iter); valid; valid = gtk_tree_model_iter_next(model, &iter)) { gtk_tree_model_get(model, &iter, GTK_PAIRS_COLUMN_PAIRS_POINTER, &meth_, GTK_PAIRS_COLUMN_PAIRS_SPEC_BUILD, &spec, -1); if ((VisuPairExtension*)meth_ == meth) break; } if (valid) return spec; else return (struct specBuildFunc_struct*)0; } static void hideSpecAreas() { gboolean valid; GtkTreeIter iter; GtkTreeModel *model; struct specBuildFunc_struct *spec; model = GTK_TREE_MODEL(gtkPairs_comboModel); for (valid = gtk_tree_model_get_iter_first(model, &iter); valid; valid = gtk_tree_model_iter_next(model, &iter)) { gtk_tree_model_get(model, &iter, GTK_PAIRS_COLUMN_PAIRS_SPEC_BUILD, &spec, -1); if (spec->wd) gtk_widget_hide(spec->wd); } } static void showSpecArea(struct specBuildFunc_struct *spec) { if (!spec->wd && spec->area) { DBG_fprintf(stderr, "Gtk Pairs: create a new widget for this method.\n"); spec->wd = spec->area(); gtk_widget_show_all(spec->wd); gtk_box_pack_end(GTK_BOX(parameterWidget), spec->wd, FALSE, FALSE, 0); } hideSpecAreas(); gtk_widget_show(spec->wd); } /** * visu_ui_pairs_newIter: * @iter: (out caller-allocates): an iterator. * * This method is used by bindings to initialise a new * #VisuUiPairsIter object. * * Since: 3.7 */ void visu_ui_pairs_newIter(VisuUiPairsIter *iter) { visu_ui_pairs_iter_startSelected(iter); } /** * visu_ui_pairs_iter_empty: * @iter: an iterator. * * Free internals of the iterator. This routine is automatically * called by visu_ui_pairs_iter_nextSelected() when arriving at the * end of selection. * * Since: 3.7 */ void visu_ui_pairs_iter_empty(VisuUiPairsIter *iter) { g_list_free_full(iter->selected, (GDestroyNotify) gtk_tree_path_free); } /** * visu_ui_pairs_iter_startSelected: * @iter: (out caller-allocates): an iterator. * * Initialise the given iterator @iter on the first selected pair or * set iter->data to NULL if none. If @iter->data is not NULL, * visu_ui_pairs_iter_nextSelected() must be called until @iter->data is * NULL to be sure that @iter->selected list is freed. */ void visu_ui_pairs_iter_startSelected(VisuUiPairsIter *iter) { g_return_if_fail(iter); iter->data = (VisuPairLink*)0; iter->current = (GList*)0; if (!pairsSelection) return; iter->selected = gtk_tree_selection_get_selected_rows(pairsSelection, NULL); if (!iter->selected) return; iter->current = iter->selected; visu_ui_pairs_iter_nextSelected(iter); } /** * visu_ui_pairs_iter_nextSelected: * @iter: an iterator. * * Go to the next selected pair or set iter->data to NULL if none. */ void visu_ui_pairs_iter_nextSelected(VisuUiPairsIter *iter) { gboolean validIter; GtkTreeIter iterFilter, iterSort; g_return_if_fail(iter && iter->selected); iter->data = (VisuPairLink*)0; if (!iter->current) { visu_ui_pairs_iter_empty(iter); return; } validIter = gtk_tree_model_get_iter(GTK_TREE_MODEL(pairsSortable), &iterSort, (GtkTreePath*)iter->current->data); if (!validIter) { g_warning("Wrong 'path' variable in 'visu_ui_pairs_iter_startSelected' method.\n"); return; } gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT(pairsSortable), &iterFilter, &iterSort); gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER(pairsFilter), &(iter->iter), &iterFilter); gtk_tree_model_get(GTK_TREE_MODEL(pairsTreeStore), &(iter->iter), GTK_PAIRS_COLUMN_POINTER_TO_LINK, &(iter->data), -1); iter->current = g_list_next(iter->current); } void visu_ui_pairs_setSpecificLabels(GtkTreeIter *iter, const gchar *label) { gtk_tree_store_set(pairsTreeStore, iter, GTK_PAIRS_COLUMN_LABEL_USER, label, -1); } /** * visu_ui_pairs_select: * @data: a #VisuPairLink object. * * Select in the UI the given @data. * * Since: 3.7 * * Returns: TRUE if the @data pair is indeed selected. **/ gboolean visu_ui_pairs_select(const VisuPairLink *data) { GtkTreeIter iter, iterPair; gboolean valid, validPair; VisuPairLink *data_; DBG_fprintf(stderr, "Gtk Pairs: select a pair (%d).\n", gtk_tree_model_iter_n_children(GTK_TREE_MODEL(pairsSortable), NULL)); for (valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(pairsSortable), &iter); valid; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(pairsSortable), &iter)) { for (validPair = gtk_tree_model_iter_children(GTK_TREE_MODEL(pairsSortable), &iterPair, &iter); validPair; validPair = gtk_tree_model_iter_next(GTK_TREE_MODEL(pairsSortable), &iterPair)) { gtk_tree_model_get(GTK_TREE_MODEL(pairsSortable), &iterPair, GTK_PAIRS_COLUMN_POINTER_TO_LINK, &data_, -1); DBG_fprintf(stderr, " | %p %p.\n", (gpointer)data, (gpointer)data_); if (data_ == data) { gtk_tree_selection_select_iter(pairsSelection, &iterPair); return TRUE; } } } return FALSE; } /*************/ /* Callbacks */ /*************/ static void colorChanged(VisuUiColorCombobox *colorWd, ToolColor *color, gpointer userData _U_) { int res; VisuUiPairsIter iter; GdkPixbuf *pixColor; pixColor = visu_ui_color_combobox_getPixbufFromColor(colorWd, color); res = 0; for (visu_ui_pairs_iter_startSelected(&iter); iter.data; visu_ui_pairs_iter_nextSelected(&iter)) { res = visu_pair_link_setColor(iter.data, color) || res; gtk_tree_store_set(pairsTreeStore, &(iter.iter), GTK_PAIRS_COLUMN_PIXBUF_COLOR, pixColor, -1); } if (res) { visu_gl_ext_pairs_draw(visu_gl_ext_pairs_getDefault()); VISU_REDRAW_ADD; } } static void minChanged(GtkSpinButton *spin, gpointer userData) { minMaxChanged(spin, GTK_TREE_SELECTION(userData), VISU_PAIR_DISTANCE_MIN); } static void maxChanged(GtkSpinButton *spin, gpointer userData) { minMaxChanged(spin, GTK_TREE_SELECTION(userData), VISU_PAIR_DISTANCE_MAX); } static void filterChanged(VisuUiElementCombobox *combobox, GList *elements, gpointer userData) { #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 6 GtkTreeIter iter; #endif gchar *label; gboolean redraw; DBG_fprintf(stderr, "Gtk Pairs: change the filter to '%d'.\n", gtk_combo_box_get_active(GTK_COMBO_BOX(combobox))); gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(userData)); if (elements) { label = ((VisuElement*)elements->data)->name; redraw = visu_ui_curve_frame_setFilter(VISU_UI_CURVE_FRAME(curve), label); } else redraw = visu_ui_curve_frame_setFilter(VISU_UI_CURVE_FRAME(curve), (const gchar*)0); if (redraw) { setHlRange(TRUE); visu_ui_curve_frame_draw(VISU_UI_CURVE_FRAME(curve)); } gtk_tree_view_expand_all(GTK_TREE_VIEW(gtkPairs_treeView)); } static gboolean pairsRowIsVisible(GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { VisuElement *ele1, *ele2; gchar *label; gboolean visible; float start, stop; GList *elements; gtk_tree_model_get(model, iter, GTK_PAIRS_COLUMN_POINTER_TO_ELE1, &ele1, GTK_PAIRS_COLUMN_POINTER_TO_ELE2, &ele2, GTK_PAIRS_COLUMN_DISTANCE_FROM, &start, GTK_PAIRS_COLUMN_DISTANCE_TO, &stop, -1); if (!ele1 || !ele2) return FALSE; elements = visu_ui_element_combobox_getSelection(VISU_UI_ELEMENT_COMBOBOX(data)); if (elements) { label = ((VisuElement*)elements->data)->name; visible = !strcmp(label, ele1->name) || !strcmp(label, ele2->name); g_list_free(elements); } else visible = TRUE; /* Add the visibility tag due to the hide button. */ visible = visible && (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(btHide)) || (stop > start)); DBG_fprintf(stderr, "Gtk Pairs: set visibility for '%s %s': %d\n", ele1->name, ele2->name, visible); return visible; } static void pairsMethodChanged(GtkComboBox *combobox, gpointer userData _U_) { gchar *label; struct specBuildFunc_struct *specBuild; GtkTreeIter it; VisuUiPairsIter iter; gboolean validIter, res; VisuPairExtension *pairsMethod; validIter = gtk_combo_box_get_active_iter(combobox, &it); g_return_if_fail(validIter); specBuild = (struct specBuildFunc_struct*)0; gtk_tree_model_get(GTK_TREE_MODEL(gtkPairs_comboModel), &it, GTK_PAIRS_COLUMN_PAIRS_POINTER, &pairsMethod, GTK_PAIRS_COLUMN_PAIRS_SPEC_BUILD, &specBuild, -1); DBG_fprintf(stderr, "Gtk Pairs: set combobox to '%s'.\n", visu_pair_extension_getName(pairsMethod, FALSE)); /* change the specific area. */ showSpecArea(specBuild); /* change the label area and the method per pair. */ DBG_fprintf(stderr, "Gtk Pairs: changing specific labels.\n"); res = FALSE; for (visu_ui_pairs_iter_startSelected(&iter); iter.data; visu_ui_pairs_iter_nextSelected(&iter)) { DBG_fprintf(stderr, " | pair %p\n", (gpointer)iter.data); if (specBuild && specBuild->label) { label = specBuild->label(iter.data); visu_ui_pairs_setSpecificLabels(&(iter.iter), label); g_free(label); } res = visu_gl_ext_pairs_setDrawMethod(visu_gl_ext_pairs_getDefault(), iter.data, pairsMethod) || res; } if (res) { visu_gl_ext_pairs_draw(visu_gl_ext_pairs_getDefault()); VISU_REDRAW_ADD; } } static void onGtkPairsDrawnToggled(GtkCellRendererToggle *cell_renderer _U_, gchar *path, gpointer user_data _U_) { gboolean valid, drawn; GtkTreeIter iter, iterFilter, iterSort; gboolean res; VisuPairLink *pdata; valid = gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(pairsSortable), &iterSort, path); g_return_if_fail(valid); gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT(pairsSortable), &iterFilter, &iterSort); gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER(pairsFilter), &iter, &iterFilter); gtk_tree_model_get(GTK_TREE_MODEL(pairsTreeStore), &iter, GTK_PAIRS_COLUMN_DRAWN, &drawn, GTK_PAIRS_COLUMN_POINTER_TO_LINK, &pdata, -1); gtk_tree_store_set(pairsTreeStore, &iter, GTK_PAIRS_COLUMN_DRAWN, !drawn, -1); res = visu_pair_link_setDrawn(pdata, !drawn); if (res) { visu_gl_ext_pairs_draw(visu_gl_ext_pairs_getDefault()); VISU_REDRAW_ADD; } } static void onGtkPairsLengthToggled(GtkCellRendererToggle *cell_renderer _U_, gchar *path, gpointer user_data _U_) { gboolean valid, length; GtkTreeIter iter, iterFilter, iterSort; gboolean res; VisuPairLink *pdata; valid = gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(pairsSortable), &iterSort, path); g_return_if_fail(valid); gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT(pairsSortable), &iterFilter, &iterSort); gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER(pairsFilter), &iter, &iterFilter); gtk_tree_model_get(GTK_TREE_MODEL(pairsTreeStore), &iter, GTK_PAIRS_COLUMN_PRINT_LENGTH, &length, GTK_PAIRS_COLUMN_POINTER_TO_LINK, &pdata, -1); gtk_tree_store_set(pairsTreeStore, &iter, GTK_PAIRS_COLUMN_PRINT_LENGTH, !length, -1); res = visu_pair_link_setPrintLength(pdata, !length); if (res) { visu_gl_ext_pairs_draw(visu_gl_ext_pairs_getDefault()); VISU_REDRAW_ADD; } } static void onDistanceValueEdited(GtkCellRendererText *cellrenderertext _U_, gchar *path, gchar *text, gpointer user_data) { gboolean valid; GtkTreeIter iter, iterFilter, iterSort; float value; char *error; VisuPairLink *pdata; int res, id; DBG_fprintf(stderr, "Gtk Pairs: distance (%d) edited '%s'.\n", GPOINTER_TO_INT(user_data), text); g_return_if_fail(GPOINTER_TO_INT(user_data) == GTK_PAIRS_COLUMN_DISTANCE_FROM || GPOINTER_TO_INT(user_data) == GTK_PAIRS_COLUMN_DISTANCE_TO); value = (float)strtod(text, &error); g_return_if_fail(!(value == 0. && error == text)); valid = gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(pairsSortable), &iterSort, path); g_return_if_fail(valid); gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT(pairsSortable), &iterFilter, &iterSort); gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER(pairsFilter), &iter, &iterFilter); gtk_tree_store_set(pairsTreeStore, &iter, GPOINTER_TO_INT(user_data), value, -1); gtk_tree_model_get(GTK_TREE_MODEL(pairsTreeStore), &iter, GTK_PAIRS_COLUMN_POINTER_TO_LINK, &pdata, -1); id = (GPOINTER_TO_INT(user_data) == GTK_PAIRS_COLUMN_DISTANCE_TO)? VISU_PAIR_DISTANCE_MAX:VISU_PAIR_DISTANCE_MIN; res = visu_pair_link_setDistance(pdata, value, id); if (GPOINTER_TO_INT(user_data) == GTK_PAIRS_COLUMN_DISTANCE_FROM) gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtkPairs_spinMin), value); else gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtkPairs_spinMax), value); if (res) { visu_gl_ext_pairs_draw(visu_gl_ext_pairs_getDefault()); VISU_REDRAW_ADD; } } static void minMaxChanged(GtkSpinButton *spin, GtkTreeSelection *tree _U_, int minMax) { int res, id; float value; VisuUiPairsIter iter; value = (float)gtk_spin_button_get_value(spin); res = 0; for (visu_ui_pairs_iter_startSelected(&iter); iter.data; visu_ui_pairs_iter_nextSelected(&iter)) { res = visu_pair_link_setDistance(iter.data, value, minMax) || res; id = (minMax == VISU_PAIR_DISTANCE_MIN)?GTK_PAIRS_COLUMN_DISTANCE_FROM: GTK_PAIRS_COLUMN_DISTANCE_TO; gtk_tree_store_set(pairsTreeStore, &(iter.iter), id, value, -1); } if (res) { visu_gl_ext_pairs_draw(visu_gl_ext_pairs_getDefault()); VISU_REDRAW_ADD; } } static void selectionChanged(GtkTreeSelection *tree _U_, gpointer data) { gboolean select, isChild, hasChild; VisuUiPairsIter iter; GtkTreeIter iterParent; struct specBuildFunc_struct *spec; DBG_fprintf(stderr, "Gtk Pairs: selection changed.\n"); select = FALSE; isChild = FALSE; hasChild = FALSE; for (visu_ui_pairs_iter_startSelected(&iter); iter.data; visu_ui_pairs_iter_nextSelected(&iter)) { select = TRUE; /* Modify the values with the last selected iter. */ if (!iter.current) { /* Set the min/max values */ g_signal_handler_block(G_OBJECT(gtkPairs_spinMin), gtkPairs_spinMinSignalId); g_signal_handler_block(G_OBJECT(gtkPairs_spinMax), gtkPairs_spinMaxSignalId); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtkPairs_spinMin), visu_pair_link_getDistance(iter.data, VISU_PAIR_DISTANCE_MIN)); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtkPairs_spinMax), visu_pair_link_getDistance(iter.data, VISU_PAIR_DISTANCE_MAX)); g_signal_handler_unblock(G_OBJECT(gtkPairs_spinMax), gtkPairs_spinMaxSignalId); g_signal_handler_unblock(G_OBJECT(gtkPairs_spinMin), gtkPairs_spinMinSignalId); /* Set the color */ g_signal_handler_block(G_OBJECT(widgetColor), widgetColorSignalId); visu_ui_color_combobox_setSelection(VISU_UI_COLOR_COMBOBOX(widgetColor), visu_pair_link_getColor(iter.data)); g_signal_handler_unblock(G_OBJECT(widgetColor), widgetColorSignalId); /* Show and set the method parameters */ spec = getSpecBuildFuncs(iter.data); if (spec) { showSpecArea(spec); if (spec->selected) spec->selected(iter.data); g_signal_handler_block(G_OBJECT(data), methodSignalId); selectByPairMethod(GTK_COMBO_BOX(data), visu_gl_ext_pairs_getDrawMethod(visu_gl_ext_pairs_getDefault(), iter.data)); g_signal_handler_unblock(G_OBJECT(data), methodSignalId); } isChild = gtk_tree_model_iter_parent(GTK_TREE_MODEL(pairsTreeStore), &iterParent, &(iter.iter)); hasChild = gtk_tree_model_iter_has_child(GTK_TREE_MODEL(pairsTreeStore), &(iter.iter)); } } /* Set sensitive or not the modifing widgets. */ gtk_widget_set_sensitive(alignWidget, select); gtk_widget_set_sensitive(btAdd, select); gtk_widget_set_sensitive(btRemove, select && (isChild || hasChild)); } static void onDistanceAutoSet(GtkButton *button _U_, gpointer data _U_) { VisuUiPairsIter iter; VisuPair *pair; VisuElement *ele1, *ele2; VisuPairDistribution *dd; VisuData *dataObj; float start, stop; guint sum, startStopId[2]; gboolean rebuild; rebuild = FALSE; g_signal_handler_block(G_OBJECT(gtkPairs_spinMin), gtkPairs_spinMinSignalId); g_signal_handler_block(G_OBJECT(gtkPairs_spinMax), gtkPairs_spinMaxSignalId); start = -1.f; stop = -1.f; for (visu_ui_pairs_iter_startSelected(&iter); iter.data; visu_ui_pairs_iter_nextSelected(&iter)) { /* Get the two elements and the corresponding pair. */ gtk_tree_model_get(GTK_TREE_MODEL(pairsTreeStore), &(iter.iter), GTK_PAIRS_COLUMN_POINTER_TO_ELE1, &ele1, GTK_PAIRS_COLUMN_POINTER_TO_ELE2, &ele2, -1); pair = visu_pair_getPair(ele1, ele2); dataObj = visu_ui_rendering_window_getData(visu_ui_main_class_getDefaultRendering()); dd = visu_pair_getDistanceDistribution(pair, dataObj, -1.f, -1.f, -1.f); g_return_if_fail(dd); startStopId[0] = 0; startStopId[1] = dd->nValues - 1; if (visu_pair_distribution_getNextPick(dd, startStopId, &sum, (guint*)0, (guint*)0)) { start = dd->initValue + startStopId[0] * dd->stepValue; stop = dd->initValue + startStopId[1] * dd->stepValue; gtk_tree_store_set(pairsTreeStore, &(iter.iter), GTK_PAIRS_COLUMN_DISTANCE_FROM, start, GTK_PAIRS_COLUMN_DISTANCE_TO, stop, -1); rebuild = visu_pair_link_setDistance(iter.data, start, VISU_PAIR_DISTANCE_MIN) | rebuild; rebuild = visu_pair_link_setDistance(iter.data, stop, VISU_PAIR_DISTANCE_MAX) | rebuild; } } if (start > 0.f) gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtkPairs_spinMin), start); if (stop > 0.f) gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtkPairs_spinMax), stop); g_signal_handler_unblock(G_OBJECT(gtkPairs_spinMin), gtkPairs_spinMinSignalId); g_signal_handler_unblock(G_OBJECT(gtkPairs_spinMax), gtkPairs_spinMaxSignalId); if (rebuild) { visu_gl_ext_pairs_draw(visu_gl_ext_pairs_getDefault()); VISU_REDRAW_ADD; } } static void onBtAdd(GtkButton *button _U_, gpointer user_data _U_) { VisuUiPairsIter iter; GtkTreeIter iterParent, iterChild; VisuElement *ele1, *ele2; VisuPairLink *data, *dataRef; float minMax[2] = {0.f, 0.f}; gboolean valid; struct specBuildFunc_struct *specBuild; gboolean drawn; ToolColor *color; GdkPixbuf *pixColor; gchar *label; /* Go to last selected iter. */ for (visu_ui_pairs_iter_startSelected(&iter); iter.current; visu_ui_pairs_iter_nextSelected(&iter)); g_return_if_fail(iter.data); /* Get the ancestor of this iter. */ if (!gtk_tree_model_iter_parent(GTK_TREE_MODEL(pairsTreeStore), &iterParent, &(iter.iter))) iterParent = iter.iter; /* Get the two elements. */ gtk_tree_model_get(GTK_TREE_MODEL(pairsTreeStore), &iterParent, GTK_PAIRS_COLUMN_POINTER_TO_ELE1, &ele1, GTK_PAIRS_COLUMN_POINTER_TO_ELE2, &ele2, GTK_PAIRS_COLUMN_POINTER_TO_LINK, &dataRef, -1); /* Get a new data. */ data = visu_pair_link_new(ele1, ele2, minMax); /* Check that this data is not already in the tree. */ if (data == dataRef) return; valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(pairsTreeStore), &iterChild, &iterParent); while (valid) { gtk_tree_model_get(GTK_TREE_MODEL(pairsTreeStore), &iterChild, GTK_PAIRS_COLUMN_POINTER_TO_LINK, &dataRef, -1); if (data == dataRef) return; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(pairsTreeStore), &iterChild); } DBG_fprintf(stderr, "Gtk Pairs: ready to add a new pair definition.\n"); /* Ok, add this new data to the tree. */ specBuild = getSpecBuildFuncs(data); if (specBuild && specBuild->label) label = specBuild->label(data); else label = (gchar*)0; drawn = visu_pair_link_getDrawn(data); color = visu_pair_link_getColor(data); pixColor = visu_ui_color_combobox_getPixbufFromColor(VISU_UI_COLOR_COMBOBOX(widgetColor), color); DBG_fprintf(stderr, "Gtk Pairs: add a new pair definition.\n"); /* Add the VisuPairLink to the liststore. */ #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 9 gtk_tree_store_insert_with_values (pairsTreeStore, &iterChild, &iterParent, -1, GTK_PAIRS_COLUMN_POINTER_TO_ELE1, (gpointer)ele1, GTK_PAIRS_COLUMN_POINTER_TO_ELE2, (gpointer)ele2, GTK_PAIRS_COLUMN_DRAWN, drawn, GTK_PAIRS_COLUMN_DISTANCE_FROM, visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MIN), GTK_PAIRS_COLUMN_DISTANCE_TO, visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MAX), GTK_PAIRS_COLUMN_PIXBUF_COLOR, pixColor, GTK_PAIRS_COLUMN_LABEL_USER, label, GTK_PAIRS_COLUMN_PRINT_LENGTH, visu_pair_link_getPrintLength(data), GTK_PAIRS_COLUMN_POINTER_TO_LINK, (gpointer)data, -1); #else gtk_tree_store_append(pairsTreeStore, &iterChild, &iterParent); gtk_tree_store_set(pairsTreeStore, &iterChild, GTK_PAIRS_COLUMN_POINTER_TO_ELE1, (gpointer)ele1, GTK_PAIRS_COLUMN_POINTER_TO_ELE2, (gpointer)ele2, GTK_PAIRS_COLUMN_DRAWN, drawn, GTK_PAIRS_COLUMN_DISTANCE_FROM, visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MIN), GTK_PAIRS_COLUMN_DISTANCE_TO, visu_pair_link_getDistance(data, VISU_PAIR_DISTANCE_MAX), GTK_PAIRS_COLUMN_PIXBUF_COLOR, pixColor, GTK_PAIRS_COLUMN_LABEL_USER, label, GTK_PAIRS_COLUMN_PRINT_LENGTH, visu_pair_link_getPrintLength(data), GTK_PAIRS_COLUMN_POINTER_TO_LINK, (gpointer)data, -1); gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(pairsFilter)); #endif DBG_fprintf(stderr, " | OK (%s)\n", label); if (label) g_free(label); gtk_tree_view_expand_all(GTK_TREE_VIEW(gtkPairs_treeView)); VISU_REDRAW_ADD; } static void onBtRemove(GtkButton *button _U_, gpointer user_data _U_) { VisuUiPairsIter iter; GtkTreeIter iterParent; VisuPairLink *data; VisuElement *ele1, *ele2; gboolean rebuild; /* Go to last iter. */ for (visu_ui_pairs_iter_startSelected(&iter); iter.current; visu_ui_pairs_iter_nextSelected(&iter)); g_return_if_fail(iter.data); /* Get the ancestor of this iter. */ rebuild = (!gtk_tree_model_iter_parent(GTK_TREE_MODEL(pairsTreeStore), &iterParent, &(iter.iter))); /* Get the two elements. */ gtk_tree_model_get(GTK_TREE_MODEL(pairsTreeStore), &(iter.iter), GTK_PAIRS_COLUMN_POINTER_TO_ELE1, &ele1, GTK_PAIRS_COLUMN_POINTER_TO_ELE2, &ele2, GTK_PAIRS_COLUMN_POINTER_TO_LINK, &data, -1); /* Remove the data. */ visu_pair_removePairLink(ele1, ele2, data); gtk_tree_store_remove(pairsTreeStore, &(iter.iter)); /* Recreate the entry if parent was removed. */ if (rebuild) addPairAllData(ele1, ele2); gtk_tree_view_expand_all(GTK_TREE_VIEW(gtkPairs_treeView)); visu_gl_ext_pairs_draw(visu_gl_ext_pairs_getDefault()); VISU_REDRAW_ADD; } static void onBtHide(GtkToggleButton *button _U_, gpointer user_data) { gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(user_data)); } static gboolean curveReplot(gpointer data) { curveSetData(VISU_DATA(data)); setHlRange(TRUE); visu_ui_curve_frame_draw(VISU_UI_CURVE_FRAME(curve)); return FALSE; } static void curveSetData(VisuData *dataObj) { float span[2], zoom, step; VisuPair *pair; VisuPairDistribution *dd; VisuNodeArrayIter iter1, iter2; span[0] = (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinDMin)); span[1] = (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinDMax)); if (!dataObj) { visu_ui_curve_frame_setData(VISU_UI_CURVE_FRAME(curve), 0.f, span[0], span[1]); return; } zoom = (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinDZoom)) * 50.f; step = (span[1] - span[0]) / zoom; visu_ui_curve_frame_setData(VISU_UI_CURVE_FRAME(curve), step, span[0], span[1]); visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter1); visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter2); for (visu_node_array_iterStart(VISU_NODE_ARRAY(dataObj), &iter1); iter1.element; visu_node_array_iterNextElement(VISU_NODE_ARRAY(dataObj), &iter1)) for(visu_node_array_iterStart(VISU_NODE_ARRAY(dataObj), &iter2); iter2.element && iter2.iElement <= iter1.iElement ; visu_node_array_iterNextElement(VISU_NODE_ARRAY(dataObj), &iter2)) { DBG_fprintf(stderr, "Gtk Pairs: compute distribution for pair '%s' '%s'.\n", iter1.element->name, iter2.element->name); pair = visu_pair_getPair(iter1.element, iter2.element); dd = visu_pair_getDistanceDistribution(pair, dataObj, step, span[0], span[1]); visu_ui_curve_frame_addData(VISU_UI_CURVE_FRAME(curve), dd->ele1->name, dd->ele2->name, dd->histo, dd->nValues, dd->initValue, dd->stepValue); if (iter1.element == iter2.element) visu_ui_curve_frame_setNNodes(VISU_UI_CURVE_FRAME(curve), dd->ele1->name, dd->nNodesEle1); } } static gboolean setHlRange(gboolean set) { float range[2]; gboolean redraw; float val; gchar *label, *buf; if (set) { range[0] = (float)gtk_range_get_value(GTK_RANGE(rangeHlStart)); range[1] = (float)gtk_range_get_value(GTK_RANGE(rangeHlEnd)); } else range[0] = -1.f; redraw = visu_ui_curve_frame_setHighlightRange(VISU_UI_CURVE_FRAME(curve), range); val = visu_ui_curve_frame_getIntegralInRange(VISU_UI_CURVE_FRAME(curve), &label); if (val > 0.f) { buf = g_strdup_printf(DIST_INTEGRAL, val * 2.f, label); gtk_label_set_markup(GTK_LABEL(labelIntegralDistance), buf); g_free(buf); } else gtk_label_set_markup(GTK_LABEL(labelIntegralDistance), NO_DIST_INTEGRAL); val = visu_ui_curve_frame_getMeanInRange(VISU_UI_CURVE_FRAME(curve), (gchar**)0); if (val > 0.f) { buf = g_strdup_printf(DIST_MEAN, val); gtk_label_set_markup(GTK_LABEL(labelMeanDistance), buf); g_free(buf); } else gtk_label_set_markup(GTK_LABEL(labelMeanDistance), NO_DIST_MEAN); return redraw; } static void onHlRangeToggled(GtkToggleButton *button, gpointer data) { float range[2]; GList *lst; gboolean redraw; gfloat d2, xyz1[3], xyz2[3]; VisuElement *ele; VisuData *dataObj; VisuNodeArrayIter iter1, iter2; VisuGlExtMarks *marks; VisuUiRenderingWindow *window; if (!visu_ui_curve_frame_getHighlightRange(VISU_UI_CURVE_FRAME(data), range)) return; range[0] *= range[0]; range[1] *= range[1]; ele = (VisuElement*)0; lst = visu_ui_element_combobox_getSelection(VISU_UI_ELEMENT_COMBOBOX(comboFilter)); if (lst) { g_return_if_fail(g_list_length(lst) == 1); ele = VISU_ELEMENT(lst->data); g_list_free(lst); } redraw = FALSE; window = visu_ui_main_class_getDefaultRendering(); marks = visu_ui_rendering_window_getMarks(window); lst = g_object_get_data(G_OBJECT(button), "HighlightRangeIds"); if (lst) { DBG_fprintf(stderr, "Gtk Pairs: remove %d highlights.\n", g_list_length(lst)); redraw = visu_gl_ext_marks_setHighlightedList(marks, lst, MARKS_STATUS_UNSET); g_list_free(lst); g_object_set_data(G_OBJECT(button), "HighlightRangeIds", (gpointer)0); } if (gtk_toggle_button_get_active(button)) { lst = (GList*)0; dataObj = visu_ui_rendering_window_getData(window); visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter1); visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter2); for(visu_node_array_iterStart(VISU_NODE_ARRAY(dataObj), &iter1), visu_node_array_iterStart(VISU_NODE_ARRAY(dataObj), &iter2); iter1.node && iter2.node; visu_node_array_iter_next2(&iter1, &iter2)) if (visu_element_getRendered(iter1.element) && visu_element_getRendered(iter2.element) && iter1.node->rendered && iter2.node->rendered && (!ele || (ele && (iter1.element == ele || iter2.element == ele)))) { visu_data_getNodePosition(dataObj, iter1.node, xyz1); visu_data_getNodePosition(dataObj, iter2.node, xyz2); d2 = (xyz1[0] - xyz2[0]) * (xyz1[0] - xyz2[0]) + (xyz1[1] - xyz2[1]) * (xyz1[1] - xyz2[1]) + (xyz1[2] - xyz2[2]) * (xyz1[2] - xyz2[2]); if (d2 >= range[0] && d2 < range[1]) { lst = g_list_prepend(lst, GINT_TO_POINTER(iter1.node->number)); lst = g_list_prepend(lst, GINT_TO_POINTER(iter2.node->number)); /* DBG_fprintf(stderr, "Test pair %d-%d %f\n", */ /* iter1.node->number, iter2.node->number, d2); */ visu_node_array_iterNext(VISU_NODE_ARRAY(dataObj), &iter1); visu_node_array_iterStart(VISU_NODE_ARRAY(dataObj), &iter2); } } g_object_set_data(G_OBJECT(button), "HighlightRangeIds", lst); DBG_fprintf(stderr, "Gtk Pairs: add %d highlights.\n", g_list_length(lst)); redraw = visu_gl_ext_marks_setHighlightedList(marks, lst, MARKS_STATUS_SET) || redraw; } if (redraw) { visu_gl_ext_pairs_draw(visu_gl_ext_pairs_getDefault()); VISU_REDRAW_ADD; } } static void onRangeChanged(GtkRange *rg, gpointer data) { float val; val = (float)gtk_range_get_value(rg); #if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 11 if (GTK_WIDGET(rg) == rangeHlStart && val > gtk_range_get_value(GTK_RANGE(data))) gtk_range_set_value(rg, gtk_range_get_value(GTK_RANGE(data))); #endif if (GTK_WIDGET(rg) == rangeHlEnd) { if (val < gtk_range_get_value(GTK_RANGE(data))) { gtk_range_set_value(rg, gtk_range_get_value(GTK_RANGE(data))); val = gtk_range_get_value(GTK_RANGE(data)); } #if GTK_MAJOR_VERSION > 2 || GTK_MINOR_VERSION > 11 gtk_range_set_fill_level(GTK_RANGE(data), val); #endif } gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkHighlight), FALSE); if (setHlRange(TRUE)) visu_ui_curve_frame_draw(VISU_UI_CURVE_FRAME(curve)); } static gboolean onElementChanged(GSignalInvocationHint *ihint _U_, guint n_param_values _U_, const GValue *param_values, gpointer data) { VisuElement *ele; ele = VISU_ELEMENT(g_value_get_object(param_values)); DBG_fprintf(stderr, "Gtk Curve: element '%s' has been modified.\n", ele->name); visu_ui_curve_frame_draw(VISU_UI_CURVE_FRAME(data)); return TRUE; } static void onDistSpanChanged(GtkSpinButton *spin _U_, gpointer userData _U_) { float span[2]; VisuData *dataObj; if (disableCallbacks) return; span[0] = (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinDMin)); span[1] = (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinDMax)); visu_ui_curve_frame_setSpan(VISU_UI_CURVE_FRAME(curve), span); /* Update highlight ranges. */ gtk_range_set_range(GTK_RANGE(rangeHlStart), gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinDMin)), gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinDMax))); gtk_range_set_range(GTK_RANGE(rangeHlEnd), gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinDMin)), gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinDMax))); dataObj = visu_ui_rendering_window_getData(visu_ui_main_class_getDefaultRendering()); g_idle_add(curveReplot, (gpointer)dataObj); } static void onUnitChanged(VisuData *dataObj _U_, gfloat factor, gpointer data _U_) { float span[2]; span[0] = (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinDMin)); span[1] = (float)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinDMax)); disableCallbacks = TRUE; gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinDMin), span[0] * factor); disableCallbacks = FALSE; gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinDMax), span[1] * factor); } v_sim-3.7.0/src/gtk_pairs.h0000644000353400050620000001114512215546105012507 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef GTK_PAIRS_H #define GTK_PAIRS_H #include #include "interface.h" #include "support.h" #include "visu_pairs.h" #include "gtk_main.h" /** * VisuUiPairsInitFunc: * * Prototype of functions called once on V_Sim start-up. */ typedef void (*VisuUiPairsInitFunc)(void); /** * VisuUiPairsBuildWidgetsFunc: * * Prototype of functions that create a container #GtkWidgets will all * element needed to change characteristic of a model. * * Returns: a newly allocated #GtkWidget. */ typedef GtkWidget* (*VisuUiPairsBuildWidgetsFunc)(); /** * VisuUiPairsToLabelFunc: * @data: information about a pair. * * Create a string, internationalised and in UTF-8, that describes the * given pair @data. This string is used in a column tree view to * summarize the pair description. * * Returns: a newly created string. */ typedef gchar* (*VisuUiPairsToLabelFunc)(VisuPairLink *data); /** * VisuUiPairsSetValuesFunc: * @data: informations about a pair. * * Prototype of functions used to update the widgets with given pair @data. */ typedef void (*VisuUiPairsSetValuesFunc)(VisuPairLink *data); /** * visu_ui_pairs_init: * * Initialise the default values for the pair dialog. It does not build * the interface, use visu_ui_pairs_initBuild() to do it. */ void visu_ui_pairs_init(); /** * visu_ui_pairs_initBuild: * @main: the command panel the about dialog is associated to. * * Create the dialog window for pairs. */ void visu_ui_pairs_initBuild(VisuUiMain *main); /** * visu_ui_pairs_update: * @main: the command panel the about dialog is associated to ; * @dataObj: the #VisuData the pairs are related to (can be NULL, if * none is loaded) ; * @force: build the pairs even if the window is hidden. * * Update the list of pairs. This routine must be called only after * visu_ui_pairs_initBuild() has been called. The job is done only if the * window is visible or if the @force argument is used. */ void visu_ui_pairs_update(VisuUiMain *main, VisuData *dataObj, gboolean force); void visu_ui_pairs_show(VisuUiMain *main); /** * visu_ui_pairs_setSpecificLabels: * @iter: the #GtkTreeIter to set the label ; * @label: the value of the label to be set. * * Change the specific label shown in the treeview of pairs for the * given iter. An iter in this treeview can be retrieve using the * #_VisuUiPairsIter objects. */ void visu_ui_pairs_setSpecificLabels(GtkTreeIter *iter, const gchar *label); gboolean visu_ui_pairs_select(const VisuPairLink *data); typedef struct _VisuUiPairsIter VisuUiPairsIter; struct _VisuUiPairsIter { VisuElement *ele1; VisuElement *ele2; VisuPairLink *data; GtkTreeIter iter; /* Private data. */ GList *selected; GList *current; }; void visu_ui_pairs_newIter(VisuUiPairsIter *iter); void visu_ui_pairs_iter_empty(VisuUiPairsIter *iter); void visu_ui_pairs_iter_startSelected(VisuUiPairsIter *iter); void visu_ui_pairs_iter_nextSelected(VisuUiPairsIter *iter); #endif v_sim-3.7.0/src/visu_main.c0000644000353400050620000001551012215546106012512 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "visu_basic.h" #include "visu_commandLine.h" #include "visu_tools.h" #include "visu_basic.h" #include "opengl.h" #include "visu_plugins.h" #include "visu_gtk.h" #include "gtk_main.h" #include "visu_data.h" #include "extensions/scale.h" #include "renderingMethods/renderingSpin.h" #include "gtk_renderingWindowWidget.h" #include #include #include #include #include #include #ifdef WITH_GOBJECT_INTROSPECTION #include #endif #ifdef HAVE_GTKGLEXT #include #endif #define VISU_MEM_CHECK 0 int main (int argc, char *argv[]) { int res; char *arg; VisuData *newData; gchar *dirname, *normDir; #ifdef WITH_GOBJECT_INTROSPECTION GError *error; #endif gboolean GUIerror; VisuUiRenderingWindow *window; #if DEBUG == 1 && VISU_MEM_CHECK == 1 g_mem_set_vtable(glib_mem_profiler_table); #endif g_type_init(); DBG_fprintf(stderr, "--- Get the default path ---\n"); visu_basic_setExePath(argv[0]); #ifdef G_THREADS_ENABLED DBG_fprintf(stderr, "--- Initialise threads ---\n"); g_thread_init(NULL); #endif #ifdef ENABLE_NLS setlocale (LC_ALL, ""); bindtextdomain (GETTEXT_PACKAGE, V_SIM_LOCALE_DIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); #endif DBG_fprintf(stderr, "Visu Main: initialise Gtk.\n"); GUIerror = gtk_init_check(&argc, &argv); DBG_fprintf(stderr, "--- Parse the command line ---\n"); res = commandLineParse(argc, argv); if (res) exit(1); /* 5444o still allocated by GLIB. */ /* if arg is not null, v_sim is in export mode. */ arg = commandLineGet_ExportFileName(); if (arg) { #ifdef HAVE_GTKGLEXT DBG_fprintf(stderr, "Visu Main: initialise Gtk.\n"); gtk_init(&argc, &argv); DBG_fprintf(stderr, "Visu Main: initialise GtkGlExt.\n"); gdk_gl_init(&argc, &argv); #endif DBG_fprintf(stderr,"--- Initialising plugins ---\n"); visu_plugins_init(); DBG_fprintf(stderr, "Visu Main: test for help message.\n"); if (visu_basic_showOptionHelp(FALSE)) exit(0); DBG_fprintf(stderr, "Visu Main: V_Sim has been called in an export session," " with parameter '%s'.\n", arg); res = visu_basic_mainExport(); return res; } /* Introspection case, must be called after g_object initialisation. */ if (commandLineGet_introspect()) { #ifdef WITH_GOBJECT_INTROSPECTION /* Additional classes. */ g_type_class_ref(VISU_TYPE_RENDERING); g_type_class_ref(VISU_TYPE_DATA); g_type_class_ref(VISU_TYPE_GL_EXT_SCALE); g_type_class_ref(VISU_TYPE_GL_EXT_MARKS); g_type_class_ref(VISU_UI_TYPE_RENDERING_WINDOW); g_type_class_ref(VISU_UI_TYPE_MAIN); DBG_fprintf(stderr, "Visu Main: call introspection for file '%s'.\n", commandLineGet_introspect()); error = (GError*)0; g_irepository_dump(commandLineGet_introspect(), &error); if (error) { g_error("%s", error->message); g_error_free(error); } return 0; #else g_warning("Introspection required but not compiled."); #endif } g_return_val_if_fail(GUIerror, 1); gtk_window_set_default_icon_name("v_sim"); gtk_icon_theme_append_search_path(gtk_icon_theme_get_default(), V_SIM_ICONS_DIR); g_set_application_name(_("Visualise atomic simulations")); #ifdef HAVE_GTKGLEXT DBG_fprintf(stderr, "Visu Main: initialise GtkGlExt.\n"); gdk_gl_init(&argc, &argv); #endif /* 38713o still allocated by GLIB and GTK. */ visu_basic_init(); visu_gl_initGraphics(); /* the default is V_Sim with gtk interface. */ if (!strcmp(commandLineGet_windowMode(), "renderOnly")) visu_ui_mainCreate(visu_ui_createInterface); else visu_ui_mainCreate(visu_ui_main_class_createMain); window = VISU_UI_RENDERING_WINDOW(visu_ui_getRenderWidget()); DBG_fprintf(stderr, "Visu Main: test for help message.\n"); if (visu_basic_showOptionHelp(FALSE)) exit(0); newData = visu_basic_setDataFromCommandLine(); if (newData) { dirname = g_path_get_dirname(visu_data_getFile(newData, FILE_KIND_POSITION, (ToolFileFormat**)0)); normDir = tool_path_normalize(dirname); visu_ui_setLastOpenDirectory((char*)normDir, VISU_UI_DIR_FILE); g_free(dirname); g_free(normDir); visu_ui_rendering_window_loadFile(window, newData, commandLineGet_iSet()); /* Run the command line. */ if (!strcmp(commandLineGet_windowMode(), "renderOnly")) g_idle_add(visu_ui_runCommandLine, (gpointer)0); else { g_idle_add(visu_ui_main_initPanels, (gpointer)0); g_idle_add(visu_ui_main_runCommandLine, (gpointer)visu_ui_getPanel()); } } else { visu_ui_rendering_window_setData(window, (VisuData*)0); /* Run the command line. */ if (strcmp(commandLineGet_windowMode(), "renderOnly")) g_idle_add(visu_ui_main_initPanels, (gpointer)0); } DBG_fprintf(stderr, "Visu Main: starting main GTK loop.\n"); gtk_main(); DBG_fprintf(stderr, "Visu Main: quit main GTK loop.\n"); visu_plugins_free(); visu_basic_freeAll(); commandLineFree_all(); #if DEBUG == 1 g_mem_profile(); #endif return 0; } v_sim-3.7.0/src/visu_test.c0000644000353400050620000000563312215546105012551 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "visu_basic.h" #include "visu_commandLine.h" #include "visu_tools.h" #include "visu_gtk.h" #include "gtk_main.h" #include #include #include #include #include #ifdef HAVE_GTKGLEXT #include #endif int main (int argc, char *argv[]) { int res; DBG_fprintf(stderr, "--- Get the default path ---\n"); visuBasicSet_paths(argv[0]); #ifdef G_THREADS_ENABLED DBG_fprintf(stderr, "--- Initialise threads ---\n"); g_thread_init(NULL); #endif #ifdef ENABLE_NLS setlocale (LC_ALL, ""); bindtextdomain (GETTEXT_PACKAGE, v_sim_locale_dir); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); #endif DBG_fprintf(stderr, "--- Parse the command line ---\n"); res = commandLineParse(argc, argv); if (res) exit(1); DBG_fprintf(stderr, "Visu Main: initialise Gtk.\n"); gtk_init(&argc, &argv); #ifdef HAVE_GTKGLEXT DBG_fprintf(stderr, "Visu Main: initialise GtkGlExt.\n"); gdk_gl_init(&argc, &argv); #endif /* the default is V_Sim with gtk interface. */ visu_ui_mainCreate(visu_ui_createInterface); DBG_fprintf(stderr, "Visu Main: starting main GTK loop.\n"); gtk_main(); return res; } v_sim-3.7.0/lib/0000755000353400050620000000000012216331346010410 500000000000000v_sim-3.7.0/lib/Makefile.am0000644000353400050620000000003212215546175012366 00000000000000SUBDIRS = plug-ins python v_sim-3.7.0/lib/Makefile.in0000644000353400050620000005135712216330211012376 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = lib DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/abinit.m4 \ $(top_srcdir)/m4/ax_check_gl.m4 \ $(top_srcdir)/m4/ax_check_glu.m4 \ $(top_srcdir)/m4/ax_lang_compiler_ms.m4 \ $(top_srcdir)/m4/ax_lapack.m4 $(top_srcdir)/m4/bigdft.m4 \ $(top_srcdir)/m4/etsf_io.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/libxc.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/netcdf.m4 \ $(top_srcdir)/m4/python.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" AB_CPPFLAGS = @AB_CPPFLAGS@ AB_LIBS = @AB_LIBS@ ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIGDFT_CPPFLAGS = @BIGDFT_CPPFLAGS@ BIGDFT_LIBS = @BIGDFT_LIBS@ BLAS_LIBS = @BLAS_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETSF_IO_LIBS = @ETSF_IO_LIBS@ EXEEXT = @EXEEXT@ EXTRA_CFLAGS = @EXTRA_CFLAGS@ EXTRA_LDFLAGS = @EXTRA_LDFLAGS@ EXTRA_LIBS = @EXTRA_LIBS@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ FCLIBS = @FCLIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLIBS = @FLIBS@ FONT_BOLD = @FONT_BOLD@ FONT_NORMAL = @FONT_NORMAL@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_BIGDFT_CFLAGS = @GLIB_BIGDFT_CFLAGS@ GLIB_BIGDFT_LIBS = @GLIB_BIGDFT_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GOBJECT_INTROSPECTION_REQUIRED = @GOBJECT_INTROSPECTION_REQUIRED@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTKS_CFLAGS = @GTKS_CFLAGS@ GTKS_LIBS = @GTKS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_SCANNER = @G_IR_SCANNER@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LAPACK_LIBS = @LAPACK_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXC_LIBS = @LIBXC_LIBS@ LIB_ARCHIVE_CFLAGS = @LIB_ARCHIVE_CFLAGS@ LIB_ARCHIVE_LIBS = @LIB_ARCHIVE_LIBS@ LIB_YAML_CFLAGS = @LIB_YAML_CFLAGS@ LIB_YAML_LIBS = @LIB_YAML_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NC_CPPFLAGS = @NC_CPPFLAGS@ NC_LDFLAGS = @NC_LDFLAGS@ NC_LIBS = @NC_LIBS@ NC_NETCDF_3_CPPFLAG = @NC_NETCDF_3_CPPFLAG@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBABEL_CFLAGS = @OPENBABEL_CFLAGS@ OPENBABEL_LIBS = @OPENBABEL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PYGOBJECT_CFLAGS = @PYGOBJECT_CFLAGS@ PYGOBJECT_LIBS = @PYGOBJECT_LIBS@ PYGOBJECT_REQUIRED = @PYGOBJECT_REQUIRED@ PYGTK_CFLAGS = @PYGTK_CFLAGS@ PYGTK_LIBS = @PYGTK_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_INCLUDES = @PYTHON_INCLUDES@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ V_SIM_MAJOR_VERSION = @V_SIM_MAJOR_VERSION@ V_SIM_MICRO_VERSION = @V_SIM_MICRO_VERSION@ V_SIM_MINOR_VERSION = @V_SIM_MINOR_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ girdir = @girdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ lib_v_sim_version = @lib_v_sim_version@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typelibsdir = @typelibsdir@ v_simexamplesdir = @v_simexamplesdir@ v_simexedir = @v_simexedir@ v_simiconsdir = @v_simiconsdir@ v_simlegaldir = @v_simlegaldir@ v_simpixmapsdir = @v_simpixmapsdir@ v_simpluginsdir = @v_simpluginsdir@ v_simresourcesdir = @v_simresourcesdir@ visupyexecdir = @visupyexecdir@ visutypelibsdir = @visutypelibsdir@ SUBDIRS = plug-ins python all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu lib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu lib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: v_sim-3.7.0/lib/plug-ins/0000755000353400050620000000000012216331346012146 500000000000000v_sim-3.7.0/lib/plug-ins/README0000644000353400050620000000125412215546175012757 00000000000000In each directory, a dynamic loadable library is built (.so under most Unix and .dll on Windows). All these library must have the following functions : - gboolean Init(); When V_Sim is started, it scans the directory where loadable modules are stored and proposes to the user the possibility to load the plug-in, calling this method. For example, if the plug-in brings new file formats for loading, it can add its new ones using appropriated methods from V_Sim. - const gchar* Get_description(); This method returns a short text describing the plug-in. This text is own by the plug-in and will not be altered by C_Sim. It must be in UTF-8. v_sim-3.7.0/lib/plug-ins/Makefile.am0000644000353400050620000000015512215546175014132 00000000000000SUBDIRS = nanoquanta-netcdf \ OpenBabel-wrapper \ xsf \ cube \ abinit \ python-gi \ archives \ bigdft v_sim-3.7.0/lib/plug-ins/Makefile.in0000644000353400050620000005154512216330211014133 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = lib/plug-ins DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/abinit.m4 \ $(top_srcdir)/m4/ax_check_gl.m4 \ $(top_srcdir)/m4/ax_check_glu.m4 \ $(top_srcdir)/m4/ax_lang_compiler_ms.m4 \ $(top_srcdir)/m4/ax_lapack.m4 $(top_srcdir)/m4/bigdft.m4 \ $(top_srcdir)/m4/etsf_io.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/libxc.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/netcdf.m4 \ $(top_srcdir)/m4/python.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" AB_CPPFLAGS = @AB_CPPFLAGS@ AB_LIBS = @AB_LIBS@ ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIGDFT_CPPFLAGS = @BIGDFT_CPPFLAGS@ BIGDFT_LIBS = @BIGDFT_LIBS@ BLAS_LIBS = @BLAS_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETSF_IO_LIBS = @ETSF_IO_LIBS@ EXEEXT = @EXEEXT@ EXTRA_CFLAGS = @EXTRA_CFLAGS@ EXTRA_LDFLAGS = @EXTRA_LDFLAGS@ EXTRA_LIBS = @EXTRA_LIBS@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ FCLIBS = @FCLIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLIBS = @FLIBS@ FONT_BOLD = @FONT_BOLD@ FONT_NORMAL = @FONT_NORMAL@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_BIGDFT_CFLAGS = @GLIB_BIGDFT_CFLAGS@ GLIB_BIGDFT_LIBS = @GLIB_BIGDFT_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GOBJECT_INTROSPECTION_REQUIRED = @GOBJECT_INTROSPECTION_REQUIRED@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTKS_CFLAGS = @GTKS_CFLAGS@ GTKS_LIBS = @GTKS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_SCANNER = @G_IR_SCANNER@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LAPACK_LIBS = @LAPACK_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXC_LIBS = @LIBXC_LIBS@ LIB_ARCHIVE_CFLAGS = @LIB_ARCHIVE_CFLAGS@ LIB_ARCHIVE_LIBS = @LIB_ARCHIVE_LIBS@ LIB_YAML_CFLAGS = @LIB_YAML_CFLAGS@ LIB_YAML_LIBS = @LIB_YAML_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NC_CPPFLAGS = @NC_CPPFLAGS@ NC_LDFLAGS = @NC_LDFLAGS@ NC_LIBS = @NC_LIBS@ NC_NETCDF_3_CPPFLAG = @NC_NETCDF_3_CPPFLAG@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBABEL_CFLAGS = @OPENBABEL_CFLAGS@ OPENBABEL_LIBS = @OPENBABEL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PYGOBJECT_CFLAGS = @PYGOBJECT_CFLAGS@ PYGOBJECT_LIBS = @PYGOBJECT_LIBS@ PYGOBJECT_REQUIRED = @PYGOBJECT_REQUIRED@ PYGTK_CFLAGS = @PYGTK_CFLAGS@ PYGTK_LIBS = @PYGTK_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_INCLUDES = @PYTHON_INCLUDES@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ V_SIM_MAJOR_VERSION = @V_SIM_MAJOR_VERSION@ V_SIM_MICRO_VERSION = @V_SIM_MICRO_VERSION@ V_SIM_MINOR_VERSION = @V_SIM_MINOR_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ girdir = @girdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ lib_v_sim_version = @lib_v_sim_version@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typelibsdir = @typelibsdir@ v_simexamplesdir = @v_simexamplesdir@ v_simexedir = @v_simexedir@ v_simiconsdir = @v_simiconsdir@ v_simlegaldir = @v_simlegaldir@ v_simpixmapsdir = @v_simpixmapsdir@ v_simpluginsdir = @v_simpluginsdir@ v_simresourcesdir = @v_simresourcesdir@ visupyexecdir = @visupyexecdir@ visutypelibsdir = @visutypelibsdir@ SUBDIRS = nanoquanta-netcdf \ OpenBabel-wrapper \ xsf \ cube \ abinit \ python-gi \ archives \ bigdft all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu lib/plug-ins/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu lib/plug-ins/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: v_sim-3.7.0/lib/plug-ins/nanoquanta-netcdf/0000755000353400050620000000000012216331347015555 500000000000000v_sim-3.7.0/lib/plug-ins/nanoquanta-netcdf/Makefile.am0000644000353400050620000000161312215546173017536 00000000000000## Process this file with automake to produce Makefile.in vpath %.h $(top_srcdir)/src if PLATFORM_WIN32 cflagWin = -mms-bitfields -mno-cygwin endif libetsf_la_SOURCES = nq_basic.c nq_basic.h \ nq_structure.c nq_structure.h \ nq_density.c nq_density.h libetsf_la_LIBADD = $(top_builddir)/src/lib@PACKAGE_TARNAME@-3.la \ $(NC_LDFLAGS) $(NC_LIBS) @GLIB_LIBS@ libetsf_la_LDFLAGS = -module @EXTRA_LDFLAGS@ -version-info $(lib_v_sim_version) if HAVE_ETSF NQ_LIB = libetsf.la NQ_EXAMPLE = nq-netcdf.nc \ nq-netcdf.cdl \ silane.nc \ si1002x1-o_DS1_DEN-etsf.nc NQ_PIX = nanoquanta.png endif v_simplugins_LTLIBRARIES = \ $(NQ_LIB) INCLUDES = \ -I$(top_srcdir)/src \ @GLIB_CFLAGS@ \ $(NC_NETCDF_3_CPPFLAG) AM_CFLAGS = $(cflagWin) v_simexamples_DATA = $(NQ_EXAMPLE) v_simpixmaps_DATA = $(NQ_PIX) EXTRA_DIST = nq-netcdf.nc \ nq-netcdf.cdl \ silane.nc \ si1002x1-o_DS1_DEN-etsf.nc \ nanoquanta.png v_sim-3.7.0/lib/plug-ins/nanoquanta-netcdf/Makefile.in0000644000353400050620000006010112216330211017525 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = lib/plug-ins/nanoquanta-netcdf DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/abinit.m4 \ $(top_srcdir)/m4/ax_check_gl.m4 \ $(top_srcdir)/m4/ax_check_glu.m4 \ $(top_srcdir)/m4/ax_lang_compiler_ms.m4 \ $(top_srcdir)/m4/ax_lapack.m4 $(top_srcdir)/m4/bigdft.m4 \ $(top_srcdir)/m4/etsf_io.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/libxc.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/netcdf.m4 \ $(top_srcdir)/m4/python.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(v_simpluginsdir)" \ "$(DESTDIR)$(v_simexamplesdir)" "$(DESTDIR)$(v_simpixmapsdir)" LTLIBRARIES = $(v_simplugins_LTLIBRARIES) am__DEPENDENCIES_1 = libetsf_la_DEPENDENCIES = \ $(top_builddir)/src/lib@PACKAGE_TARNAME@-3.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libetsf_la_OBJECTS = nq_basic.lo nq_structure.lo nq_density.lo libetsf_la_OBJECTS = $(am_libetsf_la_OBJECTS) libetsf_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libetsf_la_LDFLAGS) $(LDFLAGS) -o $@ @HAVE_ETSF_TRUE@am_libetsf_la_rpath = -rpath $(v_simpluginsdir) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libetsf_la_SOURCES) DIST_SOURCES = $(libetsf_la_SOURCES) DATA = $(v_simexamples_DATA) $(v_simpixmaps_DATA) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AB_CPPFLAGS = @AB_CPPFLAGS@ AB_LIBS = @AB_LIBS@ ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIGDFT_CPPFLAGS = @BIGDFT_CPPFLAGS@ BIGDFT_LIBS = @BIGDFT_LIBS@ BLAS_LIBS = @BLAS_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETSF_IO_LIBS = @ETSF_IO_LIBS@ EXEEXT = @EXEEXT@ EXTRA_CFLAGS = @EXTRA_CFLAGS@ EXTRA_LDFLAGS = @EXTRA_LDFLAGS@ EXTRA_LIBS = @EXTRA_LIBS@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ FCLIBS = @FCLIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLIBS = @FLIBS@ FONT_BOLD = @FONT_BOLD@ FONT_NORMAL = @FONT_NORMAL@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_BIGDFT_CFLAGS = @GLIB_BIGDFT_CFLAGS@ GLIB_BIGDFT_LIBS = @GLIB_BIGDFT_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GOBJECT_INTROSPECTION_REQUIRED = @GOBJECT_INTROSPECTION_REQUIRED@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTKS_CFLAGS = @GTKS_CFLAGS@ GTKS_LIBS = @GTKS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_SCANNER = @G_IR_SCANNER@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LAPACK_LIBS = @LAPACK_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXC_LIBS = @LIBXC_LIBS@ LIB_ARCHIVE_CFLAGS = @LIB_ARCHIVE_CFLAGS@ LIB_ARCHIVE_LIBS = @LIB_ARCHIVE_LIBS@ LIB_YAML_CFLAGS = @LIB_YAML_CFLAGS@ LIB_YAML_LIBS = @LIB_YAML_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NC_CPPFLAGS = @NC_CPPFLAGS@ NC_LDFLAGS = @NC_LDFLAGS@ NC_LIBS = @NC_LIBS@ NC_NETCDF_3_CPPFLAG = @NC_NETCDF_3_CPPFLAG@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBABEL_CFLAGS = @OPENBABEL_CFLAGS@ OPENBABEL_LIBS = @OPENBABEL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PYGOBJECT_CFLAGS = @PYGOBJECT_CFLAGS@ PYGOBJECT_LIBS = @PYGOBJECT_LIBS@ PYGOBJECT_REQUIRED = @PYGOBJECT_REQUIRED@ PYGTK_CFLAGS = @PYGTK_CFLAGS@ PYGTK_LIBS = @PYGTK_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_INCLUDES = @PYTHON_INCLUDES@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ V_SIM_MAJOR_VERSION = @V_SIM_MAJOR_VERSION@ V_SIM_MICRO_VERSION = @V_SIM_MICRO_VERSION@ V_SIM_MINOR_VERSION = @V_SIM_MINOR_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ girdir = @girdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ lib_v_sim_version = @lib_v_sim_version@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typelibsdir = @typelibsdir@ v_simexamplesdir = @v_simexamplesdir@ v_simexedir = @v_simexedir@ v_simiconsdir = @v_simiconsdir@ v_simlegaldir = @v_simlegaldir@ v_simpixmapsdir = @v_simpixmapsdir@ v_simpluginsdir = @v_simpluginsdir@ v_simresourcesdir = @v_simresourcesdir@ visupyexecdir = @visupyexecdir@ visutypelibsdir = @visutypelibsdir@ @PLATFORM_WIN32_TRUE@cflagWin = -mms-bitfields -mno-cygwin libetsf_la_SOURCES = nq_basic.c nq_basic.h \ nq_structure.c nq_structure.h \ nq_density.c nq_density.h libetsf_la_LIBADD = $(top_builddir)/src/lib@PACKAGE_TARNAME@-3.la \ $(NC_LDFLAGS) $(NC_LIBS) @GLIB_LIBS@ libetsf_la_LDFLAGS = -module @EXTRA_LDFLAGS@ -version-info $(lib_v_sim_version) @HAVE_ETSF_TRUE@NQ_LIB = libetsf.la @HAVE_ETSF_TRUE@NQ_EXAMPLE = nq-netcdf.nc \ @HAVE_ETSF_TRUE@ nq-netcdf.cdl \ @HAVE_ETSF_TRUE@ silane.nc \ @HAVE_ETSF_TRUE@ si1002x1-o_DS1_DEN-etsf.nc @HAVE_ETSF_TRUE@NQ_PIX = nanoquanta.png v_simplugins_LTLIBRARIES = \ $(NQ_LIB) INCLUDES = \ -I$(top_srcdir)/src \ @GLIB_CFLAGS@ \ $(NC_NETCDF_3_CPPFLAG) AM_CFLAGS = $(cflagWin) v_simexamples_DATA = $(NQ_EXAMPLE) v_simpixmaps_DATA = $(NQ_PIX) EXTRA_DIST = nq-netcdf.nc \ nq-netcdf.cdl \ silane.nc \ si1002x1-o_DS1_DEN-etsf.nc \ nanoquanta.png all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu lib/plug-ins/nanoquanta-netcdf/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu lib/plug-ins/nanoquanta-netcdf/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-v_simpluginsLTLIBRARIES: $(v_simplugins_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(v_simpluginsdir)" || $(MKDIR_P) "$(DESTDIR)$(v_simpluginsdir)" @list='$(v_simplugins_LTLIBRARIES)'; test -n "$(v_simpluginsdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(v_simpluginsdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(v_simpluginsdir)"; \ } uninstall-v_simpluginsLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(v_simplugins_LTLIBRARIES)'; test -n "$(v_simpluginsdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(v_simpluginsdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(v_simpluginsdir)/$$f"; \ done clean-v_simpluginsLTLIBRARIES: -test -z "$(v_simplugins_LTLIBRARIES)" || rm -f $(v_simplugins_LTLIBRARIES) @list='$(v_simplugins_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libetsf.la: $(libetsf_la_OBJECTS) $(libetsf_la_DEPENDENCIES) $(EXTRA_libetsf_la_DEPENDENCIES) $(libetsf_la_LINK) $(am_libetsf_la_rpath) $(libetsf_la_OBJECTS) $(libetsf_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nq_basic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nq_density.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nq_structure.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-v_simexamplesDATA: $(v_simexamples_DATA) @$(NORMAL_INSTALL) test -z "$(v_simexamplesdir)" || $(MKDIR_P) "$(DESTDIR)$(v_simexamplesdir)" @list='$(v_simexamples_DATA)'; test -n "$(v_simexamplesdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(v_simexamplesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(v_simexamplesdir)" || exit $$?; \ done uninstall-v_simexamplesDATA: @$(NORMAL_UNINSTALL) @list='$(v_simexamples_DATA)'; test -n "$(v_simexamplesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(v_simexamplesdir)'; $(am__uninstall_files_from_dir) install-v_simpixmapsDATA: $(v_simpixmaps_DATA) @$(NORMAL_INSTALL) test -z "$(v_simpixmapsdir)" || $(MKDIR_P) "$(DESTDIR)$(v_simpixmapsdir)" @list='$(v_simpixmaps_DATA)'; test -n "$(v_simpixmapsdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(v_simpixmapsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(v_simpixmapsdir)" || exit $$?; \ done uninstall-v_simpixmapsDATA: @$(NORMAL_UNINSTALL) @list='$(v_simpixmaps_DATA)'; test -n "$(v_simpixmapsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(v_simpixmapsdir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) installdirs: for dir in "$(DESTDIR)$(v_simpluginsdir)" "$(DESTDIR)$(v_simexamplesdir)" "$(DESTDIR)$(v_simpixmapsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-v_simpluginsLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-v_simexamplesDATA install-v_simpixmapsDATA \ install-v_simpluginsLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-v_simexamplesDATA uninstall-v_simpixmapsDATA \ uninstall-v_simpluginsLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-v_simpluginsLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip install-v_simexamplesDATA \ install-v_simpixmapsDATA install-v_simpluginsLTLIBRARIES \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-v_simexamplesDATA \ uninstall-v_simpixmapsDATA uninstall-v_simpluginsLTLIBRARIES vpath %.h $(top_srcdir)/src # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: v_sim-3.7.0/lib/plug-ins/nanoquanta-netcdf/nq_basic.c0000644000353400050620000002354012215546173017430 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include "nq_basic.h" #include "nq_structure.h" #include "nq_density.h" #include #include #include #define NANOQUANTA_DESCRIPTION _("" \ "This plug-in introduces support for\n" \ "ETSF file format defined by the\n" \ "European network NANOQUANTA.") #define NANOQUANTA_AUTHORS _("Caliste Damien:\n structure/density loading.") static gchar *iconPath; /* Required methods for a loadable module. */ gboolean etsfInit() { DBG_fprintf(stderr, "ETSF: loading plug-in 'nanoquanta'...\n"); DBG_fprintf(stderr, "ETSF: declare a new rendering load method.\n"); nqStructuralInit(visu_rendering_getByName(VISU_RENDERING_ATOMIC_NAME)); iconPath = g_build_filename(V_SIM_PIXMAPS_DIR, "nanoquanta.png", NULL); DBG_fprintf(stderr, "ETSF: declare a new density load method.\n"); nqDensityInit(); return TRUE; } const char* etsfGet_description() { return NANOQUANTA_DESCRIPTION; } const char* etsfGet_authors() { return NANOQUANTA_AUTHORS; } const char* etsfGet_icon() { return iconPath; } GQuark nqError_quark() { return g_quark_from_static_string("nanoquanta"); } gboolean nqOpen_netcdfFile(const char* filename, int *netcdfId, GError **error) { int status, i; char *varsNames[3] = {"file_format", "file_format_version", "Conventions"}; nc_type varsType[3] = {NC_CHAR, NC_FLOAT, NC_CHAR}; nc_type altVarsType[3] = {NC_CHAR, NC_DOUBLE, NC_CHAR}; size_t varsLength[3] = {80, 1, 80}; nc_type readType; size_t readLength[3]; char format[256]; float version; g_return_val_if_fail(error && *error == (GError*)0, FALSE); g_return_val_if_fail(netcdfId && filename, FALSE); DBG_fprintf(stderr, "NQ Basic: opening file '%s' as a NetCDF file.\n", filename); /* Open the file as a NETCDF file. */ status = nc_open(filename, NC_NOWRITE, netcdfId); if (status != NC_NOERR) { DBG_fprintf(stderr, " | not a NetCDF file, can't open.\n"); *error = g_error_new(NQ_ERROR, NQ_ERROR_FILE_OPEN, "%s", nc_strerror(status)); return FALSE; } /* From here, the file is opened. */ /* Grep the header variables to check that it is a NETCDF file following rules of NANOQUANTA specifications. */ DBG_fprintf(stderr, "NQ Basic: checking header of file '%s'.\n", filename); /* Check lengths and types. */ for (i = 0; i < 3; i++) { status = nc_inq_att(*netcdfId, NC_GLOBAL, varsNames[i], &readType, readLength + i); if (status != NC_NOERR) { DBG_fprintf(stderr, " | cannot read header element %d (%s).\n", i, nc_strerror(status)); *error = g_error_new(NQ_ERROR, NQ_ERROR_FILE_HEADER, "inquiring global attribute '%s' raises: %s", varsNames[i], nc_strerror(status)); nqClose_netcdfFile(*netcdfId); return FALSE; } DBG_fprintf(stderr, " | header '%s' : type %d (%d), length %d (%d).\n", varsNames[i], (int)readType, (int)varsType[i], (int)readLength[i], (int)varsLength[i]); if ((readType != varsType[i] && readType != altVarsType[i]) || readLength[i] > varsLength[i]) { DBG_fprintf(stderr, " | header not valid.\n"); *error = g_error_new(NQ_ERROR, NQ_ERROR_FILE_HEADER, _("Global attribute '%s' has a wrong " "length or type.\n"), varsNames[i]); nqClose_netcdfFile(*netcdfId); return FALSE; } } /* Check values. */ status = nc_get_att_text(*netcdfId, NC_GLOBAL, varsNames[0], format); if (status != NC_NOERR) { DBG_fprintf(stderr, " | cannot read format.\n"); *error = g_error_new(NQ_ERROR, NQ_ERROR_FILE_HEADER, "reading global attribute '%s' raises: %s", varsNames[0], nc_strerror(status)); nqClose_netcdfFile(*netcdfId); return FALSE; } format[readLength[0]] = '\0'; DBG_fprintf(stderr, " | header '%s' value '%s'.\n", varsNames[0], format); if (strcmp(format, "ETSF Nanoquanta")) { DBG_fprintf(stderr, " | wrong format '%s'.\n", format); *error = g_error_new(NQ_ERROR, NQ_ERROR_FILE_HEADER, _("Variable 'file_format' should be " "'ETSF Nanoquanta' but is '%s'.\n"), format); nqClose_netcdfFile(*netcdfId); return FALSE; } status = nc_get_att_float(*netcdfId, NC_GLOBAL, varsNames[1], &version); if (status != NC_NOERR) { DBG_fprintf(stderr, " | cannot read version.\n"); *error = g_error_new(NQ_ERROR, NQ_ERROR_FILE_HEADER, "reading global attribute '%s' raises: %s", varsNames[1], nc_strerror(status)); nqClose_netcdfFile(*netcdfId); return FALSE; } DBG_fprintf(stderr, " | header '%s' value %f.\n", varsNames[1], version); if (version < 1.2) { DBG_fprintf(stderr, " | version too small (%f).\n", version); *error = g_error_new(NQ_ERROR, NQ_ERROR_FILE_HEADER, _("Supported version are 1.2 and over but" " this file is only %f.\n"), version); nqClose_netcdfFile(*netcdfId); return FALSE; } return TRUE; } gboolean nqClose_netcdfFile(int netcdfId) { int status; status = nc_close(netcdfId); if (status != NC_NOERR) { g_warning("%s", nc_strerror(status)); return FALSE; } return TRUE; } static gboolean nqErrorReport(GError **error, const char *message, ...) { va_list args; gchar *formatted; if (error) { va_start(args, message); formatted = g_strdup_vprintf(message, args); va_end(args); *error = g_error_new(NQ_ERROR, NQ_ERROR_FILE_FORMAT, "%s", formatted); g_free(formatted); } return FALSE; } gboolean nqGetDim(int netcdfId, GError **error, char *name, int *varId, size_t *value) { int status; /* Grep the number of elements. */ status = nc_inq_dimid(netcdfId, name, varId); if (status != NC_NOERR) return nqErrorReport(error, _("Reading '%s': %s."), name, nc_strerror(status)); status = nc_inq_dimlen(netcdfId, *varId, value); if (status != NC_NOERR) return nqErrorReport(error, _("Retrieve value for variable '%s': %s."), name, nc_strerror(status)); return TRUE; } gboolean nqCheckVar(int netcdfId, GError **error, char *name, int *varId, nc_type ncType, int nbDims, size_t *nbEleDims) { int status; nc_type localType; char *typeNames[] = {"NAT", "BYTE", "CHAR", "SHORT", "INT", "FLOAT", "DOUBLE"}; int localDims; int *localNbDims; int i; size_t dimSize; status = nc_inq_varid(netcdfId, name, varId); if (status != NC_NOERR) return nqErrorReport(error, _("Reading '%s': %s."), name, nc_strerror(status)); status = nc_inq_vartype(netcdfId, *varId, &localType); if (status != NC_NOERR) return nqErrorReport(error, _("Checking variable '%s': %s."), name, nc_strerror(status)); if (localType != ncType) return nqErrorReport(error, _("Variable '%s' should be of type '%s'."), name, typeNames[ncType]); status = nc_inq_varndims(netcdfId, *varId, &localDims); if (status != NC_NOERR) return nqErrorReport(error, _("Checking variable '%s': %s."), name, nc_strerror(status)); if (localDims != nbDims) return nqErrorReport(error, _("Variable '%s' should be a %d dimension array."), name, nbDims); localNbDims = g_malloc(sizeof(int) * nbDims); status = nc_inq_vardimid(netcdfId, *varId, localNbDims); if (status != NC_NOERR) { g_free(localNbDims); return nqErrorReport(error, _("Checking variable '%s': %s."), name, nc_strerror(status)); } for (i = 0; i< nbDims; i++) { status = nc_inq_dimlen(netcdfId, localNbDims[i], &dimSize); if (status != NC_NOERR) { g_free(localNbDims); return nqErrorReport(error, _("Checking dimension ID %d: %s."), localNbDims[i], nc_strerror(status)); } if (dimSize != nbEleDims[i]) { g_free(localNbDims); return nqErrorReport(error, _("Variable '%s' is not consistent with" " declaration of dimensions."), name); } } g_free(localNbDims); return TRUE; } v_sim-3.7.0/lib/plug-ins/nanoquanta-netcdf/nq_basic.h0000644000353400050620000001027312215546173017434 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef NQ_BASIC_H #define NQ_BASIC_H #include #include #define NQ_ERROR nqError_quark() GQuark nqError_quark(void); enum { NQ_ERROR_FILE_OPEN, /* Error when opening. */ NQ_ERROR_FILE_UNKNOWN, /* Wrong or unknown headers. */ NQ_ERROR_FILE_HEADER, /* Wrong header value. */ NQ_ERROR_FILE_FORMAT /* Wrong syntax (missing variables... */ }; /** * nqOpen_netcdfFile: * @filename: a path to the file to load ; * @netcdfId: a pointer to store the id returned by netcdf ; * @error: a pointer to store possible error. * * Open a file supposed to be a NETCDF file following the Nanoquanta * specifications. The @netcdfId argument will store the integer id used by * netcdf in future calls if the given @filename has a right header. * * Returns: TRUE if the file is a valid NETCDF file, if FALSE, no file * is opened. */ gboolean nqOpen_netcdfFile(const char* filename, int *netcdfId, GError **error); /** * nqClose_netcdfFile: * @netcdfId: a netcdf identifier ; * * Close the file that is currently opened by Netcdf. * * Returns: TRUE if the file is succesfully closed. */ gboolean nqClose_netcdfFile(int netcdfId); /** * nqGetDim: * @netcdfId: a netcdf identifier ; * @error: a location to store an error (target should NULL on enter) ; * @name: the name of the dimension to get the value from ; * @varId: a location to store the id used to identify this dimension ; * @value: a location to store the returned value. * * Inquire the given @netcdfId file to read the value of the given dimension. * * Returns: TRUE if the dimension exists and the value is readable. */ gboolean nqGetDim(int netcdfId, GError **error, char *name, int *varId, size_t *value); /** * nqCheckVar: * @netcdfId: a netcdf identifier ; * @error: a location to store an error (target should NULL on enter) ; * @name: the name of the value to check the definition of ; * @varId: a location to store the id used to identify this variable ; * @ncType: the supposed type of the variable ; * @nbDims: the supposed number of dimenions of the variable ; * @nbEleDims: an array of size @nbDims with the supposed size of each * dimenion; * * Inquire the given @netcdfId file to read the variable definition * and check that it matches with the given arguments. * * Returns: TRUE if the variable exists and match the given definition. */ gboolean nqCheckVar(int netcdfId, GError **error, char *name, int *varId, nc_type ncType, int nbDims, size_t *nbEleDims); #endif v_sim-3.7.0/lib/plug-ins/nanoquanta-netcdf/nq_structure.c0000644000353400050620000003227512215546173020414 00000000000000#include "nq_basic.h" #include "nq_structure.h" #include #include #include #include #include #include #include #include /* Local methods */ static gboolean loadNQETSF(VisuData *data, const gchar* filename, ToolFileFormat *format, int nSet, GCancellable *cancel, GError **error); void nqStructuralInit(VisuRendering *method) { const gchar *type[] = {"*.nc", "*-etsf.nc", (char*)0}; visu_rendering_addFileFormat(method, 0, tool_file_format_new(_("ETSF file format"), type), 5, loadNQETSF); } static gboolean loadNQETSF(VisuData *data, const gchar* filename, ToolFileFormat *format _U_, int nSet _U_, GCancellable *cancel _U_, GError **error) { gboolean res; int netcdfId, status; guint i; int varId; size_t dimSize; char* varNbElement = "number_of_atom_species"; guint nbEle; char* varNbNode = "number_of_atoms"; guint nbNode; char* varAtomsNames = "atom_species_names"; int varIdSymbols; size_t dimsSymbols[2]; char* symbols; char* varNodeToEle = "atom_species"; int varIdNodeToEle; size_t dimsNodeToEle; guint *nodeToEle; char* varCoord = "reduced_atom_positions"; int varIdCoord; size_t dimsCoord[2]; double* coord; char *varRprimd = "primitive_vectors"; int varIdRprimd; size_t dimsRprimd[2]; double rprimd[3][3]; size_t start[] = {0, 0, 0}; char *varTitle = "title"; size_t sizeTitle; char title[256]; VisuElement *ele; GArray *visuEle, *nbNodesPerEle, *gcoord_c, *gcoord_f; float vect[3]; nc_type ncType; gchar *infoUTF8, *name; gboolean *flag; guint nbGrid, nbFGrid, grid[3], *cGrid, *nGrid; size_t dimsGrid[3], dimsNGrid[2]; int varIdGrid, varIdNGrid; VisuBox *box; g_return_val_if_fail(error && *error == (GError*)0, FALSE); g_return_val_if_fail(data && filename, FALSE); res = nqOpen_netcdfFile(filename, &netcdfId, error); if (!res) return FALSE; /* From now on, the file is a NETCDF valid file, so we return TRUE, but errrors can still occurs. */ /********************************/ /* Retrieve the numeral values. */ /********************************/ /* Grep the number of elements. */ if (!nqGetDim(netcdfId, error, varNbElement, &varId, &dimSize)) { nqClose_netcdfFile(netcdfId); return TRUE; } nbEle = (int)dimSize; /* Grep the number of nodes. */ if (!nqGetDim(netcdfId, error, varNbNode, &varId, &dimSize)) { nqClose_netcdfFile(netcdfId); return TRUE; } nbNode = (int)dimSize; /**************************************************************/ /* Check the conformance of the arrays to the specifications. */ /**************************************************************/ /* Check the names of elements. */ dimsSymbols[0] = nbEle; dimsSymbols[1] = 80; if (!nqCheckVar(netcdfId, error, varAtomsNames, &varIdSymbols, NC_CHAR, 2, dimsSymbols)) { g_error_free(*error); *error = (GError*)0; dimsSymbols[1] = 2; if (!nqCheckVar(netcdfId, error, "chemical_symbols", &varIdSymbols, NC_CHAR, 2, dimsSymbols)) { nqClose_netcdfFile(netcdfId); return TRUE; } } /* Check the 'node to element'array. */ dimsNodeToEle = nbNode; if (!nqCheckVar(netcdfId, error, varNodeToEle, &varIdNodeToEle, NC_INT, 1, &dimsNodeToEle)) { nqClose_netcdfFile(netcdfId); return TRUE; } /* Check the reduce coordinates array. */ dimsCoord[0] = nbNode; dimsCoord[1] = 3; if (!nqCheckVar(netcdfId, error, varCoord, &varIdCoord, NC_DOUBLE, 2, dimsCoord)) { nqClose_netcdfFile(netcdfId); return TRUE; } /* Check the rprimd matrix. */ dimsRprimd[0] = 3; dimsRprimd[1] = 3; if (!nqCheckVar(netcdfId, error, varRprimd, &varIdRprimd, NC_DOUBLE, 2, dimsRprimd)) { nqClose_netcdfFile(netcdfId); return TRUE; } /****************************/ /* Retrieve now the arrays. */ /****************************/ /* Grep the names of elements. */ dimsSymbols[0] = 1; symbols = g_malloc(sizeof(char) * (dimsSymbols[1] + 1) * nbEle); for (i = 0; i < nbEle; i++) { start[0] = i; status = nc_get_vara_text(netcdfId, varIdSymbols, start, dimsSymbols, symbols + i * (dimsSymbols[1] + 1)); if (status != NC_NOERR) { *error = g_error_new(NQ_ERROR, NQ_ERROR_FILE_FORMAT, _("Retrieve value for variable '%s': %s."), varAtomsNames, nc_strerror(status)); nqClose_netcdfFile(netcdfId); g_free(symbols); return TRUE; } symbols[(i + 1) * (dimsSymbols[1] + 1) - 1] = '\0'; } dimsSymbols[0] = nbEle; start[0] = 0; /* Grep table from 'node to element'. */ nodeToEle = g_malloc(sizeof(int) * nbNode); status = nc_get_vara_int(netcdfId, varIdNodeToEle, start, &dimsNodeToEle, (int*)nodeToEle); if (status != NC_NOERR) { *error = g_error_new(NQ_ERROR, NQ_ERROR_FILE_FORMAT, _("Retrieve value for variable '%s': %s."), varNodeToEle, nc_strerror(status)); nqClose_netcdfFile(netcdfId); g_free(symbols); g_free(nodeToEle); return TRUE; } for (i = 0; i < nbNode; i++) { /* Specifications 1.3 says that the values range from 1. So we remove 1 to be coherent with C numbering. */ nodeToEle[i] -= 1; if (nodeToEle[i] >= nbEle) { *error = g_error_new(NQ_ERROR, NQ_ERROR_FILE_FORMAT, _("Error in indexing array '%s', index out of bounds."), varNodeToEle); nqClose_netcdfFile(netcdfId); g_free(symbols); g_free(nodeToEle); return TRUE; } } /* Grep the reduced coordinates. */ coord = g_malloc(sizeof(double) * 3 * nbNode); status = nc_get_vara_double(netcdfId, varIdCoord, start, dimsCoord, coord); if (status != NC_NOERR) { *error = g_error_new(NQ_ERROR, NQ_ERROR_FILE_FORMAT, _("Retrieve value for variable '%s': %s."), varCoord, nc_strerror(status)); nqClose_netcdfFile(netcdfId); g_free(symbols); g_free(nodeToEle); g_free(coord); return TRUE; } /* Grep the box definition. */ status = nc_get_vara_double(netcdfId, varIdRprimd, start, dimsRprimd, &rprimd[0][0]); if (status != NC_NOERR) { *error = g_error_new(NQ_ERROR, NQ_ERROR_FILE_FORMAT, _("Retrieve value for variable '%s': %s."), varRprimd, nc_strerror(status)); nqClose_netcdfFile(netcdfId); g_free(symbols); g_free(nodeToEle); g_free(coord); return TRUE; } /* Prepare the arrays for memory allocation in the VisuData object. */ box = visu_box_new_full(rprimd, VISU_BOX_PERIODIC); visu_boxed_setBox(VISU_BOXED(data), VISU_BOXED(box), FALSE); g_object_unref(box); nbNodesPerEle = g_array_sized_new(FALSE, TRUE, sizeof(guint), nbEle); g_array_set_size(nbNodesPerEle, nbEle); for (i = 0; i < nbNode; i++) g_array_index(nbNodesPerEle, guint, nodeToEle[i]) += 1; visuEle = g_array_sized_new(FALSE, FALSE, sizeof(VisuElement*), nbEle); for (i = 0; i < nbEle; i++) { name = g_strstrip(symbols + i * (dimsSymbols[1] + 1)); ele = visu_element_retrieveFromName(name, (gboolean*)0); g_array_append_val(visuEle, ele); } DBG_fprintf(stderr, "NQ structure : File '%s' parsed.\n", filename); DBG_fprintf(stderr, " | box definition : ( %f %f %f )\n", rprimd[0][0], rprimd[0][1], rprimd[0][2]); DBG_fprintf(stderr, " | ( %f %f %f )\n", rprimd[1][0], rprimd[1][1], rprimd[1][2]); DBG_fprintf(stderr, " | ( %f %f %f )\n", rprimd[2][0], rprimd[2][1], rprimd[2][2]); DBG_fprintf(stderr, " | number of nodes per element (%d):\n", nbEle); for (i = 0; i < nbEle ; i++) DBG_fprintf(stderr, " | %d nodes for '%s' (%p)\n", g_array_index(nbNodesPerEle, guint, i), g_array_index(visuEle, VisuElement*, i)->name, g_array_index(visuEle, gpointer, i)); g_free(symbols); visu_node_array_allocate(VISU_NODE_ARRAY(data), visuEle, nbNodesPerEle); for (i = 0; i < nbNode; i++) { vect[0] = coord[3 * i + 0]; vect[1] = coord[3 * i + 1]; vect[2] = coord[3 * i + 2]; visu_data_addNodeFromElement(data, g_array_index(visuEle, VisuElement*, nodeToEle[i]), vect, TRUE, FALSE); } visu_box_setMargin(box, visu_node_array_getMaxElementSize(VISU_NODE_ARRAY(data)) + visu_data_getAllNodeExtens(data, box), TRUE); visu_box_setUnit(box, TOOL_UNITS_BOHR); g_free(nodeToEle); g_free(coord); g_array_free(nbNodesPerEle, TRUE); g_array_free(visuEle, TRUE); /**********************/ /* Optional elements. */ /**********************/ status = nc_inq_att(netcdfId, NC_GLOBAL, varTitle, &ncType, &sizeTitle); if (status == NC_NOERR && ncType == NC_CHAR && sizeTitle < 255) { status = nc_get_att_text(netcdfId, NC_GLOBAL, varTitle, title); if (status == NC_NOERR) { title[sizeTitle] = '\0'; infoUTF8 = g_locale_to_utf8(title, -1, NULL, NULL, NULL); if (infoUTF8) { visu_data_setFileCommentary(data, infoUTF8, 0); g_free(infoUTF8); } else g_warning("Can't convert '%s' to UTF8.\n", title); } } /* Support for BigDFT grid points. */ nbGrid = 0; grid[0] = 0; grid[1] = 0; grid[2] = 0; if (nqGetDim(netcdfId, (GError**)0, "max_number_of_basis_grid_points", &varId, &dimSize)) { nbGrid = (guint)dimSize; if (nqGetDim(netcdfId, (GError**)0, "number_of_grid_points_vector1", &varId, &dimSize)) grid[0] = (guint)dimSize; if (nqGetDim(netcdfId, (GError**)0, "number_of_grid_points_vector2", &varId, &dimSize)) grid[1] = (guint)dimSize; if (nqGetDim(netcdfId, (GError**)0, "number_of_grid_points_vector3", &varId, &dimSize)) grid[2] = (guint)dimSize; if (!grid[0] || !grid[1] || !grid[2]) nbGrid = 0; DBG_fprintf(stderr, "NQ structure: grid is defined (%d) in %dx%dx%d.\n", nbGrid, grid[0], grid[1], grid[2]); dimsGrid[0] = 1; dimsGrid[1] = nbGrid; dimsGrid[2] = 3; if (!nqCheckVar(netcdfId, (GError**)0, "coordinates_of_basis_grid_points", &varIdGrid, NC_INT, 3, dimsGrid)) nbGrid = 0; dimsNGrid[0] = 1; dimsNGrid[1] = nbGrid; if (!nqCheckVar(netcdfId, (GError**)0, "number_of_coefficients_per_grid_point", &varIdNGrid, NC_INT, 2, dimsNGrid)) nbGrid = 0; DBG_fprintf(stderr, "NQ structure: grid is present %d and valid.\n", nbGrid); } if (nbGrid) { nbFGrid = 0; cGrid = g_malloc(sizeof(guint) * nbGrid * 3); nGrid = (guint*)0; status = nc_get_vara_int(netcdfId, varIdGrid, start, dimsGrid, (int*)cGrid); if (status != NC_NOERR) { g_free(cGrid); nbGrid = 0; } else { nGrid = g_malloc(sizeof(guint) * nbGrid); status = nc_get_vara_int(netcdfId, varIdNGrid, start, dimsNGrid, (int*)nGrid); if (status != NC_NOERR) { g_free(cGrid); g_free(nGrid); nbGrid = 0; } else { /* Calculate the number of fine grid points. */ nbFGrid = 0; for (i = 0; i < nbGrid; i++) if (nGrid[i] > 1) nbFGrid += 1; } } DBG_fprintf(stderr, "NQ structure: grid has been read.\n"); if (cGrid && nGrid) { /* Add the grid nodes. */ gcoord_c = g_array_sized_new(FALSE, FALSE, sizeof(gfloat) * 3, nbGrid); gcoord_f = (GArray*)0; if (nbFGrid > 0) gcoord_f = g_array_sized_new(FALSE, FALSE, sizeof(gfloat) * 3, nbFGrid); for (i = 0; i < nbGrid; i++) { vect[0] = (float)cGrid[i * 3 + 0] / (float)grid[0]; vect[1] = (float)cGrid[i * 3 + 1] / (float)grid[1]; vect[2] = (float)cGrid[i * 3 + 2] / (float)grid[2]; g_array_append_val(gcoord_c, vect); if (nGrid[i] > 1) g_array_append_val(gcoord_f, vect); } g_free(cGrid); g_free(nGrid); g_object_set_data_full(G_OBJECT(data), "BigDFT_coarse_grid", (gpointer)gcoord_c, (GDestroyNotify)g_array_unref); if (nbFGrid > 0) g_object_set_data_full(G_OBJECT(data), "BigDFT_fine_grid", (gpointer)gcoord_f, (GDestroyNotify)g_array_unref); } } nqClose_netcdfFile(netcdfId); /******************************************/ /* Add some flags to the VisuData object. */ /******************************************/ flag = g_malloc(sizeof(gboolean)); *flag = TRUE; g_object_set_data_full(G_OBJECT(data), VISU_SCALAR_FIELD_DEFINED_IN_STRUCT_FILE, (gpointer)flag, g_free); return TRUE; } v_sim-3.7.0/lib/plug-ins/nanoquanta-netcdf/nq_structure.h0000644000353400050620000000044012215546173020406 00000000000000#ifndef NQ_STRUCTURE_H #define NQ_STRUCTURE_H #include /** * nqStructuralInit: * * Routine used to create a new loading method for the ETSF file * format. * * Returns: a newly created rendering method. */ void nqStructuralInit(VisuRendering *method); #endif v_sim-3.7.0/lib/plug-ins/nanoquanta-netcdf/nq_density.c0000644000353400050620000002424412215546173020030 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD, Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2005) Adresses mèl : BILLARD, non joignable par mèl ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD and Damien CALISTE and Olivier D'Astier, laboratoire L_Sim, (2001-2005) E-mail addresses : BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "nq_basic.h" #include "nq_density.h" #include #include #include #include #include #include #include /* Local methods. */ gboolean nqDensityLoad(VisuScalarFieldMethod *meth, const gchar *filename, GList **fieldList, GError **error); void nqDensityInit() { const gchar *type[] = {"*.nc", "*-etsf.nc", (char*)0}; const gchar *descr = _("Nanoquanta NETCDF format"); visu_scalar_field_method_new(descr, type, nqDensityLoad, G_PRIORITY_HIGH); } gboolean nqDensityLoad(VisuScalarFieldMethod *meth _U_, const gchar *filename, GList **fieldList, GError **error) { gboolean res; int netcdfId, varId, status, i, j; size_t gridSize[3]; size_t spinDim; size_t realOrComplex; int varIdRprimd; size_t dimsRprimd[2]; double rprimd[3][3]; size_t start[] = {0, 0}; size_t startDensity[] = {0, 0, 0, 0, 0}; int varIdDensity; size_t dimsDensity[5]; GArray *density; double boxGeometry[6]; VisuBox *box; guint size[3]; int option_spin, option_realOrComplex; ToolOption *option; VisuScalarField *field; nc_type ncType; size_t sizeTitle; char title[256]; gchar *comment; #if DEBUG == 1 GTimer *timer; gulong fractionTimer; #endif g_return_val_if_fail(error && *error == (GError*)0, FALSE); g_return_val_if_fail(filename, FALSE); g_return_val_if_fail(*fieldList == (GList*)0, FALSE); res = nqOpen_netcdfFile(filename, &netcdfId, error); if (!res) return FALSE; #if DEBUG == 1 timer = g_timer_new(); g_timer_start(timer); #endif /* ToolOptional elements. */ comment = (gchar*)0; status = nc_inq_att(netcdfId, NC_GLOBAL, "title", &ncType, &sizeTitle); if (status == NC_NOERR && ncType == NC_CHAR && sizeTitle < 255) { status = nc_get_att_text(netcdfId, NC_GLOBAL, "title", title); if (status == NC_NOERR) { title[sizeTitle] = '\0'; comment = g_locale_to_utf8(title, -1, NULL, NULL, NULL); } } /* We parse a first time the options, if given. */ option_spin = -1; option = tool_file_format_getPropertyByName(TOOL_FILE_FORMAT(meth), "number_of_components"); if (option) option_spin = g_value_get_int(tool_option_getValue(option)); option_realOrComplex = -1; option = tool_file_format_getPropertyByName(TOOL_FILE_FORMAT(meth), "real_or_complex"); if (option) option_realOrComplex = g_value_get_int(tool_option_getValue(option)); /* We now have a valid NetCDF file. We check the existence and the shape of all required variables and dimensions. */ /* Get the grid size dimensions. */ if (!nqGetDim(netcdfId, error, "number_of_grid_points_vector1", &varId, gridSize)) { nqClose_netcdfFile(netcdfId); return TRUE; } if (!nqGetDim(netcdfId, error, "number_of_grid_points_vector2", &varId, gridSize + 1)) { nqClose_netcdfFile(netcdfId); return TRUE; } if (!nqGetDim(netcdfId, error, "number_of_grid_points_vector3", &varId, gridSize + 2)) { nqClose_netcdfFile(netcdfId); return TRUE; } size[0] = (int)gridSize[0]; size[1] = (int)gridSize[1]; size[2] = (int)gridSize[2]; /* Get the spin dimension. */ if (!nqGetDim(netcdfId, error, "number_of_components", &varId, &spinDim)) { nqClose_netcdfFile(netcdfId); return TRUE; } /* Get real or complex. */ if (!nqGetDim(netcdfId, error, "real_or_complex_density", &varId, &realOrComplex)) { nqClose_netcdfFile(netcdfId); return TRUE; } /* Check values for spin and realOrComplex. */ if (option_spin >= (int)spinDim) { g_warning("Requested value (%d) of spin component is out of range ([0;%d[).", option_spin, (int)spinDim); option_spin = 0; } if (option_realOrComplex >= (int)realOrComplex) { g_warning("Requested value (%d) of real or complex part is out of range ([0;%d[).", option_realOrComplex, (int)realOrComplex); option_realOrComplex = 0; } DBG_fprintf(stderr, "NQ Density : read dimensions.\n"); DBG_fprintf(stderr, " | grid size (%d ; %d ; %d).\n", size[0], size[1], size[2]); DBG_fprintf(stderr, " | spin components %d.\n", (int)spinDim); DBG_fprintf(stderr, " | real or complex %d.\n", (int)realOrComplex); /* Check the rprimd matrix. */ dimsRprimd[0] = 3; dimsRprimd[1] = 3; if (!nqCheckVar(netcdfId, error, "primitive_vectors", &varIdRprimd, NC_DOUBLE, 2, dimsRprimd)) { nqClose_netcdfFile(netcdfId); return TRUE; } /* Check the density values. */ dimsDensity[0] = spinDim; dimsDensity[1] = gridSize[2]; dimsDensity[2] = gridSize[1]; dimsDensity[3] = gridSize[0]; dimsDensity[4] = realOrComplex; if (!nqCheckVar(netcdfId, error, "density", &varIdDensity, NC_DOUBLE, 5, dimsDensity)) { nqClose_netcdfFile(netcdfId); return TRUE; } /* Ok, everything is OK in the file. We can load it. */ /* Grep the box definition. */ status = nc_get_vara_double(netcdfId, varIdRprimd, start, dimsRprimd, &rprimd[0][0]); if (status != NC_NOERR) { *error = g_error_new(NQ_ERROR, NQ_ERROR_FILE_FORMAT, _("Retrieve value for variable 'primitive_vectors': %s."), nc_strerror(status)); nqClose_netcdfFile(netcdfId); return TRUE; } res = tool_matrix_reducePrimitiveVectors(boxGeometry, rprimd); if (!res) { *error = g_error_new(NQ_ERROR, NQ_ERROR_FILE_FORMAT, _("The variable 'primitive_vectors' is not well formed" " (the basis is not 3D).")); nqClose_netcdfFile(netcdfId); return TRUE; } /* Get one part of the density. */ density = g_array_sized_new(FALSE, FALSE, sizeof(double), gridSize[2] * gridSize[1] * gridSize[0]); density = g_array_set_size(density, gridSize[2] * gridSize[1] * gridSize[0]); for (i = (option_spin < 0)?0:option_spin ; i < ((option_spin < 0)?(int)spinDim:option_spin + 1) ; i++) for (j = (option_realOrComplex < 0)?0:option_realOrComplex ; j < ((option_realOrComplex < 0)?(int)realOrComplex:option_realOrComplex + 1) ; j++) { startDensity[0] = i; startDensity[4] = j; dimsDensity[0] = 1; dimsDensity[4] = 1; status = nc_get_vara_double(netcdfId, varIdDensity, startDensity, dimsDensity, (double*)density->data); if (status != NC_NOERR) { *error = g_error_new(NQ_ERROR, NQ_ERROR_FILE_FORMAT, _("Retrieve value for variable 'density': %s."), nc_strerror(status)); nqClose_netcdfFile(netcdfId); g_array_unref(density); return TRUE; } /* Ok, now everything is in memory, we can populate the field object. */ field = visu_scalar_field_new(filename); if (!field) g_warning("impossible to create a VisuScalarField object."); else { visu_scalar_field_setCommentary(field, comment); box = visu_box_new(boxGeometry, VISU_BOX_PERIODIC); visu_box_setMargin(box, 0.f, FALSE); visu_boxed_setBox(VISU_BOXED(field), VISU_BOXED(box), FALSE); g_object_unref(box); visu_scalar_field_setGridSize(field, size); DBG_fprintf(stderr, "NQ Density : transfer density into field object.\n"); visu_scalar_field_setData(field, density, TRUE); if ((int)spinDim == 1) option = tool_option_new("number_of_components", _("1, no spin information"), G_TYPE_INT); else if ((int)spinDim == 2) option = tool_option_new("number_of_components", _("1, spin-up ; 2, spin-down"), G_TYPE_INT); else if ((int)spinDim == 4) option = tool_option_new("number_of_components", _("1, average density ; " "[2;4], magnetisation vector"), G_TYPE_INT); else option = tool_option_new("number_of_components", _("unknown value"), G_TYPE_INT); g_value_set_int(tool_option_getValue(option), i + 1); visu_scalar_field_addOption(field, option); *fieldList = g_list_append(*fieldList, (gpointer)field); } } g_array_unref(density); if (comment) g_free(comment); #if DEBUG == 1 g_timer_stop(timer); fprintf(stderr, "ETSF: density parsed in %g milli-s.\n", g_timer_elapsed(timer, &fractionTimer)/1e-3); g_timer_destroy(timer); #endif nqClose_netcdfFile(netcdfId); return TRUE; } v_sim-3.7.0/lib/plug-ins/nanoquanta-netcdf/nq_density.h0000644000353400050620000000374212215546173020035 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD, Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2005) Adresses mèl : BILLARD, non joignable par mèl ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD and Damien CALISTE and Olivier D'Astier, laboratoire L_Sim, (2001-2005) E-mail addresses : BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. D'ASTIER, dastier AT iie P cnam P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef NQ_DENSITY_H /** * nqDensityInit: * * Routine used to declare the density file format to V_Sim. */ void nqDensityInit(); #endif v_sim-3.7.0/lib/plug-ins/nanoquanta-netcdf/nq-netcdf.nc0000644000353400050620000000170412215546173017704 00000000000000CDF number_of_atom_speciesnumber_of_atomscharacter_string_lengthPnumber_of_reduced_dimensionsnumber_of_vectors  file_formatETSF Nanoquantafile_format_version?333333 Conventionshttp://www.etsf.eu/fileformatstitle#Silane molecule generated by ncgen. atom_species_namesP atom_speciesreduced_atom_positionsxprimitive_vectorsH|SiH????333333?333333?333333?ٙ?ٙ?333333?333333?ٙ?ٙ?ٙ?333333?ٙ@$@$@$v_sim-3.7.0/lib/plug-ins/nanoquanta-netcdf/nq-netcdf.cdl0000644000353400050620000000157012215546173020047 00000000000000netcdf Test { dimensions: number_of_atom_species = 2; number_of_atoms = 5; character_string_length = 80; number_of_reduced_dimensions = 3; number_of_vectors = 3; variables: char atom_species_names(number_of_atom_species, character_string_length); int atom_species(number_of_atoms); double reduced_atom_positions(number_of_atoms, number_of_reduced_dimensions); double primitive_vectors(number_of_vectors, number_of_reduced_dimensions); // Global attributes :file_format = "ETSF Nanoquanta"; :tool_file_format_version = 1.2; :Conventions = "http://www.etsf.eu/fileformats"; :title = "Silane molecule generated by ncgen."; data: atom_species_names = "Si", "H"; atom_species = 1, 2, 2, 2, 2; reduced_atom_positions = 0.5, 0.5, 0.5, 0.6, 0.6, 0.6, 0.4, 0.4, 0.6, 0.6, 0.4, 0.4, 0.4, 0.6, 0.4; primitive_vectors = 10., 0., 0., 0., 10., 0., 0., 0., 10.; } v_sim-3.7.0/lib/plug-ins/nanoquanta-netcdf/silane.nc0000644000353400050620000107700012215546173017303 00000000000000CDF character_string_lengthPmax_number_of_angular_momentamax_number_of_coefficientsmax_number_of_projectorsmax_number_of_statesnumber_of_atomsnumber_of_atom_speciesnumber_of_cartesian_directionsnumber_of_componentsnumber_of_grid_points_vector1number_of_grid_points_vector2number_of_grid_points_vector3number_of_kpointsnumber_of_reduced_dimensionsnumber_of_spinor_componentsnumber_of_spinsnumber_of_symmetry_operationsnumber_of_vectorsreal_or_complex_density symbol_lengthnpsp codvsnlen rhoijdim1 psptitlen  file_formatETSF Nanoquantafile_format_version?ff Conventionshttp://www.etsf.eu/fileformats/titleSilane molecule - ABINIT 5.3.3historyABINIT generated file : space_groupprimitive_vectorsHreduced_symmetry_matrices  symmorphicyes$`reduced_symmetry_translations  atom_speciesreduced_atom_positions xvalence_charges(atomic_numbers8atom_species_namesHchemical_symbolspseudopotential_typesnumber_of_electronsexchange_functionalPcorrelation_functionalP fermi_energy units atomic unitsscale_to_atomic_units?0smearing_schemeP8smearing_width units atomic unitsscale_to_atomic_units?number_of_states  eigenvalues  units atomic unitsscale_to_atomic_units? occupations `kpoint_grid_shift  kpoint_grid_vectors H8monkhorst_pack_folding reduced_coordinates_of_kpoints `kpoint_weights   basis_setP kinetic_energy_cutoff units atomic unitsscale_to_atomic_units?\number_of_coefficients  k_dependentyesd"reduced_coordinates_of_plane_waves   k_dependentyestdate/codvsn/ecut_eff/ecutsm/etot/headform/fform/intxc/ixc/occopt/pertcase/residm/stmbias/tphysel/tsmear/ecutdg/usepaw/pspcod/pspdat/pspso/pspxc0qptn 0 so_typat0$symafm0,title00znuclpsp18lmn_size1Hrhoij1Pdensity  units atomic unitsscale_to_atomic_units?K2@@$@$@$?????|hs??|hs??|hs?Ձ$/?Ձ$/??|hs??|hs?Ձ$/?Ձ$/?Ձ$/??|hs?Ձ$/@?@,?Si HSi HGoedecker-Teter-Hutter Fri May 31 17:22:04 EDT 1996Goedecker-Teter-Hutter Wed May 8 14:27:44 EDT 1996j3]Fermi-Dirac?6C-GGGGGGGGGGGGGGGGGGGGGGGG@@??@@??y@@@?y@@@?GGGGGGGGGGGG????????????plane_waves@$ۀ2"5.3@$|i,4>MBM.K?6C-@$Goedecker-Teter-Hutter Fri May 31 17:22:04 EDT 1996 Goedecker-Teter-Hutter Wed May 8 14:27:44 EDT 1996 @,?GGGGGGGGGGGGGGGGGGGGGGGGGGGGGG>I4>1G>i>2>hJ4>nX?fBG/?wRiz? H?#\f?,?#R?Kq?Aʘ?ir"=?SX?i?Ab?%%Q?ˮ~ ?mS?eԅiO>A.#>ff >cv c>+e>1>q>0#>e/h>?1>ub>(Śh?iv?^@_?ҙ$ޢ? ^o?(U?% o?0?K5)i=?qg?^il?WE?_&?q,?KS?1E2?%Ƽ?ҌUP? z<>ф?22zܛ?@?oÉK>&^5>>I /2_>>'ƻG>d7Sz>C>>DT,>+fMH>B1H>ANkZ?K? >? \nR?0Z3s? R^u?ڍk#?{Uc<2?Ď Ǽ?=#? ۆ?0?0_?"?Q#T?{/?ڊa? ys?/g? [&!?#?Iis>>v">g[>*c->=쩀>ӽ">mW>ܦ'>?׈Ai4?0ڳk? "X0??Ul]?kAA_?WCo?/OO?9{?nkfo?hs͗?Wӳxu?hRf=?n*@?Pn>Ԭ\>3>cB>̋K>>4?^?&_ ?|!?F8?[-D=?ˤD/? n1/R?"̵?$&[_L?$T%?$CJ?$+`?$?$xȆ,?${I?$՟?$%Y ?" K? m;?sk?Kډ=^n)> sw>Dw9??4ӡ?x(?/s1?jb?VT^?8Lһ?̯?#pS?'|oQ1?*hL ?,d u0?-ݯJ?->߲r?,@IO?,N}g?,Չ4B?-(??-vq'?,c3T.?*9J?'{V?#BX?}t?7cٚ}?Ir"??.K?P3??b!]?'!L?q+? ،Y?gt_?7rm? z?%s8t?*^}?/8?1.Wf?2O F?3]ckN?3^M$?37K?3"ʶ'7?37_up?3^qK4?f? eǬ?e}? f?]}ES?m? X9>M?}`}?]?$?%r_?+F?15?4N?68?8o/m~?8%?8&?8¿?8Ճ6?8?8pZI!?8 J?8A?6G w?4M=?15+[?+ ?%rKV?h?u?E=?}̴? X|r?/u? F@e@? ?*%?R@_?m\?#L?*Bi9?15/]n?5C[x?8$Oh?;$KG?>`qkh?>` ?>Zunf?>`dᐺ_?>`37a?>#}?=[> ?;A?8;FT?5C`~?15(?*@;kW?#r|?39c?R?+>? S_? Ak?V]?De?g=? l?)ۓ?'zwĩ9?/KY?4MdV/?8)'?@`w?;d?6^?1.P@?*,u4?"?։?T g?'1-b?Fb=?{j?F>[?E֓{3)?E,F~?D:\C9?Br~9?AOh?=Z7Q?8>%?2H?,a'AKG?$$,efn?ݱ?wr,K?,n?Ko?FeS"?|8 ?R?$Fk?-Ų?3[z g?8?>"?AT'2?Cȍ?E,1Uԛ?FCAv?Fe{?GI}~4?Gc {4?GI+?FQ?FC/ ?E,&d?C.?A' ]_?>"I?8Goz?3\.?-;?q?$ kU? 6 ?14x?F_d?;ȪME?kѾ#?tt?hz2j?$xkz?-]M-?3\ ?8cA3?>^v*y?A[@?D$e?ECcA?F+T?G}U ?GVRg?GǵJF"?GP\?Gv^7f?F*;n?EKe?D%LC?Awr Y?>_={?8j'f?3]_]?-h?$؝ټM?i?#0?l#i?cZ?Y? d?b{w?$d}?,J8fL?35s?8٠^?>^&?B4?DyHWμ?F>"wm_?GIcM?G'NSF?G] ?G׵ux+?G[d?G'd?GIjA?F>1Oc?Dy^`??BQ|8L9?>_08?886)?36?,K ?$ =?cZ-? b?Yg,mnO?NLlY?h\t4?*?R Ķ4?$l9 (?,r?3!?8蜮?>Xd7/@?Bs ?D[?Fa}2?Gbn}x?Ge8Z?Gב/?G+4?Gב74?Gh:Y?Gby2?Fa $-?D.ݳa?BY+k?8so5?3!Pc?, ,?$ ϓ?R@U?+Z^UX?B1?Dy6jG?F>ɳ?GI4?G??G#X?Gv?G!9H6C?G{␄?GI=?F> FV?DyB]?B_8'?8#D4?364r?,9?$PQ?c^qf&?? |W?Y~?<!UI/?lJ8M?O?iaoQ?$؆b3D?-OT|?3]Q3D?8U#F?>_?AV7?D${?E E?F]Y?Gvt?GA>?GCo:D?G}%?GV?FՒ?E\~?D$ٞc?AX΁?>_[Ë?8O?3]OB?-Z/%?$؜#w?iіi??6U?lZE"?y?G:-?tR?Tϛ[?$qRB?-eqQ?3\5G?8XV?>",8?AS?C}D?E+ۀ֓?FBɆ?Fi=?GI/Za\L?Gb{vZ?GI6yOSS?FQ?FB?|6?E+U9Z?Clj`?AW?>">b?8>gdo;o?Fa]<;#?F>ĉ?E+e6O?E,e?D:5#?Bdk.i?AP~%?=ZAq!?8cٿ?2?,Yy?,a,?$$`M?c?wӖ?- `D?*;$,?"F-p?wX,?Tj(?"ͼ5?*T%?1aw?6^Y?;S.?@2mN?AO?Akr?A92??Ab?B|$ ?B8?Bv?Aǟ('?A~窏?A4W?@#Qvy?=#Zk,?8T(sA?4N1$?/>(ؘ?'{? mM U?iG0~?X5?ӊZ? tv+? ?.P_i?T9=,?>?A?#X?*|^V?15׸3I?5Djp?8G@R?;7?=[G+_f?>#d4=?>_.H?>_©9?>ZeZC?>`m?>`MF!* ?>$?=\?[T?; +?8,i?5D?15t}?*\`?#?D(o?Sc?-o? 4VS?"?]h'? [;D?q?a?b?37?3_=!!?3]A?26?1"!?/x3?*)qz?%t]D? *4K?9a? ? S? ?>f>[?E7?ʥ?2Bcg? ڕwz?7dd?:*ka?q??#C ?'||1V?*SM?,cʜ ?-#)'?-?Զ`>f*O>-{E>B{A?Y?r >A_I >" >n>9Aw>x]>B^?yCAwK?3I1? %? D?U U?kt?WX3#A?%ED ?E?mf0K?hTz#?X??iqZ`?p qq?r:?*8;@?Z:?m?Wg۔?~Wa? Ц?3z?r?ϖ>Ϙ[>Ut>QĘ8>>? N>-l$>i>Cփ*W?T^?+f? ]d?1_ow? ߝ?ڄؕ?{1Zd?d[?Ț.??0+s?R|?OCu?j+?}rM-y?ܳ\? !@&?443? _Q?D?(fݢj>B>D:*e>,z-?>?\P>2 ,.>fWM>@e/>Z04>kz$?z?&(?G?O? ӄv?_ ?%ۆ?0~A?K;QSs?q%?^V?/- ]?_~.?rG*?L?20&.B?&? S? 뽪?Ji?'Z?.S>>>?9 %>e=>1_W>fy?;a>@PiU>mo/>шJR?%@?q?†c? 8)?ub?$fx?/ه5?J ?oc;?]V;%?Ɯf?]?pxS$?K n5?0w?%-bVP?J:d? (E -?D@a?e%6?2l\>,JC>p>>_s>dH>d;)>L$sD>r>i 8>z>50'??\ 3? uPn?߸00?~?ײRp?\?qUW?S?80V?{?+?Wz?б?i[?Ƨ?1? Etz?#b?"!>)zRr>7f,>aPt>Jr>>>%CV>i cZ>wW?>#1U?a?ܹ*?*? a%?b[E?jMY??W /?pt?NJ?DKMB`?8,x? Np?™?Nm>X?*980?H)&]?yF3?zzt? :!?Bϳ0S? >4>gjR> 9d>%\.>ud>gdϺ>vD>KDmu>`r?k]Z?F qL8? ,$? ΏH`?f]?)}E?5Osl ?g?/=K?s̝#? 4?"C ?#R?!~a >?4P&?#ZN?g~ɋ?8*?3q?+>Eom>6ºͣ3>̕!C>ww2AI> x>? ⋉w? nL? ĐҸ?׈<?3T1W?W$)?l5ܤ?k? &?"W%Z?$0?'ǹ~?+3F?-wf'?//4c +?/:V^?-~4N?+0X?'wʂUߐ?#?FQr?,GE=?&շ?Qr?V? z;>u+?bcf>0?_&?RH?? C0/L?}D=o?xo?U`?u'u_?"Nf ?$]t \?&]q!?) nR?,bJA ?0ݡ?3ɱn?4q3^?5`?5#?4%(?3*jF?0`ߦ?+cx%?%t\y?o4 ?&?$-V?A.?4 J?QY?Kխe? ?C܅? E䯇?TL?.`Of? 1Q?!)0?$u'ڢ?(r+?**?-Z?0ʸ?3UB?6=Tܗj?9E֎?;0k??`?!Z?&ng{B&?+f??/ ?1Zer_?3gC ZX?5ٮ?9{eJ? Ѕ?B];?DeI?FӲw?Hdr?I^M@ 5?IoA9Jz?Hb?F4L3b?C- w??Be?9,ܵ)i?3*ezr?+/`c?!ЦF?Fhr?1?'?!;??Z?'A?|Cx?"MW_?(+~ ?/ .?3lt9%?7#(R?:d`拹?=zWm=?@p?C5ki?E; >?GEh?I(C?KpIRN?LS.`~J?L3U(?J@Q?HbjJ ?D ?AE!261?;tP?4?-ݑ?#?') ?[M8ړ?,o ?Ԡe?}{?2m4?L4?$[|?*<+HK?1YK?5>no?9`f?=,s?@ͷB?B y6*?E/(;?GK?JZ:f?L2eW#?M(?N9dQ?M] {?L3Bβ?Io"0?EԠ<ɾ?An1?< ?5׀?/9o[[?${S?KuvZ)?#O?Ft"(?Y"K?T P?d\1_? oa?&[?-K?3f@JȾ?8pdځ=?=@*P?@ n?Buǡ?DR?G#~}-$?Ic! ?Kou?M0w ?NwNTq?NLdE?N9KP.?LSL?I^J?E$e?Ak)?)??LQx.?L}?L!?LGHF"?KoKB?Jrh?GC?DA?Ah??6|?GAQx?E.[:,?B-hD?@?=XH?9TF?5iēM?1Z>54|?*2?$\"a`{??3tJ?~DCJ?ZP~?!P98?tK?(9+j?#h_"?-,3( ?4?;uCQ?AEWiE ?Dr[?Hb?JfLJ?L3?LRżo?Koyќ?IڈU?G5Q?E[\#?C4-:?@r<,?=ƚ K?:d,p\?7#8QM?3l. >?/ S ?(0?"Mǐ`^?">?'|3?S*?,j?5̽w?ؘ?F=?!J{j?+0L?3+q?9-@W??aY(?C-Z/?F4yQ?Hbg ?Iop?I]%ߘ?Hd)?F$F?DLg?B#?@Z?=As?9oT?7#fEsX?4F'2lE>62 >4? rWV$?}E?kzz?:?0+.?#AE?'yQե?+1ڨq ?-7'po?/:E?//$~?-=S?+3?'ɾ?$k!?"I`? SÕ?< &?u?Z{j?5Lo?fN? z?oq/(L? .s(X>Ʀ>"9Մ>yr>u>:OR>Do"?U@8?G??jN6?+?erO;?!H/;?#Y?$}k?$_^o?#)5?"&|H0? V}?t ?0VSm?i2?7!?+ ͔[?P^ۑ? Ц00? 1v ?Gy&?D.>}c>L͔>wsc>hHH>?sB.>܆> i>d!? n?FF? k?|dY>"?Pq?Ig?*i?NLQ?`]?Ϡ8z?8u[?E7 [?OJQ?r;=?Y!#6vN>wׯ>ምG>E!>f,s >->XL[>; Σ>V@Q?%T?e퓸? }#?Pa?NsG?,?&'?WGm?*?WLDU?8e47XQ >yg/MX7>hp5a>렬4%>0>%l&>@\>-"&QI>1E(Z>D\̌?;?1? ]َ?0N(5? vzK?Vjz?y^_?9[?7p3? 5\?-YN? 0&9?䱘=E??z+6T?٨?T[?/6N? [<S?S ?0&>?G V>T L>+>>o@>>{QG>>H>y_>%ء%?b-?ݟ'h?BL? aڴ׌f?$?u|L? }?Vvs֦?oAu#?M:HՒ?Cs⨼^?7hwDe?s^?W%?MiJ` ?)Ҡ?G,?e 9?z1k? ?Bޥʅ? voz>6OR> %>U9>+@V>lW`>D*>[>!n>}&c?)ո[.e?Z? Y?]b? ?6*?&?VqT?>4?SBZ%? 96 &n?"Pytve?#789?$oh?$,.?$9?"~C!? g@YSw?T?Lra?j@&? P -y~??rn=> %! >ZQM>v'W>բGh>-3?>@? \y?wHI?;]-T? jҺ?PAH@?wTa?CͩQ$?@? YӅ?#E?'?6J?+vنU?.VKz?0*K ?0t`u?/_Ų ?-T&?)MM?$8gb? D[?*{r3?=? ]?QgX>c>>N?v>!)`>Go>mr?XXr?Ƽ.N?O[qT? _?%?%0ΐ.??-?"-9 hT?& f?+ng[59$?0k.yl`Z? ]St?&cZE?b{ k?@650?@tJ?@.:?>f.?:Ak?6/??1(}?*@u`N?"LzI?*[?u?5ҋgD?-G?"}Xc?F7\(?C?6"ʿ?Ӷ?uт?Nw? 7ٚP?$^?*H?0y?4ƍx?9cAߖ??u?CQo?Ho\@?MFH]5?Qs ?SK~?VL^̤?X5"* 8?Xחe?WO>?UqC] ?QVE[1?LZ$?Eþu?@.qP?7tS?/?$)ʑ?'˥?w~h?}юa?=*?Bx_?pB%7?#4UC?(,t(?0tZ)?5,UN&?:/3!??u ?C ?/&_?5QO?;.j$%?@Ҋ?C\Y?G;q-?KPM?OE~?Q[?SP?V'?X :?Yf@?YFA?X5_ ?U{3Ձ?QNf?L.LZ?E ?@6fmD?774ʥM?0*_ -?$>?XJ?0?m=ί9?nU? ȟV4)?& x?-}J ?4TC?;P?A:c]Vu*?D?Hnd?K#}?Opߍ5?Q"GP?Sx7(?TU`s?V=Q@?Wa칾E?X xs?W .I?VL7x?S?Pg>A{?J ??D8nZ?>{G2?6@al?.U :&Q?#X$?F-,*? ⏲?J?QU!r m? 7IC?@7;n? ?4h80?"GT?+$81?3$|Қ?;iho?B ۪t?G*=?LB%?Q_OT?S!G?UK8?VMc?V=l?Vm%?U)oQ ?T`Y?Sx *?Q|$k*?PZSF7?MF ?Id_`w?EyTk?@cdn?9$?3 }l:?+mm֒?#g?Q~wD4?Jo?ɪV?&S?#dip?.T-?6@sA-d?>z+r?DcPy?J n{?Pg il?Sf?VK0T?WÐ?X >֧?Wa?V S?V=` ?T?Sxmh?Qq?O`*y?K\?HnXQH?D3SH?A:*?;CV?4T7H`?-6?& 6RP? ?Kԛ?m1 Y3?]?'}8?$i|,?0*2QM?7(Ƙ?@6?Q?Eۧ?L.{7+?Qw7Cs?Uzu8?X4B?{e?Y:挜?Yfp?X :p?V|f?S'?Qd"f?O~#ɱ?KPoJ=?G;((?C2]t?@ 9?;.7U?5(U?/;J?' D?",v?mѐ?Th%?T@w ?wMj@{?K2awb?$dx!-?0s{?8#8?@H S?FuF?M՜e?RxU8?V);TC?XM-fB?Zi?Y ?Wεd?UK$V\?RX?PZP){?KA?G; ƀ?C ÿ??uGX?:R?5,e@c?0tAL1?(H?#4|>]?mM?BR:?NP)?}ٯ?3 c?'-?$=?/l?73{?@.?E?LZL?QF ?Uq"|?WNOB?XSWN!y?X4zD?VKA?Srq?Q 9?ME?Hn;?CuM??u<ɡ?9b?4Ӯ3 ?0~?*a\ ?$v? 8NHF? y3?vK+?* ?Oѡ? ^?Fq?"}W?- R?5V?_?>{?Dj~?J5la?PXՊ?S^?Uq*?V)HY?U{6?SfHn?Q_L} ?M4`5?Id;J?D`?@n,a?:3?4ӴuѮ?1 &1o?+.}?&%X?!S=?o)\?$#&?OI'? N ?d#/M?,6Y5?? Zڔ?)/I}?3##%U?:R31?A'w?FZw?K Nc?PX@:?QVh?RxgBX?Q6?PgY?L5?H;(?E<^?A:_͗v?;.(&?5,uN*?0jg;r?+!,&X?&=[?"`:{v?7?q8FŽ?وd6[? izO? VmdM? ^V? Z?z܃KѦ?^p ?$?/!?60JPG?=Ge?Bk&?F}?J\^;?LZڔC?M[I?L.hAG?J z<9?G*kAk?D%k?@AQr+?;;L?5Cxav?0uSf&6?* A??&&N*ޔ?"`w??W%?:GQ7?(GK? *lj~?9o J?X4P?)"?Mv? .Vʬ?נR? F衈F?(ܒp?1U?7M2|?=GX ?Aшz?D ?E<?F1C?E?Dԇ?B ??p?9\n?4UQ?/>O?(a|u?$C۝1?!Th ??ʹP_?tLK? fuj? tL?uc6?'Bc1?P?Ov?DM'? ph%?-_Zd?"M'#?*B0?1c- ?60mg?:˧"W?>R?@/?@O?@6+ە+?>{0<"?;j3Ed?7ps/?3 Ϋ&?-5%)?'oK?#5wjK>z?` >ANm;? ,X5? `ֶ?y?Hca?"N4h?(z y?/IhH?3#K?5Ӗ &?7@Z?8$[ T?7As:?6Av:w?3 X ?0B j"L?+ni}a3 ?&c37?"-q=?l?c?&ǽ?=AQ? 2.?p6/?VDE?X}"M>;>yۦ:>"!ą>Av>n?0? #u?o?. ? FٍҜ?$%4?)?- ?/q?0t|=ϟ?0*D>?.U&?+?'?r$?#Kk? H;`*?@ ?EXߓ?y/?R9NU*d? l?&B>->jܸg>w}Z;Go>,`>|?ul?d? $T}?7xA?C ]?oR? ב?"~/?$Hp)?$`^e?$ju?#-?"!5Ac? 99bl?Tj*7? ޫW=?Wj.q?c? k? t.? Y?Zxo?)Z$>{뭨?2>戦cb>b>C!Cn>r6>?w>5̵>\w+>? ~}+?G%? T ~?|e?aê?H z?*qֳG?Mo?f >8?m2|$K?7?CC֩?M`(C?pgU/?WAy???hQs? aVټ??V e?`3;L>!2>vj@>ul> >m*S>9%P>~ӳ~1>%xz?ڡi . ?4 3ݒt? ;Pu?ߗ=?UTa?j ?UCl?c?Y?j>s?dn?Sɟ?deؓ#?jcI4?U? ei?U?iY=4?SӁ%?~Q? ?/`j'?֦Hɾ>ϓz>V$>%̬q>'>iے~>yt\=>O~pB>sZi*Y?[<d?H.+? /ULd? >z 8>8l>JG>x o)>Uy>/y#0>ԭ? >?x)[PU?<15p? k>S;+?Pܚq?w'\ԡ?C׹U?=" ? 0 h?#s?'>49?+P\?.U-!?0*@?0t:-y?/3?-F'2?)G_?$;8? DkN?*qݮ?? NC?UQ%E><ӳ >oN>LoK>.>hA>uؒv?9 Y?ڞ`? C3?|{J?E?3\ :?`Yk?";?&$*?+ M1*?1 N?4(]?6'3?8S~?8 ?8{q?6RQs?39?0|̃ ?)TuD?#1GaJ??b&J? m?? J;`>K,>~a>sZ>'?+Z7?ˢ(? uK?N?_/}R ?0 ?"(m-D?'A?.IRV?3?8rM?<+}?@/O?Am2` ?B5!?A^?@Z?=!P?8N`?3B??,Wh +?$*uW?E?;k7?һz?/Ȝԑ,?P#? t(?IL?׾?S ? #Q!a?v2??T/o?!p?'>b?/$`?5dT?;Å,a?A4a?Dt2d3?FƱT?H?I&Ը?I&̥?GD?DBP?A=! ?;^i?4Xw?,bt9?#Cfuq?*[^?GM7~ ? 7ڶ?D$5?ui?n?}? `4?B^?]?jN?"s*?'nE??/7?5 .Y?=HN?B+?G1?KaS/?PqO?Q6h?RڧA?RfM?Q,H?M1SQ?G#?B#8yt?;c^)?3C?)cjk? D=/?gCs?~H? M?9?  ? l(?vNͫ?M1RRD?Du?=!ף+?3$h?) 0(?n g?h?űI?O!Qq?@lХ?^Q?Tq^?"o;?(3Ӝ?dZ??e4f?eh2;?c0z?_ҿ~?W%?Qﶼs\?G9W?@Kܝ^?64?-frDz?! +?T*ïf?'d?v-03g?ɣi?+?5?<6Dz2?A|fy?FOQ=,?L gm?Qv؊?U1#?YT _b?^q/c?bg3E5?e&?huHM?i͐?h4J?e#p#?a殉P#?Z#?RqHA?I5?B^5?8k]?0s8 h?${$ T"?g6`?d}I [?;F?"2?'@;F?/} {?54F?=?CHQv2?G߲wPz?L/?Qv }?T礏)?Xw?\ ?sި?`/L> ?bs?eG?g:=?hu:ż?gs2a?dm?`~?YW)>>?QME?H/SCp?FƊJ?@.~BF?6P ?.TT/?#f*?bB?o:T!?#V0+?+&]@?3yv,?;߱2 ?B(M?HuI?OYL?S=dk?Vel?YSۊU?\ Z?^zr?`j$3L?aBWl?avh'ˁ?b?bۿ?bg=?a)%p?^h`w?X@u?p?R2%??Kn?DQ!?<تz?4(WҪ?+X/p?"&\'?Q+? ǺbC?'={28?1mY?8;a?AM?G04F?N%?So?Xn6?[1?^qMrb?`/+4?`@ ?aB`:t?aeea?aBz?`x?`/+(Z?^qD7E?[C+ƪ?X&DJ?Sùk}w?NӂZ?G1d:ꞌ?A?8mʇ?1s?'>rƴ? ԭ?bl`L?"-.R?+˗s?4'V?< K?D]?K~{M?Rˤu7:)?XZ'n?^ ?a)[*?bf ?bBf?bj2?aj^?aBzU?`j)1y?^}GY?\ A?YSa?Vebf6?S=cu8?OcP-?H=Ƈ'?B@W?;cH=5?3+)?+w?#%2ȴ?o)p&?h~H?#@?.T-*TI?6;صV?@.l?F O?P>O?V[g>uL?] ?b,(?d;?eǀ?e03?d<~?b㧂k ?`*?^tr\?[c??Xw9Dׂ?U1|nj?R)S?N"?I/9c.?C?=v?5dB?.Fjf?&$2T&? ȏ ?+ :?"$'M?$@g?0)Zu7?8S P?AmnR/?H]z2?QƬBv?YVx?`}7L:?dS?gr?hur"?g C?e?b͛L?`/!E?\ 0IK?Xw-tQ?T]Z?QvXI?Lb8+?Gߥ,2?CH`ө?=L3rx?5Rs-?/ ?'@b?"B???d*?s߆?${nئ ?0sr;?8I?Bٱś?Ij?R!V?ZR 8?ai[U?e?hcOb]?i_R?hu i?eǎMm?bf'?^q-?YS3;?U1j|)?QvL*?L J1Y?FOENw?A\ 4E?<6A?5':q?/=B?'> .?"(A4?_M*[?Ä́u?212?SX]?#{@r;?/1YeO?8z 3?A{@?I\?R;'E?ZcU?az?eh4[;?gT]|?hqhx?gsa ?d̘"?a)hKM?[]?Vd?R)0|C?L4F?FO1A?AF; Ƽ?:J:ν?4|'P?/P좫?'ntN?!ש?Pz ?\/3 ?uxЛ?'q?h=*v?!ТJ;#?-Q*?6X)?@T$s?G ?Q#c?WozD?_q Q^?c0p ?ehB<?e_J?d֣?b,Y?^'Xc?XE?S=P ?NQѥ?Ggg?A;ڛ?:J:?3;?/A0?(3at'?"/u?Tt/?^b`?[HBH?Oq.?Q?S X,?ܔA?)\3?3y3-?="N1Z?D} I?M1?Tc?Z&ʬ/?_?a+&i ?aIu?`ޝ^&?]c?X4e?St ?O=x?I/|T?CH"?<6{Z`?4|X?/?( 66?#7\̩?jrm?3\?J?cy? hUL +? j?~};?z?$B@?0#.?8Oj}!?A|?G~|޷?O|Ӊ?Tz8[?W%Ϯ"E?Zc1M?ZݓH?(3taC?#N]o$?2馺 ?]Q?vv⤼? o ? ĶH@?9X.8x? ? '?h\v^? EwSҾ?)]?3D$0%ڜ?; RQa?B#xF?GD U?M1);?Q(I?RXQo@?R`JX?Q/?P*]?K={?G1/C?BQa?=?d=m?5C?/?'nq?"㸙?ky> ?3d?? V;?ʟp֑?Ղ?ul?D3f?0?ķ3?,٥*?# a?,Оs?4YJeP?;D?A _[?Dm{Y?G^?IT~?I?Hbp?FVFD?DB?A߽?;?5dbk2?/,?'>cg?!MOU?U ?IӄG?w? L ?Sfg?I ץ?T? u9?v?E{? ?mQ7?6ˋI?$,eZ?,@]?3D)8?8P!t #?=#8z!?@t?Aܷ^?B"rҽNi?> ->ATqV>1g>q*?!M? #|+?e?`=?# ?)v?0?3i_H,?6{?8{QE?8/U?8S-?6neU?4(n?1=Ar?+?&$?"r ?a--T?+-?%?-(? }'a?? R">Q>Ϧ>-yc)>L?>co>=b?? $^;?q?.z}? GJ|?#7,5? Ɋ*?%q?CUM.?w̐[T?Quۿ? j@P?:s ?v@g"&? ?$T>5W>,w>l@9e>w]@>H>;>]>']R?TV?i?2?j^s?cR?x*:>KS؍>v)K)>hO>h>k>EN? c?"?#?U? ?p7?_? m_*_?"_3?$$oZlp?$@N>S>sZ'>5}?>{1;>&>3ћ!>]Q ?/y?V`I ? ?s>??4EL?WO?[?RH? !M] ?"ľe?$pg?'m\?+1s?-ģSТ?/-[4}?/9GR?-֫*g?+0Rqt?'wXu ?#? ?,s?w7?J?? R){P? @1'>I>ApKX>$ GP>~U>9T??Z(M?:j\?:hR? tgv>?g%.b>z,>>t@(z?Y4?̺'? O=#?;]O?_?M ?"( ?'@z0%?.{?3ɍϜq?8/r?<؀q?@.A5?Amb?BZYb?A1?@Us?=!ݧ$?8NcM?3C ,i\d?,xe ?$*5?/-?gmO??詌>? Ƽs?Y>F>L:?1 #?PP?Tf?MWF ?yX?!(?'0?0 FN?5 k?<?Am?D8?GDB?JD9t?KG1,?KF3'?I=+y?E! R$?B&Bg?羺I?5co?,бw?"L>B?/Lr?ϲ^5?aou?a.g?_ mi?Y%h?Sv~?LM '?Dj} ?O%?'ʡWc?/H %?5"??LP?Ff?MY iK?S"T?Yo9?`dZ%?dC!͕;?gn Qs?ie+&?iU2c;6?fƎ?b>Qc?\B'/?Sx5?J[P?BT1?8N?z?/q+?#? *?S7?2%?dq?9=?MMX?%R8?!оHI?'ʱϙ=?/?2̲?4U?=?I?D$Di?Lt8?Rǭ R?X.?`F~?fe,:?kM` ?p2?q[?q s?nP2Ʀ?i fX?bͺ2?Y_ ?P<1\?E,EJ?=!2o?3"`Tg?'wlQ? l)?VZ.`?$j>~?^H?_"U ?!=r?'i?/HY?4!*?;Iګ?CD='?ř?Jӑ@?Qg?W.|?^ k^?dQ"D?kg] vl?q2ר?sr}.?uQ"?t,&?roW?nj_?fƄ1?_ `ǃ?S?I=,M\?@WyA?5Ұ?)?+0F&?"K0_?n?7?TK?!?݇?&[[?/6?57?=?ð?CD=:?Ix?PZ~?U?[Gf?b,S'e?h>m?oMS?s6?vl?w1b?w[o 棛?tž~?q V?iU L?a.c?U’?KF?AU}?7WTy?-ݪCw?$$ j?YJTZ?}PL?"(A?'1!0+?/]" _?6"s??6 ?D+'.?JÕ0"?P+?U fl?ZyK?` "H=?dζR?jW?pB ?tE?w r?xg⣨?w9?uQ 56?q[TL?ie?an'*P?V +fX?K/?BW'=?8#B?/9R,?$͎;2? G1?",%?'@K?0 Vj?6Hv?@C%`?F S?Lt L?Q3?UZd?Ze?`AA6?cVi)?g! @V?l)DG?q.#ch?tPl/?v*p?w R?vۣL?sT5I?p2Ɠ΂?gF$p"?`>A?Ts3?JD?Am?7R2?/-nz&N?$#5?":2?& 35Ȼ?.^Y(C?52?tPI,?t-Mb6?s#3?q1qyZ?kY ?d~7]?\ ?R??GհS?@.a?6@>P?-NS?$V*fz?$޵]G ?+l<?3H>?<\$Al?D\Υ?LVIY?S"'?X}6?^O?b,d6?dΌ?g F[?i7&?jnP?l降?oT.8?pEk?q.A$?pq`?oF?kg?f;-%?`c'}?V]We?N%H:F?D|(TD?Sd?j鸔H?h~ĔN?d&㩄?`.vD?Y0U%?RRz*?IS%? {?At?82NjK?0߉?_j?'If]?$2?+0\3?3ѕN?<ץI$?DB0?NNHw?VP6%?`c]e?fw$?kghw?o ?pm_?q.ϣ*?p1G?o$vӿW?lnե?jb& T?i'?g 䤔8?dΉ@Q?b,, \?^]1i?Xӄ{?S"$?LW ?D];y?<3?3ɚ?+l7?$ު$]u?$ןE?-rP[g?6?"?@.X?G&([?R?3oH?\ (xԈ?dGD?kя?q1|Z?sŔ?t he?tP'?rpjϱ?p{H?l$15?i[?f_G?cV֛Y?`?[ &ߓ?W.U_?Rǟ/Q?MYd6?Em(vS??zu~?5Ixl?."3^?& ^?"Y5h?$ࢌ?/,g?7Pb0-?Am0n?JCt?TY0?`>x/˪E?gVNQ?p1X?s.)?vFzs?wM?vRA?tPq?q.!8?l)>?g 5J@?cVBz?`AgF?Z97?U댰ʣ?Q2dj?LtD?FкQ?@Cb?6&H?0 p[I?'@3?"+U. z? ╧v?$#Om?/8Kee?8#?BnbD?Kc9?V ij?an~/ߑ?"'SV?Ր?XkAB[?"ٞ?-n?7 ?AC^n?KFVid?UXq?a.,},?iUy'8?q Lw?t݄~?w[לR? Gh ?Vۃ ?:V#b? ܰ}? ?ն:ܗ?]?.(U?(͑r?3D #?P:?\ F?Vښw8?Rʂ[?LV1"?E[?@CYʉ?6ɺU?/[ҜY8?'̡?!а^Ƣ? av,?d? jkxdH?\?8?6C:? ۫㭈?*?kK?"Mrk?,,X?5eD[ ?>?Dko(?Jяă?P׃M?S+Ah?U'W(?V &?Tƀ5A?R?W8?NrKw]?IR?D\ӊv??y`t?6#2m?/(?&Y’?!=! _?%]LZ?Vϖ? jkJ?lr?ᒽ?h= g?0XE?d?iq?It?dAS?$,?.ew?5ev?UV>l6?XBf.? bk?A?y]?(OyԒ?%27ZV?$-Z c?,ܞI?3D?8Pd(?=#jG?@$U"i?A&?B B?Am%"[?@. u-?<-{Y?8ۗ?3{.P#$?.w?'@aM?"(W$?6! ?_2I?߫V ? v?ʠJ?>;Xjp>*\I> yo>4z>CTǣ? i? I)?(\?r?"O6ԱC?(C A=?/y4%?3#R?5ӭg?7.i)?8$a?74/?",ys?P?.Ë?$-A?yQ? W.Y?Jc??ڇ ?Wj>yI>(O>#~RP>b˨_y>'3?{`d?jqo?!? G?1?#Ak?'y~R ?+1 ?-޶Dt?/9?/-~?-zz?+1@x?'O7w?$#gl?"X;? V. ? ?buw?VG?2r>?H? R?}? n!'y>M՟>" 7>z1e@>|An?-Y8?d)?5(?$QL?d?;a1?m?#b%q?'|5 ?*o?,ac^?-:r?-f L?,ץ?,d?,I?-k2?-uϜ?,a19'?*Їw?'zu3.?#|ɒ8?C0>?7o:,+?Ma ?TB?0H?LY$4{??$?Wi>7?cdn^6&? (?5? ?%?7W?cn?u^UU?"MZ?$[ݲ?&[Ӻb?) p?,\?0>)?3$?4˛0?5Na8?5=8?4o?3*c`~?0Z?+c'x?%tsH ? \?'T?f? hͩt?1??qɳ??o t-? 7ݮ?#3~$-?'e[Y?-㦕?3 G?7o,?;iY!?>zt&?@6-?@3W?@.,?>row?: i?6/$^?1Kr!=O?*@ߢ˔?"LokG]?+H26?9F,?D6`?1|]۷?'Y7K? !(d?@ ?Ҙ?Uʷ_? ,"E3?wC_w0~D?H?I?I0)?Gu?D3O?AIZ`/?;n?4XWD?,¡@?#U?+B8?D?pF?,T?Ih??x?Q|:U? l\`|?Wß&?%O?!=k8?&YP?/Vۨ?6ޥT??yRAfu?5chz?,@?"L1{?0?? ],X?c9?Tq?a<ɫ?]?/MZ`?4[? ϶?&Vd0p?/cn!?7+wF?@܏S?Fx_?e?MiѲ?S,F9?X͗?^q¬e?a,Rha?cR.?bѭi/ڰ?4Xң >?*ALG?7D?8p? a? f1/? r? kw!?8L*?[|n? [q?&)?/"_v?6V?@%U%?G?OV$(g?UQ{Kٙ?\"Ģ?cI/ZU?h}0o?lڎȏP?o l?n?ktN?f;0?`fT?W"D?O8:3%?Dj8?;5J?1zH?%u?6n:\?I`=?H8U?vɴ?W/?v@ ? ؜L?'-kMa?/]?5g??vXo;?F4?Oǎy?UuJ?]N??dGrk?loM1?r%1r?uS#PP?vM?vJsZ?tL6r?pjǙ?h6'?`Q 8N?U߇T?J- ?Aor?6/so?+d??#H_0?ĭ`>?pڀ?$LX?%vI? ?&xER?/]]Q?5L% ?=p~?E6G?N!L?T@3?\.ۭd?c*?lSMTZ?sZ1w4?x {?|֤ܱ][?m %L?~RQ?{kØ?vV=F?p?f4# ??\?PGعi?D4?:w?0cUr?'{f6?tF|?ng?T|H?!=?&V d?/"4o?5?=f ?DOw?Ld%"?aG?iT"s,?qy{ ?xYo7?~D?b(d?\RӾ? &<?Sjm?{k~w3?tLמ>?kt8}M?`yb?3*}M?*?"MYy_3? 7IpK?!q&?& .?/d\&K?6[>\??w#ؙĢ?E6Թ-?LdJ[?SB?Yr&BE?`#O?f8FLҵ?n: ?u]J@3?|mgHe?jV ?A?9?Yy? <?~c?vX7?nz%?bљPP?UՎ?IBT?@.?4PZN?,ai&*н?$[r ?#4:Ә?'=3"?/)ʒ2?7,w!q?@,ۜ?F"/?NL{?S/JG?YrP^?`d?d5?j?qSzZ?4˴Cڏ?,M<?,h #?3 )l?;T<92?D\p{t?M&?UQWX^?]Cl4?cl@1?iSP*?n `?q?0Wq?7of .?A]c?IR;W.?S+XN?\?dٽR?lRO:?q%>O?u]O-?w ;?y(U.#?yT j?xF~ю?xH?x0.0?yST!?y(y);:?Fv[b?R>r?^p_y?h|?r$xO0%?xMqcn?~DRQ?(z??(Q??xh#J?~j?yT0|]F?u2(?rM?oW ?jZ](&?f8,kT?ahU ~?\.@?U8!?OU2?FW2Z??z"A?5d 삍?-ل?) ?-1 ?5Ş6Y4{?@5o?Hr?TA>M?as{?lͷ[?uRD?|ռlH??rŷ$?e ?bZ?jٝ ?h?mLm(?y(5$n?s3'?oX 3X?ieH`~B?dmH?``?ZJ?T#} Y?OcwA?GOyt?@Wa?6<#?/:eh?'~?&["_I?,`X^U?5֐{?@V|?I-?V +bY?c&Q-?o L4?vІR?N?[p?c ?F?~^?rL6K?~糇 ?wht?qjZa?jn?dU?`dEJe?YrJ]A?S,?NQ?F8!,?@=?7,H?/ tj?'=W?#3ʼn%?$ZI/?* P?4鏻1?@.8}n?IDh(?U [Z?bol?n2"?v3a!?~(GY$? _?*t?I?%.B?fć?|mv .?u]]L@o?n!?f8H6?`sWQ?Yr )w?SO?LdŴ?E6>3??w~z?6Mn?/d.?&[Vy?!?]? 7yW?"L>?'z] =k?3*^?>5?Gp6L8?SEg?` y0*?kstkuJ?tL ?{jMw?? ɝD>?[d?·?~9?xY$?qx$?iT!OY?a?ZIr|I?S)2?LdlkMX?DO{?=b+?5 v"?/"n:?&VeF?!=xFs?ST?m镎?s( {?#wX5?0Xu8?:R?Dx]%?P??\MUnM?f?pL?vU2)?{jpJ?~zZ?=T ?|Ey1?xε?sZ(K?lS.j#?cF`"Rs?Eƾz?O9 S$?UmyJ?\"l?`r ?bzp?crLSu?aA?^q}?X3q?S,>d?M.p?F3?@ R_?7,n?/c+?&Vc(A? Ϗ??Pe?pg# ? NY?#~Nz?R?b+? oz? '?m?"N"1?,Ӳp?5eʼn ?>5R5L?Dk7Sp?J>?Pכ7?SQ$?U 9?V 8t?T;:?R?q?NIEn7}?IRnr/?D\ ;??yn?6g)$?/4*?&$bV?!=e2,ޢ?$m?VC9? j}?Н?9-?Tվ?خN?ãa?3B?ǖ#?.2 ?# 9v(5?,I1 ?4Z| ?; ?Adv=?DIxY?GwX?I^Y\?Ij& ?H?F\h?Df!\?AyPD?;g)+3?5c|3?/4?'=Di˘?!Jg?SAz?23?u6? 1o?R_?:@?뗭? \\? `D?PW?G?li?/"?"OhH?*D{y?1Nq?61A ?:LwO?>Ţ>Y?@/H_X?@h:H?@69~4?>zd"HJ?;iBۃr?7oO?3 A+?-!>?'"?#30w? 7}?n *?p;+L?|B? d6K6 ?b'?? }+L>| ?azF9? d?t4Q|?H%U?EF?[ ?#p?%w' E?+g.?0,}?3+v?i?4&N?5מZ.?5qf =?4˟ϻ?3x_'?0EO?,}'O ?) Xp?&[IX?$[eC?"MOy?sDW?+xA?gԢ?=6? fFl??]r %?`Zn>5^W?g@eab?yFs?L'? o6~?(bȸ??zF;o%?dsKA?B v ?D t`?EHf]T?F; |?E8?DYK/?AH?=FYƱc?7L?1mzdM?(̥/K? Eyf9?sa? S[? f?G4^Q?xB?d?L=ϰ? L?ێ?$?j6P?"g*?'m]} ib?/τ["?5\Z]?=0?B3&?G04e*?KF]?P 7?Qk4?RN}S?RR?`>?an%?a.\^?_ k K?Yy?S݄ũ?LmcںR?Djw?4;N?FUϧ?Pԅ3+?Vh ?_{[H?gPO?p?w#^v?}jR?up? #?w?B?{*.?t lHA?kD' @?`:'?Sݗe*#?Gq?=FP?21hXD%?EV~?MLR[+ԕ?T@&?\$l?cF\?lRx?tz~?~5S?vV?4;y?g*1?e%?5fɐ?1vsr?ʷV"?G?vS(!`?kt5?_ ds ,?Qֳh?DK?9,9o ?1|?(Hl$c?$)O?'n/b`6?/[W}2?65Ѯ>?@"}?FVED|?NEv?TLGx?\=ה)d?c /u?ib '?qTN(?yx?? ?R"C ?oN?ɩ1!'?Q?A\?洢?z?/V5?xH?noj)W?a..[?R/7?E?;tT?2-GJ?*"z?(~$.?/v$?6ɭ¦?@ '?GF\?PG%r?Uhpť?\*0?c -*nQ?hj?pE7?a?uٰ?~5[@?jm?Na}q??1? {?#?^N.?$?⇻qo?yAin(?o 9#??an K&?RQ ?Fcg??QpP ?Ep…H>?? PU T?S#B??kV?>A?4p$?bvq7?}q-?sÂ?h}?\ ň?Ppk?D90?;.b?35>j?3S# c%?9,'r?B5'1?LUդ?UQ 6(?_ֆB?g߱}?o!?tzB? ,*?@|)?MU?]L?Mlց?t?ά?PР???~5^K?wSVC?p?fyI ?\ۜ9.'?R ʇ?G0ԯ???6;9~?34\ѡ?9M?t?NͲ3??? >m?ZBk??~5IvD?yW3|?t'?oM]$?gQV?_B?UQ`?LV*?Bl?9(?3S—Ov?3\3~?;-~?DwS*X?PtD"?\ )l?h|䥬?s, ?}%w?b w?43?/?ϫ?S򃺝? ^?%Fe?oL?݄"|ql?}> J?y#Ev)?uٷ]?q U] ?lRJ?e{?F֘?_)ت?Vi=#?O׋?E1?=a0@?4T ݾb?0?3Zc??lk&s?wcIT?t1"?uW^!?4?eorY?B$?m?T 3?KOt?>}?{?C ?Kj|?J~?ɣ^ڛ]?I|{?RcĉG?? ?yzλs?qMp?iMe?c O+?\=?T]~?NE[S?FV Y5?@"%(?6Sb?/~*?'m!Mc?$YVS?(pޒ?/m\_(?9, a?DE?Qw+EA?_ YA?ks=?vRЙ'?+?I?OE?`G??54q)?/""S|?'FJ?"b ?!R"1?$1@v?*>&?5?Ao?M1>*?Y\#q ?fI?r@nLk ?{)%z?cH?ܣ?ql?$i?uS/*?bU?W7?wSt9?oO??e{anJ?]fI?Uh?NEI^?EBM}?=Rl?5H-cq?/gsU?&uQ?!=T?i'?*d?!(zR?%srC?21t?=FXw?Gr?Sm?`R:?kC&C?t5X?{)R;P?a7)?ٖ>? *?ulK9?}.p4?w#$.?p by?gir?_ϓ)X?Vi ?PPi?FUм*?>F<5?5'ݬ?/޷ -?&(? 2畤? ?u/? n?3q? >\\r#?/gV# ?&Ҋe)? BI~G?2Tt?cXG?ؐ:?$d?.^y'?9ݱU?%v%n&-?1\]_?;b?DkwUq?O9,sQ ?Wy;'?`V1?fW?ksS5?n$Z s?\ c@ ?VkkC?RM4?LV0\?EW?@CFz,E?6)!?/~Zj+?'q{]?!^u? NN?cc ? i`k$?:F ?Wc?ߔ͌? Vt ? K ?k_HD? G?Ed?D?B F{-??&^?9/Q?4SIڹ?/c?(ǸS?$>r?!R/U?Q ?|"9?J)s? dQغ\?rV?+?vjے;?)[Ԅ?i?%Z,?H1|? G5?l*݈?3M ?%xA]?,@?22M?5z?9-2P?;u`?0 E?-E?*r)i:?(?$DƠG?!(F ?o?-} ?%9? q?Eji?܆v ?iB.I? /p?39xd? aV?Sp?W??F-?%u)S?+\?16G9?4NXS?6"`?8ǵ_?8RD?8+?8Dz>?8?8s?8 ?8mb?86&w?6Gزg?4L4?14P ?+?%r<?̡Eb?OG?=u? \vP?U?4?^2?.p? yL?L(?t? V֔m?!1q8?&oKR@?+pd?/ N(?1Yc?3eU6=6?5N?9 y?<`dI??N2?A7R\?Aظy|?A`v?AD򰘥??SC?;Bs\|?6r)?21MT ?+ddìv?#@ X?ll?{כT[? ++? ]]?n?]tev??zi? ?V)? + ?X8q?"`{:?&%X?*|a?0so?5 |?;?@FZ?C2u?G)1χ?J A?L.s}?MyU~?LZWY?J%?H#U? ?=ai? S:#?_?xa&2^?k?3 >?#e%?(2=%??/N淣C?5* B?=9&?Cr`~?H L?N##?Ra0?V[SOL*?YVn?Z݇"y?ZcuM?W?Td<2?O|k)%?GW$%>?AzS{Y?8O?0P?$Bd?c?]4?مa#? O?pp?w?W`=?n?">?''ı?/G')?5ջM??'i?FZM]O?MX0m^?S" G?Yy7B?`c,M4?dp?g4m?i9?iUֽ?fƒ Γ?bZ?\Bo?SݗZH?J?B*Q?8O:?/5?#@n?.? v?5?wK?W?ح|O? /?'-no?/\5\)_?5EZe??uW"?FU?Ou?U# ?]?dw?lnD?r$ZZ?uSjt?vۅ?v6w?tL]?pՄ?hI6c1?` .nC?U2y ?J+?At>?6/}z(?+eJ?%swb?)?Xic?ߒIǮ?hz? ?L?&Z#2?/+p?5w|'?>6?FU@??PU+?VhNL?_-t?g̕5?p՚K?w#?}%,?u? `?c?GB?{*"Q؃?t)a ?kD4鳚\?`:C?SݩTe?Gkh?=G Кe?218?+`9?!r ?Vpfp?2?"?V ?'-F6?/zX|?5B[?>qn?EQQ}jt?Nζ)?VPM''?_T,(?f,E:6?q`w?y/v?0W?O蓡?v;^Uj?쉰F??o]?2R[R?~?t"}?hC z&?\B붥?O|f?Bv;E?6d3ת?15Vs?&nR R5?"_ˡk.?#Ε?'ʕЍ]?/] yC?5Xav?>8o?Dv?M# ?UfO?^\j?eݓ95?pD&&m ?x(Fab?F&}?ڛ>_?rK?Үv?& F?7hkb?P,j?NȀh?m%?{*qW?p?b(x?Tu?F#F?;䭏ԥ?4M{? ?+8ck?&%P4N?(2?/H>v)=?5$R?>o:oE?EQ o?MFP&?U q!V?]*z?d{=1F?m'{+?v 6?r1?S^?r,h?ZK?t/?|]oЧ?L) KK?s,?Po??ZF?ϿXw?tL<?fM?W.??J"h5??6m?6l9T?/ d6ob7?*ӵ&?/P'i?5֞xU??v>??FUӕ?N}\?UfFWbl?]sS;?dZ H ?lIf)~?sV]?|UGpO?$}n?@o_?ga?*E?( ۱?/`?PfZ媨?L"-G???Z[X ?n;?v?iUxSM~f?Zc?Ј ?LZN?AE~}?8ʒ?1YE0?0tP?5zH??H?Fܿ0?P)I?V >1?^\7n?d݂<?lI {?rô?xhak??L?B˜ʛ?w>?]9?8L??p?IG?2N?RTW?6 R?յ[r?IA?v^?i¹@9^:?Z݀?Mh ?Ad9墮?8&?3e͑Q?5Aw?`%e;?{9E?@xs? q$5?*za,?ZB?qz-?f?}VDo ?r$s3?d l?V[dI?J ?#?A]@?8*?9 %C?@n?H+͸?S!|@r?])?g?q`YV?xʴɞ*N?;? ة?BWh?$A?fX?rȰE:?{ra.?Ĭ?`Y?co?1)1? (x?q1/P?A.a ?qy?w#_kY?lnѢA?`c?Rˉy?G**w5'??Xo?8{?<`yܪ?CDj?NѺ׺x?YM(T$?dO ?6?pLr9?y*tI?,o?⢫?@0/?p?6>N?僅?{S?MJS?{}?ľ?b5R?vBs?@:?V?$?WZ ?yLs?pX?d]8?YqJ?Nҟ H?C4?<`?89??V?G)ie,?RܞNT?`ct?lm҈۪?w" 8?0?Ә?q7bY?K?)o?cw U?a2*m ? ?{R?s`Έc?p~?o?8ۢ~?A;?J <z&?VZx_[?do?r$' ?}PaO?/?q{U?Zb?*y_?LWR?Ͷn>Bx?pD6і?f]?_;D?UI?MY`v,J?C7Jh?;dGR)?5?8ȓ>@?ATр\?L- d?YUFB?gZ?uRpC@U?t-'?tj?C? ?'lѦ?HJp?u~&?bF?d4M?̓?~})?D00?je6P?xk,?sd-m?mk+ ?eӨ?_T4ٿi?Vi5j ?Om@$?FJW?=:A,?57Nq?3e`&5?8 ?A?MrlI?ZLo?iB+.?v]j\? 7N?w?9?{?Ie?GBz?mev7?p3+?K?lc?CpT??n)0?xJj܂?ri}?lIzy?dv(4?^]-?V | =?P_>?FdLW??MD?5R\`?0t =?1Y4rW)?6?ADx 8?LYx|'ݷ?Zb׺z*?iT]g?vJ]?Nz?)?"U-?KA?P/D?a6ˋ?5`:?/GpM?(2f9?&$?+Aiy?15xH?;1?F2`w?TRf_?bS?pZx??{(M-?>׭.?MUg?OhoT?z= #?h?+?r \?ڼ&0?}T?x˖MIB?pD|_90*?eR\'?^]BQ?Ug_G?MmZ{?D+?>R?5-e?/]6@T^?'V"?#yy?"_NA3?&md?+I?6꫑o?B{N?O|'[?\BaF=H?h̢98?t^̥?~!2?4?x<?o$v?DU?uġ`?9?1?yP(:?q`0?f)A?_T̺T6?V ly߹w?N?EQY?5$R- ?/u,?'-5ր:?">wMM?14P?V4{?!$?%sL?225n?=G?GɃ?Sݺ3?`|f?kCI24?tN?{)S_?[ё?ٌ?X?u__Y?}kFx~?w#[Dq?pB۔?gX,P?_*<]?5ҕ?/}?&7C? y? ͮV?\s?p?A?Ȱ ?+fmK/?61‡?Al-?Jp ?U?`4?h7ߊ?p,?tL@!?v|5K?v(2,u?uS9?r$eEy?ln\Sy?d\^?]E?U+ [?O ?Fܒx<5??v&U?5/b?/\?',n? J?c wz?Vi*?v!1?Bޠ?;NuS?c~N?#B>AŃ?/`c?8Q"$j?BX;8I?JF d8?S"WW?\C @?b%`?f_#UG?iUJ9U?iŽp +?g])?dj?`c?YM?S"G'2?MXcs?F'T??_;?5rq?/G ]3?'|xl9?">? BΏ9?V{J?oy? r`? ]? ??ۭ?$Hב?0GΘK?8Qy?AOP?Gϴ?O}Dž?TtTT?W[TM ?Zc ?ZtB2R?YV:,;?V[H?Rk?N]@/?H趓?C,Lq;?=Ƿe?5dm?/N>Qy?(1ӣf?#ˮ?0kW?J#?u'*? \c_? OXz?4?"^G?U:?ȓ]c?v? 8?;8;l?Z ? r?$?f? ϠR&?&D?]?#CuR7?+hOK ?;HB??8i?AE]V?A}٠?AC?A]L??rT?<`tӈ?9 }"|?5Q?3eFZ?1Y 6"?/Ev?+ Xc?&mDlz`?!T?~Kj?j<{?֯N? c:g?6r?]FiN? "ȳ-8]? kb$l}?66g??XIqD?4v"?#NC?* $?16O?5Du?82w?;O/?=Zd?>!Q?>][?>]-a?>W,0?>]\1?>]KA&?>!8\?=YV>??;C'Ȉ?8@g65?5C+ ?14 ?*]&,U?#Wl?ʻ1?Tr~?0t&? :? [9?  #? fg1? Ǔ?7,?:?!+rW?&oP?,W wo?0[A?3k͛E?5A?8n*#?;K:[??XW?ArI?CMLc?Dh?E/P62?EL^&?Dc?C,3t?@?;kw_?51_L?0[-?'xZ ?R+~?N`? F\?2Wx? dx? \? oاo?h۰?t ](?V?"`?&9aA?+?\0?0?5*>^?;,e/A?A9-`nzu?EM?H_?L"Itt?Pf:?QފO?RxB?QP?PXT?Kk?Fh-?AAh9?:=?3# !H=?)@%M$? D`?Ϻ4?U g8? Bs? n9MO0?e?N#?$9?l'%f?#1KA?(E(?/g4t?4z>?<4ԩ?CF,>?I.HK;?O*?SĚH?Xb[?]'_?`ށO?a?a9Âp?_?Z&c?Txk?M1N \?DA?="`K4?3])n?)[%z?0{]?11?4$?kL.X?T?NϲZ ?&ʄ?! ??'D ?/>=X&D?4Ӷ?==/d ?Dň'?LrQ?RƎ畩?XȷD?`hq?f˭^?kU|?p1?q[%?q S?n)Z ?i ~9#?b'?Y?!)c,?ĸ?k~\s?!fK?&\&DX?/gdt?5=v?= JT?Eu?NDSlO ?Ug\?]Q?ez;?om=?wS sq?,b?DԘym?M2?Ufg !>?^\4؞D?ekq??pCH@b?x{F?5e d?ړԒ?r?$?7ڗ?J$?P=?N"?Ox|?{*ڜU?pu?bSDg?T5(?F h~?;?5C,k?,V2?&#?(P?/??5Kű+?=Ξm?DcSj?MUn?U8?^N6?e6?o,>?wVjQZ? ??7{s?`R ?ٿY?g3?DYI?.T?<,6?l$-?N?s>?vV:-~?i o?Ƴs?Z'mT?Kw??@i?8:]?0$d?+$'?/ddZ?4ߙXP?=V?E.m??M??UƨxQ?^;kvWk?etnDq-?nZ";?uF?C$?m{'?6D?Bco?"ٴ?M?b\?Jq?nWK?;?P0?ʩDth_?{kq?n;{:?_Y0?PXw'.?C-`S`?;ƆK?3l?0-?4{AN?=>T^?E6JB$?NE?Uf5gp}?^Nyf?etҘ@;?m eym?tu" ?| ?zbJ?ˑSE??R?V+?YF[7?4-$&?G>yy?{_?JKV?(϶?=1?Q?~͌]U?q 5f?a/ѱ?Q6 ?Dn2p?=Z?5¢d?5+{=?<5\15O?DFw?N҃M?Uhl?^\g?e?nX?tuc-Q?{5 j?R?Xǘ(??2߮8m?'-n?]P2? 8?wi6?<)"?G!?p&?D]?o?$~?Rݭ?q[1?awK?Rx4$Գ?E=^W?>!?8o)Q?;,mk?CGΡ?Lshǚ?T;??]~n?e?o,C.u?uA?|Qׇ?Xѽ?U\Y:l?.CS?qpo?Xu?2":E?[?%%?wV6?4>?LS?O?p]~*?uaS?|!Zp?p1"(?`xޓ?QެTG?E?>]%Њ?;i`?A9#ؓ?I.{?Rƾ,?\-eA?ez!?pCUW?w]6u?CFh?g\m?4J?@r?GG'?dM{`?h,Z?餹? *?Ka?i$?XG?ԇ?>He?q7=?bS+?xտ?kˍ?].%?Pf\?D]u?>];[??YMn0?E2k?OyAw?XȆܣpE?c2f?o,ͩ+h?xoS{? 0wԚO?l~o?dK?2}s?q F#?dAj?)S,-?ucb?Q?W1?'=[?]|,f?Qyy?Bv;?`-(?+_O?ou?sZV,M?fRy?X*?L?CN6N?>W5?AhH?HwL@?S}=G?`?lQđ?wRƿT?bY?6_YЋ?!?ձF?'P1a.?Nl ?'^?uz׻?S87|?u|ύ?Bn?څ?'Y?z{i? {P?7/6/?ks|?wSr֤?lRg?`?S_i?H?A4b&?>]@k?CMHz,?L ?Xe}?f7Va?sY!?v?ىXs?`A]I;?Dűr ?Pf!C~?]]~]lx?kgO?x-?aIt?qNZ˥?ؿN?hM?Yi?U?΄?rR? rZ?8e'5?e*(^?G~ ?!i?밠i?m,?Di'?wv?pD!Hr?e{?\._o?R!z+?I.f9y?A9Bu?;s?>!I?X?EŎa?QO5?`ݵm ?p1Jt?|N&?t ?B8?ަbE"?LAu?3 =?w}m?kN"?[*Q?lFL?x:?r'>|?"B@?U?Y&.?| 2?u0?o-02fA?e ^Yj?]ܩj?T?Lt]7 ?CG&"?;,#ٕ?8o%;?=Y<)?EpQ?Rwiy?aQo?qZ%?ح?#OS?ѣ?CZi3?yi?F'C?C|"K?wd/?+]?^'$q?(h &?3Ej^?{@?Y`M6e?{6]?tugn?n*x,",?etm;?^\ !?Uhh =Q?N(=?Dh&!?<5If?5+_8?54P E1?;N6s?DecԆ?Qq^?ag1?qwJ\?~N#a?Np&(? ?td?JxQY?H.n?Gh]k?4>D?YN g?Sי?Xf?̱X?4{gtlF?0Ŕh?3k;?8L?C,?PXJ~c?_yUTt?njg?{j$?{Av]?O &*?a?m-ʄ?J=4\.?UGb?LXn.?D?B#c?#?mɄ?Dib?ux2?n|d?euJ6a?^; 0q?U(?MCz[?EFn?=N"2?4uEp[?/Z?+ؿ '?0r?5Cޑ_?@?K5r?Z&C=$?i x ?vUH{L?LD?M r?>n=5?%c?o0?C],?-`?ٸdlf?a1?7H ? {U?wu(?o-[0HY?e0ZX?^O Z҇?UlN?MVT=а?D?=Π?5Kf?/>B?(I {?&k(?,V(&?15?;P]?FLߓ?TYRLW?b=?ptՕ?{)V?fB?MD~ VV?OV곉?a?!?zvm3?q?{?ک*?r[?xˇ{l?pDqi3:?e?}N?^]о ?Uf?Al?M)|%,?DĜ?>+X?5Kl/?/]t(?' [d?#Uh?"_%?&nq|!?*6X ?5uc?A՘ `?M2+_C?Y c?f񨗰?r@6?{)7?0)S?j?I6?$?DY?=>M?4?/=(v?'ɇ`] ?!@?$K'Rj?MT|?Zn ??5US+?WVf?⣍.?)xf_(?3o=)?=%:3 ?DͲ;?M3 Ew8T?T ;"G?Z'Ee0U?_Ƅn ?a)O?al6a?`p'?]?X _?S )|?OrS?I.V?CGh(?<5+3{%?4z;?/;?(wU?# ?i? Ú$ ?I?/? lǬ8s? ВM?4}*?m l?  %?)z|?3%=#?:7F?A?Fgy?K?PYC$8?Q\˩?RxA5+?Qި+\?PfN?Lڦ+?HU?ERV?A9{&?;,xpg?5*8)?0SZ֗?+K!z?&Бa?"^?qh?-?p*(?Bp? kix-? Z/? diEi? "#?/:違?=Ȭ?)sp?'|0|4?0MM?5y'?;c?@CT?C-(q?DrC\?EV"1?Ef?D5CI?CM,>?A.>??Y ?;(M8?8nD*N?5c?3k]?ҪK?0rÌsD?,UaSl?&mjfZF?!(z$]?U~?3>? ?K3!? bs? a[?%A,4?ܳ9? -?oÌF? pi?' ?/8`ߟe?4O%m?8E?=# =?@J~?AKM?AMb;?AefAP?BcS?B=?BSM?AB\?A]c?A&Oo?@E(?=!Z(?8?4M) ce?/Cp:us?'{ykUK? mǻ?j?@@/?Bjs?DakY?FLc?Hc@;K?I\%?In+J"2@qV?'hў?/GMj\?4݊ ?;α#9?CBX/?J?QPKJ?W,r޳?^_?dzfU?kg82#?q1s?sBy^?uQM?tn%[?re?n<?fƮs?_ ]`?S"޼?I=nNX?@0)?5ӣ@o?+10i?'|h:?vTkA?pm l?U3!^?!>< ?&VM ?/!+?5~|Ӣ?=Tc?DNP$>?Lbwݎ?S@?ZH%G?a/?iS8w.?q SJY?xY:1?~M@?Pp%*?n?{k5R?tLI`$?ktsXg?`0v?S4?G|OX?>!?3+c0#~?/lh?$ٛ!?!S6?"{?'Hک?/"W?5a/?>wF?E^lt?MJ9?T>_gw?\#x?cR?lQ%1 ?tYzv?~5@ ]e?v|?4,kU?fUN?mC?W?p $?M?gL_?vSǶ?kto9(?_ s"?Q<7&K?D6?9-n>!?4MKw$?+{i?&%{?(3H@?/Hr ?5>}f?>lo?EQ ?MQk?Uh[?]I&?d8K8?mw@?v oȑ?F-?it?r*ƎS?[x7??ޯQr?LJBg?s!)o?P; ?k^ b?l?tL;?fƨrm`?We?l?Jr[{??}?8^?0D?+IZE?/jfE?4߂?=v{?E۞?M5?UrEܙ?^:6?etv-x?n5B9?u?Cs}?l΄?2-?BmjB?1A?M9?f?JɌ&?o$L?cb:?P#w=?ʾdf?{k6?nBE?_cEw?PX?C-?I?="X0?4E5?_?1 Ai ?3qz ]?;ƽ?DN'7.?MKŭ?U =?^;?e4M?n^CP?uo?~$kH?{1?>+?0l?JŞf?GRW.?{?Lբ!?Ğ &d?+/{?n"?svq?\-0?A̽ ?rգ?c0V?S^x ?F4='~[?@nL3?7"f|?4 ?:IfLz?CCka?Lc\?T/ ?]ajdl?et-Z?n^{?tX?|sj"? ܤB ?IL?_d)j?W?Ҩt??1ʨ?ڢ0?ãY>? :w?J5{?LW\?T3-? 9Z?tݸG``?ehGC?Uq ?HbuL?AR(-?9T(l?:.1g-?Aԝ ?J~ ?Sp<?\1X0?d ?nM+?uJ?|qO?D?# ?2S747?o?HpyM?b??HLZ|?jQu}?B7?B1?[>B+?uPvR?e?V)z$3?In\3?Aus :?=?~@?@c?G}y_?QC?ZHd ?c ?ms6?up#p >?~$P﫱v? "?#a??R8??ڗ?T-P?!7?آIj?X^?A°?1wSb?f:5?L(?XIk?,H5?{N?s 4?dѐ?Uzk}O?I]LB?Aߟ`[b?@LE?D?Nk, m?W-┥,?a0?lPb?v (#A?C״?z'i?HL>?2V$n!?0?$YD(?yS ]?\??bq`?4tO?n6?H}?`+ix?FҎ_?ˈ*?Z^j?44-;?~LG?q1_?b,,?S8_?Hc?B]8X]?B̲?Ib4M?S?\*9?a zd??)?# \?0+w{?? [?~5v?q?d=K?XXE|?MOl?D'?B1?FѴ=?Q^Eg?^] s?kfE?xX_?u-QĨ?qlEV?AM?9g'?|O;?3w?!Z?r?MDU?kQZ?D>C8?ys?? xG?_k(Q?5kP?l%?>YO?th ]l?iS|1>?^kپ?S<٪Ҷ?Ic@i?BEΠ?ANWI?Hb:?Sxm+y?b+ɽ?q0ަq?~b\"?34h#?YҏsH?mVD?F?qu0?H??$?b?1Ω?I<8`{?\p?zvz7?+j?Zw?2?Ihq?{^?C,;?v ɡ>H?lQl`?aQX:?W-?N ?D6?@c?A)?I\vO}+?UyZS?d?s?e?tT?MR?K?E?׉?1jĺ&?';H?{?ncV ?"E-?- ? \?=?WCq5?XM7?~? g`f?~$!?u( S?mG ?c1?ZIxZF?Q !|?5*[sPg?/G_!O?(3 ?&%?e?+J?/$ ?9.SXY0?D1S*E?Q^ޚw?_ k&y3?ks`{k?vS?0S2?̳V1? ?1WqHP? 6P?ӚM?4yPCy?v ???~5L?t?b?lRX?c=1q?\jF:?TjU?MK.?E\?>z3?5 ?/!Tٲ0?'n?"ܶ?!Tf5?$6c?'}Ż4c?3,?>+F=?G[m?Sd²5 ?`ѹE?ks0P?tL4F0?{jR?Ή%? מ ?[Σ?L7]?~xkѠe?xYF7ώ?qG?iS Q?a{?ZI]?S?Lc?DNˬ"B?=D?5ݶv?/!{ax?&V\e)H?!=K>D?Uq?p|0?w'? oB?+4Tꚢ?5m %/?@#.?I>ƫ&G?S}?_ ?fƅ̋?n_5?rFl?tx?uPx?s?P?q1 )c?kg\$0?dGI?^4lw?W-l=?Qld?Jċ?CC@~۠?;Bi ?4=D|)?/GXt'?'u-?!=hD?>{?`^x?&籎?YM?m݀L[?!ԑ-m?-:V?6u?@* ?G'?QN?-׬[?5I?>ڤ?D?JzI?PYL&6?S^Nf?Uq,_?V)!?Uzc*8?S5{tN?Q^o?M."?Ic?DIt?@)H'?:QZ?49?1 t?+!Mj?&$yk?!R^]?n\?%PI֌?Q@&? .Z?Y??]?MCF?!!T|?+5^񡄀?3-W7?9/nC??#%?C-zd?F4Ø?Hb@)?In '?I]D]?HcBG~O?F?D_?B̠$ ?@`Ncj?=>^?9𙍯:?7!(YF?4E ?0!?+Bȏ/?$؎5?t 5?Wve?Ǩr?&? R?.V?'kZ?݅Uok?:c.xI?=;?@KWh?CIz3?E=ك?GՉ6?I?Kn_KJ?LQN?L2Uy?Jp00?Hb`*/?D\ ?AE ?;u)TB?4.~[?-'-]?#ï?+sL ?ʌ?H?#?Ht?N`?zK2b?2Q? 9 F?$?*x"?0-?4Ҵl5?9aEǃ??r?CT-?Hlk4?MC?53?Q&?Sn?VK;r?X49a?Xb?Wl?Uq?QMsѝ?LZ??Ee?@/eT /?7pO[v?/)KE?$1"?+ Xc?WŲl?+s?yU?2Q=?2s?!)~?'n͊9?/P$;l?4{*=?:HBu ?@;I?FM b?L+?R'L0?VcRt?[pN?a(RW=?d}h0?gr˦PB?hmv?g|X^?ehw)?a^Bq_?ZdGQP?R&UW?I-]?A8Lh?8|^VG?/XF?#.?"F-?/I?_-IɈ? ]DC?!ӹY?&8?/4?5>?==7?CBJI?IK~%/?PkI?U1?[Kbu?b+GE h?h^?og*xK#?shՆ>?voR?w|Bt?w[{"?t0Cb?q ëps?iUY?a.ˬ?U9D9?KGWOr?AI7?7kk?-߷T{?*U?"Ng? 8뛋r?!MO?&T?/cɦu?6S`j??ub,rx?E5q0?Lb?Sf?Ypbyx ?`?f7~̎;?n?u\?|ls?O,-?Df:?3`?%? Fmn$?~A^g?vP\?n&?bi ?U@??ItZI~?E5g?NDf6c?Uf4{C?^N+Z?etBz?mP[0?tu,5?|tʀ?=zig?g14?@?Rc_??Yt0!?4U("?Gty?C?JǰL??'-?*Cޯ?lx?~u?q x?aY˝?Qk(l.?DU< ?@U݇?7";?4픪J?:IN?CCHU?LcP#;w?Tx$?]R{K?etV0?n^kfq2W?tg?|*H8? ?Hӳ!?_\ M?aEn?ҽZnK?_]?1.ŷ?ڻ?ã/y\+?ѠF?J5[?LG?p? JI?tk!F?ehbl?Uq)[|?Hb4?A̛W?:c%ߵ?9a&?@\.?Ih'7?S 9 P?\6?l?7J{3G?>p?Z?vW7?Baeol?*?I?X?\?XK?*Od/?]4??s(?d{?VKps&C?Knc:?Dx7c,?EME!?MD-=!?VcξZ?b+ $?n8?yE=?E&C?ʫieY[??*B*?:$?L?.?#kz?* F?(??go? i??3 ? U?ɶjd?#hTԁ?H??+pW??]??J' ?u\{?h7}l?[ߴ?Qz?G 7$<,?Dx:?IZ0?S`1-=?a(HwM?o&Ӧ?|kI]^?PS/?(!?Q+.?,D-?ܾ ?B ?^uM?ndS?@/??1?Z Tl?8*o\?[YԶ?N/A"?J~B?_XgG?ROe?do[m?yaW?n?b+?Vd@J;?MD::S?ELSr?D#?Knrc?VJ7Ʉ?dpSV?sp*K?9',?1P[?)me?Xn?2F? ?ܑ~?C/ h"?3??~0?80#?aS9?3kmq??e$ !?I?ʂ ?j?|UVT?qw?f7?[(PA?R(Uuu?Hm0ܖ?C?Cs?LQ0o?X3b˘9?gq:q(?v[?Dcd?ȀKX?'oOWu?36?1 N?poU[]?Lh?Z?Cvu?bq)E?tu?I ?Ā?s;{(?QV?|9? A a?|.#O?s&?i/M#M?`5?Uڬ\?LWp[.?C ^w?@?Bqu;e?L1?X}a?h?w = ?p5?)?$#?F]a?F?Ȍ_?BѬՕ%?۔O6?@?C0?%T?NZh?c?$d? G.e?Oro?|$e?tuH?lHE:&?cY ?YqX]h?P(?FNsu??t?f?=z?Aj$h?Jc%;W?W߄8?g?O?wYY?yY?rz<`?O61?gZ?âU{?gr?Ȍ?pa7?9h?"ؼ?2ݹ=?7'?fmI?-+?O>h[a?| ۇ?t:K%?m/KM??d#0?\= Q ?SPi&'?I&?@Nk?9bߎ?:c%鐋?@.?HbbI?Up~?eg_?tƺ? ?=P?KmO?Ik7V?lj?âGS?g[?17?.?rn ?Oɂį?6?`V$"m?Jn? ?|}q:?t7L?n_]c?etMʒ}?]ؒ76?T.:?Lc8dt?CCw !d_?:IN?4&?7"뤈?;?DB?Q!f?a*1}?q?~rl?~??PЪ?I'j.?ig?FKƇ&?4s0s?Yy=*$?RX(?IHB?̜E?5vP3?|DL?tu ?moc^?4{wI?0\N?3l\-?6Nfh?AE[s?L[+T?ZczHI?iT?v /?p?4ynj?tJ?K[?O`Sy?p\\"?'ڂnȄ?*Ъ?ekl?@ .?)?|V:lb?s.?lIAE+1?dF yy?]؜0|?Uf?N'nL?FUNץ??vs5?5pB?/PRy?*Y?/ B?1­s?;vc?E敠~?R[??a.}U?n$?xLXH?:s@H?,q??딡\:?q?\yN?J_~?RdVh???y<>R\?qy?iFŌ?cc(!?\=?TX?NDiU ?FU6(]?@!+C?6G ?/)eg7?'nx?$6-D?(Xt7?*?4?@02??I?UȆTl9?bѺ߳B?n(?v\_|\?~? OF?X, ?'Q?ׇ6?&%9?|mj?u]ݷ?n8?f7s1?`11?Yqbvh?S;(c?Lc`O"?E5չi??u<=?6{'?/cm?&nnv?!vv6`? 9vq*k?"Od?"ݾE2?-zNzc?70t?A{/:W?KHSH?Uȯ &?5t?/~wja?&^*?!5{Üj?9 u?S/%?Hhw?Zb5?#i>i?0:Ѓv?8~Ǻ!-?A?I }?R?Zdt?a]?ehL7?g:}I?h2?gr1y?d%?a)eUr?[Hx?VdVu/Ƃ6?'mv\?! ,?_a? KΫ ?yҋ?,>p? -?/,D?$ wu?0`[f4?7?@0@}?E[?L\^$p?Q KU9?2e!t?8߿%?=[SB?Ar-s?BD]?D94v?E+̪d?EYtJ?F?* ?1Z?5Ù5?9b.?=hu?@}Z?B??E--i4?G_`?JlWN?Kſt?M m?N7>?Mۋ?L2f  ?Inq?Ej!?As?<f?5Bzg?/;Km?$}my?Oޓ?8l?{T\?k?P?FE?I @?#6 ?/}?5f ˡ?<5;h"?A+Jb?FM6?L PP?Qu#Ƭ?U/Cx?YR8bԵ5?^pֶH?bfY|5?eg?htmT?iYhHp?hPs'?e(4[`?/]H?7+/?@q-?FGx)?NG?SY:u?YpJAR?`c;mw?dy^v)?jȓ+'?qʛjeH[?wڠL?~lX#?Hi?6?N?B:?\> ?ZW?v?o î?c#?V 8F?IU0?@?5ؑ?25U1?*Bg]?(&?/ ]?6W1i?@?G17?P5T?UgVgI?\a?cf?h\>%?pDnvr?u1N ?~4?%=?8$MHf?h?E8'?\L36?Q> ??%f? ,&?yA<'/?o b?ao5_1?Re0?FwO?<6?8?1Z?0tah?5`G2w??F?F*i?PE(K?VS73?^[{)a?d܎rQV?lGؙH?rU;?xGӖ?>ym?Bmh??u:/1?ܩ ?oxv?%_?T?/!{?6Gt?:;?q? 6u?vJ/?i%B5f2?Z A˭j?Mj?<5{ʋ?Dndc?NhW?п ?1-?UB-u?3-[?x?t?G? RN?Wt(?0 +?y^U ?KnHX?-o8C?H{ ,-?W'?=UX?_:e?ڦoD?t7?e @0?Wx ?M==J?F?BCj?D-X?]h ?pg?`?~{?pI?bfwx??UK&G?L:5x?F`P_&m ?JŲ?RXu?^olX6?jst?w٥`xN?=d9?v/Z?&Sv*?:?#˭?a!o?FH5[}? [,?Qlr"?%?P? xu?F)ñk?rXh?#DRs?,G?'P?E1??wڒ?jc@?^p?R@`h?JE?F<ôc?K!>?UJn0?be u?p?~l/I?'U?JE?\R?}n-?BCͩ?d2d?B+Q?X6lS?!|p`?is_?i? qE?it?1J?NNl?  ?2 W?Bgs&!?~4h?q?dۈ]t~?YR]Y?PYM[?G4bM?E9_n?M7q?W ?eM?tF C?`o(?Y}lK?Gb? y?H>%O?3)TU&?K?!?493?؃?Xb(LfG? ?W?u]?Za9?4ǘ?@O?2i)a???xN?u)#?j_02?`fH?U0( ?K\(?E-t?E*Վ?N7Y`?Y٭R?hs~6n?wi%/? 1p?^I?Pw?v!e?$o[?jh?D_U? %?p?סs3?F ?ji??HP8?˽[?/L?jljCm?XÄ-?xg\;`?pD ?d7?ZC)LZ?Qu3ֈ$?G:!#?BLȩ?D9I$2_?Mмބ?Zu5?i2~?xsR?Q.b?퇣?)g%1?j9?oP"*?Bh?ȯ06?EV?Lq??~ť??5Z&?)]yq?$y ?ŃW?$u?{5Уbg?r;'0?hqF?`dK\?U-}?L  ?C "Ql4?@۟p?Bc4 ?L22gN?XY?hHRB?w]~?9~?]/?EW?F?Q?tY?Ȍ?l?BYU?"? "J?CI@?% ?N[Ya?q)?);6?$V?O /?|3R?tuЦ?lH k?cWB?Yq# G?P [6?FNutYF??t>mO}?=h?A`?In?V(F|M?e+0nN?uOu?Z߰]?O?`( !?Hm?K8*"?*աx?oJ#?%A?IiNc?. ? pS?ᙈ?3(?2u?#{?|?ub‡?ny-?dRZg?\-?Sj ?Jh=?AÒa>p?:n>:B?9n_"?=[KZ;n?E[e?RxP9f?a2@?q[-Ȩ?2?#7@?S%?Cl?G1?Ft ?ş2?wi#?3B?^S?(G?3?4Gi?YLp ?{6T¬T?tu=?n0?e-W?^\-a67?Ug$?N|?D/*܌?<5c.?5,5H?5Üg?8wlR?A`M?M cGy?Zݦ6`?iRlɔ?v?>? ;?겁?•j?q2?-`3?O?FI?ZC?d1|?N'P?CJ0y??#XD?x n?r$ ?lHp?d/lx?^\-V:nG?VCuk?Pxg-?FSϳ.???sLv?5&t?0utЛ?1ZO?2;>?<抑v?FϻX??Rm!?an1?o ?y@vέ ?44?#p} ?.t?Udo?R?P?O?[.e?O*?~5=.?uٹV?pEZ'ɞ?hXݿ?cT?\+!?Ugû?Pli?GG߻?#60u??$^~rzK?$'S?/>MРE?8'2.?B͵A?K0L?V {<{?ao- ?ij>?q[pa?uPvta?w ?xR+?wʮ?ts]/?pzE?j_<#D?d$uB?`O?Z]E`C?U;}?PL?JA$b?Ddž??zRL?6)&xO?/QU.?'1[?").H?(c? ? ?$c?0wKs?8z?B ?Izq?RH(?ZGA?a6le?eRu?hD?i)?htV۸"?e+Kɯn?bf?^pՃ?YSj?U0;ޡ?Qu*a?L [=?FN(?AQ%U?<5dt_?5*7O?/fG=?'=Vy?") f~Q?b0?F ռ?8A4|?}̢iw?SwCu8?$~ٽ?0w@ ?8'le?@0ųg?FC:?M_-Q?Rxj%4?V)֋?XP9\h?Zr?Yv#2/?A=WjZ?CL?E+bB3?FB[ ?F;W?GHd?Ga5 ?GG\?F'?FAwL?E*?C?AZR#?>"bo?8-&F?3\Q1?-p?$|=? ?ĭ?L2 ?LM#?^O7[#?Z9X?jnl/? #s?&^7p?-15?3g.\U?8p| i?=@Woo?@ j?BKT >?DۿM-?G!?IaB?KmM0,z?M.eb?Nuux+L?NğS?N8!bO?LR;(;?I]w?EX̀?Aن,?L^@P?@6֚?7q_?T^v?JEyL ?An彸?7~9L?/0]E?-C?&]5S !?'-^K?/r>?6ʭF?@ ?G^?O>?T6?ZH@<?`?da UM?iD ?oVd1?sӏ:?y'w?lܧO)d?ż?A&$?c։X?k?qs8wyX=?@C-ݴ/?G ?PW5BR(?Vg]?]"n?cD?iz]?pDR\(?t?1{L?y O??b?J&}Fo?S;5?_?W?E, ?/j?]va?vh?uM?wd8j?l-}i?`?:@?Q_y(?EXX`??e*?m+?sm6?x ?hnAlf?C \?Z?c8?Ͳ&?Dž?Ч?(I?? ?vSI?uŒ-?uS—#?g7YU?YWoW?L/1?A٫?>"L?s?8o锇`4?;,M3{?CGN?Ls -?T(?]4 ?eAg\?o+arY?u=?|k`?X1h!9p?TW?>I?qGbbӕ?2$?_}?2&?mi?wT3r?4^?M)u?l5E?y?v;r.?|֧~?p2!,n?`+8k?Q%?E+h?Ar?=?9݇c?@՝!?G0?Qg:j?ZHbS 5?c'Ry?m?uhR?~#kv7? o-&a?щ ?='A?:W*\?t-Oa?fq?!}ȭ?g?z>?`?1wi??M3?C?P Y?F;?sZn E?d* ?U{!Q?I]$?CL?@2%p?CU??LX^?Uu?`\3?i-,?s]y2$H?|A? `*,?@&m?϶?W9V?*Z ?K?ɬd0?"O=?B5ʭE?S56?T?ps&?1Ǘe?4,˼?'=0o?ɑ?ydZ?vj0?grȕW?X4S2?LRhzHg?E++^+?B9 ?G9.?Qu3П:?Znun?d^r2*r?pD:?xw 2?XBo=8?U?G?ݵ{aa?٫R?_ڳ?ig?Fr?4?"?Xө?D?/?͇Q"]?whAIb?0NR?r:?KD#?wǣp?ht0k?Y_t%N?N8R@i?FAm?D۾?KNG#fn?T8?`@IF_S?ia?t>ot?g~U?T\7y?!?' ?m@>?hc~?`UR?BEd?`x|?4/?t5m?!j!f?63?+()?c5? {Pk?FDl?G!m?Oj?Xu|?cUt!|iz?oU43?yk9¬?C:M'?卑Η?Y??1'?dä?>84?~#ra ?*?M?TW?\?u&??B0e?hL?AF?V?SB%?}I?tP27hn?eP?X@4?NuEb?GG,?I`9?Q.??\(OXS?g2Џ?s?im0?}Ƣ?hK>?pRG?W?-Ee?hJJ?dD?~S?O$?㵣t?@8!??km?nz+?(t?! ?|?c]?Ja]7?la?q-?b:)V:?V o?M.N?Ga.:?Km+A4?S[}?`-\?l'+?y&>v?y{?1?ʽ]ه?;?F4d*?F{?P`׻?ЇO?o`?wGh?gj?T? 7)?F%l/Z?ɢ|-?E7?i?W?h$?y'Lk?l(?`.?S;Za?Km?GGT?M.!^Y\?V vAl?bh(^Q?q,3?kE~?I0]{>l?b&?? P??ֺ8?͓?!?.o&?A6gg/?LC?XPm?~V?;P#?ie5z?4?:a?qJ ?caO5?! 2?sFG?g ,w?\!d&?Q?Ia]?F^Ê?NuĹ ?XG?e?i_4R?t? ?idN|?`@v?T愓Vr?KON?Db?E+%7?N7;@N?Y(~?hs`M?wvhx?M?E?O#b ?Ey.J?Q~?``/*Z?p1jTz?| d?t3[/?w$b|?V"8?Ka?3Ҏ$?w* J?b?$Ѵ?k?n?r ,e>?ª?U^?YВ*?|>o?uZ?o,mɁU?eX ?]۸ˆ?T\ ?Ls?CG6F?;-P?8p).?8ε\?AEw?L/I ?YW!l?gՏ?uRS?t9{?t*?ƪ$?l3?'i8N??#s?́ ?c@w?l5?T'?D?iΆSN?xP?sL!r?m ?e\?_SEN?Vh="?OupϘ?F ?=Ȫ@?5UK?3g[\_?3]Ls??X_?`'?Sc5?JS?~R?Rwv?y^?ht?g?e+ } ?bi%i?`.TwA?\` ]?XvWRN?T ?Qus4?L0h?GAA?CGF?=)W?5.ɠ?/ ?'A܃39?"r1?R?j4Հ4? EG?޴,?$:t?0-1?7Q?@88gN?Ej /?L0Ld?Q{e?U{Qا?X4k*)?Y[?Yf "K?XS?V )2M?S_ac?Q ?O*%`(r?AS/;?D$ȼ?Eկ> ?F9^y?GAWg?G遄?G16?|?Gs?G \u?Fâ?EIup?D$G#?Ay?>^l?8p?3]5i?-چ9?$iV ?mW?"O2?q#Nr?qY?s*?sA#?1^kt?"ԅ?) Al?0d"a?53\?; g7?@2:wh?C2&?E-%1n?G! Q?IJ>?JA?LE%CA?M&E?N_1RC?Nu ?M3'?KoeW[?Hd\?D9e?A?C?;0('=.~?40V?-?#e݆A?i"?,/] _?L?rEP?"`R? 2oK?&Jr?-Gm?4U=A?;",?A9{t?Dۚ(?HmiU?KC?OX5?QoPb?SwJ?T f'?VI#?>|s?6B4iI?.Wt`?#e{? V?mr 29?/`3vZ? xJ+m?&%=?.Ͱ?5d^K?=ͮ}?CiY?I.{6?NJ?R(!?U0-?Xum&?[pS?^Ëdj?`7PPJ?b>k?d?G\gi?@/5D?6B;$?-!?-j"?) W?-g?5c??yO?F (?O؜O ?UFP7?\-[5v?a萌Xw?f6ɽ?jR7I?oV?w?rc-?u1+?ySYD@?~Ď??N*5V?EkL?-z?W?~FTSp?xQw?r%\I?h~WD~?^r)?R@e+?Fzd+?>| ϓ?4:M.N ?3]ʖ9?0ܧt_?4TRJH݆?=X)P?EHQ?Oؐ)?Vm?_媯?ey?lPa?qi?uؒZ&?yޞڑ?}z#?pkk?̷̋9?%BA0? !?TPm?ۧ?f?5 ?bߞ?}+2?sX ?h~OmK?\ M?P"m=?DFM K?;079i?8yFh?5,Y'?;i ?CűD?MW:|Bv?U;?_$=?fX?pCZfd?v Žq\?|Tai_?>;?CzJ@ ?3\b?Ϛ?Ğ㳋?`Bl"??͈?,K?+-)?[0U L?rA)bn?,b)?}z?r%LG?d׃;?V\^L?; *d?A9 Q?I.@УQ?RZx?\- :?ey{.?pCR,?wUm!`h?CT?Օ?&oH?_ϒ?G);?dJa?izpy?3P??[\?[sF? {b!?Y6 4?N?Ȍs?r/k?b-&?x(?k)?]=Yv?Pg[ ?D=?A T?@x6X?Di*M?N ?W,j?az?lP;/?v ?栱?CH%c?zg= "?H.?1^-? ?g|9?yo0(-?\òƑ?ި|??/D2s?H^`>?H Ų!?d␀U?Eos?[0?秺?7kl?zꗇ?w?G}?BT?ܥ ?Z֥,?[(?YYXM?*ɣE?v?W# ?sD?dFi&?VKVȆ?KolmI?EAc?E-j\?K8d?U/!E?`?jX?u??>V'4}?pA7?1~?F?3{? ?t!"?fϱՁ? SGQ?WvN?p??K7J'?܃v?HP*w?ӯF?5u?SU?BH?tr9?eaP-?WL7,?Mp?F\?G!,{s?OL\)?Xu`?cU\;H?oUS?yJ?C}?*?7u?J M?n?m?.\|?>2I?}Α?Rx??\,?!jN|?$7~?B=?rEq?g?D?SD[?.%'?tPYWa?e5nѭ?XcG/?Nu-?Gp?Iq?Q@?[Ȫ?f 6?rDK?}م?m M?Fe m?Is?Io]?tp?=m?P>? ??z|? G?\M(?WP ?’xl?MKs9?L?s.l? w[`??5?re\[?d$/*?q ?Dm0of?۾?Or?L#2?Rn?] S=?[?{N?<u?x?Q{SS?>C?uO+?)y?({?Gb%?l ?}ڽ^ ?rd[?fl5*?[tv?QÈM?I"?FR?Nujd?X1X?e"J?tO3*?V?RȒ"?<?p:0m ?i:s3?BaH_??܂>-\?]|6?4?Ѧs?|"??I?F;?V|'?v*?D?+7?C<?y:*@Y?oVɯ?cUs\7?Xv ?O%bK?G"++?Ed?MJ+'C?W„atr?eQf;pw?tx?ټ1w?k7t?S?z*_?H ?q?Kk? }(? xV?Xmm|? '}H[]?!?u? [?5] ?%OK?2vģ^?uZU?>w?uһS?j`?`1On?U0?Kw?E-ٍ?D$?edg?I;R%2Y?FDD ?|T;?q^?f7&&?[4y#?R(vڞ1?Hm鬠?C,?Av~'i?Hd~zc?Sy ?b,{?J?z?2?Ib ?{4]?C?v -$?lPlCd?a<&?W-+*J?NO#?Dk]~e?@M?>`?DǒPJ?PgT]D?]ϨU?ky?xAH?a?q6?>M?AKzJ"?X&?5Q{?f9?3)?)? ?)8 ij?e! RE?GWw?p85?= i?r&q?C@?wa?pCO?ezIcZ?\-yLh?RƸ!D?I.P?A:3|P?a^6?;?͑?bfI?D;bp??1d/?|U8 ?v EY?pCL`?fvUPK?_`݂?Uʚ?MXmcu?CWgp?;A)1?5\?3_Yo?;1rg?D$?P =ph?\ M|?h}H?sxՊ?}6h ?aЇӝ?3PU?tY?AE4Z?Sz`? 7M?%[QM?)es?KS|?}i:iA7?yp9 ?u3^?qtf?lPj,?ezL~I?_ZxV?Vg?O4?ED?=S ?4Uv!v#T?0/ʆ?-{c?4F?>~H?Fn`Lz}?R@ee?^r{ ?h}JX?r$ʟE?xAZ+?~ߞ?f3?ڒ9`?_А??&"y?~9v ?ySI?u1D _?r㡈?oW>s?jȹP?f7?Pڸ&?a?\-fd?Uud?O9lI?FIdyo??y@{ ?5duhp?-}̔?) a t?$0?-q(V?6DFy?@0<[?Gc?R@Hr?\ n?d3ǎ/?kc?q1)/?sm?tɍص?tPE',?rw:&?pq ?lƀFV?i#;~?f:B\?cV" M?`BJ?[ ?W- +k?RƎ[?MXbb?Es.f??yƓ?5sMY?.yr?&RM?"Eh1?q1R8?#J?.[fë{?6 O8O(?@0?FȈE?P5E[?V\o3?]uC9?b-.1~?d ?eUJ?eB%@?d?[{ ?Xv-ʼ?U0s V?R(Q-?N$*\N?I.p`?C.H?=L?5d7Ʊ?.6p?&&7aZW? fޅ9?2Tl?(rb}?~vbJ?DFM?J =w0-?Pgf?S" ?VL(?WÂ2?X ?WaP'?V`Rs?B?DyQV?F=b?GHӤ ?G\~'?Gff?G֥x?GDu:?G1Ct?GHy>?F=k+̄?Dxw?BEDI?>^[.?8bkV?36?,Ԏ-?$w?g+ ?Qʸ?_}hp?^Ѵ ??PVB?u㍐?$R?,׸?3U\?9 9K??[Nb?B͎E?E?GP*(?Ia?J{r?K۴e?L^N?MP)9?MU>?M/WF2?LI?Ijq3?F0?CO{ы??|gm?9|?3ڰ%?+4^?"?9K?⠿*e?f%j?OPGSR?U#5 ?#Vg\?+n0]?3 0W~?9["u?@?E_?IcQ?Y?MDc?PYԂ)j?Q\k?SwĹ9G?T[?UHqs/?V2U?V<ޞ?V:6c?UK $?S`?Q_0Y23?Lugy?G+s?B y{]?;kEr_^?3j$?+!z5x?"Cd?9?gC?sx?#ը'6?+??3^ߚ?;Yf-?Bo$?HHF?Oib?S{H?MA%? D?%~^?K/Rd7?1rV?R]?vui? W?w$1^?o5`\!?cI¯Щ?V۵rw?K:t?B mp?9'l?8(k?9 P?@{ ?HqNY?S!D?]re?gֵ4?q_\ ?xzF?8aDv?{G?A?NK[??r,讵?{Pg?L4?a"W^??Ys?E# 4 ?O|y=?XEp@?cb2ٴ?or/af?xJVD? [?k[R?yFj)?2Xl?pX8?d"sSB?C?uKG?1I>?blY?:ȇ?]yg?R/?B5}?aN?Z?ã2?sZ z?f^:?XTѪ?L\]?CNͮI?B{?B5?Ibe?S<ЯԚ?^fͯ?iRC%s?tr?\?k:?R?^5?Dҡ? _G?yULB?C2?kj?ğV?}d"?!CӤ?՟C}?;$t0?V>~*?B?{{7??Rp b?06`z?R;|?|mp k?o;?a)\l?S* ?I@'A,?F= AU-?Gk?PY\~J?YQ˜?dO?qe>?~3Xy(?Aez?288?n?Ma?l-g?hx1?B>h?%?sE?B"?WV m?,?.x?B, ?Jr?]c??S36?~jx'e?pV3?bfwT?UK/?L?GHF?I`V?Q P?\!΀?g}?s|?ati?9 {?pub?r?=?h8Ʉ!?彧{N?}7?n?`O?@_ C4X??˩?}3?60 ?!xb?OL?c?Jε?m ?q-P,?bĎ/?V$2??M/ z]?GI?JF1%?Sw*X?^I4?i8X?u0:S5???ca.ڲ?xᅣ5W?7 ? gQ?}?{VaL?:^W?7&?gE?zZ ?ʽ"e?WHr??ގV??`^?%!UC?~»hPF?pli &?b|.?V<Пg/?Mt9m?G­?K?T:aw,?`hK4?jR#?vEs?=I(?pg:%?Åh7~?C#LD?XR?H:q?KI?:ǚ?ŅO?a?B ?q?@F?jv?Պym=?t^i?F? 4J?4{?{&W9?oC;CIu?ab?V}?MOu?G6Y?L*?UvW ?aA=?lu,;*?x9p?LWW?zWy?s'?jT?>,n?P?ajA%/?7H??p3D??y0?8 C?j'?1??~@o?kiY?u.(n?{5iR?Mp;9?xz?lޮgY?aAG ^?UGÉ?L!Z.?Gi?MOY$?V~I?a\?ox_?{1?xE8?1#?| R?ß?Ԯ8]?W^X?@.ѝ̏?Ca?B!f(?Gi?**K?;ȡ?$8c?Vڬ?Yz;?C)??!?r1@?>`^?vq?jP}¾?`i_t?TؒF?Kq?G)Q"?Mk?V<n ?b?p|s?~?#H>N?_/]?/?ݨ&;?xB?W| ?(to?zX?+B^?9 oS2i?`5?CO~ƕf?LC#?X"Tei?fmW?sY|X?轥?FѕT?_?AJc?QIM?]Un2-?/2?@pq?r` w?ulWD?NӇ@?dqP?q?2jv?au?l9^] ? /?x:g?o?c?Xȇ|?OT*?Em%0(??[M?8?W??. ?G,5(S?RmF?`c?ln:R?w"wڭ*?우?ym$?q~?%-,N? +?Mϑ;??݉1?h?==?~4fI?y9Yv?t?o?g>_s(?_ʪ?UPҏ0Ij?LUL?B7Ǵ?9& ?3U>U˾?,Xv!?3|?;m'|?D=?N?Xxv(?cIN?ln0R?sZJg?xXW?|lGYz?~sH?lcRl?~Ɉ?{eQ D?x3}?v>FW?u1i߼?s (?qʝ`?nh?iR?c?]˜?UPƪ6?MRv?D\Sj?;ykP?3^И?,ۀ?$/X?+7?3C?<ܡ e\?Dۨ,:?NK?V۸)?`d6ͧO?f8:?b? ?a[Q?aB [J?`iԁ?^[OW?\y?YR?Vci#$?S?+${.nk?3Kf]6?;mx %?B ZJ?G,B ?Lk?Q_Ӑok?SY?UKA?VyK?V=+?VGU<?UX?T+?SwRe?Q+ +?PY4?MD*aN?Ic(?Ek/M?@Jh?9xP?3 H?+nuvS?#^BC?V>?Qh?`'H ?G?<?"D?+7!3?3U+?9I8 ??DH?CO鉓V?FӿdCQ?I!+?Ll?M/?M%'?MPO?Lo?KM?Jy+qQ?Iat?Gsg?E~7?B_̬??ZD?9 L?3T ?,֏9?$N?tnoI(?P LQ?C? ?:?1y)?Y +?$&%N\?,h$_?3"G?8,#t?>ZN$+?B4 N ?DfWOG?Faq?Gbwk?G ?G'?GR?GW?Gnb?Gb (?Fa,@?D >?B6Z ?>Y&T[?8j?3!M?,ž_?$׷?WeL?0.rC?ᴉ??9c|?Ft? ʜj?'B?01?6=%ؽ?_?LP?LFº?KnHF?J@??G>ag?D 3c?A&eo]??NԸf_?G2/4,?A2)#?8nl?1 &n?'An*? \5?$Eij?'G4f?0?8X8?Aq/?IRhs?Rt?YK`?`3y?d NX?h[q7?j_$H?l("{ ?l?l%}?lǙ?li ?l I?l) ?j&@ݏ?hS?dhT ?`{쾰?YY?R6nSV?ITi;?A:T?8`$?0Q?'?,?0!˕?7oT5?Ab4_?IQbq(]?S+mY3?\Q:C4?d 3CD?lQk8?qi>?u\;{?w2o_?y'_o?yS.l?xs?xh;?x64?yT2?y(c?w۔13?u]I6?q6 -?lT,?d @?\.G?S-o?IT%?A# Γ?7qK:?01?3! L?6;geM??1 ?G0?R@v?\/'?f Z,0?p a,.?wR=?~4-EJ?>98?n?4G}?ɔ,?MyIC??MN)m?I5h?/ixA?p?@cM?~6_=?wTQ?p·g?f$3B?\%?R+8dsa?G2uOk??f~?6=3Q?8,8Q?Xq ?A,?HauE?SEHe?`z?lQX?wRk@)?O+?6E$m?{?8O^?'00?`;?G?u*DzI?S(?u !?(W?{̀}?(t?}??8#gx?3?wTj%Ei?lS"?`h ?S7z+?Hrqg?AΜI?B;vu X?Da2?MNK?XBZJ?dw?q-?~3k?ź]?hX?/H(?qCu!?Z;?a?[l;h?kW?[v?kI?\x9?m?0Y?;?0?ѳy?# ?~6-9$?qŧ+H?dC?XFL?MH?D(,?DYܠ?Gժ]k?QBq?[?hԅ?u[U-?>?=)?>ߓz]???rr?D]4?#l)?Pk~?[h?>!?v@??J1??E:?$x^?D?5&?Vi/?@壓o??p?u];'?h1?[?Q2ed]?Gڹ?F`5?JD?R|r?^o2?j q?wuM?qwV?}-?&.U?g?#@a?e?t?E ۖ'? ;^tu?i ?e8Yt? E? -7b?FuE??$bQ"c'?a*?(3H `?"T?/?wVe%?j?^qE?R?J?GaQD7Ob?KmD?SdGI*?`-'?l't?y&jC}?oRL?Ö?)'?D:?[?Ern!?ܢ'?m؟??w ? $?бe?Oi?FmJ?!F6F?|?+i?:!3_?V?y(E^X?l)?`/ j?S" V?Kn.x?G?LE?TcT?`؊ J>?lģI ?yR?ȜU҅?í5?Ngd#?[L(?W?f?ωڕ?[P &?7o?ӕ?8F%?!9ف?иI? l?C:t?\MŐ?,?9m?8?ySj?lƫTG89?`ٱ?T??LF'\E?G~&e?Li\†?Ukft?aA'?la, R?x/~4?LTa?zVx>?s\z?jf)?>pb?ǸcCA?)+?7Qg)k?Ao?p3+{"}?}:?8m{&?/b~?F<\??I?kw?ua;?{Yl-H?Mg?xX?l*?aBx?Uw?LIo?GYsh??Lœ?U;?adM?lⶳ-?xA;˲?YQ!?L?Qw?Z?Ф]?KzN?vJe?iZߪ?p27)?h@_?p3w8?=?wmD!?0?^P? c?[on%?Rv|?Mv?aF?xR\8?l_p|?ae֮G?U R?Lނ>P?G'x?L9?>8?ȧ^?î?H?[_m+?΅O? 8BN?/?$?8 2?zGw1?8ݺ ?|m?? Ǥr?.?\F"?_,Ĭ?x^:c?ɉH#?yS P ?l?`.i&SX?T ?LEɚע?Ga̕?Km,?S;?`.2?l(f.?y&?~2?*?Kc?0H?)?Fk?xb-?н?w$?wtPc?Ok?J#?ʙL?FDA?8;9??wؼ?eA?38n?y'?I?l(vG*?`.Mș?S &x?KmCf?F`!?J2?R`?^p12. ?jKȲ?wٿLM-?/H* ?i?&M\;?My?#nt?ΗR;?FDu? 9}3?i3f?g?ɡݮ? ?F?\^X?$SG?f¢?'?).?yw?wM?j_䐄?^oh?R5ұ?JT _?D8JE?GL?Qi?[Ɨ?hpZҗ?u\?>LY?> ?4k?Bo?u\ )|?h,Ei?[O(?Q`B?Gyo?BF]m?D*B?M]?Xl F?dPA,v?q2?~4!d7?4n?mV?/ٓK? ? W?fV ?\T#?k=6?\.řm?k䁌O ?\%l?aa2?P?b8?0&Fj3?˖?0EJM?~4-*?qn\#F?da8 ?Xق?MP0/?D|ګ?>Z)ω?AW?Hx ^?S輦?`?lRs6?wR?+.?6pf?W#?]K?'r|=?%@?([?u/-k}?SR)y?uiO:?.?s>?'/??% i?6F?v`?wRT6M?lQ+-?`'4?SêN?HUjcA1?A?8@?^^?? E?G3Ka?R&.?\t?f>;W?p͵'?wSIO?~4ֿQ#??@>T? t?Xu??M,?#j?MLV??Փ?oO?2yX??]?~4O<?wRu1{?p>?f k?\hpF?R^D?G0ЧJt??B&R?6=L?,QgY?0{,?7s΀v?Ahl m?IU56?S-eAx ?\ܔ'c?dZ?lSz?q)=:?u\⢺~j?wئl7?y'{?yS/u?xFr?xՐ *?x謩"L?ySVv ?y' ?wJP?u\Du ?qH?lQCv?dBe+?\a?1{!?S+eE)?IRo;e?AY?7qX$ N3?0w^X?$8v?RBR,F6?YKP.?`"f?d6k+?hpH_?jbԪ?l)O~K?lƹ1S?l^Ty?lǭ1?l ޼8?lj?l( ?ji1?hNM?d o?`(?Y7Ȟb?Rui?IRN?Aͥ?8 ?0Qa?'IXNP?Z$d ? ̷,N.?R+"c[?QW7?MO?H;/?C_^Ҵ??E?7pJ?0zwl?'@vF? :sQ":?G4?FE?;C]w?Hw7? U/X?'*{?0Q0?6>eC?`UZ ?B֬%?Dy>f'X?F>>{?GIX?G>v?GSZ?G׏u?GִOs?G ?GIb2?F=Μ.|?Dy,w?B=n7?>_91?8A/@?36Nq?,Ը@s?$S?g*?yac?^kWi?^@"?7h"4?9Uj]?"O?+4#l2?3ne?9s??xjD?CN??F<`W~?Iڝ?Lj U?M//Ex?M7!V?MQ3="?Ldu?K1?J?Ib-1?GPl?Eo?B899??\̕?9a!?3U?,h=?$#J?u^?Or?ୃ? ڄ??8kޗu?"<=i?+#2?3L[?;j)R6?B )M?G*u(?LX#g?Q_gA ?SO'dd?UK?V2E?V=?Vvy@)o?U xu?TR0?SxדOz?Qp1'?PZHt?MF?Ie5rg?EW$5?@AW?92?3)?+pu04?#)БBY?Vzo}?OC5?fx6?"ƣ?+`7?4(8?Br?O)'kD?H_J?BSշ9?;ş,?3˻i#?+K?#N+?tT?$(p k?+2Ӹj?3CoR??3}]ls?;i(doa?Dd|?Ng0?X ?cH1?lmӅq?sYΌ0?xXx2K?|lAjE?~x?loB]?~4?{Lq56?xM`?vDrZ?u2L%?s~JO?q˻ ?n?iU M?c⭦?]LB?US'B?Ml?D^ߠ?;qI?3`KT?,Y>?36h!?9B?B =?K?VّD]?cH%.?o C?w"H?R}?u>ӍA?QA -.2?$?JEϚ?$w?᭖#?Ms t??7@?݊5f?T_?~605?yx$5?tpb?o=?g?_5J-?USC ?LX)$/?B.Jڤ?9VEJ?3U`n?8γ??&!?G)mxz?Rʺ&m?`bpVX?lm5M?w"eH?0?r%?qe?z?Atl?cJDXK?`'Nc?m?{y3?s48E?\?߁B ?CtKv?g`\?+CT?x:8.?qa?g?]⸭?S#E]?H)j0?@"?9 J?>^4Y?CM;љ?LI?XvhKS?f.??u?k|K?e 3?rg~?3~:w~?̭q?m.z? H#g?x.*?o=?coL?Xt?`?Oų?Eդ??[>:έ?Bsn?F?Q^$/)?^紶?keds?xW˱?tH?qTpT;?AM ?l?,?T2?!ҕU?jb?ćh?k; ?D: d?y@?76w?о ?`*f׿?\:?mr1?Ok?tzHᡅ?iT_?^eɂM?S>t?IdŻxO?BͳO9I?DxaϘ?Ih2n?S,=h?a(o9?o?|km(C*?Pt?whq?P4?SV?eX?B&???՗ʉD??SD?Zq?8e ??uC?N˔'?.w?`q ?̅ 9f?D3?yx?n ?b,B?Ve?MFQ')?E0D{?F{?\tRX?KN?B?Hj?Sܥ?Wr? ?BE?f5?eEf?i27??NC/?ʨE?3[Na?COsL?~5H?qˏ ?_?d?YTdU?PZt:?Gn4n?GG?M-C?V )*?b5`*?q,?k bz!?vWN?j`?`iBb?TA./?K۴Pco?Gf?LV]Z?U]E?aA$-).?lyI?x@f?L`?za8S?t}1?jz ?><7g?"?s]?77?O.]@?p3Zw?JҸQ?9v??i\H??w?k'?ux!_?{Yf4?M+G'?xKr?lR]4?aA^?UZOW?L3<,?G&?K*?Tw9?`h29R?jN1xx?vb)?=uc?po~?נ?C:6 ?Xl;Q?*iE?;?;X`_?É;3J?GI ?Cn2Z?<?Ar>?$)?%:"?g?}`?/z?ܥRY?{@\?ovݔ?aZŃA?V ?MOG?GLk?J7K?Sw6h?^G+?io?u0l=?[`??cyϤe?x2H?7O h?bJ}]?~K:?$K?;m?8?5dA?{9?S{?XLǙW?r:Y?_?[?`Op?$Ŗ?~F?pS?bԬ4?V?.E?M??>_??\p P?Ea)?Oi?XQ澁?c⊐ߩ?o׀?xʌSh? 2O?lqr?ŭ?2 ?qfm?d;/?4?u\^`?B&?n?R:?]Ps?Q?A] ?`-+A?o l?{?sY 3?ftR?X(?Ll?CNjA?8Ɠc?925?@IQ?Hjk?S#|:?]ܿ?gY_uz?q`V8!x?xe?#¡?ZqS?BAA?ޥ"(?c@U?rB/a?M[?Βdi?$Y?JGw?u?Q9l?u/ZS?;y?w"jm"?o i?cH#v=?Vߛ^?K.?B ?9Юe?,B h?,ڜ#̻?3{*M?;2h?D_I?Mށ?URї*?]N?c?iTta?n# ?q.\?si4&\?u19E?v]}?xm ??{ ?~_%0i?lByn?~GTTU?|l \IJ?xXGy ?sYN9?lmH?cH#8?Xz?N`_?D׌?;j7?344o?$k8?$JB?+s R?3?HEC?:R?VeKX?YTM x?\ }-?^nNa?`ie?aB4ކ?a?bKVd?bw?bf4q?a(W1?^ێ?Xu0?R-HK'?K>ϖH?D\G??V ?UKJ?S~L?Q^ɰJ?L^>&?G* ?B Y`@w?;jVg?3 x;?+ }?"t#?:Ք?_?r?Qy?wʉb?$t>x?, //?3Vߎ=?99??]!a?BE?EG;^ ?GN?IcD5?Jh}?K 4Zk?Lu~?MPN ?M2?M/^о$?L ?I0?Fґ_?CNbY??#?9ԒI?37@?+3˿,?"W?9?ЙM?A Xz?qSޗ?2eD|S?nîr?$Pt?-/?3^͆?8˪~v?>`3?A&X(jv?D%?E5V ?Fh ?GnJ?G4v1?G({?G|A?G ?F-K9?EGT?D%d>?A)?>_5Y6?8Eא ?3^2%|?-4?$ڡ?m?8?q̛?pW?+U*?E!Ϯ?#{R?-ƙւ?4(?;0 ??AN>i?DQFT?Hdw?Kp7V?MԠw7?Nwyd?Nawc?MG?LGa`?JKAȲ?IN?G#9Ly?E/O4B?CM]?@?;2->?5I4+?0K=+w?) ?;=?"t)#?0]U?q`4Q?r0?Q)?l(?#E?.V\?6A ?>{t?DxE9?J r=J?Pf[?S?VKq?WÐQ&?X T?WaB5?V=Xڞ?T~?Sy+i?Qxyz?O2?Kz\?Hp Z h?D- ?A;av;?;Y?4VMq?-"r!A?& n8'? fP?"\G =?qnd?l<: W?#?.UW6?6FK?@.t?F-y?PA?V[#C?]eA?b,iA?do?e>GG?eWrZ֪?d0U?Nq '?I1?CW?ى#?=2?5fOp?.Q?&'Q\>? ,AG?/mk ?$ّl?-?D?6@_ΪX?@.us?G,sp?R??\ ?d[x?keT?q1j՞?sp~.?t7?tPM^rX?rĖA?p/p?l1Hp?i$?fJJ?cWz7mi?`"Y^\?[v{?W/hv?Rt?M[ؒZ?EC FW??}{~?5A?.|'/D?&0?"Rܢv?-{ m?4˿3?>yˉy?Ft1]?R>S?^pt~%?h|_$:?r$@N?x*/?~R?8E?ړΒ?hI&??0On?~6?yT=?u2+NW?rdπ?oXPbX?jbCZ?f9J}_?a[б?\0D&y?U*f?OC[?F??}\\-3?5fq ?-p ?) C?3].bE?;.Q k?DE%8?Pdab?\ Nq?h|+U?sCʇ?}_WI?aK{zK?3V n?L?K '?Sڤ? *\#?%XlT?COa?ݐF?}LjP?yܝs?uڒ̾["?qO?lSv9?e|Y\@?_.?V ?O+ ?E6?=Su?4V)B?0o?8޶?A"5 ?J 6ў?VZYǕ?d-#:?r$>Q?}3f? ?qbhOu?Z!`Q?* &|?%?>O>?Q?`?NH?H?=?D1iM?@ aN(?|WD!?v 8?pE7_?fk?_a?U*1'?M[z?C 7#]?;AGY.?5h3h?>^?D+-?Pf RQ?]0Mڿ?kE?xjf?a?qKO?U?ئb.9D?7Ht?XuZ?Fb}?LVp?E#?l ?^ ?eE?Hl3?g?U#?J?HuW(?'?C?X cG?\0?z37?lMp?ot?33aT/?JB?|p=?DV/?v Z?lSz0?a#O$?W/s?N?.?D ?@V?D#U?Km ?VJ]`t?dj,?sqNu?G?4k?)t?X~h?&;=?Ȅz?-?B@|?»^#?HQX?>)}(?8M?S?ÒL?ֆP?fd&>?J,k?v=f?|VGZf?q˃?f9퓚?[uv?R)~?Ho??Ca=9z|?E5Y?M2$?W^?ec?tD I??ą~+? T?/B/?H>&?su?K"?ܠ?vY˹?W? ׬c??uؿ?ȗB?5?ȹ?3ܹ????G*?u\#0?jʯ]?`jNsV?U1 ~?K?E.0?F)?Nt /-?XL\}?eCun?tO,֣?1?RTtu?0*?$B??Bbm ?}?!?]LWX?6BC1?#n-?"?K9?r?JИc?05T?\P \?rHFy?{ C{?=?(?Q\??iA'?uM?x/j?+9?GTH!?>K&?}-hU?rQA]?f`8A?[/?QH?IfЭ?G ?MnOG2?V;[h?bZPc?pjy?~ .9֢?#ƥm?_h]@??]%Z?Q7?W{v?).'?z5^0?8 ?9S@;?<0>?(P?y(>#?{?8?y f?d}v3?I?Hjq?u1h2k?iko?^v?Sx8!X?J?G7X?LEMO?T7ԓ?`ث!(?lkZ?yR) ?ȽM$%?˿I ?Q ?[?5т? Hp?Jުa?VOJ?8r?(?9P:?V?ѭY4_? 7-j?xMu?\E$?ura?ľ ?Ql?ySJ?lXN?`~Z(?Teڢ"?LEd:?G\ˡ?J8(r?Swu^?^X&|1?iqY ?u0iA=T?'\?堂l?cm/,d?yyh?7h"?}^ `\?~gԈ?2r?<3?9D?W?{Ԏ?A^?Xsg(? D`4?Ugr?#?`ʗ?$;Z?~\F?p%u?b)!m?Vgm?Q3v'?zFA?Oxv?{ rP?Cį?]?OD?/P)?ߍn? 3P?er?Ć?>g"T?ru?d;})"?W`\?N_;[?F ?G"L[?Ozte?Xv-WT?cU4Jo?oV=%?yD?C9҇e???!?! 2?e[?>β ? +2?dD!K?Jw?]#r>?H>v?CĂ?CE/ ?R?dyH?g?S\Z?eg$e?tOw?eu`_b?X>&?Nu3?EՃh+?E.L_?Km'=?U0'?`c7.?jV+?uطY?>Nv|?SE?1lN?ezo?4.c#? ?uVcУ?YG? >?Xg?NZ?u?Luڡu?؋?Hf[?`G?? IF?"Hp:?t^I/?eg8A?WpZ?M)n?D$Qh?Cb`?Hnf?R)723?[?f7EĂ?qv ?|Tg?ڣ?H'|?eB@?JZ?Sr?Z?8CSݏ?R?k9*!?3+,"?CM!?yQ?Dh?t[?Xδ?)b5? %Sr?rȘ?s0?d^?VK>?Kn! ?At#?@L>?D;?N4BKI?W.e ;8?aeT?lQC?v cK?Cq|e?z+g?H w?2N*8u?c?S f?yǠ?\p??F-?uɜ4?)Pp6?Hv5?ym?F,^?D?YpD ?3ZP?~#ن5?q0TД?b,$@?S?Hc2:?>_8x>?;x ]?A;|˲?G?w8N?t͑?X*@?H?أuܑ?qA?a?x听?kky ?]?Pf D?DVw?8 ?53?;Aq?C]f?M[M9Ɵ?U`g6?_|?f?pDBo?v ˗?|U:??D+?D)4?g0y?j֋D4?į:!3?`ΖIO?zo?[tK?5?)O;d?Z*?qG>0?g?}+?r#?d ?VZ=\?J Lغ ?A4hh?3_Fb?0 C?4W,lP?=W?EX>J?Oq<_?VE?_?e{KH]?lRA%ǒ4?qd|y?;Kyg?J ?X3w?~S;??x~26?r$Q?h|y;6?^prӈ?R?b?F;?>{(,?4͍?$=V?"Lql?&+@!?. W?5?~??~a5M?Ey/v?M[ ?RȠ6?W/I?$[?[ZZ?`Yi$?cWH! ?fߢ?iT!?lƥ㵩?pXh}?r6n'?tO{ oΰ?6AW\E"?.W.3?#b?ës?qͷ:\?tdiŃ?s!]?2~?"qE@?)8L?0j6?5+?;%,?@ Z?C`x$?E//wJ?G$O+?IM?JF?LGo|?MŻ?N``+?Nva=?Mx?KoV1/0?Hd[U?DƲ Yd?Acfj?;/t ?4̵>p@?-ƅj?#J?Ie?,\??KSk@vK?IJj?!y?$R_?-ڍ?3]hw?8^?>$-K?A PA?C?E-(>x?FD4np?FM9?GJ5~?Gcnq?GJY8?FcB?FC?E,s>?C;j?Ajx?>#s?8a?3\٤F?-"%?$Z.?< ,?bНk?K)Ŭ?J?W~I?ټ/?$K?//`-=?5ǁY?? Ƒw-?JCz3?T:Yl_?`>]Z"?gZv?p1 ?s-8a?v"?wOn?v:?tPIԋK?q.G?l*vnJ?g!3L?cW?`BGň?Zi?U)'w6?Q?LwK0?FYK?@ECS?6G?0s?'C@_?".>? H5?-b1c?5/"dW?@5*Q?H!??T ?a\?l͕`U{?uRy?|Ւչ?R1?հV?-uu?GIG?u@r?m.R?y( ?s)>?oY)f?i(t[?dK)?`?%C?ZL' P?TR?O猿,?GPh/?@BpI?6 $#?/xQf?'F?&]w2?3[ŷFj?!8?lZ";u?wcA5B?tW?uCf9!?a ?8X9u?Mj?(?Sl ?K;j?<^F ?p?yOӠ?tA"NG?pF' ?i! ?c٧v?]ߌ'K?VkQy"?P]?G+x1?@Ey?5t<?/Q?-Fjf?8yrH?An̰?L,n(?YU~7{?guE?uRuɭ?tWtX!RO?E h?Q\=E?`ݡb ?p1?|3[?t?a?޻L?|?LAU?$?3mջ?wJҁN-?n?{?Ig??r$z??Vn?YM?|#N?unη}?o/]?e ?]l  ?TnX?Lv"a?CI*?;/BN?8plF?A5m??I\E h?Uy5?dM?s?H]?ϼ?_"?L"v?/`{?1V̭/?5?jg?޿?!ϥ?,/V?Qv8/?G;b ?BQV:?FA\bA?Nht/?Yd{|?gHl4Q?v=Ҳ?v?D(?Ƭh3?F:*{?$G?%?d+B?!OT?ܰX?ˮ&?te ?f=?)?iߨ?~0?j7?^!?V^{?j?t@Cl?i3?`AlQ?TY2?KPx2?D]'$?F?Ntc3{?X[Ÿi?eޔ+?tO-=?l)@@?`.~?SgL?Kmٲ?GH S?Ia:B?QZJ??\b@Ǭ?g\.?s^}?Z?ݕ5l|?p- ;?*?=C_?iPPNu? ?Y:?A}?\٨?B7܎?;wu?D?u ??!?j^?cuaGE?JwZ<'?l{wA?q-&M?bZE?V W?M.(V.?F~?G" P\=?O_P?Xu?cU}w?oV+ ?yu?CJr3*D?-`f?B.?ARM1?Q??k|?>gM?C:h#?Ѱ??^),F?~(?͸A?Ch?7?vA?' &?SyOu?6!?tOCU?eҗe?X5iN?NuМ3?FB.Y?DR_ ?KOL$,A?T槥.?`@1@?i'/"?t?A#?h[t{?T,?Bgҹ??S5?h冣F?!,??dos?P?ǔÅ?p ?"o ?G(??ׇ?B?o?]b}?&Q?v-?gy_#?YeHA?N?E+XYc?B)?G:7K?Qv?Z镦?d A?pD}T?x a?Xd/d??O<)#?EyT?Z?J#{?ig:?FK?P??DO?E ? ]^P?7#?w:Ρ?6]R?ۗ+S?~,D?w:<(?hsxB5?YXQV?N7и,6?C B?@|d]?C-E?L읜#xu?U{?`3no?i?s zʻ?|ӘI? \ ?􆂱?{<vo?36\?qHG?8?giӍ?喏;-?CZ\S? v6? q?p+p?1fb^?3p?'j"Q?[h#?"V?vH9t?gq֥/?X3-ML?LQXu?AЙ?=Aι?@dT`?Gr}?Qҝo?ZJJO:?cU=?m4_?u6x?~$?  ?[ ?J?6? 9 ?R?!06+?//?iF??1i#?-?L <??cx\?ιa]?s4?d9?Uz*ξ ?I]\O#Ě?8qڪtcu?;0|V^?CIM?Lv?m @?sasK?x-ҿ?iŬ1?D@alU2?dP? ̚{?c8"S?!K4?I? ?'w5j?Fn?C?t~-?t(E?uRS{4?gr?YUF1?L.鈴G?Aو`?3]Ჽ?-KA?/7 \?5?@E.?E?Gu?PqWR?Vjv ?]7+Zc%?c\P?i-?pEqd?t@T4?y ?tsb??JyQO:^?Sѷ?*6C?/E?^?l?tC8?t_8?wb\*%?l/O?`>&$?Qc ?Eq?+CJ ?T6m;H?JD?Amo5?76Dy?/0O?-?_E"?kpK?hMm?"/}eF?'E?KR1/8?OC?Q:o ?Snxye?V?X -!?Yf'j#K?Y2d?X4=t?UzxP?Q}{-?L.O?El?@6n[?7ד~?0+X A?$1?NJȧ?Km?^3k? b?&_ 1 ?-8?3h 0L?8r36?=CLc?@o?B)=^?Dma?G$|En.?Ic?Kp '?M0w?Nw`?N&ZE?N8lz?LR[?I]Ó)?Er#?A_9?*?{Tgxr?0?/X?f?N]M뻣?$}rC+?/: ?5V ?<|mt?A3$O?E[F\?IpXP?L4kFN?Mӻbk?N:l?MqoHt?L?J| ?G n!?E0tz?Bu?@?= 3 E?9(g?5!(?1[ >?*C{ݏ?$^KO?ۀ?7<;W?נSp?d,T?z(J?M7?$oQG0?0t:og?8$%?@h͵q?F?M^(?{D?F}?%ﺧ?>2|?h?$|-a?0s:F?8xw?Brqn?I\%D?Rs?Z_/?aDo\?e! ?hc ?iħ?huܞ+O?e=D?bgrr?^s7ȿ?YUq Y?U3NVi?Qw>?Ly PR?FQt+)?Ah%n?<:&Q?5?/)?'A*Y?"+.?dGWk?E"?5?$$O?/9CH?8#>%)?Bhn2?|Pp? }?|?u3?n !?d~p?\?Sg?JR ?A֊?:mކ?9ʞn?B8?L1TA{1?X՘$y?Lc/?E}?Xti?Ac?6(ccj?߳BO?%?ƿ5?@?{7P?rF13?h%Ej?`e ?UY?L Cc?C % a?@O02k?E*֊?iՃH|? ]\?Ip ?6yaJ??Xֻod??v/?B?S?]ȣ5??,?~>)?p8]J?bfd-aD?UK?LOKQ'?E2^?E-_?Kdm?U0z3l?`$*`?jȖf?uض`?>#V? lv?2%q:?;vL?4 ?Sfo?u3?5/_? 7%3?X?P=G?ؙ?Lu? h?H덞?1?J?B7h6u?eCW?tb1 ?eƭ(e=?Wžܷٮ?Mc?E+,lo?B V?G:~]Y ?Qu0<#?ZOUN3?ds?pDk?x7?XscA6?^,?kLIo?oD?Lf?qDT?j! aw?FXr?:px?U3?bO9?E;ӗ4?$ۘ?X?wPU?ᇠ?r ?X6?wbe?hs\?Yx?N7S=?D945?@R0?C R"?B略?Ȍ1?W{S$?FW??-? ?wG>?hGյ?X=|t?L2$i"?A[_?9 }?:K,7?A=\x?JA?S/Va?\:z?dj?nOy}/?u)?| ?Ɉ?ҝ!]?2Kp?RPE?R0?iG?H>?K~?o$??W(?K|? ?\?8vX?Z;?uO4c?e?V(d(?Innb?=[O1?5ā1ຌ?5.?<9Q?Dc"do?NaL?Ui?^^7r?e?wLIQ? j?Fz 3?U?CD,y?oG)?#G~7?֦x}?qZK]?an1D?Rw$?EZ ?8J#?1[x?0vY6/?5 ??M#?F0:;+?PD?V!3u?^^Z?djme?lJID?rˋ?x(I??v@?B֊^E?}?Џ?ߛqn?w?9x?) ݇?/NA?.i?~?B?v@P'jJ?i=*?6͈Z?? C]?D2/j:?Jô?P[$?U׸?Zx?`|yˈ?d ?jΞ/a?p7W?t]?wZ 1w?x{Z?ws?uPÉ?q[2-?ib9?an6v1?V }?K)?B?9?8$)Og?/<|~\??935H?IbjD?g;H?",B?'BCQ?/?5;}?<:Md(T?A_L+?FQ(?L (a@K?Qw д ?U2U'?YT] ?^rY(?bg Aх?e^6D,?htEHz?igN?hM?eIa_?aޚ?Z@?R܏ ?%L?$a4??*G!?#]}"T?-H?4}s`?;ub[?AE6?D{b/?Hd42Ц?JCZ?L59?LUE?Kry\v}Y?IU=?G-?E53?C:P?@GO:?=F`?:fG?7%3U?3nQV4?/ kj?( /?"O?Gs?++?Pn'?@Cz?| a?)?$dba>?/AZ^?7ǥ ?@.s?E:gu?L[M?Q4z&2?Uqѿ:?WP?Xؗb棭?X6Pba?VM$?S\xr?QǙ?MI#O)&?Hq{ͫ?C\#??ynѪ?9fQ3?4tj?0?*𢈒@?$b%.? :^>l?B|D?zG ?_F?\%?Uc<?#xGd^?/ǡ3?8zV?Ap2b\!?I ?R^d?Zc.?aP N?eh?g(?h5_?gs;G?d+C?a*z(?[?Vg ܗ?R++`?Lo6?FR*3Yu?A&?:Nd?4R?/Un= ?'r@?!ﷅP?`{#?/?yTdZ?)1X?"K?-Y?7K!?A%d?KF-hu?UNv ?a.8$s?iU.qJ?q urw^?tt]?w[p+?wP?vZ(?sHRy?orP?h.Jd?b-H?[A]_?U˅ ?P\?Io{?CFD?=Dj?5ڌq?/ӵ?&Ԛ?!N?Lҝ?A?LS?*?4~?@._?IeB-_?UW?b?n-?v]lMs?~mM? /~? z ?嘿?gQ?h?|n/qaP?u^'ԯ?n2b6?f9!2?`WiB?Yt"?S"0N?Lh^LZ?E9L??|u?/*?'q7WRx?$-?(y?6 -q?AD4?LXY#?Zb[?iT\]?v󆅉?Jݾ?RW ?M\?Kΐԡ?P.K6?s?(L#8?+W?/?Av2??|W̔?si?lKm?dvn?]ܲb=?UiG?On?FY5C??{p^jU?5ٿ?/S6%?*6N8X?/ q?; d$?DDC?Q&TX?aAp ?qƟ?~Y?\?^\a?s?Jd{y??G.?4=n?Y:m?S£@?CF?!?I?|y(B?twH??mFpi?ewe ?^RA?UiRg?NI%%?E9b^8A?=B3?4}D?0$m?3l1?@/9?Ha+?Uo:?eg5f?tÕ=U? @u4|?Eb?K(?JS?Pĵ?âj>K?ڡ=11r?1J?|E?JS0?r ?`3'?K? co?|-?th+?nbJ˂?ewFWr?]W؏6h?TRA9?Lg$r S?CE?P:Z۰?|{?tw0[cC?lK4O?c x D?Ys ?Vdޯ?MEVJW?E4?D@?Gյ{?Q" ?[`LI?h]Ӗ?u\ ?>Q??@ ?3Z?3Q?32`?$lڍH?ʒcZ?c?@^?A5?@[?G)?7E?%„?`?6E/~?Mxh?@u䭤??$'?u\R+Y?h js?[;l߸?QB8?GH+ؖ?DxZ-?EA#?MD[_?Vc/I>?b+%ؼ?n1ZYu?yp?ZA? #>k?_Ov"?w!?Nl):?u?8`x?Z٩?@s.?3"?&s?YB?C$鰣???Rprd?pYR?Q,?|lBSi?o7Br?a(?Sp?IٚwDr?D$X.,(?CoC?Hmɳ?R(}y?[Œ?f7; ?qe k?|T?0 8?I GjU?e}?*6@e?X63n?}Z?8m+?㡾3?X?å ?C!6?=b?6?/H?Y-w?*Vd?c?,˚?s@;JР?d(i?VK/@5?Kn0?C%N?@ꗢWs?Ce7?Lų?UZf?`!?i?sZI ?||7? Ϣ%?= ?ٮ?Kn ?vG?^*s?64?߿?C? ?"m?'?pɰ- ?1&?3Zk?' ?.?`іY?vZ˸?grIa"?X39N?LQF?BC?=k??u5'հ?FOB*?PQ?Yqu.?c  ?lI?tu*?|RSf?Opݦ2?hƮ?~/?c|io?N#?$n?BTA"?!ɍ1?7?CzL?Ȍ3v?lF?F?8pyi?1%?I%K?wg?haG+?XEE[?L2 ?A̵*?:d1V?9cF?A˘r~?I#b?S 0C!?\>ཨC?d7q?mڪ *;?t3L?|?O?ޚc`?e~}d?SHj?LX?յP?Vi?pgpD?ȌQ=?ga"?âԋè?k?O ?G3Z5?1?wZ(jNC?gOO/?W?J₴ ?@_ma?7#?4Լ}W?:L=U)?CE)p?LeoX:p?T Bw?]'PZ ?eue?n`_?tj`@g?|_kd? 5?ITu?_L ]? CH?_r?w!?1;!?hg-?âBus?G?I+q?KI6?? j@h?tܼg3"?egZ@p?UpV\?HbJa?;薵V?3mx!?0v|]?4~*4+~?=BBo?E8u?NGtp^?Uh\?^P&?eu?mQE ?tv>b ?|LT^?nxu ?eS? /?R5j?YQ>?308?F?o3?JkDž? wP?9 z??~G yy?qP?ax%W l?QK`|7?Df`?6B?/ }|?*r̸?/UBP?5Ȱ`??zT3?FXGېd?Ov`?UhR?]0 ?dgn4?lJ5NO?saI?|V"1kV?^}?@`^?.vx?*MV~?'?Au8?OKr ?KS$_>?@iQ?5E?4F?vj?iTUv{?Zcϛ?]?LZ 7nn?AEL?%?1x^yA?( ~ά?$,o?'rq%?/ڻ?6hm׀?@$_?FXfm?NH%K?T<1 ?\?w m?c e?i:pm?qdo:+?y;{??U?QEr?x*^5?=m?SC?!]Kp?&-"ܩ?/˰U?5ڀ4?=CAF.?CFzbU?I9A?P#7a?UZqv?[T"c?b,6!?h8U ?o?s?vz\B?w̪?wZ?t 8h?q3;?iTg?a-Z?UD Ԗ?KFBϮ?AAR?7r?- ?Xu[?,t ?{ q?=~ ?6?!WQ?'s)=9?/VP;wz?4aI?:Nl|pm?IwaH?KqcL.4?LTʝ?L4•2y?J :?HcU4?D`t?AE?;uG+P?40:@?-ߜN0?#'A]X?+yrt?'t?#? ;?4NĨ?/Ή!?'}/N? n?k]*[3? ?^gN?:'[?3?Hn|ZP?!oL?+1ƿ?3+o?9-G???۠?C.Qע?F5*?Hdv?Iqۡ?I`Ȥ9?Hg?F5?D[KM?Jhx?PYa+7h?S_?Ur`}*?V*v?U||?SrŪ?QaM}*?MT9?Ig d?D +?@Km(?:!A#eA?4 ?1!mT!?+.: H?&)27M?!VY9Uz?suO ?(8gxW ?RJ?WU[ҶV?_'g՗?c1W?eiǢ} ?ewgO?dNza?b.Fe?^ ǥZ?Xr=g?S?W?Nڡ{?GT?A. yHy?:O*㎠?3o?/y?(7yp?" !A?Z#>)/?c=u? ?R1%#P?W&]? l?+/J10?5&9?@2g?IqV?G y4?S^8?` +4?ksa`/?tLGzA?{k;J#?; [? 'ݜ?\AGB 6?+W-?~ʢ{>?xZ ?qw#P?iU=$?ao~ؔ1?ZM)?S.?Lh?DR#o?=?5}?/(kXT?&[3fk?!@OX?X_+s?qXg=?u M?/R0?9+'K)c?D??Q+Tu?_ ' ?ksRIE0?vST?i?U2 NE?SOM?\=?VwV?H(j?5>i?vd?~7r?t#Ww?lTg3?cV卣?\u%?T N?MPHh?E8?>+?5Wƒy?/(ݤ?' o!?"Q?!TI??$9Қ?4L8",??\?J ?W/y?fŅ6?tK4?C]f?p3u?O'?s!5??Ls?ol9#??[EqB?ru.??oC1?v 7?m/?dVX?]=0?U }m?ME?EUK?>6?52{u'#?/L"x}?U 0tkz?MPd?DQ`C?;?3 *?1 s6?4E?@Ov?Ha?Uo3|?eg ?tO%"? On;,Z?*-f?K4S?Jm)~ٮ?}"_?ãse?]e>?2#I? 2?}?ڟrϮ?`\y?K@_E? G?|;I?tJ?nb4)O?ew)=?]?TU0'?Lg&Op?CEf?:L3?4zTU?7"Bx?A?Im*>0D?k@v?3y46?J־k?|t?D?v ƒxh?lRQ?a(2?W.` ?N?Dӿ%?@?BB?Fѝ ?Q^.?^V?kf5p?xXQU?uO+1?qcѧ?BM ?=7G?zr? ^i?"B$?ߞD1?Ť%?lֺ?D !?zk?V ?Ihz?`c*D?X?m1?ƛ?tv&?iT1wyO?^_?S=]A?Ic?B}?BC?D`?M{h?X(L?dK@?q+5?~4p.;?l:?U X?0fr?MWp??E?\=F?lpp?\AD1?ls ?]@b t?l?"А[;?t磤?1Yl?wZ?'3T?~5wQ#?q:?^Gq?iRP?t]m? l?l-?F )?_D&|?ʅ~ ?YY?z;5 ?Dmf?lrb2g?Ŧ&?#9v?"o ? u(?@h?X֪?Bk?r ?u?xX2n s?kgx?^s3?Q^U?FJ?A߬*/X?@|D?D!?NSmg?W-\d?a ~?lQ- ?v j|?C?{WT?IB$V?2L?,!?CDi?z@2kF?]?߭\?‹kŗ??I4 ?2 ?GN'^2?=?Zw05?3^/?~R!?q1]Q?b,h l?Sڤ?Hc<?Azy?=?":X?@KkB?GLڛ?Q?ZIrW ?c#?m}?u7B?~$C[? Z?–)T?y9;?: 4?R>?(Ǫ?"]zxP?y?a9T?F֟?1'b?}1a?Lr{ ?a?1\?G?s?,?dBz?Uz5Fv?I]{>|?AW?9蔲m?:6?AaT%?Jm?S#:?\:?dݱtE^?n!*?ځ7۠?âL? x*?Jo?K_St?~? &e?tҩ?egh"e?UpS2?Hb$Ix?="#?4FU?1 e?3c_bb?;*?DPcM?MN6H?U ]qB?^=0SR?eI?n`R+ޯ?up?~%?{?+YMc?0w?Z_b?G,<ĝxG ?ET.?~?MYQ?U G&?] .?dީu?mb?v _?҃??r ?Z{ղb? Ev?T?Kl" ?r*?O _&?ܻk?i?tK::?fŃ4?W^s?JNc??u ?/mb?$O+2?!VC /?"Ah?' f?/( =?5؛?>_?E{?MOi9j?Tl4N?\% $?c@u?lRy ?toi?~5 ?uV?4,QY?q?׿t_?ʙv?,^Y?ɐe?Y{?vR24?ks%+?_ J#L3?QH?DGba?9-qwp"?'}N" ?y53ŝ?t7l?[C3?!A?&[ \~?/(@?5fN?=Њ?DR'B:?LgAB{?SI?ZKdKG?aE?iTvu?qH8>?xYgd?~l<`O?hg?[xf? k+~?e@?{jWF?tK%?ks ?`#,?STGֆ?GߤW?>@[?3+^? nv{I?ZĻŕ?)l?d\Ń?>]ޤ?!Aր9?' h?/N5c?4l7Q?;k=?CFǡ?Jt?Q?v`?W/?^iI?de1 ?kh?q1d%?s?uPO\?tMgy?rMv^?n-H?f˨qP=?_ M?Sgr?I<?@>|z{?5Ӛ̋?+2TlD?ls<[?ɨX;?T='[??d&A?[fA ?"Lj?(8xz?/тT?3}' ?:NE?A׹e46?G=iϝ?NYc?S>sF۳?XH@}?^Jy2;?b-b>?d C?e ^L?eh+?c0M4Ϧ\?_/#?Wо/?QR+?GQQ'?@?6&?-ve 0?!ˀ7yI? ؔ0?ou J? z?TT]g ?)L?t|F?!VեM?&)h?+ޗc ?1)W?4 -).?:! ?@z?D~?If/\&0?Mشp?Q`))?S?U{˪d?V)Ϊ?UqyTv?S^ϙԨ?PX}u?JVV?DO^?>spe?5ӞmEq?-g~?"STG?I ?N=?k?/C?'?Z[uw?y.\?$@?+'?0I'D?4Ii#?7&qO?96 ?=E=8?@]c?B>7?D:)/?FlHh?HfR?I_?Ipv?Hc^ĭ?F5-?C-A^k??]`W?9-2v):?3+pL?+2.&P?!Ҝ>e?Id?5}? NI? @?'|?0v?U{l1cq?̨S\@?#~V?**ܨe??16Lz?5F%.?80RK?;:qJ?=_7w[?>'p"4?>d~.Rx?>dk<`?>^`n?>d-}?>c\?>'ߵ7?=^Z9?;tVM7?8%ö{?5Edo?16Q?*K+?#'+?[B?UBi ?1p1%2? [@? C? 19v/??sL5?'x:@?0]u%?5z#?;}lb?@X9?C.ĸ?Dӕ?E;nOx?E CG?D(?CQUI+?A??`ss?;L?8t#?5v?3okF&?0ҞO?,Z;<7?&qV3?!+Q&?Q?51? Am? bw 5? i{?/ .?pKE? δ?)؜?3#r?:j9q?AޣP?FXͪ?Ks?PYIT$?Qfn?Rz j3?Q؝K?Pi!j?Lwm?HqM(?E4Ŀ^?A=}o?;3?'Ndp?50uٔ?0ɿ[?+ܲz?&r/UL?"c(!?Ca ?tؐL|?x^m"? mb_? Z0~? aC?S3 ?HT{?)8?3,7^?=!t?D(#?M1?T ?Z''N?_-+?av?af?`S?]?XѮ?S \k?OO?I3?CK1?<;z#?4C?/_{_?(Hqm`?#7 ?p(?F?6y ?NH? la^? F?ɿSx?'w@12?3"@*n?=!X?ECw?PQ?Y S?b넷Y?i B]?n|?q ת?q\#?p2k)8?k)DM?f\?`?X̨&?R]?Lx?f=?p?vV-7?{kdΗa?~a-?K'/?|k,u?x,t?s[??lUV3E?c1?\2ی?Ts$X?N2P?E:dչ?=}?5PgJ4?/dd?&1p&o? WNn?){ ?‚q?rgkVV?>?*Ew?5$U?AYЊm?M0.a'?Yl?f1?r@V?{)`?E՘?ʨXw? ?%"?Uke?NJgq?E 8?=:?5( ?/n0:?&Ч'x?!ӀL?n [w?4*?!(ȑ ?D3v؃?>@?5iy?/c'??'u8?#Uuc?"`xg?&m~!]?5Bp?@!?K~?Z%V?i MR?vUm \?mwj?M$",?3?比Xo?\L?DT?߉d?=?a}g?8ڻΕ? [Vu?wv2*_?o0;=?e`&XF?^S6c?U40?M[2?D؎&xj?=6#L]?5OHX?/C]h>q?(F??&, ~?,V'7?8"q;?C+k?PWӣ+?_0F?njym?{j ^=? :a?O]K?AR?n=i?Jyjn?0t?MR[J?v۱?CHӱ?J?nq?ENJ!2?uc_?nA1?ewk?^?|l":?U"Ä?MwD!?E*aK?=.{V?4;m?/?#?+(a?0Q?;pU?DU?QV/?a@(m?q8?~Г(?;O6??>ʟy?J?a?G|?4x}?YO?Sm ?s ?̈́G?6?|d ?twA@?m&!zP?ew3o'?^Ri+c?UiZF?NH.?E8\-3?=Bm?4}F8j?0㨇Om?3k ڂ`?=XcL?E2?Rwc?avF?q[>?dy?$5*?a4I?DY1??Gg?<?wh?†|*G0?^ng?)6a?4 ??z3(@?Z:֠?{8ŝ?twX;7?nfC?eb?^_Qe?UjC(?NX Q?D[E?<7Y?5,i*8xc?5sX?> _%ǿ?EqKʼ?Qݳ(Q?`ݫ>B_?p12qJ?|Rd)?u\=d?M?#gU?L*+?4Z%Vx?w?֠?j{d?#"?nP ?r!?A%?W$?ZW?|0]?uNFV?o/^?e^x?]ޓnʽ?T͛ ?Luس?CHu?;. O?8o[?>]]Jv@?CMu1?L0vY?X?fQ&?sYtb4?5^?P~?`eY[?Bgn*?RuQ?^b?Rf8?Z1?9?v؉?pwȀ?e8gq?rE?3v ?n?maKS1? ڤ1t?x˭?o֞3;?c0!?Xܡ?Oj&U?Ey??YؘK?>W ?Ag|$?H`67lx?SuHz?` {1.?lQ,2k?wS CR?Nt?7;)I?>en?>F"?(xg ?8? ?v= 8?T[+7?v<?ښG.?'n?(}"?螠 D??7 x?UdhEi?wS2?lRo7-?` ?SNWߧ%?HV+Ni9?A~|?>]ή??Y[i(?E8?O#?XȜ.Q"w?c>?ou׶?xʹm? r/?mǓ?G]QO?3Q?rce?ef}u?Ef?v/&?k4?\0?E]%f?;ıwJ?A9L?I.?R hb?\-?ez>3?pD_?whz?D _?j?6r^/"?ջ*+?H%$?eb# ?t?J؝?Pۍ:?5?2#?Y.J?\?X Ó?qC-?bgy?x1N?kz?].K.!?Pfӛ?D;~?>!RŠ?8o?;-wӔ?CGJ0u?Lt%A_g?TM׏n?]ܝng?e?o-88?utr?|^?Y4Z?Uf? ?r#xh?_[?q~?&z[?S)?wn?4,~?LzU%B?p+?j]?uE^T?|nr@B?p1f}?`-u?QQ90?EM_/+?=Z &?59j?5,D?<6ǖɠ?D&?N{?Uh~?^]kԕ?e>|?R,m?Yk(7?4#?GϒK?KZq'b?J,{G?A#m? b\?ŐI ?~+t?q8`K?a>?Qօ?D T?81NW?0Um?+1_?/4?4̽`?=b^?Eʸr?M\?UI/?^=R$?eu񺾯?nt?uCJ?Du?mykts?hG?Bs\?>.*?L z .?Dםuc?Md<?UhVp ?^_? l?e"Q?pDz:VF?x˭F\$?aN_?o=G?qVd4?9v?CIP?,;?O2[ku?Mf?˦?{('K8?p6mT?b,R?T=@?FBᖔ?;nM_o?*BKij?!*Co?y)_|M?p)A?!w?&гH?/mi=p?5Ȉ*?=w "?EW?NH⊴?UjX =~?]9\?e|7KW?oG?wTu?9Q?beZ?u@{?$G$?$_}?E?e?{(2o?r@>_v?fcp.?Y:o?M14?AV?50@?#ca?: ?uv>?駒q?+`31? ӳ&i?&$J?/c"y$?5Oq(Q?= !6?E9ruI?Nz ?Tb?\0+D?cU*?lS݁?sZqw?xאh?| ??~'xD?{j'G?vUuF?p`B?fw?\ N?P ?D8?:tcNG?0AW?4\ ">?5/Q?(14?9U?RrP?+ r?!Խoі?'Ϣü?/E.L?4?=DK]L?DɓpqD?LwS_2?R*m?X_J?`.H'?fӨ;?k?p2 jCQ?q[O?q c9bv?nz@ZL?i 55?bX!?YLJD$?P(#?E`N'?="?3#?'yE?VA&I? ? oH5E?~?YO?18y?qҺ?#7?(?/0?4|?<;'?CJQ?I2,?O?SL?X}~7?]II?`h?aߝW?a^=?_dF?Z&/ g?TpLY?M1>-?D4?="۸U?32HK?)%L6?}?2'&? dw? \3s? odM`S?-&s?u{?Ԧ҆?"cg?&+ vR?+!g1?07>?50=k3?;2Jz?A<&?E w?H(Or?LyS ?PhYHǬ?Q?Ry>.G ?Q 5?PYIDޝ?KPaR?F!?AE)U?:ס ?3#M?) 6f? Fd?[V? #]O? _J0N? cr{? e-9;?5ʏ?ȐA?!+b ?&qQ*?,[Sv?0 ֣?3oޏ_E?5@?8t3?;yĽ??`/$?A^!?CQMa?DXE?E*^?EelN?Db|?C.V?@1.Y42?Um?ӹ=?%u/ Ô?+]sO?17tn:?4PyԵ_=?6)u@?8?8=?8@?8.1?8f?8Dn8?8lzQ?8KpD?8G$?6, D?4P'?17J F?+SZΉ?%uY1?Q8?+֯?2? ]j?{WR?JZ?? 'ҙ]?{|?~?#@zE#?+fԏ?22n- ?6)"?;DϧO???AG`h8?A;nj?AIb(?A?S??2t];$??/ڡ?+?&r YB?!uѽv?!: 3?:y??ڍI? 7?jp?[sB[? [|+]?{,5R?Ev)s?$ޑ?/z?60L?=G?B=?F[ @[?J,,?L]`ZcRC?M1?L2Ly?JBx?WhC?ZeX;X?Zׁ?YYdѡ?V^R?UB W-?`r%ެ?h6',`?p%R?tL|?vq,?vR'?uTK-L?r&)?lqP1-v?d/}?]úB3]?Uméw?O̕\ 7?F $??} ^F ?5Ag?/d\~?'2ކ?z? H?Nm<_?Z6fE?xƯ4v?ub?/:?%qV_9?20CJ?=E0d$G?G\bC??Sw??`.bd?kCW "?t]?{)ʸ?H?;^\? ke?v. BM?}Ͼ.?w%{Ӆ?p7r5?g?_I?Vl6 ?P0O3v?FY4K?>vQ |?5B8?/+k+)?&r]x? L?J?p$a?VA*?[a?+:F2?6:(?B:[T?O{a?\AF?h́?tv O?~8fߏ??N[?o3?qX?vEb!?F&?u>|?y`IQ?qb;ނ?fǖ#?_X8_}?V#1?O=?EUvF?>ʁ?5ݥk}?/#?'1_?"A[?5S?W?PS?!`A?14(҂?;*?F[&?Tbnm,?bN⍎?pkS?{)bk?yx?N@!+?Pߎ?7Ed?Q`?'?rY?۟?Jwԧ~?x5?pEz?ed?^`f?Ui A?Ml[?Dؓ\C?>FuP ?5 _?/b]s?'{?#ys3?"`?&mh~9L?4L3??ؚ ?J egc?Wg9?fŇ?tKP?]Dq?׼_F?O讙&?suyE\?L7rm?/?c!?[>Ώ?r;(?Rh/"?|W ?v ׾?msl?d.{k?]ܐI%1?U <]?Mv)?ETc?>շ?5x7?/KB?u z'?u?H2?.@?(FcZ??ػ'?Η5f?dɖ$? ?o&?E{a?kn?xeNWW?sTڊK?m%W?eg_?_VC&?VjiF?OAg<:?FB?=ɷ?0?5mzl?3eS?8,*?Am?JG&?VZZR!?+(:گ?u^h?i%x?rb?ay?Ųӹ?8?8K]!?ERqK?@9ʤH?|WPyP?v N۝?pD?fM???_裴?Uq?MZVU|?C㹗?;z=?5|h5e?8_þ??ęD?G),?RH>:?`c%s?lnm ?w"C,?RǤ3?Z˱?r3 p ?(?[\?dw?ad?}?|P#?tL3?'?$?C(?n@v?g;E?x ?qa"r= ?gX?]?S"fu?HW?@?9 p?8£"?<`K-m?C6f?Nѓ?YM?dlz*?pxco?y? }w?/ɲ?@Ӝ9?VF?h?oyP?|0tO?NW8?|:YT?ŃO??]&N?A*G4?oL8?nR?y4B?p*8?d0X?YF3?N"~iq?C V??P?|&?|?w#R ?ln7&L?`cji?Rs?G*J??"} ?8_؉?5D?;YB|?A/?EN?vF?i+?ZܶY?Mx~?A%'?6h;1?/ F8/:?*?/Q㜰pT?5ڦOй??x\$?FV ?N =?Ug?]-9ox?d*?lJ?sjK?|Vdъ??@詙2?47D?*?'Z?؞?Ow_?K'6;N?8!?DLL?.?vQ&?iT;Y?Zc?LY|?ADד?4M6v?+?&&FX?(4y7LS?/J-T?5r?>`1?ESXx?Mn?U ˃/?]ڒ^[?dzG?mR ~O?D:7?M3?UhA?^^?e׺n?pDS8?xC㩑?xVB?ڕN?q{?[l?i@?P`?OO?M<&a?OnZp?{(1b?pEo?b5>?T?F*x%b?;vm?+3 b;?!Ц?Y P?6?"A"?'1e~?/rP ?5ܠ@?> #&+\?ET/0?Oc?V"(?_V,b]?fyO?qaR?yab'?4i>I?l#;?u?X|?󚮋?R̒}?ᯪ?~j6kfD?tQL?hV0׊?\A J?O|M/?B??6/?%t4\?DR?ƹ?FXV?Pgς?Vjf?_XKw?g]cQ?p^lÕ?w#^?}N.?ul(?/X?/LK?H?{)#AQ?to(?kCHM͗?`#޲?S8 0?GG9?=Gd+?21|X?V?i[?љxu{R?z'(1?[Wak?D? KF[c?'2-0?/c<0?5or??{D?FK:?O(/?UItE?]#Z@?d7?loL?r%:{A,?uS?v]E?v?tL8?pי?h̬OT?`CU ?UZN:0?JE?A`^?60aG?+e1`b?e1y?Pi? c~?[0? ?[ *?q?"B ?'ϳ8?/NoQ|?5׶???S&?Fʆ?M\?S$n?Y 60KH?`dk4I?dɢma?gʾ?i(3%O?iU`?fw)n?b3I?\B!S?S݋?J?B[0s?8O;< ?/lc?#ACx?h? v ?>Qgo? hP?l?zƃs? ?9rC?#e!HQx?(8*vE?/WL)?5WK?=A:?C‡?HW?Nn9?RoA?V]*NO?YX?O?ZޮK?ZdȤE?WXE7?T; ?O}<$?Gɢ?AX?8Oώ)?0}a}?$+pǽ?G)? ^(?.Q?\ݖ?>'z? 3{?1w?8"?\w?"c?&*r ?*⦯?0x`6?5I{2?;XIMQw?@y2?Dkd?G-%g?J z?L1!C?Mh@H?L\w}?J'?F@!D?B.}7?=H?60M*?/ ?$h?T6]r?|-@b?L?\'?1? ?Bv?x?!AK?!sv?&r5+A?+F|8?//}L?1] #J?3jfD?5W]6?9~mK??1plo,?/L}?*U?%u? TD?;m?H? #un??PS?~p?O}? Wa?i6&w?/_?%v\\??,_v?22A%?5Hm?9/ઐ?;x؜J?6(p?5vo?/σ?&? T?iP?j?ɶ} ?NCR?*"Ծ?5Ś ?A'?M/BS?Y4.?f/F9?r@;?{)}1?d> ? ?ZH)?%]8?v ?crp1?䱦T?wUN/f?o燙?e}W1T*?]G#V8?UkBC?NI&^L?E>?=UO?5)!?/l|7?&ϥb?!ҥuTv?l0]?(?!(L ?/1ɭ?9*Kg>?D?Q J?_ 4~?kscy?vS,:/??5B{a?/&Y7e?' 2#?"u?!Snu$;?$]4?1?;rUvG?EQ?RY ?a-Θ'l?nI?x(?ٷ$?VN?T6??{<[?.?룾FE ?S9(Sc?@@#?yݣ?qa#)?iz= ?c ۋN?\@U}Ռ?TVJH?NH?FXW 4?@$/T?6io?/(?'oqA?$(¼?74?Nc'Jt?a !u? J@?~7( H?u]k?pFWO?hi?c !?5 ?\I꿡?Uj?Y1?PNhK?G?@N'}i?6/?/qn?(?*X Ov?3Z}) ??QA?`>E?lͯF?wcmC?uWF?uAVL?sx:?k ??B)}?To?L&VS?8 Hq?u?yX2oL?tA\^?pF*|?inY?crg?]ޡ5?Vjj?P?y?GH*9(?@DX9?5/u?/F?-9~"?3\#>?;-EGg?D4?PHEͩ?\ v x?h|܃5կ?st?6?}4K=?b0L?4xF-?Z ?ՏAs?TdǢ? ?&6?01y?5h?}  ?yFĒv?uڰ"r?qZ>?lS&Ii?e|Ng6?Qz?E??/:?6Fָ|?@xH?G=?Pgo?Ui Yu ?\6?c ?hANM=?pE2o?u(Ә9?~5Iu?˒4Pr?S?ʫl?fh?nN?Tw?!hV?$!f?g=w?y@6?o TXk?an\4?ROJ\?F|P?< -?1%?(0 ?$?'oJD?/Z?6X' b?@#Kٰ?FW%JL!?NF 8?T\)9?\>(}Id?c Gu/?is ?q~)?y9??ߊ?RXD9 ?U3;?ɒǑ?.?li?F^ۆ?,zE?Sd@?x3"?nqh??a-\{?R^~A?EYr?;t?/r?$nB?!TH H?"K4?'8?/%%}?5!?>4?E'.p?MN35?Tf7#?\eժ?cݕ33?lR\?t@y>?~60&?v8Y?4t^??I1?)?R?D6t?t?/[?vRؑWvI?ksIߔ?_ p9?Ql:?D"c?9,-u_?*< S?!)'?;ϖ,?m7 ?!Ҹb?&Q?/k>?5O?=7qY?EC4P?NG?Ui Rg?]އa?e|'9 ?o_W)?wT;JP?(9?bҷ?u(ÞA?$W(֒g?` I? ?Ҍf?{) )?r@cZ9^?fL?YIO9?M1Eo?A&%!L?5j&t?%sU,?#?]_n4?.?h&|? ?U?&:,?/JǸ?5m=?>V`$?FXPƏ?Ps%w?Vjɼ?_H?g[A=3?pg9?w#M'N?}k?us4;?jQ?ٙV?^Y?{)Dd?t4?kCat?`/@?S;|?G:,Y?=F%?21`? _?0S ?_-?1Go?gvq?k;3? FҔ"?&!n?/m"?5 Mx?@$B?GwS?P䒁?V[ð?_Ca ?f/,U?o1{Wb?sB[?wd^A?yApy?x=6?vSKŗ?r@8̰?kCH?bOa{?W``?Lk(?B#%?7LŐBȴ?,1x?:,9eN?jOa? i? . ? q=Y?x?V? -;I?&];?/(aX?6uԲ&?@;HLK?G ͂?Ox?USer?\ݭ7]'?cJ FZ?h~ܧe?lKY?o p'?n1?kt1-?fl:1?`:?W*K?O8w~!!?Dk *j?;xɻY?13j"?%v"F?zT@? 30??ύy9?kĈل? r|K?h&??!Ի9?' ;?/Q>P?6 ni?@FFkVc]?E/ 8?LZ 76?RJ?Vܓh?\z­q?`?y ?ao W+?a/;w?_ +?Ya?S'v?Liy?Dk: C?S?%š?7?+H9?y `?.Z? jX ??Ά"/?_?!WbA?$l"q?(R[dC?/_?4Y2w?9LoP?? >?B w?DTצ?EP+&=?FL8L?E/t_?D*?A(?=H&Ƅ?7M /?1U?(Ύ-E? Fy?{QC? ӒFx?? ?lX?H#b? ŸF?t":?2_у?!&8?!,O&}?$\?v?( eJ?*Ey?- ?0Li?3YJD?6AH4?9n?;4E:N?N??~*f>?2Rmo?!FetWb??;I!b? ?#!-3?'i#]?*?,hn4τA?Kw?CGN ?A=?+Dl?"MBU?*BdD?1 ?61 :?:J ?> i?@0^u?@t(?@91?>Hi?;o|?7uƠk?3X?-OA?'ma?#:W2? <(Lt?vS}?vR?Ҧu)I? jFZ?fԮ ?*f? LÚ>}@+j[?`‹E?0u?žը?+'h4?#1#?,Zq4?4YZjt?;@j?AYj?DS๹?G4?I3?I$YY?HJ=?F7Y?DіL?AbeP?;?M?5i{œ?/-?'D[?!Uq?\~30?R'U?z ? ??Wz ?΁*?~!r? &?\?H?Uѳ?"L,E?,А ?5cNmr?>>Yh?Dk%b75?JvS]?P:Uz?Sbo~?Uw7v?V 1u?T$& ?RA>}?NK;X?IW0'q?D`с4??<0?6fVuQ?0?&nk ?!B(O?+ԾG ?[x Rę? qH?̬:?t?sr?? |?p?B?*@+;?4XH!]?>/?Ec?O8"f?US쨯?\@g?`1?bҖH?c?a Ed?^th6?X?G6?S.Th?M! ?F"2?@X ?71%D?/k!,T?&[宼j? ӧt?C?zOH? YMQ?MZ?Tԧ"f?b68? Bi?6y,sqY?%s@?1z?;@d!~?Dj-FO?O7߆F~?WVN?`U?fM?kt??n{U?oR?leb ?he>?cJ H?\2[?UTgA|Z?OޢDmp?G?@=^?6g\k?/(">?&{|? ͦdY?`?? n=N!? k@ ? e=Z?h ?,I?+b?6.(2?A U?JC?U'h+NY?`hR?h27O?pY(?tLۙ?vzt?vY?uT?r& &K?lq15=7F?du?]]a ?U {?O2z?Fc[iٓ??{!Ρ?5Y-Ӕ?/c,;=?'15m? Jau?$^?Xsw.?wPmn?bbm-?;$O?#c"ݫ?0΄?:.z_?D6 ?P֣\w;K?\?fHDd?p?vVJE??{kF(?~ m?)k?|טAF?x:?s[дA?lUAH?ct2$'?\1Qm ?T8aܪ?NN^@3?E9!?=Vf??5O;x?/bo8?&ϕk{? lZ^?'.@Z?ܲ?p? ?'y`?3)2?>g,?G?S72?`E?ksM?tLn^ ?{k?tGȀ? mS?\\E?la?~)3yi?xZF@?MJG? ?޹?x;?|nT)?u^p6Ya?nʸH?f9|?`fEy?Yt.,?S!d?Lg?E8B??y@??6[?/fL8?&)?3?!N? 7Ϊڸ?"LYZ?,_W?5+?@+U?IrT?V 7?c|?o !H?vCgD@?E?\,pr?cng?gN?0|!K?_?~؅?wqX?qN8?j˙׭~w?dX?`e:??YsȚ?S, ?N;?FްT M?@Hd?7-|~?/ޅE6?'>he?#4A?$Z4?-cnoK?5 ?@53;[?HDB5H4?T;j?a?l 5F0?uS?!?|c{!?9v{?w?7S ?ť?I;?nQx?y)2!>?sS?oYa`3?ij ?d0?`r@?ZK[a(?Tˊ?O?%?GF@?@:?6NF?/5y;?'?&[!F:?-Yw ?4ʏ}?>x%?F ,s?R>8?^pC[Y?wۖ#?y(?yT64*?xzw?xؼV?xڶ1?yTΖy?y(?w۩_?u]g=v?q"j?lSR7B?dA[?\x?S,SG-?IRHF?A *R?7o mT?0:^4?,іL4?,ˉ?3 V[b?; ?D\mqc?MCA?UQ^/?]<ކ?ch`˹?iT?n??q˂܇?s`?u2`?v54?xҲ?{gC?~pj?mIt?~=?|m}ņX?xY}nz?sZM?lnh?cHDpL?Xǯ8?N`Z?DR?;iGC+?38F?-Kۦ-?) K ?-wbx?5cj6??y:(?F8E?O6?Udtxl?\.+y?aSQ?f8_O:?j@?oXwq?r?u2YKy?yT?[?~??Q}?s^?$A?]-I?~|I?x ʾ?r$?h}O?^q@F?R?QF\?F=7?>z4+6I?4˂~?-qdw?&[%B{?')~4?/_TJ?6<+?@Mut?GCUD?O5>?TCW?ZJK?M?`Gc?dp ?ix]?oX>5.?sIj?y(ĤrO?m>;?¦8D?(1]{?-yI?&?d?|<{1?uSۮ?l Ow?ai`?Tl-v&?H5dsA?@5&?52\?,aUT?$[?#4y`&?'>l?/n&?7,l?@Q]?FݠoV?NFH?Sz?Yr w?`dPl0S?d'?jwsA?q˛?wۗ??~i?. K?$}?ǯD? ߖ?[ B?Y?v}%E?o ?cIi?V %9#?Il1?@v?5/~ߺ?*0h륨?"M hL? 8w?!^tͧ?&b׃?/eօ9?6[??xtx#?E7]?Le5cy?S U?YrLk?`p ?f8b`?nmrU?u]i;?|m>3?xtA?2O?9!?*? h6?~AD?vJ}ᄱ?nB$(?bű?US?I:ſ?@.?4Ai9?'{f#D{?u/1?p s?Vi/.?!?9'D?&X.t ?/%_q?5b/?={58?DPAg?LfC,@i?S~`?ZK c]?aXyN`?iT8=}?qt!?xYr?~ n!?AM?[㮤? ʾ?X[?{j:?tL z8?ksF/?`m`?Sa$e^?G{?>Iu?3*/Q?#^Ws?Ғ%?rmXUY?潾b?("$Ͻ? ~O?&VF?/aJd3?5NH}A?=8?E8t^LX?Nb ?TO?\0;lm?c~r?lS7O?s[P?x&hi?|֋YA:?r ;?~ۅS?{k x?vUq7N?pQ?f8k?\N?PvJ?DsC?:e?x?0K?V?&2gg?<T?xv?Y?X? f:?'1]?/bk?5i[??zl}?F>A5?6t@b?@3:]?GE?O"|B?USj zp?\ݘjz?cJ"?h~ Dsu?l`Hq?o `?nwl?ktLmM?f2?`\3&?WN@}?O8ũ?DjD?;[ӽ#?1 A`?%uN&?# P ? tR?e{?V$a?2 t? mdQ?x>n?s?? ^%?&[F9?/i#?700v?@)Q?FvO?M3?S.K?Xe?^sc_o?a _?cJE;R?b?`pV?\TȝQE?Uȟ|?O8V?ES?>*Vi?4Y)?*BhP$P?H-?!S?)[?=h~?h͘2??k w4? q͐U?[5h?+0[?!AA活?&p?0l|?6zC??>PF?D_q?IV, ?N ?Tt?V 6D?U g)?S=h?P4qN?J 暉?Dk ?>}?5e ?,қu-E?"Mܟ?sk?2v?՞? RV?_]?.Q?XUk?? Kdӹ?zhg?j?[]?![7}?'C皢?/X?5ha"?;95Y?AǬv?D([S?FnRe?H;?IKV9?In1i?G!,?Dwma?A@?;;p?4Z8}9*?,#0H?# -?-\9?K´??b0Ζ+>~5!V? |.?mK?g="? k ͩ?ҏ~?vF ?u*? <\'Tl?#9a?'ˣx?-l?3?7uLH7?;o2@??>@Nԙ?@8w?@. ܽ?@0?>3f?:z8?61_k?1/I&b?*CX ?"N^:3?-Ḝa? ?F6!?eQ>68tg}z8>E>Bx^?Ό?ꬊ1?!ZS?Z?"vNJ? r? p_舲]?"(SD?$)T?$5Ǯ?$*@=j?$ot?$?$>-?$fY??$FnU?$*H ?"]=p ? p^?+ ?QؘR?4O?#"3y?c?ُY>C.>Ѝ 2>sY]/p>Sb? ?6.? ?9~?0;b?#B- ?'{9?+4G ?-Hya?/@Yk?/5#?-̞0?+9Kl)?'Pr#?$w{?";#j? FI?qp^?Ba?] f?7Mu?ݴhg? Gv?)z? D>q">#D">z1_Z?L>@R)f? 3? ȽIz?/o?d^4?"M4z?(T(Ԥ?/.G:?3$S?5r]?7(?8'+r&.?7Ia+?6E~u?3(#?0JfB?+uWCu?&AQ(?"2U0?퍤e??*ƞGH?+́? y5R?E?p2k?Z+>Rkh >d;>"n\?Rc?K?k ??$+O$Y?,݀Rp?3D7b?8P[ 1?=$_dj>?@I?AE?BmJ?)?Ap-?@1`E?0 >7^>ʃ>(=H?;S?rv?A?$*G?.b{ q?5dVoA?q?KIk[>?Kup?JGI?G!ۻ?D?AAO?<n?6kx?011?'6쵺?!)?m35??R##2P?` ? ?69A>^>4?X,m? T)?g@m?d28L?"K-9?,8ӣ?5c:=a?>CZ?Dj?JѦb7B?PHC?Sp!?UJ@O'?V {Hh?T,?RAæ]?Nյ{?IV@&?D`bF?sM?vX?3X?q:?+,m?(_7Ԟo?3B' ?t9Q?/߷?8MW?Bt6?Jm:L?Sn;<)?\B5?b*&1ޔ?fb3#?iVvƂ??i̫?gGz?d^S?`eP ,a?Y ,ί ?S$v:?M\ѬZ?Fy??5 E?5A?V P?an?i¤<?q[v&K?uQ8ȿ?w&9?xmB?wG]?tϺU?p?j3&t?dϽ۱?`5Sz?Z'Za?U{eD?P$??J1]?DV??a?6/Jg?/?'2Mt?"(}yN5?>???$Wӷ.?/+ZR?7?Al5,?JCJ?T4?`>?gXU?p1,?swW?vG A^?wy$?vu?tQ_8 d?q.?l+!Ufq?g"(?cWn?`B/MA?Z|{ݿH?U?QBEn?LuZA?FJ%W?@D]ڈ?6Mz?0 뜬?'@?",n&? s`G?$%1&@?-ˆ+c?6?&E,:?@-N,?Gԇ}?R? v?\ & ?dA'?k;n?q25?s9F4n#?t?tQ.jk?ra}?pP5+~?l$̨ ?i\?fi?cWQ?`?[{VG8?W.?R/=?MZ1'JF?Eサ??z4#?5 ?.c?& Qn?"4P"0?$H?+0!y?3?< ??D؃c(?NĐf?VHiG|&?`ce ?f?kg}?ok]?p??q.wdP?p*E?oX?lֱ}.?j-ls?iz>,?g!^i?d MR?b,iE?^4Bj?Xj/?S"?LW'(>~?D]D<*H?<#q?3ɜ0"?+l`$3?${zD?$P?'jQ?0it7?8؋?A3꿔C?IRCj?R(2?Y!oGL??`9Up]?d*mv?h8??j(?l*\ ?lǪU-?l{Ү?ll o?lց9)??ldz]9?l*gY??j6F!?h6ժ?dKD<?`Y@~?Yq"?R8$?IR ?AϤi?8M?0kK?' ҏ?$l$?$Cyj?+k 0?375?< ?D\/?LVdx?S"ٸ3?Xɝo?^X$?b,Ira?d1?g!; om?i)&?j;#?l`>K?oȺ?p6;I?q.O1?pν-?o;?kgzl?f ?`cĪ!?Vڟ?NˁJ?D5hFV?<-&?3qL?+1.ʖb?$R?"ZOB.?& Kݒ?. ?5y??ywV?EPK?MYY )?RLJ\pi?W.]Zo?[8>wY?`%M?cWB?f%9?i%a?lljx ?pڲ?r?8?tP 2?tH?sW?q1۽n??k.`?d׫t|?\ f?R?hEI?GH O?@.??6@+&?Tٲ.?JDl`?AmvJrB?7^$?/-&h8>?$$Ş?~&?*O?"(rAJ?'1?/?6qA+$??i?DRۍ ?J./?P H]2?U`\`?Zʏ?`OKj>?d^*?jA(u?pg:?td?w%Ժk?xWZV?wn&'K?uPY:(?q[G&?ioa,?an}1?V Jْ?KU?B7ݫ?8#"?/9'z,?"mdž?co?|Df?^?!)@UD?&* ?/?5ጬ9?=@룄?CD?Iydg?P>f?U09'?[ʂ?b,3?hXk?oDS?s/; .?vV~?w*KE?w[;?tݟ-V~d?q ` ZJ?iU `?a.B'1?U|9?KFV?Aa?7k,p?-ݯ<$a? m.&f?We#x?%qu?`Q? ?!?.#?'ER?/JD\?4h[?;aG?CE*{?Jhê!?QI ;*;?W/4/?^b:l?dX?kh\f?q24v?s?uQ<?tŕ?rĥ?n?f3P6?_ V0n?SN?IRՂ?bJ?Y"?P<5O?EI݃3?="A:?3"c\?'x6EB?fG{O1?rm? U-u? 7E??YTϫ? C?"AHuU?'͟IO?/LHPG?5Q??>?F!6B?M[c͓?S$v8 ?Y~?`dDO?d٦?g'P?ifSAE?iU?fƵR/?bI?\B*?SݫNH?J.R,?BGj+J?8OKi?/X?#@j\ƴ?ܴ1? "^?;?]?|GI? o?g}C=?'q?!Ӆ?' _Š?/D?6?@E0?Eם?LY9ݵu?R?Vj[z)?\lD`?`?Po?ao (?a/?_ .ǯ?Yȃ`9?SB?L(?Dk=C~J?b?5e h?,l_|?"M:?H4+?H? ?Z6'}>׵pu>!t?h5 ?od?C?R/1IO?*)< ?!Ӧv?'6K?0 K}>\> Z>~_?.'n?קF3?Lm?a^?e?8BB?"-?'FN"V?<ݿ?@1ŗ;,?Apff?Br&p?Aņ?@G~?=%#4?8Q8?3E6?,ӆZ ?$,T?aL?y/?轼'>CL!'>$-m>y>y 2?Zwa?ۊĜ?l-RB? O"#?{?*N_1?Q?娗_?"1r\?&~~?+tU?0?n?3{?6E_ڭ?7J3?8( m?7g^b?5zi?3%cA?/e?(ϖ ?"NE ??3? 9`%? ̇2>޾u3>{D}S>$;>6ic? eu?'\? i[?ə|?7@4?\^p?him?<#%[? mb?")tSr?$#J8R>a}>!mj>iv>",Z??2#? hS6?Z?W9?m֦?ZW_?#:?v ?s{Cx?n-x?]M[Z?n?t|h?k!?VU?\Vz?oTr?Xfg?Sxm2? U?4O?&>4%[>P>;)ݰ>dZ>9/|Iy>^; v?X?9c?Ŋ m?jF?@^?u6*?!Yp?#4`Ӯ?$s -j?$i?#~չd?"tA? L:?{Ⱦk?6_R?n@fHv?;]?.Ž}?Tpy? ǀmw]? ϫ?IDl&?b*>%k>MyY>x:ܸ>hH>']]>;,?|i8? j?w?,6? F}^iq?$if ?)1k?-?/;C?0v ˬ?0-{?.\2VwΆ?+%3?'Eg5W?#? Zg?=ηE?J`>C?} R?U@? plZd?? N?ybZ? $֭>S>.7"m>ك0>w L>e?W\? 7?c]_o?TA+?O]?L{Q? O?u?>9 > H>,5.>KGs?)6?PY?&KLx?cӜI?((6?6҉_E?͍? Q>6O;V>O>}>35?.zmX+?GJ4?*/B3?#%CR?,Т@?4XǤ?;B%&h?A`?D߿Dx?Gsi?IJ:&?IjP?H?FFlV?D;|?A39?;ǹ^?5h4F?/a&?'BQ%$?! w?Y}_?R?xh? 9 ?Tx? eh?͎?(1?1 ? $i?f;? DWQ?)n]?3B~?;f?B#GF?G5Lr?M2nWM?Q*?R>?R[?Q0?PݒNO?K"+?G4A?BmOL3J?=ۋN?5 ?/G\+I?'qmp?"I?n]^a? 3?ι? c$?ˇ$??t?CXӯ?} =q?4c?$!R89?0]MN?8N~?A%3$?GDq4?O|O(?TiB?W:%)?Ze7&{?Z2Bl?YX.r?V]5?R͘oG?Nf?Hie?Cυ$?=̝,X?5gB?/T$+e?(5?#<ͧ?5',?ԧ7?wifQr? 覹? #?8oj? /?Qdx?BVt ?)}L0?3K'?= =Pb?Diѳ3?M1-M?TwH?Z'Bw?_{2.?aA; ?anq?`ߠVA?]?X{?SC\rL?Odxo?I27@?CJ.ƙ?<9۩N[?4~*n?/O&?(js?#DM?lu?z"?Cu7?Ƹ*? gn|V? 3T?fKW8?!~ *?-}R?6±@?@4e?GN8k?Qx?W!KR?_#?c0S;?eid]?eޕ?dY8r?b. Ӝ?^ .> ?X\h?S>V?N'?Gu:?A"?:LO ?3W?/P@Mo?(4\N7?"63?U?_-t?Y ?O]Lc?ķlƈ2?RPqr?#EX/?/x߅?8yET?AY?II?Rk?Zclo?aW)V?eh?g `?hW?gtR?d8??a*b#?[x ?Vfzi/?R*t?L]X?FP0R?Ay_x?:LN1T?4}S?!?/R{N?'oMnX?!ʕP?q$?Ө]?uz M?&)4?x;?$znּ?0rbk?8FZr ?Bt?IW?RVk?Zrd#?a槪u?eJɄ?h '?i/2w?hu1s?e{Av?bgtL?^s+ ?YU+b?U2IWD?QwRI?L ?P5?FPnH3?A0/?<7vE?5p?/$շ?'>?"(3+?_57?A>:N?2FX`%? 7?$Yf?0)?4~?8R"t-q?AlM?HrN?Q 4?YV-?`ޭEZ?d +?gsxYG?hu?g@;?eU ?bŎ?`/僶b?\!ty8?XxI~-?TGQe\?Qw >a?Ll5<@?G_hw?CH ?=cͱ?5`?9?/A;A?'A2 q?"*(?2&?cH?gŌl?#$erE?.RZ?6?@."z?Fţ}a?Pᬈ|?V[l t?]=?b-#d fE?d6cn?e ?e*?d=/?bzqm6?`ڋ A?^~/Dzu?[?V?Xw[?U2,\?R)rP?N9) ?I0/Uݘ?C ?=!?5dg /?.&H?&$AP? Ȁ@+?*s?acg?"*?+⻎2?4'FM??'=w82? ǚ ^?b&e?n j?#1O4?+!?3,K{?;’o?B蝠P ?H[擾?OW_^?S=pc?Ve?YSl1@?\ ?^o?`jGݤ?aB]?a?b ?b*m?bg'?a)%?^G_U?X 8?RpC?K:?DAr?(?"1?'@"2?/E'?52 ?=??CHjL?G[?L쪁O?QvE?T|?Xw~a~`?\ `?`/^璾?bd ?ep)N?gGu?hu3?gs.[?d6DV?`ގ{?YVQ!C?Q吔?H{?Amga?8SKRL?0*-$?$Td?) ?3V2;?B?`u?"(#?'>s%x?/0t!3?5rCT?<71w?Aձ?FO\?L E"y(?Qvb V?U1CK8#?YTB!?^r#??bgP1?e+?huUVf?i`?hr?e󤖝?a}\(m?Zk6M?R3C$?Ik?B_Z?837?0sf?${#Tx?T?Zcޫ,I?Rn?I c?A~6?8{>`?/H1?#7?iJ^lMn?q?PȾdH?eJ?`{d~sU?VV?"?(4X?/d?3%B]?:K X?A/s7H?Ga?Nްk/ ?X?^18?b-^?/oqn?4}7x?<8?CI{k"?I1.Fڬ?O>??SĖp;?X3T6]?]>,3?`7J?a2?ac ?_-7%?Z'8FV?T.?M1g}?D+[?="}g"?3PT?)kj?o1^?Ih^0? Ns?;uA? ب? og?xZ?pz)W?50`s?#,?(5=?/Sy?5[?=˫?CSs?H%?Nr?R?V\~G?YX72xȚ?Z$-?Zd S?WX'?Tk?O}k5A?G9?A?8OW?0&HtSd?$Ci2?bv2? c?F))5?wA&?[G~?`Q8 ? қ'R??u,"?nDА;?"*B?'q?/h?5pe}y?=ˉ?B1?G3ug,?K'?Pm?Q]};?RꠎG?R^;?Q+[?M2?Gp?B$Aiml?;P?3D)@?)s\? FK5?ir?1J3?? Ue?#i?!D?Vn(r7>I>!e">ׯE?[J?g@?: ?7?cw?@d ?",0?'E7?./U?3c{?8A?<;gJ|?@1Z7J?Ap=?BV"h?ALU?@;S\?=%8?8Q,T~H?3E ?,gƑ?$,3gC>N/m,>/v{F>gd>O6?ׇL)? =G? 7?! ?Ģ?b?gY0?"`?&)?+?7?1 _?4,~?6ã:?8X'?8X?3R ?0Wp%?)ϫ0Iw?# "\`?r^ܳ6?e=Ǩ? "Bz%?C>6y(>>/ݢK>krp? |jb?ym??/׹? pS?T?|yi_?IT?j? G?#UA?'E>am?+%hB?.\%?0.#z?0w}:D?0~?- J+-?)?$? GYϗ?.s?\`? #KTQ?o>$>>>iퟗ-M>y v7>ND/>Kw?.*.?H3? @uh? KР-?ʈ?-?:ˑb?mͧ?5ml?{5]? !?"r?#?$J0?$>mC?#3.$?!%2AW?k@?=J?kj? *?V|?d>JnYp>:,*> >?Wg>,}>?>B ???1? ^+r3?22g? 65?܁^ ?}ťw?q{?'??4Vﭏ?_g3?;)c?ȜZ`? [O?*L-? ~{?55p? `#yU?PV?*|>Cy>:pJ>,6'>? >>2@>Ȧ*> AX\>`? /?EU)V? }H^?|=7?ݫ?K x?-d(?Rfu??X?? S#?=>/?J6O$?T>]?v7f?\Y>q?/Ƹ?+.?©s? e}?s?wVCL?b \>$ e9 >x jK>Tz>4>+ &> ^b?s{ԘX?]d ? ~Hp?uk?ZL?R8e?  ҳ?"C>?$ 1?$bx1?$]N-?#+j?" wB? <{<2?Z w?&~6?\cj?2?X? 7{,? \<юQ?\)Ӯ?*v5ٛ>}m>\pN>F;>B[>%lX>hM&>j6?g|? WU?.>?Hg]?{UhL?So)b? mݠ+g?<QKK>,囖O>tĈH>uP>=c? C_#? klS?d)L?fof?"L+?(kT5R?/arO?3$?5ԑӲQ?7&!?8&)!K?7t-?6D"xP?3g ?0ϝ?+rӽ9jL?&+?"0@I?]U?>?'?ۑ E? _`S?x>?ƻ>C?WUi>b[G>ԓy>[!?Ec?Aư?A?*|?"LWL?*A58!?1?60"Gjo?:X?>T?@0y؁V?@-va?@8*SK?>~άD?;mIr4?7s޴?3a?-U*`?'C)4&?#7SzL? :f.<?rܳ?rb(!?ϲ.? fAP~?cEl=?҂?8tg}>xo?^.h? *- ? ?W3? D[?(V?1]o e?7Lh ??=G:,?A"?DD'r?E.(7?F>ܵ?ED1?D1?B vA??n?9b0?4Wj{?/ B?(4Q"?$yWnV?!U`?z?ʪ.?ˎQ1ff? ei!?T̯?uw}?&Bs?ْ? W0X?yMs?Q&?$cU99?/ߙ>|?6/DK?=F?ByO|X%?F9hF?Jϡ?L\*?MV|0?L0l?J y?G,#?D'?-?@A5?;70..?5$ւG?0vU~l?*R ?&'z?"`h&C?W֚??4K?βX ?  _?9&)?W!!P?@1Z?*k9Wl?x? H@?)ĭ?3"[?:1~uK ?A$83?Fp?K ?PYC+?Qc=?RyS n?Q Z#I?PhA,x?Ls&?H?EB?A;שj?;0Kf,?5-CNS?0M*?+/QD?&0WC?"`pi?]?q#-?]DΝ.? hmS? Ur< ? ]2؋?;g?D?"|@|?-}:(?5ԨP?>8`?DDw?J @?PX}?S_ yM?Uq8i?V*5G?U|2 ?SԾL?Q`vk?M`St?Ie ҙ?Dn?@y?:&F?4Ûd?1 ?+ڸ%?&&Db?!Sw?oH.S1?$:?OW? ~T?g?(W6a?%e??$Rp?/JC?70?@.=|?Ec呶?LZVƞ?QeZMU?UqK?W%?X1,K?X5M$e?VM. Og?SL%?Q1?0"?*˹?$,? 8t1?0D"u?v@pT?ݜ({?[mz x?vV?I~?$, %g?0rڔ?8"?@Jjd?F hL?M ?Rxm苼?V)H-B)?Xv?Zww?Y?WĎJ ?UL`?R;ɸ?P[ac-?K7 ~?G<.6?C m ??vo'?:eR?5,K??0u- ?(Mn?#4?17|?BV0Mb?a?}XOm? N?Ԍ?$S%V?0)ttu?7р@?@5??U?E- ?L.M`?Qh)M?U{6 d?X54˨?YV?Yg1ZR?X A|?VYa??S,{?Q"A4Q?OIJʨ?KQrǭe?G;7?Cg=&?@ P?;.a?5\#?/r?'E?",?3> ?T+I?S>??ʪY?#R?.SdDM?6?xUI?>yP%?Da?J dݻEB?Pg@?S$?VLG?W]n?X r?T4:?Sy== ?Qfe?O^w@?Kxg`9?Ho>N ?DDzr"?A:T?;0z?4T ,?-2=?& 4c ? &?n[N?l ??3e=?"࿎E?+4U?3E$i'?;i-2k?Q__z?SL?UL!K@?VR?V=?V6?UD$?T:ؤ?Sy *?Qfw?PZ:U?MFJgC?IdiCe?Eiz?@HG݂?9K?3 YU$?+mF;?#N_]#?Q9f޴^?JCy_\?*w ,??S1? 7>0?i_?'=Y?0:Ja?7o0¨??6" ?C?H(?MMgc$?Q+#5q?RX?S;m;?T[?Ui%t?U&^?UiTb?T[ƶ7?S%zC? 7ƥ?@eG5? Ug?J/Ž?Pio?#[?+lL`?3 =p?Hn!f1?KϪ#I?O1?Q %?SxP6?TG=s?V= ?Wa[?X n{?Wõ?VLlRON?Sh?Pg&{?J #Ƞ?Dac?>z.A?6@?.Tęj?#u4?h?.CM?TzY?T}?bD?",^?'lp?/6ƅ?5)F?;.Db!?@5]6?C?%{?G;NNi?KP|?O -t?Qt?4zl?:w?@O0?D!?Ie(?MtiXKa?Q_.~{?S\FE|?U{? ?V)78|?Uq|X?S_\?PY R?J~)R?D?>k>3?5u?-5?"}*[?F6]?-U2? _y[? X,? ke?ڿ?rÚU?8~ ?"aϱw?&N?+bG~?0zȓ?5-2G?;/FTJ?A;X$?Ev ?H>AmtF?LNڏ?Pg> ?QdB`?Ry''?Q?PYYIb?Km$h?FU. X?A@M,?:8F(v?3#9&K?)ǭ ? Dƛ?O3b? [~ґ?-j?YΧ?;#o6? K?CP ?˱ ?Y:skF?"aj?&'y4&?*a`&?0v)l?5r?;e ?@3 x?D?U?G,o߲?J ]U?L04S?Mg ?L\J)?Jy\?Fȶ ?B"#$?=Gbb ?60J{?/:?$01?5}O5Y? m^?ȯ1?eg? i%7?ʑ?t9\?r ? :{?#7~?'ȣS?-L?3Y?7sm3?;m*0?>~f3?@8g/A?@R8?@0?>o7?:nN?61lN?1?*C4<:?"MB\\?-?-T? w?Dk>BM>#/>ºcл>mfS?Z>(?i U?F1Mد? #r?nr?(b&?dHa?XZq?"03W`=?&?+r}}6?0V2R?30?6D3_?7a?8';v?7m0?5տ z?3%4?/`=?(V$Iʪ?"N{+?I,?Tj\"? <]? =>~*g>xx>7r>/X|> kjK? 4/@f?yD|N?>RR? n^?S5\?{FD?Hp?p}yf? _?#Q(J;?'C.?+$1`?.[б?0-R%??0w>X?0f w?-}qO?)y%x?$c? G?.mʅ?S;ѳ? "pb?-7>^4>-XF>A>F7>a >ɪE>rDT?+Ot?\i\? \at8 *? wv?G+ʻ?dB?[|?& ^?Z!? =X?" Z?#0?$ah?${9?$ ?"^c? F???Cl57?i*? ЊnI??tj>}=>?@E>Z>ždB>y `>$Z?b<?`ve?[L ? d?]aי? ?< ?[} _?uyw?Szyh?J](]?>2?{HQ?zM?TA`U ?/u?M 4PX?f͢?~x? V ?G@;? Pl;>b>0e2>ɵ c>1ˎL>>f=?>?3B>KCq>Ъ"/j?V?N?fd? a}N?vJN4?%u34?1Em?Ld!?rL}?`8l?ΰ?`q5,?s /?M٩cm?24Fp"?'38f?۶y5? QfF?t,?rz?d&&K>Td~)>ح=SN>?E)ha>e1F>dg<->a(>y>9">VW?Zk ?}X? Xtױ?ˮ$?c?5?¡BO=?YgQ?-EwW?䀏ID^?;C?gG?upg,?_绠x?ڬjU%?8~? ? p> ?]j?ʤ>4>">yZQ>hs_>f9?>㑑b>> N>= > ?>ڜc˂? }i_?Dܢ¥4? g?|WU3?&vY?Ji.?,w[5?QDq?ܥ2!x?*%?;Srks?H0Z(?QY4?tQ?Zs~9@?`p?W}?%r=? bFLk?E+?ܑ[?`:"y>!*>vz5>ߋ֩|>"%>q!>7;rj>g{5? 壺 ?J4??iN`?Y?ߎ /?!p*?#̤"?$<`$?$rȋ?#u)?"P6(`? kq?wR%C?2/f?jh?8xY?+X-?S G? XO:R? ?E)?aK>{;?>J{$>uX>fRѓ>'C^>SY[? y!j?#z0O??W|8?.u[?#@.w?'yR"?+2azw(>z .j>vo~? ?,?B )?'??pM?%u:G?+e@;?0_R?3+h?4M`?5ًڰ?5?4΋ɤP?3W?0Y'U?,ـ}?)q?&^?$^ Qg^?"O޵?vKgm?ŔI?h?DE/G? g ;?Aǡ$?5t[?^=>/;}?z\?Cig? `a?3V͋+?0˅?-B ?*¨*?(7M?$>?!)XC?Ȇ?.RjK? ? -C?C8ᬉ?ٷ֓?J:q?ͥg? 6͂?yNu?ĕ?#?_ #?!'?Ș?Dq9?:St? t2&?<'?WFg? V:'?ͫۮ?z??'v- ?0p QY?5A?;FN?@+?C-Ȫ?DbV?E՝2?EFD'f?DK?CP ?A??]_~7?;i?8qQ?5+q?3mS?08\?,W6E,?&nP/?!(o?@^:?2A$? Ev? ]p+? kv_??iɆ;?D'B?!nv?+/37?3*?9,[i??B.?C-Gi?F4"?Hcm?IoD#X?I_?He"3k?Fhmj2?D=2?B?@Cs?=B<.?9+|9?7#KI?4Fn:#?0~]?+Fa|h?$+?t0#a?V.?4bI?;td0N?AE V9?DV?Hc%)|?J}2?L3;?LS؛u?Kppy'?I@K?GD >?E[7$?CrAA[?@UV?IتD ?G#q!?E.?C(jj?@~X?;~[1?5KL?0Y?) u?"?+;?mFٟN?n ?X[?ώ?3?"vd?+1>8?3#=?9/ &z??\E?CN^pA??F ,?Iڡ8Uy?L+?M0G3?M%?MQ.g?LP ?K1?Jq'?Ib?G3rqm?E|[??BЙi??[ S=(i?9 mjw?3T4?,Տ"!%Q?$^J?pF%a?JL?l n?u?3Ej*?@8g? Ǣ% ?'E'?0?6;_:?J??ZS?Bͯރ?ET+]?G&W?Ib&D?J啽?Kh?L!?MQH6-$?MO?M0dJ?LtHl?Iڑ 1?F?CN$"8??I?9$?3?+146?"Zlk?4M?j֤?l2X߅a?nLf?mM*?+B5?"*M ?) 0?0a^Q5?5qZo?;ǥS?@iEe?C죧?NvF?MZĄ?Ko9?HdqE?D?o?AO?;/&!2?4;E?-Ģ>;?#㫁B?T]?'J?G Seg?Yj?T1O?ejԽ? pi;?&\y$?-&?3f?8pM+?=@?@l؋^?B:?D50.l?G#\,?Ib,b[?Kob}?M0!j`?Nw :?N]?N9_?LR#wTG?I]W5?EG?ASb4?ԧ?BG¯?Dh 6?Fي k:?HeGV?I^J?Io}?HcP?F4Q;?C-f??X?9-Wd?3+?+0?!A;?FLՁ?A? (qV? )z|? `}e? Dt ?3渑?2 aU?!)J"^?&oi}c!?,X2>%?0 d7?3m;7,?5y(?8qh%`?; C??\`W_ ?A TY?CO5s&?DB?Ef4i?9.M?;2[t?4,?a&Qsw?ר?(/? p>k?8œ?\?S9?wy"K?"Osz?$^2t?&^H?) ˵?,Xl;?0?38Y3?4L7h?5ɡ+g?5oC?4^|Nk?3,R?0?+g^ $ܭ?%w Gzt?o.?2?8z# ?DZ}?+J>Ϡ;>z=J">#+Q>|w>? ?ak4;? N=?u]v?591?Yv?}`?<+џ? vx?"3H?$ c3i?';X?+6x ?-q?/3Q?/> Z?-RW2l?+4?'{SyOc?#BZLt?1j%<;??nݥ?9? # L>'W>R>iG>xӶ;Z>Ns> e@?v,?H? .Y? >o??+s)\?7f6?jW*b?1zPz?w[Bzl? *v=?"[?#^LѺ?$kM?$ȞC?#~c?!ԣN/??tK2?kGB{?Z)?g?7MW>~Yנ>9ڨ>? >“&>9 A>y.:`>$r1k?b:VX{?. 0?㢳B? cS'#?qi?v???ZɊP?s ?Qt?Ht?<容N?ԯ@o?ޭ03?Sk?/]?Lഖ?l f?~<0? o"5"?F r>? (> @> J>ɀ>fl>e>0uc>j_Z>{vQ>6xD??cZ?]3y+3? x$?񘫧?/ר?h?_)?tW?'ܤ?;x?;ʭ?/%oh?[Ho?+?̠iM??%M? @?GA?>T*F>:d<(>{ c:>nKv_sim-3.7.0/lib/plug-ins/nanoquanta-netcdf/si1002x1-o_DS1_DEN-etsf.nc0000644000353400050620000147551012215546173021557 00000000000000CDF character_string_lengthPmax_number_of_angular_momentamax_number_of_coefficients max_number_of_projectorsmax_number_of_states3number_of_atomsnumber_of_atom_speciesnumber_of_cartesian_directionsnumber_of_componentsnumber_of_grid_points_vector1lnumber_of_grid_points_vector2number_of_grid_points_vector3number_of_kpointsnumber_of_localisation_regionsnumber_of_reduced_dimensionsnumber_of_spinor_componentsnumber_of_spinsnumber_of_symmetry_operationsnumber_of_vectorsreal_or_complex_density symbol_lengthnpsp codvsnlen rhoijdim1 psptitlen  file_formatETSF Nanoquantafile_format_version@ff Conventionshttp://www.etsf.eu/fileformats/title Density filehistory%File generated by ABINIT with ETSF_IO 5 space_groupprimitive_vectorsHreduced_symmetry_matrices  symmorphicyes0reduced_symmetry_translations` atom_species` reduced_atom_positions@valence_chargesatomic_numbersatom_species_namesPchemical_symbols pseudopotential_typesP$number_of_electronst fermi_energy units atomic unitsscale_to_atomic_units?xsmearing_schemePsmearing_width units atomic unitsscale_to_atomic_units?number_of_states  eigenvalues  units atomic unitsscale_to_atomic_units?` occupations `Hreduced_coordinates_of_kpoints ` kpoint_weights  ! basis_setP!(kinetic_energy_cutoff units atomic unitsscale_to_atomic_units?!xnumber_of_coefficients  k_dependentyes!date!codvsn!ecut_eff!ecutsm!etot!headform!fform!intxc!ixc!occopt!pertcase!residm!stmbias!tphysel!tsmear!ecutdg!usepaw!pspcod!pspdat!pspso"pspxc"qptn"so_typat" symafm"$title"4znuclpsp"lmn_size"rhoij"usewvl'Ddensity  units atomic unitsscale_to_atomic_units?T'H @IsnP@,'/@'/333333333333??????????333333?333333?aQ]7V޺o>BAeI~SlBc~m?J??IǞYr7,YOʭ?[d>IǞ?Yr7,?YOʭ? ivC%??Ah?[E??AeI~Sl?Bc~m??JB@@,SiSiSilicon, fhi98PP : BHS-type, LDA PZ, l=2 local`?^)none?zG{3333GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@????????????plane_waves@   2AD5.5.0@WqrhLT,4>1t8?zG{@%Silicon, fhi98PP : BHS-type, LDA PZ, l=2 local @,GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG?z%?|ޱ?0t%?tC!??[t6?aqx?)?[X?`Q?S=?O?WD?OD{Ig?JK>?^I?YBQ3?f?aߕ0?4(6v?oT0?yl0b?kq?Bb$q?r' ?8?O½p?"?8Kw?*AZX?Gtw? CDg>"dU>;P%>ubB<>AW*>9>zj]$>U!> "y>KL>6m>>U\XA>/>U\G:>>62>KMV> " >U!E$>zj핒>9S>AW+L>ubB? >;P->"dT? CDg?Gt$?*AZ?8KZ?G];e>#?W2̵L?f[v&&?uĹ]˼?8*?ZL[?]?OD{If?WD?O?S=?`P?[X?)?aq~?[t6??tC&?0t+?|ޱ?zޓ ?xʽ>?ydW #?~?t^:W?&>?8ltA?L޼t?|< ?=x?v>5}W^>޷! >ζgo>>_n>\Ğ}+>e|>;t>U>̴S>_e)&>kXn>>t*>G >KX]>\1!j>|u$>Дkj>+Gne>\>xǖ?BZH?٧hK?"=/?1 ?Ac{B?Q *I?a?pp)??u?Zt?n'*s?]S?|?@5X????rmp?h\X?)Mxr?2* ?Oͤ|?~ %;?@wr#?sI?On?o?MW~?<\?][+(? BQ?.'hY?t?l?B? H[?<bp>f>Q]{\>ԇ9c܇X>>U.؛>jjV> e>9V>ݶSW>Ɍ>G >>ql>Y'>0)>C^;^>¥>̴3+>'V1>uU>n>)>/>Vxɼ>@(@? A ?2b'0?(e' ?8OeGL?I$"ɤ?Yv-?h) .?w]l?/P?q?*R?VHk?*({F?]?C ?eW?8!3a?09l ?hPhm ?o(?y=?u*y?vm^?}J?a0?kt,'?p(?{?r$?o ?c8@m?p?#b?‹?;o%?\?^R?{ ?F?/&Q?|%?k?tH9?p{?p]@N?s o?|Q\{u+?S?3 ܵ?w ?T_?Zh??r+?/?;?6j?i0??@?T;?k?>??F]?;#KW3?BH̆?g"ވ ?./?E?0"?sDfr?(6ڃ?W?9^@?B\?@b?|&?x}ʋ?kSc?\ L?Mi`} I??9Z?1є#?#*ls?i {p?{">þ0>M;>#x%>r*$Z>8fV>D7U>H'a<>Wtm>LZ>C9{~>y;%>c(>]dD>M}b>_<>ÓyS>c'>bf>>^̴'4> 9hO>ڔ~>i- >OJL?@г?ciZB?!h?0Džo?Aݱt?R%^j?a X`?oRȤ ?}(xh?9Av>?)?ImQѺ?~u?ø?Rp?Hcb2?yl,?O7??}#TR?tRm?qLu?qg=?v֤?ep8?zy<䦦>:eB >+L>hFhjO>Óu@>8h&4>>@>$2~f>X>Dž>3ӼF">@E7>'9~TH>:dWr>nv>T=U>G;ut>V`N>~>+m(>ʂ8|>;Tԅ`>>hf`>m? W?:5?'ea?7+)N?H\ɗvp?WZ P?e ?r5h?=S_g?n3?:?;,2?-B}?M{0^7?!} @?"Kw??WKʙ"?x,?rd?p-B?q?v?挮?p%?Baa?Rox?I#v?F5pl?!@"?K!W?n*?m>?)ya?Xb?ʳ?CZ^er?gg?Zz?|\7t?tٵ?qn?r,_4z?vfĸ/l?V_.??K`?z֓F?%ቾ?)ov?&kp&?%5?NʿW? ?,YE??%հi?nP"?W ?ku&OZ?XLt_?eO? ? L .?L*?7?R5lU?4=c?hp/?0jĢ??ϛ%?Kn?궴??ج:H?F!t?L?xBT?j,y?\k=?Mlͷ;f?= ?/r? ul[̬v?H1;?#>5菿V>Z~k>H/>緖>;R>:^tf> > c)>.E9>^f>=J >?VP̍>x.>嫇.><)$>p;@b>c+kR>,LC0>ٺ]>ȇ#>A|X>ث] LY@>昐$>4?S/?X0KP? | T?0N8Dp?@_g`?N{|q?[g-* ?gEY?s$S?}TrTo?p,ٮ?e?J?GW\4? ߭?UJ?!en?|MB ?vZI??s4纏?rcg9?uBI?{ő?x ?`NB?Av=?l! !?L]W? ?CvgLc$? o̜m?zuŷ?JfB? _? @?qP?bX?ſd? k$bw?A?{I5`?vZ?viwd?y %t>>垪O] >yY>ɛ5=>ACc>M͌>i./A>+Oj>n#>Yo>D<>9B>I>/=>ϔ>uS,>uLp$>t0>\ >źExJ>c>МdFP>ቿ`z>ҝB ?j: ? 90@? b ?&eT?5 }n ?CO@?Q>n%?\`P?fv;b/?6;'ѓ:?1ׁ>B8">D>W[3>̑TN>J>ڵr>~e3'j>OQ~>V̂%>Ds>YCA>>>Qѕ >y+as>Eo>kN$>>H4H>C/&>9Xb>Մ>~<>'{^>qI?0"vi?ww? pUM|?- [<`?9=@?E}#`?QRuː?Ze0?c?k9?qDT?t,(?vZ&D|?w0v^?v3A?v#9u"?v}?xU6?}s ?Mj??mƢ?3Dwd?8Џj?C:?{ ?|37?ؓ?~B"? lp# ?8x?`Z?T[o*?m*?(?)=?/Wf?? y>M?NW?x^? K.?{RL?lj6G:?\#D?J荔?9?* 8>?ԏ:? %86>CfPƜl>/s>!>.[ļ>(>!'~8>P#>0`,+>5qݕ>s] ST>d>u>t>"{I>z>>>x?v>x>>WT0>4 `>kLP>Fk1p>!B} >m%!{?mr ?N?&?'?^MH?2Ȁg /?=(x#]?Es?P1D!&?W?=n`?_c.?drD+S@?hwS0H?l9xa?o/˓?q#?s_&?wP C?}'?#ڭ3?*g?_Ma?l?&?׿B&?1;?Iq^?nb[{?&.?iSa?4>?p??d?Zߺ ? %?w|M?XM"E?~OC?zF&+)?{ ]?ml'?rZ4\>{>ݵ>Z]>.`>~>֦>Yhg2>_ h>rk>8¼"V>[GǾ>~L'>G> gXl>>>B >VQ>(m7Y]>S٦>|k>b\AyX>2㤠>F0d`?&-v`? p[Ȁ?1М ?&?'5d7?0ϛa?7tiJ?@)\臠?F9z?Nר?Tw ?YfC.?_U/F?c x*?g lΗ?lk݋?rl?y+O,Y5?3 ?s4?ԝӭ&?LEG?Zl?R's?|˒W?Ӵ:_QG?$?&&D?{KV(?aq?{?#K ?#̴_??*z??-^?B?yIB?vieÈ?vje ?|O?5 &?= ?vTW?v6J ? 3{??l6?$;0?(ч?z?lE?#+M?K?zgT?j? [{r?v?on*?^ҳc3y>A>6>ΝY >rEe&#>'^ b>Z,L>i>p?,>"2> 'Q>1v{>|j>-iT>R>8>]~>,8F>V>ޭ^X>X0n>;|>`)>'? X?"KQ ??%0i?-J ?304?:g S@?A!9l>N>7dV>,E>GE>#>ӂC>y!G>N/>d>Dx,>*S P>= ?>]6d>ؿ[7'#>=Эm>2.>v> Z>AA>w5@f>}% >3B?ZW|.W?s? 1[4a?(,q?1ؒ]?7~?@WQ-?E֟`?J2~!?O?QZ+h?SE<f@?Uߥ2 @?Wc?\ ]w?b=G?iv[?rsŐ?|gUO? z?$Qe?-?FOV ?L܆9?׃춺?wV0?12? L?ۭ?hle?Pٻ?sY*?p?IN?}MΝ?w,?q=`{֕?nkU?oǡϟ?t U?|.tq?༤Y<?Ҟ??8;d?8+?\y?HzC?T; |?Jy?R bh'>d>m)Z>݊im>| >6Q> > eo >#>B >F9i>Q.->Y>r40>Nh >4W>l>9|>վmx>\1S>8>.ڦ\?Zh?S eM/? ؠ?*2 ?4TCr??*MU`?FdJP?ONHx?T?X0?[~Ԑ@?]ʁw8?^tq?^~j^ ?_*m ?auo?dW߀?j΅v?rU6?|/.ب?!T%?DȈ:?r&)-?Iw?sy߾?ژ?׿n)?4?Fi@r?"]?zn;?1II?>d?GX?݂꿃?z4:?xɻb?rxwtj?pϝʼn?pp 5?tbr.w?{+}A?e?b=VW?OM(?IRc?T$|?1 ?.?Y5?4[?Ut{??W?:I?Ć"?K>C?L%??M^^?hJ$?x#(y?tɾ& ?s'(?t)6M?yiaKB?~k?k!?sۻ|*??a3WXTO?WP ?K?ݞ?㸪U??rK?lA/,?~j?`?~F=?p -?a=:?R>V`:b?AGl?1el ?"y 3G?/D4l?퐚b>HK#>s'd>Q>p=>0b>d,*p> s>&>ܠ%<>Z(QT>Ѿ10>v>`~>(e0>ON>o%J>^sr >0rߧ>6iv>o!(l>WNVx>( B'?V?)sF? X :~?+NGK?6?B#?M\I?VQN?_$w?daXG?hJw @?j\?kdE?kD@?jwnq?iЏ/8?i dl?jr6~?njp?seAw^?z\"u?K7 ?jAP?+.?Gj!P=?w^ ?tW-?:n?)??R"?>*?{Zg}?4@?)^?k?W?N9t?yye [?t?s ?uܬE?{ p؅?p?ɼ?&?}( ?b=?6׹Q?0yI?=9?Ia?DB?V2\Cޤ?DD?XUz?|@ ?ڜqA?x?a?1?i,?}|n?xr?vԮ?w9W`?{l1T, ?zr?1^?^RT?c=?|G&?ˠa?LjȓC?? ?Ģ(?և?`?BZ4?sI%?f5Q?X#hJ?IƵ&?:@D?+?HL? ZjD>Čn>}[a>z8U?>Ub>[= >Sh[>34P>|ՠX>{G]>u4@v>" vA>r>fB%>.>Yw>/hO>ɫ >H>NBϘ>v >_B>[ zk?q?rh?(Y@?5ުUuS?CZ~?Pق?[?M?e0(?n-`\?tp?xx[~?{t#N"?|YsR?{Pણ?yxV0?v|?t+8q?sW"?sh ?ta?xKM ?DJ?  ?Iv?G?)Ԣ?k;7֊?<`r?d &?~6 ?ӕZ '?fX?ڑ?gT!Q_?ڛj?3DO?vR0N?i7v?ds?'%lSTL?ym:?xKTj]?zG'?|q? ]?)5 d??c!?b~?U,SH?~9?pkv7 ?TY?# ?nDو? Ld?pgc?Lm+?m@?u )?JBM͢?H#?:?m?z>ج0?w*?w=y&?y.?|AR,?+4?Ԃ?ę:P?i3~r?G9?r3T??-il?|*?s $ؒ?h yN?\\?P yD?A&,?2mh+?$u4 >=~Zx>KTb>>~>>[>+z>՜#>&5>3NE> >3ND>&՛ >+Y>&>F>>KTb=?>=~Z{>u4?Hحp?kV?$ج,?m?-?H"?JBM͛?u &?m@?Lm(?pgc? Ld?nDو?# ?TY?pkv7 ?~9?U,SH?b~?c!?)5 dB? a?|q?{ p؅?xKTj`?ym9?'%lST@?ds?i7v?vR0G?3DJ?ڛj?gT!Q_?ڑ?fY?ӕZ '?~6 ?d %?<`q?k;7֌?)ԧ?G?I|?  ?DJ?xKM?ta?sh?sW"?t+8q?vr?yxV0?{Pણ?|YsR?{t#N"?xx[앂?tp?n-`\?e0(?[?M?Pق?CZ~?5ުUu)?(YB?r4?q<>[ x>_B\>v >NBϾa>>ɫ>/hȿ >YwwN>/;>fBI>r%>" u>u4@`>{GM>|ՠ\>>34t>SgȦ>[= >T>z8>>}[f>Čp? Zj?HL,?+%?:@D?IƵ&?X#hJ?f5Q?sI%?BZ6?`?և?Ģ)?? ?LjȓI?ˠc?|G(?c=?^RV?1h?zr?{l1T, ?w9W`?vԮ?xr?}|n?i,?a?1?x?ڜq*?R"??)?:n?tW.?w^?Gj!P=?+2?jAU?K7 ?z\"u?seAwh?njx?jr6~?i d?iЏ/8?jwnq?kDH?kdE?j[?hJw @?daXG?_$w?VQN?M\[?B#?6?+NGK? X :h?)sI?V>( B){>WNVx">o!(d>6>0s>^sN>o&>Ov>`~>(>vҫo>Ѿ1 >Z(t>ܠ%X>> >d,*o>0a6>p=V>>s's>HK#8?퐚a ?/D4n?"y 3~?1el?AGo?R>V`:i?a=0?p ,?~F=?`?~g?lA/,?rK?㸪U??ݞ?K?WP?a3WXTR??sۻ|8?k!?~k ?yiaKN?t)6U?s'(?tɾ%?x#(y?hJ$?M^^?L%=?K>C?Ć!?:I?W?Ut{??4[?Y5?.?1 ?T$}?IRc?OM*?b=V^?g?|.tq?tbr.v?pp 2?pϝņ?rxwt[?xɻb?z4/?݂|?G[?>d?1II?zn;?"]?Fi@n?4?׿n$?ژ?sy߾?Iw?r&)/?DȈ.ڦj>>>\1^>վmx>9 >*,>4W{>Nh Ɉ>r5dp>Y>Q.L>F9'>As>#> enU6> G>6Q>| p>݊imE>m>i>bh?n9y!2?U?&kJ?5vD?F!˟&?WT?g6e?vퟥ?!As"?%NX*?ٖ?y6?4\?z264?(~R?犘t?d׼S}?+R?5^˾?u?nDЛW?ыI?{c$n?tt;?pE‰?na;j?qiG3R?w206?/nB?^p?j(?,?i.?v<?R =?Jy?T; {?HzC$?\y?8+?8;c??Ҟ?༤Y<?|ް ,L?t U?oǡϒ?nkU?q=`{֔?w&?}MΙ?IN?p?sY*?Pٻ?hle?ۭ? L?12?wV0?׃춺?L܆8?FOV"?-?$Qf? z?|gUO?rsŐ?iv[?b=Gh?\ ]w?Wc?Uߥ2 `?SE<f?QZ+i?O?J2~!?E֟0?@WQ.?7~?1ؒ]?(,q0? 1[4bL?s?ZW|.^>3M,>}% >>w5@l>A\8> h>w>2>=вN>ؿ[8G >]6d>= >*S k~>DxB]>db>NݖI>y >ӂC>#%>GEN>,E>7>N >!9k?: X?QeK?)K[*?9Ces 9?Jdh b?\EQi?lH+~?{I/?oq4w?GM|?0sX1?y\?[ ?R}4?^?Dpl?t?fץL?z M?S;:?5?%Հk?}G?tҼ2׊b?oa@s?lܴT?oםp?ueb?~A'>`5>H@>X0m>ޭzH>$>,8>]x>8>R>-i>|s>1v{X> 'Q>">p?j>i=>Z,LS>'^  >rEd>ΝY*>>A #>c1? '!01?ve@˼?*:OsB]?;)ߑ9?M??^ҳTW?tr&?;F?vH3?qER?pi?rAM?xK;?%R"?%??u\?MOV?fRp?ǸKR?M@?8?xT7?x#??'\_X?vF0n`>2>b\A>|kX>S٧->(m7Y@>VQCD>B &@>͖>:> gXX|>G@>~L'4>[G>8¼>rki>_ >Yhc>~>֦*G>.j>Z]B>ݵF>p>rZ4]? ;HZ7?z r?+I ?;Mә@>?M[?^,"{G?o\QKn?~sD ?od?E.R0?g?B?R?-L?LjB?m?KlO?9;0w!a?pdh?xLG?XH[o?(~P1N?^T 1?jY?%`?U??iSa?&.?nb[{?Iq^?1m%!`>!B}>FkO>kt>4>WT>>p>x?>^ >>"{z>t\>!>dS>s] >5q->0`,%w>Pa>!'~8Q>>.[or>!c>/sz>CfPơ? %8?ԏ?* 8I?9?J荔?\#D?lj6G:?{RL? K.?x_?NW? y>M??/Wf?)=?( ?m*?T[o*?`Z?8z? lp# ?~B"?ؖ?|37?{ ?C:?8Џe?3Dwb?mƦ?@?k?WI%?bx?JFBY?\?jXo?q?uk?ʣ%?]#X?і)f?˖?܁T?~D?zw|X!?N? ihr?˚Ë?)S{i?Yw2?{^?'UPY?F?g?o?~\i?Lh?8q?b??s7?*f? ?qI>'{^>~<>ՄS>9Xa>C/+>H4%>>kړ>F)>y+b=>Qѕ!> >>YBl>D>Vˬ >OPT>~e2>ڵ֭>z>̑T>W[>D>B8v?1ԏ?6;'ѓ?'n>,?6SV݈?GK-2# ?XZ=?h4?vò?s? ?sa?rsnP?g1h@l?UZ? z+?Y2?hjJ?9O?]?#X?vq|?m;@?qk:5~?Ն1;X?]@;?Ń?o}?6r`1?=u?Cv1L?4'0?*?6}?w9?tn$?CO@?5 }m?&eU? b? 90?j: >ҝIP>ቿ`p>Мd>cE>źEx[>\&`>tX>uL>u >ȱ>/= >A>9Bmf>D<>Xr>l>*͖>i..>M9">ABU>ɛ5;>xv>垪OM>%tA?6Ĝ?]FmE4`>昐7>ث] L>A|C>ȇ#Θ>ٺ]0>,L>c+n>p;@d><)/Q>嫇~~>xb/>?VP_>=Jk>^o>.E> c> J>:]&>;Q>緖>>H/֪>ZtX>5菿-?#?H1? ul[̪?/r?= ?Mlͷ;:?\k=?j,y?xBT?L?F!l?ج:E?궴??Kn?ϛ$??0jĢ?hp/?4=c?R5lU?7?L*"? L .? ?eP?XLtb?ku&OZ?W ?nP#?%հi?,YE;? ?NʿV?%5?&kp&?)ov?%ቾ?z֓H??K`?V_0?vfĸ/m?r,_4z?qn?tٵ?|?j:?Zz?gg?CZ^er?ʳ?Xb?)y]?m>?n*?K!X?!@"?F5po?I#v?Rox?Baa?p'?振?v?q?p-B?rd?x-?WKʙ$??"Ky?!} B?M{0^;?-B}?;,2?:?nE?=S_g?r5|?e ?WZ ?H\ɗv`?7+)N?'ea?:3? W>m>hf)>>;T|>ʂ8P>+>> >V`Np>G;F>T>rc>n(>:dVL>'9~TQ>@>3ӻ>Džk>Xܡ>$2~"a>>,|>8gr>Óu8>hFhj*>+B>:eB>y< ? Y?l ?(֨Tv?7$$x?E]`?T tYz?cˋ?rޟ*H?^?G2?-?!ʉA?Z3? ~s?a w)?eM?*u(?$\\?C!3Q?bjRY?FT?\NIj?kD? ?K?eq?#?R+g? f0?:?l?f?j|;?c?H2? ٱ?XkM?בֿOJL>i- π>ڔ~v> 9hP&$>^̴FH>zh>bh >c >Ózy>_<>M}b.>]>cQ>>y;U>C9>Lx%>Wt~Z>H'`>D7UY>8@>r*#>#x>MV>þ0?{"?i {?#*lqD?1є"w??9?Mi`} U?\ L?kSc?x}ʎ?|?@b?B\?9^@?W?(6ڃ?sDfq?0"?E?.-?g"ވ ?BH̆?;#KW3?F]?>??T;?k?@??i0?6j?;?/?r+??Zh?T_?w ?3 ܵ?S?|Q\{u/?s o"?p]@M?p{?tH9?{!1K?/&O?A?{?^R?\?;o"?‹?#b?p?c8@n?o ?r#?{?p+?kt,'?a0?}J?vmo?u*y&?yB?o(?hPhm?09l ?8!3b?eW?C ?]?*({H?VHk?*R?q?/T?w]l?h) .$?Yv-?I$"ɠ?8OeF?(e' H?2b'? A>@5>Vx@>/\>)>n0X>uVF>'V>̴->¦Ɵ>C^;I>0)>Y' >qj> j>G >ɌƊ>ݶS>9W> >j_>>U.>ԇ9c_>Q]>”>bp? Cx?8.*?*abn?7ȣ"9?EhCo?Tw x*?da ?s6?}?{Թ?p ?a܏?/ c?fJ?2x>\:>+Gn`z>Дkr >|v>\1!l+>KX>G\B>t>G)>kXo>_e)&q>˔Q>U>;>eG>\Ğ|C>_`> >ζgo>޷!2>5}WV>vw?fZCn?Ofդ?#ED?1f?@:bn?NϫC:I?^| ?m9Ә?|-?Mﴉ ?^ b?΂?ʚD?:?_?Π.\`?=V?HP'?ݴFĺ?|4,n0?&?Cu?ڈ??a@l_?eF ?9{?/kX?(}H?xqe?ߧqf?&ȼ?L?p??t^:Z?~?ydW #?xʽA?}[N]?L}Q,?ve'?M 8A ?x׌ST?!?Ff?7jO?)]UHKi>Kn_>Xj`>[>]~$-> >F">E(>X؟>L`>]o_E>˥X >]nI>+>X0H>E򹫉>Fͷ>s>]~$>[(n>Xjm>Kl2>HKƐ? f"ڛ?XFת~?)]U?e ?t-? ^ڕ?q=?i?HP^I?݇_?a >#9>ވj>J4\>Τy>\4>lj>zIL>vĵ<>8k>"I>5R>hxo>{Rzi5>Mѷ>￵>h\U>xr">cGq>*12>UbT>nG>. P>oMj?{j?dw@l?"(l&W?1 @f?@d.`?Q;Ȭ?`l2V?oj'?P?rt?h;?Kbs?%k?`Q(8T?pz?8ߋO?Wg+?C:?:"r?c%2g??i50@4? V?EE5?|E?|44A?0B:?OYJJ?{޸a??NG駮?2N@?d?E?!q?%COm?35n?-?'+M?7$?~`C?~Oe?x.ޏ6s?u8?v{!?{~RTQ?Q? *w?Ac?$WU?W?9?FQ :m?4;OJ?@=?tL?T ?[U? 48 ?g?##ε?}N{?zp4?`?ߔ5?_?Y$/G?=ܱ^?s@Ģ?9?1\|L?DQN?0: ?`@Kcd?Ԏl$?>#?r6bO_>->X>ԳZ!Fr>/Jzd >C>`ol>cإ>p/]>M>?~>dIe>ɋ}`>oadK> >sij>fj>x 2>-Id:>,Fp>́O>հZM>\>ya B`>d!݌? \?t?'4D?7 x?HI?Xu?gvn,?vgU@?K, ?Gf$?Jt\?'mZ?eF?lEl?7Kp}?B?3=L?&C Z?ݘd?lXe-h?{(|?wq#%k?x-,J?~fb?-PQ{?H?e3}?2nGzp?aX ?;6?w5?Ct܋?nliu?m? lE?G מ ??F?{?F&\? %?Q[#J?v-Fe?1?rNH(?q-b?tT@)?|(j?_1M?P_?eE?~ o?+0?8?RvN?/3?AdӶ8?:츌V?L/?}|?SP??-J?W+6 N?M??3*'?-M?>0''L?ȃ?di8?H:?DP ?"͇h?*?[X?V ~?wnvD?jcs9?[U4E?Lj]t?>srH ?1O)c?"-HJj?>+8?0]/D>+$ >a> >̟dBR>[>i<,>Y"k>ca>?>mV>>|˚4i>L'hL>`W3>vD+>ll>hF->6\g>{ P>M8Z>=>񱓚 >4X(>x8>HGD?V.?,(8? ij?0?AQ>+pm8?QtI?`_ }d?o.T1?}bR,?[͘ j?oyJ?{&t? [.=??z%U?YN;I?>I?71z?dI?@`?wf8?rʭu?r^?vdB(?bG?dbV?:V@?t'l{?$U?[ ?|,4?7+j?|C?^y?R@?Amy?R?TB ?&D?g!H?WTI?vc,?q ف?pSvx?sp1 A*?zȅ:iA?΍&?E=+?_㷀?_~?N?M?R6?p)'?(?Ǝ߇?>h?Mjc?mUO|?X..?v?qQDG?7Do?h{?mq1?if >?[.?4?1p?m#nA?x\b?pY\~?ټ?BՍRh?b@0k?~#Pp|2?qC [?bҷ?S#T?$?D2R+?6v1J?(1G?[w? zG[D>0f, >%.ɒ>_]V>b>ä}>{(s>A>}*`1>3>=n5J>|0.>āL>֍^>WP` >Pd> ŸF>K>8_:>L.&>u,>X>Բ> [> c>1l? q?1?'R®?7ް?GhICP@?W&[ ?dfl ?r T?YY?. ?*A?fe4?2/y?œc@-?<^۹?\,GV?cJ ?0E|ɩ?{Wi`v?t'ܰ$?q?qxz?v6]?[n']?˕?dVXo?.v?/{?8!'O(?P^1?R^q&?(?7L[??D%?]eol?I9?k5?^ k? ?=n?!?h.r?u= ?Q?{?I&w?U%j=$?h(S~T?$[V?g?BI?ET`? h?J?([!d?C*?!ɳ%?Q^X~?vm^?i|.,8 ?[qO?LSuk?<4.l#?.>I? ?b'?3S6>_>W2jV>՘>ƮM(I>#ލ*>/L*3$>t^h B>X>yN[<%>`)>L>W^*w>d:>sJ">c!Lf>m>>٤:>>лYC> ]>iw3>Yrֶ?$?LP?! RR?0#F٠P??-?Nn?[vUw0?g c?sj?*_?~?)1?=L?i???KY.h??J?uz?y RO0?uIA{A?t9=?vIS?{D>BD?@I?Hm?ê?⭺=X? ?-rk?S&<}?)u?[~Y?P?$?R8uѵ?4?w??/Wg?~xe?y5:?x}j?zi V?0h?gx:?W?kfM?&+S8?㥣+&.?T`?J:~:!?6@-Y+?\?Z?K;?>#S?:??tX??sq?u&X?]%JO??HU˜?2J+6??0"?Խy??r=H?+?N??V[/>?U׬?b[+?`~V?~BM?p.6-U?bA6?RDX[W?BM=?2};ij?#[2I?.[5?t>󎬦>5 B>{x >I4>Ve >}f>DD>> !Q>K/ؓ>G2h'^>۳JQ>I. >#2@#>BE>]>,Z߃>ߥ|>kܿj4>畆>Ȭ&>baLI>5z >ۈ!>KN[?3R$? )5?=c?& ?5#?C[X@?QV\?]YW@]?gA\?qe5#D?yL?4"g?^5*?ݛc?nV:?? Ƶ?{V ?y2 ZR?y{ ?{CpسI?^_?5 h?k?/?FT?͈?~?N(o?U 'e?z2Z?R ;e]?K?w`.?8YMT?%xJ?XHq;?1UI>d?Fv?^?$?u^T?;h@?Dp?6+?z~,?cG?uͅᆰ?gҲT߾?W[nc,?Fjk?5]f ?&ᤰ}h?`z?͞>W> >n[->l(>Iub>P->-H>pC=->>Dēk>9>3>-I>ʦv:>ֵ>Op>T>9S>yh>oN3>S3 >uF8`>P(;P>Z@?:|3? ui`? `?-aV?9 TY?E&c ?Q?\qp`?eg9(?m_h](?rvَ?va*lL?xhU?yir?yH}?yB?y??{,?(.c? Ȅ[ ?l?}K?bIQ??J?;N7?x?Lid?:L?=v8~e?N?cp?4FR?G$?Qz]B?c?=C$-?DM?A`2?}LB?ͽx?_1?U-Ϟ?P? 0?k+?n1f'?*QQ?j?T,FF?- ?-}?¾Ī?Y8N?E7P?&c]?mB?7:m??Y$?~r.n2L?A?Oh6v-?t0?Z.?jm??Y:?ή?DsB ?mˀ?=;?%m?]Vn?@,"?8n@?U9?zMD?k+"WL?[Qvʋ?I]!?8ZeN?)k?7 ::?Lʧ>كE>\>>A =r>=N>ʸO>0>J>$`[H>Br>%Y`>H}>'x>756>>vCNp>H’>x>w>*mAp>e>; >ڪQvz>u 𒕰>5 >#K?<?+pF?W_ ?'mvI@?2 ?=]E?Fo]&>q s>򯺡S>g R>Mf>#|>L>+>8rqc>E0x>͙W@>) =T>SiC&>=Y>Ǝ}>ܣ >jzqZ>AI>m-x>d>~[B>vw;`>UQ >4\q> ? ?:m@?E(W?`b?' {v3?0I`@?8c?@ޱ i?Gw8`k?PFȪ`?Uj5?[?aqV?eۍק?jMA5f?pbܳP?u gP?|WK?C?u#?O4?rGDI? " ??9?JKwdV?73?ydp?$?o}?Z7?P֥?me=,?hcWV?!?3 ?;}?{(~?x,?yRg] =?at? H?ּ6?R0?!'Mgo?̡ ???N?\ ?W>F?Ji҆i?55? Gj?& ?H;VR?> e4 ?o?ٝ&?yUӼh?tu?rE΀?s+ï?y oo?o4?O'+D?iE?fGۉH?76?GG|(?4??n3?->X-?,?ASh? t?Nd?Qox?<?}y6?mU`r?]H.?Kex?:QgX]~?*Wudd?V? .K>غ|kX>U/>x0">e|>@X>$N># )>h}U>)]>fC->4x/E>K}>bnG9>2g,>sT?>=%d&>GhMW>\(yS>O>r8”\> x>;9&>e@GP?>vhX?x!HH>?O(i?$Fe?,%U[?3˞8@?:8Ŏ@?A5?FO%d@?Km8?Q5ɠ?U p?Zxy$>0?aa'?f8?mx?td=)?~uoV?M4?Ǯ7:?R}?h? ;?ё?I^?B_?Dg?v&\?*cK?ٽzN?m9:4e?Hai?FP?/~#*?|Pq?v4E{?ssKP?sw?wOhal? {@H?zL?IBD?w1f:?1Z?^ ?+4?17#Xt?98=?y{#g???H?Uބ?2@?0|ji`?~bޜ?uU_0K?p?o?qd,:y?w$D]?}?=m?-LR?bL?s򆹓?hX}j?K[?-(M??_PX?cBa0?kC[? pa?ɐG)z?2=?.?z9T?kT&?[ "?IrKl?8}RL?(h&?ы&>&/[>n$p>}Ū>VoO;> "4>Z6hf>h,W>޼Tx>T+'~>wVm>n݃>D39>S m>Î)j>/[b>~ > j>We>ڮg^>w8>+=H>+[|?ۚ?E?4o`?'Sa?0KQR@?7 ??eQ,?D:,L0?Iظ$?NmT*@?Qv[?S<?U#?Yns>&>ض9QH]>MP>Aٲ>:24>3>t4>K2 Cz>YHQ> (>~>~4>[Ÿ>&3>o®>>ɣ >!7>✎y46>>{?{C;?Ꭸ,? zQ8c?)ڷ7xt?3< ?>! R L?Fi?Ng,?S8"A?XBw8?[;~D?]^W?^hP ?_ϙ@~?aQP`?cVtXy?gmH?no|H?uY.?{r.?]A?1g?@)C?\&ڞ?W#[[?tX?&|j=?4; ?OY?g׼֑6?QCغ? Q?C;E?6[*;?|?M`?x+}?sII= ?qcO2Tl?r[q?vIJI?2n g?g/?> u?DrmX ?;?M.rP?y!V?J-?yU({?ۚW?yK?> S?Si?b B?u ?oO|?_:Z^?.{?y6#z?uʬӺD?u4$sZ?wR$z?| ?]\ ?TG?קH[?WI>䕸(+>,p^w:>Ǎ*D>%T<>P_B>.J>>4>^,M<>2i7>2H>!3`>>]>hk>̦@Y>s6M>T=M>5>=2kR>H?R8?n4T? F?*I?5bͿ?Bk:?Lao>?U?^jSC?c?gs-D?j*/d?k?kփrԊ?kٲM>?kWdd?l vP(?n2y@ P?qm/T$?v J-?~tIq?qiǪ?J,d?\ ?q? V_Z?6f:?bM?MJ?plN?ARr!?9»9?/i5->-$R]>+>;Œ+>Ď"XP:\>4,{>ǥ>H>y~$>1V:I8>Rh>4̓>Ms;r>5N>1l>H >=bX>iOP>ּ^紟>o> <>9? ?ݤEGr?w~vٙ?v1)?udm?u 0?wwkp?|/c|?!%?8?2 ?{ݕ ?Gh1?~!i?zםO(?zJ)?| x*?_:Uh? ?/J?UP?%i??fD9?:Fˬ?y|??<\=?{?RLϹ?r0ufH,?g`R ?[N?N 8ʐ?@@J>?1==$>ʕl>Ow0̞>+B>& ?>rљ>9d>U y>R[X>.}]Y>L|½>.}]Wv>R[k>U %>9R>rљR>& >+BˠN>Ow0[>ʙQ>=.?`?D}N!?#̗v?1=?@@Jp?N 8ʢ?[N?g`R&?r0ufH*?{?RL?<\C?y|C?:F˻?fD=??%i?/J?UL? ?_:Uh?| x*?zJ) ?zםO(?~!i?Gh1?{ݕ?8?2 ?^T>%?EJH?B?2ew?Y_D?r[i?|_?|L</?u, ͆?^vo?["[z?:?%PP???^X?/_֢­??~C/? ?{w낄?|{?x?< vs?ze? 0?_?(x?U}8> E>oެ>ּ^չ>iOPy>=r4>H҈>2W>5N/$>Ms@>4̈́>R>1V:F">y~>>!>4,I'>Ď"XP@>;fY>+9>-$Ra>5-J? 1%Ҵ?"`?*؍D?9crO?Hc!C?WqW'?eɳg^?rӅPǰ??z^,?Eo9?WR?N -?%Z?f^? $G? SN?0,t?0پ?kփrԊ?k?j*/d?gs-D?c?^jSC?U?Lao>?Bk:x?5bR?*I? F?n4W?R8$>H>=2kF>),>T=d$>s6Nd>̦Pn>hk>].>U>!4H>2n2>2i>^)>=(>.=>P_R>%(>Ǎ*D>,p^U>䕸(6>h?[2?D?"HSp6?1gG5?A6QK,*?QA(j?a*g`?o1Ury?} -% U? S?yJ?ۚW?yU(y?J-?y!W?M.rQ?;?DrmX ?> w?g.?f!f?vIJI?r[q?qcO2Tk?sII=$?x+}?MX?|?6[*;?C;E? P?QCغ?g׼֑5?OY?4; ?&|j! R 8?3>ˤ>✎y+:>!6^>ɣ v>>o¦ >&>[T>~4>~> )>YHQ>K2 AL>t4՛>3͘>:24_>Ad>MP>ض9QHD>ϯ>ns?rL?tΩ}P?% n?5Q#NN?EFyת?V|_!?f!sk?uk9v?\n?EsV?Cq?Mj?۶\Fnn?V@s?Z?.K?Y?}]? n1?2f??3W ?~w''y?vYꔭ?r"2o?pމ)֑?rU͏ ?wgG%X?X4!?7D\??3~o?X?WOz?6o5nh?z7p?v 1{?n?oT'?g4?]ۇ?^mj~?YC?@?8̰H? {@H?va pwx?qIo?pW?qkbn?w"X@:?|yv?'?c!h?s&?`* ?peh|C?<^A?Ո߁Bf?2,v[?ȷw%?Cs?a?n᷈x?E?mO}b?fEݜ^?@}?ufbq?l?e'·?`008$?Y+[X>+=H>w(>ڮg>WK> ߭>~&>/[f>Î)ԯ>S =>D3ȗ>n݄z0>wVo>T+>޼R>h,Vv>Z6h> >Vo!Z>}Ř0>n$p>&/U>ы%?V??ɐG){? pa?kCZ?cBa2??_PU?-(M?K[?hX}l?s򆹖?bM?-LR?=m ?}?w$D] ?qd,:~?o?p?uU_0>?~bޜ'?0|jid?2@?Uބ?H???y{#h?980?U p?Q5ɠ?Km8?FO%d?A5?:8Ŏ?3˞7?,%U[ ?$Fe?O(hP?x!HH=?>vip>e@G>;9,> >r8”]>O>\(y2>GhLn>=%d><`>sT?x>3+>bnFٽ>K}0>4x0޺>fI>)] >h}Us># G>$MY>@>e|>x0P>U"h>غ|h? .KA?V`?*WucR?:QgX\]?KeJ?]HB?mU`j?}y6?<?Qox?Ne? t?ASh?,?->X- ?n3?4? ?GG|(?77?fGۉH?iB?O'+F?o4?y or?s+ð?rE΀?tu?yUӼd?ٝ&?v?> e4?H;VT?& ? Gk?55?Ji҆k?W>F?\ ??N?̡ ??!'Mgo?R2?ּ6? H?~Q-J?yRg] >?x, ?{(~?;}?3 ?!?hcWU?me=,?P֥?Z7?o}?$?ydp ?73?JKwdW?9? " ??rGDI?O3?u#?C?|WK?u gP?pbܳP?jMA5f?eۍר?aqV?[?Uj5?PFȪĠ?Gw8`k`?@ޱ h?8c@?0I`?' {v3?`b`?E(W? ?:j`> @>4\q>U^@>vw;@>~[Jx>dh>m-h>A>jz/d>ܣ >Ǝ黏B>=>SiCQN>) =T>͙W{>E0w>8rqbz3>+^>>#>MfU|>gO>򯺡&>q _>S? (7 }?G z8?*osV?:roɜ?K,?]?m0+p?}VZMԂ?迄`?8,'?kK?@9jQ?@?v.?àm??/{b?q8h?34פ?{!?R#њ3?ɛR?ThkbT?{a?x1_?xBWS?|R㫿?0C}?y#O >5>u >ڪQv >; P>eP>*m>x>cT>H“>CNp&T>v V>756>'>bc>%Y㟴>Br%>$`N>0>ʸN>=NOu>A =VX>Ӷ>>كG>?L?7 :?)k=?8Ze0?I]?[Qvʋ?k+"WL?zMD?U8?8n@?@,!?]Vn?%m?=;?m˂?DsB ?ή?Y @>ZP(;>uF970>S3>oN3>y#@>9ST>UEz>O>ֶH.>ʦv;>-q>>$>DĒ<>ٕ>pC=a>-HH$>O>Iu}>l(Z>nZ>>Wd?͞?`?&ᤰz?5]f?FjkH?W[nc:?gҲT߮?uͅᆰ?cG?z~,?6+?Dn?;hB?u^V?$?^?Fv?1UI>f?XHq;?%xI?8YMT?w`6?K?R ;e`?z2Z?U 'e?N(p?~?r`>͋?ݲ? x? qv??IΆ?~m?BY D?b |??U?:?U;o?.D?&?Q2?}\4#g?~xf?[ |?vK?H?N?e— ?j?~{?Ë?r{`?ޚ]Nw? `m?Fv?KN[" >ۈ!>5ǭ>baLXp>Ȭ&>b8>kܿjƼ>ߥ~>,Z>]u>B >#2@>I-+>۳x>G2h&.>K/OK> !P>DC[>}|>VeD>I>{w>5>󎬦?t$?.[6 ?#[2F?2};ih?BM?RDX[\?bA?p.6-U?~BM?`~V?b[+?U׬?V[/#U?K;?Z?\?6@-Y)?J:~: ?T_?㥣+&.?&+S8?kfM?W?gx2?0h?zi Q?x}j?y53?=BP?vIS?t9=?uIA{A?y RO3?u~?J??KY.t?"?i??=X?)8?~?sj?*_z?g c(?[vUw ?Nn??,?0#F٠P?! RR0?Lp?$>Yr`>iwR> ]>лYC`>>٤#>A,>m>c!L|>sK#>>W^*ٗ*>LZ>`))>[>yN:>XD>t^h F>/L* >#<>ƮM('>՘>W2^>_?3Rb?b'?  ?.>I~?<4.k9?LSuf?[qO?i|.,8?vm^?Q^X{?!ɳ%?C*?([!c?K? f?ETb?BJ?g?$[V?h(S~V?U%j=%?I&w?Q?{?u= ?h.r?!?>p? ?/wBt?(L?dfLL}?`R?~+ "?W0?STw?U"?Ú6?nPiY?v7?,?w?WTI? ?^ h?k5?I9?]eol?D$?7L[1lP> ̈́0> m>Բ>Xu>u޾l>L.>8_`>K"> ŸC>Pd>WP`_>֍t>āL>z>=l>3>})P>>{(>ä\>b>_]E>%.ϖ>0f, $? zG[?[ ?(1G?6v1I?D2R%?S#T>?bҷ?qC [?~#Pp|(?b@0k?BՍRf?ټ?pY\}?x\a?m#nA?1p?4?[.?if ??mq1?h{?7Dx?qQDD?v?X..?mUO}?Mjc?>h?Ǝ߇?%?p)'?R4?L?N?_~?_}?E=0?΍)?zȅ:iK?sp1 A)?pSvx ?q |?vc"?Q[#H?g!L?&A?TB ?R?Amy?R@?^y?|D?7+j?|,4?[ ?$U?t'l{?:VD?dbV?bH?vdB5?r^?rʭu?wfA?@b?dI?71y?>I?YN;K?z%U?? [.=?{&x?oyT?[͘ j?}bR@?o.T1?`_ }?QtI?AQ>+pm8?0 ? ij?,((?V4>HGU >܊>4X>񱓙>>M8K>{ QH>6\]L>hF>lmC>vDӇ>`>L'h+>|˙>m1E>?>c`V>Y!N>i;#>3>̟dBR> $>b>+$ ?0]/B`?>+3]?"-HH^?1O)b?>srH?Lj]?[U4E?jcs8?wnvD?V y?[X?*?"͇h?DP?H:?di6?Ȃ?>0''J?-J?3*'??M?W+6 K?-J??SP?}|?L0?:츌W?AdӶ9?/3?RvN?8?+1?~ m?eE?P_?_1M?|(j?tT@)?q-b?rNH(?v-Fe?$?~Oe? %?F&\?{??F?G מ? lE?m?nliu?Ct܏?w5?;6?aX ?2nGzq?e3?H?-PQ{?~fq?x-,T?wq#%n?{(|?lXe-j?ݘ_?&C Y?3=L?B?7Kp}?lEo?eF?'mZ?Jtb?Gf&?K, ?vgU>?gvnD?Xu?HI?7 ?'4 ?? c>d!>ya B>\`>հZL>́O?h>,Fh>-Id;>x M>f>sij> 6k>oae7>ɋ}(>dIb>?}>M|>p.d>cѽ>`o>Cg>/Jzc>ԳZ!>X>+->OZ? 9'^?{kW?*5ca?7 \ȊN?D?S[c?czPN%?r6b#?Ԏl$?`@Kcd?0:?DQJ?1\|H?9?s@Ġ?=ܱ^?Y$/F?^?ߔ8?`?zp4?}N{?##δ?g? 48 ?[V?T ?tL?@@?4;OI?FQ :m?:?W ?$WV?Af? *?Q?{~RTQ?v{-?u8?x.ޏ6e?}qL"?~`C?7$?'+M?-?35l?%COk?!q?E?d?2N@?NG駮??{޸b?OYJN?0B>?|44B?|E?EEo[l>. P>nFܘ>Ub>*1^>c3>xr"Q>h\n>￷!n>M >{R{1r>hxo>5R>"I4>8k1>vD>zG>lI>\>Τy>J4\PZ>ވj)>#޲>a ¨?jַ ^?k߆V?#3sN?1][S%?? U3-?M!?]DS?kPD2W?z?cx-,?ibǜ?׮o`&? >? ^>|o˺u>J~5>ռX> j>f7zd>ߌV>#`>`H@>0Uq>p>Jڼ>ʀ|>JŶK>phi>0U)3>`H@[>&>ߍ>f7y> dh>ռXb>J>|o˺> ? r(?CLV?'9N?5}[p?D+$?T2] ?cFs 7FA'>?4}>݈m$٘>%7>ft4>W#1>Ii >d6&>m.qb>zgN>ۢƭ z>Ӕ#>TZ>Nuہ>S>/Փ >`H<0>d[)L>p)1>V$=>α>ro>C/ל=>N>?fZ? Hٸ|? 8M?/44?>n8l?O3p?{}N?~O܆)6?;k'M?gP̖?8^;&?=&s??37 ?2y?z~?j?BG?ix9D@?N?rf5?3g>?* ?ZU?M?̾?It ?L? ؠqyV?LO?ܰD? ]?yv?B(:?k~z?Skі?HNO_?C#vh`?|n.?ov6O8?a t?Q(?B>7?5N$z?(--?P ? oyw>w{6>E]I|>%q">k{Kj>ŵ_$>CWYB>23o'>$Y;>QU{.>O5>{lq}> &A>C> >*=>U(2> F>|+>ϑ#>3V&>\ <> X;H>~Wx&>O51>)B>dJWP? nؘX?3?&x0ј?6\`?G1o?V0?eGr"?t|j?h?z?In? kG?N^?O;?ޭ)?AX$??se?9="2?G+?p6T?E0R?,93?5?}$1'?{h;(?kghL?Fy#?A?{c_R?Ϫi"?JQH÷?6d_?Ol?1IQL?+N*{?D? ?0xi?o?|di^??(ܦ?Ȳox?` ?xJ-?uӍj@?v߿W?{æy?1:hx7?Tt?kY?ݓ ??"~:^?8j,?4?+sF?syN?LJ?uyCoi?D}?XjBJ?tJ{&?f.C?XEl?IxL(?)dղ>S7t>ڣ$7u>˘ >q>jq>z>YY>leZ8u>߉8l>@1>ď9/>> $>:'>1֡>,Ɲ><ξ>?T>Af1c>xMɈ>)q>+m>H?и?O? K8?/\lP?@]{?Pr?_&V?mڢ?|FP `?iq?Yw ??DE@? f?U>S.}?ՐEDt?3XK?l? J3?XB?}`b?wdFS5?u{R?w8?~~0R?6(iwI?'e?r?ݸ?R?ʈ/v? i#?驓%`?3 ?{\.?Qrh?N?[_?jud?&?#p?~5?wo-+7?t*jL?u{[]\Y?z@IYw?#,^_?n ?Cԕ8l?p0 2?.I?N#B?~H?a?Gs7g?e}F?5#? v?G?ָܥ]?N?rb? ?QNj?j̒\? w]8?pvo?Y?t ?̤?ta ?ts?Q?qLx?tW:?yP?mۦ?`~*?Q_?Bֵ?48?&\o W?ٮ? jW&>N>L(>_,>$|q>']Ύ>уFk>ݿ9>u+Z>p;H>47>o|>^?C>>">Ca6 >F=1kb>:Vj>8>Nji 3R>z[]>D^>ȕ2h>XjOK$H>u x>Gm@>j+q? mW@?Z_`?'J^?6٭T0v?F[?VB Z?dБZh?rm&(? ?H<?;&?*rAE?ϲf)?9ȭw??qd?Iih ?ı%?رdhA?gֿ|?(k?c`^,?1?W=:? 9?_V$C?o”?z Q"zO=?x/yc?y,m?[6j?{*Oy?Tfɔ?=?z"?A?sY`? ҟ[?i?d!F?:}@e?i1|q?Z;?pD?8S ?+Q?ݞ!7?r[?Ѯ?)ǵ0%?9X_?>%??+<B? &?4>\Gp>9 >[9X>PM)V >g<>O>3J>-âN>\&>>>q(>Zw@> $q> =>ιUf>c+3>Wb>aƮqx>Jé>ʌh>K!;x>Ы?^>7+5V >K!T @>UI`?? M`?!18 ?0&7wv??)w@?Mr{?[E ?hw]cH?tV}?xm?{Ѻ?7)?<^5N ? l?-?iJ?D!>r?s?0`"?{?yM>%蒐>׎{>$Ձ5?>@8>9"c>^N >yD5>|P>t>$>e.TI>է"[>,.>5r>0.sb>7oD>gT>ݲtM(>MM>isp>e#0>;l]@>o7|>O? ރ`?"ῠ?''ĺ?5._?Cq?Q*SY?_ X?iƺFj`?t3P{?|l?L?ݤ ۖ?~?"?OV?נ? dr?ML{|?7R?Gy$r;?}I0?0|?j0 ?Nz7?Cu1%U??3͔?j"t?HV}?xz?P]ý?ɋ2?[h?Aa?vGU?ѐPi?}?yH?[_DL?Q @?KM?,?>&i?KX?C[:b?핂WZ?#h&q?GG?rGʹi?U ?:eE6?/f2?c?dC?И?U??rstf?dC$S0?TuwZ?D ?4L]}?%J9?Y|>K:>q|^>W\T>OձZ>ް۸>`eĵ>R E>SΟԻ`>ƖH>~śy>˅>.B>G~>evC>z?>!">%C2>'.>LVи>o@>Np>[>n >{)?C?dRԩ?!1`(?.@?9N?F=ڼZ*@?R?_'MP?h[~J ?qn*H?v^@4?{FD? ?z2W?T;C?Ax?n?'?& ?F?׏w1?udjX? F?IO?pֆyD?IX>~鄴>胍>p _>H~>A >t&q>aH>yOiC>Qb`>P_)>dR> N-`>K&I>~P><"M>Opܭ>IuF>5%y]\>8XXP>H2(>g'P>+@>1W4>s%}>JA?t??Xʜ?'i?3yf@?>9?Guv?RԟD ?\z ~?dAM?k<%p?q5|?tí4?xxom?{+]\?`&?ok ړ?00?n0@x?y]?{ue??"4gb?41?(q_%?]@D?UÃ?e5:?O?FЋs?vz?//v?o|o&O?Ju?6+?#q?\9$?Še?d?s?])_?}H?kU?w?`~A?Q.E?)>E?׹Y?8T3?܋R?g?F*SBw?J~S?z/?K\=??8?l?8Ǚ!8? m?v?:{A&??CAc?s.>&?hŵF?= ?rl:?Z[Ζ?TC+?x\9?8E?iV?#?ۖ|hp??Г?I0?y!a?i90?Z @*?HQd?8n?(CU?|fx?\2>qL>x{Uª>ݡbn>΋Ś>R\>Tai>t̷=>v>i>N>># L> XU>oj >>Q%mG>P !>>wbP>BB@> dh> >q(h>8>)>;ў+U> )Ѐ>Ѯ1>>+0`?"p?'h ?ԯ`?&ٷ?0c?8l|u?A.?IA%?RYjcg?Y|bp?a:=?f̂h?mBP?rpT%?wQ]Rҁ?}'1? 4"?¢W?.T!u?Ȧq?LZI?UΤF?wd#-?Wt?Kr'??^X?2pT?rg(T?F$?1B?Q*;>ey\|>݊oH>Π>7[>p1>꫼w>:t>ǎdc?>sYI>RQ>a#>U SS>OV>CɈ>BZ>FO>՟|x>xj>n>.Wl@p>g4b>Qcx>w?S"p?>B?q@`?#&ž?+ԏ ?3Y ?9L`?AB".?Fƣ҈?M}?SQ?YHP?a3; ?gDU?o$U?t2(wwl?}X9?/ز?)JdB?N`C?x?^Nc?0zq?r/ċ?}ܬx?~ $N?&y C?RvV?0pwU?b4"?n?U ߿?0ŶD?ִ ?|r?xO>v?xMuJk?z,?IO?1\?yN”@?6?u jf?wNg?R;J\ ?~ H ?*Cp?Sy`?-lں??r#y?J?RF@.?Ԉ?`g?g?/56Bu?^>얜?D~?v??gȅ?W>{?F5s?6b& ?'t>?r? ^> f<>p{r܃>ۻ|l>̺C>,>`>j_p>nƊ>ŗd(>} Y> 0iQ2'>HB>?%H>D6˖9>E>(>mؔ>ëlD>bH>ڗܢP>y)0>#BB>BNIx?_UtFT?$?{l"\?% Ύ}X?.4y@?5r۔`?=T`?CT]⍀?HQjdP?MrՅ@?Qeݥ4ސ?Tn @?Ydą?`.Xm?e++]?m;N*?tDqۊ?}pGd?Ee?l?ةNk?[V?!Z?*,ޱ?4q?`?W$?}?On?g ,? [.-?GS?C^Br?c@_?_m}?~T3?wmUI?tK0gЅ?t_Y?wnҠ5?~1??1)`Ca?9Gp?MD53?oO?ݤ? m8-?.D?w?.Q]?@_?c)G?@s)?ޤ< ? ? 0j?L?LM?x.?u"-- ?uMډ0?x/)Q?~Bs?s}!O?r3#,??q%6?}?)0?@y?I8x?W7 Zh?#?~h?sc?^rk?K%~?G|z?r>{/?c߯V?T& ?CT5?3@m?$kHc?$>Gv??>b[2>|CY%s>$/>8Ơ>$z>cGL>jā> >&`< >Py>:>fV>xK >Ԋ>!i>pzD)>)>٠>%T>^f=->fv>4h!u?UyS?W?ϳ1r?'VX?21@HVp?;W *?D\5?Ku7?R ?VDH?YZƠ@?\jyq?_3?am5?df-,?i\ u?0 />"?!mzQ?b'?Gn>S>,|>!t=:+>YD6>D>>s>">Oz>>2u>,{IO>.{t>6>[#> >/q>G1%>B>g+>>?G?5vxn?(?(5?3,?@5=M3=?IԲ)'?SI<_?[I:E?aOX?eH8D8?hN=4?j/6H?l$Ӆ?m'?oa}d8?qST 4?t-G1?xC(s X?/p8?.{K?_']?ʼ?Oi̵>?=`ӕ^?lk%?B"?9?<?=en^T?y?) ?k3~?l*i1?z$v?⾻*?Eu??}(p>?{0=̚?|yl?J?ho?Ab?W`@͢?7e%U?iV?#r@?S?0#?`&?P^?&?qwB?#e?"6\?8? Y?.kn?rt(\?N`?jq?{9?wP%C? P8?7MFN??2\"? F Z?¨?8=Ɍ?-?`?sl?@^F?K?Ff:?h t?{86Z?pw*?cE*D?U5Cy;?F3T!r?7 *?("~?Sי? *P,n>7>b3>Cn7>һ+8>dO>I>>sp> =z>L>zQ8>[Ik>c(5U>``*>?&l>x >4MM>L>ȾZ>lx>a_OH>A?:]>Li{k? Y;?"?&pp?3MR 5?@7b?Lzׯ?Wb?b"ӯ?iꜜ?p^?tۇ,?x#+_?z1 4HP?zτf`?z,0p?z} ^?z?{r s?}lZ ? ?@ ֕ ?VQ(?\"?J?a ?)C?^?OY?7i}?i?_ga51a?Rs?tOz{?fmØ?2c?5M?/4?nٵ?QYhm? U@-V}?X6U?WI? ?Fm{?ZPzl?]k?^EΙW?Tۣ?.*@!O?#A?Wn?il??A2"Z?♤G??Lv]?T??SWC?AT?pB5?{`?yg)? %w^5?`y?EBv?~x%Sl?9Z?>Ze?ޓ(?_Fp?,5 ?<2?]j4?Ѽ?뎼u?'g?'@?b?w ?o塶ֶ?dvkg?X\sb?Ki~?=D~d?0n; ?"#G???(r78\>ɣb>%ﲥ>ܙ״>">LCç>+F<>*eZz>ߍ9>L->H?j~LV>l>H?j~>L->ߍ'>*eP4>+F>LC>"v>ܙ״>%ﲋ<>ɴ?(r78??P?"#?0n;  ?=D~0?Ki(?X\sb?dvkg?o塶ֶ?w ?b?'@?'g?뎼v?Ѽ?]j4?<2$?,5*?_Fr?ޓ(?>Zf?9Z?~x%Si?EBt?`y? %w^,?yg)v?{`?pB3?AT?SWB?T??Lvb??♤G??A2"[?il?Wn?#E?.*@!P?Tۣ?^EΙ\?]m?ho?Fmy?WI? ?X6S? U@-V|?QYhm?n٬?/4?5I?2c?fm×?tOzw?Rs?_ga51c?i?7i~?OZ?c?)M?J?a'?\"?VQ(#?@ ֕? ?}lZ ?{r s?z?z} ^?z,0`?zτfLi{d>A?,`>a_f>lr>ȾZ+a>L>4M>™>?&>``5>c(>[} >zQz>LJ> $>tK>b>dO>|;>һ+͛w>Cq>b3>7*? *P28?Sי?("?7 o?F3T!J?U5CyP?cE*B?pw*?{86`?h }?Ff:?K?@^L?sl?`?1?8=ɔ?©? F `?2\?7MFNA? P8?wP%??{6?jc?N`?rt(\?.kn? T?8?"6Y?#d?qwB?'?P^ ?`&?0%?S?#r@?iV?7e%X?W`@ͦ?Ab?s 8?J?|yl?{0=̕?}(p>??Eu?⾻'?z$u?l*i0?k3~?) ?y?=en^S?<?9?B#?lk%?=`ӕc?Oi̵D?ʿ?_']?.{R?/p:?xC(s \?t-G1?qST (?oa}d(?m'?l$Ӆp?j/6?hN=4?eH8D?aO(?[I:E?SI<]?IԲ)(?@5=M3=>g>a>G>0> >[>6ت>.{>,{I>2u΍>+Y>O>b>s>">DG>YD\>!t<>,>S8?Gw?b''?!my?0 />m?> v?O71V?^VCL?k9G?xđ?^ç?bPI=?#9? k#m?Y3f?8K^M?'Q7G?.݃?o4?6?9hP%?W ֆ?4h(>fB>^f=->%e>=>>);>pzDP>">>xK &>f6)>:>Py>&` !>jv6>cHZ>$z>8>#>|CY)p>b[???$>G?$kH?3@m ?CT5?T& ?c߯V?r>{0?G|z?K%?^rk?sc ?~h?#?W7 Zj?I8|?@y?)0?}?q%6??r3#,?s}!O?~Bs?x/)Q?uMډ?u"-- ?x.?LM?L? 0j? ?ޤ< ?@s,?c)G?@]?.Q]?.D?w? m8.?ݣ?oO?MD54?9Gp?1)`Cb?1\?~1?wnҠ0?t_X?tK0g?wmUI?~T-?_m}?c@^?C^Br?GS? [.*?g ,?On?}?W$?`?4q?*,ޱ?!Z?[W?ةNk?Ee?q?}pGb?tDqۊ?m;N*?e++]?`.Xn?Ydą`?Tn ?Qeݥ4 ?MrՅ?HQjd?CT]?=T ?5r۔?.4yp?% Ύ}`?{l"|?$?_UtK>BNV>#I`>y)ؐ>ڗܢ >bW>ëڹ}>mؕYD>(>6>D6˞>?%2>H> 0iQ>} YH>ŗ>nƊ>j_pz>`)>^>̺m|>ۻ|2>>p{r܃P> f.? ?r?'t>?6b& k?F5~?W>S?gȅ?v??D~?^>얝?/56Bu?`g?g?Ԉ?RF@.?J?r#y??-lں?Syb?*Cp?~ H ?R;J\ ?wNh?u jg?w@l>?teFA?s(N?vh%&Ȭ?} }?;J?)?۰^?j{$|5?Zş?Dؽ[?g V?֢B?f\3?Nr.?Pk?D? g3?6v?|r?ִ?0ŶD?U ߾?n"?b4#?0pwT?RvW?&y C?~ $N?}ܬv?r/Ċ?0zo?^Nb?x?N`C?)JdB?/ز ?}X9?t2(wwn?o$U?gDU?a3;0?YHP?SQ?M}?Fƣ҈ ?AB".ˀ?9L?3Y ?+ԏ`?#&ž?q@?>B?S">w>Qc(>g4mt>.Wl_L>n>x>՟>FP:>BZ>CɈ>Oe>U T>a>R>sZ>ǎdSF>9X>꫼K{>p2>6n>Πm>݊oq>ey\e>Q*;D? ^_,?'?(UZE?88?H?Zl?i1?y@A?(7B?D?I-Z2 ?@ ?۰pt?X}R?N=??NBm>+0€`>Ѯ7 > )>;ў+\`>)`>q(h0>X> c$>BBT>wbQ>P !f>Q%mT>oj x> X># >>i?4`><7>tC>TK>R>>΋V>ݡbF>x{UŸ>qL?\j?|f&??CAc?:{A(?v? m?8Ǚ!7?l??8?K\=?z7?J~S~?F*SBw?g?܋R?8T3?׹Y?)>H?Q.B?`~A?w?kU?}H?])_?s?E9V?Še?\9$?#q?6,?Ju?o|o&P?//y?v{?FЋs?O?e5;?UÄ?]@C?(q_#?41 ?"4g^??{uc?y]?n0@u?00?ok ڐ?`&?{+]j?xxom?tíH?q5|?k<%ˀ?dAM?\z ~P?RԟDP?Guv?>9?3yf`?'i`?Xʜ@??n>JA>s%>1W4>+>g2@>H2( >8XY >5%x >IuΖ>Opܭ><">~V>K'> N>dR>>P_*_>Q[>yOh\>a!>t& >A>HQX>p >胍>~~?I&4?pֆx4?'3m%&?6|?G&I?X Fw?gq-.j?vEuO?tc?n}&?_{5ۅL?1k?*b?B0?r@"B?_c2?z?U u?' g?tD?_쪬?Il?k3t:?ы?cm?ضJ{+ >n >U>N|0>P0>LV>'/IX>%B̜>!G >z?EX>ew>Fv>.Я">>~Ś>Ǝ>SΟԓ>R 򐇼>`d>ްی>OK>W\ܪl>q|H9>K:@>9?V?*n'Z?y?%J[? ?8A$&i?,?KM?YW?[_DL?yG?}?ѐPi?vGV?Aa?[h?ɋ2?P]ÿ?xz?HV{?j"t?3͔??Cu1%M?Nz7?j0 ?0{?}I0?Gy$r=?7R?ML{~? dv?נ?OV?~?"?ݤ ۨ?L?|t?t3P{?iƺFj?_ X@?Q*SY?Cq?5._?''ĺ?"`? ރ >R >o7|p>;l]>e#ر>isp>MMp8>ݲt@>gS,>7p\>0.>5>,N>է#4V>e.T`>ǫM>t"c>|(>yDH>]Ne>9">?}>$Ձ5I>׎{w>%蒍>M~q?B ?9q?"?]?04H?@}Ԏ?Po "?`&F?mzm#?zFɡ?VO?砀w ?M?$?NO] ?a61?v<*?ܸ?ϫ2?|?Yy ?SGP?n?\?9AkI?Ɓ?<DŽc?H]x=e?4Jc??R#?!)?͒5y?hZN?m̽?R?x#?+2?( uN!?S!3?UZ?:7 A?sBQ?HB?_|?ZӒJ?_V$C?+q? _?qI?m?( =[x2?əi?9x? V5?x3eD=?rye? m?OVPC?-6}u?A[?}ZN?\UK?| 1 ?xC+cQ?yy?iN?-? v?<^5N?7)?{Ѻ ?xm?tV}?hw]cP?[E?Mr{??)v?0&7wv?!180? M`P?>UIp>K!S>7+5?@>Ы?0>K!;w>ʍ>J_d>aƯ<>;|>c+/>ιSѮ> => $r>Zw>p>z>̅>[>-âNHZ>3X>g<>3>PM)Us>[9>9 >\Gp ?4? ?+<M?:;\>?IVХsQ?XG&DI?fUC_T?s5U6? 4|sb?iJֿU?H??cV*??v?Ph?_6<,?%?9X`?)ǵ0%?ѱ?rd?ݞ!;?+Q?8S ?pE?Z??i1|q?:}@f?d!F?i? ҟZ?sYa?@?z"?=?Tfɔ?{*O?[6j?y,n?x/yi?z Q"zOC?o˜?#p? :?W=7?1?c`^+?(l?gֿ|?رdh??ı%?Iih ??qd?9ȭu?ϲf(?*rAE?;&? :?}tz?vσ?t)F?uoeD(?{s?]qI?^ƀ?E ?z\?H<j+q@>Gm@>u Ҡ>XjOJ>ȕ2=>D_>z[ >Nji >>:V>F=1j>Ca=>>"ð>^v>o{0>4A>p;PX>u6>ݿ9q>уF#>']w>$|qD>_, >L(>NB? jW?ٮH?&\o U?4?Bֵb?Q_?`~*?mۦ?yP?tW:?qLs?Q?ts~?ta ?̤?t ?Y?pvo? w]:?j̒\?QNj?$?rb?N?ָܥ^?G? v?5$?e}G?Gs7e?_?~H?N#B?.I?p0 2?Cԕ8k?n ?#,^_?z@IYp?u{[]\[?t*jL?wo-+7?~5?Ȳow?&?jua?[_?N?Qrh?{\+?3?驓%`? i'?ʈ/x?Q?ݸ?r?'h?6(iwF?~~0J?wL?u{R?wdFS6?}`b?XD? J3?l?3XL?ՐEDv?U>S.? i?DE@??Yw #?iq?|FP `?mڢ?_&V(?Pr?@]{?/\l? K8?O?p>H>+h>)q٠>xM+>Af1>?[><οW>,Ɲp>1Gi>:'}> ">q>ď9>@1Ao>߉7>leXp>YL>zU>jqI7>q>˘ r>ڣ$7>S7tp)>)d ?;|bMz? ?!@=և?/KPx? ?y?zY?^??%J?|WA?m? f?lAe?,!F?L)7? A?a?w_"Ak??i?ݓ9?kY?Tz?1:hx=?{æy?v߿`?uӍj@?xJ-?` ?JǚՂ?(ܦ??|diW?n?0xf??D?+N*{?1IQO?Ol?6d_?JQH÷?Ϫi%?{c_R?H?Fy#{?kghL?{h;( ?}$1'?5?,93?E0Q?p6T?G,?9="6?se ?AX$A?ޭ+?N^?O?? kM?In?z?t|j?^?eGr6?V0?G1o?6\`?&x0ї@?3H? nؔ>dJW>)B>O5#>~WxS> X>\ >3VD>ϑ>|> E>U(2H>*? >B$> &>{l=>O4)>QTy>$Y;>23n >CW/>ŵ_$>k{Kl >%q>E]ST>w{ƹ? oyu?P?(--`?5N$?B>7?Q(?a t?ov6O0?|n.~?C#vh\?HNO_?Skі?k~v?B(;?yu? ]?ܰD?LN? ؠqyV?L?It?̾?M?ZU?* ?3g>?rf5?N?ix9D??BG?j?z~?2y??37 ?=&v?8^;+?gP̢?;k'J?~O܆)9?{}N?|>p?j?}= ?[%-?)?j}?V%?"1m?t$?2Z܊?a[o?6??~?I?I[(?~ }~?oB7N?C?%s ?yYm?J!?oŅ?/?Hה?5ևGV?ե??s?,?!?Z ?T?8?MĶ? =?`?|4?ls߹?^,*&?O36?>n8?/4? 8M? Hٶ?fZ>Nb>C/ל4>r*h>α>V$M3>p)^>d[>`H<ː>/ՒB_>SHX>Nuۃ%>TXu>Ӕ#e>ۢƭq>zgL>m.q+>d6&od>Ii۹>W#1>ftʀ>%>݈m$;>?4> 7F:?<[?.?(U?! Y2?0 iއ.D?<_v{wD?Ji!?YsP?h2?w^D7?M`?NI&-N?^S?#w?Tb$?~?RD?*l ?/g?kX2?f??Mߩ?u a?RI?fL?y-?Llcν'?kr?*?~P?9&?hc?Q ?Zڨ4?;DD?C?_!f?//S|?ίr?]#? *sr?Ko`َ?θb?*}?FSKE'?\k>?VWZ?? I?^N?\.?GX? tQJ?l?he1?~ ?A+?U`?w(!?b?Ma|H?~W? E?z?)?l$2?˩td6?_)?l}(j? fH?|Ţ?n#Df?`GZ]O?Q)D ?A+?2˿ H?$(AM?G?Kg?HOB>P >9F>IG>/]4Fҡ>#$>m;젨>+)>>;>bT>^c%L>>7;)(>JZὈ>7;)*>N>^c%KZ>bT >;J>+>m;/$>#$ 1>/]4F>II@>9G>P b?+c?"_}?mJZ`)??=??FSKE+?*}?!?1eo?,ۆ?h,h?}W-d?e ]@?UO?M?Y4?P+.??k"I?ļc%?8۾We?k0?좨 ?ZǷ}?k??T`i~?nMP(?ex?}=?c*?T$HA?jc ?A$#zf?-q^?PO<^?,!y?VO;h?$⸴?|?>d?r_˺h?d.U?Ua8P?Fza$g=?8;9?,??_h~?+7BV?Ǹ':>xP>J~>}hN>̵o >.ޒV >!_]#>j>Ep>&OAT>6l>Ѕ^>k`*>j3>l>޳> m1,(>0 W>|6>J>2D>ݬZ>1>&+>c,؊3?P{}Y?"G R?*gEQ`?+(?; a*D?K )?Z3q J#?hH7[?wb]~t?A:?Ӯu?8 ? &?e?x+??[?nW?V0?b??!h+D?@ti"?R~:? P?klm?IJH?nj`f}?=?[̄?צ?M)?ߑVΕ ?f ?^Ǝt?k??Z,^?w xr?|Kw?WL?J?ᳺO=?!,и?r?+*Q?R(}<?F;w? V?1? *Gѧ?6hr.?f?P@P{?? +u?#}?y5?eN?4 2nv? #In?$Ae?16uO?Dz: s?9R?C@Y?+Z4:?sFo?3?Ƭ?$,?&d?NbS?^9? o-k??v`~+?ijuh2?[T}?M$ֱ?@?2Yy?%4%W?(a3f?z;S>P8XF>S%B>᧫zf>"4>ĵ*>a>':a>6>Q8 >8?>z>>v:8>>fY>h*2>ή1I>zCo>KEN\>W޳r>Ӱ>;2>'>'2B>f7>1|?1r_?'z$?$yԄ?4̢]?Dvko\?T^s6#U`?cy ?r{mW*? |?E?)?֯?`X'?gJh?NYm?*n0?R4?6'bH??uh&?8ck?&Z?F3 ? @? f ?XfXxb^?1?3}?(?Y?pF ?/b;[~?Nl#?҅?*R?L).ң?j y?$I`u?<.?}(?zq^?|)q/Q?Vj?sh?]x?,?"2?'e?xB? 7$?qp?_kI?eH?nÈQ?|2?H?)9? ?ӟuY7?D*s?Q1?j:>8?y?#ŹT ?yШ{?P?%G[?|J,?. L?ku=VB?E uh?{h?pw?bS ?SF,?Es\?8|Z?+1-B?ANyJ?o\#G?0pba>09>]ko^~>؋>&2t>/>8f>MF>pё>R'>++`>atZ> >ف>D>AG>NEt>@PQ/>}-\ D>AE">CO>Cgdp>SlE(>B><9,G??!?lkg?@z(?-y0?=8?N4`?]J΀?l?ڋ+d?z@?rIى;&?? .?p?|h%\?H"?Vsġ?v@S?8j?n?z ?_?Sb?Xj?z]*?y~_?|N ?Jo1 m? ?Fy4K5?FV?8t1?SvYv?:Y?,?)\ ? W ?g?bΉC?O!?X}r-N?4? ?H"??W ?{ ^P?y$O*?zm@!?L7?M]?~7XK>W&>+v>nef>VՀ%>VLb,>s2W >q2m>d1@>Ɔfh>b>lT!>L,Lo`>գ#>A_ή>w\%[>R\ >9d->>n>7\ih>ҪK>f8\p>z>>=\dP? ?֝?&adFy1 ?5Ā?E'2?UP,?d|?rU*N?ǖ?ʑ}`?9?u5???J}?\A^?nW{??B[d?aCJ?yBl? ?Duǣ?j+c?\E?-]%?>򴫙S?)^md?W<@?6 e?~Ap1?֤i䮏?*15p?X/H? 5to? j?h:N?88?YJ?Xww?Zn`?xY4z?䖫:1>mp>þޤ>Stz>. w>$UWƤ>M*J>UJ>ك>l>S>$>ER~ >j>c7kM>u>#&>[1 >B: >]"Q9><\>ϣ5>-0>pܯP@>:.?}?EzEd?!.}@?0u``?>]?M]5?\5 ?i/`?vcSyx?U?W9Z?cq#h?ɆY?ጷg7?dk[{5?؅ .?[W?+?'x?Z;_? ?}-uZ?}ɑ,?/c?%ˣv?BCq?V^?ez@?46v?^)?bφ?Ty?N? ?yj?.g? 6^?)n?mgD?yH?bE? q?]?I7?Kv4?P/p?R҂?}?o W??k2?i^ ?יq?-?r=:'?8gWJ?Gv?3r?\wJ?Uka\?H?/'??;_?s;Q?b_vs$?)l\M?ĝQ:6?"%'R^?Xb{*?o U?O_x?nA??Rda?4fk?x>v?hp ?t$~?gE'?Zc?Kx@rZ?<k_?-lr3 ? F?xƪ!?y1N>_I\a>Π%>ֲ9!>w%>+[Z>1Guu>bm^R>DeG>taj>RG~>TNR>wn>D>>{:>F̊>K9I:7>Ų /`>%k>Jݶ>«ڈ>t)m>DJP>ZJ=p>œ&>/M ? nG@?c?'?`?5SA?C==R ?R^!S?`ӭ`?l``?v?x@?-#?" ?-:^? ?ܨR?_{?C3fQ?_ɪ?@H?sS?2?AK+N? -i??cH<?0U(?8r?9~?FS? 3pP?)go?Ő_?kȀ+R?K]~?nI_?;Jt?xm=?izb?F-i?-?;N?I? w(xY?0 Ʃo?U[0?LUv?uXB?~I2?]3",?=z܌?0`?)E?6~$ᾧ)l >wdEb>y+/8>G]>'3~S>_L>L>u~Q>~N>5>PVK>,G>6!f_5V>^7>ҙ6>c!>]>c_)&p>E>4~H>BT`>)܄ݕ>ph<>G @>ՙ*wv@?p?tN?|3ה?v -?@eb?+:&G?ۖ?l̕f? ?`]j?N=v?o?yo퀓?$JE ?a=x?[G7?LG0?\g*{? /?xf?}c? K? ?+=|:?y^?T_w?Yl?RX?VJeI?7?o7S ?2?32Gt?W_fH?ƈ]L?P?ψ(?0? e?bG?M)d?BX? ?gƄl?= ??WJO?w d?Wʰ? 2 ?%j?.u8y?ΒD~c?bH??`˿z?mp?:X-q\?V x\?wӯ?o?fəR?Sy=M?=Z(?Cd?:@X?Rl?gVA?qup?cf=?ȘN?C]t?3 ?% 5?Fa3?hP>d9)Q>T>"I~rKI>R>W݆>:l{>3_Ś> 1>b$>fmԴ2>ɪu>/WI>&J>..w>6׳f>8V>i>*Q>۝g?>•@>z.>kL >cA >{IH>8??k?/oS?(g:?3B@?@.'I?J%t?U `?aX?i*2X?qd?w -\?~Z??4+?r UЪ?V8?!-?xJ?(+j?&r?͖o?a>>!<>kK> ;/b>͟aR q;>N5> B6k>K=>5+͗-A>- >%:*>:t>D`,T>ǒ#>x)>">>7zi>It>T>ph>S>v)jS>k&@e>$3>G4+>#-h?a9K/?S7P??& 2 ?0;?F?9c<8?C@8u@?M[>Do?UࢧK?`8?fuvP?o?uŠ|?|QAT ?RI@? Fؘ?a#X7?[vI?\bh,( O(>|`\dF>eM x>AĿ9>W>->!fu>y >jtA*>f>J>O_"t>T"/r>7F>Sl>sN>lmZX>>E8">ĔGI>f4j>s۲$>V3d>ܪ ]w>xtf?0?3=x?[0?"6?*?2Q#u`?9sK ?AP?HCg?PaͰ?Wf}p?`.Y?hY ?p?wƧ?i ?963_{?4`^?&!?66?wo{?PT?[h?T\N?lէ?s;'?Vה^ƒ?O+=ˏ?sR?M+?%2Y1?__E?ڴ?7Nؔ?}?}PwK?aK>?y?GRq?B;?t2?T\e5?N!z?5[ ߂?HԬJ?t֭&f?b8?hߛ?Qʃ(?"*Z ??4pBG?ڨ,N?vMem?3wp?{9?xj?x㟤sN?|&? S?Kc ?@j?Qf?*wI?o?wu?G ?? ? ?|15f?ڜ1?̗O?? g.X? j.?r"A"- ?cd@ $R>椣_p+>Ʋ>jʞKDt>퇗:>KmAL>nu>h7>[s >.>f>mۓ>]PG>)XI>^3̪>jZZ>kLV>j8>I>&= H>فM>FR1(D>{]2>4L?3?k5:??#9&8} ?+Zpx?3;7?:xT_?AyH?Fap?Li _=@?Q Fc?V2x0?_;e`?e׍?o%>F8?vnfű?B&q?Ц>A?^?rg 1?An8?k??Z+W?~-=?71Z?ZZZK? ˹?#"?q+?!iW? ,?% `?1a?+ ?|Z?xR7?xGGɈ?{2x?[я?FR37?p4?yQ?^m?`Z?y,6 ?7%Lo?ڿu?Nj='?bA?I?}=!?Wz?Iڴw?fXu? h}?@?/?j?`?&(?s(K!? q(?z~g?n 9@?`C7X{T?P&YMI?@z,tX?1y`?"D W>?%$?nFD>/[T><ԫ>ؚ>|,PN>pp!><.phM>skJ>nV>r1^>>u0&>{{><$>6J>'y>4dw>2>8'P>8k[$>- ^>ꢀ>R?22? {?I ?%GU9ό?/ I3L?7tC?A3!?G;g?Od ?Syր:P?WSn;?[w ?`S!0?d,-p]?j,+&Z<0?qz?)? z?y*?<p?~/j*?z$Go?yv^&?},?K(?,Ȱ?ԵZف?U?&{? 䮕?+>v ?񾣆?.?Z?gT?p ?? V߾?g?ߠ*?'y2*?9 0?" ?CJl?s v?s?rX?%*{+?tҸ?'<o?Ǣl?X,N?$3?:=?<}R?Q%n[B?w)[\?m@^?HS-4?>?a}?>}?h?s;K?fR[?XP7?IAP?:J?,<=j?/1 ?M>-lz7>A)P>>8>wm9N>DpL>:}>Ubo^>hF6> I#>BzX>*va>in=82>⚠>[m>?N>!YG>;e^">l$v>=!o>܋B܀>>?ӧ?P?>?%y?1>#?;z&`܅?E ?P`y?V f?]o0z?bv4k?e_ 4?i;0b?l]1?pf6L?sT ?wp*.?}7*,?`ۻw?"/=?')s(?ⰌN?6#氣?l$V?#g? tR=E?)a:?kZ?6~9?Qߪ?m0V?%]ă?EB`/?J8?@&?LD\?&l??\kP?E)t6?{Q?ͮ|d6?ړh?p??qTc?{Ev?R?3锯?n(?@N?Eee@?i7|?uTxΈ?jsB?_U?Qx ?Bl */?3)H?&(ѵG?!.?:i~>6՘>lp">4ݤ>E>IC6W>|>Fid|>:*τ> `y>py0>^f>>-k>}4ua><>F%B>K>\A>_N >>q> ub? ,,N?T4}?$h?0wx?<=(?HI?SŽh`?^YO?e2G d?lsp?qO'?uLqe]N?x sD?zd  ?|u^C?<?b^.??Ev?=x]?V(,?o;}?Bm?8|x?-;1V?<*m?m?Lɷ?{85?M'3"?o%?DefKY?LOr?3@!?XrXp|?4J?,h?N0s?Rz7?}Q?bub{?ie3?ק?P?"F>?)y? `6J ?]?Ӷ ?״?gXL? ?@#?_]*>?qh?! |?s#V:?ArA?" ?z cE ?rژ?i.?`ޫ 9?TD۲?F«ބ?9*4O?,_L? >c??yl`>m>Px> D>ə`X>Si>Rv8>" E >I6r> >*w>X>*w&>A >I6r>" D>R.>S]>ə`> 0d>Px>m?yl`L?? >cO?,_L?9*4O?F«ބL?TD۲?`ޫ 7?i.?rژ?z cE ?" ?ArA?s#VF?! ?qh?_]*>?@#? ?gXL?״?Ӷ ?]? `6J?)y?"F1?P?ק?ie,?bubx?}Q?Rz8?N0s?,h?4L?XrXp~?3@#?LOy?DefKa?o%?M'3&?{89?Lɷ?:¦?<*m?-;1U?8|n?Bh?>;h?Q?,so?4?z#?ZpՋ?nd;7?֢Y?p ?@?'?|ޣk ?\c ^?ǩ/ ?6\zj?saj?o ua8>q>~>_N >\mr>K>F%.><Ü >}4I>,>>^f`h>pyo> `z>:*E>Fide>|۸>IC6>!>4͸>lp>6ՙ?:iy?!.?&(ѵG5?3)H?Bl */?Qx?_U?jsB?uTxΈ?i7?EeeH?@N?n(?3锵?R?{Ev?qTc??p?ړh?ͮ|d8?{Q?i>.?Gߝ|$T?%y???d?ӧ(>>R>܋B>=!o4>l$y.>;e^$P>!Z1G>?Oa>[u\>6^>in=8>* 6>Bz[q> I$>hF >Ubl>:}ׯ>Dpw>wm7>>8>A)X\>-lv?M?/.|?,<=?:J?IAP?XP7?fR[?s;K?h?>}?a}?>?HS-6?m@a?w)[\?Q%n[D?<}V?:=?$3?X,N?Ǣm?'<o?tҸ?%*{$?rC?s?s v?CJl?"?9 0x?'y2,?ߠ*?g?? V߿?p ?gT?Z?0?񾣆?+>v ? 䮕?&{?Y?p4?,Ȱ?K(?},?yv^?z$Go?~/j?<l?y(? z?r>"?c1p?uGO,p?p_`?ybHA?ܣSM?蝎$P?5C?u?f?~3?<Ųd?Nbm?c?l*|Q?wDB?qz?R >ꢀס>- ^>8k[>8's>2>4dv>'>6HN><|>{{>u0&>>r1_n>nc>skJ`><.pe>pp>|,K>ؚc><>/[V?nA?%Ȕ?"D V5?1y?@z,tX?P&YMW?`C7X{A?n 9@?z~g? q(?s(K!?&(?`?j?2?@? h~?fXy?Iڴz?Wz?}=!?I?Y>bB?P\?dޡl?}i?y/?yLQ?}tޜ?ܜ{?̜1?aTsף?T ?ϛ?h Az?1?A?B&s?vnfű?o%>F8?e׍?_;e0?V2x?Q Fc?Li _4>{]2>FR1/d>فMʆ>&= l>1O>jԪ>kLVx>j>^4>)Y8>]Ps>mۓ>.> >[tis>h`t>nud>Km&>P>jʞKƲ>椣_c> $X?Qj? Tޢ?$'sr?3k04 ?C;%?p?S2jd?cd@.?r"A"- ? j-? g.X??̗O?ڜ1?|15f? ? ??G ?wu?o?*wI?Qf?@j?Kc ? N?|?x㟤sH?xj~?{9?3wp?vMeb?ڨ,O?4pBI??"*Z ?Qʃ&?hߛ?b8?t֭&g?HԬJ?5[ ߃?N!z?T\e7?t2?/4 `?GRp?y?aK>?}PwK?}?7Nؘ?ڴ?__xtfp>ܪ ]>V3 >s۲3>f40>ĔGG(>>E>lmZƍ>sǵ>S>7>T#&>O`>J~>fr>jtC>y a>!f,>V>xB>AĿ%>eM k*>|`\Z>,( U^?rnuC2?n?%(M?4[;?D]`D?Uk<֚?e \?s<҅?Ѝ ?y^R?#nfx?qW???]Q?Blލ? :L?fn?|;? M?@?`O?=t?K?!2???[]{?8?;H?Ȓ?%ğN?m?RIDo?C@8u?9c<8?0;?E?& 1`? ?S7?a9K.>#-l>G42h>$3>k&@t>v)jT8>S>pL>It>&>7z>>"Ҁ>xj$>Ǔ>D`..G>>%:>->5+͖9v>KG> B6>N5->͟aR L> ;/>kK>>!(*?D'?UlHi?e&?s2)?Z?C+?[0H_?:|!?Dubz?cl՚?G&R?}{a?BBt?O^?zWV? )x?#뗃?d?D?[07 ?PĚ?Y~?2#?FA?*s?z{?6u?Е?6?}\?nk:L?m?`ZC?,]e?iT?49?8q_?o7S?-?x'?Oh3F?W֎0?-g6?)U%?|?:3G!?uf?Yq??`;?(y??8>{IM>cA>kL߰>z. >•!>۝gx>*Q[>i7>8`>6 r>./n>&>/WKB>ɪ*>fm,>b > ~Q>3_X>:l>WS>R>"I~r<2>T>d9)?h8?Fa?% 5?3 ?C]w?ȘN?cf=?quq?gVA?Rl?:@X?Cd?=Z(?Sy=M?fəR?o?wӰ?V x[?:X-q\?mp?`˿z?bH??ΒD~f?.u8y%?%i? 2?Wʰ?w d?WJO??= ?gƄl? ?BX?M)b?bG? e?0?ψ(?P?ƈ]L?W_fH?32Gt?0?͒E@?7?VJeK?RX?Yl?T_w?y`?+=|=? ? O?}c?xf? /?\g*y?LG/?[G7?a=u?$JE?yo퀎?o?N=v?`]j? ?l̕j?ۢ?+:&J?@et?v -?|3׈?tN?l>p?aJF?T3b`?GV N?:^7?.^=?!LK ?)ɠ?ՙ*ww>G >phP>)܄ʰ>BT>4n(>E°`>c_) >]N>c!-b>қ:>^&l>6!f_>,>PVz>5Gl>b >u~Q>Lf>_Ȍ>'2w>G]>y+.>wdEbL>ᾧ)o8?,؉?.l?"y?1{c~/?@~Yl?Q(ND?`1xe?n2?z#H\\^?o iv?iMy?yp_ R?!1\w?Bjz!?|S#X ?6~$?ξM?+ ?flә?󛔕_?bF?[[כ?s?Cz$?鯈e?Wl$?;a?R+v~?T;?lFy\?Bm?9/J>œ&>ZJJp>DJ->t)m0>«>Jj>%k>Ų .B>K9I:'>F̋>{;n>D0>&>T>RF>t*>DeEU>bm]>1F>+ >w%m>ֲ9!&>Π%&>_I\:?y1E?xƪ#~? F?-lr3?<k_ ?Kx@rL?Zc?gE'?t$~?hp"?x>r?4fk?Rda??n>?O_x?o U?Xb{*?"%'R\?ĝQ:7?)l\K?b_vs&?s;Q??;a?/'?O?Uka\?\wQ?3r?Gz?8gWM?r=:+?יq?-?i^ ?k2??o W?}?RҀ?P/p?Kv4?I7?]? q?>򴫙S?yH?mgD?)n? 6^?.g? ?yk?N?Ty?bψ?^)?46v?ezA?V^?BCt?%ˣv?/c?}ɑ,?}-uY? ?Z;_?'x?+?[Y?؅ .?dk[{;?ጷgA?Ɇ_?cq#e?W9Z?U.?vcSyp?i/`?\5@?M]5?>]?0u``?!.}@?EzEb`?} P>:.>pܯP>-P>ϣ5sP><>>]"Q >B?$>[0'>#>uxn>c7kM>>ERx>$H'>S}>l >فz>UI/>M*e>$UWM,>. wX>St>þ/>m >䖫:#? L]h? lW?(3=\`p>zF>f8k`>ҪK>7\i`>nt>*>9d>R\>w\F>A` >գz>L,L;>lTA>bB>Ɔ'#>d1>q0>s1>VLbf>Va>ne>+>W&|>XKy?}? m2?#H0h?1KB?@ A‚2?MKKP?Z\?grRU?tf@ ?C&?kъ?X?Js&?dz*~?1fP?LҀ?V?]f?2]6?+c?m~b9?kHZ?S4fh??3"'?]l+?YTڧ? ?|?(H?j]"?Za Q?k?[?0 P^?~7<9,N>P>Sl.>Cgd>CO>AE">}-\ n6>@Pӷ>N>Am^>D&>ـ>>at>++`u>>R'] >p>M>8q>/>&nY>؋ꖎ>]koWL>)?0pbT?o\#G?ANy>?+1-?8|Z?Es?SF,z?bS?p|?{h?E uk?ku=VC?. L?|J,?%G]?R?yШ{?#ŹT ?y?j:>9?Q1?D*t?ӟuY7? ?H?)9?|2?nÈP?eH?_kI?qo? 7#?xB?'e?"2?,?]x?sn?Vj?|)q/Q?zq^?}(?<.?$I`u?ᳺO=?L).ҡ?*Rz?҂?Nl!?/b;[y?pF ?Y?(?3}?1?XfXxb^? f ? >?F3?&d?8ck?uh&??6'bH"?R4?*n0?NYm?gJh?`X'?֯?)?E? ~?'>W.?{*ˢ ?VV@? @du?r{m8?cy ?T^s6#U2?DvkoT?4̢]?$yԄ?'z?1r_<>1X>fP>'2">'l>m>Ӱ>W1>KENЮ>zC >ήKC>hq>fU>>v:>z>z>8?>Q6>6s!>':>a>ĵj>"4 >᧫zX>SP>P8XLc?z;Ky?(a1*?%4%W?2Yy?@H?M$ֱh?[T}?ijuh2?v`~$?? o-i?^9?NbS?&g?$.?Ƭ?3?sFo?+Z4:?C@Y?9R?Dz: q?16uN?$Ae? #Ii?4 2ns?eN?y3?#}? +u??P@Pz?f?6hr.? *Gѧ?1? V?F;?R(}<?+*S?r?!,е?!?J?WL?|Kw ?w xp?Z,^?k:?^Ǝt?f?ߑVΕ?M)?צ?[̄?=?nj`f?IJM?klg? P?R~:?@ti7?!h+L??b?V/?nW?[??x-?e? &?8 ?Ӯu?A:?wb]~t?hH7^?Z3q I?K )?; a*r?+V?*gEQ?"G TY?P{}`>c,؊C>&+>1R>ݬ>2A>տ>|6>0 > m17>vr>>j3b >k_>Ї>6i>&O@>EpQ>j8>!_>.ޒVd>̵ >}hMK>JY>xP?Ǹ'l?+7d?|?$⸰?VO;f?,!y?PO<_?-q`?A$#zh?jc ?T$HA?c,?}>?ex?nMP)?T`iv??k?ZǷ}?좨 ?k0 ?8۾We?ļc%?k"G??P+1?Y:?M?UX?e ]U?}W-i?h,p?,ۆ?1ep?Nh8 H?V??^ ֬?Q-]?8 ?6=A?d%*v?]?{?[?m?c_?~o]? /?. 44?MOת?>??Dp?5h?N>?)ir? Y\?p?3rM+ ?P521e>˱>O">`-K>Rm3x>τ>MZ>/ D>]#4T>:Ԛ>ӀC>!/M>GC>!.ff>ӀD>:N>]#4(>/ DEz>M>τۖ>Rm3F>`>O>˱>521T?i.? ?!3I?/T.h?=?5d?Dp?>??MOס?. 40? /?~o]?c_?m ?{?a?]?d%*v?6=G?8 ?Q-]?^ ֬?V? ?ᅺ?y|8? kq?z7h?)? AT?l$Zj?4?۞a?v<3?g] ?t?]PEZ?ԭ)Eh?p&?iE?x[KM?k׮n?_<>囌?P「{?B#e?4?'19 ?8;rb? NNH6>RO> /E>4>iZ9Q>ʉmY4> ?y>5 ">$C!>_L>-3->e>:/>5%g>nxkp> L >lL[>Jq=߹>"xZ>P>|> >p>ح>^flR>qs}> J? 7hF?&`e?(5?60m?FS?U^tՃ?d7$)?oCY?֠?!??4?4L?BJ?RO?o?R\[a?#?B7?TK3? /C?Ά?}7M? }p?&?7/)?tܣ}Q?I ;W)?VY}b?N5??ȻFaX?׎? 4>?@?{nT2?֪R?UgJQ?yIG3_?{V?pi&ä"?cɁ?TTN:?F6?:]M]?/_BJ=?!2ڐ?͸?<>2k>aF>nb}>[~@>Qf$*>o9a>q (y>o9&X1>RalG>1>QZ2>p> מ">K>Z|/>s>t9JԿB>v_>VK>Ū^6>ѩWώ>||>@E@>y2?qw(\?(b/?"C偋?1(u?A N?Q}?a$Bb+?pH̑?[W?="V?jd?6[?5R? ?WF-;?L?Ry Zj?TB?4?|?ޜ߅+?:NО?sV{? ?q:`?`:?k屶?z~{?h?T_k?~w?Vj.?}(?~Dt?G2)?Xr?Ԡ1\p?ҹ?E =h9?JY?-?L+ ?Qܞ?Zw?ki?dш?$;Z?ZGM'?P?JrI?yn@fT?`yWڔ?=k,OJ">M> f0E>ճM>C%f<>PO>z.:rq>L>TiM<>S׿~>[>pd>L L>]~,>p8k^>ɼ1)а>StU8>f2g>I:f>gcx>>ʳn1X>p>Ǽ>3mFe?R,?{?2{-?+@#J?::T?Joͨ?[d1?j +?y Im?d"x?c8r9?eJ-?Jde?è ?P ?0d?- ?0?pZ?&S?Ԩ?4 ? ?|8WO?{Wտd?~hcDf?N1?%Û?$? ?#|23u?]̠L ?L ?W$?tЮ?e?P?BH}#?̼eR?*#+@/?oC!e?Abq?ğ7? fٔ?6{?fjFA?~88?{^}zcm?|wX~?i̱7+?򸐎ʯ?S?vWi&?ُ>mV>?>ڤmN >SX>q8>옎w>~>n<l>  V>zbG>(ȳ CE>8> T>^ŭ>3>9SM>sj>.>.+z>ۊŬ> VuGo>Ѧ`!>W7>ʹ`>߆B?hY8?ƹx?%y?4?K)?D$ᬦ=@?TLB?d*wM?r˸?$(u$?S*?,=~?*?s?)ڣ?Gkp? /;? 5?h!^?Y(s#(?]xX? M?zOu"?zho?yMp?|£C?(yg?>6=?[9??cƴv?d ?ǿ?*?joH?n8[? Ⅶ?3R_m?f il?cĂ?ۨ?SN6`?G'gdlZ? ?{9?ѷf? ݠ?FaSa?aA?i]u?>U3?;zlE?@!%?SH ?BJ@?e?g?jdi6?{i?U|? w]?h:|r?Ǐ??"AZk?/?v?TX" ?CQ?Pf;E?YT?l/?;s ?VB?}\)'4>?riG|?g9[a?[i8'(1?NHn?@Mz ?2]0?$ZFÜ?F?nk?ہ.b>d> o^>U$o>ͩDl>ćc|>âB>N>°>8MQZ>bͳt)> H1C> >fO>B2>KJO>濧>7;>٭bqc>}c>ԯ >ۄ>KVp>ץU@>=Ɖ>]\Jh?."?i9Z? Lj ?/eǼ0?=$P?L8Gtp?\U?k)b* 5?ƒ\a?ޑ?8`? 1? ?,v?,h?'jd,ƶ?d?@M-,?Er#L1???hM? 68?W*?+  c?s>?Ļ:?Ntcd?@??q&?{ ?Vi?,.i?x`J?n!X?bW;j?TEAF?E5z%A?6< >}?)*T˶?GU%? =^i>{>"M>'>{Ƙq>ǁ z>ŹJ>cT6J>?sRL>l,>8x˳>ar~>>S$.>Mnop>^xN>5>>=laZl>a4>D>IT>b=`>˂DR>7 >>`>Z/S6>'9? "2??'(Y?5@?DÀTK?SJ0?b'"bR?o1Cx?zs?5z;?p?z6?(1?&?V~?l?>i^n?ҟ$?v`dT?[g?[.:4?U1?&HT`!?tW5?E͈"?ٚ6?]i1]?`\E?.jk?3 2?E(?4<%?$4zJ?fԗ?5 ?˞A"?\Y?C?xw?f3m?Vo?phop?zMDB?o E? ?d˜?S?r ?ٴ@?E$y?|]L?PpB?sPS?f7z?YH)J?Jj?;,"?-Zi[V? KMM?C1?kqzz>I>ٽz@ݡ>m >}ճ.CR>W>, >`$I3>>Wi.>_8>C>>jr\>+Z0>p8<>y_^>1GJ>`xF>|& >JAt$>:s|]7>i>Bg6 >Փ0 >"G8>tB>C?:'e?e0?"0}w/?/ש?;ط*?IX!t?W/9-X?d>r,X?p5?yJ?Lʱb ?g\? } K?łӪ_$?0~0ʒZ?D?n?]tHt?wYY?Ԧ?٧sn?;CF%?8>?7i?Pl#?¼ԡ?&GQs?]F?R3"T??#]?q4!?4?P? ?9yP?N??uO?qnV'O?b@?C?+&?C?&$[?Xˆ?Fuy%?-D?J!?)Nc-?! "?;Gv?.?sE?4R?0ۺ?urd?UY'38?Ihp_??Ojz?( i\?edVz?XO*s3?-&b?c)V f?8MX?pnJ?e??A|g?mÇ :?A='?56?wB ?jR ?]6刌?Nd ?>楎S>?0_i?" o`H?N?р>,KV>D>=Wŝ>65P;>*hSzk> 4#>Rl>q7l>0j.̥>NM>ǝ /I>/ J>J+ի>><)D>E'\L>ϳ'>۹H8>pD>T1%$>̜8xЭ>LM>b+>Dd >?L$t?dto?dj?(4?4_;?A^ ?I=?NtEK ?Yx-\`?dxr?ol?wm*P?k?)VkA?aJ$?gTc>ǖ >ّJ M>Rg>OgN>ğ E:>yۧU>D}>~Y>Ct>"n>JT>^P?s>$$>Nl>3I>z>5-f>&Z>Ǒ(p>52>,H>M`>qJ> g@?˂)Q%? h?֨+?&)5(?1";hsP?:R?EVD3 ?Q[y^EH?Zﮟ`?d-=d?nM?vS*,?e?9*;e?TJN?8?fF*? v?/? ;E?}i?i ?0v>U?=D?|Yp?ԫd?ʍH? ?y?)F?zf3?T?+@W@?cԋy?;>?+?g_e??b? , a? W|?u(T?7jA?.a?7 F?j ??.J kZ?Ac*?B ?aYX?;cO?n ?$3s?+t?{g>C?rx?ui2O?&a?Qٲ?c,?(xy?)?je?/5%? ?47n ?"kf?e]%?O?y?_?å?vuҰ?(?z _a?mi|0!w@?`A4 ?P~uا?@x/?19Ck?"ϢD?xP o?*fy>6Jb$>ύ>ْO\>b>(e>2 X >#>I^G5>WYrk>?>u>{n>{nYH>*kn,S>KF*>~ȗ>X>YvJ>~>u\ɳ>&&ä>-<>윩Q>|È?5H? hX?cƆb? $[s?(NÝ?1~n-T?9#5oP?B B?Jj^#0?Sh&l?]O/?f ")?ppO?xGr? "?c ? u"?-B?@$?s]&2\?l??t?/J?⫙o?}W?_طXL%?e]"?q*̒?d:Βĺ?k&&?Sp8Čf?}B1?g푑?0a}g?$?"7?7Էt?K䥺?Z}?YGF?cƐ?kv-?E]@?`~i? ?IN9?ݬ?c&?{-?SQ?//>?+?Kg_?M+>?Ki?g0n'l?7^?w \t?kkI?]d!R?Nc?>-p?0*L?!%n?-4ǟ?gTS>$>{fp>p\w>ɮHy>~`3=>>>ޭpu>3f@!>rq~MN >Q|_:->M^>Ï>{>Q'&8>979>snh> l#>ʲlL>א ,a>&_>m">ܳC?:F2?C)?= '?dex?;"ڮ??f/OS.?svZ.*?fTtt?X>8?IrԔ5?:k=y?,W?~>Me?DY>֋>?#>N%!>֛P/5>I%j>u%<>Fty>O:R>:p>-R>*6d*u>>$->ZP>uK>ʱu͗>̬>C)>>Jy >ݜ`9>1auY8>[U>?}? Z 8?,0?"A\&?*L&?3.@̠?? \>v>ma>gwh>FH>]fJA>J{>.>sM>H>""4Z>F"" >["\>K> >z`=>S kk>>F>K"H>ٹV>zF6>b:RR>uD? m"y?>?"?,-'=?6H)њ N?AOI?IG'>/?R=Xz%?X8 ?^ `?cQƀ?gi H?m##qnx?rYB?w޳/???k, ?ճ-s?O9?.m6B?en#?4N?Zl?i? q?/օ?l,?2@Z?5GF?އ?'D?2Z?|POo?}W8?rc?LcD?qDVn?} k?:,?KRm?!zU!?2t$?޳tf? :t?oe?-?tR?򙒔?CG?V9{?S'u?p+9?=LJsQ?pe?#Rb??S{?u?V K?b@,_?tCVi?+Y?+x8? ?&^?(Ν?r?):u?w-Q?oFo)?dOj ?X^f?KB?=D,*?0^8!?" ,?<까? jc/x>讦/v>2} >vJXI>ƒД0>,{>7A>v~; >Լ->1,>0jO>٘>С >5vUW>xWJ>\(>ޅc]>A|i>>7]>dO`>|Y H> r?2zv??!,U?+&?6j~?B;Y?N I7?WqH1?`P ?f>˘?lŘI( ?q k?u*n ?yG\?~cT?Wh ?Ii8?Clg?a?h ?5?S-$?Dek?E|W}?贈\?N\9? l۴?ʝ q?fs5~W2?%=e??hqAc?p^*?~L?!ն?f?}G5?{r?(#ke?$?z>d>5v>r:l>ؿ&>iu>@>P;Ξ>B>:"q>e>^7'>>_W>^7&8>e4>:">B2>P< >@>iv5>ؿ¦o>r:T>5v>d*??$_?(#ke?4k-> ?Ao?Op#?ZU@?cQ?l̞=?s(?zJcV?b8?BX?KCB?-B?.,?w:l?yt?uD?fn?YH?o+?-ʚͤ?C?|%T ?Lx~?b?*1?EL?0z?}?L? 6?u~,P)?? ?OxZ?sJ?')?g1?Hel?s?rc?UD?Ct?);?,B?{r˘?`P?WqH0?N I7?B;?6j~c?+&?!,ݬ?#?2zv> u>|Yl>dOd>>7>A|>ޅc]Z>\>xWc >5vTP >С{A>ٙŞ>0~>>Լ->v~G&>7Aߒ>,>ƒЌ>vJXk>2} >讦/6>c/̩? j=(?<깇?" ,n?0^8"?=D,ܯ?K?X^b?dOj ?oFo.?w-Z?):u?r?(Ν?&^? ?+xGF ?Ns+?&~|j?0]Bl?d?1[[?:Q?5?w޳/?rYB?m##qnP?gi G?cQƀ?^ ,?X8 ¦?R=Xz?IG'>0?AOI?6H)њ ?,-'=?"?>? m"{ >uD,>b:Y>zF6#8>ٹVc>K"$>>Ff>S kJ>z`gU>W>KTo>[!>F"#Y>""32>H>r>>J&>]fJQ>F>g>ma>ʞ>? ? J?tȺ{x?'٪ɐ?5]3H?DB26D?S)a٤?a]Ը*?mD"j?wu՘?2?Bv:?rt?d? ڴwP?"pj?~U? 4? p*?؋*,?\[?br ?+s?ԮfI?z6$U?]-Y.?;? 6o?JL?ES J=?WZ?Dm?}OM??QGfe?a?Z&? v-6?#? e.?y ?`?=?B?Z/Ԇ6?sp:8?0?͖=?簐uz?7вH&?=#?{ڟl!?{`?#?|[ ?*??\?u?a ?kzՎ??yJv?M?u+mf?b;(\?$8rb?&D9?a ?q2ĉ?79J ~?V=?r;?x?e/p?q #k#,?g#;,8?a{Sl?Ze?Uy=| ?P/դ?J"}CO\?CY?e>[U(>1au>ݜe>Jy>C)>->E>ʱǘ>uKx>Z>$->y>*6b>->:>O:>F̴>u%>>I%SY>֛P/K9>N%>?#>֋?DYe?~>H?,W?:k=yP?Irԓ?X>8?fTtt?svZ.)?f/OS0??;"گ?dex?= '?*U~Թ>?VX)a?i$?ka?8R?MCk?o^?_17?Ԥ#e?Դ,=C?CK*?r+?D2e,q?|bK1?{sE ?R??/r^?ԏA? A?}RR5?RW; ?NYi?̜З`?1Fh?2~ݸ?_t$?ە?2U?p;-I?CD$?Z}?ȵA^?47O?SĉIC?}b&X?y9!.?y肜?}N?"ʍ?qVK?/H ?vPl?y?m̀8t?_6h7?7+?:O?v*J?'hS?$y%? 8(n?,w?wĪi?h}4?d?5,?v|΢?nq?cy2^?Zة?R8?Kuː?D5y??x6E?7eu?0RK?'{d? bd8?*&ceV?C- ?:F6>ܳCʄ>m#L>A>א ]>ʲlL> l5>sn>9W>Q'->{>>M^J8>Q|_Q>rq~K>3fAN>ޭs> F>>~`3U>ɮ&P>p\̇a>{fV>!?gTS?-4ǟ|?!%lC?0*Lw?>-?Nc?]d!R?kkI?w \s?7^?g0n'l?Ki ?M+>?Kg_?+?//>?SP?>-?De?b-?R~F?W)$|p>윩Q(>->&&>u\>~>Yu,>Wx>~x>Kt8>*kmu>{nYI`>|>u>?>WYrl>I^Fk>#y>2 u>('>>ْO>x>6J`?*eg?xP n?"ϢD?19Ck ?@x/?P~uا?`A4 ?mi|0!wD?z _a?,?vuҰ?å?_?y?O?e]%?"kf?47n ? ?/5&?je?*?(xy?c0?Qٶ?&a?ui2[?rx?{g>C?+t?$3s ?n?;cP?aYX?B ?Ac*?.J kZ??j?7 F?.a?7jA?u(U? W}?,Gׅ'??b?g_e?+?;??cԋ~?+@W>?T ?zf3?)H?y??ʍH?ԫc?|Yp?=@?0v>U?i ?}i? ;D?/? v?fF+?8?TJN?9*;n?e?vS*>?nM?d-=d?Zﮟ0?Q[y^E?EVD2?:R0?1";hs?&)5'?֨*? hP?˂)Q&p> l>qR>M`x>,H/x>52ΰ>Ǒ(oX>&[>5-f>K>3Iw>Nz>$>^P>JŁ->">Ct9>~E>D|tF>yUj>ğ F,>OgNۛ~>R3G>ّJ >ǖ>gT`?Np L?!D?"]g?1JDqsQ?@z?P~D?` 5`?m<w?y@&?p2]?0Z?CB-?W 7?eL?9lђ?UwF?}6?z8?̂B?+ea"Q?.?2%t?Q̥F?P =?c㘠?1jٻ?[HH? 8}}?T?\u?|Wx ?BFH?;a5?d9E?Fe/?7?3?.b?RaF?#L? 1V?-?X8?=?uO?b?BR}?3?ɒ:? 02?R?\i ? 9ڣ?*Nى?P?4?ah?e< s7E?9b"W?)sF?fS=4?oC&r?$3{ި? ~PՅ?zj?L[O?OB\?}lBh? >Dd >b+>Lc>̜8x>T1%>q>۹>ϳ'>E'B>>J+,>/ OT>ǝ 0>NM(>0j.>q7g>(> >*hS >65P>=WŖ>Dʹ>,G,?·??" o_?0_i?>楎S*?Nd l?]6列?jR?wB ?5?;CF%?٧sn?Ԧ?wYY?]tHr?l?D?0~0ʒY?łӪ_*? } P?g\?Lʱb?yJ?p5?d>r,X?W/9-X?IX!tP?;ط*?/ש`?"0}w/?e?:'c>CÀ>tB0>"A>Փ0#`>Bg6>j#>:s|]+H>JAtS>|&>`xF>1G.>yv>p8<>+Z>jr[>C>>@>Wd>:>`$J?>W>+>}ճ.s>m|>ٽz@j>-?kqv?Cһ? KMd?-Zi[Vx?;,"?Jjn?YH)J?f7z?sPS?PpL?|]H?E$y?ٴC?r?S?dš?> ?C?w?nƈ?(/?b|?*?f\"kD1?o;Z?|$%m?(ؤ ?Au?? 7/?Y(?p?\B?c4}?m4 ?C4¸?]f?".'[8?i^l?l?V~?&?(7?z6?p?5z;?zs?o1Cx?b'"bR?SJ?DÀTK?5?P?'(Z?? "2>'9@>Z/S1`>8>7 >˂DdP>b=4@>IT>D>a->=la(>6 >^c>Mno5<>S$ъ>s->ar>8x>l(>?s7>cT65I>ŸҶ>ǁ zIN>{Ƙh>'>"B>{D? =TP?GU#p?)*T>?6< >}?+  `?W*? 68?hN???>L/?Er# 5?U ?|CNh?1 ?*w\?,5?m/,?@?ۨ?QCV~?-;?r|ȼ?WHC?dX*?!ƙ?-U??ev??=r?Vd?]ڙa?Z AP?4Ă>?@ND?k?Gdu79?nO?)?zkM_?)?,{}?ojt?P|?W?!1i?7\?τb?0={?/C6?w턊]?k)b*]\J>=ƅ>ץU°>KF>ۜ>ԯ X>}x>٭bp>7;>)>KJO}|>B2|>fҋ>p> H1>bͳt}>8Ki>°ʅ$>y>á>ćc>ͩDm0>U$> n|>?ہ.X?F?nP?$ZF?2]0?@Mz z?NHn?[i8'(1?g9[a?riG|?}\)'46?VF?;s ?l/?YR?Pf;H?CQ?TX" ?v?/?"AZk??ǎ?h:|r? w]?U|?{h?jdi6?g?e?BJA?SH ?@!&?;zlD?>U3?i]u?aA?FaSS? ݠ?ѷf?{7? ?G'gdlR?SN6_?ğ7?cĂ?f il?3R_m? Ⅶ?n8[?joH?*?ǿ?d ?cƴw??[7?>6B?(yg?|£\?yMr?zho?zOu"? M?]xX?Y(s#%?h!_? 5? /߆;>ʹ>WR>Ѧ`!> VuG>ۊ >.+y>묦>s>9SM2>>^V>pA>8'>(ȳ h>zb_> r>n<w>>?>q>SwT>ڤmN>?>mV?ن?vWi? cP?-+z[?:3 :]-?GmH?TJc #?aD^W?m#"?wH^?-?͹B ?Hp֘?~U?H?ta?~ݣĆ?9l? =n`?t y?!ȖL?8?Фvc?K|?4ԀV? ?#`?cv? }?B%? eX?k7 E?]+O? r?S=?򸐎ʬ?i̱7'?|wX~?{^}zct?~84?fjFA?6{? fٓ?d?Abq?oC!e?*#+@.?̼eP?BH}!?e?N?tЮ?W"?L ?]̠L ?#|23u?$? ?%Ý?NC?~hcDf?{Wտd?|8W\??4 ?ԩ?&Q?pZ?0?- ?0e?P ?è?Jde?eJ/?c8r9?d"x?y Im?j +?[d1?Jox?::T?+@#Jp?2{+?{?R,޸>3mFf>H>p>ʳnh>">gc>I:f>f2@>StV>ɼ1)8>p8jw>]~->L M8>p`>>S׿3>Ti>L>z.:V>">C%f>ճM> f0 >(>J? Μn?|:?'a 4?4G?A5{q5?N ` ?Z@_?gI~?sJe?~?%?=k,OB?H>ڑ?NߧF?Vj???nb?_u ?`yW=?yn@fT?JrI?P?ZGM'?$;Z?dш?ki?Zw?Qܞ?L+ ?-?JY?E =h8?ҹ?Ԡ1\s?Xv?G2 ?~Dt?}(?$>j2?6Y?J3B?t?2_W?g*A4.?F,5F??B8?yR?n͖&?ogm\?'s?Vy54>@EbH>||>ѩW>Ū_#>Vm>v>9JԿ]B>ts>Z|ٯ|>Kd> >eF>QZM>1P>Ral>o9&Rg>q J>o9Y>Qf|>[~>nb}}>aF>2k??׎?ȻFaY?N5??VY}b?I ;W)?tܣ}Q?7/(?&? }p?}7M?Ά? /C?TK3?B4?#?R\[^?o?RO?BJ?4L?4??!?֠?oCY?>7$+?ᅺ?k?x}?O#g#?laa??S16?h?28?jd6?⠗F}?3x-?zt:6?miQ ?"Ғ?Fqf? Iv?δ8r?ğx?1YQ?~?J?%U Mh>qs֏>^fe>حؚ>p1> Ҧ>{>O>"x2>Jq=&>lK> Ll>nxl>5>:.>ef>-3>_z>$ь>5 > >ʉmY7P>iZ9] >4 > +.>R ? NNHN?8;ra囏?k׮n?x[KM?iE?p#?ԭ)Ec?]PE\?t?g] ?v<3?۞e?6?l$Zk? AT?,?B>h??u20?,&ʷr)?]o?gZ E?\7Xd??~1?O?nH4?'Ky?~qx?ˤj?LMdQ?N? 6l?z7=? kr?y|;?? ?}??^%??3zX?az?=Pr60?}@E?c?uvF?4?rX6Ɣ>!&> %>Qj)D>F9 {>AV\>#>1d[>7Tv>B">9%T>#b9>$>#bi>9%ⴉ>B,>7V_>1d\E>#kw>A6=>F9 7>Qj> >! >rX6?ɑ]?HD,?\ ?*9ӟ?7:m?E??TpL?b$ ?pn#̄?~k? 6 ?'tA?^b?S?|5?n;?ŗ?Lj?Mt?X?F9`n?i΅?vI:?ye?8?Vu+?g?Lv X?j{?hW8˂f?#%T>so>h>WD\> K;)>ILU>%:>LW8B>p|#8>NH>* 2>{> F>mcL/>pCl>L[$>Br,><*B">Tj>Шܞ>u >yc>Հ;p>\>-3>0 =?|{Sh?_:`?$z "?3+$?BX&?Q?|?ay?pD?}9?[?UMH)?<_%v ?@2>? m#?S?-EY?AqU?}>ђ?Z?qrN?|8?-Z;??u?wǩ(?f?1?dp?F?S?=#p?? }ԟ?P?pڥ?v!?CL@?*?;nN?ug?N507[?dD?_?cep?D4?sΡ?SSJ?ϏK?kV?!I?r?|vNX ?n5?Qt(5?w;F?}e/???n?9?0&?a (W?\9?R9?-?co?':?YC?@b=??, P?BL?1N?8pv?~v?r2R?g]oB?[ ?N>?AFkٚ?5?Nf?){% ?|Ͱ?Gta?"ަD>A>a^>Tm>3>*T>ʡ>J4B>{>f|^>U5Йm>\>{Y >c'>m`q+>f\󵇃>Ðb>/SC>^ u>>_qZ>*. >ZKK<>ETs>X?E`?F_>? Ev?.lӜ?=zi(?Mqe?]>8^h?m z?{2i*?@d?_??]$]?U(m?dYR. N?*F̭t??,eD?u?FWc?cx?zu~?AP?Ʌ?#'[h?$M?&E;Vx??+#t4?شu?`l?l?g&ؿ"?0h ?+1b?[ l?b8?!8R?_^}?Z6j?%ظb? ¿?:^?ܶ?tt?oXW?~w7?{xD^?|pX'?f$ M/?Yvli?{ݥ[?~>8&/>/>*m > 'S>͍0->.>Td>ސ >@v&e>">xaᚚ>UfX>L5vm>FCC>7>XDQ#>Kw>s\ǽ0>?[A">D>~'>Հn@\>L_eD,>@M7>z? q-?[hC?)O?8*~ @?G-_5?X4#?h$u?w["?(QK@ ?b׷@?,x?*xEy?S1t?]?|v?RNk0?p?EI?C)֠?: ٸ?%?? oB?rK?zl(wc?y?{Gt?[ >Z?w]T?o?d{=?X>6?Mq<&?AITY?4:?(%8?Z? m9~?K8̾ik>|>佞;>ΧQ@> L >+N$X>j:R>K6l̍>S"i>,>dfU>Xg.A|>C&Z>rJBV>&X>|>nn-R>[>K{>4->~O>Ĺ) H>&7h>ܕ^A}X>oqx>(?}O?]-K?$ڛ?3_&Ց?B%?SE ?cn?rV_?|A?WDڢ?zYݶ?%ǟ?B?Ǔ ?)l?16?!?2Q?xy{?+~6?>(mjD?wAi?}W7m?xl?w5('?zANs?djP?&}?9@FP1?Ys-?f?\}?S-I?`E!?f)7X?vyq{?RQu?]9@?S&/?{_R?7f?>?`?L?! ?DFD?AȮ6?R)!?8?A2?VG\?~y?P:g?.tE?$6?ᯤc?8VL??z3?)( M?ޖI?Ax.?4s*?[? ? h!2?O?J[vU?C?1Q3?'K?q ?R 4?{ŒI;?saa?i^T?`Xd?S&`?G47?:7ŝc?-)bqx?!2 ?J?`Z5t>I/>觀Z%.> x>u>ēZ\>N>C(KL>X2~>o[@>zޛ'>BF>kl=>Bˀ>;^>Z>4':>,i>F>IţX><k{L>lғP>W&Aq>XIČ>!p>涋`?ޒx}(? 0? ^;p?.{@?=2.kX?Lְ?]wq@?k2$?yC =r?VC ?JEȺ?ID?/W7d?O;?m5F]?dLA?ѐb`?%*GV?h#?,*=?=J?}a?i}v?}4?|=eV?~J1a3?Xi?>x?.!?6? ?+?@RI?p??w,?A:h?υdG?w?S}&?uI+V?Vw?D9?gqNȞ?*0?4|?G_??:I|?Gde+0?ie?XI2?]s|?uL_?v"?'?uhٛ?*?~>D?u?/;6?h?jWv/?W,?E%?a))??>U,??8ٓ?7B?0w/*?pOj?L:?bЂ?x]gO?pM?e#>^?Y"?MKn?@_KR?26μ4V?$*P?:?]pԹ>hFn>)`>FN>,>;ܲߌ>'HJ>]n ]>.IO>!>;ձ.>-(;ݨ>]ι|>w+s>2%l>~s+>g0ch> !H>oI|>=>@@>T@*0>Լm>TRCtX>d> ,΀? `YtR`?\5?'e:?5N8?D?THC8IX`?cP y( ?qb?~5)oT?J?}i?۷\Q?gض??>?~*?]e`?x6?1:҅?Oe?eZr?0%v?Bx?x"?90?YN? ~B?a?(%?U.?GVv ?֫7=?}jy4?m6?I?D*JA?Sϖ0?+jH؈?<p?-1?0G(c??l06?kQ[07?W>n?ħ%?H7*?&e,%? Ӹx?J??PA\?z;cm?j]?hb`L?4 ?Lc's?,rj1?]C^?©fI?g!F?`O? LD?yiv?9dOkk?3dl?Qh?*2?V-mjZ?6g&??L`?Dn?t 8?jSMj?`z@?R[vEu?C裢+j?5mO7h?(,Iч?mD? GJG>&]^>>F j~>h_>Ȉc>l>oU:>60>;꾶>dak>r>mϑ:>gZ>KO>>$?>zm>?P>^FA>ybt>B_7x>c,.ʱp>*M>pp>%J>]knP?|G? ; ?"<3$?08h/Ø?=[SۊG`?K~{1h?YYy ?f]wP?s/2&@?=?t̉?#Jv?E0?r#+? ?mx?A8_‚??0=?i#X?^c'?S#jPf?X?s?J)?[xQOz?Iu`?P?ޣ9? *,?UbV& ?T+*?*9?HȊN?^/)?'{?WRw?,h'?pNUi?;K)?{~?7 ߶?OB::?8)?38??5%? '? Y=?ñ?~Np?p?^Z^z?bZ? *n?[I?1Ӽb?A$G?U ? 0ni?o?q8^8?8?M?::7?C"x? ?S$?Z?rh??rN9?URZ?#]h?xlMͦ?o<Z>?bS?UZH,?F*/?8\& ?*ݷE"?;?0bQ>#8)R>lB>GuJj>|#F>ȷ%>rE'>' N>xC >DD;9@i>66,>&0>KQ`>[P>N>"XgH>8>@>Ar>]s>S>< >n猳fH>գ(j> #'~>%6@>Jj?ɵ2y?CL0?" ``?(d2?5`H~?B>x?P"(?]9G?h,?s^Lcp?~L?>?z--?~̇?2콩?ݠ?{?!s? r¢?eW۽?5GHuh?_s~?d| j?fl?D0O?֧?`?M~?;(j?rz=?#P?1?{;#N?N{?5t?|#7 p4?q=G?d&DK,?W'@֪?H\q ?9?,&Y6ne?td?e`L?9^[I7>k70e>6;(>֧i>>Ȁ4>HN">)9L> 3>`4>ވY> l>dL>>}k1T>oC|8>N{>O>!W>J >WrY,>.g^>с>0x>E.Fp>>B ?nR~x?.7_@?3r`?%i^*X?1R8?<J6k@?G#eh?Sl0l?_e?h l?sȎ?~d$?e9?`(?Oe?r?=4?oID?'?ƚ ?t4j? )?RU*?հv?qȊ1?_$\?y_?>:?mC-?3%?I?1?'t=j?C?_? ?I"?9\Z#?x@?kHb?=r?J??*?n7?ڨa?Q2h?nU?ެ[?91?_h5>yϳ>֪F> X\V>hޡ>%Ӥ>->CW>n>7/U>>!Q?>SҤE>0>ٸ8>i"YT>{UD> B>æD6>/>כ%4>kq>-Ս>{+DX?xP? sX?F*0?b2?&pдX?0[b?8O?B;?Lφu;?Vk}!OP?aÐCf?lshi?1C]?d*A?o6U?Zm/?V^]A? ]f?Muŀo>%.>FNF>~U:>h>cGĩ>a`1>hyx>H&΀>w, >p>N\>->˯U>>$>zDc>f>_& 42>Ȉ#j>Լt>߹JX>6eW>L• >Õ ? jPL?2T\?Nִ?$.ݰL?-3+v?4x$'s?<(Bh?CwmP?rF?C@i ?$ ?AKv?b]kJ?>r?Aj?.Aa ?|Rl7?z&x+?z.pC??!?-wK?5 ?9R??͹{&?.$7?Ӎ?g?CI?~6?-y? N?@qZ?'59?uT|?j)>흽dLo$>*_:>~K{%f>|PK>1鐌>bȖZ>d>G>/]>}>4d#e >ag"y>cn\8>Us> f)7>D.>8>Ъ'>Uy>Uhq>pEF>D? Y3?YuT?v?& ?/O??6ֿ??zw-?EZ?Lh?S&%X?ZNbPX?bQ]?lk#?uô?A gj?DK??(?9-9Z?6_?*z"?M4??PBO?HW?ݵ?, 1?|s?j?VRΩ?)I?8"?|]v?yJBo/?yٮId'?~9tL?r+0|?1G?h[nȺ?8G?;гf?v?с K?YJ=?$C?M ?45Bp?`0?$ M?Lu?qBh?@CL?s?L(zGd?>]ܖ\?1 aZX?#6? ?6گGy>Kv>JTF> !o>|^o>Č[Qk>U>D1}@>C%Bx>L >Vi\>1K>q>ݱ>o62>lŸp>D.e+7>y "R>|da>-Ġn>Qwb5>␏;>E+>?UD]yq?h}Y?`?'y8S)j?1Ĥ?:w,r?C!1?K(If?R?m?YX1p?`߭p?fR,?m-?t~T?}@ϡ?LTz?_ɂ?H Z?c,?I?!xl?l~E ?.^?.If??8)W{?-U}?dS`?-ob?UZ?o?ԫGh9??a?搱?S{?:/v?;}ٹ?d?`b)zK?Hz.?sؓ ?8Pd?{DN?_Z?v#?Wh]Z?O-?uG? ?IL?>P$?;?{Ļ?j(?w?P %?UkK?k !?.I?X6:B?lS??;?yR N?!.i?kFW?u]eO?mU.?j2? ,?x @ '?p:/A?fp+?]PV?Q˩>2?D:?6k~?*Q?Пf?pJ ?F(p>7+=Aa>7of@>TvC>DŽB>*%>2>w >ZF(>7TP><5>_>gϭ>>~>2Ǩ>T>]V%; >]_l>}>󎴭A> >LMF?W !?0=?ns^?&j?2 U„$?='l?G|=?QVx[?XŁ<$?a?g /C?nT"?s]?yYK  ?-?"?;? ؋H?zR愧?BmT?[{?\e?Iw/v?Z)]@?t?a=9B? ?& 顴?{治?򹟾?5v??3'? Mf?ĭ,2?cc1?\,?}T? w@w?YC?5W2?X=?M ?),2d?mI%?a?5#{?{ )>?z3ԁ? i!-?{D>?q?o3?*???b z?Vf ?)h>Wi?bj?k9?& G]?s,?Z;?@?c?9ngH?]X?zqm3B?w?~>?wW1?-ؖ?JlP8 ??zIџ#?tR6?ml:\?dAa0G?]Մ\&?S B%?G[~"?;rM?0GMJ?#M9?s? oi+F>Q_>-2>+<>&+i(>i5<>lgw>񉔳/>Jk6Jt&>LX>֝ o>l!>֝ n`8>M>Jk6K>񉔴$>lgwa>i5>&+i$>+>>-5>Q_ ? oi(?p+?#M9~?0GMJ?;rM?G[~?S B&?]Մ\7?dAa0R?ml:\?tR6?zIџ#??JlP8#?-ؔ?wW1?~C?w ?zqm3C?]X?9ngH?@?a?Z;?s,?& GT?k.?bj?)h>Wf?Vf ?b z???*?o3?q?{D>? i!-?z3ԁ?{ )>?5#{?e?mI%?),2f?;}ٺ?X=?5W3?YC? w@w?}O?\,?cc1?ĭ,2? M_?3'??5v?򹟾?{治?& 顷? ?a=9G?t?Z)]@?Iw/v?\g?[{?BmT?zR愧? ؋C?;?"?-?yYK ?s]?nT?g /8?a?XŁ<$?QVx[?G|=?='?2 Uƒ?&j?ns`LME8> ˦>󎴭>j>]_L>]V$>Tb>2#>~6>Ш>gϭm>_Z^><#>7>ZF >w X>j>*v>DŽ>Tv+>7oeO>7+=O?F(q?pJ?П?*Qz?6k?D:?Q˩>2?]PV?fp+?p:/B?x @ +? ,?j2?mU.?u]eO?kFR?!.i?yR P??=?lS?X6:C?.I?k  ?UkI?P %?w?j(?{Ļ?ͷ?>P$?IL??uE?O-?Wh]Z?v#?_Z?{DP?8Pd?sؓ ?Hz3?`b)zM?d?r+0|?of>v?HH?+e?#(#?߆a?Ļh G?:/>E+>␏;>Qwb>-ĠnL>|da5>y>D.e>lŷi>o>ܶ>q>1K3>Vg>LB>C$ >D1>V >Č[Ql >|^O> !o>JT d>Kⅰ?6گG??#9?1 aZX?>]ܖ?L(zGd?Yj>R?dj7[?p8#?x#>??r8?&Py_?l?C?6W?ϝA,?"$|?¥?ȡ S?᩾?p?=F?vt?4S?~?O?u~??с M?v?;гf?8G?h[nȺ?1G?|?>L? 7ƥ[?dk?h?~9tD >pEP?>Uhx >Uy:>Ъ'D>8Œ>Dn> f(>Us>cn[l\>ag#>4d#d>} >/X>>dz>bȖH>1>|PKU>~K{)>*R>흽dLn\>)ͺ? Tc ??`?'я ?46ӿ?C=Ҕ?R%%?`:%?j?zE?p?b]kI?AKw?$!?C@i ?rH?,3>?Lb?5?ݗd? ?uP?K2{j?lb?U?!w?|47P/?x =ڠ?w&T?zf/1~;?Aݜ?2"?j04?c*?eIi?m5ż?ꂒ?f;?/'T ?G#P?( Py?yc ?nǃ?~={O?q.F?T$?s=^?/p&E?s֗H?h?_)??T*f0?KmQ?CwmP<,?<(B?4x$'r?-3+u?$.ݰL?N״?2Sz? jP>Õ>L• >6eWה>߹J>Լ0>Ȉ>_& 4S>f<>zD,>$>O>˯V/>M5>N]>pt>w,|b>H&'R>hy2>a`1>cG >hz>~S0>FN<>%.>Muŋ?!?v)z?*\\?7bVa?FD?Ur ?c0C ?ppi+?z9%=4?9C?/jE ?[V?{)K?5xX)? x?IpTl?Ǘ3?;?85"6?)L.t? e?R ? 2>?/P?2?sk?" 4J?z,?y~H?{#+?-"6??em?ۧ2s???x@?\L?MDo?9Ű{+R>-Ս>kq/>כ%d>04>æD~>]B>{UD>i"YQ>ٸ5">}]>Sҥ`>!Qc>>7 >ז>CWWT>->%Ӥ7>h޼j> X\)`>֪>y>h7@?Bv?Lv?Ed(z^?,??9ug]J?HYN?W;?dy#Y1?qpE:h?|^?Y݋?"(=#?5/ݜ^?x&N?[<?rX?9ԃ^?Gi?+DC?Bb|?+7z4?]|x?)@V?P\Z?qR G?|GnC?1;#?)qߺ?G`U?֢??79?/~y?_:?y_?_$V?qȊ1?հr?RU(? )?t4f?ƚ ?'?oID?=4?r?Oe?`(?e9?~d.?st?h l4?_e?Sl0p?G#e?<J6k?1R?%i^*?3r`?.7_P?nR~u>B@>>E.n>cx>с>.gzT>Wrh>I>!>>N{>oC|b>}kE>X>eF> e>ކ>_> 3>)9A >HN"~>Ȁ>֧i9>6?>k72?9^[I:?e`K.?tc?,&Y6m?92?H\q ?W'@֫?d&DK(?q=G?|#7 p>?5t?N{?{;#Q?1?#P?rz=?A>(l?=?3?Gnv?UWDy?ebF?k?W?׊L>?2hi?*; ?1w3?*5qm?IAjj?=* _7?'j?j&j?C)R#?dmJ?S3,?]O?k?=5D? {K5?lXR?%S`K?щ ?-~1U ?;K*?NiR?Xr?~\?xW@?/ ?iI8?b$+?%ތ??;B?M~?`?֧?D0K?fh?d| c?_s~ ?5GHuc?eWۺ? r ?!s?{?ݠ?2콬?~̇ ?z--?>?~L?s^Lc|?hD?]9G?P"?B>X?5`H~?(d10?" ``?CL?ɵ2v>Jj0>%6@P> #'>գ(j`>n猳x>< >S>]sP6>Alt>~>>"X0>NC>[Px>KQ`֒>&0>662>DD;8>xB>' />r6>ȷ%r>|#>GuQ>lC>#8,?0bQW?;?*ݷE!?P?Iu`?[xQOp?J)?s?X?S#jP]?^c'?i#X?0?mx? ?r#+?E8?#Jz?t̉?=?s/2&R?f]w\?YYy?K~{1h?=[SۊG?08h/¨?"<3$? ; P?|C>]kp>%V>pp>*Mp>c,. >B_7@>ybt>^F>>>z>$v>>K.>>mЅ>rG>daϭ>>;̏>5 >oU?>lL>Ȉc>h_t>F p>>&]? GJC?mB?(,Iч?5mO6?C裢+`?R[vEv?`z@?jSMg?t E?Dn?L`??6g#?V-mjV?*2?Qd?3dl?9dOki?yiv? LD?`O?g!F?©fJ?]C^?,rj1?Lc'v?4 ?hb`Q?j`?z;cq?PA\??J? Ӹx?&e,%?H7*?ħ%?W>e?kQ[03?l05??0G(c?-1?Vw?+jH؈?Sϖ0?D*JA?I ?m6?}jy7?֫7=?GVv ?U.?(%?a? ~B?YN?90?x?Bx?0%u?eZi?Oe?1:҅?x6?]e`?~)?>??gض?۷\Q?}l?J?~5)ol?qb?cP y( ?THC8IX`?D?5N0?'e:?\5p? `YtMP> ,Π>dP>TRC{>Լm">T@+>@<>=x>oI> D>g0>~r>2"V>wq<>]κ,>-(;)>;k> zT>.IOv>]m>'H>;ܲ׳>,>FSr>)>hFm?]pԴ?:Z?$* ?26μ3c?@_KR?MK?Y"?e#>\?pM?x]gO?bЄ?L:?pOf?0w/(?7??8َ??>U,??a)*?E%?W,?jWv.?h?/;9?u?~>D?*?uhٛ?'?v#?uL`?]s|?XI1?ie?Gde+6?:I??G_?4|?*0?gqNș?D9?{_R?uI+T?S}&?w?υdG?A:h?w,?p??@RH? ?+?6?.!?>x?Xj?~J1a3?|=eV?}4?i}~?}a?=C?,*=?h#?%*GV?ѐb`?dLA?m5F^?O;?/W7g?ID?JEȺ?VC ?yC =r?k2$?]wq@?Lր?=2.jX?.{ ? ^;? `?ޒx|P>涋>!>XIČ>W&A\p>lҒ><kC`>IţD>Fe>,i>4'>4@>;_>B>kl?w>BF />zޛ%>o[?>X1&>C(>GD>ēZ>u> y>觀Z%>I,?`Z5oj?J~?!2 n?-)bqvE?:7ŝ?G47&?S&V?`Xd?i^h?saa?{ŒI;?R ;?q ?'K?1Q3?C?J[vR?O? h!2? ?[?4s*?Ax-?ޖI?)( L?z3? ?8VN?ᯤd?$6?.tF?P:g?~y?VG\?A2??7f??S&-?]9??RQu?vyqz?f)7X?`E!?S-I?\}?f?Ys-?9@FP3?&}?djP?zANs ?w5('?xl ?}W7m)?wAi?>(mjE?+~4?xyz?2Q? ?16?)l ?Ǔ?B?%Ǡ?zYݶ?WDڵ?|A?rV_?cn?SE ?B% ?3_&Ց?$ڛ ?]-KP?}O>(>op>ܕ^AyX>&7hp>Ĺ) 8>~>4&>KQP>[݃>nn,>|N>&R\>rJ/>C(X >Xg-;>dd>,D>S"iĔ3>K6ľ\>j:7>+N*f> L@>ΧQP>佞P>|?K8̾f+? m9{?ZL?(%8S?4:?AIT`?Mq<?X>6?d{=?o?w]T?[ >`?>Gt? !v?N?^ir?[&w?b?ŏ3zx?f~?07?W_z >@M:l>L_eG>Հn@X>~&>D>?[;J>s\Ǽт>KO>XDP>7?I>FCD5>L5vmH>Vy>xa4;>"XI>@vo<>ސ >T>.*>͍0`W> '׭)>*md>)>8&>~5?@?ؗ?#{C?0OC?:O?Fg5?S6qv?`tg熤?j351?tHhZ?~f};Y? S!5?arҭ?q?am\?nA:??0 0*?";-?kd?؁?%A1?d?d<9?b8?ʇi?_?黖a?gI@?dk1?Koӧ?8^?Mqe~?=zi0?.l(? Ev?F^?E`H>>ETs`>ZK7>*-v>_qcp>Þ>^ D>/SK>Ðb>f\|>m`qx>c'>{[&n>[ >U5И>fN>z">J4C(>>*T?>4!>Tn>a^+>A)?"ަB?Gta?|?){%?5?NE?AFk\?N>?[ ?g]oD?r2R%?~v?8ps?1N?BN?, P??@b=?YF?':?cq?-?R9?\:?a (T?0&?9?l???}e/?w;F?Qt(1?n5?|vNX?r?!O?kV?ϏM?SSJ?sΦ?D0?cep?e%t?dB?N507Y?ub?;nM?%?CLђ?AqU?-EY?S? m#?@2>?<_%v?UMH-?}9?\?pD?ay?Q?|?BX&?3+Ć?$z "8?_::?|{Sl >0 =>-31>\u>Հ;pj>y|>u >Ш.>T><*BsL>Br[z>Lg>p~>mcLj> 6>z* 3>N5>p}>LW8bx>%;{>IL> K;g>W3>hd>sr>#%N?3UuC?qn)r?#{5O?0Z?<3K?Iu5D?WC{;?d\|y?qD`n?~?8XI?΍E?@30?]?'A? ^$N?Ry$?< Z?1-?qN:?e57?i-F&?D5?e?cXKX?'bK?mj2?yBgz?"g*?Q%y?!@6O?g:?ȱ2?t*?u;?u^P3?hqP?I?4 9Nj?o?LczCI?-_T?'mY?J?ZJ?W>%?%/i?qO;,-?k-?[t?-?CB?[|?KP?UZ?Lh?1Q6?q EF?EyL?y# ͝?@?<*]`?sE5p?h0P?=+&?Z?h?CV?>e?Dh?̥?f)?0egB6?w.F?jiS?]O?Oԧ?Ak^?3u!?%.TͰ?.`t? B^>@>$=h>̓>G~ͅX>F>ñG>tKr>'U>᪜b>a@>]I">qt>M5i> >M5H)>q"5>]I#d>L>᪜#>'>tK->ñHm#>F8>G~q>̓>$=h>@(? B^H?.`r@?%.T?3u~?Akb?Oԧ?]O?jiS?w.F?0egB6?f'?̥?Dg?>h?CV?h?Z?=+&?h0P?sE5p?<*]`?@?y# ͙?EyL?q EC?1Q6?Lf?UZ?KN?[|?CB?-?[t?k2?qO;,-?%/i?W>%?ZJ?K?'mZ?bR~?;|uv?"΁l?CY?{Ν@?$Ub?vt?m˶??<ֽ? _gA?3>6*?^z+?JDf?1 v??s"?Mۚ#?%!?b?~?{P?2:t>? $}?l4?1?'/y?*? |?%Xl?a?cB%?v^G?ji퀞?^KlM^ ?QW}l?C "?77G?+045?Y@?hdS?H*>*J>)Ag>>+|p>ySл'> )>.z숮>w[^>ۿ>[i>}>dz>ԝ['>Q >b>]!>2kM>=P>pV>V,U>3t->,и:>RȲ1> y :>"?>dp#3V@ V?Lؒ$?[xP?je_(|?x\?X?U? YP?( ?AqR?Qu?Ci?$J?=繀?ќ5R|?se?UF?]i???Oc?j~?yz?ǫb??|t?^Ș?I}|?u8֠?hYa?X&?x?k[?_?5a?RI?t?}?@?B?'-*?{%?oLM ?}x?}I*?NT?K7ڃ?Qg'7? - ?e9q*?pY&R? KS?l1QU?[J[ 6?oD?_s:?NT? ;Co?ө?S?5+d?AN ?b?XD;?K#!$?e׭\?=)46?sں?t3&7}~?j MH?`wS?ST|=5c?Fx/e?;hbj?0j]u\?$r%?mX?p(C? f>z>qs>hV7> U c9>3ԋ>p;>#uRm$>ۭ}>xw>>HD>>>>M> Yj>){ͺ>]7>|cY>G|>4m>ʊ`~>s>->̈́g>LGЯ8>D34>>7L?-G?G ?q426l?+$?:<xE?Ij,H?Y+ ?iK@(+?x e?{fr?#Rt?x~b?M!?Y~X?ѓ?#t?5"oe_u?gnaW?\q?<^w%?2?<M{?LD H?F ^?C>H?|~??7? M?v?Z?Rs?ԹY5?n 図?Ea B? (|?A4?#P?St?LJ??|J[V?t P ?kc֔?a=?V1?KiNR?A 8 Ԑ?5C=s1?*09`d3>lG/Q[>> >і(; >ű `[>:> Yz>v>,@@> :^>Sg>u6><# >#̥>"+x>lF>f>2 ^E>u`+> d>!m9> Af >Ӕz>@g>0U`>ARH? H?|8K`?'2P?6a.>Jl?E^?VRl?f d?u~^?32c?c?6F?X`p?A:A?"YC??~z?O_?byq.?:ˁz?hҧ?^Ȅ?BV?f?؄}?zt(?v P;?u81P?we,?}W0?h2?~5j?gm?@4?]?JE?zѻ3?xO1?Ơ$?FXA? S?INmډ?z!F?Ef?;5 ?r-?V樔?x%`=?u|w ?v%4Д?{W?/g?䩽Ix_?,ǡP^?Xa?Dj??U?>5W|?gҏ?0Mk?|.rx?ut)J?n|?e Ѳf?[Fmr?QAKB?EH?:.f?0zǨ?#I8?tۋ ? ,>Jۇl> >プ5l>KbH>,T? >,mV>0\(>>O+At>Q7>U!yZQ>~>SA> ?$>z>Q5:>Y>֙;k>|qH>gz>IIF> ޽>D>ĝ>>ETqͅ8>M>"h>P C?$*?^?#5T?2|F?B%*e?Rs|[ ?bkE?r4?Jɞg? ̦?b?{;?*~?V?N1?L ?uX? ??]%?kV?V U&?E~?lFl?x9ܺ?t'6?s}=?vS?|=d^?Zo gwD?Pg?+ka?Hݿ?̡?Lp@?o'L%?AE?ID?$`*?|`?ȳ?5 TQ*?Rv ? )W?%Fa?4ɛS?}JR?y=}u?yS] ?}8?M#^c?ӱ%K?Rv?Z ?iýX?]ŏ?b(1?P;_>q?DN?$w"+?a??\g q?=hQ?df?S +?m~x?4F8B?,_S0N?[?=P?\ 81?x(?kIzC?qi?ii&q{?aYTbS?VsŹ5?LSk]M?A*‘?4?(x 1?_3Eu?f6?g>ڟ@:>7 r><+>s>5]թ>ׇ>n>@qq>o#>b꯷>) 9>ހ:>?|Qc>x4v>j>o%Kk>at`>v0>g>B>;v>C>2:w>>A3X>|,?o?. Ix?.Hwm?= ?L=Z`>j@>_m>2q>Pg!>ux>C> _ >>No]> ͺo>ݐ>z >Dβo>#%i>d*e >1?#>dZ>U~VB>rBD>@ֻ>V>,'>j|F>NCyx>~.0@>u)@?7c?Zz?'_?6; ć?E6(?UCtI?dBP?rH?Ed`k?/1?P?DR ?}brڊ?{I?GA?;tM? l?ߚYیT?q~?WoY?Rb?^?$?פ?x1=?~ 9?}X{?/Kצ?c@?aE1y?Ej??{ "ʟm?yw?Vڀq?1AO?*?BQy~?\E??9 y?/^?B%k??B\G?a}R?2?^?J-I?fm ?Q?Pː?g {?؄0?>8#?;#T?a?I86?bi?;YU?I2? z?}֒=?͔],?FE\Q? ?th2? I?S4?ElbJ?cbC?<{FE?c%5?v?nX?|I?sF&-6?k?aJ"\ ?VvԪ?J?@?=ۘ>?1> Wb~g>d<>)t>ҤE>([>rC߶>0>{v>2JW>Ւ> > ߐ>fpph>wi2>?F0>.o,S >/Q>v[>Q'b>mc> >6l4=>`>]HH> >T.?gYn?D=?" t?0ME?>ϼa?MT4u?[Į?h++?uj?p|?bV.7?jR?O)?D0J?,c?2 +?A8?d4J?xn{?7ģj:?ș?Xx{Xt?z?6@?ʸ˘>?f"Z?Wџ*?SA?_?loF?nw?ȟB?]? \VW?QSiS?uO%?<`?澜 /?"ըv???,e|?މͷV?O?k{?'??+{??L%*z'?:Na?jl>?Ms?Dy?{2?*Y1?1?(??ͳ?譓S$?dߞO?^ 7 ?chvk?YH?f 8?nR?:Lrt?u?fq ?Dؼ?h?hqoB?"R?x oQ?p (w?e￐?Z-ޯ?NDA?@KL?3,ĵb?&%,5?6h? %K>ju>jh>3M>.1>-Ry>YTO>ru0.>*-ڨY>>=l>ٲ>Q>ȋ>g>-̲u>4w>]s<>vM>.-C>ϗɚ>j rE>a>۸>Evvr>Җ>ĭ#>>:{@>UZ ?/w?3?q( ?(v*0?6@ ?DZSKT?RtGP?`\#m$?k2Yn?w,sFӷ?TDK ~?r?:y?""F?T[~?a"p??oY?SN?F/{]\?Y+zH?=P~j?B ?n?;H.?B?jw$?ǵ?@%1&?K-?ǭ@Ô?{!? [W?VnK?EY0d?M? ? Q?,yk ?OFC?wv ?ύd?xDn?Ȼg?jr2.?aԳЛ?}tf?Nhq>??*? `uD?&o?V ? ?z?D:?jϹ?n^?[4E?B "??9AL?JfC?8H?& ?h?+%?/?niXi?.*@Ua?1X?2?n0?{-u?qzw?g$+{?\z|?P]t9=E?B`x?44q|H?':,?ft? ϑb>e >ͩ>≔&o>GD>{oe>Q2>;i>fe>WIF>&a>N)c-> *N %Q>w>}$>Hz3f>#>߇x>P=>;FH>g. 5> Y>I9>ة[>Jj8>1P>NOVT?j%p??@H?$}*H?0]?=l?I{~ ?U vT?a1?mOޖ?xI ?O?87p!?Ԕ4p?mo?18?`@-w?2?e=?:bH[?o^'?8gR? [?lE:?C ?ƙ|?rO? _?b}(G?~f{?J@͠A?ua2?ke]?.&jMp?3[YN?}iY?|r?#TB?X?֓?t QU?kݿ? Hs?ĐN~?܃>h?p? k?7h? km67?[tn?0Ԫ?{TQڪ?zy⟲^?},R?j-?9ǡ?̨?$T?z̈́v?W?cH>?iy7??IӤ?~,y.? 8J*?U?C:?JԻl?d8T?IR?U{?|^?r]n#h6?gk@ѿ?\@?PpG;?B 8Zy?4*??'?eEUl>ߓ)P> ݃9>-P>4>mv>Qs_>C `_^>w)>O2o>c딴>>R>GGS>:C>jrUp>ő>'ИL>9/=N>j3H6>>d\n>K4\>C5\>nXn>O?`?FN ?1Dp?$q?/*:=?81$?C33-|?O O{?YC)-)X?dޓQ?qR8vND?|# { ?:14?::: f?5y?Gb?=V>s>ƥ >ႜ>Wܜc2>_;>(˴>Zӽ>VN>~ȹ>OC> >">%Q>qKt>c>'q-F>.ךb>>΂ dx>_s>ݦ.L>RXv>rp>9F?m:?xф??0&V?pcWt?L/9]?Z?eˬBX?V\9,?}?q'TCe?C*{?B0.^?1#|? Ń?(X;?yK+? w5?ae@T_?|.(h78?v;Z?sQW?sio?w_k?~?, [.?r?[MI&?~?Mi?=c"G?'X?5<2E?lp8?)m?t/?tz??_3u>?_?6E_?TG@?{_c?}l8h?wKV?uxNݚ?vr:I?zy?? dbw?!$2f?4) e?џS#? b?T?\?Ή?9(~? L˟?8?X?ˍR?ZLZ?B U?Y`?D ?v5zsC?lۘT?b}$?V{U?J>V?=%{r?0q?#oZ?P&U?x=R>K.g^>%c->˿O>dfe>ð>]?~>W !> I>)v>:p ><[>qI>Tl]>>d 8+%>,>@K9J>š֜*>83>mSȵ>y`>w0al> x> ?#o?}3 ?5?"b[?*h?2ݣ?:?$Ղ ?AH b?H׌I?Qg ?Z;BS?d_2Ջj?phJV_?zp/?g+Ѡ?QS?_Ʒ?Sxڜ?C^W0?~Vw2 ?x?%g$Aż?f)J?(g%?J?=[?}?bކ?xS?K])%@?}&*?wAZ%?t?uLL6?xÕ?x- i9? E?lx:?OlmKd?Dzt?1M1S??R=,?XQAx?7L?C@e? b?F?̉:6&?{\}?kzf@?Y'??.n?>q+?{D%J% ?z$?|ھgH?17?}^q? L?9#X?RoZ{t?uUM?%?5?Ț6t?&;*]?\^nG\?*؇ ?5?~]?;S?lY?Nҕ?y0a/?pv?fF?\>܈?QIZlo?D?7eL?+aX? bMٓ? ^?B!P'>/Y%x>*%N>d\lK>Kwq6#t>®*}>V!EK>J`R>5~0f>`>-ax> ~M >QX>&>L?4>䟻> 1>YΛ>̪U>MQ,>=>qFx>R>!`?R]?Ѥl?hۥ,?#O 犼?,3ci?5Pz0=?>$37B?EM{?M7?TÕ?]-nn2?dOR?mhj?vk?oު[\?z7??tSb? DE~?h_J0?8?ҌIW?|?MlO?*?y|?b̤yd??/?lu?%?ڪ??&Os?{X誨h+?zOkQ?|5NI?V&Oy?l?F۟?s%?|uw ? ?mx5?:iO"?v*V?s?WӺ?0q%0?%acQ ?<)?$?dF=u_?-?_NO?Q;?!G4?^&xC?I;BT?|IM;?S?oL?)V?uu骗?xpyĺ?qCCq?g?_e?TPet?IKw?>v,?2J7?%|?ϔ? ّV>fV>n+>zξ>hs>8AQW>n>T9>oTSz>J;j>S5_>)z>D>uXUX> >4>>5N>4!QU*>^O= >py>)xE>s>cRnѾ>lFX? 6M=?^B)J?"g?-"n?62R?AN95S06?Ie[mN?R/GeX?YB%gH?bU9B?iuE?q?xm[?e?W =4?$|D?ct??$dǎ?0?H&?cՇ&?Q?t?ȁؘ~?QlU?/št?#â\?ɡy?F8?I[+?l A?ee>F? yd2b?s[3?Y6?@o?(?X;Xڿ?.h$? |8;H?1_8?1/Vx?䃭["?!H?mH?k:ab?=?,4C+?޲?#?ِ\? Y(??m?lp?ke?3? Kc?fL:]?H}o? C:?+U?aJA?n?g?xht?ҍ?{Ym?k? &泾?ˑ"l?~= W?uC>}?o &~?eXbg?^=];n?T?KqD8?At2~?5{CGB?*w~? bƌ?qfF8?B5>aYY>0_>XB>ԌC6>B#>gC>k&c>z>|S@>B1>tv> 3N@>tv?I>B1ē>|S>z[>k>h'&>B#>ԌC!>XB>0_>aT?B?qfF,? bƴ?*w~?5{CGT?At2?KqD.?T?^=];?eXbg?o &~?uC>?~= O?ˑ"f? &泼?k?{Yr?ҍ?xht?g?n?aJ@?+U? C:?H}k?fL:V? Kc?3?ke?lp??m? Y&?ِ`?#?޳?,4C.?=?k:ab?mF?!H?䃭[#?1/Vx?mx4? |8;F?.h$?X;Xڼ?(?@o?Y6?s[3? yd2_?ee>C?l A?I[/?F9?ɡy?#â\?/šx?QlU?ȁؘ?t?S?cՇ&?H&?0?$dǍ??ct?$|@?W =+?e?xm^?q?iuE?bU9B?YB%g?R/Ge?Ie[mF?AN95S0>?62I?-"J?"gN?^B)? 6M9V>lF^<>cRn >s\>)xH>py]>^O=>4!QT>5>>4M>">uXdk>>)zè>S5\>JoTTNz>T>n>8A^>hƤ>zξ>nu>a? ّ?ϖ?%|r?2J7Y?>v-?IKw?TPet?_e?g?qCCy?xpyĺ?uu骗?)V?oK?>S?Y?q͙?w:?|4L?:.Y?\? g?Jb?T?+`5?$374?5Pz0=?,3ci?#O 犻?hۥ.?Ѧ?RY>!`>R>qF҆>=>M>̪>YÃ> 1 >m>L?!>&>QYl>  >-ayI>>5~1kw>J>V!E>®*>Kwq6,C>d\|>*%A>/Y*F?B!M}? ^? bMٔ.?+a(?7e?D$?QIZlo?\>܈?fF?pv?y0a/?Nҕ?lY?;S?~]?5?*؇ ?\^nG^?&;*[?Ț6u?5?%?uUK?RoZ{t?9#W? L?}^q?19?|ھgq+??.n?Y'?kzfD?{\~?̉:6)?F? b?C@b?7L?XQAx??R=.?=c"G?Dzt?OlmKd?lx:? E?x- i:?xÕ?uLL6?t?wAZ%?}&*?K])%D?xW?bވ?}?=[?J?(g%?f)J?%g$Aź?x?~Vw2?C^W/?Sxڜ?_Ʋ?QP?g+ї?zp/?phJVQ?d_2Ջ?Z;BS?Qg ?H׌I?AH F?:?$Ձ8?2ݣ?*h?"b[?5F?}4X?#⍻>B> x/>w0ZA>y^>mSȼ>8z>š֜z>@K>+v>d 8v>>Tm>qI9><8>:pa@>)젃> I>Wz>]?l?>ð>df>˿]>%c>K.g?x:?P&U?#oZ?0q?=%{?J>V?V{U?b}$?lۘT?v5zsQ?D ?YZ?B R?ZLW?ˍR?8?V? Lˠ?9(~?Ήȿ?[?T? b?џS#?4) f?!$2d? dbt??zy?vr:I?uxNݚt?wK\?}l8h?{_c?TG@?6E`?_?_3u??tz??t/?)k?lp8?5<2G?'X?P_ă?Mi?~?[MI&?r?~?, [*?w_k?sio?sQW?v;Z?|.(h70?ae@T_? w5?yK+?(X;? Ń?1#|?B0.^?C*{?q'TCf?}?V\9+?eˬBX?Z?L/9`?pcWt?0&V?xфC?m,?as7>T?U6WV2?K70?B~?9#sr?29!?)fCX?!X?PHf?}zM?g[ >AD>r僌>RX>ݦ.<>_s->΂ d>M>.ך]j>'q,>}>qLgV>%f>k> >O>~M >VM>Zӽq>( >_<>WܜwC>ႜ~>ƥ>s>=Vc? Lr®?;YI?%a?2v«?@πPD?N~?Zqc?eb ?qL?zLk?Z!V?<;?D$?zAh?`x?nYuxt0?p?t{?FB?A?x?Ve??bD`_?T'?.?Hp~?,?)U?;Hj ?{<?vj?uu*`e?w}[J?}֠{{?o7"?PgU?Bv ? o?,?+?d:z[?: 3t?e"c(?F_?4-?X?*{p?`W?%~$?k-霟?ki?|Gaܐf?w™6s?w c%?x}?}p:c?FZA?ZO?y:?Vy?Jx#?̷?딌?8ګz?dx?Y&L?z͗/?O>nXv`>C5~>KB>d\e> >j3HE>9/=+>'Й">ő>jrS>:}>GGS>>>c1i>O >w)*>C ` 9>Qs/>mvr>>-`;> ݃;>)\z>ߓ6d>EUl`? 思e?e1?'?4*?h?B 8Zyc?PpGH?\@?gk@ѿ?r]n#h6?|j?Uy?IR?d8T?JԻl ?C:?U? 8J*?~,y0?IӤ??iy7?cH>?W?z̈́v?$T?̨?9ǣ?j3?},R?zy⟲U?{TQڪ?0ԥ?[ti? km60?7h? k?p?܃>f?ĐN~? Hs?kݿ?t QU?֓?,yk ?#T@?|u?}iY?3[YO?.&jMw?ke]?ua2?J@͠6?~f{ ?b}(G? _?rO?ƙ|?C ?lE:? [?8gN?o^'?:bHX?e=?2?`@-y?18?mo?Ԕ4s?87p!?O?xI ?mOި?a1?U vT?I{~ p?=l?0]t?$}*Hp?@8??j%>NOV[>1Z0>Jj3@>ة[p>I9> Z>g. QT>;FG7L>Pp>߆k>#T>Hy>}$H>w(> *N >N)ʬ>&c>WI;>fen^>;i_d>Q>{o,>GBz>≔&>ͩt>e#? ϑ?ft?':,*?44q|?B`=?P]t9=^?\z|?g$+{?qzz?{-?n0?2?1T?.*@Ua?niXi?/?+%?h?& ?8I?JfC?9AN??B $?[4I?n^?jϹ?D:?|? ?V ?&o? `u=??%?Nhq=?}tf?aԳЙ?jr2+?Ȼg?xDn?ύd?wv ?OFC?"ըv? Q? ?M?EY0d?VnR? [W?{?ǭ@Ó?K*?@%1%?ǵ?jw%?B?;H,?n?B ?=P~g?Y+zB?F/{]Z?SN?oY? ?a"q?T[?""F?:?r?TDK z?w,sF?k2Y?`\#m6?RtG4?DZSKT?6@?(v)P?q(0?2?/tX>UZ>:{>ĭ#<8>Җ>Evv>۸ >a*>j rD>ϗɰ>.,>vLt >]>4>-̲ >ȉb> >۳>>`J>*-ڐ>ru1A >YT>-R>.1>3M>jh^>ju>? %K?6m?&%,5"?3,ĵb?@KLj?ND?Z-ޯ?e￐?p (w?x oQ?"R?hqoB?h?Dز?fq |?u?:Lrq?nR?f 7?YH?chvk?^ 7 ?dߞO?譓S'?ͳ??(?1?*Y1?{2?Dy?Ms?jl9?:N^?L%*z'?+{???'?k{?O?މͷV?,e|???/^?澜 -?<`?uO%?QSiT? \VY?]?ȟB?nw?loF?_?SA?Wџ+?f"Z?ʸ˘??6B?z?Xx{Xn?ș?7ģj6?xn{?d4J?A8?2 +?,c?D0J?O)?jT?bV.=?p|?u~?h++?[Įȸ?MT4u?>ϼ`?0ME?" t?D=H?gYj>T4@> >]H >>6l4X>x>mc>Q_@>v[+>/Qx>.o+!>?E'>wi>fo> ߎVb> )>?>2JW>{v>HN>rC5>([i>ҤE>)ь>d~g?z/a?AU/n*?$ c?1> WbI?=ۘ?J?@1?VvԪ?aJ"\ ?k?sF&-L?|I?nX?vw?c%,?<{FE?cbC?ElbF?S0? I?th0? ?FE\P?͔],?}֒>? z?I8?;YU?bk?I87?a?;#T?>8$?؄0?g ~?Q?P˓?fm?J-K?^?-?a}R?B\G??B%m?,?9 y?\E??BQy~?*?1AT?Vڀt?yw?{ "ʟm?Ej??aE1?c@?/Kצ?}X{?~ 9?x1=?$?ר?^?Rb?WoT?q~?ߚYیS? j?;tM?GA?{I?}brڋ?DR?S?/1?Ed`v?rL?dBP?UCtI?E5?6; ćP?'_?Zx?7_>u.>~.$0>NCy>j|F>,'߀>Vu>@ּX>rB7@>U~Vr(>d>1=>d)P>#%i1>D7>xJO>> ͺ4e>No]N(> ^>>uxO>Pg!ث>2>ܖp>j>=T?pR?So?!@Z?-L?9#0v[:?E@S25?R1!4?]%lfR?e'D?owZ?v tI?}e??v?@geE?q\??5w?zY?$?mD?o`?{ɵI?44q?g3u?N8:u?k ?Ww?2b?ՙ;>?bT{?KYlk?3?O}?&̏?U ?rS;v{?#Bl@?ڹt?e7YT?=غNV?jt?l "?3w/?ȳ?.?r9[?~OT?Jm?6~?'?GJe?I?n?8? y.?}aܢ?xd΁h?v 5?wT+%?|K?ʛ?9?ŧQj2?##B??7?,an?EX?'܂??P\|?I\?$̘.?|sc\?y\pP?z? ?lsf?] ̀j$?L?=?.Hwm?. H?o>|,>A3>ې>2:w>Cx>;Kt>C8>>y>a&>o%J)>>x48z>?|>U>) >b->o">@qD>v>ׇگ,>5^C>s~>7 $>ڟ7?gE?f6?_3E?(x ₘ?4r?b(1?]ŏ?iý]?Z ?Rv?ӱ%K?M#^c?}8?yS]?y=}x?}JH?4ɛP?%Fc? )W?Rv?5 TQ+?INmډ?|`|?$`*?ID?AF?o'L%?LpA?̢?Hݿ?+k`?Pl?Zo gwH?|=d^?vS?s}=?t'6?x9ܺ?lFl?E~?V U&?kV?]%? ??uV?L ?N1?V?*~?{;?b? ̦?Jɞh?r4?bk4?Rs|[ 2?B%*ev?2|F?#4?^?$*p>P C{0>"(>M>ETq͏H>ĝ>$> ޽>>I|>gz>|qfl>֘V>YW>Q4)>z> ?~ >S>~}*>U!x>Q7rw>>O*;>04$>,ms>,T>KbQ>プ5iZ> ҡ>Jۇx? ,?tۋ ?#I~?0zǨ?:.?EH?QAKB?[Fm|?e Ѳ?n|?ut)O?|.rx?0Mk?gҏ?>5W|?U?Dj??Xa?>P[?ȉ-?]$?o@x?%kۻ:?Q1?,b}?H&h]?4|?9?T?}J`?,ǡJj?'2P?|8K? l>AR<>0U[>@^>Ӕz> Af$>!m҆> g>u`k>2 =>A>lB>"+x"U>#̥M><#pj>u5>SQ> :1>,@@ >vU_> YP>:.>ű 9c>і(v>> |>lG/QD>`d3?uG9U0?L?d?*09;?5C=s1?A 8 Ԑ ?KiNR?V1?a=?kc֬?t P ?|J[V??LF?Sz?#R?A4? (|?Ea G?n 図?ԹY5?Rs?Z ?v? M?7??|~?C>H?F ^?LD F?R>Mz?7b7?|>7~>D33>LGЯ2>̈́g}@>-:>>ʊ+>4>F0>|ba>]7&>){+>> Y>T>>~>C>Hh>xw)U>܇>#uR]>p#>3ԋ> U \>hV!>qsJ>q? f9?mX?p':?$r%'?0j]u\?;hb^?Fx/i?ST|=5n?`wu?j Mh?t3&7}~?sں?=)46?e׭\?K#!%?XD;?b?AN?5+d?S?ө? ;Co?NU?_s:?oD?[J[ 6?l1QU? KS?pY&R?e9q*? - ?Qg'0?K7ڃ?NU?}I.?}x?oLM?{*?'-!?B?A?}?bR~?RH?5a?_?k\?x?X$?hYa?u8֞?I}u?^ȕ?|w??ǫb?yz!?j?Oc???]i?UG?se!?ќ5Rz?=繀?$J?Ci?Qu?AqQ?( ? YR?W?X?x\?je_(^?[xPr?Lؒ$ ?>V@ N?0ys!8?! .?/&A?u\w*p>dp#.>"?Z> y>RȲ6>,иl:>3t-Qg>V,U6>o7>=P85>2k>]#>bR>QH>ԝZ>੎>}>\u>ۿۼ2>w[F&>.z> )n>yS]>+|}>h>):>*Jj?H?hc?Y?+045?77G?C "?QW}w?^KlM^t?ji퀾?v^G?cB&?a?%Xm? ~?*?'/|?1?l4? $}?2:t=?{P?~?b?%!?Mۚ#?s!??1 v?JDc?^z(?3>6*? _gA?<ֽ??m˶?vt?$Ub?{Ν@?CY?"΁l?;|uv?uж?Hv?R;?WK7?Z?%H? 70?XMA?t+h?w ȮL?$=紨>ߡ> c9>#l0>°2`r>(DBI>oVj>QϿVY8>?]L{>ǣ>>h۷>G >Fƙ>G<>h?D>ǣ1>?]N>QϿX?>oVƛ>(D>°2`>>#l0j> c%><׼>ߜp>=H??x^>Q?"fb?1- 5]?=+r\H?JG",?X4D?fmh~I?t)d?z! ?7JSV?J4"`?5yW?n)j?ؼ? ?^~?%o_?"DĂ6?R;? N?-]V?*B?R`??./$ݣ9?45W?&(J?MD0?ic֍?$>ec>ߍ^>& >;_>.L >EO>X>+Q>rtHS>}q>*M4>Cgl>ؠs>JQa>4L0>Yh><>n> s>16>%$N>i貆&>ޚ(r&>Ɯkp>#1?xUT?[C?+j?-Me?:p•?Hj?Wp:z?gh%EH?u%b?;zi)?}*ɯ?|b9?0,4 ?$?@`??zA:?qmt?e!?۩p/? "=??YO?!?4j[B?o=oN?1k?}/]g?|V9?} c?En?z(??8V?=ܢP? ?Afq?~2ZP?O[Bh?J*?wz>f?(sR?"c?讹L?IXj?V??mҳ7?^%?z41?wH/w=?wt?|@! !??Ƶ7_K?XV4?U.Ew?|DYZ?kV"9?}?1rg?Ob?HT??:? ^?ИΑ?;j'?)cV?ʐl?GfXf?,U?]°?wo?n?c{")?X 4?Ma<@?B ś;?7;6?,S"JV@? ̟מ?f٤?G<(>[(f>B78/>x[)>װ¨>,<~>I]`P>r?>v!6>oνz_>aHtH>R&>!夘>P*>Tপ>pG,>a8>Z'V>VRD>Y]{Z><>^䊮d>~j>|2>( M:>1Fc>ܞ>#? ;ly{?]ֲKl^?*`r$?8MEXI?F״Hx?VٚGW?gA?vd?[L z?f? ?vq!?5 ?>[a~?=8?N ?0%*S?IF}m ;?V.sO?Œ%?|"69?u?,_?l<?{$ u!?w=4?vԎN ?w{X0?}P4?9޹|?jM?!k?I1?n}?tE:?'?K?>?H߮?NCf?[=?k??%6(U??ӂ?x,Z6?sbo?rC?u?{BM?*?7 ?:Tq?9F.G?m%?K="?$Ԧ? -eɡ?+:?Φ*?ەQK?*5?l?81?%Fi?=M? q\W? g>YvH>ꔪ[]>\˥>šAo>Atפ>ݍ ">$j>44\I>#ǩ<2>C/M>P>r֮h}>ӭ>_>Rb'>3,>~'ov>QCr}>@q>|iG>9(yz>ǧ18 `>]0 1>Wb->uQn>0%6Yd?]]?!w?&:?5&l?D?TA?e&V?t.?/^ꬵ?RڡL?[?x[<? R?i6e.?dϲB?-;>x?Ȧ?ĺ6b?#;?u^{b]?i9[^?x"?UVm?zoR۳?tFL?qYp?qä!,?uq U;?}Ib*?A?V M?M^&+?Ӕ?=v?_g"?A?k_?zn??v- ? ~ta?ȑ?OCZ?>xL]>ʚc>PZ >f>qRJ>ghU0>|*>#ؕF>w÷>ag>W)AV> 5R>zFd>ĎR>s.>W+>?qV>}1bD>pCf>h>eL>Zz`(>~O`>{\AN>>&G ?"x`?0]8?#BgX=X?2 L?Aڱ?Qyg(S>q>r r>_k%>Y6F>\h>{;>b7>i#>MX*>b/>*!B>þGD>-ݔ5>YSj>dK>0YJ>]y%>>,ضX>E >˿ɚwx>4;>/>ވtgA>C? ךVp?&ա8?.J`p?=r8,?MR ?]4 B?l67?zu,?踠Ou?ݒ??0:$?S?2`_/?I8a?âf?X?3@oG?s>?<&?f3?UӕZ?|-?uAl7?rRwX?rVz?u _?|רk?C?Zy?nX?ҡ\C?uX/6?ˈ#?Bs$?=P-?7?%?dx?W)?z?Ʌ`9 ?Zj?G9}?V2 ?\"Il?{9I\@?zba?}^:X?|n:G?ȶ"2?aL^?3r?p{?WU?،f)?'."}?'B?t???ESy?-Er?¹?TX?Mf7?Sv]?Gg?Ǭ?h2)?|MSW?uA͓?o+ ?f` P?_t ?U-F8$?K 8?@SH ?4¿?)qV?#H3?SA? A>lN>Tu$>H~>r0~`>1!T>_D>!>4Ξ>t>Q5>)ME>JrX>Vf>r&S`2>@> #Z>8H> $W>ƣL>R<4>BVF@>|P>kI>l%)h>0 ?0>j?%[p?JKH?'qz#?6|rD?FnP?V%?d:?so^S[?4?45d?}H?>3?]:?Ը{ 3?Mm?}ub`??3I?#U&l?WD1?|"%7?z?՛9(?Eu?w&?|^݆?N+s?b}?Ea>y?%d?3Yk?/?8?-k?ct?_6?,?zI?&M ?J\?nUC?S\u?z|k?3?!J:? NR?lwj?;ZM?\_?EUU?QYv??Jk7i?N):+/?B7* ?O?zOJ;{?x T?IwmF?d84?h ?6Ԫ?ɜ?{TP?sՔl?l(}ڹ?cmڎ>f>BD>Ц!:5>WOdU>Kn9>(傮>egF>Ёc>3>IWp> w՚>U7>g)s?>`Qh2>pZ>@c>7S:>%K>5t0>ϿE8>1>֮U$> Xnp>!TQZb>Q??KxA?}Ő?!ԊՐ?0F?@+JX?Oo4 O?]l|?jVZ?w+_?ce?f)?? މ2?XFE?ˢdJ?j {?ߘ8?Zm~?6fX?Gk?ZM?>'^X?#ZW??D?=-\?C $??xS?q#xY?g"?^q9?R?F#et?;,!cn?0qPO?#I!dc?\6=n?(JI>8\>p5>x}>1 ՞>sznj>vB5 >zE>ZKn>wH}>>"t>۬S>+$>T<~>V>GX>b,>vۜ}.>s>vY >y|0>Fo0>ҳ-0>6 *>X!C>/:?CdL?ȝ"<?E_8?(0?6+'L?EsQ$?S0 ?a{?ngZ?z z*?L* ?%??Zz?yC~?Zo?ɍiU_?YJ?{jљ?{M D?~" ?9c?v؏?% 1~?/O#d0? p;?sY?S4c?R$M?28??_LW?%Ib?vT?l?i:1b?5w?wW?~zm?c\?~=o#?{x.?|Z\u?D;?Ajk?JU`> ?Ob6?!=#q>kx^>Au%!*\>  >һ">{WqM?>Uu>ÄI>zf!=^>ڀr>S$Rd>f A>(_SD>Ԩu>w "~?>6Ӟ>3 >[Z#>Ok>0Uf->v>)xd>C1>fI>klTx>DG>հ?1&ę? c:H?92H?#{g`6X>?D}ȸ>*>`>#>j>OnXfI>S \$>Ü,>~c>k Dn >uq>@A7>4h>n>>]\k>?4'cp> Ӆ>#>>XW>ʐ!]>Գ!F>߫.W\X>Q>hgo>"W?g?}?v ?#[>ŨP?-B);?76b{Ѿ9s> !X>yRw>mt> hG]>rS>R.ُ>DR>m Ո>~>l>o'r>(h>};5>[`>P ><.O>jW>*7 M>Ł >ѷܽ >*0L>`>_0d?5l? -Ӌp?D" f? F*?'Գ$?06|?8<P֯?BEi?L1Fל?W[2?cR?p!F?|T/?RHN?:?WE'\?J23?# ?P1 !?hKg?|˷?UH؇?k??S]?.;~?0$?n|?}AyS> ε_> a>ϻ?>fY>Z>v&>w>^>a$Fx>7ȮJ>W.>Sڿ>BG> >uh^>R6sa>˥{x>)Ѓ>xq>؋8>7*>Q??M|? 9L?^Ir? ۓ?'_m'?0 j?7 Q??̯??Fg$?Q ?Zsw_?e_`i?rr6?~ s?;aO?TV?.(?鰓?S[!Qc?$&9?|j?#jLK?+բ}?֒ 6/?nr=?x8?% oX?HJ$?e!?}4p?uC*?qBSyH?p ?r>J?xaYh?耻?E?,Q1a?%Qe? h?3.X#?dSb?L&v?fĢx?4?;'hd?F?|?rEF?0=.?6-?| ?F(?vևM+x?t=$X?upb?yZ?J?HM??%?'a/?0[?Qh|?-rDR?zq>?|R_?:?|*+?RPol?|0f?aB?fC?>ܼ?|Gy1?s)瘊N?i+1?`M?TB?J_};|?@16?3%S.[?(%^}\?*@n????YL> 1:>r-O >V4F>cz>93<>>Fc>x>멕C>rxP>*63>" *>2$v`@>!G>M@6>4EԨ>"|g>?ی>ll>fo>ᆽM%><|>]'3?qs~#? BFj?{%? ?)#?2P_c?9mF?A .?H;]?QM?ZG\$\?c?n2{?xPFRǞ?'_?TMP?޸zX?co\?F6?ĺlh?[v6Y?|"/E?"?QЌM?jZκ?k?AD?y?,^?(ڲ? >k?|{=T?vb?t#?uH̲?yZs`?s+\? ؠ=c`?,?\0~?z ?+:#Ȕ?\?zzE?f ?F?;ė?15V ?,^? QK?d2j?UK~?~?謊&?|<?ysK?zOt)sQ?~Rٷh?EF+Pt?D5H?ةÿ?\$?xu!?_,?wMq?0'H`h?0O?U?j\?uz?5?j^0?6}8?j6?W7dx?NF?C[48?8&L?/S?#ȟ?.'Z?f{'>DT |4L>Kl>v8>בN>d >2o>` >,6>zVU>!ab>b7>^@ i>tL;> ᘋE>Λ>pkJ>ZM. >>|i%>̓Q֏z>ږI>1>rDqU>v?"˭E?$l? i ?)2Ek?3,q?<B侷?C ?L1 h0?TI ?^O ~?f&2?p6>SH?x`)_&'?NB?n?p>?xjM?:>i? &?M`tQR?VRyJ?}Ț?!O?$ti?jm?x?vO?uqg`?ئ?ip0?{Ҡs5)?y*p5?zR嵾?/ n?Ƚ?~<ɶ?lE@??E5?!\d2H?y"x-?gtCF?*ũ?T>?T<?/&Q?.{U?bn@?DC3Bu\?u!/?|?oϡ?}}?{o>o?}DHE?Qw'c?qeK?Q\ʫ?H?]8` "?[?/Q?SDs?T?LVE?E"? O? ?o-?ҷH2?N?{: ?{]~?r%~?ic t?a:LJ?V2M?Nξc?EZ86?< N?2,>?&i@S?.8Y?:t!?qb> >Z>Aw F>Xl>R>wN>Pfh>nl-w>W#Sr>Oѫ]H>ڈ%N>bR>ڈѱL>OѬ/j>W#>nmi>PN >w>>Xfu>Aw ->Z^> ?qb?:t?.8?&i@S?2,?< ?EZ8:?Nο?V2MÃ?a:Lg?ic x?r%?{]~?{: ?N?ҷH2?o.? ? O?E"?LVD?T?SDt?/Q?[?]8` "?H?Q\ʫ?qeK?Qw'^?}DHE?{o>m?}?oϡ?|?u!/?DC3Bu]?bnB?.{U?/&R?T<?T>?\?gtCF?y"x-?!\d2F?E7?lE@;?~<ɶ?Ƚ?/ n?zR嵾?y*p5?{Ҡs5)?ip0?ئ?uqg`?vO?x?jr?$ti?!N?}Ț?VRyH?M`tQR? &?:>i?xjM?p>?h?NB?x`)_&?p6>SR?f&2?^O ~?TH?L1 hT?C ?<B侰?3,q,?)2ElV? i ?$k?"˴j>v?>rDq>1>ږ_>̓Q֏m.>|i>v>ZM.Kx>pkHX|>!> r>tL=>^@ i>b7>!ac">zWz>,6V>`x>2>`>d9>בNr>v8x>Kk>DT |5^?f{'>?.' ?#Ƞ?/S?8&*?C[4&?NF?W7dxj?a{?j!͛4?sTy?} ' ?j6<_?6}8?j^0?5?u|?j\?T?0N?0'H`f?wMq?_,?xu!?\$}?ةÿ?D5H?EF+Pn?~Rٷn?zOt)sG?ysK?|<?~?謊'?UK|?d2f? QL?,^?15V!?;ė?H?f ?zzE?3.X#?+:#Ȓ?z ?\0~?,? ؠ=cY?s+\?yZs`?uH̲?t#?vg?|{=T? >k?(ڴ?y?,^?AD?k?jZκ?QЌL?"?|"/D?[v6W?ĺli?F6?co\?޸zV?TMP?'_?xPFRǞ?n2|?c?ZG\$>?QM?H;]C?A?9mE{?2P_c?)#],,><|~>ᆽM0g>fކ->lIP>?J>"|_u>4EM<>M@au>!GFj>2$v_>"P>*6>rx[>멕7>xݐ>G>Z>93>c\)>V4">r-O> 1:*??YN??c?*@?(%^}$?3%S.,?@16?J_};g?TB?`M?i+1?s)瘊N?|Gy1?>ܼ?f@?aB?|0e?RPol?|*+?:?|R_?zqJ ?p ?qBSy??uC-?}4p?e!?HJ&?% oZ?x8?nrQP>7*5>؋80>x>)>˥{{>R6saX>u> n>BG(>SH>W04>75>a$DJ>c>w8>w">Za>f}d>ϻ?v> a Z> ε>AyS?R1$?BW=D? T$?,?7716?C-T?P$?Z&o7o?dB@D?pDU?x=?@F?fvgk?ڏe$? ;?F%qE?e!?hY*-?T?HoL?;|#?sOz?U_'n ?sqg??2$?!?5Un?zG?te솪?qDHx?qх_?uj2?}K4?2lyu?4$%?{??2A 8?`ל?vBf?GpBxR??|+?j*&?Ƕ,??d;-?4o?3;W?@ ??9_?vs%v?q_s[̻?o$ ?pU?tP6F?}_0d>` >*0v>ܽ >ѷŁ >*7 zJ>j*>P >[=>}E>'s>o">l>|bV>m >DS>R.s >rU> hGv>m>yGk> >{Ѿ9*?VB7?3?"&l8?0,U?;oy?FwY?S\lE?_h@(_E?h\?s$ ?|<|?vR?.$C??:B't?}Y?BXl?ү+?p"? ? /K?N]]K?ʑ?sK?Ɋ/?*6?#:WN?{7n Q?t"[#G?q?r?u*g?~5[{??#C?Al??L`M?Ke?xH5?=Ux??7?ჿ?]?98?c\?h'?5 ?n?!j'? ?{_]?u"{c?r{D|(o?r|Px?u]#?|6 ",?앥?TP'L? ?aUB?z.dJ?H)6? g8??N4?ee?Ȼz?Ѻ,v?7XYL?[z?~L]Z?Lj0?s?g/Q?[]wS?PW0?CC?76a?-B)8?#[>Ŧ?v p?~,?f>"W>hgn>Q8>߫.Ws>Գ!H>ʐ!>XW>>#> >?4'>]\*>n=]>4h>@A7>uqn>k B>ɽl>ÜS>S :>OnX4>jѮ>`>>*">?D}>`5? [?Ti\?$L?1.J?d?<׎?H'6e?TQ@D?`*Z4?jEfGp!?t(U'?~nqJ?b?u~WY?0#/F?m41?|?- ?^?$R?.b?7i??\? ?fb?ӯT?3-F?cp?{9@Bљ?va0c?uuD?wȿi?~W×?~Fс?j*s?'?i?I:?zn%?bP?IU ?g??28?S?qԫ)8?VM8?2t? 1T?m)=?LSֶy?ys^?wHIKR?w aw?{?Hi-I?tPbH?LaN?oe?xޛ?K鈡#?rr8?-F?N~Z?Hm?(I0>DG`>klv>fI>C18>)xt>v>0Uf-4>Oj>[Z>3wd>6Ӝl>w >Ԩ؇>(_>f 1>S$W>ڀ7i>zf!i>ÄJr >V>{WqL>һ"> >Au%!>kx\?!=" ?Ob|?$>>?1Ej? z*?\4}L?c'?)9?%H?5J+d?y?{?u ?7$#?z/

    e,;:hO4\OK9GEuM Y ਹw[)h`urh CFa}kM~uƼf(^EX!s`$h'}ۘc㤲r U꧃-RMVtҦ2>Tï1b Vܕ7g"|7#p.촋SՐDv$$C#Bm-s .= JrVӼPp ]K#ai;V<Ӆ}&@B1e}3lN\ 9$#='Y..DwnX"^}:ҬPA/K4dk7}өar/(,zөo-Y^3V}bƗ`PczS/2%m+ث׺ :C{L3&fI NsY詞mv;[gVB0PcE5gg0.j aVWs!!/*r`{w&cD{kx Wu4ߙ"W].paCj5&fFd%Ëa`GIf 'olU2`qLFC[N?'!*xgʗ^ouA. ?r| R k}7"_hvIwӋnuK]:UPl|_b4@9Ih`;voپ7 c$oe9ݷm rKH*[3gґuv7B<6d :0vO<s\ɝ}ż#($=VK{C\1~Ggdѭkɚqqb4t9W+8ꤶEai}=~;|z:nvl0\ 4x)_Ip-|S{>"r_oT:J~eyy\^"'Y@b%פnݚ7h=߄Aq 顚>ZBg^8˂8Hw.2 &s 9[SukߪU8S޾S?}wy*E>a*"{9mo>zʐE@0Ea먓`ʴhbLУ8˴8JF7{8`(jZF1QJc!u!X):[S$^l!>t,V+ȼI" wSJ.7$4$$ HV!2E&+Mu @/=bUҍY&+'%1yZ4,H8-@iVdآE4dcho> Q#:훈v[3gY:( z+ (Z}vNo2@dYY-kՆl͸j,B!JDPz#8ö9jqx7$L赛fiU)IJ4Vb+pxO9s%qZnb;M$eIYճ#J3`Y͟yv$h+zft!2O7MKѠ gI ܉HZ{N4]wz'֬Tp9<厩G30$ B+[bd$WaVAIq9󓝷^ ,ض+0;7F3o9}/~禽OCFI>x} ^UM3pG3dDF֓ץc4 eZ "|dDf$PWuN," <([zXunj,RDc&^@FGu +IVG#5x5_ݸDPC8QY_{rPD=wUUpbuimu\ʊ5F1rcʋ˴戏-J5m)yx#CYV҈a^'yk}#p@(jJɥBWvnGbd<0eCĀdxqrh"vHL&:$Y8sP." ^` 5/%Ig>Z7c8n*"m@L<.~>yy{ĂxeMCל=*b |oͼlm3X] hHnQsnr!*gܬ\jGS}!NRΪ3{~;ΘVq'ٴG^Ʉ oeGN'/7kM9}f]p>c(!*R6ݨYפEe]xҲG5|n.4Om34BV*)~Rc%汶ƽV-ɴrrIw;DXS;yʠ3ex TEpm1{ͭ EDt1y$`Q[TלW܀&SE Щ6,;i ]JFZiË*V} Mo3{B b"YZV]SޭڭT/K ۶HQHT 0]65vTX(@\x" "-8SC߲w8PG){ Hi2 4Z1b+8qˆDYxxx }IV-Af/ZnU ˰ D: P"0Hvtf96i㢰YW~֌l;f+ۓŤL@y'k3"Y&P/,V{[hNz8WP|}BqκQkŠl &#!5λ瑿-wh) `" VAvr/vqēMsS,3h>\ mվcfu:z2`N/X6x51_;θ(KFcV2_aPUΐyǑd{sTeL"cU37=ͧQ9 uqמv޳G[݅ d2qD3wRi7&1DsUy\}(lry®0j3`/{~bhˇ^$yٰ#{|=%;2^':Y ܖȂvq>Vr_Y4'(v0iZz|'zt5xs/QzNk)g.^q_lˇlMKAr-~Yv{';+-e=i7^t>캐ZPu0Ig{텅/"Qfxk>zȉbAK83{{zՇj\wXveɔlx 6A=,Uj9WXA\29JZv |ٲ 1dݒtJ{9ҥ<ۜ<3[N`T6L3x^YVdx )͕B wm'a\AP eٖy4n!llzK'Y>'dY\P䯋&[pÇrʒYm3kSƆйBؽtx`f]xpڦN 5owa3wN}{ٞWH=it"lZ_37c6hW& vU1x-W!}mW6fSLq峼r`Ό1Um˳eʳ(cpw".r ,6H<Ʀ_^W.*39/wCo%ww|2 lRfd!d)7R),͚O< MS/)Q;l5Q22B20:y͙R1"G=K5h~-^ګW>ac"GP쪈!hB-k̻Y1Kp:k޻C"65vI^]y 2D&^6v-E(pq"[͙yvY"fnhhɤk.L; 97n3[F4{Auk+kVXIfCع[("<tᵑ;Y;/7$_ ҽC]&p!y ӨQ=#+N5`rn: #1vH`hrkj;^ճW5R_ C=V `c/:F" kW+tUNX4Ǭv8Wq|4 ŠBa'n'l؍*?:Q:V {(3N@*  }욗]ٻ"^yw5-߭gYWr)nY7 ;Њ9zР0,#6-R},U ]1y/,#6 RlTJݽ Y4}MJnIXQ\!<4ao=I{7,/+ݮmP,ދe외Hi^4o'8}5 ^¼X gi~߯y6`ݷ:{{kVob$s\׻I$:{D[˾է6!&uTo+s$%3|N;JЅ=. AO4pV٩ކo/I{8qyFv=KZhۋ-cIf3 -f"T5AРյkX⫩a/A*֓@È-,t)쓯͜H#sNZ532Zh{ᚳlOmGбyWWɀP;4!7<,ڠYOIa\Xo{.ӑ(F?v (̂{CÕ=LRHc/p] θǝ^1/%CoMm))Զ.h~mQY=q6oʶDΆ`0Tɚ&&\& kḧnXHnuA60!]vbg(OZrlk+-;<_J}ǧ,AU{>s+dwCby& 闢X}RJJ;.Y̡:\|s{EW׮^n+}Ë{}dHzO٩XHL%ӋkfFQ  ʺwÍ& ʪYӵ8ܛ:6冃h:wu' ZnZR8HKv^Ț1p.iBuuvɞ]cO-GgJuGǸgAN\:9KfEՇg"25 NB"nセ|w<=vz'0s}WC3%ɬOJ[ײ`0v&G,.R^,HCigf\chAX"dfV8Ɲ\EwzFɲB5q{Gs㞲rEoF`QC.:)GICΌF:eseSx<5|OʲLjN}yZ%c7vI6ļȭo|*Ԗ ^{O <=F˼`̇D睼s8m=vq|4ePJֵ MCkqAQvHXGm̋76a[E._MY-4Δ@@i ynJs1QM:vW:?=/XLC`IQBKV{pEU7i4ꃠNe|!O$jq~}o=gyxϟ3:Ϙ,Z-,6,URE`9eV(Ph ŋ, ~ nuJ۝|R,:K_B*v??-v-חgۯsm9}oL*]JQ":lO(CR@)KZF[V< ^1Fς 2$@Q eS%xi[i9' @`M{,551yVlܵk7*FcIaG3Xu9b[^r׏'[ZTRdoF{ϓ]G}qY$$^$AZ.J8Tv mX%$rߎu~94.·ј.3f1X89"cB7qh"pTUCL$ΚP2`ݽ)QtT{ˆFA?$%t]q ,>d+$U|ʊAB0wx&,Qxm9D`{rw^h;N[LaZ)bB@̇-;Q!<G,bU[yd{f R(i +Xۃh,pBaCN ^ $|NԢe ɬ0OP56C>}5 Zecv}bL|*KZ?wݾ{wg]ȌXu8_nE?ݷ#cPVLI$s1(0Myx%RG<9RDߩ+r'^5×EO:{N`5H]&AD̀i'و3qU [%`#~yLR #:4_FZZWj^l[PC !$0#N%wupJ_|+R-B)[d^[`ֵef #2<$UT5!6XͶLW6F0\uT`Ǭ;JuX6ڤ6$"ΨF2E~nw /%e@p=eKeUD,)$z}qB]"01fO$4ujZ*0" ŖQ\֭67"4FRR*Zhk_$!PU@o} TTbE xd5Z9/͹jd1׎~ny%(ҝ~N<9|yM{@AME01V+y^ S$~x!dB ;m|yFbi-4]p4b^v#RH;z 7ڽNZ{B,%d$Ih)$! r,X Wx0|`/; wv,^YA{qR.\Ja/-Yt6 r@?{JPeq_e]1э*Fh  h:mʿ !R{igMxrLr׀$HǫNղ+߻]A>oԱV>zUN0~`pIEJ-ՓQE_q-+O("u,R}I׬^*ȲlHk#j+tnwH nIi`g ^;tC}民}ȡx6i2` K)TƱmsp<[:ߨA}3L>]Y9+> ]H35l}^b{k6]5}ޙ gd^DӅXFU [`mb9ۛ/j'k8 w/Fۅ'(]K;ap3Vio0e,uas]WX޻tS X5,[/C`13>F8yݥkm۷1/͈*F,__=z_EAp.]ķyr֫A -~=}^Ƀ^Y]gރ~^t WB @j3q[{Y4_{hP*<:~צm zO=]JyMOT5^!:*7޶eG4xɑFrNI4(9"t/t֎dzũqW*>,'v˾޲ͱPVe'6pW)#yg=NިpZvK<ٲxsr]DǮ;m q-҅Kآnئz*м:(Oef`'E#2gnyځ4%rLR^Aa$ri7x|bYϼQ"Cu:}6Xx+'s=6{ǬhfĦVU*07xg7j֐C?wڸ[Hw qKu4!oXDlձ 50=] CgU+z~Ig0;mI"ηC.8v&T컼}/&6 {4}?|&]u|"stnvKx#uD;qu}ls;{o?Xcy (!p+=p!rXw^^H EkGd筎gh¢'M@i /7Fvz.1ǚPX&9w+sMV%QFa$3nqP/FY};G]s]D>rTpS檑9am"<\-ow-oPny(ZGsQ4r宽[~;:9#jC%G=QӠ?N.s=*zjŘ,JײbOv LHϙ׹o*]tb]>ɖiq+<ƬFU᭍@_짷qI <_+{EE.«w/Rfwk=I-LFq~"̓ޫ4ގ+Fg:*C-=ƒTTCQjzz3x=g9(͙B>iWc^or~CP{{tT`rƵ:Op?&4=ڈlG|rU[ÝyOe$_B5Dνw^e|Vs!jUqn#3V0.qE.3_vz@Y}?lrq«y T2ko9_Z^n{q(4Zgleg7FMkG̈;}ZU9ŃIqj3PqgfꗌǏ^:MgveWN 4-!;L2{ud'K&{<<-=nYlA{͸{D{\4ˁ4IeCLLﮓ[xZx` PkʹJfs[[6+؛1'P-)8/=f%:ie:{K;s1zh9ٖZ`D g_erP(nw $<2^q=m»Z?g+/bwY몶n Yz!m_HyQ>z JNxXdF>(s߷]XpBF 0`bDH0"Ctǀxɗc$u4daAgi{cs(^s>Ї2Npo=߸s§)CjW[/帑ID_.뿕͹~#ԯ,1TTSQ}@Y(9N@1Ilo֓pVE5.n"h#+fFM8ǡ%cЫ40Ugbx}pe64li⚾I|D@D"Ҍ%%Mra`e[pjQ2dˤӟou=UT˿zyR(3ܤb54jTcn^pǖׂyGRCȂ|I&3ö an<5<\ܼA EĉԊ=$Oϻ:9R3aVf8*%VkZ j&nf!QӦGl6u*4"6]sfVʫ Q¶3ns_)8e+' ֫#*|N>Cw:)TFor-sk;DIwBzNrrDPׅT^(ʏ]-HZ4'җSsss;SY HBmF[U|>OB4`*9dmnAg6<~~ T,V@i᳖d "Ȱ)Tly5E3 ~ljucͲ3u8wnV cXVV CW2J>m REP[{*V:0~9̷քi,.k>rq|o!W#vHT@xf6ܱl|9hدwÍ( 5^EPp\:(h]Be35|x{ðxr ,2t<ݢ@Z %Eeьx)MA FaB7M!aCbus\tFg߹_`j@XfD߻;z֯kΰ+Z5F餿QoUXUPPyl.gSEjB4Yh.2E^t!*{u4@p{p`t/ABٯpc"26؜LS/=lXw%{Nq 1~p [ tw^WPґ˾~ϣ QӜzwۮ^}[ V*Mjy$%`9\H5y.`X9҇ t[QxcD ~OJ~& i%J(ؤ&<zy2oJctψ VQv%Z"\ |རۋnn&ǂviy1}yC>"'܁j/TR^M|5ÍukU xˌlxY Q;'ۜjSC]@R "!V$,"b|8EA1upH"bUBn-Bߤ|YjDAn ?B/o&+d[<Ow|"5$OZh/ڇM&;S9=k0"Yg_{`ju!8rĊ34ƣ d`QGREF1KjKĽ ،PX&`8Bkg;At˧"+EHyj!IбUT A9dxib#6ոsY43I'SZИ ma̕WVSlG̋МL0MI'2UK}}~rΰ@'ϐ `qU寕zە4h J^wX]*)wDGmShh)P_Ž []]9_[M7| ^̽e(ϋkpb<0Kfh# ' ޗCu5غxkL:][( 2{1Ti]・Ik_o糼wOLш3Wg/YJku S$1o?<1"^Wu=Nk7׼u&l7c0ToiZ^.t<HrAuid?) ܻ ϼ{Nuss83"pbxƍ̜5?TM#&_ ]݅S1;I,Aܷs^>4bv+֧We=7IT^A\m~4k}I d&r1rο[VśCޫ~yܷa{_k#*A:=gc%YO61k^kyEh׎ٵ}wLDN r:<'c޸˟M{ RbnjfiBo!):GwJysH6u(g3Ҡxk/EbcjH/RViJu7hϒʂ",!'b}J6/4+g)l=!-3uvyp`o, 5gw=FŸz쾻x(5nrOs#vֆm|V6HQn|w-;xZ>#vo>J@ElU޲T9|0:0.mYWns>ӝt89NԹ9cA=zǟPۛS`@}Uʉ754Z)I-wIiT(rqnFe:mxǵnopO˱20T{ҙS*.? CsN, nj w=ȢŹB>c&s{{mا,@EF-Zy?o%sXz_K=촫FH"e<cٺ ~N\혏}-ˣV9䘤͞eqSJr [i{\z2AWR&>5K5iC7F]]D2vPVh7q0Gw*n=Å; ^ku w̍yۜD &"vY5yb EXŐPr ãE5lTo GlISRWq3qٵsU0E8Z)vaKRʧpZ:\n4E>_1wy%ouLћw{^i^)K :ef_?2M*Ͻ98^G-,sZN>óŽĭc\]L:/a0qN* v-ô#xRr uڙ-lsl^j48)~Z.XZ`ъEfc;=\S.;|}=_|wWwz3nˮ9O J\㜮xyQqp{;*o!S!gS㽒 үf8,8by[N<'b'7L,}'îM7/ Le>`ދ,GhE^Z~pN"qtQR)$圍gABj롔ee>&h1镝^›`E=eZ-UgYi(V7B/tԋ0o z bسy#Vf%ȫ8#ceŸ1b[ry:#?J]{}&SkmоQ}A3+XqH]}9;<1x`X'XSTEyp=Su}+ ;긮ؖhQ6\)t w3ӓeE}׵Q~ 1_!M%x%DsҵIv˯Lڶ{ǞgEI5||ԯhкcbF)Y%6u<#MlPuc&h;{=X<ۢgIn:e1H Z_;3_X{Y;f+4;`3κgmcr#\tlN=/-ušuTm5g[췷iXgspYB BA_R=E/'҈*zƮ=3\ެk6)R=<^d;Xfsèʹ._,n>X.6r=޼܂qim3=7EmQL;O9p1=v"t*sۉoNtv,V ur>h[^Y,+N^Nj宷F1\LB]^9UboդAtm!ٳ=LoeN/XjXa[n@ R'j }f~:}*urwҖv:q0M u]yxD=~'Jnnv ;tw0rk{ gD=K0vڙ3yV=UBW?! #샆M,KgIl5̚ڝ+&ۀxjr\J~Ap^2 |,‘kzA.J: [yxk.toXGe G,ـi]fs}ox / "J{H[ޝppśD]z5I g^QX]ݿN{[yD8ƦV1H<38lP/{B܈5UNo_W[ nSsw2W; /hz{nշXO!m9plwTuo%C{FJ_wxFUGxQؠmawLԅ•@Uѱ܈GR 7Fu2'/HԬYӎfѺ0EhkFNѹ]|)ׯۛ&Y pfwT5TsDx Y=f+q\^z.Ih`cRDPɞ1 yy0BgO?#3z{^%)z[sq/klY˜I)} hDm+۲`״l%9 5ǒ^fj(B}Z't}`d{.Q>̎p=`J Ւ{mCy%B<prnإmʤnp-9u>E{}QPgLzd@kr,WUJ[f]^. ^9zr*uf&q_{p+=jz‹|K(Iteћ9B򺏗>eJHBdˡ)c{92yp|!g5/`je+ԧ(017Y.;/qfChA7 Jt)a]hM-ag dTG3ڇ'z,]-i`0Vg } ^`3o3Ӕ7uBki*}竓.Q5z;ye6٦c]5 GNjozTܿX+3M}/4}`7d|\t}/_Df+l3ZD>*lZ{43ՎnЎƙXlQws|zn@/skD#v,aꅟeOriެ`2ץd#@1.{p6{^8L^dv2fr:Z[FV3LW+׼7wƌWr(wGK8J[J [Kq28 nXŝMOnar=O4BqcT"Ӈ,r۾; q<:1zaDB@{ٷ ;|ny3a/xoޖh`#}8wE u. dUyv1}3vA0d/ǫ5ժ3Ir221;nyC1qQݾs41nS9wlɛy|";`>ݺ7=6ϪXiڑR~A0v;onB,pw ^˹(۳`n%6Ɣ໹Z={of2Tm+Rpݰ]:U{DaC>yD9džLa^m@u=D' ~js0۶q${gv>i)+< %T}{ӅɿpspAŽGyPl¹HSDPj޺=_/IfҐaec;^S]_a BRh=dػ6KR͌ٚ=KC2!LUڏ h4o G(OsOLopA{_'hFcƠ'Ǽ7tY{5bo5/n-ۻ56Nu 嘮E)zmPlgj޲>^x(FaX3VX rی{}w+yճ $ EWܮ̲AFo; @"jwH>Ao8Sajo32AѻɋsK+֓9wCp NѹILSnYt _!N>vGb=fx.&xk9VfΉة>K \='л ^ mr,[(O_z=;a|z9$FszK-jbTáf gPӖ/~֦ԍrsgvS VXp`!Sq1 ,w%|B+C[}$jNq~wmcDorx9.xd:хt;8ޘ 6㸐#x7ѝz7Fl̢yNq$4_KiӒ%sܯ=[o\B\f [NoT 7fIQ~ͺvuڞ\cb;xuԪ E w^U^ O{G4io{vr,Ѹd!&,6BZ(z8jMA6r?#o%2L_zjv_KZ:`‡F]; 1jf }Gz:kc`9~= 6z (ȫWҼ/m4h"teq 'fZ;*Q 9C; g'Kq j {u0n_\wc;޻f诠̻6&= vhsOԚX-kVŗ|bQ@j;L())M ֥4tfW'q;/)Nu cgK'(^r1{=K{NCb5:PXySw5d~U꽆J=^K}}V٭r;,|Lrw\uU`;n@XŚR!f\]v6>dsrr*)ƏiWԼ=GJ֢5OfZ(F(ڢcM jXn :/O snwTipdY~S m\;*Z~hY~c)B|q{.y<Q=v:i&>~郘tg MJt9x ,p-_~kU"{7e=Xz07 9+N3qqL7{sFI+AlɧŒz\91Si{l]o&wOo'o:ĨzhB,ˈs+Oܙ:d>M5 9yط;;rfѻ.GY;{Fơ|/n:#^<WtW ݭ/'MV,A)vlofK5&}W8crHrCd=odBuMv7U.R,W7_w~e,bĥJ0 qy HEj3bT6viy)^] SYMמٌ pxKï] c<,q]-1,I8ex߼7}D{ѧni6k ;qyuzX47͗{DM.p.<"74 ZMK OzξtZ|/[ݠ`t 3ھ'. ܺuX\] ifzY{[f_i(HcafzzwmnmfNb>]-V{ث~g45_|KH՛Tg{If7s]e#VE/MY,wtCM\:eȾ'yl:,=2W>xWN[xgPT1)3,gK5I IιnP2=88sJw{;|G{˻Ag5 tPyRά`xNoMSt\iδguc{E'nUwj4)J4p1_PιrՋłe<9:wc8,Ԕۨh?h&%H)[ܧa>4b`>AI~6O׼ b64W;w?v@,^<N޵p9v<X귱M ̟n\=7٣ٸc<uˉb}/zc86?nU/M^*X"y۵w5J;xy^;''K_%ϩGoA1*AsuQޓq=p ]mO. #{=fm1yie˦9ezjq[)faSswx,C d8v#>v;{Z|߭#* ҽ~[[ה(2p9w>6O&mmuO5}>:sx˾r p[ߵ@Cm[|{z#ýqu%WgB\Cѡv랅j2V[1Rsen\1 rop݄wI}pFyUSWerTL|G<뀣 ~sLK3̙! 5kƇWG {ܸ{Pi`.n0\oy7NfmW\KM^7|oe2wn"g82A["{,.+)gt=>6{'=uv&palqu" i!`WE=U;{n;%۳:# A=D&I}l춦7w`lpeȳ\iw\lG(^IWs9z$spfM*oGĂݝC=W)Z5ΤK<'Ykju2e[|e[О;=n;dWj_:"ɹ߫;]$.60U>.bJCYWWָf:+[JǺ}׬{Z/X@g!2y+ݯ5c˻;go*d70iݓ{87ƿY^u\ wkW?.=orvĹuH|ݜyi9-3{Vja.#UX:`|k3+GwV)HƒQ'F^J@.M03h^}Չj -K+ޓ6dsu.qz\z9yW{ݚ~ 1mKv8zB\zG&"]J^7y9Jƙv\ئ%ƻXxڞOyxhyYκ/+E]ᣮ2T7t)-.l}K.=A޹Y6_xo0) hǔtw+,5/Op_˫XG\/(%Nxkۛ܂\"ZBPdf/]c2,Jm}tswX`oe;>fwͱ~= YyC|s_Np¾R|YW(8ݱ f-B[ldUy{q>hb78WADуf._/;}(}{Zup7GyzR|u_xYrĭ*ۚXGNmo6qh 13i|M:|9J=n&GqAa[LKX7{|Pu%j1$ \I@{XB\e2Loesb7 y-sThwn(k/tj`Sϧ;&{(l6{o:M=%UEq2a 4zxaio uz C{DTPQng^kspXѳ7fK Wn^)qy}CQ;&yvu VM==Z t-W$G7JȌ0jH7|k[&ŵF½S:jB=%CI({M˄Oa5Yx"6,A=;b[w s_bp,^ιcn{=SR QOl$w&q֐dqy|Tӹ}6,RDe3MԤ&r,KXgqy~bKOZ\6sbKbL;5eʂ7ަ,83]8dN5fcU͘WsPԤ/c-uDNԂ vdɖ#g;W&ᆹv|AI>xy =<9Mg}j}a(.QgVO{gi=WםǠA;WON8=4eg+;$k7@^":k΍@yE{R[Va nhgn=;{]A.R!Vw#NipdN_(Xb'h~H^VQu%bS+M!d=\KF,ްZ{G tgL:=+ ˢOv}Ǖ`"K~*Mh]w<a|&d?Xn /V1JGv;jSNH./˛U N9PW{ :_qtqY_]6|A!x=~E''Osv8ʯ^ /d>Cg"i [g0'ވ啻|{DzKJY~O*WVS Y޾mRE Gz4mk.G~{Ūq 5:-yݛ0p!KZ43\|#Yjڤhnl/.S<'џ<(; t8h&ya$֟m7kx܋"9]xQfz%bvwNwc7:Y~ 䦌=}}=!mq osK e2<ۡEY^8m'=8R2nt n`XK=}fxǠ;b_xX%%l̳t>fT{mC{'c{㝹ϖϳF_=\q*AoVc yz+PtI"Oi1czc1`鉮]#t|cԪ->) CKp9}64+#_{=ȋ&uDwS-}.xB6j3hDyW2^?!-{jK"ɍ՜aΨ,}`o2[WxIm]}}b㫋lխf]9ml|HFe1 C(Ag-@%2trUUGzlKP龵ݖK$"y]a#.7[9#u/p,F"V8ow 5q!(l VCXFrYiȜuo92x1|OD7K~D2齓=|'o+OdnX/nֿmL| /H!_S~YscѝU_/ _9Fh i;¤%6ҼFZIqn/r*# j΃bK,>nnI.\jd}'x7Am\9gx*Ccs/-{U Ķr,\`ì>ūCuIM] /ݞh:5UM0&ǖ,!;֒ɾl{΋Ub9e#s/\8YF᝹{o/@Ǝr*;fzZxtSMlj^}齞śH:tвw%`$+b9[)h?xTIgQ&kyTJn7Nx}vdi~K707 O fU@3gWpIy o RsX6 /MfƾL{/|ñQQ]ݹ$xzC uG][M^x1iKކG&G{ůr7ڼ^:򧺳җ2t{O ,ًN=˔hRZm=VV = z' p3ks,cnwSZf ZǼpt&nIFUSXKiz8~2d=L6z BWcvxuLڀ應-j×x )؊Y1c!>qXEuq$1׾pZ0n8 WxasH22<==h(^xûK{bw]C gQWl ޷|^G#WEsG^d]9է}5 zUgp 9ޛNŸFie:o;Oyc3yvxvL2Xvxh$xoHydw=;^ۂo1@{G+{˯{j=tօ;J{ZGy(T=^].^Y ^e]32&K:)ivx&e}npv^D~J͵>R<2(@=3վi~[lNjOcrYRe#:Q9U+.;cy ۦvc||]+K'].yRzM++3Qz^BɹDt9c>h{t eZ pm.Aʽ"E nf%ifQwCUPvu ʧN>\u9l}\ӻ6OW)v_$2t 䙘@{JJ=ɲb|6)cvC`QumO`Sg9>*ָ =(͞:}+F@HsZ4e.ޮ;T C*}~ӆ$iŷv&h _YrS<ΐh;Uз{4 Wې|h|>ә~Bu zJw5iԲ`gvꮮ:ׅɆ`Wté]@V=eH0 r*Xgνh>^7 'Lǖsx ە .X1<=&{m^im:ޜUƯ8.zFV&4]{nIolrd4. 099x"r"G3:lVˣwXnxݰα!ewEmɩ ]-Y1JuZ}T_@M Rr|}#uoє9:nU8jzgX3^|y&fSw<ӯPαHa->pZ͈z79W !/8>[cJyFw /{ܤ>$Gʇ=VX܈_djGzz*Yzoq }x5x<}]s:=Ozx_:AZкf;|mt6bX*k}ȁG=^yE]U}&+=těbE4g;KQI0xUOlǢHȳsPxa7(},^cӱ$o#~oj"fg&~z=6rdz 9U{ܙQza^1v,oq*q1fF۠'E]K&C;crLͳfLq_it'7n浇obl] T0fu`Ǡ8*ղ=ͦwDp͠koѦF=/eh3=V&Dny g>?`Lxsad5~O+^=M)tt2 ;;;壳Pέ'١y\ܸ}Z){Ao#opo_D1ѷQz`j3ے $/^Ii׋nQ\"OD?Q7ݸ{ XSݐ"%7{ϷxŠr098;nyOcQyPOzI >xѮ;1:(#9/]{{{CXZ^:զ';(Z"t [-L߽uɭ7^E{jMP_ g7ϯΝo/?b` X>u8՞ { ٫XVux5峫^TtMʮtNK{s-]d> *+=jބoJ9̘JBIc:>h)!r\;˹8=zd.4w9 $teAgq/˅_O{X=#)CҼ-p6t|t+zRB]ǂCt/Iw~Cr)b;-Ȭx۵z|Szi etkcmg,pf ѹfySAsc.ksI>nL{}=}!3R^*Y4`O78ƊO 8:NK.XGev57Ym,C{/s [{Ş=Z2)eo5_gv!x^^p|sL\0+p8˂6B#iy0$x|9^R\9%nɑSz i4qm9sօ{2[{,.ĵ[kuKs.w3i߷{֑\{u='xpLS[7+fhgҿjf@XwQut{W^kb,{*ZKǧLLSlzX3aI _܅ލSԖa>ĦY q {ӆNXnte؋ʹOc G@3G)I\؉}N( \g[N3E &`á1Wn@yZ=ͼbypdd,U$ qjeؙ>MeӹY7}Q+x0SƪmzLnm EjƵ섢f}=n="Y3m?/n6@4>;$;yֺ*q}g]9bv{WG.KLwUBw$Z3{3۶0pjc0[Y^Q/ǽ7z8Wsů$kQ7c$zqwT* \$fJAx4 NxSF_pir`BrdXp],Ew{wdTح_r||ZAkb2K7's^xltW:NΣX9M(]k5#]<M3s645=a]@VZgwܰ{,kُ*7hnw]s`w`סF{( xXzN;7c|r@˭rTV lOar!vroZQ8f0U))(A{4\0 Ӛɦx{xXN\y+xO*ysB>Bz1ޓ)΂HRg3>z]J ,K\^}ݭJxgy;s/ j3BdH|XLidziöh΍]tJu:zenʊ>@ GO]>sˍbz[(NMxTr!6;V\iJїa\T [YO1i۽wuݕ6*h'u}`wFLJnq(_Skoc{btyM=FYc<峷|[݋Fʮ!C\>L:G܈:kռk%9o`Ȟ_V޺j915xgqtR{;p!}{ڎ^{yт>3~÷8ۖؤ3ulHӶ#h=d"&#WCٷzQ$꯾3]bVoMBy!R!|'CEmݡ1^vw|P2 ݝO0[ RkwB[}n{R_>"X n9'oso/" 3[P;v =\6G\d:5X-cxyWl24Dv93j[Es=Woն]"wYTX41ӾȱCoя$Z*8b<@Q|ǠIg!1&Ֆ|so0/=nTw{׎{fu2ObEQMGoh9h{|z ZXNv p8=%,7t"CCz` WajۆpUoGE}}ǽb|{\ ;o2t9})h6IfZ4Lzg(J.$ISW̼V\}7_I]]yܵq 9uX8z__j {,ͨO{I̸vf+(u ܼoYu(} OE?cE|Լ;}ק_i*5~}gf4texW˦oz9Ww)2f=&_](;o)Hڽxt:.xAݪ5s2xt4ؽ32Iސ\MU+'<✉4` WEcG3*n]_jF+EʺR@csŽAEzfz053{|C^/ W27zm[y;1`kA59';`[-Iu=ySV4p7yaOؙЗ»5h.`z  &5tq# x\3kc=Q.w[GM_1=4Cq,{֤`&\Klx|=HdS=&9]H R}f;D+ U8wƼBG;Q> 7ˠd{ @|54e*/gD,6nv:B/DOwW/zOzR]oKc3{`͚[C˚oqQ8LAj\Ao zUv$%:|tћzVhl%G6|u7ϕAʉm5a^N7̦ DX|>>:i[`7rp\=:3걛vF/nF2l28u((SXud}5i.,aD˗*]&/}n ~jйW8EZwqosF!]qb{׃ΞZ(({f-dpoIgOK /&q'bݑ(? f#=Tdy;՞_Os} !5h7a37M=|ou3lm)s,BpW+y}2#X9K^{y̺&UC%3j 5t-9ϵBZ9EgZ]<7gFCW{u;;= Gіd1_M<\"Q׸F.g˽)OܯD,?R{,ƊYdww}9)Onlf N:7<x|m9cFN}7ݏd>,} T]F-uo(uؠ{URx=+Yڦ0@mxb~éz9xUI G-5R^L澦 <Lj{&م*&nw ̫bs(_f0h {^䥋! qY}ӻ(SkȘ|:%;m87f!}gnF/Qt[D`MvQ$*f+}B?j}P![{Ak&=|;{,{'x}xozG;s] 6yaW'R(o缕dj杋C%sXfon4b,7">&CnAQ\rKA_58}M'{9OUyvrz׼Ssk2&.|͡{gUf=F[{z==١纥%GTWhg70o>'^|Ґ>,s䎚 g9}6,f,q|'edsz\/qs$ >"Aw"q;?К~);6{y {ԣ9P1hY\s8P P6`XgdwXxˋ~nzHn-p^xkݝs<#[};&gS*_MՎrea|ְf> N{7"t=hmXɡ[pNeLahy&Fxaxo kɕKIBݲ;꧓b<ܗ!2@3.X̏UJJo`tW+_>Q\Axv!.Rr/J^*4Ͳa%M5QdZ2RVPדO~YN.%B5q9dlL^7۸VKFy-#3E݃I *spD8 ]'TOgCwV>ޣo `z m$q2v;ٰ6x3f;_qj_:1[B-x\zzϛO=<'S}jÔ}6:@#ROoJ Z!X=`׭]xޛ|0m&z,b¶՗(6lVw|>(a "W1_^26j5'ZF8M=ڵzuNtT/0Ε;p7vVT~QM:}'55y̼{q_6P=U"{ޝ ^4>S+c<x|~ī륁wyn{]H=똯|]K蘾6E󢻗#y3p2W+5aۂ</~<6#cgmF[_[9q]}|މ+=gdx-Rbp\&NL^s/s݊oLSqW6~>/k}yHgyX1{q{{f"ô3{&^ s5ѕpaá 3WW֯oNG$԰YƜ^9ޒֻK%.n^wpU]Q0E*Pl+lv8YzǞN£t˗oN)C2%/tzU9ݓL J zfӎ {jEkM%rb`;uޣ{: 4^ΣMPv\p`)u g + $k]GxVDV={Sezj^V|1F<. ѷ͎,` Ywx9Kqh^T禴(:x\jΟ/ U_PD" +K<#6ڲGظ&=`鲄<кK67yg>BVVe#m&=Yca9{`i%z$uJ6^7]ƣ==|p qu2SQCXI;䧫rRS{Ά IbIl^Ufa7o&>|dr!y L7tgowU^_0xtCri~;'uŻn qyUBsVw7qW=6Roc'mCy{Ixِ}ype倭݄xLz隐4iӤxfYd{܈.K,0KvǑ.c/`ECE󾊑^7 ͫd=t^W?SS Ӌy,1Wz$g>IJmk3"s\x%D v@ùCp| {7<({%nO/fw=ݰx%9雳p˼r uZn+98{f6By;\ɇLxGDvs8"4nי ;3#xe#ecym'W2+pJ՝+,ͨ9GK?g/cd Ǜ[n!u+"'q&/?~2{T3õ9nW⣵{+3.}{dKkfl0\/Zz)374n]ϯ.ccg#AWѡVqotL;p Gxu(am tDk*uӯzkͰ^L ({|zW"~*qwm(poz먫1 \_x X٭̌Q^&^ _,~f'\=cbw{[ hѠӉD2$&mq F.1izϑRgR:Fัͨ\$y{lOهzCړ_&]Y,[ɯBw[VIK G -[&]}y?]v ڗn ~c >f{*Hyӥ2@vK MnV=Y/{F ;Lun0֣6gв,Z|C1{+=͛squUܐّ|f~S_G-)IݐW}ӴknoKI*9<&{qbm4rNz\U*w`+ X 3}OQW!'+x8j? EH83Wq񷓌3n371;׼SPˆ}jӹ<݆ EɚRBsjHxOL(LtEgiaW[;Xw,Nr/fe)[̫ѯ'W VQe yJ-7OY;Vuz}^åq?trq~~ǁ+.ƵAYݘȼZ!JRʱp^#o$;"Cr7gIHBFpW*ae: gU{u A' ش9oQr.#%WKz)~>@dQ8/}瓕W=/(?w=s0׃7@Ҳ΍Wt;*%_rA[%Z0S޷gk!&@2;\:c[\W9 TG5}##c18\GL,רodzM+z)ZeĬCi{`x1;/sSfްzO4C׽;qH,Koxc TDjv7<[زoY;FU WQjӹjxW!r'rZt1ج콷*'?qv\ qݽm"͕ {+;^ 4Tv]Yۣ ODNn#@\ 9:ӒDn5"bq}zvNe)jD*ݞ>]':U,{8'AzEkSLw(:ouL["51wpZع^Cro9WIœM…ʗP, |׼X)au,+[s:Q,p;: 9jڐޝ7.U&[=':]ާמrex<ų{Λy4"ȍB=ضxsQvB̚1K]]_%%yӻ<-L{١_kgs5ǽnwu [n[3wJܩ1z00?usǸ[3iؐimwC+!eqO1w\9igByziV?7osRz˚;ō.U~]¿r }ӈ68zNkLݸBΨ^^(CchuYr}f͚o{ J|1_=7gb;zoW{619m:\򗧰7eLLi63u:6{k]cٷVGz!ҜIsw7ndN,4GwEv_>aaF9,A,~֘ɂ5Jzp޴ǓMڹiw! E^2%C&]wЅ|^sm kZ7L?@ϻ*.)n|t5v[3zR<@tyT|ybBxf'W'@Sy ; /P7|M&65K,sAFդﳦX7W?}ƐOF`XQk|{+$X0+[n_>*Ub0‚2~z+5g[r4k_Y8/>Z޴d,f]>Uw%T|<#L6N<܈Y=\hM9 2xkjw+5͝uaA:D4rm~^}ghɸ'_Xm;p=*/ˮi&꺡o3r'Dv0d̓=Lp808F˸U5̠vU憂 Rd3Pΐllq_x_X,>o>w-ߛM佯v[{DfomŴwK-ȝ}ؾ>ZO[o/ ywT^tY^+x8!i,?nlca^}}Ȕ+#dh͖4bp,rc}s͙NtztR@_=v L-o%c4qxWȻp }MƝ38v:2{N/{ӌrµ z_8gY/r=xG'\=;OO_;ݛ'@9FIJk6&(df>>f$vm,ci2ޚurӊ~ sw|ws|e+ 4Rf۶ekត:s^< zGw< |<^W]#fS=4͏C2՚v0 (畎oqy cp_gUB-+o{c#5m:/u܍\L \'7bu=3.9}#s\|Ml.\;LaAVMGYFf%/`dj{ݏ8}dxpt\2o= ]:ܒ4~9}W :Džף/Yw:pJ۠L3C\R[}2j2wv,e iaCXt^Ѥ弄1Rקw;H&N]1F|p9V{4[߫[#\}y:M-=/|7E$Iǐ0tU}(b3x#2i @狪e{sSkIޠD|yS;or9MH%+Lh>9BPtkl0Lļl8ٻ2r/dᗣBU'%㝗sލ̬ig:B C';t?%{8L75L[iG!y& |ܞ[~ުVa׫w:\'It,j`PIY-wq3ZOs%DcJ/K($"Б/>h79ڴt x#>^dExe{<} ߡ4Q .w/mW L}㧡yg5[zXoT;,۞wiו#nb c4BN&v|pK',dVY>0pج1TK zAt)̞^{αd'wF6gD]%z :{^ؽ>o TowM,}RIOepe(]-׷I w͑rS}yWmtl/;7=^|6'&o[ ڈ eOLv;O# lOb@xeͨ[7|PGS4B޾ Wj+ft 5q^뵞5}ٺ}tn n/Y{(Fzcˎe}^c--ey_qUPE671ד@{SE\81޻B=n}7W,p|Gjgsg@7=T3-q{˅Sr}FּC02_DW \~r}!tO-5Gx;vw<{\WX/X7hr/1eŸYgq[lG?lm}h4=1ٚ@]7;&n x^ l3w +։k=q[Y9{˚l_se8ܶiMg]ÚZAK:<jGQ˹'tik/ou春7ʮ2~;s|[ȅYO+=YIoڽٝhoMXwӻͮfUgz#9s4g;A\1wg33_ꪹ{#<=ꗱ<:Aܽ dǾV{E{_ `쁯[1ӄrn24`Hv:xe; ȁmIgMʹH"-B;&m^ٍxaiaA'z0[zKBA&wӹ;Ӭz!= ٽ⳵3Uڱg1MM1-6!ϗQs񆑗VȕwW~G{6]9oPdIU9nnřytr ŧ]dF\4=SUt"r)}p"~Ruт]cuQW,8rMV| Ҏ@Fq͙ g=}[ ;5IGxĝGzeV1R.n w/|בvX ۖ_j&4lshq͆ WNW:Dr:0s2]^0Weh_ ^'x&/uqqhݕhٻQdpU6It& H8wlU4 <G&l>\\#NW{V&UJw qr玔|gy/]aÕzc|X)7'nfFN\!͸uI]HZ@S6{+ܧSӷ.wҞ';5i>/AѽEH&;i}Vקqs}KeUg\[ó[޼3i@v;GrjWp,ױLͳo,Ӯ^Ʌs'm7.exnޤGy{&e<{Oז[{Ɓ9rR<<K5ZOf8Vj?Ly!+fST͞2Zg/'ZLx<c 68~ M$L#C#=u|aԝ;ruBq/lT9?LX7fZ]U֝4ҫ .ĥ[1=s9o7rJM$ѴK'J|=ya어~ݎJ^X]QbfCt+aetZʺb,Y6g.99Y+ ;pKǞ c_zqť|ڭx2d3+lOAId\ewDT([,y3{O.X0!et)/S~kv+ûlՂ 9nҝz#.4WKHk[n7^TQU3~Zgq|G_WY+ٞ#74l:[}gʶU|nYl0*Ɂþ)ua{LjmTj0Nyó4Ҝ۹GK}Kǃpct.m-^sa MO11^ boE Esl}W^4kX3/l);Z% CEb Ǟ%`O _ Y]=k<3eNiY>>G[xGo.'Į^+;Y5بjWzx>}½*4 Vy{^9J{$:p7*ۼ@2l|9\+x虧9֍3>F&n'^YFk/ObX'N\v =뷂sF@m|CQvfwf[R)G [7;Jxc۴/z3qK¦St[Ys-]a87X,郻ŤRx󷱾JHw1^YMD8XŸwgp8ܳ3[O;b>))@׳j޹ld K)vx˯6]V/ ģk1:Y+c ב{xgdFaEU_n xergNJtGu˦{W hݸcz݋jq{ho)fMMh< ]7S[^s˾ؑދ)n\1GfEr4 YuiPz^ {{Ź⶜L6)}"1L3j݂:kײN yL|-pT_SsPTɝl<1ؿ!8u6.B$nʏqu:I<p|jy /WB:mLu7օO:Ev)4@hgT']v3kFO^7n;S`]k- ^=s6 lٲަ-{ӟwL,Fܫrnp{8-1j)h^sPT?#^:+ػR]LWҘ“oH:b;Y5vʔk۽aW?'pU:v1ܓ*̑O{]9%mtntPckc.ˢ"13S k5G=AC}YVӊwN^7H$ϤOL#KkzuKIJ?s+2E{|quf}Bq`WNrN4n'oc:tU+]a &z{յ;ݰ4i7nߗwO{O j=s }ޓ.aP,=wH-Q@H>N7[Pvc g{^EZR)fr'$P!UJ݈bYoQ|/Q=H::t߻`;11&Ъ-¨ܹ'tb-Ǖ5r85y Iͮ~h^-{ٴ}WKl'ݐ/e\0 άܜC̃=xûiV#f\hO g3ޓ{bulFr"_3z.٬n_l} |Sz)aޞZ~;uwr;dV{N^"o>{;'"Vy5i^>ZN\3ψ g&՛#{Ҙ&o'EnM ;1D/rFl уן9NW^evk.ƶ=Zr /LKuW32*s==0M6Q}vwY's]7:r;wqgdj\BhdWfY'=c" 5 =X' ͪ"6/Pga̶em㏖kF s{vK'e&wpݘRbTηHBƐ.vPji#tnoz"3Iy.?LycgL䳽S:g +mp`$JXFu@-so^deӤ C.Jz`fcۥ&ˤ!w(ѣWJfgM#]ؤ,ڳ?(Շh<Bun&ہ6#md+2aGi9^8]ŤaSDS{r)9<&w ;9`6&Gζux!=c\Xry=8f z# tgT!fm/>G07s.9p(Q(lFwvΜʫY Mffnq2w*:r|U]5ҧUWyf!]xgr*tymZ^lȯޥO)Z.2| VDOos1uLs٪,J\)ӨMTF'>;˦Ug6.;F|;-q BW͋1>&eČTS0ixhӬ62z3f^Aw?EgwvYE-!xҁz珋KdH<6*=O)cU%f\&>St^CI½ohǺe>TW4o2u%w-=re7;v|+ۗx7_ʏp ԻbL[ ) ||=PRRHT8 $H E(P@()@*@ P @ ( @@( (A@(QBB@P B HA@QU*P H(h+# S+dTbtrݡtB-)X[ }Ek5ZuKu^ 5)Uڐ]+VM)jլmK Vк9].Ⱦ}ݛ{ͽM%LM(ty_>Zc$jڨ6JͨȻwut: vatk-wu5spd{Ƽ0ĬAqh6JGJNFTf6k&C&vmڶUk&hmQ;ws}ӱM;PӬ-.irN]nv]صm[Fs"ŲvZ[[c4*#Aʩ۝ipm;Ļ1cO'ۨI1j Qzaw Pmmeq2MvݶM) MmVՃiuZ]u[ۧ8vsݫ94ngnZͲ2vĵfnڸ6\%vػ5Z(]`˸ʻEc7wI{Ϭ37{q->&fv|5al6&Zs;]*lpfέ3CfiҚESeJUW3vvo{Lv:5scs˩5lV#mղa[yWfimmlgN5v[Zٷ\Nͭ,Zi@Pdk u >z*IZ]g^=kvyLՖ֛j2-]m´&۪mkm5֚lf5kWuڎt=:;֑f{s}V3UK \NW(\nJ-mmֶlVvmeJSjU%lVFJŬҶE)R3Cl$me ,6lV٭Z(w9FVdP mB,ț&-laf&glc25֭P5ڬPldW]յ&SXWsm0UPVѶ5eZFX(d-kCELڪhfح.ζڱL6JY-*k-4--%jʖbUj- kL6lhnY%Pjk1e-k[mLښhllY&kmZbi Ͷͨc+U$MQ[m̈́M2hhVYmf[uF*V ٗfIZHm%0iJIlڵJ֑li6$JM2d[VhԶ,ٶmRSFmj-%ݤU2h֬ūAVHmOMR~L$5=2hR@j{H2OT6T &hTd~WVLv̥Dd5BįŒFb0TQ~_%5iQ~޽ݿt)GHDQI׼~Wc XIE{/ؽQc6ؒ^QIcfj(Q%rOTQXh-O҇Y41b`{__ͷAh4a׷/Kfj( b-o}/^ݗJV(mT_odmEhtJ_ɿ1Ebы!W&_͢52lF#^{'EFƂQh׷~[oTlm{~O#dQ(߷hרFm)E_4QmKD~M~EmdElD5"IӧCVN( "N?Лmc~z$cEA[~tҡAXDd;͋L1bƱm{OobW4PR,!kI{I戱cŪ,~_obgٽɶ*5ojd1Qߟ~+6ш,~^دmbkEM qPP9 5, , t*CYlOuԽǬת5wW?uX*5N5YXzwaZ(o^޳76ؐ4P$@RE,NS2ua":w;4RBE:ΚN@;ӧC M" 47$Sy5 8N·IY!;ӡ;&NarI5 7ttjIӳ'RDaCިt:" !vhhXB{އT)!4Ӛ5zE w4TBu!NI $:M9 4T",!;9 '4&$&n98N:u8jӧ{5@BMT6qHa &0Ő&r@adiN: " CBAH'xNI:އM!P@;7gBs'!2!L0 $9hn Ct٧$9!8s8 Nnl- Hp'I8'N:4 JBn&a $! dg'6r!-I7wM6lٳTn@l(Is&8 e0ӓ M '4`y4Hm9BNyr L yIÇd'{ӽ swWwaprro998Hndr6l9Ä$ 9M8rp`9C ӁN` d!B 9MI,`C XP  nLSgw99 9 s$RC(ÓP3&@3&C432Im )' o6 0~^A @3Sa p00C2a8s09ɒpJ HfL8p,0p88X2Hp08d9ȤL Ʉ9H^r'89-Aas3 8a [,)`s8spPᙁp$Ü3$s)la0'l6/0Crn8rs–Ns -lݓ3 8qa090s !C9 p+8s Ü Ʌ 0 ش yЯyw&&fsɼt3 )-N19p-397&Ld&2Rmxi0.#\ݮeY]pv9w6W5C$5XtܨVV BխIX l*UUs¹]t'UÕˎv&pr[%4͹7*qk >0JJ7ԩ;cTfAcwE wK.ι%BlKU mS'qw+5pʼn\LȮWu 78XJ:ʕmVUQ-cե=F="2H ck;sv[FEdFw;c9ѝӻwv%HJѢ)JKJkKJ\\-&R\sr1v"9vt*.Stbsnsou>(oۛ^.rtsfѧdnqwtq|֐-XcvsuE;ws( 7w g;lWLb.ܹsP['.ln[ԑb(Mn/7|;b]sk]ܑ::d,EFرIiӶ']tEnrEw]͹Q\csrw7.3wv w]u;CQ[㝙!rGL}ӏ7i_[sW^M'.kv*4bMX\rtѮBw\-wtww$nurQn\]"2-nW.F\nngu˛9b.tt].^ݛ}􌻮jܱ.b$Xi,o8ww\خKu3ww:8r99&vû.s:]].ENvWwnm˛%sWNq($'v7thNGmww \w[ѱAt$98 tpXUB(6¢6sJL릠l;ɔNnth.w]N]˝ +k;F]nۜuآl JrwsNu&QTRQ":G;;r,Qs6b"hwtRi(3;7:[VQAme_c!;p1v⻮+mE)`ыdexdrܦFs""+:t.\ܙwqs)Wuܣ;vmnF+]ېPlrwjwnL4\˻pKFժoOw1ޙۧ:r;5_CZZŠukau7#ҹ\w\QԱ mE)RB[F2\ւJܹMt6(g0*Y=c+W8&O;ruvRd yntع]۔79Ww1 t]qqDrd]64D]1F#]ݣW6IinC}YB%OJ 5)c@of9>솋`EF׋+ ݻ5$sGwb"#A˗.]s.\2s*Tm[KmTamH#.G$0lK,*,!R+Zմ *%=yJY2!vܺi8N;Fu|Mjmwv\r9.vn5ҺS2Mrkr74]Q\t9v\1ˮ #*.bܺ]%FܮR>ɸ7S֥2&hj(bŶ0R9aRJh  +53wnr2$n\ەː&6Z4iKY)K+Y+%t3f7X[-Ugp0)ZDb"󺻺\.W.fPw%wusn$S\ܣE#BrsrTiv\ƈsW59 m˕b+YCU_7-j{Wpݫkhyڋ捱&9W .nr(wEwvvs\Mѳgp:5TlbNܱwtnnnh6"wmsAJO"E1ѭ^2me%RZ5^ njܷCDQÔ]RYs'wLݹٝݹIW* u˺tۛSJqnEʹݹvbb \_ oLYE]www.+j%FЛF.Ir̺HTFMۛDkspu wv9ی.t˕tL+7H71re R7׉|G'iѽ\5E5\Ѹ\#rwm-ȱ.t p+#͹v(ʎW"Y]6*4RsdhJv7}xwi_vlͼQuQr;9tq7kbTV*-v$t5\.n\ۆ.cG s˝w&5wvS4X;[k2QlrMtʓQXd `1h\VeWٖ+ElnţVd:Z77h9rZ]ݓr%.nk;53Qktܷ nN`P]T ݛ{}y,}&6TX;75|Xkc#V6g]Ң `+wwbkwB6TF-V6ȲѴa븹*9˚ ,ȨnrKQY*yaT뒺wr5ms9QDpɫ\.N96.n\1 rۛ\ʹfi]3ӺlTlnZV&Eslwv>'.+w󮻭\E/ܜ%ۜ]j5[fk-w`d[s%\ф.rܕsW4wcXأh#mܩn[&V*-'"(oX4/^+NJoƋmXk+wnF.9]!˨Esr3lFMrLnW#Erֻ$պX]Pr e+|1, *2eVVjU@d+ȕʹ5ܢыw]DDrmv1B]΢˜EpܙQrgp"'|iRҔBtss%]9[Jwur\F+,J‰Z2[jT.krw\w]bƨK%`I[T(Ugho֨]\Qb%9wuu)9rE"4h0iwc]wncPEt `1LŔڑ\EUR,Nq,(ztWr.隒njEt\c#;F)ds+pƣX$crrs7 w]56&W.E`\(>n_sͻΧ_K4xq(ݷvm|d5w(#%d0j"t鹺뫦MW7k\n\W7:\rM7vmK3F6؍9*YjxeL-[F肘1BA[Z5W\54kѨ wlQ(h6f,bWM˻!u̔T뜣RY-AX_ZOQ=,}1f_ۅ5\5st]j\5e;C`cEs\.mݫY5+F*uHCRnmÛcX)Fwn$#sx˷|eIRzЭeT+,H*ENwsQe;pw!gvM`PDlhѱQYQEԼۺɍs^#ćUZƤ4Tj#&unXrRPl$Dsm[͹Q%F(5WIL_x㯥pW4;k <0Qsݮ3chͮ@IHU͹+*ԔI4"95ȣ{k߷]+v_/F)7dxXl[FfѢAQ]%c4uQEe+j!&DT3E755+uں_'+]^E+oƢcFѬIXѣW:l"tcɫW.Tj幣A9r9sn]9+V1cW#O02 ,EUEAd1KB[kir,b1FIhѤPۑѨeX.] klFk}uq5n׭wu*EsFCFZ(B2wqH6s[&eHX P5_Pge'[ W)A-|FW.h r(,ɃrṸWu wj4\܋7#]ˋݷ7MTgѾoX5&ٗ:5ms DQܷwQssQk-(,hh9fF1RF-XLJdy8am⤷#s]j,PTh\#rr*h&j怤m}ϔ+Y쨑l;jm-ŵy\@F5rB2F;R\r-F44d4.>>arMzcvo1KPLȇ,DArZ6(Xdh1`W,I$r4b]s/4ޫ%NKUrJ5W*#1l@fY"l&S1pb,UlIc/~e6_n{wnnkk;Dd56#q3.G8V(hFLPPUpI&Ll\1g6'oWLE$W.UFḥAF&L(\ƱRIE.ъ29ʯWqxysbw&UW(f%rHh4QeF"&;3HTTX d7.J14ae%AQG]WʱW)-$Qͱrwd,cEFflX(4k%lZ5}};tʓK skW6(0ŋLZQF (whƱP͸Ʊ2F x65Kռ[ZmxA s6s%\h +ھ9LP0}eVE+c&*#QDhɐ-E,PTmw7w\M#v6+\"VFBlF*(r* E4dElן_M:oz+svվ^BlNq+nF+s4ыج$MۑDmȱ5!^QxŃ!Ve;i1Z1ɣR(-LБcokƏcvFŊ#`FTZ5&E53L(Ɖ}]}.h(׽۶*Qˑb6!"",\MI *1U뛑9F "/kx\& d&֝bؒ_TObK깠&(&cQ Q(50Vyxc ϺmE\;m]1D"lQhB#${k{+oo$hŒ61!ZJ7b "K}E}e*^&j5ɀTdbbƀ(ݷ^]HiVZ-2Q,FɴQŊ}\ok_ZޥVFd ة5-h/y+${.bEX0I`,TQ֍b}4hZ60h c0i(S^ۉuěmú܋b lEuF *+}}-ۑuAlR`֌lFddѫ۽z-Dd׶Ċ D**3 4`bSTb,1l}4m{tQ(+lgˮWnmg[ɌldQnnj6 a"}ں}W6[t6Ra*,l$ɢ[ߍpߧulXh!&(h؋Ư~(h,b L` DT6*K1IWCjDa1hAƴQ|_k׌o~TjAcdф0Xh}>UkIJ,Y#lh-Qu_\اbƆ#A$PjLkrBUN@"i4bRF@-{z^穮^4DZ=\ljQ%&$%H4j?c?QoſW-˫W#b6Q&(( E{{=x.FZ巊7:F1*1"IhdUnkߛmcQ`(6fZBb|J\_7HŃcb3#HBbz$$l"El*(o~ֻ\h "c%l&ɋo'׹*{jE,͹QDDlkTlmDAFn *钫[RlEd֐QIF#EW W% 4c4$Ooy5׺޼]jcEEE(4X)ڝ:bmZ؍Q`{wo}Fmx-EcFѢbJ(}䏾kδY2mu֮hb"4HhؒD15ﷇ-l^ *CcDdԔd %L أi,QQ&FM!H(_؍{of2nYH &hɢ#c:KmrH3*0- Fɽ툽=ՂD eQ3b2,k{={c^`cEhb4QAkXunVI  ) T6'2.^{[sXF тܒX{tƊ{d#0#clX} _nEkoI(TEQ_m>[ƣstبd qymbj#EFђo}מU5[!QFOq% D06űe{WѽmmS^x{1KE5IQCױ^= ^\1 -x+*OmD"bAAI$ou^H*"F s=oo{Z$ѩRj(ؐƁ@pcbEDX3{x[Tk0 KF%侹t=!2#2جQovkݵȲXFh$)"(͆ɤ4(A# І^{1= WTţ^׵{FsFZ`h`oؽk.mEEDbgO*zWIDQ ɒDhڌ\F\-E6%\kkBZ4j *B1/}ڽ׊Ȓ"Q{m7kBōE7{[kRe %"x~_o3*5(O%Dk\"VTj"F{{b"4b'_qJW3Z1$j[rnhlaEPU41M&0Sd "l*&Z" Ưjݖ2FŠSeaSAHdX-IE^'K搽\4m%Dۘ+ڹcFd&,m'{WGcnQ` $s{12LH!cYSHTR bmܯ[-c^{ZJe"M{W{k{pѣIDF*# D6+ *Dؤ%$b=unDk $T`i&AvQ ( JK_~W+ITQY1 rEQ5G7{jۖDt_-?mH( &&!6YDlm]/yul#hH.heJ i ",dR"l2(ě{^=TjKIQb_~ڸf4bUX dPEM~oۄWW6~\_X66{^=+ݸʽPfՎ E~݋sEF#F/wLQ`" b3hllDb~ƒչG9F-&1oo|/^=uA9u{[[ E?O߭3b(k/nE۔ЬoK~d~( F2~1UȢ ti inX{{oW"=ہ$Z ؍E_ڿk"hv?R~ۑdZ#jI~ƏJ~&XAT*iI(Hb^{D_ms64cE%_~X'H^{g{\䚣!kݮbEO}u{[)Ѷ$i/qvTX) `&soHA~_("6ihFEH_ȿmsQ5FM X%t*BzמWPi6M{ӠlF߶?W ?FHB(,bN͘ + Yw?k]hf @("(-]?s?X񫤔*LIk(F  l4]@TAqAga~##" ;l vMB)3n~k(Q~~ md +HPH 4 PVi'jD_\ؘXş~+?m&߷&~DD;à=;J d] 6TtXĀ:c:NÌRDT4 hИB(l6M&e1fU4*l+a١ڱAbCkdPk??l_?iHw/yw({/uvqNB, ^'tq1DX)ކ=pz )lbiM&ʛ*6BRAbņLGW`] 5fjhi ;;ӰSd:PQTjM#/߫~osi+rZ1m dX6QX( :6Bj,m5v+ !QaӹfuI ٦ÈhUCEQTJSJV %q^{/w=潮l&tawb 1]Zi*Q,XSK]Z!Xl6pfʬ4T"vc)%FQU6t*MWGMAa6EPu رCar"T6tl(LN;+سA݆ 6JMfFՀtPЙl!;vJ`(('!R !jlÂiM ŎR E͆XX ;ӌgH`łfC"#xA`"&H,$DS;'Hu:TY)ءЬ;X""mf :٤*EjXl͋QECq6Qv(ͅ`N*vttXU`"iCG 4%bN½C׵+^dVEaqT8X :d :iqX,Rmv1ЬUwzvw jwR SQxTX0}wd ދ;:vT(<8()4;dYRUal[I/;+MFʪ;i  mBj]Jhl[*aWHNC/Jbf&VTU&3 &@&DE4*]IJPmAgwv rW䨫$ن&lPf͓ciXM4N@ LctYP4AMٰ](hbm 4Ѷ+*TM8TdXhiBJ$DMݖAN(r$DPݛdءN=(*p)rJʒ6l(6h5&1vM(6QUQGfv(( 8` )I,4"(iҮ´E/vg^WqNLNX \#7CT48bA ZQg$8!V(r^D@;ZV"ݚ]]^C/$*hqlȜ qVMʏmAjCkCf#ɌuЮ`B'*/E8c"lv,RٲsJtu&͆.XX4lӌm4ڂh)L٥aeݬ]+Pz=  8;R"4a]M!k٦lPv laZ&* uSʽMO=CJt靇Keat/5CN'X'466 ^p,td,-f8qrp |Ev i׷*)Pzx45p%<=7ap5T:yXG'Cc*Oi # 8$m*,:]ꜥQY5S`is[gzww tM㳦wit`({wk=,:>(=ꈝ9`t]٩ʜeQnzEٯhEsoEOwzvaѕjjk5=:tFx=:"vN;4t͖NlXhv'}-1٧-5,u٨鎭| %8HM}%ZM͙+NϟWtY=tXi5faeE;*q޺qX'(%zoӸ(u};סӠ[,Nsz*ҕT{6wD%w;zOv3booN Xju:q{^mgEj[ӲѽSbvUW Q'!Y=a"Qt;4Vv/o{N#aZ l^[Vrn%CmTޔSNK:tNA"yӁ5z8[Q!OoGӧB;tC!uE E'S FgNꚏS{Wޘg)U|NV/K>C=NO>\%tǐblg{Jz*zұUnLAJ{{:`_^:9c'EAzu"/QtzBctY{z%w )ZۆX6+Soz]*YzY qmlGM!4Y5tUq4FO)ݩluM*qKۡ҈3.SY+-y0TԩY] Ӏ蝶CLJK3mWjkJ\ 6(iL8UUT{KX)-WoeEAF;Dٱ^!8UKJsì:ZiݙopPew՝YmqQ 7bYSnʆ!t5"&j+ }31b'y)j84YeLhTSZm_tNJ}DX躡4RZxïQڥ^-:1cUNCB|ou'am l++NNRPvՂZ ;xO>d=KQ{ҴQx٦=DPZ[z4GF=O8斑lQmӸ 3 %-A^㨇XYmlRކgTFP(#ǖ#(ҩt4ZRTgl6Z0^o:xzrPbѦ%i[ihgsNJ_>l[=ޣśKkeDQG^jHJ>,(+g7mhZ,b2Zwۨü(1)lV|tGT]ÜϾ}{F(޹X"NJPՉ|{`N%FJʋ~!HHI!$!@?1X?̅ǟ)5} Pf3ocpI?Var󇰨߇#p]Jr`Pzsت5M31 \_ 1~usqţTs]f3=<6|jEDYN}g>ejPntCk+oŷo%QLnr#sH0G#׎e%J&ZlFRS%󮔐r4@qYmd1uߒN!u EHICK3:nc |RUB i[: n^olMZ*.dEPm(+*5ޡ8iǏ>h=crk lAd X)ϼ@-ܶ5Wc0&Ʊ Q˺ƓLXTTJ')LctΣDl]{DTQ,yÜUm-e7iyǏuP'_R &q**0|T_!uX}lY Eq GU\9kjuT^M;{g;aYYYκ ~y0ۦY6[ ?"L1PWD;r9д;lk6kwv6!޸14Eq>xf4vU;yDW* Jw&Z>dukj҉HI!X$PZ~O>AnouE[jxSZZ UZۼ*yx>e-LF~Vݻ֫ƉP  K;Ns;! | `, jJV*Ж1/=b)&z!FD>dX]8ťh$h2o0wģ4ȣW{y$r*ms:6*)ɊNjkcbPImEF^>ko`aɍ"+v-^V0h~Pj3cB0eL*O!| T3|Ϙ;bjC,ra=M rڛn]y9tp CnbH()QI>+L}p8 I>Hv并RTq(6,i(؄ ci\t퍮\*f4XQO9hVXv낰X8^<)NVSF .]Z3!YM;|~A`BP>K{ c=Ͻvϵ^.߳Omw>CͭKZ]XֹPfء wQm[kVwR\A~y$QZ}r>wwBpZcJ8 YtNEC4ƿwn}6>aY'P Xk<\fQOђ<뢐$ j' *匟7* Xh1jR܈q7R)jZ01ʬEN1 |dC+-BW7asV <A;آݺxX7R߄dV5tУIQ(4Qv!%Gn˷-RI;3VҺv ĝ҅Ly'"J탏RܺZhBkPG||'Y̦ ,, WcTThE2\)4yX9i" ! kKlRZȲPzؠ^YCʹFk"UTh[y&9T~T]p>8l$[_ͭʯ.D\F}M N:]vEOZƖ{} }^i$䂕{%Nӵc9Mv\ 5/~,̢$z/s:Ƽ\~ZFحv UAJ% YĎ8)lws O2IěT675RfQ\׍r$`g+1\f\xjQg:b""zӯͶ45 V ]R4gbd,֤YkK*޹킯4F5n\ZRηf`ьlaD}[.}'MJIU x|8i2bu:ѡ8z]4qsL/=Qlj>@ d>T],P=ig'*W6Z(ѷ\nد~4Y-6o:;(љchs6wmgݾ wYTȭ*T j E:tV}%l%E,' &}@';a&3JU@EDy]%o$^aDi AWgZ6GAfv;Ģ{V87g WSsD񙩚ңׇnpc_c,)sRSAH QUZ8*P]ػ1MsKj=`)5w/)[CށPL >nf;QXgzZ>pu7/-۞;KރQ,9|C8ª V,=c})ꯈ$:N[ !M*tJ R 14WUwދ 5s1WQl]؞+GeO8F:Wz= u Lnp\,QKo0\wNSE,;v9Fnio ͮˏ;`}0\'7JMFqu0wr -z.:] kM雀g)oK2cgcSr |Y4wnIlJOyt[ߝSl1c'}Oa >j9l73U`V5.ȏ^u ٗ0o2u(-[&XwQ }Z!`Qt~zm\ӪB߅S>Q-su8OykBńnE Ų\΅jK&?`+ihXa Ec&KBܺ"!**6à 0\3YWk+)&Kވܙ(j/&>wW>vR1lW$q:)mVtP!k}3:F\؝6ԬkYNlM0& YQ*g*g H7\1Q,麤Ҥ #r(N0nnkT@p;&}{1d|ѫRk қ]Ŋfr3M˸`yzY{<|-Z.O(ྥ(lj6}b!P)ܹ0C+خ 0[iniKѪU. +Y7AKxvagVvB2RZL{y E^q7THI 8z63wuqSid :@S9DcV%#ha+$IVQ=^0fyā#U/GiEsOIAbu])N0=壔QFeYF'L=`v2o9e83yడ! D ^ZNH] [{`xU1.엇sܮT ٛ5onWjzQܚݞc yBC]&&gH\&\ut? p&z  S.NznQ|n9 Nw!##4k⏶쨢e/mL|w7U[v0md& )UݧP׍T9!Z× u9k.zZxAd^-|>Y9:vp=`qnH[e;#zq{b~eAq\/a\G&59=žڦNf߰_.0F.l<"'rzi&OݴOggEOG7՝Yb=ǥ祽 AVVļv': !aj12xȓgvUI8C7TaܺAqwtm JWfHXĢo]3'S{kZoún͎::gnMn86Gw[=۶R"!hV^ش˪4-cc [pڼyI&|r;õ{pffӖtuJx+7돝Gۻ;m+.^"gNbEə'_y&P{L xg]kȱu'-q#w&OQgtBg}v*ft`x-ж= ny1 l--:}:J«zK&Ÿv[3q?6fg}X }#oA\E<8: 5!a\n DtlMnt;֬sxA/v"X0qo2Ո9;7aۇn nBL[ڂ`WTq1j-ڭXxpSK~un~'[nvjJף )^X<=! ?W}f\O()_k^Z4>)t0g-A^v YyosϝQ,=-Am z15Xʃv (L_6tE 2)Iiͷ $g8νzÂts8Byl:Xrmɽ<^r("&/ܽr}c$ICPXFűrQ&|fBsH "<بܽȡd* 6\iY&PAH׬ۦ$<, Z惖bbLj`bbC EEҿNOǨ-W8Oח֞LkSwp!+{~]'HC{aU{gU#![˖39㭀b ƜO0Rι\j2T/X5OָX7"ɕ|Mvxyj=bXݲcnmWhmxۅַ*(rHd$8$[svUq(.R,^RY xAALEudɜhp-mepeCAI!RWrI!!EPA'8,FN&~Scv; 6oi+n\Er~͋ Ya/gn>srme*=(Oݑ#s(r=~ֹӷ]oVͣTjHms~ǟY~Y&0&2)'ܡd  ғAh͹_욒M0)dJwj V-U2 DEK+,QUR)hHSmT ¡R$@ y'zsw)aͲܞEp?S~9˥C>fTQZb +tҍ)nud}G)q2Ȏ'uMtnUsDEI*tn=" Z嫕cjkoj޷ccF5L|ܢv &,dsN7ޯ8Z(6DujXZ=mUʌߕ["Z$# TPnoзk56#XBSyL`T9#Z(,X(ŇB8QeMqtJ@()Fj}Xn&>(=~k+r r7͍akޯX+Ie'ExmstNu!C * QE!ҋYÜ@Xybs,Ą PlN0%PPb6sPEͮ(k~1 (1D!5f"TH QMm?'PQ+EjQ0VgN]qpC__7u؆Z$QO$s7 nTUq<.`:@oEΟT橮=wo1E[l)kȷ$OZ2y. ]YQUx[&{D o2C|0/=/߹^|TUWmʣbUlFѥ"DDM!j/26w]"oxo_YyLLE1)Vj **1)~JOSxR*h9#"nLUU#ƵXC'z.V @C~nn?fq/FeBUbtqeaSͩb˙i}fLaaXZoQMj 4JFywI_rMwFu:ZsKcyЙR|iD;A7CXM!Kl?s37hT)Nzr(&KvY1_fcҡ׽ * p_xA{J[Xb3.[yi>;F"`qAWKUs{]Q&;P w7zt=1n%vzf{\k׆o{6u/G<JS'U$xp$^4s#"R^XvsZ9&@C1#r74y)wȰBM*_=?{fmzh<.KPp(֥e`F>ieW {P w}=O9a cqX͠Y.ͧO{)ei ;b܄w48ϗ] g s"e՝ K>9nd;ԬVvs1V2w`ܭ~jk#Ƚ'Dcl.d m{l^1qk!OeΏ˦jn(c;qe/adgaP=POUKNA=s*]j q(c#64  QY127hEK"0dFi/@tJGH6#mߨnOQ`q )xo1 .R0isGL$uBei |C4- 6>N'8 |6) zrʱH+DQT*0U8d"#庲^g0x&Y )|zIUcc/s|r!y"*nǡzfj\RF 4xیU~{j_Eo׻qji, OqnAC\}guD]/!t*`˯M+I0xui2E{U!%ża*:b)>ιxboP@̒wMKw}udaz 9z>);-|;}9;n3w=:y:T1w/UNp@7"O}:gz'Mw$뺭9zT{Azp7+s=&\jp}1oܖ[ _IIJwi5[& CuABSz~]Ƥ^|pMSxhz>Z&O?{iC|]}- =gwS:Ơ\st>[udo ‚7e1f1C}2#7D=!^rz\-wg#)|tՔM >%cs^ureFùeW!]^f,bH78롏N4w=Γ^=[;a(Rve gob<(DQ~H(\,_0@.D:g|^̞XϧԳ5΃ fe*֝D)B#Pc_Oi㲃f$`8Rf=Շ75]e9wg7}9er$>nMU=;(y #eA4[%suTRX)vez}KަXc7c| *ܽAsu#l @?'rי^#6 U0 ne)J^[<*y8|uzrf9̊~4~~ l)΢V73}E`TUDgO ikf0|C B@!R-Za2Ps,dp]Ŕ5˘(:خnF}*'iyhrZS]:bP$4"xb]Ϧe2,82O2CU(* ~}T|oˡ'f7qN!cGmSz5R~Cׇ&Ж-qH;Gŭ"l}):֑' _ ;#9I*T-GWd]o湵2A3kϻrOMjK1 JvEbY!Y@Dۈ`)&"(ls 5Tqsi>]; I"EQ[VANssІ$ԁ2O+ZzծTZ+&" wjw$;!BڣS2bVP0Q'UZ-V`_0F9D㕾ҟaRC(Ǭ*iQBO?8Ryyx@,(0uF/c")0䭦q=Q̲oړ m_ݛ<<ߓz*cIDAޅw.isjb> ??!F!нk/T9EjU\mEEQX-\أ%WFhs77Q.WQ;\.b"uV+Td\@8[鬞ʈa^ s 4;FfWi}o4s5G<ӳsdkjBYvvmc` HCbv`xp6.H9S':xX!iFIm5vi^ŕ{+r YWi=wp9xwvwVBaN-,=9ssԓn8!+"Xc\Ũ-%ca Dd뉴_˔ s1+ ֶRc8[ ssgہ%lDӧ,c/A>6@exyC "j$$>d堺|TUfyKmqŹЊ0Bnǩ: cV '6.7:ǫ{jGxҴ '46M:hS]+ܗH}w3ۻC A~`YO7;m0"O! IVQ1i6&M1WOnk͉]Υq1!<CՒmA6^t$Qj^*+_-+[Uʨ,R&?;$3z<ѢHso1|'"'̥Sb8;j8PBF]_T+tvSq&*I_2C0)H@ ݷ5S_>C꘱kܹ9Yc֒+T,)U^F1FAk7޿o1̀b(J/l$̰X@XHd66 `x/J;^E5p#^RggeOcH]FP#}H&C',zdY^^ؘwV}JlzۇٛyuoUL9Lf3oJ*01$"oVPמN]qyݼʷgr ؋78kŴ 2')D^L`w{'QTBZbNfzgUЋhPYt1Xd-*Ț:&:kbݭ: kHW[*KJso,]}fo[yzOBݽ 9POws^ F](E (Ĭ6Y9^^L~tX$5uR˜pN0!CXxR}m~o;Dql}ynNwMɏ+Nboc^<0k=zt;b _]|.7i\۬bvR"'JDTNeA(u da*mmL@Y9Q*[Mp݈StaKuTaMW(nnJ&A5>.TŜgC1Q]K! !3kS1\DZ*cS3qV k>rOXllj=cMDw{(D=>O\' 5.WDȫ;6EJfR/ă WPa 6GHRy#xQGYl"%+kJĭ0&; LHM\o.+ D}plqڄq IHYې׾PΆ)ں-6ÁȭL?pxNע\7t<9k癣 a~)"LTwbtu[{ΟvmVl;Os{2>C!Y.Qtb洑6ю"oAr(xO:LܺCȖK)8w?mFcL$>-l,f*" ~kgK`]q$NOb%<):sӤũyusU±koNg]th5Hw)%a@vXi8wP<#oM- [beKܣ{ONB1Kp\ӎԊe1_ }58j*eaKD#%δx*a ǩG[\Zaz8g`>٧;T7hɡ6ehV6Zq= CݐTK]G_% Ok>櫦CG(}/KH+~{LF{'F2C5sfh"7i$b5 ˇm=i4dɩL3QG!;S c5e5]rvNgh;i.:n{= b.Pd5"t01:r\:PI>[uc2«W YpnsֵuSrߊAc7n!T;:ֻN /oU48yrjzdy*ތ /Jy^iFc W+&CKP;wYXoZx2\C0>/z6NZ++5Ew;gnˊb'nx<f9;'gU!Grwl{w!63|dK;/厝ssx8(P1vHZwq6LȽ/f 9SzN,^$[/:#%ؗRt("A7;ڧZs> П=js0Fqf:no98^^ն\}kǹ˓`6yo@>W[Gz뗬ȷ]=1?F#OBE%َ/ggy\Uݿ.3BŔy-Ôp@wNU:!4/U؉oyޖNq\Yz]:b0d7-^r[-CnDCݯf!$oCjnh".ؒrҁ] 4mj)~hvf=l* l`[u;-٬1ffU L&Jmnޕ ԇ xCQ}FE;/Y* 4{4$KpmK:k)\ /WdZ7=߄kfTQR{mg iOg*nώNq]u~1cUmyS0Q-7lO^S0W@dS.K>.~RL>>e}C:.KɁ} ڲ+rp{5on$L"B컨10q E|l⎃'"S.i6JBdY"bDvA^b;R"9RSjݯ60o7Ɖa6WJ;vGPP1[{ʕUFDfQIHTi{yo9R>-ގv[/wU2ԾJYˎ0F}`]w>Z]<(ȁFY|/}y=b+K8Y7 pF_|d: An:LRǵ%Y},qyg/=TleXߩ(+#ݻ嬂NWf%,LzI9h/˧9޹eWW_Z4.癏:/6R3 Zߥ+nN<C}r,:jݾŸzߒVD9n+&:6O0!>a8,!NeU dbB),?wqPw3+`DTjTPZ>"1s&&e(CqQ(,5/E_|lI( 9+c%K!$6OȌ)$ʈT'J 5N T8M%XWf{ԵmLv /ջ6SEk8Q6o kӮ#sO!N T(?4NC\ˆ|}|us)8'*վW-ᢉ+I~ꈈR"AScs9G[=1Mzܥ{OWȤemevKj3)IB}&KoUUsQmE*sEh6$e1#]+ÊR7rCZV*ABcFR;aEutx_!ub$>(LjUbE"?!ZxKUzaЊ'tʞU3Oz4WO9yü~r[o_!ٌ:Tm-pQr)xPi:a%Hu져>;{Ci76k_Wۘb+*ŋDt. .Ub-VJ_a0ƖACVցt94$ ] X&&j::8 T+XڴaB͑AW?4^Ϊdd ,+;TכuԔ~NaXJh%;5r!DG! XMt!-VVxLsmBy^`P^XK.8s}׍JeIaVWmTX6IךP#`)wWRk\zp;~ (E#^݇n: 5STtU M&ӃrURf|֟H.\NtI~(La+ 8C3,AE$RE2EdLP&ky +9eIR|2R#^yAk+ܱJq$˙E#ҩF#! '~*~rׅ0J:'R#.k|cPJ*5 @A+Zulm1[0PCJ hsXbt);6z|dDKIw$!#l>qWڱmbՍۆ6k%ѢGw(l#$fc9عt#Kmpu*pwБkS/-% GZ|0Zm9-XV K'H@7V9컛ޝŵoֲxj5o;~x}m9ۂ/_q;Ó{yg'IadQmq+֡e{~5Yc v[6ъZ- W# tوi}sYiPS%1#+Kabxe[7sDo*?w(B b!R,?$#ְZCBDs,-yj7hZ4V᥷7i^p*`ܹTlq1QU#mKP:8.{BH/"".˹bPPIHICU!Xō~]A{o1 ]v.M$uݷwm|H~N**5Mx)~8-*#6Ѕ3^ViO_3 Z0RCk'"L^cW'nr]B9 W1_}%&;uμv=6v||Qd(=|vOc^t';KػL &3f#Z͉SnF-Mh0nzVi{ś]˄/#t"~tMw5reykpVߩ5qnEK`}R"(xl:ՈYo3 ,1U@E(L VZʯ(A6Z!CŰ1m t aOwnNqO{Uvoj?|O0r.Ѳ/<@ ӺpC 8],D3\ˀ'$ޡ(xoIz" +IȰY [wMX:`ȳyL XtQS9FE<0P Tr6bv݄I@!%O17j5s캧b*.PNe +̭?#ϒ>||Ӱpǚ˅WBrߢWZSTMw4.v7%׽Z+Œha.)EjUG%B)$ka8Y'w%c!wŠf2&M(MuG_(כ Sr]4 VB#eH@)eiU_DFH*&mҪ y)R)dަ 8:`/T]fĥ‚*n͝i.כ*DdײzvV֩MKYŇ56~w}ݹ+k+V4T|9X; XrMkN,5Ӱ`1]6Wap7Kirk}F+!bLo"emj{34qE{m8.*&HйZ{U3FKu-D賔vӘ#Ox 9zRcӐP2ZھNSHכ5LqY4{μE*-# XnbqTS &#,Kԁ}fuչA7Tbj7p}J5[M0yR$ S?`pJ5b9sQF zgw6|".)N4N2nrgv@,˞9ǔfm ^np Y.]uʞ.Z;?{>ڀI+fzUҺFe rY3ӥBWkȌ`m!tUC8l61VdΓ©R [j}K@Xodx%٠tr)ۤ͝n-*jEs:Dٚs"jMܽ0Y78vOB{=q;y+Y:p yz[sD8Ln>s"y[NΣxntEJ`fxfuǕ&;e}prr\,^cV;+`z1\d`K $>i{:qDJu`kJyN]Sd9wGGda=tMTz=ZwUxRiOg8g^v<L.ΐ;כ g8OM[[tz(snyofY"piȰ}<}觢YShǼ=Gt)h- q4gOy7(ׁ[~^6;oˌݝd:S;!slYTzDxfU7=녥1IBA~ܼ̓a^%kCE%N,eb2DE?mt9f֣^^Xx8w|DyA3d O}}޾3>9$oQO.|m67C^{n9yUI/sr΋FOiR-pPDsgR0BʚjBN\;\B.W kY>}3/[[O{CM]&b^w^BH*c)+ӑ8<<=~xwa(ЬƖbخ1<` )hz~ ۼY@oЍ]WQAZa\f]3C#4PS RQxmPsDz6٣M9fNԵU&]ǛS9x#ڪ9{ ׻f#  Ojp1wdTm[o3DS Z;J7Uo]MXveGdk#g|ۧGKR(KDL= QZrIl/{G!C̜E;mWd_=E[Z-S.=A!`61zyk]T}hSEnM>aoՋMbj'>i_[m({;L6^7雄02E"֫ے{-*]ǹ)  AdygXIRI M@+^+Qi bomU>JYAJԬATHo]wVNG9bk#2WVbVPi_I sE^<~G>f2ܦ֖R[BD̰ Ƚ 8`&9ޘu_b ߧɼ] YSJߖlaxοozZ[#UrhTsVlhѨ1gƃ%1Wn똍w8rwe9e88Ŏ۴c.R1d:`%Qhl[nQ]^-W92Ȋ{y3$uݣg\:OtRsy.#9^]ҿ%sJoQ[$_L!Eü|]z ybpc^6 mQJ%nLrH`[-O|9n=;]ZPcuI&}r^=2&0P!_$1qg,o;Uzo[ccbܭA6r -\ @dduҼ2wI"R &p:J48D[_[JUvފc45MS p=' |Ciktt(k UnK+nݦ/p"Ì}g\zrwro^; jJ5r֤G~!!8MƯkx54X*֙Thߚd+w?xUԪ'ye['"BpR[FTHiyp \TQY\Kn·$:~`~~p﹔hiwjy 6ĀЀ(`X~,i.Bo9_qQ3!*mCm& ,WIauV^!*ONz{㞰 Q>N2b@h~Uͨڒ1؏+xNYXAb,ZʞʎLmRU'r ANrCm '!_xi:,UBҢ{[[hlRyKjՆQJ Eg5*TڦnFqmje(i^.:\:ǖֽQF?ʻ{O5{ m *W6*^6ۑQ_\6dC!L^u&I1ZhLFQL[[08Zg٘Srn7[.?*^ɩ;VѴfV)M/ c=r2k]zeߏ6:SYoܠ׎#s(aG7W!]8~< ԯ/,{5*zITeBSSXW >^0Ē,jd10X4&LqAUb{K&Zk0E1R4Vc+}N:is9PWU(v;] jW2{>6QP׎#Yp$!"p=nZoN,X\qU aa)kQs5dÛ8wqYu`X(lGSy=`qoͶUTlkն5TkdڒDh,Rl`ܽr&[ jb(Qni1>n *2ܫ~JǸ= 5U9ı?y{Y &AJRh<|2Y^e[Jt{0y2.kt7@):FC̭*v,^4mBS{9 \hp+ qw]El>dd5$!Y`c.Xɍwt#Ox#m1@r<:Aj7a|u+13&S#א"TƩ׼7k'Yy}es[-j4{\vC Z*Y1TUSMB@kG/w9]P`\gO8^ pV3=Cvvc,mj!F98+n9vZ{# Auȹ.47}ףaF=2|+e% {0ͯ#`;KF^NMѠuxN Yg8v-:񃞾lDoQV>۰Oe.4*saa8:RW_yXF\]'v/(}9>J$Nw0{<)MS|BGU}xr& \|Fjq/ 馻0': ,חQ= nkUGn,; rKtefIC rqk]%J\"O:F'{g  ͽd.lnX`t8_9Sϫ=dUx#{~NdIdCs[rTJ =ȇLE#cfmy6_| /[v:y!T b 24?P.MLΫʮ7|wNwr)MyC厜^VUHuupd dro{#:K};,!vR|>Ƿ,pߦӃ9L &IphHj*cN cҗnHzj`nq˹N)\TrJ{2͂mu^z7Wmvqn,lvn5M^.ѽ8Nmodψ._46)l \HfWDe% 㦃vIf/{ʹ\N_9\.LXT PUL<]JN/v.kuVN; cv#{ Y\Y$s{fKCv)v372|]-qPyqCpwKH'Ur#f5% |,.qXhsj)xB7 ʶ!NVȳ`|_Xכw mkc@~lL*5;yw{.i=g v.MpL p18i1?4h ;^o>:;e1QVKxU 5hi_ I۹9;!pFuWcolCZSVFl>9i5._C,-%<3G2gm!"Mg {sBk#CNQ.编lʌ`5~ XOeE9ˎfjQ\s:KF#eiݙV#fv\|A$"85.j:Oݓ!zˤ.cpb[Tqrj*]-TVfe(;)@r㼸3*ql܁6s19ccg<*AV!D &3ej{@BЧt# %aIU:XXs0b2t- K pTTo|=u2ɣnH`< n{{'8Ƞ>xoJF*\'3fst+4c<3wRu=y9ڊN=%G%yb}H̏4Abǀ/.j5ٚ_hZefw &׸ {ڝ/g`yO|`kIn<[gp4ND]|Wo Ujo7HU'z[^ꌔ4N ut)24/z O51LY7*əz{"{8%\)Sx4] 81 !p72f8޸P[^ LYea ]f,vd-1kk)"O'e1`&t/.QVqC]9vc7kEL_2͑Fj]ɹqӻڴTLo+/uAQ}YOpn9Rkz r=R.o-Ő k\ՠ ||Xrz}J͚bkѸ'8ZJ9 ;b#cU,uD55d`niva%K=uV $4lm'5֯iө);Ϻb~Ui)=Uy,͸l'dDy9i .Y;]ރ|zlILM(uft: !pۢozq0{ F 8AN/p缎5I<i>pY*1z8t%QvD@90ٗElvvkm4% pu`w0m޾6O]!ե zg'lK6dC{xYA^R11it;bDV7&D˶wUPfVʊ} t=H)gP_3,d9Oa‡5MФ"ejw(%% Na;al?O)FA5E*Sn ' a9/@2tµn#J%Q|^SuDܸVi0h|TQe ysjc[ TMmF:㎎LI$HK O󯔖IGB6Ʒ[C4M* Saz(هO)l^oMO'Nҙ7CTYdTԩSQg:c2(AdĀTSbů;Dlok)ܮW.dmZVVc*|sLƱ-ڗ3 1BN}o_ͿYwYb-Ѫ. lpc kXߥ)e+u@"J"4ߔkANoíNU,Ϝ˙aZ@P !Ģqg5OC$_*Ad&1 $Ā Q+5DBwxu|淗dݤ4 >J֨M4b ':vJ*6Z mmJO n" qp̉El\'TNmdַ u8M8-NRrV,76v㻙gHN[{ܾe@>$+T *\mch*(n,*B(Ɋ|yBrgu;>5nږD{Z(W*ynٸS3~!*pg#5 H ` dIĒxoъRC'Ø 9K!PU ą5*0MMAcݚ 0ڹ2qaׂ> Vjڈ/B@䟔/~$^Ks[9AmޣOVS&g(~Hy3^Uw{;FOD}z>xtR,QeZj#Zr} k$!Xƃj-|sd nj*Rҥ+J-(da]ɘFcһ)IQcƼˉ. '-A +ӯZ_hO1$x OT"9wI+AY G&a’yď+ (PhL5f(Kt+$N߼D) z+kroN>0 PROtK9݅IJaH;k\+^6ޭE[ܹg[l]"+wؼJ奦Zf%nc]UF1ϯS}{v ( 6NTlZks9$>I1%@N%E#~ϷЕI3'-B-(Ku燠}\}Ý 9d]|Q؟\oH;%Td yb(ʐOOt6m,^Y$n9ܐͲ{M]C UOgd^2GE=q>;t ccq nxTޥj{;`Q5s;yd>!ʗ6qG>ܝqTw?eMod'+|V7SkcWħ5*1f|xVmcmnu){'?M [و6z 6ےABụ̈̄5p\T|fӧPy 3E溲vhTw(ᒭ<.S^yz3U{Gy%3\kU=e|Ưz6&./Yd]_.[lI{LRW-U9gqR/'y 9)pp۸3Q0vsYn;!RiL,3&s:9ffi$0k* u|){f\.hR=޷sF<+|Jcτp2-kHq#+.oDUzɦ!c9>WRG {W/MF;^X;CM-k3#_#(+WF$i]8@#8:8$fMzVT3ۈk[v019"OM.A~‹ RH+_S@PZ<," ! \P0z!ΣDᥒ^G5%JATqE]Q;"NŒ^b{pћB UqG$ol b%f<Њwll8\Άi,hQE6+źdQpaC#B]7qGN*KˍW[2@ݪbI 8h; (-ۛ2BC;Z/ %8FdWOnnPDG.kL?i+#Bf%S@ڭʨ&`$ek[e!Qv6Fu$ޤU3gX;K>[m8-1@lx rTe}KAnc2F4A^hk@, [92!fo"Q "vz/Y_n=\|b #Y/_f^)F=ѳ`(Bqg_wlvqD↕ eNnsT~HhWcsj_a'zgN+}oqz ly>5UX]Ս(2  r0[}\.~']C;ٹѾBZ-IJs,"׌s 8Xzw/%V}Z]r{W^Z6fkH@z9yGP]Pa5YΠp" Dq[4 A;19 p#~Su;WX~'Ew}|sٍt.w8U6h)| 医|KTnYrォ eٻپ}tstdÊm- PaǞ 7Z`>Umo;]ī9/^33p:ImAZ>:/JvuUh(0\uvAQiUIz?/\f3ĺq{n Un8/GQ1Ȧi( p;Uqy'w1հs)mY o_e}yNMBalW.ןozdwU&mT}84"+wF\vrj.aҌ 7ӞY &7p;T$4FnX_C݊[pFHRCGnt!IcvV-s{D@7B#}EQls9lz0k$ @ Sڕq> u-}f *[x@\aM6g7DzYqwaɷ2݅}|RD?˺-&~i;ݫG TMBӸ10r/JWBRZ1no >4G|~D349oҌK  kމVfF7\)wF^;uRi }F.ꍋñFz/ʅUH7n9HLYé lgC}]74)}!KtaI`o^=`p8MNIh0͞9|1.x[ zSyBf1y{@ʘoVkW>v'0',yF^@AM5 Id.3%]s;I S I}vuyanRNMsݫTzC~恘JmcMߜ:U[s/|wIY12@AC!ToWʫ6S1x6,s)D$E}׍a̭c |Ø}u?-}jɔD͸ָ1F!$!V-k+x.j(sAUmȩ{fYU(c="aL%˩A-E~@oh&ըqyjz|O "1QrUi7n^-sZ/_,[Qb׎g:ƍQE<%$D롎Ghewn]>o;獘xw:%$])ŷ[n;O3Ѕrhш/;u _b۾̜{x  S G1 ʛbl9YW=dG@D Ԭ:H A0(`*,U$ : S܄AA^ Ҵ4qU;Hz]nj"Čꡎȴ*k+PGQkv a\ɜ*ikIxiy`Q_ӗg9":oͭrEEWʹph( W9C<2+UU1SsUQBG<Cȥ_f`(HN7L-X00AןdG~9uT|je}3[/6[U,A7j%ö=NGpjGڒQ+ ۋ:q*ަa<Ȱ曓C&N!V_5v*Mb*5\VFe7FQ-ee%;SO[NG.Dӏ52Mw$Ҽ8ALj[ˎ+ Vs3+Rc=M?퀿/L7j<1DC.&QT4"r&nᛕKxh6[ŤV?q8Ȣ[ Vf{^ eaY $_nQDUF -Er$urB+*|Q+bR1'6QT"sTt@4HJk%T 10I6~df~w;=!:=hȝMMȆT1ɷM5K`G{! SZS.`w9: H *Bd` rW}vsW$wn&SW9F488ӈqAA*Мu:03Hb goG!g4hO֪~u,93ۓ# `($^fmV+Md Ar Ɛ쏝~e)A6<-yMaHd1Tm_,$5qsTZZ1,X%sKr9RU->n6+mSs~D1̓v&zΣnRSkUC-j?Cۘe_pЩᒃBmఅPMn1/B3#r}A$4=FtUpvR!Y(AQ3WoI^ '{<-cXh"F UbZ*LXUjT] wJʄ:]VZz53󼖕*,UDDLwxϿ}p !iЕ]YB;"(t7|.@M;yyJN=Q}8s3x{u{ !|4/mve7sj=gS;o(+z[Nsj}^c՛ ȥƮaǂe47=GLpk:BREڧI)4gp/G1.8>ɪ3^ݹvt6$_1豥2a)xᢓS(0PF'{عw2}ӄw!&Z55>TɝluϸmI snw6Q'A,w:Kbc{Gv&+.x]MYH`v"7]p.p{UNy!,0ɽסfW7CQ?Vm+φ1λ;^fpZ˥y7'7 u]CCL T^ ]rz780BB'vtdȭ*¦k4VK9z[j跔7v'}= w6pc`_7]f$Cyl^<2/A=z.-BZɵ80'Jo:v{Ӟ!ߔ"۶^6*86ρҹ:e] Q|[ :Qk/quƠ1 Z_mpc^`ޢ1GVo N&0DsMH /vX59%Ġۿa *;)|*@.sf<=#AA֡ )OoYlPE798y3^i޲^_M6Dvnjʆ-б5͌Bj a{,7qphע4$1տ'. TlX#1ss@W.nk@i;u'i/"S_n\-W|xgwtKnY:ckRّ&wۓܳd3w'ɟ46q[<14{8w#rC=Y/>2{]KZ}=7MAl=Z4*z#3)0\pnO ^h 'ds&V^nb֜ f&GڸIruw:v%2Hި&<VW4dM\2`1]EjUdf~ܶ·`^o2{iY77~͙Vzp|˛GÒdV&jHd(FhfҨ N9*=u{ L߀)sH̜nfJ0%.>QyEJ*: e4*!Ww;F<,EQ{:fՐ, ! _![~bXR0HB#_V%DcTYT.!](@{5=p()CizmG?9]΁x _ A yTG7D:)DOZ:Iz@P!VHg$K:("2ͫHNR̢e\Q[nY2'bTE,'Ytvm |Kq| { **,Y# M"r&#Yކ*.,)62 @T0(Rwvbۧ ;ga/)2MqzUzѝt KB ajHbMR0ߩp呜Roޫ=`7m&{ AaBIvxL!} ;G0וd1xXA]h7;̉m@(F]FSuxҏk,X@XE;'FYa]7.1nRA!m.(,Ֆ%\O ͂5k7pA r3郆I_[`|όwv8ڧ ǬCs"J5Y{F<;Et[v?ε9\i#PVhgJ9iu$aǢ 8{h%n:Q/kO8tEa|Dxi5MsFmŨmK@P7N%cӅ,MT9݆69bw5剾1nslLjϖkc3}cı uvf|:@{,!ӛ淽gEk=pdC$g>؆@+f&<M#[@IRUi^띝'-I!!Lk]wǠKwfjH.}d} tI=W60u)IIn8w+9s*'7|yNEoG/Yc%BWbևFVXypu$KE^ 4lLF\Ē lа]'`]L{ԯCI^V;vkJ_Eh[ 5`/p9s7~ObN(fҬ,*[@ow^1ySnq zeTg%؄^\{=b:;}kppkFxw-6@ g|{VdAz2C $mK],4M9Jl3RO׮X#oL&g) $wd7&ݝshN2{u=oGw>9/}E+{4WLՒ!$vbc fyq=*7sD{:ި{\A0{utuRW[ayde^_r"0qF W#}Mqڴ,g %lZ[gS;!~ *u{aӦ{^_(WVKzP7rvnRãi-u;N-wcbVD^N>WHj UL:3c)i9 z)}nǾ*E]}*U)DXw}˕r^dcs ᝦҘozb>ۚ2DR&wOL=[:GݢwSzi)9FF2^#3VDsDx拉׾r9u1XRG{Q3aR5o;v#j-3Jۘ@$f Z Ȳ^x+.{C^֑vb(c#ۏ @!5 3&^\܇PN01$ 巋hmP4I;yܮcLci+wHIUHM7ίhO)yw^p,bF5(mU)PGp4kvD ^eKQ\ mJcmVQ;V {V"6WJۜ繟n{l6 )Kˉ}ǰd>dI$XdU%dvڏ"M EˇqwJns["LcCQܹ;/]}d+`{k*V L` $>J\ t%L;խzLd^_2fOanmM@ =۫wSum)jU_ ~m?n+uBApzd2^WlULmjjXL[uN\]yi'k.nH斎ss>2%d ])PZkի}xUV*(j+%&2)vʪJ 6UhΔϨ+ )L^rs\N>Ө,We-BELxr֛Wg҈y]HQSUՉx!>H>FF$kNUV P"EڞGgmfݎELH`(z2`TgP3hq! jS娴cdwd8-"ԣƢ8̊?Z%!z*x!IT_.նuwi 3dgK ǹ(0[BNfʔFJd+!ā d 1kw[ rbT]apy^<2Z4bT۪pv(ӫ B}i:kPE3-8G=Oq=rڤ T4o G-::G^- q|zrwlZ %bi0Bm,>$ ,3Γxj5׿ZmAѶ-cb3NYAqYP>hfYҊ{MF9眹Zej\ʘQ?Is﮹J7"tt \gL?,ˊd ^fLߦ<Ϋ*"}×`k$:UQG֩9'Lj,E*MdzRU~[F-jbQgyUD~'P׋dԫumNVŸmJf/@2\*C|ηGw xC̚{'\j7l~4GʠA%,M! C2DDϾxn۷f1$5qeןtY-[EhhFm~[CX1}}sP=fsT0J$I iM<\*\1Nbן]9p)YT*-似ZqC7Z˩TV&-]|Ejz AQBxB◷9<+j \xUԺty8e=eeHE$DE3Ϸ(bk12@ R+\EWQ,m5 c}JEy4n6k֕Lޗ}ytET }&uE eh2daqf [л~}nyqfzK㒗){ tm{y|#XQ?zj];@C8XqLMmfj$uF0tb{730'8nvo { y۱b%}.w"kIJ җmG_HO0m6'+;Xg^ZҦ2'lWnB*ExHqj or@7=ܓ#ۏ>"p>mni|ǬB3o=7h?Fɷ \klf *޴(廢<8\=62\ӝw(L޻ݲÛot'ݳ}KfSf.# =ۜݛY'cLݝ3w9 KYR6}YNzz94<zs:g[V(&=|s) }͘); xxT;TW0yWa>c(Ȃw{to9gndeB;]Lfvw6Y:5&G=.Dn_maT#ktrd{ifkA(dK[wHźNo_d{.jIqB-V7F{w&1m7obԨPBt/0faƸo?#.gX^S;(Ouчei;nNr89^i_2c:\/ncl>JXI:ř3.j\xȲۿxե 7uH7|^Q=K^U\yO>?y@8kZ^G:.<ӡY}q#_JɇHExp^9cTw{(Nze+^9CC/) 'w"J_=TWՈY۬M/m %~%=zj&v,o XMZsxjGT(z>)]ϫfNP=I֜SBmF(YhItjM9"99[مfy'Lw ub9W:5Њ].ݯ6^LI4z Q4~FFtΣ;5>#%J}|:ZD\0ouhαrx|B͝ڜYuIBsz|h9!L;qZdBu\fqzt[wMkSsϽwHt tkxqsמ;QGmVF{p14XkxdkAb5 sx4[[(K u*bJd[5ILVYEjHҌ0aL}RQUmpuMSu]q8SV3ѷTԂbRݷյr(U*(T zgZiy\.?1rɚ֪IryExKа8DN7ǏXf,C\-c*Yv<އ5.3kE7d7P^b\DWNެDN5/YE jgy(a єԵӴlМ(dY <ɻH::a'J]9Ұ~edήxo X 0r!D- 糔:6yJHmz*TWjad}l6hRHͼ`V<״4MUyӡ<^Hր(]9F(ua-;ǮɔӇ똷A־S}hf%Obpd4*S{rdg6 T&:\RxQ3vƀok3 < 11MMMߗhQt"Wtwa-c<׆MŇQUvi9T䡱uB#/f85qP=\>_[P+KliYVuviݕ-r&a0>^jYͪ&3x0gi|g3YSft0{}_v*+g4/'IQ+7*@]yS]+U(Iuh L=Nk %5)6,5n )="U@v8]dh&6+1;WebmUӺu/ QM)Hp=vKRЁ/;> O#}2B,.8 k2 uBq2ّҭd^NkHV%v+xo-y;c-5{{Vgq.2gP<5՛ [{OОщAkx(gt[[`^}n ou~ )qԄF$:8cS棒#QgjT_[[y`&z3BwU+wu" CSg.?yE%1Px_,HJx[18j$1n$kt#6q$_b泇Qqz#O2@w=~^T$>r^$^ξ8F0'Cy-XE&Fn&ʤ$EVq{Yʑ;O%B$2kod[Sλ@M`a(h` 5vrN4X4.䖐A/,BZMYͪ5[M-"O)qSS;3J#C'%1GsΚ} Z$>xө96d/`Dm{Nc4Igȇg:c0c.,M\-'g;7eX-9î3T9IՑ0|$q \tw =mG;O$T8\oK3t5eEX^A&ԙ:mw{qбff;G۳">7;._CZn<[*hՑ.ʙ˯D֨nfg{M;[bcB0C^sBs+q mQ&u9͓FvXrkğ$1"*Q-J9xR1dBJT젡'DPS2\YLdrT`Z [n}CFZݱuk_7JSƢ u1JSFe)@~mr~)\t=YTjyҳlÃÛ&Ԟ{Sζ=~M5pgS<3{ws9iqw>L@+2) )W+#І7EQQ-Lq!k򣦕61Ivy*KIl&ZkƝJöh j2ƶW@gh:ZqO/ +eA׳.Ѥ"Ώropgf(Rsc^W3 |溿'eA|ԠUD_[ :1ayI%HC%CP*ETWDV9]/[65䨣ib/ۓ^rܶڊX,QG [>ە}/>8{{>A{L[Kո  -XЯ/+ 8ϴyN+t梨@ݧ,iF.VӉ}s]{umD|Z}vorI!Rƨ^;hE" a켥QbDʎ9 YUSģqBdnPhG%lM6̈UESVe$ i: }9.8. 66UhL\ MuP#Tvo8L[սGՆ>pDUsqi\mr87Bo^=&2on^ TjI]sXsThV)}HaC`+12Mɮxa O6tͪmF.2w3j5(ȉXRZ8~$g^ahOMf;Wt{lYk}-ߎBfo 5O![ɆrO2uڱ;1|!C IRP%I%-XS ^~ƃ^_V/J,YiqqܲjM<(*0&%0sGs[jABdP"r @ rq}7^{X}ȉntRiV{7k[Jptuꫵ.BBVebQ`w |䐢 f7-̖9DO;Db}hmQuc6%R#rg_ܓc:ho8;uf0%¸Ag@쟔gOF}R 377=]tHHYDx~Y$97ҧ&>=KBXD^GYex<<Ƕ楗rz"0Y%>tQII&0ѱ㋖[Nqib PZ`;nbQhcmQ+T4¶'!\J|nb{~~\hUh{ꮭ(6m!kp [[J!c*iᶅP>P[%ER"{_Ϩ dP!a~vh>̂;^Sל-*ڕlvs뮫ª\U6[9nQ)FE,ЈkPl$k7qDpՏ.Zy%EXZ%h. k:/9oN &`uXVmԧ7w+^'V[cQxWk7.$lRb. ;3I?JXLm 'RG.)FݒqkASELmAxl[ bZFE֧u}{ߓs.^kl-޹ML7Yp'e_YA=C[wevwV;fHI>u)\X_KQkM^8-h'br|`g{۬j#Q|E!tϥVsr,t`H]ήѕbpXfkrn _>}'8#=m=%C*E7e/a37i&g}/uZmbszrیVF!8)k)̛F4-5aZIݽ $vZj>@mɕW`4=u1$W nW*+Wt9z:ǁ4LN^Gnk#!-rх=y.Afs(۶U`-Beû| C_gWH;nZkoǞ8}zRw{c[$azhe_}rfo|!BDםhX.ߦ}ДsG̙PaU fCCbed0ɗqնن+s&\:w*eBR W/p+2ղQvvGuDv)x4qoqӕ%q}<kj{Q37!;(d|%_3bc|2Ljȅv{<9v(8iլUxVoȜj9Jwz^殜xw}tQzpCvN8 3^%]J7 q{iKЀP;4@׮36_GwIzЫ9!Sx%ǢSܡ&I=, .{&.q{=\%{c9.nxhW2mbeQC+]EC0FU&yR^yL Sb鮴T/2i(w\$4hyݷ7((8߫йt]U^34~,32G\YvvAX.6Y 0ۺ onTͻjTS> i793C=2k&:nHsdq|);5&£eܨwһ.a%Hԍ]f"ȠL9,wrLV=rqڕIw^a8u-+o.ˎ+OTV0FbwsT1Q&u4qO!Rx|{Y|vLIۥ ̑"%ל*zӸnUG,z`"a2wj˥>8ŐM>F Z-TQ D3iԨ3 %Ar_\]=OYF%CQd&vV&x6G϶2Xi^\O>tg,& <*i~кmwU:z`#+Uۋ$G}AQ'gBa_Ei.vf2RБ6*m&+\ۛ ˼M硽.M'toVٴruШgwލwm8fp&ZXؘq6th F9Rj^sl@GmDxbi.>"tN?}=04"-l]PX>dw$pϻQ"XߑYPƖ,!DGtWglcM?KĤݣ.EUL5lU9J[4 6dP.pY鮢td/"96lVؽtz0 _y-HOO; ;u7* sI[zzXoǐj̗HW5Oik,EgKo9ڽ1)<_lV[ mDkD|8qtm^7VGw9j'yD*?ez 9xwjMbǔÇiefAXӊVcnD.-xiw/g-Ll5)sˉg{m];`˼ǂy E& OMT;{:m"y^BH"%ދg0z$afo*lE N⳷l#ȫFJ,eLMv"TJn/ttwS j5?7ۆNyXtp|1oek:9y)g'׼ m""mJ Y.. o /8>l#!Ws>l}AZ3@ώLy%d:f/{n<̣, >s)ak"y<)[}[G>dG_-G̠3X.GHT /"| nD3v8Vю__D5ex5$S +u5nx|&끁9\q/_ `7n˝@>rdI80G5n]Zn웒/ we=bCdTm Ȋ@ J!˹44.sYwH6$ ={xt*ΚwbDM34+!F 媧bmsSwZ>@Y;ETonq{wO^w濆oͭ~X޹x5x#?Vs iKb֮e7.ĪηE5[Ë́" (jQ-+1n('BHiD4\ezc|*RtV2nc pOm:?z:O!TUN'нX,5'wN^{l Aqk$L6 ȡ$+*4DKkACG*nq5E'K%(.ʍ^t;_<2 sIۉP<obC ܤc|~{TYs̐F16%5zzzWTQm_`0r j2ТgN{;*._C\L *Cy pֲ*&YE-R*UT$[ӺH`.ji-Ik9<( ;ru*v5;u.{[cVO$ ѷ>i$:N^G*e$O@C̮bѴ$tTVTg JQ[V\HsiI >xy߹.\Z,W qD`TaJ@'aڷj-S![XnAm斻uHqՂ}料=e39{`PmXw+{>@A~aQADE-Wo>x"dƣjbsQ$)(ZPmT5 QͶ.U&[DfSK*SyPA/u2>gKϹhƖV(V/Zb6'.c!;~ffe3닗1%C8]K1nߊ4U[޼>VΧQk93sd=Ҁ}K7gtH|kշʱ1XŌ3w.+ Ymwf mu8+nZ'){ɈbsuKmwg̠Le꭬=bPi;2[6A5&2iz\=SdwG<8[%6IkQÿzv;ǬeEI}eEYi jޮ?xc%vZY2U[q:<6ƹqQX)Xe[vs*~lX˄COALe\=`=ܰe9mo͢ſv,Q:%<ԍ zTɑs8%TDR'V"0YkOzg]raDcRAŃ*Uk2;(}ϒM쾨cJwCMUxo'Me_krQjWjƢIa5{x4pD!m H(Ԋ)4.~av(Vxj?ZfMS rNJre;e94\{&_ܙ2ya5B>܌kZNc*;n6@v,ס,{xeN3Ԍ&Elr/)ymvi唏v)^ϽH{:ᆩS`p V/tVbͻ'wJ]{קyl@vM>'G](s}:;!I}D,({DNswʅqdd}y˗bOnj>cpx:8/m,2F(NH~1AHQ;cF1 ؒ2p3!%pc.Bf\wKJ;W·ov 1wױ GjƮC: "|)zX٢R{yΩk:nP: \3M pM%˷[OF _4V>DQ(v̔)*ֽ2<)f=GU<c!E@[qwQSׯKf;RlE3CBrzuǾ3Kco"(hh\;Nhx*A ݱ$פ/>Xx]6)v*ƃEufqZ6@vۨF.6VL'DKt bT"^ΏtN<;uW)ݽ:-6I+UK.XӗƸ`3-BD *Y9Ei =œ?Ԧ?bM|hywV5yQhCz ghbΨo8j3eUެGp:.s}%!%i̜ l^1svPw$(ldo޿yO/FX{nkλMƷއ|'淥p{dćiYAk n`UWFͅ<#8<ͫ]TZk Ƅߣu/2,p?VQ/5 ) 5n3~_fnOg\n7E5٫/သ%qzj r @vͨ\ ;z54}a }ܚ|V=əl7^ :Aьv?vqкH~=`ǂn5}=/Olؽ :N77Vkpo7'Bym69qԺpfCG퓕{ǽwy NŚs-)U, 3s"<SO1ݯɳ<6˂U[ŦҞN䛂sJåӾˋvFvcEO[̓0\w:gr^uOpǨPpZ­uJfLjr9Mg5 =z瑩|@}gL;a:g֌ #jKnևN&|BsŶIF#9(=} (2=GD{J -]5@ʐGHMܽۙǜt8SjmAUn|<]HK bvfI'Nml.'0 wWŭݍUM]~gsXIiv-RHA)jyn(. ]UILwdtb ٺ=, OGÉ3p/MYwGиok{ATūPwh#wi/1//7vqíɐ?{ 9 FD5\*+|{(zت;F’(V Hc/.wpތxlQzKi`J5nt֗|H-D1sf ئvܵ Ͳ+slV^"]]Ze "o 7j| )C8o[;sQ$zu'Z/c1Ebu6F4:a.͠x/GeއaVWuhO Qח\ _Pdz2tw0oNl/~Wy0'i>Yu%[F_niP=HѪIWY6X3\-JjpvwħuWhu4|q~I><-5X.ؖŏn2KqP77AK .9[- oތOxM2J  eerIhsz9PxޜauF+*Ai{!3ݩ6=7SʶX{ALxn Nκ|f=i+;5}dI6sSr>.K^ۀFk>1 ) ׺%,`V.`l5!FL%0%{nMFvļN<~"]Yco᫭ŚoM9aL0WBsJIy۞PH k0aۤo!.Nbv贱ZD#50z=6Ey=K>Lܦ~qo箨I)j gwc&sYmݗ;x-ڽ!MIOH7 [=,ޞı&XN$ȷxdסLs >yXb0:xk9TBod|);9o#yY*'z%]:io;5!ʱ{՘F|rWS=K; xNΔu}[w1n=zJu^0u>ʒGOƸ9Zck8L?=6A Ԟǚv3aNz 0n}ϯ'gF^ CgW4oleVi1p.5-w!R5Í{`~<<1jӨ=BƄM%\T1 j;!쁎Λ;n0[#4K{f#mUxy1Tݹs9s޻:QKڅ"CM}z wB$\cW|}eLCjgxk*2$"oӍg=q{֩ãURlZׅ5qֶh/W}@]27wL;LqCsw7p#p)f|7hkC&;FnPE%<7ˆ،ktaX]<[ZS}zWKa3j ;4Xlۗ;K6:繃d`\|mc(<nW=10M8e/E'ޭ*9S:,ܼ=oޭqg 2Kˈ)v'U{!oI7;/&Y;y%씺1;irG7b홇|횓9/a=ۺ{Oz.`Mfcy-4֯k>^3~Ok c"*aGڏ?~oF+OR`ka\xѤhY|816 fYx7<]k.,8>S7ӷѓJ{%ڽ4LKJ6{r|ri_nw.}eݾ<'O :^Fxgwn.:nyQ  r[ hUz^goEg M+/v1ggYtI=7&C2rٽt,gpx]IUG;nU96lJn+!-;̪\^#Bv(y\5둭Gc_JY#oqu皚NVZdy0#_mZ}MGG|a>p"yG4,ms#wO jey7iCLkDUSdWuA\݃e3pg1(mW-IYJ41sЭW}n;4WFw۝_iCϪ{g=O꒕9G Cmdшnfzp& \c; nK'/si !>.}q_ rNm׆~J 4vE}3ތ ^UH:4D.v)} 9Gb-=3)pli[ ИN'Xw>y8Ul흲 t =bEۉM\fRCHYR+k6G78_/PcUQ9[mSc^aT>|{$]+՞?ic}ch-Trzˈd^WiV9~[>WxЃS[6  ޯ-g{p=^ 1tn.x\)Lλ\*ql5w =]~ǥ])lNpv']οok;*9DD:[R+CNN"U33kEptg4;]=Oc͕(+=kc'655M]7`4$sV:`_cpl0c/ے( wnnӜHw|TY;g9޵dzevm>65H.oTu5h'{ᢽ(}u鶙nۗL"W$]GA}'p?pN${k28ϽMi9:7b17i2dRxawX;ޢѫG wҳ θ gCIMڨKVP';QiC۝ۃTɪ?5=6}n8uT&{;N4TȐ"u9'\@xMEo]G7?e=+A|6=`& ]U9,Wr\RE m<nv!bm/kXDw^sJ"N:P^QvD% &{7фoXN$KYۢOqr*XsctĸמN]nwo |* ~Qdvcr yZ:v m=6cl/YuBf9}z Oe\)_fq<=ۺ@=n,>-dl*\Ho˽R̽vm_xN(fcNDoS@V-_&w*gz dٱ(Kay,[ݐd]֬UX^a厵խ׃2rk nºt)aojÍu+z退 Bpݍ[>;Awd#`7;bL~#-XAdCXe}o[ ː# Yq6%^{F6ݽ>>xgD'9eErbxuWCa~_^{ԩñSěNX֕3#weyp͇GZ:`7ѓBĜ279x.' ˸z27<ɇ=}[ hGg N7x"|h|)k*WlwYϴ#(3538;5猂<{o8Jw=ZjdXňXyʆ`egD:HA`~$:1կo>$ޑJs[OF}NH $(xZwbh:%6, d6%8gwJ`>ܷY"?vi,K`=[sL*Ɲ;N+hee:ˆq8x}lk.s99Nht]c}2k&Og$")Z#alя{nҗ0un/ޟog=QT_{=cqMT­mMџE; lgrUI@æ?!dJ^+c]:5]x2]⼉z. ^+H7]qCjKҎx<,`&\$/K離 P d-Jmf1GՁMzwwḛVrg:}ws4{n x}"D ށ1}FG7srtegy?͞Og^UD-=جs/;{}t778 ̨6I/,Zo_A-|}Lqo,&:&%cd IcPVkK`WcoMLtY.}؂^S.=HvmUç8&St흢x== x`ZvلΆ Xw9 ѯ{ A8w8ɸn!Z[,/Rdp´$dU-\"vܱ|AԚq1ap)=ѾiCHy>$SudTN:^Zrwf_vŊTZL>ֻ00ٷ:v'#] ':-t^3%<<:[nذb\h ^뽝ko$G͜.9|vYbо3mtdW;܇ݝCU2y+좂K=y[_D=w $Z#dji :Tm0 s b^cޜ^zYê [oTH-+v>FDoW7=ӥ{ %ͷ=2QC }yŦ:{y Jr@Sc2VU0[y )7FQ\8\=Gtq"{%g&t} l8]2Z/os͔}I<36G|MIܵ+ǥ'2B}= Iݧ,<{&}t`ot GwtA}yʇA~w5.a+Ǝ_q;eOhu1]ǻ6%7u3=4Yvy@C{2jǞx_mr^F,哳79h gz;װl/xYOTL6fZ yf]F!V/b}5_;,wĕ% ;ٽ1tSZ#")ýPޔRna6,6Ѝ_=<[Z<(ؾ,^Iiް6쭏kދ6霹Lۛ^?ykׁkicԫӄy|kʨ:[Mg#7hDp> |t.$(˃l^|3ɓÞSwNrӐ'ȵ*Uxcg7[ 㑾XṾcśje+%݄5wiAs@zO)yAc"M|T&yªoM[m Uj(S+>qƸ9r_gGʷz>ԵntzBOHKup6Ffdq>f뷑vz/9*.BS<VҀCs0i[NOOS?bE hbmr?4]QN2VFw&:+tdW %&*1xkOO[΋Wwؙ JNZ7]ĸUݓJ-Ħ.O j-- P12A81b5gfy yZg{v{{Gmhxዥ9}ыWW)O,@ךBzJv|zP:0Iw>{.՘` s޽:]&O{dVsPgrr\zQ;Gf#%CӱB|{I{5D~4_W1 xPepӛy ѝq~HwhFvm[p^=<fN|0Xz1zy{//`7b+d=簥E7.T(K(XԽx\9i_r̛k'zG!@gʷӳ꛺ߺ; =ކ ˓z_u->pY6sYL!f)ڽգOt͗Ҍ6YE9\ Ul&]r[zh^ jl(aunKBRJFmt{},b~(ԗav:0{1{ۇë_NY9 ` qYEmǗg:vMd"ROz6ܗH GzyM) kz͙x%ӽO.Y9dNN-k76qZ'{9cxٱ_3{Z[M DL :#[:nM2G֨̃k2\A熝rGZZ}NE\I'aUzf/|+e޾lX;S~w<$}[h(OR.۵4nԼS2Xr5Gv.l=kuA$7qyA5`m1*%~05 %悔f!7T6VE죷.IҒҦc)0?}X<-mX\clJ }^co}sg}Œ;9_uWga]؞ ^ry8wg2w=ZϵImxC;q$_;myP)B d]"f.4s iS;ø:(4;| w@In523Tx*/ylgi܄&x\9^Ryuilѳ^jX&AXsGV&WxsAuD;k[q攰m/d޿vȑh};<']cb>MZ:3رs+*pm }#;38ޜsvd=um良`:\)&v3ԡvz֌: 5]7hs{]l xf22cszߓ-ŝg=REOXJ7q8v &'{^+-8>WuR]^y Ӑ}t4=4g1M8s@^j wڌgytgp}뜶< ōm܎<fNisjrX9Rr0Ɂd_dEO\%{A.<\ ?9,r':KҷЩ]~:}a>#lXP&y TQޙsIsz,•Dwx4-oR&8 ^by ;wo!czLt{Ӌ9ˉbIp>TLx95tW}.cW:>C>fƚ 5;l%gM`GBK{ɹj|>vz^}O[,Czs-oRr_{ɞ޹UegmX(LsFdur('&QŸ, i2c{8N{#Q1Lx-'= 7tpiB`\aA*΋7/wIfg%C"U_ F<cч]>wKngPiՏ}}5/x^MT"N?B|I\^{B-'׼wh|t ի̰qIvpM^F\EU/qt Na6( ŜV7Q:n5bcG%?y׽np])p>莿{M_` Lq)|Nڏ ziZ5Լqr-⇫*}UGg=sr x=^ D|Bz ѤTi:r=ϟEsv燭|- 54@vWQ#Vq[ ^T??v畊C~[8{)nr~^btI+|E..v3q8tòr|ͨv嫽&ƙr83">=WOzrWkEwNy-25Q=о?#-.Uo|L13wIץ/uH7}^y&xE[6ۗwp9[Wq{n Mfᠨws/3R]pѦjj8p⒊^dԥ` 6PcH?72t3`19 Y|D'P)5T=N^jtq]=֟w5ALǷKZoC#gvՋȺuȦ">W{bXVKRjNڙ]xiT+/栫Cv qjB J\UkB%s3Ω%˞+Ͻv2DdM.>˥9[G }>!s}nNgko"p;|Ōbw9#(cCv3w}C;sgV$s73T7gIo;J c/pdh)jbbTr) 49K)\97og&RroӟE&djtyqL%$`̪B=3rVAn}U[zy[Pڳ + XU(xFu.k?*H{$K~!%.bĆ^X.yrWYecgb3 ~>PzKvDo@=Yݽv TY1m^*Qެx{6_w\$Y]܈E0_\0]ms?M"]Y]BE@̘ʇ-ͱכޗKG 8,~֣٣øsӽwcܚqsk]|ݒN6}Z;HVdpS#=<&zL^}{hWJϛ>XXd;8szJ9> e(){De꘳׻ htOTVoM7570pg'|t__(ŷx9M?NfvAb^ޞsSub3r/M,-KiG_wvS_\bvY9-w>%nӡlʿ{#??GKt9FGcp}a V^$勬sM<]8Xu.厽EoexsXLB~&,dr.b֚v>(nLm}B=;i۞LD\f^{;6=N;sNM\=q\>K3pgi @x,wBr"oUcQ=WK3|scgdf(g @u'gF!/_QƃD2=yPcvzW$aizfT⧺/^n_D+; UOy-QH^!2mq^I}Ϗ\ĐBwfK:K=&U%j:kpŶ4qT'fό>D#F{t+)$oL-| <ފ{_  ً [mkضfhUUcP > ;8Drnʒq vǖZ;i>r~)Ltw5t4)*ɱC۩n|s{^;9Bdl,+/@x^h%LxG E~ţ-MHgُ7*tS@p7!Lsɉ=VtC!ʲ;"#{w.^簧J"nE+3Vг| !%㷂uePPJBV2E!Mw !|-`S.a~#)CiÓqE;̢#:gN*_gxxA!ňli<g c7Vt>g7H[(|LH1wfy*p;l㖺xؔH3…h*x x0/gQ1ߍ[av ʰ(:?hES;k"j G 0{fAϞ#d"I7hjs݇P1)snL[gݳvmOO]P@ڼߋS;נz9 Pk.pwo й\ 9lubmgH̎poi\`!\i[۲'>$G.Avn];`AN0u|KlTܗ,s[J۰B'Yj3o 0pym/H'iS |җm )Kz9=B uM#_&t2$: αfQ1QDz` 8뙘n`t; މ-^VepzDLQ4̾z_Tv3N\{nt$~7cr7 m\An}'%R{PFAoHK, f؏Uy ڊ+\U/vXH['m ǒՑ{ {}նYU@(fjf$Zt 9=>& |VwĈN۩u-Q0r]nC=='N>}6 }7O\ӶJq&^܎a!0v<}=]]WZj9ۺEUtM}z*KZ˙t>Z}f}y7x@eLD)t'{zV$wI5 CzY#4v7#C7og*Хq;ŵKlN40/1v2}ʸo0]!a:if}ލ'>+tcr9tkpKXQεRMOݢA}tu{{*_L>;>1 y;ިa/jF@yWw!&Zf-;Ew}` vwMpZ^ Bhq 4!sz^syGt_\v7K s-@lXn'VwuuR#ʨ|}'ޱWI6_" qMg9:Z_EyH](}pqܰ0K8W1SYGv+跹я<*]䊢kEZôI;,Q}i=H;qϥB/Lo_^gշ nm$z ds#N̑{ q62Ի|'JfK^R<6 vtNvk:Ǐ pL}+0]lܩ)_yDc9+Ӛ_[q냦5Y&u>ˇ8͐{*X7 q.ir, e6kA؄Θ7ib9rXHܓ~ mR>%cZJݴlxB>{1ǽ擏Q{Ėچ#ܞ יطU wz؜螇Nav_Edew\EՉfy8h|rH!=phTՒt݇tbƹ]1O%0? -7Mv/m͘sc8S #n:1ߍӊya=yTػ[؞@ C{rcTE 65ή\FI9?}NJmپ8 W;O_O,|,|2l߼^mN=zCJNվ OO^/کՇ|E谈&xcpzF= hۓHͫALg0nmƎk7w%چ[F_l\~\s<ނ[vmk.wldeΤ6G{/,xq"hV;h%w.ڧ'.,<8Wj{Dҋ_G'(5WV7zfsaˢqa][۞ Ww!zg?¿tTg|b`c5-4x]1/s_\L9޾,'$aSlzݲSMlbxM;}6; M7(@U~ghg&f= 9BۻTONe^7w̏,IzX}nmZ;vx~} m={x8)61zNMa˹.[ oݛ\R T-Oy;))s:I2`qe6}AbI?N9\a,kͦ&A|:9`\&#Aa%0cf#}mvhb9[6msV* ^ :k=;'2 :Eұ-*T;g%kx%D2w{j]>Iž`CWkDgymoi '_puٹ=^S8oAǓp}&to7j^X\x8wNxU{Bݭc=1~^s H?bew$\Cq˶N]P׵C{|R)"xuwUs#_o܇s<QPޙ%t5 6{:Z'7Qq)ݷ/kX;!3gp+7$ }P'=/XIhV)0a^0QI_˺!tx T I'MK&Tt;dmtwch6ŝhJtzxsSȎ@}*AeAZ4f5q ׃+;P ɔs8Zb/Ul7xQB5װTwk.!FO)Ƒ]BWW#ٻL.xI`Px޲hm~>sѭ:s&~;<.<$">Hw ;6JۗNo΄`Sä8jĵ}Noyq$YdI:{HXY=iV`wD'/kG_N;-9[Z8=xr՟9u,2ïn·엻q^Fr|xk<(8gj/=*).yzcXqW\y87!%חw<6>OnIw MdwX;\ =(8)wXSpSef&qGo}/Ci8! iUdvHZ&< oZR3v. s%j2yj=Pcxpq[_{=I^neic5ٓټwjy PDKXHKewYar ۍk+d޷9:`VрmgIm~uagj=RQaKW3_zYug1p)%A"N_oV Tɭw1+M̋WGt]A0j1ks rEf#Zɞ/cIO;fS5KUf 糷ј fsh ʽ<put%9I0Q}1*GU2D ;1Fpyۑ{܇Dۂq ^) ۶F W†Kp\ފwvlF7)pyB@.yssUsp4Á<}eX7.ܢ#XG/ ZqJ*6Uwv>xW{:V k]ʕ&f3ݧlqmn4E\ G<2w^%OV/.SoSNw׀G\ǝC.mao/' )+.9u9 낯B|:] R:4t5Dp/H'q-f]3PC$ +ڤZTN|-W?v:wdYgv׏t1}tdE z҆MJa]yѦ%;-:{ o|Q^fqzVzL h_/sy{1pqH\}.^xu8i0߼bLF=\Ϲo[W-;_o^ :&M91})!z4d:7sˮnL|+FN.XUȆn饸_x O۽Rꄳ`ٚ#j^X:W|Ny+,@UlqH͌•ʵ-Cr7yx9T}frOPn+{ ]׉uSQػ+=zaKaCc'NZvbHq͎ Fes_{%"ׇԬ/ Fޏᕍ?"lAvoEΧatIWm]\($o^*r1 9=x M׻ؾL9YƂ{ޫdpGq]+hb˷H=زnC·׳{NE2u{ӗ4레*"M<3r!KOdS;qxز$Ov  5ʗ=fSl7 +DZ)gwʳk->vqc=`m{ӗ) (xeIM:=g,6e;j#|G} . FGf_xrʤc*ŏ3ڼk u);r^sj}ү*Oճ(Qi-2Vz{7sF-K5cbup)h2F{}[&5itO *5HS87oYͅꚫ}jr9} հ\~n^ J̕b{FOoMeu 78ؽ'$[Gy|sSoQǴȹٝ|ђNV^І ك:Wۣ*LjKʍÂLHؙ`ns萻Gg2q-ѭp)_n㾒 LuVkξݓF\@y`)A8P<&s >UAk;N;o îIwcALuvϷ;VK"!= zl; ])_>46j},>ќDux/SAo[}眲ܤ^#}#M/I"gnX{}l҆ܲ_D8DrL+Scj.Q[Gp'gw.3 s#&]ϙz^  dw08s0JX$c%h͜&%Bj*gX<h얽0LM!G =\~&s6,\9Dv':0<;=0鸯/r I{.6s= Ŧw^,Uk+P޽o7 '6l|:s-Qu`b|*"Θ lx$w ::d6fr/s=%[wڭAo/=ξgnHݾ՝mCoBWUC0^^"U֙6|UgFw-$Pz_oS۲)sEÍKTʆICNesm8.҈uMu[k ː2Vbv_2=)YW:M{q"a,ef?YDh!K߷V"ϟLTg4f]St|ɏw\]~R5aU-̝-͖I3r(Woג1!Bl;^:KTjҚ!`wy4twΒj 3tۧ2^,o= Y0㌷;Wg 7;{tP ¬gpy*1DgLݦewbtwtzϹS%{B$}^Ui=/_6i+Fe+ 4^P6QsUB#>}*8&6Dhe+7s*zO=Ӟ`:WxKX&κ -`0Z 4':kF}&*$(eːBLэD:7ݺ/c>q :=}G,P=D_yUJ_O_O#z'6k } g圵܁ueh{ӏI;!~nYrȶ6˾q(e^̛B] R %ҕɉnϧKi\Գ1зt]UkbYnqcC+t-C<%nIz|lCf9\İaٷT==m<Nf 8Sڙzۜ,N]gKS §mR.{ì 8RmKxBT w$7xxD^]a~Q_+f Κ2+ۯWz>;ge1:g%oZ֫{.Pۍ=Ƿ* `"mI+u23J~|6<+NLս) 0Ns?O)"ww-|=],~}>sQtl|*e1e|t=͊g.[ϪYrٗ xQ^]}gc?wy#}K#67Hq}+wM_J͙,A BsqM;țP> r;oo{\uP}Dx]X|,!T5Q:bQк0^Î*6sWa?gK՗׽z A Կ;~.;b0]""=v}v4;hSЋr+!Z&=Q5!\9jvTɟckxA1תG;6FtTV|H7%RƻRIp_KY\'fygMο/g%"s-wt59G2A`,'PؖR-+eN;`*W^umh$O8#׹颤@mY{ձּ} "J/u"j@ b[:]%OH[TSoRcȯ(L o78phq546v[sػ'ʜXS56lAf=;bzr{kQ3 -%߼yǒv,aj*B{;Y`A^@"B' n}ѼAuw.yl^2yb*7YWE{R}dznlGki<Œ=:L&t0pɕۼcnyRSs}-4t Er8'dSKm^0zigl=\|{Adv7GHD $svucFI=@"T?D!_q6ܯEy W=,A@PI֐y^Ŭ#n3\ ,NendcG.y[[9C6Rxdwf+ sH^ܹ*|'28b\ZNV[Xs$gHZ_E Iۑϱ̺}3<4vHXdZ;PRkRݎ ׻cTZZd5ҲeZl\{[{ zNڌ*b\ e훺X!gN \Lj㗉{}BW$;f3_SK"!: ! L/vd;ny3~6*C'$sQnyTូՌ93{WLi}\ 1FRi6H'B9&nܡ_1M]5ۚW;9o7&۽iN!$>]6~KGC׽ =$![Xl=atK28.JZ[ctk "y16 \-yomWBHڗ" LXm=`}O;]MtojaڟnXfx`֧'ԫ]e=SU[=ޝswL0<) AӪf٥ 0##9NƸBKK˲zbkv(rY8Yyua@ڄ:A ixJZyV@gh`nнXqJ=4v햱"6U6܇ vSO}r/r(5?,=*zKJ67v>\y穓7FY*lV3Ȭս] (2HM̂KR7mf }V -x#.>&4tGM{R6n.+K>"+Uxe6wϲ#C|/>k*): l<&E6ӡw[뤌<9Y?:7w K#{RQGk!۬]~(C;t{|m;tdӚ^xL!;Xv&Ȱ]ePy&9tV%fJ|磛~U |Hp@:E;1<+߶o L ;=;&l f.YE| snMFʬS8^B1>n?o{6wdzr6'y]JkeH('S*;sS' ~îx6OuQ A"flF؍M٫@xj2= 漗=vr/jݗu90^޴=0Tx|u2es9ypɃxy(!i{/1r5 {+I-B]>xySd#6Ldwe9/hj* xZEaXb utL#ˉIQԏӒ#狴uno.7uAL&JDyt邌DCcWoZ"ehKE3;E ʬ3qƻ~Cz" 65H*7V{!n idq^3eqe_M;Hh9#X^.{'QGtKl = ʗm[w*FBsmRԜ(47&}.8e  TI둓1tih׃HlgSĮ;<2>1wZὗ/I\3ز9>eΕ|B}zЇs|=w[Js*w6`$ 8neQ͠];+8D}_ l%*18_"osa'y2k`/>+==ˣ؛w,ijqOVy.(VʞL8ǗYǍ Bݓ"D>٭iq-P 3Tܘ9z-;MGWص=r{Qr]dp%͠nq`+| {6]#}NZ.]1ѷf=y3^ǂ='ҷu;cȓ,Ͱwnc; (&n .LXH0{(u87+~Mg'w`95vk)=eJh*wij5ɛBBO_8h{*>/Uvēfݧ7M/S="-tdnùxA^cy|ւ'{r+pɾY.kJ|!M[~t9OS ids\eγ2[|dWfƼz }b*JqC8l;ގ.{"f0oOB#}dnlp{ @uʭ)Ӻj/"d{x`s{8p4Y/Xp|:V1,#+̨Cڻ =IJ2q9\l.m=}Wszc o>.稛;N 1ͶkԽ.tGo =@>eXݫno[pz>K=o^❢́EsyRW{AyJ8#Ҟty91˕"wd:,-#jk #o!DqyU^~'%N*hH }ǞЮs԰-r'^=xeuv>عzrc/JzJ쥙o̾Vz=An/Kql𫚮*|͛z5u#!elw!V i+z~rv>"d L׻&q<{:Y9+-;^iY^ɽ'AH!9Jt+DSyXqϋe^p}bK/x{/*Nn^k{"͸+^8<2֜Kh{h,utu)ݓ_QDyW7{xby+QWӄ"f=jl1@t+tՆ*jчnH)%**Tfp>ɽ66S6‡N 6on[vqbPͼƲ}Y}Dpgd!]e2^Y U{{zTSeZWz&Id x{<՗^qzaM<@^n al-}CQerN7{}g.I8M-G1Ӧ{Gxޛh&oُuws_JJ6'|}8Bn\[s؉gӴyWSpՎ&zF%cf_"<-UDiMˡLB] GU/;Eyu6tڠPON8yw:?x^0(sztFdtRq*Z^c_Kܻ;uĊ=Gjt"\p ^Ÿ!/Y6vaD!uB+xP0vfTFն5;IP.XʽX/X=vۗs%Q0/mH=-郕[G }\fxuu1 qZXUF(;XHH (t u?'3>#.pA/u[=xoۚUd۝{עU07}fkM݉MZMMa@'Y^]7r.kc˺X;Ⱦˑ..S<r97_ y#פ3p#+Uپ'Hؽ"_XlBW>iz:C*%kq^ٹޛImKL~4x>R RT'}H+6Yv.| SDNf'!۪CEqKVN}oMvodvd7!:Ogh.v;Cm/xBKPO|S~9MYq N[wft7p-Kw Y vJ;+wX.,jV4;{2ދNm}8P{c. bvDvLF^ɷrEd?LYSuFnVqt&BVL 4GYp hU#. ',ᔐ!@6Ayb8]١9JL]oiX43)ݬ|smVǢbx=^.GLOi9pz/gZC^:=&*yl.[{6Ȳ}Q|^~,Ox 3H95 ߴ7η9!FiQԲW䏖pOTq!e0 vɆ*~bSd:y}d6gvWgOhmm^xuAҟ3-9} * Y9/@76) DkW[{WPg^ks3vjݾȖNK^4ÑA+)Giu(k7K2XmC5&kXC7I6dO5jfh.Hs}2FUӇӆj)$;hN D +;4r_ΔeO3vD՛EZ˱ګY'眫.{[V ]aiz`זKtݼvty<]!첋܄Kw,ŕy5Gw:By+{˯+)o^3fn}ۘꙦr{+2kc9[msPߵ9|^.h߷:.N^7}U|~ro=އɆ Îkyx\T˺}=EB#1o8>|zgzd'BtTp3tGέqq M8Yc'F=}串;Ȅ5eTu#J"8ÌU坋rvh; O;U1>:9v3Q=vnVxRjՊc[xfb։ D3FYv7sFL!?3ݷs6;B'B|%<5!<^;l>=Վ[ʛ$}5DyUmƨ{!ݡ ͒>oٗgL(>v2QD˵>]eWXIXVOq\q>:Z"0}e3sqb9r6"׺)>f|<$bf)6!5l&VگsE4HSëoa%*up秌xp\\*R-asA?P{Vϴb|4*$\ӻυ\ЉmǮ_Pq aΰ=Noy;+VRrgN5z%gǫ]Z\en7ë_"@O__f7\jݭj0&n^nk{EC{F&\>}a,J{=eoh/:S&簬ٽ=<|4זVs{woD/oJ#;g(|+{ >ۜ* Ad*햛|fn6wS^}Zݐ%=GY9xJo?\)۲n<-=!9Gnw!^Oge;gյ1Dj:yn穆%`h_"9zzsg5_=ء v[GǔAx6 VenS{U\f 2'],ܕ@UQ5`sU޽d^K ܍NfO{q5dө2 PpYgԅh&u;zDS._x =7hQDdU=JfΌ>O ̝/[ 1tnA־a~ck#zdY@;ƌ bY\Ѕ Xj<7s-JxQ^~Vq+}ъAG/h,eʜ cW\#kՊ%`|rtîm^0wvݼ[lFS-xOt=-l9ųgiഊl`7`HLxTyt-BA!.9֭Swr[v65w._ ApOvݻY69[٫4wjwvD &-Z6[\滄/6᫢ =9&1;D=>:$)Bd(ErwDQtpw%EG%]tGqT]Qu%]AQ\PP T44B4+KH * H"HRM-4%Ȕ,Hr%qr(w_H3`6&;N|0qM#fnI(5e&v#EzGEM#i\1ɭ0μrNmڈYK:9'eZnG14skL쒛iۼK͵Ys69uYՔw,vs[fleZNkUD]giZMݙZɵajٹՇ^fwntfk[n쎈ugdX;6mi]gvVt6 ڷgenvu͖\h\w%ڎɳ[fj8+lgRZqڃ+;;m#8M[[uqfw'vgifmsh*"Ι&՝vgqƝfF\qdgqЅEbȳ:N@mmه!\ڲmQ쬨㈂HmqV%Q6mrkQtrvv5;쬬;Hn㌺*ˎN:f;m:+:+J*܎m.+*;:εYqienGdwZwcn6,Y# ;utQe nVGugEfڰֶpwgU'I6N\wvf'Zl69tP]VdtGYQu5 ˰(.쬭FvtUpw6.˰ :v'eGY8˻:.2Γ*CƻK2"(miGEVRRWea֕wt$qeeGeqVuvVDuGsqZ˱#.;+ NYr]d۳); .8N636ՕXvu8]uuHvփnuwXYqEur\uq]vsgmg]qCnhZH+.:#:YPwQwwAvwTZ9"; ᛺p㻊 #+(룢::CȎ8J:$:*##$;J'.㎈"$訊*8:8mQGQruuIEG%vUgQwQ EU 4г-upqܗ rGQqwpw%EIQCQ--SM%%4\wHqI%rE%W!AQI quQtGQWGQGA\QEtwAGGurq)hZ%((HEqGu@'q$]E9twEIQGR!M%4 4R4!0:8(:㺊(98!J໎.⠨ꊊej+-ms6qv٘gln,mLN֭%k6AFj찠,f CiZk8If6,jಌLbV Ys [me܎:nlmȐeɺ٭ ͭNrKجO=lktZͦ͛YMZfNLݖ[mvZIՉvv'm-zmMgeelg4ѝEYh浭㶶V%[vqtd(6lucjl-kRDDCj? ,۾rs4&( Z"~6rAo2 A)J((NCr9c܍܎YyIϽA&*ȓ~rqP4ҩu v= eNPb hؓ2iJX\+7Q`?MsH.( oftC\/ށ5R1H(}Q!D(7fVAM o p9-zzt"؟ʵLiͫ-98n_m;K#ڥ EA&SG xh/x(mTe"$#_1S%HībW#}YLkǘ$zמ|}D,9'$}ן^h:Dy ,we:qPMb\ŵ\V 7'9O<.Iv[uޅY$Jsk\6elXKy29a$iӁNyCOv=ff[Rn*g9JiYdьZvla 9oQtll:T|%pSJ5bA x笾R"=0n0UrH`Y -IZ<'tnpt*vߏxx0F"4AH;Q}w`T&AUL}#)W; @| T5H!5y)eCqT YJy7t!9aP "{Qed"A(ET-϶s(" 0WNx'آ7oB.BU@>MQo0֍lA2((~g{]8I  7_GtȾd /-BoYE21ƪHF^5ߔ"E|qY0iR VT4Qf\..\RNc`zhќMt<8ɋOIs/6@9oou*}|+mɺP_pKc3UL3j%} ےG<.pS0jI %b`Yk}uF={ o,=,tqNOfMLN"}heʴYMr7ݳCC/Y"[@I@ƍfwwljV. p+\qu%]V^>ئ ~r(Z,<@t (g߿zW'hM\ҟ5fCD ISIAH;G|`lq _~z_>|\ )0O_7g3j ;o4 F(E|<{W"{f?Fh2p>HZмL j#?~ywB( Yy0`@4J ]nI9UZRh, NPےï2o!Lnsܥ,F"~FQ(V K*C Ζ`fL0iZ&[E2X$)a٧,dHck) fFX Ƃr}$/Yy-/ SJnIˌ iqS[d/!˷nY;{Q+ 7${gaU2bږA3l,D%u ug'&B3&ș[@t>p%}1%y!n99k-ΐl}eP&kadն03{\|4N^ MeσYTJRq`=u,y%MuJǕF2t_(ܫ^w}<˟y\ : u7-yNM30{(;vrxh4M%؁70shj|wùU]s@<|+7Io]A%*DP}Wz| CR~@Mۄ^CUV9x?H4;3yvrP<q@2 '|ȍWF)^ā DwWPB\.[6\OwOo[GB/ $$LH@Qԍ `ӹb,w:F L!'^6bs`:)r fʓa:=PC &Kۮ jw5Ozr.kN恼[72 挡8AWT U^t\Zyr-2Xahe&Gx0llELE槗t2vOjS1R U돳/7J{ےwFV*GkM(ƽh &3&y5Fy;81^Vv?]S2 !"}U|XUmOټ@0wݺ99f±BߋwW.I8x{w, oR8FS".AUhDIkP"H(`2!Dr̀A&S2rLƠd?-1a"Fiy%`wf^5dH{:II-:);CK8d4*i`QpdzD+s p[7[;NPP$5bH5-Υ{AE'Mb6abI<"ĶYar-[OXn#B {yn^D iݒε;jd~Wbn\tBsj%Gw/( ˜Le;މߙ;j) ~+;˾JrNc4vw-wkfwP%7c=HxJ%1E#<8qL*xs}{2hA,xsv QE$TFS߷l;NCE.;S;L@>ʃ4}4Q}}lߓ H3qGhh$v^su0{ #7^QϯH3ޭK,/ưI][n͇Y VJ>N*VفbdžPh" H*Wh<u-Fvf9Tkf|s1*8R\v…u*ǐ3:oaXyI~[,u(Ap,? 9ǻR o{rhaze D|H= Ҟ1ԙ[Iy}1{L\;wzGnvc3]X: Fix0-<";|N={J=k 6y~J"& :6;(>ޡC )K!U5%TV׵|tVm;cꘙnHK`'.bQspѱox;g[dtz{*xX+8>]6jVbBl6 A@K'L0& ĝ-4x˻wSoWa(Dlp.lMS: } PCNep 6&>ww/qGm;5t/(3s3FUG80 p=}N{*ȭz}93[mvwǼdӵM9\:ӱ D]y߃rK՘w s$&'ԭW)bvJrp'wE# dZHR#l$B%0:6y5} p##.TI2BLJ@-38J)Ī9A+V](#Z֫_Մ$l &X0(Ű[/v)̚FlZG%\|`uTFvgUg9JOk;ܦ%i^ ժʩ ɲ^l{{1RA C2Ԭ+Ǎ%ռow4ܖVܩKq}b$R2Gtq̮F!ò&_f$pďRm"r!yϳ㯿h;Q*`^οXyfW|Hyްd+wf: Ms~[XfXmGq;Ao ؏Ё(2,jءQ}dZ \A8GPweU>>"/KZ~9QS˹ݏ,vS6#H24a*^cYArY8ImT- %ZGi=Bk9yBpƾ3&d nAQ:9%ea2_T" eWX`KCe k41}JVMk!A{b&.:yXQ _cu\nt&( N"zs9r뙸lr:`mu^6bfM`rrf5NԻ6CȘy@> pR\39 0,{rqw^=(kyFD;z| }n$@E\e Io<|8*ӒZ[ֶGz]<܌;ǚxUGyeQ`[ys.+QT^/&.˺W8:;CTSg<.bgs kZl)2;qE,tf%Pۙsg vn.am < ̬0<+E~:ᶰHC7OΣC/ n2r )W)އۆrR ()mXi@AD"Th7zs! A@Y#ВM^A.PjFkrl0QS#Xs8( ;",{H|xġ߆!lؙA9;g`{q.w4d+zRR?_{ogn~ZI}ԁ<>ƅ=#v\=:q^oY/8ꆏ=ܜ͐x\489.YBw5M'ytjmogY{qy]`x(>7#KvS.YyOUfyW}sN5",2Ki6o3Rٹ q,ʇմ8+F5 ӻYDuEpƇq=R3-4}Jҕޅzyo1^I`.Pgk#4ǾuGk0ooē,s5gvI.aˮe.+!Hr~\wI虜>-gtE6Mi#CtELm6ɬw|'[|kf/K6X#/yT‡GwNX⁗̙[EbMs|ە34|6OT=dwQY\qiJ9jTlS-Ԯƭ)ۀ(5ۑ[~^ZܥzwaՍqI>1VQԂ QVJ!)^4Ʀ[2ir SIThK2z 3Ҵ4SB® :9i6q;I1i5^iб<R[ӧ<t_p=jttt(.:l8}@HwA<+yGq>%w⾣Y{Bm GmjF:Nk5)Uٵ3^^[)+RBL7p-@$GU4Xoxm;<6z>OX픆2+-fuXo}p[*t@W0vz Y7nIݍMu5sH-qDI^wK9 }=出Kq aל<#mvSŦGb0LKz4x-}ϕ< ݍ2u&Hv^:M s~s%Z"LZ-}gelc85gÃ)Zl>^n+7L NxJgmwNBT rd~{d"G=JvxvKTM1̓L_/a5.\A [+p.ɕ2ݷʖmw,g\$I.yM8Sў,j>of'fZE]@h{Q]ﻴрnl2_#v?h i)xj$棥"7'v8=W^pt޺)4  ʗ0r(j|5;~ͪғ.^m}NTnHVw,Ż{%^dQ݌ź4 ll%.Z n{AK{Ͳy*ٖr{L}ʐ=1&5b6wppRv8P}^ړmwy/r')yKuՀ-`#- "t\ˎdj;dxno_4.0t3xǔwVuxԞ*\ zMfzWc󎻟CF:Ж[ƙP Le}+W9;'5`8FA!) F!BSlX!αr[Vܤx4glX°%ҥyE9^A9,nqN鴣u*ib8bH+5woD4w{D~f.rlKnZW)8˷"b6]kb{՝w [N0!RF Nw!$.:Ϭy Xp4rC*a =e'Y0n}vs|V%h>{0ɛbxlex{+Hzyv<>ݶ IE*'^00ysmcڵ=4S.]|5!QMSy=AQk0o>b%j/qr:6o4=(;>vT[xJXy V[;Ns-]Z ={|0I4޻} 351r' 2,{*=[|I )r ^w7iKz4$1*xwƆυ~j,ww{ʅ].oh,F zb -fq|]@r3@,lgN:3ѻpnU"#E^V#!"Ɩ`%a&lX=^6m17v4daqYՈ`GG}i@uԾm 0?[>^׃PLu@ӲP{ݻ27)hY868%ϼr <zOd{XtǠ x?;ϜTONGh7Iy4@')thط{@򳽓wOyν&a)3o79oFP#-nuw.b%+@[Ș/Wb3\9l ]mz*/֥C1xbWTxp<$+Ub}nGB64>J'Snm{Kpؚ-ל8㰮DvC0ĪXvW^RH2w3znǡ'6.b_ OW -g{|7ms+ҏz&6^"$I>A8.d]h9|qO]2)<0; ,j>336񴆋$˷{`>Ge0wE1ӵ6u $hG [PUqg31)Z&[u j&Qj:,jd Fp&'ƟN wdͫylKwflk25 齻vU'/o9%N(&pKKK\R~8UH;އ*eRptØTt#쭓\[ \:cGpI{Jc;}_B|Ca\eƙ,r2͇f[Tcv .,ըVNt ۪[ ;TfvvOk{O{]ڀ{1A='țCHpab˂H V\ v_sim-3.7.0/lib/plug-ins/xsf/xsf.png0000644000353400050620000000457412215546157014215 00000000000000PNG  IHDR szzbKGD pHYs  tIME  XtEXtCommentCreated with The GIMPd%nIDATXõkU>;w^<H$Bcc#OFtP8  3 :::@,zW0RJRH!R|/6wg>TEIgKApl@bxTMCWm4PGUBlp(erA EQPw3>a| XygYD{kBd*˥Kߴ`Je#/Ng ,<#BW z%çW:woLjkt72ǣJ,VE6' yL&*<ϣP,1;&_(led2yc߿uKKbgOToX~0bX4}kfJgBR"=ɜmyЮ"CcAv9 ySq<&i69&Y|+=`L|gR@yS( <*1χIC\e0gByAoL'J"p=JZi_|%PߐW R\8|`񣟢V3ʋ~U!xX gNܐLPGi$( <0Ք+0Cͦ 2PU6X q)00ӓ7R(躆U\w\)*P tPBٸcS\Ne7o[x9 9GO%Ľ>Wu=TUo$6D=+|$FNp*ZAٶC'OL~a#6L5:X]wز)~?MK8ӇV/aAka+53Gv~C{w>U5?[LLi}_@.}EsQAﮦusj(0 A'G'y7IBade_o =`0H[ĄC31NF &+Zǰ,p8Hô>xҙOHV,nӣt'DS[+t~/H,D4 vK[Xz;ٹf{NFm܆vq}Tt'0$? Cup$$g?8E-–-O=%XBSAU!RI`UWQ| Vusrl_JDK [>!߾k뢴=Ô;pMQ)4tXR.GGNCJ(R]mQU t9HbSGeh5ֺzD>491rK5L1[$tѤʼJ'L~Nmmc]xHdUz\rb#՟(Ec_AyDsɰ.y|j5--MM `뜚4;צ˗pbxh(ȲǺ^lz"Umpnzf+h.:MrY8f Po"hk!*iAϨdQC5O2 XJa8 oH1I/}Blb0$D4дRGi@m%CH7{us7#pB*GGyzU<۾O<lw^˅qь@3 9)H"55HIg*N P@ڇs]gN@!(ږ !H* |NOT01=FrwT9DI>Γq?re9Z[T|ϝBm]jH&Ǘ<\* Gq¡;%<<):ƥ 'D"j+ aho;3$Ӓ14:V8;IENDB`v_sim-3.7.0/lib/plug-ins/cube/0000755000353400050620000000000012216331350013057 500000000000000v_sim-3.7.0/lib/plug-ins/cube/Makefile.am0000644000353400050620000000113612215546174015047 00000000000000## Process this file with automake to produce Makefile.in vpath %.h $(top_srcdir)/src libcube_la_SOURCES = cube.c libcube_la_LIBADD = $(top_builddir)/src/lib@PACKAGE_TARNAME@-3.la \ @GLIB_LIBS@ libcube_la_LDFLAGS = -module @EXTRA_LDFLAGS@ -version-info $(lib_v_sim_version) if HAVE_CUBE CUBE_LIB = libcube.la CUBE_EXAMPLE = h2o-dens.cube.bz2 CUBE_PIX = cube.png endif v_simplugins_LTLIBRARIES = \ $(CUBE_LIB) INCLUDES = \ -I$(top_srcdir)/src \ @GLIB_CFLAGS@ AM_CFLAGS = @EXTRA_CFLAGS@ v_simexamples_DATA = $(CUBE_EXAMPLE) v_simpixmaps_DATA = $(CUBE_PIX) EXTRA_DIST = h2o-dens.cube.bz2 cube.png v_sim-3.7.0/lib/plug-ins/cube/Makefile.in0000644000353400050620000005667412216330211015061 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = lib/plug-ins/cube DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/abinit.m4 \ $(top_srcdir)/m4/ax_check_gl.m4 \ $(top_srcdir)/m4/ax_check_glu.m4 \ $(top_srcdir)/m4/ax_lang_compiler_ms.m4 \ $(top_srcdir)/m4/ax_lapack.m4 $(top_srcdir)/m4/bigdft.m4 \ $(top_srcdir)/m4/etsf_io.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/libxc.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/netcdf.m4 \ $(top_srcdir)/m4/python.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(v_simpluginsdir)" \ "$(DESTDIR)$(v_simexamplesdir)" "$(DESTDIR)$(v_simpixmapsdir)" LTLIBRARIES = $(v_simplugins_LTLIBRARIES) libcube_la_DEPENDENCIES = \ $(top_builddir)/src/lib@PACKAGE_TARNAME@-3.la am_libcube_la_OBJECTS = cube.lo libcube_la_OBJECTS = $(am_libcube_la_OBJECTS) libcube_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libcube_la_LDFLAGS) $(LDFLAGS) -o $@ @HAVE_CUBE_TRUE@am_libcube_la_rpath = -rpath $(v_simpluginsdir) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libcube_la_SOURCES) DIST_SOURCES = $(libcube_la_SOURCES) DATA = $(v_simexamples_DATA) $(v_simpixmaps_DATA) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AB_CPPFLAGS = @AB_CPPFLAGS@ AB_LIBS = @AB_LIBS@ ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIGDFT_CPPFLAGS = @BIGDFT_CPPFLAGS@ BIGDFT_LIBS = @BIGDFT_LIBS@ BLAS_LIBS = @BLAS_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETSF_IO_LIBS = @ETSF_IO_LIBS@ EXEEXT = @EXEEXT@ EXTRA_CFLAGS = @EXTRA_CFLAGS@ EXTRA_LDFLAGS = @EXTRA_LDFLAGS@ EXTRA_LIBS = @EXTRA_LIBS@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ FCLIBS = @FCLIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLIBS = @FLIBS@ FONT_BOLD = @FONT_BOLD@ FONT_NORMAL = @FONT_NORMAL@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_BIGDFT_CFLAGS = @GLIB_BIGDFT_CFLAGS@ GLIB_BIGDFT_LIBS = @GLIB_BIGDFT_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GOBJECT_INTROSPECTION_REQUIRED = @GOBJECT_INTROSPECTION_REQUIRED@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTKS_CFLAGS = @GTKS_CFLAGS@ GTKS_LIBS = @GTKS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_SCANNER = @G_IR_SCANNER@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LAPACK_LIBS = @LAPACK_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXC_LIBS = @LIBXC_LIBS@ LIB_ARCHIVE_CFLAGS = @LIB_ARCHIVE_CFLAGS@ LIB_ARCHIVE_LIBS = @LIB_ARCHIVE_LIBS@ LIB_YAML_CFLAGS = @LIB_YAML_CFLAGS@ LIB_YAML_LIBS = @LIB_YAML_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NC_CPPFLAGS = @NC_CPPFLAGS@ NC_LDFLAGS = @NC_LDFLAGS@ NC_LIBS = @NC_LIBS@ NC_NETCDF_3_CPPFLAG = @NC_NETCDF_3_CPPFLAG@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBABEL_CFLAGS = @OPENBABEL_CFLAGS@ OPENBABEL_LIBS = @OPENBABEL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PYGOBJECT_CFLAGS = @PYGOBJECT_CFLAGS@ PYGOBJECT_LIBS = @PYGOBJECT_LIBS@ PYGOBJECT_REQUIRED = @PYGOBJECT_REQUIRED@ PYGTK_CFLAGS = @PYGTK_CFLAGS@ PYGTK_LIBS = @PYGTK_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_INCLUDES = @PYTHON_INCLUDES@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ V_SIM_MAJOR_VERSION = @V_SIM_MAJOR_VERSION@ V_SIM_MICRO_VERSION = @V_SIM_MICRO_VERSION@ V_SIM_MINOR_VERSION = @V_SIM_MINOR_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ girdir = @girdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ lib_v_sim_version = @lib_v_sim_version@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typelibsdir = @typelibsdir@ v_simexamplesdir = @v_simexamplesdir@ v_simexedir = @v_simexedir@ v_simiconsdir = @v_simiconsdir@ v_simlegaldir = @v_simlegaldir@ v_simpixmapsdir = @v_simpixmapsdir@ v_simpluginsdir = @v_simpluginsdir@ v_simresourcesdir = @v_simresourcesdir@ visupyexecdir = @visupyexecdir@ visutypelibsdir = @visutypelibsdir@ libcube_la_SOURCES = cube.c libcube_la_LIBADD = $(top_builddir)/src/lib@PACKAGE_TARNAME@-3.la \ @GLIB_LIBS@ libcube_la_LDFLAGS = -module @EXTRA_LDFLAGS@ -version-info $(lib_v_sim_version) @HAVE_CUBE_TRUE@CUBE_LIB = libcube.la @HAVE_CUBE_TRUE@CUBE_EXAMPLE = h2o-dens.cube.bz2 @HAVE_CUBE_TRUE@CUBE_PIX = cube.png v_simplugins_LTLIBRARIES = \ $(CUBE_LIB) INCLUDES = \ -I$(top_srcdir)/src \ @GLIB_CFLAGS@ AM_CFLAGS = @EXTRA_CFLAGS@ v_simexamples_DATA = $(CUBE_EXAMPLE) v_simpixmaps_DATA = $(CUBE_PIX) EXTRA_DIST = h2o-dens.cube.bz2 cube.png all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu lib/plug-ins/cube/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu lib/plug-ins/cube/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-v_simpluginsLTLIBRARIES: $(v_simplugins_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(v_simpluginsdir)" || $(MKDIR_P) "$(DESTDIR)$(v_simpluginsdir)" @list='$(v_simplugins_LTLIBRARIES)'; test -n "$(v_simpluginsdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(v_simpluginsdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(v_simpluginsdir)"; \ } uninstall-v_simpluginsLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(v_simplugins_LTLIBRARIES)'; test -n "$(v_simpluginsdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(v_simpluginsdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(v_simpluginsdir)/$$f"; \ done clean-v_simpluginsLTLIBRARIES: -test -z "$(v_simplugins_LTLIBRARIES)" || rm -f $(v_simplugins_LTLIBRARIES) @list='$(v_simplugins_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libcube.la: $(libcube_la_OBJECTS) $(libcube_la_DEPENDENCIES) $(EXTRA_libcube_la_DEPENDENCIES) $(libcube_la_LINK) $(am_libcube_la_rpath) $(libcube_la_OBJECTS) $(libcube_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cube.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-v_simexamplesDATA: $(v_simexamples_DATA) @$(NORMAL_INSTALL) test -z "$(v_simexamplesdir)" || $(MKDIR_P) "$(DESTDIR)$(v_simexamplesdir)" @list='$(v_simexamples_DATA)'; test -n "$(v_simexamplesdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(v_simexamplesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(v_simexamplesdir)" || exit $$?; \ done uninstall-v_simexamplesDATA: @$(NORMAL_UNINSTALL) @list='$(v_simexamples_DATA)'; test -n "$(v_simexamplesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(v_simexamplesdir)'; $(am__uninstall_files_from_dir) install-v_simpixmapsDATA: $(v_simpixmaps_DATA) @$(NORMAL_INSTALL) test -z "$(v_simpixmapsdir)" || $(MKDIR_P) "$(DESTDIR)$(v_simpixmapsdir)" @list='$(v_simpixmaps_DATA)'; test -n "$(v_simpixmapsdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(v_simpixmapsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(v_simpixmapsdir)" || exit $$?; \ done uninstall-v_simpixmapsDATA: @$(NORMAL_UNINSTALL) @list='$(v_simpixmaps_DATA)'; test -n "$(v_simpixmapsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(v_simpixmapsdir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) installdirs: for dir in "$(DESTDIR)$(v_simpluginsdir)" "$(DESTDIR)$(v_simexamplesdir)" "$(DESTDIR)$(v_simpixmapsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-v_simpluginsLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-v_simexamplesDATA install-v_simpixmapsDATA \ install-v_simpluginsLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-v_simexamplesDATA uninstall-v_simpixmapsDATA \ uninstall-v_simpluginsLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-v_simpluginsLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip install-v_simexamplesDATA \ install-v_simpixmapsDATA install-v_simpluginsLTLIBRARIES \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-v_simexamplesDATA \ uninstall-v_simpixmapsDATA uninstall-v_simpluginsLTLIBRARIES vpath %.h $(top_srcdir)/src # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: v_sim-3.7.0/lib/plug-ins/cube/cube.c0000644000353400050620000004723312215546174014105 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2008) Adresse ml : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors: Damien CALISTE, L_Sim laboratory, (2001-2008) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include #include #include #include #include #define CUBE_DESCRIPTION _("" \ "This plug-in reads Cube" \ " files (see \n" \ "http://local.wasp.uwa.edu.au/\n" \ "~pbourke/dataformats/cube/" \ "),\nboth structural and" \ " and volumetric data.") #define CUBE_AUTHORS "Caliste Damien" /* http://local.wasp.uwa.edu.au/~pbourke/dataformats/cube/ */ struct cube_reader { const gchar *filename; GString *line; gchar *comment; double box[3][3]; float shift[3]; int ntype, natom; GHashTable *elements; VisuElement **nodeTypes; float *coords; guint mesh[3]; GArray *density; GIOStatus status; GIOChannel *flux; }; static gboolean cubeAtomicLoad(VisuData *data, const gchar* filename, ToolFileFormat *format, int nSet, GCancellable *cancel, GError **error); static gboolean cubeDensityLoad(VisuScalarFieldMethod *meth, const gchar *filename, GList **fieldList, GError **error); /* static gboolean xvAtomicLoad(VisuData *data, const gchar* filename, */ /* ToolFileFormat *format, int nSet, GError **error); */ /* Local variables */ static gchar *iconPath; gboolean cubeInit() { const gchar *typeCube[] = {"*.cube", "*.cub", (char*)0}; /* char *typeXV[] = {"*.XV", "*.STRUCT_OUT", (char*)0}; */ /* char *nameXV = "Siesta output format"; */ /* char *descrXV = _("Siesta geometric output format"); */ ToolFileFormat *fmt; fmt = tool_file_format_new(_("Gaussian structural/volumetric format"), typeCube); visu_rendering_addFileFormat(visu_rendering_getByName(VISU_RENDERING_ATOMIC_NAME), 0, fmt, 60, cubeAtomicLoad); visu_scalar_field_method_new(_("Gaussian structural/volumetric format"), typeCube, cubeDensityLoad, G_PRIORITY_HIGH - 5); /* fmt = tool_file_format_new(descrXV, typeXV); */ /* meth = g_malloc(sizeof(VisuRenderingFormatLoad)); */ /* meth->name = nameXV; */ /* meth->fmt = fmt; */ /* meth->priority = 61; */ /* meth->load = xvAtomicLoad; */ /* visu_rendering_atomic_addLoadMethod(meth); */ iconPath = g_build_filename(V_SIM_PIXMAPS_DIR, "cube.png", NULL); return TRUE; } const char* cubeGet_description() { return CUBE_DESCRIPTION; } const char* cubeGet_authors() { return CUBE_AUTHORS; } const char* cubeGet_icon() { return iconPath; } static void reader_free(struct cube_reader *rd) { DBG_fprintf(stderr, "Cube: free the reader structure.\n"); g_string_free(rd->line, TRUE); if (rd->comment) g_free(rd->comment); g_hash_table_destroy(rd->elements); if (rd->nodeTypes) g_free(rd->nodeTypes); if (rd->coords) g_free(rd->coords); if (rd->density) g_array_unref(rd->density); if (g_io_channel_shutdown(rd->flux, FALSE, (GError**)0) != G_IO_STATUS_NORMAL) g_warning("Cube: can't close file."); g_io_channel_unref(rd->flux); } static gboolean read_line(struct cube_reader *rd, GError **error) { rd->status = g_io_channel_read_line_string(rd->flux, rd->line, NULL, error); return (rd->status == G_IO_STATUS_NORMAL); } static gboolean read_comment(struct cube_reader *rd, GError **error) { /* Read the two comment line. */ if (!read_line(rd, error)) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong Cube format, missing comment lines.\n")); return FALSE; } g_strstrip(rd->line->str); rd->comment = g_strdup(rd->line->str); if (!read_line(rd, error)) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong Cube format, missing comment lines.\n")); return FALSE; } g_strstrip(rd->line->str); g_string_prepend(rd->line, " "); g_string_prepend(rd->line, rd->comment); g_free(rd->comment); rd->comment = g_strdup(rd->line->str); DBG_fprintf(stderr, "Cube: comment '%s'.\n", rd->comment); return TRUE; } static gboolean read_natom(struct cube_reader *rd, GError **error) { /* Read the number of atoms. */ if (!read_line(rd, error)) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong Cube format, missing the atom line.\n")); return FALSE; } if (sscanf(rd->line->str, "%d %f %f %f", &rd->natom, rd->shift, rd->shift + 1, rd->shift + 2) != 4) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong Cube format, missing the number of" " atoms on the third line.\n")); return FALSE; } rd->natom = ABS(rd->natom); DBG_fprintf(stderr, "Cube: number of atoms %d.\n", rd->natom); return TRUE; } static gboolean read_box(struct cube_reader *rd, GError **error) { int i; gchar dir[3] = "XYZ"; /* Read the box definition. */ for (i = 0; i < 3; i++) { if (!read_line(rd, error)) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong Cube format, missing the %d box line.\n"), i + 1); return FALSE; } if (sscanf(rd->line->str, "%u %lf %lf %lf\n", rd->mesh + i, rd->box[i], rd->box[i] + 1, rd->box[i] + 2) != 4) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong Cube format, missing float values" " for box definition.\n")); return FALSE; } if (rd->mesh[i] <= 0) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong Cube format, wrong mesh" " size in %c direction.\n"), dir[i]); return FALSE; } rd->box[i][0] *= rd->mesh[i]; rd->box[i][1] *= rd->mesh[i]; rd->box[i][2] *= rd->mesh[i]; } DBG_fprintf(stderr, "Cube: read box %8g %8g %8g\n" " %8g %8g %8g\n" " %8g %8g %8g\n", rd->box[0][0], rd->box[0][1], rd->box[0][2], rd->box[1][0], rd->box[1][1], rd->box[1][2], rd->box[2][0], rd->box[2][1], rd->box[2][2]); return TRUE; } static gboolean read_coords(struct cube_reader *rd, GError **error) { int i, zele, nb; float rcov, trash; gchar *name, *ptChar; VisuElement *type; struct VisuMethAscii *infos; gboolean new; rd->ntype = 0; rd->nodeTypes = g_malloc(sizeof(VisuElement*) * rd->natom); rd->coords = g_malloc(sizeof(float) * 3 * rd->natom); DBG_fprintf(stderr, "Cube: read coordinates.\n"); for (i = 0; i < rd->natom; i++) { if (!read_line(rd, error)) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong Cube format, missing" " line %d with coordinates.\n"), i + 1); return FALSE; } nb = sscanf(rd->line->str, "%d %f %f %f %f\n", &zele, &trash, rd->coords + 3 * i, rd->coords + 3 * i + 1, rd->coords + 3 * i + 2); if (nb != 5) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong Cube format, can't read coordinates.\n")); return FALSE; } rd->coords[3 * i + 0] -= rd->shift[0]; rd->coords[3 * i + 1] -= rd->shift[1]; rd->coords[3 * i + 2] -= rd->shift[2]; /* Try to find a z number instead of a name. */ rcov = -1.f; if (!tool_physic_getSymbolFromZ(&ptChar, &rcov, zele)) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong Cube format, one atomic number is 0 or lower," " or greater than 103, check your input file.\n")); return FALSE; } name = g_strdup(ptChar); /* adding nomloc to the hashtable */ type = visu_element_retrieveFromName(name, &new); if (new && rcov > 0.f) visu_rendering_atomic_setRadius(type, rcov * 0.52917720859); g_return_val_if_fail(type, FALSE); rd->nodeTypes[i] = type; infos = (struct VisuMethAscii*)g_hash_table_lookup(rd->elements, (gconstpointer)type); if (!infos) { infos = g_malloc(sizeof(struct VisuMethAscii)); infos->ele = type; infos->pos = rd->ntype; infos->nbNodes = 1; g_hash_table_insert(rd->elements, (gpointer)type, (gpointer)infos); rd->ntype += 1; } else infos->nbNodes += 1; } DBG_fprintf(stderr, " | read OK.\n"); return TRUE; } static gboolean read_density(struct cube_reader *rd, GError **error) { int i, j, n; gchar **tokens; #if DEBUG == 1 GTimer *timer; gulong fractionTimer; #endif #if DEBUG == 1 timer = g_timer_new(); g_timer_start(timer); #endif n = rd->mesh[0] * rd->mesh[1] * rd->mesh[2]; rd->density = g_array_sized_new(FALSE, FALSE, sizeof(double), n); g_array_set_size(rd->density, n); DBG_fprintf(stderr, "Cube: read density (%gMo).\n", sizeof(double) * n / 1024. / 1024.); i = 0; do { if (!read_line(rd, error)) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong Cube format, missing density lines.\n")); return FALSE; } tokens = g_strsplit(rd->line->str, " ", 0); for (j = 0; tokens[j] && i < n; j++) if (tokens[j][0]) { if (sscanf(tokens[j], "%lf", &g_array_index(rd->density, double, i)) != 1) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong Cube format, unreadable float value" " %d for density.\n"), i); g_strfreev(tokens); return FALSE; } i += 1; } g_strfreev(tokens); } while(i < n && rd->status == G_IO_STATUS_NORMAL); #if DEBUG == 1 g_timer_stop(timer); fprintf(stderr, "Cube: density parsed in %g milli-s.\n", g_timer_elapsed(timer, &fractionTimer)/1e-3); g_timer_destroy(timer); fprintf(stderr, " | %d elements.\n", rd->density->len); #endif if (rd->status != G_IO_STATUS_NORMAL) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong Cube format, missing float values" " for density (%d read, %d awaited).\n"), i, rd->mesh[0] * rd->mesh[1] * rd->mesh[2]); return FALSE; } return TRUE; } static int read_cube_file(struct cube_reader *rd, GError **error, gboolean withDensity) { /* We read every line that corresponds to this schema : "%s %f %f %f" */ DBG_fprintf(stderr, "Cube: reading file as a cube file.\n"); /* The storage for read line. */ rd->line = g_string_new(""); rd->comment = (gchar*)0; /* Storage of number of elements per types. */ rd->ntype = 0; rd->elements = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_free); rd->nodeTypes = (VisuElement**)0; rd->coords = (float*)0; rd->density = (GArray*)0; /* We read the all the file. */ if (!read_comment(rd, error)) { DBG_fprintf(stderr, "Cube: no comment, not a cube file.\n"); return -1; } if (!read_natom(rd, error)) return -1; if (!read_box(rd, error)) return -1; if (!read_coords(rd, error)) return 1; if (withDensity) { if (!read_density(rd, error)) return 1; } return 0; } static gboolean cubeAtomicLoad(VisuData *data, const gchar* filename, ToolFileFormat *format _U_, int nSet _U_, GCancellable *cancel _U_, GError **error) { int res, iNodes, i; struct cube_reader rd; GArray *nattyp, *types; gboolean *flag; VisuBox *boxObj; float xyz[3]; g_return_val_if_fail(error && *error == (GError*)0, FALSE); g_return_val_if_fail(data && filename, FALSE); rd.filename = filename; rd.flux = g_io_channel_new_file(filename, "r", error); if (!rd.flux) return FALSE; res = read_cube_file(&rd, error, FALSE); if (res == 0) { /* Allocate the space for the nodes. */ types = g_array_sized_new(FALSE, FALSE, sizeof(VisuElement*), rd.ntype); nattyp = g_array_sized_new(FALSE, FALSE, sizeof(guint), rd.ntype); g_array_set_size(types, rd.ntype); g_array_set_size(nattyp, rd.ntype); g_hash_table_foreach(rd.elements, (GHFunc)visu_meth_asciiValToType, (gpointer)types); g_hash_table_foreach(rd.elements, (GHFunc)visu_meth_asciiValToNb, (gpointer)nattyp); DBG_fprintf(stderr, " | begin to transfer data to VisuData.\n"); /* Begin the storage into VisuData. */ visu_data_setNSubset(data, 1); visu_node_array_allocate(VISU_NODE_ARRAY(data), types, nattyp); DBG_fprintf(stderr, "Cube: there are %d types in this file.\n", rd.ntype); if (DEBUG) for (i = 0; i < rd.ntype; i++) fprintf(stderr, " | %d atom(s) for type %d.\n", g_array_index(nattyp, guint, i), i); g_array_free(nattyp, TRUE); g_array_free(types, TRUE); /* Store the coordinates */ boxObj = visu_box_new_full(rd.box, VISU_BOX_PERIODIC); visu_boxed_setBox(VISU_BOXED(data), VISU_BOXED(boxObj), FALSE); g_object_unref(boxObj); for(iNodes = 0; iNodes < rd.natom; iNodes++) { visu_box_convertFullToCell(boxObj, xyz, rd.coords + 3 * iNodes); visu_data_addNodeFromElement(data, rd.nodeTypes[iNodes], xyz, FALSE, FALSE); } visu_box_setMargin(boxObj, visu_node_array_getMaxElementSize(VISU_NODE_ARRAY(data)) + visu_data_getAllNodeExtens(data, boxObj), TRUE); visu_data_setFileCommentary(data, rd.comment, 0); flag = g_malloc(sizeof(gboolean)); *flag = TRUE; g_object_set_data_full(G_OBJECT(data), VISU_SCALAR_FIELD_DEFINED_IN_STRUCT_FILE, (gpointer)flag, g_free); } /* Free the local data. */ reader_free(&rd); if (res < 0) /* The file is not a Cube file. */ return FALSE; else if (res > 0) /* The file is a Cube file but some errors occured. */ return TRUE; /* Everything is OK. */ *error = (GError*)0; return TRUE; } static gboolean cubeDensityLoad(VisuScalarFieldMethod *meth _U_, const gchar *filename, GList **fieldList, GError **error) { int res; struct cube_reader rd; VisuScalarField *field; VisuBox *boxObj; g_return_val_if_fail(filename, FALSE); g_return_val_if_fail(*fieldList == (GList*)0, FALSE); g_return_val_if_fail(error && (*error == (GError*)0), FALSE); rd.filename = filename; rd.flux = g_io_channel_new_file(filename, "r", error); if (!rd.flux) return FALSE; res = read_cube_file(&rd, error, TRUE); if (res == 0) { field = visu_scalar_field_new(rd.filename); if (!field) g_warning("impossible to create a VisuScalarField object."); else { visu_scalar_field_setCommentary(field, rd.comment); boxObj = visu_box_new_full(rd.box, VISU_BOX_PERIODIC); visu_box_setMargin(boxObj, 0.f, FALSE); visu_boxed_setBox(VISU_BOXED(field), VISU_BOXED(boxObj), FALSE); g_object_unref(boxObj); visu_scalar_field_setGridSize(field, rd.mesh); visu_scalar_field_setOriginShift(field, rd.shift); DBG_fprintf(stderr, "Cube: transfer density into field object.\n"); visu_scalar_field_setData(field, rd.density, FALSE); *fieldList = g_list_append(*fieldList, (gpointer)field); } } /* Free the local data. */ reader_free(&rd); if (res < 0) /* The file is not a Cube file. */ return FALSE; else if (res > 0) /* The file is a Cube file but some errors occured. */ return TRUE; /* Everything is OK. */ *error = (GError*)0; return TRUE; } /* static gboolean xvAtomicLoad(VisuData *data, const gchar* filename, */ /* ToolFileFormat *format, int nSet, GError **error) */ /* { */ /* GIOChannel *flux; */ /* GIOStatus status; */ /* GString *line; */ /* int i, n; */ /* double cart[3][3]; */ /* float box[6]; */ /* g_return_val_if_fail(error && *error == (GError*)0, FALSE); */ /* g_return_val_if_fail(data && filename, FALSE); */ /* flux = g_io_channel_new_file(filename, "r", error); */ /* if (!flux) */ /* return FALSE; */ /* for (i = 0; i < 3; i++) */ /* { */ /* status = g_io_channel_read_line_string(flux, line, NULL, error); */ /* if (status != G_IO_STATUS_NORMAL) */ /* { */ /* *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, */ /* _("Wrong Siesta format, missing the %d box line.\n"), */ /* i + 1); */ /* return FALSE; */ /* } */ /* g_strstrip(line->str); */ /* if (sscanf(line->str, "%lf %lf %lf\n", */ /* cart[i], cart[i] + 1, cart[i] + 2) != 4) */ /* { */ /* *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, */ /* _("Wrong Siesta format, missing float values" */ /* " for box definition.\n")); */ /* return FALSE; */ /* } */ /* } */ /* DBG_fprintf(stderr, "Siesta: read box %8g %8g %8g\n" */ /* " %8g %8g %8g\n" */ /* " %8g %8g %8g\n", */ /* cart[0][0], cart[0][1], cart[0][2], */ /* cart[1][0], cart[1][1], cart[1][2], */ /* cart[2][0], cart[2][1], cart[2][2]); */ /* status = g_io_channel_read_line_string(flux, line, NULL, error); */ /* if (status != G_IO_STATUS_NORMAL) */ /* { */ /* *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, */ /* _("Wrong Siesta format, missing the number" */ /* " of elements line.\n")); */ /* return FALSE; */ /* } */ /* g_strstrip(line->str); */ /* if (sscanf(line->str, "%d\n", &n)) */ /* { */ /* *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, */ /* _("Wrong Siesta format, missing the number" */ /* " of elements.\n")); */ /* return FALSE; */ /* } */ /* if (!tool_matrix_reducePrimitiveVectors(box, cart)) */ /* { */ /* *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, */ /* _("Wrong Siesta format, primitive vectors are not 3D.\n")); */ /* return FALSE; */ /* } */ /* if (g_io_channel_shutdown(flux, FALSE, (GError**)0) != G_IO_STATUS_NORMAL) */ /* g_warning("Cube: can't close file."); */ /* } */ v_sim-3.7.0/lib/plug-ins/cube/h2o-dens.cube.bz20000644000353400050620000041375412215546174016003 00000000000000BZh91AY&SYo}_p@ ! ?'ch(PJ%THAJ(P@H Q@R(P$HP $EH(UPE(P@(@U)T@((*RJ( B* ((U@Q@( @Q JH"( `@ (R{eA@T )E( E1H1E$ $% )EIRERH"I)E%"D( QJRJ@I$IE !%PcI%%()Q@J (hJQA%)MTP$ JJI"J*Sl%QRR$AcI R f PREI("(T*@J4ʒ% H%JJ$JTUI$i@HJ% )* R J)@R*JU **JDf RPUIBIT J(V!*RH()Jm@E2UR@HRT T*V(MT(hRP"QR DEPR(&H5@)V*U)hU$ (R@P U$ )IJ($RP6I@ e(h@@҅T jRQ@( R@l)J P @(*A@D"hh%P @ -T%(k@ J(H$(TPUR((TClT)@h hiIJ%H*T)[e +FJ@  (֨( T(H $ k @(m @@UJ "$UPP@ ( % (@ JIО4dd3A*aU@2F ɡ$ڦh@P 4@ xM4 KߥQoܢJG%2qObX5|Ab Lr4 Z!l8,[!%ĭHA䤄0 L‹bLaRZ5)BP Z+je J)HCq WҘʖF-o DKUR"PZT! KL B]Uj% BQK$lCEbR BKD̡kS6**B kؖ|jB$cbY,SsZ- S,&IPK*K\FS%hB)B1kj҆1$!v5 4bRYubJJV-I-J)ZJqi8_V-,!*!R%i}bP )_RƭhR҄!ZŨկ)iaZ)Z֥!2!,OnjRַUĔ)0k>ĩJԔĚ-BҔjR$I KBT2VŤ1i-[R-,JT1K[SLR~1*ZIJ !Iýŭ )/ZԹ(8ħ5 5-1 S%-BRJX-LiJZ-G1Y?[]5LRI.R jRJB%(bVb%[PbЧcemZB(Ԥ bRJԺi(ȔJbClJBiJ-,SJO !KqKZThR$6 [MRУaВQiJZBVQ6J☵bL)M)iCh]j}4 5lı5 SZNʔbЦ꘴}q*S>$! Zײ%$IHJH) ST!(BNS]!I*ARִYzIIĥZ%,RX*~>-Ib6Z Z2 J)Zq1mjS bҴJZ)JE%ZX a*)(QųljY|%dBeR_ev֥)KRJ,Y1hҒ.ȴiIJ)ZJ-Tg]RB%kJR)%HJYZ%JciӒiuEJ%+BJHԒڒekOBkY,JԔkY) b6{uq O4%+J]B]|߭ \1bڔ$RR)ladJTҘRB!HA)ZT)AĨ$"2i- S,%mKV)hD)i+%)J 09 1e!h!KJţ-l[KB,JRL۷iR$Ř.(S1jTKRo"6ԭI1$CkRcZujZYBcJ-K4)iCP߭iV*AlU) [>jiAj- BBJJHjK%A(JҷԔ H)bE!_v a6% )8д%)jZu)Bֆ-hX-OIb.Z%lMwmԶ)D.R%icJrR,I0 R%5jJIJI)& %)lJ%k؂P!H:-!GR(B>IZ☔QRťkbRBQ BвAjiIKN+ JIJT[D[)BHBbSFJUlbJRE%,! %)J! ZؤDZbbP BZP!Il[[V8q CKV%-TKEE%,akbVVZi4֤RSF1:ԡAk%6BPųRRVҥbJZbZJRuQKQHKkjVC-JZҔtZQcmD)ƥkBKJZJ[ȊJRJ[he%*Q))\iIZF.5b4K~Xŵ⚖%z҄)RbRaIDRTvV)ZZإhƗD1+BYI-.0%RP#i(BbL[LbѨQEŰ)i$JJҧJRȉ%-Ԃ-)jJif1 %$ [- $5kY(Y}HGjBTLZ"R%HA V[Z>TRB IIA )թ!Bܥ}M!B-K!l%%IbR֥,KR0&4Ԙ) aHJVbB)/rJťġKcŨ)oRHJD*RJBŭ bT$T) b!?-$%tbR"խEU! JT-b>!&'m1qVSJmM2IEXV%lJ BRHU)9- BLRJFZTť+)&QE!(^R,Ѕ[! )kTB RaB/ AbHZ AhZJ*RU)֕ƬbIq3!,JKBRq!2$QJZVAJ-lLJQҊRҥMRejjkPIZ_jL-JҿkJU18ؕ1hF>8*K-1Z~jKm,JLbmM'[\E! d)-RRВ#1ZR%i[RIC.VŘZPIjRЕ.ab1*RNZ$%$JTm&7)ZJ%*JT-"8-Z#iCBQ*LVH]YlStTJUkZYR516J&%*Jkj-*lhZX̡HBbRJ LTA B5 BZҥ B\1HZXaiJD!PD1KQ R bԂbiJP6b*tb$SqdS)(q5 M).ԕ\)*&bfiII3%11IL]J\*D+6uJV!Q!- E$-Rĩn! Lp+r؉dvĖRRZL})Hjj)ccA{ŐKJa_Җ1iBE-L-Irܢf*&XSKm)1meaJ)JYr)nT)F!} )-6e,ZؕEJZZ5*Q 1]_vy10JB}VTkZ05GJZ%iKS Z/!&5RũhQ [!Yl1IJqip!H%F8WJqiZV) RYJԴ?-J- Bh┆Ե1OV15)a1mk7cgj5d W[k Z*Z b!"BPRVTs%%S5/)H9Qjjtb-+b> B-K%z;jҕ.ԿTI..S*Je B)TOZRc6ı+JPBQB%K@nq5 mMIcBL{ɵ-7fiqM0"T!)(1iqf+[IBBBBR(BV,bPԱW JTqJZք-,}-kKKN&1%*uŷ RөV%-RaW}CYoBSZXĒƥ$1Z! \-ZVKK!JRTSZV+LRR_%iZT1q-b,19 bcYJR؞9 2\cZLAJq cjկRR]C) Qĕmq+l(],%b!P RJx!kAMjeKS%55IBԐ1 KiH[M)s J[H[V7WԶgؔҘeiĩ-B]qύC\JRJi1R R~) e:ZB)u+)lL%ooB\/+%JB,ZGjҴsP,Z-2TĦ,)+Zؔ%+qS\!ZT(qkJjBo$>[HcRR-mq-/5E$BZqoZڴUym\ R~Д(bC%Sq-ju$JRZJJ2ARXmmҗmN4K%EF)*kcS>-8)}֨E8VҔ-J%ujqvL1M(Z-JZTS,k\Zu i78t58ԗ }n&B\Q[RZ! *5M[PV Bj!.b!JԺYĦNiqjĘ$5mb-)B]bB]:P b!D:(էRZSjujm)bQi[)%NqqMiK,iY,R*If%k5b%IK TĔq ,֭+RC> CP1PBTŸcP j>q-hR҄5I 1*cPT=Nҵ}vZQ-bjZhJdJHJkiZD!(-UƳjc7ε&ۅ*DJKmJk ZP\$N)u*RRKJG[բDV!D!K b8#Z҄%i}%k/SBRJJֵKP[Z.u*bR_Ҥ,In-8kYIG֤KJ~sBkbLjRRIy;.5c;-_8S) K)-.ZzbRJ3h>I[S)lR\jհ|- %[TiY-R^%-hBTZ1 ur?[ZRؔ14)+Oص-/XCIBߥ*JbPTB)I)A RZ]Ec7c[cT PjІ CRV) RXԩj[Pe) BKj؆5j bXD jӨK_jR-+!cCSV A1ISe%SCSjЇRŸbTű+q bQ,!jCTJ%}BԶmًFҸD񥶕-e1[KLJ1Q)1JQƧ_Yi-k*d-*-*Z )hJ>J8ԩK-eM%h8!o[VZғiTJԆ$11\IB\D(bJ $LKcI6"QjZ*,%!Q}l)LZ6[XOڕ5QKQ)%I RZ1B֤BKhR17& LQ,J\)JqHZT1%lOٌZЂRũ1,RڒuF)i% [Scq J85 RX mr%[m2k^;բҵbZظR5bOmJJXFl!e%RTÍZڕK8┲Zı}TYLJIJ)KZ֜RQ(AjBĭĩk!)JZJ֔$,RHZԄ7mIBЄFjADb^ABԔ5%;%jbVRZK}[ؖ!j%MZSɖ, Y+y$OZ*%RV2(81Cd-%Iq1 -)+YM)m,K[bJR$աi}MB[Y1>uoCX؆-R} S!KRԥ-HZ-fV[K1ORjRCMҘġC&1/-jJ6ƶ4[LR9*vYZާ[q,TCPTBZ B֕jk\K>)Kd>) ba,qTR~)lSXƱ Jĥ ZN5JRV$յ-!+uI[Kq-c☵Lb jTc-R:!f%,Cb]KkP8JY Z>-jԔ!3>)JRPB8!djN-BKB늷o&#[-nXbCRĖZ[%f-[4>ջŭ,RXkiN1aB!%jBŭ1KRYԭۥ)kJ` RI- }hSR1[IZ-/҆)i%5IjԄ!kMRQĊTJQQm-QMjRҕCZJ/JIfm^1ZR:1),GӋqHCTHY+BD1N%-Z~g:1IB\Iu w!jBkbZJӫKƩBIBCq8%V&T1 RԷj %JJKV)DMiI*%JUOiG[֤18% ZJRI5K1mB})BTԱ*ZI Q JJ-[դ(mծ!,WRpZէCZդmRHjj!}cX a*77u9&.RbRuKZJbT-#nƔpgR[KijZ2.LH$u*AlWRM .RPËRJJBԦ [[u*6UlbTjcwq-Z5 YJZP!%!M) zI!A SZ0! JLRRB%qCN!mbqKBRQR5B CLC-)R_cĜB֡tꚔ! ukg Y RXաbԾ56#bԤ) ZLS"TKjm1M% 1NQISVZ1 Rq! !h- KZ J!)KbRdB *Z֢KF,Q.}kQ OZ[1)q (N1oLAD!$dIJTZ 1NpLlIbR0}.kZjԩJJŒťFC)I!JT-*BjT)*)dIb TdŵijBҶ%BX1/䡯šHZ-*%kRPjBQJZT(rTZIRZV8Jj- A)U*ڥ(֡}\jԔ-q+kRH4-jB I*KZZ12V\)KB1ZiCA($П[PSTbЏ+JPTkvť.S*-Jˋ)Jֵ-()-JmննShJRƺ_FBIB%BuHBhm5 ZJRHaܖkc[BVRS EAN/hj8'Sŭ%$%J-bВҒؔ))EZERRRW%i-kJ-11XIb )0ũZSj\9ZI%hBRY(biD ZjZߪ%B 1LulRRѥfQ%iIQ$VRЄ+c[ 5C!R>tgR--hY)K/夷!5KHAi0-iB(ZJд)B&!L )$!X9 !• C1!dLcb]SAHw[[ ZV&Vd)+RR)(bTIT>)-)cS%J\Rť Zd%-8@TbJRq0ıRԶ184- Zhҩ1Q:T4ŴTS{N!#]Y[b!LYjԕڅ5,}(Z'% u-jP9MR%(Z) S-Q)Y)jjժQJjZ1%BqhRST|R␩B҇R<- %*V![ai%JҤiJ6VJ1&) [Sm&D%+Qi))IiMI*XSL#JaMSV)Z1,˜.ibԄ812Z┎%lBT !+jZԄ+)Dd)hZ5_жaLk[BZ\jP6B>cK)-Na Gԧ"4%Rbԭ6jm kbm)+)J)q!KKBKLZ֕|YzFֲVVZTRM)|աd8ԩ)JRkb˔[(M*)K!_BPi$nFJ԰EJIRS2CV }'K\K%cbV)5IBR)O(ZҿK)8K6ڿbJ}JJФu SJHBĖPKk)ĥbRJR BXOشd-/e! Re(-*!(QN(!Mcu,!Ƙ}ZRڄ Tҋl-LBBIbN1lQT) -*%N)o% Lb5b+-kN-j (W}Rډc!u B!)܃`)D-Ғ5ԩؖPX7RD)kBd#)Q bbTA i[5h]J Ԕ!h,ىC S% qb}RTIa!hB$CԇŢy qiRJ}jS5 bIkC}hBGέlbRYjB51iZ%:Z-d-k%kjԿ|Xj Jm)j1n4`\q CII BԒ~vT))JWh$KXVn㮥Q()JlĮ%Q(*}$4&%)HjR [.khSV1R)R՞aHB5LRTRZm+[S02% 1[KhLjؖ3iM[ Hj_Z!jXT5R֝BS+Ř!$e-cĭ 0-jcuq SNAhZY-խ!rɈԩ ZPR!P$-b֔Е1(cT-bSlZK-L%qEJIJb,KZ!Ie8bп"eMvqb ťH܆!iJI[>JĔ!+R촥f>Zif(RR}{\ZQlKj(j1-CqMqd&Ԫ&688!8BX\LC[R-(J-J)*RRBmRY+KgjB[}o KT.!h}hK- @%J-hZԔ*ԘPV%ǹh-rPRSC]KC5[b!)Zx$!KX5QYpCPISԥ jMZ! AKRpj﵅)Oq81tZQIKJTb֊"ƒAIZPRBYHb֕k1X”Kŵek%*JŦ>\B1 8NhҊKJԴ&ZMbJ҃jGԕ-JT8ϵĭlb% Z1-I$(i}i[J BQ q.5t)ZS&Mi*eڕhj5bR j1,RikJKcLu$IR\IZ֥jRQPibqH5g},–IY k1 IIbKjҴK[}mj!iKV$,BIOF[! BRhR꘾!M8Ҷlb% jbŴ-_қKME%luեjqLBҥ(%IZ-iZbx֢jƩDƢKuPUTcCJ>nn8%MJZ)!}JIbje)J-m)jҥi050. BXCjbf% RbB1(cOe,BjS q6VRGЃ\SXJJA%Z_% cVZ\bPLqı JVSQCT% [-ۮbj$$SR֥ZS n3\GĚBRS)jE1n$MZ_Id!I% A)KıI[1 5)B)bXJTZJV(b%BYbЄmb_caHb⯘#q1?u' CP)$8IE’LCPp,bH)mbPcSHf)Hrϭ%qHRRҌRIXZyMŤhҩ4>CBV꘥Z% c~Q a)qv-)6 6S}Qj)kDn8-(J~Z[Pqu%L1ie$rRЕ!*% Q*uSY8,5tl!cLJϺjt)!)S Q5)o-% }HkYjBYK8ZR)jR؄)J֕ J CX$!}MZ51(bq%E-I4#(KIZbZKB!J8m)RbCJؕJiKqVHA 5LJT)i ZФIJWť S!kBHcZ' BRQMBIhe2KAY)X8LcotIq r'~-iCYJ5*CP[%fjRTZ!e)-$ĩ BK5B RbLbIKRK Z)i%,b RkAiBRֵ.}&X5CM4Z[IʒL[b!IkFRbV5ZJ_1jJ/Sĥb -Bnš1nIIKkZy ebB:%hZWFhSеba&)rꚅ )!1ԦBV)Dq bRB1L% q)0mjKBƭ-qKLCQ̶) biVS\bjd8)ŖH-BU- ZaMk)RԭnpҘm)ĥISn#!gR%HJmxօ8KGA}JZkZ,IhbԂP Z_c)C[ŐT&Ҥ!IRR5ŭr4%!%$ĕdiiq(ũ.IY)SbңPB1rkk)j%)qM1ƒ7 KIIBLa1 !(CeZΨZKL-6ţ[j)k)K-j[Wж)qbEN8-)Z\l%4HuHLJVJԧq,jBTcjYm#iRғ–Y%8 .~!+)d[+HRJ[J4*ĥIKR1KZu,)%HjWB1 % ]! %hEPjR,҈Wűj' !q*\SJsִ!JBBT(B%*%!Rз)*[]qkS-NыiLiR:1b1 ZJ$heĬBq$(i-b_R-fl\Q%|,թ-JKRԩҔi-Rak1IABJ(ġD*J\JbOT)1.5bIBp KJ!RĔ-+J~%NC!8jJ_[Q+jRش 5I BHbԴ+IkRZZֵVĪ"ĵbajib Z RŖ)bZTjB5 ZRJ[1% q [-D>eJjA Y)$}}m)kcZ8Qq B"M41+S,Ke0)iKWY4,)HBj!ae-hb!B.bm*(1..!,CkcZRBS_AIcY`*P!XSĤ1+QI-ni/8 %%%*B8mDBP\R %'i֭!V% kU-n! qmR7 )F5%N JRЩZ!bZ]Q7U BP+Rű)!12 ť)R҆%!ŵICRW'Ԓ֦%%4'Z!Ũl)mK(jckZJ饭IL)/5+m(SjVZ)^$mTY8Pq$A y!(%'T-daPSCb)CZ1[}[KDRҥ"ا ,i) JVֈ})Eb%XϱZ.%)JT}%LZ%)B,0%(Ze R-*-d,J RГi$1[ZeK)j %(PҾKPK-a-)B؏JЖ-е1ef<Ԣf!ae--&%(C>A-E1 bXKeFi:ZVJԖim(ʅŭ)RK))B Wگ:)J[#jֺjbأJ%*! w-H[KJĒjYKKYKCBeLA>RRX;ZPRqn8-cXKRlsTcR%[1d)J}N!kyS~9% -ZRap'ĥ!hB؟($X- ZPXjֱ !*1yn!4օ)RBMbb|*B!hbXP1kR>JBVkV!KRZV*Z}RZ%R>%ΨZ)MD%%iQ BJԥ%oKRթ*$%Rؔ9*>!,ա CcƱJJbR.9 BRեB 6qĐ&Z%1JRݍiBaf RB)+֜BBԴ)RPb2%1*bP$ʐ-J!)kR[ bV)f&KZV!m)KQ6Dbu:jJҔ1 R}QKV}MIiBN&!qN%(l!) ZKťhcJjQ-IBIDMZSCZ-e)IBSu[N%g!,u>RԔ81 AJR5If YShe) q qY?5iZR1K[qֵ!iE)F>()kHj BBRR!ZTV%֩!5ZEbbZBֳZ$BbҢԄ-Kc)+J3A5 u8⒍BLE)^-9Z$(Z!jJE)jZ! ))J4i\bJh Ŗ 0qo BBZ}[KR!,B]ŭ/ \)J5 J>jZPD-J SP!&(cVbBՔZ)Je$)!J,jRb }*UmcAj_R/Z).5%*jе J!iR҄1Pg(CIIZPRb~PԬ'T%Rԕ(!+ZJŹ a\-rAlŵ$S\g-}SZu1֥bΖ1ICCV1\i6-JZiRB֢hQ؄%1ZqJU%nܖ8Z؄%)%ZRV7mRRT*԰ƩK)ĬW1.1KQB%J ZXh}ĵ B!}RP+)٢҅ĩŴ붷S򒤣1K-dj[Z-qk)kYil-RR4KY Sqr5hCq)B{xŵ8#Hjm-lZ(BK-ZWjAR!k1(1(])ZI}DiZY8i&)j.ۈRV1BԶ 2-wRT~d -a}HbTbd-;kC5D4P*j:҅JX)*iM5)Mtm)|bVBJY(Ŵ)[!|K\cjPIJZԎn8i8Q)} R%%IZ-!(B[ Qn[)kq*VZ!kkq1N- BhY -H-G! Y*Zyh[M1b^BJqbB䩨1HJ8; v\uQ#渆(ZPBm-1DZ\KKRX%rRZԭmRJԕ#~T&ŵk B)+RPJW"i)J q,!ejbqiJJc[5-R!$$! 9 cBIBN$ƭHJhY BjGT))! bДbR)B )*ִJ)e/,bŔCBZJ1+1Jb) 0RVSqe1X!r,aMRCI-JZc-CT!d)J1,q*R!h6 RV_bV1-)LZmZ֕f}jMRd1 CZťJT#VaKK!jLZRDqq+浨Ze C J-YiQ,i5ӌBV|xI%IFDBS#Bb֥څ[S-jĬ$o+R) C0 ZPK%)JRДE!*gض!}YIJԦ5Űbf&,SSġi[\cYZqAfJ1IBԄ*-d KűD)*1%!(JZ1,4Ŧ-*\J1(jJZX!L$) RTT-Feq,*cm%nZPZibrQmB- [j-))*D2+qŵ k1)J) )$% IBTbc%n)-A,N!JIKR–(j,8)d8ض-hbKi)TƩlwƑI%IETֵ, bԥCcl!PJKưbbX1<;q,sTcb[R5*J)dJDIpmJKS!&!1K^RRKA%JZҦ JVJ) T$%lI% b(n-}Z)RPBBZ1SV ihBN!(BJԤ+sSBAm}RTO}J)HR ZR%եcJjPRcjcT)qiR+:堾1ošX.1 9lR%HZPթj~4P)M(KIŶ.T1jJarӫQH}td)ϡqJqCICiRYR,)PBk:!j_RNJ -,䰗R+bkRݢBQHicB%!oڳZB1sXVKku jІ-iSRjԵR84)ID}fY1B؝-%'D5)Zq bԔ!)kP}LbBVk aV91IbRiR 'bRD)H)K|ֱ|b%ƭ)iBBش-.8bb~SƱ/LFԥ$-inhb kP9 :(B E,M1Դ҉Y-%i"ZVJhBdꖆ%yJ%8/[HJmbcոXR\!k$!(ZAФb`mR-,FJRIңHc Jŕq9jLlD.J6mOr [uji 1NVBS B KՋB%n%*l!/iRÉBqR!!m%+qYH-I^1K bVkX֒WBQQ5ki j-bbT }LBiJSBRu-)iZ$vġ(cP)FB-I-$ % RQ %-bN)+IM1kRi[bKMK}1Zb -BZ1kRFҔa Bе1;rVԜJPT- Y Z)KA [%HCZ\ShkX )Km1I1ZIK}(%J-+BIS1T1)ZVjևԅF$XcP&MbֲЂUJB1 JK%Kj PbxVm4KE%M"ؕSkV5 Ce,.:) BP>uԫR5*QR~Lƭk!I!R>9,yT(K 5i}+8,|ĒꖲĔbЕRД(KUR:)pr5HBÎ-2B],-i-jB8X%VLZ JԶK>T!n%(BUp85N ZTIR%$"Y,K-+JS ZB$Ҙ\ԩlbҕ!h )LmjqHB-m a$1)XҴ-k~ܥmRP\)ZD8!(ĢԒKCIC\j1K ZP$jR-[ƚ!JR!2Ԕ! IG)1:䬤8RiRP&0cqOKSvԩ(!IB jť*R R(ťd-$TYO)*_Ѕ,K}lKT!R-hq51Zb%IR SHJARjPlkB88JjR-5(AI ! BҕBЧ)j45RIcYSa q i!hF$.֥Zm1&7嚽!K)ZJ](jZ)+վ[(J*ZbL}I- C-8kZ%!"HBRb֔44[iJԊBQwX[ Bľ%HRҒV,qC-hZR%%IZ)LB UCT-0-LR[1$|K&oŚҔ1Ɛ,) T Bև)J1*XXXAZCI}(RTJ1(b}))&[ZӏZunIJu֭)i-qN-Cҕ5BP LIqlBأ%%E8} cXVXd% %))kuGj%ŭ )mK@ BaH!q$RZHB %MCT1$-)BԚRR-)Rrj-($!m!K#HeR)[).!%hF5+I_RPb%+))IKulYS%JCKZKkP4)) 5Z)j [ )e!ib*R JiЄ-MZhb$8*K-BY jJ)5)ZPKV!-+!Hc)jjX-Iֺ%*RKŠSZPӭb]cc_Jaթ_CP!n1H%haZ% Rօ-Hqa&%HRX%jBIJRš!)1f5%)[!l)Z,%MZ[[LBqFR!hBTKBY*RA KrQBIHRTCqL-cVBBu,bji*b\[Z1J$ilqRjJRе)KR-rI-š[RMj%-N9G\J- J՘)IRZ-,RXd JKZHBT!ehZ6J_qRKZTrSBP<\!-O,RPZ- JT CʗQ qjش,)*SHBָCPyGu&|1%)*KZlB)- !Z%-Q R-)qRB\)&Z1lJ J%McAK Zխϓk! B-DP q$4ִf-mZT[%Ɩ+J).qiiF""Ԕ-Ai5jK!Jn83MCZ9x5)}R bJtT.4VdjMqjST-(!-b J0ĭhBTGR/Je 1KIf)$ZPj Z)+Rk k\-jQ,R(Z\BԧTbjcԵD;-Z\SĒR>ֱlJBYhJS(ZTn% zK}*o,ZZ51_Cj҄1}%Ru(!!*RHj)|Jc0 ZV%("RIhBcRb8rjVrԾR%,[:Tu AšMbփj-!І)[KZbR-mSjҖ*JBn,ԱSI !e ZIMY-j_R5C~n%M}jV*+KZk[ZTĵ-K[aMBUKsq֥ qInP$ձ CPBP]%Wu Y l1iULYڄ)e5i!BSjUեkbJS(;L-nD%ZIh!uk[>V :!n:!!'Z!lSĩTZĩiJ q_qA)Zd/K5Z!b1[S<-,BBԋZZJԼSaԔP>b|jqZڲ kP>Rڢئ!j)*r1N)j1ŕƓũ*ZkRRVT\բBq5 !Jڶ1ZE!LcTe-H5$qh]!-b%K-}jBVH.I*-"5jWΡKűxŭH)OֻJ ŭIBRj aiBJSJLZԥ'[lFڕ-)5Ʃ)b!*RΡaLCKRũh(!ij⒂ԏ j!$-HZ_J1cT))l*j(Ѕ}iRIZRvRC7Bض ֱ ,! b! -kQ$%-SZRqiBV0imF-%a*brR8RS!+Gԥ!K! J>%*"PBXZƩE.%O b~х,>Ju+BEk}ĥjbYoSA-I(*ڙ+b%l-YY I)%1N%0%ձlZN!)lJԥqKZ]Z\kKSJRħN҆miJ;O)M0֒թKqRlԸ1-Zuk(ߡmZVIcWw1(8-kKT\jśJSk)n4m-ťjZ%-DJmBm4!4qISՐT[TTQ [a+&]jBc,RTA I\}u)Ԕձ-Z) JX%Pbҏ(UZI BFLTQ+NcӊZ.S%L%IAmKRXIRĚ!1 JRYZXkb!d-I݃T1IS*GAqhj S J1HK/RaHZLRLq[HQ KOՈZPRPCRP)D(R2BT%2HC?RbdK[%K*jZI-e!43$ŬlIHKά)E)Cq)bDc-HyJԩ%lBV-kJW} B!H%JB%1jCK1NhcjKC>a-,RTҧ!JKqJSZ Y jVFY:q JPVRRT7ʹJm%JRRwi[b֥)ZP)R-hK)]+屋BP%!Ib1bST$%7T%x-f5RbR E) %d)&˜ғ(2Tr c֜C}WM)[ŭ,i+-IZbRԅbV-jE-zu\/Sp))-EFq,ԩJRmJJPZk[T%ҕ%-%n!%%)R(Z1$ CZ XiZZ:TnhuMBf88) Bض#QJq,cmQIqX:$1+gZ鋷4'K[jZq8ibT25ijR;ID5.c-Ž*01j%iDWjRš׵1ZSԔb3⾤Jq -hkWiBVBT+-\RZDk% b*Y?Z BҘ!%KZX޺)*BJi %+JR5BҖ%_؆1TZq 8]RXZC$JKC CPĩC>9)icR88iIKH% K1j,pXְ*!(E;)R\gd!ISP-Y4bŭkZ_R:) !J%-EhbLJ\js"Zl/5O)N-&XǞ5j>W)YIyJ0P8KRUiiwNkJ Z1 #)GTrR-i-%CVzk(ZR؊I)qmIYIijJԷ!, Rئ32& ZԉJZ)cD%1p1/JIIK$kBƷbTŠ%-kRQؤWǓ,5JշRK ž-jijJi&Z(Ғi-IL\hƗԖKLE))_ҷP-J5֥0R&PĢYIy K,yLB Z)ġ R4,5*,5iy.:8r-JS!Hc‹F1*bK ZҔ8 )LJ֔ !kRZJN)nkC\Bp!V[XJũkZ Ya+ib5&% BbnӰZ qűIZ}UM a(b z1ĸťK!(!j- JT)1N-D 됮85HbLiĮs %eNb--E)qJKiRibbcWBQ/)?%LbROزШ10l1ĽչuN:c(CZbabT6Z1e8!L::%2KN4[IZWƒF)I:-2$[ͦ1lYikqjK jV-[P5%ԥ*B-RSIJUZm.ٲV!%8V%9ľĤ5ԭb)$1,JطmmǵEZB5RICL[X1S\!1Q3qԥShj1 gؔ(q Z߭q5Z_%_J l)8WBS>(.9)*J)Sm16Ԧb%b88%*BZ1 -?KZЂ(cR BP1dХjB!lJ[I! k! iq(3qBGZҎ5'C\bn8HBZ.5i.88CߩfJJRŵJcXƥ1q8Z! BBT.ִ!,KXǞq; ypIR}u!H3yAԥ)!(JG8[J1%%atKKX(8y Z>JZ]BbP>%&5Z1>kZ }(Br%Rl!hu|ĥNjZ o]MGҔ!+- TRKRmycƩH)h LhBRYjSJPġI(RPX6Ҏ-JAI8ո(uKF5q,a-ք!-BJqiSI]!)Z[QiLi)*%K-lRXmĥk[SmCT$8Y5(j(iJCST[k -)<:KrinZ jSkRֱ(Rꚧ֤/_ކ/7ؘRBkTDKj&)')D 1 b(b2ű ST,Z- KXkL)ÌR] } BR8ZŭjCYKQ)Hb%I+R! j[0MJRJ*14R$–KR JQJҶKHCek)ZS>ġ(JKj cfҎ!o8RJSyiCJjR)IRR| BKN)-6T-ISֵh4JPV1TY%JI</-gTwLCRŭϱkY0ı*RT-jJ1KQ ZPlYJ)EZ5 R1)!CJ*A'#cJ1nBBH%-)lB%(I5ք>icb)!I!+]dBB)/5!ťh[TTb~IBԤ BjYHRRBkZU%kj1KX(b0ı1cւKJԆGuK[!tZT gҵK\Kj2J~-Q)E|[%)Su qj6X)mŦ#DJT<ǩw0DDg|7D""?S""B!&PB&&!1R !pCLB"DDD" B&`"L L!D"1"  D!TDL!&HD&aDB(D@!m )`)-Bi Lrbc R JҮ5LkT cT&եeuKSTii[Zq.8n()kR!Kw q{k^jc*bՖΝ9Ը+BƭBkPƼuƭO0%bا5> Զ!*w-b-vR%䧭y]Aن[.Qj6 Cm %-N%H}-ZVu7BĩOP) Z8[F5%ߺBbyJ\A,JL b-.5"^$J]R_Gmם[BKy)T8CZR-OƵIK^bZԥuR\q*qսc)ǝu.!LJXq G!q5)5Kq%򚧞ZBb8)o}jp<!JVHB! xkA-BPK! KCKkΩcC\bumtڴ㚗 m)WfqFC<8K\])RQQŸ)8K![n)>~JHJ`"!) Q;)HJP%oSTHI.BոTK͌U%E%}zJX% ZҔRqSBZڶybXRJyxjIKIu/[:O)Jaֱl[I ֭Vql1jss! A)Cbb@ A CiZ-(yO5nrEAIJ)B*BзBǜ9CK8CoچB)h}Nyv) WmSR?i kJ^3BҤq[JAqLy8< t/qBЖ[XKR)LB][S})g׶'2Mґ>~[[OXE511ZSV)<ZҦ;ORBBjZy.!)cMCBF%IYVۮ2)Rq :ּ]S[ּSV G%$E%VR|!pBJ^u$ST-Z* 6ii$ LbkҔ}oS]GD@|I%Iu4i%.1ԥ>ԔR)0!)1Hun {*1JCJR)$)*!KbԦ aIG qJyZk:%!5Z5J%î1Mb{K]!%J%Rqq}/![JLKcb[I_b><-$ q} 1q [5k[8[JYcT뮵1%7q)Cy(b\ON8[5QI)ǐ)T!nO#y׊qU) KbCK C\jб KP+q )Iy甗9KĥУ#IZ[b]qh\Z\AՔjP뎦㮵ZR YE%:Դq K8!o:b^bc-(R jr),kqE ZkjϸUA!HR FC_ؤq2ϣ5'P<-$ҳ3}DDqR})"C!,Zv^S[J[4iIj!-)SB5 ~HIQhjq u-qSB]qk)kuǔ}k qkjSKXZBVƴ,}LK-5+J֩:b~mN-VTQ[҄N|, KCVcC]yV3fӥ:4kk[D\[ӆ<Ե%88\t:ƚy.uJuo%^Rj1)Q4 [(ה kWƸJ֧Q:X!'N<^gxІi[u]I􅵎n_[!<}6-iqgc[V S% 꾧yB؆pnYqgyJqȇ5mROju;|^D 8Ң<%_Rb--SbCT’z1Ժm-%SS8%)Bk-I8N-lR[ųs庒 C)Kq.;qT֗Jyq-1.:ێ֢a%(q/H-1,jk\ZRε/%y- -jJaT>mOck)LRcc5:yjP5J~,źj-)BԤ!ÎRQ^\-kjLjTxӫy,\B[Q+sNy jK IļJBy>[ZYƩN6%)[RW%BĚkkyo:.<iyǚizy(jW!'ԩjԶּX}ĸZbji:]u+rZ !<[jKxJڧֹuǺqձ BBзZ-1lBBHuIq^wƥiy:Ц~Ki K1HcSPTZġR" j82š0S\KqIq(y]iơ[Y}>\b AmLu<אb)Х1u-k<֧!%g^qiSZך!)koqO!kZ\CRyyļոJCZ8\Ru)H丶qռmJYZw)JR)HnXߵ昵Ty/8yn ZWytq58Υ.ּ<ZB\yJ-Y)*H3 f22a!у0S0b$pi挬&DOHܯib,80q-1LB[.O") p5溴8m jФЦ1-% L-8\[ε.-5yk:qPqmkVس%f.>k5n%~k[C1ejCu[BQcsy- q+b֡խLe5nǔVW~bu%%N\q[1ƤơǚcT֔-jP\Jڷ0>u*kڔ:kqqN}.f%NymkkX)]ХR,EfnPٕB${/ ffxw{vd{D$i,H4FΌ^O! go:(icKZ bVj J1Z-L\5ly-S’t8\T8Z?:O6TPļԭnn kq~JMuL~A$Xa?5-1I3c6n!y؁C>f}kZZI]?ZԿ!NKbIO:ŽDEXgQVB9#%ڭÏ, SiŽ_>y%.ku;#..:ԣ JZ#jahERҸIT S ǔwnRQũD<~y uRKH!m5S""4LB%b%!F%Pï74D%KmHj^!ZX"-^K'[-.:ȈyZiuN+B6qn#jTD-KJK"%m)S.qļ[i_yI*JZ".PR%WL\K0Ai6M8KTqKqmhi\Ao>b4BJJDE|%Ii[DkK[y1aT]k(ukIQ)Ʃ?-i[XZVI)TLKymbCR!\!nK1O:KVN<)Kqu^S? D4ĭLd"q;#KP1eڕmqƒ[ly_^y q8x΢Ǘƭ!Q\CbRZn[yyykKZ^c뮩9渕1ny ST]C Sc5ũFSuג:┄mSXJKz-uP<֡5S199B^Q Cӫyo%jcoזKbHq:ZR)N;g2&*\qqq_lob KJc % ֦%IZ}:Jؒ1ǘb^jByiKZ[bjxl)ϘQ-CjK%ƼkT(v}y|2"i,Ki|D)(F Ӌ\""msit>mmӒi/lȄؗJVZBGSqX# g*Էļ){nS6UHmeD#M\"3,暂9["yաݞ-v+KЎ)VGh%$8kTגԩ K_LSzZL[i,juKqky Iy!Sh\%)B޼<׵}%.5nʧϾL8M\D$LD%O*"-EA)m*JI R:u--éuS8bRَGcZ'ʈFҗ˂-mhG1N:Ê}me06θbK1f)/-c=qޭcʲűi b<6DC7Q*>(#yJ} NRA.kkehqURm1()<Ƣb44U u!é:yטڼJ")hFȦԄy\ bZZ!q--OYM!mBպk8?|-bЕ$TD:u#J>i>jDIX qi.N)撣ռ}1ʈZ.!("b!.!b28"6\Ѝ1hKռ:~KS1l{"!E--D)CgU &""XDC:uƘin(JQhqJֱώT ck-"ڢ"$:iHSilӪlҵZwb>'D;lY RTmAŴq&ŪRcCZd?8\Cq uy<"Q=q6߭(z-J^JKSu jV5?=+RRjPnǘb1Rֵ6uZc} b>uľ[jVպ-5)811מqnj[8Z-n-?G˵<[SV:뮰-yKSKYD%y!.)(qO-ԥ<#u+quZ5RǔƱy)ukSq)cα5)L7N1u."|1ōQ1B1ͱ1Kn)qc%n:ĭ RmT!->Ƣ#FJu˷qi-}ky%NSR|J=nmZ u*DGK1ƚR*qC%ĔRR~ic[1ǟmŭ!m458$D,p8T?-i1ojuס*m|`uhG#ID-O-5?yiuRۯIkDC1piH= yb2$DPC?(}o5~YO[ΩoO5 |F)[S\kOK:JS?8Kpqiac?"8y.,D)OBLZ[slD-n5?YJJߘKqJkGSKdA֛qc:yAJjc8ġ–I%ջrYմF}ik6հŪDIy W)kXZ~yPҊul%?15bF6J#Da "7MPE<N%KVHJeDKJGdD%f.4l>qj|CKmcbqD<%,tZR%Ժ)[ڎS>ZNrÎ(qmŐқJhi&)dY(["R c~"jĥO_Ajcԭ~ST|΢cmB4Fj-4ƕlFi!+F-o(A cuU =W[() RZ\q..-ig:hA5Mc^y%%+8K5(Ky,SkZTזZ.,Iulp-Hyӯ8V:Ƽ֥k-z"5NSΡu sykcCZjS^Sp^y+}S- Kq!1K K~ bjSKMVtL4$k{Xa@B%o-J#hȄbX[Pbq-uKK?| Ip͐TCN8CM#Z q#KQcld"Q>Tk]y(1HZ]kRu sKo>TDtuPDȨqXF7َ<_KRSX%εnM5cA%qq"c"Co1WikJ֤DZy,[q.:TBS<4!ԋmŢ=ıTQ*RE@ҢڈRtZĥo~w]u.- JR'qN崈pꐍ<ۉdCLqhHQA/1O%㎭~R~KSĶJ^DFJ uHm>uӥ&:"1u"%ϒqQ qԌyO1N}*Xu矾}$=6ۍy:Z2q%$C*պC01/c4ҷ iD):R-QƖ|XBM9"#m-Nu>tc5 o]-:O^y y:V RyG^C1uRũ)Sb#!J"j\DYXh%qjc1LRG+XVCZ1A.)6 cM:-Ο6iD_>|Ŷ)jbSVPK~y &=VDVŐꑥ3"FҨF6́namқD\DVSFM~cŭn5j"]y|qbcb"XdDK)h8)H9Mqǖ[<Ԯڥ4KS ڜm4FqhҐJ'F'ˁKbZ!k6ShER uZS|! qJq t폔y|:H$2 4Mj!Ÿ"!juC)_|Ky?)L%f(-o+s)||D1O@ŔF>jS,ҥZeq4qji)Kp]~|qm0J)+D["l`K->ZuLDdYH:yg9SͱS4능%’յםqoǺǼ&<\dILAO:먗XKZVRe%O)vIsV<%5.b\u [y-MSYRB՞q:ƝkjO%)\jg\J0XWBW W|۩ȉSp%G6mq#ikLmOq~uRy| %HH[N)dFKi|b"VbRS [Lnq>"]qqPSS8|Cm!ے#T n<[߼:>ZRb!|""X{LiXGlSM-㭥q(6[SCoKiy+|}ï!HJ4m5b"TPS_6 n;uq$J*\Zi,S)QG[)!+yak6TqAŭp%'-R:JZuKX~xGֆR/ |#TA1oh+Um%&֥8ڧϟ!kYԵj%_lĩuyuǭJS)[ZR:JġJ[q[i yBB[TDihhuբ&|ŵuN\iIyd8SEȴTDuLyQJUKGK)aO>Rd}1nSj!ON^BZߎ:RTǒpju):Թ cVĻJJuP-pKX\jۯ58,%jq\UmKz0)HR>dإ%+_1i|1ג<זOR)[O9%ՌJ"(ANhZH-[XKSKcJ>8co)k[ZJ1M|&1%"%Oޙb#%kR,ZLK:ũ;-~y Cj⒍'[}}#"*"NaP4cG4D5uuթN>+jKu5EeP-%,iM")=;Pώ,ƬicyiRZku.!lun7!,Y*|<ѷ̄1 4MyR4BLu6ql|AjqN%/|)yƩ5)zz"6mb4RZRiDJ""<:1(C53)k^pJ!Q4# 48pŌIgg JpijKjP:1Nԩ/=\[CKZ-b]cg48dj"V[_[,ǚr伥:󘗌-\%’-N1 j1:V%y.ź{q.Լ8%hC8Zyc{ cS85kcK[!mEq BQԭ1hu)JS<5uhR]KX֨558SbR)O8BVJ^ZKqSP\kO1qޔ1 j:յ CCb[XkkB#N8RN74% kJ5mR :JZR1Kc1LcSKkqlqZZO5ybC-Pu{V ycKqkBc/!6%Iy8u:1-bR8^qb$<<17v5+u弔:}k%N:b1{1Kj i g8|lաUUɻم9vqF ,>EZMŔ 8vnaj8BסZ) {LBԺeXjZaԴM0^Ll3pK:rζF IyN@Ia!zI$[81P)VמT59kמy%ybPJyxu-qCJlkɆ-אϭCL<%ױ*u5<󮭎Op>,8ȂmZQA,J1ZolAm%/μ?c~bzkRz"i"(>Kk8ŶR!V"VR cT-Ʊ:Vz3ƥM-oDqNb"]1IRӉKxER"bȖDB^"4[K8M:}-8%N?5+߅qa(_XJTP<[Js![|iĵ!ז1~wRj?1 #,)n,m"-iBZT#[l&IkP:[N䐧[nSZ"((-FcTDScvۍ3_-Ŵ-RZ!cK1G_k<׋sAı'IC1N!bZkTꚇHk)ձHq׎ǝjZןjyn[J҆)ג:R򖷉Kymuո/Jj\[KJ=Z\yyXNڄ% S>1->BqrBb[T).88%ԩ8C;-QޱڷP1ly%*)jy1}mBʨ-5%)M|ҡLC%D%(ե?Iט<%/HISTDc:"#M8XғQDi%aSHm][c|U/-N[8N84ښ%1*:ؕ>iƐY)piJbIq1o%JU)O5uiah1-8.!Pڠa um1mXYҭe1Nk8[-Ou<}N-M41ԈKg1OjZÌs!_bXhKd0㎩R1L-o8:j\kP#ykgRk)$<ťbc8CcΝGb]qZy:Z!yǜj uqO:zPsT^O;nSΒㆠnLuŵ.ub^C5)TZ[kR|Z[JЙCδ<ƚ|E$D^ʈx뭭1--\~uiunn>|"ޅ49CZ :up\uHKǝoϵ~km꒖%y6!M:E-oikHuLq4Fl]CΩļtJNRT16% zqP0"KiHSKOj!*4)Y'زZz7NvZM>AiȸыK*"YIkGb}LOKc:!/[Zk]kWם{4DSRUWqjATEqq yCa¥5 J1nX~uW^ 9 :|[l\C)- ]rZT|㸦1ԭKBNn,in-R\|Ȍvm6a(44_3ƛM5N1gֶ%9Xֵ8KMo)M1Bm":bQ&:( {"әň BJԅ11k8qO!GTՖNIjZ޼n#!.1jSJc:Z<եNǔԱ%k[qPĭ)uIKź!-Je)y(y/-+y^oPj_S:&l<< k[ bkk8Vu$bPPֺlcNkj\i)jԴ맖N1}GZJB>1APƜiLSVĸȆ$%Ko- -_ܦ?%ֵn<qQ-[M.)qjSڗX^B"b1n)%/IJԭJj>l-Ţ>db#+#mU:p$ĺm[4qi. imb7FOQC[u oVs_y.?)ű鵵RzIm2#qT!L|ђIEtĨߒ}j=jcĤı8 $["'"8Ī!J1K|b(umbkKZZ"ZRB<#JQyՍb-IMq<ե Z-(K\ayBQ:jd,E1 )*E!q_zy-k-bTꏭhj<\~`q(Pe2D㮼4%U\yL4RGt98-# "JKk[\ [N4q4CCy uR:|,!"M\FQ1y.eq o5α[-(_T܎y"8Ӯp\Dm#IdBšN.S!ĞKε<ռ3JObآ[C:cy!+q弃Z҃\aƵƱ(j_~O&R\<װ\%4-N&>*=yPڋ6Ǯ 8e"$҃KJ!,_WQuVl~Q/gemǑ:q \ ulb#|ER)/]еu"yLҞyO-/-aiSB&hG:Z[mLR"\P%F7qkSL~0c)t%V-pBIAT6Fma m[M"j伳yǖyl~Sq=8/>4i-ĺŒH1HiS:)矘K]!GX~>!-4m(6+J^YͰ#lKn8[NXձbR]gyP([|:cHXDQLQٴ^KZ%%yձuhU8\q cbPQ"[O+Gu4adH4ĭ%mS~8塩~rW1yռ|R)Ibе!*sXi!UXж%SnKZe-7y]{c9o(j_!<>Cι 6E+kщ%&qjyVGRi݄l<)-1BK5 %ա.")0qHi$i6_1u_~1ĺ a?>~yZ%(Zޤ m٤JbThmFS]#Ny)~JR▗X$T>IėaӫDm[(umȈ;.1uQ/V!qĥnG"ea)*N(C~[(-2k|8~ųbVs inՔjb4:R۩*lu#JKABTym)2qN SuԷbTSLKU.} 8{!o)לҘ1V\Cya>|R^]yo}ĺjuN5T|omҝlŭ珘T(ۈʈԅn8i%ƐBѧX:cm%??)l}OBYtj}8"-ԭKF1i#Lckdm_1!be$((Dc1Lq-n:~~Y#<:V8ܤˍ11U)rL#F;k!溴~{:lGq0[喍<6EgRDJ)6"qռ[/%Oθ0S%JU3fAR-NR-m)oY1j}O?u؈PδAh|R*|5Z)p1KVPDd8% %N!hSm6ڙƑ_b؃K_)!Ź,q۾<%M 8R1m:Rq#8BC[P6Y6ڈ!-R5ԩ.J☲XZBS_WmLBǖU:4FEi%[SBS[cZyRc #eD: F>y:bRUqMJK:PXՖC57qyh~u+MY)Q ZJuK}N8ŵ-.)-RRǞj+SV51ź[::,QLsCNPVƵ-K%hy-Bq-J]qLyqlqf1Ty琖)[ R q,qCPckTQ ByT pƺ[JO~?8Lupq8dkcuZxP/5/-*CR4Rz8p!J\uzSz>^BPSKcI2xĩ`3Ah0g4[TPPy/-,[P%*k51 u^8k>gBX1rRU%>KkJQ@"}F#) ф^bu)7Ex]lŠ:x*G3Uȉ:]+ .ɡYis_kFSn׮5+DimKEZ\Z"Z"+IRq'o䭎1J~ZI9 qc̈-1QYm[Jy!nkT!Nu%JjQLy1!O;8K~5[> 1N1ERu1 jJE%K%[TykO 8Ը8Zҵm ^- ukSkhbDk!([xyOeKV_inפֿu}ǒĥPp$ͩQ yIqoKh>uL};(bӬ\G q-ĥΘ% qjS C- ,տ-(Roym~Op[ZHjJIvL4aۗy?!OκS|qőf$%0JRQJJ,lqm*Zp⟚kyN:b!(8- 4ڸBm6KŜR[~Iqc~Oe]ZR5JRRZx#Af>\>Pj8ӊBFؗ[[\lE%n>[ԗR.aE88yƵך뮩䭉qc(Sv]kq)R<5?xN: y.,q5[1q-mk5IjaKCBЦלS[R5Ljc]ku]^"qԈJu)bq!j5 uu֥ u%5.1iSPԭjcPST򒤼-:Z,!%fd1(Sn-nJ[yJum;dDr5HR1O嚔PP_yLy Y bSRu1u԰n) Lb-Kynu\j8S qťg~K,JTҖ1bj5Yn8q~J(Hh-nuG[umd-<{u!!-Bxi:Xg|9y'\DR,3RD塌i4Q"i\J][P)dJJ%֩G*qh|;o#+yҔN*bxE1m܁lbJyHSyN1uiQJK彐SjRҵ)u.C1m%"ؕ!M>ێ>sMZ+IKSW#R-D]i4GTC54IDSyLG:bǒ)Y-yh|m:jqq^Y$ڑʉW^RukY%RT)Srۅ!nxZX֚ylJZu(jq^}ky,JYJuCXj:-iKN73n8 :%j])*ykqK8)ǒ--Kq ck [Pk >YjJuo>%Btc_=⼒;dFJ-DKi%iĥ8[)o>RR_y%LCKS%$ Xkŵ,u)y:N{%5DqmOnТZ#JyLdDcKZ[nE!m_C?Z&1]hiR4Ho6Sh84Ȇ҆\uԔ15BPԨOjvV婈XQ2>-8ş)(UM5bũ?DjwSŸ8Z]k!qk jWjPԼKu9e:jAԡżjԣR<Ÿ:Œ 8y5kR\ky-N%թK^CcmלUS8KMZԩn5)[B)[qۮ8ּ!jC![*!N1 kz"eCQ-N%i*Q1BEG\E<4]m/-FTq,u_y8_kugjD W%rť=CvߏZC~R][[:96󏏚Dziqţb%k| yS<qqNPܧЗ]C_jVӭqy8)(åZH~c|U:urb\!j,R 4mո)N9㪅o-k-DQyo\cV<[%}Q?>-ם%m֡?5<ל_}%5C$c> Jqwʹ;ҤHŬcؓ(y%]KƼԵ:qO8R%C1GVKS^cuLy2pQ'EXFqcݲ>. qǔBYO)iZ؎__kT~!ҎvŴcmHR#kjXƒ|鵵q:gCÎW%+I,up&8q֖HX11ԵLC<ԇLj1qLZTBRSE")k\Yoy<󭰧8ť/-u/O~%󫟟R\So͚J,UqƖ)Z5=c)FZXiIu_"*7VyBAyCձ,~q=G_1KqXͱfZRZғ8qj[Zֱ8TOZ_:\㭕^-S4:E)hL#O%n-Xk jHGuRƱ):]~RqXո)&.uǘSR~+}Kqbҕb-BO-㮺JRK%nOj:%C[o-ƥG1甗x~ZŒK8Bj\cQS8-(J>?WukP+\j5μռ)U5jvT<uc85/) kulĘnLIR8یjS%LiQ~u۽u/1Lc>T5%P)BKqJR`%m溅*%2ױ8q %yhhQH- h1 W䠜kCRӎbq(rX1 )C$cM<4-aƔ1-(!ĺ)#% $S͵%-k)Iabm'ӭbd!,QTK::p3n6mhZb RT(T*bLE$Z CK5漒N!Kuֿ=]u8=(Zyz\qcTԭ=ylK֚ĵֵ:MS\qլRVN1 iy]I B!Ox)q:m'㮻.%ZϠ!j!(ŵ),JB)nG*bքCS8-bKyZX)թ-:R)kqZX!R:1Kuiq.ĥkwq!,$[KgDKj[Ly!jJC?)q ~yqPRx>[!2!JQ):㫃MubKqKKdu/,~CRISyLKkDDi$KMQԼDER4qGy1-S5k5h[dBƘE<Ѧ"Kj)Cq+cT߉K8X(RDQR#)qǖI8k쩐K5ƺ>qKQRc͐e6^/?%歉xO-C>N'JžRpZҤ)#iYXR<ţXK\R]uq/-.mimk؉Q)q !ҐmJբ1?4Z,yZ]qu1Jc5IKMg䣏Z1-)$2_-).\F1xK-BTZ˷qJ\yEZ4 6m-[kJO|1.kBy C!cֵmJgyqֱ:*hZSC,Xypf O F37ޢ$E&R|SjZ}[r[:w[RyZ|yj#M:imiֈZ>b.[ԺBC)uƿS)Z։[ˈm,y.6͘)C\Zҡ) Ru)Py(jcԴHyK??,)MSqB\q/8eMy5hK%o%:5)\C[[i!_Zj! [qƵKpD)CΜKu<I!ԵKS,V SuJ\Sq('c^8uĭ<5PqZbN%(%kTNjjZb:מaŒy/tռN)CyE!jASJJJyo5<][SJqGcBT\bЇ yiyqiCTגǞqlp-)Ա2ű%uהBZЦnN:!]8\u!+y9kZu喆:XI%.8qNuZRuך+1)k1Lkq q[Pռ8::-n${ڧi:}Z[}N& !m:G Ùht mꤜ^iKMi8u:J)JFISk%S)^Q0 L4C(kT㭧ĸ!K]Mjeġcqu yƽq!KSsG\yjҥb we!<8EBIkrVSN!y-CPB#?5 qJZk!/V-kSMSPR!TMܲK(:XK,ZT58]BaJ!o)lbKAN81<}*KySΖ!W]Fϡ/пnIHj/OV伴/)&)c~~Ë[uSԱ|` ; 7>Q`":Ӈ;4eV0r4Ų 84'd]|Z\Zcӟq7"bGA7v*8Ŵڈ,ER]6W,K04֗KSE|G+Pi\4pKs 1żVcЕS-y]8cZN؅FKo2-YԌuħs[?8-ǟCqt"TF_<>I) %NPSIm4OJVTպ ~puJV'S5ƩK>X㶈;d8bJ%jF68q8-mb\mc[<5‘ImeSZb֞} K!O--cMT8ĒCʇG-c21b]e-Xu ),qJy :SKMpג>y R*-du屧[S -KF䶗n~K~uq˜ cQ)q"֗$!%)`F-Q|y8JߝS~zJq5hM5o(-ũkP)l1Pֱqkuo5h8)kKT:o:Ry:X7K[8~uqԩc1ո1֡Zz$yJ,֎؈"uqQjRQmkRSTO?5XjV8K1hm}%va&&!(qY[ci[BLKIy5XJ^jy.ر%HͭuMZ1RccIX)qu)A-Xڒě%B~TEF6qipS4JcKtNb-?8RX9[J:Ĺǚc%/GԇuE餭 SN1 qkqu C__yO!-n>z")/)i)աiض-Ǝ&"mZinySjfPITBMG_)qDJb-6F+LqiÎk^[X:!ŚdclE-Ci,ȍ-HR  $ ( A4kK8QN1I:P^GQƥJc:t-5Ʊ;ՐRYNטRP]yS[RP1}ëq= Z KCXy"8ߞb IvJڕ-L8JԄ1xuԹוu xZJm<:XY,qk 1 [R-:]vV>s&֩8fhRTi)L*R\k\S5gr.:ͥbDt!\Z#Z6kKELYԊ&"MucKHb uej!bH-`JD-?}JҖ?88zJVbRz<-h|Iڢ4<y[KZߜSRXk>~8])q/9qsrƚu.CI1ť[ZT>qKqn5.^RPN5 w!VT)ZbÄi2"N8~8WYg8͵`ZncKc]MR_iWRX~q楋RT1uOkY䔨6Ĥe>i],:ğa(cj<5 Y+C:֧]4)}cзR/XqGŷ uZI-a*GY-6jxR[q5IK])q R5Bun;Mt%eYT:ZcZ<ԩ-}u\OΪRR"\uN-zEk|ZcRZ!i8ZÍu c.mCq55JqK[R\wטĦ ם{Tֺu!ҖƭMgTK|W;Dz.PSu|q >ڇc孭:1ŭ bWd%)枤KVZԵZ!~FuG͋SvxQlu!:-,sifjDfTC%/~kSRҺE%P>OhZDn DEqEi:1 yqjZg>c#Q:m#lt B%1jߖ-%D8b8㍱<l~~yƤ8Q85/q ZO: Rڬk~8Ը<өqMyN,Mqn[<ţd>y5(^8>yo5c^sWĭn5(} gk~b[>I)~-"Ze meԝ[}ëBԥKRRn$-ccw"Ԟ1kZSģKZZ5Ŝ~Kbjeiy'~q.!H]ŧRl"bN,cK䩆%b}GXֺ"_qqOP)oDxǴ8֖%eMky,EmpRdqi^܏İı*uS8~yb1)qh!5#84D-&شb:ȤK yKR]k~y.!kgu5lwN֡cN5dꚳ!)8ku:ǝc[^x:Ї%ŖB>+R]~Rĵ 6SRx "IG\QcUO)g(Z!ֹaN; ~SK%.5/(qjCX<.b1q-+BT1e"۬c"qq 6u*Kҕ1?:škp]ii)#b[Vַ8 KkL֕1*B)Kg|?-ŢT:T┉JZR)kR4>sm4if;D퇟88%7u kzX2$* QKikcvmqd[[eKiyu,y-ۮB"7R4[FQj)HI#u]]%N%O[8Vԝ|"82NR)(Kqo>q-ı/)C(ߟO}cvE1)TDSj_5O8K˗ı.S>i'\Qy"(Rԍ0F<1oCPHSKKZQyyW-e%HRUcG48 q֗1SjCԵmIyռr>JqO.!m#u*(PkuN-%ե,J um8VTb[tĸqט<: :TRyIm()0*!5Ωy[!Է^kֵKt↡Zj--)q RP>Yym((~Z~y1 EKmCSʂqMzE-#M.O)ՔZߊbHT1+y/:٤uRYjRp1JE\wf6n#n(\E1-:Rۏ8qM6-f>z$u.4hґjSTB%%Ԕ~k5%l~%ı?[~Z_j~bacqՉcPPDczk~SR1ָZSyY~y)~J-Jc0`QƌDH9ql;8뮼16b\kRJ֦-jkq}N):RckZy8IOڵա)![dkZ-%]Enֺf) 5 S):JP/R5 [8-,RC0V8Fv[ Gs-dkrXΫMBWRU]uҧxWU88?>u6F:ZqHKj5D8~~ZRb_:|m4ԩ*8hZJ^bZ i+Sa0[l[pK^bV[^=C1N,mk$㫈b:mh16~[O]be(~ qiQLD%N<-gTjbIj9ĥdKS) SͭLqǖlҌE>ipkv#ITi(-&>ueaSmYJmdhn6i0QN4唋|q1C%uDםRcVqo5 J]qG)M im*Zv$8F~[-Hbԩš*wOI/-n,쥑չmǖ-iTmuz-N*)j5N% /J1(*q<-kqk9~ycI(}uF8`d8R3%hbXkbx- u)e8ִ*qKZj<4ylD~>1adhGkVԼRjPձKu u<>q]qJq u1IRy$뮭HKJ)VԵiJ\y҅uJ<\yR[}[+/!LuO5KRߵ\q*y :Rq SqKbu1f)n -Kl8Sŭ}JuꚔ5%nTRڝjCS5--u k\qKy:խHjЦOYMkykx\[Kq+bRPZu*RN<8B1Ƙ_cR򘤵1Thp"/QG,2DiAn5盈_ }Bi)1W0Zy ScV%'YZ+K>%#@KYY&(ј1o ƒͱB81-;5V8խ!ucGԥ=Cu[9uJCiy7Ց<ԥơPyƻo) sy) )A]ux8yt<)5R\Sc+ߝkVO\(aPbRXZCD<ꔔ$!⒧buĭ2o),t5,%l8!!!&]u)NO;<JcWy:yjqAũ1k8[^J^qkk^u/5Ƶa!=zK y [~8]Zh:5$%-KQc1<:͢u^kκy%)kΒ:2cD!5kȴc]kZymHq) cJa%V%7iź5亦|ZRd!pBR^zRS)]zMX[<]j>:^uS)(I))%]S:<]i)CuԿJVO1XRuY-co~1gISP6<ƥ8VyjP5N1(BY)YHS)!o)ڶ51~!AIJIR:|ōR4yM:QuGuĵKCIKu>>yK1f!%n%oJK-mkFin9~ߎcBkR[q'dDZQLZaQm):ڰ }Zq)j䭯K~jbT#XQyM+|mA|%y)yiCLq.B\a^u8Tb$LLiLUSM)F5cLc:85J{Mmh. -I$IJRTS16ґZx~uǒ~8θ+qS%Ƨ0ršƱמ51j]IMiV!KaĴQ cεRTǜ[8ЏRTV:8طj֩C!rC<1␷TBi%Ǻ򷨟ű&M+b]Cm5-JTÈc)qӎ:b) u]%;OOy⚧t>ךy)=syBq:cVSkV֡C>< ^c(}Gh 0LN5 8LkVQ#8ǜb<)xҔu$YEGZщE%6Z%WT*CzcZ^5ΖW,\[LaKZ#0}lASךP)cPpii4|^F4q֌>K)Ԙ`1ŝbD#3 (~F|XYEYgwMcL-SgҁŸJ_ūXվj\c~bZ-5B֯%,R\Sm"WL+MS-o%TlZ*i_8*qώ)HvM׶-n#dXO9l[_;)Ƶ8[K(C~b)S[[QO8LkkX?1 jZb"KDZ>hӍe"P>KqdSVJ1kߚI~SuמCiIiLakFm.4QzTbԥ5Cuά%N?1kkK5Luk !)Kx85 JVZر従KR%QN%Dy1SHjK_SkXCy"ڷ^RV?q>9m<}:|ыSL1Ɨm_,m."RO[p>yئD@`ac4f15c-H[}bZZ)hyC1֥<男TbǜQF4*qK[Ib-mQ-[?%Zź!iZ\ojPIckH" F B0CcMc$e☄'XvZK )1*qƱ.1 ui5Cu b^[qqZX¾MLDu*ZR>ߥlB)jbԏ<\y:ZĽV%iIԭKqkKvyLSuW֋C5:εޥ-!5<:KX]n>x- RTb@Z:PjSjQ[~y% -JZG_-iybڣT-X~%)~kRϖSz4VGq-kWŵ֎8iI(ϒ:mO-ףl4śR#NqjE1Pi5/~OاB/8ǝ[lcKqĶ%LP-䘦 Y*|XjY!Q*KJqTOO>|ѴȦߌ~g~[%|T-coԟV,q,J؄C%K R}ĥ5&5I5o~~aǜJJ->-qǚ-h!*u%~~R Su.q4b\y m%1ku[eK唵 ]ǝyԺߩSj_ku#KRV)D)F|dCNcڽ5:[?5o5qM% f-* L]ͭPbP5!^-gj[B[[uO8unZPԥJ[!qdKyטkSjqZLA$Vӫ)5qkqYWFr*^rʵ5SlBε\K^BX5N!eByq唗X RPǼ^C0[ c)K}ԡ~}6+ 皦-mJwgFZqCiNijqR1N1/~Q1 '1M]~}ZMj֯Zߝ[}cDHҚKlE-uq%(yu AkC[qIR4ЕZX-ūk\Z"Z[hi8Bqpu[bߘRWa$4Y[!eB՚SԼlЧǏ:4ߞ[Z>[qհۋYrKjBGRqJGYI֚cŸbZO1ψbTK[Y)i1 QkLcC[:!BSV)GCxBC[W߾-վqb\uT)Im.!][y۬y-qkqǚqMo*$PuFZ͝u|%MKc ZqX[iTC> uj3]C>KR*iCy5OεTy%C>Sž%Nխzcq!מbϣb-k_|ZbS_K\u(3KZ-Ǚ !uemEX-C$X[RR?< [ZOk8%Kyl#CQOϵY)T\y Jq]_C_q:-RTէm:Eז*ID+km5qFbVbQm5NJ1))!bO)BRżm*)kSL:!(siw5~c~S^aKKSZ߿1TT)Zi%P1LbRCTJkV%,YԵ8%i[1u3k‰iF~j?0ǶiՖi,ԍ2{SlOÍi.8buRS\ce~A!iK->mF>SVB^yjy\[Z^QkS㮥6_<[#gZJbuӰy(ޫR+RQIc^1=y Ժ~u_}/?(:DF:$Y5j\S~V1KkZZ~vMN:yԿ%1 KRչjY?-?7y5[JT1P֭5}muǖ]KJqkcHJbX:OCexqj=W%,i(S:t%1G)u BT8KZႽ0#׾c1AA"(E5K.^[<,"g{#|`ȑ2߬QG8uom-N!Mq甤yjk[u c-1hC8^Cu-w%*]SiJq qkuC[ ABXq8?[5סT<ꒇo1<ˈyֵN[Ru*ua]KơBgXZjR8yqmZSSV bJ{Kquǚj~ykq<4]%k\C)IB5_vcɴ}|V-,7yyjqyL[|;疣/18k:.$R)ŵSTך>\S::1Լq)y^ZҤļ%XPyָZpơN5.p:ϭĝyZzbcP][Z:ֽN<%Ը:ũ}[TjC#ZLK%^BR%SkyNǘ1yZ\Z[q)KuO!KqiS%,kLC]cRcKV<-i%jl.uĞZ^cSZZ%iK8bB05H!e)*qK;I8S]k!kk81Ĵy,qJKIlK%ޭ| kHy,!lc:,cNiXRPY3Ě`2kl:&v+.cXqghiҋ#'FkS:[~STK:~[KR\:r:%>5[u}1wzمZ>d4H(M2}"JO[RaECVךw8]uKiﺓL%2 Q%W ڊeӎl7Ԉ8f&gd5/S=K%u꒷^yKuԺT)CT,iCq:hF2jyդjuH^)YVߥ[p!m:Hg:RZ:ӎ񮱋-cJXǒXGVRut[~!b qqyǵ1GZPůZǐ!) K<֥gڳjo~%bc:O1,q;ŭ:TJ}<ԥΞkc['uŕJuoڧ%N,-}~:cc2Ħ"Vڞbb%V[imèu!5KY7>ȴV1i9j$ґJZiN%qǘqlJ[S98~1z-nJMmNl8Tc% ~KN-6Ӆ<>TDiK)eJ_-HeJSc%\yNK[mcֶq#Z4:ۖqΩ~{!\CWCZ }Kե CBVub[~aZ_)[<ռ>bkT)5o]?y::j_u}Js5:ζ騎[Z~LZ-kΞsyix㏧]JFdZ]R^qK]pԸcU:qĩ/,<jy/-KAҜCjRVB ĸ8֭Z\y-:ƭ/%<%VԸמZJj1n(.M5CΡ*q%2)1Rn<[OڧyiI5q/<1!-Ls!!璆˔d!KBykCqj5<B-nԇCXKμީu%kJKXm]81ԄC^K#u_-O1! <1qOZ8-6+qJKdRMy8qnyהV8u-SZqy)R8^uo1ʏQS~KXRSzgT~ZݳR6KKQǔ:(p?BX(HyL[C)LBߐ.kKg~C)<ZD1k?ycbD8~嬋OФqũ(GWRA䥏xjպκ<1.)bUJ" uմj5gڤ8l_Aż>R1oK[CZnj8쒶-uSd-Ky+68[ߐX/P֩d?-GJaR%/-k-lbA BZL~c^Ck_Ky?5ě|cHO2#W)+[RR8G_:yCKמH~P矐_:5H-)L4KFH[4w1Ω+k:.?u+Aquձ Ʃ)mKq)Ruǖ\SuMJמbڕ:-hKD-\uM{?L:ƱR뮬%K.!r+nn>KRFaK-KuŢZ Q+oNiN4?%גqIjKu B-.Iy|DbѶ6CjDոZR]T5V)UKK^;9ީnSַ޼Cu1hHEDK2|~ue%YI[Yhih~Z0Kp>^D5bvպIqX[l\EcqORu-}[[R,uLJ,yk|i q,tykTĻcִSip1BSUo k$uTֱ5h~+^uo:Ƶ??%-IBzR/J}y-bT:έj[c!,4RJqe)k;zY1>i%jrSc>qKXhqjtBgļQQN%ȏbcq:KyMuţ!pXQHqϼҋR,x:DKyVBXbǔϿCkPKP"x~Z!N)Zˎ1O-cCyJP8ġžĥ$TCA C[թĵm[mK!m!ck% q)bZP$kʟy5ZJ gJ\!u 8q0aJcRTlq8:!cuyǒj5/R-,AD%)Z bZ5o5hCZ[PlB1hr^1,SqNa9 6ypQjb-j{&q5!)I9^yc8V!*jCLc˪R^uIJRFТxҕV%jcZ<1uqF-lJw%yjKÌZ'ImKK1.~%.KZYk~>SC[?,V-H'cq~K:-B8ƭJ4T1HcZ5L[źc} k5 q1 rcViXuoҕ-?ka֖6(g*jԴ"-徕n?!zR-k]qyjucŴQ>Y>RB֕&|]YgSX_zqkJc؇Qn6qƠN-*m0 iZ1,ζV}<S5\I%b1(N-nK uKXbҗǜ85 IxO<\:Rŭ >ZϔcJ-e)$WS!ƸRY'y}KJ]b -N_y-y8}L)yKR2\~yG\BRB5\} -/)--LC:ƩSuԸ^JZؿ8i[ct8ZƼyjRғ^j)5︗=!un؇RAX1%XR K5mBqR\ָH.C)qZ;4'SB8Ja<:뤼1O-LBPqgKK^{CBǑ:RKNԗ:}= bTuR˳ZR^^_<\k~c-myԭg_&ASR(qyB qlt-ZĩgSu!ZkbSNj8-ljZSڵu:c! bإ8X%bu:5ZT:1-.[橩C}ccT)Kı,BqQ-^JTμג-hQ!K{Rǩŧ\oSuLJ$㌄a֔mMiuSn&Vq1K b_E>|aN%/b6ӋeB\PlFqm. Sm%gwRW)%c^N?>>jy i>1nBV.,q.6ֵ8qZ-k%?Saq/+1CjسR:cƺu9!1嵌qKZ>UO$>\jCX1.:]'1+%&X-jk[P }IB]d8VKu)8ڏ4[B\R]N<<맞jTĩ+qN-z5ϩGyh5K<YDiSSLq1PP[ƱT]zߠ!v?,B sW]~JЅ5y ~[Tޡ(S% qĬǏS*S ~qJ1[8B^~ZJJ^XTҗ^SK)0OΩiS嬅:K[έյLbԇ!Ƨ0qiZT?!O)Jcbϝq6E<ӭiԡǒԷ1GyjZ^zХ$֭o}).1:CBЅ-)ymcV%R]YTԎ%o<[HjbSqLZ5qҞq]RJ]a%-rk\bP%l%{% epuyi1HtXkc88-o$Zu/ZcxìGҷqMuSJz\wSd-8ֺԵkjRZ1n[ J\-lCP:x:mjB0ОļԥդQq) Q<\cKZ82t1\yyoRXcN?%ƩšR~yI[b Y.!qo5gV<ǜyƵq琔.QN8C,1nƼ\5z)]uPZЦuJc<Ր)ޥmy亇kb-%ؒjӊCK kbkV[[s{QƂ,pѣ,ÆA,1G%DC/Anuxݵ]M-丈1BLteG&J9^b7R֡ CKu1)y uymB^S\ziZXc),bڔR1=sSxp⡐]yP,2zM=k1ơo:]y=V1{3֡+n;8#ƭ%׎-֧]q[J[; {\JXf:REeo\q_x%JPbȍ8bc T[KZn_k-(KcMq8)xK>Bu%C5 BR ZZRiŹ&))-RiJEiqq8!KQgq}~kC\q,~ZBRzS>j -/Ir^GKRcBXϡIy&>Jĭ.؎]N1DiuJj~-Pu,bySXźM!?%nš+S1IS8}o1[d-Vǜiu֐՝ϡIZq?yԭ/6c%7ǚ㎶.ȥXmF-V.#اx)-|mIR-Gn>ZF)IRTҜ[Ͷn?K?jOj_#RYag{ŘpALAGYd9ŸXSpvKZ-yHcqyJjWЧiJKZ[yqơה!Tpf%LcTSR8]CԻ]S4)Kb5+Z\[:jfuN-TcSC8bZ!*qKpqHKjC]=V!ŵ:Tq漅Ѕ #@Ϩ> ÍTy(:]niJQ(ң uunTU4|%YI!,QKOoX1VӮgߜ~CDlb- ))T%OBʜ6 Iiyԝ~~Zbj)֟B1֩ǝ(v`QBR0XJ_%qJ ~XY,qj~)im)>qK!%%7\j^J%/>ڷVHqkCuז=b:󧘥<%cCT-K󰗜t%:<Kc}>ə#;0/NWk5 zT-kN* 1*|J1jCJԗӮ5h~uıLkV:Jf"ԧ<[Ldաq~B#$BC\<~SOpS\ui*uKStXWo8-y~ Gz1%CT%&J<-/ImԾJŶLq)iM-MJtG|ea.RQlmxGR86֥jC-O1%mj+Bq5~qlBOq>II-.[:%Nέ8yh)/% yCR暔b-PZy<Jqu/[[^[SĔ|Nzc|%K/:[)RRűαSZcp~uLuMD<򔥭/bPk) bVbV:3PRjB֛iyHGɅGJcVՋSVZT*y8!yF$%?)?$ꐉCҷSZt/RTSo-jmzXĔV!(R.1Hq/b^O+qJiYEqHSƘȋ41,G {iy*u[m-/_jP)%Zn6clQN88Ҍbqj5%RB1hq_p1([ ~yLcK>Z~y.by [O-k nm GP5>+Vu[:9%<8$~KthyGy_!)mky :Ô8pu!ձIu)~Z%hI[Y-$0 ~~K]K,}M[TǜS~.%mqlqѴ] KSS,)N u)twTuj4'IJV6Ǐ5!ukbZƝR*ϒ+"ZKX[i4IF yH|^y-bߒʚ8(_ZD5LcխBTkˆ5?}RC-.Zj}F_TtK]OҥJ} J$-似b8-<돢㮬m F1IBB~S!~~y-և)%TKR-M]C)!3k[ui>c-qQ(X˄?}m%_i+ZӋ[CR%*CRǒ8ԱִjO:bũJև7-}mZbECZKY>0۟@@c0bҢ\Bg85/cKqo-֠kZj^[l:}R]BcK>b~c[B y䔗\tº)1 [T=RǼ~ߵ)SVƺqcuԡ:!/) uN6q׭NRAojM0>^je SǚԵjZUBw5ڕ5K(oe8! y/q1JS!TYipqS8[X5)Gqך! &#mm6ib5TyFxZV[Vq-!n!\ J{u\RalGi%mcHӫu-I}NmվF ZOaHԢV D+e%)RZqgR[ؤ,)+5*?)J պ֨Iq0+ֻo5!:-+d?!8-SvyY-FSlq(ƊIkȵ4ŧn-.*)0un#kV-*%h(+-6Xե$1iyJYm>Fqe2qn mjrZ՞Sk )!C^BE>Ԛy%kS'R)ֆR?(uĭZXyŠ8ꐧ1|[%TJT[Zj6EaOSqBBżIZqu)qZZSjqNI7A伤bXjtD֥/<)qB5yæu1ǐה:! K1wq^_؍qOX\q%Iknp \.ZMSJqKjRS)זa^ws)}-1=#|֡)sԮ1.}cJ5[Z!VSijRַG%TV1my瘄:-NWX]_ǘV6Zk%%Ǟq SX%[Ky8!j]cc! 5!+-BV(|!)bړ F!4e3q^AMyKu88ﭫC[uXq}IB5ԥnR]$ֵ C[u1--njKTזpP<-גšqe,BCZΡ/! u:]Ai漆H84uhKBZJKuRT5ζCs)-B#KXckSfL?!?=:!ļi1)oJG^[!-T$q<:%ZEȑaC8L{ C[ڽBVy5Xq-JJjy !\CILkBT[Rk!.!+c\S}uKZi-q*ZKq$%*RbQꘇu1խHq5+cq}ı|y1J_ǔcζpu--Y+J!G)LI)žZμI5n%ujulKqθב)Ej(ԡIRšϸ:α ~[^c<ԗJű,Bcǝئ%L[ySIy+bR[[1 ?-jj~[:5Q1[ihȉ1亷U;JiXy7MTJEiF4l\mQ(!+bqŚc\k>:B}5!/5/[1)IKZ&VTgRP:~jZ(ukk!座]R:-!N%-)Z ZO8:MK K<\cu1NlKRڥ5[^q/:6PxJTZ#1j[ykR^klca8Ԝy.1y%KεIb!Hq|j:2q3=foYyh+lb<ͭ,c2_1JCPĸ-C%}~CMQpd|%R)~SK_K[F)ZOaǝSO:Z)%[%>TKkS)DSZޒ[-.k[~b~b JQNG jIkx2Xq)٣Lʲ!AH{RZ%(H-c[~R?8RJq/#owT.4V[kbL/5N15+cտ<:Vz)h\iV)伱Pqno)טm/#q[Tv-}nZKZ%ǐ1xSyƥbYMb/iZƸ$ZXlA yǛ㭗SO:cЯm,i+Z8o5.zD[:樢Є q.1ֱ?;^SSJV)Q~^cJKW_uRKu q._BN"29QOA/Zy?:Ĺ8cyQ#K$ط[KBCu 8]B|qS?%*Bڧ^b\j1.[α uq!NHK8q%<ǘ]o:VS8yn/țu>gqo%n8<Ժ1!IiN%Y.SS.!Kod5{ZZJy))(kXCϱ1KǞKRֱLZ:uX^kM1wQ$h,A1"Fo3t(0Ic(̈a"yQ$͸Eu!(uO)juZŭT<)-85fѮClykJ[Z?}Mtl2m5KnZXסm[:[JZן׏|Vu RПWCԶ8R\SR8kT%n%:;E%X1||iP"cXQ?F9վB_% k8Z"JZ"?3vHLjVZߔZRXⅬupҜkS!VjZpZ-)[ǒaN%V$)o4ha/)?5}Sy8(RBy (ήLEBߜSq*TS?)*5GH-KYhY߸ǥ?:$IJĚQo-HcR>%j[`mK<ƭkֹ]+8!KBBbߡsCj1j[֮Zxy)ISuKP[8⚳ΐ5cc).\yZijbCө}[8]u){RqK[^yQk+'q,MI RCyֵ5JSC:לn8yıMKBFqN8V꒥amw.bu(~yP{cKqyI.-kZ11iy}qœi'汌bZ%_CZp6|Q<-Ĕik%璦WBur_甶qO88y.}ï!)yXa<[ա1~~kKZЅ~F,id<Ԛ%nRb)]Ŭ]~~Q/%*B[1y.D/}c5SiY]j\c~ZB+jX꘤NKkϞ~} KH,[![>-\k4S?!y%.~:)!- ZbwR1i/%t%jaJI=,C1(S\BZ61:8JVaמ1%~ulviiy_SQ8qK $hT՝u%?5]j<[XKuo:ĵcC<- RIW+cJC~K~uN![qh★>C)ؕ%:]yOGԷ?%)>&R/ )+ϓZP>VYַZcTbߖq%Z yˇ[QJq]ueǽ:?!]B>JԶCIcoj~$-%:P֧$ԩ䩿yQȧV{ %hv):ROcRCšCqj۫x+5)lV(JTԭuOΥ+kb$ c4iY3,Х(IkQNb])b}$|hTϒVK|uk搥::N#R(}Ɣ??)N<߱ĥibh[zNj}u+QK焦3XTr%q C5Ժ<լ8鎩:uc3܋4Xթ^!ϭ*c]ct:R]kR j<ڗqJS>qqBJVc^Z٨R7gߟy jciY_8IdqN[]EΩNJSTQA8j[KuQZ|8R{ST%H~k8-^i~C?)J[Bʐ8KK0XVԦ5 F?8bp}%R0뿐8%%ĭH~b~:Đu_yob_1ujyKN-kVxո jIbSn.XYyűLxSi[b^<έob1cJyKy(JGԡ'v%֭N8 q\y:%b6Vj\j1Y"VWĺƥ~b[885N<뮭ymuo;JXV1)!kKK[)Lcby*bi9BЗ\S-X׍8e!3J8R|թTY Jk SVZ[!qšY!N 4G^%Q+ZK]߸ƭԸ>ևԸ ?11 R=Ɠim.EQ1[I'"yHLTN5!Ji So8PHyK bVKTDZ:[RcaZ滏5cJc5jߚ5QICg֤oq,cu.y~?! ~pm_?:cRR5ϼJkyiKϔ+R.,֔c1."M6J8iZ8ڴ5(y֫8cLJ&"8yi)cT%q-SqNy?!!o(m6[GLjRۉJxb_;o-ɌE6Ӈ蒚upq-3RSjZ<~{5y"[,X1-J]>J\qڇZKPq-4Kihݤ[LJ,aHS]/k5,S^bƺ<<ĭ!~\Z yqq JTyhqZJBP8jP88SQ!Sxı.5ߵ uϺ֥mu)k5jR]u]8ĥ!L1ǞYj-ƨ-u J>!iRS\ZI)KkbHAԵZZ>5ikqO3μ񨣉jw) Yg% cqա5,yT[C!V<)%J[j SBȈSKB8XcRĸqy]dڐj%%eD%<& J%8󮐇 BmKJŬZQjQu<,T0SijN1K_S -kS4mldRSkujkΥ([S$!--[JIvKue[OإX-K~CRֵ!թ)O<cBCԱrԼN7^BO-S:ZߔipK(ꒅI_ ǖ 1+RRRO~c~BXky;1|,嚷^ws8kS8ĥ5%:~-Î:j8^kXa SRšP:IuZzƱu֖VbQŵŞcTjZun.!mq;xq}MOh[J뮲Xҵ-\-15q."(Gƺ[!pu+yLqJjs!޹iVT!']Cpؔ fAic1IgèN8ĵ)ط҄%KuؗV5:%q7ՠb-e)+Cohiq*K,cSa亅1.)ZV-|>&"K[[SowKKP>NV8]uP yc_[NZiMK串_FHu*xj՘_B\))5yGm.R6\m,ujۯ?cuŵkRSyo){X}Ic %Sk*֒Wj%Zj?!i~-bGsxĩj[]R\Oز~kb9 ~b_[V)C'%K~Y*ZN%F~y1:N#~c%y/J?3B+8jk\s㮥oqa*J:%™Mc"ZutZd:\5mqĚq)!OCjZKBc!myyImKy5u,CZd5C!G~~Cyv_y.)O5kKƾagqbRش1/8S^kBƺBR%-AuƥXռ]S8ŸJKK{M ԡJ1 )jXּ:Jun! jT\y!T):Vbi/K1 kkqhcZ_UspƩjRZb!.Nĸź03"2FQ|ejV=ZZSUFyִ.}Zah%8 BR~?1ֵ)LZQL1KdJcבZ1 _֕-5t2[YOo(y֡~kSv-J~E-O:HMƝ[Rm1!ĭ)NԿ: ~ X1_B~> cYLG҆1խ&TJN<~҉8Xy*0mlPb [Jy!Kq*kyAmSSu,ƺy<q+SCw\uMOڥf?0Zǐy ӯP8qkkR1V!ֵ.8]b~]q y5]qSSέ.4:K:%N)R^N^a)y8cVin)'aN%l}<&޾򚷖tX GJR)KulunCVb׎ߚJUvPS)N1OJucJX\u?c!JAJykzO|ŔԺ8PCq_KZZ!~BqZ^;+y41n59-)ן!bc3GX[\qJb^ϛiZJ:iRё--םbTq)KM58%58%:%N-qդ֩ǔҧV-GXq y u˜YZuAB$$1i FXsyպ:5f<ĥn'%-.[uN%KwC^Rk8qTOTκǖ1.X/% R[Syp5ŵ%(% s31yLy=1+R!֡G(Z-]Vnrjk}OR^K_[uT߼b]q䱏R<%kq ))yĒ]tCaա:KZi&1Z$w"8Æ2OKX(:1NCZPu!Ƽ-yub:!թy8-%U!Iqj1kR<qIZPԵ XBqnIJ%|j^SZ5IuRRμ֭.Kj:!R1C!-vN!uq*cCc)1ŻbuŵCN:SO<%o-Թ#\BJK%j-%ǘCXx0ؤ:VcyG.) u-kKKb<]c5c\CcJ}yN EyǚIKyy׋y*CYJkjkKjJT1.%%jS:ה8ByX c!ԥ)Aq-BK\c<]B^SgR ΃ oA%*Ydvί?8j`ڭ`[ڛ清Kq_ST5yhT녰Z8)KR<>%BJZ<]wq'|1/%)D$ڦ1)&X[)\mjhOKiIq]GVq ġy.,&]yz5Hqx\K,u8ZR֥k KCΡHy[q,1Ե8R%!N%kqX!!Sq(1KB1uZSqit.8yR8^CVK])/5LuyԵb![%+B!8㉗Q琇qc[\cα)c+帒؄}+B\tթPS<--B%瘔1ŜYNHbLK8P!uRc]qN)iBZ(TqκĥyhS1:\{^B\cabTa+tԷ]kciQ)׋SZy!KZ%8]bqmgqbqJMgqo1׎1RPuƺP򔖬ڶ%buqy+JҴ:]-/1:RRP8☒VqK$8J^u0*Е5疒.ZR̤)NhvuXB!-k)lKDq*u8^Cv\)䘵:BkKb5d=!iI-My)c- RBq8ġy-:R( YN qcCR;ǔռmqqZ>)X,cbCKkPVuƭCuĵCZqL[)յ [4)Kq [C\CVc1]y8:D'BJ^bUmm)8]u:V%O-n: Bq5l1O4)9KZRq5婨qLy-H1u[N.Z]R-PP1q奉SJ ZKǍuTS BLJ^QBҥbbK:n:~Ʊj1 u5HJ8!q|]JLj(I/)nJ$8j[yָbԆu K!u~ZCyy53y5 bXZ- %ֱҐRšn:Sט5[%:זX%CԝOHcp8ִq֥qgZڦ%zbֱ50Z8QԩLbTM5ֱֺĬ1 y1VǝVPJ^rV)+SGO8␴Jש'|ZX>V5kqN[:BJ[έ8ך\yKkN<[ϵF) b{yLCRuq boV8ǝBqSj\J☪co[ե CB؄[j\Q琴:ZC-)o<J<kK%)աt% yj!NSY\1/%ǒs[%מ[ykR R1jcPBĺVl%Żռ-ΩS1խO8105ÍbKcZP JO)RjZ8!ĺĪԇSb1mcAJT^Yju. BB؄ǞuRSRS bSBn1Hc֥屮1JBXƸǔyHuDN^k~ [ SN.<]yKMqO) RZZS8q)CPkT3qOi>][JqKqH}bZC}/-R𧐧[Jݵb!mj^KPuKl\KyκIO:yb!X^Cu&)nck%6Z-cpǏ:ky&qpy_RTNcS8]kP%HB'qhqLJHjb؃PcJTyO%]Zơ jjΩ!jyP<[\QƼŵGJ!y tYmcRxR\cXǚ^yKqc)5ť,uZ-<-HpKx-y:XZ8-n؏5jKŽ5]!bךV8ǖCq^!o-qn2j:Sxԩ(y:ZBkmo-+RBRj1-umIGRBPǚ֧yƴ8Еl[KqKByÞbTԱ.1kjԲN!Ct8[Pyuj^RJJf-q1Yk:1KRǝKJw-u[^-Nз]B_[CPP-ļƺ)5oKCꔴ8iyXג1.!5B-5 S8K.ꚵ%(qJ^1K1My]JyU,KKkqםyiǖ-[C^JCϸƻ:Ck<)k!o-8^:qǒ1kZ\u–Sy.]}k}+RRX<8SuON:(%)[:הCSK\q%85 Rt8)Ccy/):[88瘶q815Hq՝cq/1PB cVCVR8מCCCV%O(JXX֭u.)5.\yiY!ӍbyQ%Қ֧T<}yֵ'O7[JSuMuזM[q[[>ı Sy1uk8֐!JڅPז!-$jV)ICqCkRLS1yjkC3qĸxHJZ^sCuo8ԥ%SB}֥%ĥyBӫbങ[JC:c(PTq cX5ǔ5ԐuAMq5[qƸμB18%*ךR! C8Zq8myRB˴)N!ԩ,RαCI cXO5ua Bg% JZVRc[qiqF8T$JC80^5Ky/:kX[ZbΩ-?5JV)8<Œd:-ƫpZY䩪;ӌySǖuĩzA%)nօ)_iuK/-: R: 8T8B5ĵ IMjB]qCKζuKKPA(Z⥬q t kk[.!lSZqեĸZ!֡ǞZ[Nd8b^ZLj]C-FC5-u)5kRj<5ƥiu(uy2ZJ^cۯ! qiu5.y qZ8ycu(K]} a-) QkulFnԱKjyenBy.%SBθ!ibPơ,jPΥ漗IkjלZjBؖ5qך[SP9liL;]tqNlî h# KĜ%)fT Çf6s8$礸G4-Q$8ӷOFm"4ENhpQFOq^E琧jRG۪crjceoިS=~[N:W<^9έhAdi,4J(͂4vH> ms˨4oSPť]qkB؇sC\s5y j]bkbvY-%IqRu=g0 3 ,gu\.uM%U% M! nJ2ЄA( _%NԏZZ'mHΗb4kڒq\eljҮ5Jb>vqǒ}nkR(qR1=]c{}mq/\aq9 K.4XamR6#z2T!ַqKR{x[uםJCߨR3,GR$4f%ƺÄc)ľֶkj\\ubXR')\qhƥ()vnqR)Ju%%]q1_Z5tIc`#ʄo`Ee0>VZVOWkcNs<1 Sǖ]\բS[UG^oޗY:uM[חg2ZjRXjش<ĭļJQO8bR<ָ}-r'PKVC\^1kqI.<-/5(s1yhk3-! [#1.bXĘ㸆ǐԴ8Z8h Bh(FםykZQuC–Co1!! iO! Z:O1 q WԸ%icR\JcCCZ#IyKk-%/!)֥BCPwR3OԹbS8n]CթIqÉjO)zJq1sqHkY%Xg/9%5jy8[zp!C1tϩ<גL[uk8ךRTkZڷa,\quVun1MRZRֺ]y\\Kk r^k1VB]BmTKiyƩ-Bք^[\:CZ~Xc!wZVHro%hQObЧ~iTJLQΕ4Fk\3yC-R)utגVO5{SuÈ[tZ:Ǚǝq:㍶%ǔq_iź\<#%<1B'Ab@8abzիJVR:K[x$溇c!R.^CxPǚ^uXM1[8t~[%n1gXgWj3qjC|-/1MjYť5y jqHS~:ԣ8ꐗRݥƜyJX1C)Lj)<Ƽc!ϥ+Bbcq?nkpCjCZCG8ԗMlSK IkK[ָ:%IZV]uqKKCBCju)o)ZC:ǐ qR/%k}Ժ(%e!o%q-RgyXC7y5q8[QZ#Jkud^y,ylqNKZ%; qqϨ›/:8[պ^us\q%\PQF"0c5ǜcXtqky-漶-q [b)KJ-)?Kտ:IN)֐qRք:ЋCVJy%1o'j[!hc!.X$b%1 Aг5-aO%ƱJZqb[h[R]u֘uqSckSзcqZRK!%S)SSKq屦J]qաƔS8K/KjRR~>inSkkVNa1+%KRNI*zX%+)*cT!vj!8!-1 XRyyԱ%BRS.1)nR\jRRڢ嘆:]b [^jJSjTBSkBҦ1o!\y,jjucbkR:%ĵjKT50\u瘶)%Yu y4<B\c\N!%O%MqJkZX7[ZqkTSlk[]jƸbnB>jԖubx8ӇPĭzq;8=5q:1).<%TSbqq ƸGK\85E9bב-K7Ҙ^y ]Sy q1)t- j-(8V؃%MZRuHJKu!U槪Su)=kԵǟCJSx1+ByrqëZ)\bqCqHSo1uԡhJy}8ŵkqfh1y%)y#YlSi:Xy-n:.cS]u/8CZũZ8]ޭrjIOWuuzNJֵumj}+[!KqS]kR}X]RZө"jqı5氷YRNה!R]kSZ!quCRZmP-Nӯ-Ÿ8W KטSq1 uiBCR ]Z]qcJۋ%6jպxꎥjN!5 oMCPV8㮳.C-Ow<8y $jJ#yĹ:ִ[帞&ێQm^-'KִJ-_c+xme-B)LBaBϥIV}d=4RYu%;;Ruמtc9 mi̢̭8xRǫqղ^q b҅'0;-kL_q+!םBXuN%׊M-qSSSql8/]v\cOtN1f#^T}V&:Ku v0MM%ϗ"?fNgDcG&&'xEf+)O/=p=P1A=QU 0::ǣh*5K/>ㄐ>t3L&&֭[7j"2 3fAjxjGyĶ-˲듉D.]z) AM%32ff zf:w֝o|j_ fm *-"_UMM X;{l0 Wĸ3ydlWyDdwV{},%&?őo͊w^wELm䆍O 5A E`-~G◿'p`+??҅0t* ;sBp2|i ΖL4MG;RJ;vD"4Ow466^*mmmoF._<.\޽pqQǎ:zl劕U<ZkN8[*ϥLf6O HxB!|>#6f.b1bYں~u˷QIgggyq'NMͼn__߇~yu՘8p`PJ B]vmذpm۶ٳ6l s*>}; 0PfbGܸq͛hֳZMb/BD\׵mzK7d2HJ9.\AYܜ9F(Wu?`LN_IENDB`v_sim-3.7.0/lib/plug-ins/abinit/0000755000353400050620000000000012216331350013407 500000000000000v_sim-3.7.0/lib/plug-ins/abinit/Makefile.am0000644000353400050620000000144712215546160015377 00000000000000## Process this file with automake to produce Makefile.in vpath %.h $(top_srcdir)/src if PLATFORM_WIN32 cflagWin = -mms-bitfields -mno-cygwin endif if HAVE_ABINIT_SYMMETRY symmetry = ab_symmetry.h ab_symmetry.c endif libabinit_la_SOURCES = abinit.c abinit.h $(symmetry) libabinit_la_LIBADD = $(top_builddir)/src/lib@PACKAGE_TARNAME@-3.la \ @GLIB_LIBS@ @AB_LIBS@ $(FCLIBS) libabinit_la_LDFLAGS = -module @EXTRA_LDFLAGS@ -version-info $(lib_v_sim_version) if HAVE_ABINIT AB_LIB = libabinit.la AB_EXAMPLE = ab_silicon.in AB_PIX = abinit.png endif v_simplugins_LTLIBRARIES = \ $(AB_LIB) INCLUDES = \ -I$(top_srcdir)/src \ @AB_CPPFLAGS@ \ @GLIB_CFLAGS@ \ @GTKS_CFLAGS@ AM_CFLAGS = $(cflagWin) v_simexamples_DATA = $(AB_EXAMPLE) v_simpixmaps_DATA = $(AB_PIX) EXTRA_DIST = ab_silicon.in abinit.png v_sim-3.7.0/lib/plug-ins/abinit/Makefile.in0000644000353400050620000005771612216330211015407 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = lib/plug-ins/abinit DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/abinit.m4 \ $(top_srcdir)/m4/ax_check_gl.m4 \ $(top_srcdir)/m4/ax_check_glu.m4 \ $(top_srcdir)/m4/ax_lang_compiler_ms.m4 \ $(top_srcdir)/m4/ax_lapack.m4 $(top_srcdir)/m4/bigdft.m4 \ $(top_srcdir)/m4/etsf_io.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/libxc.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/netcdf.m4 \ $(top_srcdir)/m4/python.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(v_simpluginsdir)" \ "$(DESTDIR)$(v_simexamplesdir)" "$(DESTDIR)$(v_simpixmapsdir)" LTLIBRARIES = $(v_simplugins_LTLIBRARIES) am__DEPENDENCIES_1 = libabinit_la_DEPENDENCIES = \ $(top_builddir)/src/lib@PACKAGE_TARNAME@-3.la \ $(am__DEPENDENCIES_1) am__libabinit_la_SOURCES_DIST = abinit.c abinit.h ab_symmetry.h \ ab_symmetry.c @HAVE_ABINIT_SYMMETRY_TRUE@am__objects_1 = ab_symmetry.lo am_libabinit_la_OBJECTS = abinit.lo $(am__objects_1) libabinit_la_OBJECTS = $(am_libabinit_la_OBJECTS) libabinit_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libabinit_la_LDFLAGS) $(LDFLAGS) -o $@ @HAVE_ABINIT_TRUE@am_libabinit_la_rpath = -rpath $(v_simpluginsdir) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libabinit_la_SOURCES) DIST_SOURCES = $(am__libabinit_la_SOURCES_DIST) DATA = $(v_simexamples_DATA) $(v_simpixmaps_DATA) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AB_CPPFLAGS = @AB_CPPFLAGS@ AB_LIBS = @AB_LIBS@ ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIGDFT_CPPFLAGS = @BIGDFT_CPPFLAGS@ BIGDFT_LIBS = @BIGDFT_LIBS@ BLAS_LIBS = @BLAS_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETSF_IO_LIBS = @ETSF_IO_LIBS@ EXEEXT = @EXEEXT@ EXTRA_CFLAGS = @EXTRA_CFLAGS@ EXTRA_LDFLAGS = @EXTRA_LDFLAGS@ EXTRA_LIBS = @EXTRA_LIBS@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ FCLIBS = @FCLIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLIBS = @FLIBS@ FONT_BOLD = @FONT_BOLD@ FONT_NORMAL = @FONT_NORMAL@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_BIGDFT_CFLAGS = @GLIB_BIGDFT_CFLAGS@ GLIB_BIGDFT_LIBS = @GLIB_BIGDFT_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GOBJECT_INTROSPECTION_REQUIRED = @GOBJECT_INTROSPECTION_REQUIRED@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTKS_CFLAGS = @GTKS_CFLAGS@ GTKS_LIBS = @GTKS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_SCANNER = @G_IR_SCANNER@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LAPACK_LIBS = @LAPACK_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXC_LIBS = @LIBXC_LIBS@ LIB_ARCHIVE_CFLAGS = @LIB_ARCHIVE_CFLAGS@ LIB_ARCHIVE_LIBS = @LIB_ARCHIVE_LIBS@ LIB_YAML_CFLAGS = @LIB_YAML_CFLAGS@ LIB_YAML_LIBS = @LIB_YAML_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NC_CPPFLAGS = @NC_CPPFLAGS@ NC_LDFLAGS = @NC_LDFLAGS@ NC_LIBS = @NC_LIBS@ NC_NETCDF_3_CPPFLAG = @NC_NETCDF_3_CPPFLAG@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBABEL_CFLAGS = @OPENBABEL_CFLAGS@ OPENBABEL_LIBS = @OPENBABEL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PYGOBJECT_CFLAGS = @PYGOBJECT_CFLAGS@ PYGOBJECT_LIBS = @PYGOBJECT_LIBS@ PYGOBJECT_REQUIRED = @PYGOBJECT_REQUIRED@ PYGTK_CFLAGS = @PYGTK_CFLAGS@ PYGTK_LIBS = @PYGTK_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_INCLUDES = @PYTHON_INCLUDES@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ V_SIM_MAJOR_VERSION = @V_SIM_MAJOR_VERSION@ V_SIM_MICRO_VERSION = @V_SIM_MICRO_VERSION@ V_SIM_MINOR_VERSION = @V_SIM_MINOR_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ girdir = @girdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ lib_v_sim_version = @lib_v_sim_version@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typelibsdir = @typelibsdir@ v_simexamplesdir = @v_simexamplesdir@ v_simexedir = @v_simexedir@ v_simiconsdir = @v_simiconsdir@ v_simlegaldir = @v_simlegaldir@ v_simpixmapsdir = @v_simpixmapsdir@ v_simpluginsdir = @v_simpluginsdir@ v_simresourcesdir = @v_simresourcesdir@ visupyexecdir = @visupyexecdir@ visutypelibsdir = @visutypelibsdir@ @PLATFORM_WIN32_TRUE@cflagWin = -mms-bitfields -mno-cygwin @HAVE_ABINIT_SYMMETRY_TRUE@symmetry = ab_symmetry.h ab_symmetry.c libabinit_la_SOURCES = abinit.c abinit.h $(symmetry) libabinit_la_LIBADD = $(top_builddir)/src/lib@PACKAGE_TARNAME@-3.la \ @GLIB_LIBS@ @AB_LIBS@ $(FCLIBS) libabinit_la_LDFLAGS = -module @EXTRA_LDFLAGS@ -version-info $(lib_v_sim_version) @HAVE_ABINIT_TRUE@AB_LIB = libabinit.la @HAVE_ABINIT_TRUE@AB_EXAMPLE = ab_silicon.in @HAVE_ABINIT_TRUE@AB_PIX = abinit.png v_simplugins_LTLIBRARIES = \ $(AB_LIB) INCLUDES = \ -I$(top_srcdir)/src \ @AB_CPPFLAGS@ \ @GLIB_CFLAGS@ \ @GTKS_CFLAGS@ AM_CFLAGS = $(cflagWin) v_simexamples_DATA = $(AB_EXAMPLE) v_simpixmaps_DATA = $(AB_PIX) EXTRA_DIST = ab_silicon.in abinit.png all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu lib/plug-ins/abinit/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu lib/plug-ins/abinit/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-v_simpluginsLTLIBRARIES: $(v_simplugins_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(v_simpluginsdir)" || $(MKDIR_P) "$(DESTDIR)$(v_simpluginsdir)" @list='$(v_simplugins_LTLIBRARIES)'; test -n "$(v_simpluginsdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(v_simpluginsdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(v_simpluginsdir)"; \ } uninstall-v_simpluginsLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(v_simplugins_LTLIBRARIES)'; test -n "$(v_simpluginsdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(v_simpluginsdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(v_simpluginsdir)/$$f"; \ done clean-v_simpluginsLTLIBRARIES: -test -z "$(v_simplugins_LTLIBRARIES)" || rm -f $(v_simplugins_LTLIBRARIES) @list='$(v_simplugins_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libabinit.la: $(libabinit_la_OBJECTS) $(libabinit_la_DEPENDENCIES) $(EXTRA_libabinit_la_DEPENDENCIES) $(libabinit_la_LINK) $(am_libabinit_la_rpath) $(libabinit_la_OBJECTS) $(libabinit_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ab_symmetry.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/abinit.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-v_simexamplesDATA: $(v_simexamples_DATA) @$(NORMAL_INSTALL) test -z "$(v_simexamplesdir)" || $(MKDIR_P) "$(DESTDIR)$(v_simexamplesdir)" @list='$(v_simexamples_DATA)'; test -n "$(v_simexamplesdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(v_simexamplesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(v_simexamplesdir)" || exit $$?; \ done uninstall-v_simexamplesDATA: @$(NORMAL_UNINSTALL) @list='$(v_simexamples_DATA)'; test -n "$(v_simexamplesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(v_simexamplesdir)'; $(am__uninstall_files_from_dir) install-v_simpixmapsDATA: $(v_simpixmaps_DATA) @$(NORMAL_INSTALL) test -z "$(v_simpixmapsdir)" || $(MKDIR_P) "$(DESTDIR)$(v_simpixmapsdir)" @list='$(v_simpixmaps_DATA)'; test -n "$(v_simpixmapsdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(v_simpixmapsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(v_simpixmapsdir)" || exit $$?; \ done uninstall-v_simpixmapsDATA: @$(NORMAL_UNINSTALL) @list='$(v_simpixmaps_DATA)'; test -n "$(v_simpixmapsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(v_simpixmapsdir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) installdirs: for dir in "$(DESTDIR)$(v_simpluginsdir)" "$(DESTDIR)$(v_simexamplesdir)" "$(DESTDIR)$(v_simpixmapsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-v_simpluginsLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-v_simexamplesDATA install-v_simpixmapsDATA \ install-v_simpluginsLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-v_simexamplesDATA uninstall-v_simpixmapsDATA \ uninstall-v_simpluginsLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-v_simpluginsLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip install-v_simexamplesDATA \ install-v_simpixmapsDATA install-v_simpluginsLTLIBRARIES \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-v_simexamplesDATA \ uninstall-v_simpixmapsDATA uninstall-v_simpluginsLTLIBRARIES vpath %.h $(top_srcdir)/src # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: v_sim-3.7.0/lib/plug-ins/abinit/abinit.c0000644000353400050620000006700512215546160014757 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include "abinit.h" #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_ABINIT_SYMMETRY #include "ab_symmetry.h" #endif /* For compatibility with older version. */ #ifndef AB6_INVARS_STR #define AB6_INVARS_STR(A) #A #endif #ifndef ab6_error_string_from_id #define ab6_error_string_from_id(A) #A #endif #define ABINIT_DT "ABINIT_datasets" #define ABINIT_DESCRIPTION _("" \ "This plug-in introduces support for\n" \ "crystallographic structures in\n" \ "ABINIT input files.") #define ABINIT_AUTHORS "Caliste Damien" /* Local methods */ static void abStructuralInit(VisuRendering *method); static void abSpinInit(VisuRendering *method); static gboolean loadAbinitIn(VisuData *data, const gchar* filename, ToolFileFormat *format, int nSet, GCancellable *cancel, GError **error); static gboolean loadAbinitSpin(VisuData *data, const gchar* filename, ToolFileFormat *format, int nSet, GCancellable *cancel, GError **error); static gpointer parseAbinitThread(gpointer data); static GError* loadAbinit(VisuData *data, Ab6Invars *dt, int nSet); static gboolean waitDt(gpointer data); static void freeDt(gpointer dt); static gchar** readPseudoFiles(AbinitData *dt); /* Local variables */ static gchar *iconPath; /* Required methods for a loadable module. */ gboolean abinitInit() { DBG_fprintf(stderr, "Abinit: loading plug-in 'abinit'...\n"); DBG_fprintf(stderr, "Abinit: declare a new rendering load method.\n"); abStructuralInit(visu_rendering_getByName(VISU_RENDERING_ATOMIC_NAME)); DBG_fprintf(stderr, "Abinit: declare a new spin load method.\n"); abSpinInit(visu_rendering_getByName(VISU_RENDERING_SPIN_NAME)); iconPath = g_build_filename(V_SIM_PIXMAPS_DIR, "abinit.png", NULL); ab6_mpi_init(); return TRUE; } gboolean abinitInitGtk() { DBG_fprintf(stderr, "Abinit: declare a new interactive tab.\n"); #ifdef HAVE_ABINIT_SYMMETRY visu_ui_interactive_addAction(buildTab, startSelect, stopSelect); #endif return TRUE; } const char* abinitGet_description() { return ABINIT_DESCRIPTION; } const char* abinitGet_authors() { return ABINIT_AUTHORS; } const char* abinitGet_icon() { return iconPath; } static void abStructuralInit(VisuRendering *method) { #ifdef HAVE_NEW_WITH_PSEUDO const gchar *type[] = {"*.in", "*.files", (char*)0}; #else const gchar *type[] = {"*.in", (char*)0}; #endif visu_rendering_addFileFormat(method, 0, tool_file_format_new(_("ABINIT input file format"), type), 95, loadAbinitIn); } static GMutex *dt_mutex = (GMutex*)0; void abinit_mutexInit() { if (!dt_mutex) dt_mutex = g_mutex_new(); } void abinit_mutexRelease() { if (dt_mutex) { g_mutex_free(dt_mutex); dt_mutex = (GMutex*)0; } } void abinit_mutexUnlock() { if (dt_mutex) g_mutex_unlock(dt_mutex); } static AbinitData ABINIT_DATA; AbinitData* abinit_getDt() { if (!g_mutex_trylock(dt_mutex)) return (AbinitData*)0; else return &ABINIT_DATA; } AbinitData* abinit_getDirectDt() { return &ABINIT_DATA; } static gboolean loadAbinitIn(VisuData *data, const gchar* filename, ToolFileFormat *format _U_, int nSet, GCancellable *cancel, GError **error) { #ifdef G_THREADS_ENABLED GThread *ld_thread; #endif AbinitData *dt; Ab6Invars *dataset; g_return_val_if_fail(error && !*error, FALSE); /* Try to see if data has already read this dataset. */ dataset = (Ab6Invars*)g_object_get_data(G_OBJECT(data), ABINIT_DT); if (dataset) { *error = loadAbinit(data, dataset, nSet); return TRUE; } /* Read the file, since it's the first time. */ dt = abinit_getDirectDt(); dt->dt = (Ab6Invars*)0; dt->filename = g_strdup(filename); dt->error = (GError*)0; dt->isABFormat = FALSE; dt->data = data; dt->nSet = nSet; dt->getMessages = TRUE; dt->messages = g_async_queue_new(); dt->useSignals = TRUE; dt->signals = g_async_queue_new(); dt->cancel = cancel; #ifdef G_THREADS_ENABLED abinit_mutexInit(); ld_thread = g_thread_create(parseAbinitThread, (gpointer)0, FALSE, error); DBG_fprintf(stderr, "AB structure: run ABINIT parsing into a thread (%p) from me (%p).\n", (gpointer)ld_thread, (gpointer)g_thread_self()); if (ld_thread) { g_async_queue_pop(dt->signals); DBG_fprintf(stderr, "AB structure: start waiting.\n"); g_idle_add_full(G_PRIORITY_LOW, waitDt, (gpointer)0, (GDestroyNotify)0); } else g_warning("Can't run thread for ABINIT parsing."); #else DBG_fprintf(stderr, "AB structure: run ABINIT parsing directly.\n"); *error = (GError*)parseAbinitThread((gpointer)(&dt)); #endif while(g_main_context_pending(NULL)) g_main_context_dispatch(g_main_context_default()); if (dt->error) *error = dt->error; g_async_queue_unref(dt->signals); g_async_queue_unref(dt->messages); abinit_mutexRelease(); g_free(dt->filename); DBG_fprintf(stderr, "AB structure: file parsed, returns %d.\n", dt->isABFormat); return dt->isABFormat; } static gpointer parseAbinitThread(gpointer data _U_) { AbinitData *dt; Ab6Invars *dt_; gchar **pseudos; DBG_fprintf(stderr, "AB(%p) main: get the dt structure.\n", (gpointer)g_thread_self()); dt = abinit_getDt(); g_return_val_if_fail(dt, (gpointer)0); /* Send a signal to V_Sim to say that parsing will start. */ g_async_queue_push(dt->signals, GINT_TO_POINTER(TRUE)); /* Try to see if the provided file is a *.files with pseudo information. */ pseudos = readPseudoFiles(dt); if (!dt->error) { /* Read the file and store its contain as a string. */ DBG_fprintf(stderr, "AB(%p) main: read and store input file '%s'.\n", (gpointer)g_thread_self(), dt->filename); #ifdef HAVE_NEW_WITH_PSEUDO DBG_fprintf(stderr, "AB(%p) main: pseudo list %p.\n", (gpointer)g_thread_self(), (gpointer)pseudos); dt_ = ab6_invars_new_from_file_with_pseudo(dt->filename, (const char**)pseudos); #else dt_ = ab6_invars_new_from_file(dt->filename); if (pseudos) g_warning("Unsupported ABINIT input file with pseudo-potential information."); #endif if (pseudos) g_strfreev(pseudos); /* If we reach here, it means that no error happened. */ dt->dt = dt_; } DBG_fprintf(stderr, "AB(%p) main: unlock mutex, other thread can access dt.\n", (gpointer)g_thread_self()); abinit_mutexUnlock(); return (gpointer)0; } static gboolean waitDt(gpointer data _U_) { AbinitData *dt; gpointer mess; dt = abinit_getDirectDt(); /* We stop on cancel, without error. */ if (g_cancellable_is_cancelled(dt->cancel)) { /* We push a message in the queue to be tested by ABINIT. */ g_async_queue_push(dt->signals, GINT_TO_POINTER(TRUE)); return TRUE; } mess = g_async_queue_try_pop(dt->messages); if (mess) { visu_object_setLoadMessage(VISU_OBJECT_INSTANCE, (const gchar*)mess); g_free(mess); } /* DBG_fprintf(stderr, "AB structure: waiting...\n"); */ dt = abinit_getDt(); if (!dt) return TRUE; /* We empty the message queue, in case. */ DBG_fprintf(stderr, "AB structure: empty the queue.\n"); while (g_async_queue_length(dt->messages) > 0) { DBG_fprintf(stderr, " | emptying.\n"); g_free(g_async_queue_pop(dt->messages)); } DBG_fprintf(stderr, "AB structure: stop waiting, analyse.\n"); dt->isABFormat = TRUE; if (dt->error && dt->error->code == RENDERING_ERROR_FILE) { dt->isABFormat = FALSE; g_error_free(dt->error); dt->error = (GError*)0; abinit_mutexUnlock(); return FALSE; } else if (dt->error) { abinit_mutexUnlock(); return FALSE; } else { dt->error = loadAbinit(dt->data, dt->dt, dt->nSet); /* We attach this Abinit dataset to this VisuData. */ DBG_fprintf(stderr, "AB structure: add '%s' to VisuData %p.\n", ABINIT_DT, (gpointer)dt->data); g_object_set_data_full(G_OBJECT(dt->data), ABINIT_DT, (gpointer)dt->dt, freeDt); } abinit_mutexUnlock(); return FALSE; } static void freeDt(gpointer dt) { DBG_fprintf(stderr, "AB structure: release ABINIT resources.\n"); ab6_invars_free((Ab6Invars*)dt); } static gchar** readPseudoFiles(AbinitData *dt) { GIOChannel *ioFile; GString *line= (GString*)0; gchar *inFile; GList *lst, *tmpLst; gchar **out; int i; DBG_fprintf(stderr, "AB(%p) main: read '%s' to find pseudo files.\n", (gpointer)g_thread_self(), dt->filename); ioFile = g_io_channel_new_file(dt->filename, "r", NULL); if (!ioFile) return (gchar**)0; line = g_string_new(""); if (g_io_channel_read_line_string(ioFile, line, NULL, NULL) != G_IO_STATUS_NORMAL) { g_io_channel_shutdown(ioFile, FALSE, NULL); g_io_channel_unref(ioFile); g_string_free(line, TRUE); return (gchar**)0; } inFile = g_strstrip(g_strdup(line->str)); /* We test inFile in case. */ DBG_fprintf(stderr, "AB(%p) main: testing '%s' as input file.\n", (gpointer)g_thread_self(), inFile); if (!g_file_test(inFile, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) { g_io_channel_shutdown(ioFile, FALSE, NULL); g_io_channel_unref(ioFile); g_string_free(line, TRUE); g_free(inFile); return (gchar**)0; } /* From now on, we consider that we have a valid *.files file. */ for (i = 0; i < 4; i++) if (g_io_channel_read_line_string(ioFile, line, NULL, &dt->error) != G_IO_STATUS_NORMAL) { g_io_channel_shutdown(ioFile, FALSE, NULL); g_io_channel_unref(ioFile); g_string_free(line, TRUE); g_free(inFile); return (gchar**)0; } lst = (GList*)0; while (g_io_channel_read_line_string(ioFile, line, NULL, &dt->error) == G_IO_STATUS_NORMAL) { lst = g_list_append(lst, (gpointer)g_strstrip(g_strdup(line->str))); DBG_fprintf(stderr, "AB(%p) main: testing '%s' as a pseudo.\n", (gpointer)g_thread_self(), (gchar*)lst->data); if (!g_file_test((const gchar*)lst->data, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) { dt->error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FILE, "Invalid psedo-potential file '%s'.", (const gchar*)lst->data); g_io_channel_shutdown(ioFile, FALSE, NULL); g_io_channel_unref(ioFile); g_string_free(line, TRUE); g_free(inFile); for (tmpLst = lst; tmpLst; tmpLst = g_list_next(tmpLst)) g_free(tmpLst->data); g_list_free(lst); return (gchar**)0; } } g_string_free(line, TRUE); out = g_malloc(sizeof(gchar*) * (g_list_length(lst) + 1)); for (i = 0, tmpLst = lst; tmpLst; i++, tmpLst = g_list_next(tmpLst)) out[i] = tmpLst->data; out[i] = (gchar*)0; g_list_free(lst); g_free(dt->filename); dt->filename = inFile; return out; } void FC_FUNC(wrtout, WRTOUT)(int *unit,char message[500], char mode_paral[4]) { gchar *buf, *ptError, *ptInvars0, *ptInstrng, *ptSize, *ptLen, *ptMinus; AbinitData *dt; dt = abinit_getDirectDt(); g_return_if_fail(dt); #ifdef G_THREADS_ENABLED if (dt->useSignals && g_async_queue_try_pop(dt->signals)) { dt->error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_CANCEL, "Loading process cancelled."); abinit_mutexUnlock(); g_thread_exit((gpointer)0); } #endif buf = g_strndup(message, 500); g_strstrip(buf); DBG_fprintf(stderr, "AB(%p) main: wrtout(%d %c%c%c%c) %s\n", (gpointer)g_thread_self(), *unit, mode_paral[0], mode_paral[1], mode_paral[2], mode_paral[3], buf); /* We analyse buf. If, it contains an error, we test if it is about natom in inarvs0. If so, the file is not a valid ABINIT file. On the contrary, we get the message and raise an error. */ ptError = strstr(buf, "ERROR"); if (!ptError) ptError = strstr(buf, "BUG"); if (!ptError) ptError = strstr(buf, "Error"); ptInvars0 = strstr(buf, "Input natom must be defined"); ptInstrng = strstr(buf, "The occurence of a tab"); ptSize = strstr(buf, "The size of your input file"); ptLen = strstr(buf, "The number of lines already read from input file="); ptMinus = strstr(buf, "the occurence of a minus sign followed"); if (ptError && ptInvars0) dt->error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FILE, "Not an ABINIT file (no 'natom' keyword found)."); else if (ptError && ptInstrng) dt->error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FILE, "Not an ABINIT file (tab characters found in the file)."); else if (ptError && ptSize) dt->error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FILE, "Not an ABINIT file (input file too long)."); else if (ptError && ptLen) dt->error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FILE, "Not an ABINIT file (too many lines)."); else if (ptError && ptMinus) dt->error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FILE, "Not an ABINIT file (minus space error)."); else if (ptError) dt->error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, "%s", buf); else dt->error = (GError*)0; if (dt->getMessages && strstr(buf, "getkgrid")) g_async_queue_push(dt->messages, buf); else g_free(buf); if (dt->error) { DBG_fprintf(stderr, "AB(%p) main: an error occured in ABINIT.\n", (gpointer)g_thread_self()); #ifdef G_THREADS_ENABLED abinit_mutexUnlock(); g_thread_exit((gpointer)0); #else g_error("ABINIT plug-in requires threads."); #endif } } void FC_FUNC(leave_new, LEAVE_NEW)(char mode_paral[4]) { AbinitData *dt; dt = abinit_getDirectDt(); g_return_if_fail(dt); DBG_fprintf(stderr, "AB(%p) main: leave_new(%c%c%c%c)\n", (gpointer)g_thread_self(), mode_paral[0], mode_paral[1], mode_paral[2], mode_paral[3]); dt->error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FILE, "Not an ABINIT file"); DBG_fprintf(stderr, "AB(%p) main: return error (%p).\n", (gpointer)g_thread_self(), (gpointer)dt->error); #ifdef G_THREADS_ENABLED abinit_mutexUnlock(); g_thread_exit((gpointer)0); #else g_error("ABINIT plug-in requires threads."); #endif } void FC_FUNC(timab, TIMAB)() { } void FC_FUNC(psp_from_data, PSP_FROM_DATA)() { } static GError* loadAbinit(VisuData *data, Ab6Invars *dt, int nSet) { int ndtset, i; int ntypat, natom, nzero, *index; int *typat; double *znucl, rprimd[3][3], *coord, *spinat; VisuElement **ntypes; VisuElement *ele; float rcov, red[3]; char *ptChar, *name; GArray *nattyp, *types; Ab6Error error; gboolean newEle; VisuBox *boxObj; g_return_val_if_fail(dt, (GError*)0); DBG_fprintf(stderr, "AB structure: transfer data.\n"); /* Ok, try to find the required keywords. */ error = ab6_invars_get_ndtset(dt, &ndtset); if (error != AB6_NO_ERROR) return g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_METHOD, "Abinit loader report error %d while getting n datasets.", (int)error); DBG_fprintf(stderr, "AB structure: found %d dtsets.\n", ndtset); /* Store the number of datasets. */ visu_data_setNSubset(data, ndtset); g_return_val_if_fail(nSet >= 0 && nSet < ndtset, g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_METHOD, "Can't load dataset %d.", nSet)); error = ab6_invars_get_integer(dt, AB6_INVARS_NTYPAT, nSet + 1, &ntypat); if (error != AB6_NO_ERROR) return g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_METHOD, "Abinit loader report error:\n %s\nwhile getting attribute '%s'.", ab6_error_string_from_id(error), AB6_INVARS_STR(AB6_INVARS_NTYPAT)); error = ab6_invars_get_integer(dt, AB6_INVARS_NATOM, nSet + 1, &natom); if (error != AB6_NO_ERROR) return g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_METHOD, "Abinit loader report error:\n %s\nwhile getting attribute '%s'.", ab6_error_string_from_id(error), AB6_INVARS_STR(AB6_INVARS_NATOM)); DBG_fprintf(stderr, "AB structure: with %d atoms and %d types.\n", natom, ntypat); typat = g_malloc(sizeof(int) * natom); error = ab6_invars_get_integer_array(dt, typat, natom, AB6_INVARS_TYPAT, nSet + 1); if (error != AB6_NO_ERROR) { g_free(typat); return g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_METHOD, "Abinit loader report error:\n %s\nwhile getting attribute '%s'.", ab6_error_string_from_id(error), AB6_INVARS_STR(AB6_INVARS_TYPAT)); } znucl = g_malloc(sizeof(double) * ntypat); error = ab6_invars_get_real_array(dt, znucl, ntypat, AB6_INVARS_ZNUCL, nSet + 1); if (error != AB6_NO_ERROR) { g_free(typat); g_free(znucl); return g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_METHOD, "Abinit loader report error:\n %s\nwhile getting attribute '%s'.", ab6_error_string_from_id(error), AB6_INVARS_STR(AB6_INVARS_ZNUCL)); } DBG_fprintf(stderr, "AB structure: read znucl OK.\n"); types = g_array_sized_new(FALSE, FALSE, sizeof(VisuElement*), ntypat); for (i = 0; i < ntypat; i++) { /* Try to find a name instead of a z number. */ tool_physic_getSymbolFromZ(&ptChar, &rcov, znucl[i]); name = g_strdup(ptChar); /* adding name to the hashtable */ ele = visu_element_retrieveFromName(name, &newEle); g_array_insert_val(types, i, ele); if (newEle) visu_rendering_atomic_setRadius(ele, rcov); g_free(name); } g_free(znucl); DBG_fprintf(stderr, "AB structure: all new elements created.\n"); nattyp = g_array_sized_new(FALSE, TRUE, sizeof(guint), ntypat); g_array_set_size(nattyp, ntypat); ntypes = g_malloc(sizeof(VisuElement*) * natom); for (i = 0; i < natom; i++) { g_array_index(nattyp, guint, typat[i] - 1) += 1; ntypes[i] = g_array_index(types, VisuElement*, typat[i] - 1); } /* Reduce the arrays when nattyp is 0. */ nzero = 0; index = g_malloc(sizeof(int) * ntypat); for (i = 0; i < ntypat; i++) { if (i > nzero) { g_array_index(nattyp, guint, nzero) = g_array_index(nattyp, guint, i); g_array_index(types, VisuElement*, nzero) = g_array_index(types, VisuElement*, i); } index[i] = nzero; if (g_array_index(nattyp, guint, i) > 0) nzero += 1; } DBG_fprintf(stderr, "AB structure: removing null types.\n"); for (i = 0; i < natom; i++) { DBG_fprintf(stderr, "AB structure: atom %d (%d)", i, typat[i] - 1); DBG_fprintf(stderr, " -> %d.\n", index[typat[i] - 1]); ntypes[i] = g_array_index(types, VisuElement*, index[typat[i] - 1]); } g_free(typat); g_free(index); ntypat = nzero; g_array_set_size(types, ntypat); g_array_set_size(nattyp, ntypat); DBG_fprintf(stderr, "AB structure: there are %d types in this file.\n", ntypat); if (DEBUG) for (i = 0; i < ntypat; i++) fprintf(stderr, " | %d atom(s) for type %d.\n", g_array_index(nattyp, guint, i), i); if (DEBUG) for (i = 0; i < natom; i++) fprintf(stderr, " | atom %d of type %p.\n", i, (gpointer)ntypes[i]); visu_node_array_allocate(VISU_NODE_ARRAY(data), types, nattyp); g_array_free(nattyp, TRUE); g_array_free(types, TRUE); error = ab6_invars_get_real_array(dt, (double*)rprimd, 9, AB6_INVARS_RPRIMD_ORIG, nSet + 1); if (error != AB6_NO_ERROR) { g_free(ntypes); return g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_METHOD, "Abinit loader report error:\n %s\nwhile getting attribute '%s'.", ab6_error_string_from_id(error), AB6_INVARS_STR(AB6_INVARS_RPRIMD_ORIG)); } DBG_fprintf(stderr, " | box definition : ( %f %f %f )\n", rprimd[0][0], rprimd[0][1], rprimd[0][2]); DBG_fprintf(stderr, " | ( %f %f %f )\n", rprimd[1][0], rprimd[1][1], rprimd[1][2]); DBG_fprintf(stderr, " | ( %f %f %f )\n", rprimd[2][0], rprimd[2][1], rprimd[2][2]); boxObj = visu_box_new_full(rprimd, VISU_BOX_PERIODIC); visu_data_setBox(data, boxObj); g_object_unref(boxObj); coord = g_malloc(sizeof(double) * 3 * natom); error = ab6_invars_get_real_array(dt, coord, 3 * natom, AB6_INVARS_XRED_ORIG, nSet + 1); if (error != AB6_NO_ERROR) { g_free(ntypes); g_free(coord); return g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_METHOD, "Abinit loader report error:\n %s\nwhile getting attribute '%s'.", ab6_error_string_from_id(error), AB6_INVARS_STR(AB6_INVARS_XRED_ORIG)); } for (i = 0; i < natom; i++) { red[0] = (float)*(coord + 3 * i + 0); red[1] = (float)*(coord + 3 * i + 1); red[2] = (float)*(coord + 3 * i + 2); DBG_fprintf(stderr, " | ( %f %f %f )\n", red[0], red[1], red[2]); visu_data_addNodeFromElement(data, ntypes[i], red, TRUE, FALSE); } /* We reset the box size after we set all the coordinates to get the OpenGL box right. */ visu_box_setMargin(boxObj, visu_node_array_getMaxElementSize(VISU_NODE_ARRAY(data)) + visu_data_getAllNodeExtens(data, boxObj), TRUE); g_free(ntypes); g_free(coord); /* We set the units. */ visu_box_setUnit(boxObj, TOOL_UNITS_BOHR); /* We store the spinat array as a property to be used later by the spin loading method. */ spinat = g_malloc(sizeof(double) * 3 * natom); g_object_set_data_full(G_OBJECT(data), "ABINIT_spinat", (gpointer)spinat, g_free); error = ab6_invars_get_real_array(dt, spinat, 3 * natom, AB6_INVARS_SPINAT, nSet + 1); if (error != AB6_NO_ERROR) { g_free(spinat); return g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_METHOD, "Abinit loader report error:\n %s\nwhile getting attribute '%s'.", ab6_error_string_from_id(error), AB6_INVARS_STR(AB6_INVARS_SPINAT)); } return (GError*)0; } static void abSpinInit(VisuRendering *method) { const gchar *type[] = {"*.in", (char*)0}; visu_rendering_addFileFormat(method, FILE_KIND_SPIN, tool_file_format_new(_("ABINIT input file format"), type), 95, loadAbinitSpin); } static void freeSpin(gpointer obj, gpointer data _U_) { #if GLIB_MINOR_VERSION > 9 g_slice_free1(sizeof(float) * 3, obj); #else g_free(obj); #endif } static gpointer newOrCopySpin(gconstpointer obj, gpointer data _U_) { float *spinData; #if GLIB_MINOR_VERSION > 9 spinData = g_slice_alloc(sizeof(float) * 3); #else spinData = g_malloc(sizeof(float) * 3); #endif if (obj) memcpy(spinData, obj, sizeof(float) * 3); else memset(spinData, 0, sizeof(float) * 3); return (gpointer)spinData; } static void initMaxModulus(VisuElement *ele _U_, GValue *val) { DBG_fprintf(stderr, " | init max modulus of val %p.\n", (gpointer)val); g_value_init(val, G_TYPE_FLOAT); g_value_set_float(val, -G_MAXFLOAT); } static gboolean loadAbinitSpin(VisuData *data, const gchar* filename, ToolFileFormat *format _U_, int nSet _U_, GCancellable *cancel _U_, GError **error) { double *spinat; float spins[3]; float *svgSpinValues; float sph[3], vals[3]; VisuNodeProperty *spin; VisuNodeArrayIter iter; GValue spinValue = {0, {{0}, {0}}}; GValueArray *svgMaxSpinModulus; GValue *val; g_return_val_if_fail(error && *error == (GError*)0, FALSE); g_return_val_if_fail(data && filename, FALSE); spinat = (double*)g_object_get_data(G_OBJECT(data), "ABINIT_spinat"); if (!spinat) return FALSE; /* We check that spin and position are the same. */ /* TODO... */ /* Create a storage for max values of spin modulus for each element. */ svgMaxSpinModulus = visu_node_array_setElementProperty(VISU_NODE_ARRAY(data), VISU_RENDERING_SPIN_MAX_MODULUS_ID, initMaxModulus); spin = visu_node_array_property_newPointer(VISU_NODE_ARRAY(data), VISU_RENDERING_SPIN_VALUES_ID, freeSpin, newOrCopySpin, (gpointer)0); g_value_init(&spinValue, G_TYPE_POINTER); visu_node_array_iterNew(VISU_NODE_ARRAY(data), &iter); for(visu_node_array_iterStartNumber(VISU_NODE_ARRAY(data), &iter); iter.node; visu_node_array_iterNextNodeNumber(VISU_NODE_ARRAY(data), &iter)) { spins[0] = (float)(spinat + iter.node->number * 3)[0]; spins[1] = (float)(spinat + iter.node->number * 3)[1]; spins[2] = (float)(spinat + iter.node->number * 3)[2]; tool_matrix_cartesianToSpherical(sph, spins); vals[TOOL_MATRIX_SPHERICAL_MODULUS] = sph[0]; vals[TOOL_MATRIX_SPHERICAL_THETA] = sph[1]; vals[TOOL_MATRIX_SPHERICAL_PHI] = sph[2]; svgSpinValues = newOrCopySpin(vals, (gpointer)0); g_value_set_pointer(&spinValue, svgSpinValues); visu_node_property_setValue(spin, iter.node, &spinValue); val = g_value_array_get_nth(svgMaxSpinModulus, iter.iElement); g_value_set_float(val, MAX(vals[TOOL_MATRIX_SPHERICAL_MODULUS], g_value_get_float(val))); } /* We kill the temporary spinat property. */ g_free(g_object_steal_data(G_OBJECT(data), "ABINIT_spinat")); /* Everything is OK. */ *error = (GError*)0; return TRUE; } v_sim-3.7.0/lib/plug-ins/abinit/abinit.h0000644000353400050620000000154012215546160014754 00000000000000#ifndef ABINIT_H #define ABINIT_H #include #include #include #include #ifdef HAVE_ABINIT_SYMMETRY #include #endif #include struct _abinitData { VisuData *data; GCancellable *cancel; GError *error; /* Queue to send messages from V_Sim to ABINIT thread. */ GAsyncQueue *signals; gboolean useSignals; /* Queue to send messages from the ABINIT thread to V_Sim. */ GAsyncQueue *messages; gboolean getMessages; /* Data for the invars part. */ Ab6Invars *dt; gchar *filename; int nSet; gboolean isABFormat; /* Data for the symmetries. */ Ab6Symmetry *sym; }; typedef struct _abinitData AbinitData; void abinit_mutexInit(); void abinit_mutexRelease(); void abinit_mutexUnlock(); AbinitData* abinit_getDt(); AbinitData* abinit_getDirectDt(); #endif v_sim-3.7.0/lib/plug-ins/abinit/ab_symmetry.h0000644000353400050620000000413312215546160016042 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef AB_SYMMETRY_H #define AB_SYMMETRY_H #include GtkWidget* buildTab(VisuUiMain *main, gchar **label, gchar **help, GtkWidget **radio); void startSelect(VisuUiRenderingWindow *window); void stopSelect(VisuUiRenderingWindow *window); #endif v_sim-3.7.0/lib/plug-ins/abinit/ab_symmetry.c0000644000353400050620000005756412215546160016055 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include #include #include #include #include #include #include #include #include "abinit.h" #define ABINIT_SYMMETRIES_INFO \ _("left-button\t\t: select one atom to get the equivalent ones\n" \ "right-button\t\t: switch to observe") enum { SYM_ID, SYM_MATRIX_00, SYM_MATRIX_01, SYM_MATRIX_02, SYM_MATRIX_10, SYM_MATRIX_11, SYM_MATRIX_12, SYM_MATRIX_20, SYM_MATRIX_21, SYM_MATRIX_22, SYM_TRANS_0, SYM_TRANS_1, SYM_TRANS_2, SYM_COMMENT, SYM_N_COLS }; static gulong onSpin_id; static Ab6Symmetry *sym; static GtkWidget *lblSymName, *lblSymId, *lblSymWarning, *spinTol; static GtkWidget *spinNode, *vbox, *vboxSym; static guint timeout = 0; static VisuInteractive *inter; static GtkListStore *symList; static void onSelection(VisuInteractive *inter, VisuInteractivePick pick, VisuNode *node0, VisuNode *node1, VisuNode *node2, gpointer data); static void onSymmetryToggled(GtkToggleButton *toggle, gpointer data); static void onSymmetryClicked(GtkButton *button, gpointer data); static void onTolChanged(GtkSpinButton *spin, gpointer data); static void onVisuDataChanged(VisuObject *visu, VisuData *dataObj, gpointer data); static void onSpinNode(GtkSpinButton *button, gpointer data); static void onPickClickStop(VisuInteractive *inter, gpointer data); static gchar* symAnalyse(Ab6Symmetry *sym, int iSym); static void updateSymmetries(VisuData *dataObj, gdouble tol); static void getEquivalents(VisuData *dataObj, VisuNode *node); static void formatSymOperators(GtkTreeViewColumn *column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data); GtkWidget* buildTab(VisuUiMain *main _U_, gchar **label, gchar **help, GtkWidget **radio) { GtkWidget *wd, *hbox, *bt, *scroll; VisuData *data; VisuUiRenderingWindow *window; GtkCellRenderer *renderer; GtkTreeViewColumn *column; window = visu_ui_main_class_getDefaultRendering(); data = visu_ui_rendering_window_getData(window); g_return_val_if_fail(data, (GtkWidget*)0); inter = visu_interactive_new(interactive_pick); g_object_ref(G_OBJECT(inter)); g_signal_connect(G_OBJECT(inter), "stop", G_CALLBACK(onPickClickStop), (gpointer)window); g_signal_connect(G_OBJECT(inter), "node-selection", G_CALLBACK(onSelection), (gpointer)window); *label = _("Symmetries"); *help = g_strdup(ABINIT_SYMMETRIES_INFO); symList = gtk_list_store_new(SYM_N_COLS, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_FLOAT, G_TYPE_FLOAT, G_TYPE_FLOAT, G_TYPE_STRING); vbox = gtk_vbox_new(FALSE, 0); sym = (Ab6Symmetry*)0; hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); *radio = gtk_radio_button_new_with_mnemonic (NULL, _("Analyse the symmetries")); gtk_box_pack_start(GTK_BOX(hbox), *radio, FALSE, FALSE, 0); gtk_widget_set_name(*radio, "message_radio"); g_signal_connect(G_OBJECT(*radio), "toggled", G_CALLBACK(onSymmetryToggled), (gpointer)0); wd = gtk_button_new_with_mnemonic(_("Compute symmetries")); bt = wd; gtk_box_pack_end(GTK_BOX(hbox), wd, FALSE, FALSE, 0); wd = gtk_label_new(") "); gtk_box_pack_end(GTK_BOX(hbox), wd, FALSE, FALSE, 0); wd = gtk_spin_button_new_with_range(-10, -2, 1); gtk_entry_set_width_chars(GTK_ENTRY(wd), 2); gtk_spin_button_set_value(GTK_SPIN_BUTTON(wd), -6); g_signal_connect(G_OBJECT(wd), "value-changed", G_CALLBACK(onTolChanged), (gpointer)0); g_signal_connect(G_OBJECT(bt), "clicked", G_CALLBACK(onSymmetryClicked), (gpointer)wd); gtk_box_pack_end(GTK_BOX(hbox), wd, FALSE, FALSE, 0); spinTol = wd; wd = gtk_label_new("(tolsym = 10^"); gtk_box_pack_end(GTK_BOX(hbox), wd, FALSE, FALSE, 0); vboxSym = gtk_vbox_new(FALSE, 0); gtk_widget_set_sensitive(vboxSym, FALSE); gtk_box_pack_start(GTK_BOX(vbox), vboxSym, TRUE, TRUE, 0); /* A message for ABINIT. */ wd = gtk_label_new(_("The symmetry routines" " are provided by ABINIT (" "" "http://www.abinit.org).")); gtk_misc_set_alignment(GTK_MISC(wd), 1.0, 0.5); gtk_label_set_use_markup(GTK_LABEL(wd), TRUE); gtk_box_pack_end(GTK_BOX(vbox), wd, FALSE, FALSE, 5); /* The labels showing the symmetry. */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vboxSym), hbox, FALSE, FALSE, 10); wd = gtk_label_new(_("Space group:")); gtk_label_set_use_markup(GTK_LABEL(wd), TRUE); gtk_misc_set_padding(GTK_MISC(wd), 10, 0); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); wd = gtk_label_new(_("" "http://en.wikipedia.org/wiki/Space_group")); gtk_label_set_selectable(GTK_LABEL(wd), TRUE); gtk_label_set_use_markup(GTK_LABEL(wd), TRUE); gtk_box_pack_end(GTK_BOX(hbox), wd, FALSE, FALSE, 10); wd = gtk_image_new_from_stock(GTK_STOCK_HELP, GTK_ICON_SIZE_MENU); gtk_box_pack_end(GTK_BOX(hbox), wd, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vboxSym), hbox, FALSE, FALSE, 0); wd = gtk_label_new(_("Crystal system:")); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); lblSymName = gtk_label_new(""); gtk_misc_set_alignment(GTK_MISC(lblSymName), 0., 0.5); gtk_box_pack_start(GTK_BOX(hbox), lblSymName, TRUE, TRUE, 5); wd = gtk_label_new(_("space group:")); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); lblSymId = gtk_label_new(""); gtk_label_set_use_markup(GTK_LABEL(lblSymId), TRUE); gtk_misc_set_alignment(GTK_MISC(lblSymId), 0., 0.5); gtk_box_pack_start(GTK_BOX(hbox), lblSymId, TRUE, TRUE, 5); lblSymWarning = gtk_label_new(_("Warning: the Bravais lattice determined from the primitive vectors is more symmetric than the real one obtained from coordinates (printed).")); gtk_label_set_use_markup(GTK_LABEL(lblSymWarning), TRUE); gtk_label_set_line_wrap(GTK_LABEL(lblSymWarning), TRUE); gtk_label_set_line_wrap_mode(GTK_LABEL(lblSymWarning), PANGO_WRAP_WORD); gtk_box_pack_start(GTK_BOX(vboxSym), lblSymWarning, FALSE, FALSE, 0); wd = gtk_label_new(_("List of symmetry operations:")); gtk_misc_set_alignment(GTK_MISC(wd), 0., 0.5); gtk_box_pack_start(GTK_BOX(vboxSym), wd, FALSE, FALSE, 3); scroll = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_box_pack_start(GTK_BOX(vboxSym), scroll, TRUE, TRUE, 0); wd = gtk_tree_view_new_with_model(GTK_TREE_MODEL(symList)); gtk_container_add(GTK_CONTAINER(scroll), wd); gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(wd), TRUE); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Id"), renderer, "text", SYM_ID, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(wd), column); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, _("operation")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func (column, renderer, formatSymOperators, GINT_TO_POINTER(SYM_MATRIX_00), (GDestroyNotify)0); gtk_tree_view_append_column(GTK_TREE_VIEW(wd), column); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, _("translation")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func (column, renderer, formatSymOperators, GINT_TO_POINTER(SYM_TRANS_0), (GDestroyNotify)0); gtk_tree_view_append_column(GTK_TREE_VIEW(wd), column); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("comment"), renderer, "text", SYM_COMMENT, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(wd), column); /* The interface to choose one atom to select. */ wd = gtk_label_new(_("Equivalent atoms:")); gtk_label_set_use_markup(GTK_LABEL(wd), TRUE); gtk_misc_set_alignment(GTK_MISC(wd), 0., 0.5); gtk_misc_set_padding(GTK_MISC(wd), 10, 0); gtk_box_pack_start(GTK_BOX(vboxSym), wd, FALSE, FALSE, 10); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vboxSym), hbox, FALSE, FALSE, 0); wd = gtk_label_new(_("Visualise the equivalent nodes of node:")); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); spinNode = gtk_spin_button_new_with_range(0, 1, 1); onSpin_id = g_signal_connect(G_OBJECT(spinNode), "value-changed", G_CALLBACK(onSpinNode), (gpointer)0); gtk_box_pack_start(GTK_BOX(hbox), spinNode, FALSE, FALSE, 5); wd = gtk_label_new(_(" or pick directly.")); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); gtk_widget_show_all(vbox); gtk_widget_hide(lblSymWarning); g_signal_connect(VISU_OBJECT_INSTANCE, "dataRendered", G_CALLBACK(onVisuDataChanged), (gpointer)0); onVisuDataChanged((VisuObject*)0, data, (gpointer)0); return vbox; } static void formatSymOperators(GtkTreeViewColumn *column _U_, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { gchar *str; gfloat valf[3]; gint vali[9]; str = (gchar*)0; if (GPOINTER_TO_INT(data) == SYM_MATRIX_00) { gtk_tree_model_get(model, iter, SYM_MATRIX_00, vali, SYM_MATRIX_01, vali + 1, SYM_MATRIX_02, vali + 2, SYM_MATRIX_10, vali + 3, SYM_MATRIX_11, vali + 4, SYM_MATRIX_12, vali + 5, SYM_MATRIX_20, vali + 6, SYM_MATRIX_21, vali + 7, SYM_MATRIX_22, vali + 8, -1); str = g_strdup_printf("[ %2d %2d %2d\n" " %2d %2d %2d\n" " %2d %2d %2d ]", vali[0], vali[1], vali[2], vali[3], vali[4], vali[5], vali[6], vali[7], vali[8]); } else if (GPOINTER_TO_INT(data) == SYM_TRANS_0) { gtk_tree_model_get(model, iter, SYM_TRANS_0, valf, SYM_TRANS_1, valf + 1, SYM_TRANS_2, valf + 2, -1); str = g_strdup_printf("[ %2f\n" " %2f\n" " %2f ]", valf[0], valf[1], valf[2]); } if (str) { g_object_set(G_OBJECT(cell), "text", str, NULL); g_free(str); } } void startSelect(VisuUiRenderingWindow *window) { visu_ui_rendering_window_pushInteractive(window, inter); } void stopSelect(VisuUiRenderingWindow *window) { visu_ui_rendering_window_popInteractive(window, inter); } static void onPickClickStop(VisuInteractive *inter _U_, gpointer data _U_) { } static void onSelection(VisuInteractive *inter _U_, VisuInteractivePick pick _U_, VisuNode *node0, VisuNode *node1 _U_, VisuNode *node2 _U_, gpointer data) { getEquivalents(visu_ui_rendering_window_getData(VISU_UI_RENDERING_WINDOW(data)), node0); g_signal_handler_block(G_OBJECT(spinNode), onSpin_id); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinNode), node0->number + 1); g_signal_handler_unblock(G_OBJECT(spinNode), onSpin_id); } static void onSymmetryToggled(GtkToggleButton *toggle _U_, gpointer data _U_) { } static void onSymmetryClicked(GtkButton *button _U_, gpointer spin) { VisuData *dataObj; /* Get the current VisuData object. */ dataObj = visu_ui_rendering_window_getData(visu_ui_main_class_getDefaultRendering()); updateSymmetries(dataObj, gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin))); } static void onTolChanged(GtkSpinButton *spin, gpointer data _U_) { VisuData *dataObj; /* Get the current VisuData object. */ dataObj = visu_ui_rendering_window_getData(visu_ui_main_class_getDefaultRendering()); updateSymmetries(dataObj, gtk_spin_button_get_value(spin)); } static void onVisuDataChanged(VisuObject *visu _U_, VisuData *dataObj, gpointer data _U_) { VisuNodeArrayIter iter; gtk_widget_set_sensitive(vbox, (dataObj !=(VisuData*)0)); updateSymmetries((VisuData*)0, 0); if (dataObj) { visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter); gtk_spin_button_set_range(GTK_SPIN_BUTTON(spinNode), 0, iter.idMax + 1); } } static void onSpinNode(GtkSpinButton *button, gpointer data _U_) { VisuUiRenderingWindow *window; VisuData *dataObj; VisuNode *node; if (gtk_spin_button_get_value(button) == 0) return; /* Get the current VisuData object. */ window = visu_ui_main_class_getDefaultRendering(); dataObj = visu_ui_rendering_window_getData(window); node = visu_node_array_getFromId(VISU_NODE_ARRAY(dataObj), (int)gtk_spin_button_get_value(button) - 1); getEquivalents(dataObj, node); } static gboolean onRemoveEquivalents(gpointer data _U_) { return FALSE; } static void removeEquivalents(gpointer data) { VisuGlExtMarks *marks; GList *lst; lst = (GList*)data; /* Get the current VisuData object. */ marks = visu_ui_rendering_window_getMarks(visu_ui_main_class_getDefaultRendering()); visu_gl_ext_marks_setHighlightedList(marks, lst, MARKS_STATUS_TOGGLE); g_list_free(lst); VISU_REDRAW_FORCE; } static void getEquivalents(VisuData *dataObj, VisuNode *node) { int i, nSym; int *nodes; gboolean found; GList *lst, *tmpLst; #if GLIB_MINOR_VERSION > 13 #define fact 1 #define G_TIMEOUT_ADD_FULL g_timeout_add_seconds_full #else #define fact 1000 #define G_TIMEOUT_ADD_FULL g_timeout_add_full #endif if (!sym) updateSymmetries(dataObj, gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinTol))); g_return_if_fail(sym); if (ab6_symmetry_get_equivalent_atom(sym, &nodes, &nSym, node->number + 1) == AB6_NO_ERROR) { lst = (GList*)0; for (i = 0; i < nSym; i++) { found = FALSE; for ( tmpLst = lst; tmpLst && !found; tmpLst = g_list_next(tmpLst)) found = (nodes[i * 4 + 3] == (GPOINTER_TO_INT(tmpLst->data) + 1)); if (!found) lst = g_list_prepend(lst, GINT_TO_POINTER(nodes[i * 4 + 3] - 1)); } g_free(nodes); /* We remove possible earlier timeout. */ if (timeout > 0) g_source_remove(timeout); /* Set the new highlights. */ visu_gl_ext_marks_setHighlightedList (visu_ui_rendering_window_getMarks(visu_ui_main_class_getDefaultRendering()), lst, MARKS_STATUS_SET); /* Add the new timeout. */ timeout = G_TIMEOUT_ADD_FULL(G_PRIORITY_DEFAULT, 3 * fact, onRemoveEquivalents, lst, removeEquivalents); /* lst will be freed in the timeout. */ VISU_REDRAW_FORCE; } } gpointer startThreadSymmetry(gpointer data _U_) { float xred0[3], xyz[3]; char *spGrp; double box[3][3], genAfm[3], *xred; int i, *typat, grpId, grpMagnId; Ab6Error errno; VisuNodeArrayIter iter; AbinitData *dt; DBG_fprintf(stderr, "AB symmetry(%p): starting symmetry detection.\n", (gpointer)g_thread_self()); dt = abinit_getDt(); visu_box_getCellMatrix(visu_boxed_getBox(VISU_BOXED(dt->data)), box); ab6_symmetry_set_lattice(dt->sym, box); visu_node_array_iterNew(VISU_NODE_ARRAY(dt->data), &iter); i = 0; typat = g_malloc(sizeof(int) * iter.nAllStoredNodes); xred = g_malloc(sizeof(double) * 3 * iter.nAllStoredNodes); for (visu_node_array_iterStart(VISU_NODE_ARRAY(dt->data), &iter); iter.node; visu_node_array_iterNext(VISU_NODE_ARRAY(dt->data), &iter)) { typat[i] = iter.iElement; visu_data_getNodePosition(dt->data, iter.node, xyz); visu_box_convertXYZtoBoxCoordinates(visu_boxed_getBox(VISU_BOXED(dt->data)), xred0, xyz); xred[3 * i + 0] = (double)xred0[0]; xred[3 * i + 1] = (double)xred0[1]; xred[3 * i + 2] = (double)xred0[2]; i += 1; } ab6_symmetry_set_structure(dt->sym, iter.nAllStoredNodes, typat, xred); g_free(typat); g_free(xred); /* Ask for the calculation of the symmetries. */ DBG_fprintf(stderr, "AB symmetry(%p): Ready to get symmetries from ABINIT.\n", (gpointer)g_thread_self()); errno = ab6_symmetry_get_group(dt->sym, &spGrp, &grpId, &grpMagnId, genAfm); DBG_fprintf(stderr, "AB symmetry(%p): return from ABINIT (%d).\n", (gpointer)g_thread_self(), errno); if (errno == AB6_NO_ERROR || errno == AB6_ERROR_SYM_BRAVAIS_XRED) g_free(spGrp); else if (errno != AB6_ERROR_SYM_NOT_PRIMITIVE) dt->error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FILE, "An error occured in ABINIT plug-in."); abinit_mutexUnlock(); return (gpointer)0; } static void updateSymmetries(VisuData *dataObj, gdouble tol) { double genAfm[3]; int grpId, grpMagnId, centerId, nbrv; char *spGrp; gchar *str; Ab6SymmetryMat *brvSyms; int brvMat[3][3]; gchar *bravais[7] = {"triclinic", "monoclinic", "orthorhombic", "tetragonal", "trigonal", "hexagonal", "cubic"}; gchar *center[7] = {"F", "F", "I", "P", "A", "B", "C"}; Ab6Error errno; #ifdef G_THREADS_ENABLED GThread *ld_thread; #endif int nSym, *amf, iSym; Ab6SymmetryMat *symOps; Ab6SymmetryTrans *trans; GtkTreeIter iter; AbinitData *dt; DBG_fprintf(stderr, "Abinit: upadte symmetries from %p.\n", (gpointer)dataObj); if (sym) ab6_symmetry_free(sym); sym = (Ab6Symmetry*)0; gtk_list_store_clear(symList); if (dataObj) { dt = abinit_getDirectDt(); dt->data = dataObj; dt->sym = ab6_symmetry_new(); dt->getMessages = FALSE; dt->useSignals = FALSE; DBG_fprintf(stderr, "AB symmetry: set tolerance to 10^%g.\n", tol); ab6_symmetry_set_tolerance(dt->sym, pow(10., tol)); #ifdef G_THREADS_ENABLED abinit_mutexInit(); dt->error = (GError*)0; ld_thread = g_thread_create(startThreadSymmetry, (gpointer)0, TRUE, &(dt->error)); DBG_fprintf(stderr, "AB symmetry: run ABINIT symmetry into a thread (%p).\n", (gpointer)ld_thread); if (ld_thread) g_thread_join(ld_thread); else g_warning("Can't run thread for ABINIT symmetry."); abinit_mutexRelease(); #else startThreadSymmetry((gpointer)(&dt)); #endif DBG_fprintf(stderr, "AB symmetry: return after thread exec (%p).\n", (gpointer)dt->error); if (!dt->error) { sym = dt->sym; /* We get then the space group. */ DBG_fprintf(stderr, "AB symmetry: get group.\n"); errno = ab6_symmetry_get_group(sym, &spGrp, &grpId, &grpMagnId, genAfm); if (errno == AB6_NO_ERROR || errno == AB6_ERROR_SYM_BRAVAIS_XRED) { str = g_strdup_printf("%s (#%d)", spGrp, grpId); gtk_label_set_text(GTK_LABEL(lblSymId), str); g_free(str); g_free(spGrp); DBG_fprintf(stderr, "AB symmetry: get matrices.\n"); if (ab6_symmetry_get_matrices(sym, &nSym, &symOps, &trans, &amf) == AB6_NO_ERROR) { for (iSym = 0; iSym < nSym; iSym++) { str = symAnalyse(dt->sym, iSym + 1); gtk_list_store_append(symList, &iter); gtk_list_store_set(symList, &iter, SYM_ID, iSym + 1, SYM_MATRIX_00, symOps[iSym].mat[0][0], SYM_MATRIX_01, symOps[iSym].mat[0][1], SYM_MATRIX_02, symOps[iSym].mat[0][2], SYM_MATRIX_10, symOps[iSym].mat[1][0], SYM_MATRIX_11, symOps[iSym].mat[1][1], SYM_MATRIX_12, symOps[iSym].mat[1][2], SYM_MATRIX_20, symOps[iSym].mat[2][0], SYM_MATRIX_21, symOps[iSym].mat[2][1], SYM_MATRIX_22, symOps[iSym].mat[2][2], SYM_TRANS_0, trans[iSym].vect[0], SYM_TRANS_1, trans[iSym].vect[1], SYM_TRANS_2, trans[iSym].vect[2], SYM_COMMENT, str, -1); g_free(str); } g_free(symOps); g_free(trans); g_free(amf); } } else { gtk_label_set_markup(GTK_LABEL(lblSymId), _("not primitive")); } DBG_fprintf(stderr, "AB symmetry: get bravais.\n"); if (ab6_symmetry_get_bravais(sym, brvMat, &grpId, ¢erId, &nbrv, &brvSyms) == AB6_NO_ERROR) { g_free(brvSyms); str = g_strdup_printf("%s (%s)", _(bravais[grpId - 1]), center[centerId+3]); gtk_label_set_text(GTK_LABEL(lblSymName), str); g_free(str); } else gtk_label_set_text(GTK_LABEL(lblSymName), "!"); /* If the bravais lattice doesn't match with the xred bravais lattice, we print a message. */ if (errno == AB6_ERROR_SYM_BRAVAIS_XRED) gtk_widget_show(lblSymWarning); else gtk_widget_hide(lblSymWarning); gtk_widget_set_sensitive(vboxSym, (dataObj != (VisuData*)0)); } else { visu_ui_raiseWarning(_("ABINIT symmetry calculation"), dt->error->message, (GtkWindow*)0); g_error_free(dt->error); ab6_symmetry_free(dt->sym); sym = (Ab6Symmetry*)0; gtk_widget_set_sensitive(vboxSym, FALSE); } } else { gtk_label_set_text(GTK_LABEL(lblSymName), ""); gtk_label_set_text(GTK_LABEL(lblSymId), ""); } } static gchar* symAnalyse(Ab6Symmetry *sym, int iSym) { #ifdef HAVE_SYM_GET_TYPE Ab6Error error; int type; gchar *label; error = ab6_symmetry_get_type(sym, &type, &label, iSym); if (error == AB6_NO_ERROR) return label; else #endif return g_strdup(_("Unknown symmetry")); } v_sim-3.7.0/lib/plug-ins/abinit/ab_silicon.in0000644000353400050620000000321312215546160015766 00000000000000# Crystalline silicon # calculation of kss file for 256 shifted k-points in IBZ # Definition of the unit cell: fcc acell 3*10.217 # This is equivalent to 10.217 10.217 10.217 rprim 0.0 0.5 0.5 # FCC primitive vectors (to be scaled by acell) 0.5 0.0 0.5 0.5 0.5 0.0 # Definition of the atom types ntypat 1 # There is only one type of atom znucl 14 #zatnum 14 # The keyword "zatnum" refers to the atomic number of the # possible type(s) of atom. The pseudopotential(s) # mentioned in the "files" file must correspond # to the type(s) of atom. Here, the only type is Silicon. # Definition of the atoms natom 2 # There are two atoms typat 1 1 # They both are of type 1, that is, Silicon. xred # Reduced coordinate of atoms 0.0 0.0 0.0 0.25 0.25 0.25 # Definition of the planewave basis set (at convergence 16 Rydberg 8 Hartree) ecut 8.0 # Maximal kinetic energy cut-off, in Hartree accesswff 3 # Dataset1: usual self-consistent calculation # Definition of the k-point grid kptopt 1 # Option for the automatic generation of k points, nkpt 10 ngkpt 4 4 4 nshiftk 4 shiftk 0.5 0.5 0.5 # These shifts will be the same for all grids 0.5 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.5 # Definition of the SCF procedure nstep 10 # Maximal number of SCF cycles diemac 12.0 toldfe 1.0d-6 prtden 0 # Definition of the k-points for the kss 256 shifted k-points # Dataset2: calculation of kss file # Definition of k-points nband 9 nbandkss 100 # Number of bands to store in KSS file v_sim-3.7.0/lib/plug-ins/abinit/abinit.png0000644000353400050620000000420712215546160015314 00000000000000PNG  IHDR ꂣAbKGD pHYs  tIME  "4tEXtCommentCreated with The GIMPd%nIDATHǵ[l9q>8I;CBCTjh+ҋWTU+D7M[UURR  4 p6JH7ރٝݙݙkZ&*_3o 8u>/`?@BK~?7Ğ>>}\ Q6Hf78؆KRezm%\Vit< efv~5r]X+&l0>; D*4BrW?ۍee|/4:bO ==9PM=忽Jӛk/@c v/K- f'gl}D!Rcu P߻Ls12oPeLMrsH{J=ca/bpk_m>E4iB T)$ R|ThL ĺ&F6GXy^3?E˘s[? :z-w( >Q`xDU($S̜1'k:h#Ё(,3i@yNE~7ĺjrl\ ^Fxl*H*L\8 u{5ң\GA*çͶ{!,-zSjR&]'ڵunRHbqx~p+,upcu;T`N sHnñ Jf<ˎS'02( F[>8HղLboz\ʆcC zo2l)5^W}=;i̮ g3IENDB`v_sim-3.7.0/lib/plug-ins/python-gi/0000755000353400050620000000000012216331351014060 500000000000000v_sim-3.7.0/lib/plug-ins/python-gi/v_sim.py0000644000353400050620000000724412215546175015511 00000000000000# -*- Mode: Python; py-indent-offset: 2 -*- # -*- coding: utf-8 -*- # vim: tabstop=2 shiftwidth=2 expandtab # vim: set fileencoding=utf-8 # # EXTRAITS DE LA LICENCE # Copyright CEA, contributeurs : Damien CALISTE, (2001-2010) # # Adresse mèl : # CALISTE, damien P caliste AT cea P fr. # # Ce logiciel est un programme informatique servant à visualiser des # structures atomiques dans un rendu pseudo-3D. # # Ce logiciel est régi par la licence CeCILL soumise au droit français et # respectant les principes de diffusion des logiciels libres. Vous pouvez # utiliser, modifier et/ou redistribuer ce programme sous les conditions # de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA # sur le site "http://www.cecill.info". # # Le fait que vous puissiez accéder à cet en-tête signifie que vous avez # pris connaissance de la licence CeCILL, et que vous en avez accepté les # termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). # LICENCE SUM UP # Copyright CEA, contributors: Damien CALISTE, (2001-2010) # # E-mail address: # CALISTE, damien P caliste AT cea P fr. # # This software is a computer program whose purpose is to visualize atomic # configurations in 3D. # # This software is governed by the CeCILL license under French law and # abiding by the rules of distribution of free software. You can use, # modify and/ or redistribute the software under the terms of the CeCILL # license as circulated by CEA, CNRS and INRIA at the following URL # "http://www.cecill.info". # # The fact that you are presently reading this means that you have had # knowledge of the CeCILL license and that you accept its terms. You can # find a copy of this licence shipped with this software at # Documentation/licence.en.txt. from ..importer import modules v_sim = modules['v_sim'] class VisuNodeArrayIter: def __init__(self, nodes, kind = v_sim.NodeArrayIterType.NODES_BY_TYPE): self.iter = nodes.iterNew() self.iter.type = kind def __iter__(self): return self def next(self): if not(self.iter.next()): raise StopIteration return self.iter class VisuNodeArrayIter2: def __init__(self, nodes): self.iter1 = nodes.iterNew() self.iter2 = nodes.iterNew() def __iter__(self): return self def next(self): if not(self.iter1.next2(self.iter2)): raise StopIteration return (self.iter1, self.iter2) def __NodeArrayIter__(nodes): return VisuNodeArrayIter(nodes) def __NodeArrayIterByNumber__(nodes): return VisuNodeArrayIter(nodes, v_sim.NodeArrayIterType.NODES_BY_NUMBER) def __NodeArrayIterElements__(nodes): return VisuNodeArrayIter(nodes, v_sim.NodeArrayIterType.ELEMENTS) def __NodeArrayIterVisible__(nodes): return VisuNodeArrayIter(nodes, v_sim.NodeArrayIterType.NODES_VISIBLE) def __NodeArrayIterOriginal__(nodes): return VisuNodeArrayIter(nodes, v_sim.NodeArrayIterType.NODES_ORIGINAL) def __NodeArrayIterByPairs__(nodes): return VisuNodeArrayIter2(nodes) def __DataAllNodePositions__(data): nodes = [] for it in data: nodes.append((data.getNodeCoordinates(it.node), \ it.node.number, it.element.getName())) return nodes setattr(v_sim.NodeArray, "__iter__", __NodeArrayIter__) setattr(v_sim.NodeArray, "__iterByNumber__", __NodeArrayIterByNumber__) setattr(v_sim.NodeArray, "__iterElements__", __NodeArrayIterElements__) setattr(v_sim.NodeArray, "__iterVisible__", __NodeArrayIterVisible__) setattr(v_sim.NodeArray, "__iterOriginal__", __NodeArrayIterOriginal__) setattr(v_sim.NodeArray, "__iterByPairs__", __NodeArrayIterByPairs__) setattr(v_sim.Data, "getAllNodePositions", __DataAllNodePositions__) v_sim-3.7.0/lib/plug-ins/python-gi/Makefile.am0000644000353400050620000000275112215546175016054 00000000000000## Process this file with automake to produce Makefile.in vpath %.h $(top_srcdir)/src if PLATFORM_WIN32 cflagWin = -mms-bitfields -mno-cygwin endif libpythongi_la_SOURCES = pythongi.c libpythongi_la_LIBADD = $(top_builddir)/src/lib@PACKAGE_TARNAME@-3.la \ @GLIB_LIBS@ @GTKS_LIBS@ @PYTHON_LIBS@ libpythongi_la_LDFLAGS = -module @EXTRA_LDFLAGS@ -version-info $(lib_v_sim_version) if WITH_GOBJECT_INTROSPECTION PYTHONGI_LIB = libpythongi.la PYTHONGI_EXAMPLE = pygi_collisions.v_sim.py \ pygi_isolate.v_sim.py \ pygi_rotate.v_sim.py \ pygi_load.v_sim.py \ pygi_plot.v_sim.py \ pygi_rightMenu.v_sim.py \ collisions.ascii \ cnt.Benzen_on_Ag111 PYTHONGI_PIX = pythongi.png stock-pythongi_20.png PYTHONGI_OVERRIDES = v_sim.py endif v_simplugins_LTLIBRARIES = \ $(PYTHONGI_LIB) INCLUDES = \ -I$(top_srcdir)/src \ @GLIB_CFLAGS@ @GTKS_CFLAGS@ @PYTHON_INCLUDES@ AM_CFLAGS = $(cflagWin) -D'VISU_TYPELIBS_DIR="$(libdir)/girepository-1.0"' -D'VISU_EXEC_DIR="$(libdir)/python$(PYTHON_VERSION)/site-packages/gtk-2.0"' -Wno-long-long -Wno-strict-prototypes v_simexamples_DATA = $(PYTHONGI_EXAMPLE) v_simpixmaps_DATA = $(PYTHONGI_PIX) gipyexecdir = $(visupyexecdir)/gi v_simoverridesdir = $(gipyexecdir)/overrides v_simoverrides_PYTHON = $(PYTHONGI_OVERRIDES) EXTRA_DIST = pygi_collisions.v_sim.py \ pygi_isolate.v_sim.py \ pygi_rotate.v_sim.py \ pygi_load.v_sim.py \ pygi_plot.v_sim.py \ pygi_rightMenu.v_sim.py \ collisions.ascii \ cnt.Benzen_on_Ag111 \ pythongi.png stock-pythongi_20.png \ v_sim.py v_sim-3.7.0/lib/plug-ins/python-gi/Makefile.in0000644000353400050620000006471312216330211016052 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = lib/plug-ins/python-gi DIST_COMMON = $(am__v_simoverrides_PYTHON_DIST) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/abinit.m4 \ $(top_srcdir)/m4/ax_check_gl.m4 \ $(top_srcdir)/m4/ax_check_glu.m4 \ $(top_srcdir)/m4/ax_lang_compiler_ms.m4 \ $(top_srcdir)/m4/ax_lapack.m4 $(top_srcdir)/m4/bigdft.m4 \ $(top_srcdir)/m4/etsf_io.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/libxc.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/netcdf.m4 \ $(top_srcdir)/m4/python.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(v_simpluginsdir)" \ "$(DESTDIR)$(v_simoverridesdir)" \ "$(DESTDIR)$(v_simexamplesdir)" "$(DESTDIR)$(v_simpixmapsdir)" LTLIBRARIES = $(v_simplugins_LTLIBRARIES) libpythongi_la_DEPENDENCIES = \ $(top_builddir)/src/lib@PACKAGE_TARNAME@-3.la am_libpythongi_la_OBJECTS = pythongi.lo libpythongi_la_OBJECTS = $(am_libpythongi_la_OBJECTS) libpythongi_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libpythongi_la_LDFLAGS) $(LDFLAGS) -o $@ @WITH_GOBJECT_INTROSPECTION_TRUE@am_libpythongi_la_rpath = -rpath \ @WITH_GOBJECT_INTROSPECTION_TRUE@ $(v_simpluginsdir) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libpythongi_la_SOURCES) DIST_SOURCES = $(libpythongi_la_SOURCES) am__v_simoverrides_PYTHON_DIST = v_sim.py am__py_compile = PYTHON=$(PYTHON) $(SHELL) $(py_compile) py_compile = $(top_srcdir)/py-compile DATA = $(v_simexamples_DATA) $(v_simpixmaps_DATA) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AB_CPPFLAGS = @AB_CPPFLAGS@ AB_LIBS = @AB_LIBS@ ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIGDFT_CPPFLAGS = @BIGDFT_CPPFLAGS@ BIGDFT_LIBS = @BIGDFT_LIBS@ BLAS_LIBS = @BLAS_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETSF_IO_LIBS = @ETSF_IO_LIBS@ EXEEXT = @EXEEXT@ EXTRA_CFLAGS = @EXTRA_CFLAGS@ EXTRA_LDFLAGS = @EXTRA_LDFLAGS@ EXTRA_LIBS = @EXTRA_LIBS@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ FCLIBS = @FCLIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLIBS = @FLIBS@ FONT_BOLD = @FONT_BOLD@ FONT_NORMAL = @FONT_NORMAL@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_BIGDFT_CFLAGS = @GLIB_BIGDFT_CFLAGS@ GLIB_BIGDFT_LIBS = @GLIB_BIGDFT_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GOBJECT_INTROSPECTION_REQUIRED = @GOBJECT_INTROSPECTION_REQUIRED@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTKS_CFLAGS = @GTKS_CFLAGS@ GTKS_LIBS = @GTKS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_SCANNER = @G_IR_SCANNER@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LAPACK_LIBS = @LAPACK_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXC_LIBS = @LIBXC_LIBS@ LIB_ARCHIVE_CFLAGS = @LIB_ARCHIVE_CFLAGS@ LIB_ARCHIVE_LIBS = @LIB_ARCHIVE_LIBS@ LIB_YAML_CFLAGS = @LIB_YAML_CFLAGS@ LIB_YAML_LIBS = @LIB_YAML_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NC_CPPFLAGS = @NC_CPPFLAGS@ NC_LDFLAGS = @NC_LDFLAGS@ NC_LIBS = @NC_LIBS@ NC_NETCDF_3_CPPFLAG = @NC_NETCDF_3_CPPFLAG@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBABEL_CFLAGS = @OPENBABEL_CFLAGS@ OPENBABEL_LIBS = @OPENBABEL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PYGOBJECT_CFLAGS = @PYGOBJECT_CFLAGS@ PYGOBJECT_LIBS = @PYGOBJECT_LIBS@ PYGOBJECT_REQUIRED = @PYGOBJECT_REQUIRED@ PYGTK_CFLAGS = @PYGTK_CFLAGS@ PYGTK_LIBS = @PYGTK_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_INCLUDES = @PYTHON_INCLUDES@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ V_SIM_MAJOR_VERSION = @V_SIM_MAJOR_VERSION@ V_SIM_MICRO_VERSION = @V_SIM_MICRO_VERSION@ V_SIM_MINOR_VERSION = @V_SIM_MINOR_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ girdir = @girdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ lib_v_sim_version = @lib_v_sim_version@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typelibsdir = @typelibsdir@ v_simexamplesdir = @v_simexamplesdir@ v_simexedir = @v_simexedir@ v_simiconsdir = @v_simiconsdir@ v_simlegaldir = @v_simlegaldir@ v_simpixmapsdir = @v_simpixmapsdir@ v_simpluginsdir = @v_simpluginsdir@ v_simresourcesdir = @v_simresourcesdir@ visupyexecdir = @visupyexecdir@ visutypelibsdir = @visutypelibsdir@ @PLATFORM_WIN32_TRUE@cflagWin = -mms-bitfields -mno-cygwin libpythongi_la_SOURCES = pythongi.c libpythongi_la_LIBADD = $(top_builddir)/src/lib@PACKAGE_TARNAME@-3.la \ @GLIB_LIBS@ @GTKS_LIBS@ @PYTHON_LIBS@ libpythongi_la_LDFLAGS = -module @EXTRA_LDFLAGS@ -version-info $(lib_v_sim_version) @WITH_GOBJECT_INTROSPECTION_TRUE@PYTHONGI_LIB = libpythongi.la @WITH_GOBJECT_INTROSPECTION_TRUE@PYTHONGI_EXAMPLE = pygi_collisions.v_sim.py \ @WITH_GOBJECT_INTROSPECTION_TRUE@ pygi_isolate.v_sim.py \ @WITH_GOBJECT_INTROSPECTION_TRUE@ pygi_rotate.v_sim.py \ @WITH_GOBJECT_INTROSPECTION_TRUE@ pygi_load.v_sim.py \ @WITH_GOBJECT_INTROSPECTION_TRUE@ pygi_plot.v_sim.py \ @WITH_GOBJECT_INTROSPECTION_TRUE@ pygi_rightMenu.v_sim.py \ @WITH_GOBJECT_INTROSPECTION_TRUE@ collisions.ascii \ @WITH_GOBJECT_INTROSPECTION_TRUE@ cnt.Benzen_on_Ag111 @WITH_GOBJECT_INTROSPECTION_TRUE@PYTHONGI_PIX = pythongi.png stock-pythongi_20.png @WITH_GOBJECT_INTROSPECTION_TRUE@PYTHONGI_OVERRIDES = v_sim.py v_simplugins_LTLIBRARIES = \ $(PYTHONGI_LIB) INCLUDES = \ -I$(top_srcdir)/src \ @GLIB_CFLAGS@ @GTKS_CFLAGS@ @PYTHON_INCLUDES@ AM_CFLAGS = $(cflagWin) -D'VISU_TYPELIBS_DIR="$(libdir)/girepository-1.0"' -D'VISU_EXEC_DIR="$(libdir)/python$(PYTHON_VERSION)/site-packages/gtk-2.0"' -Wno-long-long -Wno-strict-prototypes v_simexamples_DATA = $(PYTHONGI_EXAMPLE) v_simpixmaps_DATA = $(PYTHONGI_PIX) gipyexecdir = $(visupyexecdir)/gi v_simoverridesdir = $(gipyexecdir)/overrides v_simoverrides_PYTHON = $(PYTHONGI_OVERRIDES) EXTRA_DIST = pygi_collisions.v_sim.py \ pygi_isolate.v_sim.py \ pygi_rotate.v_sim.py \ pygi_load.v_sim.py \ pygi_plot.v_sim.py \ pygi_rightMenu.v_sim.py \ collisions.ascii \ cnt.Benzen_on_Ag111 \ pythongi.png stock-pythongi_20.png \ v_sim.py all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu lib/plug-ins/python-gi/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu lib/plug-ins/python-gi/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-v_simpluginsLTLIBRARIES: $(v_simplugins_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(v_simpluginsdir)" || $(MKDIR_P) "$(DESTDIR)$(v_simpluginsdir)" @list='$(v_simplugins_LTLIBRARIES)'; test -n "$(v_simpluginsdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(v_simpluginsdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(v_simpluginsdir)"; \ } uninstall-v_simpluginsLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(v_simplugins_LTLIBRARIES)'; test -n "$(v_simpluginsdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(v_simpluginsdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(v_simpluginsdir)/$$f"; \ done clean-v_simpluginsLTLIBRARIES: -test -z "$(v_simplugins_LTLIBRARIES)" || rm -f $(v_simplugins_LTLIBRARIES) @list='$(v_simplugins_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libpythongi.la: $(libpythongi_la_OBJECTS) $(libpythongi_la_DEPENDENCIES) $(EXTRA_libpythongi_la_DEPENDENCIES) $(libpythongi_la_LINK) $(am_libpythongi_la_rpath) $(libpythongi_la_OBJECTS) $(libpythongi_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pythongi.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-v_simoverridesPYTHON: $(v_simoverrides_PYTHON) @$(NORMAL_INSTALL) test -z "$(v_simoverridesdir)" || $(MKDIR_P) "$(DESTDIR)$(v_simoverridesdir)" @list='$(v_simoverrides_PYTHON)'; dlist=; list2=; test -n "$(v_simoverridesdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then b=; else b="$(srcdir)/"; fi; \ if test -f $$b$$p; then \ $(am__strip_dir) \ dlist="$$dlist $$f"; \ list2="$$list2 $$b$$p"; \ else :; fi; \ done; \ for file in $$list2; do echo $$file; done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(v_simoverridesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(v_simoverridesdir)" || exit $$?; \ done || exit $$?; \ if test -n "$$dlist"; then \ $(am__py_compile) --destdir "$(DESTDIR)" \ --basedir "$(v_simoverridesdir)" $$dlist; \ else :; fi uninstall-v_simoverridesPYTHON: @$(NORMAL_UNINSTALL) @list='$(v_simoverrides_PYTHON)'; test -n "$(v_simoverridesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ dir='$(DESTDIR)$(v_simoverridesdir)'; \ filesc=`echo "$$files" | sed 's|$$|c|'`; \ fileso=`echo "$$files" | sed 's|$$|o|'`; \ st=0; \ for files in "$$files" "$$filesc" "$$fileso"; do \ $(am__uninstall_files_from_dir) || st=$$?; \ done; \ exit $$st install-v_simexamplesDATA: $(v_simexamples_DATA) @$(NORMAL_INSTALL) test -z "$(v_simexamplesdir)" || $(MKDIR_P) "$(DESTDIR)$(v_simexamplesdir)" @list='$(v_simexamples_DATA)'; test -n "$(v_simexamplesdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(v_simexamplesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(v_simexamplesdir)" || exit $$?; \ done uninstall-v_simexamplesDATA: @$(NORMAL_UNINSTALL) @list='$(v_simexamples_DATA)'; test -n "$(v_simexamplesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(v_simexamplesdir)'; $(am__uninstall_files_from_dir) install-v_simpixmapsDATA: $(v_simpixmaps_DATA) @$(NORMAL_INSTALL) test -z "$(v_simpixmapsdir)" || $(MKDIR_P) "$(DESTDIR)$(v_simpixmapsdir)" @list='$(v_simpixmaps_DATA)'; test -n "$(v_simpixmapsdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(v_simpixmapsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(v_simpixmapsdir)" || exit $$?; \ done uninstall-v_simpixmapsDATA: @$(NORMAL_UNINSTALL) @list='$(v_simpixmaps_DATA)'; test -n "$(v_simpixmapsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(v_simpixmapsdir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) installdirs: for dir in "$(DESTDIR)$(v_simpluginsdir)" "$(DESTDIR)$(v_simoverridesdir)" "$(DESTDIR)$(v_simexamplesdir)" "$(DESTDIR)$(v_simpixmapsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-v_simpluginsLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-v_simexamplesDATA \ install-v_simoverridesPYTHON install-v_simpixmapsDATA \ install-v_simpluginsLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-v_simexamplesDATA \ uninstall-v_simoverridesPYTHON uninstall-v_simpixmapsDATA \ uninstall-v_simpluginsLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-v_simpluginsLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip install-v_simexamplesDATA \ install-v_simoverridesPYTHON install-v_simpixmapsDATA \ install-v_simpluginsLTLIBRARIES installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-v_simexamplesDATA \ uninstall-v_simoverridesPYTHON uninstall-v_simpixmapsDATA \ uninstall-v_simpluginsLTLIBRARIES vpath %.h $(top_srcdir)/src # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: v_sim-3.7.0/lib/plug-ins/python-gi/pythongi.c0000644000353400050620000006163212216001276016015 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, Tristan BERTHELOT, laboratoire L_Sim, (2001-2010) Adresse ml : CALISTE, damien P caliste AT cea P fr. BERTHELOT, tristan P berthelot AT isen P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors: Damien CALISTE, Tristan BERTHELOT, L_Sim laboratory, (2001-2010) E-mail address: CALISTE, damien P caliste AT cea P fr. BERTHELOT, tristan P berthelot AT isen P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include #include #include #include #include #include #include #include #include #define PYTHONGI_DESCRIPTION _("" \ "This plug-in allows to execute\n" \ "Python scripts using GObject\n" \ "introspection.") #define PYTHONGI_AUTHORS "Caliste Damien &\nTristan Berthelot" #define FLAG_PARAMETER_INIT_SCRIPTS "init_scripts" #define DESC_PARAMETER_INIT_SCRIPTS "Scripts loaded on startup ; paths separated by ':'" enum { SCRIPT_LABEL, SCRIPT_PATH, N_SCRIPTS }; /* Local variables. */ static gchar *iconPath; static GtkWidget *panelPython, *pyFileChooser, *pyExecute, *pyTextView; static gboolean isPanelInitialised = FALSE, isPythonInitialised = FALSE; static GtkListStore *initScripts; static GtkTextBuffer *pyTextBuffer; static GtkTextTag *monoTag, *errorTag, *boldTag; static GList *history, *curHist; /* Local methods. */ static void initialisePython(); static void initialisePanel(VisuUiPanel *panel); static gboolean loadScript(gpointer file); static void addInitScript(const gchar *file, gboolean immediate, GtkWindow *parent); static void exportParameters(GString *data, VisuData *dataObj, VisuGlView *view); static gboolean readInitScripts(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); static void _bufSetText(const gchar *text, GtkTextTag *tag, gboolean error); /* Callbacks. */ static void onPanelEnter(VisuUiPanel *panel, gpointer data); static void onScriptChosen(GtkFileChooserButton *widget, gpointer user_data); static void onScriptExecute(GtkButton *widget, gpointer user_data); static void onInitScriptAdded(GtkToolButton *bt, gpointer data); static void onInitScriptRemoved(GtkToolButton *bt, gpointer data); static void onInitScriptReload(GtkToolButton *bt, gpointer data); static gboolean onPyIO(GIOChannel *source, GIOCondition condition, gpointer data); static void onOutputCleared(GtkToolButton *bt, gpointer data); static void onOutputCancel(GtkToolButton *bt, gpointer data); static void onOutputGetData(GtkToolButton *bt, gpointer data); static void onVScroll(GtkAdjustment *adj, gpointer data); static void onInteractiveEntry(GtkEntry *entry, gpointer data); static gboolean onKeyPressed(GtkWidget *widget, GdkEventKey *event, gpointer data); gboolean pythongiInit(void) { GHashTable *options; ToolOption *opt; const gchar *file; VisuConfigFileEntry *entry; iconPath = g_build_filename(V_SIM_PIXMAPS_DIR, "pythongi.png", NULL); initScripts = gtk_list_store_new(N_SCRIPTS, G_TYPE_STRING, G_TYPE_STRING); pyTextBuffer = gtk_text_buffer_new((GtkTextTagTable*)0); monoTag = gtk_text_buffer_create_tag(pyTextBuffer, "typewriter", "family", "monospace", NULL); errorTag = gtk_text_buffer_create_tag(pyTextBuffer, "error", "foreground", "Tomato", NULL); boldTag = gtk_text_buffer_create_tag(pyTextBuffer, "bold", "weight", PANGO_WEIGHT_BOLD, NULL); history = curHist = (GList*)0; isPythonInitialised = FALSE; options = commandLineGet_options(); if (options && (opt = (ToolOption*)g_hash_table_lookup(options, "pyScriptInit"))) { initialisePython(); file = g_value_get_string(tool_option_getValue(opt)); addInitScript(file, TRUE, (GtkWindow*)0); } if (options && (opt = (ToolOption*)g_hash_table_lookup(options, "pyScript"))) { initialisePython(); file = g_value_get_string(tool_option_getValue(opt)); g_idle_add_full(G_PRIORITY_LOW, loadScript, (gpointer)file, NULL); } visu_config_file_addKnownTag("python"); entry = visu_config_file_addEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_INIT_SCRIPTS, DESC_PARAMETER_INIT_SCRIPTS, 1, readInitScripts); visu_config_file_entry_setVersion(entry, 3.7f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_PARAMETER, exportParameters); return TRUE; } gboolean pythongiInitGtk(void) { /* Long description */ gchar *cl = _("Python scripting"); /* Short description */ gchar *tl = _("Python"); GHashTable *options; ToolOption *opt; const gchar *file; isPanelInitialised = FALSE; panelPython = visu_ui_panel_newWithIconFromPath("Panel_python", cl, tl, "stock-pythongi_20.png"); visu_ui_panel_setDockable(VISU_UI_PANEL(panelPython), TRUE); visu_ui_panel_attach(VISU_UI_PANEL(panelPython), visu_ui_panel_class_getCommandPanel()); g_signal_connect(G_OBJECT(panelPython), "page-entered", G_CALLBACK(onPanelEnter), (gpointer)0); options = commandLineGet_options(); if (options && (opt = (ToolOption*)g_hash_table_lookup(options, "pyScript"))) { initialisePanel(VISU_UI_PANEL(panelPython)); file = g_value_get_string(tool_option_getValue(opt)); gtk_file_chooser_select_filename(GTK_FILE_CHOOSER(pyFileChooser), file); gtk_widget_set_sensitive(pyExecute, TRUE); } return TRUE; } const char* pythongiGet_description(void) { return PYTHONGI_DESCRIPTION; } const char* pythongiGet_authors(void) { return PYTHONGI_AUTHORS; } const char* pythongiGet_icon(void) { return iconPath; } void pythongiFree(void) { DBG_fprintf(stderr, "Panel PythonGI: finalise.\n"); g_free(iconPath); g_object_unref(initScripts); if (!isPythonInitialised) return; Py_Finalize(); } static void onPanelEnter(VisuUiPanel *panel, gpointer data _U_) { DBG_fprintf(stderr, "Panel PythonGI: caught the 'page-entered' signal %d.\n", isPanelInitialised); if (!isPythonInitialised) initialisePython(); if (!isPanelInitialised) initialisePanel(panel); } static void initialisePython() { if (isPythonInitialised) return; DBG_fprintf(stderr, "Panel PythonGI: initialise Python.\n"); Py_SetProgramName((char*)commandLineGet_programName()); Py_Initialize(); DBG_fprintf(stderr, "Panel PythonGI: import sys.\n" "sys.path = [\"" GI_TYPELIBS_DIR "\"] + sys.path;\n" "sys.path = [\"" PYGI_EXEC_DIR "\"] + sys.path;\n" "import os;\n" "os.putenv(\"GI_TYPELIB_PATH\", \"" VISU_TYPELIBS_DIR "\");\n" "sys.path = [\"" VISU_EXEC_DIR "\"] + sys.path\n"); PyRun_SimpleString("import os;" "os.putenv(\"GI_TYPELIB_PATH\", \"" VISU_TYPELIBS_DIR "\");" "import sys;" "sys.path = [\"" VISU_EXEC_DIR "\"] + sys.path;" "sys.argv = ['']\n" "from gi.repository import v_sim"); DBG_fprintf(stderr, " | done.\n"); isPythonInitialised = TRUE; } static void addFilters(GtkWidget *wd) { GtkFileFilter *flt; flt = gtk_file_filter_new(); gtk_file_filter_set_name(flt, _("Python scripts for V_Sim")); gtk_file_filter_add_mime_type(flt, "text/x-script.python"); gtk_file_filter_add_mime_type(flt, "text/x-python"); gtk_file_filter_add_mime_type(flt, "application/x-python"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(wd), flt); flt = gtk_file_filter_new(); gtk_file_filter_set_name(flt, _("All")); gtk_file_filter_add_pattern(flt, "*"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(wd), flt); } static void initialisePanel(VisuUiPanel *panel) { int fd[2]; gchar *string; GIOChannel *pyIO; GtkWidget *vbox, *hbox, *wd, *scrolled; GtkTreeViewColumn *column; GtkCellRenderer *renderer; GtkToolItem *item; GtkTreeSelection *selection; g_return_if_fail(!isPanelInitialised); /* Redirect stdout. */ if (pipe(fd)) g_warning("Cannot create pipes for Python process."); else { string = g_strdup_printf("sys.stdout = os.fdopen(%d, 'w', 0)", fd[1]); DBG_fprintf(stderr, "Panel PythonGI: run '%s'.\n", string); PyRun_SimpleString(string); g_free(string); pyIO = g_io_channel_unix_new(fd[0]); g_io_channel_set_flags(pyIO, G_IO_FLAG_NONBLOCK, NULL); g_io_add_watch(pyIO, G_IO_IN | G_IO_PRI, onPyIO, GINT_TO_POINTER(FALSE)); } /* Redirect stderr. */ if (pipe(fd)) g_warning("Cannot create pipes for Python process."); else { string = g_strdup_printf("sys.stderr = os.fdopen(%d, 'w', 0)", fd[1]); DBG_fprintf(stderr, "Panel PythonGI: run '%s'.\n", string); PyRun_SimpleString(string); g_free(string); pyIO = g_io_channel_unix_new(fd[0]); g_io_channel_set_flags(pyIO, G_IO_FLAG_NONBLOCK, NULL); g_io_add_watch(pyIO, G_IO_IN | G_IO_PRI, onPyIO, GINT_TO_POINTER(TRUE)); } vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(panel), vbox); wd = gtk_label_new(_("Scripts loaded on startup")); gtk_label_set_use_markup(GTK_LABEL(wd), TRUE); gtk_misc_set_alignment(GTK_MISC(wd), 0., 0.5); gtk_widget_set_name(wd, "label_head"); gtk_box_pack_start(GTK_BOX(vbox), wd, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 3); scrolled = gtk_scrolled_window_new(NULL, NULL); gtk_widget_set_size_request(scrolled, -1, 100); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_ETCHED_IN); gtk_box_pack_start(GTK_BOX(hbox), scrolled, TRUE, TRUE, 0); wd = gtk_tree_view_new_with_model(GTK_TREE_MODEL(initScripts)); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(wd), FALSE); gtk_widget_set_tooltip_text(wd, _("This list is saved with the parameter file.")); gtk_container_add(GTK_CONTAINER(scrolled), wd); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes("", renderer, "text", SCRIPT_LABEL, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(wd), column); renderer = gtk_cell_renderer_text_new(); g_object_set(G_OBJECT(renderer), "scale", 0.75, NULL); column = gtk_tree_view_column_new_with_attributes("", renderer, "text", SCRIPT_PATH, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(wd), column); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(wd)); wd = gtk_toolbar_new(); gtk_orientable_set_orientation(GTK_ORIENTABLE(wd), GTK_ORIENTATION_VERTICAL); gtk_toolbar_set_style(GTK_TOOLBAR(wd), GTK_TOOLBAR_ICONS); gtk_toolbar_set_icon_size(GTK_TOOLBAR(wd), GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); item = gtk_tool_button_new_from_stock(GTK_STOCK_ADD); g_signal_connect(G_OBJECT(item), "clicked", G_CALLBACK(onInitScriptAdded), (gpointer)0); gtk_toolbar_insert(GTK_TOOLBAR(wd), item, -1); item = gtk_tool_button_new_from_stock(GTK_STOCK_REMOVE); g_signal_connect(G_OBJECT(item), "clicked", G_CALLBACK(onInitScriptRemoved), (gpointer)selection); gtk_toolbar_insert(GTK_TOOLBAR(wd), item, -1); item = gtk_tool_button_new_from_stock(GTK_STOCK_REFRESH); g_signal_connect(G_OBJECT(item), "clicked", G_CALLBACK(onInitScriptReload), (gpointer)selection); gtk_toolbar_insert(GTK_TOOLBAR(wd), item, -1); wd = gtk_label_new(_("Interactive scripting")); gtk_label_set_use_markup(GTK_LABEL(wd), TRUE); gtk_misc_set_alignment(GTK_MISC(wd), 0., 0.5); gtk_widget_set_name(wd, "label_head"); gtk_box_pack_start(GTK_BOX(vbox), wd, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 3); wd = gtk_label_new(_("Load:")); gtk_misc_set_padding(GTK_MISC(wd), 5, 0); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); pyFileChooser = gtk_file_chooser_button_new(_("Choose a Python script"), GTK_FILE_CHOOSER_ACTION_OPEN); addFilters(pyFileChooser); gtk_box_pack_start(GTK_BOX(hbox), pyFileChooser, TRUE, TRUE, 0); pyExecute = gtk_button_new_from_stock(GTK_STOCK_EXECUTE); gtk_widget_set_sensitive(pyExecute, FALSE); gtk_box_pack_start(GTK_BOX(hbox), pyExecute, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(pyFileChooser), "file-set", G_CALLBACK(onScriptChosen), (gpointer)pyExecute); g_signal_connect(G_OBJECT(pyExecute), "clicked", G_CALLBACK(onScriptExecute), (gpointer)pyFileChooser); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 3); scrolled = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_ETCHED_IN); gtk_box_pack_start(GTK_BOX(hbox), scrolled, TRUE, TRUE, 0); pyTextView = gtk_text_view_new_with_buffer(pyTextBuffer); g_object_unref(pyTextBuffer); gtk_text_view_set_editable(GTK_TEXT_VIEW(pyTextView), FALSE); gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(pyTextView), FALSE); gtk_container_add(GTK_CONTAINER(scrolled), pyTextView); g_signal_connect(G_OBJECT(gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(pyTextView))), "changed", G_CALLBACK(onVScroll), (gpointer)0); wd = gtk_toolbar_new(); gtk_orientable_set_orientation(GTK_ORIENTABLE(wd), GTK_ORIENTATION_VERTICAL); gtk_toolbar_set_style(GTK_TOOLBAR(wd), GTK_TOOLBAR_ICONS); gtk_toolbar_set_icon_size(GTK_TOOLBAR(wd), GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); item = gtk_tool_button_new_from_stock(GTK_STOCK_CLEAR); g_signal_connect(G_OBJECT(item), "clicked", G_CALLBACK(onOutputCleared), (gpointer)0); gtk_toolbar_insert(GTK_TOOLBAR(wd), item, -1); gtk_widget_set_tooltip_text(GTK_WIDGET(item), _("Clear Python output.")); item = gtk_tool_button_new_from_stock(GTK_STOCK_CANCEL); gtk_widget_set_sensitive(GTK_WIDGET(item), FALSE); g_signal_connect(G_OBJECT(item), "clicked", G_CALLBACK(onOutputCancel), (gpointer)0); gtk_toolbar_insert(GTK_TOOLBAR(wd), item, -1); item = gtk_tool_button_new_from_stock(GTK_STOCK_FIND); gtk_toolbar_insert(GTK_TOOLBAR(wd), item, -1); gtk_widget_set_tooltip_text(GTK_WIDGET(item), _("Get the current VisuData object as 'data'" " variable and the current VisuGlView as 'view'.")); wd = gtk_entry_new(); gtk_entry_set_placeholder_text(GTK_ENTRY(wd), _("Python interactive command line")); g_signal_connect(G_OBJECT(wd), "activate", G_CALLBACK(onInteractiveEntry), (gpointer)0); g_signal_connect(G_OBJECT(wd), "key-press-event", G_CALLBACK(onKeyPressed), (gpointer)0); g_signal_connect(G_OBJECT(item), "clicked", G_CALLBACK(onOutputGetData), (gpointer)wd); gtk_box_pack_end(GTK_BOX(vbox), wd, FALSE, FALSE, 0); gtk_widget_show_all(vbox); isPanelInitialised = TRUE; } static void onScriptChosen(GtkFileChooserButton *widget, gpointer user_data) { gchar *file; file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)); gtk_widget_set_sensitive(GTK_WIDGET(user_data), (file != (gchar*)0)); if (file) g_free(file); } static void onScriptExecute(GtkButton *widget _U_, gpointer user_data) { gchar *file; file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(user_data)); g_return_if_fail(file); g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, loadScript, (gpointer)file, g_free); } static gboolean loadScript(gpointer file) { gchar *script, *label, *name; GError *error; DBG_fprintf(stderr, "Panel PythonGI: load script '%s'.\n", (gchar*)file); g_return_val_if_fail(isPythonInitialised, FALSE); error = (GError*)0; if (!g_file_get_contents((gchar*)file, &script, (gsize*)0, &error)) { if (error) { visu_ui_raiseWarning(_("Load a Python script"), error->message, visu_ui_panel_getContainerWindow (VISU_UI_PANEL(panelPython))); g_error_free(error); } return FALSE; } name = g_path_get_basename((const gchar*)file); label = g_strdup_printf(_("Load script \"%s\"\n"), name); g_free(name); _bufSetText(label, boldTag, FALSE); g_free(label); PyRun_SimpleString(script); g_free(script); return FALSE; } static void addInitScript(const gchar *file, gboolean immediate, GtkWindow *parent) { GtkTreeIter iter; gchar *path, *name; if (!g_file_test(file, G_FILE_TEST_IS_REGULAR)) { if (parent) visu_ui_raiseWarning(_("Choose a Python script"), _("Not a regular file."), parent); return; } path = tool_path_normalize(file); name = g_path_get_basename(file); gtk_list_store_append(initScripts, &iter); gtk_list_store_set(initScripts, &iter, SCRIPT_PATH, path, SCRIPT_LABEL, name, -1); g_free(name); if (immediate) { loadScript((gpointer)path); g_free(path); } else g_idle_add_full(G_PRIORITY_LOW, loadScript, (gpointer)path, g_free); } static void onInitScriptAdded(GtkToolButton *bt _U_, gpointer data _U_) { GtkWidget *dialog; gchar *filename; GtkWindow *parent; parent = visu_ui_panel_getContainerWindow(VISU_UI_PANEL(panelPython)); dialog = gtk_file_chooser_dialog_new(_("Choose a Python script"), parent, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); addFilters(dialog); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); addInitScript(filename, FALSE, parent); g_free(filename); } gtk_widget_destroy(dialog); } static void onInitScriptRemoved(GtkToolButton *bt _U_, gpointer data) { gboolean valid; GtkTreeModel *model; GtkTreeIter iter; valid = gtk_tree_selection_get_selected(GTK_TREE_SELECTION(data), &model, &iter); if (!valid) return; gtk_list_store_remove(GTK_LIST_STORE(model), &iter); } static void onInitScriptReload(GtkToolButton *bt _U_, gpointer data) { gboolean valid; GtkTreeModel *model; GtkTreeIter iter; gchar *path; valid = gtk_tree_selection_get_selected(GTK_TREE_SELECTION(data), &model, &iter); if (!valid) return; gtk_tree_model_get(model, &iter, SCRIPT_PATH, &path, -1); loadScript((gpointer)path); g_free(path); } static gboolean onPyIO(GIOChannel *source, GIOCondition condition _U_, gpointer data) { #define size 256 gchar string[size]; gsize lg; GError *error; error = (GError*)0; /* DBG_fprintf(stderr, "Panel PythonGI: receive buffer data.\n"); */ if (g_io_channel_read_chars(source, string, size, &lg, &error) != G_IO_STATUS_NORMAL) { g_warning("%s", error->message); g_error_free(error); return TRUE; } string[lg] = '\0'; /* DBG_fprintf(stderr, "Panel PythonGI: got\n%s\n", string); */ _bufSetText(string, monoTag, GPOINTER_TO_INT(data)); /* Flush Gtk events. */ visu_ui_wait(); return TRUE; } static void _bufSetText(const gchar *text, GtkTextTag *tag, gboolean error) { GtkTextIter iter; gtk_text_buffer_get_end_iter(pyTextBuffer, &iter); if (!error) gtk_text_buffer_insert_with_tags(pyTextBuffer, &iter, text, -1, tag, NULL); else gtk_text_buffer_insert_with_tags(pyTextBuffer, &iter, text, -1, tag, errorTag, NULL); } static void onOutputCleared(GtkToolButton *bt _U_, gpointer data _U_) { GtkTextIter start, end; gtk_text_buffer_get_bounds(pyTextBuffer, &start, &end); gtk_text_buffer_delete(pyTextBuffer, &start, &end); } static void onOutputCancel(GtkToolButton *bt _U_, gpointer data _U_) { DBG_fprintf(stderr, "Panel PythonGI: try to interrupt.\n"); PyErr_SetString(PyExc_TypeError, "script interrupted."); } static void onOutputGetData(GtkToolButton *bt _U_, gpointer data) { DBG_fprintf(stderr, "Panel PythonGI: get current data.\n"); gtk_entry_set_text(GTK_ENTRY(data), "data = v_sim.UiMainClass.getDefaultRendering().getData()"); g_signal_emit_by_name(G_OBJECT(data), "activate"); gtk_entry_set_text(GTK_ENTRY(data), "view = v_sim.UiMainClass.getDefaultRendering().getGlView()"); g_signal_emit_by_name(G_OBJECT(data), "activate"); } static void onVScroll(GtkAdjustment *adj, gpointer data _U_) { guint oldUpper; oldUpper = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(adj), "old-upper")); if (gtk_adjustment_get_value(adj) + gtk_adjustment_get_page_size(adj) == oldUpper) /* Scroll to the end. */ gtk_adjustment_set_value(adj, gtk_adjustment_get_upper(adj) - gtk_adjustment_get_page_size(adj)); g_object_set_data(G_OBJECT(adj), "old-upper", GINT_TO_POINTER(gtk_adjustment_get_upper(adj))); } static void onInteractiveEntry(GtkEntry *entry, gpointer data _U_) { _bufSetText("> ", NULL, FALSE); _bufSetText(gtk_entry_get_text(entry), monoTag, FALSE); _bufSetText("\n", NULL, FALSE); PyRun_SimpleString(gtk_entry_get_text(entry)); history = g_list_prepend(history, g_strdup(gtk_entry_get_text(entry))); curHist = (GList*)0; gtk_entry_set_text(entry, ""); } static gboolean onKeyPressed(GtkWidget *widget, GdkEventKey *event, gpointer data _U_) { if (event->keyval != GDK_KEY_Up && event->keyval != GDK_KEY_Down) return FALSE; if (event->keyval == GDK_KEY_Up) curHist = (curHist)?((curHist->next)?curHist->next:curHist):history; else if (event->keyval == GDK_KEY_Down && curHist) curHist = curHist->prev; gtk_entry_set_text(GTK_ENTRY(widget), (curHist)?(const gchar*)curHist->data:""); gtk_editable_set_position(GTK_EDITABLE(widget), -1); return TRUE; } /**************/ /* Parameters */ /**************/ static gboolean readInitScripts(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position _U_, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error _U_) { gchar **paths; guint i; g_return_val_if_fail(nbLines == 1, FALSE); initialisePython(); paths = g_strsplit_set(lines[0], ":\n", 100); for (i = 0; paths[i]; i++) { g_strstrip(paths[i]); DBG_fprintf(stderr, "Panel PythonGI: test file '%s'.\n", paths[i]); addInitScript(paths[i], TRUE, (GtkWindow*)0); } g_strfreev(paths); return TRUE; } static void exportParameters(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { gboolean valid; GtkTreeIter iter; gchar *file; g_string_append_printf(data, "# %s\n", DESC_PARAMETER_INIT_SCRIPTS); g_string_append_printf(data, "%s[python]: ", FLAG_PARAMETER_INIT_SCRIPTS); for (valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(initScripts), &iter); valid; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(initScripts), &iter)) { gtk_tree_model_get(GTK_TREE_MODEL(initScripts), &iter, SCRIPT_PATH, &file, -1); g_string_append_printf(data, "%s:", file); g_free(file); } g_string_append_printf(data, "\n\n"); } v_sim-3.7.0/lib/plug-ins/python-gi/pygi_collisions.v_sim.py0000754000353400050620000000334712215546175020720 00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- from gi.repository import v_sim import cProfile render = v_sim.UiMainClass.getDefaultRendering() data = render.getVisuData() # Example with integrated iterators (still an issue with the # stop criterion) rad = {} for it in data.__iterElements__(): rad[it.element.getName()] = v_sim.RenderingAtomic.getRadius(it.element) #print "Radii: ", rad def hit((x1,y1,z1), r1, (x2,y2,z2), r2): return ( (x1-x2)**2 + (y1-y2)**2 + (z1-z2)**2 < (r1 + r2)**2 ) # With Python iterators. collision = set() def byPairs(data, collision): for (it1, it2) in data.__iterByPairs__(): if hit(data.getNodeCoordinates(it1.node), rad[it1.element.getName()], \ data.getNodeCoordinates(it2.node), rad[it2.element.getName()]): collision.add(int(it1.node.number)) collision.add(int(it2.node.number)) def doubleLoop(data, collision): for it1 in data: for it2 in data: if it1.node.number > it2.node.number and \ hit(data.getNodeCoordinates(it1.node), rad[it1.element.getName()], \ data.getNodeCoordinates(it2.node), rad[it2.element.getName()]): collision.add(int(it1.node.number)) collision.add(int(it2.node.number)) def byCopy(data, collision): nodes = data.getAllNodePositions() for (c1, i1, e1) in nodes: for (c2, i2, e2) in nodes: if i1 > i2 and hit(c1, rad[e1], c2, rad[e2]): collision.add(int(i1)) collision.add(int(i2)) cProfile.run('doubleLoop(data, collision)') cProfile.run('byPairs(data, collision)') cProfile.run('byCopy(data, collision)') marks = render.getMarks() if marks.setHighlightedList(tuple(collision), v_sim.MarksStatus.SET): v_sim.Object.redraw("My script") #v_sim.UiMainClass.getCurrentPanel().quit(True) v_sim-3.7.0/lib/plug-ins/python-gi/pygi_isolate.v_sim.py0000644000353400050620000000301612215546175020171 00000000000000#!/usr/bin/env python from gi.repository import v_sim import cProfile render = v_sim.uiMainClass_getDefaultRendering() data = render.getVisuData() def prox(data, (x0, y0, z0), c, rad): (u, v, w) = data.convertXYZToReduced(c) for dx in range(-1, 2): for dy in range(-1, 2): for dz in range(-1, 2): (x, y, z) = data.convertReducedToXYZ((u + dx, v + dy, w + dz)) dist2 = (x - x0)**2 + (y - y0)**2 + (z - z0)**2 if dist2 <= (rad) ** 2: return True return False def isolate(RAD, NODE): coord0 = data.getNodeCoordinates(data.getNodeFromNumber(NODE)) dataIter = data.iterNew() data.iterStart(dataIter) while (dataIter.node is not None): if prox(data, coord0, data.getNodeCoordinates(dataIter.node), RAD): print "Node ",dataIter.node.number," is visible" dataIter.node.setVisibility(True) else: print "Node ",dataIter.node.number," is hidden" dataIter.node.setVisibility(False) data.iterNext(dataIter) data.createAllNodes() ##RAD = input('Choose a radius: ') ##NODE = input('Choose a node id: ') RAD = 5. NODE = 21 print "All nodes further than ",RAD," from node ",NODE," will be hidden." cProfile.run('isolate(RAD, NODE)') v_sim.object_redraw(None) #----------------------DUMP----------------------# outFilename = "diffOut.png" print '\n\t---DUMP dans du resultat dans %s---\n' % outFilename ##outFilename = "diffOut.ascii" dumps = v_sim.dump_getAllModules() for dump in dumps: if dump.fileType.match(outFilename): render.dump(dump, outFilename, 450, 450, None, None) v_sim-3.7.0/lib/plug-ins/python-gi/pygi_rotate.v_sim.py0000644000353400050620000000121612215546175020027 00000000000000#!/usr/bin/env python from gi.repository import v_sim import math, time render = v_sim.uiMainClass_getDefaultRendering() data = render.getVisuData() camera = data.getOpenGLView().camera (theta0, gross0) = (camera.theta, camera.gross) dumps = v_sim.dump_getAllModules() for dump in dumps: if dump.fileType.match("a.png"): format = dump NB = 100. for i in range(0, int(NB) + 1): data.setAngleOfView(theta0 + 360. * i / NB, 0, 0, v_sim.CAMERA_THETA) data.setZoomOfView(gross0 + 0.5 * math.sin(i * math.pi * 2. / NB)) v_sim.object_redraw("My script") #time.sleep(0.01) #render.dump(format, "rotation%03d.png" % i, 450, 450, None, None) v_sim-3.7.0/lib/plug-ins/python-gi/pygi_load.v_sim.py0000644000353400050620000000402612216053247017444 00000000000000#!/usr/bin/env python from gi.repository import v_sim import traceback def parseCNT(data, filename, format, iset, cancel): print "test file: %s for VisuData: %s(%d)" % (filename, data, iset) valid = False try: # Read the given file. f = open(filename, "r") desc = f.readline() f.readline() box = map(float, f.readline().split()) + \ map(float, f.readline().split()) + \ map(float, f.readline().split()) elements = f.readline().split() nElements = map(int, f.readline().split()) # From here, we consider that this file is indeed a VASP file. valid = True f.readline() f.readline() coords = [] for line in f.xreadlines(): coords.append(map(float, line.split()[:3])) f.close() allElements = [] for i in range(len(elements)): allElements += [elements[i]] * nElements[i] # Pass the variables to V_Sim. # Declare one set of data for this file. data.setNSubset(1) # Setup the box geomtry. box = v_sim.Box.new_full(box, v_sim.BoxBoundaries.PERIODIC) # Setting up the box geometry here make available to use the # converting routines to go from reduced coordinates to cartesian. data.setBox(box, False) # Allocate the internal arrays for these elemnts and number of nodes. data.allocateByNames(nElements, elements) for (coord, ele) in zip(coords, allElements): # For each node, add it with its coordinates data.addNodeFromElementName(ele, coord, False, False); # Mandatory call at the end to update some internal dimensions # Related to the box. box.setMargin(data.getMaxElementSize() + data.getAllNodeExtens(box), True); # Set a commentry for this subset of data. data.setFileCommentary(desc.strip(), 0) return True except Exception as error: traceback.print_exc() return valid return False # Declare this new fileformat to V_Sim. fmt = v_sim.FileFormat.new("VASP CNT files", ("*.cnt", "cnt.*")) v_sim.Rendering.getByName("Atom visualisation").addFileFormat(0, fmt, 95, parseCNT) v_sim-3.7.0/lib/plug-ins/python-gi/pygi_plot.v_sim.py0000644000353400050620000002072512215546175017515 00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # vim: set fileencoding=utf-8 ## EXTRAITS DE LA LICENCE ## Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2012-2012) ## Adresse mèl : ## CALISTE, damien P caliste AT cea P fr. ## Ce logiciel est un programme informatique servant à visualiser des ## structures atomiques dans un rendu pseudo-3D. ## Ce logiciel est régi par la licence CeCILL soumise au droit français et ## respectant les principes de diffusion des logiciels libres. Vous pouvez ## utiliser, modifier et/ou redistribuer ce programme sous les conditions ## de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA ## sur le site "http://www.cecill.info". ## Le fait que vous puissiez accéder à cet en-tête signifie que vous avez ## pris connaissance de la licence CeCILL, et que vous en avez accepté les ## termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). ## LICENCE SUM UP ## Copyright CEA, contributors: Damien CALISTE, L_Sim laboratory, (2012-2012) ## E-mail address: ## CALISTE, damien P caliste AT cea P fr. ## This software is a computer program whose purpose is to visualize atomic ## configurations in 3D. ## This software is governed by the CeCILL license under French law and ## abiding by the rules of distribution of free software. You can use, ## modify and/ or redistribute the software under the terms of the CeCILL ## license as circulated by CEA, CNRS and INRIA at the following URL ## "http://www.cecill.info". ## The fact that you are presently reading this means that you have had ## knowledge of the CeCILL license and that you accept its terms. You can ## find a copy of this licence shipped with this software at ## Documentation/licence.en.txt. from gi.repository import v_sim from gi.repository import Gtk import numpy from matplotlib.figure import Figure from matplotlib.backends.backend_cairo import FigureCanvasCairo as FigureCanvas from matplotlib.backends.backend_cairo import RendererCairo as Renderer dpi = 100 fig_width = 3 fig_height = 2 def mplCurveDraw(widget, cr, f, renderer): renderer.gc.ctx = cr w = widget.get_allocated_width() h = widget.get_allocated_height() cr.translate(max(0, (w - fig_width * dpi) * 0.5), -max(0, (h - fig_height * dpi) * 0.5)) renderer.set_width_height(w, h) f.draw(renderer) def onTogglePick(widget, interPick, panel, wdx, wdy, wdz, wdx_ref, wdy_ref, wdz_ref): render = v_sim.UiMainClass.getDefaultRendering() if (widget.get_active()): handle = interPick.connect("node-selection", onNodeSelected, panel, widget, wdx, wdy, wdz, wdx_ref, wdy_ref, wdz_ref) interPick.set_data("pick", handle) render.pushInteractive(interPick) render.pushMessage("Pick a node with the mouse") else: interPick.disconnect(interPick.get_data("pick")) render.popInteractive(interPick) render.popMessage() def onNodeSelected(inter, kind, node0, node1, node2, panel, toggle, entryX, entryY, entryZ, entryX_ref, entryY_ref, entryZ_ref): if not(kind == v_sim.InteractivePick.SELECTED): return data = panel.getData() (x, y, z) = data.getNodeCoordinates(node0) if entryX_ref is not None: entryX.setValue(x - entryX_ref.getValue()) else: entryX.setValue(x) if entryY_ref is not None: entryY.setValue(y - entryY_ref.getValue()) else: entryY.setValue(y) if entryZ_ref is not None: entryZ.setValue(z - entryZ_ref.getValue()) else: entryZ.setValue(z) toggle.set_active(False) def onDraw(widget, area, mplFig, panel, combo, (ox, oy, oz), (dx, dy, dz)): # We get the scalar field. it = combo.get_active_iter() if it is None: return model = combo.get_model() (field,) = model.get(it, v_sim.UiSurfacesFieldId.POINTER) data = panel.getData() # We setup the data to iterate over. orig = numpy.array(data.convertXYZToReduced((ox.getValue(), oy.getValue(), oz.getValue()))) vect = numpy.array(data.convertXYZToReduced((dx.getValue(), dy.getValue(), dz.getValue()))) norm = 1. / numpy.sqrt(vect[0] * vect[0] + vect[1] * vect[1] + vect[2] * vect[2]) vect *= norm l0 = max(-orig[0] / max(vect[0], 1e-6), -orig[1] / max(vect[1], 1e-6), -orig[2] / max(vect[2], 1e-6)) l1 = min((1. - orig[0]) / max(vect[0], 1e-6), (1. - orig[1]) / max(vect[1], 1e-6), (1. - orig[2]) / max(vect[2], 1e-6)) orig0 = numpy.array(data.convertReducedToXYZ(tuple(orig + l0 * vect))) vect0 = numpy.array(data.convertReducedToXYZ(tuple(orig + l1 * vect))) - orig0 norm = numpy.sqrt(vect0[0] * vect0[0] + vect0[1] * vect0[1] + vect0[2] * vect0[2]) # We setup the data to be plotted. a = mplFig.add_subplot(111) x = numpy.arange(0.0, 1.0, 0.01) y = numpy.arange(0.0, 1.0, 0.01) for i in range(100): point = orig0 + x[i] * vect0 (valid, val) = field.getValue(tuple(point), (0,0,0)) if valid: y[i] = val x *= norm a.plot(x,y) # We ask for redraw of the widget. area.queue_draw() def panelCreateSelection(panel, vbox, interPick, label, wdx_ref = None, wdy_ref = None, wdz_ref = None): # The line to choose the origin/orientation. hbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 5) vbox.pack_start(hbox, False, False, 0) lbl = Gtk.Label.new(label) hbox.pack_start(lbl, False, False, 0) wdx = v_sim.UiNumericalEntry.new(0.) wdx.set_width_chars(6) hbox.pack_start(wdx, True, True, 0) wdy = v_sim.UiNumericalEntry.new(0.) wdy.set_width_chars(6) hbox.pack_start(wdy, True, True, 0) wdz = v_sim.UiNumericalEntry.new(0.) wdz.set_width_chars(6) hbox.pack_start(wdz, True, True, 0) wd = Gtk.ToggleButton.new() wd.add(Gtk.Image.new_from_stock(Gtk.STOCK_FIND, Gtk.IconSize.MENU)) wd.connect("toggled", onTogglePick, interPick, panel, wdx, wdy, wdz, wdx_ref, wdy_ref, wdz_ref) hbox.pack_start(wd, False, False, 0) return (wdx, wdy, wdz) def panelCreateWidgets(): panel = v_sim.UiPanel.new("mytools", "Customized tools", "My tools") panel.setDockable(True) panel.attach(v_sim.UiPanelClass.getCommandPanel()); vbox = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0) panel.add(vbox) lbl = Gtk.Label.new("Interpolate data along lines") lbl.set_alignment(0., 0.5) lbl.set_use_markup(True) vbox.pack_start(lbl, False, False, 0) # The line to choose a data field. hbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 5) vbox.pack_start(hbox, False, False, 0) lbl = Gtk.Label.new("Choose a data field:") hbox.pack_start(lbl, False, False, 0) combo = Gtk.ComboBox.new() combo.set_model(v_sim.UiPanel.surfaces_getFields()) hbox.pack_start(combo, True, True, 0) renderer = Gtk.CellRendererText.new() combo.pack_start(renderer, False) renderer.set_property("xalign", 1.0) combo.add_attribute(renderer, "markup", v_sim.UiSurfacesFieldId.LABEL) interPick = v_sim.Interactive.new(v_sim.InteractiveId.PICK) # The line to choose the origin. (origx, origy, origz) = panelCreateSelection(panel, vbox, interPick, "Choose the origin:") # The line to choose the direction. (dirx, diry, dirz) = panelCreateSelection(panel, vbox, interPick, "Choose the direction:", wdx_ref = origx, wdy_ref = origy, wdz_ref = origz) dirx.setValue(1.) diry.setValue(1.) dirz.setValue(1.) # The drawing area for the curve. hbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 0) vbox.pack_start(hbox, True, True, 0) scrolled = Gtk.ScrolledWindow.new(None, None) scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) hbox.pack_start(scrolled, True, True, 0) f = Figure(figsize=(fig_width,fig_height), dpi = dpi) canvas = FigureCanvas(f) f.set_canvas(canvas) renderer = Renderer(dpi = dpi) area = Gtk.DrawingArea.new() area.set_size_request(fig_width * dpi, fig_height * dpi) area.connect("draw", mplCurveDraw, f, renderer) scrolled.add_with_viewport(area) # The toolbar for action on the curve. wd = Gtk.Toolbar.new() wd.set_orientation(Gtk.Orientation.VERTICAL) wd.set_style(Gtk.ToolbarStyle.ICONS) wd.set_icon_size(Gtk.IconSize.SMALL_TOOLBAR) hbox.pack_start(wd, False, False, 0) item = Gtk.ToolButton.new_from_stock(Gtk.STOCK_REFRESH) item.connect("clicked", onDraw, area, f, panel, combo, (origx, origy, origz), (dirx, diry, dirz)) wd.insert(item, -1) return (f, panel, interPick) # We create the widgets and plot the stuff. (mplFig, panel, i) = panelCreateWidgets() panel.show_all() v_sim-3.7.0/lib/plug-ins/python-gi/pygi_rightMenu.v_sim.py0000644000353400050620000000775712215546175020513 00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # vim: set fileencoding=utf-8 ## EXTRAITS DE LA LICENCE ## Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2012-2012) ## Adresse mèl : ## CALISTE, damien P caliste AT cea P fr. ## Ce logiciel est un programme informatique servant à visualiser des ## structures atomiques dans un rendu pseudo-3D. ## Ce logiciel est régi par la licence CeCILL soumise au droit français et ## respectant les principes de diffusion des logiciels libres. Vous pouvez ## utiliser, modifier et/ou redistribuer ce programme sous les conditions ## de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA ## sur le site "http://www.cecill.info". ## Le fait que vous puissiez accéder à cet en-tête signifie que vous avez ## pris connaissance de la licence CeCILL, et que vous en avez accepté les ## termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). ## LICENCE SUM UP ## Copyright CEA, contributors: Damien CALISTE, L_Sim laboratory, (2012-2012) ## E-mail address: ## CALISTE, damien P caliste AT cea P fr. ## This software is a computer program whose purpose is to visualize atomic ## configurations in 3D. ## This software is governed by the CeCILL license under French law and ## abiding by the rules of distribution of free software. You can use, ## modify and/ or redistribute the software under the terms of the CeCILL ## license as circulated by CEA, CNRS and INRIA at the following URL ## "http://www.cecill.info". ## The fact that you are presently reading this means that you have had ## knowledge of the CeCILL license and that you accept its terms. You can ## find a copy of this licence shipped with this software at ## Documentation/licence.en.txt. from gi.repository import v_sim from gi.repository import Gtk, GLib def onMeasure(item, marks, nodeId): if marks.setInfos(nodeId, True): v_sim.Object.redrawForce("rightMenu script") def onClean(item, marks, nodeId): if marks.setInfos(nodeId, False): v_sim.Object.redrawForce("rightMenu script") def buildMenu(inter, node): menu = Gtk.Menu.new() marks = v_sim.UiMainClass.getDefaultRendering().getMarks() # The default contents (single node case). if node is not None: item = Gtk.MenuItem.new_with_label("Measure node neighbourhood") item.connect("activate", onMeasure, marks, node.number) menu.append(item) item = Gtk.MenuItem.new_with_label("Remove measures from node") item.connect("activate", onClean, marks, node.number) item.set_sensitive(marks.getActive(node.number)) menu.append(item) # The user added items. for (lblNone, lblSingle, lblSelection, callback, kwargs) in inter.actionList.values(): if node is None: item = Gtk.MenuItem.new_with_label(lblNone) item.connect("activate", callback, None, kwargs) else: item = Gtk.MenuItem.new_with_label(lblSingle) item.connect("activate", callback, node.number, kwargs) menu.append(item) return menu def menuPosition(menu, (x, y)): return (x, y, True) def onActionMenu(inter, x, y, node): print node menu = buildMenu(inter, node) menu.show_all() menu.popup(None, None, menuPosition, (x, y), 0, Gtk.get_current_event_time()) # Define a right clic menu on rendering window. inter = v_sim.UiRenderingWindowClass.getInteractive() if 'actionMenuId' in globals(): inter.disconnect(actionMenuId) actionMenuId = inter.connect("menu", onActionMenu) # Add new methods to the interactive object of the rendering window. def addNodeAction(self, id, labelNone, labelSingle, labelSelection, callback, kwargs = {}): self.actionList[id] = (labelNone, labelSingle, labelSelection, callback, kwargs) def removeNodeAction(self, id): self.actionList.pop(id, None) # Add a list of custom action to inter. if not(hasattr(v_sim.Interactive, "actionList")): setattr(v_sim.Interactive, "actionList", {}) # Add methods to review this list. v_sim.Interactive.addNodeAction = addNodeAction v_sim.Interactive.removeNodeAction = removeNodeAction v_sim-3.7.0/lib/plug-ins/python-gi/collisions.ascii0000644000353400050620000002472712215546175017217 00000000000000# V_Sim export to ascii from 'toto.ascii' 16.08 0 16.08 0 0 16.08 #keyword: angstroem # Statistics are valid for all nodes (hidden or not). # Hidden nodes are printed, but commented. # Box contains 2 element(s). # Box contains 178 nodes. # | 110 nodes for element 'Ni'. # | 68 nodes for element 'Au'. 4.02 4.02 2.01 Ni 4.02 4.02 6.0300002 Ni 4.02 4.02 10.05 Ni 4.02 4.02 14.07 Ni 4.02 8.04 2.01 Ni 4.02 8.04 6.0300002 Ni 4.02 8.04 10.05 Ni 4.02 8.04 14.07 Ni 4.02 12.06 2.01 Ni 4.02 12.06 6.0300002 Ni 4.02 12.06 10.05 Ni 4.02 12.06 14.07 Ni 8.04 4.02 2.01 Ni 8.04 4.02 6.0300002 Ni 8.04 4.02 10.05 Ni 8.04 4.02 14.07 Ni 8.04 8.04 2.01 Ni 8.04 8.04 6.0300002 Ni 8.04 8.04 10.05 Ni 8.04 8.04 14.07 Ni 8.04 12.06 2.01 Ni 8.04 12.06 6.0300002 Ni 8.04 12.06 10.05 Ni 8.04 12.06 14.07 Ni 12.06 4.02 2.01 Ni 12.06 4.02 6.0300002 Ni 12.06 4.02 10.05 Ni 12.06 4.02 14.07 Ni 12.06 8.04 2.01 Ni 12.06 8.04 6.0300002 Ni 12.06 8.04 10.05 Ni 12.06 8.04 14.07 Ni 12.06 12.06 2.01 Ni 12.06 12.06 6.0300002 Ni 12.06 12.06 10.05 Ni 12.06 12.06 14.07 Ni 2.01 4.02 4.02 Ni 2.01 4.02 8.04 Ni 2.01 4.02 12.06 Ni 2.01 8.04 4.02 Ni 2.01 8.04 8.04 Ni 2.01 8.04 12.06 Ni 2.01 12.06 4.02 Ni 2.01 12.06 8.04 Ni 2.01 12.06 12.06 Ni 6.0300002 4.02 4.02 Ni 6.0300002 4.02 8.04 Ni 6.0300002 4.02 12.06 Ni 6.0300002 8.04 4.02 Ni 6.0300002 8.04 8.04 Ni 6.0300002 8.04 12.06 Ni 6.0300002 12.06 4.02 Ni 6.0300002 12.06 8.04 Ni 6.0300002 12.06 12.06 Ni 10.05 4.02 4.02 Ni 10.05 4.02 8.04 Ni 10.05 4.02 12.06 Ni 10.05 8.04 4.02 Ni 10.05 8.04 8.04 Ni 10.05 8.04 12.06 Ni 10.05 12.06 4.02 Ni 10.05 12.06 8.04 Ni 10.05 12.06 12.06 Ni 14.07 4.02 4.02 Ni 14.07 4.02 8.04 Ni 14.07 4.02 12.06 Ni 14.07 8.04 4.02 Ni 14.07 8.04 8.04 Ni 14.400295 7.2272959 11.310699 Ni 14.07 12.06 4.02 Ni 14.07 12.06 8.04 Ni 14.07 12.06 12.06 Ni 4.02 2.01 4.02 Ni 4.02 2.01 8.04 Ni 4.02 2.01 12.06 Ni 4.02 6.0300002 4.02 Ni 4.02 6.0300002 8.04 Ni 4.02 6.0300002 12.06 Ni 4.02 10.05 4.02 Ni 4.02 10.05 8.04 Ni 4.02 10.05 12.06 Ni 4.02 14.07 4.02 Ni 4.02 14.07 8.04 Ni 4.02 14.07 12.06 Ni 8.04 2.01 4.02 Ni 8.04 2.01 8.04 Ni 8.04 2.01 12.06 Ni 8.04 6.0300002 4.02 Ni 8.04 6.0300002 8.04 Ni 8.04 6.0300002 12.06 Ni 8.04 10.05 4.02 Ni 8.04 10.05 8.04 Ni 8.04 10.05 12.06 Ni 8.04 14.07 4.02 Ni 8.04 14.07 8.04 Ni 8.04 14.07 12.06 Ni 12.06 2.01 4.02 Ni 12.06 2.01 8.04 Ni 12.06 2.01 12.06 Ni 12.06 6.0300002 4.02 Ni 12.06 6.0300002 8.04 Ni 12.06 6.0300002 12.06 Ni 12.06 10.05 4.02 Ni 12.06 10.05 8.04 Ni 12.06 10.05 12.06 Ni 12.06 14.07 4.02 Ni 12.390296 13.257296 7.2906981 Ni 12.06 14.07 12.06 Ni 2.01 2.01 2.01 Au 2.01 2.01 6.0300002 Au 2.01 2.01 10.05 Au 2.01 2.01 14.07 Au 2.01 6.0300002 2.01 Au 2.01 6.0300002 6.0300002 Au 2.01 6.0300002 10.05 Au 2.01 6.0300002 14.07 Au 2.01 10.05 2.01 Au 2.01 10.05 6.0300002 Au 2.01 10.05 10.05 Au 2.01 10.05 14.07 Au 2.01 14.07 2.01 Au 2.01 14.07 6.0300002 Au 2.01 14.07 10.05 Au 2.01 14.07 14.07 Au 6.0300002 2.01 2.01 Au 6.0300002 2.01 6.0300002 Au 6.0300002 2.01 10.05 Au 6.0300002 2.01 14.07 Au 6.0300002 6.0300002 2.01 Au 6.0300002 6.0300002 6.0300002 Au 6.0300002 6.0300002 10.05 Au 6.0300002 6.0300002 14.07 Au 6.0300002 10.05 2.01 Au 6.0300002 10.05 6.0300002 Au 6.0300002 10.05 10.05 Au 6.0300002 10.05 14.07 Au 6.0300002 14.07 2.01 Au 6.0300002 14.07 6.0300002 Au 6.0300002 14.07 10.05 Au 6.0300002 14.07 14.07 Au 10.05 2.01 2.01 Au 10.05 2.01 6.0300002 Au 10.05 2.01 10.05 Au 10.05 2.01 14.07 Au 10.05 6.0300002 2.01 Au 10.05 6.0300002 6.0300002 Au 10.05 6.0300002 10.05 Au 10.05 6.0300002 14.07 Au 10.05 10.05 2.01 Au 10.05 10.05 6.0300002 Au 10.05 10.05 10.05 Au 10.05 10.05 14.07 Au 10.05 14.07 2.01 Au 10.05 14.07 6.0300002 Au 10.05 14.07 10.05 Au 10.05 14.07 14.07 Au 14.257972 0.88464224 2.5351298 Au 14.07 2.01 6.0300002 Au 14.07 2.01 10.05 Au 14.07 2.01 14.07 Au 14.07 6.0300002 2.01 Au 14.07 6.0300002 6.0300002 Au 14.400295 5.2172961 9.3006983 Au 14.400295 5.2172961 13.320698 Au 14.07 10.05 2.01 Au 14.07 10.05 6.0300002 Au 14.07 10.05 10.05 Au 14.07 10.05 14.07 Au 14.07 14.07 2.01 Au 14.400295 13.257296 5.2806983 Au 14.07 14.07 10.05 Au 14.07 14.07 14.07 Au 14.07 2.01 2.01 Au 12.06 14.07 8.04 Ni 14.07 14.07 6.0300002 Au 14.07 6.0300002 10.05 Au 14.07 8.04 12.06 Ni 14.07 6.0300002 14.07 Au v_sim-3.7.0/lib/plug-ins/python-gi/cnt.Benzen_on_Ag1110000644000353400050620000000421212215546175017267 00000000000000Benzen_on_Ag111 1 9.8127213 0 0 0 8.4980659 0 0 0 12 Ag C H 24 6 18 Selective dynamics Cartesian 0.818765 1.416323 -2.3767 F F F # Ag 1st layer 0.818719 4.249027 -2.3767 F F F 0.818765 7.081749 -2.3767 F F F 3.271871 0.000032 -2.3767 F F F 3.271898 2.832684 -2.3767 F F F 3.271906 5.665349 -2.3767 F F F 5.725076 1.416305 -2.3767 F F F 5.725084 4.249081 -2.3767 F F F 5.725122 7.081713 -2.3767 F F F 8.178330 0.000002 -2.3767 F F F 8.178376 2.832719 -2.3767 F F F 8.178314 5.665341 -2.3767 F F F 1.628523 0.000044 0.0 T T T 1.628518 2.832675 0.0 T T T 1.628489 5.665345 0.0 T T T 4.081670 1.416352 0.0 T T T 4.081697 4.249009 0.0 T T T 4.081730 7.081736 0.0 T T T 6.534899 8.498026 0.0 T T T 6.534904 2.832714 0.0 T T T 6.534934 5.665387 0.0 T T T 8.988114 1.416357 0.0 T T T 8.988087 4.249050 0.0 T T T 8.988054 7.081688 0.0 T T T 3.6918001 3.52319 2.9 T T T # C benzen 2.3081999 3.52319 2.9 T T T 3.6918001 1.12681 2.9 T T T 2.3081999 1.12681 2.9 T T T 4.3833499 2.325 2.9 T T T 1.6166496 2.325 2.9 T T T 4.2393398 4.47208 2.9 T T T # H benzen 1.7606611 4.47208 2.9 T T T 4.2393398 0.17792 2.9 T T T 1.7606611 0.17792 2.9 T T T 5.4791799 2.325 2.9 T T T 0.5208197 2.325 2.9 T T T 0.005895 0.0 -3.2322 F F F # H saturation 0.005893 2.832689 -3.2322 F F F 0.005899 5.665379 -3.2322 F F F 2.459063 1.416337 -3.2322 F F F 2.459072 4.249038 -3.2322 F F F 2.459060 7.081724 -3.2322 F F F 4.912269 0.000005 -3.2322 F F F 4.912273 2.832685 -3.2322 F F F 4.912270 5.665372 -3.2322 F F F 7.365461 1.416340 -3.2322 F F F 7.365462 4.249034 -3.2322 F F F 7.365454 7.081721 -3.2322 F F F v_sim-3.7.0/lib/plug-ins/python-gi/pythongi.png0000644000353400050620000000373012215546175016365 00000000000000PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<UIDATXŗ]]UsfgKK˔R;BT7J4hH AB0*B`5}>H|QJM(H@aJ0mq:y{{-rK[Zēsg_+{o13WypŎDfXկ2T {tɳe?z\sU`?now#W^@o '=j7FGƼa_!uX?؍Wy9yƁ*U^GFD--5ắ>pMcp3B0\s.A A˷21R%8oq~;w}'W]a/ݽ6gT`䋥|͵ VJ>8uNI:d,qq^IgIwҷse%`rg.`wJjĩ'՚gMύ( ̌L Q93 ײl'78-@2߸hܡ 3Z#e6A)uUjip`~ JKcONDʦM@tyGљ:fU#Rzbl_| z17o`'1?qrKAY{W)tG8wlW=)BH)O15Q{mzsc{6b`Xa6rԹ-f&jq"μ,&zxGK/"6cF` Ј@2SRp5N"ΗaF#;Wwd&o2u%t__`!9,ZA8j"OPk[ʵZmi.j yO;{.X(Ec f)htso0Uσ1إ`߶i-ltrzRj-exG`1SXQ/ja6F+%tQ/O;O꼓#z;s-Gi\Mbt xvq 0c!gzߵ$gXI!Le~3e.yC ̃H8)bε2<3U#h}>!LfB \v5Q7%) f %s~y,>#]S8?v믙BEEdMHEx\;-0Gر!]|~ )",y|&Ão(]$)HAD2@ݯSR3"9L6rp60Oy싘(V$mc"" B |1rsW]Sg k.nK9>~W-"`+٤z@NH-Bk z18vXʓY4MiT*LkT?f[veC@О}@n}\3cuXQI[֫Dq‘v@q"&-+@mׯ,ih}kF$fvQKL 8ϴbnX>يzt,"S[y?OayIENDB`v_sim-3.7.0/lib/plug-ins/python-gi/stock-pythongi_20.png0000644000353400050620000000151312215546175020004 00000000000000PNG  IHDR sRGBbKGDC pHYs  tIME  ""ptEXtCommentCreated with GIMPWIDAT8ݔOUu?;or,Gg,3(Ibh$vRPleL0BA"ADS,W5{h{-Z9;<\1(qpC|b箕41>"L=9si@AvZgon^B/xi-kSز+l]yF9zA&(tcr W;mF}&5erb΅_^|$6h ?i6B<|S22>&6850_CgMAî| >m>7BӋayS\1P뿇=vPEpo+0W+UPv0WsgRᗗ~BD}V;4;4>b #QQ)[Nc7eЂjI B |Db=襹[:=BѐPcL[[ @MϑjEטpȮtw65sSOTPo;k #include #include #include #include #include #include #define ARCHIVES_DESCRIPTION _("" \ "This plug-in adds support for\n" \ "compressed input files\n" \ "(see http://code.google.com/p/libarchive/).") #define ARCHIVES_AUTHORS "Caliste Damien" /* Local methods */ static void archivesStructuralInit(VisuRendering *method); static gboolean loadArchivesIn(VisuData *data, const gchar* filename, ToolFileFormat *format, int nSet, GCancellable *cancel, GError **error); /* Local variables */ static gchar *iconPath; /* Required methods for a loadable module. */ gboolean archivesInit() { DBG_fprintf(stderr, "Archives: loading plug-in 'archives'...\n"); iconPath = g_build_filename(V_SIM_PIXMAPS_DIR, "archives.png", NULL); DBG_fprintf(stderr, "Archives: declare a new rendering load method.\n"); archivesStructuralInit(visu_rendering_getByName(VISU_RENDERING_ATOMIC_NAME)); return TRUE; } const char* archivesGet_description() { return ARCHIVES_DESCRIPTION; } const char* archivesGet_authors() { return ARCHIVES_AUTHORS; } const char* archivesGet_icon() { return iconPath; } static void archivesStructuralInit(VisuRendering *method) { const gchar *type[] = {"*.gz", "*.bz2", "*.zip", "*.iso", (char*)0}; visu_rendering_addFileFormat(method, 0, tool_file_format_new(_("Compressed file formats"), type), 25, loadArchivesIn); } static gboolean loadArchivesIn(VisuData *data, const gchar* filename, ToolFileFormat *format _U_, int nSet, GCancellable *cancel, GError **error) { struct archive *a; struct archive_entry *entry; int r; guint nSets; GList *lst, *tmpLst; const void *buff; size_t size, wsize; off_t offset; GIOChannel *tmpFile; gchar *tmpFilename, *tmpBasename; gboolean res; a = archive_read_new(); archive_read_support_compression_all(a); archive_read_support_format_all(a); DBG_fprintf(stderr, "Archives: try to open file with libarchive.\n"); r = archive_read_open_filename(a, filename, 10240); DBG_fprintf(stderr, " | %d %d\n", r, ARCHIVE_OK); if (r != ARCHIVE_OK) { if (archive_read_finish(a)) g_warning("Can't finish the archive file '%s'.", filename); return FALSE; } nSets = 0; lst = (GList*)0; while (archive_read_next_header(a, &entry) == ARCHIVE_OK) if (archive_entry_size(entry) > 0) { lst = g_list_prepend(lst, g_strdup(archive_entry_pathname(entry))); DBG_fprintf(stderr, " | entry '%s' size %ld in '%s'.\n", archive_entry_pathname(entry), archive_entry_size(entry), filename); if (nSets == (guint)nSet) { /* We create a temp file a extract the data to it. */ tmpBasename = g_path_get_basename(archive_entry_pathname(entry)); tmpFilename = g_build_filename(g_get_tmp_dir(), tmpBasename, NULL); g_free(tmpBasename); DBG_fprintf(stderr, "Archives: create a temporary file '%s' for entry %d.\n", tmpFilename, nSet); tmpFile = g_io_channel_new_file(tmpFilename, "w", error); if (!tmpFile) { g_free(tmpFilename); if (archive_read_finish(a)) g_warning("Can't finish the archive file '%s'.", filename); return TRUE; } while (archive_read_data_block(a, &buff, &size, &offset) == ARCHIVE_OK) { if (g_io_channel_write_chars(tmpFile, buff, size, &wsize, error) != G_IO_STATUS_NORMAL || wsize != size) { g_free(tmpFilename); if (archive_read_finish(a)) g_warning("Can't finish the archive file '%s'.", filename); return TRUE; } } if (g_io_channel_shutdown(tmpFile, TRUE, error) != G_IO_STATUS_NORMAL) { g_free(tmpFilename); if (archive_read_finish(a)) g_warning("Can't finish the archive file '%s'.", filename); return TRUE; } /* We try to load the file. */ visu_data_addFile(data, tmpFilename, 0, (ToolFileFormat*)0); res = visu_rendering_load(visu_rendering_getByName(VISU_RENDERING_ATOMIC_NAME), data, 0, cancel, error); /* We erase the file after use. */ g_unlink(tmpFilename); g_free(tmpFilename); if (!res) { if (archive_read_finish(a)) g_warning("Can't finish the archive file '%s'.", filename); return TRUE; } } nSets += 1; } if (nSets == 0) { if (archive_read_finish(a)) g_warning("Can't finish the archive file '%s'.", filename); return FALSE; } visu_data_addFile(data, filename, 0, (ToolFileFormat*)0); visu_data_setNSubset(data, nSets); for (tmpLst = lst; tmpLst; tmpLst = g_list_next(tmpLst)) { nSets -= 1; visu_data_setFileCommentary(data, (gchar*)tmpLst->data, nSets); g_free(tmpLst->data); } g_list_free(lst); if (archive_read_finish(a)) g_warning("Can't finish the archive file '%s'.", filename); return TRUE; } v_sim-3.7.0/lib/plug-ins/archives/archives.png0000644000353400050620000000421212215546157016212 00000000000000PNG  IHDR szzbKGDC pHYsHHFk> vpAg IDATXå[Uk߹f:Br0'b FM|񁨼 >/&bB+&>DM!B(-BRڂS3NvΜ9]>|gn-__{#?scXfWfhY*seĆ|Ap"4cXƁcmÂ}/x)>w@XZkZ\P, ^:]l/4Lֶ\b\.6l4idRxy'mMO2DdRKGmr_xkl1kf2<%L4r\#oVX(TЍw\QZasOso̠cI ePG OSM|'-v/-E(D)D9(:7a4G8P% 5Aƒ7'[͗zk|wefQ^"Y0JDLD)EPc?4qNb-qwj}(LWK3?`zSr Vρ(R*Z (ϿOgI% -..(gs^EaF:ޒbt.+bٲzCk쯀Ũ rEQvz,%l"ݵ`̹u&B@FbvJ㧎 sS"B"X%VgigSF_9`3QQ,M8Ϧt5|5p1RND(R֨".瘮NS Fz2.Q.k%иc@-jcore&>tgz%,fEF Jm{iit k4XFW6F!: a/s:LM;5:zv^%H:1u\\7N!ahxOG^VSj'ψ5=kdz_=y&wJc* [bmc :)[1g``}@Z[=WVU on=X֛ez|pW kȵ|'FbV/=?d?Cߦ7;'M]t"^HӦk/?a֝˶3 gl#-IckOU\x%a(VJ/R6rP +qnuX+QlfK]\T,D At158Ήdf؍P@R{5A93%9X~ջњ|?uR`>cܡrx/5wzɱY (Q@>MIa %d? יF,p̩ nDkX#L8%tEXtdate:create2011-06-07T15:09:54+02:00gS:%tEXtdate:modify2011-06-07T15:09:54+02:00IENDB`v_sim-3.7.0/lib/plug-ins/bigdft/0000755000353400050620000000000012216331351013401 500000000000000v_sim-3.7.0/lib/plug-ins/bigdft/Makefile.am0000644000353400050620000000137712215546150015371 00000000000000## Process this file with automake to produce Makefile.in vpath %.h $(top_srcdir)/src libbigdftplug_la_SOURCES = bigdft.c bigdft_run.c bigdft_system.c bigdftplug.h libbigdftplug_la_LIBADD = $(top_builddir)/src/lib@PACKAGE_TARNAME@-3.la \ @GLIB_LIBS@ @GTKS_LIBS@ @BIGDFT_LIBS@ $(FCLIBS) libbigdftplug_la_LDFLAGS = -module @EXTRA_LDFLAGS@ -version-info $(lib_v_sim_version) if HAVE_BIGDFT BigDFT_LIB = libbigdftplug.la BigDFT_EXAMPLE = BigDFT_PIX = bigdft.png stock-bigdft_20.png endif v_simplugins_LTLIBRARIES = $(BigDFT_LIB) INCLUDES = \ -I$(top_srcdir)/src \ @BIGDFT_CPPFLAGS@ \ @GLIB_CFLAGS@ \ @GTKS_CFLAGS@ AM_CFLAGS = @EXTRA_CFLAGS@ v_simexamples_DATA = $(BigDFT_EXAMPLE) v_simpixmaps_DATA = $(BigDFT_PIX) EXTRA_DIST = bigdft.png stock-bigdft_20.png v_sim-3.7.0/lib/plug-ins/bigdft/Makefile.in0000644000353400050620000005771612216330211015400 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = lib/plug-ins/bigdft DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/abinit.m4 \ $(top_srcdir)/m4/ax_check_gl.m4 \ $(top_srcdir)/m4/ax_check_glu.m4 \ $(top_srcdir)/m4/ax_lang_compiler_ms.m4 \ $(top_srcdir)/m4/ax_lapack.m4 $(top_srcdir)/m4/bigdft.m4 \ $(top_srcdir)/m4/etsf_io.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/libxc.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/netcdf.m4 \ $(top_srcdir)/m4/python.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(v_simpluginsdir)" \ "$(DESTDIR)$(v_simexamplesdir)" "$(DESTDIR)$(v_simpixmapsdir)" LTLIBRARIES = $(v_simplugins_LTLIBRARIES) am__DEPENDENCIES_1 = libbigdftplug_la_DEPENDENCIES = \ $(top_builddir)/src/lib@PACKAGE_TARNAME@-3.la \ $(am__DEPENDENCIES_1) am_libbigdftplug_la_OBJECTS = bigdft.lo bigdft_run.lo bigdft_system.lo libbigdftplug_la_OBJECTS = $(am_libbigdftplug_la_OBJECTS) libbigdftplug_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libbigdftplug_la_LDFLAGS) $(LDFLAGS) -o $@ @HAVE_BIGDFT_TRUE@am_libbigdftplug_la_rpath = -rpath \ @HAVE_BIGDFT_TRUE@ $(v_simpluginsdir) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libbigdftplug_la_SOURCES) DIST_SOURCES = $(libbigdftplug_la_SOURCES) DATA = $(v_simexamples_DATA) $(v_simpixmaps_DATA) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AB_CPPFLAGS = @AB_CPPFLAGS@ AB_LIBS = @AB_LIBS@ ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIGDFT_CPPFLAGS = @BIGDFT_CPPFLAGS@ BIGDFT_LIBS = @BIGDFT_LIBS@ BLAS_LIBS = @BLAS_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETSF_IO_LIBS = @ETSF_IO_LIBS@ EXEEXT = @EXEEXT@ EXTRA_CFLAGS = @EXTRA_CFLAGS@ EXTRA_LDFLAGS = @EXTRA_LDFLAGS@ EXTRA_LIBS = @EXTRA_LIBS@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ FCLIBS = @FCLIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLIBS = @FLIBS@ FONT_BOLD = @FONT_BOLD@ FONT_NORMAL = @FONT_NORMAL@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_BIGDFT_CFLAGS = @GLIB_BIGDFT_CFLAGS@ GLIB_BIGDFT_LIBS = @GLIB_BIGDFT_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GOBJECT_INTROSPECTION_REQUIRED = @GOBJECT_INTROSPECTION_REQUIRED@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTKS_CFLAGS = @GTKS_CFLAGS@ GTKS_LIBS = @GTKS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_SCANNER = @G_IR_SCANNER@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LAPACK_LIBS = @LAPACK_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXC_LIBS = @LIBXC_LIBS@ LIB_ARCHIVE_CFLAGS = @LIB_ARCHIVE_CFLAGS@ LIB_ARCHIVE_LIBS = @LIB_ARCHIVE_LIBS@ LIB_YAML_CFLAGS = @LIB_YAML_CFLAGS@ LIB_YAML_LIBS = @LIB_YAML_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NC_CPPFLAGS = @NC_CPPFLAGS@ NC_LDFLAGS = @NC_LDFLAGS@ NC_LIBS = @NC_LIBS@ NC_NETCDF_3_CPPFLAG = @NC_NETCDF_3_CPPFLAG@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBABEL_CFLAGS = @OPENBABEL_CFLAGS@ OPENBABEL_LIBS = @OPENBABEL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PYGOBJECT_CFLAGS = @PYGOBJECT_CFLAGS@ PYGOBJECT_LIBS = @PYGOBJECT_LIBS@ PYGOBJECT_REQUIRED = @PYGOBJECT_REQUIRED@ PYGTK_CFLAGS = @PYGTK_CFLAGS@ PYGTK_LIBS = @PYGTK_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_INCLUDES = @PYTHON_INCLUDES@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ V_SIM_MAJOR_VERSION = @V_SIM_MAJOR_VERSION@ V_SIM_MICRO_VERSION = @V_SIM_MICRO_VERSION@ V_SIM_MINOR_VERSION = @V_SIM_MINOR_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ girdir = @girdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ lib_v_sim_version = @lib_v_sim_version@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typelibsdir = @typelibsdir@ v_simexamplesdir = @v_simexamplesdir@ v_simexedir = @v_simexedir@ v_simiconsdir = @v_simiconsdir@ v_simlegaldir = @v_simlegaldir@ v_simpixmapsdir = @v_simpixmapsdir@ v_simpluginsdir = @v_simpluginsdir@ v_simresourcesdir = @v_simresourcesdir@ visupyexecdir = @visupyexecdir@ visutypelibsdir = @visutypelibsdir@ libbigdftplug_la_SOURCES = bigdft.c bigdft_run.c bigdft_system.c bigdftplug.h libbigdftplug_la_LIBADD = $(top_builddir)/src/lib@PACKAGE_TARNAME@-3.la \ @GLIB_LIBS@ @GTKS_LIBS@ @BIGDFT_LIBS@ $(FCLIBS) libbigdftplug_la_LDFLAGS = -module @EXTRA_LDFLAGS@ -version-info $(lib_v_sim_version) @HAVE_BIGDFT_TRUE@BigDFT_LIB = libbigdftplug.la @HAVE_BIGDFT_TRUE@BigDFT_EXAMPLE = @HAVE_BIGDFT_TRUE@BigDFT_PIX = bigdft.png stock-bigdft_20.png v_simplugins_LTLIBRARIES = $(BigDFT_LIB) INCLUDES = \ -I$(top_srcdir)/src \ @BIGDFT_CPPFLAGS@ \ @GLIB_CFLAGS@ \ @GTKS_CFLAGS@ AM_CFLAGS = @EXTRA_CFLAGS@ v_simexamples_DATA = $(BigDFT_EXAMPLE) v_simpixmaps_DATA = $(BigDFT_PIX) EXTRA_DIST = bigdft.png stock-bigdft_20.png all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu lib/plug-ins/bigdft/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu lib/plug-ins/bigdft/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-v_simpluginsLTLIBRARIES: $(v_simplugins_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(v_simpluginsdir)" || $(MKDIR_P) "$(DESTDIR)$(v_simpluginsdir)" @list='$(v_simplugins_LTLIBRARIES)'; test -n "$(v_simpluginsdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(v_simpluginsdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(v_simpluginsdir)"; \ } uninstall-v_simpluginsLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(v_simplugins_LTLIBRARIES)'; test -n "$(v_simpluginsdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(v_simpluginsdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(v_simpluginsdir)/$$f"; \ done clean-v_simpluginsLTLIBRARIES: -test -z "$(v_simplugins_LTLIBRARIES)" || rm -f $(v_simplugins_LTLIBRARIES) @list='$(v_simplugins_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libbigdftplug.la: $(libbigdftplug_la_OBJECTS) $(libbigdftplug_la_DEPENDENCIES) $(EXTRA_libbigdftplug_la_DEPENDENCIES) $(libbigdftplug_la_LINK) $(am_libbigdftplug_la_rpath) $(libbigdftplug_la_OBJECTS) $(libbigdftplug_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bigdft.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bigdft_run.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bigdft_system.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-v_simexamplesDATA: $(v_simexamples_DATA) @$(NORMAL_INSTALL) test -z "$(v_simexamplesdir)" || $(MKDIR_P) "$(DESTDIR)$(v_simexamplesdir)" @list='$(v_simexamples_DATA)'; test -n "$(v_simexamplesdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(v_simexamplesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(v_simexamplesdir)" || exit $$?; \ done uninstall-v_simexamplesDATA: @$(NORMAL_UNINSTALL) @list='$(v_simexamples_DATA)'; test -n "$(v_simexamplesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(v_simexamplesdir)'; $(am__uninstall_files_from_dir) install-v_simpixmapsDATA: $(v_simpixmaps_DATA) @$(NORMAL_INSTALL) test -z "$(v_simpixmapsdir)" || $(MKDIR_P) "$(DESTDIR)$(v_simpixmapsdir)" @list='$(v_simpixmaps_DATA)'; test -n "$(v_simpixmapsdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(v_simpixmapsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(v_simpixmapsdir)" || exit $$?; \ done uninstall-v_simpixmapsDATA: @$(NORMAL_UNINSTALL) @list='$(v_simpixmaps_DATA)'; test -n "$(v_simpixmapsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(v_simpixmapsdir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) installdirs: for dir in "$(DESTDIR)$(v_simpluginsdir)" "$(DESTDIR)$(v_simexamplesdir)" "$(DESTDIR)$(v_simpixmapsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-v_simpluginsLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-v_simexamplesDATA install-v_simpixmapsDATA \ install-v_simpluginsLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-v_simexamplesDATA uninstall-v_simpixmapsDATA \ uninstall-v_simpluginsLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-v_simpluginsLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip install-v_simexamplesDATA \ install-v_simpixmapsDATA install-v_simpluginsLTLIBRARIES \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-v_simexamplesDATA \ uninstall-v_simpixmapsDATA uninstall-v_simpluginsLTLIBRARIES vpath %.h $(top_srcdir)/src # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: v_sim-3.7.0/lib/plug-ins/bigdft/bigdft.c0000644000353400050620000015374312216276625014755 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2011) Adresse ml : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors: Damien CALISTE, L_Sim laboratory, (2001-2011) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "bigdftplug.h" #define BIGDFT_DESCRIPTION _("" \ "This plug-in adds support for specific\n" \ "capabilities of BigDFT.") #define BIGDFT_AUTHORS "Caliste Damien" #define FLAG_PARAMETER_BIGDFT "bigdft_use_parser" #define DESC_PARAMETER_BIGDFT "Use or not the BigDFT parser for known files ; a boolean (0 or 1)" static gboolean bigdftDensityLoad(VisuScalarFieldMethod *meth, const gchar *filename, GList **fieldList, GError **error); static gboolean bigdftTestWaveFile(const gchar *filename); extern void FC_FUNC_(memocc_report, MEMOCC_REPORT)(); /* Local variables */ static gchar *iconPath; static VisuScalarFieldMethod *fmtBigDFT; static gboolean isPanelInitialised; static gboolean useCGrid, useFGrid, useLoadWithGrid; static GtkWidget *lblCGrid, *lblFGrid; static GtkTextBuffer *bufMemory; static GtkWidget *entryHgrid[3], *entryCrmult, *entryFrmult, *entryIxc; static GtkWidget *entryRadius[2], *cbRadEle[2]; enum { RADII_VALUE_FILE, RADII_VALUE_COMPUTED, RADII_VALUE_EDITED }; static gchar *radiiIcons[3] = {GTK_STOCK_FILE, GTK_STOCK_EXECUTE, GTK_STOCK_EDIT}; static gboolean disableCallbacks; /* Local methods. */ static void updateGridLabels(VisuData *dataObj); static void initialisePanel(VisuUiPanel *panel); static gboolean loadBigDFTIn(VisuData *data, const gchar* filename, ToolFileFormat *format, int nSet, GCancellable *cancel, GError **error); static void update_memory_estimation(VisuData *data); static int redirect_init(int out_pipe[2]); static void redirect_dump(int out_pipe[2], int stdout_fileno_old); static void exportParameters(GString *data, VisuData *dataObj, VisuGlView *view); static gboolean readUseBigDFT(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj, VisuGlView *view, GError **error); /* Callbacks. */ static gboolean onFieldChooserHook(GSignalInvocationHint *ihint, guint nvalues, const GValue *param_values, gpointer data); static void onBand(GtkSpinButton *spin, gpointer data); static void onKpt(GtkSpinButton *spin, gpointer data); static void onSpin(GtkComboBox *combo, gpointer data); static void onSpinor(GtkComboBox *combo, gpointer data); static void onDataNew(GObject *obj, VisuData *dataObj, gpointer data); static void onDataReady(GObject *obj, VisuData *dataObj, gpointer data); static void onFilesChanged(VisuData *dataObj, guint kind, gpointer data); static void onPanelEnter(VisuUiPanel *panel, gpointer data); static void onToggleGrid(GtkToggleButton *toggle, gpointer data); static void onToggleLoad(GtkToggleButton *toggle, gpointer data); static void onHgrid(VisuUiNumericalEntry *entry, gdouble old_value, gpointer data); static void onRmult(VisuUiNumericalEntry *entry, gdouble old_value, gpointer data); static void onRadius(VisuUiNumericalEntry *entry, gdouble old_value, gpointer data); static void onIxc(VisuUiNumericalEntry *entry, gdouble old_value, gpointer data); static void onEleChanged(GtkComboBox *combo, gpointer data); static void onNproc(GtkSpinButton *spin, gpointer data); /* Includes. */ GtkWidget* bdft_run_tab(guint nEle, BigDFT_Wf *wf); void bdft_run_init(); GtkWidget* bdft_system_tab(BigDFT_Lzd *lzd); void bdft_system_init(); gboolean bigdftplugInit() { const gchar *typeBigDFT[] = {"*.etsf", "wavefunction-*", "minBasis-*", (char*)0}; const gchar *typeWvl[] = {"*.xyz", "*.ascii", "*.yaml", (char*)0}; VisuConfigFileEntry *resourceEntry; fmtBigDFT = visu_scalar_field_method_new(_("Wavefunction file from BigDFT"), typeBigDFT, bigdftDensityLoad, G_PRIORITY_HIGH - 4); tool_file_format_setValidator(TOOL_FILE_FORMAT(fmtBigDFT), bigdftTestWaveFile); fmtWvl = tool_file_format_new(_("BigDFT wavelet boxes"), typeWvl); visu_rendering_addFileFormat(visu_rendering_getByName(VISU_RENDERING_ATOMIC_NAME), 0, fmtWvl, 22, loadBigDFTIn); tool_file_format_addPropertyDouble(fmtWvl, "hx", _("Hgrid along x"), 0.45); tool_file_format_addPropertyDouble(fmtWvl, "hy", _("Hgrid along y"), 0.45); tool_file_format_addPropertyDouble(fmtWvl, "hz", _("Hgrid along z"), 0.45); tool_file_format_addPropertyDouble(fmtWvl, "crmult", _("Coarse grid multiplier"), 5.); tool_file_format_addPropertyDouble(fmtWvl, "frmult", _("Fine grid multiplier"), 8.); tool_file_format_addPropertyInt(fmtWvl, "ixc", _("Exchange-correlation functional code"), 1); tool_file_format_addPropertyInt(fmtWvl, "nproc", _("Number of processors for memory estimation"), 1); iconPath = g_build_filename(V_SIM_PIXMAPS_DIR, "bigdft.png", NULL); useCGrid = FALSE; useFGrid = FALSE; useLoadWithGrid = FALSE; disableCallbacks = FALSE; lblCGrid = (GtkWidget*)0; lblFGrid = (GtkWidget*)0; entryHgrid[0] = (GtkWidget*)0; entryHgrid[1] = (GtkWidget*)0; entryHgrid[2] = (GtkWidget*)0; entryCrmult = (GtkWidget*)0; entryFrmult = (GtkWidget*)0; entryRadius[0] = (GtkWidget*)0; entryRadius[1] = (GtkWidget*)0; cbRadEle[0] = (GtkWidget*)0; cbRadEle[1] = (GtkWidget*)0; entryIxc = (GtkWidget*)0; bufMemory = gtk_text_buffer_new((GtkTextTagTable*)0); gtk_text_buffer_create_tag(bufMemory, "typewriter", "family", "monospace", "scale", PANGO_SCALE_SMALL, NULL); isPanelInitialised = FALSE; g_signal_connect(VISU_OBJECT_INSTANCE, "dataNew", G_CALLBACK(onDataNew), NULL); g_signal_connect(VISU_OBJECT_INSTANCE, "dataRendered", G_CALLBACK(onDataReady), NULL); bdft_run_init(); bdft_system_init(); visu_config_file_addKnownTag("bigdft"); resourceEntry = visu_config_file_addEntry(VISU_CONFIG_FILE_PARAMETER, FLAG_PARAMETER_BIGDFT, DESC_PARAMETER_BIGDFT, 1, readUseBigDFT); visu_config_file_entry_setVersion(resourceEntry, 3.7f); visu_config_file_addExportFunction(VISU_CONFIG_FILE_PARAMETER, exportParameters); return TRUE; } gboolean bigdftplugInitGtk() { DBG_fprintf(stderr, "BigDFT: init Gtk stuff.\n"); panelBigDFT = visu_ui_panel_newWithIconFromPath("Panel_BigDFT", _("BigDFT settings"), "BigDFT", "stock-bigdft_20.png"); visu_ui_panel_setDockable(VISU_UI_PANEL(panelBigDFT), TRUE); visu_ui_panel_attach(VISU_UI_PANEL(panelBigDFT), visu_ui_panel_class_getCommandPanel()); g_signal_connect(G_OBJECT(panelBigDFT), "page-entered", G_CALLBACK(onPanelEnter), (gpointer)0); g_signal_add_emission_hook(g_signal_lookup("validate", VISU_UI_TYPE_FIELD_CHOOSER), 0, onFieldChooserHook, (gpointer)0, (GDestroyNotify)0); return TRUE; } const char* bigdftplugGet_description() { return BIGDFT_DESCRIPTION; } const char* bigdftplugGet_authors() { return BIGDFT_AUTHORS; } const char* bigdftplugGet_icon() { return iconPath; } static gboolean bigdftTestWaveFile(const gchar *filename) { g_return_val_if_fail(filename, FALSE); return bigdft_read_wave_descr(filename, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); } static void initialisePanel(VisuUiPanel *panel) { GtkWidget *vbox, *hbox, *wd, *ct, *vbox2, *ntbk; VisuData *dataObj; GArray *radii; guint *radiiStatus; guint nEle; BigDFT_Wf *wf; g_return_if_fail(!isPanelInitialised); dataObj = visu_ui_panel_getData(panel); if (dataObj) { radii = (GArray*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_radii"); radiiStatus = (guint*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_radiiStatus"); nEle = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(dataObj), "BigDFT_ntypes")); wf = (BigDFT_Wf*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_wf"); } else { radii = (GArray*)0; radiiStatus = (guint*)0; nEle = 0; wf = (BigDFT_Wf*)0; } vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(panel), vbox); wd = gtk_label_new(_("BigDFT specific parameters")); gtk_label_set_use_markup(GTK_LABEL(wd), TRUE); gtk_misc_set_alignment(GTK_MISC(wd), 0., 0.5); gtk_widget_set_name(wd, "label_head"); gtk_box_pack_start(GTK_BOX(vbox), wd, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 3); wd = gtk_check_button_new_with_mnemonic(_("use BigDFT to load xyz and ASCII files")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wd), useLoadWithGrid); g_signal_connect(G_OBJECT(wd), "toggled", G_CALLBACK(onToggleLoad), GINT_TO_POINTER(0)); gtk_box_pack_start(GTK_BOX(hbox), wd, TRUE, TRUE, 0); /* Hgrid and ixc line. */ hbox = gtk_hbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); wd = gtk_label_new(_("hgrids:")); gtk_misc_set_alignment(GTK_MISC(wd), 1., 0.5); gtk_box_pack_start(GTK_BOX(hbox), wd, TRUE, TRUE, 0); entryHgrid[0] = visu_ui_numerical_entry_new(GET_OPT_DBL(fmtWvl, "hx")); gtk_entry_set_width_chars(GTK_ENTRY(entryHgrid[0]), 8); g_signal_connect(G_OBJECT(entryHgrid[0]), "value-changed", G_CALLBACK(onHgrid), GINT_TO_POINTER(0)); gtk_box_pack_start(GTK_BOX(hbox), entryHgrid[0], FALSE, FALSE, 0); entryHgrid[1] = visu_ui_numerical_entry_new(GET_OPT_DBL(fmtWvl, "hy")); gtk_entry_set_width_chars(GTK_ENTRY(entryHgrid[1]), 8); g_signal_connect(G_OBJECT(entryHgrid[1]), "value-changed", G_CALLBACK(onHgrid), GINT_TO_POINTER(1)); gtk_box_pack_start(GTK_BOX(hbox), entryHgrid[1], FALSE, FALSE, 0); entryHgrid[2] = visu_ui_numerical_entry_new(GET_OPT_DBL(fmtWvl, "hz")); gtk_entry_set_width_chars(GTK_ENTRY(entryHgrid[2]), 8); g_signal_connect(G_OBJECT(entryHgrid[2]), "value-changed", G_CALLBACK(onHgrid), GINT_TO_POINTER(2)); gtk_box_pack_start(GTK_BOX(hbox), entryHgrid[2], FALSE, FALSE, 0); wd = gtk_label_new(_("ixc:")); gtk_misc_set_alignment(GTK_MISC(wd), 1., 0.5); gtk_box_pack_start(GTK_BOX(hbox), wd, TRUE, TRUE, 0); entryIxc = visu_ui_numerical_entry_new(GET_OPT_INT(fmtWvl, "ixc")); gtk_entry_set_width_chars(GTK_ENTRY(entryIxc), 6); g_signal_connect(G_OBJECT(entryIxc), "value-changed", G_CALLBACK(onIxc), (gpointer)0); gtk_box_pack_start(GTK_BOX(hbox), entryIxc, FALSE, FALSE, 0); /* The coarse grid parameters. */ hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); wd = gtk_check_button_new_with_mnemonic(_("show _coarse grid")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wd), useCGrid); g_signal_connect(G_OBJECT(wd), "toggled", G_CALLBACK(onToggleGrid), GINT_TO_POINTER(0)); gtk_box_pack_start(GTK_BOX(hbox), wd, TRUE, TRUE, 0); lblCGrid = gtk_label_new(""); gtk_box_pack_end(GTK_BOX(hbox), lblCGrid, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); wd = gtk_label_new(_("radius of ele.")); gtk_misc_set_alignment(GTK_MISC(wd), 1., 0.5); gtk_box_pack_start(GTK_BOX(hbox), wd, TRUE, TRUE, 0); cbRadEle[0] = visu_ui_element_combobox_new(FALSE, FALSE, (const gchar*)0); g_signal_connect(G_OBJECT(cbRadEle[0]), "changed", G_CALLBACK(onEleChanged), GINT_TO_POINTER(0)); gtk_box_pack_start(GTK_BOX(hbox), cbRadEle[0], FALSE, FALSE, 0); if (radii && radiiStatus) { entryRadius[0] = visu_ui_numerical_entry_new(g_array_index(radii, double, 0)); gtk_entry_set_icon_from_stock(GTK_ENTRY(entryRadius[0]), GTK_ENTRY_ICON_SECONDARY, radiiIcons[radiiStatus[0]]); } else entryRadius[0] = visu_ui_numerical_entry_new(-1.); gtk_entry_set_width_chars(GTK_ENTRY(entryRadius[0]), 10); g_signal_connect(G_OBJECT(entryRadius[0]), "value-changed", G_CALLBACK(onRadius), GINT_TO_POINTER(0)); gtk_box_pack_start(GTK_BOX(hbox), entryRadius[0], FALSE, FALSE, 0); wd = gtk_label_new("\303\227 (crmult:"); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); entryCrmult = visu_ui_numerical_entry_new(GET_OPT_DBL(fmtWvl, "crmult")); gtk_entry_set_width_chars(GTK_ENTRY(entryCrmult), 3); g_signal_connect(G_OBJECT(entryCrmult), "value-changed", G_CALLBACK(onRmult), GINT_TO_POINTER(0)); gtk_box_pack_start(GTK_BOX(hbox), entryCrmult, FALSE, FALSE, 0); wd = gtk_label_new(")"); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); /* The fine grid parameters. */ hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); wd = gtk_check_button_new_with_mnemonic(_("show _fine grid")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wd), useFGrid); g_signal_connect(G_OBJECT(wd), "toggled", G_CALLBACK(onToggleGrid), GINT_TO_POINTER(1)); gtk_box_pack_start(GTK_BOX(hbox), wd, TRUE, TRUE, 0); lblFGrid = gtk_label_new(""); gtk_box_pack_end(GTK_BOX(hbox), lblFGrid, FALSE, FALSE, 0); updateGridLabels(visu_ui_panel_getData(panel)); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); wd = gtk_label_new(_("radius of ele.")); gtk_misc_set_alignment(GTK_MISC(wd), 1., 0.5); gtk_box_pack_start(GTK_BOX(hbox), wd, TRUE, TRUE, 0); cbRadEle[1] = visu_ui_element_combobox_new(FALSE, FALSE, (const gchar*)0); g_signal_connect(G_OBJECT(cbRadEle[1]), "changed", G_CALLBACK(onEleChanged), GINT_TO_POINTER(1)); gtk_box_pack_start(GTK_BOX(hbox), cbRadEle[1], FALSE, FALSE, 0); if (radii && radiiStatus) { entryRadius[1] = visu_ui_numerical_entry_new(g_array_index(radii, double, nEle)); gtk_entry_set_icon_from_stock(GTK_ENTRY(entryRadius[1]), GTK_ENTRY_ICON_SECONDARY, radiiIcons[radiiStatus[nEle]]); } else entryRadius[1] = visu_ui_numerical_entry_new(-1.); gtk_entry_set_width_chars(GTK_ENTRY(entryRadius[1]), 10); g_signal_connect(G_OBJECT(entryRadius[1]), "value-changed", G_CALLBACK(onRadius), GINT_TO_POINTER(1)); gtk_box_pack_start(GTK_BOX(hbox), entryRadius[1], FALSE, FALSE, 0); wd = gtk_label_new("\303\227 (frmult:"); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); entryFrmult = visu_ui_numerical_entry_new(GET_OPT_DBL(fmtWvl, "frmult")); gtk_entry_set_width_chars(GTK_ENTRY(entryFrmult), 3); g_signal_connect(G_OBJECT(entryFrmult), "value-changed", G_CALLBACK(onRmult), GINT_TO_POINTER(1)); gtk_box_pack_start(GTK_BOX(hbox), entryFrmult, FALSE, FALSE, 0); wd = gtk_label_new(")"); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); wd = gtk_label_new("Powered by BigDFT " BIGDFT_STRING_VERSION ""); gtk_misc_set_alignment(GTK_MISC(wd), 1., 0.5); gtk_label_set_use_markup(GTK_LABEL(wd), TRUE); gtk_box_pack_end(GTK_BOX(vbox), wd, FALSE, FALSE, 0); /* The BigDFT tab. */ ntbk = gtk_notebook_new(); gtk_box_pack_start(GTK_BOX(vbox), ntbk, TRUE, TRUE, 0); /* The memory estimation. */ vbox2 = gtk_vbox_new(FALSE, 2); gtk_notebook_append_page(GTK_NOTEBOOK(ntbk), vbox2, gtk_label_new(_("Memory estimation"))); hbox = gtk_hbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 0); wd = gtk_label_new(_("Memory estimation for")); gtk_misc_set_alignment(GTK_MISC(wd), 0., 0.5); gtk_box_pack_start(GTK_BOX(hbox), wd, TRUE, TRUE, 0); wd = gtk_spin_button_new_with_range(1, 4096, 1); g_signal_connect(G_OBJECT(wd), "value-changed", G_CALLBACK(onNproc), (gpointer)0); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); wd = gtk_label_new(_("core(s)")); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); ct = gtk_scrolled_window_new((GtkAdjustment*)0, (GtkAdjustment*)0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ct), GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(ct), GTK_SHADOW_ETCHED_IN); gtk_box_pack_start(GTK_BOX(vbox2), ct, TRUE, TRUE, 0); wd = gtk_text_view_new_with_buffer(bufMemory); gtk_text_view_set_editable(GTK_TEXT_VIEW(wd), FALSE); gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(wd), FALSE); gtk_container_add(GTK_CONTAINER(ct), wd); /* The system tab. */ vbox2 = bdft_system_tab((wf)?wf->lzd:NULL); gtk_notebook_append_page(GTK_NOTEBOOK(ntbk), vbox2, gtk_label_new(_("Basis set"))); /* The run tab. */ vbox2 = bdft_run_tab(nEle, wf); gtk_notebook_append_page(GTK_NOTEBOOK(ntbk), vbox2, gtk_label_new(_("Running BigDFT"))); gtk_widget_show_all(vbox); isPanelInitialised = TRUE; } static void onPanelEnter(VisuUiPanel *panel, gpointer data _U_) { DBG_fprintf(stderr, "Panel BigDFT: caught the 'page-entered' signal %d.\n", isPanelInitialised); if (!isPanelInitialised) initialisePanel(panel); } static gboolean loadGrids(gpointer data) { VisuData *dataObj; VisuGlView *view; GArray *grid; const gchar *gridNames[] = {"BigDFT_coarse_grid", "BigDFT_fine_grid"}; const gchar *eleNames[] = {"g", "G"}; guint iGrid = GPOINTER_TO_INT(data); gboolean* usage[] = {&useCGrid, &useFGrid}; dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelBigDFT)); view = visu_ui_panel_getView(VISU_UI_PANEL(panelBigDFT)); if (!dataObj || !view) return FALSE; DBG_fprintf(stderr, "Panel BigDFT: load grid for object %p.\n", (gpointer)dataObj); grid = (GArray*)g_object_get_data(G_OBJECT(dataObj), gridNames[iGrid]); bigdft_show_grid(dataObj, (*(usage[iGrid]))?grid:(GArray*)0, eleNames[iGrid], 0); VISU_REDRAW_ADD; return FALSE; } static void onToggleGrid(GtkToggleButton *toggle, gpointer data) { gboolean* usage[] = {&useCGrid, &useFGrid}; guint iGrid = GPOINTER_TO_INT(data); DBG_fprintf(stderr, "Panel BigDFT: toggle grid.\n"); *(usage[iGrid]) = gtk_toggle_button_get_active(toggle); g_idle_add(loadGrids, data); } static gboolean bigdftDensityLoad(VisuScalarFieldMethod *meth, const gchar *filename, GList **fieldList, GError **error) { int norbu, norbd, nkpt, nspinor, iorbp; int iorbf, ispinf, ikptf, ispinorf; int ntot, i, iorb, ispin, ikpt, ispinor; guint n[3]; VisuScalarField *field; ToolOption *opt; double h[3]; double box[3][3]; double *data; f90_pointer_double_4D *psiscf; GArray *wrap; VisuBox *boxObj; g_return_val_if_fail(filename, FALSE); g_return_val_if_fail(*fieldList == (GList*)0, FALSE); g_return_val_if_fail(error && (*error == (GError*)0), FALSE); DBG_fprintf(stderr, "BigDFT: test file '%s' as a BigDFT wavefunction file.\n", filename); if (!bigdft_read_wave_descr(filename, &norbu, &norbd, &nkpt, &nspinor, &iorbf, &ispinf, &ikptf, &ispinorf)) /* The file is not a BigDFT file. */ return FALSE; /* Get orbital from option table if the file contains several. */ if (norbu > 0 || norbd > 0) { iorb = norbu; ispin = 1; ikpt = 1; ispinorf = 0; opt = tool_file_format_getPropertyByName(TOOL_FILE_FORMAT(meth), "i-band"); if (opt) iorb = g_value_get_int(tool_option_getValue(opt)); opt = tool_file_format_getPropertyByName(TOOL_FILE_FORMAT(meth), "i-spin"); if (opt) ispin = g_value_get_int(tool_option_getValue(opt)); opt = tool_file_format_getPropertyByName(TOOL_FILE_FORMAT(meth), "i-kpt"); if (opt) ikpt = g_value_get_int(tool_option_getValue(opt)); ispin = CLAMP(ispin, 1, (norbd > 0)?2:1); iorb = CLAMP(iorb, 1, (ispin == 1)?norbu:norbd); ikpt = CLAMP(ikpt, 1, nkpt); } else { iorb = iorbf; ispin = ispinf; ikpt = ikptf; } /* Build the iorbp value from this. */ iorbp = (ikpt - 1) * (norbu + norbd) + (ispin - 1) * norbu + iorb; /* Special treatment for i-complex. */ opt = tool_file_format_getPropertyByName(TOOL_FILE_FORMAT(meth), "i-complex"); if (opt) ispinor = g_value_get_int(tool_option_getValue(opt)); else ispinor = ispinorf; ispinor = CLAMP(ispinor, 0, nspinor); /* We read the wavefunction. */ psiscf = bigdft_read_wave_to_isf(filename, iorbp, h, (int*)n, &nspinor); if (!psiscf) { g_set_error(error, TOOL_FILE_FORMAT_ERROR, TOOL_FILE_FORMAT_ERROR_FORMAT, _("Can't read wavefunction %d from file '%s'."), iorbp, filename); return TRUE; } /* Choose the real, imag or partial density values. */ ntot = n[0] * n[1] * n[2]; if (ispinor == 0) { data = g_malloc(sizeof(double) * ntot); for (i = 0; i < ntot; i++) data[i] = psiscf->data[i] * psiscf->data[i]; if (nspinor == 2) for (i = 0; i < ntot; i++) data[i] += psiscf->data[i + ntot] * psiscf->data[i + ntot]; } else if (ispinor == 2 && nspinor == 2) data = psiscf->data + ntot; else data = psiscf->data; /* Create the scalar field. */ field = visu_scalar_field_new(filename); if (!field) g_warning("impossible to create a VisuScalarField object."); else { memset(box, 0, sizeof(double) * 9); box[0][0] = h[0] * n[0]; box[1][1] = h[1] * n[1]; box[2][2] = h[2] * n[2]; boxObj = visu_box_new_full(box, VISU_BOX_PERIODIC); visu_boxed_setBox(VISU_BOXED(field), VISU_BOXED(boxObj), FALSE); g_object_unref(boxObj); visu_scalar_field_setGridSize(field, n); DBG_fprintf(stderr, "BigDFT: transfer density into field object.\n"); wrap = g_array_new(FALSE, FALSE, sizeof(double)); wrap->data = (gchar*)data; wrap->len = ntot; visu_scalar_field_setData(field, wrap, TRUE); g_array_free(wrap, FALSE); /* Add options to the field. */ opt = tool_option_new("i-band", _("orbital id"), G_TYPE_INT); g_value_set_int(tool_option_getValue(opt), iorb); visu_scalar_field_addOption(field, opt); opt = tool_option_new("i-spin", _("spin id"), G_TYPE_STRING); if (ispin == 2) g_value_set_string(tool_option_getValue(opt), "down"); else if (ispin == 1 && norbd > 0) g_value_set_string(tool_option_getValue(opt), "up"); else g_value_set_string(tool_option_getValue(opt), "none"); visu_scalar_field_addOption(field, opt); opt = tool_option_new("i-kpt", _("k-point id"), G_TYPE_INT); g_value_set_int(tool_option_getValue(opt), ikpt); visu_scalar_field_addOption(field, opt); opt = tool_option_new("i-complex", _("real/imag or partial density"), G_TYPE_STRING); if (ispinor == 2) g_value_set_string(tool_option_getValue(opt), "imag"); else if (ispinor == 1) g_value_set_string(tool_option_getValue(opt), "real"); else g_value_set_string(tool_option_getValue(opt), "partial density"); visu_scalar_field_addOption(field, opt); *fieldList = g_list_append(*fieldList, (gpointer)field); } if (ispinor == 0) g_free(data); bigdft_free_wave_to_isf(psiscf); *error = (GError*)0; return TRUE; } static gboolean onFieldChooserHook(GSignalInvocationHint *ihint _U_, guint nvalues _U_, const GValue *param_values, gpointer data _U_) { GtkWidget *hbox, *lbl, *sp, *cb; int norbu, norbd, nkpt, nspinor; int iorbf, ispinf, ikptf, ispinorf; gchar *filename; if (g_value_get_object(param_values + 1) != G_OBJECT(fmtBigDFT)) return FALSE; DBG_fprintf(stderr, "BigDFT: hook on wavefunction selection.\n"); filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(g_value_get_object(param_values))); if (!bigdft_read_wave_descr(filename, &norbu, &norbd, &nkpt, &nspinor, &iorbf, &ispinf, &ikptf, &ispinorf)) { g_warning("Can't read file '%s'.", filename); g_free(filename); return TRUE; } g_free(filename); /* Build the widgets. */ hbox = gtk_hbox_new(FALSE, 0); lbl = gtk_label_new(_("Choose orbital:")); gtk_misc_set_alignment(GTK_MISC(lbl), 0., 0.5); gtk_box_pack_start(GTK_BOX(hbox), lbl, TRUE, TRUE, 0); lbl = gtk_label_new(_("band id:")); gtk_box_pack_start(GTK_BOX(hbox), lbl, TRUE, TRUE, 0); gtk_misc_set_alignment(GTK_MISC(lbl), 1., 0.5); if (norbu > 0) sp = gtk_spin_button_new_with_range(1, norbu, 1); else sp = gtk_spin_button_new_with_range(iorbf, iorbf, 1); g_signal_connect(G_OBJECT(sp), "value-changed", G_CALLBACK(onBand), (gpointer)0); gtk_box_pack_start(GTK_BOX(hbox), sp, FALSE, FALSE, 0); lbl = gtk_label_new(_("spin:")); gtk_misc_set_alignment(GTK_MISC(lbl), 1., 0.5); gtk_box_pack_start(GTK_BOX(hbox), lbl, TRUE, TRUE, 0); cb = gtk_combo_box_text_new(); if ((norbu > 0 || norbd > 0) && norbu == norbd) gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(cb), _("none")); else { gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(cb), _("up")); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(cb), _("down")); } gtk_combo_box_set_active(GTK_COMBO_BOX(cb), ispinf - 1); g_signal_connect(G_OBJECT(cb), "changed", G_CALLBACK(onSpin), (gpointer)sp); g_object_set_data(G_OBJECT(cb), "norbu", GINT_TO_POINTER(norbu)); g_object_set_data(G_OBJECT(cb), "norbd", GINT_TO_POINTER(norbd)); gtk_box_pack_start(GTK_BOX(hbox), cb, FALSE, FALSE, 0); lbl = gtk_label_new(_("k-point:")); gtk_misc_set_alignment(GTK_MISC(lbl), 1., 0.5); gtk_box_pack_start(GTK_BOX(hbox), lbl, TRUE, TRUE, 0); if (nkpt > 0) sp = gtk_spin_button_new_with_range(1, nkpt, 1); else sp = gtk_spin_button_new_with_range(ikptf, ikptf, 1); g_signal_connect(G_OBJECT(sp), "value-changed", G_CALLBACK(onKpt), (gpointer)0); gtk_box_pack_start(GTK_BOX(hbox), sp, FALSE, FALSE, 0); lbl = gtk_label_new(_("representation:")); gtk_misc_set_alignment(GTK_MISC(lbl), 1., 0.5); gtk_box_pack_start(GTK_BOX(hbox), lbl, TRUE, TRUE, 0); cb = gtk_combo_box_text_new(); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(cb), _("partial density")); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(cb), _("real part")); if (nspinor > 1) gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(cb), _("imaginary part")); g_signal_connect(G_OBJECT(cb), "changed", G_CALLBACK(onSpinor), (gpointer)0); gtk_combo_box_set_active(GTK_COMBO_BOX(cb), ispinorf); gtk_box_pack_start(GTK_BOX(hbox), cb, FALSE, FALSE, 0); visu_ui_field_chooser_setOptions(VISU_UI_FIELD_CHOOSER(g_value_get_object(param_values)), hbox); return TRUE; } static void onBand(GtkSpinButton *spin, gpointer data _U_) { tool_file_format_addPropertyInt(TOOL_FILE_FORMAT(fmtBigDFT), "i-band", _("orbital id"), (int)gtk_spin_button_get_value(spin)); } static void onKpt(GtkSpinButton *spin, gpointer data _U_) { tool_file_format_addPropertyInt(TOOL_FILE_FORMAT(fmtBigDFT), "i-kpt", _("k-point id"), (int)gtk_spin_button_get_value(spin)); } static void onSpin(GtkComboBox *combo, gpointer data) { gint ispin; ispin = gtk_combo_box_get_active(combo) + 1; tool_file_format_addPropertyInt(TOOL_FILE_FORMAT(fmtBigDFT), "i-spin", _("spin id"), ispin); if (ispin == 1) gtk_spin_button_set_range(GTK_SPIN_BUTTON(data), 1, GPOINTER_TO_INT(g_object_get_data(G_OBJECT(combo), "norbu"))); else gtk_spin_button_set_range(GTK_SPIN_BUTTON(data), 1, GPOINTER_TO_INT(g_object_get_data(G_OBJECT(combo), "norbd"))); } static void onSpinor(GtkComboBox *combo, gpointer data _U_) { tool_file_format_addPropertyInt(TOOL_FILE_FORMAT(fmtBigDFT), "i-complex", _("real/imag or partial density"), gtk_combo_box_get_active(combo)); } static void onDataNew(GObject *obj _U_, VisuData *dataObj, gpointer data _U_) { g_signal_connect(G_OBJECT(dataObj), "FilesChanged", G_CALLBACK(onFilesChanged), (gpointer)0); } static void onDataReady(GObject *obj _U_, VisuData *dataObj, gpointer data _U_) { GArray *radii; guint *radiiStatus; guint nEle; gint iEle; BigDFT_Wf *wf; BigDFT_Inputs *in; DBG_fprintf(stderr, "Panel BigDFT: caught 'dataRendered' signal.\n"); if (isPanelInitialised) { updateGridLabels(dataObj); if (dataObj) { radii = (GArray*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_radii"); radiiStatus = (guint*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_radiiStatus"); } else { radii = (GArray*)0; radiiStatus = (guint*)0; } disableCallbacks = TRUE; visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryHgrid[0]), GET_OPT_DBL(fmtWvl, "hx")); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryHgrid[1]), GET_OPT_DBL(fmtWvl, "hy")); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryHgrid[2]), GET_OPT_DBL(fmtWvl, "hz")); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryCrmult), GET_OPT_DBL(fmtWvl, "crmult")); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryFrmult), GET_OPT_DBL(fmtWvl, "frmult")); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryIxc), GET_OPT_INT(fmtWvl, "ixc")); if (radii && radiiStatus) { nEle = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(dataObj), "BigDFT_ntypes")); DBG_fprintf(stderr, "Panel BigDFT: setup radius combo for %d elements.\n", nEle); iEle = gtk_combo_box_get_active(GTK_COMBO_BOX(cbRadEle[0])); DBG_fprintf(stderr, " | %d element (coarse).\n", iEle); if (iEle >= 0) { visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryRadius[0]), g_array_index(radii, double, iEle)); gtk_entry_set_icon_from_stock(GTK_ENTRY(entryRadius[0]), GTK_ENTRY_ICON_SECONDARY, radiiIcons[radiiStatus[iEle]]); } iEle = gtk_combo_box_get_active(GTK_COMBO_BOX(cbRadEle[1])); DBG_fprintf(stderr, " | %d element (fine).\n", iEle); if (iEle >= 0) { visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryRadius[1]), g_array_index(radii, double, nEle + iEle)); gtk_entry_set_icon_from_stock(GTK_ENTRY(entryRadius[1]), GTK_ENTRY_ICON_SECONDARY, radiiIcons[radiiStatus[nEle + iEle]]); } } disableCallbacks = FALSE; } if (dataObj) { wf = (BigDFT_Wf*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_wf"); in = (BigDFT_Inputs*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_inputs"); if (wf && in) { /* We create the orbital descriptors here already for memory estimation or later run. */ DBG_fprintf(stderr, "Panel BigDFT: set-up Lzd.\n"); bigdft_wf_define(wf, in, 0, 1); /* We do the memory estimation for this run. */ DBG_fprintf(stderr, "Panel BigDFT: do memory estimation.\n"); update_memory_estimation(dataObj); } } DBG_fprintf(stderr, "Panel BigDFT: 'DataReady' signal OK.\n"); } static void updateGridLabels(VisuData *dataObj) { GArray *grid; guint cgrid, fgrid; gchar *cgridText, *fgridText; DBG_fprintf(stderr, "Panel BigDFT: update grid labels.\n"); cgrid = 0; fgrid = 0; if (dataObj) { grid = (GArray*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_coarse_grid"); cgrid = (grid)?grid->len:0; grid = (GArray*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_fine_grid"); fgrid = (grid)?grid->len:0; } if (cgrid) cgridText = g_strdup_printf(_("%d grid points"), cgrid); else cgridText = g_strdup(_("no grid")); gtk_label_set_text(GTK_LABEL(lblCGrid), cgridText); g_free(cgridText); if (fgrid) fgridText = g_strdup_printf(_("%d grid points"), fgrid); else fgridText = g_strdup(_("no grid")); gtk_label_set_text(GTK_LABEL(lblFGrid), fgridText); g_free(fgridText); } /* Grid related routines. */ void bigdft_show_grid(VisuData *dataObj, GArray *grid, const gchar *gG, guint id) { VisuElement *ele; guint i; GArray *eleArr, *nEleArr; gboolean newEle; gchar *lbl; float rgba_y[4] = {1.000, 0.750, 0.040, 1.000}; float rgba_b[4] = {0.600, 0.600, 1.000, 1.000}; /* We check that gG is not currently used by dataObj. */ lbl = (id)?g_strdup_printf("%%%s_%d", gG, id):g_strdup(gG); DBG_fprintf(stderr, "BigDFT: show/hide grid '%s' with %d elements on object %p.\n", lbl, (grid)?grid->len:0, (gpointer)dataObj); ele = visu_element_retrieveFromName(lbl, &newEle); g_free(lbl); if (newEle) { visu_rendering_atomic_setRadius(ele, (gG[0] == 'g')?0.5:1.); visu_rendering_atomic_setShape(ele, VISU_RENDERING_ATOMIC_POINT); if (!strcmp(gG, "g")) visu_element_setAllRGBValues(ele, rgba_y); else if (!strcmp(gG, "G")) visu_element_setAllRGBValues(ele, rgba_b); else visu_element_setAllRGBValues(ele, (float*)tool_color_new_bright(id - 1)->rgba); } /* Remove possible old gG nodes. */ visu_node_array_removeNodesOfElement(VISU_NODE_ARRAY(dataObj), ele); /* Allocate space for new gG element. */ if (grid && grid->len > 0) { eleArr = g_array_sized_new(FALSE, FALSE, sizeof(VisuElement*), 1); g_array_append_val(eleArr, ele); nEleArr = g_array_sized_new(FALSE, FALSE, sizeof(guint), 1); g_array_append_val(nEleArr, grid->len); visu_node_array_allocate(VISU_NODE_ARRAY(dataObj), eleArr, nEleArr); g_array_free(eleArr, TRUE); g_array_free(nEleArr, TRUE); /* Add the coordinates. */ for (i = 0; i < grid->len; i++) visu_data_addNodeFromElement(dataObj, ele, ((float*)grid->data) + (3 * i), TRUE, (i == (grid->len - 1))); } } /* Structural loading. */ static gboolean loadBigDFTIn(VisuData *data, const gchar* filename, ToolFileFormat *format, int nSet _U_, GCancellable *cancel _U_, GError **error) { BigDFT_Locreg *glr; BigDFT_Atoms *atoms; BigDFT_Inputs *in; BigDFT_Wf *wf; GArray *eles, *nEle, *gcoord_c, *gcoord_f; double box[6], h[3], crmult, frmult; GArray *radii; guint i, j, k, grid[3], iGrid, nbGrid; VisuElement *ele; float xyz[3], vect[3]; gboolean *cgrid, *fgrid; guint *radiiStatus; int ixc; gchar *dirname, *cwd; gboolean newAt; VisuBox *boxObj; /* gboolean valid; */ /* BigDFT_LocregIter iter; */ g_return_val_if_fail(error && *error == (GError*)0, FALSE); g_return_val_if_fail(data && filename, FALSE); if (!useLoadWithGrid) { DBG_fprintf(stderr, "BigDFT: format disabled.\n"); return FALSE; } /* We change the current working dir to allow BigDFT to look for input files and pseudos. */ dirname = g_path_get_dirname(filename); cwd = g_get_current_dir(); g_chdir(dirname); g_free(dirname); /* Get the input parameters. */ in = g_object_get_data(G_OBJECT(data), "BigDFT_inputs"); if (!in) { g_chdir(cwd); g_free(cwd); return FALSE; } /* See If we have a atoms in cache. */ newAt = FALSE; wf = (BigDFT_Wf*)g_object_get_data(G_OBJECT(data), "BigDFT_wf"); if (!wf) { wf = bigdft_wf_new(in->inputPsiId); if (!bigdft_atoms_set_structure_from_file(BIGDFT_ATOMS(wf->lzd), filename)) { DBG_fprintf(stderr, "BigDFT: '%s' is not a BigDFT file.\n", filename); g_object_unref(G_OBJECT(wf)); wf = (BigDFT_Wf*)0; } else g_object_set_data_full(G_OBJECT(data), "BigDFT_wf", wf, (GDestroyNotify)g_object_unref); newAt = TRUE; } if (!wf) { g_chdir(cwd); g_free(cwd); return FALSE; } atoms = BIGDFT_ATOMS(wf->lzd); /* We get the symmetries and the atom displacements, if any. */ if (newAt) { bigdft_atoms_set_displacement(atoms, in->randdis); bigdft_atoms_set_symmetries(atoms, !in->disableSym, -1., in->elecfield); bigdft_inputs_parse_additional(in, atoms); } /* We get some input parameters. */ ixc = GET_OPT_INT(format, "ixc"); h[0] = GET_OPT_DBL(format, "hx"); h[1] = GET_OPT_DBL(format, "hy"); h[2] = GET_OPT_DBL(format, "hz"); crmult = GET_OPT_DBL(format, "crmult"); frmult = GET_OPT_DBL(format, "frmult"); /* We set up the population. */ eles = g_array_sized_new(FALSE, FALSE, sizeof(VisuElement*), atoms->ntypes); for (i = 0; i < atoms->ntypes; i++) { ele = visu_element_retrieveFromName(atoms->atomnames[i], (gboolean*)0); g_array_insert_val(eles, i, ele); } nEle = g_array_sized_new(FALSE, TRUE, sizeof(guint), atoms->ntypes); g_array_set_size(nEle, atoms->ntypes); for (i = 0; i < atoms->nat; i++) *(&g_array_index(nEle, guint, atoms->iatype[i] - 1)) += 1; visu_node_array_allocate(VISU_NODE_ARRAY(data), eles, nEle); g_array_free(eles, TRUE); g_array_free(nEle, TRUE); /* Radii may already been set for this dataObj. */ radii = (GArray*)g_object_get_data(G_OBJECT(data), "BigDFT_radii"); /* We compute the localisation region and the new coordinates. */ if (newAt) bigdft_atoms_set_psp(atoms, ixc, in->nspin, (const gchar*)0); if (!radii) { radii = bigdft_atoms_get_radii(atoms, crmult, frmult, 0.); g_array_ref(radii); g_object_set_data_full(G_OBJECT(data), "BigDFT_radii", radii, (GDestroyNotify)g_array_unref); radiiStatus = g_malloc0(sizeof(guint) * atoms->ntypes * 3); for (i = 0; i < atoms->ntypes; i++) { radiiStatus[i] = (g_array_index(radii, double, i) == atoms->radii_cf[i])? RADII_VALUE_FILE:RADII_VALUE_COMPUTED; radiiStatus[atoms->ntypes + i] = (g_array_index(radii, double, atoms->ntypes + i) == atoms->radii_cf[atoms->ntypes + i])? RADII_VALUE_FILE:RADII_VALUE_COMPUTED; } g_object_set_data_full(G_OBJECT(data), "BigDFT_radiiStatus", radiiStatus, g_free); g_object_set_data(G_OBJECT(data), "BigDFT_ntypes", GINT_TO_POINTER(atoms->ntypes)); } bigdft_locreg_set_radii(BIGDFT_LOCREG(wf->lzd), radii); bigdft_locreg_set_size(BIGDFT_LOCREG(wf->lzd), h, crmult, frmult); bigdft_lzd_init_d(wf->lzd); bigdft_lzd_set_irreductible_zone(wf->lzd, in->nspin); bigdft_locreg_init_wfd(BIGDFT_LOCREG(wf->lzd)); glr = BIGDFT_LOCREG(wf->lzd); /* We have finished here with BigDFT, we set back the current working dir. */ g_chdir(cwd); g_free(cwd); for (i = 0; i < atoms->nat; i++) { xyz[0] = atoms->rxyz.data[3 * i + 0]; xyz[1] = atoms->rxyz.data[3 * i + 1]; xyz[2] = atoms->rxyz.data[3 * i + 2]; visu_data_addNodeFromIndex(data, atoms->iatype[i] - 1, xyz, FALSE, FALSE); } /* We finish with the box geometry. */ box[0] = atoms->alat[0]; box[1] = 0.; box[2] = atoms->alat[1]; box[3] = 0.; box[4] = 0.; box[5] = atoms->alat[2]; switch (atoms->geocode) { case 'P': boxObj = visu_box_new(box, VISU_BOX_PERIODIC); grid[0] = glr->n[0] + 1; grid[1] = glr->n[1] + 1; grid[2] = glr->n[2] + 1; break; case 'S': boxObj = visu_box_new(box, VISU_BOX_SURFACE_ZX); grid[0] = glr->n[0] + 1; grid[1] = glr->n[1]; grid[2] = glr->n[2] + 1; break; case 'F': boxObj = visu_box_new(box, VISU_BOX_FREE); grid[0] = glr->n[0]; grid[1] = glr->n[1]; grid[2] = glr->n[2]; break; default: g_warning("Unknown geocode."); boxObj = visu_box_new(box, VISU_BOX_PERIODIC); grid[0] = glr->n[0] + 1; grid[1] = glr->n[1] + 1; grid[2] = glr->n[2] + 1; } visu_boxed_setBox(VISU_BOXED(data), VISU_BOXED(boxObj), FALSE); g_object_unref(boxObj); visu_box_setMargin(boxObj, visu_node_array_getMaxElementSize(VISU_NODE_ARRAY(data)) + visu_data_getAllNodeExtens(data, boxObj), TRUE); visu_box_setUnit(boxObj, TOOL_UNITS_BOHR); /* Update h values with the possibly computed values of glr. */ SET_OPT_DBL(format, "hx", glr->h[0]); SET_OPT_DBL(format, "hy", glr->h[1]); SET_OPT_DBL(format, "hz", glr->h[2]); /* Additional data. */ nbGrid = (glr->n[0] + 1) * (glr->n[1] + 1) * (glr->n[2] + 1); cgrid = bigdft_locreg_get_grid(glr, GRID_COARSE); gcoord_c = g_array_sized_new(FALSE, FALSE, sizeof(gfloat) * 3, nbGrid); iGrid = 0; for (k = 0; k <= glr->n[2]; k++) for (j = 0; j <= glr->n[1]; j++) for (i = 0; i <= glr->n[0]; i++) { if (cgrid[iGrid] != 0) { vect[0] = (float)i / (float)grid[0]; vect[1] = (float)j / (float)grid[1]; vect[2] = (float)k / (float)grid[2]; g_array_append_val(gcoord_c, vect); } iGrid += 1; } /* gcoord_c = g_array_sized_new(FALSE, FALSE, sizeof(gfloat) * 3, glr->nseg_f); */ /* for (valid = bigdft_locreg_iter_new(glr, &iter, GRID_FINE); valid; */ /* valid = bigdft_locreg_iter_next(&iter)) */ /* { */ /* vect[0] = iter.x0; */ /* vect[1] = iter.y; */ /* vect[2] = iter.z; */ /* g_array_append_val(gcoord_c, vect); */ /* if (iter.x1 != iter.x0) */ /* { */ /* vect[0] = iter.x1; */ /* vect[1] = iter.y; */ /* vect[2] = iter.z; */ /* g_array_append_val(gcoord_c, vect); */ /* } */ /* } */ DBG_fprintf(stderr, "BigDFT: have %d coarse grid points.\n", gcoord_c->len); g_object_set_data_full(G_OBJECT(data), "BigDFT_coarse_grid", (gpointer)gcoord_c, (GDestroyNotify)g_array_unref); g_free(cgrid); if (gcoord_c->len > 0 && useCGrid) bigdft_show_grid(data, gcoord_c, "g", 0); fgrid = bigdft_locreg_get_grid(glr, GRID_FINE); gcoord_f = g_array_sized_new(FALSE, FALSE, sizeof(gfloat) * 3, nbGrid); iGrid = 0; for (k = 0; k <= glr->n[2]; k++) for (j = 0; j <= glr->n[1]; j++) for (i = 0; i <= glr->n[0]; i++) { if (fgrid[iGrid] != 0) { vect[0] = (float)i / (float)grid[0]; vect[1] = (float)j / (float)grid[1]; vect[2] = (float)k / (float)grid[2]; g_array_append_val(gcoord_f, vect); } iGrid += 1; } DBG_fprintf(stderr, "BigDFT: have %d fine grid points.\n", gcoord_f->len); if (gcoord_f->len > 0) g_object_set_data_full(G_OBJECT(data), "BigDFT_fine_grid", (gpointer)gcoord_f, (GDestroyNotify)g_array_unref); else g_array_free(gcoord_f, TRUE); if (gcoord_f->len > 0 && useFGrid) bigdft_show_grid(data, gcoord_f, "G", 0); g_free(fgrid); /* Possible label. */ visu_extra_node_addLabel(data); for (i = 0; i < atoms->nat; i++) visu_extra_node_setLabel(data, i, bigdft_atoms_get_extra_as_label(BIGDFT_ATOMS(wf->lzd), i)); return TRUE; } static void onToggleLoad(GtkToggleButton *toggle, gpointer data _U_) { VisuData *dataObj; useLoadWithGrid = gtk_toggle_button_get_active(toggle); dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelBigDFT)); if (!dataObj) return; visu_ui_rendering_window_reload(visu_ui_main_class_getDefaultRendering()); } static void onHgrid(VisuUiNumericalEntry *entry, gdouble old_value _U_, gpointer data) { gdouble value; const gchar *hgrid[] = {"hx", "hy", "hz"}; VisuBox *boxObj; if (disableCallbacks) return; boxObj = visu_boxed_getBox(visu_ui_panel_getFocused(VISU_UI_PANEL(panelBigDFT))); if (!boxObj) return; value = CLAMP(visu_ui_numerical_entry_getValue(entry), 0.1, 1.); disableCallbacks = TRUE; if (visu_box_getBoundary(boxObj) == VISU_BOX_FREE) { visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryHgrid[0]), value); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryHgrid[1]), value); visu_ui_numerical_entry_setValue(VISU_UI_NUMERICAL_ENTRY(entryHgrid[2]), value); } else visu_ui_numerical_entry_setValue(entry, value); disableCallbacks = FALSE; if (visu_box_getBoundary(boxObj) == VISU_BOX_FREE) { SET_OPT_DBL(fmtWvl, hgrid[0], value); SET_OPT_DBL(fmtWvl, hgrid[1], value); SET_OPT_DBL(fmtWvl, hgrid[2], value); } else SET_OPT_DBL(fmtWvl, hgrid[GPOINTER_TO_INT(data)], value); if (useLoadWithGrid) visu_ui_rendering_window_reload(visu_ui_main_class_getDefaultRendering()); } static void onRmult(VisuUiNumericalEntry *entry, gdouble old_value _U_, gpointer data) { gdouble value; const gchar *mult[] = {"crmult", "frmult"}; if (disableCallbacks) return; value = CLAMP(visu_ui_numerical_entry_getValue(entry), 1., 20.); disableCallbacks = TRUE; visu_ui_numerical_entry_setValue(entry, value); disableCallbacks = FALSE; SET_OPT_DBL(fmtWvl, mult[GPOINTER_TO_INT(data)], value); if (useLoadWithGrid && visu_ui_panel_getData(VISU_UI_PANEL(panelBigDFT))) visu_ui_rendering_window_reload(visu_ui_main_class_getDefaultRendering()); } static void onRadius(VisuUiNumericalEntry *entry, gdouble old_value _U_, gpointer data) { GArray *radii; double value; guint nEle, iEle; guint *radiiStatus; VisuData *dataObj; if (disableCallbacks) return; dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelBigDFT)); value = CLAMP(visu_ui_numerical_entry_getValue(entry), 0., 15.); disableCallbacks = TRUE; visu_ui_numerical_entry_setValue(entry, value); disableCallbacks = FALSE; if (!dataObj) return; radii = (GArray*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_radii"); radiiStatus = (guint*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_radiiStatus"); g_return_if_fail(radii && radiiStatus); nEle = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(dataObj), "BigDFT_ntypes")); iEle = gtk_combo_box_get_active(GTK_COMBO_BOX(cbRadEle[GPOINTER_TO_INT(data)])); g_array_insert_val(radii, nEle * GPOINTER_TO_INT(data) + iEle, value); radiiStatus[nEle * GPOINTER_TO_INT(data) + iEle] = RADII_VALUE_EDITED; gtk_entry_set_icon_from_stock(GTK_ENTRY(entry), GTK_ENTRY_ICON_SECONDARY, radiiIcons[RADII_VALUE_EDITED]); if (useLoadWithGrid) visu_ui_rendering_window_reload(visu_ui_main_class_getDefaultRendering()); } static void onEleChanged(GtkComboBox *combo, gpointer data) { GArray *radii; guint nEle, iEle; guint *radiiStatus; VisuData *dataObj; disableCallbacks = TRUE; dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelBigDFT)); if (!dataObj) return; radii = (GArray*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_radii"); radiiStatus = (guint*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_radiiStatus"); if (!radii || !radiiStatus) return; nEle = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(dataObj), "BigDFT_ntypes")); iEle = gtk_combo_box_get_active(combo); if (iEle >= nEle) gtk_combo_box_set_active(combo, nEle - 1); else { visu_ui_numerical_entry_setValue (VISU_UI_NUMERICAL_ENTRY(entryRadius[GPOINTER_TO_INT(data)]), g_array_index(radii, double, nEle * GPOINTER_TO_INT(data) + iEle)); gtk_entry_set_icon_from_stock(GTK_ENTRY(entryRadius[GPOINTER_TO_INT(data)]), GTK_ENTRY_ICON_SECONDARY, radiiIcons[radiiStatus[nEle * GPOINTER_TO_INT(data) + iEle]]); } disableCallbacks = FALSE; } static void onIxc(VisuUiNumericalEntry *entry, gdouble old_value _U_, gpointer data _U_) { if (disableCallbacks) return; SET_OPT_INT(fmtWvl, "ixc", visu_ui_numerical_entry_getValue(entry)); if (useLoadWithGrid && visu_ui_panel_getData(VISU_UI_PANEL(panelBigDFT))) visu_ui_rendering_window_reload(visu_ui_main_class_getDefaultRendering()); } static void onFilesChanged(VisuData *dataObj, guint kind, gpointer data _U_) { BigDFT_Inputs *in; gchar *basename, *ptr, *dirname, *cwd; DBG_fprintf(stderr, "Panel BigDFT: test input from (%d) '%s'.\n", kind, visu_data_getFile(dataObj, 0, (ToolFileFormat**)0)); if (kind != 0 || !useLoadWithGrid || !tool_file_format_match(fmtWvl, visu_data_getFile(dataObj, 0, (ToolFileFormat**)0))) return; /* We change the current working dir to allow BigDFT to look for input files and pseudos. */ dirname = g_path_get_dirname(visu_data_getFile(dataObj, 0, (ToolFileFormat**)0)); cwd = g_get_current_dir(); g_chdir(dirname); g_free(dirname); basename = g_path_get_basename(visu_data_getFile(dataObj, 0, (ToolFileFormat**)0)); ptr = strrchr(basename, '.'); if (ptr) *ptr = '\0'; DBG_fprintf(stderr, "Panel BigDFT: read input files for '%s'.\n", basename); if (strcmp(basename, "posinp")) in = bigdft_inputs_new(basename); else in = bigdft_inputs_new((const gchar*)0); g_free(basename); /* We store the input parameters for future use with this dataObj. */ g_object_set_data_full(G_OBJECT(dataObj), "BigDFT_inputs", in, (GDestroyNotify)bigdft_inputs_free); if (in->files & BIGDFT_INPUTS_DFT) { SET_OPT_DBL(fmtWvl, "hx", in->h[0]); SET_OPT_DBL(fmtWvl, "hy", in->h[1]); SET_OPT_DBL(fmtWvl, "hz", in->h[2]); SET_OPT_DBL(fmtWvl, "crmult", in->crmult); SET_OPT_DBL(fmtWvl, "frmult", in->frmult); SET_OPT_INT(fmtWvl, "ixc", in->ixc); } /* We have finished here with BigDFT, we set back the current working dir. */ g_chdir(cwd); g_free(cwd); } static void onNproc(GtkSpinButton *spin, gpointer data _U_) { SET_OPT_INT(fmtWvl, "nproc", gtk_spin_button_get_value(spin)); update_memory_estimation(visu_ui_panel_getData(VISU_UI_PANEL(panelBigDFT))); } static void update_memory_estimation(VisuData *data) { BigDFT_Inputs *in; BigDFT_Wf *wf; BigDFT_Proj *proj; double frmult; int out_pipe[2], stdout_fileno_old; if (!data) return; wf = (BigDFT_Wf*)g_object_get_data(G_OBJECT(data), "BigDFT_wf"); in = (BigDFT_Inputs*)g_object_get_data(G_OBJECT(data), "BigDFT_inputs"); if (!in || !wf) return; frmult = GET_OPT_DBL(fmtWvl, "frmult"); proj = bigdft_proj_new(BIGDFT_LOCREG(wf->lzd), BIGDFT_ORBS(wf), frmult); stdout_fileno_old = redirect_init(out_pipe); bigdft_memory_get_peak(GET_OPT_INT(fmtWvl, "nproc"), BIGDFT_LOCREG(wf->lzd), in, BIGDFT_ORBS(wf), proj); redirect_dump(out_pipe, stdout_fileno_old); bigdft_proj_free(proj); } static int redirect_init(int out_pipe[2]) { int stdout_fileno_old; /* Flush before redirecting. */ fflush(stdout); /* Make a pipe to redirect stdout. */ stdout_fileno_old = dup(STDOUT_FILENO); #ifndef _WIN32 g_return_val_if_fail((pipe(out_pipe) == 0), stdout_fileno_old); dup2(out_pipe[1], STDOUT_FILENO); #endif return stdout_fileno_old; } #define MAX_FORTRAN_OUTPUT 4096 static void redirect_dump(int out_pipe[2], int stdout_fileno_old) { gchar foutput[MAX_FORTRAN_OUTPUT]; ssize_t ncount; long flags; GtkTextIter startIter; /* Flush before reconnecting. */ fflush(stdout); /* Reconnect stdout. */ dup2(stdout_fileno_old, STDOUT_FILENO); #ifndef _WIN32 /* Make the reading pipe non blocking. */ flags = fcntl(out_pipe[0], F_GETFL); flags |= O_NONBLOCK; fcntl(out_pipe[0], F_SETFL, flags); /* Write Fortran output with prefix... */ foutput[0] = '\0'; ncount = read(out_pipe[0], foutput, MAX_FORTRAN_OUTPUT); foutput[ncount] = '\0'; gtk_text_buffer_set_text(bufMemory, "", -1); gtk_text_buffer_get_start_iter(bufMemory, &startIter); gtk_text_buffer_insert_with_tags_by_name(bufMemory, &startIter, foutput, -1, "typewriter", NULL); /* Close the pipes. */ close(out_pipe[0]); close(out_pipe[1]); #endif } static gboolean readUseBigDFT(VisuConfigFileEntry *entry _U_, gchar **lines, int nbLines, int position, VisuData *dataObj _U_, VisuGlView *view _U_, GError **error) { g_return_val_if_fail(nbLines == 1, FALSE); if (!tool_config_file_readBoolean(lines[0], position, &useLoadWithGrid, 1, error)) return FALSE; return TRUE; } static void exportParameters(GString *data, VisuData *dataObj _U_, VisuGlView *view _U_) { g_string_append_printf(data, "# %s\n", DESC_PARAMETER_BIGDFT); g_string_append_printf(data, "%s[bigdft]: %d\n\n", FLAG_PARAMETER_BIGDFT, useLoadWithGrid); } v_sim-3.7.0/lib/plug-ins/bigdft/bigdft_run.c0000644000353400050620000013225512216276544015634 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2011) Adresse mèl : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors: Damien CALISTE, L_Sim laboratory, (2001-2011) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "bigdftplug.h" static GtkWidget *btRun = NULL, *btSCF = NULL; static GtkWidget *btVext, *btDens, *cbOrbsu, *cbOrbsd; #if GTK_MINOR_VERSION > 19 || GTK_MAJOR_VERSION > 2 static GtkWidget *spRun; #endif static gulong sigDens, sigVext; static GtkWidget *cbKpt, *cbWf; enum { LABEL, ACTIVATED, VALUE, N_COLUMNS }; static GtkListStore *orbsd_kpt, *orbsd_spu, *orbsd_spd; typedef struct _StoredWfData { gulong signal; const VisuSurfaces *surf; } StoredWfData; enum { SCF_ITER, SCF_TYPE, SCF_LABEL, SCF_IKPT, SCF_IORB, SCF_ISPIN, SCF_NSPINOR, SCF_EVAL, SCF_OCCUP, SCF_TOL, SCF_MEMORY, SCF_DATA, SCF_OBJECT, SCF_GLR, SCF_N_COLUMNS }; enum { SCF_TYPE_WF, SCF_TYPE_V_EXT, SCF_TYPE_DENSITY, SCF_TYPE_ITER_HAM, SCF_TYPE_ITER_SUB, SCF_TYPE_ITER_WFN }; static GtkTreeStore *scfdata; struct _socketStuff { BigDFT_SignalsClient *client; GCancellable *cancellable; GAsyncQueue *message; BigDFT_Wf *wf; BigDFT_LocalFields *denspot; BigDFT_Energs *energs; BigDFT_OptLoop *optloop; }; /* Local methods. */ static void update_orbsd(const VisuData *dataObj); static void treeGetSCFIter(GtkTreeIter *parent, guint iscf, BigDFT_OptLoop *loop); /* Callbacks. */ static void onRunBigDFT(GtkToggleButton *bt, gpointer data); static void onCheckDens(GtkToggleButton *bt, gpointer data); static void onCheckVext(GtkToggleButton *bt, gpointer data); static void onOrbsdToggled(GtkComboBox *cb, gpointer user_data); static void ptInfos(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data); static void onGetSCF(GtkButton *bt, gpointer data); static gboolean onTreeViewClicked(GtkWidget *widget, GdkEventButton *event, gpointer user_data); static void onVextReady(BigDFT_LocalFields *denspot, gpointer data); static void onDensityReady(BigDFT_LocalFields *denspot, guint iter, gpointer data); static void onIter(BigDFT_OptLoop *optloop, BigDFT_Energs *energs, gpointer data); static void onDone(BigDFT_OptLoop *optloop, BigDFT_Energs *energs, gpointer data); static void onPsiReady(BigDFT_Wf *wf, guint iter, gpointer data); static void onOneWaveReady(BigDFT_Wf *wf, guint iter, GArray *psic, BigDFT_PsiId ipsi, guint ikpt, guint iorb, guint ispin, gpointer data); static void onSocketClose(gpointer data); static void onDataReady(GObject *obj, VisuData *dataObj, gpointer data); void bdft_run_init() { cbKpt = (GtkWidget*)0; cbWf = (GtkWidget*)0; orbsd_kpt = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_UINT); orbsd_spu = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_UINT); orbsd_spd = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_UINT); scfdata = gtk_tree_store_new(SCF_N_COLUMNS, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_DOUBLE, G_TYPE_DOUBLE, G_TYPE_DOUBLE, G_TYPE_UINT, G_TYPE_ARRAY, G_TYPE_OBJECT, G_TYPE_OBJECT); sigDens = 0; sigVext = 0; g_signal_connect(VISU_OBJECT_INSTANCE, "dataRendered", G_CALLBACK(onDataReady), NULL); } static void onDataReady(GObject *obj _U_, VisuData *dataObj, gpointer data _U_) { double *radii; guint *radiiStatus; /* We update the combos. */ DBG_fprintf(stderr, "BigDFT Run: caught 'dataRendered' signal.\n"); update_orbsd(dataObj); gtk_tree_store_clear(scfdata); if (!btRun || !btSCF) return; gtk_widget_set_sensitive(btRun, FALSE); gtk_widget_set_sensitive(btSCF, FALSE); if (dataObj) { radii = (double*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_radii"); radiiStatus = (guint*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_radiiStatus"); } else { radii = (double*)0; radiiStatus = (guint*)0; } if (radii && radiiStatus) gtk_widget_set_sensitive(btRun, TRUE); DBG_fprintf(stderr, "BigDFT run: 'DataReady' signal OK.\n"); } GtkWidget* bdft_run_tab(guint nEle, BigDFT_Wf *wf) { GtkWidget *hbox, *wd, *ct, *vbox2; GtkCellRenderer *render; GtkTreeViewColumn *col; /* Running BigDFT. */ vbox2 = gtk_vbox_new(FALSE, 2); /* The run line. */ hbox = gtk_hbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 0); wd = gtk_combo_box_text_new_with_entry(); gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(wd), "local", _("Run locally")); gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(wd), "localhost", g_get_host_name()); gtk_combo_box_set_active(GTK_COMBO_BOX(wd), 0); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); btRun = gtk_toggle_button_new_with_label(_("Go go go...")); gtk_widget_set_sensitive(btRun, (nEle > 0)); g_signal_connect(G_OBJECT(btRun), "toggled", G_CALLBACK(onRunBigDFT), (gpointer)wd); gtk_box_pack_end(GTK_BOX(hbox), btRun, FALSE, FALSE, 0); #if GTK_MINOR_VERSION > 19 || GTK_MAJOR_VERSION > 2 spRun = gtk_spinner_new(); gtk_widget_set_no_show_all(GTK_WIDGET(spRun), TRUE); gtk_box_pack_end(GTK_BOX(hbox), spRun, FALSE, FALSE, 0); #endif /* The denspot line. */ hbox = gtk_hbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 0); wd = gtk_label_new(_("Rho / V:")); gtk_misc_set_alignment(GTK_MISC(wd), 0., 0.5); gtk_box_pack_start(GTK_BOX(hbox), wd, TRUE, TRUE, 0); btDens = gtk_check_button_new_with_mnemonic(_("_Density")); g_signal_connect(G_OBJECT(btDens), "toggled", G_CALLBACK(onCheckDens), (gpointer)0); gtk_box_pack_start(GTK_BOX(hbox), btDens, FALSE, FALSE, 0); btVext = gtk_check_button_new_with_mnemonic(_("V_ext")); g_signal_connect(G_OBJECT(btVext), "toggled", G_CALLBACK(onCheckVext), (gpointer)0); /* gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(btVext), TRUE); */ gtk_box_pack_start(GTK_BOX(hbox), btVext, FALSE, FALSE, 0); wd = gtk_check_button_new_with_mnemonic(_("V_hartr")); gtk_widget_set_sensitive(wd, FALSE); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); wd = gtk_check_button_new_with_mnemonic(_("V_xc")); gtk_widget_set_sensitive(wd, FALSE); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); /* The wf lines. */ hbox = gtk_hbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 0); wd = gtk_label_new(_("Wavefunctions:")); gtk_misc_set_alignment(GTK_MISC(wd), 0., 0.5); gtk_box_pack_start(GTK_BOX(hbox), wd, TRUE, TRUE, 0); wd = gtk_label_new(_("up")); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); cbOrbsu = gtk_combo_box_new_with_model(GTK_TREE_MODEL(orbsd_spu)); render = gtk_cell_renderer_toggle_new(); g_signal_connect(G_OBJECT(cbOrbsu), "changed", G_CALLBACK(onOrbsdToggled), (gpointer)orbsd_spu); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(cbOrbsu), render, FALSE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(cbOrbsu), render, "active", ACTIVATED); render = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(cbOrbsu), render, FALSE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(cbOrbsu), render, "text", LABEL); gtk_box_pack_start(GTK_BOX(hbox), cbOrbsu, FALSE, FALSE, 0); wd = gtk_label_new(_("down")); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); cbOrbsd = gtk_combo_box_new_with_model(GTK_TREE_MODEL(orbsd_spd)); render = gtk_cell_renderer_toggle_new(); g_signal_connect(G_OBJECT(cbOrbsd), "changed", G_CALLBACK(onOrbsdToggled), (gpointer)orbsd_spd); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(cbOrbsd), render, FALSE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(cbOrbsd), render, "active", ACTIVATED); render = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(cbOrbsd), render, FALSE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(cbOrbsd), render, "text", LABEL); gtk_box_pack_start(GTK_BOX(hbox), cbOrbsd, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 0); wd = gtk_label_new(_("for k-point(s)")); gtk_misc_set_alignment(GTK_MISC(wd), 1., 0.5); gtk_box_pack_start(GTK_BOX(hbox), wd, TRUE, TRUE, 0); cbKpt = gtk_combo_box_new_with_model(GTK_TREE_MODEL(orbsd_kpt)); render = gtk_cell_renderer_toggle_new(); g_signal_connect(G_OBJECT(cbKpt), "changed", G_CALLBACK(onOrbsdToggled), (gpointer)orbsd_kpt); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(cbKpt), render, FALSE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(cbKpt), render, "active", ACTIVATED); render = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(cbKpt), render, FALSE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(cbKpt), render, "text", LABEL); if (wf && BIGDFT_ORBS(wf)->nkpts ==1) gtk_combo_box_set_active(GTK_COMBO_BOX(cbKpt), 0); gtk_box_pack_start(GTK_BOX(hbox), cbKpt, FALSE, FALSE, 0); /* The treeview. */ ct = gtk_scrolled_window_new((GtkAdjustment*)0, (GtkAdjustment*)0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ct), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(ct), GTK_SHADOW_ETCHED_IN); gtk_box_pack_start(GTK_BOX(vbox2), ct, TRUE, TRUE, 0); wd = gtk_tree_view_new_with_model(GTK_TREE_MODEL(scfdata)); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(wd), FALSE); gtk_container_add(GTK_CONTAINER(ct), wd); /* Columns. */ render = gtk_cell_renderer_text_new(); col = gtk_tree_view_column_new_with_attributes("", render, "markup", SCF_LABEL, NULL); gtk_tree_view_column_set_expand(col, TRUE); gtk_tree_view_append_column(GTK_TREE_VIEW(wd), col); render = gtk_cell_renderer_text_new(); col = gtk_tree_view_column_new_with_attributes("", render, NULL); gtk_tree_view_column_set_cell_data_func(col, render, ptInfos, (gpointer)0, (GDestroyNotify)0); g_signal_connect(G_OBJECT(wd), "button-release-event", G_CALLBACK(onTreeViewClicked), (gpointer)col); gtk_tree_view_append_column(GTK_TREE_VIEW(wd), col); /* Action buttons. */ hbox = gtk_hbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 0); btSCF = gtk_button_new_with_label(_("retrieve selection")); gtk_widget_set_sensitive(btSCF, FALSE); g_signal_connect(G_OBJECT(btSCF), "clicked", G_CALLBACK(onGetSCF), (gpointer)wd); gtk_box_pack_end(GTK_BOX(hbox), btSCF, FALSE, FALSE, 0); wd = gtk_label_new(_("Wfn. repr.:")); gtk_box_pack_start(GTK_BOX(hbox), wd, FALSE, FALSE, 0); cbWf = gtk_combo_box_text_new(); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(cbWf), _("real part")); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(cbWf), _("imaginary part")); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(cbWf), _("partial density")); gtk_combo_box_set_active(GTK_COMBO_BOX(cbWf), 0); gtk_box_pack_start(GTK_BOX(hbox), cbWf, FALSE, FALSE, 0); return vbox2; } static void onOrbsdToggled(GtkComboBox *cb, gpointer data) { GtkTreeIter iter; GtkTreeModel *model; gboolean valid; VisuData *dataObj; BigDFT_Wf *wf; guint i, j, val; gchar *name; StoredWfData *dt; if (!gtk_combo_box_get_active_iter(cb, &iter)) return; gtk_tree_model_get(GTK_TREE_MODEL(data), &iter, ACTIVATED, &valid, VALUE, &val, -1); gtk_list_store_set(GTK_LIST_STORE(data), &iter, ACTIVATED, !valid, -1); /* Connect or disconnect the one-wave-ready signals. */ dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelBigDFT)); if (!dataObj) return; wf = (BigDFT_Wf*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_wf"); dt = (StoredWfData*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_storedWf"); if (!dt || !wf) return; if (valid) { /* We remove all signals according to val. */ if (cb == GTK_COMBO_BOX(cbOrbsd)) val += BIGDFT_ORBS(wf)->norbu; for (i = 0; i < (cb == GTK_COMBO_BOX(cbKpt))?BIGDFT_ORBS(wf)->norb: BIGDFT_ORBS(wf)->nkpts; i++) { if (cb == GTK_COMBO_BOX(cbKpt)) j = val * BIGDFT_ORBS(wf)->norb + i; else j = i * BIGDFT_ORBS(wf)->norb + val; if (dt[j].signal) g_signal_handler_disconnect(G_OBJECT(wf), dt[j].signal); dt[j].signal = 0; } } else { /* We add signals to each checked values. */ for (i = 0; i < ((cb == GTK_COMBO_BOX(cbKpt))?BIGDFT_ORBS(wf)->norb: BIGDFT_ORBS(wf)->nkpts); i++) { if (cb == GTK_COMBO_BOX(cbKpt) && i < BIGDFT_ORBS(wf)->norbu) { model = GTK_TREE_MODEL(orbsd_spu); j = BIGDFT_ORBS(wf)->norbu - i - 1; } else if (cb == GTK_COMBO_BOX(cbKpt)) { model = GTK_TREE_MODEL(orbsd_spd); j = BIGDFT_ORBS(wf)->norb - i - 1; } else { model = GTK_TREE_MODEL(orbsd_kpt); j = i; } if (gtk_tree_model_iter_nth_child(model, &iter, NULL, j)) { gtk_tree_model_get(model, &iter, ACTIVATED, &valid, VALUE, &j, -1); if (valid) { if (cb == GTK_COMBO_BOX(cbOrbsu)) { name = g_strdup_printf("one-wave-ready::%d-%d-up", j + 1, val + 1); j = j * BIGDFT_ORBS(wf)->norb + val; } else if (cb == GTK_COMBO_BOX(cbOrbsd)) { name = g_strdup_printf("one-wave-ready::%d-%d-down", j + 1, val + 1); j = j * BIGDFT_ORBS(wf)->norb + val; } else if (i < BIGDFT_ORBS(wf)->norbu) { name = g_strdup_printf("one-wave-ready::%d-%d-up", val + 1, j + 1); j = val * BIGDFT_ORBS(wf)->norb + j; } else { name = g_strdup_printf("one-wave-ready::%d-%d-down", val + 1, j + 1); j = val * BIGDFT_ORBS(wf)->norb + j; } DBG_fprintf(stderr, "BigDFT Run: adding '%s' signal.\n", name); dt[j].signal = g_signal_connect(G_OBJECT(wf), name, G_CALLBACK(onOneWaveReady), (gpointer)0); g_free(name); } } } } } static void ptInfos(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data _U_) { double eval, occ, fact, tol; gchar *lbl; guint kind, units; gpointer unitsFact; const gchar *unitsLbl[] = {"Ht", "eV"}; units = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(tree_column), "units")); unitsFact = g_object_get_data(G_OBJECT(tree_column), "unitsFact"); if (unitsFact) fact = *(double*)unitsFact; else fact = 1.; gtk_tree_model_get(tree_model, iter, SCF_EVAL, &eval, SCF_OCCUP, &occ, SCF_TYPE, &kind, SCF_TOL, &tol, -1); switch (kind) { case SCF_TYPE_WF: lbl = g_strdup_printf("%5.5f | %3.3f", eval * fact, occ); break; case SCF_TYPE_ITER_WFN: if (eval != 0.) if (tol > 0. && occ < tol) lbl = g_strdup_printf("%10.10f %s (%2.2e)", eval * fact, unitsLbl[units], occ); else if (tol > 0. && occ >= tol) lbl = g_strdup_printf("%10.10f %s (%2.2e)", eval * fact, unitsLbl[units], occ); else lbl = g_strdup_printf("%10.10f %s (%2.2e)", eval * fact, unitsLbl[units], occ); else lbl = g_strdup(""); break; default: lbl = g_strdup(""); } g_object_set(G_OBJECT(cell), "markup", lbl, NULL); g_free(lbl); } static void onGetSCF(GtkButton *bt _U_, gpointer user_data) { GtkTreeIter iter; GtkTreeModel *model; GArray *psic, *wrap; double *data, *data2; const BigDFT_Locreg *glr; BigDFT_Wf *wf; BigDFT_LocalFields *denspot; VisuScalarField *field; gchar *lbl, *str; double box[3][3]; float shift[3]; guint kind, istep, ikpt, iorb, ispin, nspinor, psiSize, i, nsurf; const VisuSurfaces *surf; float *isoValues; VisuData *dataObj; StoredWfData *dt; const gchar **names; VisuBox *boxObj; if (!gtk_tree_selection_get_selected (gtk_tree_view_get_selection(GTK_TREE_VIEW(user_data)), &model, &iter)) return; dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelBigDFT)); if (!dataObj) return; gtk_tree_model_get(model, &iter, SCF_TYPE, &kind, -1); dt = (StoredWfData*)0; surf = (const VisuSurfaces*)0; switch (kind) { case SCF_TYPE_WF: gtk_tree_model_get(model, &iter, SCF_DATA, &psic, SCF_LABEL, &str, SCF_ITER, &istep, SCF_GLR, &glr, SCF_OBJECT, &wf, SCF_IKPT, &ikpt, SCF_IORB, &iorb, SCF_NSPINOR, &nspinor, SCF_ISPIN, &ispin, SCF_MEMORY, &psiSize, -1); if (gtk_combo_box_get_active(GTK_COMBO_BOX(cbWf)) == BIGDFT_PARTIAL_DENSITY) lbl = g_strdup_printf(_("partial density (iter: %d)\n ikpt: %d, " "iorb: %d"), istep, ikpt + 1, iorb + 1); else lbl = g_strdup_printf(_("wavefunction (iter: %d)\n ikpt: %d, " "iorb: %d"), istep, ikpt + 1, iorb + 1); /* Depending on the spinor representation, we work on data. */ data = (double*)0; if (gtk_combo_box_get_active(GTK_COMBO_BOX(cbWf)) == BIGDFT_REAL || gtk_combo_box_get_active(GTK_COMBO_BOX(cbWf)) == BIGDFT_PARTIAL_DENSITY) data = bigdft_locreg_convert_to_isf(glr, (double*)psic->data); else if (nspinor == 2) data = bigdft_locreg_convert_to_isf(glr, ((double*)psic->data) + psiSize / 2); else visu_ui_raiseWarning(_("Retrieve wavefunction"), _("Wavefunction has no imaginary part"), NULL); if (gtk_combo_box_get_active(GTK_COMBO_BOX(cbWf)) == BIGDFT_PARTIAL_DENSITY && nspinor == 1) for (i = 0; i < glr->ni[0] * glr->ni[1] * glr->ni[2]; i++) data[i] = data[i] * data[i]; if (gtk_combo_box_get_active(GTK_COMBO_BOX(cbWf)) == BIGDFT_PARTIAL_DENSITY && nspinor == 2) { data2 = bigdft_locreg_convert_to_isf(glr, ((double*)psic->data) + psiSize / 2); for (i = 0; i < glr->ni[0] * glr->ni[1] * glr->ni[2]; i++) data[i] = data[i] * data[i] + data2[i] * data2[i]; g_free(data2); } g_array_unref(psic); g_free(str); /* We get the surface of the first wavefunction drawn. */ dt = (StoredWfData*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_storedWf"); surf = (dt)?dt[ikpt * BIGDFT_ORBS(wf)->norb + iorb + ((ispin == BIGDFT_SPIN_DOWN)?BIGDFT_ORBS(wf)->norbu:0)].surf: (const VisuSurfaces*)0; break; case SCF_TYPE_V_EXT: gtk_tree_model_get(model, &iter, SCF_OBJECT, &denspot, SCF_GLR, &glr, -1); data = denspot->v_ext; lbl = g_strdup(_("external potential")); break; case SCF_TYPE_DENSITY: gtk_tree_model_get(model, &iter, SCF_DATA, &psic, SCF_GLR, &glr, SCF_OBJECT, &denspot, SCF_ITER, &istep, -1); data = (double*)psic->data; lbl = g_strdup_printf(_("electronic density (iter: %d)"), istep); break; default: glr = (const BigDFT_Locreg*)0; data = (double*)0; psic = (GArray*)0; break; } if (!data || !glr) return; field = visu_scalar_field_new(lbl); g_free(lbl); if (!field) g_warning("impossible to create a VisuScalarField object."); else { memset(box, 0, sizeof(double) * 9); box[0][0] = glr->h[0] * glr->ni[0] * 0.5; box[1][1] = glr->h[1] * glr->ni[1] * 0.5; box[2][2] = glr->h[2] * glr->ni[2] * 0.5; boxObj = visu_box_new_full(box, (BIGDFT_ATOMS(glr)->geocode != 'F')?VISU_BOX_PERIODIC:VISU_BOX_FREE); visu_boxed_setBox(VISU_BOXED(field), VISU_BOXED(boxObj), FALSE); g_object_unref(boxObj); visu_scalar_field_setGridSize(field, glr->ni); shift[0] = glr->h[0] * (glr->ni[0] - 2 * glr->n[0] - 2) * 0.25 - glr->h[0] * glr->ns[0]; shift[1] = glr->h[1] * (glr->ni[1] - 2 * glr->n[1] - 2) * 0.25 - glr->h[1] * glr->ns[1]; shift[2] = glr->h[2] * (glr->ni[2] - 2 * glr->n[2] - 2) * 0.25 - glr->h[2] * glr->ns[2]; if (BIGDFT_ATOMS(glr)->geocode == 'S') shift[1] = glr->h[1] * (glr->ni[1] - 2 * glr->n[1] - 3) * 0.25 - glr->h[1] * glr->ns[1]; visu_scalar_field_setOriginShift(field, shift); wrap = g_array_new(FALSE, FALSE, sizeof(double)); wrap->data = (gchar*)data; wrap->len = glr->ni[0] * glr->ni[1] * glr->ni[2]; visu_scalar_field_setData(field, wrap, TRUE); g_array_free(wrap, FALSE); visu_ui_panel_surfaces_setUsed(TRUE); visu_ui_panel_surfaces_addField(field, &iter); if (surf) { isoValues = visu_surfaces_getPropertyFloat((VisuSurfaces*)surf, VISU_SURFACES_PROPERTY_POTENTIAL); nsurf = (guint)visu_surfaces_getN((VisuSurfaces*)surf); names = g_malloc(sizeof(char*) * nsurf); for (i = 0; i < nsurf; i++) names[i] = visu_surfaces_getName((VisuSurfaces*)surf, (int)i); visu_ui_panel_surfaces_compute(&iter, isoValues, names, nsurf); g_free(names); } else surf = visu_ui_panel_surfaces_computeAuto(&iter); } g_object_unref(G_OBJECT(glr)); switch (kind) { case SCF_TYPE_WF: if (dt) dt[ikpt * BIGDFT_ORBS(wf)->norb + iorb + ((ispin == BIGDFT_SPIN_DOWN)?BIGDFT_ORBS(wf)->norbu:0)].surf = surf; g_object_unref(wf); g_free(data); break; case SCF_TYPE_DENSITY: g_array_unref(psic); case SCF_TYPE_V_EXT: g_object_unref(G_OBJECT(denspot)); break; default: break; } } static void onUnitSetHt(GtkCheckMenuItem *item, gpointer data) { static double fact = 1.; if (!gtk_check_menu_item_get_active(item)) return; g_object_set_data(G_OBJECT(data), "unitsFact", &fact); g_object_set_data(G_OBJECT(data), "units", GINT_TO_POINTER(0)); } static void onUnitSeteV(GtkCheckMenuItem *item, gpointer data) { static double fact = 27.2113834; if (!gtk_check_menu_item_get_active(item)) return; g_object_set_data(G_OBJECT(data), "unitsFact", &fact); g_object_set_data(G_OBJECT(data), "units", GINT_TO_POINTER(1)); } static void onSaveFile(GtkMenuItem *item _U_, gpointer data) { GtkTreeIter iter; GtkTreeModel *model; guint kind, ikpt, iorb, ispin; GArray *psic; BigDFT_Wf *wf; if (!gtk_tree_selection_get_selected (gtk_tree_view_get_selection(GTK_TREE_VIEW(data)), &model, &iter)) return; gtk_tree_model_get(model, &iter, SCF_TYPE, &kind, -1); switch (kind) { case SCF_TYPE_WF: gtk_tree_model_get(model, &iter, SCF_DATA, &psic, SCF_OBJECT, &wf, SCF_IKPT, &ikpt, SCF_IORB, &iorb, SCF_ISPIN, &ispin, -1); bigdft_wf_write_psi_compress(wf, "wfn", BIGDFT_WF_FORMAT_BINARY, (double*)psic->data, ikpt + 1, iorb + 1, ispin, psic->len / BIGDFT_ORBS(wf)->nspinor); break; case SCF_TYPE_V_EXT: break; case SCF_TYPE_DENSITY: break; default: break; } } static gboolean onTreeViewClicked(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { GtkWidget *menu, *item; GSList *group; guint units, kind; gboolean sensitive; GtkTreeIter iter; GtkTreeModel *model; if (event->button != 3) return FALSE; DBG_fprintf(stderr, "BigDFT: right clic detected.\n"); units = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(user_data), "units")); menu = gtk_menu_new(); item = gtk_radio_menu_item_new_with_mnemonic((GSList*)0, _("Energies in _Ht")); group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(item)); g_signal_connect(G_OBJECT(item), "toggled", G_CALLBACK(onUnitSetHt), user_data); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); item = gtk_radio_menu_item_new_with_mnemonic(group, _("Energies in _eV")); if (units == 1) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE); g_signal_connect(G_OBJECT(item), "toggled", G_CALLBACK(onUnitSeteV), user_data); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); item = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); /* See if we have a save item. */ sensitive = FALSE; if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)), &model, &iter)) { gtk_tree_model_get(model, &iter, SCF_TYPE, &kind, -1); sensitive = (kind == SCF_TYPE_WF); } item = gtk_image_menu_item_new_from_stock(GTK_STOCK_SAVE, NULL); gtk_widget_set_sensitive(item, sensitive); g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(onSaveFile), widget); gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); gtk_widget_show_all(menu); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, event->time); return FALSE; } static void onVextReady(BigDFT_LocalFields *denspot, gpointer data) { GtkTreeIter parent, child; guint vSize; gchar *lbl, *lblSize; DBG_fprintf(stderr, "BigDFT (%p): get V_ext ready signal.\n", (gpointer)g_thread_self()); if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(btVext))) return; gtk_widget_set_sensitive(btSCF, TRUE); treeGetSCFIter(&parent, 0, NULL); vSize = denspot->ni[0] * denspot->ni[1] * denspot->ni[2] * sizeof(double); #if GLIB_MINOR_VERSION < 30 lblSize = g_format_size_for_display((goffset)vSize); #else lblSize = g_format_size((guint64)vSize); #endif lbl = g_strdup_printf("external potential " "- %s", lblSize); gtk_tree_store_insert(scfdata, &child, &parent, -1); gtk_tree_store_set(scfdata, &child, SCF_ITER, 0, SCF_TYPE, SCF_TYPE_V_EXT, SCF_LABEL, lbl, SCF_MEMORY, vSize, SCF_OBJECT, denspot, SCF_GLR, G_OBJECT(data), -1); g_free(lblSize); g_free(lbl); } static void onDensityReady(BigDFT_LocalFields *denspot, guint iter, gpointer data) { GtkTreeIter parent, child; guint vSize; gchar *lbl, *lblSize; GArray *dens; DBG_fprintf(stderr, "BigDFT (%p): get density ready signal.\n", (gpointer)g_thread_self()); if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(btDens))) return; gtk_widget_set_sensitive(btSCF, TRUE); treeGetSCFIter(&parent, iter, NULL); vSize = denspot->ni[0] * denspot->ni[1] * denspot->ni[2]; #if GLIB_MINOR_VERSION < 30 lblSize = g_format_size_for_display((goffset)(vSize * sizeof(double))); #else lblSize = g_format_size((guint64)(vSize * sizeof(double))); #endif lbl = g_strdup_printf("electronic density " "- %s", lblSize); dens = g_array_sized_new(FALSE, FALSE, sizeof(double), vSize); memcpy(dens->data, denspot->rhov, sizeof(double) * vSize); dens = g_array_set_size(dens, vSize); gtk_tree_store_insert(scfdata, &child, &parent, -1); gtk_tree_store_set(scfdata, &child, SCF_ITER, iter, SCF_TYPE, SCF_TYPE_DENSITY, SCF_LABEL, lbl, SCF_MEMORY, vSize, SCF_DATA, dens, SCF_OBJECT, denspot, SCF_GLR, G_OBJECT(data), -1); g_free(lblSize); g_free(lbl); g_array_unref(dens); } static void onIter(BigDFT_OptLoop *optloop, BigDFT_Energs *energs, gpointer data _U_) { GtkTreeIter parent; DBG_fprintf(stderr, "BigDFT (%p): get iter signal.\n", (gpointer)g_thread_self()); treeGetSCFIter(&parent, optloop->iter, optloop); gtk_tree_store_set(scfdata, &parent, SCF_EVAL, energs->eKS, SCF_OCCUP, optloop->gnrm, -1); } static void onDone(BigDFT_OptLoop *optloop, BigDFT_Energs *energs, gpointer data _U_) { GtkTreeIter parent; DBG_fprintf(stderr, "BigDFT (%p): get done signal.\n", (gpointer)g_thread_self()); treeGetSCFIter(&parent, optloop->iter, optloop); gtk_tree_store_set(scfdata, &parent, SCF_EVAL, energs->eKS, SCF_OCCUP, optloop->gnrm, SCF_TOL, optloop->gnrm_cv, -1); } static void psiInsert(BigDFT_Wf *wf, GArray *psic, BigDFT_PsiId ipsi, guint ikpt, guint iorb, BigDFT_Spin spin, guint iscf, GtkTreeIter *parent) { BigDFT_Orbs *orbs; gchar *lbl, *lblSize; const gchar *lblSpin[3] = {"\342\206\221", "\342\206\223", "\342\207\265"}, *lblPsi[2] = {"|\316\250", "H|\316\250"}; GtkTreeIter child; double eval; guint iorbp; #if GLIB_MINOR_VERSION < 30 lblSize = g_format_size_for_display((goffset)(psic->len * sizeof(double))); #else lblSize = g_format_size((guint64)(psic->len * sizeof(double))); #endif orbs = BIGDFT_ORBS(wf); iorbp = ikpt * orbs->norb + iorb; if (!bigdft_orbs_get_linear(orbs)) lbl = g_strdup_printf("%s%sikpt: %d, iorb: %d" "\342\237\251 (%s)", lblPsi[ipsi], lblSpin[(BIGDFT_ORBS(wf)->nspin == 1)?2:spin], ikpt + 1, iorb + 1, lblSize); else lbl = g_strdup_printf("%s%sikpt: %d, iorb: %d" "\342\237\251 ilr: %d " "(%s)", lblPsi[ipsi], lblSpin[(BIGDFT_ORBS(wf)->nspin == 1)?2:spin], ikpt + 1, iorb + 1, orbs->inwhichlocreg[iorbp], lblSize); eval = (orbs->eval)?orbs->eval[iorbp]:0.; gtk_tree_store_insert(scfdata, &child, parent, -1); gtk_tree_store_set(scfdata, &child, SCF_ITER, iscf, SCF_TYPE, SCF_TYPE_WF, SCF_LABEL, lbl, SCF_MEMORY, psic->len, SCF_IKPT, ikpt, SCF_IORB, iorb, SCF_ISPIN, spin, SCF_NSPINOR, orbs->nspinor, SCF_EVAL, eval, SCF_OCCUP, orbs->occup[iorbp], SCF_DATA, psic, SCF_OBJECT, wf, SCF_GLR, bigdft_wf_get_locreg(wf, ikpt + 1, iorb + 1, spin, 0), -1); g_free(lblSize); g_free(lbl); } static gboolean psiAdd(BigDFT_Wf *wf, guint iscf, BigDFT_PsiId ipsi, guint ikpt, BigDFT_Spin spin, GtkTreeIter *parent, gboolean init) { GtkTreeIter iter; guint iorb, psiSize; gboolean valid, checked; const double *psic; GArray *psic_; GtkTreeModel *orbsd_spin; if (spin == BIGDFT_SPIN_UP) orbsd_spin = GTK_TREE_MODEL(orbsd_spu); else orbsd_spin = GTK_TREE_MODEL(orbsd_spd); for (valid = gtk_tree_model_get_iter_first(orbsd_spin, &iter); valid; valid = gtk_tree_model_iter_next(orbsd_spin, &iter)) { gtk_tree_model_get(orbsd_spin, &iter, ACTIVATED, &checked, VALUE, &iorb, -1); if (checked) { if (!init) { treeGetSCFIter(parent, iscf, NULL); gtk_widget_set_sensitive(btSCF, TRUE); init = TRUE; } DBG_fprintf(stderr, "BigDFT: greping compressed wfn %d %d %d.\n", ikpt, iorb, spin); psic = bigdft_wf_get_psi_compress(wf, ikpt + 1, iorb + 1, spin, BIGDFT_PARTIAL_DENSITY, &psiSize, 0); psic_ = g_array_sized_new(FALSE, FALSE, sizeof(double), psiSize); memcpy(psic_->data, psic, sizeof(double) * psiSize); psic_ = g_array_set_size(psic_, psiSize); DBG_fprintf(stderr, " | storage size is %d.\n", psiSize); psiInsert(wf, psic_, ipsi, ikpt, iorb, spin, iscf, parent); g_array_unref(psic_); } } return init; } static void onPsiReady(BigDFT_Wf *wf, guint iscf, gpointer data _U_) { GtkTreeIter iter, parent; guint ikpt; gboolean init, valid, checked; init = FALSE; DBG_fprintf(stderr, "BigDFT (%p): get psi ready signal.\n", (gpointer)g_thread_self()); for (valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(orbsd_kpt), &iter); valid; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(orbsd_kpt), &iter)) { gtk_tree_model_get(GTK_TREE_MODEL(orbsd_kpt), &iter, ACTIVATED, &checked, VALUE, &ikpt, -1); if (checked) { init = psiAdd(wf, iscf, BIGDFT_PSI, ikpt, BIGDFT_SPIN_UP, &parent, init); init = psiAdd(wf, iscf, BIGDFT_PSI, ikpt, BIGDFT_SPIN_DOWN, &parent, init); } } } static void onOneWaveReady(BigDFT_Wf *wf, guint iter, GArray *psic, BigDFT_PsiId ipsi, guint ikpt, guint iorb, guint ispin, gpointer data _U_) { GtkTreeIter parent; DBG_fprintf(stderr, "BigDFT (%p): get one-wave ready signal (%d %d %d -> %d)" " at iter %d.\n", (gpointer)g_thread_self(), ikpt, iorb, ispin, psic->len, iter); treeGetSCFIter(&parent, iter, NULL); psiInsert(wf, psic, ipsi, ikpt - 1, iorb - 1, ispin, iter, &parent); gtk_widget_set_sensitive(btSCF, TRUE); } static void onSocketClose(gpointer data) { struct _socketStuff *ct = (struct _socketStuff*)data; g_object_unref(G_OBJECT(ct->denspot)); g_object_unref(G_OBJECT(ct->wf)); g_object_unref(G_OBJECT(ct->energs)); g_object_unref(G_OBJECT(ct->optloop)); g_object_unref(G_OBJECT(ct->cancellable)); bigdft_signals_client_free(ct->client); g_async_queue_unref(ct->message); g_free(ct); g_object_set_data(G_OBJECT(btRun), "ct", (gpointer)0); gtk_widget_set_sensitive(btRun, TRUE); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(btRun), FALSE); #if GTK_MINOR_VERSION > 19 || GTK_MAJOR_VERSION > 2 gtk_widget_hide(spRun); gtk_spinner_stop(GTK_SPINNER(spRun)); #endif } static void onRunBigDFT(GtkToggleButton *bt, gpointer data) { VisuData *dataObj; BigDFT_Inputs *in; BigDFT_Wf *wf, *wf_; BigDFT_Proj *proj; BigDFT_LocalFields *denspot; BigDFT_Energs *energs; BigDFT_OptLoop *optloop; double frmult; gchar *host; GError *error; struct _socketStuff *ct; if (!gtk_toggle_button_get_active(bt)) { ct = (struct _socketStuff *)g_object_get_data(G_OBJECT(bt), "ct"); if (!ct) return; g_cancellable_cancel(ct->cancellable); gtk_widget_set_sensitive(btRun, FALSE); return; } dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelBigDFT)); if (!dataObj) return; wf = (BigDFT_Wf*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_wf"); in = (BigDFT_Inputs*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_inputs"); if (!in || !wf) return; wf_ = (BigDFT_Wf*)g_object_get_data(G_OBJECT(bt), "BigDFT_wf"); if (wf != wf_) gtk_tree_store_clear(scfdata); frmult = GET_OPT_DBL(fmtWvl, "frmult"); proj = bigdft_proj_new(BIGDFT_LOCREG(wf->lzd), BIGDFT_ORBS(wf), frmult); denspot = bigdft_localfields_new(wf->lzd, in, 0, 1); energs = bigdft_energs_new(); optloop = bigdft_optloop_new(); sigDens = g_signal_connect(G_OBJECT(denspot), "density-ready", G_CALLBACK(onDensityReady), BIGDFT_LOCREG(wf->lzd)); if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(btDens))) g_signal_handler_block(G_OBJECT(denspot), sigDens); sigVext = g_signal_connect(G_OBJECT(denspot), "v-ext-ready", G_CALLBACK(onVextReady), BIGDFT_LOCREG(wf->lzd)); if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(btVext))) g_signal_handler_block(G_OBJECT(denspot), sigVext); g_signal_connect(G_OBJECT(wf), "psi-ready", G_CALLBACK(onPsiReady), (gpointer)0); g_signal_connect(G_OBJECT(optloop), "iter-wavefunctions", G_CALLBACK(onIter), (gpointer)0); g_signal_connect(G_OBJECT(optloop), "done-wavefunctions", G_CALLBACK(onDone), (gpointer)0); if (gtk_combo_box_get_active(GTK_COMBO_BOX(data)) == 0) { bigdft_wf_optimization(wf, proj, denspot, energs, optloop, in, TRUE, 0, 1); gtk_widget_set_sensitive(GTK_WIDGET(bt), FALSE); } else { ct = g_malloc0(sizeof(struct _socketStuff)); /* host = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(data)); */ host = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(data))))); DBG_fprintf(stderr, "BigDFT: try to connect to '%s'.\n", host); error = (GError*)0; ct->client = bigdft_signals_client_new(host, NULL, &error); g_free(host); if (!ct->client) { visu_ui_raiseWarning(_("Running BigDFT on a host"), error->message, NULL); g_error_free(error); gtk_toggle_button_set_active(bt, FALSE); g_free(ct); } else { #if GTK_MINOR_VERSION > 19 || GTK_MAJOR_VERSION > 2 gtk_spinner_start(GTK_SPINNER(spRun)); gtk_widget_show(spRun); #endif ct->message = g_async_queue_new(); ct->wf = wf; ct->denspot = denspot; ct->energs = energs; ct->optloop = optloop; ct->cancellable = g_cancellable_new(); g_object_ref(G_OBJECT(denspot)); g_object_ref(G_OBJECT(wf)); g_object_ref(G_OBJECT(energs)); g_object_ref(G_OBJECT(optloop)); g_object_set_data(G_OBJECT(bt), "ct", ct); bigdft_signals_client_create_thread (ct->client, ct->energs, ct->wf, ct->denspot, ct->optloop, ct->cancellable, onSocketClose, ct); } DBG_fprintf(stderr, "BigDFT: connexion done.\n"); } g_object_set_data(G_OBJECT(bt), "BigDFT_wf", wf); g_object_unref(G_OBJECT(denspot)); g_object_unref(G_OBJECT(proj)); g_object_unref(G_OBJECT(energs)); g_object_unref(G_OBJECT(optloop)); DBG_fprintf(stderr, "BigDFT (%p): now running.\n", (gpointer)g_thread_self()); } static void treeInsertIter(GtkTreeIter *iter, GtkTreeIter *parent, guint iLoop, const gchar *label, guint type) { gchar *lbl; /* We need to create a root node for this iteration. */ lbl = (iLoop == 0)? g_strdup_printf(_("%s"), label): g_strdup_printf("%s %3d", label, iLoop); gtk_tree_store_insert(scfdata, iter, parent, -1); gtk_tree_store_set(scfdata, iter, SCF_LABEL, lbl, SCF_ITER, iLoop, SCF_TYPE, type, -1); g_free(lbl); } static void treeGetIter(GtkTreeIter *iter, GtkTreeIter *parent, guint iLoop, const gchar *label, guint type, guint iLoopChild) { gboolean valid; guint ival, ivalChild; GtkTreeIter child; if (iLoop > 0) for (valid = gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(scfdata), iter, parent, 0); valid; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(scfdata), iter)) { gtk_tree_model_get(GTK_TREE_MODEL(scfdata), iter, SCF_ITER, &ival, -1); if (ival == iLoop) break; } else { ival = 0; /* Get the last one if his children SCF_ITER are below iLoopChild. */ if (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(scfdata), parent) > 0) valid = gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(scfdata), iter, parent, gtk_tree_model_iter_n_children(GTK_TREE_MODEL(scfdata), parent) - 1); else valid = FALSE; if (valid) { gtk_tree_model_get(GTK_TREE_MODEL(scfdata), iter, SCF_ITER, &ival, -1); valid = (ival > 0); if (valid && iLoopChild > 0) { for (valid = gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(scfdata), &child, iter, 0); valid; valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(scfdata), &child)) { gtk_tree_model_get(GTK_TREE_MODEL(scfdata), &child, SCF_ITER, &ivalChild, -1); if (ivalChild > iLoopChild) break; } valid = (ivalChild <= iLoopChild); } } } if (!valid) treeInsertIter(iter, parent, (iLoop == 0)?ival + 1:iLoop, label, type); } static void treeGetSCFIter(GtkTreeIter *parent, guint iscf, BigDFT_OptLoop *loop) { GtkTreeIter iterHam, iterSub; if (iscf > 0) { treeGetIter(&iterHam, NULL, (loop)?loop->itrp:0, _("Hamiltonian optimisation"), SCF_TYPE_ITER_HAM, 0); treeGetIter(&iterSub, &iterHam, (loop)?loop->itrep:0, _("Sub-space optimisation"), SCF_TYPE_ITER_SUB, iscf); treeGetIter(parent, &iterSub, iscf, _("Wfn iteration"), SCF_TYPE_ITER_WFN, 0); } else { if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(scfdata), parent)) treeInsertIter(parent, NULL, 0, _("Initial stage"), SCF_TYPE_ITER_WFN); } } static void update_orbsd(const VisuData *dataObj) { BigDFT_Wf *wf; guint i; GtkTreeIter iter; gchar *lbl; StoredWfData *dt; gtk_list_store_clear(orbsd_kpt); gtk_list_store_clear(orbsd_spu); gtk_list_store_clear(orbsd_spd); if (!dataObj) return; wf = (BigDFT_Wf*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_wf"); if (!wf) return; for (i = 0; i < BIGDFT_ORBS(wf)->nkpts; i++) { lbl = g_strdup_printf(_("kpt %d (%3.3f,%3.3f,%3.3f - %3.3f)"), i + 1, BIGDFT_ORBS(wf)->kpts[i * 3 + 0], BIGDFT_ORBS(wf)->kpts[i * 3 + 1], BIGDFT_ORBS(wf)->kpts[i * 3 + 2], BIGDFT_ORBS(wf)->kwgts[i]); gtk_list_store_append(orbsd_kpt, &iter); gtk_list_store_set(orbsd_kpt, &iter, LABEL, lbl, ACTIVATED, FALSE, VALUE, i, -1); g_free(lbl); } for (i = 0; i < BIGDFT_ORBS(wf)->norbu; i++) { lbl = g_strdup_printf(_("orb. %d"), BIGDFT_ORBS(wf)->norbu - i); gtk_list_store_append(orbsd_spu, &iter); gtk_list_store_set(orbsd_spu, &iter, LABEL, lbl, ACTIVATED, FALSE, VALUE, BIGDFT_ORBS(wf)->norbu - i - 1, -1); g_free(lbl); } for (i = 0; i < BIGDFT_ORBS(wf)->norbd; i++) { lbl = g_strdup_printf(_("orb. %d"), BIGDFT_ORBS(wf)->norbd - i); gtk_list_store_append(orbsd_spd, &iter); gtk_list_store_set(orbsd_spd, &iter, LABEL, lbl, ACTIVATED, FALSE, VALUE, BIGDFT_ORBS(wf)->norbd - i - 1, -1); g_free(lbl); } if (cbKpt) gtk_combo_box_set_active(GTK_COMBO_BOX(cbKpt), 0); dt = g_malloc0(sizeof(StoredWfData) * BIGDFT_ORBS(wf)->norb * BIGDFT_ORBS(wf)->nkpts); g_object_set_data_full(G_OBJECT(dataObj), "BigDFT_storedWf", dt, (GDestroyNotify)g_free); } static void onCheckDens(GtkToggleButton *bt _U_, gpointer data _U_) { } static void onCheckVext(GtkToggleButton *bt _U_, gpointer data _U_) { } v_sim-3.7.0/lib/plug-ins/bigdft/bigdft_system.c0000644000353400050620000002067012216276634016351 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2011) Adresse mèl : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors: Damien CALISTE, L_Sim laboratory, (2001-2011) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "bigdftplug.h" enum { LR_OBJECT, LR_LABEL, LR_ID, LR_SHOW_GRID_C, LR_SHOW_GRID_F, LR_COLOR, LR_N_COLUMNS }; static GtkListStore *lrdata; /* Local methods. */ static void update_lzd(BigDFT_Lzd *lzd); /* Callbacks. */ static void onDataLoaded(GObject *obj, VisuData *dataObj, gpointer data); static void onGridToggled(GtkCellRendererToggle *cell_renderer, gchar *path, gpointer user_data); void bdft_system_init() { lrdata = gtk_list_store_new(LR_N_COLUMNS, G_TYPE_OBJECT, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, GDK_TYPE_PIXBUF); g_signal_connect(VISU_OBJECT_INSTANCE, "dataLoaded", G_CALLBACK(onDataLoaded), NULL); } static void onLzdDefined(BigDFT_Lzd *lzd, gpointer data _U_) { update_lzd(lzd); } static void onDataLoaded(GObject *obj _U_, VisuData *dataObj, gpointer data _U_) { BigDFT_Wf *wf; if (!dataObj) return; wf = (BigDFT_Wf*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_wf"); update_lzd(NULL); if (wf) g_signal_connect(G_OBJECT(wf->lzd), "defined", G_CALLBACK(onLzdDefined), (gpointer)0); DBG_fprintf(stderr, "BigDFT system: 'DataLoaded' signal OK.\n"); } GtkWidget* bdft_system_tab(BigDFT_Lzd *lzd) { GtkWidget *wd, *ct, *vbox; GtkCellRenderer *render; GtkTreeViewColumn *col; vbox = gtk_vbox_new(FALSE, 2); ct = gtk_scrolled_window_new((GtkAdjustment*)0, (GtkAdjustment*)0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ct), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(ct), GTK_SHADOW_ETCHED_IN); gtk_box_pack_start(GTK_BOX(vbox), ct, TRUE, TRUE, 0); wd = gtk_tree_view_new_with_model(GTK_TREE_MODEL(lrdata)); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(wd), FALSE); gtk_container_add(GTK_CONTAINER(ct), wd); /* Columns. */ render = gtk_cell_renderer_text_new(); col = gtk_tree_view_column_new_with_attributes("", render, "markup", LR_LABEL, NULL); gtk_tree_view_column_set_expand(col, TRUE); render = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_column_pack_end(col, render, FALSE); gtk_tree_view_column_add_attribute(col, render, "pixbuf", LR_COLOR); gtk_tree_view_append_column(GTK_TREE_VIEW(wd), col); render = gtk_cell_renderer_toggle_new(); g_signal_connect(G_OBJECT(render), "toggled", G_CALLBACK(onGridToggled), (gpointer)LR_SHOW_GRID_C); col = gtk_tree_view_column_new_with_attributes("", render, "active", LR_SHOW_GRID_C, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(wd), col); render = gtk_cell_renderer_toggle_new(); g_signal_connect(G_OBJECT(render), "toggled", G_CALLBACK(onGridToggled), (gpointer)LR_SHOW_GRID_F); col = gtk_tree_view_column_new_with_attributes("", render, "active", LR_SHOW_GRID_F, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(wd), col); update_lzd(lzd); return vbox; } static void update_lzd(BigDFT_Lzd *lzd) { GtkTreeIter iter; gchar *lbl; guint i; GdkPixbuf *pixbuf; gtk_list_store_clear(lrdata); if (!lzd) return; /* Global region. */ lbl = g_strdup_printf("Global region\n" " %d / %d (coarse / fine grid pts)", lzd->parent.nvctr_c, lzd->parent.nvctr_f); gtk_list_store_append(lrdata, &iter); gtk_list_store_set(lrdata, &iter, LR_OBJECT, &lzd->parent, LR_LABEL, lbl, LR_ID, 0, LR_SHOW_GRID_C, FALSE, LR_SHOW_GRID_F, FALSE, -1); g_free(lbl); /* Local regions. */ if (lzd->nlr > 1) for (i = 0; i < lzd->nlr; i++) { lbl = g_strdup_printf("Local region %d\n" " %d / %d (coarse / fine grid pts)", i + 1, lzd->Llr[i]->nvctr_c, lzd->Llr[i]->nvctr_f); pixbuf = tool_color_get_stamp(tool_color_new_bright(i), FALSE); gtk_list_store_append(lrdata, &iter); gtk_list_store_set(lrdata, &iter, LR_OBJECT, lzd->Llr[i], LR_LABEL, lbl, LR_ID, i + 1, LR_COLOR, pixbuf, LR_SHOW_GRID_C, FALSE, LR_SHOW_GRID_F, FALSE, -1); g_free(lbl); g_object_unref(pixbuf); } } static void onGridToggled(GtkCellRendererToggle *cell_renderer, gchar *path, gpointer user_data) { GtkTreePath* tpath = gtk_tree_path_new_from_string(path); GtkTreeIter iter; gboolean valid; BigDFT_Locreg *lr; GArray *gcoord; BigDFT_Wf *wf; BigDFT_LocregIter iseg; float vect[3]; guint nseg, tseg, ilr; VisuData *dataObj; VisuGlView *view; gchar *lbl; valid = gtk_tree_model_get_iter(GTK_TREE_MODEL(lrdata), &iter, tpath); gtk_tree_path_free(tpath); g_return_if_fail(valid); dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelBigDFT)); view = visu_ui_panel_getView(VISU_UI_PANEL(panelBigDFT)); g_return_if_fail(dataObj && view); wf = (BigDFT_Wf*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_wf"); g_return_if_fail(wf); gtk_tree_model_get(GTK_TREE_MODEL(lrdata), &iter, LR_OBJECT, &lr, LR_ID, &ilr, -1); if (GPOINTER_TO_INT(user_data) == LR_SHOW_GRID_C) { nseg = lr->nseg_c; tseg = GRID_COARSE; lbl = "g"; } else { nseg = lr->nseg_f; tseg = GRID_FINE; lbl = "G"; } valid = !gtk_cell_renderer_toggle_get_active(cell_renderer); gtk_list_store_set(lrdata, &iter, GPOINTER_TO_INT(user_data), valid, -1); if (valid) { gcoord = g_array_sized_new(FALSE, FALSE, sizeof(gfloat) * 3, 2 * nseg); for (valid = bigdft_lzd_iter_new(wf->lzd, &iseg, tseg, ilr); valid; valid = bigdft_lzd_iter_next(&iseg)) { vect[0] = iseg.x0; vect[1] = iseg.y; vect[2] = iseg.z; g_array_append_val(gcoord, vect); if (iseg.x1 != iseg.x0) { vect[0] = iseg.x1; vect[1] = iseg.y; vect[2] = iseg.z; g_array_append_val(gcoord, vect); } } } else gcoord = g_array_sized_new(FALSE, FALSE, sizeof(gfloat) * 3, 1); bigdft_show_grid(dataObj, gcoord, lbl, ilr); g_array_unref(gcoord); g_object_unref(lr); VISU_REDRAW_ADD; } v_sim-3.7.0/lib/plug-ins/bigdft/bigdftplug.h0000644000353400050620000000453612215546150015635 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2011) Adresse mèl : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors: Damien CALISTE, L_Sim laboratory, (2001-2011) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef BIGDFTPLUG_H #define BIGDFTPLUG_H #include #include #include GtkWidget *panelBigDFT; ToolFileFormat *fmtWvl; #define GET_OPT_INT(f, n) g_value_get_int(tool_option_getValue(tool_file_format_getPropertyByName(f, n))) #define GET_OPT_DBL(f, n) g_value_get_double(tool_option_getValue(tool_file_format_getPropertyByName(f, n))) #define SET_OPT_INT(f, n, v) g_value_set_int(tool_option_getValue(tool_file_format_getPropertyByName(f, n)), v) #define SET_OPT_DBL(f, n, v) g_value_set_double(tool_option_getValue(tool_file_format_getPropertyByName(f, n)), v) void bigdft_show_grid(VisuData *dataObj, GArray *grid, const gchar *gG, guint id); #endif v_sim-3.7.0/lib/plug-ins/bigdft/bigdft.png0000644000353400050620000001103012215546150015265 00000000000000PNG  IHDR  i+ pHYsHHFk> vpAg SBIDATXMXw\TWӞ[/H' X QhcCy?cI4G1XbAԈш"R®}o=/{sgΙ33#F$#ąC'q=K@,8%1({,ژ(buIDӡDrψ:D$P'kxt!""6nmviۥRĐL"H9dcz"wƷ# "oa5?Qn&^("",ȁr\VFq^BUbNuX&#Xr\=[E׾rS7--6$$wxԞs|J}z >((;`4<]Isৰ({~(u\r (zv3d#c["IpC: 8Ѕ#MQju[y:;op-PT)QY wn<ܛ'ŝE֘Q e.G=hAҹXa ^B.(=⊹x|R?Q”sOġѺ]l)vD 5 =u/e  - , . i')lJIMI)BWa  ):.۳lOdjວJ ڠ\skbʏrrıv0V!+d-@#w{IiN?kT[rKErզKiYSF$KDD< 3~ J:-~˖2=%~^3mϴQQZ>ck{֞_{pkkţ6.T<Jq<GaRP̐ r_P SV(Hwgړ OJI'3Sf>#w_ajidA3L35hm4]JeQYTt}m}; ,2,Raפkҵ+rQ\|$> (k,4%;9qEgSL333մfUd.}x~RNrך?sle6 {nC4‹DO[IqrCUrLBIO&=VӹL}>lu@yEGگֺJS0̳mChyו6ǥ$5W]ܮtFj]Fdf}Y$_G.g7P\waPf^Ae1[bvhvܳϟ^G{TaQǁL9~Cj)e`3)a8L%SB}S.]m/OCw0sSPr15+G+:3cy~j.IocXfKFˏ-17Wld?Qi G9\h ӓ Q} L6۔iB&?ܯstJY,e*/Fз U**vI=FP)0üBmc?b?wXorțU}nЙit8\l9GQuj8tC'1P69BHp)~/ne8 Ц)oPބ]RaY6K BPF-Ҩ4qȲeli&QCDJ `lku1)+,jh~drU"44K^viL.󍢛*tߑ7;aM*G6YZAF07MV;K,E"*)93>f|Ʈ][^W !C& XWo9d9dVjH-Wx|ver I&t2ekiL-Ԭ-2Kc +(+ r(yN2)C|}3HvTPzEY{O;>}x 9YVkǿ4Tf4e4v>07zM՛,CsYy`Iպu;JeܢEO"|0p3E$<!vYqBzaJdm=%3,Uwug~~vm^U[o5%pJ`oo) &mHڐRΨ.~fc8|ߑxςowlpmlɂ$DA[B!?YxEum;ũ&Ǔv7^T6s}Q"TG:޽K.BTή#jDXwD讃 5'>'ҾRuus!D:$Y$ IHN\X(&i"J^xki:;(J9 i0 61r TY,JrV91-kZ,EzPT$/,ڑ./Knx1K>gx u|fW"7gغce DŽ ˧<0t$2g@yqx"2O %kP+I F 9t2MlCJ'ՠq zxs e%rZrt_HJWI ccl֠=W`^DYp- &DRgGkʻ}WxtJɒQ/&uqI<,y#TWu'79[cݺj 0_6_viZc2uү8  :7PP~ =W%d7O-h*Իߤsҷݩ![H"%SRLpɴcl/Nn)mh sTlq/s/cR W+0ayl[bxoAX_^@D(d1DP9KZj߇%Z\"&9wBX톴i3X35?C:ntZC_dg((_KK5hn5??Vy) r:e2m54xiRӺtia5-8pGdk# \"\KD3P ѵJ$;TK8;IL^w EϼTH̆ LQE]˽).UxqWqA. $Aנ}d4VPZr\9>Vq@ra (ޒE/-D3{[xbz"&F8Z."YpUP0; Df+.e0mИO&*%"Wc[-qŁNu&AaN 2h-$Gi ZjwfMKT_AʀByD64Bj! Gə((W$A h+\gADQz6RT8}s:ͮ^: vxw 2и7fKfʁĩAp)k*k QHtÃ?A08vczx=;p6y,c8&B_ ywnh}ǡg/UkfK3 p:JqD< zjSx ߀Pvpq#4߼cTo`}XMծI| r? A7]!تEy%~oɿL{tk{Q(ՠ &ʂjEb hsFrzrrDj,%Pσ 0!$ sD&mCm :ӻy6$j #include #include #include #include #include #include #include #include #include #include #include #include #include "plane_py.h" typedef struct _VisuElementPy { PyObject_HEAD VisuElement *obj; gboolean ownByVSim; } VisuElementPy; static int visuElementPy_init(VisuElementPy *self, PyObject *args, PyObject *kwds); static PyObject* visuElementPy_new(PyTypeObject *type, PyObject *args, PyObject *kwds); static void visuElementPy_free(VisuElementPy* self); static PyObject* visuElementPy_set(PyObject *obj, PyObject *args, PyObject *kwds); /* We define here all the methods of the dtsets class. */ static PyMethodDef VisuElementPyMethods[] = { {"set", (PyCFunction)visuElementPy_set, METH_VARARGS | METH_KEYWORDS, "Change values for a VisuElement."}, /* {"get", (PyCFunction)dtsets_get, METH_VARARGS, */ /* "Return the valus of an attribute."}, */ {NULL, NULL, 0, NULL} }; /* static PyMemberDef VisuElementPyMembers[] = */ /* { */ /* {"dt", T_OBJECT_EX, offsetof(Dtsets, dt), READONLY, */ /* "Internal identifier for Fortran calls."}, */ /* {NULL, 0, 0, 0, NULL} */ /* }; */ static PyTypeObject VisuElementPyType = { PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ "v_sim.VisuElementPy", /*tp_name*/ sizeof(VisuElementPy), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)visuElementPy_free, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash */ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ "Ploum", /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ VisuElementPyMethods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ (initproc)visuElementPy_init, /* tp_init */ 0, /* tp_alloc */ visuElementPy_new, /* tp_new */ /* 0, */ /* 0, */ /* 0, */ /* 0, */ /* 0, */ /* 0, */ /* 0, */ /* 0 */ }; typedef struct _VisuDataPy VisuDataPy; typedef struct _VisuNodePy { PyObject_HEAD guint nodeId; VisuDataPy *parent; } VisuNodePy; static int visuNodePy_init(VisuNodePy *self, PyObject *args, PyObject *kwds); static PyObject* visuNodePy_new(PyTypeObject *type, PyObject *args, PyObject *kwds); static void visuNodePy_free(VisuNodePy* self); static PyObject* visuNodePy_isValid(PyObject *obj); static PyObject* visuNodePy_set(PyObject *obj, PyObject *args, PyObject *kwds); /* We define here all the methods of the dtsets class. */ static PyMethodDef VisuNodePyMethods[] = { {"set", (PyCFunction)visuNodePy_set, METH_VARARGS | METH_KEYWORDS, "Change values for a VisuNode."}, {"isValid", (PyCFunction)visuNodePy_isValid, METH_NOARGS, "Test if the given node still exist or has been deleted."}, /* {"get", (PyCFunction)dtsets_get, METH_VARARGS, */ /* "Return the valus of an attribute."}, */ {NULL, NULL, 0, NULL} }; /* static PyMemberDef VisuNodePyMembers[] = */ /* { */ /* {"dt", T_OBJECT_EX, offsetof(Dtsets, dt), READONLY, */ /* "Internal identifier for Fortran calls."}, */ /* {NULL, 0, 0, 0, NULL} */ /* }; */ static PyTypeObject VisuNodePyType = { PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ "v_sim.VisuNodePy", /*tp_name*/ sizeof(VisuNodePy), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)visuNodePy_free, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash */ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ "Ploum", /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ VisuNodePyMethods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ (initproc)visuNodePy_init, /* tp_init */ 0, /* tp_alloc */ visuNodePy_new, /* tp_new */ /* 0, */ /* 0, */ /* 0, */ /* 0, */ /* 0, */ /* 0, */ /* 0, */ /* 0 */ }; struct _VisuDataPy { PyObject_HEAD VisuData *obj; PyObject *planes; int planesId; }; static int visuDataPy_init(VisuDataPy *self, PyObject *args, PyObject *kwds); static PyObject* visuDataPy_new(PyTypeObject *type, PyObject *args, PyObject *kwds); static void visuDataPy_free(VisuDataPy* self); static PyObject* visuDataPy_addFile(PyObject *self, PyObject *args, PyObject *kwds); static PyObject* visuDataPy_setPopulation(PyObject *self, PyObject *args, PyObject *kwds); static PyObject* visuDataPy_getPopulation(PyObject *self); static PyObject* visuDataPy_createAllNodes(PyObject *self); static PyObject* visuDataPy_setBox(PyObject *self, PyObject *args, PyObject *kwds); static PyObject* visuDataPy_addNode(PyObject *self, PyObject *args, PyObject *kwds); static PyObject* visuDataPy_delNodes(PyObject *self, PyObject *args); static PyObject* visuDataPy_setVisuPlanes(PyObject *self, PyObject *planes); /* We define here all the methods of the dtsets class. */ static PyMethodDef VisuDataPyMethods[] = { {"addFile", (PyCFunction)visuDataPy_addFile, METH_VARARGS | METH_KEYWORDS, "Associate a file name to a file type."}, {"setPopulation", (PyCFunction)visuDataPy_setPopulation, METH_VARARGS | METH_KEYWORDS, "Allocate the size to store nodes."}, {"getPopulation", (PyCFunction)visuDataPy_getPopulation, METH_NOARGS, "get a dictionnary with the description of the population."}, {"createAllNodes", (PyCFunction)visuDataPy_createAllNodes, METH_NOARGS, "Create the OpenGL rendering for all the nodes."}, {"setBox", (PyCFunction)visuDataPy_setBox, METH_VARARGS | METH_KEYWORDS, "Set the box size."}, {"addNode", (PyCFunction)visuDataPy_addNode, METH_VARARGS | METH_KEYWORDS, "Set the coordinates of a new node for the given element."}, {"delNodes", (PyCFunction)visuDataPy_delNodes, METH_VARARGS, "Delete the given nodes."}, {"setVisuPlanes", (PyCFunction)visuDataPy_setVisuPlanes, METH_O, "Draw the given planes inside the box of the given data."}, {NULL, NULL, 0, NULL} }; /* static PyMemberDef VisuDataPyMembers[] = */ /* { */ /* {"dt", T_OBJECT_EX, offsetof(Dtsets, dt), READONLY, */ /* "Internal identifier for Fortran calls."}, */ /* {NULL, 0, 0, 0, NULL} */ /* }; */ static PyTypeObject VisuDataPyType = { PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ "v_sim.VisuDataPy", /*tp_name*/ sizeof(VisuDataPy), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)visuDataPy_free, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash */ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ "Ploum", /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ VisuDataPyMethods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ (initproc)visuDataPy_init, /* tp_init */ 0, /* tp_alloc */ visuDataPy_new, /* tp_new */ /* 0, */ /* 0, */ /* 0, */ /* 0, */ /* 0, */ /* 0, */ /* 0, */ /* 0 */ }; static int visuElementPy_init(VisuElementPy *self _U_, PyObject *args _U_, PyObject *kwds _U_) { return 0; } static PyObject* visuElementPy_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { VisuElementPy *self; char *name; gchar *eleName; PyObject *argsPy = NULL, *namePy; name = (char*)0; eleName = (gchar*)0; namePy = PyTuple_GetItem(args, 0); if (! PyObject_TypeCheck(namePy, &PyString_Type) && ! PyObject_TypeCheck(namePy, &PyInt_Type)) { PyErr_SetString(PyExc_TypeError, "first argument must be a string or a Z number."); return NULL; } else { if (PyObject_TypeCheck(namePy, &PyString_Type)) name = PyString_AsString(namePy); else if (PyObject_TypeCheck(namePy, &PyInt_Type)) { if (!tool_physic_getSymbolFromZ(&eleName, (float*)0, ((PyIntObject*)namePy)->ob_ival)) PyErr_SetString(PyExc_ValueError, "Unknown element."); name = eleName; } } if (!name) return NULL; argsPy = PyTuple_GetSlice(args, 1, PyTuple_Size(args)); self = (VisuElementPy*)type->tp_alloc(type, 0); if (self != NULL) { DBG_fprintf(stderr, "Visu Python: new VisuElement object %p.\n", self); self->obj = visu_element_getFromName(name); if (self->obj) self->ownByVSim = TRUE; else { self->obj = visu_element_new(name); self->ownByVSim = FALSE; } } else { Py_DECREF(argsPy); return NULL; } if (! visuElementPy_set((PyObject*)self, argsPy, kwds)) { Py_DECREF(argsPy); return NULL; } Py_DECREF(argsPy); return (PyObject *)self; } static void visuElementPy_free(VisuElementPy* self) { DBG_fprintf(stderr, "Visu Python: deallocate a VisuElement object %p.\n", self); if (!self->ownByVSim) visuElementFree(self->obj); self->ob_type->tp_free((PyObject*)self); } static PyObject* visuElementPy_set(PyObject *obj, PyObject *args, PyObject *kwds) { VisuElementPy *self; static char *kwlist[] = {"rgba", "material", "rendered", "hidden", NULL}; PyObject *rgbPy = NULL, *matPy = NULL, *rendered = Py_True, *hidden = Py_True; float rgb[4] = {-1.f, -1.f, -1.f, -1.f}; float mat[5] = {-0.2f, -1.f, -0.5f, -0.5f, -0.f}; DBG_fprintf(stderr, "Visu Python: set values for VisuElement '%s' object %p.\n", ((VisuElementPy*)obj)->obj->name, obj); if (! PyArg_ParseTupleAndKeywords(args, kwds, "|O!O!O!O!", kwlist, &PyTuple_Type, &rgbPy, &PyTuple_Type, &matPy, &PyBool_Type, &rendered, &PyBool_Type, &hidden)) return NULL; if (rgbPy) { if (! PyArg_ParseTuple(rgbPy, "ffff", rgb, rgb + 1, rgb + 2, rgb + 3)) return NULL; } if (matPy) { if (! PyArg_ParseTuple(matPy, "fffff", mat, mat + 1, mat + 2, mat + 3, mat + 4)) return NULL; } self = (VisuElementPy*)obj; if (rgb[0] >= 0.f && mat[0] >= 0.f) visuElementSet_allColorValues(self->obj, rgb, mat); else if (rgb[0] >= 0.f) visuElementSet_allRGBValues(self->obj, rgb); else if (mat[0] >= 0.f) visuElementSet_allVisuGlLightMaterialValues(self->obj, mat); visuElementSet_rendered(self->obj, (rendered == Py_True)); visuElementSet_sensitiveToVisuPlanes(self->obj, (hidden == Py_True)); Py_INCREF(Py_None); return Py_None; } static int visuNodePy_init(VisuNodePy *self _U_, PyObject *args _U_, PyObject *kwds _U_) { return 0; } static PyObject* visuNodePy_new(PyTypeObject *type, PyObject *args, PyObject *kwds _U_) { VisuNodePy *self; guint id; PyObject *parentPy; if (! PyArg_ParseTuple(args, "O!I", &VisuDataPyType, &parentPy, &id)) return NULL; self = (VisuNodePy*)type->tp_alloc(type, 0); if (self == NULL) return NULL; DBG_fprintf(stderr, "Visu Python: new VisuNode object %p.\n", self); Py_INCREF(parentPy); self->nodeId = id; self->parent = (VisuDataPy*)parentPy; return (PyObject *)self; } static void visuNodePy_free(VisuNodePy* self) { DBG_fprintf(stderr, "Visu Python: deallocate a VisuNode object %p.\n", self); Py_DECREF(self->parent); self->ob_type->tp_free((PyObject*)self); } static PyObject* visuNodePy_set(PyObject *obj, PyObject *args, PyObject *kwds) { VisuNodePy *self; static char *kwlist[] = {"coord", "translation", "rendered", "emit", NULL}; PyObject *coordPy = NULL, *transPy = NULL, *rendered = Py_None, *emit = Py_False; gboolean coordSet = FALSE, transSet = FALSE; float coord[3] = {-1.f, -1.f, -1.f}; float trans[3] = {-1.f, -1.f, -1.f}; VisuNode *node; gboolean emitPos; DBG_fprintf(stderr, "Visu Python: set values for VisuNode %d object %p.\n", ((VisuNodePy*)obj)->nodeId, obj); if (! PyArg_ParseTupleAndKeywords(args, kwds, "|O!O!O!O!", kwlist, &PyTuple_Type, &coordPy, &PyTuple_Type, &transPy, &PyBool_Type, &rendered, &PyBool_Type, &emit)) return NULL; if (coordPy) { if (! PyArg_ParseTuple(coordPy, "fff", coord, coord + 1, coord + 2)) return NULL; coordSet = TRUE; } if (transPy) { if (! PyArg_ParseTuple(transPy, "fff", trans, trans + 1, trans + 2)) return NULL; transSet = TRUE; } self = (VisuNodePy*)obj; node = visuDataGet_nodeFromNumber(self->parent->obj, self->nodeId); if (!node) { PyErr_SetString(PyExc_RuntimeError, "not a VisuNode anymore."); return NULL; } emitPos = FALSE; if (coordSet) { node->xyz[0] = coord[0]; node->xyz[1] = coord[1]; node->xyz[2] = coord[2]; emitPos = (emit == Py_True); } if (transSet) { node->translation[0] = coord[0]; node->translation[1] = coord[1]; node->translation[2] = coord[2]; emitPos = (emit == Py_True); } if (rendered != Py_None && visuNodeSet_visibility(node, (rendered == Py_True)) && emit == Py_True) visuDataEmit_nodeRenderedChange(self->parent->obj); if (emitPos) visuDataEmit_nodePositionChanged(self->parent->obj); Py_INCREF(Py_None); return Py_None; } static PyObject* visuNodePy_isValid(PyObject *obj) { VisuNodePy *self; VisuNode *node; self = (VisuNodePy*)obj; node = visuDataGet_nodeFromNumber(self->parent->obj, self->nodeId); if (node) { Py_INCREF(Py_True); return Py_True; } else { Py_INCREF(Py_False); return Py_False; } } static void _onAskForHide(VisuData *visuData, gboolean *redraw, VisuDataPy *self); static void _onPositionChanged(VisuData *dataObj, VisuDataPy *self); static int visuDataPy_init(VisuDataPy *self, PyObject *args _U_, PyObject *kwds _U_) { self->planes = (PyObject*)0; self->planesId = 0; return 0; } static PyObject* visuDataPy_new(PyTypeObject *type, PyObject *args, PyObject *kwds _U_) { VisuDataPy *self; PyObject *parentPy = NULL; self = (VisuDataPy*)type->tp_alloc(type, 0); if (self != NULL) DBG_fprintf(stderr, "Visu Python: new VisuData object %p.\n", self); if (!PyArg_ParseTuple(args, "|O!", &VisuDataPyType, &parentPy)) return NULL; if (parentPy) self->obj = visuDataNew_withVisuGlView(visuDataGet_openGLView(((VisuDataPy*)parentPy)->obj)); else self->obj = visuDataNew(); g_object_ref(G_OBJECT(self->obj)); g_object_set_data(G_OBJECT(self->obj), "selfPython", self); g_signal_connect(G_OBJECT(self->obj), "AskForShowHide", G_CALLBACK(_onAskForHide), self); g_signal_connect(G_OBJECT(self->obj), "PositionChanged", G_CALLBACK(_onPositionChanged), self); return (PyObject *)self; } static void visuDataPy_free(VisuDataPy* self) { DBG_fprintf(stderr, "Visu Python: deallocate a VisuData object %p.\n", self); g_object_unref(G_OBJECT(self->obj)); self->ob_type->tp_free((PyObject*)self); } static PyObject* visuDataPy_addFile(PyObject *self, PyObject *args, PyObject *kwds) { char *filename; int type; static char *kwlist[] = {"filename", "type", NULL}; if (! PyArg_ParseTupleAndKeywords(args, kwds, "si", kwlist, &filename, &type)) return NULL; visuDataAdd_file(((VisuDataPy*)self)->obj, filename, type, (ToolFileFormat*)0); Py_INCREF(Py_None); return Py_None; } static PyObject* visuDataPy_getPopulation(PyObject *self) { PyObject* dict, *nb; const char *ele; VisuNodeArray *nodes; guint i; dict = PyDict_New(); if (!dict) return NULL; nodes = visu_data_getNodeArray(((VisuDataPy*)self)->obj); if (nodes) for (i = 0; i < nodes->ntype; i++) { nb = PyInt_FromLong((long)nodes->nStoredNodesPerEle[i]); ele = ((VisuDataPy*)self)->obj->fromIntToVisuElement[i]->name; PyDict_SetItemString(dict, ele, nb); } Py_INCREF(dict); return dict; } static PyObject* visuDataPy_setPopulation(PyObject *self, PyObject *args, PyObject *kwds) { static char *kwlist[] = {"population", "iSet", NULL}; guint ntypes, i, iSet; VisuElement **visuElementUsed; guint *nbOfNodesPerVisuElement; PyObject *dict, *key, *value; #if PY_MINOR_VERSION > 4 Py_ssize_t pos = 0; #else int pos = 0; #endif iSet = 0; if (! PyArg_ParseTupleAndKeywords(args, kwds, "O!|I", kwlist, &PyDict_Type, &dict, &iSet)) return NULL; ntypes = (guint)PyDict_Size(dict); if (ntypes == 0) { PyErr_SetString(PyExc_ValueError, "dictionary of elements must not be empty."); return NULL; } visuElementUsed = g_malloc(sizeof(VisuElement*) * ntypes); nbOfNodesPerVisuElement = g_malloc(sizeof(guint) * ntypes); visuDataFree_population(((VisuDataPy*)self)->obj); pos = 0; i = 0; while (PyDict_Next(dict, &pos, &key, &value)) { if (! PyObject_TypeCheck(key, &VisuElementPyType)) { PyErr_SetString(PyExc_TypeError, "keys must be VisuElementPy."); g_free(visuElementUsed); g_free(nbOfNodesPerVisuElement); return NULL; } if (! PyInt_Check(value) || ((PyIntObject*)value)->ob_ival <= 0) { PyErr_SetString(PyExc_TypeError, "values must be positive integer."); g_free(visuElementUsed); g_free(nbOfNodesPerVisuElement); return NULL; } Py_INCREF(key); visuElementUsed[i] = ((VisuElementPy*)key)->obj; nbOfNodesPerVisuElement[i] = (int) ((PyIntObject*)value)->ob_ival; i += 1; } if (i != ntypes) { PyErr_SetString(PyExc_RuntimeError, "can't browse the population dictionnary."); g_free(visuElementUsed); g_free(nbOfNodesPerVisuElement); return NULL; } visu_data_setPopulation(((VisuDataPy*)self)->obj, ntypes, nbOfNodesPerVisuElement, visuElementUsed); visuDataSet_setId(((VisuDataPy*)self)->obj, iSet); g_free(visuElementUsed); g_free(nbOfNodesPerVisuElement); Py_INCREF(Py_None); return Py_None; } static PyObject* visuDataPy_createAllNodes(PyObject *self) { visuData_createAllNodes(((VisuDataPy*)self)->obj); Py_INCREF(Py_None); return Py_None; } static PyObject* visuDataPy_setBox(PyObject *self, PyObject *args, PyObject *kwds) { static char *kwlist[] = {"box", "periodic", "scale", NULL}; float box[6], size; double rprimd[3][3]; PyObject *bool, *boxPy; size = 0.f; if (! PyArg_ParseTupleAndKeywords(args, kwds, "O!|O!f", kwlist, &PyTuple_Type, &boxPy, &PyBool_Type, &bool, &size)) return NULL; if (PyTuple_Size(boxPy) == 6 && ! PyArg_ParseTuple(boxPy, "ffffff", box, box + 1, box + 2, box + 3, box + 4, box + 5)) return NULL; if (PyTuple_Size(boxPy) == 3 && ! PyArg_ParseTuple(boxPy, "(ddd)(ddd)(ddd)", rprimd[0], rprimd[0] + 1, rprimd[0] + 2, rprimd[1], rprimd[1] + 1, rprimd[1] + 2, rprimd[2], rprimd[2] + 1, rprimd[2] + 2)) return NULL; if (PyTuple_Size(boxPy) == 3) tool_matrix_reducePrimitiveVectors(box, rprimd); visu_data_setBoxGeometry(((VisuDataPy*)self)->obj, box, (bool == Py_True)); visu_data_applyBoxGeometry(((VisuDataPy*)self)->obj); Py_INCREF(Py_None); return Py_None; } static PyObject* visuDataPy_addNode(PyObject *self, PyObject *args, PyObject *kwds) { float xyz[3]; static char *kwlist[] = {"element", "coord", "emit", NULL}; PyObject *ele, *emitPy = Py_False, *xyzPy; VisuNode *node; VisuNodePy *nodePy; if (! PyArg_ParseTupleAndKeywords(args, kwds, "O!O!|O!", kwlist, &VisuElementPyType, &ele, &PyTuple_Type, &xyzPy, &PyBool_Type, &emitPy)) return NULL; if (! PyArg_ParseTuple(xyzPy, "fff", xyz, xyz + 1, xyz + 2)) return NULL; node = visu_data_addNodeFromElement(((VisuDataPy*)self)->obj, ((VisuElementPy*)ele)->obj, xyz, (emitPy == Py_True)); if (!node) { PyErr_SetString(PyExc_ValueError, "can't add new node."); return NULL; } DBG_fprintf(stderr, "Visu Python: create a new object for node %d %p.\n", node->number, node); nodePy = (VisuNodePy*)PyObject_New(VisuNodePy, &VisuNodePyType); if (nodePy == NULL) return NULL; Py_INCREF(self); nodePy->nodeId = node->number; nodePy->parent = (VisuDataPy*)self; Py_INCREF(nodePy); return (PyObject *)nodePy; } static PyObject* visuDataPy_delNodes(PyObject *self, PyObject *args) { PyObject *nodesPy, *nodePy; int *nodes, n, i; if (! PyArg_ParseTuple(args, "O", &nodesPy)) return NULL; nodes = (int*)0; if (PyObject_TypeCheck(nodesPy, &PyInt_Type)) { nodes = g_malloc(sizeof(int) * 2); nodes[0] = (int) ((PyIntObject*)nodesPy)->ob_ival; if (nodes[0] < 0) { PyErr_SetString(PyExc_ValueError, "Only positive numbers identify nodes."); g_free(nodes); return NULL; } nodes[1] = -1; } else if (PyObject_TypeCheck(nodesPy, &VisuNodePyType)) { nodes = g_malloc(sizeof(int) * 2); nodes[0] = ((VisuNodePy*)nodesPy)->nodeId; nodes[1] = -1; } else if (PyObject_TypeCheck(nodesPy, &PyTuple_Type)) { n = PyTuple_GET_SIZE(nodesPy); nodes = g_malloc(sizeof(int) * (n + 1)); for (i = 0; i < n; i++) { nodePy = PyTuple_GET_ITEM(nodesPy, i); if (! PyObject_TypeCheck(nodePy, &PyInt_Type) && ! PyObject_TypeCheck(nodePy, &VisuNodePyType)) { PyErr_SetString(PyExc_TypeError, "Arguments should be integers or VisuNodePy."); g_free(nodes); return NULL; } if (PyObject_TypeCheck(nodePy, &PyInt_Type)) { nodes[i] = (int) ((PyIntObject*)nodePy)->ob_ival; if (nodes[i] < 0) { PyErr_SetString(PyExc_ValueError, "Only positive numbers identify nodes."); g_free(nodes); return NULL; } } else nodes[i] = ((VisuNodePy*)nodePy)->nodeId; } nodes[n] = -1; } else { PyErr_SetString(PyExc_TypeError, "Argument must be tuple, integer or VisuNodePy."); return NULL; } visuDataRemove_nodes(((VisuDataPy*)self)->obj, nodes); g_free(nodes); Py_INCREF(Py_None); return Py_None; } static VisuPlane** _buildArrayOfVisuPlanes(VisuDataPy *self) { int i, n; VisuPlane **planes; n = PyTuple_GET_SIZE(self->planes); planes = g_malloc(sizeof(VisuPlane*) * (n + 1)); for (i = 0; i < n; i++) planes[i] = ((VisuPlanePy*)PyTuple_GET_ITEM(self->planes, i))->obj; planes[n] = (VisuPlane*)0; return planes; } static void _rebuildVisuPlanes(VisuData *dataObj) { VisuPlane **planes; VisuDataPy *self; self = (VisuDataPy*)g_object_get_data(G_OBJECT(dataObj), "selfPython"); if (!self) return; planes = _buildArrayOfVisuPlanes(self); DBG_fprintf(stderr, "Visu Python: create OpenGL list for planes.\n"); visu_plane_class_drawList(planes, self->planesId); DBG_fprintf(stderr, " | OK\n"); g_free(planes); } static void _onVisuPlaneMoved(VisuPlane *plane _U_, VisuDataPy *self) { _rebuildVisuPlanes(self->obj); } static void _onAskForHide(VisuData *visuData, gboolean *redraw, VisuDataPy *self) { VisuPlane **planes; if (!self->planes) return; DBG_fprintf(stderr, "Visu Python: caught the 'AskForShowHide' signal for" " VisuData %p.\n", (gpointer)visuData); planes = _buildArrayOfVisuPlanes(self); *redraw = visu_plane_class_showHideAll(visuData, planes) || *redraw; g_free(planes); } static void _onPositionChanged(VisuData *dataObj, VisuDataPy *self) { gboolean redraw; DBG_fprintf(stderr, "Visu Python: caught the 'PositionChanged' signal," " recalculating masking properties.\n"); if (self->planes) { visuDataEmit_askForShowHideNodes(dataObj, &redraw); if (redraw) visuDataEmit_nodeRenderedChange(dataObj); } } static PyObject* visuDataPy_setVisuPlanes(PyObject *obj, PyObject *planes) { VisuDataPy *self = (VisuDataPy*)obj; int i; PyObject *plane; float vertices[8][3]; VisuPlane *planeObj; VisuGlExt *planeExt; if (!PyObject_TypeCheck(planes, &PyTuple_Type)) { PyErr_SetString(PyExc_TypeError, "Argument must be tuple of v_sim.plane."); return NULL; } for (i = 0; i < PyTuple_GET_SIZE(planes); i++) { plane = PyTuple_GET_ITEM(planes, i); if (! PyObject_TypeCheck(plane, PLANEPY_TYPE)) { PyErr_SetString(PyExc_TypeError, "Tuple argument must contain v_sim.plane objects."); return NULL; } } Py_XDECREF(self->planes); Py_INCREF(planes); self->planes = planes; /* We compute the plane intersections with this VisuData box, and connect the change signals. */ visuDataGet_boxVertices(self->obj, vertices, TRUE); for (i = 0; i < PyTuple_GET_SIZE(self->planes); i++) { planeObj = ((VisuPlanePy*)PyTuple_GET_ITEM(self->planes, i))->obj; g_signal_connect(G_OBJECT(planeObj), "moved", G_CALLBACK(_onVisuPlaneMoved), (gpointer)self); visu_plane_setBox(planeObj, vertices); } /* We create an OpenGL extension to draw the planes if not already done. */ if (!self->planesId) { self->planesId = visu_gl_objectlist_new(1); planeExt = visu_gl_ext_new("VisuPlanes", "VisuPlanes", (char*)0, self->planesId, _rebuildVisuPlanes); planeExt->used = 1; visu_gl_ext_setSensitiveToRenderingMode(planeExt, TRUE); visu_gl_ext_setPriority(planeExt, VISU_GL_EXT_PRIORITY_LOW + 1); visu_gl_ext_register(planeExt); } _rebuildVisuPlanes(self->obj); Py_INCREF(Py_None); return Py_None; } static int width, height; static void _createMain(GtkWindow **panel, GtkWindow **render) { GtkWidget *renderingWindow; /* Force the creation of the Scale class. */ DBG_fprintf(stderr,"Visu Python: create a rendering window (%dx%d).\n", width, height); renderingWindow = visu_ui_rendering_window_new(width, height, TRUE, FALSE); visuVisuUiRenderingWindowSet_default(renderingWindow); *panel = (GtkWindow*)0; *render = (GtkWindow*)0; return; } static gboolean _parseFiles(gpointer data _U_) { GString *message; message = visu_basic_parseConfigFiles(); if (message) { g_string_free(message, TRUE); } } static PyObject* visuPyMain(PyObject *self _U_, PyObject *args, PyObject *kwds) { PyObject *me; static char *kwlist[] = {"width", "height", NULL}; GtkWidget *renderingWindow; width = 600; height = 600; /* Try to get the width and the height. */ if (! PyArg_ParseTupleAndKeywords(args, kwds, "|ii", kwlist, &width, &height)) return NULL; /* Force the creation of the Scale class. */ DBG_fprintf(stderr,"Visu Python: create a rendering window (%dx%d).\n", width, height); renderingWindow = visu_ui_rendering_window_new(width, height, TRUE, FALSE); visuVisuUiRenderingWindowSet_default(renderingWindow); g_idle_add(_parseFiles, (gpointer)0); me = pygobject_new(G_OBJECT(renderingWindow)); Py_INCREF(me); return me; } static PyObject* visuPyLoad(PyObject *self _U_, PyObject *args, PyObject *kwds) { PyObject *obj; int iSet; PyObject *bool; static char *kwlist[] = {"data", "iSet", "internal", NULL}; GError *error; gboolean res; /* Try to get the width and the height. */ iSet = 0; if (! PyArg_ParseTupleAndKeywords(args, kwds, "O!|iO!", kwlist, &VisuDataPyType, &obj, &iSet, &PyBool_Type, &bool)) return NULL; DBG_fprintf(stderr,"Visu Python: load VisuData from %p (%p).\n", obj, ((VisuDataPy*)obj)->obj); if ((bool == Py_False)) visuGtkLoad_file(((VisuDataPy*)obj)->obj, iSet); else { error = (GError*)0; res = visu_object_load(((VisuDataPy*)obj)->obj, (ToolFileFormat*)0, iSet, &error); if (error) { PyErr_SetString(PyExc_TypeError, error->message); g_error_free(error); return NULL; } visuVisuUiRenderingWindowSet_visuData (VISU_UI_RENDERING_WINDOW(visuVisuUiRenderingWindowGet_current()), ((VisuDataPy*)obj)->obj); /* We release a ref on obj, since visu_ui_rendering_window_setData has increased it. */ g_object_unref(G_OBJECT(((VisuDataPy*)obj)->obj)); visuData_createAllNodes(((VisuDataPy*)obj)->obj); } Py_INCREF(Py_None); return Py_None; } static PyObject* visuPySet(PyObject *self _U_, PyObject *data) { if (! PyObject_TypeCheck(data, &VisuDataPyType) && data != Py_None) { PyErr_SetString(PyExc_TypeError, "argument must be of type VisuDataPy or None."); return NULL; } if (data != Py_None) { visu_ui_rendering_window_setData(VISU_UI_RENDERING_WINDOW(visuVisuUiRenderingWindowGet_current()), ((VisuDataPy*)data)->obj); rebuildAllExtensionsLists(((VisuDataPy*)data)->obj); } else visu_ui_rendering_window_setData(VISU_UI_RENDERING_WINDOW(visuVisuUiRenderingWindowGet_current()), (VisuData*)0); g_idle_add(visu_object_redraw, (gpointer)0); Py_INCREF(Py_None); return Py_None; } static PyObject* visuPyRedraw(PyObject *self _U_) { g_idle_add(visu_object_redraw, (gpointer)0); Py_INCREF(Py_None); return Py_None; } /* We define here all the methods of the module. */ static PyMethodDef ModuleMethods[] = { {"main", (PyCFunction)visuPyMain, METH_VARARGS | METH_KEYWORDS, "Start a V_Sim run and open an empty rendering window."}, {"load", (PyCFunction)visuPyLoad, METH_VARARGS | METH_KEYWORDS, "Load the given data."}, {"set", (PyCFunction)visuPySet, METH_O, "Associate a VisuData to a rendering area."}, {"redraw", (PyCFunction)visuPyRedraw, METH_NOARGS, "Redraw the rendering area."}, {NULL, NULL, 0, NULL} }; /* The name initv_sim is mandatory, do not change it! */ PyMODINIT_FUNC initv_sim(void) { PyObject *module; if (PyType_Ready(&VisuDataPyType) < 0) return; if (PyType_Ready(&VisuElementPyType) < 0) return; if (PyType_Ready(&VisuNodePyType) < 0) return; if (PyType_Ready(PLANEPY_TYPE) < 0) return; module = Py_InitModule("v_sim", ModuleMethods); if (module == NULL) return; Py_INCREF(&VisuDataPyType); PyModule_AddObject(module, "data", (PyObject*)&VisuDataPyType); Py_INCREF(&VisuElementPyType); PyModule_AddObject(module, "element", (PyObject*)&VisuElementPyType); Py_INCREF(&VisuNodePyType); PyModule_AddObject(module, "node", (PyObject*)&VisuNodePyType); Py_INCREF(PLANEPY_TYPE); PyModule_AddObject(module, "plane", (PyObject*)PLANEPY_TYPE); init_pygobject(); init_pygtk(); /* Set the static paths for V_Sim. */ visuBasicSet_paths((const gchar*)0); visu_basic_init(); } v_sim-3.7.0/lib/python/plane_py.c0000644000353400050620000002020012215546150013616 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2008) Adresse ml : CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors: Damien CALISTE, laboratoire L_Sim, (2001-2008) E-mail address: CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "plane_py.h" #include static int planePy_init (VisuPlanePy *self, PyObject *args, PyObject *kwds); static PyObject* planePy_new (PyTypeObject *type, PyObject *args, PyObject *kwds); static void planePy_free (VisuPlanePy* self); static PyObject* planePy_set (PyObject *obj, PyObject *args, PyObject *kwds); static PyObject* planePy_getRGBA(PyObject *obj, PyObject *args); static PyMethodDef VisuPlanePyMethods[] = { {"set", (PyCFunction)planePy_set, METH_VARARGS | METH_KEYWORDS, "Change the characteristics of a VisuPlane.\n\n" "Keyword arguments:\n" "rgba (optional) -- a tuple of four floats values between 0 and 1\n" " describing the RGBA colour of the plane.\n" "normal (optional) -- a tuple of three floats values representing the\n" " normal vector of the plane.\n" "distance (optional) -- a float value with the distance of the plane to\n" " the origin of the basis set.\n" "rendered (optional) -- a boolean to say if the plane is drawn or not.\n" "hide (optional) -- an integer value taking -1, 0 or +1 values\n" " specifying the hiding effect of the plane. With\n" " a value of 0, there is no masking, with +1, nodes\n" " after the plane are hidden and with -1, the ones\n" " before the plane."}, {"getRGBA", (PyCFunction)planePy_getRGBA, METH_NOARGS, "Retrieve the colour of a plane.\n\n" "Returns: a tuple of four floats values between 0 and 1\n" " describing the RGBA colour of the plane."}, {NULL, NULL, 0, NULL} }; static PyTypeObject VisuPlanePyType = { PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ "v_sim.VisuPlanePy", /*tp_name*/ sizeof(VisuPlanePy), /*tp_basicsize*/ 0, /*tp_itemsize*/ (destructor)planePy_free, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash */ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ "Ploum", /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ VisuPlanePyMethods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ (initproc)planePy_init, /* tp_init */ 0, /* tp_alloc */ planePy_new, /* tp_new */ /* 0, */ /* 0, */ /* 0, */ /* 0, */ /* 0, */ /* 0, */ /* 0, */ /* 0 */ }; static int planePy_init(VisuPlanePy *self _U_, PyObject *args _U_, PyObject *kwds _U_) { return 0; } static PyObject* planePy_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { VisuPlanePy *self; self = (VisuPlanePy*)type->tp_alloc(type, 0); if (self != NULL) { DBG_fprintf(stderr, "Visu Python: new VisuPlane object %p.\n", self); self->obj = visu_plane_newUndefined(); if (!self->obj) { Py_DECREF(self); return NULL; } } else return NULL; /* We call the set method. */ if (!planePy_set((PyObject*)self, args, kwds)) { Py_DECREF(self); return NULL; } /* Py_INCREF(self); */ return (PyObject *)self; } static void planePy_free(VisuPlanePy* self) { DBG_fprintf(stderr, "Visu Python: deallocate a VisuPlane object %p.\n", self); if (self->obj) g_object_unref(G_OBJECT(self->obj)); self->ob_type->tp_free((PyObject*)self); } static PyObject* planePy_set(PyObject *obj, PyObject *args, PyObject *kwds) { VisuPlanePy *self; static char *kwlist[] = {"rgba", "normal", "distance", "rendered", "hide", NULL}; PyObject *rgbPy = NULL, *vectPy = NULL, *rendered = Py_True; ToolColor *color; float rgb[4] = {-1.f, -1.f, -1.f, -1.f}; float vect[3] = {-123456.f, -1.f, -1.f}; float dist = -12345.f; int res, hide = -2; self = (VisuPlanePy*)obj; DBG_fprintf(stderr, "Visu Python: set values for VisuPlane %p object %p.\n", self->obj, obj); if (! PyArg_ParseTupleAndKeywords(args, kwds, "|O!O!fO!i", kwlist, &PyTuple_Type, &rgbPy, &PyTuple_Type, &vectPy, &dist, &PyBool_Type, &rendered, &hide)) return NULL; if (rgbPy) { if (! PyArg_ParseTuple(rgbPy, "ffff", rgb, rgb + 1, rgb + 2, rgb + 3)) return NULL; } if (vectPy) { if (! PyArg_ParseTuple(vectPy, "fff", vect, vect + 1, vect + 2)) return NULL; } res = 0; if (rgb[0] >= 0.f) { color = tool_color_addFloatRGBA(rgb, NULL); res = visu_plane_setColor(self->obj, color) || res; } if (vect[0] != -123456.f) res = visu_plane_setNormalVector(self->obj, vect) || res; if (dist != -12345.f) res = visu_plane_setDistanceFromOrigin(self->obj, dist) || res; res = visu_plane_setRendered(self->obj, (rendered == Py_True)) || res; if (hide != -2) res = visu_plane_setHiddenState(self->obj, hide) || res; if (res) { Py_INCREF(Py_True); return Py_True; } else { Py_INCREF(Py_False); return Py_False; } } static PyObject* planePy_getRGBA(PyObject *obj, PyObject *args) { VisuPlanePy *self; PyObject *ret; ToolColor *color; self = (VisuPlanePy*)obj; DBG_fprintf(stderr, "Visu Python: get RGBA for VisuPlane %p object %p.\n", self->obj, obj); visu_plane_getColor(self->obj, &color); ret = Py_BuildValue("(ffff)", color->rgba[0], color->rgba[1], color->rgba[2], color->rgba[3]); Py_INCREF(ret); return ret; } PyTypeObject* planePyGet_type() { return &VisuPlanePyType; } v_sim-3.7.0/lib/python/example.py0000754000353400050620000001061312215546150013661 00000000000000#!/usr/bin/env python import math, random import gobject import gtk, v_sim def delete_event(widget, event, data=None): return False def destroy(widget, data=None): gtk.main_quit() def reset(widget, v_sim, handles): stop(widget, handles) v_sim.set(None) def stop(widget, handles): if (handles[0] is not None): gobject.source_remove(handles[0]) if (handles[1] is not None): gobject.source_remove(handles[1]) handles[0] = None handles[1] = None def load(widget, v_sim, data, nodes, C, angle, handles): if (handles[0] is not None): gobject.source_remove(handles[0]) if (handles[1] is not None): gobject.source_remove(handles[1]) v_sim.set(data) handles[0] = gobject.timeout_add(10, turn, angle, v_sim, data, nodes) handles[1] = gobject.timeout_add(1000, add, data, angle, C, nodes) def turn(angle, v_sim, data, nodes): angle[1] = math.pi * 2 / 3 + 0.5 * math.sin(angle[0] * 2) nodes[0].set(coord=(1.2 * math.sin(angle[1]) * (math.cos(angle[0])) + 2.5, \ 1.2 * math.sin(angle[1]) * (math.sin(angle[0])) + 2.5, \ 1.2 * math.cos(angle[1]) + 2)) nodes[1].set(coord=(1.2 * math.sin(angle[1]) * (math.cos(angle[0] + math.pi)) + 2.5, \ 1.2 * math.sin(angle[1]) * (math.sin(angle[0] + math.pi)) + 2.5, \ 1.2 * math.cos(angle[1]) + 2), emit = True) if (nodes[2].isValid()): nodes[2].set(coord=(2.5, 2.5, 4 + math.sin(angle[1] + math.pi/4))) data.createAllNodes() v_sim.redraw() angle[0] += math.pi / 100 if (angle[0] > 2 * math.pi): angle[0] = 0 print data.getPopulation() return True def add(data, angle, C, nodes): if (nodes[2].isValid()): data.delNodes(nodes[2]) else: nodes[2] = data.addNode(C, (2.5, 2.5, 4. + math.sin(angle[1] + math.pi/4)), emit = True) return True def start(window, handles): render = v_sim.main(width=400) window.get_data("hbox").pack_start(render, False, False, 0) angle = [0., math.pi * 2 / 3] O = v_sim.element("O", rgba=(1., 0.2, 0., 1.)) #O.set(rendered = False) H = v_sim.element("H", rgba=(0.2, 0.4, 0.5, 0.3)) C = v_sim.element("C", rgba=(0.1, 0.1, 0.1, 1.)) data = v_sim.data() data.setPopulation({O:1, H:2, C:1}) data.addNode(O, (2.5, 2.5, 2)) nodes = [] nodes.append(data.addNode(H, (1.5, 2.5, 1))) nodes.append(data.addNode(H, (3.5, 2.5, 1))) nodes.append(v_sim.node(data, 3)) data.setBox((5., 0., 5., 0., 0., 5.), True) plane = v_sim.plane(normal = (1,0,0), distance = 3, rgba = (1,0.5,0.5,1)) data.setPlanes((plane,)) window.get_data("play").connect("clicked", load, v_sim, data, nodes, C, angle, handles) window.get_data("stop").connect("clicked", stop, handles) window.get_data("reset").connect("clicked", reset, v_sim, handles) return False bouncing = """ O = v_sim.element("O", rgba=(1., 0.2, 0., 1.)) #O.set(rendered = False) H = v_sim.element("H", rgba=(0.2, 0.4, 0.5, 0.3)) C = v_sim.element("C", rgba=(0.1, 0.1, 0.1, 1.)) data = v_sim.data() data.setPopulation({O:1, H:2, C:1}) data.addNode(O, (2.5, 2.5, 2)) data.addNode(H, (1.5, 2.5, 1)) data.addNode(H, (3.5, 2.5, 1)) data.setBox((5., 0., 5., 0., 0., 5.), True) """ handles = [None, None] # Set the GTK interface. window = gtk.Window(gtk.WINDOW_TOPLEVEL) window.connect("delete_event", delete_event) window.connect("destroy", destroy) hbox = gtk.HBox() window.add(hbox) vbox = gtk.VBox() vbox.set_border_width(7) hbox.pack_start(vbox, True, True, 0) wd = gtk.Label("Demonstrate Python bindings for V_Sim:") wd.set_use_markup(True) wd.set_padding(10, 0) vbox.pack_start(wd, False, False, 20) scroll = gtk.ScrolledWindow() scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS) scroll.set_shadow_type(gtk.SHADOW_ETCHED_OUT) vbox.pack_start(scroll, True, True, 0) buf = gtk.TextBuffer() buf.set_text(bouncing) wd = gtk.TextView(buf) wd.set_size_request(300, -1) wd.set_editable(False) scroll.add(wd) com = gtk.HBox() vbox.pack_end(com, False, False, 5) wd = gtk.Button(stock = gtk.STOCK_MEDIA_PLAY) window.set_data("play", wd) com.pack_end(wd, False, False, 0) wd = gtk.Button(stock = gtk.STOCK_MEDIA_STOP) window.set_data("stop", wd) com.pack_end(wd, False, False, 0) wd = gtk.Button(stock = gtk.STOCK_REMOVE) com.pack_start(wd, False, False, 0) window.set_data("reset", wd) window.set_data("hbox", hbox) window.show_all() gobject.idle_add(start, window, handles) gtk.main() v_sim-3.7.0/lib/python/abinitParser.py0000754000353400050620000002765212215546150014664 00000000000000#!/usr/bin/env python import abinit import numpy import pygtk, gtk, gobject import re, sys, os import ElementTree import v_sim def delete_event(widget, event, data=None): return False def destroy(widget, data=None): gtk.main_quit() def loadData(widget, response_id, window): if (response_id != gtk.RESPONSE_ACCEPT): return if (widget is not window.get_data("fileSel")): widget.hide() # Remove old columns. view = window.get_data("treeview") for col in view.get_columns()[1:]: view.remove_column(col) wd = window.get_data("hboxResults") wd.set_sensitive(False) window.set_data("dtsets", None) v_sim.set(None) # We parse the file. try: toto = abinit.Dtsets(widget.get_filename()) except Exception, err: window.get_data("fileSel").unselect_all() wd = gtk.MessageDialog(window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, err.msg) wd.run() wd.destroy() return window.set_data("dtsets", toto) wd = window.get_data("hboxResults") wd.set_sensitive(True) # Create a new model. args = "gtk.ListStore(gobject.TYPE_STRING" for i in range(toto.get_ndtset()): args += ", gobject.TYPE_STRING, gobject.TYPE_STRING" args += ")" model = eval(args) modelFilter = model.filter_new() window.set_data("model", model) modelFilter.set_visible_func(hideCycleIter, window) modelSort = gtk.TreeModelSort(modelFilter) modelSort.set_sort_column_id(0, gtk.SORT_ASCENDING) view.set_model(modelSort) for strId in abinit.get_ids().iterkeys(): iter = model.append() model.set(iter, 0, strId) default = toto.get(strId, 0) for i in range(toto.get_ndtset()): val = toto.get(strId, i + 1) if (numpy.all(val == default)): misc = "#505050" else: misc = "blue" if (val is None): val = "Unsupported type" model.set(iter, 2 * i + 1, val.__str__(), 2 * i + 2, misc) # Add the column to the tree view. for i in range(1, toto.get_ndtset() + 1): col = view.insert_column_with_attributes(-1, "Value dtset %d" % i, \ gtk.CellRendererText(), \ markup = 2 * i - 1, foreground = 2 * i) col.set_resizable(True) col.set_sort_column_id(i) # Adapt the range for the spDtSets button. window.get_data("spDtSets").set_range(1, toto.get_ndtset() + 1) def renderDtSet(widget, window): dtset = window.get_data("dtsets") iSet = int(window.get_data("spDtSets").get_value()) znucl = dtset.get("znucl", iSet) pop = {} eles = [] for i in znucl: ele = v_sim.element(int(i)) pop[ele] = 0 eles.append(ele) print pop typat = dtset.get("typat", iSet) for i in typat: pop[eles[i - 1]] += 1 data = v_sim.data() data.setPopulation(pop) rprimd = dtset.get("rprimd_orig", iSet) coord = dtset.get("xred_orig", iSet) i = 0 for xyz in coord: c = (rprimd[0][0] * xyz[0] + rprimd[0][1] * xyz[1] + rprimd[0][2] * xyz[2], \ rprimd[1][0] * xyz[0] + rprimd[1][1] * xyz[1] + rprimd[1][2] * xyz[2], \ rprimd[2][0] * xyz[0] + rprimd[2][1] * xyz[1] + rprimd[2][2] * xyz[2]) data.addNode(eles[typat[i] - 1], c) i += 1 box = rprimd.tolist() data.setBox((tuple(box[0]), tuple(box[1]), tuple(box[2])), True) v_sim.set(data) def hideCycleIter(model, iter, window): (strId,) = model.get(iter, 0) if (strId is None): return False if (window.get_data("hideDefault").get_active()): dtsets = window.get_data("dtsets") hide = True for i in range(dtsets.get_ndtset()): (color,) = model.get(iter, 2 * i + 2) hide = hide and (color != "blue") else: hide = False return (not(hide) and re.match(window.get_data("filter"), strId) is not None) def applyFilter(widget, window, entry): patStr = entry.get_text() if (patStr[-1] != "$"): patStr += "$" pat = re.compile(patStr) if (pat is not None): window.set_data("filter", pat) window.get_data("treeview").get_model().get_model().refilter() def applyHide(widget, window): window.get_data("treeview").get_model().get_model().refilter() def withArg(argv, window): fileSel = window.get_data("fileSel") fileSel.set_filename(os.path.abspath(sys.argv[1])) while (gtk.events_pending()): gtk.main_iteration() if (fileSel.get_filename() is not None): loadData(fileSel, gtk.RESPONSE_ACCEPT, window) else: raise ValueError("No file '%s'." % os.path.abspath(sys.argv[1])) return False def XMLGetText(var): if (var is None): return "" if (var.text is not None): text = var.text.strip().replace("\n", " ") + " " else: text = "" for child in var.getchildren(): if (child.tag == "p"): text += XMLGetText(child) + "\n" elif (child.tag == "ul"): text += "\n" + XMLGetText(child) elif (child.tag == "li"): text += " * " + XMLGetText(child) + "\n" elif (child.tag == "br"): text += "\n" else: text += XMLGetText(child) if (var.tail is not None): text += var.tail.strip().replace("\n", " ") + " " return re.sub(" *", " ", text) def selectAtt(selection, window): (model, iter) = selection.get_selected() if (iter is None): return iSets = [] (att,) = model.get(iter, 0) window.get_data("lblKeyword").set_markup("" + att + "") window.get_data("lblMnemonic").set_markup("") window.get_data("lblCategory").set_markup("") window.get_data("lblType").set_markup("") window.get_data("lblDefault").set_markup("") window.get_data("description").set_text("") varlist = window.get_data("varlist") for var in varlist: if (var.find("keyword").text == att): window.get_data("lblMnemonic").set_markup(XMLGetText(var.find("mnemonics"))) window.get_data("lblCategory").set_markup(XMLGetText(var.find("categories"))) window.get_data("lblType").set_markup(XMLGetText(var.find("type"))) window.get_data("lblDefault").set_markup(XMLGetText(var.find("default"))) window.get_data("description").set_text(XMLGetText(var.find("description"))) break if __name__ == "__main__": window = gtk.Window(gtk.WINDOW_TOPLEVEL) window.set_border_width(5) window.connect("delete_event", delete_event) window.connect("destroy", destroy) vbox = gtk.VBox() window.add(vbox) hbox = gtk.HBox() vbox.pack_start(hbox, False, False, 5) wd = gtk.Label("Analysing data file:") wd.set_use_markup(True) wd.set_alignment(0., 0.5) wd.set_padding(10, 0) hbox.pack_start(wd, False, False, 0) wd = gtk.FileChooserDialog(title = "Choose an ABINIT data file", \ buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OPEN, gtk.RESPONSE_ACCEPT)) wd.connect("response", loadData, window) fileSel = gtk.FileChooserButton(wd) window.set_data("fileSel", fileSel) hbox.pack_start(fileSel, True, True, 5) hbox = gtk.VPaned() hbox.set_sensitive(False) window.set_data("hboxResults", hbox) vbox.pack_start(hbox, True, True, 0) wd = gtk.VBox() hbox.pack1(wd, True, False) scroll = gtk.ScrolledWindow() scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) scroll.set_shadow_type(gtk.SHADOW_ETCHED_OUT) wd.pack_start(scroll, True, True, 0) view = gtk.TreeView() wd.set_size_request(-1, 400) view.set_rules_hint(True) view.set_grid_lines(gtk.TREE_VIEW_GRID_LINES_VERTICAL) view.get_selection().set_mode(gtk.SELECTION_SINGLE) view.get_selection().connect("changed", selectAtt, window) window.set_data("treeview", view) scroll.add(view) col = view.insert_column_with_attributes(-1, "Attribute", \ gtk.CellRendererText(), \ markup=0) col.set_sort_column_id(0) hbox2 = gtk.HBox() wd.pack_start(hbox2, False, False, 0) entry = gtk.Entry() entry.set_text(".*") window.set_data("filter", re.compile(".*")) entry.connect("activate", applyFilter, window, entry) bt1 = gtk.Button(label="Filter") bt1.connect("clicked", applyFilter, window, entry) bt2 = gtk.ToggleButton(label="Hide defaults") bt2.connect("toggled", applyHide, window) window.set_data("hideDefault", bt2) hbox2.pack_end(bt2, False, False, 0) hbox2.pack_end(bt1, False, False, 0) hbox2.pack_end(entry, False, False, 0) pane = gtk.HPaned() hbox.pack2(pane, True, True) render = v_sim.main(width=400, height=400) pane.pack2(render, True, True) table = gtk.Table(6, 4) table.set_row_spacings(10); align = gtk.Alignment(xalign=1) table.attach(align, 0, 4, 5, 6, yoptions = gtk.SHRINK, xoptions = gtk.FILL | gtk.EXPAND, ypadding=5) wd = gtk.HBox() align.add(wd) lb = gtk.Label("Render dtset:") wd.pack_start(lb, False, False, 0) sp = gtk.SpinButton() window.set_data("spDtSets", sp) wd.pack_start(sp, False, False, 0) bt = gtk.Button(stock = gtk.STOCK_GO_FORWARD) bt.connect("clicked", renderDtSet, window) wd.pack_start(bt, False, False, 10) pane.pack1(table, True, False) wd = gtk.Label("Keyword:") wd.set_use_markup(True) wd.set_alignment(1., 0.5) table.attach(wd, 0, 1, 0, 1, xoptions = gtk.SHRINK | gtk.FILL, yoptions = gtk.SHRINK) wd = gtk.Label("") wd.set_alignment(0., 0.5) table.attach(wd, 1, 2, 0, 1, yoptions = gtk.SHRINK, xpadding = 5) window.set_data("lblKeyword", wd) wd = gtk.Label("Mnemonic:") wd.set_use_markup(True) wd.set_alignment(1., 0.5) table.attach(wd, 2, 3, 0, 1, xoptions = gtk.SHRINK | gtk.FILL, yoptions = gtk.SHRINK) wd = gtk.Label("") wd.set_line_wrap(True) wd.set_alignment(0., 0.5) table.attach(wd, 3, 4, 0, 1, yoptions = gtk.SHRINK, xpadding = 5) window.set_data("lblMnemonic", wd) wd = gtk.Label("Found in:") wd.set_use_markup(True) wd.set_alignment(1., 0.5) table.attach(wd, 0, 1, 1, 2, xoptions = gtk.SHRINK | gtk.FILL, yoptions = gtk.SHRINK) wd = gtk.Label("") wd.set_alignment(0., 0.5) table.attach(wd, 1, 2, 1, 2, yoptions = gtk.SHRINK, xpadding = 5) window.set_data("lblFound", wd) wd = gtk.Label("Category:") wd.set_use_markup(True) wd.set_alignment(1., 0.5) table.attach(wd, 2, 3, 1, 2, xoptions = gtk.SHRINK | gtk.FILL, yoptions = gtk.SHRINK) wd = gtk.Label("") wd.set_alignment(0., 0.5) table.attach(wd, 3, 4, 1, 2, yoptions = gtk.SHRINK, xpadding = 5) window.set_data("lblCategory", wd) wd = gtk.Label("Type:") wd.set_use_markup(True) wd.set_alignment(1., 0.5) table.attach(wd, 0, 1, 2, 3, xoptions = gtk.SHRINK | gtk.FILL, yoptions = gtk.SHRINK) wd = gtk.Label("") wd.set_line_wrap(True) wd.set_alignment(0., 0.5) table.attach(wd, 1, 2, 2, 3, yoptions = gtk.SHRINK, xpadding = 5) window.set_data("lblType", wd) wd = gtk.Label("Default:") wd.set_use_markup(True) wd.set_alignment(1., 0.5) table.attach(wd, 2, 3, 2, 3, xoptions = gtk.SHRINK | gtk.FILL, yoptions = gtk.SHRINK) wd = gtk.Label("") wd.set_line_wrap(True) wd.set_alignment(0., 0.5) table.attach(wd, 3, 4, 2, 3, yoptions = gtk.SHRINK, xpadding = 5) window.set_data("lblDefault", wd) wd = gtk.Label("Description:") wd.set_use_markup(True) wd.set_alignment(1., 0.5) table.attach(wd, 0, 1, 3, 4, gtk.SHRINK | gtk.FILL, yoptions = gtk.SHRINK) scroll = gtk.ScrolledWindow() scroll.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) scroll.set_shadow_type(gtk.SHADOW_ETCHED_OUT) table.attach(scroll, 0, 4, 4, 5, xpadding = 5) buf = gtk.TextBuffer() window.set_data("description", buf) wd = gtk.TextView(buf) wd.set_editable(False) wd.set_wrap_mode(gtk.WRAP_WORD) wd.set_size_request(400, -1) scroll.add(wd) window.show_all() if (len(sys.argv) > 1): gobject.idle_add(withArg, sys.argv, window) # We parse the variable defs. varlist = ElementTree.parse("varlists.xml").findall("list/variable") window.set_data("varlist", varlist) gtk.main() v_sim-3.7.0/etc/0000755000353400050620000000000012216331351010411 500000000000000v_sim-3.7.0/etc/Makefile.am0000644000353400050620000000042412215546176012401 00000000000000## Makefile.am for v_sim/etc if PLATFORM_WIN32 inifile = $(PACKAGE).ini endif v_simexe_DATA = $(inifile) v_simresources_DATA = \ v_sim.res \ v_sim.par \ v_sim.rc EXTRA_DIST = \ v_sim.ini.in \ v_sim-dev.ini.in \ v_sim.res v_sim.par \ v_sim.rc.in v_sim-3.7.0/etc/Makefile.in0000644000353400050620000004273512216330210012402 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = etc DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/v_sim-dev.ini.in $(srcdir)/v_sim.ini.in \ $(srcdir)/v_sim.rc.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/abinit.m4 \ $(top_srcdir)/m4/ax_check_gl.m4 \ $(top_srcdir)/m4/ax_check_glu.m4 \ $(top_srcdir)/m4/ax_lang_compiler_ms.m4 \ $(top_srcdir)/m4/ax_lapack.m4 $(top_srcdir)/m4/bigdft.m4 \ $(top_srcdir)/m4/etsf_io.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/libxc.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/netcdf.m4 \ $(top_srcdir)/m4/python.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = v_sim.rc v_sim.ini v_sim-dev.ini CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(v_simexedir)" \ "$(DESTDIR)$(v_simresourcesdir)" DATA = $(v_simexe_DATA) $(v_simresources_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AB_CPPFLAGS = @AB_CPPFLAGS@ AB_LIBS = @AB_LIBS@ ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIGDFT_CPPFLAGS = @BIGDFT_CPPFLAGS@ BIGDFT_LIBS = @BIGDFT_LIBS@ BLAS_LIBS = @BLAS_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETSF_IO_LIBS = @ETSF_IO_LIBS@ EXEEXT = @EXEEXT@ EXTRA_CFLAGS = @EXTRA_CFLAGS@ EXTRA_LDFLAGS = @EXTRA_LDFLAGS@ EXTRA_LIBS = @EXTRA_LIBS@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ FCLIBS = @FCLIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLIBS = @FLIBS@ FONT_BOLD = @FONT_BOLD@ FONT_NORMAL = @FONT_NORMAL@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_BIGDFT_CFLAGS = @GLIB_BIGDFT_CFLAGS@ GLIB_BIGDFT_LIBS = @GLIB_BIGDFT_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GOBJECT_INTROSPECTION_REQUIRED = @GOBJECT_INTROSPECTION_REQUIRED@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTKS_CFLAGS = @GTKS_CFLAGS@ GTKS_LIBS = @GTKS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_SCANNER = @G_IR_SCANNER@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LAPACK_LIBS = @LAPACK_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXC_LIBS = @LIBXC_LIBS@ LIB_ARCHIVE_CFLAGS = @LIB_ARCHIVE_CFLAGS@ LIB_ARCHIVE_LIBS = @LIB_ARCHIVE_LIBS@ LIB_YAML_CFLAGS = @LIB_YAML_CFLAGS@ LIB_YAML_LIBS = @LIB_YAML_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NC_CPPFLAGS = @NC_CPPFLAGS@ NC_LDFLAGS = @NC_LDFLAGS@ NC_LIBS = @NC_LIBS@ NC_NETCDF_3_CPPFLAG = @NC_NETCDF_3_CPPFLAG@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBABEL_CFLAGS = @OPENBABEL_CFLAGS@ OPENBABEL_LIBS = @OPENBABEL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PYGOBJECT_CFLAGS = @PYGOBJECT_CFLAGS@ PYGOBJECT_LIBS = @PYGOBJECT_LIBS@ PYGOBJECT_REQUIRED = @PYGOBJECT_REQUIRED@ PYGTK_CFLAGS = @PYGTK_CFLAGS@ PYGTK_LIBS = @PYGTK_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_INCLUDES = @PYTHON_INCLUDES@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ V_SIM_MAJOR_VERSION = @V_SIM_MAJOR_VERSION@ V_SIM_MICRO_VERSION = @V_SIM_MICRO_VERSION@ V_SIM_MINOR_VERSION = @V_SIM_MINOR_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ girdir = @girdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ lib_v_sim_version = @lib_v_sim_version@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typelibsdir = @typelibsdir@ v_simexamplesdir = @v_simexamplesdir@ v_simexedir = @v_simexedir@ v_simiconsdir = @v_simiconsdir@ v_simlegaldir = @v_simlegaldir@ v_simpixmapsdir = @v_simpixmapsdir@ v_simpluginsdir = @v_simpluginsdir@ v_simresourcesdir = @v_simresourcesdir@ visupyexecdir = @visupyexecdir@ visutypelibsdir = @visutypelibsdir@ @PLATFORM_WIN32_TRUE@inifile = $(PACKAGE).ini v_simexe_DATA = $(inifile) v_simresources_DATA = \ v_sim.res \ v_sim.par \ v_sim.rc EXTRA_DIST = \ v_sim.ini.in \ v_sim-dev.ini.in \ v_sim.res v_sim.par \ v_sim.rc.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu etc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu etc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): v_sim.rc: $(top_builddir)/config.status $(srcdir)/v_sim.rc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ v_sim.ini: $(top_builddir)/config.status $(srcdir)/v_sim.ini.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ v_sim-dev.ini: $(top_builddir)/config.status $(srcdir)/v_sim-dev.ini.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-v_simexeDATA: $(v_simexe_DATA) @$(NORMAL_INSTALL) test -z "$(v_simexedir)" || $(MKDIR_P) "$(DESTDIR)$(v_simexedir)" @list='$(v_simexe_DATA)'; test -n "$(v_simexedir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(v_simexedir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(v_simexedir)" || exit $$?; \ done uninstall-v_simexeDATA: @$(NORMAL_UNINSTALL) @list='$(v_simexe_DATA)'; test -n "$(v_simexedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(v_simexedir)'; $(am__uninstall_files_from_dir) install-v_simresourcesDATA: $(v_simresources_DATA) @$(NORMAL_INSTALL) test -z "$(v_simresourcesdir)" || $(MKDIR_P) "$(DESTDIR)$(v_simresourcesdir)" @list='$(v_simresources_DATA)'; test -n "$(v_simresourcesdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(v_simresourcesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(v_simresourcesdir)" || exit $$?; \ done uninstall-v_simresourcesDATA: @$(NORMAL_UNINSTALL) @list='$(v_simresources_DATA)'; test -n "$(v_simresourcesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(v_simresourcesdir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(v_simexedir)" "$(DESTDIR)$(v_simresourcesdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-v_simexeDATA install-v_simresourcesDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-v_simexeDATA uninstall-v_simresourcesDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ install-v_simexeDATA install-v_simresourcesDATA installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-v_simexeDATA uninstall-v_simresourcesDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: v_sim-3.7.0/etc/v_sim-dev.ini.in0000644000353400050620000000033412215546176013344 00000000000000[paths] data_dir = ..\share\@PACKAGE@ conf_dir = ..\share\@PACKAGE@ legal_dir = ..\share\doc\@PACKAGE@ pixmaps_dir = ..\share\@PACKAGE@\pixmaps plugins_dir = ..\lib\@PACKAGE@\plug-ins locale_dir = ..\share\locale v_sim-3.7.0/etc/v_sim.ini.in0000644000353400050620000000033412215546176012570 00000000000000[paths] data_dir = ..\share\@PACKAGE@ conf_dir = ..\share\@PACKAGE@ legal_dir = ..\share\doc\@PACKAGE@ pixmaps_dir = ..\share\@PACKAGE@\pixmaps plugins_dir = ..\lib\@PACKAGE@\plug-ins locale_dir = ..\share\locale v_sim-3.7.0/etc/v_sim.rc.in0000644000353400050620000002174612215546176012427 00000000000000#v_sim.rc #this private file is used to set style ################################################################ style "fnt" { font_name = "@FONT_NORMAL@" } style "fnt_small" { font_name = "@FONT_NORMAL@" } ################################################################ style "fixed_bold" = "fnt_bold" { fg[NORMAL] = {0.00, 0.00, 0.00} fg[INSENSITIVE] = {0.50, 1.00, 0.50} } style "fixed" = "fnt" { fg[NORMAL] = {0.00, 0.00, 0.00} } ################################################################ # General redefinition style "main_window" { bg[NORMAL] = {1.00, 0.75, 0.60} bg[ACTIVE] = {0.90, 0.75, 0.60} bg[INSENSITIVE] = {1.00, 0.75, 0.60} } style "statusbar" { bg[NORMAL] = {1.00, 0.85, 0.75} } style "toolbar" { bg[NORMAL] = {0.90, 0.75, 0.60} } style "button" = "fnt" { bg[NORMAL] = {0.4, 0.4, 0.4} fg[NORMAL] = {0.6, 0.6, 0.6} bg[PRELIGHT] = {0.5, 0.3, 0.5} fg[PRELIGHT] = {0.5, 1.0, 0.5} bg[ACTIVE] = {0.7, 0.5, 0.7} fg[ACTIVE] = {0.5, 1.0, 0.5} bg[INSENSITIVE] = {1.00, 0.75, 0.60} fg[INSENSITIVE] = {0.70, 0.45, 0.20} } style "vscrollbar" { bg[ACTIVE] = {0.8, 1.0, 1.0} bg[NORMAL] = {0.0, 0.0, 1.0} bg[PRELIGHT] = {0.3, 0.3, 1.0} } style "menu" = "fnt" { fg[NORMAL] = {0., 0., 0.} fg[PRELIGHT] = {0.4, 0.4, 0.4} bg[NORMAL] = {1.0, 0.85, 0.6} bg[PRELIGHT] = {0.6, 0.5, 0.3} } style "list" { base[NORMAL] = {0.90, 0.75, 0.70} } style "listitem" { bg[SELECTED] = {1.00, 0.85, 0.80} } style "label" = "fnt" { fg[NORMAL] = {0.60, 0.45, 0.40} fg[SELECTED] = {0.50, 0.35, 0.30} } style "entryCombo" = "fnt" { base[NORMAL] = {0.90, 0.90, 0.90} fg[NORMAL] = {0.30, 0.30, 0.30} } style "combo" = "fnt" { bg[NORMAL] = {0.80, 0.65, 0.40} bg[PRELIGHT] = {0.80, 0.65, 0.60} bg[ACTIVE] = {0.80, 0.65, 0.60} bg[SELECTED] = {0.80, 0.65, 0.60} bg[INSENSITIVE] = {0.90, 0.75, 0.50} base[NORMAL] = {0.80, 0.85, 0.80} fg[NORMAL] = {0.50, 0.35, 0.30} fg[SELECTED] = {0.50, 0.35, 0.30} } style "tog" = "fnt" { bg[NORMAL] = {1.00, 0.75, 0.60} bg[PRELIGHT] = {1.00, 0.85, 0.70} bg[ACTIVE] = {0.5, 0.2, 0.0} fg[NORMAL] = {0.5, 0.4, 0.3} fg[PRELIGHT] = {0.5, 0.2, 0.0} fg[ACTIVE] = {0.5, 0.2, 0.0} } style "radio" = "fnt" { bg[NORMAL] = {1.00, 0.75, 0.60} bg[PRELIGHT] = {1.00, 0.85, 0.70} bg[ACTIVE] = {0.5, 0.2, 0.0} fg[NORMAL] = {0.5, 0.4, 0.3} fg[PRELIGHT] = {0.5, 0.2, 0.0} fg[ACTIVE] = {0.5, 0.2, 0.0} } style "spin" = "fnt" { fg[NORMAL] = {1.0, 0.0, 0.0} fg[INSENSITIVE] = {0.9, 0.9, 0.0} bg[NORMAL] = {0.90, 0.75, 0.70} bg[PRELIGHT] = {1.0, 0.0, 1.0} bg[ACTIVE] = {1.0, 0.0, 0.0} bg[INSENSITIVE] = {0.1, 0.1, 0.1} } style "filesel" = "fnt" { bg[NORMAL] = {0.80, 0.80, 1.00} } ################################################################ style "message" { bg[NORMAL] = {0.75, 1.00, 0.75} bg[ACTIVE] = {0.67, 0.90, 0.67} } style "message_viewport" { bg[NORMAL] = {0.65, 0.85, 0.65} } style "message_ele" { bg[NORMAL] = {0.5, 0.85, 0.5} bg[PRELIGHT] = {0.5, 0.85, 0.5} bg[ACTIVE] = {0.5, 0.75, 0.5} fg[NORMAL] = {0.5, 0.4, 0.3} fg[PRELIGHT] = {0.5, 0.85, 0.5} fg[ACTIVE] = {0.8, 0.8, 0.8} } style "message_toolbar" = "fnt" { bg[NORMAL] = {0.85, 0.9, 0.85} } style "message_statusbar" { bg[NORMAL] = {0.85, 1.0, 0.85} } ################################################################ style "error" { bg[NORMAL] = {1.00, 0.85, 0.70} } #style "error_font" = "fnt" { # fg[NORMAL] = {0.00, 0.00, 0.00} #} style "error_button" = "fnt" { bg[NORMAL] = {1.0, 1.0, 0.0} bg[PRELIGHT] = {0.6, 1.0, 0.6} bg[ACTIVE] = {0.0, 1.0, 0.0} fg[NORMAL] = {0.00, 0.00, 0.00} } ################################################################ #style "working" { # bg[NORMAL] = {0.80, 0.80, 1.00} #} #style "working_inside" { # bg[NORMAL] = {0.90, 0.90, 1.00} #} #style "working_font" = "fnt" { # fg[NORMAL] = {0.00, 0.00, 0.00} #} ################################################################ style "subpanel_title" = "fnt" { fg[NORMAL] = {0.30, 0.00, 0.30} } style "message_title" = "fnt" { fg[NORMAL] = {0.8, 0.3, 0.1} } style "label_head" = "fnt" { fg[NORMAL] = {0.8, 0.3, 0.1} fg[INSENSITIVE] = {0.9, 0.9, 0.0} } style "label_head_2" = "fnt" { fg[NORMAL] = {0.80, 0.40, 0.30} fg[INSENSITIVE] = {0.9, 0.9, 0.0} } style "label_info" = "fnt" { fg[NORMAL] = {0.20, 0.20, 0.20} } style "label_error" = "fnt" { fg[NORMAL] = {0.8, 0.3, 0.1} } ################################################################ style "scroll_r" { bg[ACTIVE] = {.9, 0.2, 0.2} bg[NORMAL] = {0.7, 0.7, 0.7} bg[PRELIGHT] = {0.9, 0.9, 0.9} bg[INSENSITIVE] = {0.8, 0.5, 0.50} } style "scroll_g" { bg[ACTIVE] = {0.2, 0.9, 0.2} bg[NORMAL] = {0.7, 0.7, 0.7} bg[PRELIGHT] = {0.9, 0.9, 0.9} bg[INSENSITIVE] = {0.5, 0.8, 0.50} } style "scroll_b" { bg[ACTIVE] = {0.2, 0.2, 0.9} bg[NORMAL] = {0.7, 0.7, 0.7} bg[PRELIGHT] = {0.9, 0.9, 0.9} bg[INSENSITIVE] = {0.5, 0.5, 0.80} } style "scroll_mat" { bg[ACTIVE] = {0.5, 0.5, 0.5} bg[NORMAL] = {0.7, 0.7, 0.7} bg[PRELIGHT] = {0.9, 0.9, 0.9} } ################################################################ style "atoms_pairs" { bg[NORMAL] = {0.8, 0.8, 0.0} bg[INSENSITIVE] = {0.1, 0.1, 0.1} } style "atoms_pairs_inside" { bg[NORMAL] = {1.0, 1.0, 0.0} bg[INSENSITIVE] = {0.1, 0.1, 0.1} } style "tog_pairs" = "fnt" { bg[NORMAL] = {1.00, 1.0, 0.00} bg[PRELIGHT] = {0.90, 0.90, 0.20} bg[ACTIVE] = {0.5, 0.2, 0.0} fg[NORMAL] = {0.3, 0.3, 0.3} fg[PRELIGHT] = {0.1, 0.7, 0.1} fg[ACTIVE] = {0.0, 0.7, 0.0} } #style "label_names" = "fnt" { # fg[NORMAL] = {0.0, 0.0, 1.0} # fg[INSENSITIVE] = {0.9, 0.9, 0.0} #} ################################################################ style "save" { bg[NORMAL] = {1.0, 0.5, 1.0} } style "save_head" = "fnt_small" { fg[NORMAL] = {0.5, 0.0, 0.0} } style "tog_save_par_res" = "fnt_small" { bg[NORMAL] = {0.75, 1.00, 0.60} bg[PRELIGHT] = {0.85, 1.00, 0.70} bg[ACTIVE] = {0.2, 0.3, 0.0} fg[NORMAL] = {0.3, 0.1, 0.3} fg[PRELIGHT] = {0.2, 0.3, 1.0} fg[ACTIVE] = {0.0, 0.0, 1.0} } style "save_entry" = "fnt_small" { fg[NORMAL] = {0.0, 0.0, 1.0} fg[ACTIVE] = {0.0, 1.0, 0.0} fg[INSENSITIVE] = {0.75, 0.75, 0.75} } ################################################################ style "tooltips" = "fnt_small" { bg[NORMAL] = {0.4, 0.6, 0.6} } ################################################################ style "font_pb" { font = "fixed" } ################################################################ ################################################################ widget "*fixed_bold" style "fixed_bold" widget "*fixed" style "fixed" widget "GtkW*" style "combo" widget "*GtkWindow" style "main_window" widget "*GtkDialog" style "main_window" widget "*RenderingWindow" style "main_window" widget "*OpenGLWidget" style "main_window" widget "*VisuUiMain" style "main_window" widget "*GtkNotebook" style "main_window" widget "*GtkViewport" style "main_window" widget "*GtkEventBox" style "main_window" widget "*GtkStatusbar*" style "statusbar" widget "*GtkHandleBox*" style "statusbar" widget "*GtkVScrollbar*" style "vscrollbar" widget "*GtkHScrollbar*" style "vscrollbar" widget "*GtkMenu*" style "menu" widget "*GtkButton*" style "button" widget "*GtkColorButton*" style "button" widget "*GtkToggleButton*" style "button" class "GtkList" style "list" class "GtkListItem" style "listitem" class "GtkLabel" style "label" widget "*Combo*" style "combo" widget "*GtkComboBoxEntry*" style "entryCombo" widget "*GtkCheckButton" style "tog" widget "*GtkRadioButton*" style "tog" widget "*GtkSpinButton" style "spin" class "GtkFileSelection" style "filesel" class "GtkFileChooserDialog" style "filesel" class "GtkColorSelectionDialog" style "filesel" class "GtkToolbar" style "toolbar" widget "*gtk-tooltips*" style "tooltips" # specific elements widget "*subpanel_title" style "subpanel_title" widget "*message_title" style "message_title" widget "*label_head" style "label_head" widget "*label_head_2" style "label_head_2" widget "*label_info" style "label_info" widget "*label_error" style "label_error" widget "*scroll_r" style "scroll_r" widget "*scroll_g" style "scroll_g" widget "*scroll_b" style "scroll_b" widget "*scroll_mat" style "scroll_mat" # specific dialogs widget "*message" style "message" widget "*message_tog" style "message_ele" widget "*message_radio" style "message_ele" widget "*message_viewport" style "message_viewport" widget "*message_notebook" style "message_ele" widget "*message_notebook" style "message" widget "*message_toolbar" style "message_toolbar" widget "*message_statusbar*" style "message_statusbar" widget "*error" style "error" widget "*save" style "save" widget "*filesel" style "filesel" widget "*error_button*" style "error_button" widget "*save_head" style "save_head" widget "*save_entry" style "save_entry" widget "*tog_save_par_res*" style "tog_save_par_res" ################################################################ v_sim-3.7.0/etc/v_sim.res0000644000353400050620000001673112215546176012205 00000000000000#V_Sim resources file v3.0 #==================== #WARNING: this file format is DIFFERENT from that for #standard v_sim version <= 2.x #Line beginning with a # are not parsed. #The only "useful" lines must have the following contents #several two or more lines patterns: #resource_name: #values separeted by blank characters #The following resource names are valid : # opengl_theta_phi_omega # opengl_xs_ys # opengl_gross # opengl_d_red # atomic_radius_shape # spin_resources # material # element_color # element_is_rendered # element_properties # pairs_are_on # pair_data # pair_link # pairs_favoriteMethod # pairWire_width # pairWire_pairWidth # pairWire_linkWidth # pairWire_linkStipple # cylinder_colorType # pairCylinder_radius # pairCylinder_pairRadius # pairCylinder_linkRadius # fog_is_on # fog_color_is_specific # fog_specific_color # fog_start_end # backgroundColor_color # box_is_on # box_color # box_line_width # box_line_stipple # axes_are_on # axes_color # axes_line_width # axes_line_stipple # isosurfaces_drawIntra # isosurface_property # isosurface_color # isosurface_properties # scales_are_on # scales_color # scales_line_width # scale_definition # scales_line_stipple # 2 real values (degrees) for user orientation with respect to sample opengl_theta_phi_omega: 60.100 -65.600 0.000 # 2 real values for image position with respect to [0.0, 1.0]x[0.0, 1.0] window opengl_xs_ys: 0.500 0.500 # gross factor (must be real > 0.0) opengl_gross: 1.000 # reduced perspective distance (must be real > 1.0) opengl_d_red: 7.000 # The radius of the element and its shape, a real > 0. & [Sphere Cube Elipsoid Point] atomic_radius_shape: Si 1.175 Sphere atomic_radius_shape: Al 1.430 Sphere atomic_radius_shape: Ag 1.430 Sphere atomic_radius_shape: Au 1.437 Sphere atomic_radius_shape: Ge 1.225 Sphere atomic_radius_shape: O 1.350 Sphere atomic_radius_shape: C 0.600 Sphere atomic_radius_shape: Cd 1.490 Sphere atomic_radius_shape: Pd 1.375 Sphere atomic_radius_shape: Te 1.430 Sphere atomic_radius_shape: Co 1.250 Sphere atomic_radius_shape: Fe 1.240 Sphere atomic_radius_shape: Cu 1.250 Sphere atomic_radius_shape: H 0.500 Sphere atomic_radius_shape: Ni 1.243 Sphere atomic_radius_shape: Pt 1.385 Sphere # Global or element resource for rendering spin module spin_resources: spin_global_color_cone 0.000000 0.000000 spin_resources: spin_global_color_wheel 0.000000 spin_resources: spin_global_hiding_mode never spin_resources: spin_global_atomic 0 spin_resources: spin_global_modulus 0 # Codes the main color in RedGreenBlueAlpha formatand the light effects on material, nine floats between 0. and 1. element_color: Si 0.000 1.000 0.200 1.000 0.20 0.54 0.69 0.50 0.20 element_color: Al 0.600 0.600 1.000 1.000 0.25 0.80 0.50 0.70 0.00 element_color: Ag 1.000 1.000 1.000 1.000 0.20 0.60 0.50 1.00 0.00 element_color: Au 1.000 0.750 0.040 1.000 0.54 0.54 0.16 0.52 0.00 element_color: Ge 0.000 1.000 0.800 1.000 0.20 0.54 0.69 0.50 0.20 element_color: O 1.000 0.200 0.200 1.000 0.60 0.60 0.00 0.00 0.00 element_color: C 0.300 0.300 0.300 1.000 0.20 0.54 0.69 0.50 0.20 element_color: Cd 0.000 0.800 1.000 1.000 0.50 0.00 0.12 0.50 0.20 element_color: Pd 1.000 1.000 0.800 1.000 0.50 0.00 0.12 0.50 0.20 element_color: Te 0.900 0.400 0.100 1.000 0.20 0.54 0.69 0.50 0.20 element_color: Co 1.000 0.500 0.800 1.000 0.50 0.00 0.12 0.50 0.20 element_color: Fe 1.000 0.500 0.000 1.000 0.50 0.00 0.12 0.50 0.20 element_color: Cu 1.000 0.560 0.340 1.000 0.20 0.70 0.10 0.24 0.15 element_color: H 1.000 1.000 1.000 1.000 0.60 0.60 0.00 0.00 0.00 element_color: Ni 1.000 0.300 0.300 1.000 0.50 0.00 0.12 0.50 0.20 element_color: Pt 1.000 0.800 0.800 1.000 0.50 0.00 0.12 0.50 0.20 # Define some properties ; rendered (0 or 1) masked(0 or 1). element_properties: Si 1 1 element_properties: Al 1 1 element_properties: Ag 1 1 element_properties: Au 1 1 element_properties: Ge 1 1 element_properties: O 1 1 element_properties: C 1 1 element_properties: Cd 1 1 element_properties: Pd 1 1 element_properties: Te 1 1 element_properties: Co 1 1 element_properties: Fe 1 1 element_properties: Cu 1 1 element_properties: H 1 1 element_properties: Ni 1 1 element_properties: Pt 1 1 # Ask the opengl engine to draw pairs between elements ; boolean 0 or 1 pairs_are_on: 0 # Favorite method used to render files ; chain ('Wire pairs', 'Cylinder pairs') pairs_favoriteMethod: Wire pairs # Draw a link between [ele1] [ele2] [0. <= dmin] [0. <= dmax] # [0. <= RGB <= 1.]x3 [bool: drawn] [bool: printLength] pair_link: Ni Ni 0.000 4.100 0.750 0.400 0.200 1 0 pair_link: Si Si 2.200 2.500 0.750 0.400 0.200 1 0 pair_link: Au Ni 0.000 0.000 1.000 0.600 0.200 1 0 pair_link: Au Au 0.000 4.100 1.000 0.600 0.200 1 0 # This value is the width for all pairs drawn ; 0 < integer < 10 pairWire_width: 2 # Widths detail for each drawn link ; 0 < integer < 10 # It chooses the colors of the cylinders according differents criterion ; 0 <= integer < 2 cylinder_colorType: 0 # This value is the default radius of the pairs drawn as cylinders ; 0 < real < 10 pairCylinder_radius: 0.150000 # This value is the radius for specific pairs drawn as cylinders ; element1 elemen2 0 < real < 10 # Control if the fog is used ; boolean (0 or 1) fog_is_on: 1 # Control if the fog uses a specific color ; boolean (0 or 1) fog_color_is_specific: 0 # Define the color of the fog ; four floating point values (0. <= v <= 1.) fog_specific_color: 0.000 0.000 0.000 0.000 # Define the position of the fog ; two floating point values (0. <= v <= 1.) fog_start_end: 0.600 0.850 # Set the background of the background ; four floating point values (0. <= v <= 1.) backgroundColor_color: 0.000 0.000 0.000 1.000 # Control if a box is drawn around the rendering area ; boolean (0 or 1) box_is_on: 1 # Define the color of the box ; three floating point values (0. <= v <= 1.) box_color: 1.000 1.000 1.000 # Define the width of the lines of the box ; one integer (1. <= v <= 10.) box_line_width: 2 # Dot scheme detail for the lines of the box (main and expanded) ; 0 < 2 integers < 2^16 box_line_stipple: 65535 65280 # Control if the axes are drawn ; boolean (0 or 1) axes_are_on: 1 # Define the color of the axes ; three floating point values (0. <= v <= 1.) axes_color: 1.000 1.000 1.000 # Define the width of the lines of the axes ; one floating point values (1. <= v <= 10.) axes_line_width: 3 # Dot scheme detail for the lines of the axes ; 0 < integer < 2^16 axes_line_stipple: 65535 # Choose if the interior is drawn in color inverse ; a boolean (0 or 1) isosurfaces_drawIntra: 0 # Control if scales are drawn ; boolean (0 or 1) scales_are_on: 0 # Define the color RGBA of all scales ; four floating point values (0. <= v <= 1.) scales_color: 0.000 0.000 0.000 # Define the width of the lines of all scales ; one floating point value (1. <= v <= 10.) scales_line_width: 1 # Define the stipple pattern of the lines of all scales ; one integer value (0 <= v <= 65535) scales_line_stipple: 65535 # Define the position, the direction, the length and the legend of a scale ; position[3] direction[3] length legend scale_definition: 0 0 0 1 0 0 5 [auto] v_sim-3.7.0/etc/v_sim.par0000644000353400050620000000554012215546176012172 00000000000000#V_Sim parameters file v3.0 #==================== #WARNING: this file format is DIFFERENT from that for #standard v_sim version <= 2.x #Line beginning with a # are not parsed. #The only "useful" lines must have the following pattern: #parameter_name: value #The following parameter names are valid : # main_resourcesPath # opengl_trueTransparency # opengl_antialias # opengl_immediateDrawing # opengl_stereoAngle # opengl_stereo # opengl_render # opengl_details # opengl_observe_method # extension_render # rendering_favoriteMethod # atomic_sphere_method # scale_log_threshold # main_usePreview # main_confirmQuit # main_panelStatus # main_dock # browser_headersVisibility # browser_dateVisibility # dataFile_fileExtension # config_subPanelTabView # config_skin # config_refreshIsOn # config_refreshPeriod # presetShade # Favorite paths to find and save the resources file ; chain[:chain] main_resourcesPath: # If true, lines are drawn smoother ; boolean 0 or 1 opengl_antialias: 1 # If true, changes of parameters means immediate redrawing ; boolean 0 or 1 opengl_immediateDrawing: 1 # If true, the transparency rendering is enhanced ; boolean 0 or 1 opengl_trueTransparency: 0 # If true, try to draw in stereo ; boolean 0 or 1 opengl_stereo: 0 # Give the angle of the two receivers in stereo output ; float positive opengl_stereoAngle: 5.000000 # Rules the way OpenGl draws objects in general ; 4 possible strings : Wireframe, Flat, Smooth and SmoothAndEdge opengl_render: Smooth # Give a value to the quality of rendering (100 is normal) ; positive integer opengl_details: 100 # Choose the observe method ; integer (0: constrained mode, 1: walker mode) opengl_observe_method[gtk]: 0 # Favorite method used to render files ; chain rendering_favoriteMethod: Atom visualisation # The sphere drawing method, [GluSphere Icosahedron] atomic_sphere_method: GluSphere # Value of the threshold used in the zero centred logarithm scaling function ; a positive float (1e-3) scale_log_threshold: 0.001000 # Automatically compute preview in filechooser ; boolean main_usePreview[gtk]: 1 # Show up a dialog to confirm when quit button is clicked ; boolean 0 or 1 main_confirmQuit[gtk]: 1 # Show or hide the headers in the treeview ; boolean 0 or 1 browser_headersVisibility[gtk]: 0 # Show or hide the date column in the treeview ; boolean 0 or 1 browser_dateVisibility[gtk]: 0 # The extension used for data file ; chain e.g. '.dat' dataFile_fileExtension[gtk]: .dat # See or not the labels on tabs ; boolean 0 or 1 config_subPanelTabView[gtk]: 0 # Path to a gtkrc file ; chain config_skin[gtk]: None # When on V_Sim reloads the file at periodic time ; boolean 0 or 1 config_refreshIsOn[gtk]: 0 # The period of reloading in ms ; integer (10 < v < 10000) config_refreshPeriod[gtk]: 2000 # The id of a shade used as preset one in the shade selectors ; an integer ranging from 0 presetShade[gtk]: 0 v_sim-3.7.0/po/0000755000353400050620000000000012216331361010255 500000000000000v_sim-3.7.0/po/Makefile.in.in0000644000353400050620000001604612216331361012656 00000000000000# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # Copyright (C) 2004-2008 Rodney Dawes # # This file may be copied and used freely without restrictions. It may # be used in projects which are not available under a GNU Public License, # but which still want to provide support for the GNU gettext functionality. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize # # - Modified by Rodney Dawes for use with intltool # # We have the following line for use by intltoolize: # INTLTOOL_MAKEFILE GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ datarootdir = @datarootdir@ libdir = @libdir@ DATADIRNAME = @DATADIRNAME@ itlocaledir = $(prefix)/$(DATADIRNAME)/locale subdir = po install_sh = @install_sh@ # Automake >= 1.8 provides @mkdir_p@. # Until it can be supposed, use the safe fallback: mkdir_p = $(install_sh) -d INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ MSGMERGE = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist GENPOT = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot ALL_LINGUAS = @ALL_LINGUAS@ PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) DISTFILES = Makefile.in.in POTFILES.in $(POFILES) EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS POTFILES = \ # This comment gets stripped out CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) .SUFFIXES: .SUFFIXES: .po .pox .gmo .mo .msg .cat AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ INTLTOOL_V_MSGFMT = $(INTLTOOL__v_MSGFMT_$(V)) INTLTOOL__v_MSGFMT_= $(INTLTOOL__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) INTLTOOL__v_MSGFMT_0 = @echo " MSGFMT" $@; .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $< $(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(INTLTOOL_V_MSGFMT)$(MSGFMT) -o $@ $< .po.gmo: $(INTLTOOL_V_MSGFMT)file=`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && gencat $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(GETTEXT_PACKAGE).pot: $(POTFILES) $(GENPOT) install: install-data install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ dir=$(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $$dir; \ if test -r $$lang.gmo; then \ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ else \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $(srcdir)/$$lang.gmo as" \ "$$dir/$(GETTEXT_PACKAGE).mo"; \ fi; \ if test -r $$lang.gmo.m; then \ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ if test -r $(srcdir)/$$lang.gmo.m ; then \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $(srcdir)/$$lang.gmo.m as" \ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ true; \ fi; \ fi; \ done # Empty stubs to satisfy archaic automake needs dvi info ctags tags CTAGS TAGS ID: # Define this as empty until I found a useful application. install-exec installcheck: uninstall: linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done check: all $(GETTEXT_PACKAGE).pot rm -f missing notexist srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m if [ -r missing -o -r notexist ]; then \ exit 1; \ fi mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp rm -f .intltool-merge-cache clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES stamp-it rm -f *.mo *.msg *.cat *.cat.m *.gmo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f Makefile.in.in distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ extra_dists="$(EXTRA_DISTFILES)"; \ for file in $$extra_dists; do \ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ done; \ for file in $$dists; do \ test -f $$file || file="$(srcdir)/$$file"; \ ln $$file $(distdir) 2> /dev/null \ || cp -p $$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ echo "$$lang:"; \ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ if $$result; then \ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.gmo failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done Makefile POTFILES: stamp-it @if test ! -f $@; then \ rm -f stamp-it; \ $(MAKE) stamp-it; \ fi stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: v_sim-3.7.0/po/POTFILES.in0000644000353400050620000001003712216331361011753 00000000000000[encoding: UTF-8] src/renderingBackend/visu_windowX11.c src/panelModules/panelMethod.c src/panelModules/panelPlanes.c src/panelModules/panelBrowser.c src/panelModules/panelGeometry.c src/panelModules/panelVibration.c src/panelModules/gtkAtomic.c src/panelModules/panelDataFile.c src/panelModules/panelMap.c src/panelModules/panelFogBgColor.c src/panelModules/panelOpenGL.c src/panelModules/panelSurfacesTools.c src/panelModules/gtkSpin.c src/panelModules/panelAxes.c src/panelModules/panelConfig.c src/panelModules/panelSurfaces.c src/panelModules/panelElements.c src/renderingMethods/atomic_yaml.c src/renderingMethods/renderingAtomic_d3.c src/renderingMethods/renderingAtomic_ascii.c src/renderingMethods/atomic_xyz.c src/renderingMethods/renderingSpin.c src/renderingMethods/renderingAtomic.c src/extraFunctions/plane.c src/extraFunctions/isoline.c src/extraFunctions/surfaces_resources.c src/extraFunctions/surfaces_points.c src/extraFunctions/dataFile.c src/extraFunctions/surfaces.c src/extraFunctions/map.c src/extraFunctions/dataNode.c src/extraFunctions/pot2surf.c src/extraFunctions/extraNode.c src/extraFunctions/geometry.c src/extraFunctions/scalarFields.c src/extraFunctions/surfaces_tests.c src/extraFunctions/vibration.c src/OSOpenGL/visu_GtkGlExt.c src/OSOpenGL/visu_WGL.c src/OSOpenGL/visu_GLX.c src/OSOpenGL/visu_openGL.c src/pairsModeling/gtk_cylinder.c src/pairsModeling/wire.c src/pairsModeling/cylinder.c src/pairsModeling/gtk_wire.c src/dumpModules/dumpToGif.c src/dumpModules/dumpToABINIT.c src/dumpModules/dumpThroughGdkPixbuf.c src/dumpModules/dumpToTiff.c src/dumpModules/dumpToAscii.c src/dumpModules/dumpToXyz.c src/dumpModules/dumpToSVG.c src/dumpModules/dumpToPsAndPdf.c src/extensions/axes.c src/extensions/fogAndBGColor.c src/extensions/pairs.c src/extensions/infos.c src/extensions/paths.c src/extensions/planes.c src/extensions/shade.c src/extensions/node_vectors.c src/extensions/legend.c src/extensions/maps.c src/extensions/surfs.c src/extensions/nodes.c src/extensions/marks.c src/extensions/forces.c src/extensions/rings.c src/extensions/scale.c src/extensions/box.c src/extensions/frame.c src/coreTools/toolMatrix.c src/coreTools/toolConfigFile.c src/coreTools/atoms_yaml.c src/coreTools/toolFortran.c src/coreTools/toolColor.c src/coreTools/toolShade.c src/coreTools/toolFileFormat.c src/coreTools/toolOptions.c src/coreTools/toolPhysic.c src/openGLFunctions/objectList.c src/openGLFunctions/renderingMode.c src/openGLFunctions/text.c src/openGLFunctions/light.c src/openGLFunctions/view.c src/openGLFunctions/interactive.c src/extraGtkFunctions/gtk_dumpDialogWidget.c src/extraGtkFunctions/gtk_toolPanelWidget.c src/extraGtkFunctions/gtk_numericalEntryWidget.c src/extraGtkFunctions/gtk_fieldChooser.c src/extraGtkFunctions/gtk_valueIOWidget.c src/extraGtkFunctions/gtk_colorComboBoxWidget.c src/extraGtkFunctions/gtk_stippleComboBoxWidget.c src/extraGtkFunctions/gtk_orientationChooser.c src/extraGtkFunctions/gtk_shadeComboBoxWidget.c src/extraGtkFunctions/gtk_lineObjectWidget.c src/extraGtkFunctions/gtk_elementComboBox.c src/extraGtkFunctions/gtk_curveWidget.c src/interface.c src/gtk_move.c src/support.c src/visu_nodes.c src/visu_data.c src/gtk_pairs.c src/visu_test.c src/visu_plugins.c src/visu_commandLine.c src/visu_object.c src/visu_elements.c src/gtk_interactive.c src/visu_pairs.c src/opengl.c src/visu_basic.c src/gtk_pick.c src/gtk_openGLWidget.c src/gtk_save.c src/visu_tools.c src/visu_dump.c src/gtk_renderingWindowWidget.c src/gtk_about.c src/visu_rendering.c src/gtk_main.c src/visu_main.c src/visu_box.c src/visu_configFile.c src/visu_extension.c src/iface_boxed.c src/visu_gtk.c lib/python/visu_py.c lib/python/plane_py.c lib/plug-ins/bigdft/bigdft.c lib/plug-ins/bigdft/bigdft_run.c lib/plug-ins/bigdft/bigdft_system.c lib/plug-ins/xsf/xsf_density.c lib/plug-ins/xsf/xsf.c lib/plug-ins/archives/archives.c lib/plug-ins/abinit/abinit.c lib/plug-ins/abinit/ab_symmetry.c lib/plug-ins/nanoquanta-netcdf/nq_structure.c lib/plug-ins/nanoquanta-netcdf/nq_basic.c lib/plug-ins/nanoquanta-netcdf/nq_density.c lib/plug-ins/cube/cube.c lib/plug-ins/python-gi/pythongi.c v_sim-3.7.0/po/fr.po0000644000353400050620000060675212216331361011164 00000000000000# translation of fr.po to Caliste Damien # This file is distributed under the same license as the PACKAGE package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. # Caliste , 2006. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: fr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-17 09:50+0200\n" "PO-Revision-Date: 2011-06-10 12:39+0200\n" "Last-Translator: Damien Caliste \n" "Language-Team: \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../po/../src/panelModules/panelMethod.c:122 msgid "Rendering method" msgstr "Méthode de rendu" #: ../../po/../src/panelModules/panelMethod.c:123 msgid "Draw" msgstr "Rendu" #: ../../po/../src/panelModules/panelMethod.c:165 msgid "Input method:" msgstr "Méthode de rendu :" #: ../../po/../src/panelModules/panelMethod.c:178 msgid "Description:" msgstr "Description :" #: ../../po/../src/panelModules/panelMethod.c:197 msgid "Options:" msgstr "Options :" #: ../../po/../src/panelModules/panelMethod.c:317 #: ../../po/../src/panelModules/gtkSpin.c:672 #: ../../po/../src/panelModules/gtkSpin.c:677 #: ../../po/../src/panelModules/panelSurfaces.c:2720 #: ../../po/../src/extraGtkFunctions/gtk_elementComboBox.c:388 msgid "None" msgstr "Aucun" #: ../../po/../src/panelModules/panelMethod.c:347 #: ../../po/../src/gtk_pick.c:990 ../../po/../src/gtk_pick.c:994 #: ../../po/../src/gtk_pick.c:1134 ../../po/../src/gtk_pick.c:1389 msgid "None" msgstr "Aucun" #. * #. * SECTION: panelPlanes #. * @short_description: The tab where planes are defined. #. * #. * It is possible to get the list of planes using #. * visu_ui_panel_planes_getAll(). One can also access to the list #. * store hosting the planes by calling visu_ui_panel_planes_getList(). #. #: ../../po/../src/panelModules/panelPlanes.c:71 msgid "none" msgstr "aucun" #. String used to labelled planes, dist. means 'distance' and #. norm. means 'normal' (50 chars max). #: ../../po/../src/panelModules/panelPlanes.c:153 #, c-format msgid "" "norm.: (%3d;%3d;%3d)\n" "distance: %6.2f" msgstr "" "norm. :(%3d;%3d;%3d)\n" "distance : %6.2f" #. Long description #: ../../po/../src/panelModules/panelPlanes.c:168 msgid "Drawing planes" msgstr "Dessiner des plans" #. Short description #: ../../po/../src/panelModules/panelPlanes.c:170 msgid "Planes" msgstr "Plans" #: ../../po/../src/panelModules/panelPlanes.c:273 msgid "_Use planes" msgstr "_Utiliser les plans" #: ../../po/../src/panelModules/panelPlanes.c:297 msgid "Simple tools" msgstr "Base" #: ../../po/../src/panelModules/panelPlanes.c:306 msgid "Hiding mode: " msgstr "Type de masquage : " #: ../../po/../src/panelModules/panelPlanes.c:316 msgid "Hide all elements that are hidden by al least one plane." msgstr "Masque tous les éléments étant masqués par au moins un plan." #: ../../po/../src/panelModules/panelPlanes.c:323 msgid "Union" msgstr "Union" #: ../../po/../src/panelModules/panelPlanes.c:333 msgid "Hide elements only if they are hidden by all planes." msgstr "Masque les éléments qui sont masqués par tous les plans." #: ../../po/../src/panelModules/panelPlanes.c:340 msgid "Intersection" msgstr "Intersection" #: ../../po/../src/panelModules/panelPlanes.c:354 msgid "" "Set the camera to look in the direction of the normal of the selected plane." msgstr "Tourner la caméra dans une direction normale au plan sélectionné." #: ../../po/../src/panelModules/panelPlanes.c:371 msgid "Normal: " msgstr "Normale :" #: ../../po/../src/panelModules/panelPlanes.c:393 msgid "Distance from origin: " msgstr "Distance à l'origine :" #: ../../po/../src/panelModules/panelPlanes.c:413 #: ../../po/../src/panelModules/panelSurfaces.c:658 msgid "Color: " msgstr "Couleur :" #: ../../po/../src/panelModules/panelPlanes.c:446 msgid "Advanced tools" msgstr "Avancé" #: ../../po/../src/panelModules/panelPlanes.c:450 msgid "Change selected plane distance" msgstr "Modifie la distance du plan sélectionné" #: ../../po/../src/panelModules/panelPlanes.c:458 #: ../../po/../src/gtk_pairs.c:434 msgid "From: " msgstr "De : " #: ../../po/../src/panelModules/panelPlanes.c:466 msgid "to: " msgstr "vers : " #: ../../po/../src/panelModules/panelPlanes.c:474 msgid "step: " msgstr "Incrément : " #: ../../po/../src/panelModules/panelPlanes.c:486 #: ../../po/../src/panelModules/panelBrowser.c:578 msgid "Play at " msgstr "Lire à " #. Units: milliseconds #: ../../po/../src/panelModules/panelPlanes.c:495 #: ../../po/../src/panelModules/panelBrowser.c:588 #: ../../po/../src/panelModules/panelConfig.c:239 msgid " ms" msgstr " ms" #: ../../po/../src/panelModules/panelPlanes.c:501 msgid "Change the distance parameter of he selected file at the given rate." msgstr "" "Modifie le paramètre de distance du plan sélectionné à la vitesse indiquée." #: ../../po/../src/panelModules/panelPlanes.c:522 msgid "File tools" msgstr "Fichiers" #: ../../po/../src/panelModules/panelPlanes.c:529 msgid "Load a plane list:" msgstr "Charger une liste de plans :" #: ../../po/../src/panelModules/panelPlanes.c:539 msgid "Current loaded list:" msgstr "Liste actuellement chargée :" #: ../../po/../src/panelModules/panelPlanes.c:618 msgid "Drawn" msgstr "Affiche" #: ../../po/../src/panelModules/panelPlanes.c:624 #: ../../po/../src/gtk_pairs.c:550 msgid "Parameters" msgstr "Paramètres" #: ../../po/../src/panelModules/panelPlanes.c:634 msgid "Mask" msgstr "Masquage" #: ../../po/../src/panelModules/panelPlanes.c:645 msgid "Invert" msgstr "Inverse" #: ../../po/../src/panelModules/panelPlanes.c:651 #: ../../po/../src/panelModules/panelSurfaces.c:628 #: ../../po/../src/panelModules/panelSurfaces.c:1376 msgid "Color" msgstr "Couleur" #: ../../po/../src/panelModules/panelPlanes.c:1559 #: ../../po/../src/panelModules/panelBrowser.c:2364 #, c-format msgid "%s" msgstr "%s" #: ../../po/../src/panelModules/panelPlanes.c:1637 msgid "Choose a file with a list of planes" msgstr "Choix d'un fichier contenant une liste de plans" #: ../../po/../src/panelModules/panelPlanes.c:1652 msgid "Plane description (*.xml)" msgstr "Description de plans (*.xml)" #: ../../po/../src/panelModules/panelPlanes.c:1656 #: ../../po/../src/panelModules/panelDataFile.c:852 #: ../../po/../src/panelModules/gtkSpin.c:612 #: ../../po/../src/extraGtkFunctions/gtk_valueIOWidget.c:210 #: ../../po/../src/extraGtkFunctions/gtk_valueIOWidget.c:460 #: ../../po/../src/visu_gtk.c:1036 msgid "All files" msgstr "Tous les fichiers" #: ../../po/../src/panelModules/panelPlanes.c:1672 #: ../../po/../src/panelModules/panelBrowser.c:1447 #: ../../po/../src/panelModules/panelBrowser.c:1470 #: ../../po/../src/panelModules/panelSurfacesTools.c:323 #: ../../po/../src/panelModules/panelSurfacesTools.c:640 #: ../../po/../src/panelModules/panelSurfacesTools.c:660 #: ../../po/../src/panelModules/panelSurfacesTools.c:683 #: ../../po/../src/panelModules/panelSurfacesTools.c:703 #: ../../po/../src/panelModules/panelSurfacesTools.c:1066 #: ../../po/../src/panelModules/panelSurfacesTools.c:1079 #: ../../po/../src/panelModules/panelSurfacesTools.c:1090 #: ../../po/../src/panelModules/panelSurfacesTools.c:1107 #: ../../po/../src/panelModules/panelSurfacesTools.c:1555 #: ../../po/../src/panelModules/panelSurfacesTools.c:1562 #: ../../po/../src/panelModules/panelSurfacesTools.c:1823 #: ../../po/../src/panelModules/panelSurfacesTools.c:1831 #: ../../po/../src/panelModules/panelSurfacesTools.c:1843 #: ../../po/../src/panelModules/panelSurfacesTools.c:1856 #: ../../po/../src/panelModules/panelSurfacesTools.c:1873 #: ../../po/../src/panelModules/panelSurfaces.c:902 #: ../../po/../src/panelModules/panelSurfaces.c:933 #: ../../po/../src/gtk_save.c:388 #: ../../po/../src/gtk_renderingWindowWidget.c:2382 msgid "Loading a file" msgstr "Chargement d'un fichier" #. Autodetect failed, no format match the given filename #: ../../po/../src/panelModules/panelPlanes.c:1699 #: ../../po/../src/panelModules/panelSurfacesTools.c:738 #: ../../po/../src/panelModules/panelSurfacesTools.c:751 #: ../../po/../src/panelModules/panelSurfacesTools.c:1597 #: ../../po/../src/panelModules/panelSurfacesTools.c:1603 #: ../../po/../src/panelModules/panelSurfacesTools.c:1609 #: ../../po/../src/panelModules/panelSurfacesTools.c:1695 #: ../../po/../src/panelModules/panelSurfacesTools.c:1701 #: ../../po/../src/panelModules/panelSurfacesTools.c:1707 #: ../../po/../src/panelModules/panelSurfacesTools.c:1733 #: ../../po/../src/extraGtkFunctions/gtk_dumpDialogWidget.c:504 #: ../../po/../src/extraGtkFunctions/gtk_dumpDialogWidget.c:526 #: ../../po/../src/gtk_save.c:533 #: ../../po/../src/gtk_renderingWindowWidget.c:2711 #: ../../po/../src/gtk_main.c:926 ../../po/../src/gtk_main.c:938 #: ../../po/../src/gtk_main.c:948 ../../po/../src/gtk_main.c:969 #: ../../po/../src/gtk_main.c:990 msgid "Saving a file" msgstr "Enregistrement d'un fichier" #: ../../po/../src/panelModules/panelBrowser.c:219 #: ../../po/../src/panelModules/panelBrowser.c:220 msgid "Browser" msgstr "Navigateur" #. This is a label in the browser panel to introduce the #. entry that allows to enter a filter for files shown. #: ../../po/../src/panelModules/panelBrowser.c:337 msgid "Filter: " msgstr "Filtre : " #: ../../po/../src/panelModules/panelBrowser.c:363 msgid "Choose a different directory." msgstr "Choisir un répertoire." #: ../../po/../src/panelModules/panelBrowser.c:370 msgid "Rescan current directory." msgstr "Relit le répertoire courant." #: ../../po/../src/panelModules/panelBrowser.c:379 msgid "Read directories recursively." msgstr "Lecture récursive des répertoires." #: ../../po/../src/panelModules/panelBrowser.c:405 msgid "Dir.:" msgstr "Rép. :" #: ../../po/../src/panelModules/panelBrowser.c:438 msgid "Double click on a file to render it." msgstr "Double-cliquer pour charger un fichier." #: ../../po/../src/panelModules/panelBrowser.c:453 msgid "File" msgstr "Fichier" #: ../../po/../src/panelModules/panelBrowser.c:471 msgid "Date" msgstr "Date" #: ../../po/../src/panelModules/panelBrowser.c:487 msgid "Unselect all files." msgstr "Tout désélectionner." #: ../../po/../src/panelModules/panelBrowser.c:493 msgid "Select all files." msgstr "Sélectionner tous les fichiers." #: ../../po/../src/panelModules/panelBrowser.c:505 msgid "Export the rendering of all selected files in other formats." msgstr "Exporte le rendu de chaque fichier sélectionné dans un autre format." #: ../../po/../src/panelModules/panelBrowser.c:511 msgid "Render the next selected file." msgstr "Afficher le fichier suivant sélectionné" #: ../../po/../src/panelModules/panelBrowser.c:518 msgid "Render the previous selected file." msgstr "Afficher le fichier précédent sélectionné" #: ../../po/../src/panelModules/panelBrowser.c:525 msgid "Current dir.: " msgstr "Rép. courant: " #: ../../po/../src/panelModules/panelBrowser.c:593 msgid "Cycle through the selected files at the given rate." msgstr "" "Parcours l'ensemble des fichiers sélectionnés suivant la vitesse indiquées." #: ../../po/../src/panelModules/panelBrowser.c:974 #, c-format msgid "foo%02d.png" msgstr "toto%02d.png" #: ../../po/../src/panelModules/panelBrowser.c:994 msgid "Dumping all selected files to images," msgstr "Exporter tous les fichiers sélectionnés en image." #: ../../po/../src/panelModules/panelBrowser.c:995 #, c-format msgid "" " format '%s'.\n" "\n" msgstr "" " format '%s'.\n" "\n" #: ../../po/../src/panelModules/panelBrowser.c:1004 #, c-format msgid "Error! The numbering pattern is wrong.\n" msgstr "Erreur! Le motif pour la numérotation est incorrect.\n" #: ../../po/../src/panelModules/panelBrowser.c:1014 #, c-format msgid "Error! Only one '%s' character is allowed in the file name.\n" msgstr "Erreur! Un seul symbole « %s » est autorisé dans le nom de fichier.\n" #: ../../po/../src/panelModules/panelBrowser.c:1024 #, c-format msgid "Error! Missing pattern in the filename.\n" msgstr "" "Erreur! Le nom de fichier ne contient pas de motif pour la numérotation.\n" #: ../../po/../src/panelModules/panelBrowser.c:1029 #, c-format msgid "" "\n" "Help : you must specify '%s' in the filename, where 'x' is a number [|1;9|]. " "This allows V_Sim to number the dumped files.\n" "\n" " For example, with a pattern like this : 'foo%s.pdf', dumped files will be " "named : foo00.pdf, foo01.pdf..." msgstr "" "\n" "Aide : la chaîne « %s » doit apparaître dans le nom du fichier, avec « x » " "un nombre compris entre 1 et 9. Ceci permet à V_Sim de numéroter les fichier " "lors de l'exportation.\n" "\n" "Par exemple, avec le motif suivant : « toto%s.pdf », les fichiers exportés " "seront nommés « toto01.pdf », « toto02.pdf »…" #: ../../po/../src/panelModules/panelBrowser.c:1036 #: ../../po/../src/panelModules/panelBrowser.c:1096 msgid "Exporting files" msgstr "Exportation de fichiers" #: ../../po/../src/panelModules/panelBrowser.c:1059 #: ../../po/../src/gtk_renderingWindowWidget.c:2699 msgid "Waiting for generating image in memory..." msgstr "En attente, création de l'image en mémoire…" #: ../../po/../src/panelModules/panelBrowser.c:1070 #, c-format msgid "Write to file %d ..." msgstr "Écriture du fichier %d…" #: ../../po/../src/panelModules/panelBrowser.c:1081 #, c-format msgid " error\n" msgstr " erreur\n" #: ../../po/../src/panelModules/panelBrowser.c:1083 #, c-format msgid " OK\n" msgstr " OK\n" #: ../../po/../src/panelModules/panelBrowser.c:1127 msgid "Abortion request, please wait..." msgstr "Annulation en cours, veuillez patienter…" #: ../../po/../src/panelModules/panelBrowser.c:1448 msgid "" "Can't load this file through the browser because it requires to read several " "files. You should use the 'Open' button on the main panel and then use the " "browser to vary one kind of file at a time." msgstr "" "Le chargement de ce fichier n'est pas possible car il nécessite plusieurs " "chargements. Commencer par utiliser le bouton « ouvrir » du panneau de " "commande avant de pouvoir utiliser le navigateur de fichier." #. We create the new ones. #: ../../po/../src/panelModules/panelBrowser.c:1526 #, c-format msgid "data set %s0%dd" msgstr "données %s0%dd" #: ../../po/../src/panelModules/panelBrowser.c:2040 msgid "Browsing a directory" msgstr "Parcours d'un répertoire" #: ../../po/../src/panelModules/panelBrowser.c:2041 msgid "The specified directory is unreadable." msgstr "Le répertoire indiqué n'est pas lisible." #: ../../po/../src/panelModules/panelBrowser.c:2108 msgid "%Y-%m-%d %H:%M" msgstr "%d/%m/%Y %H:%M" #: ../../po/../src/panelModules/panelBrowser.c:2212 #: ../../po/../src/panelModules/panelBrowser.c:2238 #, c-format msgid "%4d files found." msgstr "%4d fichiers parcourrus." #: ../../po/../src/panelModules/panelGeometry.c:98 msgid "No stored path" msgstr "Aucun chemin" #: ../../po/../src/panelModules/panelGeometry.c:99 #, c-format msgid "Path has %d step(s)" msgstr "Le chemin a %d étape(s)" #: ../../po/../src/panelModules/panelGeometry.c:154 msgid "Geometry operations" msgstr "Opérations de géométrie" #: ../../po/../src/panelModules/panelGeometry.c:155 msgid "Geometry" msgstr "Géométrie" #: ../../po/../src/panelModules/panelGeometry.c:168 msgid "_Translations" msgstr "_Translations" #: ../../po/../src/panelModules/panelGeometry.c:170 msgid "_Expand nodes" msgstr "_Étend les nœuds" #: ../../po/../src/panelModules/panelGeometry.c:181 msgid "Show node _displacements" msgstr "Visualise les _déplacements des nœuds" #: ../../po/../src/panelModules/panelGeometry.c:182 msgid "with re_ordering" msgstr "ré_ordonne" #: ../../po/../src/panelModules/panelGeometry.c:184 msgid "Use _paths" msgstr "_Afficher les chemins" #: ../../po/../src/panelModules/panelGeometry.c:189 msgid "Automatic zoom _adjustment on file loading" msgstr "Zoom _automatique lors du chargement d'un fichier" #: ../../po/../src/panelModules/panelGeometry.c:221 #: ../../po/../src/interface.c:711 msgid "dx:" msgstr "dx :" #: ../../po/../src/panelModules/panelGeometry.c:222 #: ../../po/../src/interface.c:742 msgid "dy:" msgstr "dy :" #: ../../po/../src/panelModules/panelGeometry.c:223 msgid "dz:" msgstr "dz :" #: ../../po/../src/panelModules/panelGeometry.c:239 msgid "Periodic operations" msgstr "Transformations périodiques" #: ../../po/../src/panelModules/panelGeometry.c:256 msgid "" "Translations are given in box coordinates and nodes are automatically " "translated back into the bounding box." msgstr "" "Les translations sont données dans les coordonnées de la boîte et les nœuds " "sont automatiquement repositionnés à l'intérieur." #: ../../po/../src/panelModules/panelGeometry.c:284 msgid "" "The size of the expansion is given in box coordinates. Nodes are " "automatically translated back into the new defined area. The drawn bounding " "box is kept to the original size." msgstr "" "La taille de l'expansion est donnée en coordonnées de la boîte. Les nœuds " "sont automatiquement positionnés dans le nouvel espace par translation " "depuis les positions initiales. La taille de la boîte reste inchangée." #. The rendering parameters. #: ../../po/../src/panelModules/panelGeometry.c:292 msgid "param.:" msgstr "param. :" #: ../../po/../src/panelModules/panelGeometry.c:326 msgid "Units and lengths" msgstr "Unités et longueurs" #: ../../po/../src/panelModules/panelGeometry.c:340 msgid "Set the unit of the file:" msgstr "Change l'unité du fichier :" #: ../../po/../src/panelModules/panelGeometry.c:359 msgid "Multi file actions" msgstr "Actions multi-fichiers" #: ../../po/../src/panelModules/panelGeometry.c:368 msgid "On load of a new file, reorder the nodes to minimize displacements." msgstr "" "Au chargement d'un fichier, réordonne les nœuds pour minimiser les " "déplacements." #: ../../po/../src/panelModules/panelGeometry.c:372 msgid "" "When a new file is loaded, draw arrows on nodes that represent their " "displacements with respect to their previous positions." msgstr "" "Lorsqu'un nouveau fichier est chargé, dessine des flèches sur les nœudspour " "représenter leur déplacement par rapport à leur position précédente." #: ../../po/../src/panelModules/panelGeometry.c:384 msgid "Store differences between files and plot them as lines." msgstr "" "Stocke les différences de positions entre les fichiers et les représentent " "par des lignes." #: ../../po/../src/panelModules/panelGeometry.c:393 msgid "When toggled, store differences between files as paths through nodes.." msgstr "" "Quand c'est activé, les différences entre fichiers sont stockées et tracées " "comme des chemins entre les nœuds." #: ../../po/../src/panelModules/panelGeometry.c:403 msgid "Remove all stored paths." msgstr "Retirer tous les chemins." #: ../../po/../src/panelModules/panelGeometry.c:417 msgid "colourise with: " msgstr "Colorisation :" #: ../../po/../src/panelModules/panelGeometry.c:418 msgid "" "If energy information was present when loading file, colourise the paths " "with shading colours." msgstr "" "Si l'énergie totale est définie dans le fichier, colorise le chemin avec un " "dégradé." #: ../../po/../src/panelModules/panelGeometry.c:433 msgid "Read a set of paths from a file and add them to the current set." msgstr "Lit un jeu de chemins depuis un fichier et l'ajoute au jeu courant." #: ../../po/../src/panelModules/panelGeometry.c:442 msgid "Save the current set of paths to an XML file." msgstr "Exporte le jeu courant de chemins dans un fichier XML." #: ../../po/../src/panelModules/panelGeometry.c:578 msgid "non periodic data" msgstr "données non-périodiques" #: ../../po/../src/panelModules/panelGeometry.c:581 msgid "(wire X)" msgstr "(filaire X)" #: ../../po/../src/panelModules/panelGeometry.c:584 msgid "(wire Y)" msgstr "(filaire Y)" #: ../../po/../src/panelModules/panelGeometry.c:587 msgid "(wire Z)" msgstr "(filaire Z)" #: ../../po/../src/panelModules/panelGeometry.c:590 msgid "(surface XY)" msgstr "(surface XY)" #: ../../po/../src/panelModules/panelGeometry.c:593 msgid "(surface YZ)" msgstr "(surface YZ)" #: ../../po/../src/panelModules/panelGeometry.c:596 msgid "(surface ZX)" msgstr "(surface ZX)" #: ../../po/../src/panelModules/panelGeometry.c:599 msgid "(periodic)" msgstr "(périodique)" #: ../../po/../src/panelModules/panelGeometry.c:1041 msgid "Recording paths" msgstr "Enregistre des chemins" #: ../../po/../src/panelModules/panelGeometry.c:1103 #: ../../po/../src/panelModules/panelGeometry.c:1128 msgid "Export current set of paths." msgstr "Export le jeu courant de chemins" #: ../../po/../src/panelModules/panelGeometry.c:1109 msgid "paths.xml" msgstr "chemins.xml" #: ../../po/../src/panelModules/panelGeometry.c:1149 #: ../../po/../src/panelModules/panelGeometry.c:1169 msgid "Load a set of paths." msgstr "Charge un jeu de chemins." #: ../../po/../src/panelModules/panelVibration.c:115 #: ../../po/../src/panelModules/panelVibration.c:116 msgid "Phonons" msgstr "Phonons" #: ../../po/../src/panelModules/panelVibration.c:127 msgid "with _arrow" msgstr "avec des _flèches" #: ../../po/../src/panelModules/panelVibration.c:130 msgid "use _fixed frequency" msgstr "utilise une _fréquence fixée" #: ../../po/../src/panelModules/panelVibration.c:197 msgid "Draw arrows on nodes that represent their displacements." msgstr "Dessine des flèches sur les nœuds pour représenter leur déplacements." #. make and add the first column to the view #: ../../po/../src/panelModules/panelVibration.c:220 #: ../../po/../src/visu_commandLine.c:267 #: ../../po/../src/visu_commandLine.c:287 #: ../../po/../src/visu_commandLine.c:326 #: ../../po/../src/visu_commandLine.c:379 msgid "id" msgstr "id" #. make and add the second column to the view #: ../../po/../src/panelModules/panelVibration.c:225 msgid "q point" msgstr "point q" #. make and add the third column to the view #: ../../po/../src/panelModules/panelVibration.c:230 msgid "energy" msgstr "énergie" #. the timer #: ../../po/../src/panelModules/panelVibration.c:252 msgid "Freq.: " msgstr "Fréq. : " #. the amplitude #: ../../po/../src/panelModules/panelVibration.c:261 msgid "Ampl.: " msgstr "Ampl. :" #: ../../po/../src/panelModules/panelVibration.c:273 msgid "Stop the nodes at their given positions." msgstr "Arrête les nœuds à leur position courante." #: ../../po/../src/panelModules/panelVibration.c:281 msgid "Move the nodes according to their phonon vibration." msgstr "Déplace les nœuds selon leur mode de vibration." #. reset button #: ../../po/../src/panelModules/panelVibration.c:286 msgid "Reset" msgstr "Raz" #: ../../po/../src/panelModules/panelVibration.c:289 msgid "Reset the node positions to input file coordinates." msgstr "Ramène les positions atomiques à celles du fichier d'origine." #: ../../po/../src/panelModules/panelVibration.c:508 msgid "Vibration file reloading" msgstr "Rechargement du fichier de vibrations" #: ../../po/../src/panelModules/gtkAtomic.c:72 #: ../../po/../src/pairsModeling/gtk_cylinder.c:110 msgid "Radius:" msgstr "Rayon :" #: ../../po/../src/panelModules/gtkAtomic.c:207 msgid "Shape: " msgstr "Forme :" #: ../../po/../src/panelModules/gtkAtomic.c:233 msgid "Parameters for elipsoid shape" msgstr "Paramètres pour la forme ellipsoïdale" #: ../../po/../src/panelModules/gtkAtomic.c:238 msgid "Ratio: " msgstr "Rapport : " #: ../../po/../src/panelModules/gtkAtomic.c:246 msgid "Phi: " msgstr "Phi : " #: ../../po/../src/panelModules/gtkAtomic.c:254 msgid "Theta: " msgstr "Théta : " #: ../../po/../src/panelModules/gtkAtomic.c:343 msgid "Display _forces (if available)" msgstr "Dessine les forces (si disponibles)" #: ../../po/../src/panelModules/gtkAtomic.c:351 msgid "Policy to scale arrows:" msgstr "Choix de la mise à l'échelle des flèches :" #: ../../po/../src/panelModules/gtkAtomic.c:364 msgid "automatic" msgstr "auto." #: ../../po/../src/panelModules/gtkAtomic.c:374 #: ../../po/../src/panelModules/panelDataFile.c:374 #: ../../po/../src/panelModules/panelMap.c:376 msgid "manual" msgstr "manuelle" #: ../../po/../src/panelModules/gtkAtomic.c:520 #, c-format msgid "(max. force is %.4g)" msgstr "(force max. de %.4g)" #: ../../po/../src/panelModules/gtkAtomic.c:525 msgid "(No force data)" msgstr "(Aucune force)" #: ../../po/../src/panelModules/panelDataFile.c:88 #: ../../po/../src/panelModules/panelDataFile.c:521 msgid "R" msgstr "R" #: ../../po/../src/panelModules/panelDataFile.c:89 #: ../../po/../src/panelModules/panelDataFile.c:527 msgid "G" msgstr "V" #: ../../po/../src/panelModules/panelDataFile.c:90 #: ../../po/../src/panelModules/panelDataFile.c:533 msgid "B" msgstr "B" #: ../../po/../src/panelModules/panelDataFile.c:91 msgid "H" msgstr "T" #: ../../po/../src/panelModules/panelDataFile.c:92 msgid "S" msgstr "S" #: ../../po/../src/panelModules/panelDataFile.c:93 msgid "V" msgstr "V" #: ../../po/../src/panelModules/panelDataFile.c:99 msgid "coord. x" msgstr "coord. x" #: ../../po/../src/panelModules/panelDataFile.c:100 msgid "coord. y" msgstr "coord. y" #: ../../po/../src/panelModules/panelDataFile.c:101 msgid "coord. z" msgstr "coord. z" #: ../../po/../src/panelModules/panelDataFile.c:112 msgid "No data file loaded" msgstr "Aucun fichier de données" #: ../../po/../src/panelModules/panelDataFile.c:113 msgid "No data file" msgstr "Aucun fichier de données" #: ../../po/../src/panelModules/panelDataFile.c:224 msgid "Colorize with data" msgstr "Colorisation" #: ../../po/../src/panelModules/panelDataFile.c:225 msgid "Data color" msgstr "Colorisation" #. Local variables #: ../../po/../src/panelModules/panelDataFile.c:242 msgid "_Use color scheme" msgstr "_Utiliser de la colorisation" #: ../../po/../src/panelModules/panelDataFile.c:328 msgid "_Auto load data" msgstr "Chargement _automatique" #: ../../po/../src/panelModules/panelDataFile.c:331 msgid "" "Try to load a data file whenever a new V_Sim file is loaded. For example, if " "'example.ascii' has just been opened, V_Sim will look for 'example.dat' and " "will apply it." msgstr "" "Tente de charger un fichier de données lorsqu'un fichier V_Sim est affiché." "Par exemple, à l'ouverture d'un fichier « exemple.ascii », V_Sim recherche " "un fichier de données nommé « exemple.dat » et l'applique." #: ../../po/../src/panelModules/panelDataFile.c:350 msgid "Choose a file to read the colorization data from." msgstr "Choix du fichier de données de colorisation." #: ../../po/../src/panelModules/panelDataFile.c:355 msgid "" "File extension used for the autoload option, its value is saved in the " "parameter file (see 'dataFile_fileExt')." msgstr "" "Extension de fichier utilisée par l'option de rechargement automatique, sa " "valeur est sauvegardée dans le fichier de paramètres (mot-clef « " "dataFile_fileExt »)." #: ../../po/../src/panelModules/panelDataFile.c:364 msgid "Normalize input: " msgstr "Normalisation des entrées : " #: ../../po/../src/panelModules/panelDataFile.c:369 #: ../../po/../src/panelModules/panelMap.c:372 msgid "auto" msgstr "auto." #: ../../po/../src/panelModules/panelDataFile.c:379 msgid "More information" msgstr "Plus d'informations" #: ../../po/../src/panelModules/panelDataFile.c:402 msgid "Input data bounds:" msgstr "Encadrement manuel : " #: ../../po/../src/panelModules/panelDataFile.c:435 msgid "Min:" msgstr "Min :" #: ../../po/../src/panelModules/panelDataFile.c:441 msgid "Max:" msgstr "Max :" #: ../../po/../src/panelModules/panelDataFile.c:447 msgid "Col.:" msgstr "Col. :" #. ********************* #. Transformation part #. ********************* #: ../../po/../src/panelModules/panelDataFile.c:462 msgid "Define the color scheme:" msgstr "Schéma de couleurs :" #: ../../po/../src/panelModules/panelDataFile.c:485 #: ../../po/../src/extraGtkFunctions/gtk_colorComboBoxWidget.c:414 msgid "More options" msgstr "Plus d'options" #: ../../po/../src/panelModules/panelDataFile.c:499 msgid "Color space: " msgstr "Espace colorimétrique : " #: ../../po/../src/panelModules/panelDataFile.c:504 msgid "RGB" msgstr "RVB" #: ../../po/../src/panelModules/panelDataFile.c:509 msgid "HSV" msgstr "TSV" #: ../../po/../src/panelModules/panelDataFile.c:638 msgid "Color range preview: " msgstr "Échelle colorée : " #: ../../po/../src/panelModules/panelDataFile.c:650 msgid "No preview available" msgstr "Aucun aperçu possible" #: ../../po/../src/panelModules/panelDataFile.c:660 msgid "Display the colour range." msgstr "Affiche la légende de colorisation." #. ********************* #. Post treatment part #. ********************* #: ../../po/../src/panelModules/panelDataFile.c:668 msgid "Post processing:" msgstr "Post-traitement :" #: ../../po/../src/panelModules/panelDataFile.c:681 msgid "_Hide elements" msgstr "_Masque les éléments" #: ../../po/../src/panelModules/panelDataFile.c:685 msgid " whose value from" msgstr " dont la donnée lue à" #: ../../po/../src/panelModules/panelDataFile.c:691 msgid "col. " msgstr "la colonne " #: ../../po/../src/panelModules/panelDataFile.c:699 msgid " is lower than " msgstr " est inférieure à " #: ../../po/../src/panelModules/panelDataFile.c:709 msgid "_Scale shape according to " msgstr "_Ajuste la taille suivant " #: ../../po/../src/panelModules/panelDataFile.c:724 msgid "_Restrict colourisation to values in range." msgstr "_Restreint la colorisation aux valeurs dans l'encadrement." #: ../../po/../src/panelModules/panelDataFile.c:740 msgid "Description of loaded data file." msgstr "Description du fichier de données." #: ../../po/../src/panelModules/panelDataFile.c:831 msgid "Load data file" msgstr "Charger un fichier de données" #: ../../po/../src/panelModules/panelDataFile.c:843 msgid "Data files" msgstr "Fichiers de données" #. label = gtk_label_new(_("Column number")); #. gtk_widget_set_name(label, "label_head"); #. gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_SHRINK, GTK_SHRINK, 2, 0); #: ../../po/../src/panelModules/panelDataFile.c:978 msgid "Min value" msgstr "Valeur min." #: ../../po/../src/panelModules/panelDataFile.c:981 msgid "Max value" msgstr "Valeur max." #: ../../po/../src/panelModules/panelDataFile.c:988 #, c-format msgid "Column %d" msgstr "Colonne %d" #: ../../po/../src/panelModules/panelDataFile.c:1080 #, c-format msgid "Col. %d" msgstr "Col. %d" #: ../../po/../src/panelModules/panelDataFile.c:1257 #, c-format msgid "%s: %d column(s)" msgstr "%s : %d colonne(s)" #: ../../po/../src/panelModules/panelDataFile.c:1260 #, c-format msgid "%s: file error" msgstr "%s : erreur de fichier" #: ../../po/../src/panelModules/panelDataFile.c:1271 #, c-format msgid "%d column(s)" msgstr "%d colonne(s)" #: ../../po/../src/panelModules/panelDataFile.c:1317 #, c-format msgid "" "Reading data file '%s' reports:\n" "\t%s" msgstr "" "Lors de la lecture du fichier de paramètres « %s » :\n" "\t%s" #: ../../po/../src/panelModules/panelDataFile.c:1319 msgid "Loading a data file" msgstr "Chargement d'un fichier de données" #. String used to labelled planes, dist. means 'distance' and #. norm. means 'normal' (50 chars max). #: ../../po/../src/panelModules/panelMap.c:103 #, c-format msgid "plane (%2d;%2d;%2d - %4.1f)" msgstr "plan (%2d;%2d;%2d - %4.1f)" #: ../../po/../src/panelModules/panelMap.c:175 msgid "Map sources" msgstr "Description de la carte" #: ../../po/../src/panelModules/panelMap.c:185 msgid "missing elements" msgstr "éléments manquants" #: ../../po/../src/panelModules/panelMap.c:193 msgid "Cutting plane:" msgstr "Plan de coupe :" #: ../../po/../src/panelModules/panelMap.c:197 msgid "Create elements in the 'planes' tab" msgstr "Créé depuis l'onglet « plans »" #: ../../po/../src/panelModules/panelMap.c:235 msgid "Scalar field:" msgstr "Champ scalaire :" #: ../../po/../src/panelModules/panelMap.c:239 msgid "Import fields in the 'isosurfaces' tab" msgstr "" "Chargé depuis l'onglet « isosurfaces »" #: ../../po/../src/panelModules/panelMap.c:270 msgid "Shade:" msgstr "Dégradé :" #: ../../po/../src/panelModules/panelMap.c:274 msgid "with _transparency" msgstr "avec _transperence" #: ../../po/../src/panelModules/panelMap.c:294 msgid "Options" msgstr "Options" #: ../../po/../src/panelModules/panelMap.c:310 #: ../../po/../src/panelModules/panelOpenGL.c:523 msgid "Precision:" msgstr "Précision :" #: ../../po/../src/panelModules/panelMap.c:317 msgid "Scale:" msgstr "Échelle :" #: ../../po/../src/panelModules/panelMap.c:321 msgid "_linear" msgstr "_linéaire" #: ../../po/../src/panelModules/panelMap.c:326 msgid "lo_g." msgstr "lo_g." #: ../../po/../src/panelModules/panelMap.c:331 msgid "_zero centred log." msgstr "log. centré en _zéro" #: ../../po/../src/panelModules/panelMap.c:339 msgid "Number of isolines:" msgstr "Nombre d'isolignes :" #: ../../po/../src/panelModules/panelMap.c:351 msgid "_colour:" msgstr "_couleur :" #: ../../po/../src/panelModules/panelMap.c:369 msgid "Normalise:" msgstr "Normalisation :" #: ../../po/../src/panelModules/panelMap.c:414 msgid "List of maps:" msgstr "Liste des cartes :" #: ../../po/../src/panelModules/panelMap.c:1138 msgid "Export to SVG or PDF." msgstr "Exporte en PDF ou en SVG." #: ../../po/../src/panelModules/panelMap.c:1149 msgid "PDF document (*.pdf)" msgstr "Document PDF (*.pdf)" #: ../../po/../src/panelModules/panelMap.c:1153 msgid "SVG document (*.svg)" msgstr "Document SVG (*.svg)" #: ../../po/../src/panelModules/panelMap.c:1167 msgid "map.pdf" msgstr "carte.pdf" #: ../../po/../src/panelModules/panelMap.c:1199 msgid "Export a coloured map" msgstr "Exporte la carte de couleurs" #. Long description #: ../../po/../src/panelModules/panelMap.c:1378 msgid "Map projections" msgstr "Cartes de couleur" #. Short description #: ../../po/../src/panelModules/panelMap.c:1380 msgid "Maps" msgstr "Cartes de couleur" #: ../../po/../src/panelModules/panelFogBgColor.c:111 msgid "Fog and background color" msgstr "Brouillard et fond" #: ../../po/../src/panelModules/panelFogBgColor.c:112 msgid "Fog & bg" msgstr "Fond" #. Labels for the ranges part. #: ../../po/../src/panelModules/panelFogBgColor.c:186 #: ../../po/../src/extraGtkFunctions/gtk_colorComboBoxWidget.c:121 #: ../../po/../src/extraGtkFunctions/gtk_lineObjectWidget.c:332 msgid "R:" msgstr "R :" #: ../../po/../src/panelModules/panelFogBgColor.c:187 #: ../../po/../src/extraGtkFunctions/gtk_colorComboBoxWidget.c:122 #: ../../po/../src/extraGtkFunctions/gtk_lineObjectWidget.c:333 msgid "G:" msgstr "V :" #: ../../po/../src/panelModules/panelFogBgColor.c:188 #: ../../po/../src/extraGtkFunctions/gtk_colorComboBoxWidget.c:123 #: ../../po/../src/extraGtkFunctions/gtk_lineObjectWidget.c:334 msgid "B:" msgstr "B :" #: ../../po/../src/panelModules/panelFogBgColor.c:189 msgid "A:" msgstr "A :" #: ../../po/../src/panelModules/panelFogBgColor.c:213 msgid "Background:" msgstr "Couleur du fond :" #: ../../po/../src/panelModules/panelFogBgColor.c:231 msgid "Insert an image:" msgstr "Insérer une image :" #: ../../po/../src/panelModules/panelFogBgColor.c:233 msgid "Choose a background image" msgstr "Choix d'une image de fond" #: ../../po/../src/panelModules/panelFogBgColor.c:263 msgid "Remove the background image." msgstr "Retire l'image de fond." #: ../../po/../src/panelModules/panelFogBgColor.c:271 msgid "Image size & position _follow the camera" msgstr "La taille et la position de l'image _suit la camera" #: ../../po/../src/panelModules/panelFogBgColor.c:277 msgid "Use fog:" msgstr "Utiliser du brouillard :" #: ../../po/../src/panelModules/panelFogBgColor.c:286 #: ../../po/../src/panelModules/panelSurfaces.c:2906 msgid "Start:" msgstr "Début :" #: ../../po/../src/panelModules/panelFogBgColor.c:301 #: ../../po/../src/panelModules/panelSurfaces.c:2908 msgid "End:" msgstr "Fin :" #: ../../po/../src/panelModules/panelFogBgColor.c:314 #: ../../po/../src/pairsModeling/gtk_cylinder.c:122 msgid "Color:" msgstr "Couleur :" #: ../../po/../src/panelModules/panelFogBgColor.c:316 msgid "background color" msgstr "couleur du fond" #: ../../po/../src/panelModules/panelFogBgColor.c:320 msgid "specific color" msgstr "couleur originale" #: ../../po/../src/panelModules/panelFogBgColor.c:555 msgid "Load image file" msgstr "Charge une image" #: ../../po/../src/panelModules/panelOpenGL.c:90 msgid "Follow global setting" msgstr "Suit les choix généraux" #: ../../po/../src/panelModules/panelOpenGL.c:117 msgid "Set OpenGL parameters" msgstr "Paramètres OpenGL" #: ../../po/../src/panelModules/panelOpenGL.c:118 #: ../../po/../src/panelModules/panelOpenGL.c:393 msgid "OpenGL" msgstr "OpenGL" #: ../../po/../src/panelModules/panelOpenGL.c:259 msgid "Use" msgstr "Active" #: ../../po/../src/panelModules/panelOpenGL.c:269 msgid "x" msgstr "x" #: ../../po/../src/panelModules/panelOpenGL.c:277 msgid "y" msgstr "y" #: ../../po/../src/panelModules/panelOpenGL.c:285 msgid "z" msgstr "z" #: ../../po/../src/panelModules/panelOpenGL.c:293 msgid "power" msgstr "intensité" #: ../../po/../src/panelModules/panelOpenGL.c:358 msgid "name of extension" msgstr "nom de l'extension" #: ../../po/../src/panelModules/panelOpenGL.c:370 #: ../../po/../src/visu_commandLine.c:351 msgid "mode" msgstr "mode" #: ../../po/../src/panelModules/panelOpenGL.c:394 msgid "" "The maximm number of lights allowed by OpenGL has been reached, can't add " "more." msgstr "" "Le nombre maximum de sources lumineuses autorisées est atteint, impossible " "d'en ajouter d'avantage." #. *********************** #. Rendering parameters. #. *********************** #: ../../po/../src/panelModules/panelOpenGL.c:510 msgid "Rendering options:" msgstr "Options de rendu :" #: ../../po/../src/panelModules/panelOpenGL.c:543 msgid "Mode:" msgstr "Rendu :" #: ../../po/../src/panelModules/panelOpenGL.c:548 msgid "Antialiase lines:" msgstr "Lissage des lignes :" #: ../../po/../src/panelModules/panelOpenGL.c:559 msgid "Enhanced transparency:" msgstr "Transparence améliorée :" #: ../../po/../src/panelModules/panelOpenGL.c:564 msgid "Use stereo rendering:" msgstr "Rendu stéréo :" #. Degrees. #: ../../po/../src/panelModules/panelOpenGL.c:572 #: ../../po/../src/panelModules/gtkSpin.c:276 msgid "deg." msgstr "deg." #: ../../po/../src/panelModules/panelOpenGL.c:576 msgid "angle:" msgstr "angle :" #: ../../po/../src/panelModules/panelOpenGL.c:583 msgid "Per extension rendering mode:" msgstr "Choix d'une méthode de rendu par extension :" #: ../../po/../src/panelModules/panelOpenGL.c:599 msgid "Redraw immediately after changes:" msgstr "Appliquer les changements à la volée :" #. ******************* #. VisuGlLight parameters. #. ******************* #: ../../po/../src/panelModules/panelOpenGL.c:613 msgid "Light sources:" msgstr "Sources lumineuses :" #: ../../po/../src/panelModules/panelSurfacesTools.c:232 msgid "Found different dxx, ..., dzz" msgstr "Les valeurs dxx, …, dzz trouvées sont différentes" #: ../../po/../src/panelModules/panelSurfacesTools.c:235 msgid "Keep current values" msgstr "Conserver les valeurs actuelles" #: ../../po/../src/panelModules/panelSurfacesTools.c:236 msgid "Change values to new ones" msgstr "Changer les valeurs pour de nouvelles" #: ../../po/../src/panelModules/panelSurfacesTools.c:239 msgid "" "Current dxx, ..., dzz, doesn't match the ones used in the file you are " "trying to load. Do you want to keep old dxx, ..., dzz ? (if you don't know " "exactly what you're doing, just cancel and load another file)" msgstr "" "Les valeurs dxx, …, dzz actuelles ne correspondent pas à celles utilisées " "dans le fichier qui est en train d'être chargé. Souhaitez-vous conserver les " "anciennes valeurs dxx, …, dzz? (Si vous ne savez pas, il est préférable " "d'annuler et de choisir un autre fichier)" #: ../../po/../src/panelModules/panelSurfacesTools.c:324 msgid "Unable to parse the selected file." msgstr "Impossible d'analyser le fichier sélectionné." #: ../../po/../src/panelModules/panelSurfacesTools.c:472 #: ../../po/../src/panelModules/panelSurfacesTools.c:1361 msgid "Surface name" msgstr "Nom de la surface" #: ../../po/../src/panelModules/panelSurfacesTools.c:494 msgid "New name" msgstr "Nouveau nom" #: ../../po/../src/panelModules/panelSurfacesTools.c:502 msgid "old name" msgstr "ancien nom" #: ../../po/../src/panelModules/panelSurfacesTools.c:508 msgid "from file" msgstr "à partir du fichier" #: ../../po/../src/panelModules/panelSurfacesTools.c:641 #: ../../po/../src/panelModules/panelSurfacesTools.c:661 #: ../../po/../src/panelModules/panelSurfacesTools.c:684 #: ../../po/../src/panelModules/panelSurfacesTools.c:704 msgid "An unknown error occured. Your surf file is corrupted.\n" msgstr "" "Une erreur inattendue est survenue, le fichier « .surf » est probablement " "corrompu.\n" #: ../../po/../src/panelModules/panelSurfacesTools.c:739 msgid "Please choose a surf file to write\n" msgstr "Choisissez un fichier « .surf » dans lequel écrire\n" #: ../../po/../src/panelModules/panelSurfacesTools.c:752 msgid "No surface to write\n" msgstr "Aucune surface à écrire\n" #: ../../po/../src/panelModules/panelSurfacesTools.c:799 msgid "Target info : " msgstr "Information sur la cible :" #: ../../po/../src/panelModules/panelSurfacesTools.c:800 msgid "Source info : " msgstr "Information sur la source :" #: ../../po/../src/panelModules/panelSurfacesTools.c:842 msgid "Build specified new .surf file" msgstr "Construire le nouveau fichier « .surf »" #: ../../po/../src/panelModules/panelSurfacesTools.c:844 msgid "Contains the full path to the currently .surf selected file" msgstr "Contient le chemin d'accès complet au fichier « .surf » sélectionné" #: ../../po/../src/panelModules/panelSurfacesTools.c:846 #: ../../po/../src/panelModules/panelSurfacesTools.c:2028 msgid "Contains the full path to the .surf file you want to build" msgstr "Contient le chemin d'accès complet au fichier « .surf » à construire" #: ../../po/../src/panelModules/panelSurfacesTools.c:848 msgid "Allows you to select a .surf file" msgstr "Permet de sélectionner un fichier « .surf »" #: ../../po/../src/panelModules/panelSurfacesTools.c:850 #: ../../po/../src/panelModules/panelSurfacesTools.c:2048 msgid "Selects the .surf file to write" msgstr "Choix du fichier « .surf » dans lequel écrire" #: ../../po/../src/panelModules/panelSurfacesTools.c:852 msgid "Moves selected surface to the list of surfaces to build" msgstr "" "Déplace la surface sélectionnée dans la liste des surfaces à construire" #: ../../po/../src/panelModules/panelSurfacesTools.c:854 #: ../../po/../src/panelModules/panelSurfacesTools.c:2042 msgid "Moves down selected surface in the list of surfaces to build" msgstr "" "Descend la surface sélectionnée dans la liste des surfaces à construire" #: ../../po/../src/panelModules/panelSurfacesTools.c:856 #: ../../po/../src/panelModules/panelSurfacesTools.c:2044 msgid "Moves up selected surface in the list of surfaces to build" msgstr "Monte la surface sélectionnée dans la liste des surfaces à construire" #: ../../po/../src/panelModules/panelSurfacesTools.c:858 #: ../../po/../src/panelModules/panelSurfacesTools.c:2040 msgid "Removes selected surface from the list of surfaces to build" msgstr "Retire la surface sélectionnée de la liste des surfaces à construire" #: ../../po/../src/panelModules/panelSurfacesTools.c:867 msgid "The d__ of the current selected file" msgstr "Le paramètre d__ du fichier courant." #: ../../po/../src/panelModules/panelSurfacesTools.c:876 msgid "The d__ of the file to build" msgstr "Le paramètre d__ du fichier à écrire." #: ../../po/../src/panelModules/panelSurfacesTools.c:893 msgid "Current file : " msgstr "Fichier courant :" #: ../../po/../src/panelModules/panelSurfacesTools.c:950 msgid "Target file : " msgstr "Fichier cible :" #. Create a new dialog window for the scrolled window to be #. * packed into. #: ../../po/../src/panelModules/panelSurfacesTools.c:1024 msgid "pot2surf_help" msgstr "pot2surf_help" #: ../../po/../src/panelModules/panelSurfacesTools.c:1067 msgid "Can't open given file for reading" msgstr "Impossible d'ouvrir en lecture le fichier donné." #: ../../po/../src/panelModules/panelSurfacesTools.c:1080 #: ../../po/../src/panelModules/panelSurfacesTools.c:1108 msgid "This file doesn't seem to be a correct pot file" msgstr "Ce fichier ne semble pas être un fichier pot valide." #: ../../po/../src/panelModules/panelSurfacesTools.c:1091 msgid "Second line seem to contain incorrect values" msgstr "La seconde ligne contient des données incorrectes." #: ../../po/../src/panelModules/panelSurfacesTools.c:1364 msgid "Pot value" msgstr "Valeur du potentiel" #: ../../po/../src/panelModules/panelSurfacesTools.c:1556 msgid "Please select an instruc file to write" msgstr "Choisissez un fichier « .instruc » dans lequel écrire" #: ../../po/../src/panelModules/panelSurfacesTools.c:1563 msgid "Can't open selected instruc file for writing" msgstr "Impossible d'ouvrir le fichier « .instruc » en écriture" #: ../../po/../src/panelModules/panelSurfacesTools.c:1598 #: ../../po/../src/panelModules/panelSurfacesTools.c:1696 msgid "Please specify surfaces to draw" msgstr "Choisissez les surfaces à dessiner" #: ../../po/../src/panelModules/panelSurfacesTools.c:1604 #: ../../po/../src/panelModules/panelSurfacesTools.c:1702 msgid "Please select a source pot file" msgstr "Choisissez un fichier « .pot » source" #: ../../po/../src/panelModules/panelSurfacesTools.c:1610 #: ../../po/../src/panelModules/panelSurfacesTools.c:1708 msgid "Please select a target surf file" msgstr "Choisissez un fichier « .surf » de destination" #: ../../po/../src/panelModules/panelSurfacesTools.c:1734 msgid "Error" msgstr "Erreur" #: ../../po/../src/panelModules/panelSurfacesTools.c:1824 msgid "Can't open selected file" msgstr "Impossible d'ouvrir le fichier sélectionné." #: ../../po/../src/panelModules/panelSurfacesTools.c:1832 msgid "Line 1 must contain the full path to the .pot file to read\n" msgstr "" "La première ligne doit obligatoirement contenir le chemin d'accès au fichier " "pot à lire\n" #: ../../po/../src/panelModules/panelSurfacesTools.c:1844 msgid "Line 2 must contain the full path to the .surf file to read\n" msgstr "" "La seconde ligne doit obligatoirement contenir le chemin d'accès au fichier " "surf\n" #: ../../po/../src/panelModules/panelSurfacesTools.c:1857 msgid "Line 3 must contain the number of surfaces to build\n" msgstr "" "La troisième ligne doit obligatoirement contenir le nombre de surfaces à " "modéliser\n" #: ../../po/../src/panelModules/panelSurfacesTools.c:1874 msgid "Lines must contain the value of the surface to build and its name\n" msgstr "" "Les lignes suivantes doivent contenir le numéro de la surface à modéliser et " "son nom\n" #: ../../po/../src/panelModules/panelSurfacesTools.c:1986 msgid "Build" msgstr "Modéliser" #: ../../po/../src/panelModules/panelSurfacesTools.c:1987 msgid "Autoload in V_Sim" msgstr "Chargement automatique dans V_Sim" #: ../../po/../src/panelModules/panelSurfacesTools.c:2024 msgid "If checked, autoloads newly built file in V_Sim" msgstr "Charge automatiquement les surfaces modélisées dans V_Sim." #: ../../po/../src/panelModules/panelSurfacesTools.c:2026 msgid "Contains the full path to the currently .pot selected file" msgstr "Contient le chemin d'accès au fichier .pot sélectionné" #: ../../po/../src/panelModules/panelSurfacesTools.c:2030 msgid "Contains the minimal value found in the selected .pot file" msgstr "Contient la valeur minimale trouvée dans le fichier .pot sélectionné" #: ../../po/../src/panelModules/panelSurfacesTools.c:2032 msgid "Contains the maximal value found in the selected .pot file" msgstr "Contient la valeur maximale trouvée dans le fichier .pot sélectionné" #: ../../po/../src/panelModules/panelSurfacesTools.c:2034 msgid "Tries to build specified .surf file using specified parameters" msgstr "" "Tente de construire le fichier .surf spécifié à partir des paramètres fournis" #: ../../po/../src/panelModules/panelSurfacesTools.c:2036 msgid "Adds a new surface to the list of surfaces to build" msgstr "Ajoute une nouvelle surface à la liste des surfaces à construire" #: ../../po/../src/panelModules/panelSurfacesTools.c:2038 msgid "Adds many surfaces to the list of surfaces to build" msgstr "Ajoute plusieurs surfaces à la liste des surfaces à construire" #: ../../po/../src/panelModules/panelSurfacesTools.c:2046 msgid "Selects the .pot file to use" msgstr "Choix du fichier .pot à utiliser" #: ../../po/../src/panelModules/panelSurfacesTools.c:2050 msgid "Opens a .instruc file" msgstr "Ouvre un fichier .instruc" #: ../../po/../src/panelModules/panelSurfacesTools.c:2052 msgid "Saves current settings as .instruc file" msgstr "Sauvegarde les paramètres courants dans un fichier .instruc" #: ../../po/../src/panelModules/panelSurfacesTools.c:2054 msgid "Show help" msgstr "Affiche de l'aide" #: ../../po/../src/panelModules/panelSurfacesTools.c:2087 msgid "Source .pot file :" msgstr "Fichier .pot original :" #: ../../po/../src/panelModules/panelSurfacesTools.c:2091 msgid "Target .surf file :" msgstr "Fichier .surf de destination :" #: ../../po/../src/panelModules/panelSurfacesTools.c:2101 msgid "Pot min : " msgstr "Pot. min. : " #: ../../po/../src/panelModules/panelSurfacesTools.c:2104 msgid "Pot max : " msgstr "Pot. max. : " #: ../../po/../src/panelModules/panelSurfacesTools.c:2160 msgid "Merge" msgstr "Mélange (surf. + surf.)" #: ../../po/../src/panelModules/panelSurfacesTools.c:2161 msgid "pot2surf" msgstr "Création (pot. -> surf.)" #. * #. * SECTION:gtkSpin #. * @short_description: The gtk interface elements that can interfere #. * with renderingSpin parameters. #. * #. * This is the gtk interface for all #VisuRenderingSpin module #. * parameters. They are split in two parts. The first part is placed #. * under the config tab and allows the user to modify the "global #. * properties" of the renderingSpin module such as cone's axe #. * orientation, and color repartition. The second part is under the #. * element panel and allows to modify each element resource. Size of #. * the arrows, and their shape can be modified. #. #: ../../po/../src/panelModules/gtkSpin.c:76 msgid "Shape size and color properties:" msgstr "Taille des formes et propriété de couleur :" #: ../../po/../src/panelModules/gtkSpin.c:77 msgid "Drawing policy for spins with null modulus:" msgstr "Type de rendu pour les spins de module nul :" #: ../../po/../src/panelModules/gtkSpin.c:175 msgid "x:" msgstr "x :" #: ../../po/../src/panelModules/gtkSpin.c:176 msgid "y:" msgstr "y :" #: ../../po/../src/panelModules/gtkSpin.c:177 msgid "z:" msgstr "z :" #: ../../po/../src/panelModules/gtkSpin.c:235 msgid "Set ortho." msgstr "Rendre ortho." #: ../../po/../src/panelModules/gtkSpin.c:237 msgid "Set the cone orientation to be orthogonal to the screen." msgstr "" "Oriente le cône des couleurs de telle sorte qu'il soit orthogonal au plan de " "l'écran." #: ../../po/../src/panelModules/gtkSpin.c:262 msgid "Rotate color wheel:" msgstr "Tourner la roue des couleurs :" #: ../../po/../src/panelModules/gtkSpin.c:289 msgid "always" msgstr "toujours" #: ../../po/../src/panelModules/gtkSpin.c:295 msgid "never" msgstr "jamais" #: ../../po/../src/panelModules/gtkSpin.c:301 msgid "atomic" msgstr "atomique" #: ../../po/../src/panelModules/gtkSpin.c:332 msgid "Color cone orientation:" msgstr "Orientation du cône des couleurs :" #: ../../po/../src/panelModules/gtkSpin.c:353 msgid "Spin lenght is proportional to modulus: " msgstr "La longueur des spins est prop. au module :" #: ../../po/../src/panelModules/gtkSpin.c:366 msgid "per node type" msgstr "type par nœud" #: ../../po/../src/panelModules/gtkSpin.c:376 msgid "globaly" msgstr "général" #: ../../po/../src/panelModules/gtkSpin.c:392 msgid "Use atomic rendering in addition to spin: " msgstr "Rendu atomique en plus du spin : " #: ../../po/../src/panelModules/gtkSpin.c:414 msgid "Color distribution options:" msgstr "Options de colorisation :" #: ../../po/../src/panelModules/gtkSpin.c:567 ../../po/../src/visu_gtk.c:713 msgid "Load session" msgstr "Chargement" #: ../../po/../src/panelModules/gtkSpin.c:631 msgid "Selected files are used for:" msgstr "Les fichiers sélectionnés sont utilisés pour :" #: ../../po/../src/panelModules/gtkSpin.c:646 msgid "position" msgstr "position" #: ../../po/../src/panelModules/gtkSpin.c:657 msgid "spin" msgstr "spin" #: ../../po/../src/panelModules/gtkSpin.c:691 msgid "Set the selected file as position to load." msgstr "Choisi le fichier sélectionné comme fichier de positions." #: ../../po/../src/panelModules/gtkSpin.c:703 msgid "Set the selected file as spin to load." msgstr "Choisi le fichier sélectionné comme fichier de spin." #: ../../po/../src/panelModules/gtkSpin.c:947 msgid "Spin shape:" msgstr "Forme des spins :" #. Size labels. #: ../../po/../src/panelModules/gtkSpin.c:959 msgid "Hat length:" msgstr "Long. (pointe) :" #: ../../po/../src/panelModules/gtkSpin.c:963 msgid "Tail length:" msgstr "Long. (tige) :" #: ../../po/../src/panelModules/gtkSpin.c:967 msgid "Hat radius:" msgstr "Rayon (pointe) :" #: ../../po/../src/panelModules/gtkSpin.c:971 msgid "Tail radius:" msgstr "Rayon (tige) :" #. Check box creation #: ../../po/../src/panelModules/gtkSpin.c:1001 msgid "Use element color on:" msgstr "Utilise la couleur d'élément sur :" #: ../../po/../src/panelModules/gtkSpin.c:1005 msgid " tail" msgstr " queue" #: ../../po/../src/panelModules/gtkSpin.c:1011 msgid " hat" msgstr " pointe" #: ../../po/../src/panelModules/gtkSpin.c:1041 msgid "B axis: " msgstr "Axe B :" #: ../../po/../src/panelModules/gtkSpin.c:1044 msgid "A axis: " msgstr "Axe A :" #: ../../po/../src/panelModules/gtkSpin.c:1047 msgid "Use element color" msgstr "Utiliser la couleur de l'élément" #. Atomic options. #: ../../po/../src/panelModules/gtkSpin.c:1054 msgid "Atomic rendering options" msgstr "Options de rendu atomique" #: ../../po/../src/panelModules/gtkSpin.c:1060 msgid "Enable the atomic rendering in the method tab." msgstr "Cocher le rendu atomique dans l'onglet méthode." #: ../../po/../src/panelModules/panelAxes.c:123 msgid "Box, axes and labels" msgstr "Boîte, axes et légendes" #: ../../po/../src/panelModules/panelAxes.c:124 msgid "Frames/labels" msgstr "Traits / lignes" #: ../../po/../src/panelModules/panelAxes.c:187 msgid "Bounding box" msgstr "Boîte" #: ../../po/../src/panelModules/panelAxes.c:190 msgid "Show box _lengths" msgstr "ffiche les _longueurs de la boîte" #: ../../po/../src/panelModules/panelAxes.c:194 #: ../../po/../src/panelModules/panelAxes.c:233 msgid "x pos." msgstr "pos. x" #: ../../po/../src/panelModules/panelAxes.c:197 #: ../../po/../src/panelModules/panelAxes.c:236 msgid "y pos." msgstr "pos. y" #. *********** #. The Axes. #. *********** #: ../../po/../src/panelModules/panelAxes.c:223 #: ../../po/../lib/plug-ins/bigdft/bigdft.c:440 msgid "Basis set" msgstr "Repère" #: ../../po/../src/panelModules/panelAxes.c:229 msgid "Use _box basis-set" msgstr "Le repère suit la _boîte" #. The label. #: ../../po/../src/panelModules/panelAxes.c:270 msgid "Legend" msgstr "Légende" #. *********************** #. Adding scale widgets. #. *********************** #: ../../po/../src/panelModules/panelAxes.c:279 #: ../../po/../src/extraFunctions/extraNode.c:93 #: ../../po/../src/coreTools/toolFileFormat.c:167 #: ../../po/../src/visu_rendering.c:277 msgid "Label" msgstr "Étiquette" #. To be removed. #: ../../po/../src/panelModules/panelAxes.c:295 msgid "" "Several scales are defined from resource files,\n" "but only one is editable." msgstr "" "Plusieurs échelles sont définies dans le fichier ressources,\n" "mais une seule est éditable." #: ../../po/../src/panelModules/panelAxes.c:318 msgid "Legend:" msgstr "Légende :" #: ../../po/../src/panelModules/panelAxes.c:323 msgid "Use blank legend to print the default value with the distance." msgstr "" "Ne pas écrire de légende pour obtenir la valeur par défaut avec la distance." #: ../../po/../src/panelModules/panelAxes.c:329 msgid "Length:" msgstr "Longueur :" #: ../../po/../src/panelModules/panelAxes.c:344 msgid "Origin" msgstr "Origine" #. je cree le premier labelle #. fonction pour placer le labelle a droite #. je positionne le label #. j'indique qu il peut prendre toute la place qu'il a besoins #: ../../po/../src/panelModules/panelAxes.c:348 msgid "Orientation" msgstr "Orientation" #: ../../po/../src/panelModules/panelConfig.c:140 msgid "Configure the interface" msgstr "Configuration" #: ../../po/../src/panelModules/panelConfig.c:141 msgid "Configuration" msgstr "Config." #: ../../po/../src/panelModules/panelConfig.c:226 msgid "Always show _labels in tabs" msgstr "Toujours _afficher les noms des onglets" #: ../../po/../src/panelModules/panelConfig.c:233 msgid "Automatic _refresh" msgstr "Rechargement automatique" #: ../../po/../src/panelModules/panelConfig.c:245 msgid "period:" msgstr "Période de rechargement :" #: ../../po/../src/panelModules/panelConfig.c:250 msgid "Remember _windows positions" msgstr "Conserver la position des fenêtres" #: ../../po/../src/panelModules/panelConfig.c:255 msgid "Display _coordinates in reduce" msgstr "Affiche les _coordonnées en réduit" #: ../../po/../src/panelModules/panelConfig.c:262 msgid "Set the prefered unit:" msgstr "Choix de l'unité préférée :" #: ../../po/../src/panelModules/panelConfig.c:631 #: ../../po/../src/visu_configFile.c:1617 #, c-format msgid "" "Parse error at line %d: 1 string value must appear after the %s markup.\n" msgstr "" "Erreur de lecture à la ligne %d : une chaîne de caractères est attendue " "après le marqueur « %s ».\n" #: ../../po/../src/panelModules/panelSurfaces.c:612 msgid "Edit surface properties" msgstr "Réglage des propriétés des surfaces" #: ../../po/../src/panelModules/panelSurfaces.c:633 msgid "Apply on: " msgstr "S'applique aux surfaces : " #: ../../po/../src/panelModules/panelSurfaces.c:642 msgid "selected surface" msgstr "sélectionnées" #: ../../po/../src/panelModules/panelSurfaces.c:651 msgid "all surfaces" msgstr "toutes" #: ../../po/../src/panelModules/panelSurfaces.c:686 msgid "Shade" msgstr "Dégradé" #: ../../po/../src/panelModules/panelSurfaces.c:688 msgid "Apply a shade to the current surfaces of the selected scalar field." msgstr "" "Applique un dégradé à l'ensemble des surfaces du champ scalaire sélectionné." #: ../../po/../src/panelModules/panelSurfaces.c:697 msgid "ToolShade: " msgstr "Dégradé : " #: ../../po/../src/panelModules/panelSurfaces.c:960 #, c-format msgid "" "%s\n" " Den./pot. data (min|max)\n" " %g | %g" msgstr "" "%s\n" " Fichier den./pot. (min|max)\n" " %g | %g" #: ../../po/../src/panelModules/panelSurfaces.c:1001 #, c-format msgid "" "%s\n" " Surfaces data" msgstr "" "%s\n" " Fichier de surfaces" #: ../../po/../src/panelModules/panelSurfaces.c:1303 #: ../../po/../src/panelModules/panelSurfaces.c:1770 msgid "Play" msgstr "Défiler" #: ../../po/../src/panelModules/panelSurfaces.c:1315 msgid "Stop" msgstr "Stop" #: ../../po/../src/panelModules/panelSurfaces.c:1345 msgid "File / label" msgstr "Fichier / nom" #: ../../po/../src/panelModules/panelSurfaces.c:1364 msgid "Value" msgstr "Valeur" #: ../../po/../src/panelModules/panelSurfaces.c:1387 msgid "Plane masking" msgstr "Masquage des plans" #: ../../po/../src/panelModules/panelSurfaces.c:1620 #, c-format msgid "Negative (%d)" msgstr "Négatif (%d)" #: ../../po/../src/panelModules/panelSurfaces.c:1630 #, c-format msgid "Positive (%d)" msgstr "Positif (%d)" #: ../../po/../src/panelModules/panelSurfaces.c:1784 msgid "_Use isosurfaces" msgstr "_Utiliser les iso-surfaces" #: ../../po/../src/panelModules/panelSurfaces.c:1801 msgid "Auto _load data file" msgstr "_Chargement automatique" #: ../../po/../src/panelModules/panelSurfaces.c:1804 msgid "" "Try to load a data file whenever a new V_Sim file is loaded. If the new file " "contains a scalar field, it is loaded, otherwise a surface file is tested " "using a .surf extension on the file name." msgstr "" "Essaye de charger un fichier de données lorsqu'un fichier de structure est " "chargé. Si ce nouveau fichier contient un champ scalaire, il est chargé " "automatiquement, sinon un fichier de surface avec un nom basé sur le nom du " "fichier de structure est testé." #: ../../po/../src/panelModules/panelSurfaces.c:1809 msgid "_Convert" msgstr "_Convertir" #: ../../po/../src/panelModules/panelSurfaces.c:1810 msgid "Load a surface file or a potential/density file." msgstr "Charge un fihier de surface ou un potentiel/densité." #: ../../po/../src/panelModules/panelSurfaces.c:1814 msgid "Several built-in tools to create .surf files." msgstr "Plusieurs outils permettant de créer des fichiers « .surf »." #: ../../po/../src/panelModules/panelSurfaces.c:1823 msgid "_Reorder on the fly" msgstr "_Réordonne à la volée" #: ../../po/../src/panelModules/panelSurfaces.c:1861 msgid "Hides all surfaces" msgstr "Cacher toutes les surfaces" #: ../../po/../src/panelModules/panelSurfaces.c:1863 msgid "Shows all surfaces" msgstr "Afficher toutes les surfaces" #: ../../po/../src/panelModules/panelSurfaces.c:1867 msgid "Change color and material properties." msgstr "Change les propriétés de couleur." #: ../../po/../src/panelModules/panelSurfaces.c:1875 msgid "Add a new surface." msgstr "Ajouter une nouvelle surface." #: ../../po/../src/panelModules/panelSurfaces.c:1885 msgid "Add many surfaces to the list of surfaces." msgstr "Ajoute plusieurs surfaces à la liste des surfaces." #: ../../po/../src/panelModules/panelSurfaces.c:1897 msgid "Remove selected surface or file." msgstr "Retire la surface ou le fichier sélectionné." #: ../../po/../src/panelModules/panelSurfaces.c:1906 msgid "Starts/stops showing isosurfaces at specified rate" msgstr "Arrêter/démarrer le défilement des surfaces" #: ../../po/../src/panelModules/panelSurfaces.c:1908 msgid "@" msgstr "@" #: ../../po/../src/panelModules/panelSurfaces.c:1909 msgid "Selects rate to show isosurfaces" msgstr "Choix de la période de défilement" #: ../../po/../src/panelModules/panelSurfaces.c:1912 msgid "ms" msgstr "ms" #: ../../po/../src/panelModules/panelSurfaces.c:1915 msgid "Import iso-values from an existing XML file." msgstr "Importe des iso-valeurs depuis un fichier XML existant." #: ../../po/../src/panelModules/panelSurfaces.c:1916 msgid "Export iso-values to the current XML file." msgstr "Exporte les iso-valeurs dans le fichier XML courant." #: ../../po/../src/panelModules/panelSurfaces.c:1917 msgid "Export iso-values to a new XML file." msgstr "Exporte les iso-valeurs dans un nouveau fichier XML." #: ../../po/../src/panelModules/panelSurfaces.c:1930 msgid "Draw _intra surfaces" msgstr "Dessiner l'_intérieur" #: ../../po/../src/panelModules/panelSurfaces.c:1932 msgid "Draw the interior of iso-surfaces with the complementary colour." msgstr "Dessine l'intérieur des iso-surfaces avec une couleur complémentaire." #: ../../po/../src/panelModules/panelSurfaces.c:1941 msgid "" "Automatically re-orders surfaces in back to front order whenever camera is " "modified (can be slow but get rid of transparency problems). This has no " "effect if the transparency option of the OpenGL panel is set" msgstr "" "Reordonne automatiquement du fond vers l'avant les iso-surfaces à chaque " "mouvement de la caméra (peut s'avérer lent). Ceci n'a pas d'effet si la " "transparenceaméliorée est utilisée." #: ../../po/../src/panelModules/panelSurfaces.c:2713 msgid "Comment:" msgstr "Commentaire:" #: ../../po/../src/panelModules/panelSurfaces.c:2853 msgid "Generate iso-values" msgstr "Génère des valeurs d'iso-surfaces" #: ../../po/../src/panelModules/panelSurfaces.c:2881 msgid "Number of steps:" msgstr "Nombre d'étapes :" #: ../../po/../src/panelModules/panelSurfaces.c:2889 msgid "Delta of steps:" msgstr "Variation par étape :" #: ../../po/../src/panelModules/panelSurfaces.c:2914 msgid "Name (optional):" msgstr "Nom (en option) :" #. Long description #: ../../po/../src/panelModules/panelSurfaces.c:2983 #: ../../po/../src/extensions/surfs.c:530 msgid "Drawing iso-surfaces" msgstr "Dessiner des iso-surfaces" #: ../../po/../src/panelModules/panelElements.c:154 msgid "Set elements caracteristics" msgstr "Paramètres des éléments" #: ../../po/../src/panelModules/panelElements.c:155 msgid "Elements" msgstr "Éléments" #: ../../po/../src/panelModules/panelElements.c:217 msgid "Set caracteristics of: " msgstr "Caractéristiques pour : " #. We create the tree widget that show the methods. #: ../../po/../src/panelModules/panelElements.c:223 #, c-format msgid "Element '%s'" msgstr "Élément « %s »" #: ../../po/../src/panelModules/panelElements.c:228 msgid "Standard resources" msgstr "Ressources standards" #: ../../po/../src/panelModules/panelElements.c:241 msgid "rendered" msgstr "affiché" #: ../../po/../src/panelModules/panelElements.c:250 msgid "Make nodes sensitive to the masking effect of planes." msgstr "Applique les effets masquant des plans sur les nœuds." #: ../../po/../src/panelModules/panelElements.c:255 msgid "Rendering specific resources" msgstr "Paramètres particuliers" #: ../../po/../src/renderingMethods/atomic_yaml.c:85 msgid "BigDFT YAML format" msgstr "format YAML de BigDFT" #: ../../po/../src/renderingMethods/atomic_yaml.c:191 #: ../../po/../src/renderingMethods/renderingAtomic_ascii.c:599 #, c-format msgid "" "Wrong (ab) angle, should be different from 0[pi].\n" "\n" " Quoting '%g'.\n" msgstr "" "Erreur sur l'angle (ab), il devrait être différent de 0[pi].\n" "\n" " Citant '%g'.\n" #: ../../po/../src/renderingMethods/atomic_yaml.c:241 #, c-format msgid "Unsupported boundary conditions.\n" msgstr "conditions aux bords invalides.\n" #: ../../po/../src/renderingMethods/atomic_yaml.c:276 #, c-format msgid "Unsupported units.\n" msgstr "unité non supportée.\n" #: ../../po/../src/renderingMethods/renderingAtomic_d3.c:97 msgid "Native binary format" msgstr "Format binaire natif" #: ../../po/../src/renderingMethods/renderingAtomic_d3.c:140 #: ../../po/../src/renderingMethods/renderingAtomic_d3.c:162 #: ../../po/../src/renderingMethods/renderingAtomic_d3.c:186 #, c-format msgid "WARNING : wrong fortran syntax, flag size unmatched.\n" msgstr "" "AVERTISSEMENT! Syntaxe Fortran incorrecte, la taille des repères diffère.\n" #: ../../po/../src/renderingMethods/renderingAtomic_d3.c:239 #, c-format msgid "unknwon peridicity flag '%s'" msgstr "périodicité « %s » inconnue" #: ../../po/../src/renderingMethods/renderingAtomic_d3.c:259 #, c-format msgid "Impossible to open this file." msgstr "Impossible d'ouvrir ce fichier." #: ../../po/../src/renderingMethods/renderingAtomic_d3.c:395 #, c-format msgid "wrong d3 syntax, 'sum of nattyp's not equal to nat'\n" msgstr "syntaxe d3 incorrecte, la somme des nattyp est différente de nat.\n" #: ../../po/../src/renderingMethods/renderingAtomic_d3.c:498 #, c-format msgid "input file has no dataset number %d (%d have been read).\n" msgstr "" "le fichier d'entrée n'a pas de série de données numéro %d (alors que %d ont " "été lues).\n" #: ../../po/../src/renderingMethods/renderingAtomic_ascii.c:115 msgid "'x y z Element' format" msgstr "Format du type « x y z élément »" #: ../../po/../src/renderingMethods/renderingAtomic_ascii.c:459 #, c-format msgid "Cannot read dxx dyx dyy on 2nd line of ASCII file.\n" msgstr "Impossible de lire dxx dyx et dyy sur la deuxième ligne.\n" #: ../../po/../src/renderingMethods/renderingAtomic_ascii.c:478 #, c-format msgid "Cannot read dzx dzy dzz on 3rd line of ASCII file.\n" msgstr "Impossible de lire dzx dzy et dzz sur la troisième ligne.\n" #: ../../po/../src/renderingMethods/renderingAtomic_ascii.c:534 #, c-format msgid "" "Cannot read x, y, z, name in ASCII file at line %d.\n" "\n" "Quoting '%s'.\n" msgstr "" "Impossible de lire « x y z nom » dans le fichier ASCI à la ligne %d.\n" "\n" " Extrait « %s ».\n" #: ../../po/../src/renderingMethods/renderingAtomic_ascii.c:566 #: ../../po/../src/renderingMethods/atomic_xyz.c:571 #, c-format msgid "The file contains no atom coordinates.\n" msgstr "Le fichier ne contient pas de coordonnées atomiques.\n" #: ../../po/../src/renderingMethods/atomic_xyz.c:95 msgid "'Element x y z' format" msgstr "Format du type « élément x y z »" #: ../../po/../src/renderingMethods/atomic_xyz.c:261 #, c-format msgid "Wrong XYZ format, 'Atom X Y Z' awaited." msgstr "" "Mauvais format XYZ, le schéma par ligne est le suivant : « Atome X Y Z »." #: ../../po/../src/renderingMethods/atomic_xyz.c:268 #, c-format msgid "Wrong XYZ + vibration format, 'Atom X Y Z vx vy vz' awaited." msgstr "" "Mauvais format XYZ + vibration, le schéma par ligne est le suivant : « Atome " "X Y Z vx vy vz »." #: ../../po/../src/renderingMethods/atomic_xyz.c:287 #, c-format msgid "Internal error, cannot create type for '%s'." msgstr "Erreur interne, impossible de créer le type « %s »." #: ../../po/../src/renderingMethods/atomic_xyz.c:342 #, c-format msgid "Missing forces (%d read but %d declared).\n" msgstr "Forces manquantes (%d données lues avec %d attendues).\n" #: ../../po/../src/renderingMethods/atomic_xyz.c:353 #, c-format msgid "Cannot read forces in '%s'.\n" msgstr "Impossible de lire les forces depuis « %s ».\n" #: ../../po/../src/renderingMethods/atomic_xyz.c:445 #, c-format msgid "Wrong XYZ format, no number on first line.\n" msgstr "Mauvais format XYZ, il manque un entier sur la première ligne.\n" #: ../../po/../src/renderingMethods/atomic_xyz.c:501 #, c-format msgid "Missing coordinates (%d read but %d declared).\n" msgstr "Coordonnées manquantes (%d données lues avec %d attendues).\n" #: ../../po/../src/renderingMethods/renderingSpin.c:270 msgid "Theta angle" msgstr "Théta" #: ../../po/../src/renderingMethods/renderingSpin.c:271 msgid "The theta angle to orientate the colourisation cone." msgstr "L'angle théta permettant d'orienter le cone de colorisation." #: ../../po/../src/renderingMethods/renderingSpin.c:282 msgid "Phi angle" msgstr "Phi" #: ../../po/../src/renderingMethods/renderingSpin.c:283 msgid "The phi angle to orientate the colourisation cone." msgstr "L'angle phi permettant d'orienter le cone de colorisation." #: ../../po/../src/renderingMethods/renderingSpin.c:294 msgid "Omega angle" msgstr "Oméga" #: ../../po/../src/renderingMethods/renderingSpin.c:295 msgid "The omega angle to orientate the colourisation cone." msgstr "L'angle oméga permettant d'orienter le cone de colorisation." #: ../../po/../src/renderingMethods/renderingSpin.c:306 msgid "Hiding policy for null modulus" msgstr "Mode de masquage lorsque le spin est de module nul" #: ../../po/../src/renderingMethods/renderingSpin.c:307 msgid "The hiding policy for spin with a null modulus." msgstr "Le mode de masquage lorsque le spin est de module nul." #: ../../po/../src/renderingMethods/renderingSpin.c:319 msgid "Scaling of spin depending on modulus value" msgstr "Mise à l'échelle selon le module du spin" #: ../../po/../src/renderingMethods/renderingSpin.c:320 msgid "The scaling policy based on modulus value." msgstr "Le mode de mise à l'échelle suivant le module du spin." #: ../../po/../src/renderingMethods/renderingSpin.c:332 msgid "Use atomic rendering" msgstr "Utilisation du rendu atomique" #: ../../po/../src/renderingMethods/renderingSpin.c:333 msgid "If atomic rendering is used in addition to spin rendering." msgstr "Le rendu atomique est utilisé en plus du spin." #: ../../po/../src/renderingMethods/renderingSpin.c:347 msgid "Rounded arrow" msgstr "Flèches arrondies" #: ../../po/../src/renderingMethods/renderingSpin.c:348 msgid "Edged arrow" msgstr "Flèches carrées" #: ../../po/../src/renderingMethods/renderingSpin.c:349 #: ../../po/../src/renderingMethods/renderingAtomic.c:237 msgid "Elipsoid" msgstr "Ellipsoïde" #: ../../po/../src/renderingMethods/renderingSpin.c:350 #: ../../po/../src/renderingMethods/renderingAtomic.c:239 msgid "Torus" msgstr "Tore" #: ../../po/../src/renderingMethods/renderingSpin.c:354 msgid "Spin (θ, φ, mod.)" msgstr "Spin (θ, φ, mod.)" #: ../../po/../src/renderingMethods/renderingSpin.c:482 msgid "It draws arrows at given positions to represent an atom and its spin." msgstr "" "Dessine des flèches aux positions indiquées pour représenter des spins." #: ../../po/../src/renderingMethods/renderingSpin.c:501 #: ../../po/../src/renderingMethods/renderingAtomic.c:303 msgid "Position files" msgstr "Fichiers de position" #: ../../po/../src/renderingMethods/renderingSpin.c:503 msgid "Spin files" msgstr "Fichiers de spin" #: ../../po/../src/renderingMethods/renderingSpin.c:624 msgid "Ascii spin files" msgstr "Fichiers ASCII de spin" #: ../../po/../src/renderingMethods/renderingSpin.c:634 msgid "Binary spin files" msgstr "Fichiers binaires de spin" #: ../../po/../src/renderingMethods/renderingSpin.c:717 #: ../../po/../src/renderingMethods/renderingSpin.c:803 #, c-format msgid "impossible to open this spin file.\n" msgstr "impossible d'ouvrir ce fichier de spin.\n" #: ../../po/../src/renderingMethods/renderingSpin.c:726 #, c-format msgid "spin file should have one line at least.\n" msgstr "un fichier de spin doit contenir au moins une ligne.\n" #: ../../po/../src/renderingMethods/renderingSpin.c:828 #, c-format msgid "number of spin differs from number of nodes.\n" msgstr "le nombre de spins est différent du nombre de nœuds.\n" #: ../../po/../src/renderingMethods/renderingSpin.c:1285 #, c-format msgid "Parse error at line %d, the shape '%s' is unknown.\n" msgstr "Erreur de lecture à la ligne %d : la forme '%s' est inconnue.\n" #: ../../po/../src/renderingMethods/renderingSpin.c:1363 #, c-format msgid "Parse error at line %d, the hiding mode '%s' is unknown.\n" msgstr "" "Erreur de lecture à la ligne %d : le mode de masquage '%s' est inconnu.\n" #: ../../po/../src/renderingMethods/renderingSpin.c:1414 #, c-format msgid "Parse error at line %d, the modulus mode '%d' is unknown.\n" msgstr "" "Erreur de lecture à la ligne %d : le mode de module '%s' est inconnu.\n" #: ../../po/../src/renderingMethods/renderingSpin.c:1487 #, c-format msgid "" "Parse error at line %d: a shape with 4 floating points and 2 booleans must " "appear after the %s markup.\n" msgstr "" "Erreur de lecture à la ligne %d: une forme suivie de 4 flottants et deux " "booléen est attendues après le marqueur « %s ».\n" #: ../../po/../src/renderingMethods/renderingSpin.c:1497 #: ../../po/../src/renderingMethods/renderingAtomic.c:882 #: ../../po/../src/openGLFunctions/renderingMode.c:231 #, c-format msgid "Parse error at line %d: the shape '%s' is unknown.\n" msgstr "Erreur de lecture à la ligne %d: la forme '%s' est inconnue.\n" #: ../../po/../src/renderingMethods/renderingAtomic.c:235 msgid "Sphere" msgstr "Sphère" #: ../../po/../src/renderingMethods/renderingAtomic.c:236 msgid "Cube" msgstr "Cube" #: ../../po/../src/renderingMethods/renderingAtomic.c:238 msgid "Point" msgstr "Point" #: ../../po/../src/renderingMethods/renderingAtomic.c:245 msgid "Forces" msgstr "Forces" #: ../../po/../src/renderingMethods/renderingAtomic.c:292 msgid "" "It draws spheres at specified positions to represent atoms. The radius of " "the sphere can vary." msgstr "" "Dessine des sphères (de rayons variables) aux positions indiquées pour " "représenter des atomes" #: ../../po/../src/renderingMethods/renderingAtomic.c:947 #, c-format msgid "Parse error at line %d: the sphere method '%s' is unknown.\n" msgstr "Erreur de lecture à la ligne %d : la méthode « %s » est inconnue.\n" #: ../../po/../src/extraFunctions/plane.c:1089 #: ../../po/../src/extraFunctions/plane.c:1120 #: ../../po/../src/extraFunctions/plane.c:1166 #: ../../po/../src/extraFunctions/plane.c:1208 #: ../../po/../src/extraFunctions/plane.c:1238 #: ../../po/../src/extraFunctions/pot2surf.c:1883 #: ../../po/../src/extraFunctions/pot2surf.c:1933 #: ../../po/../src/extraFunctions/pot2surf.c:1983 #: ../../po/../src/extraFunctions/pot2surf.c:2031 #, c-format msgid "Unexpected attribute '%s' for element '%s'." msgstr "Attribut « %s » inattendu pour l'élément « %s »." #: ../../po/../src/extraFunctions/plane.c:1114 #: ../../po/../src/extraFunctions/plane.c:1151 #: ../../po/../src/extraFunctions/plane.c:1160 #: ../../po/../src/extraFunctions/plane.c:1192 #: ../../po/../src/extraFunctions/plane.c:1203 #: ../../po/../src/extraFunctions/plane.c:1231 #: ../../po/../src/extraFunctions/pot2surf.c:1921 #: ../../po/../src/extraFunctions/pot2surf.c:1928 #: ../../po/../src/extraFunctions/pot2surf.c:1978 #: ../../po/../src/extraFunctions/pot2surf.c:2013 #: ../../po/../src/extraFunctions/pot2surf.c:2024 #, c-format msgid "Invalid value '%s' for attribute '%s'." msgstr "Valeur incorrecte (« %s ») pour l'attribut « %s »." #: ../../po/../src/extraFunctions/plane.c:1137 #, c-format msgid "DTD error : parent element '%s' of element '%s' is missing." msgstr "" "Erreur de DTD : l'élément parent « %s » de l'élément « %s » est manquant." #: ../../po/../src/extraFunctions/plane.c:1175 #: ../../po/../src/extraFunctions/plane.c:1218 #: ../../po/../src/extraFunctions/pot2surf.c:1961 #: ../../po/../src/extraFunctions/pot2surf.c:1999 #: ../../po/../src/extraFunctions/geometry.c:983 #: ../../po/../src/extraFunctions/geometry.c:1033 #: ../../po/../src/extensions/marks.c:1878 #: ../../po/../src/extensions/marks.c:1912 #: ../../po/../src/extensions/marks.c:1952 #, c-format msgid "DTD error: parent element '%s' of element '%s' is missing." msgstr "" "Erreur de DTD : l'élément parent « %s » de l'élément « %s » est manquant." #: ../../po/../src/extraFunctions/plane.c:1244 #: ../../po/../src/extraFunctions/pot2surf.c:2042 #: ../../po/../src/extraFunctions/geometry.c:1088 #: ../../po/../src/extensions/marks.c:2004 #, c-format msgid "Unexpected element '%s'." msgstr "Élément « %s » inattendu." #: ../../po/../src/extraFunctions/plane.c:1266 #: ../../po/../src/extraFunctions/plane.c:1274 #, c-format msgid "DTD error: missing or wrong child element '%s'." msgstr "Erreur de DTD : élément fils « %s » manquant ou inapproprié." #: ../../po/../src/extraFunctions/plane.c:1362 #, c-format msgid "The file contains no plane.\n" msgstr "Le fichier ne contient pas de plan.\n" #: ../../po/../src/extraFunctions/surfaces_resources.c:311 #: ../../po/../src/extraFunctions/surfaces_resources.c:324 #: ../../po/../src/extraFunctions/surfaces_resources.c:359 #: ../../po/../src/extraFunctions/surfaces_resources.c:371 #: ../../po/../src/extraFunctions/surfaces_resources.c:404 #: ../../po/../src/extraFunctions/surfaces_resources.c:414 #, c-format msgid "Can't parse resource '%s' of iso-surfaces on line %d.\n" msgstr "" "Impossible d'analyser les ressources « %s » d'une iso-surface à la ligne " "%d.\n" #: ../../po/../src/extraFunctions/dataFile.c:181 msgid "Colorisation data" msgstr "Données de colorisation" #: ../../po/../src/extraFunctions/dataFile.c:625 #, c-format msgid "Can't find any column of data in the given file.\n" msgstr "Impossible de rouver de données en colonne dans le fichier fourni.\n" #: ../../po/../src/extraFunctions/dataFile.c:660 #, c-format msgid "There are more nodes than data.\n" msgstr "Il y a plus de données que de nœuds.\n" #: ../../po/../src/extraFunctions/dataFile.c:672 #, c-format msgid "" "Can't find any columns with numbers.\n" "Valid format are as much numbers as desired, separated by any of the " "following characters : [ ;:\\t].\n" msgstr "" "Le nombre de colonnes est impossible à déterminé.\n" "Une ligne valide contient autant d'informations numériques que nécessaire, " "séparées par les caractères suivants : [ ;:\\t].\n" #: ../../po/../src/extraFunctions/surfaces.c:787 #: ../../po/../src/extraFunctions/surfaces.c:812 #, c-format msgid "Line %d doesn't match the [float, float, float] pattern." msgstr "La ligne %d ne correspond pas à la forme [réel, réel, réel]." #: ../../po/../src/extraFunctions/surfaces.c:838 #, c-format msgid "Line %d doesn't match the [int > 0, int > 0, int > 0] pattern." msgstr "" "La ligne %d ne correspond pas à la forme [entier > 0, entier > 0, entier > " "0]." #: ../../po/../src/extraFunctions/surfaces.c:919 #, c-format msgid "Line %d doesn't match the [int > 0, int > 0] pattern." msgstr "La ligne %d ne correspond pas à la forme [entier > 0, entier > 0]." #: ../../po/../src/extraFunctions/surfaces.c:933 #, c-format msgid "Error on line %d. Declared number of polygons reached." msgstr "Erreur à la ligne %d. Le nombre de polygones déclaré a été atteint." #: ../../po/../src/extraFunctions/surfaces.c:947 #, c-format msgid "Error on line %d. Declared number of points reached." msgstr "Erreur à la ligne %d. Le nombre de points déclaré a été atteint." #: ../../po/../src/extraFunctions/surfaces.c:986 #, c-format msgid "Line %dmust begin by an int." msgstr "La ligne %d doit dommencer par un entier." #: ../../po/../src/extraFunctions/surfaces.c:1006 #, c-format msgid "Line %d doesn't match the [int > 3, ...] required pattern." msgstr "La ligne %d ne correspond pas à la forme [entier > 3, …]." #: ../../po/../src/extraFunctions/surfaces.c:1046 #, c-format msgid "Line %d doesn't match the [float x 6] required pattern." msgstr "La ligne %d ne correspond pas à la forme [réel x 6]" #. T for True. #: ../../po/../src/extraFunctions/dataNode.c:674 #: ../../po/../src/extraFunctions/dataNode.c:783 msgid "T" msgstr "V" #. F for False. #: ../../po/../src/extraFunctions/dataNode.c:677 #: ../../po/../src/extraFunctions/dataNode.c:792 msgid "F" msgstr "F" #: ../../po/../src/extraFunctions/dataNode.c:715 #: ../../po/../src/extraFunctions/dataNode.c:725 #: ../../po/../src/extraFunctions/dataNode.c:738 msgid "No data" msgstr "Aucune donnée" #: ../../po/../src/extraFunctions/pot2surf.c:1891 #: ../../po/../src/extraFunctions/geometry.c:953 #: ../../po/../src/extensions/marks.c:1835 #, c-format msgid "DTD error: element '%s' should appear only once." msgstr "Erreur de DTD : l'élément « %s » ne peut apparaître qu'une seule fois." #: ../../po/../src/extraFunctions/pot2surf.c:1946 #: ../../po/../src/extraFunctions/pot2surf.c:1988 #, c-format msgid "Missing attribute '%s' for element '%s'." msgstr "Attribut « %s » manquant pour l'élément « %s »." #: ../../po/../src/extraFunctions/pot2surf.c:2132 #, c-format msgid "No iso-value found." msgstr "Aucune iso-valeur trouvée." #: ../../po/../src/extraFunctions/geometry.c:968 #: ../../po/../src/extraFunctions/geometry.c:1002 #: ../../po/../src/extraFunctions/geometry.c:1063 #: ../../po/../src/extensions/marks.c:1855 #: ../../po/../src/extensions/marks.c:1866 #: ../../po/../src/extensions/marks.c:1892 #: ../../po/../src/extensions/marks.c:1926 #: ../../po/../src/extensions/marks.c:1937 #: ../../po/../src/extensions/marks.c:1966 #: ../../po/../src/extensions/marks.c:1977 #: ../../po/../src/extensions/marks.c:1988 #, c-format msgid "DTD error: attribute '%s' has an unknown value '%s'." msgstr "Erreur de DTD : l'attribut « %s » a une valeur inconnue « %s »." #: ../../po/../src/extraFunctions/geometry.c:1010 #: ../../po/../src/extraFunctions/geometry.c:1071 #, c-format msgid "DTD error: element '%s' have missing mandatory attributes." msgstr "Erreur de DTD : l'élément « %s » a des attributs manquants." #: ../../po/../src/extraFunctions/geometry.c:1141 #, c-format msgid "No paths found." msgstr "Aucun chemin trouvé." #: ../../po/../src/extraFunctions/scalarFields.c:187 msgid "Potential/density files" msgstr "Fichiers potentiel/densité" #: ../../po/../src/extraFunctions/scalarFields.c:359 #, c-format msgid "unknown density/potential format.\n" msgstr "format de potentiel/densité inconnu.\n" #: ../../po/../src/extraFunctions/scalarFields.c:394 #, c-format msgid "impossible to open the file.\n" msgstr "impossible d'ouvrir ce fichier.\n" #: ../../po/../src/extraFunctions/scalarFields.c:472 #, c-format msgid "wrong '%s' value for flag '%s'.\n" msgstr "mauvaise valeur « %s » pour la balise « %s ».\n" #: ../../po/../src/extraFunctions/scalarFields.c:498 #, c-format msgid "not enough meshx values.\n" msgstr "données de meshx manquantes.\n" #: ../../po/../src/extraFunctions/scalarFields.c:507 #, c-format msgid "impossible to read meshx values.\n" msgstr "impossible de lire la valeur d'iso-densité.\n" #: ../../po/../src/extraFunctions/scalarFields.c:520 #, c-format msgid "not enough meshy values.\n" msgstr "données de meshy manquantes.\n" #: ../../po/../src/extraFunctions/scalarFields.c:529 #, c-format msgid "impossible to read meshy values.\n" msgstr "impossible de lire la valeur d'iso-densité.\n" #: ../../po/../src/extraFunctions/scalarFields.c:542 #, c-format msgid "not enough meshz values.\n" msgstr "données de meshz manquantes.\n" #: ../../po/../src/extraFunctions/scalarFields.c:551 #, c-format msgid "impossible to read meshz values.\n" msgstr "impossible de lire la valeur d'iso-densité.\n" #: ../../po/../src/extraFunctions/scalarFields.c:571 #: ../../po/../src/extraFunctions/scalarFields.c:599 #, c-format msgid "not enough density values.\n" msgstr "pas assez de valeurs de densité.\n" #: ../../po/../src/extraFunctions/scalarFields.c:582 #: ../../po/../src/extraFunctions/scalarFields.c:608 #, c-format msgid "impossible to read density values.\n" msgstr "impossible de lire la valeur d'iso-densité.\n" #: ../../po/../src/pairsModeling/gtk_cylinder.c:126 msgid "_user defined" msgstr "_utilisateur" #: ../../po/../src/pairsModeling/gtk_cylinder.c:136 msgid "_elements" msgstr "_éléments" #. a.u. is for arbitrary units. #: ../../po/../src/pairsModeling/gtk_cylinder.c:255 msgid "cyl.:" msgstr "cyl. :" #: ../../po/../src/pairsModeling/gtk_cylinder.c:256 msgid "a.u." msgstr "u.a." #: ../../po/../src/pairsModeling/wire.c:204 msgid "Wire pairs" msgstr "Liaisons filaires" #: ../../po/../src/pairsModeling/wire.c:205 msgid "" "Pairs are rendered by flat lines. The color and the width can by chosen." msgstr "" "Les liaisons sont dessinées par des traits de couleurs et d'épaisseurs " "variables." #: ../../po/../src/pairsModeling/wire.c:497 #, c-format msgid "Parse error at line %d: shade id must be in %d-%d.\n" msgstr "" "Erreur de lecture à la ligne %d: l'identifiant de dégradé doit être dans %d-" "%d.\n" #: ../../po/../src/pairsModeling/wire.c:520 #, c-format msgid "Parse error at line %d: stipple must be in 1-65535.\n" msgstr "" "Erreur de lecture à la ligne %d: the schéma de ligne doit être dans " "0-65535.\n" #: ../../po/../src/pairsModeling/wire.c:543 #: ../../po/../src/pairsModeling/wire.c:565 #: ../../po/../src/openGLFunctions/view.c:1916 #: ../../po/../src/openGLFunctions/interactive.c:1664 #, c-format msgid "Parse error at line %d: width must be in %d-%d.\n" msgstr "Erreur de lecture à la ligne %d: la largeur doit être dans %d-%d.\n" #: ../../po/../src/pairsModeling/cylinder.c:377 msgid "Cylinder pairs" msgstr "Liaisons cylindriques" #: ../../po/../src/pairsModeling/cylinder.c:378 msgid "Pairs are rendered by cylinders. The color and the width can by chosen." msgstr "" "Les liaisons sont dessinées par des cylindres de couleurs et de rayons " "variables." #: ../../po/../src/pairsModeling/cylinder.c:457 #, c-format msgid "Parse error at line %d: radius (%g) must be in %g-%g.\n" msgstr "Erreur de lecture à la ligne %d : le rayon doit être dans %g/%g.\n" #: ../../po/../src/pairsModeling/cylinder.c:481 #, c-format msgid "Parse error at line %d: radius must be in %g-%g.\n" msgstr "Erreur de lecture à la ligne %d : le rayon doit être dans %g/%g.\n" #: ../../po/../src/pairsModeling/cylinder.c:502 #, c-format msgid "" "Parse error at line %d: 1 integer value must appear after the %s markup.\n" msgstr "" "Erreur de lecture à la ligne %d : un entier est attendu après le marqueur « " "%s ».\n" #: ../../po/../src/pairsModeling/gtk_wire.c:117 msgid "Thickness:" msgstr "Épaisseur :" #: ../../po/../src/pairsModeling/gtk_wire.c:125 msgid "Pattern:" msgstr "Motif :" #: ../../po/../src/pairsModeling/gtk_wire.c:138 msgid "Color _varies with length:" msgstr "Faire _varier la couleur avec la longueur :" #. px is for pixels and pat. for pattern. #: ../../po/../src/pairsModeling/gtk_wire.c:174 msgid "wire:" msgstr "ligne :" #. px for pixel. #: ../../po/../src/pairsModeling/gtk_wire.c:175 #: ../../po/../src/extraGtkFunctions/gtk_dumpDialogWidget.c:309 #: ../../po/../src/extraGtkFunctions/gtk_dumpDialogWidget.c:324 #: ../../po/../src/extraGtkFunctions/gtk_lineObjectWidget.c:312 msgid "px" msgstr "px" #: ../../po/../src/pairsModeling/gtk_wire.c:175 msgid "pat." msgstr "motif" #: ../../po/../src/dumpModules/dumpToGif.c:225 #, c-format msgid "Unable to quantize image, initialisation failed for node child %d." msgstr "Impossible de passer en couleurs indexées pour le nœud fils %d." #: ../../po/../src/dumpModules/dumpToGif.c:452 #, c-format msgid "Unable to quantize image, initialisation failed." msgstr "Impossible de passer en couleurs indexées, erreur à l'initialisation." #: ../../po/../src/dumpModules/dumpToGif.c:812 msgid "Gif (256 colors) file" msgstr "Gif (256 couleurs)" #: ../../po/../src/dumpModules/dumpToGif.c:848 #: ../../po/../src/dumpModules/dumpToTiff.c:690 #: ../../po/../src/dumpModules/dumpToPsAndPdf.c:382 #: ../../po/../src/dumpModules/dumpToPsAndPdf.c:483 #: ../../po/../src/dumpModules/dumpToPsAndPdf.c:639 #, c-format msgid "Cannot open file (to write in)." msgstr "Impossible d'ouvrir le fichier en écriture." #: ../../po/../src/dumpModules/dumpToGif.c:922 #, c-format msgid "Fail to compress the GIF file." msgstr "Impossible de compresser le fichier GIF." #: ../../po/../src/dumpModules/dumpToABINIT.c:75 msgid "ABINIT file (crystal only)" msgstr "Fichier ABINIT (partie cristal)" #: ../../po/../src/dumpModules/dumpToABINIT.c:83 #: ../../po/../src/dumpModules/dumpToAscii.c:90 msgid "Export positions in reduced coordinates" msgstr "Exporte les positions en coordonnées réduites" #: ../../po/../src/dumpModules/dumpToABINIT.c:85 #: ../../po/../src/dumpModules/dumpToAscii.c:92 msgid "Export box as lengths and angles" msgstr "Exporte la boîte en longueurs et angles" #: ../../po/../src/dumpModules/dumpThroughGdkPixbuf.c:80 msgid "Png file" msgstr "Fichier PNG" #: ../../po/../src/dumpModules/dumpThroughGdkPixbuf.c:95 msgid "Jpeg file" msgstr "Fichiers JPEG" #: ../../po/../src/dumpModules/dumpThroughGdkPixbuf.c:99 msgid "Compression ratio (given in percent)" msgstr "Taux de compression (en pourcent)" #: ../../po/../src/dumpModules/dumpThroughGdkPixbuf.c:148 #, c-format msgid "Cannot convert pixmap to pixbuf." msgstr "Impossible de convertir le pixmap en pixbuf." #: ../../po/../src/dumpModules/dumpToTiff.c:77 msgid "Tiff file" msgstr "Format Tiff" #: ../../po/../src/dumpModules/dumpToAscii.c:76 msgid "ASCII file (current positions)" msgstr "Fichier ASCII (positions courantes)" #: ../../po/../src/dumpModules/dumpToAscii.c:84 msgid "Don't output hidden nodes" msgstr "Ne pas exporter les nœuds cachés" #: ../../po/../src/dumpModules/dumpToAscii.c:86 msgid "Comment hidden nodes (if output)" msgstr "Exporte les nœuds cachés sous forme de commentaires" #: ../../po/../src/dumpModules/dumpToAscii.c:88 msgid "Keep primitive box (in case of node expansion)" msgstr "Conserve la boîte d'origine (dans le cas d'extension de la boîte)" #: ../../po/../src/dumpModules/dumpToAscii.c:94 #: ../../po/../src/dumpModules/dumpToXyz.c:85 msgid "Export nodes sorted by elements" msgstr "Exporte les nœuds triés par éléments" #: ../../po/../src/dumpModules/dumpToXyz.c:75 msgid "Xyz file (current positions)" msgstr "Fichier xyz (positions courantes)" #: ../../po/../src/dumpModules/dumpToXyz.c:83 msgid "Expand the bounding box" msgstr "Étend la boîte" #: ../../po/../src/dumpModules/dumpToSVG.c:162 msgid "Scalar Vector Graphic (SVG) file" msgstr "Fichier vectoriel (SVG)" #: ../../po/../src/dumpModules/dumpToSVG.c:171 #: ../../po/../src/dumpModules/dumpToSVG.c:189 msgid "Use flat colours for scheme rendering" msgstr "Utilise un rendu plat de couleurs" #: ../../po/../src/dumpModules/dumpToSVG.c:180 msgid "Portable Document Format (PDF) file" msgstr "Fichier Portable Document Format (PDF)" #: ../../po/../src/dumpModules/dumpToPsAndPdf.c:107 msgid "Bitmap in a postscript (v3.0) file" msgstr "Image dans un Postscript (v3.0)" #: ../../po/../src/dumpModules/dumpToPsAndPdf.c:119 msgid "Use a reduced colormap (256 colors)" msgstr "Réduction du nombre de couleur (256 couleurs)" #: ../../po/../src/dumpModules/dumpToPsAndPdf.c:127 msgid "Bitmap in a PDF (v. 1.2)" msgstr "Image dans un PDF (v1.2)" #: ../../po/../src/extensions/axes.c:341 msgid "Draw {x,y,z} axes." msgstr "Dessine un repère {x, y, z}." #: ../../po/../src/extensions/axes.c:1030 msgid "front" msgstr "avant" #: ../../po/../src/extensions/axes.c:1043 msgid "back" msgstr "envers" #: ../../po/../src/extensions/fogAndBGColor.c:246 msgid "Set the color of the background." msgstr "Change la coleur du fond." #: ../../po/../src/extensions/fogAndBGColor.c:418 #, c-format msgid "Background: %s" msgstr "Fond : %s" #: ../../po/../src/extensions/pairs.c:188 msgid "Bonds" msgstr "Liaisons" #: ../../po/../src/extensions/pairs.c:321 msgid "Draw pairs between elements with a criterion of distance." msgstr "Dessine des liaisons selon un critère de distance." #: ../../po/../src/extensions/pairs.c:882 #, c-format msgid "" "Parse error at line %d, 1 string value must appear after the %s markup.\n" msgstr "" "Erreur de lecture à la ligne %d : une chaîne de caractères est attendue " "après le marqueur « %s ».\n" #: ../../po/../src/extensions/pairs.c:893 #: ../../po/../src/extensions/pairs.c:986 #, c-format msgid "Parse error at line %d, the method '%s' is unknown.\n" msgstr "Erreur de lecture à la ligne %d : la méthode « %s » est inconnue.\n" #: ../../po/../src/extensions/pairs.c:929 #, c-format msgid "" "Parse error at line %d, given distance are out of bounds (should be " "positive).\n" msgstr "" "Erreur de lecture à la ligne %d : la distance donnée est hors limites " "(valeur positive attendue).\n" #: ../../po/../src/extensions/pairs.c:1007 #, c-format msgid "" "Parse error at line %d, 3 floating points(0 <= v <= 1) must appear after the " "%s markup.\n" msgstr "" "Erreur de lecture à la ligne %d : 3 valeurs réelles (0. < v <= 1.) sont " "attendues après le marqueur « %s ».\n" #: ../../po/../src/extensions/pairs.c:1348 #, c-format msgid "" "Parse error at line %d, 5 floating points must appear after the %s markup.\n" msgstr "" "Erreur de lecture à la ligne %d : 5 valeurs réelles sont attendues après le " "marqueur « %s ».\n" #: ../../po/../src/extensions/infos.c:226 msgid "Draw informations on nodes." msgstr "Affiche des informations sur les nœuds." #: ../../po/../src/extensions/paths.c:170 msgid "Representation of paths." msgstr "Repésentation de chemins." #: ../../po/../src/extensions/planes.c:235 msgid "Draw some planes." msgstr "Dessine des plans." #: ../../po/../src/extensions/shade.c:195 msgid "Draw the legend of a color shade." msgstr "Dessine la légende pour un dégradé." #: ../../po/../src/extensions/node_vectors.c:357 msgid "Draw vectors on each nodes." msgstr "Dessine des vecteurs à chaque nœud." #: ../../po/../src/extensions/legend.c:227 msgid "Draw the name and the shape of available elements on screen." msgstr "Dessine le nom des éléments à l'écran." #: ../../po/../src/extensions/maps.c:247 msgid "Drawing extension for maps." msgstr "Extension de dessin pour la carte des couleurs." #: ../../po/../src/extensions/nodes.c:237 msgid "Draw all the nodes." msgstr "Dessiner tous les nœuds." #: ../../po/../src/extensions/marks.c:344 msgid "Draw some marks on element in video inverse." msgstr "Dessine des marques sur les éléments en vidéo inversée." #: ../../po/../src/extensions/marks.c:355 msgid "Marks - classical" msgstr "Marques (normales)" #: ../../po/../src/extensions/marks.c:356 msgid "Draw some marks on element." msgstr "Dessine des marques sur les éléments." #: ../../po/../src/extensions/marks.c:2088 #, c-format msgid "No picked node found." msgstr "Aucun nœud sélectionné" #: ../../po/../src/extensions/forces.c:209 msgid "Draw forces with vectors." msgstr "Dessine les forces avec des vecteurs." #: ../../po/../src/extensions/scale.c:125 #, c-format msgid "Length: %6.2f" msgstr "Longueur : %6.2f" #: ../../po/../src/extensions/scale.c:288 msgid "Draw scales in the rendering area." msgstr "Dessine des étiquettes dans la fenêtre de rendu." #: ../../po/../src/extensions/scale.c:1000 #, c-format msgid "" "Parse error at line %d: 4 floating points(0 <= v <= 1) must appear after the " "%s markup.\n" msgstr "" "Erreur de lecture à la ligne %d: 4 valeurs réelles (0. < v <= 1.) sont " "attendues après le marqueur « %s ».\n" #: ../../po/../src/extensions/scale.c:1023 #, c-format msgid "" "Parse error at line %d: 1 floating point(1 <= v <= 10) must appear after the " "%s markup.\n" msgstr "" "Erreur de lecture à la ligne %d: une valeur réelle (0. < v <= 10) est " "attendue après le marqueur « %s ».\n" #: ../../po/../src/extensions/box.c:232 msgid "Draw informations related to the box." msgstr "Affiche des informations sur la boîte." #: ../../po/../src/extensions/box.c:245 msgid "Box lengths" msgstr "Longueurs des côtés" #: ../../po/../src/extensions/box.c:665 msgid "Draw a box representing the limit of the area." msgstr "Dessine la boîte entourant les éléments." #: ../../po/../src/extensions/box.c:1307 #, c-format msgid "x: %7.3f" msgstr "x : %7.3f" #: ../../po/../src/extensions/box.c:1317 #, c-format msgid "y: %7.3f" msgstr "y : %7.3f" #: ../../po/../src/extensions/box.c:1326 #, c-format msgid "z: %7.3f" msgstr "z : %7.3f" #: ../../po/../src/coreTools/toolConfigFile.c:109 #, c-format msgid "Parse error at line %d, %d floating point values should appear here.\n" msgstr "Erreur de lecture à la ligne %d : %d valeurs réelles sont attendues.\n" #: ../../po/../src/coreTools/toolConfigFile.c:122 #, c-format msgid "" "Parse error at line %d, %d floating point value(s) should appear here but %d " "has been found.\n" msgstr "" "Erreur de lecture à la ligne %d : %d valeurs réelles sont attendues alors " "que %d ont été lues.\n" #: ../../po/../src/coreTools/toolConfigFile.c:193 #, c-format msgid "Parse error at line %d, %d boolean values should appear here.\n" msgstr "" "Erreur de lecture à la ligne %d : %d valeur(s) booléenne(s) sont attendue" "(s).\n" #: ../../po/../src/coreTools/toolConfigFile.c:206 #, c-format msgid "" "Parse error at line %d, %d boolean(s) values should appear here but %d has " "been found.\n" msgstr "" "Erreur de lecture à la ligne %d : %d valeur(s) booléenne(s) sont attendue(s) " "mais %d ont été lues.\n" #: ../../po/../src/coreTools/toolConfigFile.c:278 #: ../../po/../src/coreTools/toolConfigFile.c:332 #, c-format msgid "" "Parse error at line %d, %d string(s) should appear here but %d has been " "found.\n" msgstr "" "Erreur de lecture à la ligne %d : %d chaînes de caractères sont attendues " "mais %d ont été lues.\n" #: ../../po/../src/coreTools/toolConfigFile.c:494 #, c-format msgid "Parse error at line %d, '%s' wrong element name.\n" msgstr "Erreur de lecture à la ligne %d : « %s » n'est pas un élément connu.\n" #: ../../po/../src/coreTools/toolConfigFile.c:507 #, c-format msgid "" "Parse error at line %d, %d elements should appear here but %d has been " "found.\n" msgstr "" "Erreur de lecture à la ligne %d : %d éléments sont attendues ici mais %d ont " "été lus.\n" #: ../../po/../src/coreTools/toolConfigFile.c:550 #, c-format msgid "Parse error at line %d, %d integer values should appear here.\n" msgstr "" "Erreur de lecture à la ligne %d : %d valeur(s) entière(s) sont attendue(s).\n" #: ../../po/../src/coreTools/toolConfigFile.c:563 #, c-format msgid "" "Parse error at line %d, %d integer(s) values should appear here but %d has " "been found.\n" msgstr "" "Erreur de lecture à la ligne %d : %d valeur(s) entière(s) sont attendue(s) " "mais %d ont été lues.\n" #: ../../po/../src/coreTools/toolFortran.c:75 #, c-format msgid "impossible to read Fortran flag, '%s' error.\n" msgstr "impossible de lire le flag Fortran, erreur dans « %s ».\n" #: ../../po/../src/coreTools/toolFortran.c:105 #: ../../po/../src/coreTools/toolFortran.c:127 #: ../../po/../src/coreTools/toolFortran.c:150 #: ../../po/../src/coreTools/toolFortran.c:173 #: ../../po/../src/coreTools/toolFortran.c:209 #: ../../po/../src/coreTools/toolFortran.c:232 #: ../../po/../src/coreTools/toolFortran.c:268 #: ../../po/../src/coreTools/toolFortran.c:291 #, c-format msgid "flag size unmatch, '%s' error.\n" msgstr "incohérence sur la taille des repères, erreur dans « %s ».\n" #: ../../po/../src/coreTools/toolFortran.c:115 #, c-format msgid "" "impossible to read %d characters (%d read, feof: %d, ferror: %d), '%s' " "error.\n" msgstr "" "impossible de lire %d caractères (%d lus, feof: %d, ferror: %d), erreur « %s " "».\n" #: ../../po/../src/coreTools/toolFortran.c:161 #, c-format msgid "" "impossible to read %d integers (%d read, feof: %d, ferror: %d), '%s' error.\n" msgstr "" "impossible de lire %d entiers (%d read, feof: %d, ferror: %d), erreur « %s " "».\n" #: ../../po/../src/coreTools/toolFortran.c:220 #, c-format msgid "" "impossible to read %d real (%d read, feof: %d, ferror: %d), '%s' error.\n" msgstr "" "impossible de lire %d nombres réels (%d read, feof: %d, ferror: %d), erreur " "« %s ».\n" #: ../../po/../src/coreTools/toolFortran.c:279 #, c-format msgid "" "impossible to read %d double (%d read, feof: %d, ferror: %d), '%s' error.\n" msgstr "" "impossible de lire %d nombres réels double précision (%d read, feof: %d, " "ferror: %d), erreur « %s ».\n" #: ../../po/../src/coreTools/toolFortran.c:336 #, c-format msgid "wrong fortran syntax, flag size unmatched.\n" msgstr "syntaxe Fortran incorrecte, la taille des repères diffère.\n" #: ../../po/../src/coreTools/toolShade.c:720 msgid "blue to red" msgstr "du bleu au rouge" #: ../../po/../src/coreTools/toolShade.c:731 msgid "hot color" msgstr "couleurs chaudes" #: ../../po/../src/coreTools/toolShade.c:742 msgid "blue to yellow" msgstr "du bleu au jaune" #: ../../po/../src/coreTools/toolShade.c:753 msgid "zero centred dark" msgstr "centré en zéro, sombre" #. Create a blue and red shade with withe zero centred. #: ../../po/../src/coreTools/toolShade.c:758 msgid "zero centred light" msgstr "centré en zéro, claire" #: ../../po/../src/coreTools/toolShade.c:763 msgid "zero centred coloured" msgstr "centré en zéro, coloré" #: ../../po/../src/coreTools/toolShade.c:775 msgid "green to red" msgstr "du vert au rouge" #: ../../po/../src/coreTools/toolShade.c:786 msgid "light green to red" msgstr "du vert pâle au rouge" #: ../../po/../src/coreTools/toolShade.c:797 msgid "black to white" msgstr "du noir au blanc" #: ../../po/../src/coreTools/toolShade.c:808 msgid "white to black" msgstr "du blanc au noir" #: ../../po/../src/coreTools/toolShade.c:819 msgid "purple color" msgstr "couleur mauve" #. Create the so-called Jet colour map. #: ../../po/../src/coreTools/toolShade.c:824 msgid "Jet map" msgstr "dégradé Jet" #: ../../po/../src/coreTools/toolShade.c:843 #, c-format msgid "1 floating point value should start a step '%s'.\n" msgstr "une valeur réelle doit démarer une étape « %s ».\n" #: ../../po/../src/coreTools/toolShade.c:855 #, c-format msgid "cannot read a color from '%s' (name, #rgb, #rrggbb ... awaited).\n" msgstr "" "impossible de lire une couleur depuis « %s » (nom, #rgb, #rrggbb … " "attendus).\n" #: ../../po/../src/coreTools/toolShade.c:914 #, c-format msgid "" "Parse error at line %d, cannot find parenthesis containing the description " "of a shade.\n" msgstr "" "Erreur de lecture à la ligne %d, impossible de trouver les parenthèses " "délimitant la définition d'un dégradé.\n" #: ../../po/../src/coreTools/toolFileFormat.c:156 #: ../../po/../src/gtk_about.c:351 ../../po/../src/visu_rendering.c:266 msgid "Name" msgstr "Nom" #: ../../po/../src/coreTools/toolFileFormat.c:156 msgid "File format description." msgstr "Description du format de fichier." #: ../../po/../src/coreTools/toolFileFormat.c:167 msgid "Label used to show the file pattern." msgstr "Étiquette utilisée pour représenter le format de fichier." #: ../../po/../src/coreTools/toolFileFormat.c:179 msgid "Ignore file patterns" msgstr "Ignore le format de fichier." #: ../../po/../src/coreTools/toolFileFormat.c:180 msgid "Don't restrict file matching to the given patterns." msgstr "Ne limite pas la recherche au format de fichier donné." #: ../../po/../src/openGLFunctions/renderingMode.c:103 msgid "Wireframe" msgstr "Fil de fer" #: ../../po/../src/openGLFunctions/renderingMode.c:104 msgid "Flat" msgstr "Facetté" #: ../../po/../src/openGLFunctions/renderingMode.c:105 msgid "Smooth" msgstr "Lissé (meilleur)" #: ../../po/../src/openGLFunctions/renderingMode.c:106 msgid "Smooth & edge" msgstr "Lissé & bords" #: ../../po/../src/extraGtkFunctions/gtk_dumpDialogWidget.c:221 msgid "Export to a file (image, atomic structures...)" msgstr "Exporte dans un fichier (image, structure atomique…)" #. Label to introduce the combobox which allow to choose the format #: ../../po/../src/extraGtkFunctions/gtk_dumpDialogWidget.c:270 msgid "Choose the file format : " msgstr "Choix du format de fichier : " #: ../../po/../src/extraGtkFunctions/gtk_dumpDialogWidget.c:276 msgid "Autodetect format" msgstr "Autodétection par l'extension" #. Add an expander for file format options. #: ../../po/../src/extraGtkFunctions/gtk_dumpDialogWidget.c:279 msgid "File format option:" msgstr "Option du format de fichier : " #: ../../po/../src/extraGtkFunctions/gtk_dumpDialogWidget.c:292 msgid "Add extension" msgstr "Ajouter l'extension" #: ../../po/../src/extraGtkFunctions/gtk_dumpDialogWidget.c:298 msgid "Width: " msgstr "Larg. :" #: ../../po/../src/extraGtkFunctions/gtk_dumpDialogWidget.c:313 msgid "Height: " msgstr "Haut. :" #. Label to introduce the progress bar #: ../../po/../src/extraGtkFunctions/gtk_dumpDialogWidget.c:337 msgid "Dump progress : " msgstr "Avancement : " #: ../../po/../src/extraGtkFunctions/gtk_dumpDialogWidget.c:349 msgid "" "Current box has translations applied, do you want to proceed to exportation " "anyway?" msgstr "" "La boite courante a des translations, voulez-vous quand même exporter les " "positions courantes ?" #: ../../po/../src/extraGtkFunctions/gtk_dumpDialogWidget.c:505 #: ../../po/../src/extraGtkFunctions/gtk_fieldChooser.c:264 msgid "No filename chosen." msgstr "Aucun nom de fichier sélctionné." #: ../../po/../src/extraGtkFunctions/gtk_dumpDialogWidget.c:527 msgid "The filename doesn't match any known format." msgstr "Le nom de fichier fourni ne correspond à aucun format connu." #: ../../po/../src/extraGtkFunctions/gtk_toolPanelWidget.c:196 #: ../../po/../src/gtk_main.c:353 msgid "Command panel" msgstr "Panneau de commande" #: ../../po/../src/extraGtkFunctions/gtk_toolPanelWidget.c:490 msgid "Manage this subpanel: attach/detach or hide it." msgstr "Gestion de cet onglet : l'attacher, le détache ou le masquer." #: ../../po/../src/extraGtkFunctions/gtk_toolPanelWidget.c:766 #, c-format msgid "Send to '%s'" msgstr "Envoyer dans « %s »" #. Create a new dock window. #: ../../po/../src/extraGtkFunctions/gtk_toolPanelWidget.c:782 msgid "New dock" msgstr "Nouvelle boîte à outils" #. Remove the current tool panel. #: ../../po/../src/extraGtkFunctions/gtk_toolPanelWidget.c:787 #, c-format msgid "Hide tool '%s'" msgstr "Masquer l'outil « %s »" #: ../../po/../src/extraGtkFunctions/gtk_toolPanelWidget.c:820 #, c-format msgid "Dock window (%d)" msgstr "Fenêtre d'outils (%d)" #: ../../po/../src/extraGtkFunctions/gtk_toolPanelWidget.c:1101 #: ../../po/../src/extraGtkFunctions/gtk_toolPanelWidget.c:1129 #, c-format msgid "Show '%s'" msgstr "Montrer « %s »" #: ../../po/../src/extraGtkFunctions/gtk_toolPanelWidget.c:1113 msgid "No hidden tool" msgstr "Aucun outil masqué" #: ../../po/../src/extraGtkFunctions/gtk_toolPanelWidget.c:1140 msgid "No hidden dock" msgstr "Aucune boîte à outils masquée" #. Hide action #: ../../po/../src/extraGtkFunctions/gtk_toolPanelWidget.c:1150 msgid "Hide dock" msgstr "Masquer la boîte à outils" #: ../../po/../src/extraGtkFunctions/gtk_toolPanelWidget.c:1497 msgid "" "Raise the rendering window.\n" " Use as key binding." msgstr "" "Affiche la fenêtre de rendu.\n" " Raccoursis clavier : ." #. The Label to introduce the combo list. #: ../../po/../src/extraGtkFunctions/gtk_toolPanelWidget.c:1501 msgid "Tool: " msgstr "Outil : " #: ../../po/../src/extraGtkFunctions/gtk_toolPanelWidget.c:1535 msgid "Manage hidden subpanels and dock windows." msgstr "Gestion des onglets masqués et des fenêtres d'utilitaires." #: ../../po/../src/extraGtkFunctions/gtk_toolPanelWidget.c:1541 msgid "" "Positions, sizes, names, contains... of dock windows are stored in the " "parameters file, see the 'Config. files' button on the command panel." msgstr "" "La position, la taille, le nom et le contenu des fenêtres d'outils sont " "sauvegardés dans le fichier de paramètres, voir le bouton « Fichiers de " "conf. » du panneau de commande." #: ../../po/../src/extraGtkFunctions/gtk_fieldChooser.c:183 msgid "Isosurfaces files" msgstr "Fichier d'iso-surfaces" #: ../../po/../src/extraGtkFunctions/gtk_fieldChooser.c:192 msgid "Open a surface/density file" msgstr "Ouvrir un fichier de surface/densité" #: ../../po/../src/extraGtkFunctions/gtk_fieldChooser.c:208 msgid "Fit surfaces to box" msgstr "Adapter la taille des surfaces à la boîte de rendu." #: ../../po/../src/extraGtkFunctions/gtk_fieldChooser.c:210 msgid "Makes surfaces fit to the current loaded bounding box." msgstr "" "Modifie les surfaces pour les faire correspondre à la boîte de rendu " "atomique." #: ../../po/../src/extraGtkFunctions/gtk_fieldChooser.c:213 msgid "Fit box to surfaces" msgstr "Adapter la la boîte de rendu à la définition des surfaces." #: ../../po/../src/extraGtkFunctions/gtk_fieldChooser.c:215 msgid "Makes the current bounding box fit to the surfaces." msgstr "" "Modifie la définition de la boîte de rendu atomique pour lui faire " "correspondre celle des surfaces." #. Autodetect failed, no format match the given filename #: ../../po/../src/extraGtkFunctions/gtk_fieldChooser.c:263 msgid "Opening a file" msgstr "Ouverture d'un fichier" #: ../../po/../src/extraGtkFunctions/gtk_valueIOWidget.c:207 msgid "V_Sim value file (*.xml)" msgstr "Fichier de valeurs V_Sim (*.xml)" #: ../../po/../src/extraGtkFunctions/gtk_valueIOWidget.c:213 #: ../../po/../src/extraGtkFunctions/gtk_valueIOWidget.c:219 msgid "Open a V_Sim value file" msgstr "Ouvre un fichier de données V_Sim" #. The label. #: ../../po/../src/extraGtkFunctions/gtk_valueIOWidget.c:241 msgid "I/O:" msgstr "E/S :" #: ../../po/../src/extraGtkFunctions/gtk_valueIOWidget.c:369 msgid "Import V_Sim values from a file." msgstr "Importe des données V_Sim depuis un fichier XML existant." #: ../../po/../src/extraGtkFunctions/gtk_valueIOWidget.c:442 #: ../../po/../src/extraGtkFunctions/gtk_valueIOWidget.c:494 #: ../../po/../src/extraGtkFunctions/gtk_valueIOWidget.c:599 msgid "Export V_Sim values to a file." msgstr "Exporte les données V_Sim dans un fichier." #: ../../po/../src/extraGtkFunctions/gtk_valueIOWidget.c:456 msgid "V_Sim value files (*.xml)" msgstr "Fichier de valeurs V_Sim (*.xml)" #: ../../po/../src/extraGtkFunctions/gtk_valueIOWidget.c:466 msgid "values.xml" msgstr "valeurs.xml" #: ../../po/../src/extraGtkFunctions/gtk_colorComboBoxWidget.c:124 msgid "Alph:" msgstr "Alpha :" #: ../../po/../src/extraGtkFunctions/gtk_colorComboBoxWidget.c:125 msgid "amb:" msgstr "amb. :" #: ../../po/../src/extraGtkFunctions/gtk_colorComboBoxWidget.c:126 msgid "dif:" msgstr "dif. :" #: ../../po/../src/extraGtkFunctions/gtk_colorComboBoxWidget.c:127 msgid "shi:" msgstr "bri. :" #: ../../po/../src/extraGtkFunctions/gtk_colorComboBoxWidget.c:128 msgid "spe:" msgstr "spé. :" #: ../../po/../src/extraGtkFunctions/gtk_colorComboBoxWidget.c:129 msgid "emi:" msgstr "émi. :" #: ../../po/../src/extraGtkFunctions/gtk_colorComboBoxWidget.c:282 #: ../../po/../src/extraGtkFunctions/gtk_colorComboBoxWidget.c:283 msgid "New / modify" msgstr "Nouvelle/modif." #. Create the selection. #: ../../po/../src/extraGtkFunctions/gtk_colorComboBoxWidget.c:686 msgid "Select a color" msgstr "Sélectionner une couleur" #: ../../po/../src/extraGtkFunctions/gtk_orientationChooser.c:273 msgid "Update values on the fly." msgstr "Met les données à jour à la volée." #: ../../po/../src/extraGtkFunctions/gtk_orientationChooser.c:333 msgid "Choose an orientation" msgstr "Choix d'une orientation" #: ../../po/../src/extraGtkFunctions/gtk_orientationChooser.c:350 msgid "On an orthonormal basis set" msgstr "Dans un repère orthonormal" #: ../../po/../src/extraGtkFunctions/gtk_orientationChooser.c:375 msgid "Following the box basis set" msgstr "Selon le repère de la boîte" #: ../../po/../src/extraGtkFunctions/gtk_orientationChooser.c:399 msgid "On a spherical basis set" msgstr "Dans un repère sphérique" #: ../../po/../src/extraGtkFunctions/gtk_shadeComboBoxWidget.c:624 #, c-format msgid "Parse error at line %d: prefered shade must be positive.\n" msgstr "" "Erreur de lecture à la ligne %d : le dégradé préféré doit être positif.\n" #: ../../po/../src/extraGtkFunctions/gtk_lineObjectWidget.c:279 msgid "expand for options" msgstr "affiche les options" #. ***************** #. The scale line. #. ***************** #. The label. #: ../../po/../src/extraGtkFunctions/gtk_lineObjectWidget.c:296 msgid "Line style:" msgstr "Style de ligne :" #: ../../po/../src/extraGtkFunctions/gtk_lineObjectWidget.c:304 msgid "width:" msgstr "Larg. :" #: ../../po/../src/extraGtkFunctions/gtk_lineObjectWidget.c:355 msgid "color:" msgstr "Couleur :" #: ../../po/../src/extraGtkFunctions/gtk_lineObjectWidget.c:371 msgid "(preset)" msgstr "(prédéfinie)" #: ../../po/../src/extraGtkFunctions/gtk_elementComboBox.c:390 msgid "All elements" msgstr "Tous les éléments" #: ../../po/../src/extraGtkFunctions/gtk_curveWidget.c:105 #: ../../po/../src/extraGtkFunctions/gtk_curveWidget.c:240 #: ../../po/../lib/plug-ins/python-gi/pythongi.c:257 msgid "All" msgstr "Tout" #: ../../po/../src/interface.c:85 msgid "Save session" msgstr "Sauvegarder la configuration" #: ../../po/../src/interface.c:113 msgid "Manage configuration files" msgstr "" "Gestion des fichiers de configuration" #: ../../po/../src/interface.c:142 msgid "Load from file" msgstr "Charger depuis un fichier" #: ../../po/../src/interface.c:178 ../../po/../src/interface.c:255 msgid "Save to file" msgstr "Enregistrer dans un fichier" #: ../../po/../src/interface.c:202 msgid "Export resources related to rendered file only" msgstr "Exporter uniquement les ressources rattachées au fichier rendu" #: ../../po/../src/interface.c:237 msgid "" "Resources (values related to rendering " "aspects)" msgstr "" "Ressources (valeurs relatives aux aspects " "de rendu)" #: ../../po/../src/interface.c:294 msgid "" "Parameters (Interface options)" msgstr "" "Paramètres (Options de l'interface)" #: ../../po/../src/interface.c:307 msgid "" "When saving, if you just specify a directory 'dir/', it will be save to 'dir/v_sim.[res][par]' by default, ortherwise speficy a " "full path." msgstr "" "Si le nom d'un répertoire « rép/» est donné, les sauvegardes seront faites dans les fichiers " "suivants : « rép/v_sim.[res/par] ». " "Sinon, l'enregistrement est effectué dans le chemin complet fourni." #: ../../po/../src/interface.c:316 msgid "" "Tips: think to create a $XDG_CONFIG_HOME/v_sim directory and put your resource " "and parameter files in it. It is scanned at startup." msgstr "" "Astuce : pensez à créer un répertoire nommé " "$XDG_CONFIG_HOME/v_sim et à y placer vos " "fichiers de configuration. Ce répertoire est lu au démarrage." #: ../../po/../src/interface.c:334 ../../po/../src/interface.c:1207 #: ../../po/../src/interface.c:1891 msgid "Help" msgstr "Aide" #: ../../po/../src/interface.c:546 msgid "Pick and observe session" msgstr "Observation ou sélection" #: ../../po/../src/interface.c:597 msgid "Observe" msgstr "Observation" #: ../../po/../src/interface.c:609 msgid "constrained" msgstr "contraint" #: ../../po/../src/interface.c:612 msgid "" "Movement are along meridians when the mouse is dragged along y axis and " "along parallels when the movement is along x axis." msgstr "" "Les mouvements ont lieu le long des méridiens lorsque la souris se déplace " "sur l'axe des y et le long des parallèles lorsque les mouvements de la " "souris sont sur l'axe des x." #: ../../po/../src/interface.c:616 msgid "walker" msgstr "marcheur" #: ../../po/../src/interface.c:619 msgid "" "Movements are those of a walking ant on a sphere, when mouse move along y " "axis, the ant goes strait on, when mouse is dragged along x axis, the ant " "translates on its right or on its left." msgstr "" "Les mouvements de la caméra suivent ce que verrait une fourmie se déplaçant " "sur une sphère : un mouvement vertical de la souris fait avancer ou reculer " "la caméra alors qu'un mouvement horizontal entraine une translation gauche/" "droite de la caméra." #: ../../po/../src/interface.c:633 msgid "Translations" msgstr "Translations" #: ../../po/../src/interface.c:640 msgid "Scale" msgstr "Échelle" #: ../../po/../src/interface.c:697 msgid "omega:" msgstr "oméga :" #: ../../po/../src/interface.c:704 msgid "phi:" msgstr "phi :" #: ../../po/../src/interface.c:718 msgid "zoom:" msgstr "zoom :" #: ../../po/../src/interface.c:725 msgid "theta:" msgstr "théta :" #: ../../po/../src/interface.c:749 msgid "persp.:" msgstr "persp. :" #: ../../po/../src/interface.c:809 ../../po/../src/interface.c:969 msgid "Pick" msgstr "Sélection à la souris" #: ../../po/../src/interface.c:859 msgid "Persistent measures" msgstr "Affiche les mesures" #: ../../po/../src/interface.c:867 msgid "Remove all drawn measurements." msgstr "Retirer toutes les mesures affichées." #: ../../po/../src/interface.c:874 ../../po/../src/gtk_pick.c:944 msgid "Highlights (none):" msgstr "Met en évidence (aucun) :" #: ../../po/../src/interface.c:888 msgid "Add highlighted nodes to the list below." msgstr "Ajoute les nœuds en évidence à la liste ci-dessous." #: ../../po/../src/interface.c:897 msgid "Remove all highlight marks." msgstr "Retire toutes les mise en évidence." #: ../../po/../src/interface.c:912 msgid "List of nodes (none)" msgstr "Liste de nœuds (aucun)" #: ../../po/../src/interface.c:923 msgid "" "Values in blue are " "editable" msgstr "" "Les valeurs en bleu sont " "modifiables." #: ../../po/../src/interface.c:932 msgid "Draw data on nodes" msgstr "Affiche les informations sur les nœuds" #: ../../po/../src/interface.c:947 #: ../../po/../lib/plug-ins/bigdft/bigdft.c:677 msgid "none" msgstr "aucun" #: ../../po/../src/interface.c:953 msgid "listed" msgstr "listé(s)" #: ../../po/../src/interface.c:959 msgid "all" msgstr "tout" #: ../../po/../src/interface.c:995 msgid "Modify nodes (position, numbers...)" msgstr "Modification des nœuds (position, nombre…)" #: ../../po/../src/interface.c:1012 msgid "Move or delete:" msgstr "Déplace ou suppr. :" #: ../../po/../src/interface.c:1018 msgid "picked _node" msgstr "un _nœud" #: ../../po/../src/interface.c:1029 msgid "_selected nodes" msgstr "les nœuds _sél." #: ../../po/../src/interface.c:1046 msgid "" "(selected nodes are listed in the pick tab)" msgstr "" "(les nœuds sélectionnés sont répertoriés dans " "l'onglet de sélection)" #: ../../po/../src/interface.c:1062 msgid "Specific moving axis:" msgstr "Axe de déplacement particulier :" #: ../../po/../src/interface.c:1098 msgid "Current pos./trans.:" msgstr "Pos./trans. courante :" #: ../../po/../src/interface.c:1133 msgid "Add a new node:" msgstr "Ajoute un nouveau nœud :" #: ../../po/../src/interface.c:1144 msgid "position:" msgstr "position :" #: ../../po/../src/interface.c:1154 msgid "Screen basis set:" msgstr "Repère de l'écran :" #: ../../po/../src/interface.c:1160 msgid "horiz." msgstr "horiz." #: ../../po/../src/interface.c:1171 msgid "vert." msgstr "vert." #: ../../po/../src/interface.c:1182 msgid "Geometry changes" msgstr "Modifications de géométrie" #: ../../po/../src/interface.c:1232 msgid "Back to command panel" msgstr "Retour au panneau principal" #: ../../po/../src/interface.c:1404 msgid "About V_Sim" msgstr "À propos de V_Sim" #: ../../po/../src/interface.c:1439 msgid "Version :" msgstr "Version :" #: ../../po/../src/interface.c:1447 msgid "Release Date :" msgstr "Date de sortie :" #: ../../po/../src/interface.c:1455 msgid "Web site :" msgstr "Site web :" #: ../../po/../src/interface.c:1510 msgid "Readme" msgstr "Lisez-moi" #: ../../po/../src/interface.c:1529 ../../po/../src/gtk_about.c:367 msgid "Authors" msgstr "Auteurs" #: ../../po/../src/interface.c:1547 msgid "License" msgstr "Licence" #: ../../po/../src/interface.c:1555 msgid "Loaded plug-ins:" msgstr "Greffons chargés :" #: ../../po/../src/interface.c:1566 msgid "Plug-ins" msgstr "Greffons" #: ../../po/../src/interface.c:1584 msgid "Changelog" msgstr "Changements" #: ../../po/../src/interface.c:1662 msgid "set and customize pairs" msgstr "Choix et réglage des liaisons." #: ../../po/../src/interface.c:1685 msgid "Set parameters for pairs" msgstr "Paramètres des liaisons" #: ../../po/../src/interface.c:1722 msgid "Pairs" msgstr "Liaisons" #: ../../po/../src/interface.c:1731 msgid "Distances" msgstr "Distances" #: ../../po/../src/interface.c:1797 msgid "Quit V_Sim" msgstr "Quitter V_Sim" #: ../../po/../src/interface.c:1819 msgid "Quit V_Sim?" msgstr "Quitter V_Sim?" #: ../../po/../src/interface.c:1829 msgid "Don't show this warning again." msgstr "Ne plus afficher ce message." #: ../../po/../src/interface.c:1841 msgid "" "Can't find a local configuration directory " "$XDG_CONFIG_HOME/v_sim. Should one be added?" msgstr "" "Impossible de trouver le répertoire local de configuration $XDG_CONFIG_HOME/v_sim. Doit-il être ajouté?" #: ../../po/../src/interface.c:1864 msgid "" "Can't find a v_sim.par file with " "enough write permissions to store the preference, neither in the " "installation directory nor in the " "$XDG_CONFIG_HOME/v_sim one." msgstr "" "Impossible de trouver un fichier v_sim.par avec des permissions en écriture suffisantes pour enregistrer la " "préférence, ni dans le répertoire d'installation, ni dans le répertoire " "$XDG_CONFIG_HOME/v_sim." #: ../../po/../src/interface.c:1875 msgid "" "If you check the above box but you want to have this " "warning dialog again before closing, you can change this by editing the " "parameter file (v_sim.par). The option is " "called 'main_confirmQuit'." msgstr "" "Si après avoir coché la case ci-dessus vous souhaitez " "retrouver ce message d'avertissement, l'option est enregistrée dans le " "fichier de configuration v_sim.par. Elle " "s'appelle « main_confirmQuit »." #: ../../po/../src/gtk_move.c:111 msgid "" "left-button\t\t\t\t: drag node(s) in the screen plane\n" "middle-button (wheel)\t\t: drag node(s) along specific axis\n" "shift-left-button\t\t\t: drag node(s) along x axis\n" "control-left-button\t\t\t: drag node(s) along y axis\n" "control-shift-left-button\t: drag node(s) along z axis\n" "right-button\t\t\t\t: switch to observe" msgstr "" "bouton gauche\t\t\t: déplace le(s) nœud(s) dans le plan de l'écran\n" "bouton du milieu (molette)\t: déplace le(s) nœud(s) selon l'axe choisi\n" "shift bouton gauche\t\t: déplace le(s) nœud(s) selon l'axe x\n" "control bouton gauche\t\t: déplace le(s) nœud(s) selon l'axe y\n" "shift control bouton gauche\t: déplace le(s) nœud(s) selon l'axe z\n" "bouton droit\t\t\t: passer en mode d'observation" #: ../../po/../src/gtk_move.c:122 msgid "(none)" msgstr "(aucun)" #: ../../po/../src/gtk_move.c:236 msgid "Suppress node (either picked one or selected ones)." msgstr "Supprime les nœuds (soit celui choisi, soit ceux sélectionnés)." #: ../../po/../src/gtk_move.c:286 msgid "Capture the perpendicular axis to the current view." msgstr "Récupère la direction perpendiculaire à la vue courante." #: ../../po/../src/gtk_move.c:294 msgid "Return coordinates to initial values." msgstr "Retourne aux coordonnées initiales." #: ../../po/../src/gtk_move.c:318 msgid "Add a new node." msgstr "Ajoute un nouveau nœud." #: ../../po/../src/gtk_move.c:328 msgid "Duplicate nodes:" msgstr "Duplique les nœuds :" #: ../../po/../src/gtk_move.c:332 msgid "(the nodes listed in the pick tab)" msgstr "" "(les nœuds sélectionnés dans l'onglet de sélection)" #: ../../po/../src/gtk_move.c:338 msgid "du_plicate nodes as they are" msgstr "du_pplique les nœuds comme tels" #: ../../po/../src/gtk_move.c:342 msgid " or as new: " msgstr " ou comme nouveaux" #: ../../po/../src/gtk_move.c:349 msgid "_duplicate" msgstr "_duplique" #: ../../po/../src/gtk_move.c:357 msgid "Change the basis set:" msgstr "Change le repère :" #: ../../po/../src/gtk_move.c:386 msgid "Select node by picking it on the rendering area." msgstr "Choisi un nœud en le sélectionnant à l'écran." #: ../../po/../src/gtk_move.c:447 #, c-format msgid "(node %d)" msgstr "(nœud %d)" #: ../../po/../src/gtk_move.c:466 ../../po/../src/gtk_move.c:583 #, c-format msgid "(%d nodes)" msgstr "(%d nœuds)" #: ../../po/../src/gtk_move.c:517 ../../po/../src/gtk_move.c:1049 msgid "Pick a node with the mouse" msgstr "Choisit un nœud à la souris" #: ../../po/../src/gtk_move.c:1004 msgid "The new basis set will be indirect." msgstr "La nouvelle base sera indirecte." #: ../../po/../src/gtk_move.c:1095 msgid "Cannot change the basis: given matrix is singular." msgstr "Impossible de changer la base, la matrice donnée est singulière." #: ../../po/../src/support.c:90 ../../po/../src/support.c:114 #, c-format msgid "Couldn't find pixmap file: %s" msgstr "Impossible de trouver l'image %s" #: ../../po/../src/visu_data.c:281 msgid "Coord. (x, y, z)" msgstr "Coord. (x, y, z)" #: ../../po/../src/gtk_pairs.c:193 msgid "" "Modifications, as color or wire width, are applied only to selected rows. " "Use to select more than one row at a time." msgstr "" "Les modifications effectuées sur la taille ou la couleur par exemple, ne " "sont appliquées qu'aux lignes sélectionnées. Utilisez la touche " "pour choisir plus d'une ligne à la fois." #: ../../po/../src/gtk_pairs.c:194 msgid "No distance analysis" msgstr "Pas d'analyse sur les distances" #: ../../po/../src/gtk_pairs.c:195 #, c-format msgid "• there are %.3f neighbours per '%s'" msgstr "• il y a %.3f voisin(s) pour « %s »" #: ../../po/../src/gtk_pairs.c:198 #, c-format msgid "• mean distance is %.3f" msgstr "• la distance moyenne est %.3f" #: ../../po/../src/gtk_pairs.c:375 msgid "Manage links: " msgstr "Liaisons : " #: ../../po/../src/gtk_pairs.c:388 msgid "Remove a link definition." msgstr "Retire la définition de liaison sélectionnée." #: ../../po/../src/gtk_pairs.c:398 msgid "Add a new link definition using (0., 0.) if it does not already exist." msgstr "" "Ajoute une nouvelle définition de liaison en utilisant (0., 0.) si celle-ci " "n'existe pas déjà." #: ../../po/../src/gtk_pairs.c:409 msgid "Show/hide the undrawn pairs." msgstr "Masque/affiche les liaisons non-dessinées." #. Create the part for the link parameters. #: ../../po/../src/gtk_pairs.c:414 msgid "" "Link parameters:\t (apply to one or more " "selected rows)" msgstr "" "Paramètres :\t (s'appliquent sur une ou " "plusieurs lignes)" #: ../../po/../src/gtk_pairs.c:442 msgid " to: " msgstr "à : " #: ../../po/../src/gtk_pairs.c:450 msgid "_Auto set" msgstr "_Automatique" #: ../../po/../src/gtk_pairs.c:455 msgid "" "Set the distance criterion to select the first pick in the distance " "distribution between all nodes of the selected types." msgstr "" "Change les critères de distance pour sélectionner le premier pic dans le " "distributuion des distances entre tous les nœuds de types sélectionnés." #: ../../po/../src/gtk_pairs.c:500 msgid "Pair" msgstr "Liaison" #: ../../po/../src/gtk_pairs.c:522 msgid "From" msgstr "De" #: ../../po/../src/gtk_pairs.c:533 msgid "To" msgstr "À" #: ../../po/../src/gtk_pairs.c:544 msgid "Lg." msgstr "Lg." #: ../../po/../src/gtk_pairs.c:585 msgid "filter: " msgstr "filtre : " #: ../../po/../src/gtk_pairs.c:620 msgid "Parameters:" msgstr "Paramètres :" #: ../../po/../src/gtk_pairs.c:626 msgid "min:" msgstr "min. :" #: ../../po/../src/gtk_pairs.c:635 msgid "max:" msgstr "max. :" #: ../../po/../src/gtk_pairs.c:644 msgid "step size:" msgstr "incrément :" #: ../../po/../src/gtk_pairs.c:653 msgid "Measurement tools:" msgstr "Outils de mesure :" #: ../../po/../src/gtk_pairs.c:659 msgid "Range" msgstr "Intervale" #: ../../po/../src/gtk_pairs.c:684 msgid "_Highlight nodes in range" msgstr "Met en _évidence les nœud dans l'intervale" #: ../../po/../src/gtk_pairs.c:1017 #, c-format msgid "from %7.3f to %7.3f" msgstr "de %7.3f à %7.3f" #: ../../po/../src/visu_commandLine.c:171 msgid "" "V_Sim is a software to visualize atomic structures with OpenGl rendering.\n" "\n" msgstr "" "V_Sim est un outil de visualisation des structures atomiques utilisant un " "rendu OpenGL.\n" "\n" #: ../../po/../src/visu_commandLine.c:173 msgid "usage:" msgstr "utilisation :" #: ../../po/../src/visu_commandLine.c:206 #, c-format msgid "" "(Default value: %s)\n" "\n" msgstr "" "(Valeur par défaut : %s)\n" "\n" #: ../../po/../src/visu_commandLine.c:208 msgid "" "(Default value: unset)\n" "\n" msgstr "" "(Valeur par défaut : non définie)\n" "\n" #: ../../po/../src/visu_commandLine.c:242 msgid "" "make an image from the fileToRender argument. The format is specified " "through the extension of the argument or by the -o fileFormatId=id option " "(get the id of available file formats with -o list)." msgstr "" "créer une image depuis l'argument fileToRender. Le format est spécifié grâce " "à l'extension du fichier file passé en paramètre ou par l'option -o " "fileFormatId=id (la liste des formats de fichiers est donnée par -o list)." #: ../../po/../src/visu_commandLine.c:246 #: ../../po/../src/visu_commandLine.c:250 #: ../../po/../src/visu_commandLine.c:263 #: ../../po/../src/visu_commandLine.c:275 #: ../../po/../src/visu_commandLine.c:301 #: ../../po/../src/visu_commandLine.c:305 #: ../../po/../src/visu_commandLine.c:315 #: ../../po/../src/visu_commandLine.c:340 #: ../../po/../src/visu_commandLine.c:361 msgid "file" msgstr "fichier" #: ../../po/../src/visu_commandLine.c:248 msgid "" "load the given resources file on startup instead of looking for a valid " "resources file in the standard locations." msgstr "" "charge le fichier de ressources indiqué à la place d'en chercher un parmi " "les emplacements habituels." #: ../../po/../src/visu_commandLine.c:252 msgid "show this little help." msgstr "affiche cette petite aide." #: ../../po/../src/visu_commandLine.c:255 msgid "" "specify the size of the rendering window, the size argument must have the " "following format: x with positive non null values." msgstr "" "indique la taille de la fenêtre de rendu, l'argument taille doit avoir le " "format suivant : x avec des valeurs strictement positives." #: ../../po/../src/visu_commandLine.c:258 msgid "x" msgstr "x" #: ../../po/../src/visu_commandLine.c:260 msgid "" "use the given argument as a spin indicator. If this option is used, V_Sim " "switches automatically to spin rendering whatever method is specified in the " "parameter file." msgstr "" "utilise le fichier fourni comme descriptif du spin. Lorsque cette option est " "utilisée, V_Sim passe automatiquement en mode spin qu'elle que soit la " "méthode de rendue spécifiée dans le fichier de paramètre." #: ../../po/../src/visu_commandLine.c:265 msgid "" "policy used to show or not null modulus spins possible values are positives." msgstr "" "comportement de traitement des spins de module nul (les valeurs attendues " "sont positives)." #: ../../po/../src/visu_commandLine.c:269 msgid "" "always draws atomic rendering on node position in addition to spin rendering." msgstr "toujours dessiner les atomes en plus du rendu de spin." #: ../../po/../src/visu_commandLine.c:273 msgid "" "the argument fileToRender must be called, then the given file of the option " "is used to colorize the elements." msgstr "" "l'argument fichierÀDessiner doit être présent, ensuite, l'argument fichier " "est utilisé pour coloriser les éléments." #: ../../po/../src/visu_commandLine.c:277 msgid "" "it specifies the columns to use from the data file for the three colour " "channels [l;m;n]. Columns are counted from 1. Use -3, -2, -1 and 0 to use " "the special values, constant 1, coord. x, coord. y, and coord. z, " "respectively." msgstr "" "l, m et n correspondent aux numéros des colonnes à utiliser depuis le " "fichier de données pour les trois canaux de couleur. Les colonnes sont " "numérotées depuis 1. Utilisez -3, -2, -1 et 0 pour obtenir des valeurs " "particulières, la constante 1., coord. x, coord. y et coord. z " "respectivement." #: ../../po/../src/visu_commandLine.c:283 msgid "" "this option can be used with the '--colorize' one or the '--build-map' one. " "It chooses a preset color scheme. The id argument is an integer that " "corresponds to a defined color shade (ranging from 0)." msgstr "" "l'option « --colorize » doit être présente, ou bien l'option « --build-map " "». Cette option permet de choisir un dégradé. L'argument id est un entier " "correspondant à un dégradé pré-défini (numéroté depuis 0)." #: ../../po/../src/visu_commandLine.c:289 msgid "" "a file must be loaded. It applies the given translations to the loaded file. " "The units are those of the file. This is available for periodic file formats " "only." msgstr "" "l'argument fichierÀDessiner doit être présent, la translation donnée est " "alors appliquée. L'unité utilisée est celle contenu dans le fichier à " "dessiner. Les translations ne sont possibles que pour les formats " "périodiques." #: ../../po/../src/visu_commandLine.c:294 msgid "" "a file must be loaded. It applies the given expansion to the loaded file. " "The values are given in box coordinates. This is available for periodic file " "formats only." msgstr "" "l'argument fichierÀDessiner doit être présent, l'expansion donnée est alors " "appliquée. Les valeurs sont données en unité de boîte. Les translations ne " "sont possibles que pour les formats périodiques." #: ../../po/../src/visu_commandLine.c:299 msgid "" "the argument fileToRender must be called, then the given file of the option " "is parsed as a list of planes and they are rendered." msgstr "" "l'argument fichierÀDessiner doit être présent, l'argument fichier est alors " "analysé comme une liste de plans devant être dessinée." #: ../../po/../src/visu_commandLine.c:303 msgid "" "the argument fileToRender must be called, then the given file of the option " "is parsed as a scalar field and loaded." msgstr "" "l'argument fichierÀDessiner doit être présent, l'argument file est alors " "chargé en tant que champ scalaire." #: ../../po/../src/visu_commandLine.c:307 msgid "" "must be used with the '--scalar-field' option, then the given surfaces are " "built and rendered. If a name is appended to a value using '#' as a " "separator, this name is used as the name for the iso-surface (i.e. " "0.25#Blue)." msgstr "" "doit être utilisé avec l'option '--scalar-field', dans ce cas, les surfaces " "correspondantes sont générées et affichées. Si une chaîne est ajoutée après " "une valeur à la suite d'un caractère '#' séparateur, cette chaîne est " "utilisée pour nommer la surface (et appliquer éventuellement un style), par " "exemple 0.25#Bleu." #: ../../po/../src/visu_commandLine.c:313 msgid "" "the argument fileToRender must be given, then the given file of the option " "is parsed and surfaces are rendered." msgstr "" "l'argument fichierÀDessiner doit être présent, l'argument file est alors " "chargé en tant que liste de surfaces." #: ../../po/../src/visu_commandLine.c:317 msgid "" "the argument fileToRender must be given, as the '--planes', '--color-preset' " "and '--scalar-field' options used, then the given plane 'id' is replaced by " "a coloured map using given scalar field and shade. 'id' ranges from 0. If " "several ids are given, several maps are built." msgstr "" "l'argument fichierÀDessiner doit être présent, tout comme les arguments '--" "planes', '--color-preset' et '--scalar-field', dans ce cas, le plan 'id' par " "une carte de couleur représentant le champ scalaire fourni dans le dégradé " "spécifié. 'id' varie de 0 au nombre de plans moins 1. Si plusieurs id " "sontdonnés, plusieurs cartes seront dessinées." #: ../../po/../src/visu_commandLine.c:322 msgid "id[:id]" msgstr "id[:id]" #: ../../po/../src/visu_commandLine.c:324 msgid "" "select the scaling method to use with gradients (0: linear, 1: log scaled " "and 2 is zero-centred log scale), default is linear scale." msgstr "" "choix de la méthode de mise à l'échelle pour les dégradés (0 : linéaire, 1 : " "logarithmique et 2 : logarithmique centré sur zéro), la valeur par défaut " "est linéaire." #: ../../po/../src/visu_commandLine.c:328 msgid "when positive, val isolines are plotted on the coloured map." msgstr "" "si la valeur est positive, val isolignes sont tracées sur la carte des " "couleurs." #: ../../po/../src/visu_commandLine.c:329 #: ../../po/../src/visu_commandLine.c:337 msgid "val" msgstr "val" #: ../../po/../src/visu_commandLine.c:331 msgid "" "when given, generated iso-lines are colourised [R:G:B] or auto with the " "values. The specific value 'auto' will produced iso-lines in inversed " "colours." msgstr "" "lorsqu'elle est utilisée, cette option permet de choisir la couleur [R:V:B] " "des iso-lignes tracées. La valeur particulière « auto » permet de tracer ces " "iso-lignes en couleurs inverses." #: ../../po/../src/visu_commandLine.c:334 msgid "[R:G:B] or auto" msgstr "[R:V:B] ou auto" #: ../../po/../src/visu_commandLine.c:336 msgid "if val is not TRUE, the surfaces use their own bounding box." msgstr "" "si la valeur n'est pas TRUE, les surfaces utilisent leur propre boîte (la " "valeur par défault est TRUE)." #: ../../po/../src/visu_commandLine.c:339 msgid "draw the given image on the background." msgstr "dessine l'image fournie en fond." #: ../../po/../src/visu_commandLine.c:342 msgid "" "this is a generic way to give extended option. to V_Sim. As much as -o can " "be used. Each one store a key and its value (boolean, integer or float)." msgstr "" "c'est une façon générique de fournir une option à V_Sim. On peut utiliser " "autant de -o que nécessaire, chacune associe une valeur (entière, booléenne " "ou flottante) à une clef." #: ../../po/../src/visu_commandLine.c:345 msgid "id=value" msgstr "id=valeur" #: ../../po/../src/visu_commandLine.c:347 msgid "" "used to choose the windowing mode. By default the command panel and the " "rendering window are separated. In the 'oneWindow' mode they are joined. In " "the 'renderOnly' mode, the command panel is not used." msgstr "" "cette option est utilisée pour choisir le mode de fenêtrage. Par défaut, la " "fenêtre de rendu et le panneau de commande sont séparées. Dans le mode " "« oneWindow », elles sont communes. Dans le mode « renderOnly », le panneau " "de commande n'est pas utilisé." #: ../../po/../src/visu_commandLine.c:353 msgid "" "this flag is used to choose the id of the loaded file if the format has " "support for multiple ids in one file (see XYZ format or -posi.d3 ones)." msgstr "" "cette option est utilisée pour choisir la série de données à charger lorsque " "le format de fichier d'entrée permet plusieurs séries de données (comme le " "format XYZ ou les fichiers -posi.d3)." #: ../../po/../src/visu_commandLine.c:356 msgid "i" msgstr "i" #: ../../po/../src/visu_commandLine.c:358 msgid "" "specify an XML file with some value information for V_Sim, like a list of " "planes, highlighted nodes... It replaces and extend the previous --planes " "option." msgstr "" "définit un fichier XML à charger contenant plusieurs informations pour " "V_Sim, comme une liste de plans, les nœuds mis en évidence… Elle remplace et " "étend les possibilités de l'option --planes." #: ../../po/../src/visu_commandLine.c:363 msgid "Give the precision in percent to render the coloured map." msgstr "Donne la précision en pourcent pour le dessin des cartes de couleur." #: ../../po/../src/visu_commandLine.c:364 msgid "prec" msgstr "préc" #: ../../po/../src/visu_commandLine.c:366 msgid "Set the minimum and maximum values for the coloured map rendering." msgstr "" "Choisi les valeurs minimum et maximum pour la mise à l'échelle des valeurs " "des cartes de couleurs." #: ../../po/../src/visu_commandLine.c:367 msgid "min:max or auto" msgstr "min:max ou auto" #: ../../po/../src/visu_commandLine.c:369 msgid "Dump object signals and properties for introspection." msgstr "Export les signaux et les propriétés pour l'introspection." #: ../../po/../src/visu_commandLine.c:370 msgid "fileToDump" msgstr "fichierExport" #: ../../po/../src/visu_commandLine.c:372 msgid "" "Range to adjust values into for colourisation. col specifiesthe column to " "apply the range to. Use -2, -1 and 0 for x, yand z directions respectively." msgstr "" "Encadrement pour ajuster les valeurs de colorisation. col permet de donner " "l'identifiant de la colonne à utiliser. -2, -1 et 0 servent respectivement " "pour les directions x, y et z." #: ../../po/../src/visu_commandLine.c:375 msgid "col#min:max or auto" msgstr "col#min:max ou auto" #: ../../po/../src/visu_commandLine.c:377 msgid "" "used with a data file (see -c), it specifies the column id to be used to " "scale the nodes." msgstr "" "utilisé avec un fichier de colorisation (voir -c), spécifie la colonne à " "utiliser pour faire varier la taille des nœuds." #. Help message used in the help area. #: ../../po/../src/gtk_interactive.c:138 msgid "" "left-[control]-button\t\t\t: rotations (θ, φ, [control]ω)\n" "shift-left-button\t\t\t\t: translations (dx, dy)\n" "middle-[shift]-button or wheel\t: zoom or [shift]perspective\n" "key 's' / 'r'\t\t\t\t\t: save/restore camera position\n" "right-button\t\t\t\t\t: switch to current tabbed action" msgstr "" "[control] bouton gauche\t\t : rotations (θ, φ, [Control]ω)\n" "shift + bouton gauche\t\t\t : translations (dx, dy)\n" "[shift] b. du milieu ou roulette\t : zoom ou [Shift]perspective\n" "touche « s » / « r »\t\t\t\t : sauve/rétablit la vue\n" "bouton droit\t\t\t\t\t : passer à l'action de l'onglet courant" #: ../../po/../src/opengl.c:686 #, c-format msgid "Parse error at line %d: angle must be positive.\n" msgstr "Erreur de lecture à la ligne %d : les angles doivent être positif.\n" #: ../../po/../src/visu_basic.c:243 #, c-format msgid "" "While parsing parameter file '%s':\n" "\n" "%s" msgstr "" "Lors de la lecture du fichier de paramètres « %s » :\n" "\n" "%s" #: ../../po/../src/visu_basic.c:272 #, c-format msgid "" "While parsing resource file '%s':\n" "\n" "%s" msgstr "" "Lors de la lecture du fichier de ressources « %s » :\n" "\n" "%s" #: ../../po/../src/visu_basic.c:382 #, c-format msgid "The format can't be found from the filename '%s' entered.\n" msgstr "" "Le format de fichier ne peut être déduit du nom de fichier « %s » fourni.\n" #: ../../po/../src/visu_basic.c:384 #, c-format msgid "" "Use -o fileFormatId=id to specify a file format when the autodetection " "fails. Get a list of ids with option -o list:\n" "\n" msgstr "" "Utilisez -o fileFormatId=id pour choisir un format de fichier quand l'auto-" "détection échoue. On peut obtenir une liste des formats de fichiers avec " "l'option -o list :\n" "\n" #: ../../po/../src/visu_basic.c:428 msgid "a file to render is mandatory with the '--export' option." msgstr "un fichier à dessiner est nécessaire avec l'option « --export »." #: ../../po/../src/visu_basic.c:882 #, c-format msgid "unknown shade id (max is %d)." msgstr "identifiant de dégradé inconnu (%d maximum)." #: ../../po/../src/visu_basic.c:909 #, c-format msgid "" "Assign a column data without specifying a data file. Use -c option or change " "the value %d." msgstr "" "Fournit une colonne de données sans fichier de colorisation. Utilisez " "l'option -c ou changer la valeur %d." #: ../../po/../src/visu_basic.c:1034 msgid "" "option '--build-map' has been given but no plane is available (use '--" "planes')." msgstr "" "l'option « --build-map » nécessite d'avoir un plan (utilisez l'option « --" "planes »)." #: ../../po/../src/visu_basic.c:1037 msgid "" "option '--build-map' has been given but no scalar field is available (use '--" "scalar-field')." msgstr "" "l'option « --build-map » nécessite d'avoir un champ scalaire (utilisez " "l'option « --scalar-field »)." #: ../../po/../src/visu_basic.c:1040 msgid "" "option '--build-map' has been given but no shade is available (use '--color-" "preset')." msgstr "" "l'option « --build-map » nécessite d'avoir un dégradé (utilisez l'option « --" "color-preset »)." #: ../../po/../src/visu_basic.c:1214 #, c-format msgid "" "\n" "#%2d - file format '%s':\n" msgstr "" "\n" "#%2d - format de fichier « %s » :\n" #: ../../po/../src/visu_basic.c:1224 msgid "integer" msgstr "entier" #: ../../po/../src/visu_basic.c:1227 msgid "boolean" msgstr "booléen" #: ../../po/../src/visu_basic.c:1230 msgid "string" msgstr "chaîne" #: ../../po/../src/visu_basic.c:1240 #, c-format msgid "No option for this file format.\n" msgstr "Pas d'option pour ce format de fichier.\n" #: ../../po/../src/visu_basic.c:1726 #, c-format msgid "Parse error at line %d: unit '%s' is unknown.\n" msgstr "Erreur de lecture à la ligne %d : l'unité '%s' est inconnue.\n" #: ../../po/../src/gtk_pick.c:112 msgid "" "left-button\t\t\t: standard pick\n" "control-left-button\t\t: toggle highlihgt node\n" "middle-button\t\t: measure node neighbouring\n" "shift-middle-button\t: pick 1st reference\n" "ctrl-middle-button\t\t: pick 2nd reference\n" "drag-left-button\t\t: make a rectangular selection\n" "right-button\t\t\t: switch to observe" msgstr "" "bouton gauche\t\t : sélection standard\n" "control bouton gauche\t : change la mise en évidence\n" "bouton du milieu\t\t : mesure le voisinage\n" "shift bouton du milieu\t : choix de la 1ère référence\n" "ctrl bouton du milieu\t : choix de la 2nde référence\n" "glisser bouton de gauche\t : sélection rectangulaire\n" "bouton droit\t\t\t : passer en mode d'observation" #: ../../po/../src/gtk_pick.c:327 msgid "Remove all highlight marks for the nodes of the list." msgstr "Retire toutes les mises en évidence des nœuds de la liste." #: ../../po/../src/gtk_pick.c:336 msgid "Put a highlight mark on all the nodes of the list." msgstr "Met en évidence tous les nœuds de la liste." #: ../../po/../src/gtk_pick.c:356 ../../po/../src/gtk_pick.c:872 #: ../../po/../lib/plug-ins/abinit/ab_symmetry.c:223 msgid "Id" msgstr "Id" #: ../../po/../src/gtk_pick.c:361 ../../po/../src/gtk_pick.c:387 msgid "Node" msgstr "Nœud" #: ../../po/../src/gtk_pick.c:382 ../../po/../src/gtk_pick.c:882 msgid "Type" msgstr "Type" #: ../../po/../src/gtk_pick.c:432 msgid "Import picked nodes from an existing XML file." msgstr "Importe les nœuds sélectionnés depuis un fichier XML existant." #: ../../po/../src/gtk_pick.c:433 msgid "Export listed picked nodes to the current XML file." msgstr "Exporte la liste des nœuds sélectionnés dans le fichier XML courant." #: ../../po/../src/gtk_pick.c:434 msgid "Export listed picked nodes to a new XML file." msgstr "Exporte la liste des nœuds sélectionnés dans un nouveau fichier XML." #: ../../po/../src/gtk_pick.c:503 msgid "Hide nodes depending on highlight status." msgstr "Masque les nœud selon leur mise en évidence." #: ../../po/../src/gtk_pick.c:510 msgid "_h." msgstr "_h." #: ../../po/../src/gtk_pick.c:511 msgid "Hide button will hide highlighted nodes." msgstr "Cache tous les nœuds mis en évidence." #: ../../po/../src/gtk_pick.c:516 msgid "_non-h." msgstr "_non-h." #: ../../po/../src/gtk_pick.c:517 msgid "Hide button will hide non-highlighted nodes." msgstr "Cache tous les nœuds non mis en évidence." #: ../../po/../src/gtk_pick.c:602 #, c-format msgid "" "Reference node\t #%d\n" " ( x = %7.3f ; y = %7.3f ; " "z = %7.3f)\n" "" msgstr "" "Référence\t\t #%d\n" " ( x = %7.3f ; y = %7.3f ; " "z = %7.3f)\n" "" #: ../../po/../src/gtk_pick.c:618 #, c-format msgid "" "2nd Reference node\t #%d\t (i.e. " "dr = %7.3f)\n" " ( x = %7.3f ; y = %7.3f ; " "z = %7.3f)\n" " (δx = %7.3f ; δy = %7.3f ; δz = %7.3f)\n" "" msgstr "" "Seconde référence\t #%d\t (i.e. " "dr = %7.3f)\n" " ( x = %7.3f ; y = %7.3f ; " "z = %7.3f)\n" " (δx = %7.3f ; δy = %7.3f ; δz = %7.3f)\n" "" #: ../../po/../src/gtk_pick.c:630 #, c-format msgid "" "Newly picked node\t #%d\n" " ( x = %7.3f ; y = %7.3f ; " "z = %7.3f)\n" "" msgstr "" "Nouvelle sélection\t #%d\n" " ( x = %7.3f ; y = %7.3f ; " "z = %7.3f)\n" "" #: ../../po/../src/gtk_pick.c:646 #, c-format msgid "" "Newly picked node\t #%d\t (i.e. " "dr = %7.3f)\n" " ( x = %7.3f ; y = %7.3f ; " "z = %7.3f)\n" " (δx = %7.3f ; δy = %7.3f ; δz = %7.3f)\n" "" msgstr "" "Nouvelle sélection\t #%d\t (i.e. " "dr = %7.3f)\n" " ( x = %7.3f ; y = %7.3f ; " "z = %7.3f)\n" " (δx = %7.3f ; δy = %7.3f ; δz = %7.3f)\n" "" #: ../../po/../src/gtk_pick.c:669 #, c-format msgid "" "Newly picked node\t #%d\t (i.e. " "dr = %7.3f)\n" " ( x = %7.3f ; y = %7.3f ; " "z = %7.3f)\n" " (δx1 = %7.3f ; δy1 = %7.3f ; δz1 = %7.3f)\n" " (δx2 = %7.3f ; δy2 = %7.3f ; δz2 = %7.3f)\n" msgstr "" "Nouvelle sélection\t #%d\t (i.e. " "dr = %7.3f)\n" " ( x = %7.3f ; y = %7.3f ; " "z = %7.3f)\n" " (δx1 = %7.3f ; δy1 = %7.3f ; δz1 = %7.3f)\n" " (δx2 = %7.3f ; δy2 = %7.3f ; δz2 = %7.3f)\n" #: ../../po/../src/gtk_pick.c:682 #, c-format msgid " angle (Ref-Ref2, Ref-New) = %5.2f degrees" msgstr " angle (Ref.-Ref.2, Ref.-Sél.) = %5.2f degrés" #: ../../po/../src/gtk_pick.c:686 #, c-format msgid "Unset reference %d." msgstr "Désélection de la référence %d." #: ../../po/../src/gtk_pick.c:772 #: ../../po/../src/gtk_renderingWindowWidget.c:1226 msgid "No node has been selected." msgstr "Pas de noud sélectionné." #: ../../po/../src/gtk_pick.c:775 msgid "Picked reference and second reference are the same." msgstr "La référence choisie et la seconde référence sont les mêmes." #: ../../po/../src/gtk_pick.c:779 msgid "Can't pick a second reference without any existing first one." msgstr "" "On ne peut définir une seconde référence sans avoir défini de première " "référence." #: ../../po/../src/gtk_pick.c:783 #: ../../po/../src/gtk_renderingWindowWidget.c:1238 msgid "Can't remove first reference before removing the second one." msgstr "" "On ne peut retirer la première référence sans avoir retirer la seconde." #: ../../po/../src/gtk_pick.c:942 #, c-format msgid "Highlights (%d):" msgstr "Met en évidence (%d) :" #: ../../po/../src/gtk_pick.c:955 #, c-format msgid "List of nodes (%d):" msgstr "Liste de nœuds (%d) :" #: ../../po/../src/gtk_pick.c:958 msgid "List of nodes (none):" msgstr "Liste de nœuds (aucun) :" #: ../../po/../src/gtk_pick.c:1129 msgid "Reading values" msgstr "Lecture des valeurs" #: ../../po/../src/gtk_pick.c:1130 msgid "" "Wrong format. Impossible to parse the data associated to the selected node." msgstr "" "Format invalid. Impossible d'analyser les données associées au nœud " "sélectionné." #: ../../po/../src/gtk_save.c:257 msgid "" "A description of all resource markups is available on:\n" " " msgstr "" "Une description de toutes les ressources est disponible à :\n" " " #: ../../po/../src/gtk_save.c:277 msgid "Export all resource descriptions to an _XML file" msgstr "Exporte toutes les ressources dans un fichier _XML" #: ../../po/../src/gtk_save.c:286 msgid "Export all parameter descriptions to an _XML file" msgstr "Exporte tous les paramètres dans un fichier _XML" #: ../../po/../src/gtk_save.c:294 msgid "Export all command line _options to an XML file" msgstr "Exporte toutes les options de ligne de commande dans un fichier XML" #: ../../po/../src/gtk_save.c:308 msgid "Append all settings in a single XML file (including planes, surfaces…)" msgstr "" "Ajoute tous les paramètres dans un fichier XML unique (incluant les plans, " "les surfaces…" #: ../../po/../src/gtk_save.c:317 msgid "" "A description of all parameter markups is available on:\n" " " msgstr "" "Une description de tous les paramètres est disponible à :\n" " " #: ../../po/../src/gtk_save.c:397 #, c-format msgid "File '%s' succesfully loaded." msgstr "Fichier « %s » chargé avec succès." #: ../../po/../src/gtk_save.c:399 #, c-format msgid "File '%s' not or partially loaded." msgstr "Le fichier « %s » n'a pas été chargé." #: ../../po/../src/gtk_save.c:425 msgid "Choose a filename with '.xml' to append other settings." msgstr "" "Entrez un nom de fichier en « .xml » pour ajouter à d'autres paramètres" #: ../../po/../src/gtk_save.c:541 #, c-format msgid "File '%s' succesfully written (%d lines)." msgstr "Fichier « %s » écrit avec succès (%d lignes)." #: ../../po/../src/gtk_save.c:544 #, c-format msgid "File '%s' not written." msgstr "Le fichier « %s » n'a pas été écrit." #: ../../po/../src/gtk_renderingWindowWidget.c:151 msgid "No description is available" msgstr "Aucune description" #: ../../po/../src/gtk_renderingWindowWidget.c:152 msgid "Nothing is loaded" msgstr "Rien n'est chargé" #: ../../po/../src/gtk_renderingWindowWidget.c:784 msgid "Toggle highlight for node: " msgstr "Change la mise en évidence pour le nœud :" #: ../../po/../src/gtk_renderingWindowWidget.c:838 msgid "" "Click here to get the list of saved camera positions.\n" "Use 's' and 'r' keys to save and restore camera settings. + 's' " "remove the current camera from the list." msgstr "" "Cliquer ici pour afficher la liste des positions enregistrées de la caméra.\n" "« s » et « r » servent de raccoursis claviers pour sauver ou restaurer une " "configuration de la caméra. + « s » retire la caméra sélectionnée de " "la liste." #: ../../po/../src/gtk_renderingWindowWidget.c:868 msgid "Open Ctrl+o" msgstr "Ouvrir Ctrl+o" #: ../../po/../src/gtk_renderingWindowWidget.c:881 msgid "Reload the current file Ctrl+r" msgstr "Recharge le fichier courant Ctrl+r" #: ../../po/../src/gtk_renderingWindowWidget.c:895 msgid "Export Ctrl+s" msgstr "Exportation du fichier Ctrl+s" #: ../../po/../src/gtk_renderingWindowWidget.c:909 msgid "" "Raise the command panel window.\n" " Use as key binding." msgstr "" "Afficher le panneau principal.\n" " Raccoursis clavier : ." #: ../../po/../src/gtk_renderingWindowWidget.c:962 msgid "Measure / remove information for the selected node." msgstr "Mesure / retire les informations autour du nœud sélectionné." #: ../../po/../src/gtk_renderingWindowWidget.c:980 msgid "Remove all measurement marks." msgstr "Retirer toutes les marques de mesures." #: ../../po/../src/gtk_renderingWindowWidget.c:1176 msgid "Selected node number " msgstr "Nœud sélectionné : " #: ../../po/../src/gtk_renderingWindowWidget.c:1191 msgid "Distance between nodes " msgstr "Distances entre les nœuds " #: ../../po/../src/gtk_renderingWindowWidget.c:1196 #, c-format msgid "%d and %d : %7.3f" msgstr "%d et %d : %7.3f" #: ../../po/../src/gtk_renderingWindowWidget.c:1202 msgid " right-click on background to unset reference." msgstr " clic-droit sur le fond pour déselectionner la référence." #: ../../po/../src/gtk_renderingWindowWidget.c:1207 msgid " right-click on background to unset second reference." msgstr "" " clic-droit sur le fond pour déselectionner la seconde référence." #: ../../po/../src/gtk_renderingWindowWidget.c:1229 msgid "Picked node is already used as a reference." msgstr "Le nœud sélectionné est déjà utilisé comme référence." #: ../../po/../src/gtk_renderingWindowWidget.c:1233 msgid "" "Can't pick a second reference without any first one (use right-" "click)." msgstr "" "On ne peut sélectionner une seconde référence sans avoir sélectionné une " "première (en utilisant clic-droit)." #: ../../po/../src/gtk_renderingWindowWidget.c:1619 msgid "Restore saved camera position." msgstr "Retourne à la position enregistrée." #: ../../po/../src/gtk_renderingWindowWidget.c:1621 #: ../../po/../src/gtk_renderingWindowWidget.c:2073 msgid "No saved camera. Use 's' to save one." msgstr "" "Pas de caméra enregistrée. La touche « s » peut être utilisée pour ce faire." #: ../../po/../src/gtk_renderingWindowWidget.c:1632 msgid "Save current camera position." msgstr "Sauvegarde la position courante." #. Put a commentary in the statusbar. #: ../../po/../src/gtk_renderingWindowWidget.c:1860 msgid "" "Rotate with left b., pick with right b., setup ref. with or " " b." msgstr "" "Tourne avec le bouton g., sélectionne avec le bouton d., choisi des réf. " "avec ou bouton d." #: ../../po/../src/gtk_renderingWindowWidget.c:1944 msgid "Size:" msgstr "Taille :" #: ../../po/../src/gtk_renderingWindowWidget.c:1966 #, c-format msgid "Nb nodes: %d" msgstr "Nb nœuds : %d" #. Set a title. #: ../../po/../src/gtk_renderingWindowWidget.c:2042 msgid "Camera menu (saved in 'v_sim.par'):" msgstr "Menu de la caméra (enregistré dans le fichier « v_sim.par ») :" #: ../../po/../src/gtk_renderingWindowWidget.c:2049 #, c-format msgid "" "save current camera:\n" "(θ %6.1f° ; φ %6.1f° ; ω %6.1f°) dx %4.1f dy %4.1f" msgstr "" "sauver la caméra courante :\n" "(θ %6.1f° ; φ %6.1f° ; ω %6.1f°) dx %4.1f dy %4.1f" #. Put an option to open the view selector. #: ../../po/../src/gtk_renderingWindowWidget.c:2062 msgid "select precisely a camera view" msgstr "sélection précise d'une orientation de caméra" #: ../../po/../src/gtk_renderingWindowWidget.c:2078 msgid "List of saved cameras:" msgstr "Liste des cameras enregistrées :" #: ../../po/../src/gtk_renderingWindowWidget.c:2087 #, c-format msgid "(θ %6.1f° ; φ %6.1f° ; ω %6.1f°) dx %4.1f dy %4.1f" msgstr "(θ %6.1f° ; φ %6.1f° ; ω %6.1f°) dx %4.1f dy %4.1f" #: ../../po/../src/gtk_renderingWindowWidget.c:2298 msgid "Loading file..." msgstr "Chargement d'un fichier…" #: ../../po/../src/gtk_renderingWindowWidget.c:2313 msgid "Cancellation request, waiting for reply..." msgstr "Annulation demandée, en attente…" #: ../../po/../src/gtk_renderingWindowWidget.c:2524 msgid "Use the 'open' button to render a file." msgstr "Cliquer sur le bouton « ouvrir » pour charger un fichier." #: ../../po/../src/gtk_renderingWindowWidget.c:2570 msgid "Saving image..." msgstr "Enregistrement de l'image…" #: ../../po/../src/gtk_renderingWindowWidget.c:2622 #, c-format msgid "Can't dump OpenGL area to data.\n" msgstr "Impossible de copier la zone OpenGL vers un tampon de données.\n" #. * #. * SECTION: gtk_about #. * @short_description: The about dialog with a readme, the copyright, #. * the author list, the plug-in list and the version notes. #. * #. * The about dialog window is activated when clicking on the V_Sim #. * icon on bottom right part of the command panel. It contains a #. * summary of V_Sim purpose and capabilities, the list of authors, the #. * list of loaded plug-ins, the list of changes since the previous #. * version, and the licence file. It displays also the version of #. * V_Sim and provide a link to the web site. #. #: ../../po/../src/gtk_about.c:70 msgid "licence.en.txt" msgstr "licence.fr.txt" #. Translate if there is a authors file in another language. #: ../../po/../src/gtk_about.c:72 msgid "authors" msgstr "authors" #. Translate if there is a readme file in another language. #: ../../po/../src/gtk_about.c:74 msgid "readme" msgstr "readme" #. Translate if there is a readme file in another language. #: ../../po/../src/gtk_about.c:76 msgid "ChangeLog.en" msgstr "ChangeLog.fr" #: ../../po/../src/gtk_about.c:359 ../../po/../src/visu_rendering.c:288 msgid "Description" msgstr "Description" #: ../../po/../src/gtk_about.c:458 msgid "" ":\n" "\n" msgstr "" " :\n" "\n" #: ../../po/../src/gtk_about.c:480 msgid ": " msgstr " : " #: ../../po/../src/visu_rendering.c:266 msgid "Name of the method." msgstr "Nom de la méthode." #: ../../po/../src/visu_rendering.c:277 msgid "Label of the method." msgstr "Nom affiché de la méthode." #: ../../po/../src/visu_rendering.c:288 msgid "Description of the method." msgstr "Description de la méthode." #: ../../po/../src/visu_rendering.c:299 msgid "Number of input files" msgstr "Nombre de fichiers d'entrée" #: ../../po/../src/visu_rendering.c:300 msgid "Required number of input files to read to load a data." msgstr "Nombre de fichiers à lire pour charger une configuration." #: ../../po/../src/visu_rendering.c:783 #, c-format msgid "No file name available." msgstr "Aucun nom de fichier disponible." #: ../../po/../src/visu_rendering.c:791 #, c-format msgid "The specified file is not a regular file or may not exist." msgstr "Le fichier indiqué n'est pas lisible ou n'existe pas." #: ../../po/../src/visu_rendering.c:800 #, c-format msgid "The specified file is an empty file." msgstr "Le fichier indiqué est vide." #: ../../po/../src/visu_rendering.c:848 #, c-format msgid "Impossible to load this file, unrecognised format.\n" msgstr "Impossible d'ouvrir ce fichier, format non reconnu.\n" #: ../../po/../src/visu_rendering.c:981 #, c-format msgid "Parse error at line %d: there is no specified method.\n" msgstr "Erreur de lecture à la ligne %d : il n'y a pas de méthode spécifiée.\n" #: ../../po/../src/visu_rendering.c:991 #, c-format msgid "Parse error at line %d: the specified method (%s) is unknown.\n" msgstr "" "Erreur de lecture à la ligne %d : la méthode de rendu spécifiée (« %s ») est " "inconnue.\n" #: ../../po/../src/gtk_main.c:382 msgid "Actions" msgstr "Actions" #: ../../po/../src/gtk_main.c:396 msgid "Select a file to render." msgstr "Ouvrir un fichier." #: ../../po/../src/gtk_main.c:409 msgid "Check to draw pairs between elements." msgstr "Cocher cette case pour dessiner des liaisons entre les éléments" #: ../../po/../src/gtk_main.c:415 msgid "Configure parameters for bindings such as color, thickness..." msgstr "Configurer les paramètres des liaisons (couleurs…)" #: ../../po/../src/gtk_main.c:426 msgid "_Pairs" msgstr "_Liaisons" #: ../../po/../src/gtk_main.c:433 msgid "Use the mouse to change the view and get position informations." msgstr "Sélectionner les éléments et changer la vue grâce à la souris." #: ../../po/../src/gtk_main.c:444 msgid "Mouse _actions" msgstr "_Interactions" #: ../../po/../src/gtk_main.c:454 msgid "Click to save the parameters or the resources." msgstr "Enregistrer la configuration ou les ressources." #: ../../po/../src/gtk_main.c:465 msgid "_Config. files" msgstr "Fichiers de _conf." #: ../../po/../src/gtk_main.c:474 msgid "V_Sim program. Written by L. Billard, modified by D. Caliste." msgstr "V_Sim, écrit par L. Billard et modifié par D. Caliste." #. Failed. #: ../../po/../src/gtk_main.c:1024 msgid "I/O" msgstr "E/S" #: ../../po/../src/gtk_main.c:1025 msgid "Can't create the directory '$XDG_CONFIG_HOME/v_sim'." msgstr "Impossible de créer le répertoire « $XDG_CONFIG_HOME/v_sim »." #: ../../po/../src/gtk_main.c:1159 #, c-format msgid "Parse error at line %d: awaited 'id visible pos size'.\n" msgstr "" "Erreur de lecture à la ligne %d : « id visible pos. taille » est attendu.\n" #: ../../po/../src/gtk_main.c:1170 #, c-format msgid "" "Parse error at line %d: can't read dock characteristic values from '%s'.\n" msgstr "" "Erreur de lecture à la ligne %d : impossible de lire les caractéristiques " "de l'onglet depuis « %s ».\n" #: ../../po/../src/gtk_main.c:1346 ../../po/../src/gtk_main.c:1394 #: ../../po/../src/gtk_main.c:1445 msgid "Loading a value file" msgstr "Chargement d'un fichier de données" #: ../../po/../src/visu_main.c:172 msgid "Visualise atomic simulations" msgstr "Visualise des simulations atomiques" #: ../../po/../src/visu_configFile.c:599 #, c-format msgid "Parse error at line %d, the tag '%s' is not closed.\n" msgstr "" "Erreur de lecture à la ligne %d : le marqueur « %s » n'est pas fermé.\n" #: ../../po/../src/visu_configFile.c:615 #, c-format msgid "Parse error at line %d, '%s' is an unknown markup.\n" msgstr "Erreur de lecture à la ligne %d : « %s » est un marqueur inconnu.\n" #: ../../po/../src/visu_configFile.c:619 #, c-format msgid "Markup '%s' is obsolete, replaced by '%s'." msgstr "le marqueur « %s » est obsolète, remplacé par « %s »." #: ../../po/../src/visu_configFile.c:732 #, c-format msgid "Parse error at line %d, '%s' needs %d lines but only %d were read.\n" msgstr "" "Erreur de lecture à la ligne %d : « %s » nécessite %d lignes mais seulement " "%d ont été lues.\n" #: ../../po/../src/visu_configFile.c:1648 #, c-format msgid "" "Parse error at line %d: %d floating points(%g <= v <= %g) must appear after " "the %s markup.\n" msgstr "" "Erreur de lecture à la ligne %d: %d valeurs réelles (%g < v <= %g) sont " "attendues après le marqueur « %s ».\n" #: ../../po/../src/visu_extension.c:853 #, c-format msgid "Parse error at line %d: the extension '%s' is unknown.\n" msgstr "Erreur de lecture à la ligne %d : l'extension '%s' est inconnue.\n" #: ../../po/../src/visu_extension.c:861 #, c-format msgid "Parse error at line %d: the rendering mode '%s' is unknown.\n" msgstr "" "Erreur de lecture à la ligne %d : le mode de rendu '%s' est inconnue.\n" #: ../../po/../src/visu_gtk.c:142 msgid "V_Sim error message" msgstr "Message d'erreur de V_Sim" #: ../../po/../src/visu_gtk.c:184 msgid "Output errors:" msgstr "Sortie d'erreur :" #: ../../po/../src/visu_gtk.c:300 msgid "Choose a directory" msgstr "Sélectionner un répertoire" #: ../../po/../src/visu_gtk.c:318 msgid "" "Choose several directories using the Control key." msgstr "" "Sélectionnez plusieurs répertoires en utilisant la " "touche Control." #: ../../po/../src/visu_gtk.c:414 msgid "" "Internal error,\n" "no preview available" msgstr "" "Erreur interne,\n" "pas de prévisualisation" #: ../../po/../src/visu_gtk.c:433 msgid "Not a V_Sim file" msgstr "Fichier V_Sim incorrect" #: ../../po/../src/visu_gtk.c:446 msgid "This file has errors" msgstr "Ce fichier a des erreurs" #: ../../po/../src/visu_gtk.c:492 msgid "Box composition:" msgstr "Composition de la boîte :" #: ../../po/../src/visu_gtk.c:505 #, c-format msgid "%s:" msgstr "%s :" #: ../../po/../src/visu_gtk.c:516 #, c-format msgid "%d nodes" msgstr "%d nœuds" #: ../../po/../src/visu_gtk.c:519 msgid "1 node" msgstr "1 nœud" #: ../../po/../src/visu_gtk.c:531 msgid "Description:" msgstr "Description :" #: ../../po/../src/visu_gtk.c:645 msgid "_Preview:" msgstr "_Prévisualisation :" #: ../../po/../src/visu_gtk.c:807 msgid "No filename" msgstr "Aucun nom de fichier" #: ../../po/../src/visu_gtk.c:813 msgid "No file loaded" msgstr "Aucun fichier chargé" #: ../../po/../src/visu_gtk.c:944 msgid "Reading the configuration files" msgstr "Lecture des fichiers de configuration" #: ../../po/../src/visu_gtk.c:978 msgid "Parsing command line" msgstr "Analyse de la ligne de commande" #: ../../po/../src/visu_gtk.c:1011 msgid "All supported formats" msgstr "Tous formats supportés" #: ../../po/../src/visu_gtk.c:1019 msgid "No description" msgstr "Sans description" #: ../../po/../src/visu_gtk.c:1128 #, c-format msgid "failed to load pixbuf file '%s': %s\n" msgstr "échec à la lecture du fichier image « %s » : %s\n" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:70 msgid "" "This plug-in adds support for specific\n" "capabilities of BigDFT." msgstr "" "Ce greffon ajoute des fonctions\n" "spécifiques en rapport avec BigDFT." #: ../../po/../lib/plug-ins/bigdft/bigdft.c:148 msgid "Wavefunction file from BigDFT" msgstr "Fichier de fontions d'ondes de BigDFT" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:152 msgid "BigDFT wavelet boxes" msgstr "boîte d'ondelettes de BigDFT" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:155 msgid "Hgrid along x" msgstr "Hgrid le long de x" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:156 msgid "Hgrid along y" msgstr "Hgrid le long de y" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:157 msgid "Hgrid along z" msgstr "Hgrid le long de z" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:158 msgid "Coarse grid multiplier" msgstr "Facteur grille grossière" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:159 msgid "Fine grid multiplier" msgstr "Facteur grille fine" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:160 msgid "Exchange-correlation functional code" msgstr "Code de fonctionnelle d'échange et corrélation" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:161 msgid "Number of processors for memory estimation" msgstr "Nombre de processus pour l'estimation mémoire" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:209 msgid "BigDFT settings" msgstr "Paramètres de BigDFT" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:274 msgid "BigDFT specific parameters" msgstr "Paramètres particuliers à BigDFT" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:282 msgid "use BigDFT to load xyz and ASCII files" msgstr "utiliser BigDFT pour charger les fichiers xyz et ASCII" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:291 msgid "hgrids:" msgstr "hgrids :" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:309 msgid "ixc:" msgstr "ixc :" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:321 msgid "show _coarse grid" msgstr "montrer la grille _grossière" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:330 #: ../../po/../lib/plug-ins/bigdft/bigdft.c:372 msgid "radius of ele." msgstr "rayon des élé." #: ../../po/../lib/plug-ins/bigdft/bigdft.c:362 msgid "show _fine grid" msgstr "montrer la grille _fine" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:414 msgid "Memory estimation" msgstr "Estimation mémoire" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:417 msgid "Memory estimation for" msgstr "Estimation mémoire pour" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:424 msgid "core(s)" msgstr "cœur(s)" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:445 msgid "Running BigDFT" msgstr "Lancer BigDFT" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:561 #, c-format msgid "Can't read wavefunction %d from file '%s'." msgstr "Impossible de lire la fonction d'onde %d depuis le fichier « %s »." #. Add options to the field. #: ../../po/../lib/plug-ins/bigdft/bigdft.c:600 #: ../../po/../lib/plug-ins/bigdft/bigdft.c:722 msgid "orbital id" msgstr "id d'orbital" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:603 #: ../../po/../lib/plug-ins/bigdft/bigdft.c:735 msgid "spin id" msgstr "id de spin" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:611 #: ../../po/../lib/plug-ins/bigdft/bigdft.c:727 msgid "k-point id" msgstr "id du point-k" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:614 #: ../../po/../lib/plug-ins/bigdft/bigdft.c:747 msgid "real/imag or partial density" msgstr "réelle/imaginaire ou densité partielle" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:657 msgid "Choose orbital:" msgstr "Choix de l'orbitale :" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:661 msgid "band id:" msgstr "id de bande" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:672 msgid "spin:" msgstr "spin :" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:680 #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:260 msgid "up" msgstr "up" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:681 #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:274 msgid "down" msgstr "down" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:690 msgid "k-point:" msgstr "point-k :" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:701 msgid "representation:" msgstr "représentation :" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:705 #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:344 msgid "partial density" msgstr "densité partielle" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:706 #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:342 msgid "real part" msgstr "partie réelle" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:708 #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:343 msgid "imaginary part" msgstr "partie imaginaire" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:853 #: ../../po/../lib/plug-ins/bigdft/bigdft.c:860 #, c-format msgid "%d grid points" msgstr "%d points de grille" #: ../../po/../lib/plug-ins/bigdft/bigdft.c:855 #: ../../po/../lib/plug-ins/bigdft/bigdft.c:862 msgid "no grid" msgstr "pas de grille" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:217 msgid "Run locally" msgstr "Lancer en local" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:221 msgid "Go go go..." msgstr "C'est parti !" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:235 msgid "Rho / V:" msgstr "Rho / V :" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:238 msgid "_Density" msgstr "_Densité" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:242 msgid "V_ext" msgstr "V_ext" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:247 msgid "V_hartr" msgstr "H_hartr" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:250 msgid "V_xc" msgstr "V_xc" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:257 msgid "Wavefunctions:" msgstr "Fonctions d'ondes :" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:290 msgid "for k-point(s)" msgstr "pour les point(s)-k" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:334 msgid "retrieve selection" msgstr "récupérer la sélection" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:339 msgid "Wfn. repr.:" msgstr "Repr. des f. d'ondes :" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:537 #, c-format msgid "" "partial density (iter: %d)\n" " ikpt: %d, iorb: %d" msgstr "" "densité partielle (itération : %d)\n" " ikpt: %d, iorb: %d" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:540 #, c-format msgid "" "wavefunction (iter: %d)\n" " ikpt: %d, iorb: %d" msgstr "" "fonction d'onde (itération : %d)\n" " ikpt: %d, iorb: %d" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:550 msgid "Retrieve wavefunction" msgstr "Récupérer les fonctions d'ondes" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:551 msgid "Wavefunction has no imaginary part" msgstr "La fonction d'onde n'a pas de partie imaginaire" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:575 msgid "external potential" msgstr "potentiel exterieur" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:581 #, c-format msgid "electronic density (iter: %d)" msgstr "densité électronique (itération : %d)" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:726 msgid "Energies in _Ht" msgstr "Énergies en _Ht" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:731 msgid "Energies in _eV" msgstr "Énergies en _eV" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:1076 msgid "Running BigDFT on a host" msgstr "Lancer BigDFT sur un hôte" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:1124 #, c-format msgid "%s" msgstr "%s" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:1182 msgid "Hamiltonian optimisation" msgstr "Optimisation de l'hamiltonien" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:1184 msgid "Sub-space optimisation" msgstr "Optimisation du sous-espace" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:1186 msgid "Wfn iteration" msgstr "Itération de f. d'ondes" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:1191 msgid "Initial stage" msgstr "Étape initiale" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:1215 #, c-format msgid "kpt %d (%3.3f,%3.3f,%3.3f - %3.3f)" msgstr "kpt %d (%3.3f,%3.3f,%3.3f - %3.3f)" #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:1226 #: ../../po/../lib/plug-ins/bigdft/bigdft_run.c:1234 #, c-format msgid "orb. %d" msgstr "orb. %d" #: ../../po/../lib/plug-ins/xsf/xsf_density.c:61 msgid "XCrysDen density file format" msgstr "Format de densité XCrysDen" #: ../../po/../lib/plug-ins/xsf/xsf_density.c:98 #, c-format msgid "Wrong XSF format, unreadable float value %d for density.\n" msgstr "Mauvais format XSF, valeur de densité %d illisible.\n" #: ../../po/../lib/plug-ins/xsf/xsf_density.c:110 #, c-format msgid "Wrong XSF format, missing density lines.\n" msgstr "Mauvais format XYZ, il manque des lignes pour la densité.\n" #: ../../po/../lib/plug-ins/xsf/xsf_density.c:124 #, c-format msgid "" "Wrong XSF format, missing float values for density (%d read, %d awaited).\n" msgstr "" "Mauvais format XSF, il manque des valeurs de densité (%d lues, %d " "attendues).\n" #: ../../po/../lib/plug-ins/xsf/xsf_density.c:168 #, c-format msgid "Wrong XSF format, missing or wrong mesh size after tag '%s'.\n" msgstr "" "Mauvais format XSF, la taille du maillage est manquante ou mauvaise après le " "marqueur « %s ».\n" #: ../../po/../lib/plug-ins/xsf/xsf_density.c:184 #, c-format msgid "Wrong XSF format, missing or wrong translation definition." msgstr "Mauvais format XSF, mauvaise définition de translation." #: ../../po/../lib/plug-ins/xsf/xsf_density.c:196 #, c-format msgid "Translation in data grid is an unsupported feature of XSF files." msgstr "Les translations des grilles de données ne sont pas supportées." #: ../../po/../lib/plug-ins/xsf/xsf.c:59 msgid "" "This plug-in reads XSF input files\n" " (position, forces and densities)." msgstr "" "Ce greffon lit les fichiers d'entrée XSF\n" " (positions, forces et densités)." #: ../../po/../lib/plug-ins/xsf/xsf.c:116 #: ../../po/../lib/plug-ins/xsf/xsf.c:624 msgid "XCrysDen Structure File format" msgstr "Format de fichier XCrysDen" #: ../../po/../lib/plug-ins/xsf/xsf.c:225 #: ../../po/../lib/plug-ins/xsf/xsf.c:234 #, c-format msgid "Wrong XSF format, '%s' flag has a wrong value.\n" msgstr "Mauvais format XSF, la balise « %s » a une mauvaise valeur.\n" #: ../../po/../lib/plug-ins/xsf/xsf.c:279 #, c-format msgid "Wrong XSF format, missing float values after tag '%s'.\n" msgstr "Mauvais format XSF, il manque un réel après la balise « %s ».\n" #: ../../po/../lib/plug-ins/xsf/xsf.c:306 #, c-format msgid "Wrong XSF format, missing or wrong integer values after tag '%s'.\n" msgstr "" "Mauvais format XSF, il manque un entier ou celui-ci est erroné après la " "balise « %s ».\n" #: ../../po/../lib/plug-ins/xsf/xsf.c:324 #: ../../po/../lib/plug-ins/xsf/xsf.c:335 #, c-format msgid "Wrong XSF format, can't read coordinates.\n" msgstr "Mauvais format XSF, impossible de lire les coordonnées.\n" #: ../../po/../lib/plug-ins/xsf/xsf.c:427 #, c-format msgid "Wrong XSF format, '%s' tag already defined.\n" msgstr "Mauvais format XSF, la balise « %s » est déjà définie.\n" #: ../../po/../lib/plug-ins/xsf/xsf.c:449 #, c-format msgid "" "Wrong XSF format, primitive vectors found with free boundary conditions.\n" msgstr "" "Mauvais format XSF, des vecteurs primitifs sont donnés pour un système " "isolé.\n" #: ../../po/../lib/plug-ins/xsf/xsf.c:479 #, c-format msgid "" "Wrong XSF format, primitive coordinates found with free boundary " "conditions.\n" msgstr "" "Mauvais format XSF, des vecteurs primitifs sont donnés pour un système " "isolé.\n" #: ../../po/../lib/plug-ins/xsf/xsf.c:508 #, c-format msgid "" "Wrong XSF format, atom coordinates found with free boundary conditions.\n" msgstr "Mauvais format XSF, impossible de lire les coordonnées.\n" #: ../../po/../lib/plug-ins/archives/archives.c:55 msgid "" "This plug-in adds support for\n" "compressed input files\n" "(see http://code.google.com/p/libarchive/)." msgstr "" "Ce greffon ajoute le support\n" "des fichiers d'entrées compressés\n" "(voir http://code.google.com/p/libarchive/)." #: ../../po/../lib/plug-ins/archives/archives.c:102 msgid "Compressed file formats" msgstr "Format de fichiers compressés" #: ../../po/../lib/plug-ins/abinit/abinit.c:76 msgid "" "This plug-in introduces support for\n" "crystallographic structures in\n" "ABINIT input files." msgstr "" "Ce greffon apporte la lecture des\n" "données atomiques des fichiers d'entrée\n" "d'ABINIT." #: ../../po/../lib/plug-ins/abinit/abinit.c:152 #: ../../po/../lib/plug-ins/abinit/abinit.c:763 msgid "ABINIT input file format" msgstr "Format de fichier d'ABINIT" #: ../../po/../lib/plug-ins/abinit/ab_symmetry.c:61 msgid "" "left-button\t\t: select one atom to get the equivalent ones\n" "right-button\t\t: switch to observe" msgstr "" "bouton gauche\t: sélectionne un nœud pour obtenir ses équivalents par " "symétrie\n" "bouton droit\t: passer en mode d'observation" #: ../../po/../lib/plug-ins/abinit/ab_symmetry.c:127 msgid "Symmetries" msgstr "Symétries" #: ../../po/../lib/plug-ins/abinit/ab_symmetry.c:145 msgid "Analyse the symmetries" msgstr "Analyse des symétries" #: ../../po/../lib/plug-ins/abinit/ab_symmetry.c:150 msgid "Compute symmetries" msgstr "Calcul des symétries" #. A message for ABINIT. #: ../../po/../lib/plug-ins/abinit/ab_symmetry.c:172 msgid "" "The symmetry routines are provided by ABINIT (http://www.abinit.org)." msgstr "" "Les routines de calcul des symétries sont fournies " "par ABINIT (http://www.abinit." "org)." #: ../../po/../lib/plug-ins/abinit/ab_symmetry.c:183 msgid "Space group:" msgstr "Groupe d'espace :" #: ../../po/../lib/plug-ins/abinit/ab_symmetry.c:187 msgid "" "http://en.wikipedia.org/wiki/" "Space_group" msgstr "" "http://en.wikipedia.org/wiki/" "Space_group" #: ../../po/../lib/plug-ins/abinit/ab_symmetry.c:196 msgid "Crystal system:" msgstr "Système cristallin :" #: ../../po/../lib/plug-ins/abinit/ab_symmetry.c:201 msgid "space group:" msgstr "groupe d'espace :" #: ../../po/../lib/plug-ins/abinit/ab_symmetry.c:207 msgid "" "Warning: the Bravais lattice determined from the " "primitive vectors is more symmetric than the real one obtained from " "coordinates (printed)." msgstr "" "Attention : le réseau de Bravais déterminé à " "partir des vecteurs primitifs est plus symétrique que celui obtenu (et " "affiché) à partir des coordonnées." #: ../../po/../lib/plug-ins/abinit/ab_symmetry.c:212 msgid "List of symmetry operations:" msgstr "Liste des opérations de symétrie :" #: ../../po/../lib/plug-ins/abinit/ab_symmetry.c:228 msgid "operation" msgstr "opération" #: ../../po/../lib/plug-ins/abinit/ab_symmetry.c:236 msgid "translation" msgstr "translation" #: ../../po/../lib/plug-ins/abinit/ab_symmetry.c:243 msgid "comment" msgstr "commentaire" #. The interface to choose one atom to select. #: ../../po/../lib/plug-ins/abinit/ab_symmetry.c:248 msgid "Equivalent atoms:" msgstr "Atomes équivalents :" #: ../../po/../lib/plug-ins/abinit/ab_symmetry.c:255 msgid "Visualise the equivalent nodes of node:" msgstr "Visualise les nœuds équivalents au nœud :" #: ../../po/../lib/plug-ins/abinit/ab_symmetry.c:261 msgid " or pick directly." msgstr "ou par sélection directe" #: ../../po/../lib/plug-ins/abinit/ab_symmetry.c:618 msgid "not primitive" msgstr "non primitive" #: ../../po/../lib/plug-ins/abinit/ab_symmetry.c:644 msgid "ABINIT symmetry calculation" msgstr "Calcul des symétries par ABINIT" #: ../../po/../lib/plug-ins/abinit/ab_symmetry.c:673 msgid "Unknown symmetry" msgstr "Symétrie inconnue" #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_structure.c:24 msgid "ETSF file format" msgstr "Format de fichier ETSF" #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_structure.c:161 #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_structure.c:178 #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_structure.c:207 #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_structure.c:220 #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_basic.c:249 #, c-format msgid "Retrieve value for variable '%s': %s." msgstr "Lecture de la valeur de la variable « %s » : %s." #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_structure.c:193 #, c-format msgid "Error in indexing array '%s', index out of bounds." msgstr "Erreur d'indexation du tableau « %s », index hors limites." #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_basic.c:55 msgid "" "This plug-in introduces support for\n" "ETSF file format defined by the\n" "European network NANOQUANTA." msgstr "" "Ce greffon permet la lecture des fichiers\n" "ETSF suivant le format défini par le\n" "réseau européen NANOQUANTA." #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_basic.c:59 msgid "" "Caliste Damien:\n" " structure/density loading." msgstr "" "Caliste Damien:\n" " lecture structure/densité." #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_basic.c:153 #, c-format msgid "Global attribute '%s' has a wrong length or type.\n" msgstr "L'attribut global « %s » un une longueur ou un type erroné.\n" #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_basic.c:176 #, c-format msgid "Variable 'file_format' should be 'ETSF Nanoquanta' but is '%s'.\n" msgstr "" "La varibale « file_format » devrait contenir « ETSF Nanoquanta » mais est « " "%s ».\n" #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_basic.c:196 #, c-format msgid "Supported version are 1.2 and over but this file is only %f.\n" msgstr "" "Le support fonctionne pour les fichier au format 1.2 ou supérieur mais celui " "-ci n'est que %f.\n" #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_basic.c:245 #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_basic.c:267 #, c-format msgid "Reading '%s': %s." msgstr "Lecture de « %s » : %s" #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_basic.c:271 #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_basic.c:278 #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_basic.c:289 #, c-format msgid "Checking variable '%s': %s." msgstr "Vérification de la variable « %s » : %s" #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_basic.c:274 #, c-format msgid "Variable '%s' should be of type '%s'." msgstr "La variable « %s » devrait être de type « %s »." #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_basic.c:282 #, c-format msgid "Variable '%s' should be a %d dimension array." msgstr "La variable « %s » devrait être un tableau à %d dimension(s)." #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_basic.c:298 #, c-format msgid "Checking dimension ID %d: %s." msgstr "Vérification de la dimension d'id %d : %s." #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_basic.c:305 #, c-format msgid "Variable '%s' is not consistent with declaration of dimensions." msgstr "La variable « %s » ne correspond pas à sa déclaration." #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_density.c:66 msgid "Nanoquanta NETCDF format" msgstr "Format NetCDF Nanoquanta" #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_density.c:222 #, c-format msgid "Retrieve value for variable 'primitive_vectors': %s." msgstr "Lecture de la valeur pour la variable « primitive_vectors » : %s." #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_density.c:231 #, c-format msgid "" "The variable 'primitive_vectors' is not well formed (the basis is not 3D)." msgstr "" "La variable « primitive_vectors » n'est pas bien définie (la base n'est pas " "3D)." #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_density.c:256 #, c-format msgid "Retrieve value for variable 'density': %s." msgstr "Lecture de la valeur pour la variable « density » : %s." #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_density.c:278 msgid "1, no spin information" msgstr "1, aucune information de spin" #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_density.c:281 msgid "1, spin-up ; 2, spin-down" msgstr "1, haut-spin ; 2, bas-spin" #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_density.c:284 msgid "1, average density ; [2;4], magnetisation vector" msgstr "1, densité moyenne ; [2;4], vecteur de magnétisation" #: ../../po/../lib/plug-ins/nanoquanta-netcdf/nq_density.c:288 msgid "unknown value" msgstr "valeur inconnue" #: ../../po/../lib/plug-ins/cube/cube.c:50 msgid "" "This plug-in reads Cube files (see \n" "http://local.wasp.uwa.edu.au/\n" "~pbourke/dataformats/cube/),\n" "both structural and and volumetric data." msgstr "" "Ce greffon lit les fichiers Cube (cf.\n" "http://local.wasp.uwa.edu.au/\n" "~pbourke/dataformats/cube/),\n" "données de structure ou densités." #: ../../po/../lib/plug-ins/cube/cube.c:97 #: ../../po/../lib/plug-ins/cube/cube.c:102 msgid "Gaussian structural/volumetric format" msgstr "Format de structure/densités de Gaussian" #: ../../po/../lib/plug-ins/cube/cube.c:166 #: ../../po/../lib/plug-ins/cube/cube.c:174 #, c-format msgid "Wrong Cube format, missing comment lines.\n" msgstr "Mauvais format Cube, il manque la ligne de commentaire.\n" #: ../../po/../lib/plug-ins/cube/cube.c:192 #, c-format msgid "Wrong Cube format, missing the atom line.\n" msgstr "Mauvais format Cube, il manque la ligne des atomes.\n" #: ../../po/../lib/plug-ins/cube/cube.c:199 #, c-format msgid "Wrong Cube format, missing the number of atoms on the third line.\n" msgstr "" "Mauvais format Cube, il manque le nombre d'atomes sur la troisième ligne.\n" #: ../../po/../lib/plug-ins/cube/cube.c:219 #, c-format msgid "Wrong Cube format, missing the %d box line.\n" msgstr "Mauvais format Cube, il manque la ligne %d de la boîte.\n" #: ../../po/../lib/plug-ins/cube/cube.c:227 #, c-format msgid "Wrong Cube format, missing float values for box definition.\n" msgstr "" "Mauvais format Cube, il manque des valeurs pour la définition de la boîte.\n" #: ../../po/../lib/plug-ins/cube/cube.c:234 #, c-format msgid "Wrong Cube format, wrong mesh size in %c direction.\n" msgstr "" "Mauvais format Cube, incorrecte taille de maillage pour la direction %c.\n" #: ../../po/../lib/plug-ins/cube/cube.c:270 #, c-format msgid "Wrong Cube format, missing line %d with coordinates.\n" msgstr "Mauvais format Cube, la ligne %d avec les coordonnées est manquante.\n" #: ../../po/../lib/plug-ins/cube/cube.c:280 #, c-format msgid "Wrong Cube format, can't read coordinates.\n" msgstr "Mauvais format Cube, impossible de lire les coordonnées.\n" #: ../../po/../lib/plug-ins/cube/cube.c:291 #, c-format msgid "" "Wrong Cube format, one atomic number is 0 or lower, or greater than 103, " "check your input file.\n" msgstr "" "Mauvais format Cube, un numéro atomique est 0 ou plus petit, ou plus grand " "que 103, vérifiez votre fichier.\n" #: ../../po/../lib/plug-ins/cube/cube.c:346 #, c-format msgid "Wrong Cube format, missing density lines.\n" msgstr "Mauvais format Cube, il manque un entier sur la première ligne.\n" #: ../../po/../lib/plug-ins/cube/cube.c:357 #, c-format msgid "Wrong Cube format, unreadable float value %d for density.\n" msgstr "Mauvais format Cube, la valeur %f de densité est illisible.\n" #: ../../po/../lib/plug-ins/cube/cube.c:376 #, c-format msgid "" "Wrong Cube format, missing float values for density (%d read, %d awaited).\n" msgstr "" "Mauvais format Cube, il manque des valeurs de densités (% lues, %d " "attendues).\n" #: ../../po/../lib/plug-ins/python-gi/pythongi.c:60 msgid "" "This plug-in allows to execute\n" "Python scripts using GObject\n" "introspection." msgstr "" "Ce greffon permet de lancer\n" "des scripts Python en utilisant GObject\n" "introspection." #. Long description #: ../../po/../lib/plug-ins/python-gi/pythongi.c:158 msgid "Python scripting" msgstr "Scripts Python" #. Short description #: ../../po/../lib/plug-ins/python-gi/pythongi.c:160 msgid "Python" msgstr "Python" #: ../../po/../lib/plug-ins/python-gi/pythongi.c:251 msgid "Python scripts for V_Sim" msgstr "Scripts Python pour V_Sim" #: ../../po/../lib/plug-ins/python-gi/pythongi.c:304 msgid "Scripts loaded on startup" msgstr "Scripts lancés au démarrage" #: ../../po/../lib/plug-ins/python-gi/pythongi.c:324 msgid "This list is saved with the parameter file." msgstr "Cette liste est sauvée dans le fichier de paramètres." #: ../../po/../lib/plug-ins/python-gi/pythongi.c:359 msgid "Interactive scripting" msgstr "Script en interactif" #: ../../po/../lib/plug-ins/python-gi/pythongi.c:367 msgid "Load:" msgstr "Charge :" #: ../../po/../lib/plug-ins/python-gi/pythongi.c:370 #: ../../po/../lib/plug-ins/python-gi/pythongi.c:500 #: ../../po/../lib/plug-ins/python-gi/pythongi.c:526 msgid "Choose a Python script" msgstr "Sélectionner un script Python" #: ../../po/../lib/plug-ins/python-gi/pythongi.c:411 msgid "Clear Python output." msgstr "Efface la sortie Python." #: ../../po/../lib/plug-ins/python-gi/pythongi.c:420 msgid "" "Get the current VisuData object as 'data' variable and the current " "VisuGlView as 'view'." msgstr "" "Associe l'object VisuData courant à la variable « data » et l'object " "VisuGlView courant à « view »." #: ../../po/../lib/plug-ins/python-gi/pythongi.c:424 msgid "Python interactive command line" msgstr "Ligne de commande intéractive en Python" #: ../../po/../lib/plug-ins/python-gi/pythongi.c:472 msgid "Load a Python script" msgstr "Charge un script Python" #: ../../po/../lib/plug-ins/python-gi/pythongi.c:481 #, c-format msgid "Load script \"%s\"\n" msgstr "Charge le script « %s »\n" #: ../../po/../lib/plug-ins/python-gi/pythongi.c:501 msgid "Not a regular file." msgstr "Fichier incorrect." v_sim-3.7.0/po/ChangeLog0000644000353400050620000000000012216331361011735 00000000000000v_sim-3.7.0/po/LINGUAS0000644000353400050620000000000312216331361011213 00000000000000fr v_sim-3.7.0/pixmaps/0000755000353400050620000000000012216331352011320 500000000000000v_sim-3.7.0/pixmaps/16x16/0000755000353400050620000000000012216331351012104 500000000000000v_sim-3.7.0/pixmaps/16x16/v_sim.png0000644000353400050620000000201012215546057013652 00000000000000PNG  IHDRabKGD pHYsHHFk>IDAT8EKL\e޹wf@c4(MäiUCR5IbE]i@S]h*EѤ%JXԅ4a<{xp̽w!ēmNR`63񸿯epaƋGWl)W B+ Bn'x`ϭ[m|$Rp75 w$R*Em]ETu}>gYw*RJ>v%\rZYy A*axE|E^sc};:wٙolo)~N1ux<g`px,Lm{ҩCCBEu(P]HE!eQkj^_FֶQe "p>F˶70[׮ieȸkp0#%9ҲpIɐXYA\GO>kk9R6(E#@WUPrSS(;095UJ[;FzoU)L1?=͎i"4 w0H^YN!~$ڮlvszq00vX?х)<ҙ @f1Id"AYIɂz0n$ .ǙM1M(,Idpt%VnիWOW`3v KI&[XSU03WQi#˿hj~uVkvxŹyLGwk?~Сgnڻ;sNrGǎJ;icg߽'ZZg=:Wё6/R|DKrg'o^``V|\DTǏk7Qyzwf2OۦT*xh^ KJEQLJeo)%0?y]T{a 3$C}1>1;$QHE̼>r?|Z8}|KJk- j)`.ΟǽxaJ߶ 5iN9_=xD (8Z `<]ssb}; z- I~FGUWagRE#54ZEjRRc WD!~Ac^?v]##  јy=ӮT5@PcuX K6MH?`::x;q4囏>JT+5acOSiJ*Ԥ,% aºuHg'M[ȹYq2ZqٵM8B:"8XKV,  >M(I?Q8ju /[{DўZd6KK,WƐ0OONLjA@q_^>ӄtf,.]5 9r{GH80J[[Q2+W/a`/^Y#rC}kK0$Xim o؀."ΙޣTC]^~fIrLN+DȈXKf=©Sjy c7L!+}s(wtJ g|,"س/NNM}m~/!X{ P`0P35DopA#yn0yQzE0X "3XR(Q݌;z<wJ9κ/ȚW$y7fVoR\9\0wmIENDB`v_sim-3.7.0/pixmaps/24x24/0000755000353400050620000000000012216331351012102 500000000000000v_sim-3.7.0/pixmaps/24x24/v_sim.png0000644000353400050620000000301212215546054013650 00000000000000PNG  IHDRw=sBIT|d pHYsZtEXtSoftwarewww.inkscape.org<IDATHmlg==-mZi{J7J)X\kf6T >0 -11$~g| FIƸ-4&Ľdm0J ЁPkiOs@[Sur܏*wR"bjrG84|`̋F${Y++Һq~hLWl}`W3 NP? ى/a~0vٶ{~;WUE%껷rN 噧ŋCCCԩ@i>Fnw_zGGwCC#iGJ佳557dT8& Cڱܿ/}fj?Pf塺7Vkj#-uО=,/>MǤqLxW}}vc[}@W[,Jrv##TMM|v\! C0$ jvr,PUVb)0,Ƹbx&AŲ8$QDE?Z˲sں:<G(0ӪL:.AQ+^#xhϟ' Pe*Q'T5^sˢ*QaD20nvYR.K|]FqrpMx9رc2n0fCQmO,#CH5b,IdrLyn{a9Μ5u㭢Hn` R -Dºztn6ٲ߿ξU͎PѱB& n$U2_"Gb{6vj&u٘5޶!/ R-!̡@)hx>޸Oj\HˮR`SmȹhcK{{KI&l.mSt]nv*NyͼSdPM,"N #ó{.@˅BkR^ߏSL&5y1yŞ>RE+QHL+W^h%Ͽ5OƷER7nTs3IB $FD!ϣ4(uhHJ!J?4tqg&k!Y;'H\ڵnnA |*͎C $ea Q$W]!Re ,[g;v ðM.վh8i&mL D-,M }K0owwq(-[ 83B!k7n$ ^2jMX.3Sw]f>@FfR#yy0d^k+'M1EDڸls3`ee\("_(u}ʾWSR0w/N#:}#X%%Qg'>4A7݄(2 >9UA^r ݂eː88M_߯J2Ibol͛=xuVa)8J&G=v R01S(b10y8<2I}*j()R؆A֛&C,]|DsgyX*P@&A~vo]]Jf@-ؾIWZBϒ\s>jZE'L؈H91:Q,ᵴоw<:WUaD2Go "%(H$8˱wc=79)mH+E6;HUJQ a[r9:2d{'ONٳ*G,[.B` 0ƮBQ ^`gkDiQ8~mYވ~oIDAThkpTe9t҉e-qaJRtU#EX˸LZNtL1(슊` 8!#\:nt>d@ZxCw~yskvͮw@2\888DPX4S%0 k"drastLӴ Rʫ!PJQeD9rWiaZ<'#"Dž8 |8R[[K k%i~8mmmS&f6#$CgΰsNye.Z[[WW_};v裏uVt]8* hi~B$Roc|@ϡC$?i(BQSoj"V[K(< === x8L&oӣ{o% "!NooPeq&a4Ds3~w^;F"`ƍJ{M-[~kX^UEUS3V$H78twu #)\&=4D>i,bK/zz ]יmc6]'J12< /@2dҥM恦JI,0g2bKix(`x=~r%'Owf !4tWヒf;$t(EY>RIEPJ.׋S.8,ၺz:ĭmm44]'WB@GUM=F<RաBH$_ :MQ`iʅŲE㥘HY6ޱ1Qd>/qdw\,Xmiᜀ?X,馫.b`xh~@0.H=ǕוB@p 2 b|q>ۗ/Ep-CJx|F|~?,'{zTHMÖ`I%% B@rtulظY/\ߧP(pz`wŒ;n7/cJgzzZ6ǘH!p* %M 2Ŷm 9lD:ю~NTuuūfqw#P;޳wY)B<mmm3 Pb!:4H.q@˨r3siR`(bIChT"駠-uk2qx<ieǁz<ӗ8ҕV XR UI&@:-,-@:0Pu~?R SJ RutH{kr/졻;B]l{/T*Mx P؎_ЄR Ҡ %RJ\ǃy lY؎t9Pz7x 矣"immwf-sGsE"*8XfB.K1(Ҳ+%"Duw#D A @8k8tl(x( < .[nEJRe˖{nH3М ͝Kd8%v!4Xrʥ6_2!BJMC:0Ъ(&fo/T,ZDS?<\".J)\ץh4JMM ӆH47Ӵz5'N08єV oER'U(_e7@;-@ o(D9?z."iXl6K\\@[￟/CR\z!pK)/TUL]bT.Ћ Οb7Z/ΞDTW3kٶmGH)Ybw簾bH\]jl_dD|BUcRr% %2›N#D(P 'zMAJhJaa˖-u]h6 D<' Q*xS,1nW zP^[˂~Sf_y/JۘmSSj!}}}d2ۯ eZx#_&Յ(R AI6RQ5մv?زU/S' n:;;QJA,r=p3g\/NvIU;I~v'U}$ P%6I>I#ߵKVl$ PI;'~50غqReG i[@J-"3u_{GؾZBi)`0x; I{Sm~'xm Q#W?[I ?AMO[U%*5GЌ]o ^u#Z].ި!`[2w5Vi8y`1ЙIӟ{҆M{ lk;cg%޲&5VXl ,u=P3U j# p5VV{Im(==]( C~5Gl?LH?$۬4YR)[Z"cF$iXS@ `T0 2?6f"i;J`AL^lw;,~ov+u9 >wW`Ϝb3_W]? 떵1a,`gSáE-@=%H@$l RL`HD.['O&‘MKXXLjo*X)94g$m\YGy&Ā">V{m %p !U*^ت1*nGz 48 X|y0X')ӺU2 "a+VdHjjbmW Bm@ߓ9ZI:_}2$,F|&7oB+ICm8, n^@Xos=_ )29.򽁧Kg$ f[o[1 yEfx"IO/.t0G,ƒE0 ت{$F+#/H:a&rn\I5TiֈՄ%Ӂl*]zp`tn$!+g0?% ? 6^W p`]ہ%¦K;yN2BPҼPj@҇mV@œnSb8`kDy6Da4D=ڍ>\sk; M'veN} EӔ?G i&񻁩 hD4Y]eф!gTBW;)Ҽ]>D_h* L鯊uB]?^w?}j4 :w.ŭ+ikn2a^ 4D΅eEǂPc_gͽqH ;_rr ¡R^# =na p!|^Q4u UIp%kmL+ZlX )@҉ۏ"@$~k;G_`U s,o=$./Mrh ^k5pscIXDQ=2AÎwbS&74Pgy7!|D&94) :^fؾ5&x㽴IS@'ѹ3=zIGl"Puu"iΝ3 MbOڞ[,0 ΢svJEL?Uҩ1h#E&(@tKpPB-DMQ@mz2Wt.2Tˮ; Li)@لLM'1)t&a!ɡ}%S d`a;>G S7)@6c)p8LLշ n P`}rREO;wS(8+r rjIL Fδ}uIL@BK#N"oVܙMUmDeRX~}\:wڑG8yw;wڍ,tE-Eg$Co 0PRxBKMK aΉGgPLq~ù(<= image/svg+xml v_sim-3.7.0/pixmaps/logo/0000755000353400050620000000000012216331352012260 500000000000000v_sim-3.7.0/pixmaps/logo/logo-2.3.svg0000644000353400050620000007321112215546055014174 00000000000000 image/svg+xml v_sim-3.7.0/pixmaps/logo/logo-small-2.3.svg0000644000353400050620000006173612215546055015313 00000000000000 image/svg+xml v_sim-3.7.0/pixmaps/v_sim.svg0000644000353400050620000007321112215546055013111 00000000000000 image/svg+xml v_sim-3.7.0/pixmaps/v_sim.xpm0000644000353400050620000002334512215546061013116 00000000000000/* XPM */ static char * v_sim_xpm[] = { "32 32 483 2", " c None", ". c #1C0000", "+ c #220101", "@ c #130A0A", "# c #312929", "$ c #817070", "% c #978383", "& c #857676", "* c #000000", "= c #1D0000", "- c #350404", "; c #620909", "> c #850B0B", ", c #864141", "' c #010000", ") c #2B2727", "! c #C8B7B7", "~ c #D1C2C2", "{ c #D5CCCC", "] c #BEAEAE", "^ c #8A7B7B", "/ c #190000", "( c #3D0505", "_ c #8B1414", ": c #9D2D2D", "< c #AE3E3F", "[ c #A96F70", "} c #B99B9B", "| c #4A3F3F", "1 c #817575", "2 c #CBBBBB", "3 c #D2C7C7", "4 c #DBD3D3", "5 c #E5DFDF", "6 c #C9BCBC", "7 c #200202", "8 c #700A0A", "9 c #A02D2D", "0 c #CE5E5F", "a c #DD6969", "b c #B76F70", "c c #B38F8F", "d c #B69696", "e c #A98F8F", "f c #0A0809", "g c #151212", "h c #C4B3B3", "i c #D3C4C4", "j c #D6CBCB", "k c #DED7D7", "l c #EAE4E4", "m c #EDE8E8", "n c #9F9090", "o c #260101", "p c #8E1515", "q c #C94F4F", "r c #DC6969", "s c #D66566", "t c #BD6262", "u c #AD7475", "v c #E16D6D", "w c #D7696A", "x c #C16465", "y c #665656", "z c #605757", "A c #D0BEBE", "B c #D6C8C8", "C c #DCD0D0", "D c #E1DBDB", "E c #ECE8E8", "F c #F6F3F3", "G c #AB9B9B", "H c #220202", "I c #871111", "J c #D96061", "K c #DD696A", "L c #E76F6F", "M c #DF6A6B", "N c #AC7373", "O c #AD7171", "P c #B96969", "Q c #BB686A", "R c #B27474", "S c #B39596", "T c #1B1717", "U c #060505", "V c #B0A0A0", "W c #D1C0C1", "X c #D8CBCB", "Y c #DFD4D4", "Z c #EFECEC", "` c #F8F6F6", " . c #998A8A", ".. c #770B0B", "+. c #CE4C4C", "@. c #DA6869", "#. c #DE696A", "$. c #DA6868", "%. c #BA6565", "&. c #B86363", "*. c #C46262", "=. c #BA6667", "-. c #B26D6D", ";. c #AE8787", ">. c #B49394", ",. c #816C6C", "'. c #3E3838", "). c #CCBABA", "!. c #DACDCD", "~. c #E1D7D7", "{. c #E8E3E3", "]. c #F3F0F0", "^. c #F3EFEF", "/. c #070707", "(. c #440505", "_. c #A82A2A", ":. c #E76E6E", "<. c #EC7172", "[. c #EB7071", "}. c #A56666", "|. c #F06D6D", "1. c #F47576", "2. c #EA7374", "3. c #DD6C6E", "4. c #A98282", "5. c #B18E8E", "6. c #B59595", "7. c #332B2B", "8. c #928383", "9. c #CEBDBD", "0. c #D5C6C6", "a. c #DCCFCF", "b. c #AB8A8A", "c. c #764343", "d. c #210303", "e. c #230101", "f. c #901111", "g. c #E66666", "h. c #D76666", "i. c #E16C6D", "j. c #E06B6C", "k. c #CE6868", "l. c #A66666", "m. c #C85E5E", "n. c #CA6060", "o. c #CB6263", "p. c #C06162", "q. c #A77778", "r. c #BD5E5F", "s. c #B75B5C", "t. c #A84F50", "u. c #651D1E", "v. c #211D1D", "w. c #C6B3B3", "x. c #CFBEBF", "y. c #782121", "z. c #510E0F", "A. c #6B0C0C", "B. c #080202", "C. c #400505", "D. c #A62727", "E. c #E96D6D", "F. c #F57575", "G. c #F07374", "H. c #E86E6F", "I. c #C96161", "J. c #C96566", "K. c #C06565", "L. c #B96567", "M. c #AE6565", "N. c #A67A7B", "O. c #AA6B6D", "P. c #CA5F61", "Q. c #C05758", "R. c #B54B4C", "S. c #9A3536", "T. c #6F6262", "U. c #C8B3B3", "V. c #CFBEBE", "W. c #D8CACA", "X. c #713737", "Y. c #4F0B0C", "Z. c #2C0505", "`. c #665959", " + c #6C0909", ".+ c #A13132", "++ c #E26B6C", "@+ c #D96567", "#+ c #C25D5F", "$+ c #A67879", "%+ c #A56E6F", "&+ c #AF6162", "*+ c #AB6565", "=+ c #A96668", "-+ c #9E6263", ";+ c #0C0A0A", ">+ c #0D0B0B", ",+ c #B39E9E", "'+ c #CBB7B7", ")+ c #B2A5A5", "!+ c #040404", "~+ c #262626", "{+ c #E5DDDD", "]+ c #2C0303", "^+ c #7C0C0D", "/+ c #C24848", "(+ c #E66B6B", "_+ c #E26C6D", ":+ c #D76667", "<+ c #E56E6E", "[+ c #BD5E60", "}+ c #A36B6C", "|+ c #AB6163", "1+ c #A96363", "2+ c #A86465", "3+ c #9A5959", "4+ c #975757", "5+ c #634D4D", "6+ c #4E4444", "7+ c #C5B0B0", "8+ c #3A3535", "9+ c #A5A2A2", "0+ c #F0ECEC", "a+ c #3B0404", "b+ c #730C0D", "c+ c #E06262", "d+ c #F97575", "e+ c #D96667", "f+ c #D56566", "g+ c #D06363", "h+ c #CD5F61", "i+ c #B15B5C", "j+ c #AC5F60", "k+ c #D46768", "l+ c #C65A5B", "m+ c #9F2B2B", "n+ c #941B1B", "o+ c #941C1C", "p+ c #9D7878", "q+ c #461313", "r+ c #5D0909", "s+ c #650A0A", "t+ c #852020", "u+ c #600A0A", "v+ c #413D3D", "w+ c #DCD6D6", "x+ c #968585", "y+ c #490707", "z+ c #760C0D", "A+ c #DB6161", "B+ c #B55E60", "C+ c #B35C5C", "D+ c #C85859", "E+ c #982121", "F+ c #931A1A", "G+ c #931B1B", "H+ c #976E6E", "I+ c #823737", "J+ c #7F0D0D", "K+ c #7C0D0D", "L+ c #030202", "M+ c #B5A8A8", "N+ c #D5CECE", "O+ c #E2DBDB", "P+ c #A39090", "Q+ c #4D0707", "R+ c #6E0D0E", "S+ c #D55656", "T+ c #EA6E6E", "U+ c #E66E6E", "V+ c #D46465", "W+ c #AF5E5F", "X+ c #9C5252", "Y+ c #8A3333", "Z+ c #893636", "`+ c #8B3B3B", " @ c #8D4040", ".@ c #8F4545", "+@ c #976B6B", "@@ c #974B4B", "#@ c #861212", "$@ c #790C0C", "%@ c #510808", "&@ c #594B4B", "*@ c #CBBABA", "=@ c #CEC6C6", "-@ c #DAD2D2", ";@ c #AA9696", ">@ c #460606", ",@ c #600B0C", "'@ c #C64848", ")@ c #DB6768", "!@ c #DB6969", "~@ c #C65859", "{@ c #8A292A", "]@ c #822525", "^@ c #832828", "/@ c #852D2D", "(@ c #873131", "_@ c #893333", ":@ c #8D5151", "<@ c #9A6D6D", "[@ c #986868", "}@ c #875F5F", "|@ c #040303", "1@ c #110E0E", "2@ c #B59E9E", "3@ c #C7BEBE", "4@ c #D4CACA", "5@ c #988282", "6@ c #440606", "7@ c #610B0C", "8@ c #9A2C2C", "9@ c #C84F4F", "0@ c #981616", "a@ c #8A0E0E", "b@ c #930F0F", "c@ c #893E3E", "d@ c #966767", "e@ c #9C7070", "f@ c #9F7878", "g@ c #715353", "h@ c #4C2B2B", "i@ c #8B6363", "j@ c #BBA1A1", "k@ c #BDABAB", "l@ c #C1B6B6", "m@ c #CEC2C3", "n@ c #7A6464", "o@ c #6F0D0D", "p@ c #751010", "q@ c #E56767", "r@ c #E86F6F", "s@ c #D26364", "t@ c #DA6162", "u@ c #B33535", "v@ c #883939", "w@ c #8C4040", "x@ c #922828", "y@ c #931F1F", "z@ c #951D1D", "A@ c #961F1F", "B@ c #9C4D4D", "C@ c #B69999", "D@ c #B5A4A4", "E@ c #BAAEAE", "F@ c #C8BABA", "G@ c #240202", "H@ c #7B0C0C", "I@ c #610C0D", "J@ c #C44040", "K@ c #F47474", "L@ c #D75758", "M@ c #A42B2B", "N@ c #8D0E0E", "O@ c #8B0E0E", "P@ c #830D0D", "Q@ c #833333", "R@ c #8E3030", "S@ c #941D1D", "T@ c #951E1E", "U@ c #9A4F4F", "V@ c #B19393", "W@ c #AD9C9D", "X@ c #A69191", "Y@ c #BEB2B2", "Z@ c #610808", "`@ c #490A0B", " # c #801011", ".# c #9D1D1D", "+# c #853333", "@# c #8C2A2A", "## c #912121", "$# c #902C2C", "%# c #933B3B", "&# c #954B4B", "*# c #965858", "=# c #7F3333", "-# c #832627", ";# c #7D393A", "># c #967F7F", ",# c #380404", "'# c #6E0B0C", ")# c #590D0F", "!# c #820D0D", "~# c #8E0E0E", "{# c #864D4D", "]# c #884C4C", "^# c #8A4747", "/# c #8D4242", "(# c #915555", "_# c #803C3C", ":# c #500F10", "<# c #681416", "[# c #895758", "}# c #620808", "|# c #570B0C", "1# c #700E0F", "2# c #900E0E", "3# c #811010", "4# c #910E0E", "5# c #8D4949", "6# c #542D2D", "7# c #703B3C", "8# c #865C5C", "9# c #854B4B", "0# c #320404", "a# c #780909", "b# c #4D0C0D", "c# c #770E0E", "d# c #850D0D", "e# c #734142", "f# c #6C3C3D", "g# c #602223", "h# c #724545", "i# c #360303", "j# c #6F0C0C", "k# c #4F0D0F", "l# c #660D0D", "m# c #840D0D", "n# c #8C0E0E", "o# c #800E0F", "p# c #5F0E10", "q# c #5C0E10", "r# c #560F0F", "s# c #651616", "t# c #2F1A1A", "u# c #680B0C", "v# c #4C0C0E", "w# c #540D0D", "x# c #830F0F", "y# c #920E0E", "z# c #910F0F", "A# c #781011", "B# c #611012", "C# c #530D0E", "D# c #530E0E", "E# c #370404", "F# c #7D0A0A", "G# c #540B0D", "H# c #4B0C0D", "I# c #600E0F", "J# c #740E0F", "K# c #820E0E", "L# c #870E0E", "M# c #7D0E0F", "N# c #6F0E0F", "O# c #690E0F", "P# c #5E0F11", "Q# c #570E10", "R# c #4F0D0E", "S# c #5B0C0D", "T# c #1D0101", "U# c #2D0303", "V# c #650909", "W# c #610C0C", "X# c #4B0B0D", "Y# c #560E0F", "Z# c #530E0F", "`# c #5D0F10", " $ c #5C0F11", ".$ c #550E0F", "+$ c #580E0F", "@$ c #4F0C0D", "#$ c #630B0C", "$$ c #490606", "%$ c #550707", "&$ c #68090A", "*$ c #580B0D", "=$ c #4C0C0D", "-$ c #4D0D0E", ";$ c #4E0D0E", ">$ c #4E0C0D", ",$ c #5C0C0D", "'$ c #600909", ")$ c #410505", "!$ c #270303", "~$ c #230202", "{$ c #3D0404", "]$ c #400303", "^$ c #420505", "/$ c #3E0404", "($ c #320303", " ", " . + @ # $ % & * * ", " = - ; > , ' * ) ! ~ { ] ^ * * * ", " / ( _ : < [ } | * * 1 2 3 4 5 6 * * * ", " 7 8 9 0 a b c d e f * g h i j k l m n * * * ", " o p q r s t u v w x y * * z A B C D E F G * * * ", " H I J K L M N O P Q R S T * U V W X Y 5 Z ` . * * * ", " = ..+.@.#.$.%.&.*.=.-.;.>.,.* * '.).i !.~.{.].^./.* * ", " (._.:.<.[.L }.|.1.2.3.4.5.6.7.* * 8.9.0.a.C b.c.d.* * ", " e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.* v.w.x.B i y.z.A.B. ", " C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.* * T.U.V.W.X.Y.Z.`. ", " +.+E.F.G.[.$.++a @+#+$+%+&+*+=+-+;+* >+,+'+)+!+* ~+{+ ", "]+^+/+(+:._+:+<+++a @+[+}+|+1+2+3+4+5+* * 6+7+8+* * 9+0+ ", "a+b+c+d+F.G.e+$.f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+u+* v+w+{.x+ ", "y+z+A+d+F.G.#.L ++a @+B+C+D+E+F+G+o+H+I+J+J+J+K+L+M+N+O+P+ ", "Q+R+S+T+U+i.V+U+++a @+W+X+Y+Z+`+ @.@+@@@#@$@s+%@&@*@=@-@;@ ", ">@,@'@d+F.G.)@!@f+g+~@{@]@^@/@(@_@:@<@[@}@|@* 1@2@h 3@4@5@ ", "6@7@8@d+F.G.#.L ++9@0@a@b@b@b@b@b@c@d@e@f@g@h@i@j@k@l@m@n@ ", "( o@p@q@r@_+s@t@u@b@b@a@b@b@b@b@b@v@w@x@y@z@A@B@C@D@E@F@ ", "G@H@I@J@K@L@M@N@O@O@O@P@a@a@a@a@a@Q@R@F+n+S@T@U@V@W@X@Y@ ", " Z@`@ #.#b@a@b@b@b@b@a@b@b@b@b@b@+#@###$#%#&#*#=#-#;#># ", " ,#'#)#O@a@!#a@a@~#b@a@b@b@b@b@b@Q@{#]#^#/#(#_#:#<#[# ", " }#|#1#b@a@b@b@2#a@!#a@a@a@a@a@3#a@4#b@b@5#6#7#8#9# ", " 0#a#b#c#d#b@b@b@b@a@b@b@b@b@b@a@b@b@b@N@e#f#g#h# ", " i#j#k#l#!#a@a@a@!#a@a@a@a@a@m#n#n#o#p#q#r#s#t# ", " C.u#v#w#x#b@b@2#N@b@b@b@y#n#z#A#B#C#D#u+= ", " E#F#G#H#I#J#K#J+a@L#M#N#O#P#Q#R#S#; T# ", " U#V#W#X#R#Y#Z#`# $ $.$+$Z#@$#$$$ ", " ( %$&$*$=$=$-$;$>$,$'$)$!$ ", " ~$E#{$]$^$)$/$($ ", " ", " "}; v_sim-3.7.0/pixmaps/axes-ortho.png0000644000353400050620000000423612215546060014047 00000000000000PNG  IHDRKPQ_sBIT|d pHYstEXtSoftwarewww.inkscape.org<IDATxݜ{E?ۖRh{S ZkmcKRj}P(h$!" ?A(A%A|F`)PӆwmMђbH >?lYoos7g3gΙsfd<@M)׵K@y! @=?i@I%Ly V6\Lu׷?UPD1h"R` TWcUdslhY2Z߀τsI.ۿji2`h>% ~]X aE@Y7gJTBۦa)l?)i^au$ɽ '#3zI$(Y%1,鰶$!7ӰwWHb{oY~^7۹䞬X+ Qdپ<E흶BVJvǑU"c-ɲ X<ly5E2dS,i(0*PtȪS'$膻,ۿ.'}la9,iɷ\H/m+ɒX!~ݮ$X!/(*{F,no?K]IMb 1k]G#uYm^஬mwΒ4 jpMo%NFא%H~`pbeSbŪ KhK0 ^~Ǔ%i GL:,Ic@ U^ǮN(^`JV9$&D=9#5BnǍ,IDΒ*8 6:jdID^`?Wn0:,I 5 ꯭CG끑"۵F1rO#zfvdK NM{Zȉ_TPtt1(3A+wdI#K\;k#"Kt݄zAM[C?VIRz#$ l~4PK.?3Rr ȉOGW݃,b 7nҚB"pGV[$|F5iT "p{dIz? v^i׀gk|EF ^ Dq5;rvnE.qeV> lru, AYۏWY ^ZIݒ>S# HHZPNJ9By.j9F?t]zʒReߪA2 qqY:}D0" %`rzv{%&d۫e l&PyĪ]sVM|7[O* IyXf6I$]i{Oz+z$}D,?I ,#Q8.+Xl i2s~UgyxCǸ?}\\A:~ ,$ }qRۏ^9C|gp<w{Sc(2Jө.O@IJ\ዤM&Em/*j{S`Vҹ;ӎl01>W ވ%I"Ir;3mo]qP ` pY%iQ5UTu͒x 8 V̀P\ <׭jJ UW5 *****m,#ѕmm,'Jh;d4J*hdmhczYU0K+ɒN :I'WJUC4Yl{W5 _2f%i˩qɒ:WX ̖tPٸdBm | *lLnHKZ ܘTm.Ӏ[t%p5 )jI/.՞~BD|+㽧D)''KjOVJEg8b :D*ICIڒ9 0|W(() d{[g%3pSkeRۙP˄4^ gw+L@߸Q1``g|X0=5U `K/%j "$jlWxx%z B t'S:_zŸ>Ka4<[ٕ7kmiۥ[{J"kVT74;RqN#K-G0J]_ V&b>hw IK 1f:Xe=*, lo} xMҲ%@`[5f6l84UR% '6BV@YQzl/t]⢶I5OpJǗp @!%v')y ?eȣ᥆]?}gOw&?v%x23+$^ ,'BA+p㗌I.I_ΘЅJ+ ً#@o}Jt`a@*%e^"lu.!a7㐚I^jLtaSydNMJ̹s .&R3b~(_'\x?fIf" 8$2X!\nY8PB29sҐ.)q[%彲!i+W$xHRyOi ɎƥT̬6N&n"kYyݢ\j<)Wev #!zuC^%zCrF= 5QhfLhNJcᨓh 5\K8P@]k -`iP2aY6izii$lU4iO碚d5n7,IV; IV7u "EIENDB`v_sim-3.7.0/pixmaps/axes-angles.png0000644000353400050620000000435312215546060014165 00000000000000PNG  IHDRKR)sBIT|d pHYs]ztEXtSoftwarewww.inkscape.org<hIDATx{U8B)ĤS.Z܄j4G؅fjJ?n$S95vQ"& bi3ݧʩ<~;v۽̙}﷾wk6y[m* YHz=U`[O1:ZѨc[y# Z@$%]R"|fU Zѳ>JؤOIP$VJC'j$ vmiF_5Lhl(iMo8#Z2hmRMV J6Y)&+d@hmRMV J6Y)&+d@#U!ip?3%pAK)rI%= ޺ֳ~]jۇT$'S@IrcgKNj k08 0po卬`?^R"!ۏWx*6 K%]P$FHh`A^`ЛEul{UA iw"NかGYYj$ %lZ+t:Il?΢\lF`rDEZ^Ns_\ N@YYQ }{( `;p:edQ.WIn["jIz51F lBљ+lo'zHMHz6`8A(#n-ΕtˊdlJFuOhZEDb/EKGjH@n`?Iٳv7\CD~˒"zT0h-Y RkZV٬㶏 mn* I]}h:thGr,0p!&SASV8n!KR0 E w8>̭sA<1!  Nd-55C%i ѽ_q'I.zl- o<+bĬ8'DxV# `ז+آfk)jZgI|<(reMeb1pvIZ/ XK Eק!B&')U L7N` },a8)<7x,>D8Y0dYu2ֳ|4p90>C Y+dJ,tW( ]bBNf 1VXoN? < AҲ~\=_8UҜ:Tʹڈu}|v~{Cأi&@Ov# MNzK}t` 8I1!q3Rԣ+ S~V&]$@B`UN&BJ>Z$\`9s^dVCrrjkHH6&ؾ6g&קp[NuګlDKf*9/>j'fI,7Vm3E[ Wd!ؿZeYhā-:a"*FUFxۈLbzJ:|DjX*ioDN)9|$t 0=P'L{-֍ ;l&\/57}YۓlU$l]BB гY*a$1-PFdte+%ĉ]g6,f*K#=^oJ$IENDB`v_sim-3.7.0/pixmaps/axes-button.png0000644000353400050620000000121012215546061014215 00000000000000PNG  IHDR sBIT|d pHYs<ԃtEXtSoftwarewww.inkscape.org<IDAT(}SAQ4hشk{EJ/fInIox",^IEKibfǿ.:=?{`^<WR $N$;8%b‚q5j^;+14+UIDAT8EKL\e޹wf@c4(MäiUCR5IbE]i@S]h*EѤ%JXԅ4a<{xp̽w!ēmNR`63񸿯epaƋGWl)W B+ Bn'x`ϭ[m|$Rp75 w$R*Em]ETu}>gYw*RJ>v%\rZYy A*axE|E^sc};:wٙolo)~N1ux<g`px,Lm{ҩCCBEu(P]HE!eQkj^_FֶQe "p>F˶70[׮ieȸkp0#%9ҲpIɐXYA\GO>kk9R6(E#@WUPrSS(;095UJ[;FzoU)L1?=͎i"4 w0H^YN!~$ڮlvszq00vX?х)<ҙ @f1Id"AYIɂz0n$ .ǙM1M(,Idpt%VnիWOW`3v KI&[XSU03WQi#˿hj~uVkvxŹy c #D9B9D3", ", c #D9C5D5", "' c #D9D1D7", ") c #D9D5D8", "! c #DA7EC8", "~ c #DA97CC", "{ c #D9AFD1", "] c #D9ACD0", "^ c #D9CAD5", "/ c #D9CDD6", "( c #DA87C9", "_ c #B2B5B9", ": c #8BB2A0", "< c #A7C5B6", "[ c #DA91CB", "} c #47956B", "| c #2F9562", "1 c #46946A", "2 c #3E8B5F", "3 c #725C4D", "4 c #816E62", "5 c #96797C", "6 c #C6BBBD", "7 c #CED1CF", "8 c #9BB0A5", "9 c #83A091", "0 c #ADBCB4", "a c #DA8ECB", "b c #699779", "c c #748771", "d c #C6C2BF", "e c #9F938B", "f c #876B68", "g c #725B4D", "h c #665E4D", "i c #316347", "j c #235F40", "k c #628A76", "l c #7B6759", "m c #CFCCCB", "n c #A4A9A0", "o c #2B5B3E", "p c #215D3D", "q c #9B8A84", "r c #766759", "s c #515642", "t c #D9B2D1", "u c #BD9FAF", "v c #836762", "w c #816460", "x c #695142", "y c #837064", "z c #BDB7B3", "A c #95877D", "B c #654C3C", "C c #C3CBC7", "D c #486E55", "E c #265F40", "F c #43533B", "G c #B4C0BA", "H c #1F5E3E", "I c #3D6F54", "J c #5D8771", "K c #2D6749", "L c #819F90", ".+@#$$%&*=-;->,'", ".)!~-;{#]^'.....", "./(_:<..>'......", ".'[}|1..>'......", ".'[}|234567890..", "..a'nopk..", "..a..qq'{'rs90..", "tt(ttuv>~wx.....", "..a...yzAB>.....", "..a..CDEF.'t....", "..a..GHHI...t...", "..a..CJKL....t'.", "..a...........>'", "..a............>", "..a............."}; v_sim-3.7.0/pixmaps/icone-observe.png0000644000353400050620000000113512215546057014517 00000000000000PNG  IHDRabKGD}D pHYs  tIME7p#IDAT8˥kQ?wӋI[MaC RZ7qPpRuRD*tP*jA ^H&rpIlK,Aӗ~Ia)k-q, r2tPT*e("!=+"U E$\H_MflD>R_ሿP$8 s/?EM:nѶ*<5IO$J4th}YpLD6&C&NyksFv3RPrKh(իyt{x3.àsoYÓŎ׶Mf@O5kNn}Wh$߼E2k07@rw`HҍXȘIENDB`v_sim-3.7.0/pixmaps/logo_petit.png0000644000353400050620000000430212215546061014116 00000000000000PNG  IHDR ˞nsBIT|dtEXtSoftwarewww.inkscape.org<TIDATHk3^u ]`Y]/A()bZ!V1UZkkM*T Ik[k,JS4Z[mmK1qFˢa ̗yO73Bk牴ߨuR2lvKvB}}ȡSq-[~ZB|BB3Ke$22,0⿼/sM rByʕ+I6G=iiݻskۉ|p rwO<-ci]9A\̕r_ 3f,ɩZB!E |5W^x9MzA@yxyu[lyL`NͰm}2b# 0yt>aJ(1a}=" O=E{.>ߺm6&ѕi!.4oXҢΥ.$kdm~!XJE, gy,?7~w\ mO׭3°}LszZkڥ||~SR֚(`3uR"bTk Ǐ"J OtsO>I2N%n!f۪Q7[փ!͆P(lٹ9&ѦmN6=JԄd C^ܱoWbZ^@EAO4񡢈i 2MF|8f (.a`[VnScJ2--~0cTGtكN RJٳQR77#ز};aQ[Sn\OIENDB`v_sim-3.7.0/pixmaps/logo_rectangle.png0000644000353400050620000002076412215546060014746 00000000000000PNG  IHDRdO`sBIT|dtEXtSoftwarewww.inkscape.org< IDATxytŵ?UݳI]dyd}?!`C$cIHBx$ Y$ǖlf1fKpl0`x! oڥiٺ~tX#Ȗ_G^u{ou c ׭[wb 0?#zƘ-Z4 nݺIR{1}e-ڑݗ!dˀ@TV.\P?!=9R )g`Yg^5\"JQRQ,"--O2;|/+Ņ@eT,^eQZR¿{r~Y;:+E\kƠo !ǡuulټW$Sw~ӟ7)r\ Y~=O<\v ֜@QU!Ǐ|4|c>lSNa9%S)x1J)ZW(Cm0v,֯ghT?ѹpB-[vMrD7B.b/[Ɣ;L)f|TBQrd>V_τ *B!sNdT}=of@Ͼ"76bIm ~=2Jp1S, QVoX oJK)<A ZcA+ `0&l|{3Z)@g cm i!5)@kJ~xǎW_<2 5F;3,]ʙ( ԶP@]M5_JZIZ퀔S$-W__%߈o|_}^&SNp<YQg\H{hMHkp=tzPJq 7 jbDyg;DRR Q7iPtP @Q~?uu OM4BA*Mhv8 c \>_=ws/7uH` qFx%Jk|J1wl<}}%%%?:"/|s RRS0ќL2:p"F'6)1(+.3g9yx"1ОekAz:)8(bq&EE9euvOfq fqI1%eL~ԔsqoXiX8&BYh)BPdۜЀ,ގF3H_ZJQI+ ~ˢ0LQUc)lH`GX~9[f CJ_z֚GZm 7@OOONsK/=&:*/rTjEE N3&BkCW\LA ƥRh!ƠAkB (8ѠA BJ.?+ӞϱF5%KXd41a=dl|mג)+C w7GQQ46, ֞% eA e4W9׼[l޾3f=@k,!<7ni~8).cRr뭷iF&}32` jI"'"VTD½$t-~AIc H2{wEA4 %Bɓٽ?{{f_gdo qH)eۨ 57cij`, y0K/=.|0,Bl®9*lˢĶ),4kT !KRhD,XCRhN#R)B5eZi6D{{/3<$qBx"lǠDam3o>MEȍ^dǡԶ1PRR@q 1im9iZI:¦&mߏ  !\G5v2[qJA0H< pU|||T5a(\/5'HcQBM-ZӪ8T7nѴ1#oBRlܴ6RXERBۦжQ:AU<晠)H(M\c(W T)GCa(Dy0HKsU=şq\=5@lD;I+JKJXwx]Ν;v1memذ"ǡ\Jz wRYv0 v>) 6E֌N&ѵk L5!@fPʧ&Օ3P̎S&r[ot2_ î(.,9o^y%R8}c~A^=;"gmc l23+[JJ|>;τ%6Z+!ABu!C 7e پ{w<5w=(7]s ZYqBOYaqR~0 /B^(J$j[*֚T GRI*|>RIE@m$u;v2qF)WIzܸ{rcнqvxn'qzie`iLeY}=vc#!! AHロ20'B~_7{6Z+!%^VF$[nɫΝL,ڴF|tӌºQqG!i>%.!;B{xuG#${{ fr &H ȊQRңRJB`i~{wiyfOe]vs"dseQ)%\(?nZP|8]ٖ OʃJҌN"T**.&9ewb9u,(ŧ/f|mm6/DH_xD:ĉ~p}믳vڑ#R)1P$%tX*(yFw{,0@"9'm8m Adu_() \ϹJ`().{tww+K!w6m@|!T'm LPeQ'q(Ֆ?+ڊt)x=OJ2A)0>B¡ݽW|)/.x&#JH)uuŘ;w.;wYMzYx1weC^We1 8JQ׺2^hN$⎢;B}aYi Iz,, ˶/]z/@(7ִb?_4GR Dp8LO-dz̙3^xad47I!<~D%O!J )\Sˢ [J|`3ى²,s@Jلg;((*-Wڵ̾k.` ϙ) % ܧ|ꩧ8ygŊTTT3RmYsgrJ֮]W_}A{{)4L&]E{ @Ge 7!Dy thڻjn"eÛeQ%D Ai.,rO~!%6OG޽9S]9~(p3NHJ;s^㢋.bÆ ޽+իW3}#ŋYr%_8k@:OdB:T)EχNe,FEW(TSFEK --75Qv ΄l fҁ.=1/kd!%T(xA6PUU /Eioog\2y2~ڌTJlQi24xo/즫c'N\՝4v,~̜81c+TSPQ:;wؘӠN:*dm%Ne` 줴 ˶)b$@9fbhvѺ&U*B !J J&== *-X 0^x,%htpOц  i.+Ο?ݻwqnb^L}:˖-cժUH)='/S$We2sZZ|9cB~RP4%@6 ho ?\S)ǺD&928BYFkv!H;;krfRm۶/|ȺY}ˁCdz!ƍ hL$,(CT8HCS| lolH$hom%퍜{%Db/9IsI5M˸Wx=HDh/% )T*ł ӟ4׈ .`w`AHQqQөh&0 fOx!%Kl;;2I'm݆cة-++n0=H$VZZ%FXd|_\ɿ$)AiTf,"{i!4LIx L c BDq1t={ݹX[8>)4651τS!eeeGQCFIR)ϛٳgaYh`Uin(DN#5x:vСSX(*B++@ @Ν{/BbYT --ϝKRC{y󭭭3f}Yt)o>,QEݞ~g8 ~(\} KJ((.&#-+ )^ګV F$-P`YXJQt( 1BϏ̩O---f K.gd߾}tɰNeYW_}}圓/!#]VVƆ7ޠ{A$%EBЊFx԰KAÅЬ4]FՊkCH,IܞN~yxuVjjjY\\/ĵW_< ךR$,C6pn "*, bZ49Ba v{>!и$]FQfS#hLxDJXDD,㥗^O*~{7[nsS)FKI\ Eed%P&%>@`P14<ޭ5aKxdU B %ڰUVƋ/RWW7^xRmsYg yq+5kXW]&5mhE\+QZ;AJ@]%(Lvsue2֓JZ17PYgƶmLFcc#{aϞ=466}O?  rRqn,;t{{YhhrZ¶\!Rzog1^c޸'#\KR ǻb#L^xQ]3twq\gnI)W]L*nx2yR0ϲ$%$(~a)qrƐ6醃CBPmI[27m**eæMLƉ'8O>ys<uge˖ŕ!bݺu9mۜvY񨽽W<QF0WJFY@$RUn Rhq(śMm3yq\p#:{ncK.T _ r뭷r 7P[[ˁry)ч+VimZk IJKx,|BgizIDATKkZ&n `O30uLַ8s0O|u|e 0Bl\m6kv??n8:::;;ٺu+;w7dݴ57RSDʊ jkk3yS0yT&NȬY>e5eY! r+[q')֯_3ٳgsGpuV8'|r!^ZM ٵk1?3f î]$1?x7&|RNxAנ2<#1_|q$?Zmd0*m!^>3ΰ|u *#z֗ZxK.]u#|g_͎.\3GV2!^6, 'jG\-AF9-sIENDB`v_sim-3.7.0/pixmaps/logo_grey.png0000644000353400050620000002257012215546061013746 00000000000000PNG  IHDR݆bKGD̿ pHYs  tIME U IDATxi\u-==+f4$B$EY,ےEʲ䲒HJJGT>rRqRr"EbWIr-l q H 0{o{w{{{N͠s9\A1=ba{bD,2 OiKA>\=}g/Od.)SQK@'#nIӐ<ο:od:s,z*|ْ'N2=س=3[6f ǖ=ᴣް='[<=j˚.u&[6zfRk<Z2Li{{:,jqmmcxws7}mp\70?eJ;.M0۸~CW*p9/ |jñySؖ_9o(nj.{yѶqpc-ެB OiUSr@9=!?ozFmOvuU*[zG3Gyq״fame%Y`YT|[" e65Hu ]:˓c[ws<DH?u !Y`vQ`bgxj/ml_2fq'*8x 9g8~0KN ~ݢ~G-3n=#y8OYճNbG ."88#}~;dn2 s'PfCH"B<MJ}"u% `$,"g[]}M$ .E2~"WeG q g凜< k- øp@@n42\e_*"HXdX6yӯ@$8EP+Yh0\<\FaC\ϣk]YkDH6c0iٵ,Zw@ka">. iG( D+[rY2W_9pQ q.GI@@^2[-bVuG %EjPXbu7,}uIUL"ZO ;SbȰ~K ,ڿzY=́(}uv2) Q|NMNjKÆ8r:G5hiPĤ2cI .?}9<@'O7Ue2 .d!H"/q:4$X!q8vG1K*ك+QÔ3rތG7[| Cj_M( Js{;kg7,wn C+ q XVi⥃Ϙ\:\#(sBUOʪjJL#tbM޷)qEF%@0 (@;v @$SPĕYV-j?X) e$8Zg%$K|mSHmY!E;+K3E"Y"B_~˜К0Lhnms-by钞s2NY9.  %H Yiq!=ayc=Ji i43z&a8<EeBDT[G,\yRɘDXk=apTVQ2CV6bdX`n}o(} "P7<w s59)+7VnLd % ASlN}Sšϓ:E~jWf6{s!/2B49"Ym #:*'ylᰕg~$G`5ӛ`bBق*urvQUִ JRֶcW7Oq1g%\ @cqRxjmDAJ]G&pikoG[9']ewƤv{KRCLs!\ @bbu>&9 vk!EÝ˒I$@%)D|U943[6X5 BCe*L=][S -EeV)*B\`Z¥ȷ*aT90 ܖn 8jEJߔTE+:̕xGJ2}9Y&y p81E~nȇV@r⨹eИT ֗DHT)@x,rHvQGC¯zD*hT""Bj**Nyv%RЫX봾9i8A:4+1y (* ޴Q]YvxRe=Y" Q'deVQFCC6RO2Vuk7QVx铹t}Fy\--JB0eAo-KL1=e{T4W[>XC7oYOqȒЖQfQ@*R^nb_rH`0R[mBءH%\M cg/8(_R^L}hTsyI}k7D2 N#]Jj0u ͉WP!dǭZ-R*Yŗ   !F)-:db1aB1Oa.Wmi.b&k$7b[#!iժSW.V@US C,]D-`&?҇~CyxRiwic"zK[Bw)a:+1{1РRzj] }R^ȅDR0\ \nIt;!U_e-|4c [f 3&1H[ݶC&%V S5ΦmI-PLl$ü]EJvrH}3򐆥Uy%+z۬p[}V?e#'[읕5'F&aYf{ RV9[Y$U9CQͅtx |#Y K (S 9=RZdr9H0ӛl}idteS9UoYt$ySnj2+-619C8m*EJ1恨Uf}>R14TTR@FdIWBNӰ钛!c/AD$w7)$'dٶ)XwTȰVTdE6rN0nglt٧?Ƈ:1:e;2%;Js,XDwi:F>v$SEl;UF Fʢ~&[ x+z%!"saUx* Il [[7E@R0]S-Fnc6q5)IpX[/ enֵY; l`5XQ^lZ !X34n[P~u+Ȗ(@`<.8b JY9+RK ȔiqIj|KPӗOG !*G3,X mVk )m]:!Lnx9&zCk\P VUQKުG""7p=O ]hzHnʘJv*7lcވ S/SDi ݕLF t\oقZV]|~/r,_j@wP/^RbEM@b>wq( cnh.T @2U)Rϒq嚛LQ(S`#-:]+C}|]|0OpoX\i7D4-A44jl҉ D^"eRՈ]p 37yJdH8RX+:9h?gwu_y! "um$hdѰ!L:s3 F-b=~nTs[ Iz Rw};>+_q!$WW)s:9HD#X7 ׭Haؾܗ1SEԻ-\kEE'u#XBB/㕿ټYX,2߻9 v87[ljv_vx{= @v#Bh ih/!*m[dnj͕?ƭƮ,AYG,/3kx*xuuwT;@E5шd4Tפu7\n"y)(+?$,R|ج{ P]:+"sQ%[ Kn ɒROg$UPGr ɾIZe eNl0J/52#ۏ( W.5hmRRёN+<H N)C[>˽ƩXH5.#Ba@\&ubeDL@`}޲BVYmIzwe‚N-mw-iH.c§I[{LlX>f5%ݜ'VEi^e jul\KR|ພb*K*igNirq %3{xXe8juUm%o"/uI\4@vRѤR7QgˌLG`dnNJv)i yF:Dz4sQ>FWyJs@C'Z=q.E<<$uV|fAR) E3xv`h7d,yw֝ ?d"=< ,!PI~|4EbM6]J _~$ dw(tj?ٗ@Vwe>5m :A% JV[6ٷS-jY=Gbe&ux.rC~&m}mYT69*8J5 qq!'+F:ԙl{ѠE.m*s_fҬwCfqjNAQdƈ{VuJQ7n<AWXb%* SR-}qVWfn:Iv;*8ov#;eILph`"X1s@ '@WXVԩ#UQoVlf)l)_q{ExWY mHPTlkdy\@*8?Jl %T(@_l#(3C:'&0I[}o*qlE,vc\|VW ` d@uZbdj1ޗB|z z84$++qHbt,}Z3THâ:hBnRIH_(S\A]f$T[7%+p,j]frW>cc~cvrJ p;:3y(r-j`G4{C#"Ԩ+6-T,z] LGG9CD uQ'*V X-O)ƆUsxOpVIh:u@PM;cf#(ef8@@zrLVA.6z%⻬RFJꖮrQHrYRݤY\!wE*R0Ϫ.s`<|-YS{7`;܅ ɷhPԹ~]BQu}+d2W 2êeW_[^GvLC9/3G:>ڍ.A6eE]j*'51L`*;,X;㮲ռ@{Y`Ej{lKIR7>Ew b&f0C*,Ll73ړ$!V~³ RqthkIsfکNIλJ X"T>|!uNqyXp0@A@ SM:s@" RaigXc/W2>^7N뱄,3:j tR=;{÷!5Xd S)sYhƞi^H5% WNnA`bXfe깪""{}?f{珙eqFx*R% A8{!4(p#ܳN~7\+dd%7KαUUdD*ȧkŢ@Yittn͟;^q7sۚ׿q\9:$o2j1bF,r1<[(͛$Pz!Pѩ.M%&i+|fH\k~ fRӵXla.7 %^c6>DOYpIORS]GH i89 o=* /L0~mY I޾ZȆyE3HA\C[ 窏Gqdcŵgܨq9^ y/whq g8aye3AefҁRRdF1hr}B*rl(~n6 P#\$PYJ4 dG UTWg_9NG6r%U)x*@SɾP)勬Q~D ~ew8c:!;)tW&16M[V քoPdy|ɯ@Y5wc?Dj v{**ok` J:UPPfKROϞ 0FuF{믨<יeQ8 QE]mEq:3m1@r?k-s3 %$SW[ȥDĵRVY]=ɦ̣rD o3VN~weAPM/W;ƬP<c wDkLqDb.z湱6Kl8xE P*i#<&b!5uo6Ml#>Ǎ0Uzg[ m{>ĊxZ;a92ӡ|+XwzGAEfY6*8D"bc#gXQ{Ϸ-nn0ї. [7>Xf?&?6c&Ϻ-]R=^ϧu,[ƌÉ }ɤ:[*O,^|G6՞v9ͫvGIu[jxy[J_1/O6H^d>yUXhZ|}d!o࿿ͩ+ԪSӟ߷~]=3>;d#́MOKWYcNŮ1Ss|lMK|jj.*ԘzO#ȶf|r* Mk)>cHnh>MG?>WREczswZ;os~<}7=bٲؿo#bYfxMM_q `IENDB`v_sim-3.7.0/pixmaps/observe-bandeau.png0000644000353400050620000007775012215546061015034 00000000000000PNG  IHDR@^5bKGDC pHYs.#.#x?vtIME&!cN1tEXtCommentCration Damien Caliste l'aide du Gimp.]I IDATxydWqs\*k_{Ui b^3of2 3c?#bBI[RZ{WUWWUVev9qoVgxtvVge޺'N7ވ8^Z4x/Y_KI_0u`c^׀^)^2>2'Q^ `e,K/%ȵR6w\Q 9 n?%:TZXpV *+LTG6ܨPZ 7 ВTEE&U V XeEi$LvF L׶*VuEbѴ\kW|bxHa@᫡hdTe2p ]k5~J',D( * CM<`eDr-kDO\`AnU؁蓂,(,PxЈPӸ~98!E6aJpKWC"ut >0W 5v2O9C1) 8'ٱL{ŋ&k*t[A+Oo(U UI,c Qa 7v \h ֙<}|6Ѭ&kE4c68QP8+K L+t#ΈJ_bD&wlMn|}rQ~iZDcU|',,D xMN8Oz @PrP4D*R6S 0 rC.$C!dnY 9? f8-椢ܬYp@tL% Td/Elk Pp؀sB BQxB` xOp1w>-}>jHHR H[ gGrK>sz oit!!S-䠢SYeuY%"O~vK=R6XRX },td@9-T&^O= xHKbl@a%yFT[9 0*g_-Xu3TZǏcYpA&7}@ϢIM0C|,1kC} & !,0Z} <3# &>^CZ/)9&=d^Za6ys٧hUYAE(w- M$:%vyA0#~RPYDIL1n}+l'IhWgA.!z@T̐Qu"*(nx=B\j5z<0Cb(A}$s&p0}/;9A|$ y _%mIlr^_μO*F_֑3 )өh r0!0OXM*Nua妔#ρ|22\I(FjOg$nIِnK%eO)@dU"NU+ aK$*W*l(ˬXd'# 0ihs UXnkYQT#ZM&jX`.MDU1j#$ݑ= @+TG$)Q+W.*ԡIdžB&MXϝ>3+J&)jn;[b~(Ixc0g]G*-՚vyP?q>>l/ ZEHJ9Oѓ ȴ@W>kЭǙ%4 9zy4!tBt"I_}1z UͰ笚#LZZ< r pPs`sRiQ46z =2 ,QW MBI-'\Zi~W=A%N9PF=RLYRxV?^uV423s\@,hɓX (py-R$,~ 77+X 'Q3䐩 g=Eɦ@*Ty% R(b4P>o, D\A9'gݩVu>uxi9#Rnb=-H(u&2<' prYZsT22nƏU.L eVńdYt8ey p}Y9Xes! jsSZII'_@/q3 Ҙ+FtS9pKD9 3OiI#h:&(NTPk#Հ C'}x0'N`3`0CxZ&ŋRI:~`Y7]gy5 }L!吡(E3iiP z:R␍W} TH?!yh"+x248>wu4[^C@hQ"^PXH!([ps 8?nnX0VLs0 TD5ܝ[ɴsۡ.Vy([dZڅ S[ ѯκ~†MЊkE>Mآ @Bd~L8\) Y,?'.vr&TY@ aH'C >M1:rLth(t;-O(ksJN4hP_<9m7iYd8GQ9AELQE$KݐSW8jѭ<ae< ,ք6D#qRk LrYE*ǜJ=Aw*`rSQ9Q52@N8\R/s Q4Y=:6z2h@=})@,- #GQLt/v('S1z%4"Qp*|fHS~Fa@^?4ۀA%5}WdbaR]VhLRSy$I!YQ 2'A #LN/n=y(}^Z#wzȲnvO- 98B?#Fs'e+:xHOfMn(]) GtoWp,~1fȀBk<$<kg8I|bT~Y6yiHkT!U-/b$}"r}*/䄮HZ}V~aJ"_Q9CX馋ňKy Z9;M&* <T 28,0nk(iZڌyXt64}b*B+rr&%3/L=,ߛDP Ƒ nr!yBʼnyIj#;}8vgȞklJ6-/Zѿ4Ia6Ho~\pjŚ>?\w~T>lK/RY\ FnG1E$=C:Da6yɈMpZ3dB)z=ΙSaf#^/Ϣo ­ަ;J9SʱWdh@3Fޣ:рGÀIlYjeNmY[|v `K{nc+woYqbC0>rcH}'~E4S爝Zr WM'D? |,Ԫ怷{tK߫x,x,~A1CV@(I΁&oII<&bI+T@6F:C| g M<}9Eb K5 jubt3`IMnNQ`;w)g0/=c՚T|W*娌%|و+d]i7}rt& ,D57$cL&.R0%k ̟_0;nv[n 4;toQY[ywuՙ=ۗdg]^cWg>rX%N8E;6αə&tԢ {,: UW'd|~{]fHn4g'ؚ߻g+?pXKy .as`o>>tq*y"bϓ(.~ɤTVDE/9 kؒȋָ R-9Xt7~׽岋z ry,@Z4wX l7 cCL Ow?u9`@ Y !hn['XZV?.`=TZ3ZnԵԢτQ99<1m !S*$o5c1ZnYa xF(gNzmP-@='N}l~|b,`UKfj.QWۑ˔ 0hm-ΎzK>g39ctQW{Twt,֢9I M7I:>DB mB䏥uk$6*I3D$5nn! g0=b.#nv9Uc=dZ\clԐ!EF% 8jY( L`Ls`˩uUv|llN2( iQ'FWvUd{[\ȉ L/LQi+b}Fuޚ5G~$46T`V+QN }&R2xxx/"()73Ouj=XMkSw%Knrv4p2"p{+-((Vk~e:2؊5^N(-BS)Īq U%Sz<`Lřdo ,9`;8q6,rL,@xZY'03wܘ#λˎ}>\ 400[mĉc`"*HmۄH#g|Sj%uȺX2eks"usigeZ|ǭٰ.B9fV;; T0zht<9;o?sG8Oz> )O6N\_oeKz=[B#62N5LNB}\5&/ Zӑϭ&:6tjni{MUjVtT]c=݅|9!hR#ãsO]8UJO9izι6w|+>(1nf QmmOTtj.[*|n"􌝮T:&6{lv*yqZm)6S֒q읚.w )NzV.!`v:wN cDq{db%_NewkQuޥskt+lIs779vzL7(YldLlm\""^]j0ZDEQx^SgQFCT# "yFL ukũt'bF\JLEONLv EQ6ύ8oxIEdRQI#=#!0J0Qg|VV[AP̤Mo=,<WQ!Rg ^eン#mZMBXVtwjUUu5u&^6տy@(RΗ4;M3;"崈~Oˁ(rb<9|.7@Zg3aȁ0 Vq0y0 'ǫBqp[~f%+]|Esh;w(ɔ7Ud2J^&:'Wh?yAc$rI3RJ;4~|/G s4=jF0$`&H$|[|)e:kg2ۏMR{bD7%ݤMFP#~m/ 7gs}_@9Sݿtw;FWl:&gh:{.&y^͓,X\a3 ^`ٕ|?s6ل1acкuŊazQGaR"qu= >|?x>֥zMҲowuf6CH@4F@֓R[G&gWA=b?U(F)āZP밑ƊG0uQ''A<ZZW }皯7RZ[V-x7ojd%81 b?3ABƈ%ٶcα1K̻ZE)ocmmKo2Bw8p׼׍m{tlq_a/̭k5gtTgUw[*hfys2S݆ږɩ%SPضs?kߺG/@h,'ZTZҳSͿukWݶk޵d=G/ ctr<nVbN8{Z u Jyfph.`۪c ǒ˖.>xr|E-*Eqx};3a`EI1 .xΡ<}߅UyfͦE=mK#&{=5 + IDAT^[o)+X!6+}M#'*m{p4 ar]ݲ݋#=/ovv'K}x^0+ksFvY-wwO6xᛥɋJ:Z[G -)!y/H.3sx6aB3>?q)d3TRQoo>]*m?79EI}"pz{ '9+W?=♤KOO+^yŘ6V¶BN'>xGW9;_\S[C&[l&S6FD{>_eF7rlljZ> t([۲sx\>rbR\ݭ;892:vu7)'$ H`{b@`HXw} $xAP"wZ扉y`خq5^vCBqʄAMn\) d <=f4$qPm|K4+.^[2w6'0#\9<,ZS)stwѓ {(5nB)"(9N?8K ΦvhHgN8,i1qYH/.VTGgױKW{ .p(q"NЃ4dK1|Bpq:NgHYxê2Cc\&2pb@q33HkJЩViý;rw-'r̍\pFIp`&`zb:S=;l찱KnCUWwhd5F@:ƶ=ڔ|Deä!ƠmiǮ'םFv.WW3ؿRmpMŒhAhlMjYi8G PJeKzK 9e^O-5km+Gu~+F3? nXcUM"M_!hW xwϥw{?/bk+NNjPZ{w*d>&z<9:{?:d'U H. *IUQUaPvkԫz卵9r?6xgs0oؚ# =Hq'&Y2׶PU_֫.&Y |?@Tcv3{kt|Oew+uy֎U{/PΈZ`Eb?jLD'ګW~أŝ0}-dٞyyE/Y1?3~z:kq6*ft $ fez"F>Q*+o}ro ہ iM wbG{e:ב sPC oZdq{#GGd[ZdZ,+`~>FxF^9>>4ykݳ@BWf Tۿ.哩欋)=eodw+>'[pfz{t'n.%mcE|+Ao[;:U&`3x.}Z&kZF@=+؜` xBO`r4sͪ#ľļ?s")dN|)}o{[|JC|%'T.z*iԮ~dCXo qX7^z<B{^# cQ u1Sd&MXdPIqjET Q%VY3q}>~`-×w^y16mD68:Yx~' oF\_[o>xW?;^j(J|Z{I-j*E) K8*V8U㬋չȳq-BAQOP6m].r<?5xTl{вzl:vu˞>g+N9{=`٪_ *Og]r >koz{J!Ӊ@>4.ZMJj$/$tZߓJF)z^ds0C09碒::73t+^փ͛m_zx*:8^0ؘ9H+d<`ߩ&5FAn$uA:U5gvܸIq@ﰱn52Cg W?ቮSS=/9&zݫ?޽{IfW-ׅ13&D -W^ۣ쪑U:6U.cqNDDz6oι&xF1xI1!LZ痭պRv*eȨmY@x{{8y~Ĭ R:k,3 @!T9%O"{+ppJ "υ3" 厗Ks *F4Jrd+<~s!k9n1=-w ac.P!HC9VlR4UZcNן}y3^O`t#luܴbDl2WX15ů(i%WO{ңe-9u;?q%i|{Vy .ejԣss؃ ~x^,irÝ90{ ^3)iZ#p^V==jl&,he[<$DU"c> ݣ{ٖSЈA+qҽۮvʅn7B ;;^(ptLGϪS:?'XO~j 椧 NX953ZM**M4j!WW4ɞ uu;̻`ǥo$lXoM*w(aB3)4}Tz&-6⥲qjWdsF>iW wΕOZ}6vO>0'>T%ŕZyyMD*Ǐ>=c޶ΫC1y$z&Fq/(UY^ 1+c;`[ju_׳mov֦&̔6 i9we;ߙR0;P@+l0sjs]mo{0ѹ#7@ٶ񳇾_hxB-bgE1&,d{'{]|emz $y4<4pW޴_hSF~xơ.fy}|w:ԩD\s?|qO~3kHDeW)0AjWȘ]yu8Kxb] ۲ #O;/fi@C6BG7ɽǟMHAqy^v>ʁ=⋗w/"AA7qm9g?>ekOMCٓcih=_gqoؑ#zڲDQ~a/Y>2>]Gg^tIHj\xŠS{\-L&lm(z"bMyԙ֙7_YRۮkm_sUW*[Zur>;`!+qO\?3+uc5acu.q 7F/Vg7߷XcW,,|)լDsϻ=/UT.5kN*bf`N_/8Ug16_"Z׮ _`g;z-|Ŗc@gLMU5Fȩu5}٩kV,j;M_U/CNseXǿA&[SFE_#ƗŲ z[+\0HYɼdpiQի޶<ȿ[;,::._梹K?| }bs"H+ǧc̯V/[dk]$5+{M)}{_+W~p.˗oyjVvtFaM1㇏,ynKUW ^Rlw ԱG|2& 6~}R?qDJ_2DQOAPDZӕIqc`GG9V<]'Ԟ9W@<" ^eͭK /5h9P FuXW 1ygne$}kXXTT:S(@G_̦ծL\׳eZJ0,9])w'qRFVz6( jy9t2W ztX-JC~WVX)cʁ{O&Z}PZlEfիoƪ\gͥkV/KrqBC~6j~u,˱z75ݝfʥ\.W r{*0t*UsRZ:.=,_}J[|P"1/ LUxVP(U}d9@:0ToWnLX^ؾvO͒]{mE'/8w#f9!Ճ'bx)\j[%Sݹ\~ NfRP__t2o:f,V.\8j-^&v&Ym  jX8NzZa03R;.; zryC`:]VXVJ#r l>o8(Kǩ`XKIKx2RzQgqlZ!cn9+'䡍6a_hK֮pUttt ։fCunmȒ.~qRV C D-Q тuS v`|Xr eKyzOE7fyRq {=%E; ʈ,+=́C3UQ5{s5_ Mp.߫ ȅjQO`PA F$  j:s7sX,OPǧ\ .rHHtηc/L+^0Afy}+״࡟IT5%P8 dTT c<៑c1Fn8.]{`½cJ̢g/ibkњkX\(xa>[L8BcP8"e$dPF;aU[3FESm Ǐ}ⵖH܀Fi,WTyu|MGYͰij z뙪Ox2p*?/aBV| Nu0M#gFGE~p-f" "|g ٥!fnnC`,e>4!V(!cZEK!SmHvv7*Z 1|E \ & D :%)rC5a)љ^j] :@k sO*kj|- IDATRz(CcDh-0׾fUtS- a,BPڻOlxU Z<{#䀄#+MA݁rjݶƴ6C^"Lݼa׮GJrEgݰn^HrXv),A0a5ƛy%ACǫ Pn YCZJ]S 45KPS"8גON.*ADjh4u"CTA8[L1B{]A4Fna~v@x+mA57WU )3JuNjԪc,ZzQNMMRHŚXPDґb2DX#zpՒOr(vbrsMQw{O>o :fW_bj%^ /<Ӂ-=+D$WJqb~ilS213J8B$t?42y뷔>g7< 2{B-~B),^#tۜÄD|bmL1*\X8@2 :7RZ6{$~D(/_8Z[Is5GjcJ?SZWŘX)>Jddž>UVBr66,Y?E*&g8s )s!AϽpβn7%veJS"wfzgNc¤"t £LQza-z: u[_! ڌuH`a'wj>yXr'VRQXRp_Wkp[w~q)0_-dGw+P ') `NS)Qw @p?(T7m_VшNN|)CU>Mr!+_orqO MN!h]<茽2Y0풦4Zevo|χZC}u~}*FV*$L (O'r[t+ DY.YfӪJwpm@5Z*2l[ﳾОF[',1 TXߘSΌaYtkqi [^cc{%m~!PC:\e ^~9]ݛI9C¢QΰD3RmhA*@@ buY?otOK9_,4Qlg^xiUozz0K,'QȌӽaCt֭D&p0pU ڝv(t+$.K鱥R+0WWY>o(lpH'B%LPVWFiD熯skO!:vO)JSf AOȳAUKc3Dz4 /f U82d$#BWW(ZkP[uO QQYv²4͌0T&y)[r~W'm849$-H;BtBk-B KOD*Bqu|Ƕjf.ٮOoVEl'[6acVJiF*њWeZ# ڌ1[ZǴ`]\~48gO_SI%oAׁ*ecaf(/ ӌHEg#s 0xc=s?ho)To!vd Bu.fJG,!F!r# E{CMHr~Xw}| n)h,ϯ? X=g%~)a[B\; ڰ$ A7tVi5UNt?p&`gFLtaEr?. i~?C_̘hzʚފ&W rV G5'Ε#!ذ}#۟o8Z(G=B5&q5%Blr2\ּIkV$0cM} =gѿaW*Q}dࡂ㷼6>#(,GN4#a|F^5m @6 sa6`Қ(i&NPǠaaXE8AevbaR~IfOME9w\s:FKLϴ%ý-v܈+5aQx^8#1jAHIM_% Ji qp.GIƧM) ł3bc,|?q7ҕ}/o^Jw''ڱJMƘK3㓪)D6>Ǖn^t*fv R:Us+xh,䦆qa,cW^9 Pd5XgK㇈QUZ+CgB'PG'If[#0/Ege-јoX!,n 43ɒŶ1^8W͹\@_KaVB{>P7&֠化jz@Epjc2R Tj.p+1_(z&i*G񼱐?Ws4!9λ{m6lgp(H=hs_pϙأeoJ_% _%C5IUjafy%U+'SwR su w .$ݔ'(# pىΩKEGcQ61#H)UR*Yyjq#ޑXc΀1s(Tw^xsSN0rMqe?T-0Z#MPsy4EWRɥ:;E|zˆ{<2yBk3kG|S` &%53:59?ҔU]F`5MeRE, ]A*iT<Խs5 ˧CϭeX/{|b1`ačrY{-5YN(z J3̰n` A6V2ZBi~mr`uϔdpNO}!~˘سi?qz?-wLL\|h\ XVXCsrJ3#T-m9JE#,t=wFBr- | |Rjjw+tw2i&-rYLcu([=0yh)B%:YBhҠ ]u0K|I&gqقSXV_Jk66n xɁjlzjOwx|*  ։l"ٖ(NM3e&TjĔ?s}RP0+5VkVRz$|5/`hZu d9Vƴ!l :m6G&RRP`\tɕ@ό.H\-!"c}Pcgz{َtHVpBFv%86y[%a2)?Vl J6l|E?:H$ɋR.7<"q&>Iuc{"{@G}yNMXl6sD;eSće'ꤗNΒ尜_nKOI((Lj,̦]'Iߵh2_ ^bwс L>T,YW+bP6&A><&%>URx\Q|i5M+Ƨ7m2[7JY<j3U^qSYuZ6]$BE嚊ٟ|׾b 4DB poM̈́N[.' tʧE5lKD E7\{e6#M#$xxԻݠ.yo XupBo e{oko'OO|Dk:Tq!Wq x\ n2|!bcE`ѭShGH}:I 92"f ^a$XED} RffT;kvf`_x~?wL7/,)k >l ԡ||yۚa8-?tz {p4ilb׽,z/ fIjru-#[FH <"U7L-SvOޔ2iX"A'Ȉ[_-8X'5K?:dXF=/!86"X 9J~0\x!JM.Y>L:Lj )SRb ~L5*S![=O/֛.K)[,Nsׯ>YKܚwϭY)5giLo ij`*Jrsn1ϐE*h !5[!nXfK||+cZL@{f MbTv 'Z@c? S ftg.Qox.fF*5T`Ȋ9:Ko#p3L_|Uo۴`c-{g VgY0/)R1gzY?shc0rS#iȪ18ZFnBiWΒ`K fM+ڲB @2*ܮ. +l|qٜ@Ӟ~ Z 6QT%d7&[T+pk^j.:Jsd(?)09ܑU%N(D\VOq?}kiVXe!lCj/n bZ]a4+6P(|Dif)v(0MUD|́Ǣ|+@atsD'OT$}l"iPTJywkLI(ucN#9"f$>팑a]?o_@dFĔUF4h4YO] a!)- rS1F(ݔI]wUFC۠JNȮwE3+:@uӤ]\%5ٲ&0XqVJtާ_#LtOFG`ߜ+zK|-#zP ';O!dDFy=ǹl[laf t@~ ?ZG#Q)`Dk&_e* ?>:|$7 Hzdly\1IDATK+xk4XB -u睿 >rsq tV %F⺄ŏ*i"r<;[13aŗiUIxc\1a!H^G[#j|:n19#9Y\m1.4 N=pe}.>yNF~8y^=/o/p5KiqyI|Dm c y𱾁yk`9ÃuZwt2H7{d̰zg^ &.?mf6=2߫3I`j&ޠ-Cs^7Y{0vR> "c]пz\,5I}w-y08s+&׽tj?~gW??NBڍ l 4 ~>{k* @4;M9'i& mg}ՙaZfƲc9/~~sIeVqV`[V/ ;hČs22m[iZB-B xm;H3:Bs8M؛uݕbOw=}iv,u'd(LS+'SL{,bߎ]?-;NV2Rte,h>G±ےeג\v(i "etPIfɠGY"Hګp|fRʏQ{Y5NkNFF`Q /tf*Rfo]5K~0k=Exi R(UONn.Gh,n+4(t|7 Y6}I17].ÊtZl.B*[58mxRL4SUkN"Vєϧ %X&MV/凔mRn,'KN1Sltgj]{ז*|pz@$]kza3|;v$V`6Xf{[ --l3@(45K# #g7Za Ep;ɝ+>1u8ۛ'tc93Pmk{os "ifA*0SçsͬűmJyIDH\eȢHfk+QtdM$ >B607p,Qŷ=24l+ð3V':|''@0uA7ˆVT}Jц:59YEGv-PD (.qF*+<^m-s_Qe3R*9LaVPGi<^O-uB^ ݈W5-)&Z(3_QBKjdZPcOXgf~vuU9 o.ŲRV* L͢+_{v[&ᇪE2qhjU]H2HQ&Z@ 4,j7\x79385}x+_Hif0Qa8^Km`KKES eIwCgT=|eA? 30gulZh@#@v1sl0Ȕ$ؼv}#~F_r),s'z4Uϖ\7KRHy>Mף`>9ADogsxn!f8ON9efLi5^ClYRQV-"gS,WSI^!f؎-鸨[ %_j8fk[' yK9cEBv;(hEe|kmWh7|ssr5N] Sdʐ-Yj5: \s| ȵ ޲y'kS Aoyթ2*gӊzI ϓ?We1rZ/$Q$\>hRNC`"t((g VG)&Ʃ |K[Z+5Ba9"0~̇jJSy#a"ixkRC)]U c5Z( aCdW:Vf3`C0E&};\꯴Nao}mWꇾ2uS׼f$>gI+Q<ӅoQJ7$r(t6C_!)%)18>W S;(3+s%g\p=V#*q!yJ-83M8[?H,6]+1ۮE;-zy0ID9Yy]DƈJWڋ|UTGʕ 8^A_*8plqL·hi-Ew7{(wZ%^3MfVg^ՅWuޮ<Nz^mbΑϏK.rڂe6<|m9B{FsmV'[KB X>1z [uHyNg_&Ze ioH S`.4Z3=*4̓Q2VCVY]/|̒33[(rӤ2c 5e.beG6\v&+]}j}qޱP"M@r Xv7`O^swT} pkyJ՝[Y8s-GM(Heq҃pxF g ^7O\9HbgC JYaۙ0:AV _Je؛ф2jgVݕTDXm eϾbοɑm$&haQ35B H') d+X}cg0@56+38n3m2{ y%\.M"!?#b&HC4$hWxN<@dux~MbHx Z#s|w )ɂʁ>;'5c 2ȑ:o`{*a:@OEnȈQF#LCh-8n%QP UAfY `!OW|R)_NnSddL ɑC3 &0A ,0?!0ϦOh[NM6:A)::kplc/<}9p#؛4ej0#>92;Fw~{Ezf@ZC-!"#$`mHy7 ؿ2Zs5_ɊfKh[jf)ƫ]Ah\ @K  BlW\:=jZL@SӠE-%M?/߻㻳.+%19#A-zJPՙ>~ˀ͝nr4Kp5Hdg^6Gaӟgk)("v΄Vތ-pnמE,2U8ֲkmxw_"FbOivzӰ1M; D}yhq቟P$zcLerչP#Ye V\p Eq5ed]#7h00 !P"\ 0NALNxzƓ"܋A ϟB ZaB&8da} ά"ZGEٟX7_ hєiݢx<Sn\3Z5%È޳c;F?K[5;qwUd|A"kI p 0ː B0yWcƒ}3|4Bݣ+&h[#Ph+ g|!y?=Y&Y,PH7`#[|** ҚzJ#8 :i0V]V$>X BQA3˰ >eϿ|se ٞ4^U&.ٶE$Ek~`2iHN=hu947j{!t9k uyWs#xVV*idžW m_U$,'{9o]&P}E cnXX{Sqp:S,vzBO1s­W'zf%MڏrҼ?a2G䎋`w>&/.m)47cՂj:*Wr?0SH%k[/?x %Z}/>})RlDiPډ.!M @E@<%m4~x;{{,N3l]}v-#Z!s|[~ 2@>Z OOO3 _cyCHj2p6wkk{EP7m[UpxҒl$NƲ9_?s $r>R!u> ^qz=I P"Hjژ-6qtG [FzE!EsnRݸ5LʮCc̞$qrXvβ\`Y b3nO|)ߩ*D=l/iL?)`9͵:T-KID܊~n/'}˅MŲs y`ކU+\\ ٕA653۷@?8X'u#}3{ET.< !.{L_࢛GeiPϻجSTy\ore_~r}s5Spf]J]q`s,{Ez#2zQO徶("XФEA>XA|IZq(>.(h H &kn6f^f&;l>> ˲.̜9s_ivwYk4*Hɽ}(^86fxiX+*A_W%GJ%B}ڒwc%PBǺ}~tQ7mc ¥󷋝Dwzlk8DFI$e [daXF0Cy]3&omNQ ]iMI ip,GI9`uZcx&ߏ-C_ٿCj͡=c*3a/&~1zF&{wa;/?9νox]<.^[2QF&fG)H |*‰.{8p"a  ?zz-]8k ERGsGȘ=0J푚r@еiƼf՘Ґ$p Io9iD~0޲7z( yF {`QbiDKJ k-Bvqv{GR*NfG+pl &DYs.L'ɶtJ0͐;L\j[(x\m"rur73je0&I(+J/'ׅ90 Z9a,#ssks4MJw,S[2{^ 4mZ,rگdMS^)`URe07W4"S1`M^ܸ^!,O{6k E}U#5!`MxfRNZ&2XQ3L<;6߂X(-=I nl7aT}D:ČKgY\͓iΑJ0VN+ G,@U=M{  &b)P~\qBeKR4$Ϻ 3_Or#2-:8!-v5gcI*պJa,PMSAn! EIENDB`v_sim-3.7.0/pixmaps/save-bandeau.png0000644000353400050620000005204312215546061014311 00000000000000PNG  IHDR@FYHbKGD pHYsutIME(4< IDATx}wxVE33@ !** ZW]qwm+kW\( "RR $!y{=eGH!~Ϲs9̹3[-~Ko[-&cL6B3܉!O{X|XmZ`Z'@]qK.0&Q0Ç m׆ucXkxm30c u<.ph:&c,5(-5Qei4B2޽z#E1]3BEW^`t`tYΤ$3w_C3M;.z-ĄdFzǞ`S6c)enW,#A-zMpq(6y8:yq x9v"˗/'._"$''[d[z5޿po1crJrW^`aɅY:J!8N=wtC8 Tk s8: ;½|X9P߂xspK|@ 8: 69!Ǡи~C4糳`0ѣiW6 q0qqqFsrr( .R`h-|M)S'2CrrYܦ^5&@U5-Xn Ng1Ç={kE=C01V1x rFs) l q)I뉍< h O'6p=7޿?2]9sX4 vmɓ'z7gɺ? 馛{JKTo޳gv ]T:= `={”4{l _jqycRGg2NKOF=|@hRC'&x[4ix⚮&P=0N!fpZj8M٨*<`.#$ :86;pd~GK>=Ѩmh{h@Rn믿^Ɖsp8Si<&ַ!tZۆuA6DF'kta5'x"umג$]vqIFn78RRRE op-{NٳM}#ט&t>h877WڌQJٳgǎ~v٨SS>;bۖ]sA?nn;*D"O'\_7!6"{H΅O)SsM;#G>hg}v9mnEL&StڴiZ|OƳT :0\;ُ^ hݺu_^:L9L+ĨB?~8[{,a7t0w–-[Q?!隠y.\tMf{[SGTeXǑM.ve7԰`mPf]pf$KWse46y,t7:yH]]ڳsz. Zo}JB*;.6s8q&u鋗%?J]|6 D d8Eґ bBapGXnc6gJDEk֬1͝;CCCܹsϟ??=-)N3s}wfFT֨ѩfi[xƲe,<O[ZZn۵`a-f#V9shzÞ*I&'NZtc,رc† Lmh+_8_~rɖpM/ڦ۴H7`АСC#.,_r-~AݏE 猱Z'TЭ]ij ?\e`+*:K"ϰs:Vruɞ͛7`s1 'N7o^<&>{QGOu#aW7*=zsnx,̿nj9iy>xҍXs*u\`0uu [7o4mپ G Yغyiۮ@Xn9Bd5}Ĭ e<;S^qyt%>ށ=W7e[]LŽc+ҕ[oƁݼ90º_;ܹOe3ê** ~xgܞ&ȵ]wsjD==&fݯƌM jaܩ>_loKԖw_K^M'Yk||r5Yiו82VGTₜiST<ʹ %j/ Q!LYRt6\%S,Vz%J( eJ+!*䚕d,/$p&uFMnpbo!GuO0)`k 3%xxQ/h䙮#[E?dy9Bl<[&R!f 0q+9xc_sbE;gݕׯ_$&&DIJT$*K~f>WW޹+--5}qq_~{[5qDSył'{]_۰P1w=rusZq}Z8%mӧG_&կ(/k}M <;,X  ֮]{˖-I[lIr:?]T󵙺2g_}C4}Ւ)v 3OԮomK.#Ӊ&MnrJǬYj5[.]*ٚ3:jsсX'_|n*f-J yѾb%Y"ı.\<E{afgZU%voy'/ej4h?:ʃ~_>g`u[ŷ=>]W;Lnȏ?8[#a4㳝\(!-LyskO[c a.?ac<>־^(pQ`ނ@ pʂKKy?Rq&^յ / k$1@]iپtk41=/?~硘p֐LZ/o7!;7kVia g'Z-jIEK}W 4W+-K-n sS.$J巗|9grACVb/j%rC_cN!j|YsIg7򎱬ȥWL 7-ׇ_I)/-.IoG<2cz6*8gy'Q3RENu9Rh|S)8{c@|\ p-q 1 `tC>s'sn4I#h&2XPXCooINu1g8%݂hm-R'($.Pָ@z!-ɑ} ަcz Bޮ;?V,Mc@͢>N9"EvXO txӆF_(kx}l#W_h(v-X;QD}8HջWqng@芹 B0w޵a-~lt$*.[gN/eW>:{Iy vYz,i<~_~&'L \3:ᨫX37D9KzoW̽bx~@ΪJN3h{|Ck^qǓڭijEc3:PڙR[gID-z@LPTC=~+)8ҹvshI_V_f?~7~7~7~5`u53,2_-zR@Go%x׿9@;r|wYYd4/ +Hg [\1B._sxE>tO)Q>\vM^c>ؒ Y-Iavޚ ય@Ct"OZyo`.>ө#B8hk6^}yym44r6Hܶ䦆zKxDQ ( 꼊2~cHZ k޽zuqk'"&x߉dЉ@5t[tG[mp0H5Ҷ^ooеP V4$'&;.QE^c/EA6kouB Ɣ8#:ޒ=_x&#\pExۺB `Q0^0qܘ[d kܺ>Z #|U>هnZ琈c yJO\Ff{o~ <ͽò TN߿ӥ%Op5խs[8|2cm|:zc"+Bmt_/Y+/y烁8)sߵ#ۍ:ͮ fU(6>7eDi?r<׿8<\gtnᨺ7Wn2wK3ou;_\擿#QE0]/?.wo?MJdυTCx`QCanԊ^~?<랿g'bR@|v.!H² T6v6*Ȫ#c@h[gi# 3/BjӺڈnфr,.Bݳ-#]7<Ƥ3:'r0EۣYev?Y- y;֬諿a}Skrs蛫&x+G$a:aֈk ~g>ܳ~w>u(_|"/(q:(F^R, IDATpѷʾ.yg_yp0Q%j1Jh승W 3Q%U3F;~\veqZ7:X[޶ns^ t͍8Ά7.:`tgêPM%@52d`Y inn69N4DE=)AӁ  16Km+0 8!\ cXS! @Q5qTU'R `B(0dK|D 0(2qTbVN\:s=@(ӻildABQf0k3W jvZW^{dsS'mFn=qc1FNe`Czok3|Yie"T` i`afoA1H[ץ'HcqSV˺S3s.T`}?g!*@N@dg3pFȹz{ wu h? @ yT 'IWښ^Wtfsw^b9ζOw q=kLc{No'SއF-H_~x~k8ep8=6J{=a{Z !BQ?`9f3@VT (% ,PV#'XNT`!``AY9R3A,VFP91<L@Rr/0 Ѕwkl1]%:`8 (4: 2#A;B-dM_EU^-o?zVDwl6-nWQ(?VaJi(r%sȡT:Z~\45d.OMaq>`4Tx8."¢#1LM[汙 :RXW1ts#3":5ȴ&*YDC:(eXb_<¦-Gn< cò)_nEĬQy|'X-oDc`6hAX*sX[GDO$(e S;40NzC~I|]?^eawMB^'Xo^IA$%V=SN"&sб}pmZ#W C|@t1QYY뫬mAʁZo@a`ʌ#Ҡ6|# wd>g7XE $ԫ|A;ת6frMsiMB6l:!& Ǎc/ &Nrdgv0UP\L,2ֲۘ WW&J 'A]maSmX2C` L:bMtҘ&ƥ P5 uN~L'< e@+P"N~ga$Q6zHo?@1--5Y\NzrdBvvpiU9rI}Fr㬡.iU`f'M2@r8-v!Ƽ^ p@cWLR뚣ql\btl[q5WC{Ԩ (5d^`ɤo%@&+@4Ev&c`Qi0ϝ`@S4 h1D~Y4 c@@U (UU`0PUh( =Qxt;icQJF($B-D I j4BB.d=^H'{<ǧ4$BdD4c$t5%TDAtzH#TSI$P5JԨL $%$nSn9"pou~S13N4ᎱH44Y0S(!F`O(@ i'DU <~/t:a4?PP`@J%,, XF1A4 "(? /1QP +(xI?6n̿&٤*C0fNk 7 ɅFxݏ♻YrEDn:?&GUabswri}bn,M2v;3֦0Ƹ}RϬw2 1Έz1%$UM`ChZ2l07Asarno<`XFT[\xUU% xN8`׹[IGvU#f _2ԭm qp'E9pD45d) r푦F24S`O/}w2N8Puori(=9A1u `>ʪItӮp$dfTg7?#6Cj~*ˏ5Rё%KZ`ɝBE`< dYi 4*$ă/A?&(X b[`` +*DUR` ZGNdR 1~(蝘a9ӗQhl Bu~#%MпOhUN=;^|XFVd2Go3T!' Ty *`5.J7} B+0HDTU[I!.pj^$Ћ頡%q B,&xLi !dUp6uM~Hp9&]k$u% TNI0F!-vVZKU1M84a`yY p̐M3? B 6A0$CbX^0 Vu Y@0tPϞXxqsCi(1 fLp3(,vB< ]uI lR0@STA``4"TJ) ԳPP֘y j*/׽;w " \e߾0낉x'Z.8j M>&1v8ģ0G:?r=O>URٍs/qqʟ_x3.Z*GMٓ=no\аG348#Lj}'Dhʻ=ȧ9}]7>rgo9ᅯlJ?4]/Ns][.sl)'&l)LNd92G<5wvv_3ۚo|Sp$>|ĝ&B55ܷ^s^ϔ:,yP2IDvjqYuJhleJklgڂ0A&YZx>ĸ4ؿ}?:rbv_D$MGpi:*ʌ鶮S&z If*8`_WPv RxpKB+V-=S~(bdNtx=Љ]IVE-͵>{x[Ǣߋ9#ھ& 䍙៓#[*GHOՆ ؒw^Lto!.mo|ܬH=e'ǬKwjK;3zS؟xZ[Oe!cDž[?|B9&m杆ϾYon+{ˆ!gMI6vtxVÿ?JF3vdG_.3#`_~&}Ӊw?eL8 &~}="&'_WƐAEQu}W伡jWa OTJ}Za"cS_ ?>o(U |a#$w=3&{ |ΰ8-/,S$ii12A j4ë``ñ^o4@uM=Ǥ60'= Hii i)iQ*5pj81=#($XP͠"!8.+,ֻC1wtW5@ce- 𢕇ti&%6">@#: ig 9J QFɑ@<"2[[6%l1h -6Cl1czOe 헛65Ya=C:5-MnkTTB lWEsMklR I!ga;T868/gUHL`'Jja, 4Fd@+p l|wVF*uya{M̳8.jƆSrzCq"I1]Wg@O _j/@_MēOCw7g@T0(7kVH`>^]͏][37nضr֑,!֮onR^ßo>.㯾+sΐcx] 8%+M9"@Ҍ+Bw'uKEG΀Fr0ɒ|XڷBG=q(9&sݜrIԶxu)V:rp]!0rQdE>00"D{m6ǭWl2 (;985Ҹz%h3#UC%';H0S_ݞA&޼uݾ>ЌY!LFpYQir)2),n MI;K*Ę$'D5"Y` &n:CˎKArԄhD1I *ězH`187!ZTX"4T_92x¨``n3"*ALN;x8l׮]m\@Ӵx> \.+AK*M`@zl+(AoJO&䥟JU # @(X "SP㘡I mg!J1ۗ$SM;n˩Qhj0ҋ8LkO6 @2SXe&Ðxp*0vSB`7o&N˧j"<#̌'OaCdhƯK( 9FF8\億X;PE#Ab\, uNJ^`HVJ[⬭r\mMכL F _;! eEGsc͵> >2|y\3 }5[ԬyvɵƏuMI2#6Ω:oluFb[⾹ﺹٷ}LVce\jH8mVf7e{]_rK/{'-E# )c˥#3#8~=6C#t%;ۑM/mkcݽY7NN~BCO| A-a=7(&A09*(ҵm0@)6SVH-Hu4M8Np'DXyJzqbMI@AcLQ^^E`i BR8AP4.]@~j[xmv[tG\0.jy[D0,b xȚFqۛZ;% $e.W<lj02l<8l XVG6 <6DEUSL< "a$$Y3 @JH,MBMϯ68ۓ-X\&زb5L}cn=W))"GA_.[5lcML'>7:frnvD"6l8bGOVb"i}|qgǍVW 5>B0+-EMARt0̐B V(5SxR<dñ$4EoCN$IPeR< $ `nCס* *ISXrL3Pe &>4 h 0ta$!ɺ*J09HcHb4 'Sf瑊AP$UVA0Ȓ 1)PR3I*퀪BSt5()$HB )-Zۑ X MQʘ>el$Ibh & )0< %M!&EhCW(-ডiHE`mv $CbhC@qքT$j"0t) 3GH)9`B orK+qI*A$(2$ޖf~V3ӫ CHękFOͻe|?æsͭڲnu⨫:i|'dz}6mϾ}1j-NCS' ȾΤ'[SqԷF%-sG,Pk}/]% zj oow'ϲGN2-3}2cB])Y..i˗R d6sq*4s|w'hS p>pS)Wmecubn=pmJM(*~]T3U Kivv5NOYgV|^egΘ6)6u䉳繿O) gzC)\|tkZ58l&$N C+ ` [&I;qzp*).zUÜ9sK#O}4#   2:p F?_m:d:k1T%I6;faS4ylqi8uZiMU;>uGR Nl[u*?7V@Evؙĵ%$A{%0tbuf7$>j60t@$#(ZKi ܞͅR H E.wL0/1lHb6Pu^s+shhwyrOCסj 1ؕ&lrphpia2蔑`^kC[C\vQ:I/#BqPsqnuIs@ݙKz`Q?D`  sx{u$A`OyJϭ%E(R7=Yj&-[ ҋ r)c&]TϯLFIѠ%DbzaX^2]y}:7Ň[Ϸek't:XefCPxW@//VkG` xϏMX&[w՟_x _wVR>8dn5־ޓKϱ{gt1R__a]:1[cĪ#ͯl)l}ޝdغ3l2 ܰѵPZ|IWKHn)HRu<۫TFǟyk"_\ Yr1?8{yD=P):f*4Jǥf &ϧO-/a=zh?J2.-IENDB`v_sim-3.7.0/pixmaps/stock-atomic.png0000644000353400050620000000142712215546057014360 00000000000000PNG  IHDRabKGD pHYs  tIME 1tEXtCommentCration Damien Caliste l'aide du Gimp.]IgIDAT8˥kTW73I&qSX`YELeZFMw"1H0N'Λ}tabv#p=?CQ)cb++Ɨi7Oj*c5;Բ{dkڗWGזi]Ӛ3i7qh#H-}HwY8_̀e*]AbQzy;_Ae?Ƹ T=1:B舕8hSN!6sXPs(cA(8p>YOL[~0.P0|TG!{p8t^63I&ɽׇHa;s߁xAp4&~~+  4T"j+wRٯ)K]m*!a% AEQXw(79.WY8~0LQ`#(˲Tjo\X/??CVY׀ӀVH%툰z!Ŀ,]ΉYL>C_@<,D륅il6i\=ǔ^x rs{ SH]q?t鉉%UUFFr <$P "6@Xyu(s7ޞe@qA{e[oVj .A2 (`%dO.'f-SfQ]&ߣ7A,B" ok `y:MZG81&aV.-/d0zC ڄo%Q'q!lzfFuztL6E{bdq+:[[2-rnn_`2`1>..;)XR'i~Gu ՍD=yr#a;qeLS^lm 9X*Koq.^{nk6oW)0`$Z-Lf}Hf}Ҁ6 ѸCxE C0밶Va}$!3:Cn#XXP()Q(#˥V 2=N8?O2MxIENDB`v_sim-3.7.0/pixmaps/stock-geometry_20.png0000644000353400050620000000172212215546060015230 00000000000000PNG  IHDR sRGBbKGD pHYs  tIME .>0tEXtCommentCreated with The GIMPd%n)IDAT8˭mhSW^5ִ6Z&mRŶT* ,H'EEi(͗/P`E[$[0El(Z51!1/t?9GL>#pM.cadL.1BAFId:ښB jj0 +68]H$mpLȊB!*|5w+IPA2 L;x^Eu:W"#=v"xof,#2xԗ/!yzW.?4mYxeKpOlJ 0M4Ym>yG8~s)_ ;m{XQh/g/]eÁ$|$^S ,Dr>[̷e5~w6EAss;hzNNj@tŽNʂ㱴l,Mg*@©޴B"nkld AEXY`CIW ʪW3eJڮ](h`PӶ̻+ R nfa $q4]GUGMMM{Ҹӷ̴&.doӦOfCuo7n& ;E?}“Ǐevh/pձk$! x-X |CTyoσTUREԆ-穗0H&s {z ͛dž}Yc>0tEE$Z-o֕\؜fl> "IENDB`v_sim-3.7.0/pixmaps/stock-browser_20.png0000644000353400050620000000116112215546061015056 00000000000000PNG  IHDRZ pHYs9rtIME  {IDAT8˥T1@( Fi,BX) #^#Z 6b%h,RX;AŠ\nmvg];nO&P($?1N2 STʲzeYF,fEQ `~E]./vv{6a7 |?e7ͷ NӴz1Nd0a8l|Ft:SSι\yB4St:t: ]VV8P(E@&jlKS~ǰpXeQ/zyXie_:S6% *o:FEQ{Zb" ,˪*B$ ME4 IvFr< ø\.zZ4M[GrߧR)4lBLF$u^m ' bB;׀3gIENDB`v_sim-3.7.0/pixmaps/stock-data_20.png0000644000353400050620000000207012215546061014304 00000000000000PNG  IHDR bKGD pHYs9rtIME MIDAT8˭mHU?/^ҫ \t&:Ѩsb kDE0* z(^DDZ/zSGIN"N5ݫ⺹l{9@`Kn.Āv u\.^ ӠiRpVԩ, OZ0[3հu8FSף]-:@n1vz-%G+UHPvWF9{ދK@a%S)$~Tg ?}~墰$/N̬A 9 #Scn>w?o6&z'JP]5 LΟ%aϵVF{q )zy:&뚕DUIM =d󋠌X^(,((hm|7pӹ/l{V^8ov/v$ $0P))bVݵYRnrN J(Oy,5C/rV&I !RB0 /;ʄB8b!J*-&CܑGLu ݺe>g!X ⶜hK|F`CxIEqyҖgz.䶦WT]e(u H"k("erFrӴV+z*̍A[)λ:RR&){7N1LN9*ɸoψ8PhjA(0Fc, r"宍 .~2B2>֊KN@f\N"5D( hSdx_?CBIENDB`v_sim-3.7.0/pixmaps/stock-elements_20.png0000644000353400050620000000165012215546061015212 00000000000000PNG  IHDR bKGD pHYs9rtIME6~5IDAT8ˍMhe󱳙l6ۤDcB-:hւ JB~"x=K&)"APCVPtU1C$$Mcfgq"-^x.q@$vBB@r&[?k , 27=[7R$' v?_|G$~3OF[$gGc<~̹8u 1#89n(.r=CԮsDWzX<fx .Fp>D~N3@؟!0 @h%#XB8yX}yenN`lok3J TT@׬UȌ wjsV4l'qì ,?V>vFe'!,]ls#Gt R}+y}wwMUh0`?WLMpaiaB6zl.@ŴdI" {;ǝbԜeF RqCB*̾{Vhy$]#OKD]J%iUֹL&h4sx/=^cbKZyfҾD'JQLθ+J0 S0Hj1ʸ PbV2zaMaeq\],l?=(PO8V1lof {x 4vs`P(< :? b߀$ z8A C8+7ks_ *` d^O<9I_tQ<;ịsE'V{;VIENDB`v_sim-3.7.0/pixmaps/stock-map_20.png0000644000353400050620000000164112215546057014160 00000000000000PNG  IHDR bKGD pHYs9rtIME 3tEXtCommentCreated with The GIMPd%nIDAT8˭Mluvپ`[j)hQLJ⡞1LO$&o荘ٓ"MT"j$@Z"m}$d= 7<+ iCh >feTQC FR6t 0J5:VYq#$ D)@욿P}؋W+.SF&PP/}Кcu5n$ ]Uc:Dг\(p:I 8);Z]1Iz>奚iN0刉FRBfLjC:J;^ l!o ˱қta~+POp2}EaꑚA3N=[xٜI'F`#fpk-EnNVR3@ԑ"alf hؙ&ZEIՈ+b%DK($_h|QKhE!QD{Lof`EIj\3qrȘx't̯{\ =Lwk/W;wGPU s;u`oVH+{e&֗uswj4 #s+ڝxs]{dҪp h.dBq]S[f^zƤ6猺kZ,]~͌I[XhS,` u3q6Qۧ zԿr.IENDB`v_sim-3.7.0/pixmaps/stock-method_20.png0000644000353400050620000000211312215546061014651 00000000000000PNG  IHDR pHYs9rtIME  4IDAT8}mhU>oIym\֤/[u0[ t t* C 링WbEutnTADvÕh'f6m׼i$%]RDw ճ8EKuCxUl "+, B'I`%dst)Qb Xh L%q[ÄU=}3q覉EBBa.ro :ޅ}}}BFJh..K K2j!^`(F3&dp{{YMCDD@L9E0=QCx"ưdwҗ1 @v/E/Z)<@C\("{CNk~tis?K{mg[g]knWgZlcJ?% R-UK:MCIGT`<0D&+Ul7\}WS7 4r;$Zł(}D$|]7e[P: sgb:<EOJ6:Qf瓣yɡ@vk4R^yWfL@ 1#;8HCbB]+u2@Z8:W ͭĮzm X6 `- OֱclӾvIY29L`U[pnS\> [m kМL+ЈI^5dOž6|>~+ 7u=Re0y;''߻& 0f|4s4Q n5֓K"|&4'Sbr>&R҈/Fl(7?gvW)E =-9mn[d4GYp,h Kf_OCn0dJQ Az.Ǡz 1,X0W)PIjIENDB`v_sim-3.7.0/pixmaps/stock-opengl_20.png0000644000353400050620000000150612215546060014661 00000000000000PNG  IHDR bKGD pHYs  tIME 57tEXtCommentCreated with The GIMPd%nIDAT8MhSA}/FkѦm@DAc "R%)"Z=( TP(CQOh5VkR i|O;; >Hw⿁ـ60m)e] ~BP($u]pXj&UU>7tt]jڹq±ds#k$ s@Hڀ;e ^.˗pff)7U[$Mig\[}(]S,))B ʁ@w^L6}ruE*0؛H7a^C@+V y&M/bˇXf˜\,h ΃I`z}ޛm?V#`}uLguE4V<@->Zƃ?CyI]o`Rx@p2pV-*6h4t?{֚E/ߴO1zg]=ڴ[w@Kmu^dg,vyj TKV~D!gCtV3!3&S;@-#}~|Ծ8{Γwh㶡,;(%FP&nVRIrXhlNs51DYoKJ:7]%5JiOMa۵Ht:ÐOҡS\sYV4|`͉8sc|^Ӯ&TBfD_' bXأNDO`w5l/R7X.]9{/)[dgA^(g`8ge1ʛ7BnY2Y*w0 |e!#[{ > Hݲ$'pN},!g2с~kiRp' Nlo|(V^<,ձ}گD[G. u^b kWc @Xf AФR0EaoGGc#qM ٿ74Jm'<ݵ蘱<NOj3|uL=p4dc͉ľ)){! Hz*my+:L taM(bf':)@˙e"y=m40۟O*!)N,n'f 4 (u"w~C{ J4]rxxّ'm%# /*@ng>=\ԩDV;>*k:9jYYQH`,`= 5g;Pceϓ L]ȔYR4D\*Z/JwpAsX? Ul h@tIENDB`v_sim-3.7.0/pixmaps/stock-union.png0000644000353400050620000000114112215546060014217 00000000000000PNG  IHDR;֕JsBIT|dtEXtSoftwarewww.inkscape.org<IDAT(uPKhQ=w潙tIP?TۢZ"( .]*WJn teR( R?2}r]$΄z.sy̌)bXBn+ANO(~ԑ.l3ӗ5|2{y%C&"Yg/;9 Wz "|7aV-c;& q]PӅaN^t0}H`hX`5T ޹2yAYQJ<~PvL$wM%/IUq\Tv1:aPe, qaXre?ԳB Ȩ%,BߎyXO^-5m=+Zbg^|n=ף:F@7$JRm`H5e:y03=e09~L݆;$$mz/#fIhmKT[m4/BIENDB`v_sim-3.7.0/pixmaps/stock-inter.png0000644000353400050620000000120512215546060014211 00000000000000PNG  IHDR;֕JsBIT|dtEXtSoftwarewww.inkscape.org<IDAT(uOHTQ͛{DZqw̌BBi6"ʊ\*ERmZ&Dj!(DP ?TٿI\gۢgS~m9{Xk|FJ(p M~`zxU}`u`)Z+QJk%J,…VbV⚵px\ g;v>#|gcu-^AhU 4/LYTiZ콝,RIwI@$FG+qufYK42Jsh( ˁ{*{I`3p7z {:)# 3^ IENDB`v_sim-3.7.0/pixmaps/stock-isosurfaces_20.png0000644000353400050620000000217612215546061015730 00000000000000PNG  IHDR bKGD pHYs9rtIME 0I9 IDAT8˭MlTU{޹vfGmK4& !hB.LD" 7+]1#&* B@i m{萌Յ ۜ㵄B/ BLJ] )P>Rfnf&Sݱ#\jr^JeA>5@܄/:EJT\7fׯ15Rno/ 0Zu!tdZݳg?jWC =%{w_өS^7snF)TtuJ$k[ tǏܥTZ o~3 P^Y]{;IuR@ ["\^i"h9]ȅև.j%ワ QCvZF۲[y^œM$d~|pGY9a!";\i:'FcccowvvfQpthjxQũS=>Vw)J!^T/pߘYF%4vB8wu^t'J&4|t>;bX6f@飣TX(M3xxzn < ۷?mەX,Vlii!7Ͳg57wXպo_O 0|07M2-HӍP=7aXXtu ߭T$_f UڤK Ujڗ ?"OJmJ?3"gCajH9@W !63߂@p2֠IM=^Z ͶhKYZoX. x#ݕW߃utIENDB`v_sim-3.7.0/pixmaps/stock-select-all_20.png0000644000353400050620000000172012215546060015420 00000000000000PNG  IHDR sBIT|dtEXtSoftwarewww.inkscape.org<bIDAT8YLTg3ۙ0SQQ:ZКFbk&F[qF.\ mZhӤMШ!.h*KȰ ,ъ{[5+nfpҲ w6c4ǃ0 ?-}"6J|9?>Qe`dF0<"2&gyn{Lo##whbzHDKۇR? /k +-;[=:M=ѐ oBr7IK{?ҒШXSpO4\["FZZZG!LPXHe'.K.0ggtr<fͨkle'k_o\n[T.fzlWowxB0 ym$syt_Қ LVhߵ*Uө3}b; {C_G?6- כ E]#tToMYQ(VQ| hchǩkz"HXI{T?4$SXx hM&զh9v`מ`fn:mVzBE .wK@'i߻^zmOnrZbLg/pF2|$gr// z EOޘ$XՁ2sޢEuj+N3Ή+rB:8u,rM*-6"vz ?n󢲡\Eeտu0o+<MtQ\oêWnbɛXV]^[Q݀Շ@0iF1Q0-Ɉ<0jjv #q͞lۺ6UB^W{.{C1bIENDB`v_sim-3.7.0/pixmaps/stock-unselect-all_20.png0000644000353400050620000000155312215546061015770 00000000000000PNG  IHDR sBIT|dtEXtSoftwarewww.inkscape.org<IDAT8kHa}wqKtvn2sD0E3"(*Ȯt(HOV!эnT A%CCQIii*QV^s>}(vs;g('3 ֶ$,̄:^3Z /ʬ 0e:MۺnNܽe]Ȣ9;E\)vb-94OW_W$(L[1޸|*:42G3[T|P}( s1o\yvi}53dU/-m]7cdwtOj2] f<11N`jG ܴ^YUBzOFݜH'whx~I I.ҵV%.{[7y4<6I$U,,m~)JK{ =Y{r^&+oJJJ,(DQYr_t@y'ۚC^[6k-ݖnKIkn[@'''G7͊;Y& ޭ3?]zQ x`@AAw<!rJ(|3Qj0 T SI=n Du9+=Ut tkDiTMkU!P&Vzjfճ3(oos/QJZnUWAoSP񂼨{ Σ1?m^IENDB`v_sim-3.7.0/pixmaps/stock_media-stop.png0000644000353400050620000000052412215546060015217 00000000000000PNG  IHDRw=gAMA abKGDV pHYs  ~tIME%2IDATxA0E!֍GӍӹ"ai?iLϟ|AGl ۽.@ 4-+P硢6[C2y/+:g͌jEu~O˫:%7nFbIENDB`v_sim-3.7.0/pixmaps/stock_media-play.png0000644000353400050620000000057612215546060015206 00000000000000PNG  IHDRw=gAMA abKGDC pHYs  ~tIME!%9XxIDATxA.QzӼX !Lwp $CvBf9[W_UŘa6af͢IZ!fbbҍaý 1"4GhuN-晳<@{HAVɏl~ < >"H( !-:#=!`\*hhD*0F<F2? 9nl>>Fr:!Lv? !=b0],..2 3ɓ ̷Tfbff&gmm6B<66ȕ#7lsccc._lsFz/N %BQ`6Ej" N.ǃ  J3[ZZ>i$O$&i.p8Bي+u ǿ|>`0|U{ JEjo1 !G\rEyܹ/H+q<ͥ^DVUUm Bx!}bbBD$zp_yC`pp0+--;{fQQQ$eM 8.D-P*hmm###₂NNN~jwJKKC?&u~T&s\@ HEQ-K 8T*c 7Vog~!n[@d"eddcVF`jll$SBZӚWp[ZZry<$cZI)\^^NaY6!NsgggsLNMŗ&)MmJ$x8Qwxx:ţG##Bj 4Mju̙3~Hܹ1x엺\H#N"9DDqJ0Y>o$4b1lj8XJBeYVQ^ ˲q\.'eJh4?FcleeeD"dccBC4LƇFQ 0whIENDB`v_sim-3.7.0/pixmaps/stock_effects-object-colorize_20.png0000644000353400050620000000077712215546061020200 00000000000000PNG  IHDR bKGD pHYs  tIME uIDAT8˭M/Q[JذXV"V XZFT"DPL0smnNGoo9#]*5@U=Ut("TE ESVùYB>0L_Hn, F@%% Y Gv8k|\1v 6pl1bX6 `:ʘ+,Td8a~+.Zt\DtKX:MQY v۶*S:W) _=c՞=*Qw*br89FUJ"?EFc,n=N27lR+~ %s-׌Cyw^9: W?mdޠQ L ڐ-|ʹIENDB`v_sim-3.7.0/pixmaps/liaison-bandeau.png0000644000353400050620000002432512215546061015013 00000000000000PNG  IHDR@bKGD pHYs.#.#x?vtIME  1tEXtCommentCration Damien Caliste l'aide du Gimp.]I IDATx}yx\ŕ}{UZ-vK,Yn汄 Lx!|ffc&dI߹9ל8obѬJ@}}=.\ <0X6,;]j>)IY^p,~WEEYTHu@?c'tq @uufK]{ŊYb1UUiݺuP#͚VYY@.`ܚbZ!h*lZr%-53V\.{)o/;'?nZs3I@/83O])` j9 hjw^@`aV~: 0gP(Gv5ev{#ʘ(:5K^z)аyެ1`q|+&W袋02:ʢ. kW/|c9*PWWW 6 \s ) Z\Unr& ,E,n\q3UuuuT#@EArN`0h ]g(/9sδ9O7~O"۶mKUHTTTխo]X0SW. =A_th+vZ|߇iX~=mٲ6lPq,QY#H2邫l۹\=^/m۶`]㦋{p7| Bhgw6l@^x>9*`WB؊'^\s|',n6ٷvᢿ3qlxwŸ`IUx/ ߹6b OBӴE?aiQ9tMPQxc .Ŭ`w;h֭r1"!S:40;8~!o#~?۴itw3xY-ftXXyΥl\ڄr2204ЋCl.v!lذ_e j^}ǎ %?~xvI7_C73/K"74\/f:pB@$ DH@8 M0: 0P,kڲepp۶LJ`ɒ%I✃:~} `l6  oC=n6͊9W^w}qh}h6 `c%I2\&4M4} Moƞ{'"bk/b]_a4 YH 1ƀCsbcxST_@*/YJuxDD\ 6[/P`|\7֜|:=en]y!v˽zTi-.YtB!< "h~с8q[ow_No~g` Voܘj0`yk(B~ި]!hh͜:٬,tk ߅?SOmo u|ZwY`  nfa ۿm,0P#E`láJD b1 GBh$fk/Y qPpApoD,f !TTTpUUӁ" E5r!dp>66&dy"U^uu`q9CAD~?YjRE4PL6wbhpPLVtע oL81>>K;vc!$+p"`/B9lHPaASdJ_m߾8kc$% SFfF\΄~A(ڻHW_DDh^_,Ep1&82 <=۷?=/d2L@ooľ)ܱcnji=gqCBǐHwJIB6["n$]B ՕR"'+&]rΡ( %Cv/]~ҲJj1.W۬/[¹628{$ǽp)I׉\jȁ"s֣r+0ho_j 4AK\,t8je~E]1-s`:,?h޼oԯ[Km6#Q$ eEih8iׇ`.HD %)-fƔs;w3idu3&Qyy1) @0 84 ː$XqWyvPi('5uDsUnX(B|%)Yej~]W$Owy%j QoRNMM gvp饗amq!xȚ!f f% h UDf޾%wtbɲx!ɮJ =u@a7^~m>kkI9p!I ""5K s?]J$-5X $sN0) HzW "=ۘj>1?묛{w}4 K?"ïy} Q`|Νn)2櫄I;ccN2VӅ7Ͻ,-xL>$զlcA IRdO." bV*Nk7 SfǣthmG;r$h<јg3&aur &$ǁH,Wt0I1KAQ}9=3:4-6֦g9c|y<jool:wO,> Pww7"\8V@a&$Y QwA1HowQGlR)}{wf5$IxWiΝ}@sBvݸqӌD]<jNNKOhhk&Q txʝO oIʾ&y{80fO ^#(/8ʭyF(5Mb_&c z/=  ~Yݻa-QX* t띷̐m ^*;aώ<#{EUUٹ,;x< Cjp4h>2\7".x*h&@"tHI:J˖, $.EЭG|.r\M ?SӻDST~9Hz2uOIJjUE(}zg3m\mEce57t-[FlDg3|ag"hB`L44 !GtD4 Q1!Rj>M"C78t#!i_o;H"GL>jr_? OukQ;nHn hu<6&&e*SXNB̿9jFZuu֖.'}/Iz']{K%ь;PW_}u9$/A~QBD:8A !W$A!Ec,4* i"Cq:(&8vysTU}}HUTHV*)Pt4ԸH5p7g/Бp*X\2HDAg"A1͆]a4OMvCVkVG7E{zQu,7 xQNwKm6?Af|yxw6Q BHO&I1p" /A,%0.eu8p> T(Y.#mWU WVb)`^o}6ړ1,X_Q$?c `yί_K}0?wA{ު?<}[i?fׅX L؆Kn:G7^ b~/V]Ԟn Xs"ۿ Y6Z730> < MD`#C;. ! ϓ4S* IZQ5-? ,"0K `H<``||iرҴ2|9{b0}$I,|kֈ}G(fUjq䫝`W×/l'U R=mI|ns v)-[LJ;v k8mB9">߽_͞/͟{ė_NmMI@ψpյr p،rS"#S`'srFt'RXɄ`,6i2KJIdFFH8dćg/$QpZ PՄ$.?q88N:w:D FOD$'Ii 7:p9v&b'=̒MA cB9c,?YRL?7]'dYdәq^8?g>xVTdY,xT*7qBB3[@H4ą@ThB&4`H~ `I" xR,+.rD"$%A rG%J H ':)y|e59cB .bD Xr⌥/3h|x^5%̙Ϛ!al!KO63ڝo +G2 ̠$\,[|槁o\i%CӄPɑ ]W31HALbJOǵ4-6E4'q$I+Ţz%FIУε|KG")xwnY'^ŘljKcf= ҉@4"Ĉ%t e: ^1/ٜd H$z I`!cIH$wrg¾"bTѥq'aκQ瑃him$NSji8R 1Ρ_Jh@t*"beq@ε4RDV/`P}(1[HńShtXhYoB4eon7¡,¡qh ύ`=jF4q"B@<=3[j7Pd` 5~\Ki $C}_Xv 8+@B+iʜU?,fDcYe6[E @`f" P8eb6"S4fG-5WG R*H/c˖-8S*!Z-8U͚bUY#&UT$O d~q &IzgDy È$xfͧY$vR]vASiq-^R׀ a҆OCEd -^ٴ`*r%b-Zz2`񒓘Ya}#(r3><裏`00R7RL6%Zjqw5p8*p^sZh3 3,{B$ M ZVȌ!9oYohUH16{Hc[`>&ں&+ n%Wf% E ,ǶUߨl%V̤bfC-[~̪c}b=LE>ܵ,{Dڇ@DzIA ),\&q^"15`@T0DI2f*󲰦s舀 V"Ge f~=JǎjAnَ힙!$⪫JJeDձb055X  IJPШ("31%A!]OA~MW9 q QQDci UfhlE &2&K4- C!hzE%]hn`p$:,adD H$\EsY t?B:E2ˀ$c93gzGl5s=bc^La~) I1!/*:gi WHT㺞4iIXK|%9CUCppyLJ$9VWڵC EkǢʡf /_G!/;y|`FO=XV1F Xxz1ԮXˌG 5g_H}1 TQ=/:s."ٹy/D*F@HyZQYT}f~qoZtwJ#PVa3'DJCcRVIv |c~C(d`S":5-w</%j,SjtHh"˗VcGupWU-(a^Q-*6X pjD&AzDblt@7˄z*ЈFeN* # ;,"`;_g?&b_w,LQ`eX2cOft~Y 6Ob p& D6-_JZmw7fi/3 LEg> r/X&C20$<ۭ;{&%ԱiFIGӯ;m2<~V *3^5ǡ cR)ȩ(`̢+ʆD)O RAy8Gӥ~ѽ@ `+N93o|Zk b1Oi0mݵp)<_HUe(L?s1p4 #!+a^lȤ׃3;*0 BӴ¨6_(FKzѯH$$ωwvښ/F%ײ-B7;s6*4+[(+R̃DܹJF+\騞!i35@*̫x(|*AS_JG1Pߋ3설DznњT! *}܌̷oBL^ݓ"{-E$)_+rrHhS| Vn@4eojkk!%VL汩X7, ]6aP5gj8ZɷbHGkh EG?qqyF~\z1'3(y<!tR؜g(  FIDAT9y^Eu}3j*Y |!V0 0gUUWE02C}^4j= Ç|ڇkeff_|EڶmN=T+x{=,KW^y*Y82;_SWOy"e+a6"* o~t?ŋg ?ʷtWNY$9D\{{x3OChx퍷o>;HZ`<ۼ= 9_=><8gYttBLM?Cpkg߂4HUFHğLb$ `L$g ;_.͹пuͅxP۝?H䭷ނri|Y8'M7^!to0dqu[ yM@9k OwGK?C#wwb1%sw=~ O3qmk/uk?û3wavHqfAՉ٪UXSS86IIt s+>mp8L~"[JD֮Fn72TU߆K3o~AطJq/Ph5~ȯs鵍p,>7Mۋ!V@+QٚH4Uu$H*勡Op09УhIABXVZ|W_άfz4JxfF.o| Vۂh4h48'IL}7{8&13.đwcs} |J' g{p7}wZZiB3*H"džT$(9̡0$M9YC*;Q1$9H17m;OHj/b6X$rU8qŨ:͡P<Ic\s5Ws TBZŻ>Wo]f5uudu"8=<ؾ׋Kɫr le4q%2UU,ieF_ISҥj 1E/*J`Q4MvKS 'yWU>s# A^;U'^uuđ{a)QP"x KL˗ 8' JBnG"QbQ٣?ѡ ЉD@bBeE@1@RӴץ?3ITBs{1 _s=:> |֎}o&aIENDB`v_sim-3.7.0/pixmaps/stock-go-and-back.png0000644000353400050620000000112412215546060015133 00000000000000PNG  IHDR$sBIT|dtEXtSoftwarewww.inkscape.org<IDAT8kA?owմ11)*/RC-VPŢ(\ wy*l ml9>Ve*MM!h/qkUYp""1y,aUYH)nR]?΃nvuaG \!#MB+8mgag{f˷z8^Ob>//cE2NChQIENDB`v_sim-3.7.0/pixmaps/stock-go-around.png0000644000353400050620000000124412215546061014767 00000000000000PNG  IHDRvsBIT|dtEXtSoftwarewww.inkscape.org<6IDAT8KTQ?9CX6kE=G( I$!l"Z(L 6n]Dal0[4+m*gfN3 3={+JXx}<~ ) z?"WRcі5u;6mEKc#_UuB4"`Еy9*y\"Zi0Eg[\Tr7`xpR@<Ǿ4p'z%p贀~+ kβ ~怵vsM׮|!$D$ XRʿ`1d( UhxmW@Ҁ-"!09v}U+ - IGEJ`8n>~7%-U(tXTr⛡^-"l BWA_hLԪ;-ȉX6%3ߟO}}~iUVxaQ`1K@5D.C@Pt. IJS=+3|IENDB`v_sim-3.7.0/pixmaps/stock-one-light_20.png0000644000353400050620000000174612215546060015271 00000000000000PNG  IHDRfsBIT|dtEXtSoftwarewww.inkscape.org<xIDAT8]h\Eg&wofRHCAR`-/5AD,R">O("m bl-Rih6Yɶ7{{|jҚM 3?s3Wwvҹe ̌ܠ(Z㑇sphwBmݭF\7pk@[bUץ'3[4榭Cwߦc/7˗+8~*un}}/a" @y[oRr|]{oz;_r_#Y Q<>zM(.L]}pX\y$B[7&u j~0 @B?6 OW- +>HJͯ>c{¾`gh xA]BD-U/Í`#(78zhpG[]Z@,eFm (PlE- L׻)KAE\4AdddrIf_ _r0؅o2 sU*/hc*B|M A(\6TIDkny|=ɡNHJGHhAבNxVY-F '"ER$DrKE[rУa }t?tq"*d*_^ ^.˲X)R(+*âbEX;~4vfέ.a[H^A#%3 |rˢ%t\mKYRKv|p-0܊ %˳!se3SsSWsnM6"zHz~aɋ:e$}"֬U{>N_[w IENDB`v_sim-3.7.0/pixmaps/stock-four-lights_20.png0000644000353400050620000000226412215546060015642 00000000000000PNG  IHDR sBIT|dtEXtSoftwarewww.inkscape.org<FIDAT8[h\U\2d2iR4I/Ic1$6J/JX bЂ""B}iB-"5 VkKՖd2cK2Idf2s\9{ _En^sc[w̌8_KjB_6ñx]jc>BDO!%&w:k1t=x#f/_󓟭=]==ѶSկ*ԇc?h06x|SC mAv2hBkSY9r}j?9k`nUp ߼TZxet|wk^j47e@ۖ'RU,]O2^.`,Pd-u@JXz5b#Sa֡3/&'lh,\B pe.[滳nm(oGӧӪvf@Bi9eדZ]m̮[y^ї߹ghK B* AaկI)dq$a.kK e=hjy%]o6W*KSj dBxf)Y86"]ɥ*L%*A%:AJ`nh@2,GP@WePW9^ȯH8_ɜaر2 BCTB%bEQ@ @F>rl|PD ŷV @>_ꫫ ՗MRU<&bG`٤\_~|ac]ځNF䦐鲛 f't*dUVMphn}a5fY)=ď474v,pGAt&T<,@1g,ۻ50m럕UQ(:iMA|T0]#LƆϿHUiE" ;i?}Pwlu\\=ǟ\?2TǮ'o?RUvXMe ?C;'tp<~cr8 gS)3+aKpmj>P2&"3|hg@Kؖfޓ 5It:pIENDB`v_sim-3.7.0/pixmaps/stock-menu-detach.png0000644000353400050620000000042012215546061015261 00000000000000PNG  IHDR bKGD pHYs.#.#x?vtIME *;9c7 #YADQUӴ3M/F/W`4KiNCeܹ] Մ(gr"`a/I1"q˚ Oc⭅0 %\,\U5{7l!h9@JHoeolօt7Ζ;p~"ZTF?mLHUhf'O{Ϸ;;?/$v @W׹i?ͫ7i"JT*50r*]7"KK~]XeEQz]=MDmaIsRIENDB`v_sim-3.7.0/pixmaps/stock-phonons.png0000644000353400050620000000210612215546060014555 00000000000000PNG  IHDR sRGBbKGD pHYs  tIME :")8tEXtCommentCreated with The GIMPd%nIDAT8˭Mh[Of&i&uJ\E&rv^).tܴPi")t%X.BKkRnBl7Mf&3]Lq#\9}9'!AyK>4M 4Mu])YUU|ǽ~;&^ӃjhmF" H088 d(IRS6'9^毫Wj؎ /UUeyy1’DEdYF.\m2I$ЪUX A$ Qfnnjm"@<]]]E6m4MjDE<$033lu (*J8it]G4DQ =,/?l"jAIENDB`v_sim-3.7.0/pixmaps/Makefile.am0000644000353400050620000000376312215546061013311 00000000000000dist_v_simpixmaps_DATA = \ axes-ortho.png \ axes-box.png \ axes-angles.png \ axes-button.png \ icone-about.png \ icone-observe.xpm \ icone-observe.png \ icone-dialog.png \ logo_petit.png \ logo_rectangle.png \ logo_grey.png \ observe-bandeau.png \ save-bandeau.png \ stock-atomic.png \ stock-axes_20.png \ stock-geometry_20.png \ stock-browser_20.png \ stock-data_20.png \ stock-elements_20.png \ stock-fog_20.png \ stock-map_20.png \ stock-method_20.png \ stock-opengl_20.png \ stock-planes_20.png \ stock-union.png \ stock-inter.png \ stock-isosurfaces_20.png \ stock-select-all_20.png \ stock-unselect-all_20.png \ stock_media-stop.png \ stock_media-play.png \ stock-spin.png \ stock_rotate_20.png \ stock_effects-object-colorize_20.png \ liaison-bandeau.png \ stock-go-and-back.png \ stock-go-once.png \ stock-go-around.png \ stock-one-light_20.png \ stock-four-lights_20.png \ stock-menu-detach.png \ stock-masking.png \ stock-phonons.png dist_v_simicons_DATA = v_sim.xpm icon16dir = $(datadir)/icons/hicolor/16x16/apps dist_icon16_DATA = 16x16/v_sim.png icon22dir = $(datadir)/icons/hicolor/22x22/apps dist_icon22_DATA = 22x22/v_sim.png icon24dir = $(datadir)/icons/hicolor/24x24/apps dist_icon24_DATA = 24x24/v_sim.png icon32dir = $(datadir)/icons/hicolor/32x32/apps dist_icon32_DATA = 32x32/v_sim.png icon48dir = $(datadir)/icons/hicolor/48x48/apps dist_icon48_DATA = 48x48/v_sim.png svgicondir = $(datadir)/icons/hicolor/scalable/apps dist_svgicon_DATA = v_sim.svg gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor install-data-hook: update-icon-cache uninstall-hook: update-icon-cache update-icon-cache: @-if test -z "$(DESTDIR)"; then \ echo "Updating Gtk icon cache."; \ $(gtk_update_icon_cache); \ else \ echo "*** Icon cache not updated. After (un)install, run this:"; \ echo "*** $(gtk_update_icon_cache)"; \ fi EXTRA_DIST = \ logo/logo-2.3.svg \ logo/logo-small-2.3.svg \ illustration/axesTransform.png \ illustration/icons.svg v_sim-3.7.0/pixmaps/Makefile.in0000644000353400050620000006103212216330212013301 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = pixmaps DIST_COMMON = $(dist_icon16_DATA) $(dist_icon22_DATA) \ $(dist_icon24_DATA) $(dist_icon32_DATA) $(dist_icon48_DATA) \ $(dist_svgicon_DATA) $(dist_v_simicons_DATA) \ $(dist_v_simpixmaps_DATA) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/abinit.m4 \ $(top_srcdir)/m4/ax_check_gl.m4 \ $(top_srcdir)/m4/ax_check_glu.m4 \ $(top_srcdir)/m4/ax_lang_compiler_ms.m4 \ $(top_srcdir)/m4/ax_lapack.m4 $(top_srcdir)/m4/bigdft.m4 \ $(top_srcdir)/m4/etsf_io.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/libxc.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/netcdf.m4 \ $(top_srcdir)/m4/python.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(icon16dir)" "$(DESTDIR)$(icon22dir)" \ "$(DESTDIR)$(icon24dir)" "$(DESTDIR)$(icon32dir)" \ "$(DESTDIR)$(icon48dir)" "$(DESTDIR)$(svgicondir)" \ "$(DESTDIR)$(v_simiconsdir)" "$(DESTDIR)$(v_simpixmapsdir)" DATA = $(dist_icon16_DATA) $(dist_icon22_DATA) $(dist_icon24_DATA) \ $(dist_icon32_DATA) $(dist_icon48_DATA) $(dist_svgicon_DATA) \ $(dist_v_simicons_DATA) $(dist_v_simpixmaps_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AB_CPPFLAGS = @AB_CPPFLAGS@ AB_LIBS = @AB_LIBS@ ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIGDFT_CPPFLAGS = @BIGDFT_CPPFLAGS@ BIGDFT_LIBS = @BIGDFT_LIBS@ BLAS_LIBS = @BLAS_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETSF_IO_LIBS = @ETSF_IO_LIBS@ EXEEXT = @EXEEXT@ EXTRA_CFLAGS = @EXTRA_CFLAGS@ EXTRA_LDFLAGS = @EXTRA_LDFLAGS@ EXTRA_LIBS = @EXTRA_LIBS@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ FCLIBS = @FCLIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLIBS = @FLIBS@ FONT_BOLD = @FONT_BOLD@ FONT_NORMAL = @FONT_NORMAL@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_BIGDFT_CFLAGS = @GLIB_BIGDFT_CFLAGS@ GLIB_BIGDFT_LIBS = @GLIB_BIGDFT_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GOBJECT_INTROSPECTION_REQUIRED = @GOBJECT_INTROSPECTION_REQUIRED@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTKS_CFLAGS = @GTKS_CFLAGS@ GTKS_LIBS = @GTKS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_SCANNER = @G_IR_SCANNER@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LAPACK_LIBS = @LAPACK_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXC_LIBS = @LIBXC_LIBS@ LIB_ARCHIVE_CFLAGS = @LIB_ARCHIVE_CFLAGS@ LIB_ARCHIVE_LIBS = @LIB_ARCHIVE_LIBS@ LIB_YAML_CFLAGS = @LIB_YAML_CFLAGS@ LIB_YAML_LIBS = @LIB_YAML_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NC_CPPFLAGS = @NC_CPPFLAGS@ NC_LDFLAGS = @NC_LDFLAGS@ NC_LIBS = @NC_LIBS@ NC_NETCDF_3_CPPFLAG = @NC_NETCDF_3_CPPFLAG@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBABEL_CFLAGS = @OPENBABEL_CFLAGS@ OPENBABEL_LIBS = @OPENBABEL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PYGOBJECT_CFLAGS = @PYGOBJECT_CFLAGS@ PYGOBJECT_LIBS = @PYGOBJECT_LIBS@ PYGOBJECT_REQUIRED = @PYGOBJECT_REQUIRED@ PYGTK_CFLAGS = @PYGTK_CFLAGS@ PYGTK_LIBS = @PYGTK_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_INCLUDES = @PYTHON_INCLUDES@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ V_SIM_MAJOR_VERSION = @V_SIM_MAJOR_VERSION@ V_SIM_MICRO_VERSION = @V_SIM_MICRO_VERSION@ V_SIM_MINOR_VERSION = @V_SIM_MINOR_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ girdir = @girdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ lib_v_sim_version = @lib_v_sim_version@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typelibsdir = @typelibsdir@ v_simexamplesdir = @v_simexamplesdir@ v_simexedir = @v_simexedir@ v_simiconsdir = @v_simiconsdir@ v_simlegaldir = @v_simlegaldir@ v_simpixmapsdir = @v_simpixmapsdir@ v_simpluginsdir = @v_simpluginsdir@ v_simresourcesdir = @v_simresourcesdir@ visupyexecdir = @visupyexecdir@ visutypelibsdir = @visutypelibsdir@ dist_v_simpixmaps_DATA = \ axes-ortho.png \ axes-box.png \ axes-angles.png \ axes-button.png \ icone-about.png \ icone-observe.xpm \ icone-observe.png \ icone-dialog.png \ logo_petit.png \ logo_rectangle.png \ logo_grey.png \ observe-bandeau.png \ save-bandeau.png \ stock-atomic.png \ stock-axes_20.png \ stock-geometry_20.png \ stock-browser_20.png \ stock-data_20.png \ stock-elements_20.png \ stock-fog_20.png \ stock-map_20.png \ stock-method_20.png \ stock-opengl_20.png \ stock-planes_20.png \ stock-union.png \ stock-inter.png \ stock-isosurfaces_20.png \ stock-select-all_20.png \ stock-unselect-all_20.png \ stock_media-stop.png \ stock_media-play.png \ stock-spin.png \ stock_rotate_20.png \ stock_effects-object-colorize_20.png \ liaison-bandeau.png \ stock-go-and-back.png \ stock-go-once.png \ stock-go-around.png \ stock-one-light_20.png \ stock-four-lights_20.png \ stock-menu-detach.png \ stock-masking.png \ stock-phonons.png dist_v_simicons_DATA = v_sim.xpm icon16dir = $(datadir)/icons/hicolor/16x16/apps dist_icon16_DATA = 16x16/v_sim.png icon22dir = $(datadir)/icons/hicolor/22x22/apps dist_icon22_DATA = 22x22/v_sim.png icon24dir = $(datadir)/icons/hicolor/24x24/apps dist_icon24_DATA = 24x24/v_sim.png icon32dir = $(datadir)/icons/hicolor/32x32/apps dist_icon32_DATA = 32x32/v_sim.png icon48dir = $(datadir)/icons/hicolor/48x48/apps dist_icon48_DATA = 48x48/v_sim.png svgicondir = $(datadir)/icons/hicolor/scalable/apps dist_svgicon_DATA = v_sim.svg gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor EXTRA_DIST = \ logo/logo-2.3.svg \ logo/logo-small-2.3.svg \ illustration/axesTransform.png \ illustration/icons.svg all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu pixmaps/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu pixmaps/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dist_icon16DATA: $(dist_icon16_DATA) @$(NORMAL_INSTALL) test -z "$(icon16dir)" || $(MKDIR_P) "$(DESTDIR)$(icon16dir)" @list='$(dist_icon16_DATA)'; test -n "$(icon16dir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icon16dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icon16dir)" || exit $$?; \ done uninstall-dist_icon16DATA: @$(NORMAL_UNINSTALL) @list='$(dist_icon16_DATA)'; test -n "$(icon16dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(icon16dir)'; $(am__uninstall_files_from_dir) install-dist_icon22DATA: $(dist_icon22_DATA) @$(NORMAL_INSTALL) test -z "$(icon22dir)" || $(MKDIR_P) "$(DESTDIR)$(icon22dir)" @list='$(dist_icon22_DATA)'; test -n "$(icon22dir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icon22dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icon22dir)" || exit $$?; \ done uninstall-dist_icon22DATA: @$(NORMAL_UNINSTALL) @list='$(dist_icon22_DATA)'; test -n "$(icon22dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(icon22dir)'; $(am__uninstall_files_from_dir) install-dist_icon24DATA: $(dist_icon24_DATA) @$(NORMAL_INSTALL) test -z "$(icon24dir)" || $(MKDIR_P) "$(DESTDIR)$(icon24dir)" @list='$(dist_icon24_DATA)'; test -n "$(icon24dir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icon24dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icon24dir)" || exit $$?; \ done uninstall-dist_icon24DATA: @$(NORMAL_UNINSTALL) @list='$(dist_icon24_DATA)'; test -n "$(icon24dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(icon24dir)'; $(am__uninstall_files_from_dir) install-dist_icon32DATA: $(dist_icon32_DATA) @$(NORMAL_INSTALL) test -z "$(icon32dir)" || $(MKDIR_P) "$(DESTDIR)$(icon32dir)" @list='$(dist_icon32_DATA)'; test -n "$(icon32dir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icon32dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icon32dir)" || exit $$?; \ done uninstall-dist_icon32DATA: @$(NORMAL_UNINSTALL) @list='$(dist_icon32_DATA)'; test -n "$(icon32dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(icon32dir)'; $(am__uninstall_files_from_dir) install-dist_icon48DATA: $(dist_icon48_DATA) @$(NORMAL_INSTALL) test -z "$(icon48dir)" || $(MKDIR_P) "$(DESTDIR)$(icon48dir)" @list='$(dist_icon48_DATA)'; test -n "$(icon48dir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icon48dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icon48dir)" || exit $$?; \ done uninstall-dist_icon48DATA: @$(NORMAL_UNINSTALL) @list='$(dist_icon48_DATA)'; test -n "$(icon48dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(icon48dir)'; $(am__uninstall_files_from_dir) install-dist_svgiconDATA: $(dist_svgicon_DATA) @$(NORMAL_INSTALL) test -z "$(svgicondir)" || $(MKDIR_P) "$(DESTDIR)$(svgicondir)" @list='$(dist_svgicon_DATA)'; test -n "$(svgicondir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(svgicondir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(svgicondir)" || exit $$?; \ done uninstall-dist_svgiconDATA: @$(NORMAL_UNINSTALL) @list='$(dist_svgicon_DATA)'; test -n "$(svgicondir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(svgicondir)'; $(am__uninstall_files_from_dir) install-dist_v_simiconsDATA: $(dist_v_simicons_DATA) @$(NORMAL_INSTALL) test -z "$(v_simiconsdir)" || $(MKDIR_P) "$(DESTDIR)$(v_simiconsdir)" @list='$(dist_v_simicons_DATA)'; test -n "$(v_simiconsdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(v_simiconsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(v_simiconsdir)" || exit $$?; \ done uninstall-dist_v_simiconsDATA: @$(NORMAL_UNINSTALL) @list='$(dist_v_simicons_DATA)'; test -n "$(v_simiconsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(v_simiconsdir)'; $(am__uninstall_files_from_dir) install-dist_v_simpixmapsDATA: $(dist_v_simpixmaps_DATA) @$(NORMAL_INSTALL) test -z "$(v_simpixmapsdir)" || $(MKDIR_P) "$(DESTDIR)$(v_simpixmapsdir)" @list='$(dist_v_simpixmaps_DATA)'; test -n "$(v_simpixmapsdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(v_simpixmapsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(v_simpixmapsdir)" || exit $$?; \ done uninstall-dist_v_simpixmapsDATA: @$(NORMAL_UNINSTALL) @list='$(dist_v_simpixmaps_DATA)'; test -n "$(v_simpixmapsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(v_simpixmapsdir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(icon16dir)" "$(DESTDIR)$(icon22dir)" "$(DESTDIR)$(icon24dir)" "$(DESTDIR)$(icon32dir)" "$(DESTDIR)$(icon48dir)" "$(DESTDIR)$(svgicondir)" "$(DESTDIR)$(v_simiconsdir)" "$(DESTDIR)$(v_simpixmapsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dist_icon16DATA install-dist_icon22DATA \ install-dist_icon24DATA install-dist_icon32DATA \ install-dist_icon48DATA install-dist_svgiconDATA \ install-dist_v_simiconsDATA install-dist_v_simpixmapsDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dist_icon16DATA uninstall-dist_icon22DATA \ uninstall-dist_icon24DATA uninstall-dist_icon32DATA \ uninstall-dist_icon48DATA uninstall-dist_svgiconDATA \ uninstall-dist_v_simiconsDATA uninstall-dist_v_simpixmapsDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook .MAKE: install-am install-data-am install-strip uninstall-am .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-data-hook \ install-dist_icon16DATA install-dist_icon22DATA \ install-dist_icon24DATA install-dist_icon32DATA \ install-dist_icon48DATA install-dist_svgiconDATA \ install-dist_v_simiconsDATA install-dist_v_simpixmapsDATA \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am uninstall uninstall-am uninstall-dist_icon16DATA \ uninstall-dist_icon22DATA uninstall-dist_icon24DATA \ uninstall-dist_icon32DATA uninstall-dist_icon48DATA \ uninstall-dist_svgiconDATA uninstall-dist_v_simiconsDATA \ uninstall-dist_v_simpixmapsDATA uninstall-hook install-data-hook: update-icon-cache uninstall-hook: update-icon-cache update-icon-cache: @-if test -z "$(DESTDIR)"; then \ echo "Updating Gtk icon cache."; \ $(gtk_update_icon_cache); \ else \ echo "*** Icon cache not updated. After (un)install, run this:"; \ echo "*** $(gtk_update_icon_cache)"; \ fi # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: v_sim-3.7.0/examples/0000755000353400050620000000000012216331354011457 500000000000000v_sim-3.7.0/examples/Makefile.am0000644000353400050620000000053512216273772013447 00000000000000v_simexamples_DATA = \ cinchonidine.yaml \ diff.ascii \ diff.dat \ demo-browser.tar.gz \ demo.ascii \ demo.d3 \ demo.xyz \ demo_spin.d3 \ demo_spin.spin \ aluminium.d3 \ test_isosurfaces.ascii \ test_isosurfaces.surf \ planes.xml \ density-sih4.dat \ coord_vib_g_co.xyz \ values.xml EXTRA_DIST = $(v_simexamples_DATA) v_sim-3.7.0/examples/Makefile.in0000644000353400050620000004033412216330210013436 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = examples DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/abinit.m4 \ $(top_srcdir)/m4/ax_check_gl.m4 \ $(top_srcdir)/m4/ax_check_glu.m4 \ $(top_srcdir)/m4/ax_lang_compiler_ms.m4 \ $(top_srcdir)/m4/ax_lapack.m4 $(top_srcdir)/m4/bigdft.m4 \ $(top_srcdir)/m4/etsf_io.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/libxc.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/netcdf.m4 \ $(top_srcdir)/m4/python.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(v_simexamplesdir)" DATA = $(v_simexamples_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AB_CPPFLAGS = @AB_CPPFLAGS@ AB_LIBS = @AB_LIBS@ ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIGDFT_CPPFLAGS = @BIGDFT_CPPFLAGS@ BIGDFT_LIBS = @BIGDFT_LIBS@ BLAS_LIBS = @BLAS_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETSF_IO_LIBS = @ETSF_IO_LIBS@ EXEEXT = @EXEEXT@ EXTRA_CFLAGS = @EXTRA_CFLAGS@ EXTRA_LDFLAGS = @EXTRA_LDFLAGS@ EXTRA_LIBS = @EXTRA_LIBS@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ FCLIBS = @FCLIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLIBS = @FLIBS@ FONT_BOLD = @FONT_BOLD@ FONT_NORMAL = @FONT_NORMAL@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_BIGDFT_CFLAGS = @GLIB_BIGDFT_CFLAGS@ GLIB_BIGDFT_LIBS = @GLIB_BIGDFT_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GOBJECT_INTROSPECTION_REQUIRED = @GOBJECT_INTROSPECTION_REQUIRED@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTKS_CFLAGS = @GTKS_CFLAGS@ GTKS_LIBS = @GTKS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_SCANNER = @G_IR_SCANNER@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LAPACK_LIBS = @LAPACK_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXC_LIBS = @LIBXC_LIBS@ LIB_ARCHIVE_CFLAGS = @LIB_ARCHIVE_CFLAGS@ LIB_ARCHIVE_LIBS = @LIB_ARCHIVE_LIBS@ LIB_YAML_CFLAGS = @LIB_YAML_CFLAGS@ LIB_YAML_LIBS = @LIB_YAML_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NC_CPPFLAGS = @NC_CPPFLAGS@ NC_LDFLAGS = @NC_LDFLAGS@ NC_LIBS = @NC_LIBS@ NC_NETCDF_3_CPPFLAG = @NC_NETCDF_3_CPPFLAG@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBABEL_CFLAGS = @OPENBABEL_CFLAGS@ OPENBABEL_LIBS = @OPENBABEL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PYGOBJECT_CFLAGS = @PYGOBJECT_CFLAGS@ PYGOBJECT_LIBS = @PYGOBJECT_LIBS@ PYGOBJECT_REQUIRED = @PYGOBJECT_REQUIRED@ PYGTK_CFLAGS = @PYGTK_CFLAGS@ PYGTK_LIBS = @PYGTK_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_INCLUDES = @PYTHON_INCLUDES@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ V_SIM_MAJOR_VERSION = @V_SIM_MAJOR_VERSION@ V_SIM_MICRO_VERSION = @V_SIM_MICRO_VERSION@ V_SIM_MINOR_VERSION = @V_SIM_MINOR_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ girdir = @girdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ lib_v_sim_version = @lib_v_sim_version@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typelibsdir = @typelibsdir@ v_simexamplesdir = @v_simexamplesdir@ v_simexedir = @v_simexedir@ v_simiconsdir = @v_simiconsdir@ v_simlegaldir = @v_simlegaldir@ v_simpixmapsdir = @v_simpixmapsdir@ v_simpluginsdir = @v_simpluginsdir@ v_simresourcesdir = @v_simresourcesdir@ visupyexecdir = @visupyexecdir@ visutypelibsdir = @visutypelibsdir@ v_simexamples_DATA = \ cinchonidine.yaml \ diff.ascii \ diff.dat \ demo-browser.tar.gz \ demo.ascii \ demo.d3 \ demo.xyz \ demo_spin.d3 \ demo_spin.spin \ aluminium.d3 \ test_isosurfaces.ascii \ test_isosurfaces.surf \ planes.xml \ density-sih4.dat \ coord_vib_g_co.xyz \ values.xml EXTRA_DIST = $(v_simexamples_DATA) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu examples/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-v_simexamplesDATA: $(v_simexamples_DATA) @$(NORMAL_INSTALL) test -z "$(v_simexamplesdir)" || $(MKDIR_P) "$(DESTDIR)$(v_simexamplesdir)" @list='$(v_simexamples_DATA)'; test -n "$(v_simexamplesdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(v_simexamplesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(v_simexamplesdir)" || exit $$?; \ done uninstall-v_simexamplesDATA: @$(NORMAL_UNINSTALL) @list='$(v_simexamples_DATA)'; test -n "$(v_simexamplesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(v_simexamplesdir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(v_simexamplesdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-v_simexamplesDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-v_simexamplesDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ install-v_simexamplesDATA installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am uninstall uninstall-am uninstall-v_simexamplesDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: v_sim-3.7.0/examples/cinchonidine.yaml0000644000353400050620000000663112216267630014730 00000000000000--- Comment: (converted from examples/cinchonidine.xyz) Cell: Units: bohr BC: free Positions: Units: bohr Values: - H: [ 7.0312401063990793, 20.323599199332200, 16.646399223743714 ] - H: [ 10.946099846957209, 20.355299603059386, 19.263199969550236 ] - H: [ 17.597800607145697, 20.301300785726941, 12.893700384406340 ] - H: [ 17.474399712068291, 20.308500507892383, 8.2691296083002328 ] - H: [ 13.365300208075425, 20.305299830404067, 5.9774499332156665 ] - H: [ 9.3268796286746376, 20.308999712658299, 8.4188703129668756 ] - H: [ 14.792099516388962, 22.924600204406698, 20.046099019348571 ] - H: [ 16.840200606097913, 16.869500501708860, 15.874199736022030 ] - H: [ 19.740299155469092, 20.447299256832498, 21.131599057721338 ] - H: [ 22.527099849176999, 18.633499113022896, 20.905999953743351 ] - H: [ 18.048499610335757, 17.586800080462879, 24.022499263680150 ] - H: [ 20.852900425862863, 15.788900599648441, 23.885299051300922 ] - H: [ 21.419299595015705, 12.533799879839640, 20.676400002904970 ] - H: [ 17.291800700923197, 11.406500002692093, 16.737499588064875 ] - H: [ 18.704299684985727, 7.0754400027442772, 17.295199618571264 ] - H: [ 21.048599507200844, 8.0980402406118586, 19.676599185591826 ] - H: [ 17.129200517530272, 13.172599959699472, 22.561000718677402 ] - H: [ 14.637700167968211, 14.431699807056347, 18.754299457641046 ] - H: [ 14.580599793227327, 16.871899207641828, 21.015199644649623 ] - H: [ 22.968800551297711, 15.458800096550240, 17.806500638596692 ] - H: [ 20.491800568329680, 14.823999962459167, 15.677799605391845 ] - H: [ 17.236900791955531, 21.553200009826742, 16.736200213926882 ] - C: [ 11.149299615066795, 20.307900380863323, 9.3582304088473567 ] - C: [ 11.149299615066795, 20.307900380863323, 12.041000073268636 ] - C: [ 13.511299580272619, 20.307900380863323, 13.369400175015695 ] - C: [ 15.785499879817106, 20.307900380863323, 11.935000158759044 ] - C: [ 15.718700154714670, 20.306799246885081, 9.3317401169550376 ] - C: [ 13.384299725204126, 20.305499872747088, 8.0295599796097292 ] - C: [ 8.8709696125580759, 20.322901754406534, 15.721199782910782 ] - C: [ 11.087500047448218, 20.334300563592119, 17.219399790216208 ] - C: [ 13.427099775694003, 20.322198902931060, 16.075299960621543 ] - C: [ 15.836999068953435, 20.322699909880246, 17.649899923311086 ] - C: [ 17.058499065647315, 17.664499409984987, 17.771599557381187 ] - C: [ 20.462500672718729, 18.549499350787301, 20.783500150301169 ] - C: [ 19.354700418557435, 16.634200245186051, 22.730200497206710 ] - C: [ 17.937299495999287, 14.560400022040508, 21.255800122170825 ] - C: [ 15.811499977859864, 15.835299610129404, 19.719100073658808 ] - C: [ 19.868800229201867, 13.225899529922980, 19.485299233617013 ] - C: [ 20.910399083106515, 15.318199164339674, 17.644999786998735 ] - C: [ 18.793399625876692, 10.997099831327626, 18.090400371373679 ] - C: [ 19.549900295129500, 8.6085996622214953, 18.365700085584091 ] - O: [ 15.377700047196795, 21.198200542664026, 20.162100149917517 ] - N: [ 8.8581696058797164, 20.311200178431516, 13.234799612004089 ] - N: [ 19.827099510506965, 17.827600600327099, 18.159800646935373 ] Properties: Timestamp: 2013-09-18 11:13:57.591 v_sim-3.7.0/examples/diff.ascii0000644000353400050620000002507412215546211013330 00000000000000# Fichier ascii standard : boite + x y z element 16.28940 0.000000E+00 16.28940 0.000000E+00 0.000000E+00 16.28940 #keyword: angstroem # 217 (Nb atomes) 8.119324 8.146099 8.123883 Si 10.85920 10.85780 8.123933 Si 10.76350 8.060740 10.77760 Si 8.131874 10.88780 10.87450 Si 9.470533 9.540169 9.485503 Si 12.17690 12.24650 9.485553 Si 9.418084 12.29900 12.25770 Si 13.57240 8.144619 8.123933 Si 1.852515E-02 10.85630 8.130282 Si 1.217505E-02 8.112019 10.87680 Si 13.65630 10.95340 10.77760 Si 14.95430 9.460839 9.495132 Si 1.358984 12.21410 9.495293 Si 1.365974 9.494289 12.21010 Si 14.95080 12.23790 12.25460 Si 2.716214 8.141809 8.138383 Si 5.425764 10.86090 8.138323 Si 5.426774 8.144669 10.85350 Si 2.715474 10.85800 10.85360 Si 4.071014 9.501319 9.495613 Si 6.774474 12.22420 9.497883 Si 6.776434 9.508410 12.20950 Si 4.068954 12.21710 12.21320 Si 8.141603 13.57540 8.141923 Si 10.85610 1.850862E-03 8.138323 Si 10.82930 13.58520 10.87450 Si 8.135364 9.153512E-03 10.85530 Si 9.492914 14.94250 9.497833 Si 12.21570 1.356599 9.495613 Si 12.20860 14.94060 12.20950 Si 9.499954 1.358659 12.21320 Si 13.57090 13.59770 8.123883 Si 1.627031E-04 -3.387988E-03 8.139543 Si -3.488620E-03 13.57220 10.84730 Si 13.57230 8.983433E-04 10.85350 Si 14.92780 14.93420 9.494233 Si 1.359094 1.351889 9.494443 Si 1.353374 14.92870 12.21050 Si 14.93180 1.354059 12.21310 Si 2.710924 13.57520 8.139703 Si 5.427934 16.28910 8.142403 Si 5.418464 13.58170 10.85530 Si 2.713144 -1.800458E-03 10.85430 Si 4.066834 14.93340 9.494713 Si 6.783634 1.360779 9.494713 Si 6.747224 14.96980 12.20780 Si 4.072284 1.355379 12.21120 Si 8.141873 2.716739 8.139703 Si 10.86070 5.409139 8.130282 Si 10.85900 2.712189 10.85360 Si 8.144834 5.431098 10.84730 Si 9.502964 4.068629 9.495343 Si 12.25620 6.762779 9.495132 Si 12.22280 4.061648 12.21010 Si 9.479154 6.766269 12.25470 Si 13.57520 2.711399 8.138383 Si 16.29020 5.426818 8.141763 Si 7.571180E-03 2.703139 10.85540 Si 13.60500 5.415439 10.87670 Si 14.93960 4.059159 9.497513 Si 1.368514 6.777489 9.497513 Si 1.398354 4.029309 12.20750 Si 15.02190 6.695098 12.26200 Si 2.714474 2.713139 8.142033 Si 5.431004 5.427449 8.139543 Si 5.429464 2.714519 10.85430 Si 2.724524 5.420099 10.85540 Si 4.075724 4.068529 9.494443 Si 6.782834 6.789178 9.494233 Si 6.788344 4.074239 12.21050 Si 4.073614 6.785219 12.21310 Si 8.124564 8.151229 13.57780 Si 10.76110 10.95590 13.64270 Si 10.86100 8.145519 -5.235760E-03 Si 8.135314 10.86620 -4.177410E-03 Si 9.482434 9.491799 14.94140 Si 12.22520 12.23460 14.94140 Si 12.21580 9.501219 1.352583 Si 9.500374 12.21670 1.351943 Si 13.67490 8.042059 13.63780 Si 1.640845E-02 10.85170 13.57670 Si 5.930730E-03 8.136259 -5.712020E-03 Si 13.57150 10.85600 -5.235760E-03 Si 14.94820 9.509579 14.93840 Si 1.361414 12.21730 14.93520 Si 1.358134 9.496609 1.352213 Si 14.92980 12.21430 1.354163 Si 2.717804 8.139959 13.57420 Si 5.424914 10.86240 13.57420 Si 5.425504 8.145099 16.29140 Si 2.716434 10.85730 1.273120E-03 Si 4.071284 9.501169 14.93070 Si 6.770664 12.22740 14.93480 Si 6.783154 9.505769 1.353483 Si 4.066784 12.21610 1.362583 Si 8.070534 13.64650 13.59130 Si 10.85460 2.750462E-03 13.57420 Si 10.85080 13.58180 -4.177410E-03 Si 8.141394 1.010604E-02 4.501100E-03 Si 9.489684 14.94640 14.93480 Si 12.21580 1.356329 14.93070 Si 12.21120 14.93390 1.353483 Si 9.500904 1.360829 1.362583 Si 13.56580 13.59240 13.57780 Si 16.28810 16.28620 13.57040 Si 16.28630 13.57160 16.28730 Si 13.57190 16.29150 16.29140 Si 14.93170 14.93670 14.93610 Si 1.357874 1.351359 14.92980 Si 1.353854 14.92820 1.357713 Si 14.93090 1.351729 1.363583 Si 2.711134 13.57350 13.56980 Si 5.412424 1.523904E-02 13.57560 Si 5.417504 13.57560 4.501100E-03 Si 2.711084 16.28530 16.28980 Si 4.066364 14.93220 14.92940 Si 6.784904 1.361259 14.92940 Si 6.782894 14.93420 1.353483 Si 4.071174 1.356439 1.354483 Si 8.143514 2.716479 13.56980 Si 10.86540 5.411209 13.57670 Si 10.85970 2.711239 1.273120E-03 Si 8.145473 5.430678 16.28730 Si 9.499743 4.066198 14.93520 Si 12.20740 6.768808 14.93850 Si 12.22040 4.069479 1.352263 Si 9.502754 6.787229 1.354223 Si 13.57700 2.709859 13.57420 Si 7.774005E-02 5.349928 13.59490 Si 16.29070 2.702029 16.29520 Si 13.58080 5.421689 -5.712020E-03 Si 14.94220 4.054399 14.93600 Si 1.373214 6.774838 14.93600 Si 1.359194 4.068419 1.354383 Si 14.93110 6.785899 1.351313 Si 2.732464 2.695149 13.57600 Si 5.430844 5.428928 13.57040 Si 5.431694 2.716529 16.28980 Si 2.725584 5.426339 16.29520 Si 4.076254 4.069798 14.92980 Si 6.780354 6.785269 14.93610 Si 6.788764 4.073759 1.357713 Si 4.075884 6.786119 1.363583 Si 8.143464 8.147899 2.708063 Si 10.85800 10.85900 2.710603 Si 10.85440 8.139799 5.424653 Si 8.140814 10.86030 5.422273 Si 9.500274 9.501799 4.068373 Si 12.21530 12.21670 4.068373 Si 12.21570 9.501319 6.765903 Si 9.496934 12.22010 6.775803 Si 13.57360 8.143399 2.710343 Si -6.310629E-04 10.85430 2.708543 Si 16.29040 8.142659 5.423063 Si 13.57730 10.86260 5.424603 Si 14.93120 9.500479 4.068373 Si 1.351894 12.21180 4.070113 Si 1.366444 9.496609 6.772153 Si 14.93030 12.21540 6.789773 Si 2.712194 8.143189 2.711823 Si 5.428624 10.85920 2.712833 Si 5.422434 8.145409 5.417243 Si 2.717644 10.85690 5.419673 Si 4.069534 9.501269 4.061653 Si 6.784634 12.21850 4.068163 Si 6.772094 9.506619 6.768393 Si 4.068004 12.21630 6.782313 Si 8.141504 13.57550 2.708433 Si 10.85780 -1.006698E-03 2.712833 Si 10.85680 13.57630 5.422273 Si 8.142714 16.29000 5.427083 Si 9.498474 14.93240 4.068103 Si 12.21570 1.358079 4.061653 Si 12.21040 14.94490 6.768393 Si 9.500694 1.359619 6.782313 Si 13.56920 13.57360 2.708063 Si 16.28610 16.28250 2.717593 Si -8.198300E-03 13.56600 5.427723 Si 13.57160 5.184682E-03 5.417243 Si 14.92640 14.92600 4.070113 Si 1.356074 1.354159 4.070333 Si 1.351364 14.92630 6.780293 Si 14.93070 1.353789 6.781883 Si 2.708434 13.57110 2.717113 Si 5.427564 16.28950 2.714103 Si 5.427084 13.57430 5.427083 Si 2.712194 16.28690 5.428353 Si 4.068844 14.93080 4.070113 Si 6.786224 1.358819 4.070113 Si 6.784324 14.93270 6.783213 Si 4.071284 1.356329 6.784163 Si 8.145944 2.719229 2.717113 Si 10.86270 5.428298 2.708543 Si 10.86010 2.709969 5.419673 Si 8.151084 5.435809 5.427723 Si 9.505244 4.075718 4.070113 Si 12.21650 6.785849 4.068423 Si 12.22040 4.061169 6.772153 Si 9.501694 6.786748 6.789773 Si 13.57380 2.715419 2.711823 Si 16.28960 5.427449 2.708913 Si 16.28880 2.712719 5.426823 Si 13.57430 5.426609 5.423063 Si 14.93250 4.070539 4.068423 Si 1.357074 6.784529 4.068423 Si 1.357974 4.069689 6.782943 Si 14.93480 6.782248 6.776063 Si 2.714844 2.712769 2.714203 Si 5.434544 5.430889 2.717593 Si 5.430154 2.715469 5.428353 Si 2.714894 5.428248 5.426823 Si 4.073454 4.071538 4.070273 Si 6.790984 6.790558 4.070113 Si 6.790724 4.076299 6.780293 Si 4.073824 6.786269 6.781883 Si 11.36820 10.34880 11.47930 Si 13.08220 8.634739 11.45930 Ge v_sim-3.7.0/examples/diff.dat0000644000353400050620000001121512215546210012777 00000000000000# Data file to be associated to a coordinate file. 6.570164E-03 19070 2.974598E-03 21796 1.731830E-02 8592 2.430072E-03 11318 1.223075E-02 14044 1.224811E-02 16769 3.805334E-03 19495 1.294667E-03 22221 3.690429E-03 24947 9.115873E-04 27673 1.730585E-02 30399 6.334600E-03 356 2.171126E-03 3082 3.281970E-04 5808 3.891863E-03 8534 4.806420E-04 11260 1.183936E-03 13986 6.233510E-04 16711 5.197012E-04 19437 6.011208E-04 22163 1.800709E-03 24889 8.525641E-04 27615 4.560292E-04 30341 9.893049E-04 298 1.161778E-03 3024 2.435714E-03 5750 1.006440E-03 8476 1.853548E-03 11202 6.038504E-04 13928 9.035654E-04 16653 4.430178E-04 19379 6.674202E-03 6175 8.742520E-04 8901 2.610827E-03 11627 5.939400E-04 14353 1.292323E-03 17079 2.969896E-04 19805 1.738480E-03 22530 2.903526E-04 25256 1.166387E-03 27982 5.186840E-04 30708 9.789558E-04 666 1.011609E-03 3392 8.096921E-04 6118 7.522728E-04 8843 1.030050E-03 11569 2.058406E-03 14295 1.093966E-03 17021 3.666771E-03 19747 4.978379E-04 22473 2.510549E-03 25198 2.155186E-03 27924 6.251096E-03 30650 2.473853E-04 608 3.803856E-03 3334 5.334322E-04 6060 3.392569E-04 8785 8.984001E-04 11511 1.041334E-03 14237 8.918630E-04 16963 6.023200E-04 3759 5.528382E-03 6485 1.579587E-02 9211 2.043177E-04 11937 8.341062E-04 14662 5.693425E-04 17388 7.363030E-04 20114 1.369141E-04 22840 1.177616E-03 25566 1.539351E-03 28292 2.112410E-04 31017 1.261092E-03 975 3.971077E-03 3701 1.277568E-03 6427 9.084927E-04 9153 1.041299E-03 11879 1.124810E-03 14604 9.488023E-04 17330 6.559787E-04 20056 3.678184E-02 22782 2.637983E-03 25508 6.267929E-03 28234 1.220824E-03 30960 9.176202E-03 917 1.780591E-03 3643 4.133081E-03 6369 5.599756E-04 9095 4.521608E-04 11821 4.335155E-04 31385 3.878977E-04 1343 8.888541E-04 4069 2.013055E-04 6794 1.293673E-03 9520 2.011516E-04 12246 1.280444E-03 14972 2.852374E-03 17698 3.863503E-04 20424 9.168704E-04 23149 1.215224E-03 25875 1.294192E-03 28601 2.326683E-04 31327 7.681947E-05 1285 1.240069E-03 4011 1.171654E-03 6736 4.572209E-04 9462 2.901929E-04 12188 3.926119E-04 14914 5.130023E-04 17640 1.044555E-03 20366 5.607470E-04 23091 1.084728E-03 25817 3.887035E-04 28543 1.615384E-03 31269 1.199160E-03 1227 8.419976E-04 3953 6.524244E-04 6678 5.817484E-04 9404 5.962151E-04 28968 1.610473E-04 31694 2.897185E-04 1652 2.598920E-03 4378 7.955292E-04 7104 2.092386E-04 9830 1.747306E-03 12555 9.297648E-03 15281 4.288580E-03 18007 6.392249E-04 20733 4.856915E-04 23459 1.146234E-02 26185 1.844554E-03 28911 6.399885E-03 31636 2.864202E-03 1594 2.822826E-03 4320 8.716902E-04 7046 1.057102E-03 9772 3.857189E-03 12498 5.175588E-04 15223 7.891920E-04 17949 1.947628E-03 20675 1.074624E-03 23401 5.650293E-04 26127 5.493931E-04 28853 1.093119E-03 31578 3.162337E-04 1536 4.636911E-04 4262 5.731404E-04 6988 1.723355E-03 26552 5.305600E-04 29278 5.873258E-04 32004 5.787968E-04 1962 2.477913E-03 4687 5.587140E-04 7413 5.248204E-04 10139 8.590595E-04 12865 5.286413E-04 15591 3.411490E-04 18317 6.333592E-04 21042 1.167577E-03 23768 2.112019E-03 26494 2.188447E-03 29220 1.001759E-03 31946 1.666042E-03 1904 6.451811E-04 4629 6.093479E-04 7355 1.469396E-03 10081 4.096397E-03 12807 9.380101E-04 15533 9.771852E-04 18259 9.387092E-04 20985 1.796349E-03 23710 5.808801E-04 26436 1.556493E-03 29162 6.438167E-04 31888 4.122168E-03 1846 8.969044E-04 4572 2.728397E-04 24136 6.784681E-04 26862 1.246364E-03 29587 1.680853E-03 32313 5.072682E-04 2271 1.854861E-04 4997 8.002766E-04 7723 6.886625E-04 10449 7.213067E-04 13174 2.425564E-04 15900 5.429324E-04 18626 2.458674E-04 21352 3.533097E-04 24078 3.849826E-04 26804 7.527438E-04 29529 3.319036E-04 32255 6.979374E-04 2213 6.326417E-04 4939 6.761690E-04 7665 1.108872E-03 10391 5.806101E-04 13116 3.332751E-04 15842 1.242824E-03 18568 2.114240E-03 21294 2.290128E-03 24020 1.032811E-03 26746 3.774135E-04 29471 8.700287E-04 16268 8.995404E-04 18993 8.144235E-04 21719 3.915108E-04 24445 1.229944E-03 27171 3.311058E-04 29897 6.830165E-04 32623 2.235148E-04 2580 3.085337E-04 5306 1.393266E-04 8032 4.356533E-04 10758 7.541666E-04 13484 6.845300E-04 16210 3.873261E-03 18936 2.514560E-02 31869 v_sim-3.7.0/examples/demo-browser.tar.gz0000644000353400050620000046102012215546211015135 00000000000000P}/BˎeɎ%8B_oy"2I/ B"I fYЦ{mSճlEr=˿|5k׿6;/A?׿__7|o?Z? 9h9X>^{OO/??.}?h^F|{^_7f}fsZgz׼ /7OcX&7_z9f^}6wM;x9_3y\\çY/*_Y/|>m^\v5]=V5}flϸF\h5߇]#?ޔC+;iw==͸}ErCo$gC,Y4_nX>yZB|y$?[cu}?\~{e5D;n|'ϷtIȶ/߾ˣĽ/vm:=9{ykω(*;Zcw|>s_Y*g?tcX<$mȳQշ3<9NyKˢ?+G|+Qmga^IYX@xc"bVG1[Y#1۱Vf4hge{Ք~5[@ޮ/YKCm/we#yOQ~Vo+n,؂h`+U}-嚁C6BC++lkbռaleǔ]y]rL3Y?S]n!N.R\ycG}r}6vu5~ߎbsrk~S],~/nFpqx5k(amTz-r;XA8sLp|W֗ǮNj??o?g|(k$/MNmON[<#<ONwUmx..Tk,ɟC-|=RTt3w ivo(PWhƾ`v~AlwO5`Zۢ_w!grMӷC3z+7HwRP!.}MrFWB>Nw8Ll x+;Y)_ˣ`M VP{ V>2;XV m>sҶoRbRnHySC)z'ԏkT}~e=5OD\f"5ƴ٣Zyo_m-o&Jc~^C~ :`O_ʇeYQie\֏GF1 "X/]S,Qt /3v(O-,v&Tb{w B% Hnh/Esh+ChdIg,m^\j]~)_V'nכ;tw GNHPջu( ˦?k-<_~o._ ('eM/q, {t:-,֓;Ūv,-߷tYs:ԭޞYNKNF,[޻܆©9~փ(T.KvRk.ݼ 577(ٛ zѢRģ'%Nx3qU)mּ[*q#:}M\K}}A?T<\bC]׳ߟ< kmΓYꂀGv9yJ1Ǻ?S$ g|H/vmbcW/%h =ZnymVk?)۷& /eC]O^eA #117Z/sLʦhnUHNdoƶL<7:5曉g}cW(a ښ݆Ko\VwVr֑ ٝ79Vv5!CD~]:SA?x(ѯKA'ۍV+Ѷb^3tih~YxAMN9O߸U:*3FtC] 5ho{6$&cxmhf c~[MZ&.C*;[q .n9basߒ8r)K..c? (ڧ@OXcϩVT򡾿<>^AD=;β*n{M~Y?RPŻLCg`[!gszT}d왉/U9oὤ;kñj++%;CK]kDRkNPJ{(e0ohA}Q|z[bSqil?kz+[N7yv@]kKެ%4w෕ =ٺC~DgX1œ_PF r}r}{9N m$U*yc ׉2u U-R!ӎ05BSVݸ:tcR#huGj=|,>~oKFF lqʁ h-E&^IkcKON@:x)5uov15&[tM_)@~{Ȏ?V OH[hά@\?64` y\CJ{f07"ÇFG4-ZQ4^lxMZ}<7g+='gQ$Ȃlސ l@m|wv kX#6CwGmHy徱I[{h8ڛZ%{xܔ-2&@ɳF\+op[&R^c ͑U/*\g%6A#eXhi1X|=\_jk)m }ݤֶ彯+?6)< <7_pπahgl?P(#fz9,؃l:O|oZ;reMFm齔M }ܮۃ#a@.0g+-㏵5liy86aRob4}'1ֵ_q&QiOvrvtJ׍7}p!0]&Uz ȷSղYqKHMoQp]VW q: p{yoMq6눽(֨p;(YH12[G;0]Vns ڏ(ACD}%} >#ќ8ǍXF&N'$+ @ym[TOYA볁eKLE4ј>zR7(YBuÄ}S}.2G>$+@mUg^zq^ LBZIC>E/c#.Uk =!}uNC} leE0poϼ> EFgћA^mA<6 92~[_O~CGNÇRD9FV ϗ@WIO Dn/ս/ O?i'ơ* E~?Rߦ!M2)U. 7zF/Czoiΰ<RGFwj8e 0$ͷ?95(>B-U90 fPm|xAۄ =隆J`W?oir2nJi8{U(Rñ@9V?3oT<;|ϰ8eMQ/"r>k zšQ1QdyQh]mp9aJ;Ry)U"< ;WT. Y5*BZ> gV?5fcjOJePbʒD9=ӷC礄JpZA(Սy !O8뇋u,hž^c"'c B;#ȡ Hž̫h rU~*_RPKf!j rnT[$@D~;IE-d2C=wVپXǝAz !uNh O+??8x24$x?]+Rf>"`  B dnFxy`;#ZZܠ^D0yYAw9;a'9mj6wNowg*ýtYQsogl襧Tgq@w(kRhIx+Oq:;Q&+gLŶ6?oޮiof[˸Kg&~6L)VX ,>[0ρi]Ll`NHNs5IrHni݄.f[2:G~}f:rl߉:ny/PPу  0Sn7UYm'M7mxʮ>1U;D'co{H'm|(HyQNQE -Zc/(v>HIcXx-"]Z ̶w>:iqNPfQ^t2[H8746OC/ U5wO_˟2]stV~E_?ӽu).Gdz̸0誨2<&;urtxNo.vܥG'N>|B~[zrNjFw(7"c u^ڷ5dpiZx(JvJ6?C59~X\v WauRJ* >;:Szv?zg/ NlpR> cug`}z,x gAqU y:M6پwVNO*0 m*}^" f>#;5fyV_ZɁy %nׁv3o[8S=MȲ@ 3hsAqyBx&"{sFs 7VELҸrta4?䦻( GR)3>{zP)~_jZ?L>,C/\1x͵_dUr GFjZ7;d^AU#@>xB=HO85耣GRǭeãułXwG0ҡ (i /WNwL Áq=ssaݔ /o~J-{*V{ْT/J*IRSP`˫~gvw.p kFW&@.Ũz#۹~xi$]&ǟ(ٻ4qG^N!hH QPn0,܂? >ZkT#)԰y;Y{H@kݓ֊ :ȇE"jo3τE}pЬ R'(RC!#++zyrQQ&|&<^jBͽ"cp4bCrYD4~fD{]pp0Փ p%INgʤUxSއ[KK~}&v83Vgv3oc~[\]^7D7PY@ic-_t XĪ4c QT7zǩ<|l`}X`W WM)ʂfɃU a3V&_`q{3EdS:S'oI9咲M}lS6OFMD.enT,2sΚw #28_%W* @tayze 3 ̷><scU\Lh Z(4h#)B(K]fP[ jR"5)ҧn rjn#{sKmiɩ&]4ޠܑ!  |TW/G˪Z!kI2zJt>SO0g]%hm'q* "x4p{gP4!=H`Oʽ]!-ׄ/_MT@r5t~M[7Ћ~tsao;HJq?Q̔F=#^ XՅ}(++cHtyNӢRِP%ݏ Yq$ط/ߘBO~2J2tAT:o巧r,hCTᔨuKk'=pW+#V[ܡߞA#r2jpyjC(hH yfIYu "Nۘ˘`=k1" M.+GG/wשR:V|Y:W?__NOa:0-`~7m0*938ZH<ӱ%ldpުZȅe%<s%WηVk_8 f7;W&ظOW},/+n +頗Dmven)𪜙miDl_']׎^3vCe뷚y'I54_ށ8I]⼊h+)Ab)צ>${6mpcO̗;ǭ=cC[g>#֬yͨi}X؆uIy O7my1+Tۭx+bgSs.'YB' KmjAxg'-`Dd|*1i-n5L{G/94}=9& 5]̍Zua"KV4J[Z)`nr?O&fK&a8JWi3{|P/s5mFŠExA퓓yLH9 ,cI$,O_'6X_DMjn#z(U36Ca1;ƶ n$ou#vFv(@qkqJ|ѴNSmit:ƈ|],je& 8ӽr6wd4NiجyŅj^+{|fzWWG-jC}9hUzFi Y;1rn%=Q/9ѕPG\fJ/CYyG],\0ۍRISJ}4==GLStNϒ_pbMqd ֕Ge8֪ ǂ׺z;Miܞ6:/#$~q8m`a/1ۂ=أ.֞0Z?ը)c;cv67IC|m)R|sFd^u*5cãģ5N_tdi`Nk~g> H ~]kyzG2m&%ĤH:{_ĥ4<1h^"b1Խ.{OM{ w4g82]2.7yцi#7JUֆ!8t2VݺY ȭ1)};[ZB< Eޒ5}j)AՓ3#4K=J3??zi*P`Ebaǎv9ވU*SC/GܬYvлvow z^*yHU?Q5ooi'1F!#tg?`39l@F$`ZXpp8ByzK}f^Z|w˹T`Y{L{}K( Bt G g+!7'p"&su[`!/]bejg8Mj1AI nɔ Nbp?8BuӳO:`SitRgG(t, yzq1gXėz6rNÿ44/Э `52b.bɌ4" F& jHMG [>JżM{) Bҟ8F^ .?qjqڇC:AJsÂ2ϙܐ%U}z&c2[n4Xdp'pַ$s,g-{ l7/opZ=j{'( (ʫ$q vve{] ~Y cBጫ.PJ޳AӌehL\諟{n ҟe32m>Ǫ jwj4oRb$C iWDHGO$1=ٛZhj _'o=!~g1Ҕ_vA 3Մ,j=$a) Jyduq۸&NW+?Ʒw++4cxh<0X&JtSf}Jwj_[=bo0{ذr0(ap(sH>cpV>s\9Hnz}.'1PBêd۠j.\娣+j3a=։4\ )O[nz|q϶Cl>l⺭tޚy}_kLO {'b};]jΪ%r(&wzYR'yL)`=\Bn1hFSP=֨#$ڦ`ZUroGkz &~` s$y/ ]zcf o庹6 5E`4AC8yfbc{$ij1"h28% E[\m|v6lX4\WF-+ hbU@-."L`$ Zǭ*ky0!١Wb83XH0bnO2Y+XE=9C'oIP<]JAr"`\gaVC<M`tMarI0Mj=|}LUar)+"$0j'ZƝEA. :'I@#认Cz '}L-84_fF#?Z6SB}l ݜzG f)sE'`%\~/ZgvC`H\ܽL"%LH`l# ~j5#0F"57̿|XOEL?Yl`>wLLlB4k(>9HoA OJR<%R|Fcd6LS}_fє,#gFiN1/Z v6Teeb͖bt}ipQ*ʲx?݅5 }S4hRjCq 4!G3/J? μ[$ZڬiG*Ϗx&ܣ8dpţ3wjr3eKU4@K[覭@8N '_ƃb|')6SűlԆ[a%$D q[Q6)?Ϡ5;0DYGfI1AbqmY y\+FƄ{䦚ALrB /.Oc`6݊w靲Oh>jniX:83Ԫ۳)m{F9>t b5]o {UlyZz1wꡔ+a 58;m?K(q%׵pZ+cNc#3ܣǼ( H߾̿3g|Pi\!i g,?׼w˒oE {2~; lTJ/mцEv: -3̻w}F=[Ɗ6N7/)Ǖ߲}/}qm'`LշOg6^Ľ7B#`/\'F S ~{u# %j9;vl}#r/닿Xzku=wCǫ^9?jaH{/ [A"3c@^&Pci7.ྷwU:b9|Z<* nv(ZYi1,x%(뷙׌9V/9="%l_@dH24vO.Sɥ_4Z_Bl}6y/\kJG{ J|kJt*|9@'} bmg K⩒R;RIv5Ab G fcHUI$#o*mn$›QlJUV wy@ʜEIrJxjU"\Z2wzDPZ_g*{4)35džN'Ջ:o3~(ל}#_vQ<'sQ}_2ɹ0dy?v]IU6S @v4~Ϲ?mo<.6YhFN>Oߖ}sJ3!*uovR Ezw.9)ɼ6;l0\qKx ZZ]{zLU&*j=EܣKAYBB'~]%-׌s"MOYb":L+t"-Y'A p{뽷`EAk#7z2+d{0W-#xU y[5+8ydm`fܠvR$5kFQĿ)%9-|DI oM2ꅮ^@< ϭ=NF(* BdhIHaAۆf[  AXg DՄ&(mr=#x`S<{iq7v>/꧰7Ww :k^T*+2eO3țVy2@ Vsj3%!X5BZϱ3FY8U]jJ1Qٔ)Y~Sl QW[ݕ[  ?N\%E:Ft_ϝ{O[`۫{s=>6\h  UZWv@u(G>"%Hv>-% ","d!h7BRt}nhvURc g;/C'Y5l&wӜG$VA\0֠ 4;s,/1З_M֟|;Mu?qZ9+r&hFiG{[tp B>w*of?#tc0i=)Fpgx,DbNxw2८ɪR{p4HZN)2wo="E.&k5C o=HϠ Utû{͘]ۢӷ:򧾂b 7VZ2 8LHzˇ_(Էg'yW8TYHN#hC8ݭh(x#X[$&WבXl[B/8-ʹP߱ ZֺƷ\Tdv_|-;Jo]?[@FSpWS[q0`*\Ug3zsS?;8<h&h]_87J}f!1lfwv+Gvez;;"*sSlpr҃$𪆨5<{7rǎئdoK3?cܳ̌h01ra6 HЪxk;*X?tHxZ)'?j];^GjGK=@K DG@^4Of0LSGV l@{"wb!{\VWQtT815d~[_I_?^A<d( Js_OO n一'sC]oyA6:Eqڶ|P a]Kd, '|LNSx!6^`]?P5?9cecW@)dzOx 9Phǁ|}3iH;N?rNMwam(RYPVbBu{b0!o)OXV4Ó+eĆא}}5OE\AhXjO=bi,?\yw5p\0xi!ܸ u2JkUţ%*<61f Bv_o񺳩VuyUI:hCwZ) ykZm.)=O7n8 [~yK2Y9Kn#fXܕP_3QrZ(Z?|'.nΦָa][LuG ՓnJr։N#7Sz.@MoT9ՐI c¶3xer׃0dDEUE3lɮ[):U6<)GTG:f'trޓΝ!peVܼ'*\lv8)e7 i3Fnh6 bkQUyoX؀Ni1Hj9ԇn'|KF!)2p,*+T- 쩂!xS#!Ś\+uBM 6EIR(f*Gocql+"y+`@&jQV,#+[Sl zYG6*3ҧA\;SS~7Rd7nO6vFaֺ_A wbfr'_"o;bwѮڱc-mF4p~~N[ oOyNhA+>~ zo M1m??;JýfG ORB(6:iJr#a|?o]6VLrv,EKsPDW'Лbh$ h,2BC-=k.7LŴf#8ڤ_?t֎u!'o3$ª#z|"mX 1re̋$ʯ;56heџ W#");zzۯ(r{UOEٯ`F*"oq>;$\sЩv"s)hD?G Hxގ\RRM(g3#`O*G"LhIj'\cL 9:jwƈD pNQ~j2k,@Z% ym'hG{hYl;*< Y} :Q|h~>jXc? $;GaĄozrrxK!Z#Dze-~m-~e:}L]E^ qtCʅQ^}M7[TKxQoϬ5'@7--v}]TdFz- 1JczJ[u7W}U"NSxjplZ+hFwLH^Uf*Zr5~SdӸ6`-jq m)m*.L"h{}>^$5]#pC&h~N(6j; : [Qs[mC4az,M65q TR|!V30*/)~.\>_ rOzxru6(q]:=^cs4D#p(4,vUgPrدfexmY@WVKf j2Yż]YOᶔ?I3""XJeܞgHD&UvGxrPwo: ,bsh/F:?L)=o1nRdH(y?BJob@P2~k(ɑˇ%D%ky+t=YOX Ek:AU hAp6?'vS8rc;(B5\C @>]U I\Ig;XJ9|T,5i||z5n Ϯ:"eed277)_?#ǪXky!>]A}!lx2tT.xe[0daT`+Dj0p_V_hx @l?9⃤N2<5,sLSB5fI[A">n7 Bmn&rMɯ ǰzm+}`6+gSizFkʻpߐ23^4ȏP^#f]7FT7z X3yb8!M'TE ^I Ar>\,pkJK}\lTdZ5-[?8m d{Əzj}yڃ 7_L+}OYV컐AJ@4S#xȶ`-6%9Gc pOTDV ͷ+NǢ]5L(IfVP~T=7gk|؟ )jK9أ4nLoL3õGAŊr?(c VST8+qvc/tR{r`Q~jFp}FqG}/XtrO3)r {PNٳ? 6 {r27  4HUoLD?.jS'+A' @;_> 3HCw~ǧ{\a]LP}A?k(VUy ԓWǭ{r[]V i=fm/C4r.x!1GE(Wz֗Wi#%W{rE]2sg1Z6 O>Ȕ;U[);ҽvga[f:@ZhBYd Ab.߲< ߮5_3KFʱd3 a#M(fG*g6[J4h[dߕrorq f}zG䏶*R s0dȀ:Z"2L?K.ěfy焀m<ˢ(y6슳pNѴ`@o:6o%27\_JS{0\3=#)gZzy(LD~t%ߵ?JI.w+JM2Nn3wwoF76Hꣃ#4n-~#/aOq[6|$(30U/~T!=&yZm=\lZ'/}JМ%K9 #-fQ 1^Eیs_fa<޵τ@RImP!}kBMﮍDѐ6ΨTjmРF# 'm q^=]{ڈo.r !N>RD2X0mr옞""MwYQɭDC*yR<`s*u.8% B1RY 7JԿgp4RWAȠn#"Db%џ<|4 2$X=ES7L*O ړ?e@Tm)|8h En+/дxg8 ҹa:֨}#/~)|hجZ-ATJLLn!xP`c}^ .=[JbݰíL6x z 9)9!VNR)[+،pg0 'X}%\`(_,/grܝ_uhpp!R&0䢩~{e`ai&?YNeXC]Z݂!+] x$7UʳMs9~ ?Pqio̕䡼Jgn suL6Ϩot>a0ǜ]ZA,:]=̫ԵL!l>TbbוmU=9^nUW5+m?=#@Nsoս4 4>亃o{S*ےC#DflwTxj:e:"Ѿ1] 6YWZh4 +A=?Cm"_X@=#31q(#4WMn.lX߲y#SC? 0?7hԘx lp65XL&c`_v9{C$O7cxP4MjWrˋt.gkQby)hQu;, o~=Gg<e!35\[fjaI>bLĻjIWūn_(G&e7^l #Y$rm02v:|@ ?nޢ|s#[kRG|jׄ[ M' ̖aozt6?a3j4A<( emloedqvu>e$4r]D76W쫷LX&LqDsJ[nN$\*%(aήvwK9_Vcsf3 u5G8 պ i/O5ӏP# 5w *5/Ugv6$\S}и^fCEWP%MR/ }| R,UK{3BՅ.2[O+?)_?s^z]ལfÅs4 "< s`,1ݯ,`^7uoP#߅Kfo{gkb{Vz{Yo؂wcm6[5F q.;&b><~FX@XD!?nKhph@ʙw}} M.7 w`dRcAb;m}5;wz??BҮPȟF- 3]AsLfP?Vsw/uD\ܩG~|ɮܞnְk|cc|p3DOv DP< GX}{Vz.(rA 7Aem@pO6_&x Cv OqO, L fK$Yipo`}*Ëw#4IJ\?uݕF}Ɛ:!z23LghBC-HMGN܎Mu/o`MZ%l@)oј1n֞ 1vqI{[Ǡ/ M-Q,!B.ӺAj!( ⾡c.ZMZmsb? m2ŽÚWaփ>W+5;6FD)ni33"N gf3JB @yΧE95G 5bW^yU^ 8OЀW rC?ҩ4#꬝c#MȏVwe M0[OjT@C&Hҕ=`WA;4zT S:mu6ƈ{9Zb(J _57|݂ߺ{i~ p9crP y>*4i᩾wzvF!jU:dl$mً0W@i߮o{_AxStPyYCk@sce^$hI6R~*-\ K-ރ/7\[ qb)118=?XcR}? @#u(~nocØeŢ8 XEKݿb1HƘ}ޤZ濏E ڪڱ38xPr ;^9{f"yl5$q_?}xmnOO H|]2ߕ#&lr0G~N\ёZ3&KDg YF'Xl8"Wq{E_?BC̲\XrkSFuNX}H<ւB*W^bn03e/10pOki#_ՂW>-;:ʓ#$og?|ӻ޸hwy3{ vb8DT)!Us@slou#a]Ֆ oUZh?K2.t^My!s3~9K=wK|p`uӂ 3 y !1ʈ`%t;Ku wT{gjӂ[9c}f|H†b~o*J6nQߞ QK# OU? 1Pv3D'-֪o|}~D[J)`VoPo՞"U>$ط9Jkef&!%| OcF?hA?ϣo.>c ܟ8lؕhMʈ`[7&c)ŰF4nF|6I*mHvҷru]X޻'#=g;OG=+8+k}!^1$/ 7GNϸI9Wïfd֩h"R.ܻ&"H1]C=.XFoeCϊMow3Qs~NA\2_Z!sa1Qʨ/3=Y`6( ___o?GQY{nuҟᩇ=Zz^# qli۩eKUEbxu=M_GT *su~ķ.PѵUvwyb^͡ny l``VIH3jxnJ; G Iqy M\.BI.U\^i9BMuTg^T̞ǓıVӦ&JL+}{,*yzO%H1Xd3rSAؼ8G\H{ /N vd"(xWHFir\G>cI&N"@ug 2 NHa6鰨lpUG'ִ+pGx9Yp[3̩f{[h`yz(eF@AJCP-mGC)L?}&:Q÷ x\$״S{7FjaYgE,ka|aԼ>[/GݽW0\ @ҽsM U6UPT~yϛuY[LxP$jwDW%NCQ)3Qu?1jJ_>Ɉ]qZ]csaԏ},[G/S5>³Xӓ #nb=YCHC̀QRu#F6M9f]?½YjW|~~] q1i7-lCK4n!=cB/K8R6Qg |/ܐaoX@w}<,߾XI9 o&4'шn+z5bXY~9Ks{#cqAJ 虨Flno ҡf0;$VR 7T~>x|Qsۺ&k,cKA}YT FK(H?ãC(#Gά9 6*U3-fe8ǁ`St朅jPɁ?db9;L.)#Y`'u5pUSTD'C Cő3V5ՀOŕPcyZy+PM_w;I_?/2A}BldclC˛d{W@4rR?221Y=[XfLS;=yǶƌ!{C[HU+8XYG9r49yt@Q\+> |@ٽuXg1\&x5`hxzxoLj TCvk A*3f1[[`ZiOZ"wƜcp8:"(:x_ͽR@',:Iy,nr~:)FCW㿂 s>&]Sz~罔rC϶~LRcwJw6>crNpT1Nx_9ڱAKy `|OZ5RwTnqA H>'*`*s& py&!hRVb’y" jneqdɲ@ό{nu* i FpԻ.ýfaÿIc?LԳ@@!1m5T17Cip |Fw0!G%]}_Y޿ EJ0=8MG ԃ ! moiy+.oٜ%WMoպTA%xkTnttz=Gv!v_ԑ0`^(~^'p0WOpXfHH^X΃G{q R9Jd5u3/ 6jvf ڔYlImS3ۅťBݾ׺$گml $ ֌r S_׸WTș-$SIĚiBEE.!FugI<13U$mv (Y7\#p}$]倍Ϯ*nL?4Cn!n,ml֪L@)\O 򸭠0MiBtQ+ ]>GJ0fG@kLFҧ`VwВm5kr֑ID9=[ϊա*Rseg߿@M)1ϫQ|X `hJ:u#\5:l@ w?;M`\kjjZ"C)RѪd/4g7]3}M7*eހWKi>Agg8jޒy>= Y” ͙9Ma2OG%36VIv_ZPv_^?ut(*l.T>2 gPK}!cK0ytva:KOfyr|!Op{zXoW_3ehv5 \O2!ar$yp6Q^f vGq!Ƚ𷄱$R6Ъ"fǹ{B~RS` DFuar>O7 -;:J>T|\"pŁ E)oY0:nn;V5툻7K{Ok&`o\aAAhIX,WvV[oGy7mAk$ۢS:1,)ِ9GI7|&_4ځWOü?a?kJȴDYnul7A7" D}ӝJr[u =$ir|On>;V9VG6\c[ T7~'qFq(Hؾ"Ƞ[O4%xPB2(\xS #cquCқ?^tFӁ^ј9?J Hӧjq,4gN&MqPStrkM;(iz+(sQ5?` 6i־A;4V f@36lt+wxNtkzS0fZn 5x}<<vs79Yjr~j%.\RZmSU#Q}$;|,1.i^RN˶Y-Bwt*$r"]S}};|`OURVI aUvHwo%pR؅o+M|i=0h/~j+Ǎ^y=47VW/qN~}:,U W)M-o !fFAQ;x;ݬq̮FLFB1f P8$9+|rHiwݚ;t=ڶ[|@Oּ@3_w~׏ޞWU[;[% ۩lޖxOO V.XLnhJu':k9iˢ|[SЅ2@v ][: (؇Vf @ji>8MϘ} I٤l((/<脾|q#^3N{#56mܣj%H΍hVG}D\L_aӾTg 2[ک@f8cp;sA M:l}-}zgG5`ٌi? \1L>S#jf+r6lԻ1%5cL*Ӊ޹v@K)q% o N޴{G59PE1HK']TQ?ᖨ[SK7EA.;Ԇ;U(y:+C@7RFΊF&]8ݬ["fʤ9y@-(.T輼y ?`q[3 (.E.*G(,ǬE3`{fIyeD b[=A?771_{ۋ$ȲDG lIn  jHIo*-!m$(edy{T[3bٺ JS!6&HT ہTӍm-Al,d Ldjr-.Ja3et[̖Q-6Ql s7=o^т .Ubmpz6}zNx{` lG?% ,데Î;WRχÖl7EƊ|̓NHݥy$r[cA@]R2ixٲ@zsY(14j44wH9ؓN'R*W)o)_?ƭ>Ɉn\}xkW+X Z.̃Mm3͆w%`Ӎ5v [;ȉu,t.T:ؓ`xt ~]46܉ȍQN NQI8(t+V^ aX1ۮtދ]kOVz u D̕j <&g۹3x8%Gq TSn%?RJO3V~z;7(Co $LU+i-)`{)OR??ܟYUP?gyYA[C4A2UMPog}۪ CEFgo9|;̻t|܃Ȣ"zj$ds4NF3`]UTnjy[#T^iz@8:zwegMxcdK4GE΍m7$V7^/@JV[ .zcܡgg?eҤUNgS=]\`,Xy&Dټ*gyua>g7F͊H K^ХTnAߟ'HTUˌ"X O4yq?gh7J7Ip cXսGl rGE%P% Ze,}^6}{#)u#2uǔI/:Fslps>pԸ,-HdȞ7W=,M`$ݶ%|-eG9p#myE]}Fby+WDesJ@Fe8RjtZbbku fFYR(At2hSawXq g9mbhw*l8DW'e cW$6rY(z:'F/. _l: Y`rX͵n( VJed/Į @6ϴw"7oCǖV0lӅ5dڸa~n8-!iTɉ !l f¼ T'XEkʩ#Hn@-މfE%_Ztqξ~:P- (B72=qj8'biV4bU6 SˏpݽmtG0h8v6;D;zڂ(] zڽxs+cOBZ6UAUOG%KeazU@ =V?˅zRnTIoLIoY>Y7'.x4VP {~g`>(>e~Cf6 r=k+e%G0}o]c2gnD!Ѧlζ| x=A}'0Y- VŮ\a k/s&_Im:x%8pV"*=P NΛQ3{otwAxyP ߹k| Yަtr~8hֺ{d2qmڄy%n58p#w]pQio d#gnV^ }| Iàj '?_*hK\Z! {)GG I&K-cWX*o1KD qKqLBF˭_[lː`Z/b գL3Ro\vmZ}ׄx짬f^.=N#VKYA[f3_ǦA*2#?j(d !1eRa@CXg30SXKihTzJ0WB]ueƴ`Jڮ u"@ë ٦㚡^?&X K 5fENywU^ vC MV2bhÔj,ѿͪx&>)K$X).Ami[' bCh4gig75|,4*Yh^YQTKP33h :{>%"JmG J^WU8x;Q67' wԕ*@DPEh*FZ)7>( gXSKjVbVx?|#`6>ϊML$hű!l@wl6Sp(ս LQ&֒fHɈ~RPF#7J6%0h_υPM>_uQڸI0=.|t!ȲhљS9qol#m a醹l^1ҿE~=ɳ'M&AF_=A >0OP4fx'ix#Ph ;S*{ /ܜt&&WWkīn~sg&7Q8雹/ۥ}8,,O14/ Hnš!$ojjoUYJ:5ʵs+R]iO7VvdLy!l)sTF6B52 bڕkk F'qlv?6evpu{ 3S>-B`] k"eγ:6Q⼟3g5{gg37j ƒLޗ4mZkp -sb%w߫}An1*[ѩQ,||Xk>߹86'!~N%.%L BィcwDSEa\? ̼AEOf ܆2\W ǀv5d_>{&B~m7oLn?w5ODd{kWVv_m|dnP 5b<ʆLӦb*yRǦ=n +2v_Iv7`cvª{Tד}uf 8haϋ{hֆA* v6!GHXk9G9x6FI ^W9~7@Nۜ 5Nu^[@mo6D[[zϥj] E};_{TPGqfDj>Hv\t{_D}B7)P>o._pQ.MsO╣5nzΈ~viDQO3Ywmra5vW1HՉ"s%EA>E7n $qӹ\ۇ9( (ԩx{OO{6BdPv @O-0I YRlV bkv!~ܬ?҂؝"s}PTsBVn@jt4 $z@ךKp,6i5tNڻ\OuG߇wF%!Lfq%'h㑽) 1~$ow9|׃dMg|=g%FK99or6C܄s9(&#lw;|MBMp2bU(jO;*rsΟ\Y'{d% n sVH{Y-W[r.[nD]'᳢FV]ƨ\:%igt/{žy=Tvkn>a1].3'ml !$ \@4燛C8|)G? @؜~U1,'PI#O(|16~䆈XpS(yFw\y9G3E!W?cJn) 6=-TMW>czCbxEA T6e{Ef?kN& =ҿ-lxNmQ[u~魲=o3zP#Xӛȣ# 1`?rWI,V;>2T~Z{H>RmpD\Oг Y>}̏hTڐ*'Own~L5,[K>%%Z W^P&al)?U}ZD"IE{J̬! 'v~7YO!8Re䯔=y6e~u?O ܽU" nzW/:zV|7}̬Ϡ|i-4,,, lQϦ#tq?k=߃|POAE/_) 3>rĸZż\ȍ23iI5{1キW|; :Nt OL:E̝ŀ$JpNnQKx \mϤ9& D^ iicdꨭt>õ>x~K*o5%W W ?" gVS6WLѣ3b5w1p}:q'mŹ(TnaNoɮ nO5 noj'xÇ*Fs.s88 I"!Js鳧iH(7Q ?[*Q}fS:@嘗0:A o/ʹpN(GǨŹFL(‚uul.vT;'zx ߪaoO6~Mz !:O^k3^Lhk^m'mtO{sa'Xع枲,0Yo pLX֬HTveg5 iA6sӟv$ه;4W꽊1;s4^)n)(d PI}x t'\LԹK չ<#xߑ@|(ƹLq;L.3D07I+*'cTtr#S ;MbLw"mOu^ho-4p{C5)߶ɱ6%la0(Ax74PVQCq޺׸Qo+77ujd(2jYgӌulL\n2ܖaf vK]12 / d[%!P c)o \RBJ[o:$i$@~'0:trBּX\ѫc^TH5x k[ʈM EƜ/߀ _WMƾ 2|,Zd{Y8B|dNfV\u%3d/Ho7z_Yϵp 0o*{L{F@cPwW \n}wtCJi8IPP}:(. kh&2>^ۛe#EBgfH]yGo :̦D}m?)'{?rNɫJzެ[XnaFBP 6} 3újʞe8rd)6>p;q$IІw <^q'oSd lпHhbBή'Yc8raŷQR4nܸ{FбOG_XcUP9Ś]cu7W!13}-}Ā AkO10?R_o3< 避X@[LO.5Ӛ0Z1[#d /)6Q=ZASi Gn8DO.Ѥ8IK؅q_?{2 _;'W LuDڹ F6, 2De(0Siln[fTp{.[ͥ?#D`GU_<|2[G))X)@M.T_ې-~JW OM=`tkz4yl+sT4t(T]?þGd@hwX݄- e ?G[߾NdS>fZϝ_bxWh[us6;˄Q{x˱_BƗDJcᛓRcz?xkA6Q]ck l6jto`·ywdy!B֞꩙h­-cW|fHc{(6oG\>A֎h^ho!F࿦la)o3=f~2 3c 퍙frTvqT/}2xVݖ)IinAm|.ԇ?í\ߖrVh?Fx)I*Y>~0ü4">O G=ڣͨ92l7^4i54'Ӎ$]{s&CYAij >JeD0Up!K'l}Y>goᵭk5Щ E_ $ u c}n*i Jπjv$HKv.B}QAN皵.q 2>w갶)X֊=`^]-D8m4vaa*Hϵ!GaJawD `(72[צ$aY3ɿӄtCj@A? 3c<vؒ5<]$w߈-lDvQ;1wi78XЮg}/~3#j(?܉@V27W?!{2yJȩZu8 \a{”o] 8L;=ƺ̟2Ck^I3h2ö-e{FT,7g;{tJ׌{1#3[/% -*B`##C+Li6} 8S{ }DVLkFpK#|1RkSɀǽ)mQʉ?7gj߸gKxxz17<X)snVw*kkZ_Y]gi 9ܓpI$%6\ʄ? { )'eG18~Xskԣ?9oaQ{H>=&tR 2S ӕ 1lV,˓jSA 52xU.ֆf4ТGMY`` :lqU(^pS]aZg gYN ݣUfR]*=.26.?؄a.fv7S\8f)3k([ڀr!]m0M)ZLLT391},y }+޸}T`fbARܿ ؍A?107DxpO@\mĈVHûvZZxʲ&K/\`]&Wj9ԪzpXK2?]UDف8Pơ؎FJjB؏Q6_MWv}~lzΦ4>,#o3~9;+JfyCij=?)姲0'+?3>'h;_#fyQ?T?3Q"uo٧児p0ArE曛`oEnJ܉guzgBe'b1  ۾f~.[2ķ -iԌz޲/xVQ`Oщϧ d·:~qgł!ܭqcnxP> [@H@O!}Xnvm궻b _m]䃝U:/|{}Lҕ3v@;:23[ntx_2jxq[vzA#VŜ S18 .gzm@~lIt [=$FA?( U<˜?!m?zstӛW ),*:hA#w?ѾL?4:nl(>cwgvpg I…zւ!60ViLlM_ˠ7poO{Eω-q1==4LS֋ɚ;]CtQ %oo^xJ/j'o Pйxo=DOcq>Oz9C[v'?K&EAxZ>(4v/2k.jUoRB+sc b]2 ML UτMзWosCD_~\yJE>x'S qT6 ;gHցZyz'yCq^Jk\RYme?v(>vV8ŠԖrU,gkƖD*B cx /V:v頮}=tT_r)z@"S[F9 H+Pn+~oJ׀\V/_,1hy|V¢XˉR)+/߻ EgE2Po$cց>J-1ղD*NDAXz!HNF{[PL; qBb?+s] nSȥaJsf{T5,YDE-kڼ(l:Kq~@4)f5{X=DF>QmB+>h.Ȳ="6wK(J0i{nA4AZd:7oO_C ޙ3k,L mԞn̵Yv80j.~g{A-_x{D;5j FVzJ(ynWA0~iW-}9 b:)ҼuΪ>ƣƹDrgF;T#Tx \ÞAfxULm4ncѓVDD {Qy6BR&CyMmS&] ;+ D~oKo ޅm]&$rh $# c%I&AKk7Jt7W2ݾ^N֣OKo^r >x0ŜuF"'nYa}'\ SVsV'&cIz]t NUrQSg`:D&$샇kB$|ht2A֙A`avH> Mڞc}a H@R"{O{6y~cI|@AL!:iq@- ?؟OMN4w“v٬ڇylz3_ 壇 ]En3LS&ixkVj޸ tz/AY42\NgՉN }5mPH;e>ѯvKZP{mr-woi`]z^޻+ *'|3UڐEu!l I?6sC(Uc)kE['$ײw!?FIڈ<%viX9Iܒ<&8^C 1G(K7BM ed ~,M'碯?HlP7{B\DTmNjdF()]q!zcgKuNҴfG^G0-B9}?3Mc &>pSJ;Jp~و m;%@6K-8)JCٗR=0a3J[n( jѝq` 6,NO~׏7(A- z+,yN@ƜI(W׌HM> >!mF9t|Wx/I*D#yoTi~'PmSivDVUl1/2ad1ѡ=SdU:_ :%-k%xMO.~|-o?F@znZ80}?˽`H /7 r$V˞{2SCdlt#%dߧK p  F#c(4p{IqQU&6o濙_<%eZPpεkzbyl{Pl(zp."AD`}*E}ڇ]Ӷ$JH( ~^kTYΰ j]NV=W0vT꡺&I zh;^[&x%q?wC sA.qs}tp0oQpMl@Ì[)6 h7`ž6L 0A?x`m- QHjݧ?* f9=ټWGN 99|d)Ha3P\bh[8 ^681w?> AD@g[#p6fRwz{lE(]~G0Zӕ}k{iA+4߫4Ӽh"ڙѮ}= uCX.ؓ=ۮ[].iU s v{ݴ!4SR.l GBt^-=pFQNI#HD}C05@ZCG_<ɀC ;PZ[}~ôJG_qe -{ֳM>jS Unb*Kچ8zY*\\WEC#SG1X z>;_6?)g|qZ9{.(d +j^~!qy[+ mfˎ^M9%ۊ[&ۇCIR&.`ȳAj%]cGr-*~^G rmֽGx',ѭ?/X5CZj h ['=-Йeq]y R;-c 8Q֏Ai8sb@.kjJ}18l.!2⏪osX:9zlU0 "'l,:}zݻ*.Sh1Q]?>7z>FF;u48 hNn<_gcqvsk t%5//?Hi_% f _oOEo(\ KD~DߛN7gj<`l"*Y{ǂؙQ|kWP+\NuuOV[6 2@[{FRUO+gx4ôvbE82BWVq]o1ec6WN>qo]GnP\Ç-#"M3}oQê0]^ #.59>#݉B^o1:ˎT>L /̸UVrCod~#1orO_3Ĕ.v/)Hp1> J C穷Y7A|4L藁_*g|X7絝^Ij/ A~q>8i] zmFn'~F%;6v6>K 'P2}%m$ӬǑ_oWޝj +>9 +(enq qRd (#i΄`+3Ȕ !z!@hF @5hWlxoښ[E$"^Ю~qP\#cf'[nz?ʩcϋvA(#[ZݬMbu|ĀJStQVШBtdmn40Bto7ڻlhiDo1M"ح$n Fzr Ȱ5ޜ;,*\t'Һ,&*`et&IנzkBI 1b*@[5|oqlEYeI-D^1 >kdX] Q}VIHKk\28>G&SL@佄ê\\16aryCtX~g"%qyDiF@N1Δg _ viCѐFEE~<߄jZ^|b|L/#j:4vU7W)_?6>;zyW/˹f ?;O0Yg$WLByj #j#&?U|R-rwAНVo̴n\h/J&п`![t5n\[ 0G ay'1ǙT3ؓ:ȷES+5jVەϔ*]SI#8:š*$:{v*!k+ݰ66̫fY홱0)?ZJk Rf\x;N)`ߪ1lU)! F9tN?+'GWýȃWXL}kM>Lm6wj[Q6 "[ccR/ЍquƖ&1] 4ZE(,u? RX?sCLkHr g#d:VGBO~cMJўD\?%ɼa;Aה r6:% mIA[i Ψ͡XeE$s#Ɵ 75^h7E YPcRˬ RY}AcU.}bFj`(# G.oifUm;=)Io[0jJPhr`2uN? 5<cT)@.~Vod>-؀H =W9Lsf8. a5o44/9W X%}};)~c~\'߅Wx`^frI4AeÊ_+NqW䧟J~d a:D\X ˙'\mķ۸w,z6Y>wQZ0%dH&}cVA+),v{״ e-7G|s%O6_c_^5thɯn|^\Dωb5ߡ&<)W,ٸUS&pEV&HGƙI ʜ5%}c \thLoxtsܑ7&:l'kD;ߙz\)އ3s_+q~˓sEp:L#z:g/ E_3 Oh|Xdv.jFezO['1Rae^ @kLF} S r|2_!\9d|mtm}qZ%\$3@p `(l.7 )d( Wxw_*4ր ~YI N{S7Y+ ::]O\*-Bh)"8HIhmVi7=-sFV͠ 7pwhS/D𔸠`Gw Tn_Fy..}KZj $aKjZm:B{k5{giO8r5&fpvx_vaX3VQ7*^:4s oq 8EC@y,uoW2q87@&sG+@χxQ(2}h(ФXo\}f } }о2Ā3no\hiInJvBH#·g*?0]}3 CoB@# |yT?]ό|@u@$kB[C/ )]GM#;zi㥟]'gA]v-j% A*3a*o#&:m%l,t+6zl|G#GL?HO?tGHg-oΆlkU"ו4O#Hf]2(Cܟ8ߜ!Fluhޠy#+S-LVYF% |a bsZN-j[ }Q$p/Q 埩M`S{R W5?M-ncl'@'g%7`7p?^Kҝ]a%fP+|r>x ٧/.0odN_$|Cq Ƿ[(7j?g9ר5<;#G C7&B $6tsO$~ BD`ovmݹY- 8FEp8 N_߶ߧ7M|ξ'ۉ/-C<}vNm>)hTxx5#xYs4RLûÝePGu,]vpji2;[ h؀mlqӝ;0<̋4uݨ]4hNZl'Hkeg,LߕCaEe^w~L+wM[ g|0\IN*pGa |ȱhTFraܰ͠tO._N%E%h2G,l7T>ړ0W2V>QBb m-b}~7&CQmԈ7|@$kb0(аëtvvB(b'`ck} ן|Khaf0`[~gEl/0*ZByþEj}tsf2k8v>qè~ֽu4ZKM:p;Z.wivP0ޢaIN홂WxC2?vNѲ7OA ڋj$uA+K|V4' jY7%{RXqhYɓywM*pho!5bo9bjpxV~dxP>rB`3 99sb佫pgriF+9b;$g"ˤ[]BV-|%*l}3'[oP'D`Iw>>1dƨB0քSCH6h־k^'{͉MᜊMf.7yKxCUOv&>h:?fv"> @Py|_Sfj?(1N5G N _=:Dgih/W PG_Vm7|^6.W11#x"zknMo]eT2o۳c%U ʅ"iߦe&v9Y$5/Y뱓wҼOM)Ȭ3ڽFvoOx;ޙjSKDܒpîR`rfi99m?pŜ %A tsIamC@Nۛ(O߭m?.N k/Af<+-žN+nimc4#:>ɒ$Ǖo)C HG=AdV~*UJ yg&aQHuRtEi5*a[}ӽrTMPG¥;> oŀK|H y"dSn4=V.ăѣCwW?o_?:E4 =\6Tf!S_w%!l_uqn]n*P5'q%u'gSۚ-(3- ?{oADX1ZkNASF|bjg.Y۱ t U].aBp5e=VҎ軑VIh;U?椪'f?YSL 5`7ӰoeA׊?3vK&{}.cXb/mM6Hoij DKkX ̰ۏh*bVtbxI/^\;ěf%m׆Vn~},BAM`{vKin\u7_/kK"'x>EBt#t\0nax;tߖ3;9p9BO?_fws]h FUG^Yos&{O/#L?ud viYz?OF q3n|,z%ZnBB Y |)25Doȏ]j~;49Y ^?S@gfp5e|τuT'?qjrz  ;k,#lЯC`o43+YIg)Os=#Zw3rLjPIvzmœQYϰפ]5J7W]b|,+RofsKo:yew(څ* J!KRǼ`[8 Z줮 ZNx @W5.6#cH I`*`ш\d`oMpYD랅߮jE)}Ĩ)4'Zi=e=ZOIB0nQ,}'?*Jج&ܿWlY{~ *ʈ '7㛞f<8qZ%No*Ujj^|]*>%I3óUu%cUP ƲVtYƔ֝*_AP=Sm2q:hܝ_,pPJ:ѿCh:L #bO}oA\۳Z;: <ߏNZK;tnWcLg6fH[Y .YMb+{;Դ$F 닐] t&XB03&T};!ʼ-a2[o_reωsF@#꥓|^P|M0FA]u50 Uh|sVLT ])WUT*'}bĖZ{U%!yM؀| w(9#c1Ç[FЂ8hSV v0; 9F}g=FphgqLő]+ٵ-& 9y8V.F~gJ3\{j~c ?_?ooĬ׆AB bP#!~ /dgmQ D=NKF觯Qk 8 =wq`uOX}2}`6uLA 0lD NB3[ H  vKP_K0[ 6P+gweqo?j"9{(s*7T %>`84C!ۈ=e4x"vxފ9M|&x^L~RBuMW/ԋ!7C6{\@i79NkAZ Jkߑ ~Ih#N 䌆 ?c=lrMfb_F>`d¶_m3,TCu]Ybmp!-v')|FAx+7򉔳?n Ng #ssQHW9R;y,DM hl`*KI6 ÙҚ]?…{)Pޜ9]xL$0SMF_fAmn.ʵqh<_{e/U "f =aW6KwݭTGG]IP{3\+&k4Oy1íxRc7pm~8i!,v 8+"r{ohBK 6XuB+Wx `-^Sv~6hӪUF$`|;UH;(wiH^Gɭhmrz3Qs\K2B>K. Pf:$u?%;\*8uuL4ʫw} \jOuYDXŃYm-#$6e:!LxZBTJu\sbOJ4݈ɸ=OLR-pm\TG.G0r{34:ֱP1JZvij8BP\: d~:1<S!CB^($fXdIgȫSzf;^hZ@gn@wI3Ba*5!A.C ~~pvF3J |k|aثSc[\]@7VOż{ؓ܊!~yngU;Lx|(@;b#4J/{) پ )2wQ(e"ϕo. mJsKqe$;? O~^?k(а*>9^nt {|cW}%xL{3~װ][Ά8EˁH, SVH~F[Y-Uw`ط;upa|>n >*Rj@LK g#{P7w8Esz[;iV`GٯgiяH`x:W EW1Y7#Q<.a'tm1M}\=SApᢃ_.T# "euB;]d7-bv-+bC'L^ΒA Z9%Wjg`#Ԓ3ظO?~/aJ/CvZ[uIfij{JpS\ibpm2C$DV[5PhHxW w[M9k}c*ޱ#XH=c#ͫtt<_h pd6C1N Y;B@ 8nσk^1@Q\'@mJf5KҙfLq4v Wb㖯2<#@gQ*$E+3l[{轧풢0YHFUʿH5N)A^}Uu|uzC ;{nX4@cE1mJ(1=d$>hd %xG$%վi+.iae;l7=:wwG~?m30\}`#,b@dOjy> !,tB?Ul, Z11Qs Uu `1/ȈAI>H>JFﺋGoKb Y3z]$rVMO0ss {Xdv'\~"Ck|܇|h|Vo˄jg`ܘS}PT|Ȩ9&0_Kq=-CJ$q#&C4@6rƮ )%ǧM0kq6iUH}I. [5V mIH0Kˏ6ަN$]j}/=ٳdǪ%c=m+~ c3k@\νSIS) 0n e @A)e1,kTTpڿ@74ۮ)r-D:% c!Nю9UAvJoVNI ,H}>zXH kAPc[0k7oP\ߪ|QiכtG|36J$[d d2CaB2[w16ׁJ&D 4Kȶb/F:TǪ݀EBҚۣ@BS%Mx~U/>A?ݞ#B:ێ r xLC__XoGf}|`z~JF3GyhE;dzϹ3juk1TstciߐvQq>Sg3l#Jwr2DUH&GόTQf]Gшh/kHvëCM\L?R DN^0ר4@F׮4% 9q"~Hi|g F 3XmLEh!̝8Wj9/ 6M>m""#mO hKzW>TM؍*>"0#K"?m&zpqGwe8I͏z7d#: ԩ7c*mZÈrś{Hcқ[B6IQZX{bFԹ[ۀk(I+1k!Et_mnǹ= ^cJ[ݺ*~qsF `1?IVx`gfJSNd.׆v>ݭe!cMc}b݊WFZVY1]qga*=фq _1˩`NXޠhZ);3/!ܱ[6j#yh[}59΅s(mgvj ڄp~޿~7??K?jZhY Za}vz|:_8B?cy%Y?r APdr`$r E{M'_Kr Ӫ'`ޣ#&Sୋ=W7;HCHh9{ξNCTUòƈ,1=({ӂ[$gVwni]xIP+dkܷVxcF05hbp{:̫TʫHzoY:)MNk'(Hy&cC-$')ӚShf("uz"Ue %6L iWU.,&0-nlGvos6ǃewښ\%psU$kEC|IZd{%rMurQ'oD:93}si^pJV>ԙ,8EE@Â~ڒ$ }e8ٚ#JLDjtblUvUVK ܔ$<%muq;~z1s MhC*V Ro#D@H@N Lx9vLGl@"@- 9nعXC\EdUR8PX3M,emRQV%vt֩N}a"yVr<'Ȥ*&jO@N. SJ[")+˗Xp߁?;Ӄ2i<Š0CӐټ8w9=?҅i65My9&8NJ\cu&Rd@#h=) j.6+weedH/LjEŭ9:-Tl\nii"R_GuW}?޻J> N8@qVFbiT5y1N&݌ Y4ܖ[)ؾ5l ~`D3bFx.hn&(~[h v;'=|LY3m h&R&QnS&iBnܯwtvDɈYȌH6vTbC#w)f_`۱h7 {:A6CʍcW< Vm"lq+Lnx4!}(g[_KD:bwJKfulH'[证K c!RF-0S娣Ro?D{0C|@X_/&1d zHfin rB1;GME,=G'=Mj3UǵkiMec߸Nm{޻ZJF$Qԟ'Xq+P+szBLn;WQNA?3Xo[T\#6wO:ߎ _^;NeKa3Uq4׈w4gP]'K%.[aN:cvO ܁Kw,ڜJ~ts$oZݟDuM7Jʵώܮgx צ+.cO[2hٜ6يTnA"oNF&>4d)q$ʍfCCFUj1ׯ|J# SL(9>qKtwxJ+܍3' =˦@7}+~SLJ-]hC6N81bWѻ9 &@";᭰fe.jRm =D(F\m2or ޴gs{V{[S˕jo32\oya7}b.}nǑGb$v7X*r]9k̘vy֞1[pzdtޠ0j_ԴA{wAk5 9T <ѩLGK~ߣ~gnhC&r.5g AG)i{[k'(Kuo ?4;hܚ+pd&]Z@ty.YEN;z SawػxGk:Aڊv 4 F 4x)/@ tn$Da O(׾'.+mgSY[/ue#$DV&M$R:'];}3׀A*Gc|֎Tөk[(Yb%b{z*\sgŧ:rK8[@>GߨSK .Yu>\>N^,s7#.ǛZso3E5j_F}|(񯸀:Nu5 3=k-teH/h''~97}]qv4`~Jp`5´+GaE?R׾jgS#ZI? #FaN⏱fd/º+-S&Ív?e/ʈbq8x-0s#?e7 ;31 `*%j͋]?\9>>)_oh?=S"0P\Q93 x'zO?9 t 3zd84)׎ϽM z*?- 1QfVϑAOaxt iTae1Wk⅟ ׆&?/Cu?1ÙW+u{pc;BmrfjYJ7ԆD|GRvw|v'Qam!|;ՍBu2(V*~00[HQG\kc:k8 w2]c07Җ[b>G}%?25a/U'TW]Ȕ׽6-u #jnVFao/ BaH#nZz wæ/)s.1;ô{g_l`eD(>'`,b4ށCY/2Xy~qv~j#zןQrDpx{tta;s:}?/hg^(Pu.]^#A'UWϗT@家za*hJgaR2Ŭ @Lߠi+ݵP9ͬ |TF>dkr[ 6^<'~#905X'žYAER#^N47bzNt̏1PָD#{o\0y1?IZH9DAjo ];kǔJɥ|: Ӊ°A&WoCX>%Yg.$mgޟd 8` -ULÈ'{8E[ߴD{x|Oxk.LᰫmC'Nrw;!|(wͷfV`]RDg'\<\JnjJUOqyʵ;'2}V`$$t*|޾T(LiY)p.;|ԛ*nی,SŭmDBy,=bFSHTGZUץqN͝$3~n*@=!9Qo aۙrYkQl\[ T#eu RD}v$B G=-Vv-"ڴEq2NTY?g<>zi @0p32#Ik5m ?auY[R>U;m_!Lo# ~A5 pL7L+/yvO 'x8z/yĆn\XEZ47qBKψKر̯_;]vhtJ?7SgцBWk<}Zғͼ^zkY-/zt*Sv-m)pA65n^y*{M Dܴc0E7%0[<{UΑ q̊6՜CFq{"պQ8}ш9ʹ6ongE`R>J[ +5* N=PLnم_G QkT6qs!ρY3v{(R`;Uۓ =1J2{0]i3Hl%!O< j!/FIl D|W -ƸkVn?$l 3#_Ҫ> d{t tewk77U]0Jy بL` h{7Ɖmy+4Υ0K_6kR;3YFIsvc1K1A`x ?{]"#}1! xxPҩH aP֋~11H{6F)}:65!+.ˆ0xb [* jf}<=ɗ6/Ƭ^JT;= ?_O׿kO^lfU=ECyЍ0M i晟y7/&!>%j5FBo/.qO9[?Cpzn;\lg:{?14ChrI;ڔ<P=.^9jj [GtS2LgǗb6Z!ĝs_' &j 5N4ت'S7NW;K P$Ϯ dӣd%@O~ac:kƊ L6G6=Cg - ,b6#YJËxy~{|xFaA2~9f"8%I}&EF0\nM{8 /zULTX"\H^}zm>Po>G^Pضcݑ6C$?:}Lg4p9e<[BD /nJ~P?A{QbTSZ͝rS) )5̍8VwS[aċw pQ_sͫ v{G^$cܕ3"Zvn `x۝\im}T3!žjԱY5bDpOLAN&-8s-WwLkY,hllE?pJWMh6"l2x.=*f&eUPѭ?%ׯz4WM3@|Ж stl!2D:[=*C~CISod߭S1#P.}I19:X`*U#^/ ;N7DAJ)hҥ`)FB 7#9;~8$ⱶ]=pKY-Me`3nI0/n`j @B>c5{" $$G2P 6ٙ /Ѵ|T8x:F (ͯ@Pв]F:7^[T+jyh.aWN I3Ha[HՎqB5?47o4˭^:G]eRO6vX!X ]#N (}{#ǚTnq ]ɮ̐K䔮C"R1pcq,凫 2Gt%: BE07$ţdb[gzfP]0a\b"'xD6*{w߾*хb_qt+SMtWL]x??R;]hVu,d]j "a2£CAOl:/!X[~@U4:oVgaD0)~6ݜqlsvw O=lȭ=Ek|NXjUǑz0.Qi`^k|E,l:9 B$dokGB7ϊlekGM=w1a&䛦Ii+ kt2Gʼ$ ׊8#;-TCw8iĨ=:zj1g_q CxU#Z?-:o5_#gB=*9x+qv ݜ_Sph4MVo!y*b4vzh[$ƽXşd[[4 ~-kˇ /W҂&?['_MzM+h/hj$n\ѸfF@V PwbIڠ>w]%  WF1{sqU]ggy][d`6>#curfnjlcL1XqUs23 gPJh nK}vU Ѫ'LlM>^XGd?ÁuJ /( _X1f# @zhzOCu&<7#%UV-*vt\IKm7.(_+'> mpxJ Cε aNKw݈X .HD3 >qL)Lamm2,mu'ĩN#ɾ&Rw Oכ }/.mGӋ4Iq}qq8yryLZ=cPI" >i"or[\mFGcЁByO+8/^25)Lb|oUg>2ata0vOVu1MZ,o1gqQGXzp/ōl`rO>r'oaq(u@ѿ08D\`GD.P@=ߢu<%AE w!5vr-.m mY?K [y[y*>鱣ȡ峫EH VۻTXǩ`3{ܜnP֘J 9Ec):ګ6 it.-h-]Y);Y<ϟ B }|Ki: \&?,Z]Gǐ~BA;H0j4} t{PYd.L` !'r/w=+Kbm+>;ЩdJ&Bbyvt֜hR,z&^Nesjs %N$M2Բ0Vod3C_ ?=Nb /D ŅoL=Zt6TH>hGisٯcM5? NnkDs }ƥ}Kp(<@}9hX{+iKVĄii2w#lM5jTN*G7BYdHiaB 5lHD}9}u4xe{[]O)B5){%!M$*gO Ξ*w;L~LlTIQS)I_kcp& 1Uvf/:(9⑭hFI>:[E2i!KĠE1WW+FdHcl44%K+AeR:hb|xlAɿ'mؤfZ̞T70v'hb[@ڇӶTWn~EA ϫ#2=/,[YWHj:_Aӄ9 zpmȵ_/m2 “AmHG+b޻}7PW `{D*~~;Qwd5ʱZͳ!6TaP~/#nOrm®1ˌ`bGHdezP\Jluf囋vjEW1 ݧ;6߿~o/M~gsyLhH>:!q!UaF"^F_$}όXS@k(?)&9o]]b@(Evޔ8F Ҿ?xi/8DE#"m{֨܌5є+?,?jS$pV,fR}@S5G ߪȁoY५GĴ^(Y @ 7ivC8tGX!KT㷧@1_%s<][qb.&liʩm8B%~] P)kl>R{b|WFi?^]\ڭ_[oi7KUá7K| JGFf}ڢ Yq5ٖHT<>7x *;³F Ҭ1R9dYcQH[5zN :1 ƌgM5ANJU=B˝6 #d tfڽzѳ3Za. p7!Lzfi \5I-4.G}N0Vvyv B4F kg!|0Y-F铁·䏬~viE .C&H"s[/%2 `>0hw:SD>) ;:$Z&>SkLbmL?}C? >{ ~}1ĥ\&I=W>?#_LY>PgyHKZ* 8fO;TG8mGBC `I40.吋+GN!hkci80Њ-_%) -RW5l .\^JgJ?n`[Jd{ uu[9 ς Zpof^b&J,*KҐgg5(!, [pr>UĵR[hWn$,f#H֑tX<@/;a_jۆV-Y4XVԳMHyjQ܉v:{VME&m]}otjn5̕>(<@ם/dqlԌ+8ǙU^k0ЛЬ$!rL;C!gjtj^?9K~t2jS +?FRY@%̺/)?Run<}k# =?$7ͅl #o}qV+)<>w(WIl2Bǐv?=aWm_BDV47-UCSknoϊUe=&FϪû'vS9i {M2l)kc1|i,SgF:zdK/(=ߗ??()j@1-w kSݝ̼㥘?f+CVMO=G5J- V*jW)¨X 7ЌK ǂMG6—{u]iݗ]~3~%[J6U.WޣKnD-ś΄[vO?c|YжSEGZE=+a`eluvyۅ8]i^u첣\,u4PHcKKk$4D/er {ocq6DpHPup@Zl'pl>M֠9 e* *NNW*tWQfmL|whQ<_R W48{G;SРBV|Bg7=dv1",j;颩# .(D"HA.ݠEG>%ޙ_T3ό>d$3sTt5xv(3I7o`b2,oM>_zo8)5zd1J+yHJGV*QGjZfw%f;6zaPԊIƂV)m\iזtzl[8Nby| 0^SSl&(i, Ĺ붗֚gOt: i2n^ks߳! zaENeH=wjh>Le)>eh/EN='ͣyBRc4t-lC;x=U:7!; LR~D-Ց"}]gy#k#Nۓ߅M t I < N+_'04"Ov;425.JaGb-ZjEz sVm3m F-fZcF2:V:B\J4p˲ +gC%?1I&(@ #k@:b ʩA‖{M_Ⱥn2{t?FDHtRu4BڊLb ~'v;b+Ѱs @f{Xpr C렰H2).PIZ D,e<͓F< 25kCZ9z&z($v9 =km |RftUZ4Uktk_Ѩ5[O!e/ }V33|0<#4^ (vfr"@g^_Fjφ9@= zg{Ta2G uw(&zO zs{aF 5tb(}`?'zRRYۍ.wv~ .m{k/?^q̓{Dmx[N$(:z+F}?ZpU??G41~>N/2$eKو%vXp3Uw^ehFҷG-&+b x%5XsV#] Ⱥ+57Jn- i+DŽ$:,"3OیUҖ}v/C5/(4%|#Wf_݀FP}8[Tl^0C#g/FT\޿c,^zbj+[Yx.8_ÿ}hMs"e4/- L1:dC`SذC <1 URp3DZ6'}yD$Y>ʩAYoabuSC#Ag}(R]XۆY^?Niž\*>140gt; *.Ԏ 㑿jy>{nEmTkkK ~=N*[1ЕWJN#$H.[n;#ϟoׯ]4oo9UCƫaaVw0c*SMvKyjoyS7V_GBr4]Ź]-J2FpJ 2jt"GOX4'kR8 ރt.4p/n1Dvl̹tQyv01k `1!U&so[7 dX6>U!D SF 0M  [ M<o!E"U) M:&Grx4yPZkm! NqoћDeTI1BLgߚ#=+}{x3*ނS!\?ա!+{ d[XieI*'bW(E9Y n! OHUՙqdڊu GZ˳5&o.M|) 䒜E,I$ 73٧Ul1wrO7?__&yUD+o[c[X7SugޓmE~JRYc_Ia'htx\R1nVʨ nѸy 8mq]d2JBY8:-~\{U:.WαNTAhϯ @\PK|Jށ=]ܳ  dy+*n!O#f+H2C>Lq؝lA]s^NmpF5Jy<%ʒ %dwuH!2v1ڞqV4m`$]ܶPF+k=$foB MqcaAXmֵ [L6YcBjw?$oyt(.,:XUE3ʾf%--u-Ihq;LKߪvuO%?,M͓k6.088&hBt(`oD5 `B+y?d*+h%z!ֺOתA[^269#=Ȟ9@UV U YE@ p/4'kyja6Ͳ.<=g'uf7tgm}=ө?z_[ÍwF\>'w.͇Azk$x<.`Y,^Pssr3K Ө')=PrH?3+7?a]UƟIGS5L `Τ@:~ ,hp:fvϑ E5][Ө?:"x}gpiTPGAZΐ\U.B0 fsR.lE_vlǮv4Q4JlO 'qU9L'9==FۧV#SKɸ{'h-F,kٶfm  5U][;FwW@Pj /h 3N c'tr7iA8a)iy_5m&ڶES6p]}f؍E z{O=n C$\\hMmGwA9c|]Q?w(K+ te0FiO8Ә-#i#dgOUx+SHB8d7.scGG8xuS7R[Og]׆;bL&IbN hxn#p܈l5eHU/SDh ^ MPe( 6 uڤ?0 D8ȶlȞH $t$Z$RmC,2\V=/ca>p+0ҁnV`%<$Qjl}o'~iXtaf0q{{氙6&-nL! ϝ8|-!RBX`|]>Tf? ?.3lϩHWYxRu }2\hi҄~r@MpXuȚOt )FiN؎5>N i(@$'{{ޟ1j;jP?޽VẌw!Եo~Kg&ky٩5ҒLzW4 $@${WB{SF|1tƔuo܅mb涛2kyTvkc`G#+Y @ O2}^:2Η3ῦ #6q-}Xƪ"u٫8wѝE@hxQ*s c0'<#f <_sՐWiݕ:{xʈ\ 4٩w7G~)_"AY j"VRYOxH1KOzaTQ>ja/*6A 5k{#hJ4,ڇa$#D瀹(?Ԩg\p=*:n!(M:m?#Fl0 :Lɾc?7X\p^h$hJz$z#ar`%1禾5h N d~.Zt:Yq֛IHU)E>rGgM)-H*{#C\mke=4ķI~^Zo,M!-3]pzƎbcbApſ10 #bsjirhi4XcZQz74A UnVF5SH0eQFhϿ;,)ZCy5͌c?&:4 G3Z[BQz[m>*׷cXd뜘 n$LmU/EFoegBO?K[/Z]xʁ3h.`ӊ?窟Bf [Հ'chZie O6{yJwƎi}*>t#2Sԝ".8փ*q(=Du)>5Ngf((dn. ^Fbl3Ð\im}m_Ɯ55'ާd<$5+KRʣ ^툒??ȷ1ϓboK V޿}G@ǘ+-|Fk~eRu.Y9G0kk/+sk'&36l8em x y#L6 :[b6oפ@~65]V )^Cv on_x|Ki?/o z[ ߜy`4/m߬!f5w/i{%(.@oȚ辽oQfj3`xNN=*Hd+3{G\D>ɧu2+(>أ mHפ29-<by4zYSt}zGs#\ޕ3aPj >zS]-B%[4퉕85_?'P%海sG娑ơkb:{{ձIuQM|Ro&AY?fsZFeb○5'=}bא[Bxz'ǶJ'h-n2/Fl6K=ZI~bB>a888U@w1Y+vߵNhYu*wu Ih)54ÕT)잹`-.+F{IBfD_d 0L-]7卒 ڊ)8gjrl˓ ܴxs*.mF~SEtEQE('WRcW  InKt]=䃥^Qo`Qm(*?K`7N}hK;s$=BjWQB6.j V#5블Q_‹HflqQmA,c C|*,E8>lw{WN{9L~~{{"cNOڡ;.*&{WǘjcFo'WJqߒd&<#+qPߞ}{Ԋ %n' i3bһg<*%j2(cRtJ>9ޫe " tRA7Нܲ K َ:1Nk'Ҋ=\{dmnb̌Ǯrilܒ=Lf[-ZH.z))O|5GΏF#[D{F cawW sJwZ 7-sVKߥFK_͇f[FWxW?B5k%Cp. F>\b07kRDf@/`F{n9_61fEؼE7H{[@kSU:sΉ=Y<1hqw*ZӒ3d7+wUuÍB"` h70v)Oβ_F%3$af?sz*l lCtu$;AEw$lR[2x9feN&Ч:22ߏrg^0dywѨy!(뢥niP2 Oj?q Ǿ`g ;?KH/ >:̠Zaot}q#n_Iކ=( -0P/dR)bl>=#6: YiEӔźKTh^ ô8nR`@O3X]nKҵ98ʎ]Vφ9@*hA\a.\N"qM`CD"ahD܂h,rfl'Ow@kb-q~z]Ad'@A ]=*l9>6nO.ǰ\$V=ʸ3c>'X9Sv>%.?OG~%G=xvVbdX]0^N洟lg/gѦ#X8[})MAwiWˏ7𭱝G'Hr񞳫WSoת#_x\ܻy)BFXݨwnWҲa1o'qYyW=۴a4`l,K)Ҭ GFC{t?0#-Brg;Y#lt QޣNGj ݤL:qsW'DD0[m_|foYM Bk [ajtHT @ymVruA${6#uM{Nh):^{M7 ޠO]NҸNzN񦨶ڨ)wAg )-:+BT{O 9&dh먺~[$c_߮E>GYʶ(;ŲEZM=_?vi,LUƪ -MR~d՚qBf6G$Z"?7b;͇ص#zV"p/f?ҥ =o.3 *? <ޱwEF9&@ QN$ 1!F{:֭$=]"iJG˱KL-x=,z9d<*%@ X>$lB:Q) d%hMAuTP6 ѱ te(2݁/(Cuzd[Rb b@H̬1˃GQ$C;ЏO>>  Jk\T4`;ܟ>li "~F6p?"?]xV]eܗ+3G%p4, kIּkٮjuk:wz`_J*`~C&v81oҸŪ:2s2\xwBo_$}@r5w%N Sh$,0iJXZc1f)ًD\/&/60Y>BOb.(Q9_m5%xdSL@ͻCa4,< ߧ?/_a/P7ʑGģ2füx A-Gx[z= :c?{ĩUtzwxCF@O3*+b>s6<"4,*I#]R=,}%%n@N#[qbNfxڸh(5 %CYd7&JCqnQbZ: h4˭(HL5yx;O(G%"* [%yqz~ai7UA3%8{J)(bw;3&͒nR3(Rsu,1“,N/@ m KIZ[ ̕~j" ܻ3.{57%+I jg\:-TF/ϑ5w}-ID=l<@TQJð4z5vl*MݚuSUΜnVֿkn)$mg12Od,Aﶗc<=cEݤDVu;[Jy=876A>0c4,yY=HY<;h+vF) R7%I M `f5\5noiz5so#_YGi-o FL{8>$xg< ۣXkK+L"8eԘYZO*xS:s|TDu]dskoo˖uj44gdcl'T* g$>`q~eVī€xKWFa8)[0\دHj-6 NJ q cOru )7Ȼk(F.-Uɸ`q{֪X0| Ajt8.B(g#]Os_E6>ʋϳȬEQKt TR>]A_ 7㈵c3*j'Q{z|=4l/ V38Uj#,?Mĥ_;{݌6X? S5+wd @'QRΔ{cF˟Ť~?txZX KK*V{ǫVu/l=Our.%EVa joU ]Ӟ$zV|$E)nf,F7.%oڻ&ɿ$}PyeH4􆙟>3X<}*/h@bKA;gH؛DV:$~ XH찙WrI-u~il.ˬM=ah2Ҋﺁldn9|>ϖ \*C1"' 6ńcW<,n/8b'k:B(F?}Rl#,hnBߊ@W D?@{؟" W17&w7^H*M\* ||[[3:+8Vۯ3;Yǁ>M\n]MXq}Ԉ+j7vO'R$VhB:^B("Q &&@kj&.iUS.B$HPYdϽBh?Yܸ OCT>M+dpW -5d['-B6שkAҴk5bz(Gة>fTóe @ S]EwSrbM-=|eM\#.!U\ẢA{{"(6 V&w+'=єQd$}J<@.|٤GÙƠ  a y] DUS4Z S^5Hh16/C=_>rW *B:25 7)]XܴqwR/ޞ|U-c`D(nnL_G̭Ӌ:ӵRl?S#@Lw>S(Hnq*G f0kBM\N#6\!<(ֈInyቍ_zjO[LFZuZ>?}ZTx˘ֆn!0^Z c}xZ¸!T> S_úu8~Q2 h=?5F5eBSM$ Kz#LUt̤dGUWL5`{lHByA{ r\@d uP:T}io?VfD;b֔ߴ*~Mߟpڊ ^~*1B'w󹘁*":"08]T5FhrJ.x6oȠ} 95boaKmigNx"=c j}#c_6hf5ehԋ2-ӋEx8CݕZy~% [V>,_xD#A`?}Kx_CtcfYP:?Z5#`O/4b*ɵ*H_6?b-a,$OϞ#.- JB> _!SM;a*aO&LaU ؾZr[L0ɺ 9QA2SWnr[CИϔe/ij7F\sG'{ao-^n@*[G_]4+%llN]dS Q`nhg߅9UjPSU*BOܔL"@͏6tr{8gE_AEp窭,FcEB HFI۵ ;=*U̷-+Ir$|)Wp \cT؛k8p㰗o#k=`t1L6¸} Of?K;^b6'QkaeN~N8'']Qs3{y0Ogw ?9%Ts^XfޝJ 5صM0a ^*j'U[szXL?ֆlo8C;ܳff(e \h7[ qƾ>ksS'(F,sh±VSXkbkk0ڜ {K;^e~@HN5Gmpܟ Hڞ1[+x P%^X߷,l.H"8.h"v >5M6šV- ]<yD1Yj_~x; M;;wZ(Hzv>fIJpћtff&%?vר>?老2++Rahݭ1x?GՆɟ5AJ'j&WKP3[ ){Ůt9 r]?\-78AO~ϒ%/TIʹd >nXX)<^sh}ʎ.DPIo'o_qòdaT_L^.ϰ0 NOưYLK₁5ǪzB~ӓ⮝r$<1hx?.sL\QЭ"`Ya&}FL'#7L"ZG)Z_~BB-=ruJzL| ;˝\+cncdy[ܢB=p&}񠰉%) v Njo;иn=bt `"jZod)S;Oƺ*7&@H$ζ`;y$P>I[S9\3mj:bĠ3׍u7Xs::ڛJ󟫄}A] u^H߮, ;~CH*:pKCy^BƳcXr_G Uas(X;-TtszZ4`l*ZpշT{ph#\6Τ^`-m9@ _՞?RPϚzc}S^Ed{2bg}c$9v!ߠ=Cզ- =U%^vH: 5FC=OЄʬQ3BBRT:*}hư^tM :B+Mspd p'P |JΧ jBc׶TFhNo FPax.1 G0 ,ޕcCG$Q3/muqDKWfyNr1@W۴ʈq]=`/j:fnv| "ӎԅDƋQGt@t__Kh_ rT$%AB=0#9-IOzƖ!/4Å>K*X9mkCHݡhLaۏFզ@V!̂caU\k5=Yʧr6u9~ XXXJƣ$ td@/<;2f+ 5pSr'oJ2'Dm9H6{4O` }7??E?k?6{66φHz OCȤQ],݇W;J35,7z*M>~3;Pi_m?FsNۻ㱻f`А.1f.J_Կm>qU-j /{ nm<e#?z,oHꅿXz9,\OK]+L'zx2Twe<DiVIkLd:߽f{)R.u2h7TXV߬9;>`γ ? 3hc8VM͐WtT_Dž0z~B;έo$dQ`O²Y$:5D9c4RSD1*\xn|2@nW[O>HE@ռ2RG@0Ie10 ._EVDLM[f6El?4@?wf}S~8Px9kvcy+=4ìϻJÓj?sTJCq_gaj̶'z#? Z~;CU~D geYݳ;Ga?%tz_;-yba;k4G>A6JEp_1.ڞ2JIQ-6k.g!Ō{>wY2_; @5ПSl7wDPg#_6oڌDX4 }kyi ӮVLU-%~6$1;9xl %?GP `汽kTY[ HFj}6-6Q:Hje'CP' ۈo= ;$c$OոCIo5fAK?nJ=Ҋ;BaXHv*dwu'x1#,7"QF{{V#RuvmM(ƉBq!-$=]"H7<@+!_0_`+ӿ[ͨۓ+:iV]j ~^rY5q꫐wڇͷ=Zx̪ONghL+V,ˋgôt,QM+ IÆ*ǢOY4oO<kgf . <4f س?$v"!&aUS+/BE|F`Fٍ1:,(V-efG黇{:*[Rݽp=1\VKJzZLv֑R=.oR3-]Lc36wz2i/KK2ڠHCO0?yf<~@x~8D+yN=hg 1F|ޫ4M޾g4uh?Cet?xt_{5d}LP]1ᔧV'̾z>3ƭ/%*>>w m?gt!>_䢜?7Y#T[_<:No$01SV[r{#hC U}U*Vh-{ZA8ឬI!pd-+_(Ca+?*VWu䱐0zȭΨ̄:UuJoq9^h̥;'(|a:!k-]Qcƨ?,seSo93>[FSNF,S+F{Z y"3f?>[#Fq4'e1?,7 Bdӣ}洟j(zeZ2R]ޛ,'H?MuuS dݻcQUÉ fkwC52h脐1= e|?h\#Gʁ S6.]?BCVqU4*:^(A nM\WlrY`9sŃL `Op2, $8OEApjL YxmceL0&XXRK>"[r*U"c~yM7__;뿥<)FnF1sb?AƑϭ'z j/kfmfhwtW p%Oݍ;jD4Jp̿U˂i#‡dq.\E$E.ީwEgpH9lnu@+g*ᚨc~n[8M!`sHM=Tcx7qN );4Bjh1zR b7Ax㴠Y ]me @hq[Z*bBe_ǩ@2Jy$[)Ma9ާp]jbK1a*lVlj^͎*H;&'8إ̜7TsWȭT nN)1ϰMG%0{TF$ʘ4G[Rv:ͩA q`\*yoC?'~m,緄Oq0 ~GMF U1Nwo "ssN *Ǐ_$m 7$*)hHhY\=* &},?Z;Nr"X֢`{V!5+cVqg<-T·UFb~R.[q5?>7S&o"%.{-%b%t(}Q ̍ZULQDRp;<oa"38[5n>eNI†q?ForD@{b4?kѻkc:z JG F=@ߞ) 1* b Y#RKmd}@]S!1D]@6JA~O#\N%^O?.D,":hAǍ$D*V EģH;F *>'\#p2Bv䠣GJcE-R޴wM>ꏔIeP>yg]4T82pģ-.kiFQT `hṀr?8G-p{L}8>, 1RԭN>s]XA c.,?& rN1 NsQ~NyL| SL" P a`sOLlkkb yz ,:o_o-Y?S؟/xrGNBOfN]–/s4A.|4ڐq1i-,*MN {--B-TFI-VoZ 8ܧXiwo6&N.Ӕ{ [`A6f`҂[Ȧ3}oS ?m'qUIp/Z6ZQHI.NGy9r2GbR3kw:A݁~qmc{f;;J_U/V&, 7_WT}̾^w)$u3H^Y~ϛA9k,R\i^$7c_qu%'l։l*OOG _qbW>2at/)GQ?B8Y= 0OT.alLof|tm5crwpeؠU ?7(t.׊߼%69/7v!VWu)hg^csh[au&RcJAm)A*m?G2+`|`tܸ:t@?? }ƂfEH6CM}Hjے﨏wWs)|xN+ώ?ݲb̿$sWiJ*/N<6Q1ΐ0j?K}؅3 Jܝ#r Op;fLNf~TcG{2b]˘)̓e1 p|[n}{{2ўAT._VTnEV}NȎd䄷N-sßʉNO擒V mCJ)(3nhd-0o~ \!b9}|d;Xg: ,d[N[J_6{Nw~n%иx,n:k'4A~ժ 8+ҽ>3F`kTKٟ$aK+s*_NPC"> o?} u ,1NR%MUFg7LM#Z\@3>esVBK8:Q?G Rstnp)͖ RUgg  ߀y-_g_OOcV ,dS TYSw Bpriw{7[v8y0dN{࿁%ӏ{ jE6sẒ{IЗw ͬ (t/UoO+=~@evC-_j&¼X¬[69NAASsɥtZC/U'sBrOO/"YM OI&]qZ&z5@4C)߲{ԛTcegWLUَ5-H:P ՜mjM :ލ6v!g0sæ fwܧ9+&HVdmՋLpHE`UT GNU}$n1Ƥ Ak;Bp٦0 lcz^$v&;3Aրwi`<~hdFEb3^H'?c &akp΄7!. l.{jFF!/ [`%wĻV#&],ŷ4.OdOj%sJvn̸]R}tQ+{$yr 9*&tYۉ峫5L_] Vx'x!̺^A,Od謯? OՔ5fFkF}3nIZPTfܜdSmXKc;wT{ ,5SBL |uK-`t i-{-Ƃmω j`yF#}[ѩ!;:ּmUĦiPLk:"9a_9(!OnYa2pK g29R_ O|RY 2*6 CU/k1>)-<RNiD}4ͻf%0 GlmĀfX͈923J40؛@NY}***=f&bp=ZFArn'x R/F|2oh/q4\4m|!={>opGbRaolZ3t`|k.[]cI+﹵C;gL; q+NVNyC _]0v<'j;Er''?5gU Qtʴo(? ZhGONA'~RzSV[ B6o9`{9&Dr*w= p:D vs%pM N Qڷ\^U1}҂%!G dtYo+xsQ #ijb;%}F|-hQ,kp$*U&bt`=F<0{b\rl_ ?q NGTvGEwBntՏ&?OaPS+Ux2{>?_F)DeOq~9`8i?Q}r[vjx 0@Q 9c$[bc^ES)ifgf m̞;?ձ(EѰ{~~?V}sG#l<.GkMn 5ڐQۆABl_\ppRpF+k`uu'[_J{Is`ߢQi8?mr$'4Bwͨ1;#?w q,,gǸ?ڐ17T59.r{i:~.V ]cwo(A7Ҹ')2 78#tH?Aӷ*@ %3 >\>40wl@AZ**CmIqk\o Cm/`Unl@-شJ]URj 3-tM]of 0hjFX<5J?G'/(ݜ1P]C.SG98!-b='$= `!GM~!$UIOjgph⦩|-أ+ `>=o>K{&C]$@|OKh*,Feg7f[tYJ ;Y6vpZToO|Z=a'郁&76oS*A;i2,}Bclz@$ &㡆snI-DPM{{rBn"5|? $D0gb;5t^ @΋WH0WR.j}"Nyh1#%>^[ˢ(Zs5 4@y3kEQ Rr0njv\# CfNiJc&ZPtSi(.qV5VVWk#5=-|46׏iݒ ah62HJ [A +5Y͘/E@T"s"CS6HcNO x^I7fmF%g [I>T n\bFvf71Z*^&ke{vhmF1=i`q~]r%˦uVV9B!OO}GKjAw))LptY˧f;# 뚌8}~C nzr &FK7-Awey}q8TlMJ!'%1˨fS;6Qws If+ .ݴ>_B{r+z)H !33*n, Ecn`}FVuGhQ2y؀v*JxY@v9>>Vzrp4H5NZ1~TBBGvGS֑7u RoS_~yv(Y?@U8@or|o?Rd{ UT?:]H>; q^hlox,"\o7JOM:,OS rF(g߿"\kt& -+zoׄj@}}^&ݵV>_v1*"Qqs62eY65 )cTKt>.0J}:30D Snr 3DZ=;[ u*p< s- &I .Bs$Ru6gw__dM$݇)ƩK": o+426oϕQQgy=- ^>ڵfT>Q祅VOe,Y`fO4n{CyLitѾ\{f_"Dx:pkf蘞մgK:prL&kнAa4݅T|?+aF|"}ω"=m@EFoaevA֫{FYyP^WxhSgߵ)dYr2|F 5 `*)b޵ZNHVڼ?/g*Xմx/uDekZ~FŴ7߸c]sOj;AKoA$>P̯!2=w[j+ii#י&Sv6Z -SWUgj\꒤古Sҧp?"B♲0"S|ae9~?YQuC\-:0t)~_C1 =(=LQOwW⥋%3;.`<~8E4SfHD{pힽQķG@LLm^o M F/ˎ J2o9v4 &w:Ͳє^1PoOovbp}ﵟxQdrK ~|83Bzbsح/ N96-Y XG!=[Ӄ i$7|Fܛ#l#gV\9+"-lO2":3:06{VmBiaJ 8~rXGl )a!>ktM~? }a<;y (fg#dmd4wR佃/59]ߣg ]r64Z٠' ~Gғ ˡt}G\Z-l@*BxnRsil CQLoNUWqcHKFdBWi?|85O$0o<ẬNP_VY?^4'7nU ^f1< nO1dW;~6 }| J/1ꠣ@ BiE΂~K}\밡5XCɧNa/:0c^f^]N俰1ƱJԢ7??O|Z朦7Uoɒ#ו|K {H$uz[h zJd$T41  7ECO XG|.ip[ŁQb~Wo2b{]ܨo߶ oZ4~Wv-0%\aYgTHQo5E c]_(#i߸@]$>Mq|ЌRg=I)1)vC_tZ OY)=ӱL\W+ |8^ m9ߏ9#b5DQiME5Jȧؓ LM+ї3΃o>2峣}kre!hSQ#LpY]k Mv)2|'V <pjrSomqM[')O)=׹SkU{0T.Bߎ&(drKN?r?d:ʙS;_"11?2Wbܟ9{%);yځDا[㦘89yr;|4ۄOרM3|;x+?K7_ydg#nl%2!n{C+ ~?߆ ?9YcSKh]aoUbp)qNJN OBN&?Bp} 0PVUXļ={#g1i^(Շ"=SfxpkћR1cq&>ע}o֩|H=?aE]K黮> oWgV$GJ=fAT}Kf55G zN 4JBE_{{AԵ!A+(䛒\qEUl;UGN( 3ӊp5Ԃÿ6׀ ix-]kk  =AF`7UC'n-X,K]a387BC%[J LG1F''T-/pSl)E_5~ BFCo#t]~3=8_bڤv,Z7p"j{}lL(9Fĕ%,3Sbrͅ5sgxH̉=Oߞl/ |D>ORv/n U:G-jny%:jʻ  OQqZEg?IeS|1V+WjF$ ȃV)=ig}=lVV c^:J;9+NLFSA_ŵJb?tY3iΏ轚sy잽[/?suV o!T/mn;l92Tҏ5woj2JyzT"!7nATT i"=hTM_O*B"BQؽcHCrh(0~x_=Zj{MPY7&Yǻ{;6.Q+*qk `IG4o\QdS5F7WJ:{ C~wG#:t<ϧO~nZԠ>,[V=]!KUK,`1UGLH ?fXu__;t1ϲiFlGאjmv Ay s.9o-=Mc3,OyGQ^M㫶9fONeLEըʫHՉbGZ}K|Q3]qA%DÔyiZ/SX]J{M!:&&hu4S5ս*W#VR@cK-_n*_&j >hKsLڜ@b.<p#4/ .Q2m?< >ϣ* fٻG2:Ro8(incڣfR9مE.!! F=kp=KXV.NoW6hvJ ׯkG5f#0?Mar/^rގͷā[@+Ӑoˌu7a{;3|^)\s 5AQlpsA77=֌8~z2^B\\ss&Wo''=kR #_2T\sI$dDfDbȩii?7??Ӡ~ I-Ʀ!^cV}Dnj-J\xJ-V\<$}'GCK>PK1 ,ߕA)Ʈ A8[N/ňSXvfo=[z^HXc{TF_kso/ $>ޒNnWOz;mwc2g %1#0#8\c@~Z旱dϿ7V7&Kݣ, wC^6Mzٻ;~Β4*y٣s}@-p|uBZ LF Zֿt΍㍷US{r!\s6j Q?|:,X;ǐƺLK3̕ |xI O0{MǖjdZ^IwjgBThSπѳ[CE3iB?hUoWfK)&Ҽ;t?N+Q[kH- mV?·Rpn"Go1n>LpPO>ty\` ֠8wI6:YEpjA{z.E=2t3GOcso_ w#M_ \qopa u+D׊K{t[2r?[Ҥ&`tR}A7qN%Hq[3 sL[4)9ࢡ)gFƠz; (QQV@ C W3;,$4Lv[ey? qFsЀ#V +࿽w՜q*]Z- Qp5>l>W(emF*OI,yKVb'-?gZ$0su7[m`u$zϳ-&p5#g[6O4\P>vhZ jH  E6Z} .Yt7bG>mchffXقJWN u;*NncvNf=aCjD[xmNG?2ߖ7ZpƖZ2šZědN9~%Wc1g- 3>J=zk XJc/}*ӌVOֻܟ^6(S!@ѼPR}vsH0@I ]&Ypx{j-wuT?۟?߭ח]Sx}9z@`{h Bmqs\pF>YABWKs͌2O 0?k;8Bylj'"T7ZlO5PF]㽷mF9I;%W2C?gc_DPZ\v"Rymr܈OE4\?QcDϸRVOadu^ ٕ̺fxSxfE>س"2OWJEpޱ̡;aa9 { ;EXxܞsRN*hK^0w`QXB")#,B1VI?0 VP!呙jjفV $iOHeG{a&4(v? 1~xBp4Uv N%V.O@<fMeR4xTf TZĆ~R"PN/BWQ_68(t^ WF;)84x7U) jVRO=-M ;fPx9?qMcV=\ϾdGDSg IY2R3GsyNj ˥r={kɜS}R%.XdU}>jp ai4j bPWhrqB1હNk`OXd f*.+ǵ~V8qm5y3RapLʞX@{wF%pwsX]*+ ITϥaS~gAjQ] }C}0oҖ^fqu9HGEpAr$HL c0Y)<}hNUgKwڰ*\ӓݣM9`c^#\ QkӀ_f~kxKɣ Aj^^g8l EeA)Z؅6H)(ņd2֪ ř[Up;ho73唖*zeDkK7"Tdjhe7nPeɬVYi#1j[sWvKߐZ[#|R1G]NfF)  J5.c0xs[K9сMB`Ƥ/KL?F/uuDzZA씦vS#50ه<"{nSzo?[pg#D%u;Fg}NhN :tfZMO<{7YƶAlm LY#XvZ$=U?">WaqdA t` )ܠ͑%C׏։=zaΏu8@ v݂f\*+kIPрH8Xp<؝V}P7N|wVRdži>3-nqEZ&dl63}sY@VkJL9x2(}p/޳qM;5fRc&JP䰧:ȇgCC T]( pHDͤFܬ2!VDYe¦>HSUs(K1ph֚Z|. $Ґ-eS\usp%3s )kfS=LٚՀu* slX& fAb}9?jHiN)x)ZhP.FDnO%`NӸOJ%6aԊ:+=vf>=uMkcv)I*mZq*ןr/V={ TKR2O2y~L>Ft85GK$; 6]Omss 2VU;hBRZ QE>"T0#~*򈸝7L KD詵34#kCOI~T C(1iuC2~Gf (h-߀5\,B3_k``?(OtX)9  8وiߩq_o -no;iĦUmƻ)aU}FN^v$)%u0Rۑk6Q6LU]oxY04ͩ }NsN}\e>)?ܟ1c~تTnD6&5'-vdy௞6soTS  kT?$ʣ5 [G4f[}4^oLߓőDJߧGr{ua4^Ν0`UnMڜ{&{>OO?O֏iwR{I'aoǾIsIf()DhM {˞3WH[t]QiR؍D3 k(_?͍Df o=eȲ#i5w7odY|/o GL=KЀ9KCS0SchQ>,okletU)Stˣ }sg~yzxDr/QjgeޭA0z?Ep}?BTPՙ>1 Mﻵ+MHEs܀*)\Hwl<-wE ==cPEvpm-\]4AmHi3V;}h SSc*IJ Wa]d[KхDXЁgkfB7ͬoA!0=Pr1PBnySAd;?rWweDB#5T2NK$R8.ghi{r%bnY^h>]]M-'43Zb̸yu#;OHiQ9dvhKuhEMrfA#>H^34$Ⱥg:)֙;T]˒GYvKF?'?^6g/En%TQcFdSpxs%zm~޾``0K3K{Bvms.GϾ}t4i0Ko!i+M^1`s SPMß\{QIWsW_.A"쥎'W:C=byb>HeyP픠y0d<+ܷV(ܓϞXk'#'sbXOF#h"qEN[])' l Ի|2ΕPg΄( dFZ]R - Y'dpˬ>#pﴏ M5ur Pj@I"iRo=nz:HX#mKҭB?(Y$CD0 jiGYҧ/W#ؔv\5F0:=Ґf}7:e%Tͥ'qlzyX&ؿfK()5 P?iRwݤ-?'oyZ92]9砭amiG[$zV 3cSNۻ*׼߮oz;k,r3e*K(5fZI+<ڲ0>'?pf ~ǿ>t*miWn,O A'Te'h}Oe|t4{/RʝK?2Jz#,<\W.zfsbK [ sYA:AY-UGq&Zr2YC+sJ [kjE_n k4,Iպ{tr rzߧ0?T @=RaƗ̗U¸g1__[ /uQ|m7??{߿~3/ihlS0 zV >hQM::h3gsazhTIr/#5c[?ϜdeNf~ߩ-je[S4W!oW(NC?RA>f>G1'։+tDL)m b]' xppVpCA  n{(Iwr]{ ^OU>8;ӥ>-<#i3??je/1.pݷxTyӑ$bG=}@oq!=(5kl5E˭DxC</,}XjXꈈkyd&km^Ӂ5C0O: /9OWԨK5j!с߆a((rRu"J?C3PE߿ou4oZ5G OKv٪`` _xubRNxNsA9_*O; ZI ܆ΤR[v˞FƩTkR ޠճà!C'6䀃q%X󳏬AB( 1kPBnU(Hnr1|뱂xAnKh@1_: >Z,FI/]McPc: [@GCPat?S(%ZH{PSjCIFQfZmIxFG7 ^>YU&? ad"KnАKYti  yL0mM y$Uebo||fTb=N]?pcM%K^-dq~m".FQ~$mFpv VʖB/o,w[Fpٮ>2St*F+]yMKOyTX>!M/C2+QnM9LJ)ZU&+yߜGxR?Yk+ ,8YNңe>mGv4voJ3}[u2֘s\A*%`ժ9_ 5mocw--|ue`1u$oDa|2|wznvɾ 16P+nd~ekx?q!"_?t7JmEq#3)`_XNy?gYWJ])9śY4N)+VԜxDJ(PG8J2Quυƀ<RW]R:3BhԳ ]u=]#:dx>`utXp5qn9O3QoDB؇0VGk&5>].L / V:wk2@z4c'a?/`lO}N߼+OCwF?SӞ> JiMv%7n]Fe'8nb61bM2hT{afDMuJ[{9Fp:c2(St}xYGȄ!QrF<~@Y F}2IS]cx? fU(i6H.ݮ meYhaL}fuG:+Ah˿tTp}ZiǾixA>r(V9 ]PUi@JP{hv L 򭎄0kSVO2|eXkrOz0O Lo8n?)L C -=WiOz>T-owf(#I9f֎/P ./ ]ث(e=Vc}Sv#y`<;6ZNqߌul1|4J4\@a#ކ: `)AVI)1)aj>ZMvN#DPVSfVzP-vGQ"_{_wgsFWeFF7b萺|I^(Bi0{<2V/#T ^vW퀐,˹Mݟ;VPK(ͳeA tU?0j\\9Z" ʝUYޒ4G?臠UϊKkK+(iʮB~-`% jV4>_>g % ,r)Љd3x 2? S@F}k }|R {PLNrg YjaRJ%|n꧚5' 緼~)d{|΃&  7:6?wx0N֌]YmzufܳKrz0%2?\Xm#sJ]i^u6슮bq]R{R52{e Ò9|*}#vMiѯ4[PT_ եX66{Y#gZX]ڬ|GeX"Y1}GV22fCJ_gsn%PÞ~DeD0[v;9eNd<5 6B*oe<ְ<[яdؒm[N70] U4FQKA1y ;Ou>hHq]A1,h=r7s/,&'DId/kC_>/CJjk$u?|ۢcFィ+[ JO^vop &>}W"k=X-+=I$nEcD+w朵Au';w/M/߿zPb+SY?3(# w!Oirf%өD1gDVr?TΆQ)+̇>/P(US]J4XDSثM-BԤ﨎VgXiN=>fӻo;rGC6nEmqж .M1514 =HԎ^Cۑq'7CVRJ` !f0V(Y]ȈAS{ Oxp%nBg}:vk]!7YгAK xN^8|ڕwR ^F | -k@+̀{:piX9E4o >Zh L{.PzՌ5qj̀rB^Dܠ^ic~Wa1V3uVPrZXDwyWkx{R#7UR}*[>cCVE$=e]vg{RwbZgti kF kyTŊ4JpDu,v-Fhz_3g|ׯk>ɤC`a"]t1գ }dc?l+ @A 4 )\L>kw_ )5], -'H`/^Jz8\ot:4/g-)G6\$OSpi~ԝ[otV cV6pGѱLL dkzk'G-ѧeH:zA3Q4F0T./-dIbeVdcJfX##Q(BFl5QFgfU9-GQ됐B*u;6Gi_ `BBc$UXM.\ 掭, 6fY.ΔensAW V 3bD݊S?mfduj _A= T+`ЛZnevoX > .RJQ3Ohƀj@WUr!SSNJ[{BpɿUYSߺ&Z}^2sjg#[rktvE\L#-Vr2;$œoC :-(:`ܳm<̰>yk?RiI{+Yl^(TG#<6c;*@v.V_>_|4&ivpLJ \@p&M,khgLPذ:.R0H-*Hߚ"*vhվ%5'/|/?ݔWs<|V/1@nCwAzp'+. վj<i>ƌf<",iУN<9wP!T\lpo`mņ}Y'+ "Y\P @?,F(*73?fK)A M{T~ɴgrSv'Dx8H{n$, D`RPDQ"{wZ+:Cvl-p[%ph@IՆ˒O~;X9^3ƨSFv nm8AߐU}`5vϮ5_qQ ;F gDibmIMs\}^D]ImrHQ.͉A R q\5ÕY= թ^ n %BL՛$lh ID?={xЎ$)8ҷN7HrE&L]:m̆|hPlufq%VuW[a'e}UT8Y Fս~ͭ:ܫ$Ļ#359 `@hVY$5bO =Gub~2c*J95,vOS3sxڠp[~濫WCJlO$S&ulaVO>Ho*,ZwN*l(w xw-eF?29 h@vPckzw0o F$Ek}.Hb>TG{u+G/@ E&>ǪK!Hi&UAEmt#$g 19>>ˆei>FcF4Uk㾠v]ZB[D煉S SkvoWk=Yp{ }M /5dRK> e5FMxuO8گNo@2Sb# N\F7-dfjd)ڠϽQQ;/u#Wewz j rp$x܍d$T,HJ1Mکٻ^!gg*fq9%=n?yb`O .LK&[?{0/8_i]4L$a$%'&H7屐c:CuGNԣ0GP8߭Lcn3_,~:&>OjxM_#O~~Cy#m8 /M E|| kܒeʠ`)QZK "]-k111?mR ǞQ=#ռ8/ >p!jzF?\$Rg~K惵d~ح[9m <7GWnF: -!/4~hDžDGE7LY\ ٔh?Zō sQĈR!@[<^8~˜gE4% c2h[̶<3qvr. f{3'GlCCɌR`;ւjaW#`[5kAU,~osқ_zj!m߻݁w?l Ӛ{>ۏ)?F;ļzoKMp94&jzV=K\2R8hC~9j~Ӈ@A>N޶t ܌PʩhvWz'>}X@?Ok|Ԡ,:+֍*8Pg#- @u@c}g}l<#"*1cR"-2;('mɣ;N21uU {[dC˂pI ) JT @l%L%Rڇ Is ~FDhRϲ? N?p3'T2UZ&;$En!w7_8yzfuaD> Lcr ۓU'}s6'HW #B3vIMpNl?'m2]mHwÌš߉;94Xoe>%KN$ZY[Z)gTw)!:rFHn= ߶E";7N?JǦm6Jfsr^ThS2ZJ{~DR[_ףKQkaq/M:MzIxr QS7$H碝9Gӫ3G.gĈ;x?BvF[ih3Y }yQj>bsƣ$D'+̂&K6s6tBBTc(fgvֽvk'@"%WFMlh؅J3|mcĩ,Z[bIFLxKȢ\_rfߟvJ-V6_SJXSf1=dE?evHB*ozz$t5W%0χ~EkFFEjc|ǕNf"oYZ c¬@eh2.tu5N,IّyQ`H+?oyJѫeʩiOE͟Cs?A¨4bFpxeEN(b[N,wzJŜcӞG @*w{l ap19 &} MeUsÞߘĶ|p96vlz-e;|"Bk A ɍJ7 xU_eBoAqޛ!ų?&[jPHxG 8tmU;cLVwWGj#ұf'n~ĈcĜ}-U({ L",廽 ™hi}ЦO=K[؀SfF)sEp _Q  {3oa5,tTo햷ǃ$ 5}gOGB_Ź,۞.<ʂJ^ǎ胱p?,*e[OIkuc(v- DDuW?s2sR$ho+~o|Gf@U3Г`&?+}Ws`3=y2wM[*{Wx Ȭ/ʪA tH#_-_Ics=T,L7 @ h82og,3}svrEF#{z< Wl{eG4ElvJitGw[݃auZipW=KXá2P"E^5 [bykrôsLN k;mÄ E־VevÚ0CjĄp;>~2}~@az )rø3{ h)W&*.+Z }{?'#K.*X m" a $ U :aMUکq4U&s4gBZ{ dEqT) ܦ`q#QiWj>&[?ѬjTWkfh4&V4^{iv]_EUay@ ~ߧ:9)u2R?F'# psh:Â,k0^5pYeQ񝮪g%noX?[1kPS'H#?^aӪc ƭ[;8?ص7C]‰a,mhc|;%9o%nL!G5N?iKذ[Sn?2lo_CͽNEϥ~m3Oq?pP5D%o:n: 2 AOv,(S2vU 88i8I3),+M>H+ Ӫ8DDSsdVf(g&gBX1N}C=5pRQԭOZv3P }Z z7LvkcΫFNo5S^a3_5._wy3`!BE^rm!3ji{/44 F350LLiqC1C1)b'7=PGl',>W#^7v޸el`-o ?w3NڣP1H{jUӿ#%y"GDNz^bQtJ}?iȪ/)w~pI,?N{tnG?Y7Ⱥ+(?2 1a@was=d0ZPN;7PW>/KooR׿hLI߮wٌa 'Ovvc ]N!n6pw$<򗟿Q39ks@[H^jىꮆj97FH&$d KnEI1Xnl '8"!GH=&[a>N@ |=y>|@f3K2?ڙ3:lg\} T#(T Zxl[0Yߩ̉d= fNx,&Gvu. T:>#5)9_?ILS/X?F1,y9 @D6k`ޥcMCb}۹%k•*}0gjp.;6>5*m@֮2a0 [K-VN]}DZmjuO{|H⦈dkn PY?u_H VAF;k*\--)V1ꓲA*>6TH3}}#,Sؐ Ff`9M PýLޮaXii@a5\N}{/ӝ.^ Bm(2pS<+Ýۿ #f% /w^3=ۻ,}T{ۄ}{pO8Y>-1?Ub4{_3kޢuݵ4|G{v9d^͠yZ>&Wovu0)9.! Y+Fv1o*p'o`|U#wep`@y7[XU6餖?iP8"ӦHfH}3`?X' SdGPx]#J} Z!Orvak.;T*xQL2owf=q鵅Iji'qNJ,i(~1W5`t9?#AmHp;bhfś`heO!:fR#p$ tL(c̰I~vCȧ^a#6Aa%-W9|s>~};6>JpN7S}jUF/ Sc3z{&d!0e!\?iSuW,Piem@]5RIGбm93k 7M!PmTU@Z1⾛(t|#PV?lm #E)~ϻ )#s{9$m+ڍX (j˭E|qvth_@ ۟ᵾxW?yHa$ƛkzVF.2?+Ho8> fws% rQFd*#of)D<-(M5>pd`Z{D'w$T1BN{לU @u :)@[푢3KEG,VI,[U;ߌKo PôS{{UΩ}0 \~gMHLոtj)$Mo?n>qpa<7re5<C$C" Y# (O,՚utd pV:Z;fg עq\p_OŦ%Н6&/?׏? qѠ]? G&T ^@jcp WM<3o-/aVƩ3,ތj$twe:2TB>gbZ 5 0յ҄俘?}Fͭklx։=!\_I hO;lɋڭ鏘ҽZ:6#)M-9`Ј(pG 81 fə Q HrJgm($q_73zV(FLC~uʿ?2cұUY{=Jӡ?QDXpD>+Zk!z*(=AOے'<@Q#gwozZy/a D݌ހ&׎4ڎ!kyo~>τ=vIvB< 3K.>t?6'5x l~Q!nm{k3ߺ\<6!2 +NR7K`~;6|YŸ0{EfZ6cߴ'o}`-}Ϥ' !1J(_z /y쫰7To2#[B%;Qөb4w wQy%VG} = ݇?/G Odl= ȕ>F\ا]_yO)0 F cwyX@Xo]=/*b95+ )gWyii;3!A~gh2(?3OaU~Zs)" hXjJi3?+.8forO-cSޟ g0sǬ^0/N3ڷVi=Kv̗;a-s #N\`jmMtpwD6?_D\avهdr%ymf44sUV%͸|\uڵr&H-D=XYVDw844yw0j S 7x 㶬tUd*X a!dqP˩ SvLHW nyVdeAҕAVtoFLZKT?ٽ٭,*UB \>UYz'+l*tT\ ,;-[WK84yJVbqxٌy5?[ΊX}aN Wo)e:,ޒB͊c9j{H؀+{ Yt4{%T:"Ś#Y#\cmي @2 W_`*λk1={.q͌;X*cgJrj'g l*J{vXK.Gْ, &DE4Vﯓ"&20.1;5?-)ѳk2OoݲrTp~:,RGP_uƆteyKrk|xhY5fPhVQ ' QHVb-6Gg5TŞ0o4⸥Qן$xZ/5ti%Z-:&G쒉%C '':y_ /sw>;gFңo\QE&THէx~7o Fa C3 zwGq#U^^ ܁WooY 0nh@jTajS9T2N?g~vL!mh/ s1VP<SN]xAV)2 4 7 ȥSS&Zs%Q)fDXK08 ?U6;?L[TQ@vw|p_ xoKyD;&BҊ**"/lb[?;u@?4(L97Iڕ eS$'cDqtc \ `/3 {W`!`Rrc&0رո*6pU/LVQdRJ 9ͭ:<8A@LD/ֱNaf|plVa?ׄҾnVw`pg{̗a^@M -<f_Ô(F@Tݼy3p2pS%\]6N[:4tub亜([&BtԔ@XXᔼ? |75Td=?(:1|~ _bm(@Gf(}F37g rp21QόLz%nHNZWI]>RCGkx/M_;'??-_A,PKNeS w@&zhxP 8Jbh984}fBr`и"z>8H!>]-&Z$Ks9b~V xZ՛Ov*ۧdvS*7qM1X0; -9N!sl/V>{-S!qzarwΌ6Ƕvp8q7.,M@sgFRO?-ԭ6thIA{0|)Ѝ CmBY;= rM+oaZ4U+0Yu>M0ַb@>muY8ո?MBecv|r8joCxkda|ۋu*؅#*orn3OY?ֲL./A"֏1aۄ_ޥ0-I3%@&Tͅ6?Cʉ<;;ʂZIk)jVӀrGUQDkZ/_!q?o7{F+eOL.$z 5rvc. w-eB@z5"fm9.H9Y'OĀ0o=z@&u\+Vz;TBF>?O0xN(`29¤·ڀȌx{VRIU=s:f3`y2nPF@1Wo@fp3@U* ?$W{K?q!qώu,ܞӀ\^>>1Y)9^|9%oPsОDB~ $U ͍Şoak'<0Qo*``|y'Wyno4 O-Vh:qS!,8rkS9?7C2pP/IRmU{!9*^l9;g\RR P\Suf^h)ч*_R_NlgG7wC0絑q\ANi1֫k==e/1ӟ6ҽt-,nT;G;uO ^'\}QTYpUmp̬,gew<muAȬPizx*O++Gne˪ |,m{(TZކ|v>Y$j{X du{Z@ZxpA\ShɅ0V7+ԡ801ڇ: ۙ콱5@{ F,f1",TdDBroQU akVk? pl&-}I!&-NH:vo״?jg4mH[`h*AFuWj)^p")=e1ٓ} m^] EԑM^FZ: ݱڙmc*[е{=) \ JSB6>ND>@6zժ>=޵dsjTdle<]?+5Hg 8G֙`<2;3+ z w?s@bUӗy[\>EXmq|jWK`UzY?i z·:%KP/ޑ{fzv"ռ79g%5/sOǃ0\3 \ wk8f(xJv|tQNFYFQF U( n=?sv %#4VJ4vu@aH2?Nvt_"r25>1j)RSX LPFYieܖ/}teh yk c+O#,XowO+Iˬc|#;;Ǔq޴=4Rp٥Bh#tɂnX{ÓX+^t `?24. w;XtXbVn,~sO!ģ:jX(ϊ>.kZz"N&QX?!jnaPц`S.(s^$p8]"%^yɈMMz%'|}߾[Ԝ!#J >gFOx8*;I_ы6Gx+ǚ3)9T[mUgpfnߪuQZ|@< Wq sO)͙X~X4,?v}&Qݵ*@т}=.-3%O3sDCkͥq8T9f^aydq1ڋc%:ytB8/cíoڇ\b}532s3]f/QhM8HTX;ձbvUК\խ}ēnU1 a&1  ̬ 9f)Ƃ P82"B֧@vZI[TwґAeGr[HM ͝?*$膷|yW ]38rO#L|!-H72h ־UBt e{_:Te5M k:w2rŵZY>s@[E"8=HQGkqnF=N=l~E}EKmQ?=|8‚pi"BwF>kKZDoIMSE_Q g,x uw5[xe){GؠKK#O׷zRoloˣ]1Od4KU$(0#7F=u 4ZF⼿-)[ =0mZ@FNڪi8}SD8"*)F>DgH3\v, 9 O1/Y7&A)x~+dC9u?.D%먔׾iwvtcj4 wGvntUEе 4+9e}hsqӺ@ B]6 &|^>QoBK6$Cxs7U!.Z D3q5?/}[ $a~AC.T_U;jL/$uκ[Ǽ*-8l#ЭJv('1fTRoM< ZՁAS>Bߑ+1zJ,R*^(]˚S/zL+}b, uo 44*&UR=a{P!VJx$D{XBTԲ *|v0p?uuWJ$`^WOq s`cI(w_`юV+" Y$ͷioQD')-q[: {rV:DWк+ʖ]Ml7RoA3f<`ZR2W֎ӛ;~L+Dz9uF4a\3o- GZ-}bF1xUUޟ~>0Ej;-aæs΀,55ڨT)^1Yͧ >X{d؇vƚ-F\/wlQXtϤ ѻNV2R;O?{;k?.2`Y(zܧ7uGiyq>!R?ni풎mҁ/+xTJ0ӵA: i;)*͇H|ZR=PJ|O薜6}i7;oZ7LF#qTŦ|[c}>1vn7L[ǠZn*M19^-qf9;,@ng$-{[^> vp ۻD2`cz>R. GP@08ݕ$+9 & ' {B/-i0[^[̝˹v Ʈ6~DD̩3Х E9`w?FN0ޟg6ˎ=zϛ 6>,i{Y?6ݣlQGF8T &[ԏF/ Y <0.Rcl{>1xK.g7\9nTqšv_Stѯtbs@=?kooC 'agt2y''[{8%NtrpC#WEܾ{ ߱#7L0BBжcCdw8i/NѴIELGw7u>,Q7"V慿/WNIr3$K]\Y}WE=Y"9NU]ǿu?Se1gJi[wBZ֡nZUվg.](7ݶԾ[[t*ѷWWF[L!Soy LK uҜant|v1.W{l嘯ilhfՕ.Tk:F?H!&7,(Rw4QOpilt稝ՀN8~ ыZܑJYbƤfU*-Ip[R ݍ- \47O<0%Hb&f kt/H@ᴌ:ܫ(՜jE?s ?RN*}l=2\k8ʾPwͤ!P,:moX(tmp ڒs̑!э6?a6us?( )cz$mXk tG=3J/Wf#}54<#~LZNGV+Go͔=P-cOyhHBѬ(KpV@FQ1U2i{l7c3ZZlM+hސ{hOݩ*wTjQt`by ʱ rB4oO9#@c3{?|\Ia hy@ t/JzoxWxt뛌vu(k$_:-В8'0+[t'g17lހU:@ó܅ ǚ_ΎKc͖\xG8B|@ųqq uwe{g:QSX:<-,-!mՒbr@һEZ ΦWRȖ._K>L a6|%)P"bٝ-iy_e@X!NCafDLE؍L:^kV{迾\c-n FxE NڟQD"dzIl *7I^xcq'|ӖQIo ,ʟ!ٳ3.Z Qq^"Z;xfњOjY儅,7BQkjiƳנJ9fz2MBRaP\|vhL!P 0X&{"lwoYӳ ͆qPF|hH'؍||8:guY~zXΎ0rV- C#CDz$v.K~ABZE'?w~efNwmCؙSgz% vrwU)M82)׻(NKT?.NQlj} {98 1 p'hjwi ?ֳ  'əR>;'ѤOiX rkBA*X SOJOzzΤ ]|+q?}2N 06>e}@Ө_*[K'~]¡5l8^EoM[hǔXdgˆJOIyryS(ypqN}=ת62ûƵgyIオ0`zFS#" 5xp"3'Y+_U۫WZ S^'i'A9dDIqA]5'nim՝ܛՠna9Y7Mnj f FP5 h 4-2e.xPCiz$0sJp {mY}#zw4z2Hd6L)3 q30ΐ; [-ףgg,dƗR$8qqOq;VRcPoީz, Z&`\8l} ƺlLtGz+ܯ1BPI RA Wcgtjig|qf#H3^.f!UDI8g8,)YpWuAA4V닠wοso;^ ?K1x]6yq&P[!ߤM.35Ӫ@}!Nm|O[%GTPz%ui&cEvA/ɩm{j߭]bړRST߬tlG%C`^kKChLMFXwJ]I?طڡ}w~CXN} '_.3ޝ(N[ }sVv;;>.rHB ϧ=u\$f9 f~q`ID pd^KUt4OfI:<4[9ux4zCcGV#Nk:sqRg=4N6sCi!.!Z9"yWn:}y7PT'? NOVQ,A;c'.JyCG[eшcv:Qb6I=;>H7u=<){ {;4OeMcd2d^#use ,Q1>{38rMm,Φ>-t^%(yVmOt-?1'GTT$W?c'6&Vbh\2p4^Ln('OqXlpڼ?Xtӣg<~&Q$,dj}5iEg[p*5HH`hzpzYxZ2@_6W4vhFqHNOf.x~ 9np<_Pw!Ǹ:=25;g&\N a& '*g`O)E*LomOcD[HL ^nlXpz ]feZq;x6epi=ԎAyvZC_j 2(5dhf+iH:&M=4`qVο7n~ʹ#aô>U)[Z'_~/Åyyk-05hw5e}}{IL^G5ÜPQ"GݾS85z`qp[q$:#3/hO>i=nc"},H* {I8I~Л(핓 u as/ʮipKQdl$T[ݵ4<_zյ{eBTsWz1)nF=knI.=U }W8}A{Iwy#Oe6NcV T<]UlPW@7v:_焂\rQ4t{j~@ܐLĕߡ4ϲȀv+ru+s)SVd(鐬N֪͍ҁ1Sͯ<Ge"x`La:>L_ dmoOaLM` 5 ak }QED[jzY?#27|&Uݷ+#M;a,^A Cq Ci-4k+] tbqS?ɻz;J,㚴/G̟An2LݢՂwo'??ׯZ9YmptuO?wX* ]HqiMLɀσNK7|˱Fu_Sd}D6}K .Kմql?d@TPsׅF^Leq|7y7o*'<MnXPG[OR189? `82H}&K:*_)VܦRʎ$:+Ĝz솓[IONg;OdJ6{ymvم.HJ'y?El+h#ѩk f ,+GߏzO]431^7*=ZޒV8]uJI@=G Ϋ6xMp2 6'olۉ5wt$Vo E GEQ\~S2`L8E>}g MhwYg ]fQw,J b9@L|\? ˒3zޖ dzaPFV?FQ,0c~}_M)Qn Uy`MZ=Rb}$LgǂHF#DmPP) 7ws _5쨳TM5f?%@`:aF? lo[}x8t$9G/rubiutadU<,׶gޓvqV{n˗㗳z>M CnK@>B㿚Vo p)Nfh;>/|RC{m4ST'bZo+ *_{rOh6Z2{QOR[KvXu_g@rq%]ұxKOj1`1>sW5# ǝt+8!m*]5I]_1,`F>%0cQ3)o2'Q >/5?.la ΎfF*}fr_REfT=mkѡkᣡeUq&ZUiG5IviaKշ:JƳƅ,!G&]>dhT/y@0TvYA޵}kܑB?n7| ,F-IAjh(D|Mg" 5&c8?pQP+ھϱ B]氱nׇww46@%6N8Ux D13I}x@ *T*VW= @WXjT?}'-gR6+GFI2K/fr'gG+G:Us? O y]FL33?Zp*߻[LnM1ZM_?O~KK~p?~o#nsӳ'ZsTpsF{e)!B=SE'K#A\&.v=aj="oͲ KJ$~X3h G|{=Ivz*`'L;jwggVN4pr ͆6N t8ZeFG9^{,с!H}B!oc?ӛ:?YZ8̄a튙 ֜q)x+۫FH:pVš2.~&8 J8ߤڈ`M-ޮ5Q "=h1׈0ks<̾QڷڷP4w{moI%gNoiIz O%Q_c9e_Ķ[4F@<[2-1^Ӱwӣvb L|ykv:$9sEOqX` u< r f|o iEv&KegFJo)StQq;7ZC:FioWDTHJ469^GL'8Llt;^GJ R#[B:1%/–fX?XiTθޟqχWT(ΖM>*03#g ssZ5ʤ{>*_Ͽ7_٧rvwl~,́RZk:( 3=:\8d;$ufw/[$܍%ś]% /pEKe0Β`Wxg3Bj7i-^OqB(gUz;.))oB֕VWXD7={P6fMۜ#6`s6ޑJ?8N<_5pT?Cz,7.Sj@TKthK(V1ZͅJ !DzIUGカ f ?A$3^GMy:5?:F59sg~IQPMaMqNZ/(o(wV $ج{ԢnqThG1$ۺ֬RZrAE #ݮ})L|$=aaW?#B6J>ۓ.Ii)EXH(H{*RMhU v6 ynfmF1Od!3& (BV /trP OXj_5X)~^oB܇bs3aQhc,Fv3}e2Pp0ZsQ:z*{9ߎqny q΃zvU$ҿMt*G†{˞nET {R#Ax8i'9IWD!>-ƌI:@]?8u᷒k7vW&=:ܷM #xuv q*|$ @  i #[5#B#V︳3,})>574`\p9iVU@uF) jTtmMj#A:Tg;B97  POo fo\/} Q S9 ޜot{5@ pdPzH|NJf?yċb9&rׄڔ L!?"uk^CӀ7P;.G9Cx^6|eǴr%yVwf:#"nkk/q8-M )!F;]IXO]1pO~?V)g$[HXSa QC/D].EW _/i Xtha7*H+Hϔ&_9Uľ*`"c(<71+<uDooz2o~3W|>-5Y(#_p9w h;TO=6oxu88gϖsL*P.6Pi\|1&3Qbq/N{8ep\7T6Q4[,7bʜD^Z@6 l}N y&V$D>i&;MFm߾;?irnZ)٣v^Q$db6T*zHD|J… dlb4Q@-bm(oIʆ{3TS>kNhS}>qܜڭCZ{N_4?!>Չ4!!.g`^+'Si'aϧ <>[+cw{"^!?-F[6[ep6z ,<fTΏU}F.NTs`Q8D^j/5+VYbb :Ύ4L9-o=k#'Fx_+^SI`6 T Le8QL81i5LR^Fc`Ad͝*y sy% -"9 N {l^լ[i1׃i\69Ξ =lSv{k}rfH;e$ߒC ~߃2g 䴝v OgeA]TV!P?~胻R|7Z+:yΎA$l,ih,fGp^#]_7㐫UoPɪ5jn~̌!3c4^JnƣtߚЊ}>oy gnjS+1,#O:,> 402*w}3W(4*7wڈ'F[ޡO|#w|=g7]$ _> vB~ c/ݽ=h3Ua}W758yh#"xyfJc [%p?Z7x6v9͏<)QY 'BMNq\юG>JoggtYJԠ!#ai`^.5&-PU?:! (ڢ *䏬IYvwhj6|95v(/Xq6 iK{Y~z ~Vtb\X?m }v}و1QKbzVGo^U<[-Ff9? S(0N3x\2e T+R |(jFfќ)#m;xU߷A? q5̽W&E Klj-&w]!YָS>#'?ywslfWRU?:}礓\a6A6lHO}!BV/:qnj%G/mErn5B^9$feDϕ{+9]H#kcM20T @'iCy{3'aN8ahP=p{?GaHrp1"qLНZ }sI^ܛvPNJ?(l'{@64с!>:^kRh^$3FInhSJޣU9?0 }(7hϏ.&>40\+żC;<=btrC-:5+J5ߍS.lWw?E+$&Kv0% i#'IwlU%c )&Lf`MTJA˓Fbefs%8[cTˍ}wAYR(Q)~ cL=[Qj*"\%\֊FWUm]&8$.XUf)=`Z ({I+  % X+ƀJLtk=u{ ?o?{GY'm't2N8,JbxB_fliArV>X[ h6̤r*oY[$0!,3U?Sg ~}_߯~}_߯~}_߯~}_߯~}_߯r v_sim-3.7.0/examples/demo.ascii0000644000353400050620000003143512215546211013342 00000000000000Fichier Ni3Au 1.60800000000000e+01 0.00000000000000e+00 1.60800000000000e+01 0.00000000000000e+00 0.00000000000000e+00 1.60800000000000e+01 !This is a sample atomic file in ascii format !All lines must contain at most 256 characters !1st line is arbitrary !2nd line must contain dxx dyx dyy values !3rd line must contain dzx dzy dzz values !All subsequent lines can be comment lines (ignored), i.e. ! empty, containing only blanks, or beginning with ! or with # !After the mandatory 3 beginning lines, a non comment line must ! contain x y z name, giving the 3 coordinates and the name of the atom !Please note that the name must contain at most 8 characters (non blank) !Please also note that real values are in free format ! HOWEVER, (Fortran) format like 1.03D+05 is NOT SUPPORTED ! and must be written 1.03E+05 (or 1.03e+05) !keyword: angstroem 4.02000000000000e+00 4.02000000000000e+00 2.01000000000000e+00 Ni 4.02000000000000e+00 4.02000000000000e+00 6.03000000000000e+00 Ni 4.02000000000000e+00 4.02000000000000e+00 1.00500000000000e+01 Ni 4.02000000000000e+00 4.02000000000000e+00 1.40700000000000e+01 Ni 4.02000000000000e+00 8.04000000000000e+00 2.01000000000000e+00 Ni 4.02000000000000e+00 8.04000000000000e+00 6.03000000000000e+00 Ni 4.02000000000000e+00 8.04000000000000e+00 1.00500000000000e+01 Ni 4.02000000000000e+00 8.04000000000000e+00 1.40700000000000e+01 Ni 4.02000000000000e+00 1.20600000000000e+01 2.01000000000000e+00 Ni 4.02000000000000e+00 1.20600000000000e+01 6.03000000000000e+00 Ni 4.02000000000000e+00 1.20600000000000e+01 1.00500000000000e+01 Ni 4.02000000000000e+00 1.20600000000000e+01 1.40700000000000e+01 Ni 8.04000000000000e+00 4.02000000000000e+00 2.01000000000000e+00 Ni 8.04000000000000e+00 4.02000000000000e+00 6.03000000000000e+00 Ni 8.04000000000000e+00 4.02000000000000e+00 1.00500000000000e+01 Ni 8.04000000000000e+00 4.02000000000000e+00 1.40700000000000e+01 Ni 8.04000000000000e+00 8.04000000000000e+00 2.01000000000000e+00 Ni 8.04000000000000e+00 8.04000000000000e+00 6.03000000000000e+00 Ni 8.04000000000000e+00 8.04000000000000e+00 1.00500000000000e+01 Ni 8.04000000000000e+00 8.04000000000000e+00 1.40700000000000e+01 Ni 8.04000000000000e+00 1.20600000000000e+01 2.01000000000000e+00 Ni 8.04000000000000e+00 1.20600000000000e+01 6.03000000000000e+00 Ni 8.04000000000000e+00 1.20600000000000e+01 1.00500000000000e+01 Ni 8.04000000000000e+00 1.20600000000000e+01 1.40700000000000e+01 Ni 1.20600000000000e+01 4.02000000000000e+00 2.01000000000000e+00 Ni 1.20600000000000e+01 4.02000000000000e+00 6.03000000000000e+00 Ni 1.20600000000000e+01 4.02000000000000e+00 1.00500000000000e+01 Ni 1.20600000000000e+01 4.02000000000000e+00 1.40700000000000e+01 Ni 1.20600000000000e+01 8.04000000000000e+00 2.01000000000000e+00 Ni 1.20600000000000e+01 8.04000000000000e+00 6.03000000000000e+00 Ni 1.20600000000000e+01 8.04000000000000e+00 1.00500000000000e+01 Ni 1.20600000000000e+01 8.04000000000000e+00 1.40700000000000e+01 Ni 1.20600000000000e+01 1.20600000000000e+01 2.01000000000000e+00 Ni 1.20600000000000e+01 1.20600000000000e+01 6.03000000000000e+00 Ni 1.20600000000000e+01 1.20600000000000e+01 1.00500000000000e+01 Ni 1.20600000000000e+01 1.20600000000000e+01 1.40700000000000e+01 Ni 2.01000000000000e+00 4.02000000000000e+00 4.02000000000000e+00 Ni 2.01000000000000e+00 4.02000000000000e+00 8.04000000000000e+00 Ni 2.01000000000000e+00 4.02000000000000e+00 1.20600000000000e+01 Ni 2.01000000000000e+00 8.04000000000000e+00 4.02000000000000e+00 Ni 2.01000000000000e+00 8.04000000000000e+00 8.04000000000000e+00 Ni 2.01000000000000e+00 8.04000000000000e+00 1.20600000000000e+01 Ni 2.01000000000000e+00 1.20600000000000e+01 4.02000000000000e+00 Ni 2.01000000000000e+00 1.20600000000000e+01 8.04000000000000e+00 Ni 2.01000000000000e+00 1.20600000000000e+01 1.20600000000000e+01 Ni 6.03000000000000e+00 4.02000000000000e+00 4.02000000000000e+00 Ni 6.03000000000000e+00 4.02000000000000e+00 8.04000000000000e+00 Ni 6.03000000000000e+00 4.02000000000000e+00 1.20600000000000e+01 Ni 6.03000000000000e+00 8.04000000000000e+00 4.02000000000000e+00 Ni 6.03000000000000e+00 8.04000000000000e+00 8.04000000000000e+00 Ni 6.03000000000000e+00 8.04000000000000e+00 1.20600000000000e+01 Ni 6.03000000000000e+00 1.20600000000000e+01 4.02000000000000e+00 Ni 6.03000000000000e+00 1.20600000000000e+01 8.04000000000000e+00 Ni 6.03000000000000e+00 1.20600000000000e+01 1.20600000000000e+01 Ni 1.00500000000000e+01 4.02000000000000e+00 4.02000000000000e+00 Ni 1.00500000000000e+01 4.02000000000000e+00 8.04000000000000e+00 Ni 1.00500000000000e+01 4.02000000000000e+00 1.20600000000000e+01 Ni 1.00500000000000e+01 8.04000000000000e+00 4.02000000000000e+00 Ni 1.00500000000000e+01 8.04000000000000e+00 8.04000000000000e+00 Ni 1.00500000000000e+01 8.04000000000000e+00 1.20600000000000e+01 Ni 1.00500000000000e+01 1.20600000000000e+01 4.02000000000000e+00 Ni 1.00500000000000e+01 1.20600000000000e+01 8.04000000000000e+00 Ni 1.00500000000000e+01 1.20600000000000e+01 1.20600000000000e+01 Ni 1.40700000000000e+01 4.02000000000000e+00 4.02000000000000e+00 Ni 1.40700000000000e+01 4.02000000000000e+00 8.04000000000000e+00 Ni 1.40700000000000e+01 4.02000000000000e+00 1.20600000000000e+01 Ni 1.40700000000000e+01 8.04000000000000e+00 4.02000000000000e+00 Ni 1.40700000000000e+01 8.04000000000000e+00 8.04000000000000e+00 Ni 1.40700000000000e+01 8.04000000000000e+00 1.20600000000000e+01 Ni 1.40700000000000e+01 1.20600000000000e+01 4.02000000000000e+00 Ni 1.40700000000000e+01 1.20600000000000e+01 8.04000000000000e+00 Ni 1.40700000000000e+01 1.20600000000000e+01 1.20600000000000e+01 Ni 4.02000000000000e+00 2.01000000000000e+00 4.02000000000000e+00 Ni 4.02000000000000e+00 2.01000000000000e+00 8.04000000000000e+00 Ni 4.02000000000000e+00 2.01000000000000e+00 1.20600000000000e+01 Ni 4.02000000000000e+00 6.03000000000000e+00 4.02000000000000e+00 Ni 4.02000000000000e+00 6.03000000000000e+00 8.04000000000000e+00 Ni 4.02000000000000e+00 6.03000000000000e+00 1.20600000000000e+01 Ni 4.02000000000000e+00 1.00500000000000e+01 4.02000000000000e+00 Ni 4.02000000000000e+00 1.00500000000000e+01 8.04000000000000e+00 Ni 4.02000000000000e+00 1.00500000000000e+01 1.20600000000000e+01 Ni 4.02000000000000e+00 1.40700000000000e+01 4.02000000000000e+00 Ni 4.02000000000000e+00 1.40700000000000e+01 8.04000000000000e+00 Ni 4.02000000000000e+00 1.40700000000000e+01 1.20600000000000e+01 Ni 8.04000000000000e+00 2.01000000000000e+00 4.02000000000000e+00 Ni 8.04000000000000e+00 2.01000000000000e+00 8.04000000000000e+00 Ni 8.04000000000000e+00 2.01000000000000e+00 1.20600000000000e+01 Ni 8.04000000000000e+00 6.03000000000000e+00 4.02000000000000e+00 Ni 8.04000000000000e+00 6.03000000000000e+00 8.04000000000000e+00 Ni 8.04000000000000e+00 6.03000000000000e+00 1.20600000000000e+01 Ni 8.04000000000000e+00 1.00500000000000e+01 4.02000000000000e+00 Ni 8.04000000000000e+00 1.00500000000000e+01 8.04000000000000e+00 Ni 8.04000000000000e+00 1.00500000000000e+01 1.20600000000000e+01 Ni 8.04000000000000e+00 1.40700000000000e+01 4.02000000000000e+00 Ni 8.04000000000000e+00 1.40700000000000e+01 8.04000000000000e+00 Ni 8.04000000000000e+00 1.40700000000000e+01 1.20600000000000e+01 Ni 1.20600000000000e+01 2.01000000000000e+00 4.02000000000000e+00 Ni 1.20600000000000e+01 2.01000000000000e+00 8.04000000000000e+00 Ni 1.20600000000000e+01 2.01000000000000e+00 1.20600000000000e+01 Ni 1.20600000000000e+01 6.03000000000000e+00 4.02000000000000e+00 Ni 1.20600000000000e+01 6.03000000000000e+00 8.04000000000000e+00 Ni 1.20600000000000e+01 6.03000000000000e+00 1.20600000000000e+01 Ni 1.20600000000000e+01 1.00500000000000e+01 4.02000000000000e+00 Ni 1.20600000000000e+01 1.00500000000000e+01 8.04000000000000e+00 Ni 1.20600000000000e+01 1.00500000000000e+01 1.20600000000000e+01 Ni 1.20600000000000e+01 1.40700000000000e+01 4.02000000000000e+00 Ni 1.20600000000000e+01 1.40700000000000e+01 8.04000000000000e+00 Ni 1.20600000000000e+01 1.40700000000000e+01 1.20600000000000e+01 Ni 2.01000000000000e+00 2.01000000000000e+00 2.01000000000000e+00 Au 2.01000000000000e+00 2.01000000000000e+00 6.03000000000000e+00 Au 2.01000000000000e+00 2.01000000000000e+00 1.00500000000000e+01 Au 2.01000000000000e+00 2.01000000000000e+00 1.40700000000000e+01 Au 2.01000000000000e+00 6.03000000000000e+00 2.01000000000000e+00 Au 2.01000000000000e+00 6.03000000000000e+00 6.03000000000000e+00 Au 2.01000000000000e+00 6.03000000000000e+00 1.00500000000000e+01 Au 2.01000000000000e+00 6.03000000000000e+00 1.40700000000000e+01 Au 2.01000000000000e+00 1.00500000000000e+01 2.01000000000000e+00 Au 2.01000000000000e+00 1.00500000000000e+01 6.03000000000000e+00 Au 2.01000000000000e+00 1.00500000000000e+01 1.00500000000000e+01 Au 2.01000000000000e+00 1.00500000000000e+01 1.40700000000000e+01 Au 2.01000000000000e+00 1.40700000000000e+01 2.01000000000000e+00 Au 2.01000000000000e+00 1.40700000000000e+01 6.03000000000000e+00 Au 2.01000000000000e+00 1.40700000000000e+01 1.00500000000000e+01 Au 2.01000000000000e+00 1.40700000000000e+01 1.40700000000000e+01 Au 6.03000000000000e+00 2.01000000000000e+00 2.01000000000000e+00 Au 6.03000000000000e+00 2.01000000000000e+00 6.03000000000000e+00 Au 6.03000000000000e+00 2.01000000000000e+00 1.00500000000000e+01 Au 6.03000000000000e+00 2.01000000000000e+00 1.40700000000000e+01 Au 6.03000000000000e+00 6.03000000000000e+00 2.01000000000000e+00 Au 6.03000000000000e+00 6.03000000000000e+00 6.03000000000000e+00 Au 6.03000000000000e+00 6.03000000000000e+00 1.00500000000000e+01 Au 6.03000000000000e+00 6.03000000000000e+00 1.40700000000000e+01 Au 6.03000000000000e+00 1.00500000000000e+01 2.01000000000000e+00 Au 6.03000000000000e+00 1.00500000000000e+01 6.03000000000000e+00 Au 6.03000000000000e+00 1.00500000000000e+01 1.00500000000000e+01 Au 6.03000000000000e+00 1.00500000000000e+01 1.40700000000000e+01 Au 6.03000000000000e+00 1.40700000000000e+01 2.01000000000000e+00 Au 6.03000000000000e+00 1.40700000000000e+01 6.03000000000000e+00 Au 6.03000000000000e+00 1.40700000000000e+01 1.00500000000000e+01 Au 6.03000000000000e+00 1.40700000000000e+01 1.40700000000000e+01 Au 1.00500000000000e+01 2.01000000000000e+00 2.01000000000000e+00 Au 1.00500000000000e+01 2.01000000000000e+00 6.03000000000000e+00 Au 1.00500000000000e+01 2.01000000000000e+00 1.00500000000000e+01 Au 1.00500000000000e+01 2.01000000000000e+00 1.40700000000000e+01 Au 1.00500000000000e+01 6.03000000000000e+00 2.01000000000000e+00 Au 1.00500000000000e+01 6.03000000000000e+00 6.03000000000000e+00 Au 1.00500000000000e+01 6.03000000000000e+00 1.00500000000000e+01 Au 1.00500000000000e+01 6.03000000000000e+00 1.40700000000000e+01 Au 1.00500000000000e+01 1.00500000000000e+01 2.01000000000000e+00 Au 1.00500000000000e+01 1.00500000000000e+01 6.03000000000000e+00 Au 1.00500000000000e+01 1.00500000000000e+01 1.00500000000000e+01 Au 1.00500000000000e+01 1.00500000000000e+01 1.40700000000000e+01 Au 1.00500000000000e+01 1.40700000000000e+01 2.01000000000000e+00 Au 1.00500000000000e+01 1.40700000000000e+01 6.03000000000000e+00 Au 1.00500000000000e+01 1.40700000000000e+01 1.00500000000000e+01 Au 1.00500000000000e+01 1.40700000000000e+01 1.40700000000000e+01 Au 1.40700000000000e+01 2.01000000000000e+00 2.01000000000000e+00 Au 1.40700000000000e+01 2.01000000000000e+00 6.03000000000000e+00 Au 1.40700000000000e+01 2.01000000000000e+00 1.00500000000000e+01 Au 1.40700000000000e+01 2.01000000000000e+00 1.40700000000000e+01 Au 1.40700000000000e+01 6.03000000000000e+00 2.01000000000000e+00 Au 1.40700000000000e+01 6.03000000000000e+00 6.03000000000000e+00 Au 1.40700000000000e+01 6.03000000000000e+00 1.00500000000000e+01 Au 1.40700000000000e+01 6.03000000000000e+00 1.40700000000000e+01 Au 1.40700000000000e+01 1.00500000000000e+01 2.01000000000000e+00 Au 1.40700000000000e+01 1.00500000000000e+01 6.03000000000000e+00 Au 1.40700000000000e+01 1.00500000000000e+01 1.00500000000000e+01 Au 1.40700000000000e+01 1.00500000000000e+01 1.40700000000000e+01 Au 1.40700000000000e+01 1.40700000000000e+01 2.01000000000000e+00 Au 1.40700000000000e+01 1.40700000000000e+01 6.03000000000000e+00 Au 1.40700000000000e+01 1.40700000000000e+01 1.00500000000000e+01 Au 1.40700000000000e+01 1.40700000000000e+01 1.40700000000000e+01 Au v_sim-3.7.0/examples/demo.d30000644000353400050620000001045012215546211012552 00000000000000Fichier Ni3Au l@Ni Au 0@0zG@0zG@0zG0`@zG@zG@zG@zG@zG@zG@zG@zG@zG@zG@zG@zG@ zG@ zG@ zG@ zG@ zG@ zG@ zG@ zG@ zG@ zG@ zG@ zG@(Q @(Q @(Q @(Q @(Q @(Q @(Q @(Q @(Q @(Q @(Q @(Q @zG@zG@zG@zG@zG@zG@zG@zG@zG@Q @Q @Q @Q @Q @Q @Q @Q @Q @$@$@$@$@$@$@$@$@$@,# =p@,# =p@,# =p@,# =p@,# =p@,# =p@,# =p@,# =p@,# =p@zG@zG@zG@zG@zG@zG@zG@zG@zG@zG@zG@zG@ zG@ zG@ zG@ zG@ zG@ zG@ zG@ zG@ zG@ zG@ zG@ zG@(Q @(Q @(Q @(Q @(Q @(Q @(Q @(Q @(Q @(Q @(Q @(Q @zG@zG@zG@zG@zG@zG@zG@zG@zG@zG@zG@zG@zG@zG@zG@zG@Q @Q @Q @Q @Q @Q @Q @Q @Q @Q @Q @Q @Q @Q @Q @Q @$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@,# =p@,# =p@,# =p@,# =p@,# =p@,# =p@,# =p@,# =p@,# =p@,# =p@,# =p@,# =p@,# =p@,# =p@,# =p@,# =p``@zG@zG@zG@zG@ zG@ zG@ zG@ zG@(Q @(Q @(Q @(Q @zG@zG@zG@zG@ zG@ zG@ zG@ zG@(Q @(Q @(Q @(Q @zG@zG@zG@zG@ zG@ zG@ zG@ zG@(Q @(Q @(Q @(Q @zG@zG@zG@ zG@ zG@ zG@(Q @(Q @(Q @zG@zG@zG@ zG@ zG@ zG@(Q @(Q @(Q @zG@zG@zG@ zG@ zG@ zG@(Q @(Q @(Q @zG@zG@zG@ zG@ zG@ zG@(Q @(Q @(Q @zG@zG@zG@Q @Q @Q @$@$@$@,# =p@,# =p@,# =p@zG@zG@zG@Q @Q @Q @$@$@$@,# =p@,# =p@,# =p@zG@zG@zG@Q @Q @Q @$@$@$@,# =p@,# =p@,# =p@zG@zG@zG@zG@Q @Q @Q @Q @$@$@$@$@,# =p@,# =p@,# =p@,# =p@zG@zG@zG@zG@Q @Q @Q @Q @$@$@$@$@,# =p@,# =p@,# =p@,# =p@zG@zG@zG@zG@Q @Q @Q @Q @$@$@$@$@,# =p@,# =p@,# =p@,# =p@zG@zG@zG@zG@Q @Q @Q @Q @$@$@$@$@,# =p@,# =p@,# =p@,# =p``@zG@Q @$@,# =p@zG@Q @$@,# =p@zG@Q @$@,# =p@zG@Q @$@,# =p@zG@Q @$@,# =p@zG@Q @$@,# =p@zG@Q @$@,# =p@zG@Q @$@,# =p@zG@Q @$@,# =p@zG@ zG@(Q @zG@ zG@(Q @zG@ zG@(Q @zG@ zG@(Q @zG@ zG@(Q @zG@ zG@(Q @zG@ zG@(Q @zG@ zG@(Q @zG@ zG@(Q @zG@ zG@(Q @zG@ zG@(Q @zG@ zG@(Q @zG@ zG@(Q @zG@ zG@(Q @zG@ zG@(Q @zG@ zG@(Q @zG@ zG@(Q @zG@ zG@(Q @zG@ zG@(Q @zG@ zG@(Q @zG@ zG@(Q @zG@ zG@(Q @zG@ zG@(Q @zG@ zG@(Q @zG@Q @$@,# =p@zG@Q @$@,# =p@zG@Q @$@,# =p@zG@Q @$@,# =p@zG@Q @$@,# =p@zG@Q @$@,# =p@zG@Q @$@,# =p@zG@Q @$@,# =p@zG@Q @$@,# =p@zG@Q @$@,# =p@zG@Q @$@,# =p@zG@Q @$@,# =p@zG@Q @$@,# =p@zG@Q @$@,# =p@zG@Q @$@,# =p@zG@Q @$@,# =p`v_sim-3.7.0/examples/demo.xyz0000644000353400050620000013302712215546211013104 00000000000000 950 This is a file for testing pseudo-XYZ file format C 11.277072 0.000000 0.000000 C 25.373412 0.000000 0.000000 C 36.650484 0.000000 0.000000 C 7.048170 0.000000 0.000000 C 38.060118 0.000000 0.000000 C 23.963778 0.000000 0.000000 C 29.602314 0.000000 0.000000 C 4.228902 0.000000 0.000000 C 8.457804 0.000000 0.000000 C 33.831216 0.000000 0.000000 C 2.819268 0.000000 0.000000 C 28.192680 0.000000 0.000000 C 12.686706 0.000000 0.000000 C 16.915608 0.000000 0.000000 C 0.000000 0.000000 0.000000 C 15.505974 0.000000 0.000000 C 32.421582 0.000000 0.000000 C 40.879386 0.000000 0.000000 C 19.734876 0.000000 0.000000 C 21.144510 0.000000 0.000000 Ni 26.042891 0.488311 3.283000 Ni 27.523201 0.488311 3.283000 Ni 0.873321 0.615443 3.283000 Ni 40.006065 0.615443 3.283000 Ni 7.752987 1.122941 3.283000 C 19.030059 1.220779 0.000000 C 9.162621 1.220779 0.000000 C 31.716765 1.220779 0.000000 C 30.307131 1.220779 0.000000 C 38.764935 1.220779 0.000000 C 2.114451 1.220779 0.000000 C 13.391523 1.220779 0.000000 C 35.945667 1.220779 0.000000 C 14.801157 1.220779 0.000000 C 40.174569 1.220779 0.000000 C 27.487863 1.220779 0.000000 C 26.078229 1.220779 0.000000 C 21.849327 1.220779 0.000000 C 4.933719 1.220779 0.000000 C 10.572255 1.220779 0.000000 C 17.620425 1.220779 0.000000 C 0.704817 1.220779 0.000000 C 34.536033 1.220779 0.000000 C 6.343353 1.220779 0.000000 C 23.258961 1.220779 0.000000 Ni 0.035338 1.709090 3.283000 Ni 40.844048 1.709090 3.283000 Ni 6.498915 1.709755 3.283000 Ni 9.007059 1.709755 3.283000 Ni 27.922480 1.823919 3.283000 Ni 25.643612 1.823919 3.283000 C 32.421582 2.441558 0.000000 C 23.963778 2.441558 0.000000 C 33.831216 2.441558 0.000000 C 15.505974 2.441558 0.000000 C 28.192680 2.441558 0.000000 C 25.373412 2.441558 0.000000 C 36.650484 2.441558 0.000000 C 21.144510 2.441558 0.000000 C 8.457804 2.441558 0.000000 C 7.048170 2.441558 0.000000 C 38.060118 2.441558 0.000000 C 12.686706 2.441558 0.000000 C 11.277072 2.441558 0.000000 C 29.602314 2.441558 0.000000 C 2.819268 2.441558 0.000000 C 16.915608 2.441558 0.000000 C 4.228902 2.441558 0.000000 C 0.000000 2.441558 0.000000 C 19.734876 2.441558 0.000000 C 40.879386 2.441558 0.000000 Ni 26.783046 2.625126 3.283000 Ni 40.444769 3.044698 3.283000 Ni 0.434617 3.044698 3.283000 Ni 6.174849 3.057000 3.283000 Ni 9.331125 3.057000 3.283000 C 35.945667 3.662337 0.000000 C 13.391523 3.662337 0.000000 C 31.716765 3.662337 0.000000 C 27.487863 3.662337 0.000000 C 40.174569 3.662337 0.000000 C 6.343353 3.662337 0.000000 C 26.078229 3.662337 0.000000 C 4.933719 3.662337 0.000000 C 30.307131 3.662337 0.000000 C 21.849327 3.662337 0.000000 C 0.704817 3.662337 0.000000 C 2.114451 3.662337 0.000000 C 10.572255 3.662337 0.000000 C 34.536033 3.662337 0.000000 C 9.162621 3.662337 0.000000 C 14.801157 3.662337 0.000000 C 17.620425 3.662337 0.000000 C 38.764935 3.662337 0.000000 C 23.258961 3.662337 0.000000 C 19.030059 3.662337 0.000000 Ni 41.584203 3.845905 3.283000 Ni 7.012832 4.150647 3.283000 Ni 8.493142 4.150647 3.283000 C 36.650484 4.883115 0.000000 C 40.879386 4.883115 0.000000 C 23.963778 4.883115 0.000000 C 38.060118 4.883115 0.000000 C 12.686706 4.883115 0.000000 C 19.734876 4.883115 0.000000 C 21.144510 4.883115 0.000000 C 8.457804 4.883115 0.000000 C 29.602314 4.883115 0.000000 C 15.505974 4.883115 0.000000 C 33.831216 4.883115 0.000000 C 32.421582 4.883115 0.000000 C 25.373412 4.883115 0.000000 C 7.048170 4.883115 0.000000 C 2.819268 4.883115 0.000000 C 28.192680 4.883115 0.000000 C 0.000000 4.883115 0.000000 C 16.915608 4.883115 0.000000 C 11.277072 4.883115 0.000000 C 4.228902 4.883115 0.000000 Ni 8.892421 5.486255 3.283000 Ni 6.613553 5.486255 3.283000 C 38.764935 6.103894 0.000000 C 10.572255 6.103894 0.000000 C 35.945667 6.103894 0.000000 C 31.716765 6.103894 0.000000 C 26.078229 6.103894 0.000000 C 2.114451 6.103894 0.000000 C 14.801157 6.103894 0.000000 C 9.162621 6.103894 0.000000 C 0.704817 6.103894 0.000000 C 40.174569 6.103894 0.000000 C 30.307131 6.103894 0.000000 C 34.536033 6.103894 0.000000 C 17.620425 6.103894 0.000000 C 21.849327 6.103894 0.000000 C 27.487863 6.103894 0.000000 C 19.030059 6.103894 0.000000 C 6.343353 6.103894 0.000000 C 4.933719 6.103894 0.000000 C 13.391523 6.103894 0.000000 C 23.258961 6.103894 0.000000 Ni 7.752987 6.287462 3.283000 Ni 31.011948 7.141105 3.283000 C 28.192680 7.324673 0.000000 C 23.963778 7.324673 0.000000 C 29.602314 7.324673 0.000000 C 0.000000 7.324673 0.000000 C 11.277072 7.324673 0.000000 C 7.048170 7.324673 0.000000 C 15.505974 7.324673 0.000000 C 4.228902 7.324673 0.000000 C 36.650484 7.324673 0.000000 C 2.819268 7.324673 0.000000 C 40.879386 7.324673 0.000000 C 38.060118 7.324673 0.000000 C 33.831216 7.324673 0.000000 C 25.373412 7.324673 0.000000 C 21.144510 7.324673 0.000000 C 19.734876 7.324673 0.000000 C 16.915608 7.324673 0.000000 C 32.421582 7.324673 0.000000 C 12.686706 7.324673 0.000000 C 8.457804 7.324673 0.000000 Ni 29.872514 7.942312 3.283000 Ni 32.151382 7.942312 3.283000 C 6.343353 8.545452 0.000000 C 23.258961 8.545452 0.000000 C 2.114451 8.545452 0.000000 C 30.307131 8.545452 0.000000 C 38.764935 8.545452 0.000000 C 17.620425 8.545452 0.000000 C 19.030059 8.545452 0.000000 C 27.487863 8.545452 0.000000 C 13.391523 8.545452 0.000000 C 9.162621 8.545452 0.000000 C 14.801157 8.545452 0.000000 C 0.704817 8.545452 0.000000 C 40.174569 8.545452 0.000000 C 35.945667 8.545452 0.000000 C 4.933719 8.545452 0.000000 C 31.716765 8.545452 0.000000 C 21.849327 8.545452 0.000000 C 34.536033 8.545452 0.000000 C 10.572255 8.545452 0.000000 C 26.078229 8.545452 0.000000 Ni 31.752103 9.277920 3.283000 Ni 30.271793 9.277920 3.283000 Ni 9.867438 9.668393 3.283000 C 40.879386 9.766231 0.000000 C 12.686706 9.766231 0.000000 C 2.819268 9.766231 0.000000 C 28.192680 9.766231 0.000000 C 15.505974 9.766231 0.000000 C 8.457804 9.766231 0.000000 C 19.734876 9.766231 0.000000 C 7.048170 9.766231 0.000000 C 0.000000 9.766231 0.000000 C 29.602314 9.766231 0.000000 C 25.373412 9.766231 0.000000 C 21.144510 9.766231 0.000000 C 11.277072 9.766231 0.000000 C 38.060118 9.766231 0.000000 C 32.421582 9.766231 0.000000 C 16.915608 9.766231 0.000000 C 4.228902 9.766231 0.000000 C 36.650484 9.766231 0.000000 C 33.831216 9.766231 0.000000 C 23.963778 9.766231 0.000000 Ni 11.121510 10.255207 3.283000 Ni 8.613366 10.255207 3.283000 Ni 32.590086 10.371567 3.283000 Ni 29.433810 10.371567 3.283000 C 34.536033 10.987010 0.000000 C 21.849327 10.987010 0.000000 C 27.487863 10.987010 0.000000 C 17.620425 10.987010 0.000000 C 30.307131 10.987010 0.000000 C 35.945667 10.987010 0.000000 C 31.716765 10.987010 0.000000 C 38.764935 10.987010 0.000000 C 40.174569 10.987010 0.000000 C 10.572255 10.987010 0.000000 C 19.030059 10.987010 0.000000 C 23.258961 10.987010 0.000000 C 4.933719 10.987010 0.000000 C 6.343353 10.987010 0.000000 C 14.801157 10.987010 0.000000 C 9.162621 10.987010 0.000000 C 13.391523 10.987010 0.000000 C 26.078229 10.987010 0.000000 C 0.704817 10.987010 0.000000 C 2.114451 10.987010 0.000000 Ni 11.445576 11.602452 3.283000 Ni 8.289300 11.602452 3.283000 Ni 29.757876 11.718812 3.283000 Ni 32.266020 11.718812 3.283000 C 40.879386 12.207789 0.000000 C 33.831216 12.207789 0.000000 C 25.373412 12.207789 0.000000 C 12.686706 12.207789 0.000000 C 15.505974 12.207789 0.000000 C 11.277072 12.207789 0.000000 C 28.192680 12.207789 0.000000 C 36.650484 12.207789 0.000000 C 21.144510 12.207789 0.000000 C 16.915608 12.207789 0.000000 C 19.734876 12.207789 0.000000 C 0.000000 12.207789 0.000000 C 8.457804 12.207789 0.000000 C 4.228902 12.207789 0.000000 C 32.421582 12.207789 0.000000 C 38.060118 12.207789 0.000000 C 7.048170 12.207789 0.000000 C 29.602314 12.207789 0.000000 C 2.819268 12.207789 0.000000 C 23.963778 12.207789 0.000000 Ni 31.011948 12.305626 3.283000 Ni 10.607593 12.696099 3.283000 Ni 9.127283 12.696099 3.283000 Ni 37.355301 13.244999 3.283000 C 40.174569 13.428567 0.000000 C 38.764935 13.428567 0.000000 C 6.343353 13.428567 0.000000 C 34.536033 13.428567 0.000000 C 27.487863 13.428567 0.000000 C 26.078229 13.428567 0.000000 C 23.258961 13.428567 0.000000 C 14.801157 13.428567 0.000000 C 19.030059 13.428567 0.000000 C 10.572255 13.428567 0.000000 C 17.620425 13.428567 0.000000 C 35.945667 13.428567 0.000000 C 30.307131 13.428567 0.000000 C 31.716765 13.428567 0.000000 C 13.391523 13.428567 0.000000 C 21.849327 13.428567 0.000000 C 4.933719 13.428567 0.000000 C 9.162621 13.428567 0.000000 C 2.114451 13.428567 0.000000 C 0.704817 13.428567 0.000000 Ni 8.728004 14.031707 3.283000 Ni 11.006872 14.031707 3.283000 Ni 36.215867 14.046206 3.283000 Ni 38.494735 14.046206 3.283000 Ni 22.554144 14.465778 3.283000 C 12.686706 14.649346 0.000000 C 11.277072 14.649346 0.000000 C 8.457804 14.649346 0.000000 C 7.048170 14.649346 0.000000 C 4.228902 14.649346 0.000000 C 2.819268 14.649346 0.000000 C 0.000000 14.649346 0.000000 C 40.879386 14.649346 0.000000 C 38.060118 14.649346 0.000000 C 36.650484 14.649346 0.000000 C 33.831216 14.649346 0.000000 C 32.421582 14.649346 0.000000 C 29.602314 14.649346 0.000000 C 28.192680 14.649346 0.000000 C 25.373412 14.649346 0.000000 C 23.963778 14.649346 0.000000 C 21.144510 14.649346 0.000000 C 19.734876 14.649346 0.000000 C 16.915608 14.649346 0.000000 C 15.505974 14.649346 0.000000 Ni 9.867438 14.832914 3.283000 Ni 21.414710 15.266985 3.283000 Ni 23.693578 15.266985 3.283000 Ni 38.095456 15.381814 3.283000 Ni 36.615146 15.381814 3.283000 C 14.801157 15.870125 0.000000 C 13.391523 15.870125 0.000000 C 10.572255 15.870125 0.000000 C 9.162621 15.870125 0.000000 C 6.343353 15.870125 0.000000 C 4.933719 15.870125 0.000000 C 2.114451 15.870125 0.000000 C 0.704817 15.870125 0.000000 C 40.174569 15.870125 0.000000 C 38.764935 15.870125 0.000000 C 35.945667 15.870125 0.000000 C 34.536033 15.870125 0.000000 C 31.716765 15.870125 0.000000 C 30.307131 15.870125 0.000000 C 27.487863 15.870125 0.000000 C 26.078229 15.870125 0.000000 C 23.258961 15.870125 0.000000 C 21.849327 15.870125 0.000000 C 19.030059 15.870125 0.000000 C 17.620425 15.870125 0.000000 Ni 38.933439 16.475461 3.283000 Ni 35.777163 16.475461 3.283000 Ni 23.294299 16.602593 3.283000 Ni 21.813989 16.602593 3.283000 C 40.879386 17.090904 0.000000 C 38.060118 17.090904 0.000000 C 36.650484 17.090904 0.000000 C 33.831216 17.090904 0.000000 C 32.421582 17.090904 0.000000 C 29.602314 17.090904 0.000000 C 28.192680 17.090904 0.000000 C 25.373412 17.090904 0.000000 C 23.963778 17.090904 0.000000 C 21.144510 17.090904 0.000000 C 19.734876 17.090904 0.000000 C 16.915608 17.090904 0.000000 C 15.505974 17.090904 0.000000 C 12.686706 17.090904 0.000000 C 11.277072 17.090904 0.000000 C 8.457804 17.090904 0.000000 C 7.048170 17.090904 0.000000 C 4.228902 17.090904 0.000000 C 2.819268 17.090904 0.000000 C 0.000000 17.090904 0.000000 Ni 20.976006 17.696240 3.283000 Ni 24.132282 17.696240 3.283000 Ni 38.609373 17.822706 3.283000 Ni 36.101229 17.822706 3.283000 Ni 3.524085 18.213845 3.283000 C 40.174569 18.311683 0.000000 C 38.764935 18.311683 0.000000 C 35.945667 18.311683 0.000000 C 34.536033 18.311683 0.000000 C 31.716765 18.311683 0.000000 C 30.307131 18.311683 0.000000 C 27.487863 18.311683 0.000000 C 26.078229 18.311683 0.000000 C 23.258961 18.311683 0.000000 C 21.849327 18.311683 0.000000 C 19.030059 18.311683 0.000000 C 17.620425 18.311683 0.000000 C 14.801157 18.311683 0.000000 C 13.391523 18.311683 0.000000 C 10.572255 18.311683 0.000000 C 9.162621 18.311683 0.000000 C 6.343353 18.311683 0.000000 C 4.933719 18.311683 0.000000 C 2.114451 18.311683 0.000000 C 0.704817 18.311683 0.000000 Ni 37.355301 18.409520 3.283000 Ni 4.778157 18.800659 3.283000 Ni 2.270013 18.800659 3.283000 Ni 23.808216 19.043485 3.283000 Ni 21.300072 19.043485 3.283000 C 40.879386 19.532462 0.000000 C 38.060118 19.532462 0.000000 C 36.650484 19.532462 0.000000 C 33.831216 19.532462 0.000000 C 32.421582 19.532462 0.000000 C 29.602314 19.532462 0.000000 C 28.192680 19.532462 0.000000 C 25.373412 19.532462 0.000000 C 23.963778 19.532462 0.000000 C 21.144510 19.532462 0.000000 C 19.734876 19.532462 0.000000 C 16.915608 19.532462 0.000000 C 15.505974 19.532462 0.000000 C 12.686706 19.532462 0.000000 C 11.277072 19.532462 0.000000 C 8.457804 19.532462 0.000000 C 7.048170 19.532462 0.000000 C 4.228902 19.532462 0.000000 C 2.819268 19.532462 0.000000 C 0.000000 19.532462 0.000000 Ni 22.554144 19.630299 3.283000 Ni 5.102223 20.147904 3.283000 Ni 1.945947 20.147904 3.283000 Ni 11.981889 20.569672 3.283000 C 40.174569 20.753241 0.000000 C 38.764935 20.753241 0.000000 C 35.945667 20.753241 0.000000 C 34.536033 20.753241 0.000000 C 31.716765 20.753241 0.000000 C 30.307131 20.753241 0.000000 C 27.487863 20.753241 0.000000 C 26.078229 20.753241 0.000000 C 23.258961 20.753241 0.000000 C 21.849327 20.753241 0.000000 C 19.030059 20.753241 0.000000 C 17.620425 20.753241 0.000000 C 14.801157 20.753241 0.000000 C 13.391523 20.753241 0.000000 C 10.572255 20.753241 0.000000 C 9.162621 20.753241 0.000000 C 6.343353 20.753241 0.000000 C 4.933719 20.753241 0.000000 C 2.114451 20.753241 0.000000 C 0.704817 20.753241 0.000000 Ni 4.264240 21.241551 3.283000 Ni 2.783930 21.241551 3.283000 Ni 13.121323 21.370879 3.283000 Ni 10.842455 21.370879 3.283000 C 40.879386 21.974019 0.000000 C 38.060118 21.974019 0.000000 C 36.650484 21.974019 0.000000 C 33.831216 21.974019 0.000000 C 32.421582 21.974019 0.000000 C 29.602314 21.974019 0.000000 C 28.192680 21.974019 0.000000 C 25.373412 21.974019 0.000000 C 23.963778 21.974019 0.000000 C 21.144510 21.974019 0.000000 C 19.734876 21.974019 0.000000 C 16.915608 21.974019 0.000000 C 15.505974 21.974019 0.000000 C 12.686706 21.974019 0.000000 C 11.277072 21.974019 0.000000 C 8.457804 21.974019 0.000000 C 7.048170 21.974019 0.000000 C 4.228902 21.974019 0.000000 C 2.819268 21.974019 0.000000 C 0.000000 21.974019 0.000000 Ni 2.384651 22.577159 3.283000 Ni 4.663519 22.577159 3.283000 Ni 12.722044 22.706487 3.283000 Ni 11.241734 22.706487 3.283000 C 40.174569 23.194798 0.000000 C 38.764935 23.194798 0.000000 C 35.945667 23.194798 0.000000 C 34.536033 23.194798 0.000000 C 31.716765 23.194798 0.000000 C 30.307131 23.194798 0.000000 C 27.487863 23.194798 0.000000 C 26.078229 23.194798 0.000000 C 23.258961 23.194798 0.000000 C 21.849327 23.194798 0.000000 C 19.030059 23.194798 0.000000 C 17.620425 23.194798 0.000000 C 14.801157 23.194798 0.000000 C 13.391523 23.194798 0.000000 C 10.572255 23.194798 0.000000 C 9.162621 23.194798 0.000000 C 6.343353 23.194798 0.000000 C 4.933719 23.194798 0.000000 C 2.114451 23.194798 0.000000 C 0.704817 23.194798 0.000000 Ni 3.524085 23.378366 3.283000 Ni 13.560027 23.800134 3.283000 Ni 10.403751 23.800134 3.283000 C 0.000000 24.415577 0.000000 C 33.831216 24.415577 0.000000 C 32.421582 24.415577 0.000000 C 29.602314 24.415577 0.000000 C 28.192680 24.415577 0.000000 C 25.373412 24.415577 0.000000 C 23.963778 24.415577 0.000000 C 21.144510 24.415577 0.000000 C 19.734876 24.415577 0.000000 C 16.915608 24.415577 0.000000 C 15.505974 24.415577 0.000000 C 12.686706 24.415577 0.000000 C 11.277072 24.415577 0.000000 C 8.457804 24.415577 0.000000 C 7.048170 24.415577 0.000000 C 4.228902 24.415577 0.000000 C 2.819268 24.415577 0.000000 C 38.060118 24.415577 0.000000 C 40.879386 24.415577 0.000000 C 36.650484 24.415577 0.000000 Ni 10.727817 25.147379 3.283000 Ni 13.235961 25.147379 3.283000 C 38.764935 25.636356 0.000000 C 40.174569 25.636356 0.000000 C 0.704817 25.636356 0.000000 C 35.945667 25.636356 0.000000 C 34.536033 25.636356 0.000000 C 31.716765 25.636356 0.000000 C 30.307131 25.636356 0.000000 C 27.487863 25.636356 0.000000 C 26.078229 25.636356 0.000000 C 23.258961 25.636356 0.000000 C 21.849327 25.636356 0.000000 C 19.030059 25.636356 0.000000 C 17.620425 25.636356 0.000000 C 14.801157 25.636356 0.000000 C 13.391523 25.636356 0.000000 C 10.572255 25.636356 0.000000 C 9.162621 25.636356 0.000000 C 6.343353 25.636356 0.000000 C 4.933719 25.636356 0.000000 C 2.114451 25.636356 0.000000 Ni 11.981889 25.734193 3.283000 Ni 31.011948 26.759297 3.283000 C 40.879386 26.857135 0.000000 C 38.060118 26.857135 0.000000 C 36.650484 26.857135 0.000000 C 29.602314 26.857135 0.000000 C 28.192680 26.857135 0.000000 C 25.373412 26.857135 0.000000 C 23.963778 26.857135 0.000000 C 21.144510 26.857135 0.000000 C 19.734876 26.857135 0.000000 C 12.686706 26.857135 0.000000 C 11.277072 26.857135 0.000000 C 8.457804 26.857135 0.000000 C 7.048170 26.857135 0.000000 C 4.228902 26.857135 0.000000 C 2.819268 26.857135 0.000000 C 15.505974 26.857135 0.000000 C 16.915608 26.857135 0.000000 C 33.831216 26.857135 0.000000 C 32.421582 26.857135 0.000000 C 0.000000 26.857135 0.000000 Ni 32.266020 27.346111 3.283000 Ni 29.757876 27.346111 3.283000 C 40.174569 28.077914 0.000000 C 38.764935 28.077914 0.000000 C 35.945667 28.077914 0.000000 C 34.536033 28.077914 0.000000 C 31.716765 28.077914 0.000000 C 30.307131 28.077914 0.000000 C 27.487863 28.077914 0.000000 C 26.078229 28.077914 0.000000 C 23.258961 28.077914 0.000000 C 21.849327 28.077914 0.000000 C 19.030059 28.077914 0.000000 C 14.801157 28.077914 0.000000 C 13.391523 28.077914 0.000000 C 10.572255 28.077914 0.000000 C 9.162621 28.077914 0.000000 C 6.343353 28.077914 0.000000 C 4.933719 28.077914 0.000000 C 2.114451 28.077914 0.000000 C 0.704817 28.077914 0.000000 C 17.620425 28.077914 0.000000 Ni 29.433810 28.693356 3.283000 Ni 32.590086 28.693356 3.283000 C 29.602314 29.298692 0.000000 C 28.192680 29.298692 0.000000 C 25.373412 29.298692 0.000000 C 23.963778 29.298692 0.000000 C 21.144510 29.298692 0.000000 C 19.734876 29.298692 0.000000 C 16.915608 29.298692 0.000000 C 15.505974 29.298692 0.000000 C 12.686706 29.298692 0.000000 C 11.277072 29.298692 0.000000 C 8.457804 29.298692 0.000000 C 7.048170 29.298692 0.000000 C 4.228902 29.298692 0.000000 C 2.819268 29.298692 0.000000 C 0.000000 29.298692 0.000000 C 40.879386 29.298692 0.000000 C 38.060118 29.298692 0.000000 C 36.650484 29.298692 0.000000 C 33.831216 29.298692 0.000000 C 32.421582 29.298692 0.000000 Ni 30.271793 29.787003 3.283000 Ni 31.752103 29.787003 3.283000 C 31.716765 30.519471 0.000000 C 30.307131 30.519471 0.000000 C 27.487863 30.519471 0.000000 C 26.078229 30.519471 0.000000 C 23.258961 30.519471 0.000000 C 21.849327 30.519471 0.000000 C 19.030059 30.519471 0.000000 C 17.620425 30.519471 0.000000 C 14.801157 30.519471 0.000000 C 13.391523 30.519471 0.000000 C 10.572255 30.519471 0.000000 C 9.162621 30.519471 0.000000 C 6.343353 30.519471 0.000000 C 4.933719 30.519471 0.000000 C 2.114451 30.519471 0.000000 C 0.704817 30.519471 0.000000 C 40.174569 30.519471 0.000000 C 38.764935 30.519471 0.000000 C 35.945667 30.519471 0.000000 C 34.536033 30.519471 0.000000 Ni 29.872514 31.122611 3.283000 Ni 32.151382 31.122611 3.283000 C 40.879386 31.740250 0.000000 C 38.060118 31.740250 0.000000 C 36.650484 31.740250 0.000000 C 33.831216 31.740250 0.000000 C 32.421582 31.740250 0.000000 C 29.602314 31.740250 0.000000 C 28.192680 31.740250 0.000000 C 25.373412 31.740250 0.000000 C 23.963778 31.740250 0.000000 C 21.144510 31.740250 0.000000 C 19.734876 31.740250 0.000000 C 16.915608 31.740250 0.000000 C 15.505974 31.740250 0.000000 C 12.686706 31.740250 0.000000 C 11.277072 31.740250 0.000000 C 8.457804 31.740250 0.000000 C 7.048170 31.740250 0.000000 C 4.228902 31.740250 0.000000 C 2.819268 31.740250 0.000000 C 0.000000 31.740250 0.000000 Ni 31.011948 31.923818 3.283000 Ni 7.752987 32.863192 3.283000 Ni 20.439693 32.863192 3.283000 C 40.174569 32.961029 0.000000 C 38.764935 32.961029 0.000000 C 35.945667 32.961029 0.000000 C 34.536033 32.961029 0.000000 C 31.716765 32.961029 0.000000 C 30.307131 32.961029 0.000000 C 27.487863 32.961029 0.000000 C 26.078229 32.961029 0.000000 C 23.258961 32.961029 0.000000 C 21.849327 32.961029 0.000000 C 19.030059 32.961029 0.000000 C 17.620425 32.961029 0.000000 C 14.801157 32.961029 0.000000 C 13.391523 32.961029 0.000000 C 10.572255 32.961029 0.000000 C 9.162621 32.961029 0.000000 C 6.343353 32.961029 0.000000 C 4.933719 32.961029 0.000000 C 2.114451 32.961029 0.000000 C 0.704817 32.961029 0.000000 Ni 9.007059 33.450006 3.283000 Ni 19.185621 33.450006 3.283000 Ni 21.693765 33.450006 3.283000 Ni 6.498915 33.450006 3.283000 C 40.879386 34.181808 0.000000 C 38.060118 34.181808 0.000000 C 36.650484 34.181808 0.000000 C 33.831216 34.181808 0.000000 C 32.421582 34.181808 0.000000 C 29.602314 34.181808 0.000000 C 28.192680 34.181808 0.000000 C 25.373412 34.181808 0.000000 C 23.963778 34.181808 0.000000 C 21.144510 34.181808 0.000000 C 19.734876 34.181808 0.000000 C 16.915608 34.181808 0.000000 C 15.505974 34.181808 0.000000 C 12.686706 34.181808 0.000000 C 11.277072 34.181808 0.000000 C 8.457804 34.181808 0.000000 C 7.048170 34.181808 0.000000 C 4.228902 34.181808 0.000000 C 2.819268 34.181808 0.000000 C 0.000000 34.181808 0.000000 Ni 6.174849 34.797251 3.283000 Ni 9.331125 34.797251 3.283000 Ni 22.017831 34.797251 3.283000 Ni 18.861555 34.797251 3.283000 C 40.174569 35.402587 0.000000 C 38.764935 35.402587 0.000000 C 35.945667 35.402587 0.000000 C 34.536033 35.402587 0.000000 C 31.716765 35.402587 0.000000 C 30.307131 35.402587 0.000000 C 27.487863 35.402587 0.000000 C 26.078229 35.402587 0.000000 C 23.258961 35.402587 0.000000 C 21.849327 35.402587 0.000000 C 19.030059 35.402587 0.000000 C 17.620425 35.402587 0.000000 C 14.801157 35.402587 0.000000 C 13.391523 35.402587 0.000000 C 10.572255 35.402587 0.000000 C 9.162621 35.402587 0.000000 C 6.343353 35.402587 0.000000 C 4.933719 35.402587 0.000000 C 2.114451 35.402587 0.000000 C 0.704817 35.402587 0.000000 Ni 7.012832 35.890898 3.283000 Ni 8.493142 35.890898 3.283000 Ni 19.699538 35.890898 3.283000 Ni 21.179848 35.890898 3.283000 C 40.879386 36.623366 0.000000 C 38.060118 36.623366 0.000000 C 36.650484 36.623366 0.000000 C 33.831216 36.623366 0.000000 C 32.421582 36.623366 0.000000 C 29.602314 36.623366 0.000000 C 28.192680 36.623366 0.000000 C 25.373412 36.623366 0.000000 C 23.963778 36.623366 0.000000 C 21.144510 36.623366 0.000000 C 19.734876 36.623366 0.000000 C 16.915608 36.623366 0.000000 C 15.505974 36.623366 0.000000 C 12.686706 36.623366 0.000000 C 11.277072 36.623366 0.000000 C 8.457804 36.623366 0.000000 C 7.048170 36.623366 0.000000 C 4.228902 36.623366 0.000000 C 2.819268 36.623366 0.000000 C 0.000000 36.623366 0.000000 Ni 6.613553 37.226506 3.283000 Ni 8.892421 37.226506 3.283000 Ni 19.300259 37.226506 3.283000 Ni 21.579127 37.226506 3.283000 Ni 41.584203 37.746307 3.283000 C 40.174569 37.844144 0.000000 C 38.764935 37.844144 0.000000 C 35.945667 37.844144 0.000000 C 34.536033 37.844144 0.000000 C 31.716765 37.844144 0.000000 C 30.307131 37.844144 0.000000 C 27.487863 37.844144 0.000000 C 26.078229 37.844144 0.000000 C 23.258961 37.844144 0.000000 C 21.849327 37.844144 0.000000 C 19.030059 37.844144 0.000000 C 17.620425 37.844144 0.000000 C 14.801157 37.844144 0.000000 C 13.391523 37.844144 0.000000 C 10.572255 37.844144 0.000000 C 9.162621 37.844144 0.000000 C 6.343353 37.844144 0.000000 C 4.933719 37.844144 0.000000 C 2.114451 37.844144 0.000000 C 0.704817 37.844144 0.000000 Ni 7.752987 38.027713 3.283000 Ni 20.439693 38.027713 3.283000 Ni 40.330131 38.333121 3.283000 Ni 0.549255 38.333121 3.283000 C 40.879386 39.064923 0.000000 C 38.060118 39.064923 0.000000 C 36.650484 39.064923 0.000000 C 33.831216 39.064923 0.000000 C 32.421582 39.064923 0.000000 C 29.602314 39.064923 0.000000 C 28.192680 39.064923 0.000000 C 25.373412 39.064923 0.000000 C 23.963778 39.064923 0.000000 C 21.144510 39.064923 0.000000 C 19.734876 39.064923 0.000000 C 16.915608 39.064923 0.000000 C 15.505974 39.064923 0.000000 C 12.686706 39.064923 0.000000 C 11.277072 39.064923 0.000000 C 8.457804 39.064923 0.000000 C 7.048170 39.064923 0.000000 C 4.228902 39.064923 0.000000 C 2.819268 39.064923 0.000000 C 0.000000 39.064923 0.000000 Ni 0.873321 39.680366 3.283000 Ni 40.006065 39.680366 3.283000 Ni 33.126399 40.187865 3.283000 C 40.174569 40.285702 0.000000 C 38.764935 40.285702 0.000000 C 35.945667 40.285702 0.000000 C 34.536033 40.285702 0.000000 C 31.716765 40.285702 0.000000 C 30.307131 40.285702 0.000000 C 27.487863 40.285702 0.000000 C 26.078229 40.285702 0.000000 C 23.258961 40.285702 0.000000 C 21.849327 40.285702 0.000000 C 19.030059 40.285702 0.000000 C 17.620425 40.285702 0.000000 C 14.801157 40.285702 0.000000 C 13.391523 40.285702 0.000000 C 10.572255 40.285702 0.000000 C 9.162621 40.285702 0.000000 C 6.343353 40.285702 0.000000 C 4.933719 40.285702 0.000000 C 2.114451 40.285702 0.000000 C 0.704817 40.285702 0.000000 Ni 40.844048 40.774013 3.283000 Ni 0.035338 40.774013 3.283000 Ni 31.872327 40.774679 3.283000 Ni 34.380471 40.774679 3.283000 Ni 9.867438 41.408644 3.283000 C 40.879386 41.506481 0.000000 C 38.060118 41.506481 0.000000 C 36.650484 41.506481 0.000000 C 33.831216 41.506481 0.000000 C 32.421582 41.506481 0.000000 C 29.602314 41.506481 0.000000 C 28.192680 41.506481 0.000000 C 25.373412 41.506481 0.000000 C 23.963778 41.506481 0.000000 C 21.144510 41.506481 0.000000 C 19.734876 41.506481 0.000000 C 16.915608 41.506481 0.000000 C 15.505974 41.506481 0.000000 C 12.686706 41.506481 0.000000 C 11.277072 41.506481 0.000000 C 8.457804 41.506481 0.000000 C 7.048170 41.506481 0.000000 C 4.228902 41.506481 0.000000 C 2.819268 41.506481 0.000000 C 0.000000 41.506481 0.000000 Ni 8.613366 41.995458 3.283000 Ni 11.121510 41.995458 3.283000 Ni 40.444769 42.109621 3.283000 Ni 0.434617 42.109621 3.283000 Ni 31.548261 42.121924 3.283000 Ni 34.704537 42.121924 3.283000 C 40.174569 42.727260 0.000000 C 38.764935 42.727260 0.000000 C 35.945667 42.727260 0.000000 C 34.536033 42.727260 0.000000 C 31.716765 42.727260 0.000000 C 30.307131 42.727260 0.000000 C 27.487863 42.727260 0.000000 C 26.078229 42.727260 0.000000 C 23.258961 42.727260 0.000000 C 21.849327 42.727260 0.000000 C 19.030059 42.727260 0.000000 C 17.620425 42.727260 0.000000 C 14.801157 42.727260 0.000000 C 13.391523 42.727260 0.000000 C 10.572255 42.727260 0.000000 C 9.162621 42.727260 0.000000 C 6.343353 42.727260 0.000000 C 4.933719 42.727260 0.000000 C 2.114451 42.727260 0.000000 C 0.704817 42.727260 0.000000 Ni 41.584203 42.910828 3.283000 Ni 32.386244 43.215571 3.283000 Ni 33.866554 43.215571 3.283000 Ni 8.289300 43.342703 3.283000 Ni 11.445576 43.342703 3.283000 C 40.879386 43.948039 0.000000 C 38.060118 43.948039 0.000000 C 36.650484 43.948039 0.000000 C 33.831216 43.948039 0.000000 C 32.421582 43.948039 0.000000 C 29.602314 43.948039 0.000000 C 28.192680 43.948039 0.000000 C 25.373412 43.948039 0.000000 C 23.963778 43.948039 0.000000 C 21.144510 43.948039 0.000000 C 19.734876 43.948039 0.000000 C 16.915608 43.948039 0.000000 C 15.505974 43.948039 0.000000 C 12.686706 43.948039 0.000000 C 11.277072 43.948039 0.000000 C 8.457804 43.948039 0.000000 C 7.048170 43.948039 0.000000 C 4.228902 43.948039 0.000000 C 2.819268 43.948039 0.000000 C 0.000000 43.948039 0.000000 Ni 9.127283 44.436350 3.283000 Ni 10.607593 44.436350 3.283000 Ni 31.986965 44.551179 3.283000 Ni 34.265833 44.551179 3.283000 C 40.174569 45.168818 0.000000 C 38.764935 45.168818 0.000000 C 35.945667 45.168818 0.000000 C 34.536033 45.168818 0.000000 C 31.716765 45.168818 0.000000 C 30.307131 45.168818 0.000000 C 27.487863 45.168818 0.000000 C 26.078229 45.168818 0.000000 C 23.258961 45.168818 0.000000 C 21.849327 45.168818 0.000000 C 19.030059 45.168818 0.000000 C 17.620425 45.168818 0.000000 C 14.801157 45.168818 0.000000 C 13.391523 45.168818 0.000000 C 10.572255 45.168818 0.000000 C 9.162621 45.168818 0.000000 C 6.343353 45.168818 0.000000 C 4.933719 45.168818 0.000000 C 2.114451 45.168818 0.000000 C 0.704817 45.168818 0.000000 Ni 33.126399 45.352386 3.283000 Ni 8.728004 45.771958 3.283000 Ni 11.006872 45.771958 3.283000 Ni 26.783046 46.291759 3.283000 C 40.879386 46.389596 0.000000 C 38.060118 46.389596 0.000000 C 36.650484 46.389596 0.000000 C 33.831216 46.389596 0.000000 C 32.421582 46.389596 0.000000 C 29.602314 46.389596 0.000000 C 28.192680 46.389596 0.000000 C 25.373412 46.389596 0.000000 C 23.963778 46.389596 0.000000 C 21.144510 46.389596 0.000000 C 19.734876 46.389596 0.000000 C 16.915608 46.389596 0.000000 C 15.505974 46.389596 0.000000 C 12.686706 46.389596 0.000000 C 11.277072 46.389596 0.000000 C 8.457804 46.389596 0.000000 C 7.048170 46.389596 0.000000 C 4.228902 46.389596 0.000000 C 2.819268 46.389596 0.000000 C 0.000000 46.389596 0.000000 Ni 9.867438 46.573165 3.283000 Ni 25.528974 46.878573 3.283000 Ni 28.037118 46.878573 3.283000 Ni 41.584203 47.512538 3.283000 C 40.174569 47.610375 0.000000 C 38.764935 47.610375 0.000000 C 35.945667 47.610375 0.000000 C 34.536033 47.610375 0.000000 C 31.716765 47.610375 0.000000 C 30.307131 47.610375 0.000000 C 27.487863 47.610375 0.000000 C 26.078229 47.610375 0.000000 C 23.258961 47.610375 0.000000 C 21.849327 47.610375 0.000000 C 19.030059 47.610375 0.000000 C 17.620425 47.610375 0.000000 C 14.801157 47.610375 0.000000 C 13.391523 47.610375 0.000000 C 10.572255 47.610375 0.000000 C 9.162621 47.610375 0.000000 C 6.343353 47.610375 0.000000 C 4.933719 47.610375 0.000000 C 2.114451 47.610375 0.000000 C 0.704817 47.610375 0.000000 Ni 40.330131 48.099352 3.283000 Ni 0.549255 48.099352 3.283000 Ni 25.204908 48.225818 3.283000 Ni 28.361184 48.225818 3.283000 v_sim-3.7.0/examples/demo_spin.d30000644000353400050620000001676412215546210013620 00000000000000Positions atomiques 3D. 5 5Co 0@/u%F@/u%F@/u%F0 @.}Vl@.}Vl??@.}Vl@.}Vl?@.}Vl@.}Vl@.}Vl??@.}Vl@.}Vl??@.}Vl@.}Vl??@.}Vl@.}Vl?@.}Vl?@.}Vl@.}Vl??@.}Vl@.}Vl??@.}Vl@.}Vl??@.}Vl@.}Vl??@.}Vl@.}Vl?@.}Vl@.}Vl??@.}Vl@.}Vl??@.}Vl@.}Vl@.}Vl?@.}Vl@En/@En/@.}Vl@.}Vl@En/@En/@.}Vl@.}Vl@En/@En/@.}Vl@.}Vl@En/@En/@.}Vl@En/@.}Vl@En/@En/@.}Vl@.}Vl@En/@En/@.}Vl@.}Vl@En/@En/@.}Vl@.}Vl@En/@En/@.}Vl@.}Vl@En/@.}Vl@En/@En/@.}Vl@.}Vl@En/@En/@.}Vl@.}Vl@En/@En/@.}Vl@.}Vl@En/@En/@.}Vl@.}Vl@En/@.}Vl@En/@En/@.}Vl@.}Vl@En/@En/@.}Vl@.}Vl@En/@En/@.}Vl@.}Vl@En/@En/@.}Vl@.}Vl@En/@En/@.}Vl@En/@.}Vl@En/@.}Vl@En/@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@ .}Vl@#1'@ .}Vl@#1'@ .}Vl@#1'@ .}Vl@#1'@ .}Vl@'En/@'En/@*[W>6@*[W>6@'En/@'En/@*[W>6@*[W>6@'En/@'En/@*[W>6@'En/@'En/@*[W>6@*[W>6@'En/@'En/@*[W>6@*[W>6@'En/@'En/@*[W>6@*[W>6@'En/@'En/@*[W>6@*[W>6@'En/@'En/@*[W>6@'En/@*[W>6@*[W>6@'En/@'En/@*[W>6@*[W>6@'En/@'En/@*[W>6@*[W>6@'En/@'En/@*[W>6@*[W>6@'En/@'En/@*[W>6@'En/@*[W>6@'En/@'En/@*[W>6@*[W>6@'En/@'En/@*[W>6@*[W>6@'En/@'En/@*[W>6@*[W>6@'En/@'En/@'En/@*[W>6@'En/@*[W>6@'En/@.\>@.\>@.\>@.\>@.\>@.\>@.\>@.\>@.\>@.\>@.\>@.\>@.\>@.\>@.\>@.\>@.\>@.\>@.\>@.\>@.\>@.\>@.\>@.\>@.\> ?@.}Vl@.}Vl??@.}Vl@.}Vl@.}Vl@.}Vl@En/@En/@.}Vl@.}Vl@En/@En/@.}Vl@.}Vl@En/@En/@.}Vl@.}Vl@En/@En/@En/@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@#1'@'En/@'En/@'En/@*[W>6@*[W>6@'En/@'En/@*[W>6@*[W>6@'En/@'En/@*[W>6@.\>@.\>@.\>?@.}Vl@.}Vl??@.}Vl@.}Vl??@.}Vl@.}Vl??@.}Vl@.}Vl@.}Vl@.}Vl@.}Vl@En/@En/@.}Vl@.}Vl@En/@En/@.}Vl@.}Vl@En/@En/@.}Vl@.}Vl@En/@En/@.}Vl@En/@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@#1'@'En/@'En/@*[W>6@*[W>6@'En/@'En/@*[W>6@*[W>6@'En/@'En/@*[W>6@*[W>6@'En/@'En/@*[W>6@*[W>6@'En/@*[W>6@.\>@.\>@.\>@.\>@.\>@.\>@.\>??@.}Vl@.}Vl??@.}Vl@.}Vl??@.}Vl@.}Vl??@.}Vl@.}Vl?@.}Vl@.}Vl@.}Vl@En/@En/@.}Vl@.}Vl@En/@En/@.}Vl@.}Vl@En/@En/@.}Vl@.}Vl@En/@En/@.}Vl@En/@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@#1'@'En/@'En/@*[W>6@*[W>6@'En/@'En/@*[W>6@*[W>6@'En/@'En/@*[W>6@*[W>6@'En/@'En/@*[W>6@*[W>6@'En/@*[W>6@.\>@.\>@.\>@.\>@.\>@.\>@.\>@.\>@.\>@.}Vl??@.}Vl@.}Vl??@.}Vl@.}Vl?@.}Vl@.}Vl@.}Vl@.}Vl@En/@En/@.}Vl@.}Vl@En/@En/@.}Vl@.}Vl@En/@En/@.}Vl@.}Vl@En/@En/@.}Vl@En/@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@ .}Vl@#1'@#1'@ .}Vl@#1'@'En/@'En/@*[W>6@'En/@'En/@*[W>6@*[W>6@'En/@'En/@*[W>6@*[W>6@'En/@'En/@*[W>6@*[W>6@'En/@.\>@.\>@.\>@.\>@.\>@.}Vl?@.}Vl@En/@.}Vl@En/@.}Vl@En/@.}Vl@En/@ .}Vl@#1'@ .}Vl@#1'@ .}Vl@#1'@ .}Vl@#1'@ .}Vl@'En/@*[W>6@'En/@*[W>6@'En/@.\> @En/@.}Vl@En/@ .}Vl@#1'@ .}Vl@#1'@'En/@.}Vl?@.}Vl@.}Vl@En/@.}Vl@En/@ .}Vl@#1'@ .}Vl@#1'@'En/@*[W>6@'En/@*[W>6@.\>?@.}Vl?@.}Vl@.}Vl@En/@.}Vl@En/@ .}Vl@#1'@ .}Vl@#1'@'En/@*[W>6@'En/@*[W>6@.\>@.\>@.}Vl@.}Vl@En/@.}Vl@En/@ .}Vl@#1'@ .}Vl@#1'@'En/@*[W>6@'En/@En/@ .}Vl@#1'@.}Vl?@.}Vl@.}Vl@En/@.}Vl@En/@ .}Vl@#1'@ .}Vl@#1'@'En/@*[W>6@'En/@*[W>6@.\>?@.}Vl?@.}Vl@.}Vl@En/@.}Vl@En/@ .}Vl@#1'@ .}Vl@#1'@'En/@*[W>6@'En/@*[W>6@.\>@.\>?@.}Vl?@.}Vl@.}Vl@En/@.}Vl@En/@ .}Vl@#1'@ .}Vl@#1'@'En/@*[W>6@'En/@*[W>6@.\>@.\>?@.}Vl?@.}Vl@.}Vl@En/@.}Vl@En/@ .}Vl@#1'@ .}Vl@#1'@'En/@*[W>6@'En/@*[W>6@.\>@.\>@.}Vl@.}Vl@En/@ .}Vl@#1'@'En/@*[W>6?@.}Vl?@.}Vl@.}Vl@En/@.}Vl@En/@ .}Vl@#1'@ .}Vl@#1'@'En/@*[W>6@'En/@*[W>6@.\>@.\>?@.}Vl?@.}Vl@.}Vl@En/@.}Vl@En/@ .}Vl@#1'@ .}Vl@#1'@'En/@*[W>6@'En/@*[W>6@.\>@.\>?@.}Vl?@.}Vl@.}Vl@En/@.}Vl@En/@ .}Vl@#1'@ .}Vl@#1'@'En/@*[W>6@'En/@*[W>6@.\>@.\>?@.}Vl?@.}Vl@.}Vl@En/@.}Vl@En/@ .}Vl@#1'@ .}Vl@#1'@'En/@*[W>6@'En/@*[W>6@.\>@.\>?@.}Vl@.}Vl@En/@ .}Vl@#1'@'En/@*[W>6@.\>@.}Vl@.}Vl@En/@.}Vl@En/@ .}Vl@#1'@ .}Vl@#1'@'En/@'En/@*[W>6?@.}Vl?@.}Vl@.}Vl@En/@.}Vl@En/@ .}Vl@#1'@ .}Vl@#1'@'En/@*[W>6@'En/@*[W>6@.\>@.\>?@.}Vl?@.}Vl@.}Vl@En/@.}Vl@En/@ .}Vl@#1'@ .}Vl@#1'@'En/@*[W>6@'En/@*[W>6@.\>@.\>?@.}Vl@.}Vl@.}Vl@En/@.}Vl@En/@ .}Vl@#1'@ .}Vl@#1'@'En/@*[W>6@'En/@*[W>6@.\>@.}Vl@En/@ .}Vl@#1'@'En/@En/@ .}Vl@#1'@.}Vl@.}Vl@En/@ .}Vl@#1'@'En/@*[W>6?@.}Vl@.}Vl@En/@ .}Vl@#1'@'En/@*[W>6@.\>@.}Vl@En/@ .}Vl@#1'@'En/@ .}Vl v_sim-3.7.0/examples/demo_spin.spin0000644000353400050620000006322212215546210014252 00000000000000 309 spins [mi_magnet 5/ 8/2005 16h. 33mn. 34s.] 1 0.153720000000000E-19 0.918208753776186E+02 0.147958518961907E+03 2 0.153720000000000E-19 0.981262168766058E+02 0.128897414709384E+03 3 0.153720000000000E-19 0.107656426709260E+03 0.115968657955198E+03 4 0.153720000000000E-19 0.104055312849868E+03 0.135367823703964E+03 5 0.153720000000000E-19 0.108797043242461E+03 0.154595738070520E+03 6 0.153720000000000E-19 0.968663483709659E+02 0.135277160291596E+03 7 0.153720000000000E-19 0.910609826857498E+02 0.122435632108987E+03 8 0.153720000000000E-19 0.984132776670431E+02 0.141927578829619E+03 9 0.153720000000000E-19 0.100738023144548E+03 0.116409291745864E+03 10 0.153720000000000E-19 0.951453393927765E+02 0.104115835397709E+03 11 0.153720000000000E-19 0.104358721380705E+03 0.972018853470579E+02 12 0.153720000000000E-19 0.108827983482391E+03 0.105265408721338E+03 13 0.153720000000000E-19 0.957568521947007E+02 0.115493310810805E+03 14 0.153720000000000E-19 0.938592798858775E+02 0.102208382829287E+03 15 0.153720000000000E-19 0.968112351851991E+02 0.962358982494064E+02 16 0.153720000000000E-19 0.963652881494200E+02 0.104885226814504E+03 17 0.153720000000000E-19 0.891859611687746E+02 0.121220032016575E+03 18 0.153720000000000E-19 0.873721651891317E+02 0.102994108048791E+03 19 0.153720000000000E-19 0.895744564510215E+02 0.982521023613757E+02 20 0.153720000000000E-19 0.816673750978014E+02 0.112836486694710E+03 21 0.153720000000000E-19 0.878082076499980E+02 0.129971648453243E+03 22 0.153720000000000E-19 0.837165717219787E+02 0.108256989765592E+03 23 0.153720000000000E-19 0.806760470674415E+02 0.105282772571551E+03 24 0.153720000000000E-19 0.856826268765424E+02 0.117961030400768E+03 25 0.153720000000000E-19 0.903639068344780E+02 0.859544249841534E+02 26 0.153720000000000E-19 0.883212572239590E+02 0.867796365436785E+02 27 0.153720000000000E-19 0.850239723517062E+02 0.656617736785253E+02 28 0.153720000000000E-19 0.792702195853489E+02 0.765101886156107E+02 29 0.153720000000000E-19 0.916560095242037E+02 0.885748600224633E+02 30 0.153720000000000E-19 0.854474064514874E+02 0.898307073679660E+02 31 0.153720000000000E-19 0.822843244202630E+02 0.740161572973152E+02 32 0.153720000000000E-19 0.874354123247119E+02 0.823352526247933E+02 33 0.153720000000000E-19 0.912100217742308E+02 0.900554139207985E+02 34 0.153720000000000E-19 0.845924580176903E+02 0.906502850363942E+02 35 0.153720000000000E-19 0.849265270157966E+02 0.775265163541650E+02 36 0.153720000000000E-19 0.946225628386394E+02 0.834806860681420E+02 37 0.153720000000000E-19 0.915020027824033E+02 0.916892877429596E+02 38 0.153720000000000E-19 0.871256373183968E+02 0.941354560495114E+02 39 0.153720000000000E-19 0.905837433080781E+02 0.766441299874661E+02 40 0.153720000000000E-19 0.103063174444336E+03 0.823670689756905E+02 41 0.153720000000000E-19 0.900561314179558E+02 0.951878796384809E+02 42 0.153720000000000E-19 0.931950452284099E+02 0.752472162025276E+02 43 0.153720000000000E-19 0.835136613826249E+02 0.549413663448683E+02 44 0.153720000000000E-19 0.778420549807558E+02 0.694156724918977E+02 45 0.153720000000000E-19 0.850039413646267E+02 0.609526110604814E+02 46 0.153720000000000E-19 0.922520335272437E+02 0.421765199127961E+02 47 0.153720000000000E-19 0.850134193992967E+02 0.594999913493116E+02 48 0.153720000000000E-19 0.921981853905151E+02 0.752523750986412E+02 49 0.153720000000000E-19 0.912452313320103E+02 0.633117231267531E+02 50 0.153720000000000E-19 0.913641787953528E+02 0.449976012986465E+02 51 0.153720000000000E-19 0.102981553977062E+03 0.628637903990295E+02 52 0.153720000000000E-19 0.105920268998696E+03 0.734225370049746E+02 53 0.153720000000000E-19 0.964928835377597E+02 0.603457395771277E+02 54 0.153720000000000E-19 0.922535168086087E+02 0.478202034380883E+02 55 0.153720000000000E-19 0.102988577398399E+03 0.271324187612992E+02 56 0.153720000000000E-19 0.967896211717540E+02 0.449977604950162E+02 57 0.153720000000000E-19 0.850199620355266E+02 0.304974576326736E+02 58 0.153720000000000E-19 0.832834000470526E+02 0.163494821037368E+03 59 0.153720000000000E-19 0.880175907163896E+02 0.150056097737266E+03 60 0.153720000000000E-19 0.893351131576851E+02 0.139894751176460E+03 61 0.153720000000000E-19 0.837505848111609E+02 0.156997578993529E+03 62 0.153720000000000E-19 0.943890370186016E+02 0.171340960221538E+03 63 0.153720000000000E-19 0.883513281452454E+02 0.160241726617283E+03 64 0.153720000000000E-19 0.912869561736940E+02 0.149054158180231E+03 65 0.153720000000000E-19 0.991121148188033E+02 0.165350840338310E+03 66 0.153720000000000E-19 0.101280734107805E+03 0.174636582036684E+03 67 0.153720000000000E-19 0.918678656695631E+02 0.167722640915129E+03 68 0.153720000000000E-19 0.972168951796680E+02 0.155654169242473E+03 69 0.153720000000000E-19 0.110924414403556E+03 0.166070838060885E+03 70 0.153720000000000E-19 0.106736177401381E+03 0.175530434780704E+03 71 0.153720000000000E-19 0.962671567547934E+02 0.170843581493139E+03 72 0.153720000000000E-19 0.101720599092686E+03 0.156266891939720E+03 73 0.153720000000000E-19 0.955413353925272E+02 0.171105421515740E+03 74 0.153720000000000E-19 0.916276389392183E+02 0.125551642876964E+03 75 0.153720000000000E-19 0.847329250866417E+02 0.145083674550188E+03 76 0.153720000000000E-19 0.812370938161036E+02 0.123299477563250E+03 77 0.153720000000000E-19 0.862932061019818E+02 0.110295592162898E+03 78 0.153720000000000E-19 0.888437148544340E+02 0.129516730196040E+03 79 0.153720000000000E-19 0.791414328391479E+02 0.154665870209379E+03 80 0.153720000000000E-19 0.662220950361308E+02 0.133091297510578E+03 81 0.153720000000000E-19 0.778572126515043E+02 0.113178151631345E+03 82 0.153720000000000E-19 0.849594168718424E+02 0.135831619844816E+03 83 0.153720000000000E-19 0.787587482094439E+02 0.160627842069236E+03 84 0.153720000000000E-19 0.570526415494540E+02 0.138453180320661E+03 85 0.153720000000000E-19 0.735670474658189E+02 0.116200225221754E+03 86 0.153720000000000E-19 0.868933729499117E+02 0.142046848789657E+03 87 0.153720000000000E-19 0.839420446009097E+02 0.166386730581672E+03 88 0.153720000000000E-19 0.564930232042758E+02 0.142442060366936E+03 89 0.153720000000000E-19 0.785255653256647E+02 0.122800010855536E+03 90 0.153720000000000E-19 0.900754391817982E+02 0.147651713118578E+03 91 0.153720000000000E-19 0.713359365270181E+02 0.153467657341561E+03 92 0.153720000000000E-19 0.848772849108432E+02 0.848197841151049E+02 93 0.153720000000000E-19 0.594917071793219E+02 0.969470099420935E+02 94 0.153720000000000E-19 0.736789759180671E+02 0.530689218325734E+02 95 0.153720000000000E-19 0.786285842754052E+02 0.642924419297026E+02 96 0.153720000000000E-19 0.747262370879032E+02 0.905619418004292E+02 97 0.153720000000000E-19 0.445906646211507E+02 0.964571232585695E+02 98 0.153720000000000E-19 0.569388369350721E+02 0.503347577579780E+02 99 0.153720000000000E-19 0.722036053358122E+02 0.673634921068056E+02 100 0.153720000000000E-19 0.693335359734771E+02 0.910792876938119E+02 101 0.153720000000000E-19 0.392859214287789E+02 0.906191829989384E+02 102 0.153720000000000E-19 0.519535742861722E+02 0.449688309242843E+02 103 0.153720000000000E-19 0.729294551686280E+02 0.664715854172454E+02 104 0.153720000000000E-19 0.701318920331224E+02 0.904525068449758E+02 105 0.153720000000000E-19 0.437512667416611E+02 0.821399721370912E+02 106 0.153720000000000E-19 0.570273616732338E+02 0.396396519295173E+02 107 0.153720000000000E-19 0.801944450031769E+02 0.650774393344206E+02 108 0.153720000000000E-19 0.812734332450353E+02 0.974084809804673E+02 109 0.153720000000000E-19 0.737648954745384E+02 0.369521782741463E+02 110 0.153720000000000E-19 0.873945128319830E+02 0.430267838366604E+02 111 0.153720000000000E-19 0.801609397372084E+02 0.248835148608745E+02 112 0.153720000000000E-19 0.931931414262145E+02 0.147165418439899E+02 113 0.153720000000000E-19 0.964938074411239E+02 0.296385287562660E+02 114 0.153720000000000E-19 0.827061812819708E+02 0.438415629054693E+02 115 0.153720000000000E-19 0.729317563051082E+02 0.234952254700781E+02 116 0.153720000000000E-19 0.905991772120016E+02 0.133344913304031E+02 117 0.153720000000000E-19 0.912511714497936E+02 0.266820206292131E+02 118 0.153720000000000E-19 0.797802779561741E+02 0.449939889793210E+02 119 0.153720000000000E-19 0.722437454806211E+02 0.226274329880699E+02 120 0.153720000000000E-19 0.849613936646827E+02 0.124717482633040E+02 121 0.153720000000000E-19 0.850212140112288E+02 0.290481675139825E+02 122 0.153720000000000E-19 0.827243832848504E+02 0.461488200333366E+02 123 0.153720000000000E-19 0.786769824985727E+02 0.257358010870222E+02 124 0.153720000000000E-19 0.823191905747306E+02 0.159957797291935E+02 125 0.153720000000000E-19 0.835288918801617E+02 0.350636474298856E+02 126 0.153720000000000E-19 0.874126978572675E+02 0.469684544938280E+02 127 0.153720000000000E-19 0.850409843534735E+02 0.243565634235538E+02 128 0.153720000000000E-19 0.103078001834870E+03 0.761417226711830E+01 129 0.153720000000000E-19 0.105933539764138E+03 0.165697227289200E+02 130 0.153720000000000E-19 0.946515405156089E+02 0.651310163461715E+01 131 0.153720000000000E-19 0.922178755528345E+02 0.147447273638738E+02 132 0.153720000000000E-19 0.874703908012233E+02 0.766761226602838E+01 133 0.153720000000000E-19 0.778585827139441E+02 0.205867030116366E+02 134 0.153720000000000E-19 0.792894255153850E+02 0.135000409122764E+02 135 0.153720000000000E-19 0.917906089949904E+02 0.173108154292768E+03 136 0.153720000000000E-19 0.107798344266444E+03 0.184085223642807E+03 137 0.153720000000000E-19 0.973278788564400E+02 0.188356141830748E+03 138 0.153720000000000E-19 0.924111001175221E+02 0.171409293806737E+03 139 0.153720000000000E-19 0.972908716205462E+02 0.176530359445692E+03 140 0.153720000000000E-19 0.103126630680993E+03 0.185177715876063E+03 141 0.153720000000000E-19 0.992254720988856E+02 0.188434569925754E+03 142 0.153720000000000E-19 0.922805047977342E+02 0.177985127520255E+03 143 0.153720000000000E-19 0.984549202389557E+02 0.180084856506915E+03 144 0.153720000000000E-19 0.963733231028734E+02 0.189241329824603E+03 145 0.153720000000000E-19 0.941640248366337E+02 0.192925772686409E+03 146 0.153720000000000E-19 0.915833867405494E+02 0.182757741343161E+03 147 0.153720000000000E-19 0.971425819025358E+02 0.183719979398165E+03 148 0.153720000000000E-19 0.846612095586820E+02 0.198006655928026E+03 149 0.153720000000000E-19 0.897745596166772E+02 0.202118181401122E+03 150 0.153720000000000E-19 0.911950785368090E+02 0.189488094888712E+03 151 0.153720000000000E-19 0.916329749568709E+02 0.187716696116142E+03 152 0.153720000000000E-19 0.887330547769193E+02 0.212941683853477E+03 153 0.153720000000000E-19 0.873317852937430E+02 0.163085136621486E+03 154 0.153720000000000E-19 0.902895995842507E+02 0.190648118550328E+03 155 0.153720000000000E-19 0.817282314804433E+02 0.191618444192580E+03 156 0.153720000000000E-19 0.661772790328666E+02 0.164735776839672E+03 157 0.153720000000000E-19 0.812246779322670E+02 0.173562161963152E+03 158 0.153720000000000E-19 0.835706502716043E+02 0.199514867813750E+03 159 0.153720000000000E-19 0.671749219563972E+02 0.212390610270352E+03 160 0.153720000000000E-19 0.514143728506926E+02 0.178766585322418E+03 161 0.153720000000000E-19 0.765326114581508E+02 0.181208629811623E+03 162 0.153720000000000E-19 0.807775804789998E+02 0.208943199407398E+03 163 0.153720000000000E-19 0.621865929777061E+02 0.225030347059038E+03 164 0.153720000000000E-19 0.470864007275458E+02 0.189009461247688E+03 165 0.153720000000000E-19 0.773715568507317E+02 0.188777451644313E+03 166 0.153720000000000E-19 0.849380814994829E+02 0.221960482155687E+03 167 0.153720000000000E-19 0.671072842138069E+02 0.237656599778709E+03 168 0.153720000000000E-19 0.534714217101525E+02 0.205847371697945E+03 169 0.153720000000000E-19 0.836972034200412E+02 0.198819796890445E+03 170 0.153720000000000E-19 0.816719545483550E+02 0.258467497509074E+03 171 0.153720000000000E-19 0.452904621962800E+02 0.134508776865426E+03 172 0.153720000000000E-19 0.536948764275220E+02 0.244051543407262E+03 173 0.153720000000000E-19 0.714286028136464E+02 0.296115760125651E+03 174 0.153720000000000E-19 0.436206751197078E+02 0.758176200071891E+01 175 0.153720000000000E-19 0.131989327183022E+02 0.159190727283121E+03 176 0.153720000000000E-19 0.471797269803317E+02 0.261013760502019E+03 177 0.153720000000000E-19 0.565873416879088E+02 0.307413492469681E+03 178 0.153720000000000E-19 0.393028803866827E+02 0.359241429642229E+03 179 0.153720000000000E-19 0.560901677301279E+01 0.225457338228243E+03 180 0.153720000000000E-19 0.514382650983778E+02 0.271340806367047E+03 181 0.153720000000000E-19 0.571377762630078E+02 0.311551060007264E+03 182 0.153720000000000E-19 0.446799478534127E+02 0.353560121229244E+03 183 0.153720000000000E-19 0.132043894270751E+02 0.291682151580716E+03 184 0.153720000000000E-19 0.661640233205417E+02 0.285478094731800E+03 185 0.153720000000000E-19 0.662942147057757E+02 0.317035544272179E+03 186 0.153720000000000E-19 0.596178639632786E+02 0.353234757428907E+03 187 0.153720000000000E-19 0.452703213814565E+02 0.316405457769747E+03 188 0.153720000000000E-19 0.812886890081098E+02 0.326992680457742E+03 189 0.153720000000000E-19 0.812474360548718E+02 0.352488592712672E+03 190 0.153720000000000E-19 0.785724240270051E+02 0.327063715443110E+03 191 0.153720000000000E-19 0.857086456669661E+02 0.331972427500745E+03 192 0.153720000000000E-19 0.871407481654022E+02 0.355818189063728E+03 193 0.153720000000000E-19 0.701411417975934E+02 0.359476362163416E+03 194 0.153720000000000E-19 0.736322852736214E+02 0.333747045023444E+03 195 0.153720000000000E-19 0.837774134038248E+02 0.341694883716887E+03 196 0.153720000000000E-19 0.846328890649937E+02 0.359331022278026E+03 197 0.153720000000000E-19 0.693910806754094E+02 0.358898859076454E+03 198 0.153720000000000E-19 0.779327470664367E+02 0.336849534579753E+03 199 0.153720000000000E-19 0.874451429503056E+02 0.347004561403328E+03 200 0.153720000000000E-19 0.854998149968175E+02 0.180092907680517E+00 201 0.153720000000000E-19 0.748060124756345E+02 0.359483112272185E+03 202 0.153720000000000E-19 0.863656233737902E+02 0.339810603481419E+03 203 0.153720000000000E-19 0.939230785440560E+02 0.347826277401942E+03 204 0.153720000000000E-19 0.883590526859944E+02 0.325501425610566E+01 205 0.153720000000000E-19 0.849145483819230E+02 0.525792227658935E+01 206 0.153720000000000E-19 0.951748206552050E+02 0.345934324629183E+03 207 0.153720000000000E-19 0.900644275735043E+02 0.354784951488104E+03 208 0.153720000000000E-19 0.807154734175169E+02 0.344682907298770E+03 209 0.153720000000000E-19 0.915414567495973E+02 0.358294743515967E+03 210 0.153720000000000E-19 0.896388421941480E+02 0.351736091779706E+03 211 0.153720000000000E-19 0.912639163639559E+02 0.359943090882521E+03 212 0.153720000000000E-19 0.968745489724729E+02 0.353774091990167E+03 213 0.153720000000000E-19 0.916993405555229E+02 0.143795261194798E+01 214 0.153720000000000E-19 0.104393670819117E+03 0.352825374286044E+03 215 0.153720000000000E-19 0.903759657366161E+02 0.406012982720612E+01 216 0.153720000000000E-19 0.105220341338558E+03 0.201276947924312E+03 217 0.153720000000000E-19 0.113190163811795E+03 0.192908152043853E+03 218 0.153720000000000E-19 0.112674247563758E+03 0.204445314305272E+03 219 0.153720000000000E-19 0.103521249059153E+03 0.215233400935018E+03 220 0.153720000000000E-19 0.101278398701871E+03 0.203384096313289E+03 221 0.153720000000000E-19 0.102803881744325E+03 0.194815243350463E+03 222 0.153720000000000E-19 0.977973532275613E+02 0.213957016307440E+03 223 0.153720000000000E-19 0.102058373246190E+03 0.225002227553215E+03 224 0.153720000000000E-19 0.952442671014143E+02 0.213069215427282E+03 225 0.153720000000000E-19 0.876277102555801E+02 0.205136211341446E+03 226 0.153720000000000E-19 0.103523470243081E+03 0.234772842055527E+03 227 0.153720000000000E-19 0.932425794080445E+02 0.224570428375733E+03 228 0.153720000000000E-19 0.940603395078986E+02 0.206879431924348E+03 229 0.153720000000000E-19 0.932509226864596E+02 0.225426981078925E+03 230 0.153720000000000E-19 0.887539421926179E+02 0.237041052420198E+03 231 0.153720000000000E-19 0.849835886641029E+02 0.228032812560383E+03 232 0.153720000000000E-19 0.929065959380137E+02 0.214205177046751E+03 233 0.153720000000000E-19 0.952578336218214E+02 0.236940367181845E+03 234 0.153720000000000E-19 0.898231418555504E+02 0.247873934079166E+03 235 0.153720000000000E-19 0.808133815993144E+02 0.241059634973185E+03 236 0.153720000000000E-19 0.900100228215119E+02 0.225003861973293E+03 237 0.153720000000000E-19 0.101293845695030E+03 0.246633187280323E+03 238 0.153720000000000E-19 0.942024218918001E+02 0.257082770989828E+03 239 0.153720000000000E-19 0.835882617170392E+02 0.250507014627309E+03 240 0.153720000000000E-19 0.928822050387954E+02 0.235809080371743E+03 241 0.153720000000000E-19 0.105234508147716E+03 0.248742511863686E+03 242 0.153720000000000E-19 0.992371776773114E+02 0.261593803844224E+03 243 0.153720000000000E-19 0.902871237071365E+02 0.259407558112380E+03 244 0.153720000000000E-19 0.940524919092207E+02 0.243152279689297E+03 245 0.153720000000000E-19 0.973347734028799E+02 0.261684763836460E+03 246 0.153720000000000E-19 0.837613934592725E+02 0.251098883065442E+03 247 0.153720000000000E-19 0.912398197450195E+02 0.260476580794689E+03 248 0.153720000000000E-19 0.955795034807096E+02 0.278838917485610E+03 249 0.153720000000000E-19 0.840369359380632E+02 0.283493542588466E+03 250 0.153720000000000E-19 0.774725421754243E+02 0.261176613424613E+03 251 0.153720000000000E-19 0.916391340325775E+02 0.267236261904917E+03 252 0.153720000000000E-19 0.963497700540005E+02 0.279120325475232E+03 253 0.153720000000000E-19 0.788423753558586E+02 0.289338466805117E+03 254 0.153720000000000E-19 0.765958653059499E+02 0.268807400554717E+03 255 0.153720000000000E-19 0.923352174881665E+02 0.272042047669058E+03 256 0.153720000000000E-19 0.919440972264010E+02 0.282285934085096E+03 257 0.153720000000000E-19 0.792075522507790E+02 0.295377118286305E+03 258 0.153720000000000E-19 0.812459305524987E+02 0.276502073105009E+03 259 0.153720000000000E-19 0.924406653262606E+02 0.278638955147008E+03 260 0.153720000000000E-19 0.884069370514122E+02 0.289805449063030E+03 261 0.153720000000000E-19 0.847874539316248E+02 0.305034609532730E+03 262 0.153720000000000E-19 0.873330486130517E+02 0.287020347491105E+03 263 0.153720000000000E-19 0.880487045344674E+02 0.300010113417177E+03 264 0.153720000000000E-19 0.901348602582418E+02 0.302199602883241E+03 265 0.153720000000000E-19 0.101793755468655E+03 0.293661404271586E+03 266 0.153720000000000E-19 0.878864209120275E+02 0.319949717975016E+03 267 0.153720000000000E-19 0.869849319522394E+02 0.307874831341615E+03 268 0.153720000000000E-19 0.972930198712245E+02 0.294324883392906E+03 269 0.153720000000000E-19 0.985049785014545E+02 0.308018699950868E+03 270 0.153720000000000E-19 0.892614892917086E+02 0.328751357042796E+03 271 0.153720000000000E-19 0.850427517561306E+02 0.314170061380212E+03 272 0.153720000000000E-19 0.913681140162761E+02 0.300979577803705E+03 273 0.153720000000000E-19 0.969502793338031E+02 0.314721935512374E+03 274 0.153720000000000E-19 0.958329701729385E+02 0.334533841719940E+03 275 0.153720000000000E-19 0.889181818864605E+02 0.320551915122753E+03 276 0.153720000000000E-19 0.894105567918471E+02 0.310175669722219E+03 277 0.153720000000000E-19 0.982116333160673E+02 0.321155245584175E+03 278 0.153720000000000E-19 0.100802903566362E+03 0.333652615021205E+03 279 0.153720000000000E-19 0.916762022879496E+02 0.324567483955626E+03 280 0.153720000000000E-19 0.817433639294407E+02 0.337128859860710E+03 281 0.153720000000000E-19 0.911591901226842E+02 0.327537759967937E+03 282 0.153720000000000E-19 0.964465074479308E+02 0.345112858913414E+03 283 0.153720000000000E-19 0.107729441067555E+03 0.334051487651779E+03 284 0.153720000000000E-19 0.108882850061864E+03 0.344762289825269E+03 285 0.153720000000000E-19 0.978033960897058E+02 0.236043715633942E+03 286 0.153720000000000E-19 0.110985233610429E+03 0.225001192967105E+03 287 0.153720000000000E-19 0.112683754856285E+03 0.245556511505113E+03 288 0.153720000000000E-19 0.846829102133808E+02 0.251980334767300E+03 289 0.153720000000000E-19 0.876459364804726E+02 0.244861046205312E+03 290 0.153720000000000E-19 0.964112682437566E+02 0.260755923385053E+03 291 0.153720000000000E-19 0.102825998188338E+03 0.255184192118316E+03 292 0.153720000000000E-19 0.103163941076524E+03 0.264829391429637E+03 293 0.153720000000000E-19 0.113207047491815E+03 0.257100386295909E+03 294 0.153720000000000E-19 0.107820263157219E+03 0.265933993255387E+03 295 0.153720000000000E-19 0.916482254793818E+02 0.262268017086819E+03 296 0.153720000000000E-19 0.106775314408033E+03 0.274437177968716E+03 297 0.153720000000000E-19 0.971945112986331E+02 0.266265076574787E+03 298 0.153720000000000E-19 0.101347836642765E+03 0.275352546636602E+03 299 0.153720000000000E-19 0.985138434689115E+02 0.269913552153628E+03 300 0.153720000000000E-19 0.944614110710391E+02 0.278670995145976E+03 301 0.153720000000000E-19 0.973344986349568E+02 0.273486979453433E+03 302 0.153720000000000E-19 0.833277967563459E+02 0.286539088404136E+03 303 0.153720000000000E-19 0.918024437577138E+02 0.276919333206543E+03 304 0.153720000000000E-19 0.110984304771874E+03 0.283898536598521E+03 305 0.153720000000000E-19 0.108872076396721E+03 0.295383033640307E+03 306 0.153720000000000E-19 0.991962540198020E+02 0.284647794090248E+03 307 0.153720000000000E-19 0.919187297354377E+02 0.302067462694708E+03 308 0.153720000000000E-19 0.838269879804949E+02 0.293036915191419E+03 309 0.153720000000000E-19 0.104163063898865E+03 0.314632923421369E+03 mi_magnet info sur ext, the_ext, phi_ext: 0.00000000000000D+000 0.00000000000000D+000 0.00000000000000D+000 mi_magnet info sur anis, the_anis, phi_anis: 0.00000000000000D+000 0.00000000000000D+000 0.00000000000000D+000 v_sim-3.7.0/examples/aluminium.d30000644000353400050620000000661412215546211013635 00000000000000Positions atomiques 3D.  Al 0@8~G {(~G A@5j^5?}@800@av6T@8@,m5@(@_*C<j97?Ϭ\jddJD_zfo =?mܿ\Z "N <8–yu-& em qİ_"J)t%Z.|@5|:&@4 1"k@2?}@16 $@{g}@Fn)@@2}FT@/0 %@1 ko4@, md@/)@)=<Q@,sHJ:@&1NZ@)}gT*@! `8@ 8le?:@(dZ@"pV=@%?Qw@<@"F/p^@b@kj@h&@ +iE@x׿?^@_=@/Jjq@)@)7`h@%п@&\ Ix@">){@]̼A@?B.@ 8ݢ@@U#&I6ܗe sD +? n\pO5?ȿe 0d ūeF"ϥFp`Oc !fvRi"$wj$ O'̛x@6؏F@5ghp!@3Ȥ@2 xr@/\:l,@$Ȣ/@3nz@1%F@2 .R@/`F(^@1@,Tbv@/hs.@)*@)څVQ@#<7@&/}@#<K@xV }s@,9@$釽u@)MT @" vR_@&RT@U>@$:Kdg&@R"7@#8@@+YE@xyU,@k@O @ e @9zK??-d@,W2.@,?X(/Em@&ɼ^ 2L@"rOLB bcڐb,D^gt'ضu}@,F}D@#ԍ00@)Ջ:@/,Lg@0-q]@2H ?i@1i.@4q>Ի@`wQ@#Ur-@#@)a0ˏe@)Tm@.gd@.\@1/}@5']~!5@4gE@\@t@"ղ@#qn@)OJL@+jS@1]ș @4qD2~3?N'@$,`@--V@#nQV@2#rޖ@46N@48t?p ۸?Nj+@@S@"K"@`@#@#Ӄ@)a (:@+[y/x@/,'xHb@41"?nTD?#?@@|4@!x @e@F-n@(Rej?X&l?$ b@!{[@M\Ţ@eT{[@)TxM{#N@03+@1K$@4|8`?1h@.>2B@2@+\T@1@2@zk@4 UO^@5%@!Mַd@& k@&|@+oHl;1@+m}@03'@01Ic@2[X@5&mPk@5'\z@+>@!u/G$@&|@+j3x@01|1@2@5&)w?%o@ ~\_@.YG@!bԼ@&{&z@4 2?񅎉R?EH@ *$@ [^X@-`n@*Ѓ@!U4@!d@&Lq@&b~@+o*@0-=F@1?@X@ |Me2<@Zϵf@]@^ @ 4"@#ڈBh@#|@&\d.@.K7:@! ,@ r@5(@B7S@Ā|@@ fG@+m{`{$@(@ }~A@2V]JcX@4 T-0@00*2@2gI@.7]4@1ذv@4g@.A/@23@.2@)r00@}7U@Sb1@RЃ@_$lo@X''@\n@ ι@@H8 '@_@P^_5@X$@Pr~@oނ@sOT@m @sR;@GwO@G|8 @e@\Dv}@@s@\7|Z@H#@jo-@H˴@e1@ `5u,@GwT[@G|]ݦ@j 2_@HDiUL@j! @G@G.!@ @_(lN@u@Pk@/5@aa@eO@e^@X'@_|@PŠ@j@8@/c@o+ev@Xً@PYWL@_@l8@X@@@s@Xz.F@e@e{@P7M@_ Fʬ@R_t@ӃaP@8ƀ@Ռvf@vdq@ӊ#7@LKs@8(@ߪ]@#`}@"@դ_g@횹6@Y(o@Ea@Prv@Ս`@*@XU@Tt@$Z@@2?n@𾏙4@ f@PW@:)@Pf2@𾇶HV@x~@\@?@'@J @ՙ17b@{""[@e ;@J@߹" @\@|@&@;@ՙ,@`-U@^U@+Σ@y\f@/heI@/q@S{s@|T"@/@C@?+@߻Wo@bv@s*a@{F@6)@/Yj@}0@ն@X@յV@L| s@M "@s `v@p@s%o@s#h`@; @ot]@)*F0v_sim-3.7.0/examples/test_isosurfaces.ascii0000644000353400050620000000317112215546211015777 00000000000000sample atomic file: see movie.datafilm bottom 4.1213 -2.3795 4.7589 0 0 12.991 0 0 1.92267 Al 1.9544 1.5863 2.40767 Al 0 0 4.57284 Al 1.9544 1.5863 6.25301 Al 0.693276 1.5863 1.08258 O -0.728113 1.45622 3.24775 O 1.26113 0 3.24775 O 1.20886 3.30268 3.24775 O 0.515588 1.71638 5.41292 O 0 0 8.41818 Al 1.9544 1.5863 8.90317 Al 0 0 11.0683 Al 1.9544 1.5863 12.7485 Al 1.22629 3.04253 7.57809 O 1.42139 0.130077 7.57809 O 0.533015 1.45622 9.74326 O -0.74554 1.71638 11.9084 O 1.0486 3.1726 11.9084 O -2.37945 4.7589 1.92267 Al -2.37945 4.7589 4.57284 Al -1.11833 4.7589 3.24775 O -1.47365 3.1726 5.41292 O -2.37945 4.7589 8.41818 Al -2.37945 4.7589 11.0683 Al -1.65134 3.30268 9.74326 O -0.940639 4.62883 11.9084 O 4.12133 0 1.92267 Al 4.12133 0 4.57284 Al 2.68252 0.130077 1.08258 O 3.39322 1.45622 3.24775 O 4.12133 0 8.41818 Al 4.12133 0 11.0683 Al 3.21553 1.5863 7.57809 O 2.8602 0 9.74326 O -0.212526 3.1726 0.242499 Al 1.74188 4.7589 1.92267 Al -0.212526 3.1726 4.08784 Al 1.74188 4.7589 4.57284 Al 2.48742 3.04253 1.08258 O 0.320489 4.62883 5.41292 O -0.212526 3.1726 6.738 Al 1.74188 4.7589 8.41818 Al -0.212526 3.1726 10.5833 Al 1.74188 4.7589 11.0683 Al 2.46999 3.30268 9.74326 O 0.48075 4.7589 9.74326 O v_sim-3.7.0/examples/test_isosurfaces.surf0000644000353400050620000062724412215546211015703 00000000000000sample surfaces file: see movie.datafilm 4.1213 -2.3795 4.7589 0 0 12.991 4 3400 3797 # First surface # potentialValue 2.345e-2 surface_Al2O3_1 1510 1677 4 1 3 4 2 4 1 5 6 2 4 3 7 8 4 4 5 9 10 6 4 11 13 14 12 4 11 15 16 12 4 17 19 20 18 4 17 21 22 18 3 23 24 25 5 23 26 8 7 24 5 27 29 10 9 28 3 27 28 30 4 31 33 34 32 4 31 13 14 32 4 15 35 36 16 4 19 37 38 20 4 39 21 22 40 3 23 41 25 5 23 26 43 42 41 5 27 29 46 45 44 3 27 44 30 4 33 47 48 34 4 35 49 50 36 4 37 51 52 38 4 42 53 54 43 4 45 55 56 46 4 47 57 58 48 4 49 59 60 50 4 51 61 62 52 4 63 53 54 64 4 63 55 56 64 4 65 57 58 66 4 65 67 68 66 4 59 69 70 60 4 61 71 72 62 4 73 67 68 74 4 73 69 70 74 4 75 71 72 76 4 75 77 78 76 3 79 80 81 4 79 80 83 82 3 82 83 84 3 85 86 87 3 85 86 88 5 79 81 90 91 89 4 79 89 92 82 5 82 84 93 94 92 5 85 87 96 97 95 5 85 88 98 99 95 4 98 100 101 99 4 102 104 105 103 4 102 106 107 103 4 90 108 109 91 4 93 110 111 94 4 96 112 113 97 4 100 114 115 101 4 104 116 117 105 4 106 118 119 107 4 108 120 121 109 4 110 122 123 111 4 112 124 125 113 4 114 126 127 115 3 128 129 130 5 128 131 117 116 129 4 132 118 119 133 4 132 134 135 133 4 136 120 121 137 4 136 138 139 137 4 122 140 141 123 4 124 142 143 125 3 144 145 146 5 144 147 127 126 145 3 128 148 130 5 128 131 150 149 148 4 151 153 154 152 4 151 134 135 152 4 155 138 139 156 4 155 140 141 156 4 157 142 143 158 5 144 159 158 157 146 3 144 159 147 4 149 160 161 150 4 153 162 163 154 4 164 160 161 165 4 164 162 163 165 3 166 2 4 3 166 2 6 5 166 4 8 168 167 5 166 6 10 169 167 3 170 12 14 3 170 12 16 3 171 18 20 3 171 18 22 4 8 26 172 168 4 10 29 173 169 3 174 32 34 6 174 32 14 170 175 176 5 170 16 36 177 175 5 171 20 38 179 178 6 171 178 181 180 40 22 4 26 43 182 172 4 29 46 183 173 5 174 34 48 185 184 3 174 184 176 4 36 50 186 177 4 38 52 187 179 3 180 188 181 4 43 54 189 182 4 46 56 190 183 4 48 58 191 185 4 50 60 192 186 4 52 62 193 187 5 194 195 189 54 64 5 194 196 190 56 64 4 66 58 191 197 4 66 68 198 197 4 60 70 199 192 4 62 72 200 193 3 194 201 195 3 194 201 196 4 74 68 198 202 4 74 70 199 202 4 76 72 200 203 4 76 78 204 203 3 205 89 91 5 205 207 206 92 89 4 92 94 208 206 4 95 97 210 209 5 211 212 209 95 99 3 211 99 101 3 213 103 105 3 213 103 107 5 205 91 109 215 214 3 205 214 207 4 94 111 216 208 4 97 113 217 210 3 211 218 212 5 211 101 115 219 218 5 213 105 117 221 220 5 213 107 119 222 220 4 109 121 223 215 4 111 123 224 216 4 113 125 225 217 4 115 127 226 219 4 117 131 227 221 5 228 229 222 119 133 3 228 133 135 4 137 121 223 230 4 137 139 231 230 4 123 141 232 224 4 125 143 233 225 4 127 147 234 226 4 131 150 235 227 5 228 229 236 154 152 3 228 152 135 4 156 139 231 237 4 156 141 232 237 5 238 239 233 143 158 5 238 241 240 159 158 4 159 147 234 240 4 150 161 242 235 4 154 163 243 236 3 238 244 239 3 238 244 241 4 165 161 242 245 4 165 163 243 245 3 246 247 248 3 246 247 249 3 250 251 252 3 250 251 253 3 254 167 168 3 254 167 169 4 250 252 256 255 4 250 253 257 255 5 254 168 172 259 258 5 254 169 173 260 258 3 261 175 176 3 261 175 177 4 255 256 263 262 4 255 257 264 262 3 265 178 179 3 265 178 181 4 172 182 266 259 4 173 183 267 260 3 268 184 185 5 268 269 261 176 184 4 261 177 186 269 3 262 270 263 3 262 270 264 5 265 179 187 272 271 6 265 271 274 273 188 181 4 182 189 275 266 4 183 190 276 267 4 268 185 191 277 4 268 269 278 277 4 269 186 192 278 4 187 193 279 272 3 273 280 274 5 281 195 189 275 282 5 281 196 190 276 282 3 277 197 191 5 277 197 198 283 278 4 278 192 199 283 4 193 200 284 279 3 281 201 195 3 281 201 196 3 283 202 198 3 283 202 199 4 203 200 284 285 4 203 204 286 285 3 287 206 207 3 287 206 208 3 288 209 210 3 288 209 212 3 289 214 215 5 289 290 287 207 214 4 287 208 216 290 5 288 210 217 292 291 5 288 212 218 293 291 4 218 219 294 293 3 295 220 221 3 295 220 222 4 289 215 223 296 5 289 290 297 298 296 5 290 216 224 299 297 4 217 225 300 292 4 219 226 301 294 5 295 221 227 303 302 5 295 222 229 304 302 3 296 230 223 6 296 230 231 305 306 298 5 305 232 224 299 306 4 225 233 307 300 4 226 234 308 301 4 227 235 309 303 4 229 236 310 304 3 305 237 231 3 305 237 232 5 311 239 233 307 312 5 311 241 240 313 312 4 240 234 308 313 4 235 242 314 309 4 236 243 315 310 3 311 244 239 3 311 244 241 4 245 242 314 316 4 245 243 315 316 3 317 318 319 3 317 318 320 4 317 319 322 321 4 317 320 323 321 5 324 326 325 248 247 5 324 328 327 249 247 3 329 330 331 3 329 330 332 3 333 334 335 3 333 334 336 3 324 337 326 3 324 337 328 4 251 252 339 338 4 251 253 340 338 3 341 342 343 3 341 342 344 3 345 346 347 3 345 346 348 4 252 256 349 339 4 253 257 350 340 4 341 343 352 351 4 341 344 353 351 3 354 258 259 3 354 258 260 4 345 347 356 355 5 345 348 358 357 355 3 357 358 359 4 256 263 360 349 4 257 264 361 350 3 351 362 352 3 351 362 353 4 354 259 266 363 4 354 260 267 363 4 355 356 365 364 5 355 357 366 367 364 3 357 366 359 5 368 369 360 263 270 5 368 370 361 264 270 3 371 271 272 3 371 271 274 4 363 266 275 372 4 363 267 276 372 3 364 373 365 3 364 373 367 3 368 374 369 3 368 374 370 4 371 272 279 375 5 371 274 280 376 375 3 372 282 275 3 372 282 276 4 375 279 284 377 4 375 376 378 377 3 377 285 284 4 377 285 286 378 3 379 291 292 4 379 291 293 380 3 380 293 294 3 381 297 298 3 381 297 299 5 379 292 300 383 382 5 379 382 385 384 380 4 380 294 301 384 3 386 302 303 3 386 302 304 3 381 306 298 3 381 306 299 4 300 307 387 383 4 384 385 389 388 4 384 301 308 388 4 386 303 309 390 4 386 304 310 390 4 312 307 387 391 5 388 389 391 312 313 3 388 313 308 4 390 309 314 392 4 390 310 315 392 3 392 316 314 3 392 316 315 3 393 394 395 3 393 394 396 4 318 319 398 397 4 318 320 399 397 4 393 395 401 400 5 393 396 403 402 400 4 319 322 404 398 4 320 323 405 399 3 406 407 408 3 406 407 409 4 400 401 411 410 4 400 402 412 410 3 413 414 415 5 413 325 326 416 414 5 417 327 328 419 418 3 417 418 420 3 421 422 423 6 421 422 425 424 330 331 5 424 427 426 332 330 5 428 430 429 335 334 6 428 334 336 431 432 433 5 434 435 416 326 337 5 434 436 419 328 337 3 424 437 425 3 424 437 427 3 428 438 430 3 428 438 433 3 434 439 435 3 434 439 436 3 440 441 442 3 440 441 443 4 338 339 445 444 4 338 340 446 444 3 447 448 449 6 447 448 442 440 342 343 5 440 443 450 344 342 4 346 347 452 451 4 346 348 453 451 4 339 349 454 445 4 340 350 455 446 4 447 449 457 456 4 447 343 352 456 4 344 353 458 450 4 347 356 459 452 4 358 348 453 460 4 358 359 461 460 4 349 360 462 454 4 350 361 463 455 4 456 457 465 464 5 456 352 362 466 464 5 466 467 458 353 362 4 356 365 468 459 3 469 366 367 5 469 470 461 359 366 4 360 369 471 462 4 361 370 472 463 3 464 473 465 4 464 473 474 466 3 466 474 467 5 475 476 468 365 373 5 475 477 469 367 373 4 469 470 478 477 5 479 480 471 369 374 5 479 481 472 370 374 3 475 482 476 4 475 482 483 477 3 477 483 478 3 479 484 480 3 479 484 481 3 485 382 383 3 485 382 385 4 485 383 387 486 4 485 385 389 486 3 486 391 387 3 486 391 389 4 394 395 488 487 4 394 396 489 487 4 397 398 491 490 4 397 399 492 490 3 493 494 495 3 493 494 496 4 395 401 497 488 4 403 396 489 498 4 398 404 499 491 4 399 405 500 492 3 501 502 503 6 501 502 495 493 407 408 5 493 496 504 409 407 4 401 411 505 497 4 414 415 507 506 4 414 416 508 506 4 418 419 510 509 4 418 420 511 509 5 512 514 513 423 422 3 512 422 425 4 426 427 516 515 4 429 430 518 517 3 519 432 433 4 416 435 520 508 4 419 436 521 510 3 512 522 514 6 512 522 524 523 437 425 5 523 525 516 427 437 4 438 430 518 526 5 519 527 526 438 433 4 439 435 520 528 4 439 436 521 528 3 523 529 524 3 523 529 525 4 441 442 531 530 4 441 443 532 530 4 444 445 534 533 4 444 446 535 533 4 448 449 537 536 4 448 442 531 536 4 443 450 538 532 4 451 452 540 539 4 451 453 541 539 4 445 454 542 534 4 446 455 543 535 4 449 457 544 537 4 450 458 545 538 4 452 459 546 540 4 460 453 541 547 4 460 461 548 547 3 549 550 551 5 549 462 454 542 550 5 552 463 455 543 553 3 552 553 554 4 457 465 555 544 4 458 467 556 545 4 459 468 557 546 4 461 470 558 548 3 549 559 551 5 549 462 471 560 559 5 552 463 472 562 561 3 552 561 554 5 563 564 555 465 473 4 563 473 474 565 5 565 566 556 467 474 4 468 476 567 557 4 470 478 568 558 4 471 480 569 560 4 472 481 570 562 3 563 571 564 4 563 571 572 565 3 565 572 566 5 573 574 567 476 482 5 573 576 575 483 482 4 483 478 568 575 4 484 480 569 577 4 484 481 570 577 3 573 578 574 3 573 578 576 4 487 488 580 579 4 487 489 581 579 4 490 491 583 582 4 490 492 584 582 4 494 495 586 585 4 494 496 587 585 4 488 497 588 580 4 498 489 581 589 4 491 499 590 583 4 492 500 591 584 4 502 503 593 592 4 502 495 586 592 4 496 504 594 587 4 497 505 595 588 3 596 506 507 5 596 597 598 508 506 5 599 600 601 510 509 3 599 509 511 4 513 514 603 602 4 515 516 605 604 4 517 518 607 606 4 508 520 608 598 4 510 521 609 601 5 610 611 603 514 522 3 610 522 524 4 516 525 612 605 4 526 518 607 613 4 526 527 614 613 4 528 520 608 615 4 528 521 609 615 3 610 616 611 5 610 524 529 617 616 4 529 525 612 617 3 618 530 531 3 618 530 532 4 533 534 620 619 4 533 535 621 619 4 536 537 623 622 5 618 624 622 536 531 5 618 532 538 625 624 4 539 540 627 626 4 539 541 628 626 4 534 542 629 620 4 535 543 630 621 4 537 544 631 623 4 538 545 632 625 4 540 546 633 627 4 547 541 628 634 4 547 548 635 634 4 550 551 637 636 4 550 542 629 636 5 638 639 630 543 553 3 638 553 554 4 544 555 640 631 4 545 556 641 632 4 546 557 642 633 4 548 558 643 635 4 559 551 637 644 4 559 560 645 644 5 638 639 646 562 561 3 638 561 554 4 555 564 647 640 4 556 566 648 641 4 557 567 649 642 4 558 568 650 643 4 560 569 651 645 4 562 570 652 646 4 571 564 647 653 5 654 655 653 571 572 5 654 656 648 566 572 4 567 574 657 649 3 658 575 576 5 658 659 650 568 575 4 577 569 651 660 4 577 570 652 660 3 654 661 655 3 654 661 656 4 578 574 657 662 5 658 663 662 578 576 3 658 663 659 3 664 579 580 3 664 579 581 4 582 583 666 665 4 582 584 667 665 3 668 585 586 3 668 585 587 5 664 580 588 670 669 5 664 581 589 671 669 4 583 590 672 666 4 584 591 673 667 4 592 593 675 674 5 668 676 674 592 586 5 668 587 594 677 676 4 588 595 678 670 4 597 598 680 679 4 600 601 682 681 4 602 603 684 683 4 604 605 686 685 4 606 607 688 687 4 598 608 689 680 4 601 609 690 682 4 603 611 691 684 4 605 612 692 686 5 693 694 688 607 613 5 693 696 695 614 613 4 615 608 689 697 4 615 609 690 697 4 616 611 691 698 5 699 700 698 616 617 5 699 701 692 612 617 3 693 702 694 3 693 702 696 3 699 703 700 3 699 703 701 3 704 619 620 3 704 619 621 4 622 623 706 705 4 622 624 707 705 4 624 625 708 707 3 709 626 627 3 709 626 628 5 704 620 629 711 710 5 704 621 630 712 710 4 623 631 713 706 4 625 632 714 708 5 709 627 633 716 715 5 709 628 634 717 715 4 634 635 718 717 3 719 636 637 5 719 720 711 629 636 4 630 639 721 712 4 631 640 722 713 4 632 641 723 714 4 633 642 724 716 4 635 643 725 718 3 719 644 637 5 719 720 726 645 644 4 639 646 727 721 4 640 647 728 722 4 641 648 729 723 4 642 649 730 724 4 643 650 731 725 4 645 651 732 726 4 646 652 733 727 4 653 647 728 734 4 653 655 735 734 4 648 656 736 729 4 649 657 737 730 4 650 659 738 731 4 660 651 732 739 4 660 652 733 739 4 661 655 735 740 4 661 656 736 740 4 662 657 737 741 4 662 663 742 741 4 663 659 738 742 3 743 665 666 3 743 665 667 4 669 670 745 744 5 746 747 744 669 671 5 743 666 672 749 748 5 743 667 673 750 748 4 674 675 752 751 4 674 676 753 751 4 676 677 754 753 4 670 678 755 745 3 746 756 747 4 679 680 758 757 4 681 682 760 759 4 683 684 762 761 4 685 686 764 763 4 687 688 766 765 4 680 689 767 758 4 682 690 768 760 4 684 691 769 762 4 686 692 770 764 4 688 694 771 766 4 695 696 773 772 4 697 689 767 774 4 697 690 768 774 4 698 691 769 775 4 698 700 776 775 4 692 701 777 770 4 702 694 771 778 4 702 696 773 778 4 703 700 776 779 4 703 701 777 779 3 780 705 706 4 780 705 707 781 3 781 707 708 3 782 710 711 3 782 710 712 5 780 706 713 784 783 4 780 783 785 781 5 781 708 714 786 785 3 787 715 716 4 787 715 717 788 3 788 717 718 5 782 711 720 790 789 5 782 712 721 791 789 4 713 722 792 784 4 714 723 793 786 5 787 716 724 795 794 4 787 794 796 788 5 788 718 725 797 796 4 720 726 798 790 4 721 727 799 791 4 722 728 800 792 4 723 729 801 793 4 724 730 802 795 4 725 731 803 797 4 726 732 804 798 4 727 733 805 799 4 734 728 800 806 4 734 735 807 806 4 729 736 808 801 4 730 737 809 802 4 731 738 810 803 4 739 732 804 811 4 739 733 805 811 4 740 735 807 812 4 740 736 808 812 4 741 737 809 813 4 741 742 814 813 4 742 738 810 814 3 815 744 745 3 815 744 747 3 816 748 749 3 816 748 750 3 817 751 752 4 817 751 753 818 3 818 753 754 5 815 745 755 820 819 6 815 819 822 821 756 747 3 823 824 825 3 823 824 826 4 827 757 758 828 4 827 759 760 828 4 829 761 762 830 5 829 831 832 833 830 5 831 763 764 834 832 4 765 766 836 835 4 837 839 840 838 4 828 758 767 841 4 828 760 768 841 4 830 762 769 842 4 830 833 843 842 4 764 770 844 834 5 845 771 766 836 846 6 845 846 840 838 772 773 3 841 774 767 3 841 774 768 3 842 775 769 5 842 843 847 776 775 4 770 777 848 844 3 845 778 771 3 845 778 773 4 779 776 847 849 4 779 777 848 849 3 850 783 784 4 850 783 785 851 3 851 785 786 3 852 789 790 3 852 789 791 5 850 784 792 854 853 4 850 853 855 851 5 851 786 793 856 855 3 857 794 795 4 857 794 796 858 3 858 796 797 4 852 790 798 859 4 852 791 799 859 4 792 800 860 854 4 793 801 861 856 5 857 795 802 863 862 5 857 862 865 864 858 4 858 797 803 864 4 859 798 804 866 4 859 799 805 866 4 806 800 860 867 4 806 807 868 867 4 801 808 869 861 4 802 809 870 863 4 864 865 872 871 4 864 803 810 871 3 866 811 804 3 866 811 805 4 812 807 868 873 4 812 808 869 873 4 813 809 870 874 5 871 872 874 813 814 3 871 814 810 3 875 876 877 3 875 876 878 3 879 880 881 3 879 880 882 4 875 877 884 883 4 875 878 885 883 4 879 881 887 886 5 879 882 889 888 886 3 883 890 884 3 883 890 885 4 886 887 892 891 4 886 888 893 891 3 891 894 892 4 891 894 895 893 3 896 897 898 3 896 897 899 4 896 898 901 900 4 896 899 902 900 3 903 904 905 3 903 904 906 4 900 901 908 907 4 900 902 909 907 3 910 819 820 3 910 819 822 3 911 912 913 6 911 912 915 914 824 825 5 914 917 916 826 824 3 918 919 920 4 918 919 922 921 3 921 922 923 3 924 832 833 3 924 832 834 3 925 926 927 3 925 926 928 4 929 835 836 930 4 929 839 840 930 3 914 931 915 3 914 931 917 4 924 833 843 932 4 924 834 844 932 3 930 846 836 3 930 846 840 4 932 843 847 933 4 932 844 848 933 3 933 849 847 3 933 849 848 3 934 853 854 4 934 853 855 935 3 935 855 856 4 934 854 860 936 4 934 935 937 936 4 935 856 861 937 3 938 862 863 3 938 862 865 3 936 867 860 5 936 867 868 939 937 4 937 861 869 939 4 938 863 870 940 4 938 865 872 940 3 939 873 868 3 939 873 869 3 940 874 870 3 940 874 872 3 941 942 943 5 941 877 876 944 942 4 876 878 945 944 4 880 881 947 946 4 880 882 948 946 3 949 950 951 3 949 950 952 4 941 943 954 953 4 941 877 884 953 4 878 885 955 945 4 881 887 956 947 4 889 882 948 957 4 949 951 959 958 4 949 952 960 958 4 953 954 962 961 5 953 884 890 963 961 5 963 964 955 885 890 4 887 892 965 956 4 958 959 967 966 4 958 960 968 966 3 961 969 962 4 961 969 970 963 3 963 970 964 5 971 972 965 892 894 4 971 894 895 973 3 966 974 967 3 966 974 968 3 971 975 972 4 971 975 976 973 4 897 898 978 977 4 897 899 979 977 3 980 981 982 3 980 981 983 4 898 901 984 978 5 985 902 899 979 986 3 985 986 987 3 988 989 990 3 988 989 991 3 992 993 994 6 992 993 982 980 904 905 5 980 983 995 906 904 4 901 908 996 984 4 985 902 909 997 4 985 987 998 997 4 988 990 1000 999 4 988 991 1001 999 5 1002 1004 1003 913 912 3 1002 912 915 4 916 917 1006 1005 5 1007 1009 1008 920 919 4 1007 919 922 1010 5 1010 1012 1011 923 922 5 1013 1015 1014 927 926 5 1013 1017 1016 928 926 3 1002 1018 1004 6 1002 1018 1020 1019 931 915 5 1019 1021 1006 917 931 3 1007 1022 1009 4 1007 1022 1023 1010 3 1010 1023 1012 3 1013 1024 1015 3 1013 1024 1017 3 1019 1025 1020 3 1019 1025 1021 4 942 943 1027 1026 4 942 944 1028 1026 4 944 945 1029 1028 4 946 947 1031 1030 4 946 948 1032 1030 4 950 951 1034 1033 4 950 952 1035 1033 4 943 954 1036 1027 4 945 955 1037 1029 4 947 956 1038 1031 4 957 948 1032 1039 4 951 959 1040 1034 4 952 960 1041 1035 4 954 962 1042 1036 4 955 964 1043 1037 4 956 965 1044 1038 4 959 967 1045 1040 4 960 968 1046 1041 5 1047 1048 1042 962 969 4 1047 969 970 1049 5 1049 1050 1043 964 970 4 965 972 1051 1044 5 1052 1053 1045 967 974 5 1052 1054 1046 968 974 3 1047 1055 1048 4 1047 1055 1056 1049 3 1049 1056 1050 5 1057 1058 1051 972 975 4 1057 975 976 1059 3 1052 1060 1053 3 1052 1060 1054 3 1057 1061 1058 4 1057 1061 1062 1059 4 977 978 1064 1063 4 977 979 1065 1063 4 981 982 1067 1066 4 981 983 1068 1066 4 978 984 1069 1064 4 986 979 1065 1070 4 986 987 1071 1070 4 989 990 1073 1072 4 989 991 1074 1072 4 993 994 1076 1075 4 993 982 1067 1075 4 983 995 1077 1068 4 984 996 1078 1069 4 987 998 1079 1071 4 990 1000 1080 1073 4 991 1001 1081 1074 4 1003 1004 1083 1082 4 1005 1006 1085 1084 4 1008 1009 1087 1086 4 1011 1012 1089 1088 4 1014 1015 1091 1090 4 1016 1017 1093 1092 5 1094 1095 1083 1004 1018 3 1094 1018 1020 4 1006 1021 1096 1085 4 1022 1009 1087 1097 4 1022 1023 1098 1097 4 1023 1012 1089 1098 5 1099 1100 1091 1015 1024 5 1099 1101 1093 1017 1024 3 1094 1102 1095 5 1094 1020 1025 1103 1102 4 1025 1021 1096 1103 3 1099 1104 1100 3 1099 1104 1101 4 1026 1027 1106 1105 4 1026 1028 1107 1105 4 1028 1029 1108 1107 4 1030 1031 1110 1109 4 1030 1032 1111 1109 4 1033 1034 1113 1112 4 1033 1035 1114 1112 4 1027 1036 1115 1106 4 1029 1037 1116 1108 4 1031 1038 1117 1110 4 1039 1032 1111 1118 4 1034 1040 1119 1113 4 1035 1041 1120 1114 4 1036 1042 1121 1115 4 1037 1043 1122 1116 4 1038 1044 1123 1117 4 1040 1045 1124 1119 5 1125 1046 1041 1120 1126 3 1125 1126 1127 4 1042 1048 1128 1121 4 1043 1050 1129 1122 4 1044 1051 1130 1123 4 1045 1053 1131 1124 5 1125 1046 1054 1133 1132 3 1125 1132 1127 4 1055 1048 1128 1134 5 1135 1136 1134 1055 1056 5 1135 1137 1129 1050 1056 4 1051 1058 1138 1130 5 1139 1140 1131 1053 1060 5 1139 1141 1133 1054 1060 3 1135 1142 1136 3 1135 1142 1137 4 1061 1058 1138 1143 4 1061 1062 1144 1143 3 1139 1145 1140 3 1139 1145 1141 3 1146 1063 1064 3 1146 1063 1065 3 1147 1066 1067 3 1147 1066 1068 5 1146 1064 1069 1149 1148 5 1146 1065 1070 1150 1148 4 1070 1071 1151 1150 4 1072 1073 1153 1152 4 1072 1074 1154 1152 4 1075 1076 1156 1155 5 1147 1157 1155 1075 1067 5 1147 1068 1077 1158 1157 4 1069 1078 1159 1149 4 1071 1079 1160 1151 4 1073 1080 1161 1153 4 1074 1081 1162 1154 4 1082 1083 1164 1163 4 1084 1085 1166 1165 4 1086 1087 1168 1167 4 1088 1089 1170 1169 3 1171 1172 1173 5 1171 1090 1091 1174 1172 5 1175 1092 1093 1177 1176 3 1175 1176 1178 4 1083 1095 1179 1164 4 1085 1096 1180 1166 5 1181 1182 1168 1087 1097 5 1181 1184 1183 1098 1097 4 1098 1089 1170 1183 4 1091 1100 1185 1174 4 1093 1101 1186 1177 4 1102 1095 1179 1187 5 1188 1189 1187 1102 1103 5 1188 1190 1180 1096 1103 3 1181 1191 1182 3 1181 1191 1184 4 1104 1100 1185 1192 4 1104 1101 1186 1192 3 1188 1193 1189 3 1188 1193 1190 3 1194 1105 1106 5 1194 1196 1195 1107 1105 4 1107 1108 1197 1195 3 1198 1109 1110 3 1198 1109 1111 4 1112 1113 1200 1199 4 1112 1114 1201 1199 5 1194 1106 1115 1203 1202 3 1194 1202 1196 4 1108 1116 1204 1197 5 1198 1110 1117 1206 1205 5 1198 1111 1118 1207 1205 4 1113 1119 1208 1200 4 1114 1120 1209 1201 4 1115 1121 1210 1203 4 1116 1122 1211 1204 4 1117 1123 1212 1206 3 1213 1214 1215 5 1213 1124 1119 1208 1214 4 1126 1120 1209 1216 4 1126 1127 1217 1216 4 1121 1128 1218 1210 4 1122 1129 1219 1211 4 1123 1130 1220 1212 3 1213 1221 1215 5 1213 1124 1131 1222 1221 4 1132 1133 1224 1223 4 1132 1127 1217 1223 4 1134 1128 1218 1225 4 1134 1136 1226 1225 4 1129 1137 1227 1219 4 1130 1138 1228 1220 4 1131 1140 1229 1222 4 1133 1141 1230 1224 4 1142 1136 1226 1231 4 1142 1137 1227 1231 5 1232 1233 1228 1138 1143 5 1232 1235 1234 1144 1143 4 1145 1140 1229 1236 4 1145 1141 1230 1236 3 1232 1237 1233 3 1232 1237 1235 4 1148 1149 1239 1238 5 1240 1241 1238 1148 1150 3 1240 1150 1151 4 1152 1153 1243 1242 4 1152 1154 1244 1242 4 1155 1156 1246 1245 4 1155 1157 1247 1245 4 1157 1158 1248 1247 4 1149 1159 1249 1239 3 1240 1250 1241 5 1240 1151 1160 1251 1250 4 1153 1161 1252 1243 4 1154 1162 1253 1244 4 1163 1164 1255 1254 4 1165 1166 1257 1256 4 1167 1168 1259 1258 4 1169 1170 1261 1260 4 1172 1173 1263 1262 4 1172 1174 1264 1262 4 1176 1177 1266 1265 4 1176 1178 1267 1265 4 1164 1179 1268 1255 4 1166 1180 1269 1257 4 1168 1182 1270 1259 4 1183 1184 1272 1271 4 1183 1170 1261 1271 4 1174 1185 1273 1264 4 1177 1186 1274 1266 4 1187 1179 1268 1275 4 1187 1189 1276 1275 4 1180 1190 1277 1269 4 1191 1182 1270 1278 4 1191 1184 1272 1278 4 1192 1185 1273 1279 4 1192 1186 1274 1279 4 1193 1189 1276 1280 4 1193 1190 1277 1280 3 1281 1195 1196 3 1281 1195 1197 4 1199 1200 1283 1282 4 1199 1201 1284 1282 4 1202 1203 1286 1285 5 1281 1287 1285 1202 1196 5 1281 1197 1204 1288 1287 3 1289 1205 1206 4 1289 1205 1207 1290 4 1200 1208 1291 1283 4 1201 1209 1292 1284 4 1203 1210 1293 1286 4 1204 1211 1294 1288 5 1289 1206 1212 1296 1295 4 1289 1295 1297 1290 3 1298 1214 1215 5 1298 1299 1291 1208 1214 5 1300 1301 1292 1209 1216 3 1300 1216 1217 4 1210 1218 1302 1293 4 1211 1219 1303 1294 4 1212 1220 1304 1296 3 1298 1221 1215 5 1298 1299 1305 1222 1221 5 1300 1301 1306 1224 1223 3 1300 1223 1217 4 1225 1218 1302 1307 4 1225 1226 1308 1307 4 1219 1227 1309 1303 4 1220 1228 1310 1304 4 1222 1229 1311 1305 4 1224 1230 1312 1306 4 1231 1226 1308 1313 4 1231 1227 1309 1313 4 1228 1233 1314 1310 4 1234 1235 1316 1315 4 1236 1229 1311 1317 4 1236 1230 1312 1317 4 1237 1233 1314 1318 4 1237 1235 1316 1318 3 1319 1238 1239 3 1319 1238 1241 4 1242 1243 1321 1320 4 1242 1244 1322 1320 3 1323 1245 1246 5 1323 1325 1324 1247 1245 4 1247 1248 1326 1324 5 1319 1239 1249 1328 1327 6 1319 1327 1330 1329 1250 1241 3 1329 1250 1251 4 1243 1252 1331 1321 4 1244 1253 1332 1322 5 1333 1254 1255 1335 1334 3 1333 1334 1336 4 1256 1257 1338 1337 4 1258 1259 1340 1339 4 1341 1343 1344 1342 4 1341 1260 1261 1342 3 1345 1262 1263 5 1345 1346 1347 1264 1262 5 1348 1349 1350 1266 1265 3 1348 1265 1267 4 1255 1268 1351 1335 4 1257 1269 1352 1338 5 1353 1270 1259 1340 1354 6 1353 1354 1344 1342 1271 1272 3 1342 1271 1261 4 1264 1273 1355 1347 4 1266 1274 1356 1350 4 1275 1268 1351 1357 4 1275 1276 1358 1357 4 1269 1277 1359 1352 3 1353 1278 1270 3 1353 1278 1272 4 1279 1273 1355 1360 4 1279 1274 1356 1360 4 1280 1276 1358 1361 4 1280 1277 1359 1361 3 1362 1363 1364 3 1362 1363 1365 4 1362 1364 1367 1366 4 1362 1365 1368 1366 3 1366 1369 1367 3 1366 1369 1368 3 1370 1282 1283 3 1370 1282 1284 3 1371 1285 1286 4 1371 1285 1287 1372 3 1372 1287 1288 5 1370 1283 1291 1374 1373 5 1370 1284 1292 1375 1373 4 1371 1286 1293 1376 5 1371 1372 1377 1378 1376 5 1372 1288 1294 1379 1377 3 1380 1295 1296 4 1380 1295 1297 1381 4 1291 1299 1382 1374 4 1292 1301 1383 1375 5 1376 1293 1302 1385 1384 3 1376 1384 1378 4 1294 1303 1386 1379 5 1380 1296 1304 1388 1387 5 1380 1387 1390 1389 1381 4 1299 1305 1391 1382 4 1301 1306 1392 1383 4 1307 1302 1385 1393 4 1307 1308 1394 1393 4 1303 1309 1395 1386 4 1304 1310 1396 1388 4 1389 1390 1398 1397 4 1305 1311 1399 1391 4 1306 1312 1400 1392 4 1313 1308 1394 1401 4 1313 1309 1395 1401 5 1402 1314 1310 1396 1403 6 1402 1403 1398 1397 1315 1316 4 1317 1311 1399 1404 4 1317 1312 1400 1404 3 1402 1318 1314 3 1402 1318 1316 3 1405 1320 1321 3 1405 1320 1322 3 1406 1324 1325 3 1406 1324 1326 3 1407 1327 1328 3 1407 1327 1330 5 1405 1321 1331 1409 1408 5 1405 1322 1332 1410 1408 3 1411 1334 1335 5 1411 1413 1412 1336 1334 4 1412 1337 1338 1413 4 1414 1339 1340 1415 4 1414 1343 1344 1415 4 1346 1347 1417 1416 4 1349 1350 1419 1418 4 1411 1335 1351 1420 4 1411 1413 1421 1420 4 1413 1338 1352 1421 3 1415 1354 1340 3 1415 1354 1344 4 1347 1355 1422 1417 4 1350 1356 1423 1419 3 1420 1357 1351 5 1420 1357 1358 1424 1421 4 1421 1352 1359 1424 4 1360 1355 1422 1425 4 1360 1356 1423 1425 3 1424 1361 1358 3 1424 1361 1359 3 1426 1427 1428 3 1426 1427 1429 4 1426 1428 1431 1430 4 1426 1429 1432 1430 3 1433 1434 1435 5 1433 1364 1363 1436 1434 4 1363 1365 1437 1436 4 1430 1431 1439 1438 4 1430 1432 1440 1438 4 1433 1435 1442 1441 4 1433 1364 1367 1441 4 1365 1368 1443 1437 3 1444 1445 1446 3 1444 1445 1447 3 1438 1448 1439 3 1438 1448 1440 4 1441 1442 1450 1449 5 1441 1367 1369 1451 1449 5 1451 1452 1443 1368 1369 3 1444 1453 1446 3 1444 1453 1447 3 1449 1454 1450 4 1449 1454 1455 1451 3 1451 1455 1452 3 1456 1457 1458 4 1456 1457 1460 1459 3 1459 1460 1461 4 1456 1458 1463 1462 4 1456 1459 1464 1462 4 1459 1461 1465 1464 3 1466 1467 1468 3 1466 1467 1469 3 1462 1470 1463 5 1462 1470 1472 1471 1464 4 1464 1465 1473 1471 3 1474 1373 1374 3 1474 1373 1375 3 1475 1377 1378 3 1475 1377 1379 4 1466 1468 1477 1476 4 1466 1469 1478 1476 3 1471 1479 1472 3 1471 1479 1473 5 1474 1374 1382 1481 1480 5 1474 1375 1383 1482 1480 3 1483 1384 1385 5 1483 1484 1475 1378 1384 4 1475 1379 1386 1484 4 1476 1477 1486 1485 4 1476 1478 1487 1485 3 1488 1387 1388 3 1488 1387 1390 4 1382 1391 1489 1481 4 1383 1392 1490 1482 3 1483 1393 1385 5 1483 1393 1394 1491 1484 4 1484 1386 1395 1491 3 1485 1492 1486 3 1485 1492 1487 4 1488 1388 1396 1493 4 1488 1390 1398 1493 4 1391 1399 1494 1489 4 1392 1400 1495 1490 3 1491 1401 1394 3 1491 1401 1395 3 1493 1403 1396 3 1493 1403 1398 4 1404 1399 1494 1496 4 1404 1400 1495 1496 3 1497 1408 1409 3 1497 1408 1410 4 1498 1416 1417 1499 4 1498 1418 1419 1499 4 1499 1417 1422 1500 4 1499 1419 1423 1500 3 1500 1425 1422 3 1500 1425 1423 4 1427 1428 1502 1501 4 1427 1429 1503 1501 3 1504 1505 1506 3 1504 1505 1507 4 1428 1431 1508 1502 4 1429 1432 1509 1503 4 1434 1435 1511 1510 5 1504 1506 1510 1434 1436 5 1504 1507 1512 1437 1436 3 1513 1514 1515 3 1513 1514 1516 4 1431 1439 1517 1508 4 1432 1440 1518 1509 4 1435 1442 1519 1511 4 1437 1443 1520 1512 5 1513 1515 1521 1446 1445 6 1513 1445 1447 1522 1523 1516 5 1524 1525 1517 1439 1448 5 1524 1526 1518 1440 1448 4 1442 1450 1527 1519 4 1443 1452 1528 1520 5 1529 1530 1521 1446 1453 5 1529 1531 1522 1447 1453 3 1524 1532 1525 3 1524 1532 1526 4 1454 1450 1527 1533 5 1534 1535 1533 1454 1455 5 1534 1536 1528 1452 1455 4 1529 1530 1538 1537 5 1529 1531 1539 1540 1537 3 1534 1541 1535 3 1534 1541 1536 3 1537 1542 1538 3 1537 1542 1540 4 1457 1458 1544 1543 4 1457 1460 1545 1543 4 1460 1461 1546 1545 3 1547 1548 1549 3 1547 1548 1550 3 1551 1552 1553 3 1551 1552 1554 4 1458 1463 1555 1544 4 1461 1465 1556 1546 4 1547 1549 1558 1557 5 1547 1550 1560 1559 1557 3 1559 1560 1561 5 1551 1553 1562 1468 1467 5 1551 1554 1563 1469 1467 5 1564 1565 1555 1463 1470 3 1564 1470 1472 4 1465 1473 1566 1556 4 1557 1558 1568 1567 4 1557 1559 1569 1567 4 1559 1561 1570 1569 4 1468 1477 1571 1562 4 1469 1478 1572 1563 3 1564 1573 1565 6 1564 1573 1575 1574 1479 1472 5 1574 1576 1566 1473 1479 3 1577 1480 1481 3 1577 1480 1482 4 1567 1568 1579 1578 5 1567 1569 1580 1581 1578 3 1569 1580 1570 4 1477 1486 1582 1571 4 1478 1487 1583 1572 3 1574 1584 1575 3 1574 1584 1576 4 1577 1481 1489 1585 4 1577 1482 1490 1585 3 1578 1586 1579 3 1578 1586 1581 5 1587 1588 1582 1486 1492 5 1587 1589 1583 1487 1492 4 1585 1489 1494 1590 4 1585 1490 1495 1590 3 1587 1591 1588 3 1587 1591 1589 3 1590 1496 1494 3 1590 1496 1495 4 1501 1502 1593 1592 4 1501 1503 1594 1592 3 1595 1505 1506 3 1595 1505 1507 4 1502 1508 1596 1593 4 1503 1509 1597 1594 4 1510 1511 1599 1598 5 1595 1600 1598 1510 1506 5 1595 1507 1512 1601 1600 4 1514 1515 1603 1602 4 1514 1516 1604 1602 3 1605 1606 1607 5 1605 1517 1508 1596 1606 4 1509 1518 1608 1597 4 1511 1519 1609 1599 4 1512 1520 1610 1601 4 1515 1521 1611 1603 4 1523 1516 1604 1612 3 1605 1613 1607 5 1605 1517 1525 1614 1613 4 1518 1526 1615 1608 4 1519 1527 1616 1609 4 1520 1528 1617 1610 4 1521 1530 1618 1611 5 1619 1620 1614 1525 1532 5 1619 1621 1615 1526 1532 5 1622 1623 1616 1527 1533 3 1622 1533 1535 4 1528 1536 1624 1617 4 1530 1538 1625 1618 3 1626 1539 1540 3 1619 1627 1620 3 1619 1627 1621 3 1622 1628 1623 5 1622 1535 1541 1629 1628 4 1541 1536 1624 1629 4 1542 1538 1625 1630 5 1626 1631 1630 1542 1540 4 1543 1544 1633 1632 4 1543 1545 1634 1632 4 1545 1546 1635 1634 4 1548 1549 1637 1636 4 1548 1550 1638 1636 3 1639 1552 1553 3 1639 1552 1554 4 1544 1555 1640 1633 4 1546 1556 1641 1635 4 1549 1558 1642 1637 4 1560 1550 1638 1643 4 1560 1561 1644 1643 5 1639 1553 1562 1646 1645 5 1639 1554 1563 1647 1645 4 1555 1565 1648 1640 4 1556 1566 1649 1641 4 1558 1568 1650 1642 4 1561 1570 1651 1644 4 1562 1571 1652 1646 4 1563 1572 1653 1647 5 1654 1655 1648 1565 1573 3 1654 1573 1575 4 1566 1576 1656 1649 4 1568 1579 1657 1650 3 1658 1580 1581 5 1658 1659 1651 1570 1580 4 1571 1582 1660 1652 4 1572 1583 1661 1653 3 1654 1662 1655 6 1654 1662 1664 1663 1584 1575 5 1663 1665 1656 1576 1584 5 1666 1667 1657 1579 1586 6 1666 1586 1581 1658 1668 1669 3 1658 1668 1659 4 1582 1588 1670 1660 4 1583 1589 1671 1661 3 1663 1672 1664 3 1663 1672 1665 3 1666 1673 1667 3 1666 1673 1669 5 1674 1675 1670 1588 1591 5 1674 1676 1671 1589 1591 3 1674 1677 1675 3 1674 1677 1676 -0.420 0.841 3.419 0.172 0.985 -0.001 -0.279 0.991 3.419 0.103 0.995 -0.002 -0.501 1.002 2.993 0.153 0.967 0.206 -0.284 1.002 3.388 0.103 0.995 0.004 -0.501 1.002 3.841 0.149 0.967 -0.206 -0.284 1.002 3.449 0.103 0.995 -0.009 -0.626 1.252 2.756 -0.010 0.316 0.949 -0.409 1.252 2.822 -0.353 0.589 0.727 -0.626 1.252 4.076 -0.020 0.293 -0.956 -0.409 1.252 4.010 -0.368 0.591 -0.717 -0.533 1.066 8.205 0.017 0.997 -0.079 -0.407 1.248 8.205 -0.080 0.993 -0.083 -0.626 1.252 7.522 0.035 0.923 0.384 -0.409 1.252 8.190 -0.080 0.994 -0.077 -0.626 1.252 8.583 -0.074 0.951 -0.301 -0.409 1.252 8.213 -0.080 0.993 -0.085 -0.556 1.111 12.307 0.255 0.886 0.386 -0.396 1.226 12.307 0.156 0.927 0.342 -0.626 1.252 12.022 0.251 0.853 0.458 -0.409 1.252 12.254 0.160 0.924 0.348 -0.626 1.252 12.855 0.259 0.839 -0.478 -0.409 1.252 12.412 0.163 0.955 0.250 -0.588 1.503 2.735 -0.245 0.131 0.961 -0.680 1.361 2.735 -0.031 0.276 0.961 -0.751 1.503 2.638 -0.174 0.106 0.979 -0.535 1.503 2.745 -0.247 0.142 0.958 -0.631 1.503 4.102 -0.198 0.125 -0.972 -0.702 1.404 4.102 -0.025 0.216 -0.976 -0.535 1.503 4.088 -0.224 0.156 -0.962 -0.751 1.503 4.165 -0.078 0.064 -0.995 -0.626 1.253 7.521 0.035 0.922 0.386 -0.480 1.394 7.521 -0.356 0.801 0.481 -0.751 1.503 7.106 -0.305 0.581 0.755 -0.535 1.503 7.339 -0.414 0.719 0.558 -0.751 1.503 8.781 -0.195 0.341 -0.920 -0.535 1.503 8.678 -0.535 0.665 -0.522 -0.751 1.503 11.748 0.166 0.323 0.932 -0.535 1.503 11.790 -0.176 0.498 0.849 -0.640 1.280 12.991 0.197 0.619 -0.760 -0.457 1.347 12.991 0.002 0.595 -0.804 -0.856 1.711 2.735 -0.101 -0.283 0.954 -0.877 1.753 2.741 -0.087 -0.310 0.947 -0.660 1.753 2.750 -0.268 -0.195 0.943 -0.814 1.627 4.102 -0.025 -0.199 -0.980 -0.877 1.753 4.083 0.023 -0.291 -0.957 -0.660 1.753 4.086 -0.214 -0.174 -0.961 -0.877 1.753 7.035 -0.369 -0.057 0.928 -0.660 1.753 7.137 -0.673 0.157 0.722 -0.877 1.753 8.797 0.053 -0.048 -0.997 -0.660 1.753 8.767 -0.572 0.100 -0.814 -0.877 1.753 11.720 0.101 0.024 0.995 -0.660 1.753 11.721 0.082 0.138 0.987 -1.002 2.004 2.894 -0.059 -0.886 0.459 -0.785 2.004 2.849 -0.385 -0.679 0.626 -1.002 2.004 3.932 0.033 -0.890 -0.454 -0.785 2.004 3.994 -0.318 -0.675 -0.665 -1.002 2.004 7.145 -0.303 -0.659 0.688 -0.785 2.004 7.190 -0.661 -0.394 0.639 -1.002 2.004 8.762 -0.184 -0.492 -0.851 -0.785 2.004 8.736 -0.648 -0.391 -0.654 -1.002 2.004 11.738 0.021 -0.291 0.956 -0.785 2.004 11.719 0.021 -0.168 0.986 -1.106 2.212 3.419 -0.150 -0.989 -0.003 -0.908 2.249 3.419 -0.378 -0.926 0.006 -1.114 2.228 7.521 -0.268 -0.898 0.347 -0.905 2.244 7.521 -0.521 -0.775 0.357 -1.127 2.254 7.692 -0.272 -0.951 0.148 -0.910 2.254 7.565 -0.518 -0.805 0.290 -1.127 2.254 8.414 -0.292 -0.946 -0.139 -0.910 2.254 8.460 -0.566 -0.805 -0.179 -1.127 2.254 11.995 0.078 -0.879 0.470 -0.910 2.254 11.841 -0.111 -0.696 0.710 -1.174 2.348 8.205 -0.279 -0.957 -0.085 -0.973 2.379 8.205 -0.529 -0.843 -0.100 -1.199 2.397 12.307 0.021 -0.928 0.373 -1.019 2.471 12.307 -0.224 -0.908 0.353 -1.136 2.272 12.991 -0.011 -0.718 -0.695 -0.970 2.374 12.991 -0.177 -0.644 -0.744 -1.352 2.755 0.684 0.071 0.719 0.691 -1.369 2.738 0.684 0.079 0.716 0.693 -1.378 2.755 0.649 0.079 0.710 0.700 -1.197 2.755 1.367 -0.004 0.994 -0.109 -1.306 2.612 1.367 0.050 0.994 -0.096 -1.378 2.755 1.680 0.015 0.975 -0.220 -1.204 2.755 5.470 0.229 0.970 0.078 -1.331 2.662 5.470 0.289 0.954 0.085 -1.378 2.755 5.261 0.302 0.943 0.138 -1.378 2.755 5.983 0.287 0.947 -0.148 -1.214 2.862 0.684 -0.148 0.619 0.771 -1.503 3.006 0.261 -0.130 0.370 0.920 -1.286 3.006 0.446 -0.189 0.477 0.858 -1.171 2.776 1.367 -0.095 0.988 -0.119 -1.503 3.006 1.937 -0.262 0.375 -0.889 -1.286 3.006 1.813 -0.466 0.748 -0.473 -1.166 2.766 5.470 0.172 0.982 0.081 -1.503 3.006 4.913 0.223 0.488 0.844 -1.286 3.006 4.960 -0.152 0.757 0.636 -1.391 2.781 6.154 0.271 0.898 -0.347 -1.209 2.851 6.154 0.038 0.924 -0.379 -1.503 3.006 6.530 0.242 0.671 -0.701 -1.286 3.006 6.434 -0.009 0.835 -0.549 -1.399 2.797 10.256 0.182 0.983 0.003 -1.233 2.900 10.256 0.074 0.997 0.012 -1.503 3.006 9.743 -0.010 0.891 0.454 -1.286 3.006 9.994 0.060 0.993 0.101 -1.503 3.006 10.780 0.081 0.885 -0.459 -1.286 3.006 10.544 0.079 0.993 -0.092 -1.628 3.256 0.190 -0.178 -0.038 0.983 -1.411 3.256 0.271 -0.374 0.081 0.924 -1.628 3.256 1.955 0.093 -0.031 -0.995 -1.411 3.256 1.927 -0.555 0.150 -0.819 -1.628 3.256 4.878 0.219 0.047 0.975 -1.411 3.256 4.872 0.085 0.161 0.983 -1.628 3.256 6.639 0.321 0.058 -0.945 -1.411 3.256 6.634 -0.200 0.297 -0.934 -1.628 3.256 9.592 0.015 0.291 0.957 -1.411 3.256 9.639 -0.300 0.448 0.842 -1.628 3.256 10.934 0.096 0.309 -0.946 -1.411 3.256 10.900 -0.153 0.427 -0.891 -1.753 3.507 0.297 -0.192 -0.428 0.883 -1.536 3.507 0.331 -0.402 -0.280 0.872 -1.753 3.507 1.927 -0.124 -0.439 -0.890 -1.536 3.507 1.905 -0.625 -0.350 -0.698 -1.753 3.507 4.894 -0.063 -0.347 0.936 -1.536 3.507 4.879 0.070 -0.231 0.970 -1.753 3.507 6.568 0.316 -0.578 -0.752 -1.536 3.507 6.624 -0.222 -0.394 -0.892 -1.617 3.507 9.572 -0.232 0.070 0.970 -1.691 3.383 9.572 -0.033 0.198 0.980 -1.753 3.507 9.510 -0.077 -0.064 0.995 -1.536 3.507 9.584 -0.239 0.111 0.965 -1.649 3.298 10.940 0.083 0.283 -0.955 -1.504 3.441 10.940 -0.167 0.138 -0.976 -1.753 3.507 11.037 0.039 -0.107 -0.993 -1.536 3.507 10.985 -0.206 0.063 -0.977 -1.865 3.729 0.684 -0.205 -0.618 0.759 -1.654 3.742 0.684 -0.374 -0.542 0.753 -1.879 3.757 0.820 -0.245 -0.799 0.549 -1.662 3.757 0.740 -0.411 -0.622 0.666 -1.879 3.757 1.652 -0.284 -0.940 -0.188 -1.662 3.757 1.677 -0.598 -0.773 -0.214 -1.879 3.757 5.092 0.170 -0.940 0.297 -1.662 3.757 4.975 -0.150 -0.772 0.618 -1.878 3.757 6.154 0.080 -0.920 -0.385 -1.878 3.757 6.154 0.082 -0.919 -0.385 -1.879 3.757 6.153 0.082 -0.920 -0.383 -1.662 3.757 6.375 -0.217 -0.844 -0.491 -1.803 3.605 9.572 -0.036 -0.216 0.976 -1.879 3.757 9.599 0.009 -0.293 0.956 -1.662 3.757 9.596 -0.238 -0.224 0.945 -1.824 3.649 10.940 -0.003 -0.276 -0.961 -1.596 3.625 10.940 -0.213 -0.093 -0.973 -1.879 3.757 10.919 0.000 -0.316 -0.949 -1.662 3.757 10.927 -0.214 -0.259 -0.942 -1.949 3.898 1.367 -0.276 -0.958 -0.077 -1.742 3.919 1.367 -0.560 -0.825 -0.083 -1.971 3.943 5.470 0.051 -0.996 0.079 -1.784 4.002 5.470 -0.295 -0.953 0.068 -1.723 3.879 6.154 -0.227 -0.885 -0.406 -2.004 4.007 9.834 -0.113 -0.972 0.207 -1.787 4.007 9.743 -0.421 -0.814 0.401 -2.004 4.007 10.682 -0.119 -0.971 -0.207 -1.787 4.007 10.774 -0.413 -0.819 -0.399 -2.084 4.169 10.256 -0.139 -0.990 0.001 -1.890 4.214 10.256 -0.409 -0.913 0.000 -0.271 1.002 3.419 0.098 0.995 -0.002 -0.133 1.133 3.419 -0.383 0.924 -0.004 -0.192 1.252 3.126 -0.434 0.893 0.120 -0.192 1.252 3.705 -0.434 0.893 -0.122 -0.405 1.252 8.205 -0.082 0.993 -0.083 -0.376 1.252 12.307 0.144 0.928 0.344 -0.318 1.503 2.827 -0.492 0.396 0.776 -0.318 1.503 4.007 -0.480 0.423 -0.769 -0.431 1.503 7.521 -0.466 0.739 0.486 -0.295 1.457 8.205 -0.651 0.753 -0.100 -0.318 1.503 8.039 -0.665 0.746 -0.028 -0.318 1.503 8.287 -0.672 0.730 -0.125 -0.235 1.338 12.307 -0.179 0.879 0.441 -0.318 1.503 11.977 -0.243 0.789 0.564 -0.335 1.503 12.991 -0.125 0.579 -0.805 -0.318 1.503 12.943 -0.161 0.664 -0.730 -0.443 1.753 2.798 -0.497 -0.107 0.861 -0.443 1.753 4.043 -0.465 -0.066 -0.883 -0.418 1.704 7.521 -0.786 0.386 0.484 -0.443 1.753 7.459 -0.804 0.324 0.499 -0.443 1.753 8.589 -0.895 0.273 -0.353 -0.443 1.753 11.761 -0.218 0.314 0.924 -0.325 1.517 12.991 -0.155 0.560 -0.814 -0.568 2.004 2.896 -0.673 -0.584 0.453 -0.568 2.004 3.958 -0.653 -0.568 -0.500 -0.568 2.004 7.405 -0.836 -0.158 0.526 -0.568 2.004 8.596 -0.899 -0.241 -0.365 -0.568 2.004 11.735 -0.290 -0.088 0.953 -0.708 2.254 3.419 -0.538 -0.843 0.013 -0.693 2.254 3.416 -0.550 -0.835 0.015 -0.693 2.254 3.422 -0.550 -0.835 0.013 -0.632 2.132 7.521 -0.814 -0.363 0.454 -0.693 2.254 7.862 -0.752 -0.657 0.045 -0.693 2.254 8.319 -0.741 -0.653 -0.157 -0.693 2.254 11.829 -0.444 -0.548 0.709 -0.694 2.255 3.419 -0.550 -0.835 0.014 -0.726 2.319 8.205 -0.722 -0.680 -0.125 -0.814 2.495 12.307 -0.445 -0.833 0.328 -0.763 2.394 12.991 -0.361 -0.539 -0.761 -1.135 3.006 0.684 -0.283 0.568 0.773 -1.058 2.983 1.367 -0.544 0.826 -0.149 -1.069 3.006 1.212 -0.554 0.832 0.000 -1.069 3.006 1.409 -0.555 0.816 -0.161 -1.000 2.867 5.470 -0.128 0.987 0.095 -1.069 3.006 5.166 -0.175 0.958 0.228 -1.075 3.006 6.154 -0.129 0.919 -0.372 -1.069 3.006 6.136 -0.137 0.928 -0.347 -1.156 3.006 10.256 0.012 1.000 0.017 -1.119 3.106 0.684 -0.464 0.402 0.790 -1.194 3.256 0.511 -0.500 0.188 0.845 -1.194 3.256 1.749 -0.862 0.331 -0.385 -1.194 3.256 4.910 -0.268 0.422 0.866 -1.071 3.010 6.154 -0.143 0.916 -0.375 -1.194 3.256 6.524 -0.433 0.498 -0.751 -1.095 3.058 10.256 -0.255 0.967 0.024 -1.194 3.256 9.823 -0.468 0.824 0.320 -1.194 3.256 10.738 -0.438 0.824 -0.358 -1.319 3.507 0.504 -0.511 -0.167 0.843 -1.319 3.507 1.773 -0.889 -0.207 -0.408 -1.319 3.507 4.888 -0.326 -0.130 0.936 -1.319 3.507 6.579 -0.549 -0.167 -0.819 -1.319 3.507 9.650 -0.413 0.281 0.866 -1.481 3.507 10.940 -0.226 0.079 -0.971 -1.319 3.507 10.897 -0.354 0.201 -0.913 -1.398 3.663 0.684 -0.517 -0.341 0.785 -1.445 3.757 0.967 -0.698 -0.627 0.346 -1.445 3.757 1.530 -0.762 -0.626 -0.166 -1.445 3.757 4.973 -0.546 -0.630 0.552 -1.445 3.757 6.395 -0.519 -0.679 -0.519 -1.445 3.757 9.641 -0.528 -0.183 0.829 -1.445 3.757 10.893 -0.461 -0.223 -0.859 -1.493 3.853 1.367 -0.740 -0.664 -0.107 -1.706 4.007 5.470 -0.386 -0.920 0.069 -1.570 4.007 5.415 -0.514 -0.854 0.086 -1.516 3.899 6.154 -0.512 -0.763 -0.396 -1.570 4.007 5.580 -0.512 -0.858 0.038 -1.570 4.007 9.794 -0.675 -0.677 0.294 -1.570 4.007 10.731 -0.657 -0.693 -0.296 -1.583 4.034 5.470 -0.513 -0.855 0.073 -1.671 4.209 10.256 -0.605 -0.796 0.002 0.555 0.000 3.419 0.829 -0.560 0.000 0.587 0.128 3.419 0.753 -0.658 0.000 0.651 0.000 3.146 0.826 -0.551 0.118 0.651 0.000 3.691 0.827 -0.549 -0.118 0.063 1.002 10.256 0.919 0.395 -0.004 0.201 0.900 10.256 0.854 0.521 -0.003 0.150 1.002 10.054 0.894 0.442 0.073 0.150 1.002 10.454 0.895 0.440 -0.077 -0.082 1.252 3.419 -0.450 0.893 -0.005 -0.123 1.252 10.256 0.999 -0.048 -0.005 0.025 1.252 9.868 0.977 -0.007 0.212 0.025 1.252 10.637 0.978 -0.005 -0.210 -0.053 1.407 3.419 -0.820 0.572 -0.004 -0.101 1.503 3.222 -0.872 0.484 0.066 -0.101 1.503 3.613 -0.869 0.489 -0.071 -0.280 1.503 8.205 -0.674 0.731 -0.102 -0.177 1.503 10.256 0.912 -0.411 -0.003 -0.101 1.503 10.045 0.910 -0.408 0.074 -0.101 1.503 10.465 0.912 -0.403 -0.077 -0.154 1.503 12.307 -0.350 0.825 0.444 -0.226 1.753 3.005 -0.964 0.061 0.257 -0.226 1.753 3.838 -0.961 0.089 -0.263 -0.410 1.753 7.521 -0.811 0.335 0.479 -0.265 1.753 8.205 -0.940 0.321 -0.115 -0.156 1.614 10.256 0.859 -0.512 -0.002 -0.134 1.569 12.307 -0.559 0.690 0.460 -0.226 1.753 11.992 -0.669 0.480 0.568 -0.236 1.753 12.991 -0.432 0.350 -0.831 -0.226 1.753 12.946 -0.510 0.402 -0.761 -0.351 2.004 3.112 -0.910 -0.383 0.157 -0.351 2.004 3.745 -0.916 -0.368 -0.157 -0.496 2.004 7.521 -0.873 -0.113 0.475 -0.364 2.004 8.205 -0.990 -0.055 -0.128 -0.351 2.004 11.856 -0.689 0.046 0.723 -0.242 1.786 12.991 -0.460 0.305 -0.834 -0.690 2.254 3.419 -0.552 -0.834 0.014 -0.443 2.188 3.419 -0.818 -0.575 0.018 -0.610 2.254 8.205 -0.789 -0.600 -0.132 -0.476 2.254 11.946 -0.709 -0.397 0.583 -0.585 2.472 12.307 -0.638 -0.665 0.390 -0.499 2.300 12.991 -0.512 -0.319 -0.797 -1.048 3.006 1.367 -0.555 0.818 -0.150 -0.916 3.006 5.470 -0.246 0.964 0.103 -1.092 3.256 0.684 -0.565 0.237 0.790 -1.008 3.256 1.367 -0.910 0.381 -0.165 -0.884 3.070 5.470 -0.515 0.850 0.116 -0.977 3.256 5.127 -0.731 0.609 0.307 -0.961 3.223 6.154 -0.630 0.637 -0.444 -0.977 3.256 6.203 -0.650 0.602 -0.464 -1.003 3.256 10.256 -0.552 0.833 0.029 -1.194 3.507 0.684 -0.608 -0.128 0.783 -1.099 3.499 1.367 -0.987 -0.029 -0.157 -1.103 3.507 1.352 -0.989 -0.039 -0.143 -1.103 3.507 1.371 -0.987 -0.039 -0.158 -1.103 3.507 4.994 -0.830 0.042 0.555 -1.103 3.507 6.383 -0.818 0.029 -0.574 -0.999 3.300 10.256 -0.708 0.706 0.030 -1.103 3.507 9.916 -0.903 0.380 0.201 -1.103 3.507 10.646 -0.901 0.383 -0.206 -1.329 3.757 1.367 -0.821 -0.557 -0.126 -1.105 3.512 1.367 -0.987 -0.045 -0.157 -1.228 3.757 5.085 -0.819 -0.471 0.328 -1.228 3.757 6.241 -0.756 -0.480 -0.445 -1.228 3.757 9.825 -0.949 -0.079 0.306 -1.228 3.757 10.730 -0.935 -0.113 -0.336 -1.474 4.007 5.470 -0.579 -0.812 0.079 -1.342 3.985 5.470 -0.709 -0.700 0.090 -1.257 3.816 6.154 -0.746 -0.528 -0.406 -1.353 4.007 10.041 -0.855 -0.511 0.090 -1.353 4.007 10.489 -0.848 -0.524 -0.077 -1.407 4.115 10.256 -0.816 -0.578 0.009 -1.702 4.508 3.419 0.889 0.457 0.000 -1.549 4.400 3.419 0.835 0.551 0.003 -1.604 4.508 3.196 0.858 0.508 0.076 -1.604 4.508 3.643 0.861 0.503 -0.075 -1.891 4.759 3.419 1.000 0.009 -0.001 -1.729 4.759 2.992 0.962 0.119 0.247 -1.729 4.759 3.844 0.962 0.120 -0.245 0.607 0.250 3.419 0.513 -0.858 0.000 0.868 0.000 2.794 0.354 -0.458 0.816 0.742 0.250 3.057 0.473 -0.862 0.183 0.868 0.000 4.043 0.358 -0.452 -0.817 0.742 0.250 3.780 0.468 -0.865 -0.184 0.753 0.000 8.205 0.912 -0.400 -0.094 0.770 0.196 8.205 0.743 -0.663 -0.093 0.868 0.000 7.804 0.919 -0.358 0.165 0.868 0.000 8.442 0.911 -0.359 -0.203 0.775 0.000 12.307 0.582 -0.660 0.475 0.814 0.107 12.307 0.524 -0.712 0.468 0.868 0.000 12.116 0.583 -0.631 0.511 0.868 0.000 12.635 0.658 -0.748 -0.085 0.674 0.387 3.419 0.407 -0.913 -0.001 0.470 0.796 10.256 0.601 0.800 -0.002 0.367 1.002 9.774 0.684 0.656 0.319 0.367 1.002 10.732 0.683 0.657 -0.317 0.163 1.252 1.367 0.984 0.150 -0.099 0.311 1.114 1.367 0.921 0.377 -0.095 0.241 1.252 1.086 0.943 0.196 0.270 0.241 1.252 1.520 0.970 0.186 -0.156 0.125 1.252 5.470 0.868 0.485 0.102 0.296 1.144 5.470 0.760 0.643 0.092 0.241 1.252 5.294 0.800 0.578 0.164 0.241 1.252 5.805 0.805 0.588 -0.081 0.241 1.252 9.634 0.542 0.123 0.831 0.241 1.252 10.872 0.553 0.129 -0.823 0.056 1.503 1.367 0.965 -0.243 -0.101 0.116 1.503 1.105 0.954 -0.212 0.213 0.116 1.503 1.499 0.964 -0.227 -0.140 -0.030 1.503 3.419 -0.867 0.498 -0.004 -0.074 1.503 5.470 0.993 -0.018 0.115 0.116 1.503 5.091 0.931 0.126 0.341 0.097 1.503 6.154 0.874 0.150 -0.463 0.134 1.468 6.154 0.863 0.199 -0.464 0.116 1.503 6.186 0.867 0.157 -0.472 0.116 1.503 9.661 0.507 -0.372 0.778 0.116 1.503 10.848 0.523 -0.354 -0.776 0.063 1.609 1.367 0.928 -0.357 -0.109 -0.064 1.753 3.419 -0.990 0.138 0.001 -0.155 1.753 5.470 0.912 -0.393 0.118 -0.009 1.753 5.148 0.901 -0.349 0.257 0.038 1.659 6.154 0.878 -0.120 -0.464 -0.009 1.753 6.128 0.861 -0.307 -0.407 -0.148 1.753 10.256 0.576 -0.818 0.001 -0.009 1.753 9.905 0.539 -0.823 0.178 -0.009 1.753 10.612 0.554 -0.813 -0.181 -0.085 1.753 12.307 -0.732 0.505 0.458 -0.208 2.004 3.419 -0.963 -0.270 0.011 -0.116 1.967 5.470 0.712 -0.693 0.118 -0.086 1.907 10.256 0.447 -0.895 0.006 -0.140 2.004 12.307 -0.889 0.148 0.433 -0.249 2.004 12.991 -0.550 0.073 -0.832 -0.271 2.254 12.307 -0.871 -0.205 0.446 -0.434 2.254 12.991 -0.532 -0.269 -0.803 -0.820 3.256 5.470 -0.767 0.629 0.126 -0.949 3.256 6.154 -0.656 0.609 -0.445 -1.101 3.507 1.367 -0.987 -0.038 -0.157 -0.859 3.454 5.470 -0.968 0.218 0.122 -0.886 3.507 5.412 -0.980 0.149 0.135 -0.964 3.507 6.154 -0.890 0.094 -0.446 -0.886 3.507 5.627 -0.987 0.153 0.047 -0.958 3.507 10.256 -0.915 0.403 0.028 -1.011 3.757 5.463 -0.960 -0.255 0.115 -1.162 3.757 6.154 -0.797 -0.446 -0.409 -1.011 3.757 5.489 -0.961 -0.256 0.106 -1.040 3.757 10.256 -0.999 -0.018 0.028 -1.014 3.762 5.470 -0.959 -0.260 0.113 -1.246 4.007 10.256 -0.885 -0.465 0.015 -1.270 4.258 12.307 0.681 0.621 0.389 -1.258 4.252 12.307 0.677 0.625 0.388 -1.261 4.258 12.295 0.677 0.624 0.390 -1.261 4.258 12.334 0.686 0.629 0.366 -1.278 4.291 3.419 0.625 0.781 0.008 -1.387 4.508 2.929 0.667 0.680 0.303 -1.387 4.508 3.916 0.679 0.663 -0.314 -1.596 4.508 12.307 0.872 0.245 0.424 -1.387 4.508 11.927 0.748 0.399 0.530 -1.392 4.508 12.991 0.554 0.218 -0.803 -1.383 4.501 12.991 0.554 0.224 -0.802 -1.512 4.759 2.785 0.525 0.283 0.803 -1.512 4.759 4.053 0.529 0.271 -0.804 -1.627 4.759 8.205 0.947 0.309 -0.082 -1.433 4.602 8.205 0.855 0.512 -0.087 -1.512 4.759 7.835 0.933 0.342 0.110 -1.512 4.759 8.414 0.914 0.374 -0.159 -1.716 4.759 12.307 0.801 -0.333 0.497 -1.512 4.759 11.891 0.716 -0.199 0.669 -1.526 4.759 12.991 0.460 -0.167 -0.872 1.040 0.000 2.735 0.147 -0.186 0.972 1.060 0.049 2.735 0.108 -0.222 0.969 1.085 0.000 2.694 0.122 -0.169 0.978 0.959 0.250 2.796 -0.002 -0.701 0.713 1.043 0.000 4.102 0.145 -0.182 -0.972 1.062 0.045 4.102 0.104 -0.219 -0.970 0.959 0.250 4.040 -0.021 -0.710 -0.704 1.085 0.000 4.141 0.121 -0.169 -0.978 0.952 0.000 7.521 0.775 -0.299 0.556 0.965 0.240 7.521 0.584 -0.644 0.495 1.085 0.000 7.299 0.711 -0.274 0.647 0.765 0.250 8.205 0.616 -0.782 -0.091 0.959 0.250 7.535 0.575 -0.672 0.467 1.085 0.000 8.728 0.579 -0.291 -0.762 0.959 0.250 8.600 0.535 -0.768 -0.352 0.899 0.250 12.307 0.263 -0.853 0.452 1.085 0.000 11.801 0.187 -0.619 0.763 0.959 0.250 12.196 0.257 -0.841 0.476 0.970 0.000 12.991 0.271 -0.410 -0.871 1.022 0.124 12.991 0.221 -0.458 -0.861 0.959 0.250 12.507 0.285 -0.940 0.188 0.810 0.501 3.419 -0.069 -0.998 -0.002 0.834 0.501 3.359 -0.076 -0.997 0.010 0.834 0.501 3.477 -0.077 -0.997 -0.014 0.853 0.463 8.205 0.335 -0.939 -0.081 0.933 0.302 12.307 0.244 -0.860 0.448 0.824 0.521 3.419 -0.075 -0.997 -0.002 0.520 1.002 1.367 0.647 0.758 -0.079 0.599 0.971 1.367 0.594 0.801 -0.075 0.584 1.002 1.256 0.606 0.795 0.026 0.584 1.002 1.429 0.601 0.794 -0.094 0.688 0.793 10.256 0.416 0.909 -0.003 0.584 1.002 9.721 0.421 0.798 0.431 0.584 1.002 10.781 0.406 0.808 -0.426 0.395 1.252 0.684 0.461 0.233 0.856 0.490 1.188 0.684 0.439 0.296 0.848 0.458 1.252 0.596 0.439 0.256 0.861 0.458 1.252 1.804 0.776 0.456 -0.437 0.543 1.082 5.470 0.515 0.853 0.083 0.458 1.252 5.144 0.558 0.794 0.241 0.458 1.252 6.087 0.568 0.764 -0.306 0.458 1.252 9.584 0.232 0.193 0.953 0.458 1.252 10.921 0.218 0.203 -0.955 0.212 1.503 0.684 0.495 -0.059 0.867 0.333 1.503 0.473 0.461 -0.028 0.887 0.333 1.503 1.861 0.756 -0.119 -0.644 0.333 1.503 4.933 0.564 0.344 0.750 0.447 1.275 6.154 0.582 0.704 -0.407 0.333 1.503 6.469 0.659 0.383 -0.647 0.333 1.503 9.579 0.191 -0.149 0.970 0.333 1.503 10.928 0.171 -0.128 -0.977 0.198 1.753 0.684 0.433 -0.326 0.840 0.208 1.753 0.665 0.431 -0.324 0.842 0.042 1.753 1.367 0.751 -0.649 -0.118 0.208 1.753 1.723 0.707 -0.637 -0.306 0.208 1.753 4.917 0.403 -0.217 0.889 -0.003 1.753 6.154 0.842 -0.296 -0.451 0.208 1.753 6.513 0.659 -0.188 -0.728 0.208 1.753 9.649 0.168 -0.561 0.811 0.208 1.753 10.866 0.183 -0.520 -0.834 0.201 1.767 0.684 0.430 -0.332 0.840 0.108 1.953 1.367 0.524 -0.843 -0.120 -0.114 2.004 5.470 0.593 -0.797 0.118 0.083 2.004 5.056 0.463 -0.794 0.394 0.010 2.004 6.154 0.488 -0.752 -0.443 0.083 2.004 6.282 0.459 -0.740 -0.492 0.002 2.004 10.256 0.032 -0.999 0.008 0.083 2.004 10.081 -0.005 -0.998 0.057 0.083 2.004 10.444 0.000 -0.999 -0.047 -0.024 2.217 5.470 0.271 -0.957 0.107 0.043 2.083 6.154 0.423 -0.794 -0.436 0.046 2.076 10.256 0.001 -1.000 0.010 -0.859 3.507 5.470 -0.981 0.155 0.119 -1.007 3.757 5.470 -0.961 -0.254 0.114 -0.999 4.166 12.307 0.511 0.782 0.357 -1.044 4.258 12.116 0.513 0.762 0.395 -1.044 4.258 12.736 0.558 0.806 -0.194 -1.055 4.279 3.419 0.454 0.891 0.012 -1.170 4.508 2.879 0.430 0.795 0.427 -1.170 4.508 3.974 0.440 0.769 -0.463 -1.235 4.508 8.205 0.667 0.738 -0.101 -1.154 4.476 8.205 0.627 0.772 -0.105 -1.170 4.508 8.058 0.642 0.765 -0.043 -1.170 4.508 8.268 0.630 0.767 -0.122 -1.170 4.508 11.785 0.503 0.507 0.700 -1.073 4.314 12.991 0.432 0.513 -0.742 -1.295 4.759 2.747 0.254 0.344 0.904 -1.295 4.759 4.093 0.252 0.307 -0.918 -1.386 4.759 7.521 0.789 0.418 0.451 -1.245 4.659 7.521 0.727 0.538 0.428 -1.295 4.759 7.396 0.741 0.470 0.480 -1.295 4.759 8.660 0.719 0.584 -0.376 -1.295 4.759 11.733 0.281 0.003 0.960 1.207 0.188 2.735 -0.120 -0.350 0.929 1.301 0.000 2.632 -0.159 -0.071 0.985 1.176 0.250 2.746 -0.127 -0.415 0.901 1.219 0.166 4.102 -0.157 -0.356 -0.921 1.176 0.250 4.086 -0.166 -0.444 -0.880 1.301 0.000 4.202 -0.192 -0.125 -0.973 0.964 0.250 7.521 0.561 -0.668 0.490 1.301 0.000 7.092 0.489 0.020 0.872 1.176 0.250 7.168 0.257 -0.700 0.666 1.301 0.000 8.797 0.257 0.163 -0.953 1.176 0.250 8.773 0.016 -0.596 -0.803 1.301 0.000 11.719 -0.071 -0.378 0.923 1.176 0.250 11.886 -0.022 -0.782 0.623 1.123 0.250 12.991 0.059 -0.548 -0.834 1.051 0.501 2.958 -0.158 -0.952 0.264 1.051 0.501 3.866 -0.180 -0.950 -0.254 1.062 0.479 7.521 0.156 -0.896 0.415 0.878 0.501 8.205 0.189 -0.979 -0.078 1.051 0.501 7.605 0.129 -0.946 0.298 1.051 0.501 8.534 0.093 -0.968 -0.235 1.077 0.449 12.307 -0.106 -0.915 0.389 1.155 0.294 12.991 0.038 -0.554 -0.832 0.967 0.669 3.419 -0.185 -0.983 -0.007 0.976 0.651 8.205 0.046 -0.996 -0.077 0.815 0.972 1.367 0.412 0.908 -0.068 0.801 1.002 1.238 0.422 0.906 0.029 0.801 1.002 1.434 0.417 0.905 -0.083 0.882 0.839 10.256 0.239 0.971 -0.007 0.801 1.002 9.809 0.229 0.947 0.224 0.801 1.002 10.683 0.208 0.953 -0.219 0.748 1.107 0.684 0.330 0.516 0.790 0.675 1.252 0.439 0.327 0.428 0.842 0.675 1.252 1.878 0.457 0.630 -0.628 0.746 1.111 5.470 0.321 0.943 0.085 0.675 1.252 5.179 0.334 0.922 0.196 0.675 1.252 6.074 0.386 0.888 -0.248 0.675 1.252 9.584 0.073 0.310 0.948 0.675 1.252 10.915 0.004 0.302 -0.953 0.550 1.503 0.260 0.339 0.097 0.936 0.550 1.503 1.949 0.296 0.092 -0.951 0.550 1.503 4.910 0.208 0.430 0.879 0.667 1.268 6.154 0.395 0.850 -0.349 0.550 1.503 6.542 0.382 0.612 -0.692 0.373 1.503 9.572 0.194 -0.136 0.971 0.640 1.322 9.572 0.089 0.262 0.961 0.550 1.503 9.474 0.094 -0.057 0.994 0.426 1.503 10.940 0.151 -0.086 -0.985 0.599 1.406 10.940 0.025 0.191 -0.981 0.550 1.503 10.998 0.007 0.016 -1.000 0.425 1.753 0.311 0.260 -0.270 0.927 0.425 1.753 1.926 0.228 -0.416 -0.880 0.425 1.753 4.883 0.101 0.009 0.995 0.425 1.753 6.636 0.316 0.013 -0.949 0.477 1.650 9.572 0.005 -0.285 0.959 0.425 1.753 9.593 -0.008 -0.341 0.940 0.498 1.608 10.940 -0.019 -0.180 -0.983 0.425 1.753 10.917 -0.018 -0.284 -0.959 0.281 2.004 0.684 0.137 -0.590 0.796 0.300 2.004 0.652 0.128 -0.586 0.800 0.131 2.004 1.367 0.317 -0.941 -0.116 0.300 2.004 1.702 0.202 -0.942 -0.267 0.300 2.004 4.906 0.145 -0.417 0.897 0.300 2.004 6.548 0.164 -0.635 -0.754 0.300 2.004 9.770 -0.095 -0.922 0.376 0.300 2.004 10.757 -0.096 -0.908 -0.407 0.290 2.023 0.684 0.128 -0.593 0.795 0.217 2.169 1.367 0.132 -0.985 -0.115 0.013 2.254 5.470 0.087 -0.991 0.097 0.174 2.254 5.173 -0.039 -0.978 0.206 0.178 2.247 6.154 -0.042 -0.931 -0.363 0.174 2.254 6.113 -0.053 -0.951 -0.304 0.198 2.206 10.256 -0.196 -0.981 0.013 0.105 2.392 5.470 -0.054 -0.994 0.091 -0.793 4.189 12.307 0.352 0.879 0.322 -0.828 4.258 12.157 0.355 0.869 0.346 -0.828 4.258 12.660 0.374 0.926 -0.048 -0.855 4.312 3.419 0.250 0.968 0.017 -0.953 4.508 2.948 0.175 0.927 0.331 -0.953 4.508 3.914 0.179 0.914 -0.364 -0.927 4.458 8.205 0.428 0.896 -0.120 -0.953 4.508 7.936 0.449 0.893 0.011 -0.953 4.508 8.310 0.430 0.890 -0.151 -0.953 4.508 11.764 0.288 0.589 0.755 -0.852 4.307 12.991 0.273 0.637 -0.721 -1.078 4.759 2.759 0.107 0.474 0.874 -1.078 4.759 4.085 0.091 0.412 -0.906 -0.987 4.577 7.521 0.497 0.767 0.405 -1.078 4.759 7.239 0.518 0.660 0.544 -1.078 4.759 8.726 0.474 0.707 -0.525 -1.078 4.759 11.713 0.047 0.017 0.999 1.493 0.000 2.735 -0.209 0.189 0.960 1.518 0.000 2.740 -0.186 0.223 0.957 1.393 0.250 2.745 -0.257 -0.257 0.932 1.487 0.000 4.102 -0.240 0.130 -0.962 1.518 0.000 4.096 -0.211 0.173 -0.962 1.393 0.250 4.083 -0.302 -0.305 -0.903 1.518 0.000 7.051 0.228 0.473 0.851 1.393 0.250 7.052 -0.098 -0.576 0.812 1.518 0.000 8.798 0.085 0.248 -0.965 1.393 0.250 8.799 -0.038 -0.201 -0.979 1.518 0.000 11.714 -0.107 -0.146 0.984 1.393 0.250 11.794 -0.260 -0.661 0.704 1.268 0.501 2.862 -0.344 -0.770 0.538 1.268 0.501 3.954 -0.381 -0.782 -0.493 1.084 0.501 7.521 0.087 -0.910 0.406 1.268 0.501 7.274 -0.079 -0.851 0.519 1.268 0.501 8.712 -0.015 -0.765 -0.644 1.268 0.501 12.307 -0.328 -0.893 0.309 1.314 0.409 12.991 -0.167 -0.603 -0.780 1.158 0.721 3.419 -0.372 -0.928 -0.012 1.199 0.638 7.521 -0.103 -0.914 0.391 1.149 0.739 8.205 -0.226 -0.971 -0.072 0.874 1.002 1.367 0.376 0.924 -0.068 1.034 0.969 10.256 0.132 0.991 -0.011 1.017 1.002 10.156 0.133 0.991 0.011 1.017 1.002 10.345 0.130 0.991 -0.031 0.951 1.134 0.684 0.202 0.633 0.747 0.892 1.252 0.466 0.196 0.583 0.789 1.006 1.025 1.367 0.257 0.964 -0.075 0.892 1.252 1.853 0.153 0.815 -0.559 0.909 1.219 5.470 0.197 0.976 0.087 0.892 1.252 5.400 0.201 0.974 0.101 0.892 1.252 5.657 0.210 0.977 0.026 0.892 1.252 9.630 -0.116 0.543 0.832 0.892 1.252 10.855 -0.212 0.566 -0.796 0.767 1.503 0.215 0.123 0.232 0.965 0.767 1.503 1.959 0.103 0.205 -0.973 0.767 1.503 4.946 -0.063 0.649 0.758 0.863 1.311 6.154 0.190 0.912 -0.363 0.767 1.503 6.488 0.109 0.782 -0.614 0.796 1.444 9.572 -0.131 0.185 0.974 0.767 1.503 9.524 -0.154 0.116 0.981 0.676 1.503 10.940 -0.154 0.110 -0.982 0.767 1.503 10.926 -0.174 0.154 -0.973 0.642 1.753 0.205 0.053 -0.170 0.984 0.642 1.753 1.958 0.021 -0.186 -0.982 0.642 1.753 4.884 -0.001 0.161 0.987 0.642 1.753 6.644 -0.065 0.220 -0.973 0.682 1.673 9.572 -0.173 -0.148 0.974 0.642 1.753 9.579 -0.179 -0.259 0.949 0.642 1.753 10.920 -0.215 -0.196 -0.957 0.516 2.004 0.387 -0.045 -0.494 0.869 0.516 2.004 1.882 0.048 -0.711 -0.702 0.516 2.004 4.883 -0.103 -0.227 0.968 0.516 2.004 6.616 -0.185 -0.442 -0.878 0.516 2.004 9.692 -0.316 -0.727 0.609 0.516 2.004 10.824 -0.343 -0.683 -0.645 0.428 2.181 0.684 -0.089 -0.616 0.782 0.380 2.254 1.367 -0.228 -0.969 -0.091 0.391 2.254 1.314 -0.233 -0.971 -0.058 0.391 2.254 1.385 -0.234 -0.968 -0.093 0.391 2.254 5.012 -0.239 -0.852 0.465 0.195 2.254 6.154 -0.085 -0.930 -0.358 0.391 2.254 6.349 -0.286 -0.846 -0.450 0.395 2.246 10.256 -0.409 -0.913 0.010 0.387 2.263 1.367 -0.233 -0.968 -0.090 0.283 2.470 5.470 -0.308 -0.947 0.086 0.337 2.362 6.154 -0.290 -0.883 -0.370 -0.691 4.258 12.307 0.277 0.909 0.313 -0.692 4.420 3.419 -0.132 0.991 0.021 -0.736 4.508 3.209 -0.145 0.984 0.106 -0.736 4.508 3.650 -0.150 0.985 -0.087 -0.806 4.508 8.205 0.287 0.949 -0.130 -0.619 4.275 12.307 0.189 0.924 0.332 -0.736 4.508 11.818 0.071 0.717 0.693 -0.669 4.374 12.991 0.045 0.614 -0.788 -0.861 4.759 2.810 0.006 0.696 0.718 -0.861 4.759 4.037 -0.024 0.637 -0.770 -0.783 4.603 7.521 0.231 0.876 0.422 -0.861 4.759 7.259 0.230 0.799 0.556 -0.740 4.517 8.205 0.202 0.971 -0.131 -0.861 4.759 8.704 0.238 0.836 -0.494 -0.861 4.759 11.716 0.023 0.228 0.973 1.735 0.000 2.806 -0.264 0.465 0.845 1.610 0.250 2.784 -0.449 -0.158 0.879 1.735 0.000 4.031 -0.304 0.410 -0.860 1.610 0.250 4.042 -0.503 -0.231 -0.833 1.735 0.000 7.113 0.000 0.760 0.650 1.610 0.250 7.053 -0.416 -0.285 0.864 1.735 0.000 8.779 -0.114 0.370 -0.922 1.610 0.250 8.799 -0.096 0.022 -0.995 1.735 0.000 11.728 -0.264 -0.085 0.961 1.610 0.250 11.795 -0.459 -0.563 0.687 1.485 0.501 2.883 -0.615 -0.635 0.467 1.485 0.501 3.925 -0.638 -0.652 -0.411 1.485 0.501 7.180 -0.351 -0.684 0.640 1.485 0.501 8.754 -0.285 -0.543 -0.790 1.269 0.501 12.307 -0.329 -0.892 0.309 1.485 0.501 12.191 -0.453 -0.812 0.368 1.515 0.440 12.991 -0.339 -0.564 -0.753 1.485 0.501 12.615 -0.473 -0.881 0.030 1.369 0.733 3.419 -0.525 -0.851 -0.018 1.383 0.704 7.521 -0.349 -0.863 0.364 1.205 0.751 8.205 -0.293 -0.954 -0.069 1.360 0.751 7.830 -0.366 -0.928 0.068 1.360 0.751 8.373 -0.378 -0.919 -0.116 1.457 0.557 12.307 -0.447 -0.822 0.351 1.323 0.825 8.205 -0.370 -0.926 -0.074 1.060 1.002 10.256 0.116 0.993 -0.012 1.111 1.248 0.684 0.068 0.725 0.685 1.109 1.252 0.676 0.068 0.724 0.686 1.182 1.107 1.367 0.031 0.996 -0.086 1.109 1.252 1.692 0.012 0.974 -0.228 0.938 1.252 5.470 0.182 0.979 0.090 1.187 1.097 10.256 -0.254 0.967 -0.022 1.109 1.252 9.847 -0.335 0.917 0.215 1.109 1.252 10.618 -0.355 0.912 -0.207 0.984 1.503 0.269 -0.089 0.367 0.926 0.984 1.503 1.944 -0.064 0.403 -0.913 1.074 1.322 5.470 -0.100 0.987 0.123 0.984 1.503 5.105 -0.221 0.918 0.329 1.021 1.428 6.154 -0.098 0.919 -0.381 0.984 1.503 6.286 -0.121 0.888 -0.443 0.826 1.503 9.572 -0.181 0.137 0.974 0.984 1.503 9.615 -0.302 0.291 0.908 0.984 1.503 10.861 -0.358 0.367 -0.858 0.859 1.753 0.202 -0.165 -0.049 0.985 0.859 1.753 1.966 -0.086 -0.057 -0.995 0.859 1.753 4.914 -0.241 0.372 0.896 0.859 1.753 6.562 -0.413 0.392 -0.822 0.859 1.753 9.603 -0.348 -0.151 0.925 0.859 1.753 10.884 -0.421 -0.107 -0.901 0.733 2.004 0.317 -0.222 -0.402 0.888 0.733 2.004 1.923 -0.254 -0.515 -0.819 0.733 2.004 4.897 -0.369 -0.153 0.917 0.733 2.004 6.582 -0.515 -0.241 -0.822 0.733 2.004 9.709 -0.589 -0.640 0.494 0.733 2.004 10.791 -0.636 -0.595 -0.492 0.620 2.231 0.684 -0.285 -0.614 0.736 0.608 2.254 0.815 -0.351 -0.790 0.503 0.608 2.254 1.595 -0.391 -0.908 -0.152 0.608 2.254 4.997 -0.541 -0.686 0.487 0.608 2.254 6.376 -0.510 -0.705 -0.493 0.610 2.251 10.256 -0.549 -0.836 0.005 0.554 2.362 1.367 -0.388 -0.917 -0.093 0.489 2.492 5.470 -0.485 -0.870 0.083 0.543 2.385 6.154 -0.506 -0.774 -0.380 -0.634 4.508 3.419 -0.211 0.977 0.020 -0.456 4.383 12.307 -0.218 0.871 0.441 -0.519 4.508 12.044 -0.263 0.805 0.532 -0.564 4.508 12.991 -0.113 0.578 -0.808 -0.519 4.508 12.854 -0.247 0.798 -0.550 -0.554 4.579 3.419 -0.413 0.911 0.016 -0.644 4.759 3.015 -0.432 0.867 0.248 -0.644 4.759 3.838 -0.456 0.851 -0.259 -0.627 4.725 7.521 -0.102 0.890 0.445 -0.644 4.759 7.462 -0.103 0.879 0.466 -0.558 4.586 8.205 -0.068 0.990 -0.125 -0.644 4.759 8.567 -0.085 0.948 -0.307 -0.644 4.759 11.763 -0.093 0.526 0.845 -0.535 4.540 12.991 -0.181 0.549 -0.816 1.952 0.000 3.108 -0.690 0.712 0.128 1.827 0.250 2.951 -0.942 -0.022 0.335 1.952 0.000 3.729 -0.707 0.696 -0.129 1.827 0.250 3.869 -0.947 -0.075 -0.312 1.952 0.000 7.365 -0.218 0.877 0.428 1.827 0.250 7.173 -0.685 0.102 0.721 1.952 0.000 8.652 -0.185 0.914 -0.361 1.827 0.250 8.760 -0.474 0.131 -0.871 1.952 0.000 11.838 -0.657 0.066 0.751 1.827 0.250 11.898 -0.691 -0.451 0.565 1.702 0.501 3.066 -0.881 -0.440 0.174 1.702 0.501 3.738 -0.875 -0.451 -0.174 1.702 0.501 7.241 -0.652 -0.432 0.623 1.702 0.501 8.723 -0.630 -0.439 -0.641 1.702 0.501 12.274 -0.605 -0.684 0.407 1.770 0.365 12.991 -0.500 -0.352 -0.791 1.702 0.501 12.410 -0.630 -0.711 0.313 1.611 0.683 3.419 -0.774 -0.633 -0.024 1.601 0.703 7.521 -0.584 -0.709 0.395 1.576 0.751 7.733 -0.553 -0.821 0.140 1.576 0.751 8.411 -0.556 -0.817 -0.150 1.693 0.519 12.307 -0.604 -0.689 0.402 1.528 0.849 8.205 -0.537 -0.839 -0.087 1.115 1.252 0.684 0.066 0.726 0.684 1.284 1.252 1.367 -0.072 0.993 -0.092 1.267 1.252 10.256 -0.387 0.922 -0.026 1.260 1.384 0.684 -0.238 0.576 0.782 1.201 1.503 0.485 -0.279 0.463 0.841 1.313 1.278 1.367 -0.178 0.979 -0.100 1.201 1.503 1.822 -0.415 0.769 -0.485 1.176 1.503 5.470 -0.351 0.925 0.145 1.074 1.503 6.154 -0.185 0.905 -0.382 1.288 1.328 10.256 -0.675 0.737 -0.029 1.201 1.503 9.879 -0.841 0.509 0.186 1.201 1.503 10.583 -0.845 0.502 -0.186 1.076 1.753 0.304 -0.379 0.069 0.923 1.076 1.753 1.935 -0.412 0.115 -0.904 1.187 1.531 5.470 -0.476 0.866 0.152 1.076 1.753 5.102 -0.748 0.554 0.365 1.134 1.637 6.154 -0.604 0.671 -0.430 1.076 1.753 6.312 -0.691 0.502 -0.520 1.076 1.753 9.734 -0.892 -0.004 0.453 1.076 1.753 10.729 -0.919 0.026 -0.394 0.950 2.004 0.378 -0.389 -0.272 0.880 0.950 2.004 1.897 -0.601 -0.442 -0.666 0.950 2.004 4.999 -0.826 0.000 0.564 0.950 2.004 6.418 -0.791 -0.064 -0.608 0.950 2.004 9.869 -0.854 -0.478 0.203 0.950 2.004 10.613 -0.873 -0.443 -0.202 0.843 2.219 0.684 -0.423 -0.491 0.762 0.825 2.254 0.823 -0.515 -0.681 0.521 0.825 2.254 1.605 -0.580 -0.798 -0.165 0.825 2.254 5.106 -0.804 -0.509 0.306 0.825 2.254 6.236 -0.726 -0.532 -0.435 0.854 2.197 10.256 -0.773 -0.635 -0.006 0.767 2.370 1.367 -0.569 -0.817 -0.094 0.719 2.466 5.470 -0.690 -0.717 0.099 0.798 2.309 6.154 -0.719 -0.569 -0.398 -0.390 4.508 12.307 -0.334 0.827 0.452 -0.480 4.759 3.419 -0.583 0.813 0.010 -0.605 4.759 7.521 -0.131 0.886 0.445 -0.447 4.759 8.205 -0.355 0.927 -0.123 -0.346 4.596 12.307 -0.535 0.717 0.447 -0.427 4.759 12.011 -0.582 0.614 0.533 -0.451 4.759 12.991 -0.358 0.421 -0.833 -0.427 4.759 12.893 -0.522 0.547 -0.655 2.167 0.000 1.367 0.938 -0.332 -0.104 2.167 0.003 1.367 0.937 -0.334 -0.104 2.169 0.000 1.358 0.938 -0.332 -0.096 2.169 0.000 1.372 0.938 -0.331 -0.105 2.069 0.000 3.419 -0.712 0.702 0.000 2.010 0.250 3.419 -0.994 0.112 -0.009 2.037 0.000 7.521 -0.286 0.873 0.394 2.028 0.250 7.521 -0.804 0.366 0.470 2.158 0.000 8.205 -0.441 0.893 -0.093 2.156 0.026 8.205 -0.550 0.830 -0.097 2.044 0.250 7.587 -0.840 0.409 0.356 2.044 0.250 8.517 -0.878 0.409 -0.248 2.169 0.000 12.303 -0.856 0.295 0.425 2.044 0.250 12.265 -0.876 -0.211 0.434 2.057 0.000 12.991 -0.503 0.130 -0.854 1.917 0.250 12.991 -0.542 -0.221 -0.811 2.169 0.000 12.317 -0.860 0.297 0.416 2.044 0.250 12.416 -0.921 -0.211 0.326 1.861 0.501 3.419 -0.952 -0.306 -0.022 1.915 0.501 7.521 -0.876 -0.164 0.453 1.919 0.501 7.530 -0.885 -0.159 0.438 1.919 0.501 8.539 -0.938 -0.203 -0.282 1.731 0.501 12.307 -0.621 -0.669 0.408 2.023 0.292 12.307 -0.869 -0.241 0.433 1.793 0.751 8.145 -0.770 -0.633 -0.083 1.793 0.751 8.229 -0.767 -0.632 -0.112 1.787 0.765 8.205 -0.763 -0.637 -0.105 1.319 1.503 0.684 -0.338 0.514 0.788 1.415 1.503 1.367 -0.639 0.760 -0.120 1.339 1.503 10.256 -0.841 0.541 -0.027 1.320 1.697 0.684 -0.570 0.225 0.790 1.292 1.753 0.624 -0.579 0.162 0.799 1.415 1.508 1.367 -0.659 0.743 -0.120 1.292 1.753 1.718 -0.916 0.269 -0.299 1.253 1.753 5.470 -0.814 0.556 0.165 1.168 1.753 6.154 -0.728 0.533 -0.431 1.282 1.753 10.256 -0.993 0.113 -0.030 1.167 2.004 0.632 -0.571 -0.164 0.804 1.167 2.004 1.728 -0.922 -0.237 -0.306 1.213 1.912 5.470 -0.963 0.222 0.153 1.167 2.004 5.386 -0.981 0.103 0.166 1.120 2.004 6.154 -0.907 0.021 -0.421 1.167 2.004 5.776 -0.995 0.094 -0.013 1.131 2.004 10.256 -0.945 -0.326 -0.025 1.144 2.051 0.684 -0.577 -0.204 0.791 1.042 2.254 1.279 -0.780 -0.626 -0.027 1.042 2.254 1.403 -0.774 -0.623 -0.109 1.042 2.254 5.467 -0.949 -0.285 0.135 0.891 2.254 6.154 -0.766 -0.503 -0.401 1.042 2.254 5.478 -0.949 -0.286 0.131 1.032 2.273 1.367 -0.771 -0.629 -0.100 1.041 2.256 5.470 -0.949 -0.287 0.134 0.790 2.755 8.205 0.949 0.285 -0.134 0.793 2.753 8.205 0.948 0.287 -0.134 0.792 2.755 8.195 0.949 0.286 -0.130 0.792 2.755 8.208 0.949 0.285 -0.135 0.768 2.755 12.307 0.724 0.567 0.393 0.801 2.736 12.307 0.713 0.581 0.392 0.792 2.755 12.271 0.714 0.575 0.399 0.792 2.755 12.396 0.741 0.594 0.313 0.623 3.006 8.205 0.983 -0.111 -0.146 0.666 3.006 7.899 0.995 -0.094 0.013 0.666 3.006 8.289 0.981 -0.103 -0.166 0.481 3.006 12.307 0.896 0.119 0.427 0.666 3.006 11.946 0.796 0.205 0.569 0.633 3.006 12.991 0.587 0.160 -0.794 0.690 2.959 12.991 0.577 0.203 -0.791 0.620 3.098 8.205 0.963 -0.222 -0.153 0.377 3.256 12.307 0.844 -0.297 0.447 0.541 3.256 11.957 0.798 -0.235 0.554 0.507 3.256 12.991 0.590 -0.171 -0.789 0.418 3.501 12.307 0.605 -0.683 0.408 0.513 3.312 12.991 0.570 -0.224 -0.790 0.025 4.258 5.470 0.775 0.624 0.106 0.047 4.245 5.470 0.763 0.637 0.106 0.040 4.258 5.446 0.767 0.632 0.112 0.040 4.258 5.529 0.770 0.633 0.083 -0.252 4.508 5.470 0.977 0.188 0.102 -0.085 4.508 5.136 0.910 0.334 0.246 -0.085 4.508 6.145 0.880 0.239 -0.410 -0.232 4.759 1.367 0.968 0.224 -0.114 -0.190 4.717 1.367 0.956 0.270 -0.117 -0.210 4.759 1.259 0.975 0.224 -0.015 -0.210 4.759 1.409 0.965 0.233 -0.124 -0.353 4.759 5.470 0.884 -0.456 0.108 -0.210 4.759 5.158 0.878 -0.409 0.248 -0.210 4.759 6.088 0.840 -0.409 -0.356 -0.295 4.759 12.307 -0.626 0.637 0.450 2.281 0.000 0.684 0.466 -0.202 0.861 2.289 0.194 0.684 0.411 -0.345 0.843 2.386 0.000 0.491 0.420 -0.181 0.889 2.129 0.250 1.367 0.697 -0.710 -0.103 2.261 0.250 0.782 0.493 -0.517 0.700 2.386 0.000 1.837 0.738 -0.364 -0.568 2.261 0.250 1.663 0.669 -0.706 -0.232 2.180 0.000 5.470 0.719 -0.686 0.108 2.268 0.236 5.470 0.407 -0.905 0.123 2.386 0.000 5.023 0.371 -0.823 0.429 2.301 0.000 6.154 0.527 -0.710 -0.467 2.336 0.101 6.154 0.457 -0.759 -0.463 2.386 0.000 6.310 0.483 -0.701 -0.525 2.187 0.250 8.205 -0.883 0.456 -0.108 2.269 0.000 10.256 0.838 -0.545 0.000 2.304 0.164 10.256 0.775 -0.632 -0.005 2.386 0.000 9.946 0.838 -0.530 0.134 2.386 0.000 10.567 0.824 -0.551 -0.133 2.171 0.000 12.307 -0.856 0.296 0.425 2.065 0.250 12.307 -0.880 -0.203 0.430 2.180 0.413 1.367 0.554 -0.827 -0.100 2.086 0.501 8.205 -0.989 -0.100 -0.109 1.809 0.751 8.205 -0.775 -0.624 -0.106 1.327 1.753 0.684 -0.590 0.171 0.789 1.457 1.753 1.367 -0.936 0.329 -0.128 1.201 2.004 0.684 -0.587 -0.160 0.794 1.352 2.004 1.367 -0.985 -0.131 -0.115 1.210 2.004 5.470 -0.983 0.111 0.146 1.066 2.254 1.367 -0.784 -0.613 -0.101 1.043 2.254 5.470 -0.949 -0.285 0.134 0.942 2.755 7.521 0.766 0.503 0.401 1.036 2.700 7.521 0.719 0.569 0.398 1.008 2.755 7.439 0.726 0.532 0.435 1.114 2.543 8.205 0.690 0.717 -0.099 1.008 2.755 8.568 0.804 0.509 -0.306 1.067 2.639 12.307 0.531 0.761 0.372 1.008 2.755 12.070 0.533 0.733 0.423 1.008 2.755 12.852 0.540 0.714 -0.445 0.703 3.006 3.419 0.945 0.326 0.025 0.980 2.813 3.419 0.773 0.634 0.006 0.883 3.006 3.062 0.873 0.443 0.202 0.883 3.006 3.806 0.854 0.478 -0.203 0.714 3.006 7.521 0.906 -0.021 0.422 0.883 3.006 7.257 0.791 0.063 0.608 0.883 3.006 8.676 0.825 0.000 -0.565 0.883 3.006 11.777 0.476 0.350 0.807 0.991 2.790 12.991 0.423 0.491 -0.762 0.552 3.256 3.419 0.993 -0.113 0.030 0.758 3.256 2.946 0.919 -0.027 0.394 0.758 3.256 3.941 0.892 0.004 -0.453 0.665 3.256 7.521 0.728 -0.533 0.431 0.758 3.256 7.363 0.691 -0.501 0.520 0.580 3.256 8.205 0.814 -0.556 -0.164 0.758 3.256 8.573 0.748 -0.554 -0.366 0.758 3.256 11.740 0.311 -0.087 0.946 0.494 3.507 3.419 0.841 -0.541 0.027 0.633 3.507 3.092 0.845 -0.502 0.186 0.633 3.507 3.796 0.841 -0.509 -0.186 0.700 3.372 7.521 0.604 -0.671 0.430 0.647 3.479 8.205 0.476 -0.866 -0.152 0.418 3.507 12.307 0.588 -0.699 0.408 0.633 3.507 11.852 0.339 -0.629 0.699 0.514 3.507 12.991 0.337 -0.514 -0.789 0.545 3.681 3.419 0.676 -0.737 0.030 0.520 3.731 12.307 0.165 -0.912 0.376 0.573 3.625 12.991 0.238 -0.576 -0.782 0.306 4.160 5.470 0.538 0.839 0.087 0.257 4.258 5.264 0.556 0.817 0.150 0.257 4.258 5.942 0.554 0.821 -0.140 0.102 4.508 1.367 0.690 0.712 -0.130 0.141 4.490 1.367 0.670 0.731 -0.129 0.132 4.508 1.264 0.678 0.734 -0.037 0.132 4.508 1.401 0.674 0.726 -0.138 0.132 4.508 4.952 0.636 0.558 0.534 -0.082 4.508 6.154 0.872 0.244 -0.424 0.233 4.306 6.154 0.582 0.722 -0.374 0.132 4.508 6.433 0.654 0.528 -0.541 -0.027 4.508 10.256 0.931 0.364 0.020 0.223 4.327 10.256 0.762 0.648 0.023 0.132 4.508 9.936 0.847 0.508 0.157 0.132 4.508 10.608 0.853 0.498 -0.157 -0.083 4.759 0.684 0.542 0.221 0.811 0.064 4.645 0.684 0.502 0.356 0.788 0.007 4.759 0.552 0.493 0.268 0.827 0.007 4.759 1.776 0.794 0.518 -0.319 0.007 4.759 4.915 0.474 -0.131 0.871 -0.195 4.759 6.154 0.803 -0.366 -0.470 0.007 4.759 6.501 0.685 -0.102 -0.722 -0.177 4.759 10.256 0.994 -0.112 0.009 0.007 4.759 9.805 0.947 0.075 0.312 0.007 4.759 10.724 0.942 0.022 -0.335 2.284 0.250 0.684 0.358 -0.421 0.833 2.603 0.000 0.262 0.290 -0.029 0.957 2.478 0.250 0.351 0.187 -0.422 0.887 2.603 0.000 1.947 0.337 0.092 -0.937 2.478 0.250 1.912 0.120 -0.675 -0.728 2.280 0.250 5.470 0.355 -0.926 0.124 2.603 0.000 4.896 -0.048 -0.582 0.812 2.478 0.250 5.108 0.085 -0.948 0.307 2.439 0.250 6.154 0.131 -0.886 -0.445 2.603 0.000 6.561 0.075 -0.700 -0.710 2.478 0.250 6.213 0.103 -0.878 -0.467 2.313 0.250 10.256 0.583 -0.813 -0.010 2.603 0.000 9.644 0.279 -0.443 0.852 2.478 0.250 9.837 0.456 -0.851 0.259 2.603 0.000 10.869 0.239 -0.497 -0.834 2.478 0.250 10.660 0.432 -0.867 -0.248 2.368 0.469 0.684 0.148 -0.587 0.796 2.223 0.501 1.367 0.243 -0.965 -0.095 2.352 0.501 0.821 0.154 -0.799 0.581 2.352 0.501 1.631 0.166 -0.967 -0.193 2.391 0.424 5.470 0.004 -0.994 0.113 2.461 0.284 6.154 0.099 -0.890 -0.444 2.388 0.430 10.256 0.328 -0.944 -0.015 2.290 0.626 1.367 0.138 -0.986 -0.092 1.291 2.624 7.521 0.507 0.774 0.380 1.225 2.755 7.299 0.510 0.705 0.493 1.344 2.517 8.205 0.485 0.871 -0.083 1.225 2.755 8.677 0.541 0.686 -0.487 1.279 2.648 12.307 0.364 0.861 0.355 1.225 2.755 12.080 0.363 0.844 0.395 1.225 2.755 12.860 0.366 0.824 -0.433 1.224 2.758 3.419 0.549 0.836 -0.005 1.100 3.006 2.884 0.636 0.595 0.492 1.100 3.006 3.966 0.589 0.640 -0.494 1.100 3.006 7.093 0.516 0.241 0.822 1.100 3.006 8.778 0.369 0.153 -0.917 1.100 3.006 11.751 0.193 0.392 0.899 1.214 2.778 12.991 0.285 0.614 -0.736 0.975 3.256 2.791 0.421 0.107 0.901 0.975 3.256 4.072 0.348 0.151 -0.925 0.975 3.256 7.113 0.413 -0.392 0.822 0.975 3.256 8.761 0.241 -0.372 -0.896 0.975 3.256 11.709 0.068 0.045 0.997 0.850 3.507 2.814 0.358 -0.367 0.858 0.850 3.507 4.060 0.302 -0.291 -0.908 0.760 3.507 7.521 0.185 -0.905 0.383 0.850 3.507 7.389 0.121 -0.888 0.443 0.657 3.507 8.205 0.351 -0.925 -0.145 0.850 3.507 8.569 0.221 -0.918 -0.329 0.850 3.507 11.731 0.049 -0.311 0.949 0.567 3.757 3.419 0.387 -0.922 0.026 0.724 3.757 3.057 0.355 -0.912 0.207 0.724 3.757 3.827 0.335 -0.917 -0.214 0.812 3.582 7.521 0.099 -0.919 0.381 0.759 3.687 8.205 0.100 -0.987 -0.123 0.549 3.757 12.307 0.067 -0.933 0.352 0.724 3.757 11.983 -0.011 -0.879 0.477 0.719 3.757 12.991 -0.066 -0.726 -0.685 0.647 3.913 3.419 0.255 -0.967 0.022 0.652 3.902 12.307 -0.029 -0.929 0.369 0.722 3.761 12.991 -0.068 -0.725 -0.685 0.511 4.184 5.470 0.370 0.926 0.074 0.474 4.258 5.302 0.378 0.919 0.116 0.474 4.258 5.845 0.366 0.928 -0.068 0.377 4.452 1.367 0.468 0.875 -0.121 0.349 4.508 1.059 0.455 0.864 0.213 0.349 4.508 1.483 0.477 0.865 -0.158 0.349 4.508 4.921 0.371 0.681 0.631 0.450 4.305 6.154 0.357 0.866 -0.349 0.349 4.508 6.495 0.378 0.724 -0.576 0.465 4.276 10.256 0.525 0.851 0.017 0.349 4.508 9.750 0.629 0.686 0.366 0.349 4.508 10.792 0.610 0.674 -0.417 0.318 4.570 0.684 0.329 0.546 0.770 0.223 4.759 0.395 0.337 0.420 0.843 0.223 4.759 1.879 0.545 0.668 -0.507 0.223 4.759 4.875 0.096 -0.022 0.995 0.223 4.759 6.622 0.416 0.284 -0.864 0.223 4.759 9.633 0.503 0.231 0.833 0.223 4.759 10.891 0.449 0.158 -0.879 2.820 0.000 0.211 0.141 0.245 0.959 2.695 0.250 0.220 -0.044 -0.377 0.925 2.820 0.000 1.960 0.176 0.256 -0.951 2.695 0.250 1.958 -0.029 -0.289 -0.957 2.820 0.000 4.877 -0.091 -0.258 0.962 2.695 0.250 4.971 -0.238 -0.836 0.494 2.820 0.000 6.624 -0.276 -0.551 -0.788 2.695 0.250 6.416 -0.230 -0.798 -0.557 2.820 0.000 9.578 0.193 -0.202 0.960 2.695 0.250 9.637 0.024 -0.637 0.770 2.820 0.000 10.935 0.159 -0.265 -0.951 2.695 0.250 10.864 -0.006 -0.696 -0.718 2.398 0.501 0.684 0.077 -0.617 0.783 2.569 0.501 0.449 -0.042 -0.555 0.831 2.569 0.501 1.856 0.021 -0.811 -0.585 2.574 0.492 5.470 -0.305 -0.948 0.089 2.617 0.406 6.154 -0.245 -0.881 -0.405 2.467 0.501 10.256 -0.019 -1.000 -0.014 2.569 0.501 10.024 -0.072 -0.996 0.061 2.569 0.501 10.466 -0.077 -0.994 -0.074 2.502 0.635 0.684 -0.058 -0.628 0.776 2.453 0.734 1.367 -0.188 -0.978 -0.084 2.525 0.589 10.256 -0.076 -0.997 -0.015 1.496 2.647 7.521 0.290 0.883 0.370 1.442 2.755 7.326 0.286 0.846 0.449 1.550 2.539 8.205 0.308 0.947 -0.086 1.442 2.755 8.663 0.239 0.852 -0.465 1.446 2.747 12.307 0.221 0.918 0.330 1.442 2.755 12.289 0.222 0.917 0.332 1.442 2.755 12.361 0.223 0.930 0.293 1.438 2.763 3.419 0.409 0.913 -0.010 1.317 3.006 2.851 0.343 0.683 0.645 1.317 3.006 3.983 0.316 0.727 -0.609 1.317 3.006 7.059 0.185 0.442 0.878 1.317 3.006 8.791 0.102 0.227 -0.968 1.317 3.006 11.792 -0.036 0.533 0.845 1.405 2.829 12.991 0.089 0.616 -0.782 1.192 3.256 2.755 0.215 0.196 0.957 1.192 3.256 4.096 0.179 0.259 -0.949 1.192 3.256 7.031 0.065 -0.220 0.973 1.192 3.256 8.791 0.000 -0.161 -0.987 1.192 3.256 11.717 -0.016 0.145 0.989 1.067 3.507 2.748 0.174 -0.154 0.973 1.008 3.507 4.102 0.181 -0.137 -0.974 1.152 3.336 4.102 0.173 0.149 -0.974 1.067 3.507 4.151 0.154 -0.116 -0.981 1.067 3.507 7.186 -0.109 -0.782 0.614 1.067 3.507 8.729 0.063 -0.649 -0.758 1.067 3.507 11.716 -0.081 -0.161 0.984 0.941 3.757 2.820 0.212 -0.566 0.796 1.037 3.565 4.102 0.131 -0.185 -0.974 0.941 3.757 4.045 0.116 -0.543 -0.832 0.971 3.698 7.521 -0.189 -0.912 0.363 0.895 3.757 8.205 -0.182 -0.979 -0.090 0.941 3.757 8.018 -0.210 -0.977 -0.026 0.941 3.757 8.275 -0.201 -0.974 -0.101 0.941 3.757 11.822 -0.122 -0.648 0.752 0.774 4.007 3.419 -0.116 -0.993 0.012 0.816 4.007 3.330 -0.130 -0.991 0.031 0.816 4.007 3.519 -0.133 -0.991 -0.011 0.925 3.790 8.205 -0.197 -0.976 -0.087 0.828 3.984 12.307 -0.242 -0.908 0.341 0.882 3.875 12.991 -0.202 -0.633 -0.747 0.800 4.040 3.419 -0.132 -0.991 0.011 0.628 4.258 5.470 0.293 0.954 0.069 0.564 4.508 1.367 0.261 0.959 -0.114 0.684 4.271 5.470 0.236 0.969 0.070 0.566 4.508 4.963 0.142 0.843 0.520 0.634 4.371 6.154 0.095 0.912 -0.398 0.566 4.508 6.401 0.066 0.844 -0.532 0.676 4.288 10.256 0.379 0.925 0.011 0.566 4.508 9.720 0.407 0.810 0.422 0.566 4.508 10.813 0.376 0.802 -0.464 0.520 4.600 0.684 0.153 0.585 0.796 0.440 4.759 0.410 0.153 0.509 0.847 0.566 4.509 1.367 0.259 0.959 -0.114 0.440 4.759 1.880 0.311 0.791 -0.527 0.440 4.759 4.876 0.037 0.202 0.979 0.440 4.759 6.623 0.098 0.575 -0.812 0.440 4.759 9.592 0.302 0.306 0.903 0.440 4.759 10.929 0.257 0.257 -0.932 3.037 0.000 0.262 0.004 0.500 0.866 2.912 0.250 0.211 -0.250 -0.210 0.945 3.037 0.000 1.955 -0.074 0.226 -0.971 2.912 0.250 1.962 -0.060 -0.021 -0.998 3.037 0.000 4.878 -0.242 -0.135 0.961 2.912 0.250 4.949 -0.474 -0.707 0.525 3.037 0.000 6.583 -0.584 -0.294 -0.757 2.912 0.250 6.435 -0.518 -0.660 -0.545 2.852 0.000 9.572 0.183 -0.225 0.957 2.957 0.159 9.572 -0.063 -0.348 0.935 3.037 0.000 9.473 -0.021 -0.244 0.970 2.912 0.250 9.589 -0.091 -0.412 0.906 2.846 0.000 10.940 0.151 -0.283 -0.947 2.966 0.141 10.940 -0.076 -0.392 -0.917 2.912 0.250 10.916 -0.107 -0.474 -0.874 3.037 0.000 11.043 -0.057 -0.297 -0.953 2.786 0.501 0.348 -0.224 -0.445 0.867 2.786 0.501 1.911 -0.248 -0.567 -0.785 2.639 0.501 5.470 -0.360 -0.929 0.088 2.786 0.501 5.365 -0.450 -0.886 0.111 2.821 0.432 6.154 -0.499 -0.777 -0.384 2.786 0.501 5.739 -0.461 -0.887 -0.009 2.786 0.501 9.761 -0.179 -0.914 0.364 2.786 0.501 10.727 -0.176 -0.927 -0.331 2.685 0.703 0.684 -0.264 -0.625 0.735 2.525 0.751 1.367 -0.291 -0.954 -0.078 2.661 0.751 1.015 -0.366 -0.905 0.216 2.661 0.751 1.518 -0.375 -0.920 -0.113 2.761 0.552 5.470 -0.447 -0.890 0.090 2.688 0.697 10.256 -0.252 -0.968 -0.017 2.627 0.820 1.367 -0.370 -0.926 -0.079 1.638 2.755 7.521 0.085 0.930 0.358 1.728 2.617 8.205 0.054 0.994 -0.091 1.659 2.755 7.561 0.053 0.951 0.304 1.659 2.755 8.502 0.038 0.978 -0.206 1.454 2.755 12.307 0.216 0.918 0.331 1.635 2.803 3.419 0.196 0.981 -0.013 1.534 3.006 2.918 0.096 0.908 0.407 1.534 3.006 3.905 0.095 0.922 -0.376 1.655 2.763 7.521 0.042 0.931 0.363 1.534 3.006 7.127 -0.164 0.636 0.754 1.534 3.006 8.768 -0.145 0.417 -0.897 1.617 2.840 12.307 -0.119 0.892 0.436 1.534 3.006 11.972 -0.175 0.817 0.550 1.543 2.987 12.991 -0.128 0.593 -0.795 1.409 3.256 2.758 0.018 0.284 0.959 1.409 3.256 4.082 0.008 0.341 -0.940 1.409 3.256 7.039 -0.316 -0.013 0.949 1.409 3.256 8.792 -0.101 -0.009 -0.995 1.409 3.256 11.749 -0.169 0.307 0.937 1.158 3.507 2.735 0.154 -0.110 0.982 1.336 3.402 2.735 0.019 0.180 0.983 1.283 3.507 2.677 -0.007 -0.016 1.000 1.357 3.359 4.102 -0.005 0.285 -0.958 1.283 3.507 4.201 -0.094 0.057 -0.994 1.283 3.507 7.133 -0.382 -0.613 0.692 1.283 3.507 8.765 -0.208 -0.430 -0.879 1.283 3.507 11.725 -0.226 -0.070 0.972 1.235 3.604 2.735 -0.025 -0.191 0.981 1.158 3.757 2.760 -0.004 -0.302 0.953 1.193 3.687 4.102 -0.089 -0.262 -0.961 1.158 3.757 4.091 -0.073 -0.311 -0.948 1.166 3.741 7.521 -0.395 -0.850 0.349 1.158 3.757 7.601 -0.386 -0.888 0.248 1.158 3.757 8.496 -0.334 -0.922 -0.196 1.158 3.757 11.796 -0.358 -0.494 0.793 1.033 4.007 2.992 -0.208 -0.953 0.219 1.033 4.007 3.866 -0.229 -0.947 -0.224 1.087 3.898 8.205 -0.321 -0.943 -0.085 0.960 4.007 12.307 -0.357 -0.878 0.320 1.033 4.007 12.240 -0.394 -0.854 0.340 1.085 3.903 12.991 -0.330 -0.516 -0.790 1.033 4.007 12.437 -0.412 -0.885 0.216 0.952 4.170 3.419 -0.239 -0.971 0.007 1.018 4.037 12.307 -0.390 -0.860 0.330 0.857 4.359 5.470 -0.106 0.991 0.084 0.782 4.508 5.141 -0.179 0.948 0.262 0.749 4.508 6.154 -0.147 0.887 -0.437 0.782 4.508 6.070 -0.213 0.920 -0.328 0.867 4.340 10.256 0.156 0.988 0.007 0.782 4.508 9.809 0.151 0.950 0.274 0.782 4.508 10.717 0.128 0.950 -0.283 0.679 4.715 0.684 -0.039 0.552 0.833 0.657 4.759 0.606 -0.041 0.539 0.841 0.756 4.561 1.367 0.044 0.994 -0.096 0.657 4.759 1.788 0.025 0.927 -0.374 0.657 4.759 4.902 -0.016 0.596 0.803 0.772 4.530 6.154 -0.222 0.867 -0.445 0.657 4.759 6.506 -0.257 0.700 -0.666 0.657 4.759 9.588 0.166 0.444 0.880 0.657 4.759 10.929 0.127 0.415 -0.901 3.254 0.000 0.491 -0.112 0.577 0.809 3.128 0.250 0.320 -0.405 0.009 0.914 3.254 0.000 1.874 -0.144 0.832 -0.536 3.128 0.250 1.941 -0.373 -0.003 -0.928 3.254 0.000 4.947 -0.696 0.015 0.718 3.128 0.250 5.014 -0.719 -0.584 0.376 3.254 0.000 6.375 -0.792 0.045 -0.609 3.128 0.250 6.279 -0.740 -0.470 -0.480 3.190 0.126 9.572 -0.207 -0.106 0.973 3.254 0.000 9.534 -0.163 0.097 0.982 3.128 0.250 9.582 -0.252 -0.307 0.918 3.195 0.117 10.940 -0.203 -0.104 -0.974 3.128 0.250 10.928 -0.254 -0.344 -0.904 3.254 0.000 10.981 -0.159 0.106 -0.981 3.003 0.501 0.406 -0.394 -0.286 0.874 3.003 0.501 1.890 -0.588 -0.497 -0.638 3.003 0.501 5.406 -0.616 -0.781 0.107 3.079 0.350 6.154 -0.726 -0.538 -0.428 3.003 0.501 5.617 -0.627 -0.778 0.038 3.003 0.501 9.701 -0.420 -0.735 0.533 3.003 0.501 10.796 -0.408 -0.766 -0.497 2.906 0.695 0.684 -0.422 -0.487 0.765 2.878 0.751 0.939 -0.535 -0.773 0.341 2.878 0.751 1.559 -0.553 -0.821 -0.139 2.987 0.533 5.470 -0.613 -0.784 0.093 2.889 0.730 10.256 -0.452 -0.892 -0.013 2.832 0.843 1.367 -0.545 -0.834 -0.086 1.820 2.755 8.205 -0.087 0.991 -0.097 1.787 2.933 3.419 -0.001 1.000 -0.010 1.751 3.006 3.231 0.000 0.999 0.047 1.751 3.006 3.594 0.005 0.998 -0.057 1.791 2.926 7.521 -0.423 0.794 0.436 1.751 3.006 7.393 -0.459 0.740 0.492 1.857 2.793 8.205 -0.271 0.957 -0.107 1.751 3.006 8.619 -0.462 0.794 -0.394 1.703 3.006 12.307 -0.286 0.850 0.442 1.553 3.006 12.991 -0.137 0.590 -0.796 1.626 3.256 2.809 -0.183 0.520 0.834 1.626 3.256 4.026 -0.168 0.561 -0.811 1.626 3.256 7.162 -0.659 0.188 0.728 1.626 3.256 8.757 -0.402 0.217 -0.889 1.725 3.057 12.307 -0.468 0.753 0.463 1.626 3.256 11.951 -0.593 0.535 0.602 1.632 3.243 12.991 -0.430 0.332 -0.840 1.407 3.507 2.735 -0.151 0.086 0.985 1.500 3.507 2.747 -0.171 0.128 0.977 1.460 3.507 4.102 -0.195 0.136 -0.971 1.500 3.507 4.096 -0.191 0.149 -0.970 1.500 3.507 7.206 -0.660 -0.383 0.647 1.500 3.507 8.742 -0.564 -0.344 -0.750 1.500 3.507 11.813 -0.563 0.089 0.821 1.375 3.757 2.753 -0.218 -0.203 0.955 1.375 3.757 4.091 -0.232 -0.193 -0.953 1.386 3.734 7.521 -0.582 -0.704 0.407 1.375 3.757 7.588 -0.568 -0.764 0.306 1.375 3.757 8.531 -0.558 -0.794 -0.241 1.375 3.757 11.871 -0.627 -0.369 0.686 1.250 4.007 2.893 -0.407 -0.808 0.426 1.250 4.007 3.954 -0.421 -0.798 -0.431 1.290 3.927 8.205 -0.515 -0.853 -0.083 1.250 4.007 12.245 -0.554 -0.732 0.397 1.343 3.821 12.991 -0.439 -0.295 -0.848 1.250 4.007 12.419 -0.583 -0.765 0.273 1.145 4.217 3.419 -0.417 -0.909 0.003 1.235 4.038 12.307 -0.550 -0.741 0.385 0.955 4.508 5.470 -0.284 0.955 0.087 1.009 4.489 10.256 -0.175 0.985 0.003 0.999 4.508 10.198 -0.172 0.985 0.022 0.999 4.508 10.316 -0.174 0.985 -0.016 0.710 4.759 0.684 -0.059 0.548 0.834 0.900 4.707 1.367 -0.276 0.957 -0.091 0.874 4.759 1.167 -0.287 0.946 0.148 0.874 4.759 1.479 -0.289 0.948 -0.134 0.981 4.546 5.470 -0.404 0.911 0.086 0.874 4.759 5.075 -0.535 0.768 0.352 0.870 4.759 6.154 -0.561 0.668 -0.490 0.874 4.759 6.140 -0.574 0.672 -0.467 0.874 4.759 9.635 0.022 0.710 0.704 0.874 4.759 10.879 0.002 0.701 -0.713 3.368 0.000 0.684 -0.153 0.559 0.815 3.358 0.226 0.684 -0.449 0.190 0.873 3.345 0.250 0.659 -0.460 0.165 0.872 3.471 0.000 1.040 -0.365 0.877 0.313 3.471 0.000 1.559 -0.369 0.918 -0.143 3.345 0.250 1.783 -0.879 0.245 -0.408 3.471 0.000 5.233 -0.939 0.280 0.200 3.345 0.250 5.261 -0.914 -0.374 0.159 3.386 0.000 6.154 -0.832 0.143 -0.536 3.220 0.250 6.154 -0.789 -0.418 -0.451 3.471 0.000 5.871 -0.943 0.291 -0.162 3.345 0.250 5.840 -0.933 -0.342 -0.110 3.295 0.000 9.572 -0.183 0.118 0.976 3.471 0.000 9.632 -0.379 0.423 0.823 3.345 0.250 9.622 -0.529 -0.271 0.804 3.298 0.000 10.940 -0.179 0.132 -0.975 3.471 0.000 10.881 -0.368 0.439 -0.820 3.345 0.250 10.890 -0.525 -0.283 -0.803 3.220 0.501 0.675 -0.531 -0.151 0.834 3.220 0.501 1.747 -0.885 -0.333 -0.325 3.068 0.501 5.470 -0.653 -0.752 0.092 3.267 0.407 5.470 -0.859 -0.504 0.089 3.220 0.501 9.759 -0.692 -0.634 0.346 3.220 0.501 10.745 -0.680 -0.652 -0.336 3.216 0.509 0.684 -0.532 -0.157 0.832 3.095 0.751 1.341 -0.735 -0.675 -0.071 3.095 0.751 1.379 -0.732 -0.674 -0.095 3.111 0.719 10.256 -0.628 -0.778 -0.009 3.092 0.758 1.367 -0.731 -0.676 -0.092 2.841 1.252 8.205 0.961 0.254 -0.113 2.847 1.247 8.205 0.959 0.260 -0.113 2.844 1.252 8.185 0.961 0.256 -0.105 2.844 1.252 8.212 0.960 0.255 -0.115 2.692 1.503 8.205 0.981 -0.155 -0.119 2.719 1.503 8.047 0.987 -0.153 -0.046 2.719 1.503 8.264 0.980 -0.149 -0.135 2.692 1.556 8.205 0.968 -0.219 -0.122 1.831 3.006 3.419 -0.032 0.999 -0.008 1.823 3.006 7.521 -0.488 0.752 0.443 1.947 3.006 8.205 -0.593 0.797 -0.118 1.919 3.102 3.419 -0.447 0.895 -0.006 1.842 3.256 3.062 -0.554 0.812 0.181 1.842 3.256 3.769 -0.539 0.823 -0.178 1.836 3.256 7.521 -0.842 0.296 0.451 1.949 3.042 8.205 -0.711 0.693 -0.118 1.842 3.256 7.547 -0.861 0.307 0.406 1.842 3.256 8.526 -0.901 0.349 -0.257 1.792 3.256 12.307 -0.662 0.572 0.484 1.636 3.256 12.991 -0.433 0.325 -0.841 1.717 3.507 2.827 -0.523 0.354 0.775 1.717 3.507 4.014 -0.507 0.372 -0.778 1.795 3.351 7.521 -0.878 0.119 0.464 1.717 3.507 7.489 -0.867 -0.157 0.472 1.717 3.507 8.584 -0.931 -0.126 -0.341 1.771 3.400 12.307 -0.825 0.318 0.467 1.717 3.507 12.176 -0.856 0.202 0.476 1.622 3.507 12.991 -0.495 0.059 -0.867 1.717 3.507 12.570 -0.971 0.216 0.100 1.592 3.757 2.803 -0.553 -0.129 0.823 1.592 3.757 4.041 -0.542 -0.123 -0.831 1.700 3.541 7.521 -0.863 -0.199 0.464 1.592 3.757 7.870 -0.805 -0.588 0.081 1.592 3.757 8.381 -0.800 -0.578 -0.164 1.592 3.757 12.155 -0.845 -0.162 0.510 1.438 3.757 12.991 -0.461 -0.233 -0.856 1.592 3.757 12.588 -0.978 -0.204 0.051 1.467 4.007 2.943 -0.683 -0.657 0.317 1.467 4.007 3.901 -0.684 -0.656 -0.319 1.538 3.865 8.205 -0.760 -0.643 -0.092 1.314 4.007 12.307 -0.595 -0.697 0.400 1.523 3.895 12.307 -0.816 -0.335 0.470 1.364 4.214 3.419 -0.601 -0.799 0.002 1.024 4.508 10.256 -0.180 0.984 0.003 0.934 4.759 1.367 -0.294 0.952 -0.091 1.068 4.759 5.470 -0.616 0.782 0.091 1.159 4.622 10.256 -0.443 0.897 0.001 1.091 4.759 9.895 -0.468 0.865 0.184 1.091 4.759 10.618 -0.472 0.862 -0.183 3.359 0.250 0.684 -0.461 0.168 0.872 3.563 0.000 1.367 -0.398 0.914 -0.077 3.550 0.250 1.367 -0.919 0.382 -0.097 3.586 0.000 5.470 -0.934 0.345 0.094 3.461 0.250 5.470 -0.947 -0.309 0.083 3.687 0.000 9.984 -0.706 0.699 0.115 3.562 0.250 9.830 -0.962 -0.120 0.245 3.687 0.000 10.529 -0.703 0.702 -0.114 3.562 0.250 10.683 -0.962 -0.119 -0.247 3.225 0.501 0.684 -0.532 -0.150 0.834 3.429 0.501 1.367 -0.978 -0.187 -0.092 3.437 0.501 10.031 -0.889 -0.451 0.083 3.437 0.501 10.479 -0.886 -0.456 -0.084 3.103 0.751 1.367 -0.736 -0.671 -0.092 3.383 0.610 10.256 -0.855 -0.519 -0.003 3.079 1.002 3.419 0.885 0.465 -0.015 3.241 0.894 3.419 0.816 0.578 -0.009 3.187 1.002 3.186 0.848 0.524 0.077 3.187 1.002 3.634 0.855 0.511 -0.090 2.873 1.252 3.419 0.999 0.018 -0.028 3.061 1.252 2.945 0.935 0.113 0.336 3.061 1.252 3.850 0.949 0.079 -0.306 2.995 1.252 7.521 0.796 0.446 0.409 3.091 1.193 7.521 0.746 0.528 0.406 3.061 1.252 7.434 0.756 0.480 0.445 3.176 1.024 8.205 0.709 0.700 -0.090 3.061 1.252 8.590 0.819 0.471 -0.328 2.792 1.503 3.419 0.915 -0.403 -0.028 2.936 1.503 3.029 0.901 -0.383 0.206 2.936 1.503 3.759 0.903 -0.380 -0.201 2.798 1.503 7.521 0.890 -0.094 0.446 2.936 1.503 7.292 0.818 -0.029 0.574 2.936 1.503 8.681 0.830 -0.042 -0.556 2.934 1.503 12.307 0.877 0.034 0.479 2.939 1.497 12.307 0.877 0.041 0.479 2.936 1.503 12.303 0.877 0.034 0.479 2.936 1.503 12.324 0.885 0.035 0.465 2.833 1.709 3.419 0.708 -0.706 -0.030 2.783 1.753 7.521 0.656 -0.609 0.445 2.811 1.753 7.472 0.650 -0.602 0.463 2.653 1.753 8.205 0.767 -0.629 -0.126 2.811 1.753 8.548 0.731 -0.609 -0.308 2.932 1.511 12.307 0.877 0.025 0.480 2.795 1.786 7.521 0.630 -0.637 0.444 2.718 1.940 8.205 0.514 -0.850 -0.116 2.267 2.755 0.684 0.532 0.269 0.803 2.333 2.709 0.684 0.512 0.319 0.797 2.310 2.755 0.623 0.507 0.283 0.814 2.105 2.755 1.367 0.966 0.228 -0.118 2.419 2.537 1.367 0.689 0.718 -0.103 2.310 2.755 1.729 0.829 0.465 -0.310 2.083 3.006 0.684 0.550 -0.073 0.832 2.185 3.006 0.501 0.502 -0.043 0.864 1.973 3.006 1.367 0.980 -0.164 -0.110 2.185 3.006 1.819 0.870 -0.058 -0.489 2.042 3.006 10.256 0.963 0.270 -0.011 2.277 2.821 10.256 0.818 0.575 -0.018 2.185 3.006 9.930 0.916 0.368 0.157 2.185 3.006 10.563 0.910 0.383 -0.157 2.076 3.224 0.684 0.460 -0.305 0.834 1.919 3.256 1.367 0.817 -0.564 -0.115 2.059 3.256 0.728 0.495 -0.391 0.776 2.059 3.256 1.682 0.784 -0.563 -0.261 1.981 3.256 3.419 -0.576 0.818 -0.001 1.989 3.256 8.205 -0.912 0.393 -0.117 1.897 3.256 10.256 0.990 -0.138 -0.001 2.059 3.256 9.837 0.961 -0.089 0.263 2.059 3.256 10.669 0.964 -0.061 -0.257 1.967 3.441 1.367 0.626 -0.772 -0.111 1.990 3.396 3.419 -0.859 0.512 0.002 1.934 3.507 3.210 -0.912 0.402 0.077 1.934 3.507 3.630 -0.910 0.408 -0.074 1.737 3.507 7.521 -0.874 -0.150 0.463 1.908 3.507 8.205 -0.993 0.018 -0.115 1.863 3.507 10.256 0.867 -0.498 0.004 1.934 3.507 10.062 0.869 -0.489 0.071 1.934 3.507 10.453 0.872 -0.484 -0.067 1.778 3.507 12.307 -0.864 0.218 0.455 1.809 3.757 3.038 -0.978 0.005 0.210 1.809 3.757 3.807 -0.977 0.007 -0.212 1.709 3.757 8.205 -0.869 -0.485 -0.102 1.886 3.602 10.256 0.820 -0.572 0.004 1.670 3.757 12.307 -0.867 -0.132 0.481 1.684 4.007 3.221 -0.895 -0.440 0.077 1.684 4.007 3.621 -0.894 -0.442 -0.073 1.633 4.109 3.419 -0.854 -0.521 0.003 1.227 4.759 10.256 -0.513 0.858 0.000 3.783 0.000 10.256 -0.342 0.940 0.000 3.725 0.250 10.256 -1.000 -0.029 0.003 3.535 0.501 10.256 -0.897 -0.443 0.000 3.504 0.801 3.419 0.630 0.776 -0.002 3.403 1.002 2.944 0.692 0.663 0.284 3.403 1.002 3.880 0.712 0.644 -0.280 3.308 1.002 8.205 0.583 0.809 -0.078 3.417 0.976 8.205 0.519 0.852 -0.072 3.403 1.002 8.095 0.518 0.855 -0.038 3.403 1.002 8.260 0.521 0.850 -0.085 3.278 1.252 2.782 0.516 0.216 0.829 3.278 1.252 4.034 0.605 0.172 -0.778 3.349 1.110 7.521 0.538 0.748 0.388 3.278 1.252 7.279 0.563 0.657 0.502 3.278 1.252 8.701 0.588 0.608 -0.533 3.162 1.252 12.307 0.753 0.492 0.437 3.326 1.156 12.307 0.695 0.590 0.412 3.278 1.252 12.145 0.707 0.544 0.452 3.278 1.252 12.708 0.750 0.643 -0.152 3.153 1.503 2.778 0.443 -0.193 0.876 3.153 1.503 4.025 0.561 -0.256 -0.787 3.153 1.503 7.096 0.631 0.155 0.760 3.153 1.503 8.787 0.429 0.124 -0.895 3.153 1.503 11.902 0.751 0.163 0.640 3.027 1.503 12.991 0.606 0.128 -0.785 3.231 1.347 12.991 0.519 0.340 -0.785 2.837 1.753 3.419 0.539 -0.842 -0.029 3.028 1.753 2.937 0.406 -0.838 0.364 3.028 1.753 3.852 0.429 -0.842 -0.327 3.028 1.753 7.151 0.489 -0.482 0.727 3.028 1.753 8.765 0.457 -0.389 -0.800 2.841 1.753 12.307 0.788 -0.339 0.514 3.028 1.753 11.926 0.675 -0.284 0.681 2.926 1.753 12.991 0.534 -0.243 -0.810 2.929 1.951 3.419 0.207 -0.978 -0.024 2.905 2.000 7.521 0.121 -0.918 0.376 2.750 2.004 8.205 0.228 -0.968 -0.103 2.902 2.004 7.539 0.112 -0.931 0.348 2.902 2.004 8.509 0.143 -0.963 -0.230 2.882 2.004 12.307 0.363 -0.786 0.500 2.902 2.004 12.265 0.357 -0.784 0.508 2.953 1.903 12.991 0.429 -0.408 -0.806 2.902 2.004 12.463 0.399 -0.855 0.331 2.833 2.143 8.205 0.105 -0.990 -0.095 2.891 2.026 12.307 0.352 -0.793 0.497 2.597 2.616 0.684 0.375 0.536 0.756 2.527 2.755 0.453 0.379 0.429 0.820 2.647 2.514 1.367 0.462 0.883 -0.085 2.527 2.755 1.846 0.588 0.646 -0.486 2.443 2.755 5.470 0.803 0.582 0.128 2.559 2.690 5.470 0.743 0.659 0.121 2.527 2.755 5.356 0.763 0.629 0.151 2.527 2.755 5.813 0.771 0.636 -0.044 2.523 2.755 10.256 0.563 0.827 -0.014 2.527 2.754 10.256 0.561 0.828 -0.014 2.527 2.755 10.253 0.561 0.828 -0.013 2.527 2.755 10.259 0.561 0.828 -0.014 2.402 3.006 0.273 0.423 0.083 0.902 2.402 3.006 1.940 0.490 0.111 -0.865 2.198 3.006 5.470 0.990 0.054 0.127 2.402 3.006 5.079 0.912 0.226 0.343 2.329 3.006 6.154 0.877 0.111 -0.468 2.466 2.878 6.154 0.822 0.356 -0.445 2.402 3.006 6.270 0.842 0.156 -0.517 2.402 3.006 9.717 0.698 0.537 0.473 2.402 3.006 10.778 0.716 0.552 -0.428 2.070 3.256 0.684 0.437 -0.349 0.829 2.276 3.256 0.330 0.345 -0.280 0.896 2.276 3.256 1.914 0.522 -0.384 -0.762 2.099 3.256 5.470 0.938 -0.326 0.117 2.276 3.256 5.086 0.886 -0.284 0.367 2.243 3.256 6.154 0.784 -0.356 -0.509 2.276 3.256 6.216 0.773 -0.346 -0.532 2.276 3.256 9.632 0.568 0.061 0.821 2.276 3.256 10.877 0.595 0.099 -0.798 2.158 3.492 0.684 0.147 -0.561 0.815 1.988 3.507 1.367 0.390 -0.915 -0.105 2.151 3.507 0.732 0.142 -0.647 0.749 2.151 3.507 1.698 0.290 -0.920 -0.264 2.011 3.507 3.419 -0.808 0.589 0.005 2.114 3.507 5.470 0.554 -0.825 0.115 2.151 3.507 5.388 0.542 -0.828 0.142 2.252 3.306 6.154 0.753 -0.411 -0.515 2.151 3.507 5.635 0.545 -0.838 0.032 2.151 3.507 9.668 0.607 -0.383 0.696 2.151 3.507 10.848 0.613 -0.359 -0.704 2.069 3.671 1.367 0.204 -0.974 -0.094 1.956 3.757 3.419 -0.994 0.107 0.011 2.128 3.552 5.470 0.527 -0.842 0.112 1.916 3.757 10.256 0.356 -0.935 0.005 2.026 3.757 9.970 0.322 -0.938 0.128 2.026 3.757 10.549 0.324 -0.938 -0.126 1.770 4.007 3.419 -0.906 -0.424 0.004 1.966 3.876 10.256 0.277 -0.961 0.004 3.724 0.795 3.419 0.409 0.913 0.000 3.620 1.002 2.900 0.413 0.819 0.399 3.620 1.002 3.932 0.421 0.814 -0.401 3.540 1.002 8.205 0.389 0.919 -0.069 3.495 1.252 2.748 0.214 0.259 0.942 3.495 1.252 4.079 0.238 0.223 -0.945 3.556 1.130 7.521 0.227 0.885 0.406 3.495 1.252 7.300 0.217 0.844 0.491 3.618 1.007 8.205 0.295 0.953 -0.068 3.495 1.252 8.700 0.150 0.772 -0.618 3.576 1.091 12.307 0.517 0.762 0.389 3.495 1.252 11.998 0.537 0.694 0.480 3.495 1.252 12.935 0.422 0.639 -0.643 3.314 1.503 2.735 0.226 -0.079 0.971 3.429 1.384 2.735 0.213 0.093 0.973 3.370 1.503 2.689 0.206 -0.063 0.977 3.370 1.503 4.091 0.239 -0.111 -0.965 3.370 1.503 7.050 0.222 0.394 0.892 3.370 1.503 8.795 -0.070 0.231 -0.970 3.370 1.503 11.769 0.491 0.275 0.827 3.488 1.267 12.991 0.374 0.542 -0.753 3.337 1.568 2.735 0.167 -0.139 0.976 3.245 1.753 2.775 0.153 -0.428 0.891 3.245 1.753 4.036 0.300 -0.448 -0.842 3.245 1.753 7.040 0.200 -0.297 0.934 3.245 1.753 8.803 -0.085 -0.161 -0.983 3.245 1.753 11.747 0.428 -0.115 0.897 2.989 2.004 3.419 -0.025 -1.000 -0.017 3.119 2.004 3.131 -0.079 -0.993 0.092 3.119 2.004 3.680 -0.060 -0.993 -0.101 2.908 2.004 7.521 0.105 -0.922 0.373 3.119 2.004 7.240 0.009 -0.836 0.549 3.119 2.004 8.715 0.151 -0.757 -0.636 3.119 2.004 11.862 0.377 -0.605 0.701 2.968 2.004 12.991 0.273 -0.569 -0.776 3.067 2.109 3.419 -0.074 -0.997 -0.012 3.042 2.159 7.521 -0.037 -0.924 0.379 3.000 2.243 8.205 -0.172 -0.982 -0.081 3.005 2.233 12.307 0.087 -0.908 0.409 3.048 2.147 12.991 0.148 -0.618 -0.772 2.804 2.635 0.684 0.177 0.644 0.744 2.744 2.755 0.461 0.168 0.578 0.798 2.852 2.538 1.367 0.239 0.967 -0.089 2.744 2.755 1.833 0.137 0.858 -0.495 2.806 2.631 5.470 0.529 0.843 0.100 2.744 2.755 5.215 0.566 0.805 0.179 2.744 2.755 6.110 0.518 0.805 -0.291 2.542 2.755 10.256 0.548 0.837 -0.013 2.618 3.006 0.216 0.153 0.235 0.960 2.618 3.006 1.956 -0.027 0.218 -0.976 2.618 3.006 4.939 0.648 0.391 0.653 2.739 2.765 6.154 0.521 0.775 -0.357 2.618 3.006 6.485 0.660 0.394 -0.640 2.741 2.760 10.256 0.378 0.926 -0.006 2.618 3.006 9.681 0.318 0.675 0.665 2.618 3.006 10.825 0.384 0.679 -0.626 2.493 3.256 0.203 0.159 -0.172 0.972 2.493 3.256 1.954 -0.106 -0.178 -0.978 2.493 3.256 4.907 0.572 -0.101 0.814 2.493 3.256 6.537 0.673 -0.157 -0.723 2.493 3.256 9.589 0.214 0.174 0.961 2.493 3.256 10.924 0.268 0.195 -0.943 2.169 3.507 0.684 0.112 -0.580 0.807 2.368 3.507 0.401 0.049 -0.524 0.851 2.368 3.507 1.885 0.236 -0.664 -0.709 2.368 3.507 4.997 0.535 -0.665 0.522 2.264 3.507 6.154 0.452 -0.746 -0.490 2.368 3.507 6.336 0.414 -0.719 -0.558 2.368 3.507 9.587 0.224 -0.156 0.962 2.368 3.507 10.930 0.247 -0.142 -0.958 2.290 3.662 0.684 -0.002 -0.595 0.804 2.209 3.757 1.367 -0.153 -0.986 -0.072 2.243 3.757 1.263 -0.168 -0.986 0.009 2.243 3.757 1.421 -0.171 -0.982 -0.082 2.239 3.757 5.470 0.082 -0.993 0.083 2.243 3.757 5.462 0.080 -0.993 0.085 2.314 3.615 6.154 0.356 -0.801 -0.481 2.243 3.757 5.485 0.080 -0.994 0.078 2.243 3.757 9.665 0.368 -0.591 0.717 2.243 3.757 10.853 0.353 -0.589 -0.727 2.230 3.783 1.367 -0.166 -0.984 -0.071 2.241 3.761 5.470 0.080 -0.993 0.083 2.105 4.007 10.256 -0.098 -0.995 0.002 2.118 4.007 10.226 -0.103 -0.995 0.009 2.118 4.007 10.287 -0.103 -0.995 -0.004 2.112 4.019 10.256 -0.103 -0.995 0.002 surface_Al2O3_2 922 1037 4 1 3 4 2 4 1 5 6 2 5 7 9 4 3 8 5 7 10 6 5 8 3 11 12 13 5 11 16 15 14 12 4 14 17 18 15 4 19 21 22 20 5 23 25 20 19 24 5 7 9 28 27 26 5 7 10 30 29 26 5 11 13 32 33 31 3 11 31 16 4 17 34 35 18 4 21 36 37 22 3 23 38 25 4 27 39 40 28 4 29 41 42 30 4 43 32 33 44 4 43 45 46 44 4 34 47 48 35 4 36 49 50 37 4 51 39 40 52 4 51 41 42 52 4 53 45 46 54 4 53 47 48 54 5 55 57 50 49 56 5 55 60 59 58 56 3 55 61 57 3 55 61 60 3 62 63 64 5 62 67 66 65 63 4 65 68 69 66 4 70 72 73 71 4 70 74 75 71 3 76 77 78 3 76 77 79 5 62 64 81 82 80 3 62 80 67 4 68 83 84 69 4 72 85 86 73 4 87 74 75 88 4 87 89 90 88 5 76 78 92 93 91 5 76 79 94 95 91 5 96 98 81 82 97 3 96 97 99 4 83 100 101 84 4 85 102 103 86 4 89 104 105 90 5 106 108 93 92 107 5 106 109 95 94 107 3 96 110 98 5 96 99 112 111 110 4 111 100 101 112 5 113 115 103 102 114 5 113 118 117 116 114 4 116 104 105 117 5 106 108 121 120 119 5 106 109 123 122 119 3 113 124 115 3 113 124 118 5 125 127 121 120 126 5 125 128 123 122 126 3 125 129 127 3 125 129 128 3 130 2 4 3 130 2 6 5 130 4 9 132 131 5 130 6 10 133 131 3 134 15 16 3 134 15 18 3 135 20 22 3 135 20 25 4 9 28 136 132 4 10 30 137 133 3 138 31 33 5 138 139 134 16 31 4 134 18 35 139 5 135 22 37 141 140 6 135 140 143 142 38 25 4 28 40 144 136 4 30 42 145 137 3 138 44 33 6 138 44 46 147 146 139 5 139 35 48 148 146 4 37 50 149 141 3 142 150 143 4 52 40 144 151 4 52 42 145 151 4 54 46 147 152 4 54 48 148 152 4 50 57 153 149 4 59 60 155 154 4 61 57 153 156 4 61 60 155 156 3 157 66 67 3 157 66 69 3 158 71 73 3 158 71 75 3 159 80 82 5 159 160 157 67 80 4 157 69 84 160 5 158 73 86 162 161 6 158 161 164 163 88 75 3 163 88 90 3 165 91 93 3 165 91 95 3 159 97 82 6 159 97 99 167 166 160 5 160 84 101 168 166 4 86 103 169 162 3 163 170 164 5 163 90 105 171 170 5 165 93 108 173 172 5 165 95 109 174 172 4 112 99 167 175 4 112 101 168 175 4 103 115 176 169 4 117 118 178 177 4 117 105 171 177 4 108 121 179 173 4 109 123 180 174 4 124 115 176 181 4 124 118 178 181 4 121 127 182 179 4 123 128 183 180 4 129 127 182 184 4 129 128 183 184 3 185 131 132 3 185 131 133 4 185 132 136 186 4 185 133 137 186 3 187 140 141 3 187 140 143 4 186 136 144 188 4 186 137 145 188 3 189 146 147 3 189 146 148 5 187 141 149 191 190 6 187 190 193 192 150 143 3 188 151 144 3 188 151 145 3 189 152 147 3 189 152 148 5 194 153 149 191 195 6 194 195 193 192 154 155 3 194 156 153 3 194 156 155 3 196 161 162 3 196 161 164 3 197 166 167 3 197 166 168 5 196 162 169 199 198 6 196 198 201 200 170 164 3 200 170 171 3 202 172 173 3 202 172 174 3 197 175 167 3 197 175 168 5 203 176 169 199 204 6 203 204 201 200 177 178 3 200 177 171 4 202 173 179 205 4 202 174 180 205 3 203 181 176 3 203 181 178 4 205 179 182 206 4 205 180 183 206 3 206 184 182 3 206 184 183 3 207 208 209 3 207 208 210 3 211 212 213 3 211 212 214 4 211 213 216 215 4 211 214 217 215 3 215 218 216 3 215 218 217 3 219 190 191 3 219 190 193 3 219 195 191 3 219 195 193 3 220 198 199 3 220 198 201 3 220 204 199 3 220 204 201 3 221 222 223 3 221 222 224 4 221 223 226 225 4 221 224 227 225 3 228 229 230 3 228 229 231 5 232 234 233 209 208 5 232 236 235 210 208 3 237 238 239 3 237 238 240 3 241 242 243 3 241 242 244 3 232 245 234 3 232 245 236 3 246 247 248 3 246 247 249 3 250 251 252 3 250 251 253 5 246 248 254 213 212 5 246 249 255 214 212 4 250 252 257 256 4 250 253 258 256 3 259 260 261 3 259 260 262 4 213 216 263 254 4 214 217 264 255 3 256 265 257 3 256 265 258 4 259 261 267 266 4 259 262 268 266 5 269 270 263 216 218 5 269 271 264 217 218 4 266 267 273 272 4 266 268 274 272 3 269 275 270 3 269 275 271 3 272 276 273 3 272 276 274 4 222 223 278 277 4 222 224 279 277 3 280 281 282 3 280 281 283 4 223 226 284 278 4 224 227 285 279 3 286 287 288 3 286 287 289 5 280 282 290 230 229 5 280 283 291 231 229 5 292 233 234 294 293 5 292 235 236 295 293 3 296 297 298 6 296 297 300 299 238 239 5 299 302 301 240 238 5 303 305 304 243 242 6 303 242 244 306 307 308 4 245 234 294 309 4 245 236 295 309 3 299 310 300 3 299 310 302 3 303 311 305 3 303 311 308 3 312 247 248 3 312 247 249 4 251 252 314 313 4 251 253 315 313 5 312 248 254 317 316 5 312 249 255 318 316 3 319 320 321 5 319 257 252 314 320 4 253 258 322 315 4 260 261 324 323 5 325 326 323 260 262 3 325 326 327 4 254 263 328 317 4 255 264 329 318 4 319 321 331 330 5 319 257 265 332 330 5 332 333 322 258 265 4 261 267 334 324 4 325 262 268 335 4 325 327 336 335 4 263 270 337 328 4 264 271 338 329 3 330 339 331 4 330 339 340 332 3 332 340 333 4 267 273 341 334 4 335 268 274 342 4 335 336 343 342 5 344 345 337 270 275 5 344 346 338 271 275 4 276 273 341 347 5 342 348 347 276 274 3 342 348 343 3 344 349 345 3 344 349 346 4 277 278 351 350 4 277 279 352 350 4 281 282 354 353 4 281 283 355 353 4 278 284 356 351 4 279 285 357 352 4 287 288 359 358 4 287 289 360 358 4 282 290 361 354 5 362 291 283 355 363 5 364 365 366 294 293 5 364 367 368 295 293 5 369 371 370 298 297 3 369 297 300 4 301 302 373 372 4 304 305 375 374 4 307 308 377 376 5 378 379 366 294 309 5 378 380 368 295 309 3 369 381 371 6 369 381 383 382 310 300 5 382 384 373 302 310 4 311 305 375 385 4 311 308 377 385 3 378 386 379 3 378 386 380 3 382 387 383 3 382 387 384 4 313 314 389 388 4 313 315 390 388 4 316 317 392 391 4 316 318 393 391 4 320 321 395 394 4 320 314 389 394 4 315 322 396 390 4 323 324 398 397 5 399 400 397 323 326 3 399 326 327 4 317 328 401 392 4 318 329 402 393 4 321 331 403 395 4 322 333 404 396 4 324 334 405 398 3 399 406 400 5 399 327 336 407 406 4 328 337 408 401 4 329 338 409 402 4 339 331 403 410 5 411 412 410 339 340 5 411 413 404 333 340 4 334 341 414 405 4 336 343 415 407 4 337 345 416 408 4 338 346 417 409 3 411 418 412 3 411 418 413 5 419 420 414 341 347 5 419 422 421 348 347 4 348 343 415 421 4 349 345 416 423 4 349 346 417 423 3 419 424 420 3 419 424 422 3 425 350 351 3 425 350 352 4 353 354 427 426 4 353 355 428 426 5 425 351 356 430 429 5 425 352 357 431 429 4 358 359 433 432 4 358 360 434 432 4 354 361 435 427 4 363 355 428 436 4 365 366 438 437 4 367 368 440 439 4 370 371 442 441 4 372 373 444 443 4 374 375 446 445 4 376 377 448 447 4 366 379 449 438 4 368 380 450 440 4 381 371 442 451 4 381 383 452 451 4 373 384 453 444 4 385 375 446 454 4 385 377 448 454 4 386 379 449 455 4 386 380 450 455 4 387 383 452 456 4 387 384 453 456 3 457 388 389 3 457 388 390 3 458 391 392 3 458 391 393 4 394 395 460 459 5 457 461 459 394 389 5 457 390 396 462 461 3 463 397 398 3 463 397 400 5 458 392 401 465 464 5 458 393 402 466 464 4 395 403 467 460 4 396 404 468 462 5 463 398 405 470 469 5 463 400 406 471 469 4 406 407 472 471 4 401 408 473 465 4 402 409 474 466 4 410 403 467 475 4 410 412 476 475 4 404 413 477 468 4 405 414 478 470 4 407 415 479 472 4 408 416 480 473 4 409 417 481 474 4 418 412 476 482 4 418 413 477 482 4 414 420 483 478 4 421 422 485 484 4 421 415 479 484 4 423 416 480 486 4 423 417 481 486 4 424 420 483 487 4 424 422 485 487 3 488 426 427 3 488 426 428 3 489 429 430 3 489 429 431 3 490 432 433 3 490 432 434 5 488 427 435 492 491 6 488 491 494 493 436 428 5 495 437 438 497 496 5 495 439 440 498 496 4 499 441 442 500 4 499 501 502 500 4 443 444 504 503 4 445 446 506 505 5 507 508 509 448 447 5 510 449 438 497 511 5 510 450 440 498 511 3 500 451 442 5 500 502 512 452 451 4 444 453 513 504 4 454 446 506 514 4 454 448 509 514 3 510 455 449 3 510 455 450 4 456 452 512 515 4 456 453 513 515 3 516 459 460 5 516 518 517 461 459 4 461 462 519 517 3 520 464 465 3 520 464 466 4 516 460 467 521 4 516 518 522 521 4 462 468 523 519 3 524 469 470 4 524 469 471 525 3 525 471 472 5 520 465 473 527 526 5 520 466 474 528 526 3 521 475 467 5 521 522 529 476 475 4 468 477 530 523 5 524 470 478 532 531 5 524 531 534 533 525 4 525 472 479 533 5 535 480 473 527 536 5 535 481 474 528 536 4 482 476 529 537 4 482 477 530 537 5 538 483 478 532 539 6 538 539 534 533 484 485 3 533 484 479 3 535 486 480 3 535 486 481 3 538 487 483 3 538 487 485 3 540 491 492 3 540 491 494 3 541 496 497 3 541 496 498 4 542 501 502 543 4 542 503 504 543 4 544 505 506 545 4 544 508 509 545 3 541 511 497 3 541 511 498 4 543 502 512 546 4 543 504 513 546 3 545 514 506 3 545 514 509 3 546 515 512 3 546 515 513 3 547 517 518 3 547 517 519 4 547 518 522 548 4 547 519 523 548 3 549 526 527 3 549 526 528 4 548 522 529 550 4 548 523 530 550 3 551 531 532 3 551 531 534 3 549 536 527 3 549 536 528 3 550 537 529 3 550 537 530 3 551 539 532 3 551 539 534 3 552 553 554 3 552 553 555 3 556 557 558 3 556 557 559 3 560 561 562 3 560 561 563 3 564 565 566 3 564 565 567 3 568 569 570 3 568 569 571 3 560 572 562 3 560 572 563 4 564 566 574 573 4 564 567 575 573 3 568 576 570 3 568 576 571 4 573 574 578 577 4 573 575 579 577 3 577 580 578 3 577 580 579 3 581 582 583 3 581 582 584 3 585 586 587 3 585 586 588 4 581 583 590 589 4 581 584 591 589 3 592 593 594 3 592 593 595 3 596 597 598 6 596 597 600 599 553 554 5 599 602 601 555 553 4 557 558 604 603 5 605 606 603 557 559 3 605 606 607 3 608 609 610 3 608 609 611 3 599 612 600 3 599 612 602 3 613 614 615 3 613 614 616 3 617 618 619 3 617 618 620 3 621 622 623 6 621 622 615 613 561 562 5 613 616 624 563 561 4 565 566 626 625 4 565 567 627 625 5 617 619 628 570 569 5 617 620 629 571 569 4 621 623 631 630 5 621 562 572 632 630 5 632 633 624 563 572 4 566 574 634 626 5 635 575 567 627 636 5 637 638 628 570 576 5 637 639 629 571 576 3 630 640 631 4 630 640 641 632 3 632 641 633 4 574 578 642 634 4 635 575 579 643 3 637 644 638 3 637 644 639 4 580 578 642 645 5 643 646 645 580 579 4 582 583 648 647 4 582 584 649 647 3 650 651 652 3 650 651 653 4 586 587 655 654 4 586 588 656 654 4 583 590 657 648 5 658 591 584 649 659 3 658 659 660 5 650 652 661 594 593 5 650 653 662 595 593 5 663 665 664 598 597 3 663 597 600 4 601 602 667 666 5 668 670 669 604 603 5 668 672 671 606 603 4 606 607 673 671 5 674 676 675 610 609 5 674 678 677 611 609 3 663 679 665 6 663 679 681 680 612 600 5 680 682 667 602 612 3 668 683 670 3 668 683 672 3 674 684 676 3 674 684 678 3 680 685 681 3 680 685 682 4 614 615 687 686 4 614 616 688 686 4 618 619 690 689 4 618 620 691 689 4 622 623 693 692 4 622 615 687 692 4 616 624 694 688 4 625 626 696 695 4 625 627 697 695 4 619 628 698 690 4 620 629 699 691 4 623 631 700 693 4 624 633 701 694 4 626 634 702 696 4 636 627 697 703 4 628 638 704 698 4 629 639 705 699 4 640 631 700 706 5 707 708 706 640 641 5 707 709 701 633 641 4 634 642 710 702 5 711 712 704 638 644 5 711 713 705 639 644 3 707 714 708 3 707 714 709 5 715 716 710 642 645 5 715 718 717 646 645 3 711 719 712 3 711 719 713 3 715 720 716 3 715 720 718 4 647 648 722 721 4 647 649 723 721 4 651 652 725 724 4 651 653 726 724 4 654 655 728 727 4 654 656 729 727 4 648 657 730 722 4 659 649 723 731 4 659 660 732 731 4 652 661 733 725 4 653 662 734 726 4 664 665 736 735 4 666 667 738 737 4 669 670 740 739 4 671 672 742 741 4 671 673 743 741 5 744 675 676 746 745 5 744 677 678 747 745 4 679 665 736 748 4 679 681 749 748 4 667 682 750 738 4 683 670 740 751 4 683 672 742 751 5 752 753 746 676 684 5 752 754 747 678 684 4 685 681 749 755 4 685 682 750 755 3 752 756 753 3 752 756 754 3 757 686 687 3 757 686 688 4 689 690 759 758 4 689 691 760 758 4 692 693 762 761 5 757 763 761 692 687 5 757 688 694 764 763 3 765 695 696 3 765 695 697 4 690 698 766 759 4 691 699 767 760 4 693 700 768 762 4 694 701 769 764 5 765 696 702 771 770 5 765 697 703 772 770 4 698 704 773 766 4 699 705 774 767 5 775 776 768 700 706 3 775 706 708 4 701 709 777 769 4 702 710 778 771 4 704 712 779 773 4 705 713 780 774 3 775 781 776 5 775 708 714 782 781 4 714 709 777 782 4 710 716 783 778 4 717 718 785 784 4 719 712 779 786 4 719 713 780 786 4 720 716 783 787 4 720 718 785 787 3 788 721 722 3 788 721 723 3 789 724 725 3 789 724 726 4 727 728 791 790 4 727 729 792 790 5 788 722 730 794 793 6 788 793 796 795 731 723 3 795 731 732 5 789 725 733 798 797 5 789 726 734 799 797 4 800 735 736 801 4 800 802 803 801 4 737 738 805 804 4 739 740 807 806 5 808 809 810 742 741 3 808 741 743 5 811 812 813 746 745 5 811 814 815 747 745 3 801 748 736 5 801 803 816 749 748 4 738 750 817 805 4 751 740 807 818 4 751 742 810 818 4 746 753 819 813 4 747 754 820 815 4 755 749 816 821 4 755 750 817 821 4 756 753 819 822 4 756 754 820 822 3 823 758 759 3 823 758 760 3 824 761 762 5 824 826 825 763 761 4 763 764 827 825 5 823 759 766 829 828 5 823 760 767 830 828 4 824 762 768 831 4 824 826 832 831 4 764 769 833 827 3 834 770 771 4 834 770 772 835 4 766 773 836 829 4 767 774 837 830 4 831 768 776 838 4 831 832 839 838 4 769 777 840 833 5 834 771 778 842 841 5 834 841 844 843 835 4 773 779 845 836 4 774 780 846 837 3 838 781 776 5 838 839 847 782 781 4 782 777 840 847 4 778 783 848 842 5 843 844 849 785 784 5 850 851 845 779 786 5 850 852 846 780 786 4 787 783 848 853 4 787 785 849 853 3 850 854 851 3 850 854 852 3 855 790 791 3 855 790 792 3 856 793 794 3 856 793 796 4 797 798 858 857 4 797 799 859 857 5 860 802 803 862 861 5 860 804 805 863 861 4 864 806 807 865 4 864 809 810 865 4 812 813 867 866 4 814 815 869 868 5 870 816 803 862 871 5 870 817 805 863 871 3 865 818 807 3 865 818 810 4 813 819 872 867 4 815 820 873 869 3 870 821 816 3 870 821 817 4 822 819 872 874 4 822 820 873 874 3 875 825 826 3 875 825 827 3 876 828 829 3 876 828 830 4 875 826 832 877 4 875 827 833 877 5 876 829 836 879 878 5 876 830 837 880 878 4 877 832 839 881 4 877 833 840 881 3 882 841 842 3 882 841 844 4 836 845 883 879 4 837 846 884 880 3 881 847 839 3 881 847 840 4 882 842 848 885 4 882 844 849 885 5 886 851 845 883 887 5 886 852 846 884 887 3 885 853 848 3 885 853 849 3 886 854 851 3 886 854 852 3 888 857 858 3 888 857 859 3 889 861 862 3 889 861 863 4 890 866 867 891 4 890 868 869 891 3 889 871 862 3 889 871 863 4 891 867 872 892 4 891 869 873 892 3 892 874 872 3 892 874 873 3 893 894 895 3 893 894 896 3 893 897 895 3 893 897 896 3 898 899 900 3 898 899 901 3 898 902 900 3 898 902 901 3 903 878 879 3 903 878 880 4 903 879 883 904 4 903 880 884 904 3 904 887 883 3 904 887 884 3 905 906 907 3 905 906 908 4 905 907 910 909 4 905 908 911 909 3 912 913 914 3 912 913 915 4 909 910 917 916 4 909 911 918 916 3 919 920 921 6 919 920 914 912 894 895 5 912 915 922 896 894 3 923 924 925 3 923 924 926 3 916 927 917 3 916 927 918 3 919 928 921 6 919 928 930 929 897 895 5 929 931 922 896 897 3 923 932 925 3 923 932 926 3 929 933 930 3 929 933 931 3 934 935 936 3 934 935 937 3 938 939 940 6 938 939 936 934 899 900 5 934 937 941 901 899 3 942 943 944 3 942 943 945 3 946 947 948 3 946 947 949 3 938 950 940 6 938 950 952 951 902 900 5 951 953 941 901 902 3 942 954 944 3 942 954 945 4 946 948 956 955 4 946 949 957 955 3 951 958 952 3 951 958 953 4 955 956 960 959 4 955 957 961 959 3 959 962 960 3 959 962 961 4 906 907 964 963 4 906 908 965 963 4 907 910 966 964 4 908 911 967 965 4 913 914 969 968 4 913 915 970 968 4 910 917 971 966 4 911 918 972 967 4 920 921 974 973 4 920 914 969 973 4 915 922 975 970 4 924 925 977 976 4 924 926 978 976 5 979 980 971 917 927 5 979 981 972 918 927 5 982 983 974 921 928 3 982 928 930 4 922 931 984 975 5 985 986 977 925 932 6 985 932 926 978 988 987 3 979 989 980 3 979 989 981 3 982 990 983 6 982 990 992 991 933 930 5 991 993 984 931 933 4 985 986 995 994 5 985 987 996 997 994 3 991 998 992 3 991 998 993 3 994 999 995 3 994 999 997 4 935 936 1001 1000 4 935 937 1002 1000 4 939 940 1004 1003 4 939 936 1001 1003 4 937 941 1005 1002 4 943 944 1007 1006 4 943 945 1008 1006 4 947 948 1010 1009 4 947 949 1011 1009 5 1012 1013 1004 940 950 3 1012 950 952 4 941 953 1014 1005 5 1015 1016 1007 944 954 6 1015 954 945 1008 1018 1017 3 1017 1018 1019 4 948 956 1020 1010 4 949 957 1021 1011 3 1012 1022 1013 6 1012 1022 1024 1023 958 952 5 1023 1025 1014 953 958 4 1015 1016 1027 1026 5 1015 1017 1028 1029 1026 3 1017 1028 1019 4 956 960 1030 1020 4 957 961 1031 1021 3 1023 1032 1024 3 1023 1032 1025 3 1026 1033 1027 3 1026 1033 1029 5 1034 1035 1030 960 962 5 1034 1036 1031 961 962 3 1034 1037 1035 3 1034 1037 1036 -0.511 1.022 3.419 0.133 0.991 -0.001 -0.341 1.115 3.419 -0.366 0.931 -0.002 -0.626 1.252 2.945 -0.315 0.238 0.919 -0.409 1.252 3.096 -0.615 0.755 0.226 -0.626 1.252 3.888 -0.325 0.213 -0.921 -0.409 1.252 3.739 -0.617 0.753 -0.227 -0.747 1.503 3.419 0.999 -0.039 -0.002 -0.749 1.498 3.419 0.999 -0.043 -0.002 -0.535 1.503 2.944 -0.058 0.405 0.912 -0.535 1.503 3.890 -0.034 0.416 -0.909 -0.687 1.503 7.521 -0.392 0.715 0.580 -0.724 1.447 7.521 -0.319 0.755 0.573 -0.751 1.503 7.429 -0.371 0.692 0.619 -0.632 1.264 8.205 -0.082 0.992 -0.094 -0.487 1.409 8.205 -0.498 0.861 -0.107 -0.535 1.503 7.886 -0.579 0.811 0.087 -0.751 1.503 8.603 -0.355 0.639 -0.682 -0.535 1.503 8.382 -0.601 0.775 -0.193 -0.650 1.300 12.307 0.273 0.829 0.489 -0.466 1.366 12.307 -0.108 0.832 0.544 -0.751 1.503 11.939 0.236 0.471 0.850 -0.535 1.503 12.033 -0.252 0.649 0.717 -0.711 1.503 12.991 0.112 0.440 -0.891 -0.742 1.484 12.991 0.145 0.434 -0.889 -0.535 1.503 12.814 -0.156 0.777 -0.610 -0.754 1.508 3.419 0.999 -0.040 -0.002 -0.877 1.753 2.952 0.274 -0.049 0.960 -0.660 1.753 2.943 0.031 -0.455 0.890 -0.877 1.753 3.877 0.373 -0.021 -0.927 -0.660 1.753 3.894 0.086 -0.435 -0.896 -0.650 1.733 7.521 -0.780 0.204 0.591 -0.877 1.753 7.285 -0.554 -0.117 0.824 -0.660 1.753 7.499 -0.788 0.167 0.592 -0.877 1.753 8.632 0.343 -0.120 -0.932 -0.660 1.753 8.583 -0.866 0.158 -0.475 -0.877 1.753 11.884 0.136 0.035 0.990 -0.660 1.753 11.886 0.180 0.215 0.960 -0.573 1.579 12.991 -0.112 0.420 -0.900 -1.002 2.004 3.278 0.049 -0.997 0.058 -0.785 2.004 3.142 -0.442 -0.878 0.184 -1.002 2.004 3.557 0.061 -0.996 -0.064 -0.785 2.004 3.698 -0.427 -0.885 -0.185 -0.998 1.995 7.521 -0.350 -0.755 0.555 -0.685 1.804 7.521 -0.803 0.052 0.594 -1.002 2.004 7.534 -0.338 -0.777 0.531 -0.785 2.004 7.621 -0.788 -0.486 0.378 -1.002 2.004 8.560 -0.225 -0.815 -0.534 -0.785 2.004 8.514 -0.812 -0.499 -0.303 -1.002 2.004 11.919 -0.016 -0.445 0.895 -0.785 2.004 11.883 0.056 -0.284 0.957 -1.030 2.060 3.419 0.027 -1.000 -0.004 -0.845 2.123 3.419 -0.414 -0.910 0.004 -1.093 2.186 8.205 -0.271 -0.956 -0.113 -0.875 2.185 8.205 -0.684 -0.722 -0.104 -1.030 2.254 12.307 -0.035 -0.892 0.452 -1.109 2.217 12.307 0.050 -0.878 0.476 -0.910 2.254 12.161 -0.142 -0.823 0.550 -1.029 2.058 12.991 0.143 -0.425 -0.894 -0.851 2.136 12.991 -0.178 -0.417 -0.891 -0.910 2.254 12.597 -0.203 -0.978 0.048 -0.944 2.322 12.307 -0.163 -0.859 0.486 -1.435 3.006 0.684 -0.147 0.410 0.900 -1.476 2.951 0.684 -0.112 0.427 0.897 -1.503 3.006 0.595 -0.134 0.385 0.913 -1.396 2.792 1.367 -0.062 0.992 -0.114 -1.255 2.943 1.367 -0.445 0.886 -0.130 -1.286 3.006 1.099 -0.465 0.849 0.250 -1.503 3.006 1.756 -0.462 0.649 -0.604 -1.286 3.006 1.489 -0.506 0.844 -0.179 -1.412 2.824 5.470 0.302 0.947 0.112 -1.230 2.895 5.470 -0.126 0.986 0.114 -1.503 3.006 5.115 0.298 0.799 0.523 -1.286 3.006 5.234 -0.256 0.931 0.261 -1.503 3.006 6.141 0.269 0.795 -0.543 -1.286 3.006 5.918 -0.146 0.969 -0.201 -1.422 3.006 10.256 -0.001 1.000 0.006 -1.475 2.949 10.256 -0.005 1.000 0.004 -1.503 3.006 10.118 -0.041 0.997 0.064 -1.503 3.006 10.397 -0.029 0.998 -0.058 -1.378 3.190 0.684 -0.359 0.167 0.918 -1.628 3.256 0.430 -0.251 -0.036 0.967 -1.411 3.256 0.613 -0.386 0.093 0.918 -1.628 3.256 1.791 0.374 -0.062 -0.925 -1.411 3.256 1.741 -0.843 0.233 -0.484 -1.628 3.256 5.043 0.433 0.115 0.894 -1.411 3.256 5.037 0.196 0.385 0.902 -1.507 3.014 6.154 0.278 0.774 -0.569 -1.330 3.094 6.154 -0.151 0.794 -0.588 -1.628 3.256 6.390 0.494 0.122 -0.861 -1.411 3.256 6.371 -0.327 0.470 -0.820 -1.317 3.068 10.256 -0.184 0.983 0.013 -1.628 3.256 9.798 0.437 0.021 0.899 -1.411 3.256 9.856 -0.651 0.631 0.422 -1.628 3.256 10.723 0.495 0.044 -0.868 -1.411 3.256 10.674 -0.613 0.654 -0.444 -1.661 3.507 0.684 -0.282 -0.362 0.888 -1.490 3.414 0.684 -0.404 -0.132 0.905 -1.753 3.507 0.652 -0.194 -0.421 0.886 -1.536 3.507 0.734 -0.460 -0.300 0.836 -1.753 3.507 1.736 -0.178 -0.772 -0.610 -1.536 3.507 1.693 -0.819 -0.463 -0.340 -1.753 3.507 5.071 -0.242 -0.664 0.708 -1.536 3.507 5.050 0.198 -0.490 0.849 -1.753 3.507 6.246 0.386 -0.687 -0.615 -1.536 3.507 6.359 -0.338 -0.542 -0.769 -1.748 3.507 10.256 0.999 0.054 0.003 -1.751 3.501 10.256 0.999 0.050 0.003 -1.536 3.507 9.798 0.521 0.247 0.817 -1.536 3.507 10.731 0.517 0.204 -0.831 -1.763 3.525 0.684 -0.195 -0.430 0.882 -1.855 3.709 1.367 -0.271 -0.957 -0.106 -1.637 3.708 1.367 -0.683 -0.724 -0.097 -1.851 3.757 5.470 0.127 -0.988 0.092 -1.873 3.745 5.470 0.152 -0.984 0.093 -1.662 3.757 5.259 -0.190 -0.950 0.248 -1.781 3.562 6.154 0.349 -0.746 -0.567 -1.607 3.649 6.154 -0.301 -0.767 -0.567 -1.662 3.757 5.851 -0.220 -0.965 -0.144 -1.756 3.511 10.256 0.999 0.054 0.003 -1.879 3.757 9.786 0.198 -0.221 0.955 -1.662 3.757 9.783 -0.244 -0.507 0.827 -1.879 3.757 10.729 0.187 -0.246 -0.951 -1.662 3.757 10.737 -0.223 -0.534 -0.816 -1.714 3.861 5.470 -0.228 -0.968 0.109 -1.906 4.007 10.256 -0.270 -0.963 0.001 -1.994 3.987 10.256 -0.103 -0.995 0.001 -1.787 4.007 10.147 -0.447 -0.894 0.040 -1.787 4.007 10.366 -0.446 -0.894 -0.037 -1.809 4.052 10.256 -0.442 -0.897 0.001 -0.264 1.252 3.419 -0.533 0.846 -0.003 -0.232 1.332 3.419 -0.524 0.852 -0.003 -0.318 1.503 3.089 -0.674 0.681 0.288 -0.318 1.503 3.747 -0.666 0.688 -0.288 -0.447 1.503 8.205 -0.623 0.774 -0.108 -0.363 1.503 12.307 -0.266 0.813 0.518 -0.443 1.753 3.010 -0.855 -0.195 0.480 -0.443 1.753 3.830 -0.853 -0.176 -0.491 -0.646 1.753 7.521 -0.793 0.173 0.584 -0.444 1.753 8.205 -0.949 0.295 -0.111 -0.337 1.542 12.307 -0.283 0.795 0.536 -0.443 1.753 11.969 -0.308 0.451 0.838 -0.465 1.753 12.991 -0.287 0.268 -0.920 -0.443 1.753 12.950 -0.326 0.316 -0.891 -0.568 2.004 3.240 -0.749 -0.658 0.081 -0.568 2.004 3.603 -0.749 -0.659 -0.074 -0.488 1.843 8.205 -0.988 0.098 -0.117 -0.568 2.004 8.183 -0.960 -0.257 -0.108 -0.568 2.004 8.215 -0.959 -0.257 -0.121 -0.568 2.004 11.916 -0.454 -0.158 0.877 -0.485 1.837 12.991 -0.320 0.143 -0.937 -0.611 2.090 3.419 -0.712 -0.702 0.007 -0.572 2.012 8.205 -0.957 -0.266 -0.118 -0.693 2.254 12.138 -0.533 -0.654 0.538 -0.601 2.069 12.991 -0.355 -0.164 -0.921 -0.693 2.254 12.635 -0.629 -0.776 -0.047 -0.736 2.339 12.307 -0.530 -0.711 0.463 -1.224 3.006 1.367 -0.516 0.846 -0.133 -1.143 3.006 5.470 -0.225 0.968 0.108 -1.363 3.256 0.684 -0.404 0.107 0.909 -1.197 3.256 1.367 -0.925 0.353 -0.140 -1.097 3.061 5.470 -0.274 0.954 0.119 -1.194 3.256 5.129 -0.467 0.723 0.509 -1.214 3.256 6.154 -0.502 0.595 -0.628 -1.194 3.256 6.119 -0.528 0.630 -0.570 -1.199 3.256 10.256 -0.501 0.865 0.018 -1.215 3.298 1.367 -0.956 0.256 -0.142 -1.319 3.507 1.273 -0.971 -0.237 -0.020 -1.319 3.507 1.409 -0.962 -0.229 -0.146 -1.319 3.507 5.073 -0.674 -0.239 0.699 -1.222 3.311 6.154 -0.605 0.440 -0.664 -1.319 3.507 6.250 -0.712 -0.189 -0.676 -1.197 3.262 10.256 -0.498 0.867 0.019 -1.319 3.507 9.874 -0.664 0.560 0.496 -1.319 3.507 10.660 -0.664 0.543 -0.514 -1.336 3.539 1.367 -0.954 -0.271 -0.130 -1.445 3.757 5.263 -0.653 -0.728 0.208 -1.363 3.595 6.154 -0.699 -0.378 -0.607 -1.445 3.757 5.859 -0.644 -0.754 -0.134 -1.445 3.757 9.862 -0.848 -0.363 0.386 -1.445 3.757 10.664 -0.834 -0.390 -0.390 -1.499 3.866 5.470 -0.623 -0.776 0.099 -1.570 4.007 10.256 -0.692 -0.722 0.003 -1.570 4.007 10.256 -0.692 -0.722 0.003 -1.570 4.008 10.256 -0.692 -0.722 0.003 -0.182 1.503 3.419 -0.796 0.606 -0.003 -0.242 1.753 3.419 -0.999 0.051 0.001 -0.265 1.753 12.307 -0.642 0.523 0.561 -0.457 2.004 3.419 -0.829 -0.560 0.007 -0.563 2.004 8.205 -0.960 -0.254 -0.118 -0.287 1.876 12.307 -0.806 0.253 0.534 -0.351 2.004 12.187 -0.818 0.038 0.575 -0.518 2.004 12.991 -0.376 -0.078 -0.923 -0.351 2.004 12.542 -0.980 0.049 0.192 -0.536 2.254 12.307 -0.702 -0.527 0.480 -0.431 2.163 12.307 -0.820 -0.255 0.512 -1.015 3.256 5.470 -0.727 0.675 0.130 -1.297 3.507 1.367 -0.967 -0.220 -0.132 -1.031 3.364 5.470 -0.920 0.371 0.126 -1.103 3.507 5.327 -0.979 0.059 0.194 -1.248 3.507 6.154 -0.776 -0.133 -0.617 -1.103 3.507 5.756 -0.997 0.056 -0.053 -1.143 3.507 10.256 -0.902 0.432 0.022 -1.261 3.757 5.470 -0.838 -0.536 0.106 -1.199 3.700 5.470 -0.924 -0.366 0.112 -1.235 3.757 10.256 -0.993 -0.113 0.015 -1.570 4.007 10.256 -0.692 -0.722 0.003 0.726 0.000 3.419 0.680 -0.733 0.000 0.777 0.182 3.419 0.500 -0.866 0.000 0.868 0.000 3.069 0.465 -0.843 0.271 0.868 0.000 3.768 0.466 -0.842 -0.271 0.061 1.252 10.256 0.997 0.082 -0.003 0.367 1.002 10.256 0.715 0.699 -0.002 0.241 1.252 9.871 0.896 0.279 0.345 0.241 1.252 10.638 0.896 0.280 -0.344 -0.024 1.503 10.256 0.877 -0.481 -0.002 0.116 1.503 9.917 0.769 -0.564 0.300 0.116 1.503 10.593 0.775 -0.556 -0.302 0.019 1.697 10.256 0.631 -0.776 0.001 -0.295 2.004 12.307 -0.845 0.054 0.532 -1.034 3.507 5.470 -0.989 0.079 0.125 -1.420 4.508 3.419 0.742 0.671 0.002 -1.374 4.482 3.419 0.721 0.693 0.002 -1.387 4.508 3.360 0.725 0.688 0.018 -1.387 4.508 3.478 0.726 0.688 -0.014 -1.698 4.759 3.419 0.982 0.191 -0.001 -1.512 4.759 3.023 0.837 0.452 0.309 -1.512 4.759 3.814 0.839 0.447 -0.309 -1.517 4.759 12.307 0.829 -0.230 0.510 -1.494 4.722 12.307 0.851 -0.126 0.509 -1.512 4.759 12.297 0.828 -0.229 0.512 -1.512 4.759 12.325 0.839 -0.233 0.492 0.800 0.250 3.419 0.283 -0.959 0.000 1.085 0.000 2.918 -0.316 -0.139 0.939 0.959 0.250 3.065 -0.054 -0.977 0.206 1.085 0.000 3.919 -0.318 -0.137 -0.938 0.959 0.250 3.771 -0.060 -0.977 -0.206 0.951 0.000 8.205 0.890 -0.441 -0.114 0.970 0.228 8.205 0.601 -0.794 -0.094 1.085 0.000 7.772 0.860 -0.434 0.269 1.085 0.000 8.467 0.809 -0.479 -0.341 0.972 0.000 12.307 0.378 -0.768 0.517 1.025 0.119 12.307 0.258 -0.821 0.509 1.085 0.000 12.085 0.242 -0.771 0.590 1.085 0.000 12.679 0.368 -0.902 -0.227 0.886 0.396 3.419 -0.072 -0.997 -0.001 0.368 1.002 10.256 0.713 0.701 -0.002 0.609 0.951 10.256 0.456 0.890 -0.003 0.584 1.002 10.125 0.463 0.885 0.044 0.584 1.002 10.385 0.461 0.886 -0.049 0.412 1.252 1.367 0.870 0.482 -0.100 0.482 1.206 1.367 0.823 0.560 -0.098 0.458 1.252 1.233 0.850 0.522 0.077 0.458 1.252 1.444 0.845 0.520 -0.129 0.458 1.252 9.769 0.489 0.477 0.730 0.458 1.252 10.738 0.478 0.485 -0.732 0.225 1.503 1.367 0.980 -0.156 -0.120 0.333 1.503 0.979 0.807 -0.077 0.586 0.333 1.503 1.588 0.956 -0.119 -0.268 0.128 1.503 5.470 0.980 0.169 0.110 0.435 1.299 5.470 0.644 0.759 0.099 0.333 1.503 5.153 0.790 0.488 0.372 0.333 1.503 6.045 0.787 0.465 -0.405 0.333 1.503 9.769 -0.322 -0.323 0.890 0.333 1.503 10.740 -0.342 -0.302 -0.890 0.229 1.712 1.367 0.812 -0.573 -0.115 0.025 1.753 5.470 0.917 -0.378 0.125 0.208 1.753 5.118 0.696 -0.399 0.597 0.208 1.753 6.126 0.775 -0.247 -0.582 0.032 1.753 10.256 0.520 -0.854 0.002 0.208 1.753 9.877 0.287 -0.871 0.399 0.208 1.753 10.637 0.298 -0.863 -0.407 0.064 2.004 5.470 0.495 -0.862 0.113 0.083 2.004 5.430 0.489 -0.863 0.126 0.083 2.004 5.549 0.493 -0.867 0.077 0.122 1.924 10.256 0.106 -0.994 0.005 0.073 2.024 5.470 0.479 -0.871 0.113 -1.126 4.420 3.419 0.493 0.870 0.006 -1.170 4.508 3.211 0.498 0.863 0.083 -1.170 4.508 3.633 0.501 0.862 -0.078 -1.358 4.508 12.307 0.778 0.469 0.417 -1.096 4.362 12.307 0.593 0.693 0.411 -1.170 4.508 12.044 0.607 0.606 0.514 -1.170 4.508 12.791 0.656 0.613 -0.441 -1.295 4.759 2.936 0.477 0.619 0.624 -1.295 4.759 3.903 0.483 0.602 -0.636 -1.370 4.759 8.205 0.822 0.564 -0.079 -1.260 4.688 8.205 0.768 0.635 -0.082 -1.295 4.759 7.993 0.799 0.602 0.009 -1.295 4.759 8.326 0.783 0.611 -0.116 -1.295 4.759 11.926 0.449 0.001 0.894 -1.295 4.759 12.982 0.398 -0.004 -0.917 1.286 0.000 3.419 0.432 0.902 0.000 1.291 0.020 3.419 0.447 0.895 0.000 1.176 0.250 2.954 -0.292 -0.837 0.462 1.176 0.250 3.880 -0.306 -0.837 -0.453 1.209 0.000 7.521 0.711 -0.099 0.696 1.198 0.208 7.521 0.357 -0.710 0.607 1.301 0.000 7.391 0.639 0.021 0.769 0.971 0.250 8.205 0.532 -0.842 -0.093 1.176 0.250 7.554 0.257 -0.829 0.497 1.301 0.000 8.630 0.549 0.304 -0.778 1.176 0.250 8.568 -0.006 -0.914 -0.406 1.153 0.250 12.307 0.017 -0.882 0.470 1.301 0.000 11.891 -0.104 -0.587 0.803 1.176 0.250 12.268 0.001 -0.878 0.478 1.224 0.000 12.991 0.079 -0.455 -0.887 1.265 0.073 12.991 0.024 -0.483 -0.875 1.176 0.250 12.378 0.005 -0.917 0.398 1.057 0.489 3.419 -0.166 -0.986 -0.004 1.073 0.457 8.205 0.065 -0.994 -0.093 1.167 0.269 12.307 -0.004 -0.884 0.467 0.723 1.002 10.256 0.320 0.947 -0.004 0.736 1.131 1.367 0.511 0.854 -0.099 0.675 1.252 0.941 0.479 0.669 0.569 0.675 1.252 1.605 0.553 0.795 -0.248 0.792 1.019 10.256 0.213 0.977 -0.006 0.675 1.252 9.779 -0.249 0.266 0.931 0.675 1.252 10.723 -0.313 0.248 -0.917 0.470 1.503 0.684 0.372 0.063 0.926 0.601 1.402 0.684 0.336 0.209 0.919 0.550 1.503 0.572 0.339 0.100 0.936 0.550 1.503 1.777 0.589 0.254 -0.767 0.652 1.299 5.470 0.363 0.926 0.107 0.550 1.503 5.101 0.362 0.731 0.578 0.493 1.503 6.154 0.510 0.658 -0.554 0.560 1.482 6.154 0.433 0.727 -0.533 0.550 1.503 6.188 0.432 0.714 -0.551 0.550 1.503 10.166 -0.972 -0.210 0.103 0.550 1.503 10.340 -0.969 -0.197 -0.150 0.424 1.753 0.684 0.246 -0.264 0.933 0.425 1.753 0.683 0.245 -0.264 0.933 0.225 1.753 1.367 0.730 -0.673 -0.116 0.425 1.753 1.736 0.377 -0.705 -0.600 0.425 1.753 5.047 0.211 0.013 0.977 0.224 1.753 6.154 0.748 -0.216 -0.627 0.425 1.753 6.388 0.481 0.007 -0.877 0.425 1.753 9.792 0.228 -0.181 0.957 0.425 1.753 10.718 0.220 -0.118 -0.968 0.424 1.754 0.684 0.245 -0.265 0.933 0.314 1.976 1.367 0.235 -0.965 -0.117 0.300 2.004 5.097 0.257 -0.751 0.608 0.274 2.004 6.154 0.210 -0.779 -0.591 0.300 2.004 6.192 0.185 -0.771 -0.610 0.245 2.004 10.256 -0.069 -0.998 0.006 0.300 2.004 10.157 -0.086 -0.995 0.043 0.300 2.004 10.358 -0.086 -0.996 -0.034 0.197 2.208 5.470 0.019 -0.993 0.114 0.288 2.027 6.154 0.172 -0.791 -0.588 0.279 2.045 10.256 -0.098 -0.995 0.006 -0.939 4.481 3.419 0.190 0.982 0.009 -0.953 4.508 3.353 0.185 0.982 0.030 -0.953 4.508 3.487 0.186 0.983 -0.015 -0.873 4.350 12.307 0.381 0.831 0.405 -0.953 4.508 11.993 0.367 0.739 0.565 -0.953 4.508 12.905 0.319 0.634 -0.704 -1.078 4.759 2.955 0.277 0.814 0.511 -1.078 4.759 3.887 0.276 0.801 -0.531 -1.006 4.615 8.205 0.532 0.841 -0.097 -1.078 4.759 7.696 0.581 0.781 0.231 -1.078 4.759 8.484 0.559 0.802 -0.211 -1.078 4.759 11.881 0.064 -0.015 0.998 -1.288 4.759 12.991 0.387 0.006 -0.922 -0.976 4.555 12.991 0.268 0.455 -0.849 1.321 0.000 3.419 0.464 0.886 0.000 1.518 0.000 2.971 0.659 0.649 0.380 1.393 0.250 2.941 -0.423 -0.615 0.665 1.518 0.000 3.865 0.662 0.641 -0.388 1.393 0.250 3.890 -0.442 -0.629 -0.639 1.198 0.250 7.521 0.228 -0.805 0.547 1.518 0.000 7.307 0.301 0.645 0.703 1.393 0.250 7.312 -0.147 -0.766 0.626 1.518 0.000 8.635 0.179 0.455 -0.872 1.393 0.250 8.626 -0.080 -0.492 -0.867 1.518 0.000 11.877 -0.135 -0.218 0.967 1.393 0.250 12.050 -0.293 -0.793 0.535 1.435 0.167 12.991 -0.196 -0.476 -0.858 1.393 0.250 12.787 -0.283 -0.844 -0.456 1.088 0.501 3.419 -0.194 -0.981 -0.004 1.268 0.501 3.222 -0.387 -0.918 0.087 1.268 0.501 3.608 -0.392 -0.915 -0.097 1.317 0.403 7.521 -0.124 -0.861 0.493 1.124 0.501 8.205 0.061 -0.993 -0.100 1.268 0.501 7.802 -0.045 -0.985 0.164 1.268 0.501 8.422 0.000 -0.967 -0.256 1.330 0.376 12.307 -0.310 -0.853 0.420 1.229 0.579 3.419 -0.382 -0.924 -0.008 1.217 0.603 8.205 -0.073 -0.991 -0.113 0.932 1.173 1.367 0.181 0.977 -0.109 0.892 1.252 1.048 0.198 0.913 0.357 0.892 1.252 1.536 0.158 0.967 -0.201 0.968 1.101 10.256 -0.115 0.993 -0.013 0.892 1.252 9.893 -0.371 0.856 0.361 0.892 1.252 10.603 -0.402 0.842 -0.360 0.836 1.365 0.684 0.167 0.445 0.880 0.767 1.503 0.483 0.138 0.291 0.947 0.767 1.503 1.785 0.185 0.500 -0.846 0.840 1.357 5.470 0.061 0.989 0.132 0.767 1.503 5.178 -0.089 0.912 0.400 0.619 1.503 6.154 0.342 0.772 -0.535 0.767 1.503 6.056 0.073 0.920 -0.386 0.767 1.503 9.788 0.572 0.302 0.763 0.767 1.503 10.704 0.582 0.330 -0.743 0.642 1.753 0.460 0.055 -0.217 0.975 0.642 1.753 1.792 -0.001 -0.361 -0.932 0.642 1.753 5.048 0.040 0.356 0.934 0.746 1.545 6.154 0.069 0.826 -0.560 0.642 1.753 6.400 -0.136 0.360 -0.923 0.642 1.753 9.777 -0.250 -0.425 0.870 0.642 1.753 10.726 -0.285 -0.370 -0.884 0.553 1.930 0.684 -0.015 -0.408 0.913 0.338 2.004 1.367 0.184 -0.976 -0.114 0.516 2.004 0.850 -0.026 -0.667 0.745 0.516 2.004 1.642 0.070 -0.935 -0.348 0.516 2.004 5.047 -0.211 -0.505 0.837 0.516 2.004 6.337 -0.269 -0.615 -0.741 0.516 2.004 9.985 -0.406 -0.897 0.178 0.516 2.004 10.529 -0.416 -0.891 -0.180 0.449 2.139 1.367 -0.069 -0.989 -0.127 0.289 2.254 5.470 -0.171 -0.980 0.100 0.391 2.254 5.341 -0.263 -0.952 0.158 0.455 2.127 6.154 -0.299 -0.770 -0.564 0.391 2.254 5.721 -0.280 -0.960 -0.022 0.458 2.120 10.256 -0.413 -0.911 0.005 0.361 2.315 5.470 -0.272 -0.957 0.104 -0.912 4.508 3.419 0.148 0.989 0.009 -0.690 4.417 12.307 0.118 0.889 0.443 -0.736 4.508 12.115 0.092 0.848 0.521 -0.736 4.508 12.672 0.087 0.986 -0.145 -0.772 4.580 3.419 0.003 1.000 0.009 -0.861 4.759 3.031 0.102 0.958 0.268 -0.861 4.759 3.812 0.095 0.957 -0.275 -0.804 4.644 8.205 0.263 0.959 -0.104 -0.861 4.759 7.753 0.273 0.945 0.179 -0.861 4.759 8.443 0.274 0.941 -0.197 -0.861 4.759 11.883 0.073 0.377 0.924 -0.790 4.617 12.991 0.040 0.499 -0.865 1.735 0.000 3.022 -0.311 0.843 0.440 1.610 0.250 2.987 -0.782 -0.448 0.433 1.735 0.000 3.815 -0.335 0.828 -0.450 1.610 0.250 3.842 -0.781 -0.466 -0.414 1.735 0.000 7.444 -0.006 0.864 0.504 1.610 0.250 7.316 -0.581 -0.403 0.707 1.735 0.000 8.604 -0.257 0.635 -0.728 1.610 0.250 8.635 -0.185 0.020 -0.983 1.735 0.000 11.897 -0.390 -0.131 0.911 1.610 0.250 12.043 -0.533 -0.668 0.519 1.677 0.117 12.991 -0.370 -0.257 -0.893 1.610 0.250 12.810 -0.543 -0.677 -0.497 1.485 0.501 3.268 -0.683 -0.728 0.049 1.485 0.501 3.561 -0.683 -0.727 -0.064 1.508 0.454 7.521 -0.453 -0.706 0.545 1.485 0.501 7.600 -0.418 -0.806 0.419 1.485 0.501 8.524 -0.412 -0.817 -0.403 1.540 0.391 12.307 -0.521 -0.746 0.414 1.452 0.566 3.419 -0.659 -0.752 -0.011 1.404 0.662 8.205 -0.405 -0.908 -0.107 1.017 1.252 1.367 0.075 0.992 -0.103 1.066 1.252 10.256 -0.372 0.928 -0.017 1.006 1.458 0.684 -0.092 0.426 0.900 0.984 1.503 0.611 -0.106 0.389 0.915 1.088 1.295 1.367 -0.021 0.993 -0.113 0.984 1.503 1.746 -0.135 0.773 -0.620 0.965 1.503 5.470 -0.213 0.969 0.128 1.088 1.295 10.256 -0.371 0.928 -0.018 0.984 1.503 9.854 -0.482 0.733 0.480 0.984 1.503 10.635 -0.489 0.738 -0.465 0.859 1.753 0.462 -0.217 -0.056 0.975 0.859 1.753 1.802 -0.214 -0.069 -0.975 0.976 1.518 5.470 -0.239 0.962 0.130 0.859 1.753 5.104 -0.399 0.665 0.631 0.882 1.707 6.154 -0.504 0.576 -0.643 0.859 1.753 6.217 -0.542 0.494 -0.680 0.859 1.753 9.805 -0.743 -0.290 0.603 0.859 1.753 10.689 -0.769 -0.253 -0.587 0.742 1.986 0.684 -0.223 -0.363 0.905 0.733 2.004 0.708 -0.233 -0.406 0.884 0.733 2.004 1.723 -0.417 -0.768 -0.487 0.733 2.004 5.071 -0.676 -0.313 0.667 0.733 2.004 6.260 -0.667 -0.308 -0.679 0.733 2.004 10.046 -0.708 -0.701 0.089 0.733 2.004 10.461 -0.716 -0.692 -0.094 0.640 2.191 1.367 -0.423 -0.900 -0.109 0.608 2.254 5.303 -0.600 -0.781 0.174 0.690 2.091 6.154 -0.656 -0.461 -0.598 0.608 2.254 5.792 -0.600 -0.797 -0.070 0.686 2.099 10.256 -0.679 -0.734 -0.002 0.566 2.338 5.470 -0.578 -0.810 0.100 -0.618 4.508 12.307 -0.046 0.878 0.477 -0.662 4.759 3.419 -0.397 0.918 0.006 -0.672 4.759 8.205 -0.024 0.994 -0.107 -0.552 4.574 12.307 -0.191 0.834 0.517 -0.644 4.759 11.979 -0.089 0.723 0.685 -0.693 4.759 12.991 -0.123 0.431 -0.894 -0.644 4.759 12.908 -0.200 0.563 -0.802 1.906 0.000 3.419 -0.619 0.785 0.000 1.842 0.220 3.419 -1.000 -0.013 -0.005 1.827 0.250 3.389 -0.995 -0.096 0.003 1.827 0.250 3.448 -0.995 -0.097 -0.015 1.786 0.000 7.521 -0.043 0.880 0.473 1.793 0.250 7.521 -0.777 0.006 0.629 1.952 0.000 7.977 -0.203 0.979 0.010 1.827 0.250 7.574 -0.830 0.112 0.547 1.952 0.000 8.327 -0.193 0.974 -0.120 1.827 0.250 8.556 -0.825 0.153 -0.544 1.952 0.000 12.136 -0.790 0.085 0.607 1.827 0.250 12.263 -0.754 -0.494 0.433 1.807 0.000 12.991 -0.406 -0.096 -0.909 1.952 0.000 12.622 -0.992 0.125 -0.027 1.827 0.250 12.397 -0.788 -0.512 0.343 1.585 0.501 3.419 -0.766 -0.643 -0.011 1.810 0.283 3.419 -0.991 -0.134 -0.007 1.702 0.501 7.733 -0.794 -0.557 0.242 1.702 0.501 8.458 -0.781 -0.569 -0.258 1.813 0.278 12.307 -0.750 -0.508 0.425 1.629 0.646 8.205 -0.696 -0.711 -0.104 1.036 1.503 0.684 -0.136 0.405 0.904 1.223 1.459 1.367 -0.438 0.891 -0.118 1.201 1.503 1.186 -0.477 0.871 0.118 1.201 1.503 1.456 -0.469 0.870 -0.155 1.156 1.503 10.256 -0.802 0.597 -0.022 1.069 1.753 0.684 -0.371 0.065 0.926 1.076 1.753 0.694 -0.384 0.072 0.921 1.076 1.753 1.727 -0.765 0.260 -0.590 1.065 1.753 5.470 -0.787 0.599 0.145 0.901 1.753 6.154 -0.578 0.507 -0.640 1.115 1.675 10.256 -0.988 0.154 -0.019 1.076 1.753 10.170 -1.000 0.021 0.015 1.076 1.753 10.334 -0.999 0.023 -0.048 0.950 2.004 0.843 -0.562 -0.378 0.736 0.950 2.004 1.653 -0.793 -0.535 -0.291 1.059 1.786 5.470 -0.851 0.506 0.143 0.950 2.004 5.290 -0.973 -0.014 0.232 0.820 2.004 6.154 -0.752 -0.239 -0.615 0.950 2.004 5.850 -0.991 -0.041 -0.131 0.871 2.004 10.256 -0.817 -0.577 -0.009 1.031 1.843 10.256 -0.991 -0.135 -0.017 0.867 2.170 1.367 -0.702 -0.705 -0.102 0.778 2.254 5.470 -0.781 -0.615 0.107 0.850 2.205 5.470 -0.889 -0.444 0.117 -0.475 4.759 12.307 -0.444 0.733 0.515 1.839 0.250 3.419 -0.996 -0.092 -0.006 2.008 0.000 8.205 -0.228 0.970 -0.084 2.005 0.250 8.205 -0.928 0.353 -0.117 2.032 0.000 12.307 -0.831 0.134 0.540 1.851 0.250 12.307 -0.766 -0.482 0.426 1.864 0.501 8.205 -0.929 -0.354 -0.110 1.243 1.503 1.367 -0.490 0.864 -0.120 1.260 1.753 1.367 -0.950 0.288 -0.123 1.110 1.753 10.256 -0.999 0.030 -0.019 1.130 2.004 1.367 -0.946 -0.306 -0.108 1.040 2.004 5.470 -0.990 0.016 0.141 2.307 0.000 1.367 0.887 -0.444 -0.124 2.314 0.143 1.367 0.778 -0.618 -0.114 2.386 0.000 1.053 0.804 -0.415 0.426 2.386 0.000 1.538 0.858 -0.464 -0.219 2.330 0.000 5.470 0.470 -0.877 0.105 2.354 0.064 5.470 0.420 -0.901 0.106 2.386 0.000 5.348 0.418 -0.896 0.149 2.386 0.000 5.698 0.450 -0.893 -0.012 0.794 3.006 8.205 0.990 -0.017 -0.141 0.984 2.805 8.205 0.888 0.444 -0.117 0.883 3.006 7.825 0.991 0.040 0.131 0.883 3.006 8.385 0.973 0.014 -0.232 0.703 3.006 12.307 0.832 0.269 0.485 0.966 2.839 12.307 0.624 0.627 0.466 0.883 3.006 12.022 0.632 0.426 0.647 0.883 3.006 12.831 0.631 0.424 -0.650 0.724 3.256 3.419 0.999 -0.030 0.019 0.803 3.167 3.419 0.991 0.134 0.017 0.758 3.256 3.341 0.999 -0.023 0.048 0.758 3.256 3.504 1.000 -0.021 -0.015 0.774 3.223 8.205 0.850 -0.506 -0.143 0.573 3.256 12.307 0.821 -0.249 0.514 0.758 3.256 11.947 0.482 -0.164 0.861 0.758 3.256 12.981 0.388 -0.073 -0.919 0.719 3.334 3.419 0.988 -0.154 0.019 0.591 3.507 12.307 0.426 -0.752 0.503 0.633 3.507 12.218 0.402 -0.745 0.532 0.633 3.507 12.489 0.462 -0.843 0.275 0.611 3.550 12.307 0.382 -0.777 0.500 -0.030 4.508 5.470 0.870 0.484 0.090 0.204 4.363 5.470 0.667 0.740 0.087 0.132 4.508 5.217 0.725 0.661 0.196 0.132 4.508 5.941 0.742 0.644 -0.189 -0.018 4.759 1.367 0.843 0.530 -0.093 0.020 4.731 1.367 0.826 0.556 -0.094 0.007 4.759 1.278 0.839 0.545 -0.008 0.007 4.759 1.411 0.832 0.545 -0.104 -0.172 4.759 5.470 0.928 -0.353 0.117 0.007 4.759 5.119 0.825 -0.153 0.543 0.007 4.759 6.100 0.830 -0.112 -0.547 -0.005 4.759 10.256 0.996 0.092 0.006 0.023 4.726 10.256 0.989 0.145 0.007 0.007 4.759 10.227 0.995 0.098 0.015 0.007 4.759 10.287 0.995 0.096 -0.004 2.531 0.000 0.684 0.324 -0.068 0.944 2.526 0.153 0.684 0.235 -0.257 0.937 2.603 0.000 0.579 0.293 -0.032 0.955 2.308 0.250 1.367 0.515 -0.850 -0.110 2.478 0.250 0.767 0.187 -0.527 0.829 2.603 0.000 1.778 0.640 0.180 -0.747 2.478 0.250 1.696 0.115 -0.931 -0.345 2.485 0.237 5.470 0.077 -0.991 0.111 2.603 0.000 5.071 -0.099 -0.875 0.475 2.552 0.000 6.154 0.162 -0.821 -0.547 2.578 0.050 6.154 0.099 -0.836 -0.540 2.603 0.000 6.230 0.096 -0.818 -0.568 2.432 0.000 10.256 0.715 -0.699 0.000 2.487 0.231 10.256 0.445 -0.895 -0.006 2.603 0.000 9.859 0.230 -0.883 0.409 2.603 0.000 10.653 0.208 -0.893 -0.399 2.385 0.435 1.367 0.139 -0.985 -0.102 1.056 2.755 8.205 0.781 0.615 -0.107 1.267 2.671 8.205 0.578 0.810 -0.100 1.225 2.755 7.882 0.600 0.797 0.070 1.225 2.755 8.372 0.600 0.781 -0.174 0.962 3.006 3.419 0.817 0.577 0.009 1.148 2.911 3.419 0.679 0.734 0.002 1.100 3.006 3.214 0.716 0.692 0.094 1.100 3.006 3.628 0.708 0.701 -0.089 1.014 3.006 7.521 0.752 0.239 0.614 1.144 2.918 7.521 0.656 0.461 0.598 1.100 3.006 7.415 0.667 0.308 0.678 1.100 3.006 8.604 0.676 0.313 -0.667 1.194 2.819 12.307 0.374 0.795 0.477 1.100 3.006 11.952 0.287 0.529 0.798 1.100 3.006 12.966 0.237 0.415 -0.878 0.975 3.256 2.985 0.769 0.253 0.587 0.975 3.256 3.870 0.743 0.290 -0.603 0.933 3.256 7.521 0.578 -0.507 0.640 0.975 3.256 7.458 0.542 -0.494 0.680 0.768 3.256 8.205 0.787 -0.600 -0.145 0.975 3.256 8.571 0.399 -0.665 -0.631 0.975 3.256 11.873 0.116 0.038 0.993 0.765 3.256 12.991 0.372 -0.065 -0.926 1.091 3.024 12.991 0.223 0.364 -0.904 0.677 3.507 3.419 0.802 -0.597 0.022 0.850 3.507 3.040 0.489 -0.738 0.465 0.850 3.507 3.820 0.482 -0.734 -0.480 0.952 3.302 7.521 0.505 -0.576 0.643 0.857 3.492 8.205 0.239 -0.962 -0.130 0.850 3.507 11.929 0.087 -0.497 0.864 0.797 3.507 12.991 0.136 -0.405 -0.904 0.746 3.714 3.419 0.372 -0.928 0.018 0.746 3.714 12.307 0.019 -0.876 0.482 0.827 3.551 12.991 0.092 -0.426 -0.900 0.429 4.347 5.470 0.426 0.901 0.085 0.349 4.508 5.151 0.453 0.852 0.262 0.349 4.508 6.075 0.440 0.830 -0.343 0.248 4.508 10.256 0.738 0.675 0.010 0.381 4.443 10.256 0.642 0.767 0.010 0.349 4.508 10.113 0.662 0.747 0.056 0.349 4.508 10.407 0.662 0.748 -0.043 0.294 4.619 1.367 0.577 0.811 -0.100 0.223 4.759 0.865 0.496 0.618 0.610 0.223 4.759 1.631 0.610 0.765 -0.204 0.223 4.759 5.039 0.185 -0.019 0.983 0.041 4.759 6.154 0.777 -0.006 -0.630 0.325 4.556 6.154 0.466 0.736 -0.492 0.223 4.759 6.359 0.581 0.403 -0.707 0.223 4.759 9.833 0.781 0.467 0.414 0.223 4.759 10.687 0.782 0.448 -0.433 2.526 0.250 0.684 0.123 -0.431 0.894 2.820 0.000 0.464 0.179 0.301 0.937 2.695 0.250 0.487 -0.051 -0.447 0.893 2.820 0.000 1.797 0.323 0.536 -0.780 2.695 0.250 1.792 -0.119 -0.614 -0.781 2.505 0.250 5.470 0.025 -0.994 0.107 2.820 0.000 5.040 -0.191 -0.474 0.859 2.695 0.250 5.232 -0.274 -0.941 0.197 2.740 0.160 6.154 -0.298 -0.809 -0.507 2.695 0.250 5.921 -0.273 -0.945 -0.179 2.820 0.000 6.368 -0.347 -0.710 -0.613 2.495 0.250 10.256 0.397 -0.918 -0.006 2.820 0.000 9.809 -0.082 0.734 0.674 2.695 0.250 9.862 -0.095 -0.957 0.276 2.820 0.000 10.703 -0.109 0.710 -0.696 2.695 0.250 10.643 -0.102 -0.958 -0.268 2.624 0.392 0.684 -0.048 -0.510 0.859 2.451 0.501 1.367 0.088 -0.990 -0.109 2.569 0.501 1.002 -0.016 -0.891 0.454 2.569 0.501 1.559 0.020 -0.974 -0.224 2.637 0.366 5.470 -0.288 -0.953 0.094 2.605 0.429 10.256 -0.110 -0.994 -0.008 2.524 0.592 1.367 -0.039 -0.993 -0.115 1.473 2.694 8.205 0.272 0.957 -0.104 1.442 2.755 7.954 0.279 0.960 0.022 1.442 2.755 8.334 0.263 0.952 -0.158 1.375 2.889 3.419 0.413 0.911 -0.005 1.317 3.006 3.146 0.416 0.891 0.180 1.317 3.006 3.690 0.406 0.897 -0.178 1.379 2.882 7.521 0.299 0.770 0.563 1.317 3.006 7.338 0.269 0.616 0.741 1.317 3.006 8.627 0.211 0.505 -0.837 1.384 2.871 12.307 0.059 0.838 0.543 1.317 3.006 12.033 -0.051 0.681 0.731 1.317 3.006 12.825 0.029 0.757 -0.652 1.192 3.256 2.949 0.285 0.370 0.884 1.192 3.256 3.898 0.250 0.425 -0.870 1.192 3.256 7.274 0.137 -0.360 0.923 1.192 3.256 8.626 -0.040 -0.356 -0.934 1.192 3.256 11.882 0.000 0.200 0.980 1.280 3.079 12.991 0.015 0.408 -0.913 1.067 3.507 2.970 -0.582 -0.330 0.743 1.067 3.507 3.886 -0.572 -0.302 -0.762 1.088 3.464 7.521 -0.069 -0.826 0.560 0.869 3.507 8.205 0.213 -0.969 -0.128 1.067 3.507 7.618 -0.073 -0.920 0.386 1.067 3.507 8.497 0.089 -0.912 -0.400 1.067 3.507 11.890 -0.108 -0.291 0.951 0.768 3.757 3.419 0.372 -0.928 0.017 0.941 3.757 3.072 0.402 -0.842 0.360 0.941 3.757 3.782 0.372 -0.855 -0.361 0.994 3.652 8.205 -0.061 -0.989 -0.132 0.816 3.757 12.307 -0.067 -0.882 0.466 0.941 3.757 12.138 -0.130 -0.796 0.592 0.997 3.645 12.991 -0.168 -0.445 -0.880 0.941 3.757 12.626 -0.212 -0.977 -0.035 0.866 3.908 3.419 0.116 -0.993 0.013 0.902 3.836 12.307 -0.157 -0.848 0.506 0.616 4.407 5.470 0.177 0.980 0.088 0.566 4.508 5.253 0.155 0.970 0.186 0.566 4.508 5.873 0.128 0.982 -0.137 0.604 4.431 10.256 0.404 0.915 0.007 0.566 4.508 10.067 0.415 0.906 0.077 0.566 4.508 10.452 0.412 0.909 -0.069 0.503 4.633 1.367 0.320 0.942 -0.099 0.440 4.759 0.888 0.256 0.764 0.592 0.440 4.759 1.625 0.339 0.917 -0.209 0.440 4.759 5.049 0.080 0.493 0.867 0.516 4.607 6.154 0.118 0.858 -0.501 0.440 4.759 6.363 0.147 0.765 -0.627 0.440 4.759 9.785 0.442 0.629 0.639 0.440 4.759 10.734 0.423 0.615 -0.665 3.037 0.000 0.572 0.009 0.510 0.860 2.912 0.250 0.465 -0.312 -0.272 0.910 3.037 0.000 1.784 -0.260 0.434 -0.862 2.912 0.250 1.794 -0.121 0.028 -0.992 3.037 0.000 5.045 -0.525 -0.227 0.820 2.912 0.250 5.191 -0.559 -0.802 0.211 2.971 0.131 6.154 -0.652 -0.541 -0.531 2.912 0.250 5.979 -0.580 -0.781 -0.231 3.037 0.000 6.283 -0.705 -0.360 -0.610 3.017 0.000 10.256 0.533 0.846 0.000 3.027 0.019 10.256 0.555 0.832 0.000 2.912 0.250 9.788 -0.277 -0.801 0.531 2.912 0.250 10.720 -0.277 -0.814 -0.511 2.810 0.454 0.684 -0.248 -0.420 0.873 2.786 0.501 0.770 -0.258 -0.531 0.808 2.786 0.501 1.682 -0.370 -0.834 -0.410 2.839 0.395 5.470 -0.529 -0.844 0.087 2.746 0.501 10.256 -0.177 -0.984 -0.008 2.786 0.501 10.187 -0.193 -0.981 0.015 2.786 0.501 10.322 -0.193 -0.981 -0.030 2.707 0.660 1.367 -0.388 -0.915 -0.113 2.773 0.528 10.256 -0.198 -0.980 -0.009 1.545 2.755 8.205 0.171 0.980 -0.100 1.555 2.964 3.419 0.098 0.995 -0.006 1.534 3.006 3.316 0.086 0.996 0.034 1.534 3.006 3.518 0.086 0.995 -0.043 1.546 2.982 7.521 -0.172 0.791 0.587 1.534 3.006 7.483 -0.185 0.771 0.609 1.636 2.801 8.205 -0.019 0.993 -0.114 1.534 3.006 8.577 -0.257 0.751 -0.608 1.496 3.006 12.307 -0.160 0.849 0.503 1.409 3.256 2.956 -0.221 0.118 0.968 1.409 3.256 3.883 -0.228 0.181 -0.957 1.409 3.256 7.287 -0.481 -0.007 0.877 1.409 3.256 8.627 -0.210 -0.013 -0.978 1.520 3.034 12.307 -0.203 0.835 0.512 1.409 3.256 11.939 -0.234 0.438 0.868 1.409 3.255 12.991 -0.246 0.265 -0.932 1.283 3.507 3.335 0.969 0.198 0.149 1.283 3.507 3.508 0.972 0.210 -0.102 1.215 3.507 7.521 -0.342 -0.772 0.535 1.283 3.507 7.487 -0.432 -0.714 0.551 1.283 3.507 8.573 -0.362 -0.731 -0.578 1.283 3.507 11.898 -0.344 -0.148 0.927 1.158 3.757 2.952 0.313 -0.247 0.917 1.158 3.757 3.895 0.249 -0.266 -0.931 1.273 3.527 7.521 -0.433 -0.728 0.532 1.182 3.710 8.205 -0.363 -0.926 -0.107 1.158 3.757 12.069 -0.445 -0.639 0.627 1.233 3.608 12.991 -0.336 -0.209 -0.918 1.158 3.757 12.734 -0.542 -0.757 -0.365 1.042 3.990 3.419 -0.213 -0.977 0.006 1.097 3.879 12.307 -0.448 -0.748 0.489 0.710 4.508 5.470 -0.029 0.995 0.095 0.746 4.508 10.256 0.170 0.985 0.005 0.666 4.741 1.367 0.000 0.996 -0.094 0.657 4.759 1.297 -0.006 1.000 -0.015 0.657 4.759 1.406 -0.001 0.994 -0.106 0.760 4.552 5.470 -0.136 0.985 0.102 0.657 4.759 5.107 0.006 0.914 0.405 0.636 4.759 6.154 -0.228 0.805 -0.547 0.657 4.759 6.121 -0.257 0.829 -0.497 0.776 4.520 10.256 0.115 0.993 0.004 0.657 4.759 9.795 0.306 0.837 0.453 0.657 4.759 10.721 0.292 0.837 -0.463 3.114 0.000 0.684 -0.022 0.528 0.849 3.122 0.250 0.684 -0.387 -0.006 0.922 3.254 0.000 0.996 -0.156 0.890 0.427 3.128 0.250 0.693 -0.395 0.004 0.919 3.254 0.000 1.589 -0.162 0.969 -0.184 3.128 0.250 1.749 -0.748 -0.001 -0.663 3.254 0.000 5.208 -0.951 0.044 0.307 3.128 0.250 5.349 -0.783 -0.611 0.116 3.130 0.000 6.154 -0.778 -0.237 -0.581 3.254 0.000 5.903 -0.969 0.052 -0.241 3.128 0.250 5.682 -0.799 -0.602 -0.009 3.052 0.000 10.256 0.559 0.829 0.000 3.254 0.000 9.756 0.466 0.479 0.744 3.128 0.250 9.772 -0.483 -0.602 0.636 3.254 0.000 10.757 0.465 0.484 -0.741 3.128 0.250 10.738 -0.477 -0.619 -0.624 3.003 0.501 0.883 -0.589 -0.460 0.665 3.003 0.501 1.631 -0.742 -0.617 -0.263 3.093 0.321 5.470 -0.764 -0.641 0.080 3.003 0.501 10.042 -0.501 -0.860 0.099 3.003 0.501 10.464 -0.497 -0.862 -0.105 2.930 0.648 1.367 -0.672 -0.734 -0.101 2.959 0.589 10.256 -0.491 -0.871 -0.007 1.588 3.006 3.419 0.069 0.998 -0.006 1.559 3.006 7.521 -0.210 0.779 0.591 1.761 2.985 8.205 -0.478 0.871 -0.113 1.751 3.006 8.126 -0.493 0.867 -0.077 1.751 3.006 8.244 -0.489 0.863 -0.126 1.711 3.085 3.419 -0.106 0.994 -0.005 1.626 3.256 3.038 -0.298 0.863 0.407 1.626 3.256 3.797 -0.287 0.871 -0.399 1.610 3.256 7.521 -0.749 0.216 0.627 1.626 3.256 7.549 -0.775 0.247 0.581 1.626 3.256 8.557 -0.695 0.399 -0.598 1.609 3.256 12.307 -0.623 0.575 0.530 1.409 3.256 12.991 -0.246 0.264 -0.932 1.500 3.507 2.935 0.343 0.303 0.889 1.500 3.507 3.906 0.322 0.323 -0.890 1.341 3.507 7.521 -0.510 -0.658 0.554 1.500 3.507 7.629 -0.787 -0.465 0.405 1.500 3.507 8.521 -0.790 -0.488 -0.372 1.605 3.298 12.307 -0.692 0.489 0.531 1.500 3.507 12.086 -0.722 0.090 0.686 1.363 3.507 12.991 -0.372 -0.063 -0.926 1.500 3.507 12.696 -0.949 0.090 -0.302 1.375 3.757 2.936 -0.478 -0.485 0.732 1.375 3.757 3.906 -0.489 -0.477 -0.730 1.398 3.710 8.205 -0.644 -0.759 -0.099 1.375 3.757 12.231 -0.722 -0.444 0.530 1.375 3.757 12.441 -0.799 -0.490 0.349 1.110 4.007 3.419 -0.320 -0.947 0.004 1.250 4.007 3.290 -0.461 -0.886 0.049 1.250 4.007 3.550 -0.463 -0.885 -0.044 1.352 3.804 12.307 -0.715 -0.486 0.503 1.224 4.059 3.419 -0.456 -0.890 0.003 0.680 4.759 1.367 -0.019 0.995 -0.094 0.863 4.759 5.470 -0.532 0.842 0.094 0.947 4.613 10.256 -0.006 1.000 0.001 0.874 4.759 9.903 0.060 0.977 0.206 0.874 4.759 10.610 0.055 0.977 -0.206 3.367 0.000 1.367 -0.237 0.968 -0.081 3.350 0.242 1.367 -0.953 0.287 -0.097 3.345 0.250 1.350 -0.961 0.267 -0.076 3.345 0.250 1.378 -0.959 0.265 -0.101 3.387 0.000 5.470 -0.980 0.169 0.108 3.204 0.250 5.470 -0.822 -0.563 0.079 3.471 0.000 9.906 -0.520 0.806 0.281 3.345 0.250 9.861 -0.839 -0.447 0.309 3.471 0.000 10.606 -0.515 0.810 -0.280 3.345 0.250 10.652 -0.837 -0.452 -0.309 3.192 0.501 1.367 -0.912 -0.398 -0.100 3.328 0.286 1.367 -0.978 0.183 -0.099 3.220 0.501 10.197 -0.748 -0.664 0.016 3.220 0.501 10.315 -0.747 -0.665 -0.020 3.207 0.527 10.256 -0.741 -0.672 -0.003 1.769 3.006 8.205 -0.495 0.862 -0.113 1.802 3.256 3.419 -0.520 0.854 -0.002 1.808 3.256 8.205 -0.917 0.378 -0.125 1.814 3.313 3.419 -0.631 0.775 -0.001 1.717 3.507 3.082 -0.775 0.556 0.301 1.717 3.507 3.757 -0.769 0.564 -0.300 1.705 3.507 8.205 -0.980 -0.169 -0.110 1.609 3.507 12.307 -0.811 0.129 0.571 1.592 3.757 3.037 -0.896 -0.280 0.344 1.592 3.757 3.804 -0.896 -0.279 -0.345 1.422 3.757 12.307 -0.752 -0.416 0.512 1.465 4.007 3.419 -0.713 -0.702 0.002 1.467 4.007 3.419 -0.715 -0.699 0.002 1.033 4.759 10.256 -0.283 0.959 0.000 3.350 0.250 1.367 -0.959 0.267 -0.097 3.613 0.000 10.256 -0.622 0.783 0.000 3.531 0.250 10.256 -0.982 -0.191 0.001 3.254 0.501 10.256 -0.765 -0.644 -0.002 2.868 1.503 8.205 0.989 -0.079 -0.125 3.033 1.310 8.205 0.924 0.366 -0.112 2.936 1.503 7.919 0.997 -0.056 0.053 2.936 1.503 8.348 0.979 -0.059 -0.194 2.865 1.646 8.205 0.920 -0.372 -0.126 2.128 3.006 1.367 0.991 -0.063 -0.120 2.264 2.846 1.367 0.948 0.295 -0.116 2.185 3.006 1.133 0.973 -0.049 0.227 2.185 3.006 1.488 0.984 -0.046 -0.172 2.121 3.133 1.367 0.947 -0.297 -0.120 1.857 3.507 3.419 -0.877 0.481 0.002 1.773 3.757 3.419 -0.997 -0.082 0.003 3.403 1.002 3.419 0.735 0.678 -0.003 3.403 1.002 3.419 0.735 0.678 -0.003 3.403 1.002 3.419 0.735 0.678 -0.003 3.403 1.002 3.419 0.735 0.678 -0.003 3.069 1.252 3.419 0.994 0.111 -0.015 3.278 1.252 3.011 0.899 0.309 0.310 3.278 1.252 3.812 0.910 0.285 -0.303 3.094 1.252 8.205 0.843 0.528 -0.104 3.333 1.144 8.205 0.660 0.745 -0.095 3.278 1.252 7.816 0.689 0.714 0.127 3.278 1.252 8.412 0.698 0.688 -0.196 2.977 1.503 3.419 0.927 -0.373 -0.019 3.153 1.503 3.015 0.870 -0.358 0.339 3.153 1.503 3.801 0.873 -0.365 -0.323 3.081 1.503 7.521 0.822 0.120 0.556 3.197 1.415 7.521 0.765 0.340 0.547 3.153 1.503 7.424 0.785 0.167 0.596 3.153 1.503 8.602 0.799 0.194 -0.569 3.131 1.503 12.307 0.849 0.181 0.496 3.169 1.470 12.307 0.841 0.223 0.493 3.153 1.503 12.266 0.843 0.187 0.505 3.153 1.503 12.402 0.893 0.204 0.402 3.030 1.748 3.419 0.453 -0.891 -0.019 3.055 1.699 7.521 0.674 -0.409 0.616 2.848 1.753 8.205 0.772 -0.625 -0.120 3.028 1.753 7.555 0.610 -0.588 0.531 3.028 1.753 8.546 0.717 -0.570 -0.401 3.048 1.712 12.307 0.797 -0.232 0.558 2.930 1.948 8.205 0.360 -0.926 -0.116 2.370 2.755 1.367 0.805 0.583 -0.105 2.569 2.670 1.367 0.633 0.768 -0.098 2.527 2.755 1.040 0.634 0.697 0.333 2.527 2.755 1.536 0.668 0.725 -0.168 2.351 3.006 0.684 0.437 0.075 0.896 2.434 2.940 0.684 0.421 0.158 0.893 2.402 3.006 0.613 0.425 0.094 0.900 2.402 3.006 1.759 0.823 0.207 -0.529 2.396 3.006 5.470 0.965 0.237 0.110 2.406 2.998 5.470 0.962 0.248 0.110 2.402 3.006 5.459 0.964 0.240 0.113 2.402 3.006 5.492 0.966 0.239 0.101 2.291 3.006 10.256 0.851 0.525 -0.006 2.445 2.920 10.256 0.759 0.651 -0.007 2.402 3.006 10.071 0.797 0.601 0.067 2.402 3.006 10.435 0.796 0.601 -0.074 2.318 3.172 0.684 0.381 -0.139 0.914 2.098 3.256 1.367 0.812 -0.571 -0.118 2.276 3.256 0.725 0.387 -0.296 0.873 2.276 3.256 1.705 0.751 -0.529 -0.395 2.322 3.165 5.470 0.988 -0.094 0.118 2.076 3.256 10.256 0.999 -0.049 -0.001 2.276 3.256 9.845 0.933 0.121 0.338 2.276 3.256 10.665 0.933 0.135 -0.332 2.170 3.468 1.367 0.420 -0.901 -0.113 2.015 3.507 10.256 0.863 -0.506 0.002 2.151 3.507 9.928 0.831 -0.513 0.215 2.151 3.507 10.586 0.835 -0.507 -0.215 2.065 3.678 10.256 0.588 -0.809 0.003 3.642 0.958 3.419 0.442 0.897 -0.001 3.620 1.002 3.308 0.446 0.894 0.037 3.620 1.002 3.528 0.447 0.894 -0.040 3.495 1.252 2.938 0.223 0.533 0.816 3.495 1.252 3.892 0.244 0.506 -0.827 3.547 1.148 8.205 0.228 0.968 -0.109 3.495 1.252 7.823 0.220 0.965 0.144 3.495 1.252 8.416 0.190 0.950 -0.248 3.370 1.503 2.944 -0.518 -0.204 0.831 3.370 1.503 3.876 -0.521 -0.248 -0.817 3.441 1.361 7.521 0.301 0.767 0.566 3.370 1.503 7.316 0.339 0.542 0.769 3.370 1.503 8.625 -0.199 0.490 -0.849 3.471 1.301 12.307 0.612 0.650 0.451 3.370 1.503 11.982 0.643 0.364 0.674 3.370 1.503 12.941 0.478 0.311 -0.821 3.032 1.753 3.419 0.442 -0.897 -0.019 3.245 1.753 3.001 0.613 -0.654 0.444 3.245 1.753 3.819 0.651 -0.631 -0.422 3.047 1.753 7.521 0.561 -0.569 0.601 3.245 1.753 7.303 0.327 -0.470 0.820 3.245 1.753 8.638 -0.196 -0.385 -0.902 3.030 1.753 12.307 0.763 -0.323 0.560 3.245 1.753 11.933 0.606 -0.167 0.777 3.197 1.753 12.991 0.398 -0.107 -0.911 3.324 1.595 12.991 0.405 0.131 -0.905 3.151 1.941 3.419 0.184 -0.983 -0.013 3.164 1.915 7.521 0.151 -0.795 0.588 2.976 2.004 8.205 0.203 -0.973 -0.108 3.119 2.004 7.757 0.146 -0.969 0.201 3.119 2.004 8.441 0.256 -0.931 -0.261 3.058 2.004 12.307 0.423 -0.738 0.526 3.119 2.004 12.186 0.427 -0.713 0.556 3.212 1.819 12.991 0.359 -0.167 -0.918 3.119 2.004 12.576 0.476 -0.871 0.124 3.064 2.115 8.205 0.125 -0.986 -0.114 3.088 2.066 12.307 0.385 -0.765 0.517 2.778 2.687 1.367 0.185 0.977 -0.109 2.744 2.755 1.077 0.195 0.938 0.286 2.744 2.755 1.513 0.167 0.970 -0.176 2.684 2.874 0.684 0.178 0.417 0.891 2.618 3.006 0.493 0.175 0.279 0.944 2.618 3.006 1.792 -0.098 0.498 -0.862 2.709 2.825 5.470 0.684 0.722 0.104 2.618 3.006 5.161 0.812 0.499 0.303 2.618 3.006 6.054 0.788 0.486 -0.378 2.678 2.886 10.256 0.414 0.910 -0.004 2.618 3.006 9.976 0.427 0.885 0.186 2.618 3.006 10.533 0.442 0.878 -0.184 2.299 3.256 0.684 0.333 -0.263 0.905 2.493 3.256 0.455 0.210 -0.208 0.955 2.493 3.256 1.788 -0.312 -0.375 -0.873 2.278 3.256 5.470 0.943 -0.311 0.117 2.493 3.256 5.092 0.866 -0.158 0.475 2.480 3.256 6.154 0.792 -0.173 -0.586 2.518 3.206 6.154 0.803 -0.053 -0.594 2.493 3.256 6.175 0.788 -0.167 -0.592 2.493 3.256 9.781 -0.087 0.435 0.896 2.493 3.256 10.732 -0.031 0.455 -0.890 2.406 3.430 0.684 0.111 -0.420 0.901 2.196 3.507 1.367 0.311 -0.944 -0.110 2.368 3.507 0.861 0.138 -0.685 0.715 2.368 3.507 1.642 0.341 -0.878 -0.335 2.281 3.507 5.470 0.591 -0.799 0.112 2.368 3.507 5.293 0.601 -0.775 0.193 2.483 3.276 6.154 0.780 -0.203 -0.592 2.368 3.507 5.788 0.579 -0.811 -0.087 2.368 3.507 9.785 0.034 -0.416 0.909 2.368 3.507 10.730 0.058 -0.405 -0.912 2.299 3.644 1.367 0.128 -0.985 -0.116 2.321 3.601 5.470 0.498 -0.861 0.108 2.097 3.757 10.256 0.467 -0.884 0.003 2.243 3.757 9.936 0.617 -0.753 0.227 2.243 3.757 10.579 0.615 -0.755 -0.226 2.174 3.895 10.256 0.366 -0.931 0.002 surface_Al2O3_3 604 678 4 1 3 4 2 4 1 5 6 2 5 7 9 4 3 8 5 7 10 6 5 8 3 11 12 13 3 11 12 14 4 15 17 18 16 4 15 19 20 16 5 7 9 23 22 21 5 7 10 25 24 21 5 11 13 27 28 26 5 11 14 29 30 26 4 17 31 32 18 5 33 35 20 19 34 4 36 22 23 37 4 36 24 25 37 4 27 38 39 28 4 29 40 41 30 4 31 42 43 32 5 33 35 46 45 44 4 47 38 39 48 4 47 40 41 48 4 49 42 43 50 4 49 45 46 50 3 51 52 53 3 51 52 54 3 55 56 57 3 55 56 58 3 59 60 61 6 59 60 53 51 62 63 5 51 54 64 65 62 5 55 57 67 68 66 5 55 58 69 70 66 4 71 73 74 72 4 71 75 76 72 3 59 77 61 5 59 63 79 78 77 4 64 80 81 65 4 67 82 83 68 4 69 84 85 70 5 86 88 74 73 87 5 86 89 76 75 87 4 90 78 79 91 4 90 80 81 91 4 92 82 83 93 4 92 84 85 93 5 86 88 96 95 94 5 86 89 98 97 94 4 99 95 96 100 4 99 97 98 100 3 101 2 4 3 101 2 6 5 101 4 9 103 102 5 101 6 10 104 102 3 105 16 18 3 105 16 20 4 9 23 106 103 4 10 25 107 104 3 108 26 28 3 108 26 30 5 105 18 32 110 109 5 105 20 35 111 109 4 37 23 106 112 4 37 25 107 112 4 108 28 39 113 4 108 30 41 113 4 32 43 114 110 4 35 46 115 111 3 113 48 39 3 113 48 41 4 50 43 114 116 4 50 46 115 116 3 117 62 63 3 117 62 65 4 66 68 119 118 4 66 70 120 118 3 121 72 74 3 121 72 76 4 117 63 79 122 4 117 65 81 122 4 68 83 123 119 4 70 85 124 120 5 121 74 88 126 125 5 121 76 89 127 125 3 122 91 79 3 122 91 81 4 93 83 123 128 4 93 85 124 128 4 88 96 129 126 4 89 98 130 127 4 100 96 129 131 4 100 98 130 131 3 132 102 103 3 132 102 104 4 132 103 106 133 4 132 104 107 133 3 134 109 110 3 134 109 111 3 133 112 106 3 133 112 107 4 134 110 114 135 4 134 111 115 135 3 135 116 114 3 135 116 115 3 136 118 119 3 136 118 120 4 136 119 123 137 4 136 120 124 137 3 138 125 126 3 138 125 127 3 137 128 123 3 137 128 124 4 138 126 129 139 4 138 127 130 139 3 139 131 129 3 139 131 130 3 140 141 142 3 140 141 143 3 144 145 146 3 144 145 147 4 144 146 149 148 4 144 147 150 148 3 148 151 149 3 148 151 150 3 152 153 154 3 152 153 155 5 156 158 157 142 141 5 156 160 159 143 141 3 161 162 163 3 161 162 164 3 156 165 158 3 156 165 160 4 145 146 167 166 4 145 147 168 166 3 169 170 171 3 169 170 172 4 146 149 173 167 4 147 150 174 168 4 169 171 176 175 4 169 172 177 175 5 178 179 173 149 151 5 178 180 174 150 151 3 175 181 176 3 175 181 177 3 178 182 179 3 178 182 180 3 183 184 185 3 183 184 186 4 153 154 188 187 4 153 155 189 187 4 183 185 191 190 4 183 186 192 190 5 193 157 158 195 194 5 193 159 160 196 194 5 197 199 198 163 162 5 197 201 200 164 162 3 202 203 204 3 202 203 205 4 165 158 195 206 4 165 160 196 206 3 197 207 199 3 197 207 201 4 166 167 209 208 4 166 168 210 208 3 211 212 213 3 211 212 214 4 170 171 216 215 4 170 172 217 215 5 218 173 167 209 219 5 218 174 168 210 219 4 211 213 221 220 4 211 214 222 220 4 171 176 223 216 4 172 177 224 217 5 218 173 179 226 225 5 218 174 180 227 225 3 220 228 221 3 220 228 222 5 229 230 223 176 181 5 229 231 224 177 181 4 182 179 226 232 4 182 180 227 232 3 229 233 230 3 229 233 231 4 184 185 235 234 4 184 186 236 234 4 187 188 238 237 4 187 189 239 237 3 240 241 242 3 240 241 243 4 185 191 244 235 4 186 192 245 236 5 246 247 248 195 194 5 246 249 250 196 194 4 198 199 252 251 4 200 201 254 253 5 255 257 256 204 203 5 255 259 258 205 203 4 206 195 248 260 4 206 196 250 260 4 207 199 252 261 4 207 201 254 261 3 255 262 257 3 255 262 259 4 208 209 264 263 4 208 210 265 263 4 212 213 267 266 4 212 214 268 266 4 215 216 270 269 4 215 217 271 269 5 272 273 264 209 219 5 272 274 265 210 219 4 213 221 275 267 4 214 222 276 268 4 216 223 277 270 5 278 224 217 271 279 3 278 279 280 5 272 273 281 226 225 5 272 274 282 227 225 5 283 284 275 221 228 5 283 285 276 222 228 4 223 230 286 277 5 278 224 231 288 287 3 278 287 280 4 232 226 281 289 4 232 227 282 289 3 283 290 284 3 283 290 285 4 233 230 286 291 4 233 231 288 291 3 292 234 235 3 292 234 236 4 237 238 294 293 4 237 239 295 293 3 296 241 242 3 296 241 243 5 292 235 244 298 297 5 292 236 245 299 297 4 247 248 301 300 4 249 250 303 302 4 251 252 305 304 4 253 254 307 306 4 256 257 309 308 4 258 259 311 310 4 260 248 301 312 4 260 250 303 312 5 313 314 305 252 261 5 313 315 307 254 261 4 262 257 309 316 4 262 259 311 316 3 313 317 314 3 313 317 315 3 318 263 264 3 318 263 265 4 266 267 320 319 4 266 268 321 319 3 322 269 270 3 322 269 271 5 318 264 273 324 323 5 318 265 274 325 323 4 267 275 326 320 4 268 276 327 321 5 322 270 277 329 328 6 322 328 331 330 279 271 3 330 279 280 4 273 281 332 324 4 274 282 333 325 4 275 284 334 326 4 276 285 335 327 4 277 286 336 329 5 330 331 337 288 287 3 330 287 280 4 289 281 332 338 4 289 282 333 338 4 290 284 334 339 4 290 285 335 339 4 291 286 336 340 4 291 288 337 340 3 341 293 294 3 341 293 295 4 297 298 343 342 4 297 299 344 342 4 345 300 301 346 4 345 302 303 346 5 347 304 305 349 348 5 347 306 307 350 348 4 351 308 309 352 4 351 310 311 352 3 346 312 301 3 346 312 303 5 353 314 305 349 354 5 353 315 307 350 354 3 352 316 309 3 352 316 311 3 353 317 314 3 353 317 315 3 355 319 320 3 355 319 321 3 356 323 324 3 356 323 325 5 355 320 326 358 357 5 355 321 327 359 357 3 360 328 329 3 360 328 331 4 356 324 332 361 4 356 325 333 361 4 326 334 362 358 4 327 335 363 359 4 360 329 336 364 4 360 331 337 364 3 361 338 332 3 361 338 333 4 339 334 362 365 4 339 335 363 365 3 364 340 336 3 364 340 337 3 366 342 343 3 366 342 344 3 367 348 349 3 367 348 350 3 367 354 349 3 367 354 350 3 368 357 358 3 368 357 359 4 368 358 362 369 4 368 359 363 369 3 369 365 362 3 369 365 363 3 370 371 372 3 370 371 373 4 370 372 375 374 4 370 373 376 374 3 374 377 375 3 374 377 376 3 378 379 380 3 378 379 381 4 382 384 385 383 4 382 386 387 383 3 388 389 390 3 388 389 391 3 392 393 394 3 392 393 395 3 383 396 385 3 383 396 387 3 397 398 399 3 397 398 400 4 371 372 402 401 4 371 373 403 401 3 404 405 406 3 404 405 407 4 397 399 409 408 4 397 400 410 408 4 372 375 411 402 4 373 376 412 403 4 404 406 414 413 4 404 407 415 413 3 408 416 409 3 408 416 410 5 417 418 411 375 377 5 417 419 412 376 377 3 413 420 414 3 413 420 415 3 417 421 418 3 417 421 419 3 422 423 424 3 422 423 425 3 426 427 428 3 426 427 429 5 422 424 430 380 379 5 422 425 431 381 379 3 432 433 434 3 432 433 435 4 384 385 437 436 4 386 387 439 438 4 389 390 441 440 4 389 391 442 440 5 443 445 444 394 393 5 443 447 446 395 393 4 396 385 437 448 4 396 387 439 448 3 443 449 445 3 443 449 447 4 398 399 451 450 4 398 400 452 450 4 401 402 454 453 4 401 403 455 453 4 405 406 457 456 4 405 407 458 456 3 459 460 461 5 459 409 399 451 460 4 400 410 462 452 4 402 411 463 454 4 403 412 464 455 4 406 414 465 457 4 407 415 466 458 3 459 467 461 6 459 467 469 468 416 409 5 468 470 462 410 416 4 411 418 471 463 4 412 419 472 464 5 473 474 465 414 420 5 473 475 466 415 420 3 468 476 469 3 468 476 470 4 421 418 471 477 4 421 419 472 477 3 473 478 474 3 473 478 475 3 479 423 424 3 479 423 425 4 427 428 481 480 4 427 429 482 480 5 479 424 430 484 483 5 479 425 431 485 483 4 433 434 487 486 4 433 435 488 486 4 436 437 490 489 4 438 439 492 491 5 493 495 494 441 440 5 493 497 496 442 440 5 498 444 445 500 499 5 498 446 447 501 499 5 502 503 490 437 448 5 502 504 492 439 448 3 493 505 495 3 493 505 497 4 449 445 500 506 4 449 447 501 506 3 502 507 503 3 502 507 504 4 450 451 509 508 4 450 452 510 508 3 511 453 454 3 511 453 455 4 456 457 513 512 4 456 458 514 512 3 515 460 461 5 515 516 509 451 460 4 452 462 517 510 5 511 454 463 519 518 5 511 455 464 520 518 5 521 465 457 513 522 5 521 466 458 514 522 3 515 467 461 5 515 516 523 469 467 4 462 470 524 517 4 463 471 525 519 4 464 472 526 520 5 521 465 474 528 527 5 521 466 475 529 527 4 476 469 523 530 4 476 470 524 530 4 477 471 525 531 4 477 472 526 531 4 478 474 528 532 4 478 475 529 532 3 533 480 481 3 533 480 482 4 483 484 535 534 4 483 485 536 534 4 486 487 538 537 4 486 488 539 537 5 540 489 490 542 541 5 540 491 492 543 541 4 544 494 495 545 4 544 496 497 545 5 546 547 548 500 499 5 546 549 550 501 499 4 490 503 551 542 4 492 504 552 543 3 545 505 495 3 545 505 497 4 506 500 548 553 4 506 501 550 553 4 507 503 551 554 4 507 504 552 554 3 555 508 509 3 555 508 510 4 512 513 557 556 4 512 514 558 556 5 555 509 516 560 559 5 555 510 517 561 559 3 562 518 519 3 562 518 520 5 563 564 557 513 522 5 563 565 558 514 522 4 516 523 566 560 4 517 524 567 561 4 562 519 525 568 4 562 520 526 568 5 563 564 569 528 527 5 563 565 570 529 527 4 530 523 566 571 4 530 524 567 571 3 568 531 525 3 568 531 526 4 532 528 569 572 4 532 529 570 572 3 573 534 535 3 573 534 536 4 537 538 575 574 4 537 539 576 574 3 577 541 542 3 577 541 543 4 547 548 579 578 4 549 550 581 580 4 577 542 551 582 4 577 543 552 582 4 553 548 579 583 4 553 550 581 583 3 582 554 551 3 582 554 552 3 584 556 557 3 584 556 558 3 585 559 560 3 585 559 561 5 584 557 564 587 586 5 584 558 565 588 586 4 585 560 566 589 4 585 561 567 589 4 564 569 590 587 4 565 570 591 588 3 589 571 566 3 589 571 567 4 572 569 590 592 4 572 570 591 592 3 593 574 575 3 593 574 576 4 594 578 579 595 4 594 580 581 595 3 595 583 579 3 595 583 581 3 596 586 587 3 596 586 588 4 596 587 590 597 4 596 588 591 597 3 597 592 590 3 597 592 591 3 598 599 600 3 598 599 601 4 598 600 603 602 4 598 601 604 602 3 605 606 607 3 605 606 608 3 602 609 603 3 602 609 604 4 605 607 611 610 4 605 608 612 610 3 610 613 611 3 610 613 612 3 614 615 616 3 614 615 617 4 614 616 619 618 4 614 617 620 618 3 621 622 623 3 621 622 624 3 618 625 619 3 618 625 620 4 621 623 627 626 4 621 624 628 626 3 626 629 627 3 626 629 628 4 599 600 631 630 4 599 601 632 630 4 600 603 633 631 4 601 604 634 632 4 606 607 636 635 4 606 608 637 635 3 638 639 640 3 638 639 641 5 642 643 633 603 609 5 642 644 634 604 609 4 607 611 645 636 4 608 612 646 637 4 638 640 648 647 4 638 641 649 647 3 642 650 643 3 642 650 644 4 613 611 645 651 4 613 612 646 651 3 647 652 648 3 647 652 649 4 615 616 654 653 4 615 617 655 653 3 656 657 658 3 656 657 659 4 616 619 660 654 4 617 620 661 655 4 656 658 663 662 4 656 659 664 662 4 622 623 666 665 4 622 624 667 665 5 668 669 660 619 625 5 668 670 661 620 625 3 662 671 663 3 662 671 664 4 623 627 672 666 4 624 628 673 667 3 668 674 669 3 668 674 670 5 675 676 672 627 629 5 675 677 673 628 629 3 675 678 676 3 675 678 677 -0.557 1.114 3.419 -0.119 0.993 -0.003 -0.399 1.231 3.419 -0.632 0.775 -0.002 -0.626 1.252 3.135 -0.746 0.056 0.663 -0.409 1.252 3.369 -0.659 0.752 0.020 -0.626 1.252 3.701 -0.746 0.038 -0.665 -0.409 1.252 3.468 -0.659 0.751 -0.025 -0.657 1.503 3.419 0.999 0.049 -0.003 -0.700 1.400 3.419 0.997 -0.072 -0.003 -0.535 1.503 3.144 0.261 0.736 0.625 -0.535 1.503 3.691 0.274 0.733 -0.623 -0.587 1.503 8.205 -0.579 0.803 -0.141 -0.685 1.370 8.205 -0.249 0.954 -0.165 -0.751 1.503 7.769 -0.455 0.839 0.297 -0.751 1.503 8.426 -0.431 0.782 -0.450 -0.703 1.405 12.307 0.285 0.692 0.663 -0.527 1.487 12.307 -0.269 0.721 0.638 -0.751 1.503 12.129 0.269 0.541 0.797 -0.535 1.503 12.276 -0.281 0.705 0.652 -0.751 1.503 12.654 0.387 0.909 -0.154 -0.535 1.503 12.365 -0.291 0.762 0.579 -0.809 1.619 3.419 0.999 0.043 -0.004 -0.877 1.753 3.163 0.732 0.391 0.559 -0.660 1.753 3.135 0.445 -0.695 0.565 -0.877 1.753 3.670 0.748 0.382 -0.543 -0.660 1.753 3.702 0.477 -0.676 -0.562 -0.569 1.572 8.205 -0.764 0.631 -0.132 -0.877 1.753 7.543 -0.631 -0.156 0.760 -0.660 1.753 7.844 -0.970 0.189 0.151 -0.877 1.753 8.467 0.597 -0.181 -0.782 -0.660 1.753 8.398 -0.946 0.175 -0.272 -0.877 1.753 12.048 0.157 0.042 0.987 -0.660 1.753 12.052 0.235 0.258 0.937 -0.795 1.753 12.991 0.072 0.111 -0.991 -0.869 1.739 12.991 0.254 0.060 -0.965 -0.660 1.753 12.952 -0.225 0.252 -0.941 -0.959 1.918 3.419 0.286 -0.958 -0.009 -0.781 1.995 3.419 -0.421 -0.907 0.003 -1.002 2.004 7.915 -0.288 -0.954 0.086 -0.785 2.004 8.041 -0.850 -0.526 -0.031 -1.002 2.004 8.358 -0.228 -0.924 -0.308 -0.785 2.004 8.292 -0.841 -0.520 -0.153 -1.002 2.004 12.100 -0.036 -0.522 0.852 -0.785 2.004 12.047 0.076 -0.349 0.934 -0.886 1.771 12.991 0.254 0.003 -0.967 -1.002 2.004 12.723 0.154 -0.861 -0.485 -0.785 2.004 12.879 -0.187 -0.416 -0.890 -1.041 2.082 8.205 -0.245 -0.956 -0.162 -0.810 2.055 8.205 -0.813 -0.570 -0.116 -1.059 2.118 12.307 -0.002 -0.736 0.677 -0.878 2.190 12.307 -0.084 -0.754 0.652 -1.363 3.006 1.367 -0.530 0.833 -0.160 -1.446 2.892 1.367 -0.318 0.933 -0.170 -1.503 3.006 0.952 -0.330 0.631 0.702 -1.503 3.006 1.574 -0.539 0.753 -0.377 -1.319 3.006 5.470 -0.202 0.969 0.140 -1.464 2.927 5.470 0.309 0.938 0.159 -1.503 3.006 5.316 0.313 0.901 0.301 -1.503 3.006 5.760 0.319 0.944 -0.085 -1.614 3.256 0.684 -0.293 -0.026 0.956 -1.619 3.238 0.684 -0.277 -0.003 0.961 -1.628 3.256 0.670 -0.285 -0.035 0.958 -1.334 3.101 1.367 -0.752 0.640 -0.158 -1.411 3.256 0.984 -0.779 0.207 0.592 -1.628 3.256 1.627 0.616 -0.087 -0.783 -1.411 3.256 1.556 -0.924 0.257 -0.284 -1.296 3.025 5.470 -0.255 0.956 0.144 -1.628 3.256 5.208 0.621 0.177 0.764 -1.411 3.256 5.202 0.293 0.582 0.758 -1.628 3.256 6.131 0.600 0.161 -0.783 -1.411 3.256 6.088 -0.343 0.608 -0.716 -1.546 3.091 10.256 0.219 0.976 0.009 -1.368 3.170 10.256 -0.573 0.819 0.014 -1.628 3.256 10.005 0.812 -0.335 0.478 -1.411 3.256 10.072 -0.751 0.645 0.144 -1.628 3.256 10.512 0.834 -0.316 -0.452 -1.411 3.256 10.448 -0.745 0.655 -0.128 -1.635 3.271 0.684 -0.282 -0.059 0.958 -1.753 3.507 1.021 -0.243 -0.765 0.596 -1.536 3.507 1.147 -0.843 -0.493 0.216 -1.753 3.507 1.546 -0.194 -0.906 -0.377 -1.536 3.507 1.481 -0.856 -0.485 -0.179 -1.753 3.507 5.248 -0.342 -0.814 0.469 -1.536 3.507 5.221 0.296 -0.680 0.670 -1.753 3.507 5.905 0.119 -0.936 -0.331 -1.536 3.507 6.061 -0.322 -0.700 -0.637 -1.649 3.507 10.256 0.995 0.096 0.006 -1.695 3.391 10.256 0.999 -0.050 0.005 -1.536 3.507 10.013 0.918 0.246 0.310 -1.536 3.507 10.509 0.927 0.232 -0.293 -1.802 3.604 1.367 -0.235 -0.957 -0.170 -1.572 3.577 1.367 -0.819 -0.561 -0.121 -1.820 3.639 5.470 -0.076 -0.983 0.170 -1.643 3.720 5.470 -0.140 -0.977 0.162 -1.805 3.610 10.256 0.997 0.076 0.004 -1.879 3.757 9.974 0.552 -0.048 0.832 -1.662 3.757 9.969 -0.217 -0.806 0.551 -1.879 3.757 10.540 0.550 -0.071 -0.832 -1.662 3.757 10.547 -0.203 -0.821 -0.533 -1.948 3.895 10.256 0.046 -0.999 0.003 -1.747 3.927 10.256 -0.397 -0.918 0.003 -0.387 1.252 3.419 -0.647 0.762 -0.002 -0.300 1.467 3.419 -0.651 0.759 -0.002 -0.318 1.503 3.351 -0.680 0.732 0.038 -0.318 1.503 3.486 -0.679 0.733 -0.042 -0.515 1.503 12.307 -0.282 0.719 0.635 -0.443 1.753 3.221 -0.959 -0.223 0.173 -0.443 1.753 3.617 -0.961 -0.217 -0.172 -0.550 1.753 8.205 -0.964 0.229 -0.136 -0.402 1.672 12.307 -0.342 0.626 0.700 -0.443 1.753 12.178 -0.347 0.513 0.785 -0.443 1.753 12.553 -0.585 0.764 0.272 -0.526 1.919 3.419 -0.834 -0.551 0.005 -0.723 2.004 8.205 -0.874 -0.471 -0.119 -0.568 2.004 12.098 -0.532 -0.191 0.825 -0.568 2.004 12.713 -0.847 -0.275 -0.454 -0.658 2.184 12.307 -0.577 -0.552 0.603 -1.303 3.256 1.367 -0.941 0.301 -0.157 -1.159 3.186 5.470 -0.451 0.877 0.168 -1.194 3.256 5.347 -0.524 0.807 0.274 -1.194 3.256 5.703 -0.570 0.822 -0.024 -1.314 3.256 10.256 -0.673 0.740 0.015 -1.455 3.507 1.367 -0.899 -0.419 -0.130 -1.319 3.507 5.258 -0.842 -0.288 0.456 -1.319 3.507 5.893 -0.913 -0.271 -0.304 -1.269 3.405 10.256 -0.632 0.774 0.022 -1.319 3.507 10.098 -0.730 0.661 0.173 -1.319 3.507 10.423 -0.736 0.662 -0.139 -1.420 3.707 5.470 -0.716 -0.685 0.135 -1.445 3.757 10.084 -0.904 -0.409 0.123 -1.445 3.757 10.434 -0.902 -0.417 -0.108 -1.499 3.866 10.256 -0.830 -0.558 0.007 -0.290 1.503 3.419 -0.699 0.715 -0.002 -0.346 1.753 3.419 -0.995 -0.095 0.002 -0.375 1.753 12.307 -0.454 0.539 0.710 -0.428 2.004 12.307 -0.747 -0.068 0.661 -1.130 3.256 5.470 -0.601 0.781 0.172 -1.175 3.507 5.470 -0.984 -0.052 0.171 -1.246 3.507 10.256 -0.813 0.582 0.023 -1.353 3.757 10.256 -0.952 -0.305 0.012 0.837 0.000 3.419 0.488 -0.873 0.000 0.848 0.039 3.419 0.457 -0.889 0.000 0.868 0.000 3.344 0.453 -0.891 0.036 0.868 0.000 3.493 0.453 -0.891 -0.037 0.172 1.252 10.256 0.970 0.245 -0.003 0.290 1.156 10.256 0.882 0.472 -0.002 0.241 1.252 10.108 0.945 0.315 0.086 0.241 1.252 10.403 0.945 0.315 -0.090 0.082 1.503 10.256 0.823 -0.569 -0.002 0.116 1.503 10.174 0.806 -0.590 0.047 0.116 1.503 10.338 0.807 -0.589 -0.051 0.093 1.550 10.256 0.772 -0.636 -0.002 -1.586 4.759 3.419 0.921 0.390 0.000 -1.458 4.651 3.419 0.824 0.566 0.001 -1.512 4.759 3.262 0.877 0.473 0.080 -1.512 4.759 3.575 0.878 0.472 -0.080 0.921 0.250 3.419 -0.015 -1.000 0.000 1.085 0.000 3.112 -0.818 -0.048 0.573 0.959 0.250 3.334 -0.067 -0.997 0.030 1.085 0.000 3.725 -0.818 -0.047 -0.573 0.959 0.250 3.503 -0.068 -0.997 -0.031 1.084 0.000 8.205 0.843 -0.520 -0.140 1.085 0.000 8.205 0.843 -0.520 -0.140 1.085 0.000 8.205 0.843 -0.520 -0.140 1.085 0.000 8.205 0.843 -0.520 -0.140 0.942 0.285 3.419 -0.070 -0.998 -0.001 0.547 1.075 10.256 0.515 0.857 -0.003 0.458 1.252 9.953 0.642 0.657 0.395 0.458 1.252 10.556 0.635 0.661 -0.400 0.271 1.503 5.470 0.887 0.441 0.134 0.364 1.441 5.470 0.797 0.590 0.130 0.333 1.503 5.374 0.835 0.518 0.188 0.333 1.503 5.645 0.852 0.524 0.023 0.333 1.503 9.958 -0.782 -0.402 0.477 0.333 1.503 10.551 -0.788 -0.388 -0.478 0.129 1.753 5.470 0.876 -0.444 0.186 0.208 1.753 5.318 0.807 -0.471 0.357 0.208 1.753 5.753 0.895 -0.436 -0.096 0.138 1.753 10.256 0.401 -0.916 0.001 0.208 1.753 10.106 0.319 -0.941 0.116 0.208 1.753 10.407 0.323 -0.940 -0.114 0.150 1.868 5.470 0.686 -0.705 0.179 0.174 1.821 10.256 0.244 -0.970 0.003 -1.173 4.508 12.307 0.637 0.632 0.443 -1.169 4.506 12.307 0.634 0.634 0.442 -1.170 4.508 12.303 0.635 0.633 0.443 -1.170 4.508 12.315 0.637 0.635 0.436 -1.194 4.557 3.419 0.521 0.854 0.004 -1.295 4.759 3.126 0.586 0.748 0.313 -1.295 4.759 3.712 0.591 0.743 -0.315 -1.404 4.759 12.307 0.703 -0.101 0.704 -1.295 4.759 12.119 0.531 0.000 0.847 -1.295 4.759 12.641 0.987 -0.005 -0.163 1.208 0.000 3.419 0.324 0.946 0.000 1.240 0.124 3.419 0.507 0.862 -0.001 1.176 0.250 3.163 -0.332 -0.927 0.172 1.176 0.250 3.673 -0.337 -0.926 -0.173 1.087 0.250 8.205 0.166 -0.979 -0.119 1.301 0.000 7.704 0.844 0.169 0.508 1.176 0.250 7.922 0.070 -0.995 0.069 1.301 0.000 8.463 0.732 0.389 -0.560 1.176 0.250 8.363 -0.015 -0.978 -0.208 1.113 0.000 12.307 0.193 -0.806 0.560 1.225 0.154 12.307 -0.064 -0.816 0.574 1.301 0.000 12.062 -0.118 -0.676 0.728 1.301 0.000 12.780 -0.041 -0.830 -0.556 1.111 0.382 3.419 -0.257 -0.966 -0.003 1.131 0.340 8.205 0.011 -0.993 -0.114 0.744 1.115 10.256 -0.044 0.999 -0.011 0.675 1.252 9.975 -0.738 0.121 0.664 0.675 1.252 10.531 -0.750 0.105 -0.653 0.360 1.503 1.367 0.986 -0.062 -0.152 0.665 1.274 1.367 0.585 0.801 -0.128 0.550 1.503 0.902 0.515 0.189 0.836 0.550 1.503 1.604 0.761 0.356 -0.542 0.599 1.405 5.470 0.402 0.901 0.163 0.550 1.503 5.293 0.418 0.839 0.348 0.550 1.503 5.815 0.472 0.869 -0.149 0.473 1.503 10.256 -0.955 -0.296 -0.014 0.597 1.408 10.256 -0.986 -0.165 -0.024 0.328 1.753 1.367 0.598 -0.782 -0.174 0.425 1.753 1.035 0.426 -0.648 0.631 0.425 1.753 1.546 0.435 -0.821 -0.369 0.425 1.753 5.212 0.337 0.018 0.942 0.425 1.753 6.130 0.581 0.004 -0.814 0.500 1.602 10.256 -0.704 0.706 -0.080 0.425 1.753 9.991 0.640 0.184 0.746 0.425 1.753 10.520 0.627 0.233 -0.744 0.371 1.861 1.367 0.348 -0.921 -0.172 0.188 2.004 5.470 0.409 -0.897 0.167 0.300 2.004 5.288 0.299 -0.879 0.371 0.300 2.004 5.822 0.281 -0.944 -0.174 0.344 1.914 10.256 0.060 -0.998 0.005 0.250 2.103 5.470 0.171 -0.970 0.173 -0.931 4.465 12.307 0.392 0.798 0.457 -0.953 4.508 12.222 0.390 0.781 0.487 -0.953 4.508 12.469 0.429 0.859 0.280 -1.001 4.604 3.419 0.263 0.965 0.006 -1.078 4.759 3.152 0.344 0.913 0.220 -1.078 4.759 3.689 0.346 0.912 -0.220 -1.120 4.759 8.205 0.611 0.787 -0.086 -1.068 4.740 8.205 0.570 0.817 -0.087 -1.078 4.759 8.137 0.577 0.815 -0.061 -1.078 4.759 8.242 0.573 0.814 -0.098 -1.078 4.759 12.049 0.075 -0.034 0.997 -1.078 4.759 12.935 0.364 0.311 -0.878 1.423 0.000 3.419 0.606 0.796 0.000 1.518 0.000 3.203 0.772 0.628 0.099 1.393 0.250 3.137 -0.490 -0.810 0.324 1.518 0.000 3.634 0.773 0.626 -0.100 1.393 0.250 3.696 -0.494 -0.807 -0.322 1.518 0.000 7.583 0.340 0.740 0.581 1.393 0.250 7.602 -0.167 -0.860 0.483 1.518 0.000 8.472 0.259 0.630 -0.732 1.393 0.250 8.453 -0.112 -0.715 -0.690 1.391 0.250 12.307 -0.300 -0.832 0.467 1.518 0.000 12.040 -0.151 -0.261 0.953 1.393 0.250 12.305 -0.301 -0.831 0.467 1.518 0.000 12.939 -0.278 -0.470 -0.838 1.393 0.250 12.311 -0.302 -0.833 0.463 1.298 0.441 3.419 -0.405 -0.914 -0.007 1.287 0.463 8.205 -0.010 -0.986 -0.164 1.393 0.252 12.307 -0.301 -0.832 0.466 0.913 1.211 10.256 -0.377 0.926 -0.015 0.892 1.252 10.156 -0.450 0.891 0.056 0.892 1.252 10.352 -0.455 0.887 -0.083 0.861 1.315 1.367 0.179 0.968 -0.174 0.767 1.503 0.788 0.166 0.382 0.909 0.767 1.503 1.611 0.240 0.714 -0.657 0.782 1.473 5.470 -0.068 0.983 0.170 0.767 1.503 5.410 -0.096 0.973 0.211 0.767 1.503 5.590 -0.070 0.994 0.088 0.650 1.503 10.256 0.944 0.329 -0.038 0.767 1.503 10.020 0.916 0.319 0.244 0.767 1.503 10.482 0.909 0.325 -0.263 0.642 1.753 0.734 0.055 -0.257 0.965 0.642 1.753 1.627 -0.024 -0.539 -0.842 0.642 1.753 5.213 0.080 0.544 0.836 0.596 1.753 6.154 -0.015 0.369 -0.929 0.643 1.750 6.154 -0.175 0.450 -0.876 0.642 1.753 6.157 -0.178 0.441 -0.879 0.642 1.753 9.975 -0.349 -0.670 0.655 0.642 1.753 10.531 -0.375 -0.629 -0.681 0.495 2.004 1.367 0.089 -0.984 -0.152 0.516 2.004 1.304 0.067 -0.997 -0.046 0.516 2.004 1.401 0.076 -0.982 -0.174 0.516 2.004 5.211 -0.288 -0.705 0.648 0.636 1.764 6.154 -0.191 0.396 -0.898 0.516 2.004 6.032 -0.330 -0.763 -0.556 0.523 1.991 10.256 -0.416 -0.909 0.001 0.508 2.020 1.367 0.061 -0.986 -0.154 0.426 2.185 5.470 -0.282 -0.946 0.162 -0.842 4.508 12.307 0.265 0.838 0.477 -0.823 4.682 3.419 0.102 0.995 0.005 -0.861 4.759 3.253 0.131 0.988 0.077 -0.861 4.759 3.588 0.129 0.989 -0.073 -0.940 4.759 8.205 0.401 0.911 -0.093 -0.759 4.555 12.307 0.103 0.826 0.555 -0.861 4.759 12.049 0.100 0.455 0.885 -0.861 4.759 12.893 0.077 0.589 -0.804 1.735 0.000 3.237 -0.294 0.945 0.145 1.610 0.250 3.191 -0.836 -0.527 0.151 1.735 0.000 3.600 -0.303 0.942 -0.146 1.610 0.250 3.642 -0.833 -0.532 -0.155 1.735 0.000 7.777 -0.141 0.953 0.267 1.610 0.250 7.603 -0.667 -0.445 0.598 1.735 0.000 8.429 -0.346 0.787 -0.511 1.610 0.250 8.471 -0.293 0.016 -0.956 1.735 0.000 12.065 -0.457 -0.155 0.876 1.610 0.250 12.292 -0.554 -0.699 0.452 1.735 0.000 12.774 -0.706 -0.261 -0.658 1.610 0.250 12.337 -0.563 -0.710 0.423 1.529 0.413 3.419 -0.746 -0.666 -0.008 1.353 0.501 8.205 -0.184 -0.972 -0.145 1.485 0.501 8.034 -0.448 -0.894 -0.032 1.485 0.501 8.295 -0.436 -0.876 -0.204 1.606 0.259 12.307 -0.553 -0.702 0.448 1.462 0.546 8.205 -0.431 -0.891 -0.144 0.940 1.252 10.256 -0.438 0.899 -0.016 1.033 1.404 1.367 -0.101 0.979 -0.176 0.984 1.503 1.000 -0.166 0.754 0.636 0.984 1.503 1.548 -0.164 0.912 -0.375 0.808 1.503 5.470 -0.119 0.978 0.169 1.026 1.419 10.256 -0.438 0.899 -0.021 0.984 1.503 10.093 -0.496 0.860 0.121 0.984 1.503 10.409 -0.495 0.855 -0.154 0.859 1.753 0.740 -0.252 -0.062 0.966 0.859 1.753 1.637 -0.362 -0.081 -0.929 0.915 1.640 5.470 -0.365 0.910 0.196 0.859 1.753 5.294 -0.463 0.790 0.402 0.646 1.753 6.154 -0.187 0.444 -0.876 0.859 1.753 5.833 -0.593 0.780 -0.200 0.859 1.753 10.007 -0.906 -0.341 0.251 0.859 1.753 10.495 -0.908 -0.322 -0.267 0.733 2.004 1.080 -0.442 -0.778 0.446 0.733 2.004 1.523 -0.470 -0.839 -0.274 0.733 2.004 5.244 -0.812 -0.388 0.436 0.733 2.004 5.920 -0.854 -0.404 -0.328 0.763 1.945 10.256 -0.765 -0.644 -0.006 0.693 2.085 1.367 -0.460 -0.876 -0.146 0.641 2.189 5.470 -0.676 -0.724 0.137 -0.776 4.759 3.419 -0.020 1.000 0.004 -0.612 4.695 12.307 -0.110 0.817 0.567 -0.644 4.759 12.194 -0.086 0.790 0.607 -0.644 4.759 12.513 -0.148 0.951 0.271 1.814 0.000 3.419 -0.435 0.901 0.000 1.728 0.250 3.419 -0.940 -0.340 -0.006 1.881 0.000 8.205 -0.238 0.963 -0.127 1.894 0.116 8.205 -0.563 0.813 -0.147 1.827 0.250 7.941 -0.987 0.143 0.072 1.827 0.250 8.352 -0.940 0.150 -0.305 1.902 0.000 12.307 -0.755 0.021 0.655 1.625 0.250 12.307 -0.565 -0.692 0.449 1.680 0.501 8.205 -0.774 -0.621 -0.122 1.709 0.487 8.205 -0.816 -0.565 -0.122 1.102 1.503 1.367 -0.344 0.923 -0.171 1.054 1.503 10.256 -0.621 0.784 -0.023 1.137 1.630 1.367 -0.733 0.657 -0.177 1.076 1.753 1.083 -0.821 0.250 0.513 1.076 1.753 1.519 -0.887 0.316 -0.337 0.958 1.753 5.470 -0.643 0.737 0.207 0.990 1.753 10.256 -0.993 -0.114 -0.018 0.950 2.004 1.293 -0.836 -0.549 -0.014 0.950 2.004 1.408 -0.828 -0.544 -0.136 0.901 2.004 5.470 -0.980 -0.107 0.166 0.938 2.028 1.367 -0.817 -0.564 -0.117 -0.586 4.759 12.307 -0.174 0.801 0.572 1.902 0.250 8.205 -0.959 0.230 -0.165 1.154 1.753 1.367 -0.933 0.314 -0.178 0.976 2.004 1.367 -0.846 -0.520 -0.118 0.858 3.006 12.307 0.706 0.435 0.559 0.895 2.982 12.307 0.684 0.472 0.556 0.883 3.006 12.267 0.684 0.450 0.574 0.883 3.006 12.382 0.732 0.481 0.483 0.680 3.256 12.307 0.681 -0.229 0.695 0.758 3.256 12.155 0.559 -0.199 0.805 0.758 3.256 12.592 0.951 -0.290 0.103 0.696 3.379 12.307 0.536 -0.481 0.694 -0.068 4.759 5.470 0.959 -0.229 0.165 0.125 4.523 5.470 0.749 0.656 0.092 0.007 4.759 5.323 0.941 -0.149 0.305 0.007 4.759 5.734 0.987 -0.143 -0.072 2.436 0.000 1.367 0.922 -0.347 -0.170 2.420 0.250 1.367 0.210 -0.970 -0.121 2.603 0.000 0.901 0.498 0.028 0.866 2.478 0.250 1.162 0.150 -0.966 0.211 2.603 0.000 1.609 0.817 0.232 -0.528 2.478 0.250 1.480 0.107 -0.979 -0.174 2.457 0.000 5.470 0.212 -0.969 0.124 2.536 0.133 5.470 -0.035 -0.991 0.130 2.603 0.000 5.245 -0.116 -0.954 0.277 2.603 0.000 5.897 -0.017 -0.977 -0.212 2.525 0.000 10.256 0.385 -0.923 0.000 2.550 0.106 10.256 0.268 -0.963 -0.002 2.603 0.000 10.074 0.172 -0.977 0.127 2.603 0.000 10.438 0.165 -0.978 -0.126 2.446 0.314 1.367 0.113 -0.987 -0.117 0.932 3.006 8.205 0.980 0.107 -0.166 1.193 2.820 8.205 0.675 0.724 -0.138 1.100 3.006 7.755 0.854 0.404 0.328 1.100 3.006 8.430 0.812 0.389 -0.436 1.141 2.924 12.307 0.361 0.688 0.630 1.100 3.006 12.152 0.329 0.588 0.739 1.100 3.006 12.595 0.492 0.867 0.077 0.844 3.256 3.419 0.993 0.114 0.018 1.071 3.065 3.419 0.765 0.643 0.006 0.975 3.256 3.180 0.908 0.322 0.267 0.975 3.256 3.667 0.906 0.341 -0.250 0.876 3.256 8.205 0.643 -0.737 -0.208 0.975 3.256 7.842 0.592 -0.780 0.200 0.975 3.256 8.381 0.462 -0.791 -0.402 0.975 3.256 12.037 0.145 0.033 0.989 0.975 3.256 12.935 0.268 0.066 -0.961 0.780 3.507 3.419 0.621 -0.784 0.023 0.850 3.507 3.266 0.495 -0.855 0.154 0.850 3.507 3.581 0.496 -0.860 -0.120 0.918 3.369 8.205 0.365 -0.910 -0.196 0.731 3.507 12.307 0.262 -0.704 0.660 0.850 3.507 12.127 0.104 -0.581 0.807 0.850 3.507 12.674 0.208 -0.945 -0.253 0.808 3.590 3.419 0.438 -0.899 0.021 0.800 3.606 12.307 0.076 -0.741 0.667 0.153 4.508 5.470 0.708 0.700 0.089 0.371 4.463 5.470 0.456 0.885 0.094 0.349 4.508 5.380 0.463 0.877 0.126 0.349 4.508 5.640 0.467 0.884 0.021 0.209 4.759 1.367 0.630 0.771 -0.091 0.228 4.751 1.367 0.617 0.782 -0.091 0.223 4.759 1.337 0.620 0.782 -0.062 0.223 4.759 1.383 0.618 0.780 -0.095 0.223 4.759 5.204 0.294 -0.015 0.956 0.223 4.759 6.072 0.667 0.445 -0.598 0.105 4.759 10.256 0.940 0.340 0.006 0.305 4.597 10.256 0.728 0.686 0.007 0.223 4.759 10.033 0.832 0.532 0.155 0.223 4.759 10.484 0.836 0.528 -0.151 2.820 0.000 0.736 0.213 0.358 0.909 2.695 0.250 0.783 -0.071 -0.540 0.839 2.820 0.000 1.635 0.408 0.706 -0.578 2.695 0.250 1.626 -0.176 -0.804 -0.568 2.701 0.238 5.470 -0.282 -0.954 0.103 2.820 0.000 5.203 -0.274 -0.650 0.709 2.820 0.000 6.091 -0.379 -0.784 -0.492 2.609 0.250 10.256 0.020 -1.000 -0.004 2.820 0.000 10.041 -0.211 0.960 0.186 2.695 0.250 10.087 -0.130 -0.989 0.073 2.820 0.000 10.472 -0.220 0.957 -0.187 2.695 0.250 10.422 -0.131 -0.988 -0.078 2.593 0.454 1.367 -0.018 -0.987 -0.157 2.656 0.327 10.256 -0.131 -0.991 -0.005 1.407 2.825 8.205 0.282 0.946 -0.162 1.317 3.006 7.643 0.330 0.763 0.555 1.317 3.006 8.464 0.287 0.705 -0.648 1.325 2.989 12.307 -0.047 0.754 0.655 1.317 3.006 12.274 -0.057 0.738 0.672 1.317 3.006 12.370 -0.054 0.803 0.594 1.311 3.018 3.419 0.416 0.909 -0.001 1.192 3.256 3.143 0.375 0.629 0.681 1.192 3.256 3.700 0.349 0.670 -0.655 1.188 3.256 7.521 0.187 -0.445 0.876 1.197 3.245 7.521 0.192 -0.395 0.898 1.192 3.256 7.517 0.179 -0.442 0.879 1.192 3.256 8.461 -0.081 -0.543 -0.835 1.192 3.256 12.048 0.010 0.232 0.973 1.192 3.256 12.941 -0.058 0.271 -0.961 1.067 3.507 3.193 -0.909 -0.325 0.262 1.067 3.507 3.654 -0.916 -0.319 -0.244 1.190 3.259 7.521 0.175 -0.451 0.875 1.026 3.507 8.205 0.119 -0.978 -0.169 1.067 3.507 8.085 0.070 -0.994 -0.088 1.067 3.507 8.264 0.095 -0.973 -0.211 1.067 3.507 12.064 -0.122 -0.362 0.924 1.067 3.507 12.887 -0.186 -0.428 -0.885 0.894 3.757 3.419 0.438 -0.899 0.016 0.941 3.757 3.323 0.455 -0.886 0.083 0.941 3.757 3.519 0.451 -0.891 -0.056 1.052 3.536 8.205 0.068 -0.983 -0.170 0.973 3.694 12.307 -0.135 -0.734 0.665 0.920 3.799 3.419 0.378 -0.926 0.015 0.481 4.508 5.470 0.298 0.950 0.096 0.441 4.758 1.367 0.339 0.936 -0.094 0.440 4.759 1.363 0.339 0.936 -0.089 0.440 4.759 1.370 0.339 0.936 -0.094 0.547 4.546 5.470 0.154 0.981 0.121 0.440 4.759 5.222 0.111 0.715 0.690 0.440 4.759 6.072 0.167 0.860 -0.483 0.536 4.569 10.256 0.423 0.906 0.006 0.440 4.759 9.978 0.494 0.807 0.322 0.440 4.759 10.538 0.489 0.810 -0.324 3.037 0.000 0.895 -0.070 0.609 0.790 2.912 0.250 0.741 -0.345 -0.295 0.891 3.037 0.000 1.612 -0.420 0.601 -0.680 2.912 0.250 1.626 -0.197 0.090 -0.976 2.773 0.250 5.470 -0.401 -0.911 0.093 3.037 0.000 5.211 -0.730 -0.288 0.620 2.912 0.250 5.432 -0.573 -0.814 0.098 3.037 0.000 5.971 -0.825 -0.393 -0.407 2.912 0.250 5.538 -0.577 -0.815 0.061 2.915 0.000 10.256 0.361 0.932 0.000 2.978 0.117 10.256 0.615 0.788 -0.001 2.912 0.250 9.986 -0.346 -0.912 0.220 2.912 0.250 10.523 -0.344 -0.913 -0.220 2.675 0.501 1.367 -0.190 -0.971 -0.148 2.786 0.501 1.206 -0.409 -0.901 0.146 2.786 0.501 1.452 -0.398 -0.893 -0.211 2.902 0.270 5.470 -0.570 -0.817 0.087 2.834 0.405 10.256 -0.267 -0.964 -0.006 2.765 0.544 1.367 -0.399 -0.904 -0.151 1.584 2.906 8.205 -0.171 0.970 -0.174 1.534 3.006 7.853 -0.281 0.944 0.173 1.534 3.006 8.386 -0.300 0.879 -0.371 1.339 3.006 12.307 -0.069 0.756 0.651 1.489 3.095 3.419 -0.060 0.998 -0.005 1.409 3.256 3.155 -0.627 -0.233 0.744 1.409 3.256 3.684 -0.640 -0.185 -0.746 1.239 3.256 7.521 0.010 -0.367 0.930 1.409 3.256 7.545 -0.581 -0.004 0.814 1.409 3.256 8.462 -0.336 -0.018 -0.942 1.463 3.148 12.307 -0.255 0.675 0.692 1.409 3.256 12.129 -0.265 0.501 0.824 1.409 3.256 12.639 -0.546 0.829 -0.124 1.183 3.507 3.419 -0.944 -0.328 0.038 1.333 3.407 3.419 0.701 -0.709 0.080 1.283 3.507 7.860 -0.472 -0.869 0.148 1.283 3.507 8.381 -0.418 -0.839 -0.348 1.283 3.507 12.070 -0.407 -0.190 0.893 1.283 3.507 12.773 -0.664 -0.243 -0.707 1.236 3.601 3.419 0.986 0.166 0.025 1.158 3.757 3.143 0.750 -0.105 0.653 1.158 3.757 3.700 0.738 -0.120 -0.664 1.235 3.604 8.205 -0.402 -0.901 -0.163 1.169 3.736 12.307 -0.473 -0.648 0.597 1.089 3.895 3.419 0.044 -0.999 0.011 0.442 4.759 1.367 0.337 0.937 -0.094 0.702 4.669 5.470 -0.032 0.992 0.118 0.657 4.759 5.312 0.014 0.978 0.208 0.657 4.759 5.753 -0.070 0.995 -0.069 0.723 4.627 10.256 0.240 0.971 0.003 0.657 4.759 10.002 0.337 0.925 0.173 0.657 4.759 10.512 0.332 0.927 -0.172 3.225 0.000 1.367 -0.188 0.976 -0.105 3.231 0.046 1.367 -0.282 0.953 -0.111 3.128 0.250 1.034 -0.762 0.004 0.648 3.128 0.250 1.556 -0.915 0.001 -0.404 3.254 0.000 5.470 -0.991 0.053 0.125 2.954 0.250 5.470 -0.611 -0.787 0.086 3.130 0.000 10.256 0.614 0.789 0.000 3.254 0.000 9.949 0.754 0.582 0.303 3.128 0.250 9.962 -0.591 -0.743 0.315 3.254 0.000 10.563 0.753 0.584 -0.302 3.128 0.250 10.549 -0.586 -0.748 -0.313 3.003 0.501 1.360 -0.766 -0.634 -0.106 3.003 0.501 1.372 -0.765 -0.634 -0.117 3.028 0.452 10.256 -0.526 -0.851 -0.004 3.002 0.503 1.367 -0.764 -0.635 -0.116 1.645 3.006 8.205 -0.409 0.897 -0.167 1.659 3.188 3.419 -0.244 0.970 -0.003 1.626 3.256 3.268 -0.323 0.940 0.114 1.626 3.256 3.569 -0.319 0.941 -0.116 1.683 3.141 8.205 -0.686 0.705 -0.179 1.626 3.256 7.922 -0.895 0.436 0.096 1.626 3.256 8.357 -0.806 0.472 -0.357 1.506 3.256 12.307 -0.431 0.565 0.704 1.361 3.507 3.419 0.955 0.296 0.014 1.500 3.507 3.123 0.788 0.388 0.478 1.500 3.507 3.716 0.782 0.402 -0.476 1.500 3.507 8.030 -0.852 -0.524 -0.024 1.500 3.507 8.301 -0.835 -0.518 -0.188 1.474 3.507 12.307 -0.737 0.046 0.674 1.375 3.757 3.119 -0.635 -0.661 0.400 1.375 3.757 3.721 -0.642 -0.657 -0.395 1.469 3.568 8.205 -0.797 -0.589 -0.130 1.286 3.934 3.419 -0.515 -0.857 0.003 0.747 4.759 5.470 -0.166 0.979 0.119 0.892 4.724 10.256 0.058 0.998 0.001 0.874 4.759 10.171 0.068 0.997 0.031 0.874 4.759 10.341 0.067 0.997 -0.031 3.237 0.250 1.367 -0.977 0.140 -0.163 3.471 0.000 10.181 -0.513 0.858 0.038 3.345 0.250 10.099 -0.878 -0.472 0.080 3.471 0.000 10.331 -0.512 0.858 -0.038 3.345 0.250 10.413 -0.877 -0.474 -0.080 3.006 0.501 1.367 -0.767 -0.631 -0.116 3.291 0.359 10.256 -0.835 -0.551 -0.001 1.695 3.256 3.419 -0.401 0.916 -0.001 1.704 3.256 8.205 -0.876 0.444 -0.187 1.741 3.460 3.419 -0.772 0.636 0.002 1.717 3.507 3.337 -0.807 0.589 0.051 1.717 3.507 3.500 -0.806 0.590 -0.047 1.562 3.507 8.205 -0.887 -0.441 -0.134 1.592 3.757 3.272 -0.945 -0.315 0.090 1.592 3.757 3.567 -0.945 -0.315 -0.086 1.544 3.853 3.419 -0.882 -0.471 0.002 0.912 4.759 10.256 0.015 1.000 0.000 3.501 0.000 10.256 -0.529 0.849 0.000 3.419 0.250 10.256 -0.921 -0.390 0.000 1.751 3.507 3.419 -0.823 0.569 0.002 1.662 3.757 3.419 -0.970 -0.245 0.003 3.187 1.252 3.419 0.969 0.246 -0.010 3.333 1.143 3.419 0.891 0.454 -0.006 3.278 1.252 3.241 0.947 0.311 0.081 3.278 1.252 3.590 0.948 0.304 -0.091 3.080 1.503 3.419 0.927 -0.375 -0.015 3.153 1.503 3.252 0.923 -0.376 0.079 3.153 1.503 3.577 0.921 -0.377 -0.098 3.008 1.503 8.205 0.988 0.045 -0.151 3.253 1.302 8.205 0.776 0.618 -0.122 3.153 1.503 7.781 0.951 0.207 0.232 3.153 1.503 8.417 0.918 0.213 -0.336 3.102 1.604 3.419 0.824 -0.566 -0.016 2.963 1.753 8.205 0.779 -0.612 -0.135 3.028 1.753 7.971 0.776 -0.631 0.019 3.028 1.753 8.328 0.772 -0.602 -0.204 2.993 1.823 8.205 0.683 -0.718 -0.137 2.262 3.006 1.367 0.987 0.079 -0.143 2.491 2.826 1.367 0.781 0.613 -0.124 2.402 3.006 0.961 0.752 0.184 0.632 2.402 3.006 1.577 0.921 0.237 -0.309 2.208 3.256 1.367 0.813 -0.566 -0.137 2.276 3.256 1.121 0.777 -0.552 0.304 2.276 3.256 1.497 0.802 -0.558 -0.211 2.179 3.256 10.256 0.998 0.069 -0.001 2.359 3.090 10.256 0.899 0.439 -0.004 2.276 3.256 10.057 0.985 0.133 0.106 2.276 3.256 10.454 0.985 0.138 -0.107 2.236 3.337 1.367 0.715 -0.685 -0.139 2.123 3.507 10.256 0.854 -0.521 0.002 2.151 3.507 10.188 0.852 -0.523 0.030 2.151 3.507 10.325 0.852 -0.523 -0.027 2.133 3.542 10.256 0.822 -0.570 0.002 3.580 1.083 3.419 0.397 0.918 -0.003 3.495 1.252 3.127 0.204 0.821 0.533 3.495 1.252 3.705 0.218 0.806 -0.551 3.370 1.503 3.166 -0.927 -0.233 0.293 3.370 1.503 3.662 -0.918 -0.246 -0.309 3.476 1.290 8.205 0.139 0.977 -0.162 3.370 1.503 7.613 0.323 0.700 0.637 3.370 1.503 8.454 -0.298 0.680 -0.670 3.288 1.503 12.307 0.756 0.345 0.556 3.405 1.433 12.307 0.691 0.474 0.546 3.370 1.503 12.194 0.696 0.395 0.599 3.370 1.503 12.528 0.838 0.490 0.239 3.147 1.753 3.419 0.656 -0.755 -0.016 3.245 1.753 3.227 0.745 -0.655 0.128 3.245 1.753 3.602 0.751 -0.644 -0.144 3.245 1.753 7.586 0.344 -0.608 0.716 3.245 1.753 8.473 -0.294 -0.582 -0.758 3.137 1.753 12.307 0.738 -0.246 0.629 3.245 1.753 12.119 0.680 -0.189 0.708 3.245 1.753 12.691 0.931 -0.247 -0.269 3.202 1.839 3.419 0.573 -0.819 -0.014 3.129 1.984 8.205 0.255 -0.956 -0.144 3.167 1.908 12.307 0.596 -0.507 0.623 2.712 2.819 1.367 0.109 0.980 -0.168 2.618 3.006 0.796 0.165 0.367 0.915 2.618 3.006 1.628 -0.154 0.713 -0.684 2.556 3.006 5.470 0.878 0.464 0.117 2.644 2.955 5.470 0.813 0.570 0.116 2.618 3.006 5.383 0.841 0.519 0.153 2.618 3.006 5.634 0.850 0.526 0.031 2.493 3.256 0.723 0.215 -0.242 0.946 2.493 3.256 1.623 -0.474 -0.524 -0.708 2.383 3.256 5.470 0.962 -0.234 0.139 2.493 3.256 5.277 0.946 -0.175 0.272 2.493 3.256 5.830 0.970 -0.189 -0.151 2.614 3.014 10.256 0.421 0.907 -0.003 2.493 3.256 9.973 -0.477 0.676 0.562 2.493 3.256 10.539 -0.445 0.695 -0.564 2.348 3.507 1.367 0.362 -0.921 -0.143 2.368 3.507 1.309 0.356 -0.933 -0.049 2.368 3.507 1.399 0.366 -0.917 -0.161 2.403 3.437 5.470 0.764 -0.631 0.132 2.368 3.507 9.983 -0.274 -0.733 0.623 2.368 3.507 10.531 -0.261 -0.735 -0.626 2.360 3.522 1.367 0.346 -0.927 -0.144 2.220 3.757 10.256 0.641 -0.768 0.002 2.243 3.757 10.207 0.659 -0.752 0.025 2.243 3.757 10.306 0.659 -0.752 -0.020 2.232 3.778 10.256 0.632 -0.775 0.002 surface_Al2O3_4 364 405 3 1 2 3 3 1 2 4 6 1 3 6 5 8 7 6 1 4 6 5 9 7 3 10 11 12 3 10 11 13 5 5 8 16 15 14 5 5 9 18 17 14 5 10 12 20 21 19 5 10 13 22 23 19 4 24 26 27 25 4 24 28 29 25 4 30 15 16 31 4 30 17 18 31 4 32 20 21 33 4 32 22 23 33 4 26 34 35 27 4 28 36 37 29 4 38 34 35 39 4 38 36 37 39 3 40 41 42 3 40 41 43 5 40 42 45 46 44 5 40 43 47 48 44 4 49 51 52 50 4 49 53 54 50 3 55 56 57 3 55 56 58 4 59 45 46 60 4 59 47 48 60 4 51 61 62 52 4 53 63 64 54 6 55 57 66 65 68 67 6 55 58 66 65 69 67 4 70 61 62 71 4 70 63 64 71 5 65 68 74 73 72 5 65 69 76 75 72 4 77 73 74 78 4 77 75 76 78 3 79 7 8 3 79 7 9 4 79 8 16 80 4 79 9 18 80 3 81 19 21 3 81 19 23 3 82 25 27 3 82 25 29 3 80 31 16 3 80 31 18 3 81 33 21 3 81 33 23 5 82 27 35 84 83 5 82 29 37 85 83 4 39 35 84 86 4 39 37 85 86 3 87 44 46 3 87 44 48 3 88 50 52 3 88 50 54 3 87 60 46 3 87 60 48 5 88 52 62 90 89 5 88 54 64 91 89 3 92 67 68 3 92 67 69 4 71 62 90 93 4 71 64 91 93 4 92 68 74 94 4 92 69 76 94 3 94 78 74 3 94 78 76 3 95 83 84 3 95 83 85 3 95 86 84 3 95 86 85 3 96 89 90 3 96 89 91 3 96 93 90 3 96 93 91 3 97 98 99 3 97 98 100 3 101 102 103 3 101 102 104 4 101 103 106 105 4 101 104 107 105 3 105 108 106 3 105 108 107 3 109 110 111 3 109 110 112 6 113 99 98 114 116 115 6 113 100 98 114 117 115 3 118 119 120 3 118 119 121 3 122 123 124 3 122 123 125 3 114 126 116 3 114 126 117 4 102 103 128 127 4 102 104 129 127 3 130 131 132 3 130 131 133 5 134 106 103 128 135 5 134 107 104 129 135 3 130 136 132 3 130 136 133 3 137 138 139 3 137 138 140 6 134 106 108 141 143 142 6 134 107 108 141 144 142 3 137 145 139 3 137 145 140 3 141 146 143 3 141 146 144 4 110 111 148 147 4 110 112 149 147 3 150 151 152 3 150 151 153 4 115 116 155 154 4 115 117 156 154 5 157 159 158 120 119 5 157 161 160 121 119 4 123 124 163 162 4 123 125 164 162 4 126 116 155 165 4 126 117 156 165 3 157 166 159 3 157 166 161 3 167 127 128 3 167 127 129 4 131 132 169 168 4 131 133 170 168 6 167 128 135 171 173 172 6 167 129 135 171 174 172 5 175 176 169 132 136 5 175 177 170 133 136 4 138 139 179 178 4 138 140 180 178 5 171 173 181 143 142 5 171 174 182 144 142 3 175 183 176 3 175 183 177 5 184 185 179 139 145 5 184 186 180 140 145 4 146 143 181 187 4 146 144 182 187 3 184 188 185 3 184 188 186 3 189 147 148 3 189 147 149 4 151 152 191 190 4 151 153 192 190 4 154 155 194 193 4 154 156 195 193 4 158 159 197 196 4 160 161 199 198 4 162 163 201 200 4 162 164 202 200 4 165 155 194 203 4 165 156 195 203 4 166 159 197 204 4 166 161 199 204 3 205 168 169 3 205 168 170 3 206 172 173 3 206 172 174 5 205 169 176 208 207 5 205 170 177 209 207 3 210 178 179 3 210 178 180 5 206 173 181 212 211 5 206 174 182 213 211 4 183 176 208 214 4 183 177 209 214 5 210 179 185 216 215 5 210 180 186 217 215 4 187 181 212 218 4 187 182 213 218 4 188 185 216 219 4 188 186 217 219 3 220 190 191 3 220 190 192 3 221 193 194 3 221 193 195 4 222 196 197 223 4 222 198 199 223 3 224 200 201 3 224 200 202 3 221 203 194 3 221 203 195 3 223 204 197 3 223 204 199 3 225 207 208 3 225 207 209 3 226 211 212 3 226 211 213 3 225 214 208 3 225 214 209 3 227 215 216 3 227 215 217 3 226 218 212 3 226 218 213 3 227 219 216 3 227 219 217 3 228 229 230 3 228 229 231 3 232 233 234 3 232 233 235 3 236 237 238 3 236 237 239 3 240 241 242 3 240 241 243 3 236 244 238 3 236 244 239 3 245 246 247 3 245 246 248 3 240 249 242 3 240 249 243 3 245 250 247 3 245 250 248 3 251 252 253 3 251 252 254 3 255 256 257 3 255 256 258 5 259 261 260 230 229 5 259 263 262 231 229 4 233 234 265 264 4 233 235 266 264 3 259 267 261 3 259 267 263 4 237 238 269 268 4 237 239 270 268 4 241 242 272 271 4 241 243 273 271 5 274 275 269 238 244 5 274 276 270 239 244 4 246 247 278 277 4 246 248 279 277 5 280 281 272 242 249 5 280 282 273 243 249 3 274 283 275 3 274 283 276 5 284 285 278 247 250 5 284 286 279 248 250 3 280 287 281 3 280 287 282 3 284 288 285 3 284 288 286 4 252 253 290 289 4 252 254 291 289 4 256 257 293 292 4 256 258 294 292 4 260 261 296 295 4 262 263 298 297 4 264 265 300 299 4 264 266 301 299 3 302 303 304 3 302 303 305 4 267 261 296 306 4 267 263 298 306 3 302 307 304 3 302 307 305 3 308 268 269 3 308 268 270 4 271 272 310 309 4 271 273 311 309 5 308 269 275 313 312 5 308 270 276 314 312 3 315 277 278 3 315 277 279 5 316 281 272 310 317 5 316 282 273 311 317 4 283 275 313 318 4 283 276 314 318 5 315 278 285 320 319 5 315 279 286 321 319 6 316 281 287 322 324 323 6 316 282 287 322 325 323 4 288 285 320 326 4 288 286 321 326 3 322 327 324 3 322 327 325 3 328 289 290 3 328 289 291 4 292 293 330 329 4 292 294 331 329 4 332 295 296 333 4 332 297 298 333 3 334 299 300 3 334 299 301 5 335 336 337 304 303 5 335 338 339 305 303 3 333 306 296 3 333 306 298 4 307 304 337 340 4 307 305 339 340 3 341 309 310 3 341 309 311 3 342 312 313 3 342 312 314 6 341 310 317 343 345 344 6 341 311 317 343 346 344 3 342 318 313 3 342 318 314 3 347 319 320 3 347 319 321 5 343 345 348 324 323 5 343 346 349 325 323 3 347 326 320 3 347 326 321 4 327 324 348 350 4 327 325 349 350 3 351 329 330 3 351 329 331 4 352 336 337 353 4 352 338 339 353 3 353 340 337 3 353 340 339 3 354 344 345 3 354 344 346 4 354 345 348 355 4 354 346 349 355 3 355 350 348 3 355 350 349 3 356 357 358 3 356 357 359 3 356 360 358 3 356 360 359 3 361 362 363 3 361 362 364 3 361 365 363 3 361 365 364 3 366 367 368 3 366 367 369 4 366 368 371 370 4 366 369 372 370 4 357 358 374 373 4 357 359 375 373 3 370 376 371 3 370 376 372 5 377 378 374 358 360 5 377 379 375 359 360 3 380 381 382 3 380 381 383 3 377 384 378 3 377 384 379 3 380 385 382 3 380 385 383 4 362 363 387 386 4 362 364 388 386 5 389 390 387 363 365 5 389 391 388 364 365 3 392 393 394 3 392 393 395 3 396 397 398 3 396 397 399 3 389 400 390 3 389 400 391 3 392 401 394 3 392 401 395 4 396 398 403 402 4 396 399 404 402 3 402 405 403 3 402 405 404 -0.544 1.252 3.419 -0.887 0.461 -0.005 -0.603 1.206 3.419 -0.896 0.443 -0.008 -0.626 1.252 3.324 -0.970 -0.153 0.188 -0.626 1.252 3.513 -0.967 -0.157 -0.201 -0.568 1.503 3.419 0.916 0.400 -0.005 -0.651 1.302 3.419 0.914 -0.406 -0.016 -0.495 1.424 3.419 -0.189 0.982 -0.006 -0.535 1.503 3.344 0.508 0.850 0.140 -0.535 1.503 3.493 0.509 0.847 -0.153 -0.719 1.503 8.205 -0.492 0.840 -0.228 -0.738 1.476 8.205 -0.423 0.875 -0.236 -0.751 1.503 8.118 -0.474 0.866 -0.160 -0.751 1.503 8.249 -0.461 0.840 -0.285 -0.865 1.730 3.419 0.927 0.375 -0.011 -0.877 1.753 3.373 0.812 0.581 0.055 -0.660 1.753 3.328 0.681 -0.718 0.143 -0.877 1.753 3.463 0.813 0.577 -0.084 -0.660 1.753 3.509 0.687 -0.712 -0.144 -0.656 1.745 8.205 -0.968 0.199 -0.153 -0.877 1.753 7.959 0.786 -0.618 -0.022 -0.660 1.753 8.189 -0.973 0.181 -0.144 -0.877 1.753 8.302 0.768 -0.219 -0.602 -0.660 1.753 8.214 -0.971 0.180 -0.158 -0.764 1.529 12.307 0.280 0.536 0.797 -0.612 1.657 12.307 0.077 0.484 0.872 -0.877 1.753 12.212 0.171 0.047 0.984 -0.660 1.753 12.218 0.270 0.286 0.920 -0.877 1.753 12.567 0.692 0.144 0.707 -0.660 1.753 12.534 0.270 0.667 0.695 -0.891 1.782 3.419 0.937 0.348 -0.018 -0.698 1.831 3.419 0.216 -0.976 0.001 -0.966 1.932 8.205 -0.014 -0.952 -0.306 -0.669 1.771 8.205 -0.980 0.128 -0.154 -1.002 2.004 12.281 -0.048 -0.568 0.822 -0.785 2.004 12.211 0.089 -0.391 0.916 -1.002 2.004 12.359 -0.037 -0.634 0.773 -0.785 2.004 12.518 0.008 -0.776 0.630 -1.009 2.018 12.307 -0.044 -0.592 0.805 -0.819 2.073 12.307 0.035 -0.539 0.842 -1.485 3.006 1.367 -0.565 0.798 -0.209 -1.496 2.991 1.367 -0.542 0.813 -0.212 -1.503 3.006 1.316 -0.569 0.816 -0.103 -1.503 3.006 1.393 -0.567 0.790 -0.232 -1.410 3.254 1.367 -0.948 0.269 -0.169 -1.628 3.256 1.107 0.438 -0.162 0.884 -1.411 3.256 1.362 -0.951 0.265 -0.161 -1.628 3.256 1.463 0.781 -0.102 -0.616 -1.411 3.256 1.370 -0.949 0.265 -0.170 -1.539 3.078 5.470 0.438 0.856 0.275 -1.367 3.167 5.470 0.050 0.943 0.329 -1.628 3.256 5.372 0.758 0.223 0.613 -1.411 3.256 5.367 0.362 0.722 0.589 -1.628 3.256 5.715 0.961 0.277 0.009 -1.411 3.256 5.708 0.131 0.991 0.002 -1.501 3.256 10.256 -0.723 0.690 0.026 -1.613 3.227 10.256 0.955 -0.295 0.016 -1.628 3.256 10.211 0.866 -0.495 0.072 -1.628 3.256 10.301 0.869 -0.492 -0.047 -1.741 3.481 1.367 -0.132 -0.953 -0.271 -1.415 3.263 1.367 -0.955 0.244 -0.169 -1.753 3.507 5.425 -0.389 -0.872 0.296 -1.536 3.507 5.392 0.357 -0.793 0.494 -1.753 3.507 5.557 -0.325 -0.930 0.171 -1.536 3.507 5.656 0.201 -0.972 0.123 -1.550 3.507 10.256 0.982 0.188 0.013 -1.640 3.280 10.256 0.933 -0.359 0.010 -1.478 3.389 10.256 0.102 0.994 0.032 -1.536 3.507 10.227 0.976 0.213 0.038 -1.536 3.507 10.286 0.977 0.212 -0.009 -1.767 3.533 5.470 -0.333 -0.910 0.246 -1.570 3.573 5.470 0.180 -0.925 0.335 -1.854 3.708 10.256 0.988 0.152 0.006 -1.879 3.757 10.162 0.914 0.250 0.320 -1.662 3.757 10.156 -0.154 -0.971 0.185 -1.879 3.757 10.351 0.922 0.244 -0.301 -1.662 3.757 10.358 -0.150 -0.975 -0.162 -1.902 3.803 10.256 0.759 -0.651 0.012 -1.691 3.816 10.256 -0.265 -0.964 0.008 -0.462 1.503 3.419 -0.162 0.987 -0.006 -0.470 1.753 3.419 -0.956 -0.295 0.002 -0.655 1.753 8.205 -0.971 0.182 -0.153 -0.532 1.753 12.307 -0.095 0.463 0.881 -0.532 1.931 12.307 -0.556 -0.012 0.831 -0.568 2.004 12.279 -0.576 -0.211 0.790 -0.568 2.004 12.362 -0.638 -0.231 0.734 -0.580 2.028 12.307 -0.585 -0.257 0.769 -1.410 3.256 1.367 -0.949 0.265 -0.169 -1.284 3.256 5.470 -0.284 0.906 0.314 -1.288 3.444 5.470 -0.958 -0.002 0.287 -1.319 3.507 5.443 -0.909 -0.306 0.283 -1.319 3.507 5.524 -0.929 -0.308 0.206 -1.468 3.507 10.256 0.815 0.579 0.029 -1.332 3.532 5.470 -0.895 -0.374 0.245 -1.509 3.757 10.256 -0.846 -0.533 0.011 -0.549 2.004 12.307 -0.602 -0.197 0.774 -1.301 3.507 5.470 -0.928 -0.274 0.251 0.988 0.000 3.419 -0.254 -0.967 -0.001 1.027 0.115 3.419 -0.479 -0.878 -0.001 1.085 0.000 3.306 -0.987 0.032 0.157 1.085 0.000 3.532 -0.987 0.032 -0.158 0.321 1.252 10.256 0.894 0.448 -0.003 0.493 1.183 10.256 0.612 0.791 -0.004 0.458 1.252 10.138 0.685 0.719 0.120 0.458 1.252 10.373 0.683 0.719 -0.129 0.234 1.503 10.256 -0.068 -0.998 -0.007 0.333 1.503 10.148 -0.920 -0.373 0.121 0.333 1.503 10.363 -0.921 -0.369 -0.128 0.255 1.659 10.256 -0.118 -0.993 -0.001 -1.428 4.759 3.419 0.816 0.578 0.000 -1.259 4.688 3.419 0.578 0.816 0.002 -1.295 4.759 3.316 0.617 0.782 0.088 -1.295 4.759 3.522 0.619 0.781 -0.086 1.130 0.000 3.419 -0.234 0.972 -0.001 1.122 0.250 3.419 -0.270 -0.963 -0.001 1.188 0.227 3.419 -0.306 -0.952 -0.003 1.176 0.250 3.371 -0.341 -0.940 0.022 1.176 0.250 3.466 -0.341 -0.940 -0.025 1.224 0.000 8.205 0.960 0.087 -0.267 1.213 0.177 8.205 0.200 -0.957 -0.211 1.301 0.000 8.027 0.920 0.388 -0.057 1.301 0.000 8.297 0.822 0.428 -0.375 1.245 0.000 12.307 -0.049 -0.762 0.646 1.278 0.046 12.307 -0.112 -0.757 0.644 1.301 0.000 12.234 -0.126 -0.722 0.680 1.301 0.000 12.449 -0.127 -0.874 0.469 1.164 0.275 3.419 -0.328 -0.945 -0.002 0.696 1.211 10.256 -0.887 0.461 -0.024 0.675 1.252 10.171 -0.985 -0.072 0.154 0.675 1.252 10.340 -0.979 -0.073 -0.188 0.498 1.503 1.367 0.924 0.278 -0.263 0.581 1.440 1.367 0.784 0.569 -0.249 0.550 1.503 1.241 0.902 0.415 0.120 0.550 1.503 1.432 0.840 0.408 -0.358 0.384 1.503 10.256 -0.941 -0.337 -0.007 0.652 1.300 10.256 -0.990 -0.138 -0.021 0.442 1.720 1.367 0.558 -0.788 -0.259 0.273 1.753 5.470 0.833 -0.431 0.346 0.535 1.533 5.470 0.455 0.854 0.252 0.425 1.753 5.377 0.475 0.023 0.880 0.425 1.753 5.708 0.998 0.026 0.061 0.318 1.753 10.256 0.641 -0.768 0.000 0.444 1.716 10.256 0.780 0.626 -0.009 0.425 1.753 10.190 0.833 0.531 0.156 0.425 1.753 10.322 0.827 0.538 -0.163 0.310 1.983 5.470 0.329 -0.910 0.252 0.405 1.793 10.256 0.998 -0.063 -0.001 -1.058 4.718 3.419 0.344 0.939 0.004 -1.078 4.759 3.348 0.367 0.929 0.047 -1.078 4.759 3.490 0.367 0.929 -0.041 -1.287 4.759 12.307 0.562 -0.003 0.827 -1.020 4.643 12.307 0.305 0.500 0.810 -1.078 4.759 12.217 0.082 -0.047 0.996 -1.078 4.759 12.527 0.490 0.207 0.846 1.501 0.034 3.419 0.812 0.584 -0.001 1.393 0.250 3.333 -0.491 -0.868 0.073 1.393 0.250 3.503 -0.492 -0.866 -0.083 1.252 0.250 8.205 -0.041 -0.981 -0.188 1.518 0.000 7.964 0.403 0.915 0.004 1.393 0.250 8.023 -0.164 -0.980 -0.112 1.518 0.000 8.308 0.318 0.754 -0.575 1.393 0.250 8.280 -0.130 -0.850 -0.511 1.469 0.098 12.307 -0.244 -0.580 0.778 1.518 0.000 12.203 -0.162 -0.289 0.944 1.518 0.000 12.553 -0.440 -0.770 0.463 1.364 0.308 3.419 -0.458 -0.889 -0.007 1.361 0.315 8.205 -0.088 -0.937 -0.338 0.765 1.252 10.256 -0.813 0.582 -0.021 0.794 1.449 1.367 0.243 0.912 -0.332 0.767 1.503 1.202 0.320 0.925 0.203 0.767 1.503 1.437 0.269 0.837 -0.476 0.765 1.503 10.256 0.958 0.288 -0.016 0.771 1.495 10.256 0.949 0.315 -0.016 0.767 1.503 10.252 0.958 0.288 -0.013 0.767 1.503 10.260 0.957 0.288 -0.019 0.445 1.753 1.367 0.434 -0.866 -0.247 0.642 1.753 1.140 0.021 -0.785 0.619 0.642 1.753 1.461 -0.046 -0.696 -0.717 0.696 1.646 5.470 -0.005 0.928 0.371 0.642 1.753 5.378 0.115 0.699 0.705 0.642 1.753 5.718 0.010 0.999 0.031 0.642 1.753 10.173 -0.419 -0.886 0.197 0.642 1.753 10.337 -0.426 -0.871 -0.245 0.592 1.852 1.367 0.023 -0.930 -0.367 0.317 2.004 5.470 0.276 -0.931 0.239 0.516 2.004 5.375 -0.331 -0.820 0.468 0.516 2.004 5.677 -0.381 -0.923 0.048 0.607 1.823 10.256 -0.416 -0.909 -0.011 0.483 2.070 5.470 -0.319 -0.904 0.283 -0.950 4.759 3.419 0.219 0.976 0.003 -0.825 4.686 12.307 0.118 0.640 0.759 -0.861 4.759 12.215 0.116 0.502 0.857 -0.861 4.759 12.516 0.170 0.853 0.493 1.664 0.143 3.419 -1.000 -0.027 -0.005 1.610 0.250 3.395 -0.835 -0.550 0.007 1.610 0.250 3.442 -0.835 -0.550 -0.017 1.735 0.000 8.111 -0.352 0.921 -0.166 1.610 0.250 7.974 -0.921 -0.390 -0.018 1.735 0.000 8.254 -0.393 0.857 -0.334 1.610 0.250 8.307 -0.423 0.012 -0.906 1.696 0.079 12.307 -0.555 -0.388 0.735 1.735 0.000 12.234 -0.497 -0.170 0.851 1.735 0.000 12.448 -0.708 -0.248 0.661 1.601 0.268 3.419 -0.827 -0.563 -0.005 1.547 0.377 8.205 -0.519 -0.776 -0.358 0.944 1.503 1.367 -0.113 0.959 -0.261 0.779 1.503 10.256 0.940 0.340 -0.017 0.969 1.533 1.367 -0.206 0.940 -0.272 0.859 1.753 1.122 -0.622 -0.125 0.773 0.859 1.753 1.473 -0.523 -0.092 -0.847 0.833 1.753 5.470 -0.447 0.846 0.289 0.911 1.648 10.256 -0.981 0.193 -0.025 0.859 1.753 10.209 -0.937 -0.347 0.021 0.859 1.753 10.301 -0.937 -0.344 -0.054 0.766 1.939 1.367 -0.524 -0.814 -0.249 0.833 1.804 5.470 -0.684 0.663 0.304 0.733 2.004 5.418 -0.864 -0.420 0.277 0.733 2.004 5.573 -0.891 -0.432 0.140 0.841 1.789 10.256 -0.907 -0.421 -0.015 0.712 2.046 5.470 -0.833 -0.509 0.217 -0.745 4.759 12.307 0.005 0.701 0.713 1.623 0.250 3.419 -0.846 -0.533 -0.005 1.767 0.000 8.205 -0.353 0.903 -0.244 1.760 0.250 8.205 -0.945 0.132 -0.299 1.786 0.000 12.307 -0.584 -0.124 0.802 1.012 1.753 1.367 -0.908 0.277 -0.313 0.883 1.753 10.256 -0.953 -0.302 -0.017 0.772 2.004 5.470 -0.908 -0.354 0.225 2.552 0.000 1.367 0.962 0.071 -0.262 2.543 0.119 1.367 0.619 -0.736 -0.275 2.603 0.000 1.227 0.959 0.221 0.181 2.603 0.000 1.440 0.901 0.257 -0.350 2.571 0.000 5.470 -0.064 -0.988 0.141 2.588 0.029 5.470 -0.109 -0.984 0.141 2.603 0.000 5.420 -0.124 -0.978 0.166 2.603 0.000 5.564 -0.108 -0.990 0.087 1.062 3.006 8.205 0.907 0.355 -0.226 1.121 2.963 8.205 0.833 0.509 -0.217 1.100 3.006 8.102 0.891 0.432 -0.140 1.100 3.006 8.256 0.864 0.420 -0.277 0.950 3.256 3.419 0.953 0.302 0.017 0.993 3.220 3.419 0.907 0.420 0.015 0.975 3.256 3.374 0.937 0.344 0.053 0.975 3.256 3.465 0.938 0.347 -0.021 1.000 3.205 8.205 0.686 -0.661 -0.304 0.822 3.256 12.307 0.483 -0.147 0.863 1.067 3.071 12.307 0.320 0.496 0.807 0.975 3.256 12.202 0.164 0.029 0.986 0.975 3.256 12.553 0.652 0.132 0.747 0.923 3.360 3.419 0.982 -0.189 0.025 0.865 3.476 12.307 0.123 -0.563 0.817 0.074 4.759 5.470 0.945 -0.131 0.299 0.287 4.632 5.470 0.520 0.821 0.234 0.223 4.759 5.368 0.423 -0.010 0.906 0.223 4.759 5.701 0.920 0.390 0.017 0.211 4.759 10.256 0.846 0.533 0.005 0.232 4.742 10.256 0.824 0.566 0.005 0.223 4.759 10.232 0.835 0.550 0.017 0.223 4.759 10.280 0.835 0.550 -0.007 2.578 0.250 1.367 -0.008 -0.981 -0.194 2.820 0.000 1.121 0.453 0.791 0.411 2.695 0.250 1.159 -0.186 -0.937 0.297 2.820 0.000 1.472 0.449 0.793 -0.412 2.695 0.250 1.459 -0.207 -0.895 -0.395 2.774 0.092 5.470 -0.318 -0.915 0.248 2.820 0.000 5.366 -0.332 -0.768 0.548 2.820 0.000 5.711 -0.417 -0.909 -0.004 2.658 0.323 1.367 -0.140 -0.956 -0.259 1.350 2.939 8.205 0.319 0.904 -0.284 1.317 3.006 7.999 0.380 0.924 -0.049 1.317 3.006 8.300 0.330 0.820 -0.468 1.227 3.186 3.419 0.416 0.909 0.011 1.192 3.256 3.338 0.427 0.870 0.245 1.192 3.256 3.501 0.420 0.886 -0.196 1.001 3.256 8.205 0.446 -0.847 -0.290 1.192 3.256 7.958 -0.011 -0.999 -0.034 1.192 3.256 8.297 -0.116 -0.699 -0.705 1.241 3.157 12.307 -0.011 0.471 0.882 1.192 3.256 12.214 0.017 0.254 0.967 1.192 3.256 12.535 -0.018 0.662 0.749 1.055 3.507 3.419 -0.942 -0.336 0.017 1.067 3.507 3.415 -0.957 -0.288 0.019 1.067 3.507 3.423 -0.958 -0.288 0.013 1.138 3.363 8.205 0.004 -0.928 -0.372 0.889 3.507 12.307 0.070 -0.593 0.802 1.067 3.507 12.238 -0.131 -0.406 0.904 1.067 3.507 12.472 -0.226 -0.651 0.725 1.063 3.514 3.419 -0.949 -0.313 0.016 1.040 3.560 12.307 -0.136 -0.509 0.850 0.472 4.695 5.470 0.146 0.944 0.297 0.440 4.759 5.395 0.130 0.850 0.510 0.440 4.759 5.651 0.164 0.980 0.112 0.469 4.701 10.256 0.461 0.887 0.006 0.440 4.759 10.171 0.492 0.866 0.084 0.440 4.759 10.342 0.491 0.868 -0.073 3.037 0.000 1.226 -0.424 0.878 0.221 2.912 0.250 1.148 -0.664 -0.279 0.693 3.037 0.000 1.441 -0.527 0.700 -0.482 2.912 0.250 1.458 -0.289 0.166 -0.943 2.987 0.099 5.470 -0.725 -0.662 0.192 3.037 0.000 5.378 -0.845 -0.319 0.430 3.037 0.000 5.648 -0.924 -0.379 0.058 2.783 0.250 10.256 -0.218 -0.976 -0.003 2.929 0.215 10.256 -0.178 -0.984 -0.006 2.912 0.250 10.184 -0.367 -0.929 0.041 2.912 0.250 10.327 -0.367 -0.929 -0.047 2.854 0.366 1.367 -0.480 -0.755 -0.447 2.891 0.292 10.256 -0.345 -0.939 -0.004 1.516 3.006 8.205 -0.275 0.931 -0.240 1.429 3.216 3.419 -0.998 0.060 0.001 1.409 3.256 3.353 -0.827 -0.539 0.163 1.409 3.256 3.484 -0.833 -0.531 -0.156 1.523 3.027 8.205 -0.330 0.909 -0.254 1.409 3.256 7.967 -0.998 -0.026 -0.065 1.409 3.256 8.297 -0.474 -0.023 -0.880 1.388 3.256 12.307 -0.258 0.516 0.817 1.069 3.507 3.419 -0.958 -0.288 0.016 1.390 3.294 3.419 -0.779 -0.626 0.009 1.299 3.475 8.205 -0.455 -0.854 -0.253 1.392 3.290 12.307 -0.318 0.448 0.835 1.283 3.507 12.243 -0.445 -0.216 0.869 1.283 3.507 12.434 -0.624 -0.287 0.726 1.069 3.757 3.419 0.814 -0.581 0.021 1.182 3.710 3.419 0.990 0.138 0.021 1.158 3.757 3.335 0.979 0.074 0.188 1.158 3.757 3.504 0.985 0.073 -0.154 1.252 3.569 12.307 -0.472 -0.342 0.812 1.137 3.799 3.419 0.887 -0.461 0.024 0.582 4.759 5.470 0.041 0.981 0.188 0.669 4.734 10.256 0.326 0.945 0.002 0.657 4.759 10.209 0.341 0.940 0.025 0.657 4.759 10.304 0.341 0.940 -0.022 3.093 0.000 1.367 -0.392 0.880 -0.269 3.120 0.250 1.367 -0.970 0.006 -0.243 3.114 0.000 5.470 -0.954 -0.164 0.252 3.208 0.000 10.256 0.718 0.696 0.000 3.254 0.000 10.143 0.814 0.575 0.076 3.128 0.250 10.152 -0.619 -0.781 0.086 3.254 0.000 10.369 0.814 0.576 -0.076 3.128 0.250 10.359 -0.617 -0.782 -0.088 3.093 0.322 10.256 -0.585 -0.811 -0.002 1.515 3.256 3.419 -0.642 0.766 0.000 1.560 3.256 8.205 -0.833 0.431 -0.348 1.450 3.507 3.419 0.941 0.337 0.007 1.578 3.350 3.419 0.119 0.993 0.001 1.500 3.507 3.312 0.921 0.369 0.128 1.500 3.507 3.526 0.920 0.372 -0.120 1.335 3.507 12.307 -0.534 -0.160 0.830 1.375 3.757 3.302 -0.683 -0.719 0.129 1.375 3.757 3.537 -0.685 -0.718 -0.120 1.341 3.826 3.419 -0.612 -0.791 0.004 0.712 4.759 10.256 0.270 0.963 0.001 3.350 0.000 10.256 0.377 0.926 0.000 3.262 0.250 10.256 -0.816 -0.578 0.000 1.599 3.507 3.419 0.072 0.997 0.007 1.512 3.757 3.419 -0.894 -0.448 0.003 3.134 1.503 8.205 0.963 0.198 -0.181 3.166 1.477 8.205 0.945 0.273 -0.178 3.153 1.503 8.150 0.965 0.217 -0.145 3.153 1.503 8.232 0.956 0.216 -0.200 3.121 1.566 8.205 0.982 0.001 -0.186 2.383 3.006 1.367 0.959 0.230 -0.166 2.414 2.981 1.367 0.940 0.299 -0.165 2.402 3.006 1.313 0.966 0.250 -0.070 2.402 3.006 1.396 0.951 0.248 -0.183 2.365 3.079 1.367 0.985 0.013 -0.175 3.343 1.252 3.419 0.914 0.407 -0.008 3.525 1.193 3.419 0.266 0.964 -0.008 3.495 1.252 3.317 0.151 0.975 0.162 3.495 1.252 3.519 0.155 0.970 -0.185 3.303 1.503 3.419 -0.547 -0.836 -0.042 3.370 1.503 3.389 -0.977 -0.212 0.008 3.370 1.503 3.447 -0.976 -0.213 -0.038 3.403 1.436 8.205 -0.182 0.925 -0.335 3.370 1.503 8.019 -0.202 0.972 -0.123 3.370 1.503 8.283 -0.359 0.792 -0.494 3.312 1.619 3.419 -0.124 -0.992 -0.032 3.117 1.753 8.205 0.586 -0.766 -0.265 3.245 1.753 7.967 -0.132 -0.991 -0.002 3.245 1.753 8.308 -0.363 -0.722 -0.589 3.243 1.753 12.307 0.720 -0.201 0.664 3.248 1.746 12.307 0.723 -0.184 0.666 3.245 1.753 12.305 0.719 -0.201 0.665 3.245 1.753 12.313 0.724 -0.202 0.660 3.200 1.842 8.205 -0.051 -0.943 -0.329 3.244 1.755 12.307 0.719 -0.204 0.665 2.653 2.937 1.367 -0.061 0.951 -0.304 2.618 3.006 1.156 -0.009 0.896 0.444 2.618 3.006 1.464 -0.191 0.843 -0.503 2.365 3.256 1.367 0.575 -0.763 -0.295 2.493 3.256 1.141 -0.316 -0.787 0.530 2.493 3.256 1.457 -0.578 -0.614 -0.538 2.488 3.256 5.470 0.971 -0.183 0.153 2.502 3.238 5.470 0.980 -0.128 0.154 2.493 3.256 5.461 0.971 -0.180 0.158 2.493 3.256 5.486 0.973 -0.181 0.144 2.303 3.256 10.256 0.985 0.172 -0.001 2.532 3.179 10.256 -0.215 0.977 -0.001 2.493 3.256 10.165 -0.687 0.712 0.145 2.493 3.256 10.347 -0.681 0.718 -0.143 2.445 3.352 1.367 -0.144 -0.924 -0.355 2.489 3.264 5.470 0.968 -0.199 0.153 2.295 3.507 10.256 0.474 -0.881 0.005 2.368 3.507 10.182 -0.509 -0.847 0.154 2.368 3.507 10.331 -0.508 -0.850 -0.141 2.329 3.585 10.256 0.191 -0.982 0.006 v_sim-3.7.0/examples/planes.xml0000644000353400050620000000074712215546210013411 00000000000000 v_sim-3.7.0/examples/density-sih4.dat0000644000353400050620000226640312215546211014431 00000000000000 Grid for testing 30 30 30 10. 0. 10. 0. 0. 10. xyz periodic 4.73652474252816E-7 8.731497576473942E-7 9.817260510168E-7 0.0000011014415294973527 0.000003129312492499613 0.00000956561795367725 0.000017222828270284477 0.000020168309059148432 0.000022151566164277554 0.00002876807497365709 0.00003655595560015854 0.00003710588664386429 0.0000326951435086569 0.00003299600592525289 0.000039996705480559104 0.00004478315592366391 0.000039996705480558996 0.00003299600592525289 0.0000326951435086569 0.00003710588664386418 0.00003655595560015859 0.000028768074973657036 0.000022151566164277554 0.000020168309059148432 0.000017222828270284477 0.000009565617953677223 0.000003129312492499613 0.0000011014415294973662 9.817260510167865E-7 8.731497576473434E-7 8.7314975764729E-7 0.000001572758838964555 0.0000021373228939780984 0.0000024559531885521286 0.000004556866447378803 0.00001051283086449952 0.000017412833723629524 0.00002043402073580928 0.00002254157915947913 0.000028324619977963402 0.00003557185750931382 0.00003732366030448026 0.00003494468682886889 0.000035973655853699436 0.000041943241076209215 0.00004589492550742054 0.00004194324107620919 0.000035973655853699436 0.00003494468682886887 0.00003732366030448028 0.00003557185750931379 0.000028324619977963324 0.000022541579159479208 0.00002043402073580931 0.00001741283372362949 0.000010512830864499486 0.000004556866447378799 0.0000024559531885521413 0.0000021373228939780946 0.000001572758838964499 9.817260510166362E-7 0.0000021373228939780696 0.000003996439040510895 0.0000060047954966968644 0.000009341733308209034 0.000014781998225035517 0.0000207814513884258 0.00002521359185904715 0.000029077834577926722 0.000034395759926610535 0.00004131938524832004 0.000046397958466130725 0.00004926469609027373 0.000052163891300051554 0.00005534744024333387 0.000057049049509911594 0.00005534744024333374 0.000052163891300051493 0.00004926469609027365 0.000046397958466130644 0.00004131938524832002 0.00003439575992661042 0.000029077834577926725 0.000025213591859047158 0.000020781451388425793 0.00001478199822503547 0.000009341733308209026 0.00000600479549669688 0.000003996439040510875 0.000002137322893978012 0.0000011014415294973 0.00000245595318855219 0.000006004795496696907 0.00001130838817807543 0.000017423225697002 0.000023945460612412804 0.000031838852771596376 0.00004158095417466843 0.00005157501937403713 0.000060288850131598055 0.00006927841106991465 0.00007921512669109889 0.00008836635431708629 0.0000929621703342678 0.00009223278715530918 0.00009102652667143358 0.00009223278715530911 0.00009296217033426784 0.00008836635431708633 0.00007921512669109902 0.00006927841106991464 0.000060288850131597954 0.00005157501937403713 0.000041580954174668434 0.00003183885277159631 0.00002394546061241277 0.00001742322569700198 0.000011308388178075445 0.000006004795496696895 0.0000024559531885521315 0.0000031293124924995295 0.0000045568664473788485 0.000009341733308209056 0.000017423225697002007 0.00002659310644048791 0.00003634591631691762 0.00005006992510114424 0.00007002096897945217 0.00009202672100430485 0.00010990207288447243 0.0001244369771430504 0.00013968876242537664 0.00015338033482130143 0.00015775652622947948 0.00015267581316422986 0.00014878985649779478 0.0001526758131642298 0.00015775652622947948 0.00015338033482130138 0.0001396887624253766 0.0001244369771430505 0.00010990207288447232 0.00009202672100430489 0.00007002096897945223 0.00005006992510114419 0.000036345916316917585 0.000026593106440487877 0.00001742322569700202 0.00000934173330820904 0.000004556866447378791 0.000009565617953677157 0.000010512830864499584 0.000014781998225035556 0.000023945460612412905 0.00003634591631691774 0.00005142955062686039 0.00007364236764164765 0.00010639592520414873 0.00014390693080602865 0.00017526872371932762 0.00019823253447444456 0.00021814488333106853 0.00023414234946933713 0.00023864228845880243 0.000232347104625103 0.00022768469543646452 0.00023234710462510287 0.00023864228845880237 0.0002341423494693371 0.00021814488333106848 0.00019823253447444456 0.00017526872371932748 0.00014390693080602868 0.00010639592520414873 0.00007364236764164755 0.000051429550626860336 0.00003634591631691769 0.00002394546061241291 0.000014781998225035534 0.000010512830864499533 0.000017222828270284307 0.0000174128337236295 0.00002078145138842572 0.00003183885277159634 0.00005006992510114432 0.00007364236764164751 0.00010556425488906758 0.00014926894555381768 0.00019991623908953302 0.00024516722341407903 0.00027877854625725496 0.0003040176982251545 0.0003235039291855624 0.00033441079730572653 0.0003361344573057893 0.0003352029974325339 0.0003361344573057892 0.00033441079730572653 0.0003235039291855624 0.0003040176982251546 0.00027877854625725496 0.0002451672234140789 0.0001999162390895331 0.0001492689455538177 0.00010556425488906753 0.00007364236764164748 0.00005006992510114427 0.00003183885277159635 0.00002078145138842569 0.000017412833723629453 0.000020168309059148307 0.000020434020735809416 0.000025213591859047212 0.000041580954174668576 0.00007002096897945247 0.00010639592520414889 0.00014926894555381806 0.0002010143453447904 0.0002615690115628146 0.00032132396993738853 0.00036883179365408003 0.00040141036955367216 0.00042623502672549575 0.000449610976650894 0.00046879496476522574 0.0004764957920562696 0.00046879496476522563 0.000449610976650894 0.0004262350267254957 0.00040141036955367216 0.00036883179365408003 0.0003213239699373884 0.00026156901156281463 0.00020101434534479043 0.00014926894555381795 0.00010639592520414886 0.0000700209689794524 0.00004158095417466857 0.000025213591859047182 0.000020434020735809372 0.00002215156616427748 0.000022541579159479245 0.000029077834577926756 0.00005157501937403711 0.00009202672100430512 0.00014390693080602868 0.00019991623908953332 0.0002615690115628144 0.00033609296454867885 0.00041701622182258394 0.0004837211007552422 0.0005240339424709021 0.0005506553884725052 0.0005832294783845775 0.0006197248184155329 0.0006368373327308808 0.0006197248184155328 0.0005832294783845774 0.0005506553884725052 0.0005240339424709022 0.00048372110075524215 0.00041701622182258377 0.00033609296454867885 0.0002615690115628144 0.00019991623908953323 0.00014390693080602865 0.00009202672100430502 0.00005157501937403712 0.000029077834577926722 0.000022541579159479208 0.000028768074973657084 0.00002832461997796342 0.00003439575992661068 0.00006028885013159811 0.00010990207288447273 0.0001752687237193278 0.0002451672234140793 0.0003213239699373884 0.00041701622182258377 0.0005262171083925534 0.0006161255593246747 0.0006638652867328147 0.0006876207794232068 0.0007212546483763897 0.0007667896670978377 0.0007897162282245125 0.0007667896670978376 0.0007212546483763899 0.0006876207794232068 0.0006638652867328147 0.0006161255593246747 0.0005262171083925533 0.0004170162218225838 0.0003213239699373885 0.00024516722341407925 0.0001752687237193278 0.00010990207288447265 0.000060288850131598116 0.00003439575992661066 0.000028324619977963392 0.000036555955600158483 0.00003557185750931371 0.000041319385248320063 0.00006927841106991455 0.0001244369771430508 0.0001982325344744446 0.0002787785462572553 0.0003688317936540799 0.0004837211007552419 0.0006161255593246748 0.0007258557129460845 0.0007842331047055573 0.0008116561588309146 0.0008486525878630218 0.0008995969267711847 0.0009254338743022511 0.0008995969267711845 0.0008486525878630218 0.0008116561588309146 0.0007842331047055573 0.0007258557129460845 0.0006161255593246748 0.000483721100755242 0.00036883179365408 0.00027877854625725523 0.0001982325344744446 0.00012443697714305073 0.00006927841106991455 0.00004131938524832002 0.000035571857509313694 0.00003710588664386422 0.00003732366030448009 0.000046397958466130834 0.00007921512669109885 0.00013968876242537683 0.00021814488333106864 0.00030401769822515474 0.0004014103695536721 0.0005240339424709018 0.0006638652867328144 0.0007842331047055572 0.0008602438311349426 0.0009088671603585743 0.0009628131037069255 0.0010223797079019653 0.001050310032841179 0.0010223797079019653 0.0009628131037069256 0.0009088671603585743 0.0008602438311349426 0.0007842331047055571 0.0006638652867328143 0.0005240339424709019 0.00040141036955367216 0.0003040176982251547 0.00021814488333106864 0.00013968876242537675 0.00007921512669109886 0.00004639795846613081 0.00003732366030448009 0.00003269514350865678 0.000034944686828868745 0.000049264696090273646 0.0000883663543170863 0.00015338033482130165 0.00023414234946933719 0.0003235039291855628 0.0004262350267254957 0.0005506553884725049 0.0006876207794232064 0.0008116561588309145 0.000908867160358574 0.0009886570927394604 0.001064406485380005 0.0011288125431500472 0.001155389745083632 0.001128812543150047 0.0010644064853800052 0.0009886570927394604 0.000908867160358574 0.0008116561588309145 0.0006876207794232064 0.000550655388472505 0.0004262350267254957 0.00032350392918556274 0.00023414234946933719 0.00015338033482130154 0.00008836635431708629 0.000049264696090273606 0.00003494468682886875 0.0000329960059252528 0.00003597365585369935 0.000052163891300051615 0.00009296217033426761 0.0001577565262294795 0.0002386422884588025 0.00033441079730572653 0.0004496109766508942 0.0005832294783845773 0.0007212546483763893 0.0008486525878630215 0.0009628131037069254 0.0010644064853800052 0.0011463175132408869 0.001198608070877356 0.0012163029673619547 0.001198608070877356 0.0011463175132408869 0.0010644064853800052 0.0009628131037069254 0.0008486525878630215 0.0007212546483763893 0.0005832294783845774 0.00044961097665089425 0.00033441079730572653 0.00023864228845880256 0.00015775652622947945 0.00009296217033426761 0.000052163891300051595 0.000035973655853699375 0.00003999670548055916 0.00004194324107620926 0.00005534744024333387 0.00009223278715530905 0.00015267581316423008 0.00023234710462510306 0.00033613445730578957 0.0004687949647652258 0.0006197248184155328 0.0007667896670978375 0.0008995969267711845 0.001022379707901965 0.001128812543150047 0.001198608070877356 0.0012264093166083295 0.0012312082497994402 0.0012264093166083293 0.001198608070877356 0.001128812543150047 0.001022379707901965 0.0008995969267711845 0.0007667896670978374 0.0006197248184155328 0.00046879496476522585 0.00033613445730578957 0.0002323471046251031 0.00015267581316423 0.00009223278715530905 0.000055347440243333844 0.000041943241076209296 0.000044783155923663996 0.00004589492550742053 0.00005704904950991192 0.00009102652667143356 0.00014878985649779508 0.0002276846954364649 0.0003352029974325343 0.0004764957920562702 0.0006368373327308813 0.0007897162282245126 0.0009254338743022514 0.001050310032841179 0.0011553897450836323 0.0012163029673619547 0.00123120824979944 0.0012297430304380845 0.0012312082497994402 0.0012163029673619547 0.0011553897450836323 0.001050310032841179 0.0009254338743022513 0.0007897162282245126 0.0006368373327308813 0.0004764957920562702 0.0003352029974325343 0.00022768469543646492 0.000148789856497795 0.00009102652667143356 0.000057049049509911906 0.00004589492550742057 0.00003999670548055909 0.00004194324107620916 0.00005534744024333381 0.000092232787155309 0.0001526758131642301 0.00023234710462510309 0.0003361344573057896 0.00046879496476522596 0.0006197248184155331 0.0007667896670978378 0.0008995969267711853 0.0010223797079019657 0.0011288125431500476 0.0011986080708773562 0.0012264093166083298 0.0012312082497994402 0.0012264093166083298 0.0011986080708773562 0.0011288125431500476 0.0010223797079019657 0.0008995969267711854 0.0007667896670978379 0.000619724818415533 0.00046879496476522596 0.0003361344573057897 0.0002323471046251031 0.00015267581316423003 0.000092232787155309 0.00005534744024333379 0.00004194324107620921 0.000032996005925252856 0.00003597365585369947 0.00005216389130005163 0.00009296217033426765 0.00015775652622947964 0.00023864228845880264 0.0003344107973057266 0.0004496109766508943 0.0005832294783845775 0.0007212546483763895 0.0008486525878630219 0.0009628131037069258 0.0010644064853800054 0.0011463175132408869 0.001198608070877356 0.0012163029673619545 0.001198608070877356 0.0011463175132408869 0.0010644064853800057 0.0009628131037069258 0.0008486525878630219 0.0007212546483763896 0.0005832294783845775 0.00044961097665089425 0.00033441079730572664 0.0002386422884588027 0.00015775652622947956 0.00009296217033426767 0.00005216389130005163 0.00003597365585369953 0.00003269514350865687 0.00003494468682886899 0.000049264696090273775 0.0000883663543170863 0.0001533803348213017 0.0002341423494693373 0.0003235039291855629 0.0004262350267254959 0.0005506553884725056 0.0006876207794232069 0.0008116561588309152 0.0009088671603585748 0.0009886570927394613 0.0010644064853800059 0.0011288125431500476 0.0011553897450836325 0.0011288125431500478 0.0010644064853800059 0.000988657092739461 0.0009088671603585749 0.0008116561588309152 0.000687620779423207 0.0005506553884725056 0.0004262350267254959 0.00032350392918556296 0.00023414234946933735 0.00015338033482130162 0.0000883663543170863 0.00004926469609027377 0.00003494468682886904 0.000037105886643864283 0.00003732366030448033 0.00004639795846613087 0.00007921512669109873 0.00013968876242537686 0.00021814488333106861 0.00030401769822515474 0.0004014103695536723 0.0005240339424709022 0.0006638652867328143 0.0007842331047055574 0.0008602438311349426 0.0009088671603585746 0.0009628131037069257 0.0010223797079019655 0.001050310032841179 0.0010223797079019655 0.0009628131037069257 0.0009088671603585746 0.0008602438311349426 0.0007842331047055573 0.0006638652867328145 0.0005240339424709021 0.00040141036955367227 0.0003040176982251548 0.00021814488333106864 0.0001396887624253768 0.00007921512669109873 0.00004639795846613087 0.000037323660304480386 0.00003655595560015866 0.00003557185750931389 0.00004131938524832031 0.00006927841106991443 0.00012443697714305076 0.0001982325344744447 0.00027877854625725534 0.0003688317936540803 0.0004837211007552422 0.0006161255593246745 0.0007258557129460845 0.0007842331047055571 0.0008116561588309147 0.0008486525878630218 0.0008995969267711849 0.0009254338743022516 0.000899596926771185 0.0008486525878630219 0.0008116561588309147 0.0007842331047055572 0.0007258557129460845 0.0006161255593246746 0.00048372110075524215 0.0003688317936540803 0.00027877854625725545 0.00019823253447444472 0.00012443697714305073 0.00006927841106991445 0.00004131938524832031 0.00003557185750931395 0.000028768074973656955 0.00002832461997796313 0.00003439575992661065 0.000060288850131597595 0.00010990207288447235 0.0001752687237193275 0.00024516722341407914 0.00032132396993738875 0.00041701622182258377 0.000526217108392553 0.0006161255593246746 0.0006638652867328142 0.0006876207794232066 0.0007212546483763894 0.0007667896670978377 0.000789716228224513 0.0007667896670978378 0.0007212546483763894 0.0006876207794232066 0.0006638652867328141 0.0006161255593246746 0.0005262171083925531 0.00041701622182258366 0.00032132396993738875 0.0002451672234140792 0.00017526872371932754 0.00010990207288447231 0.0000602888501315976 0.000034395759926610664 0.000028324619977963185 0.00002215156616427764 0.000022541579159479093 0.000029077834577926993 0.00005157501937403697 0.00009202672100430498 0.0001439069308060288 0.00019991623908953334 0.00026156901156281496 0.0003360929645486789 0.0004170162218225835 0.0004837211007552419 0.0005240339424709016 0.0005506553884725051 0.0005832294783845773 0.0006197248184155328 0.0006368373327308815 0.0006197248184155329 0.0005832294783845773 0.0005506553884725051 0.0005240339424709016 0.0004837211007552419 0.0004170162218225836 0.00033609296454867885 0.00026156901156281496 0.00019991623908953345 0.00014390693080602887 0.00009202672100430497 0.00005157501937403699 0.000029077834577926996 0.000022541579159479143 0.00002016830905914839 0.000020434020735809162 0.000025213591859047355 0.00004158095417466831 0.00007002096897945226 0.00010639592520414893 0.00014926894555381798 0.000201014345344791 0.00026156901156281474 0.0003213239699373884 0.00036883179365408003 0.00040141036955367205 0.0004262350267254958 0.00044961097665089425 0.0004687949647652261 0.0004764957920562704 0.0004687949647652262 0.0004496109766508943 0.00042623502672549575 0.0004014103695536721 0.0003688317936540801 0.0003213239699373886 0.00026156901156281474 0.00020101434534479097 0.00014926894555381806 0.00010639592520414896 0.00007002096897945224 0.00004158095417466832 0.000025213591859047368 0.0000204340207358092 0.000017222828270284538 0.00001741283372362953 0.000020781451388425996 0.000031838852771596315 0.00005006992510114434 0.00007364236764164771 0.00010556425488906784 0.0001492689455538184 0.0001999162390895338 0.00024516722341407947 0.00027877854625725593 0.00030401769822515495 0.00032350392918556323 0.00033441079730572697 0.00033613445730579 0.0003352029974325348 0.0003361344573057901 0.0003344107973057269 0.00032350392918556323 0.0003040176982251549 0.0002787785462572559 0.0002451672234140796 0.00019991623908953372 0.00014926894555381833 0.00010556425488906792 0.00007364236764164771 0.00005006992510114432 0.00003183885277159632 0.000020781451388426 0.000017412833723629558 0.000009565617953677253 0.000010512830864499501 0.000014781998225035683 0.000023945460612412746 0.00003634591631691766 0.0000514295506268604 0.00007364236764164765 0.00010639592520414913 0.00014390693080602897 0.00017526872371932765 0.00019823253447444483 0.0002181448833310685 0.00023414234946933746 0.00023864228845880267 0.00023234710462510325 0.00022768469543646503 0.0002323471046251033 0.0002386422884588027 0.00023414234946933746 0.0002181448833310685 0.00019823253447444485 0.0001752687237193277 0.00014390693080602887 0.0001063959252041491 0.00007364236764164769 0.00005142955062686042 0.00003634591631691765 0.00002394546061241275 0.000014781998225035688 0.000010512830864499516 0.0000031293124924995536 0.00000455686644737876 0.000009341733308209112 0.000017423225697001906 0.00002659310644048793 0.00003634591631691771 0.00005006992510114432 0.00007002096897945255 0.00009202672100430521 0.0001099020728844727 0.000124436977143051 0.00013968876242537688 0.0001533803348213018 0.00015775652622947964 0.00015267581316423022 0.00014878985649779532 0.00015267581316423027 0.00015775652622947964 0.00015338033482130187 0.00013968876242537688 0.00012443697714305103 0.00010990207288447275 0.00009202672100430519 0.00007002096897945254 0.00005006992510114436 0.0000363459163169177 0.000026593106440487928 0.000017423225697001916 0.00000934173330820911 0.00000455686644737876 0.0000011014415294971636 0.000002455953188551963 0.000006004795496696787 0.000011308388178075157 0.000017423225697001845 0.000023945460612412753 0.00003183885277159621 0.00004158095417466848 0.00005157501937403695 0.00006028885013159774 0.00006927841106991426 0.00007921512669109862 0.00008836635431708625 0.00009296217033426748 0.00009223278715530893 0.00009102652667143341 0.00009223278715530897 0.00009296217033426745 0.00008836635431708616 0.00007921512669109855 0.00006927841106991423 0.000060288850131597764 0.00005157501937403691 0.00004158095417466847 0.000031838852771596254 0.000023945460612412756 0.000017423225697001865 0.000011308388178075184 0.0000060047954966967924 0.0000024559531885519477 9.817260510167414E-7 0.000002137322893978135 0.000003996439040510992 0.0000060047954966968416 0.0000093417333082091 0.000014781998225035585 0.000020781451388425847 0.000025213591859047345 0.00002907783457792701 0.00003439575992661074 0.000041319385248320246 0.00004639795846613066 0.00004926469609027361 0.00005216389130005141 0.00005534744024333385 0.00005704904950991171 0.000055347440243333844 0.0000521638913000514 0.00004926469609027358 0.00004639795846613067 0.00004131938524832029 0.00003439575992661073 0.00002907783457792696 0.000025213591859047307 0.000020781451388425857 0.000014781998225035547 0.000009341733308209093 0.000006004795496696851 0.000003996439040510982 0.0000021373228939781085 8.731497576473113E-7 0.0000015727588389645566 0.0000021373228939781407 0.000002455953188552092 0.00000455686644737881 0.000010512830864499521 0.000017412833723629534 0.000020434020735809318 0.000022541579159479225 0.000028324619977963243 0.00003557185750931374 0.00003732366030448015 0.00003494468682886883 0.0000359736558536994 0.00004194324107620919 0.00004589492550742042 0.00004194324107620929 0.000035973655853699416 0.00003494468682886883 0.00003732366030448008 0.0000355718575093138 0.000028324619977963267 0.000022541579159479208 0.000020434020735809294 0.000017412833723629534 0.000010512830864499486 0.000004556866447378805 0.0000024559531885521053 0.0000021373228939781407 0.0000015727588389645185 8.731497576476449E-7 0.0000015727588389647836 0.000002137322893978404 0.0000024559531885526135 0.000004556866447379422 0.000010512830864500068 0.000017412833723629917 0.000020434020735809772 0.000022541579159479706 0.00002832461997796386 0.00003557185750931429 0.00003732366030448093 0.00003494468682886957 0.00003597365585370014 0.0000419432410762099 0.00004589492550742134 0.00004194324107621044 0.00003597365585370101 0.000034944686828870765 0.00003732366030448201 0.0000355718575093157 0.000028324619977965215 0.000022541579159481115 0.000020434020735811344 0.000017412833723631598 0.000010512830864501505 0.000004556866447380479 0.0000024559531885532572 0.0000021373228939788175 0.0000015727588389648717 0.0000015727588389652626 0.00000285892175176496 0.000002762615652369505 0.000002036722977855606 0.000003983409389721915 0.000010520403821835282 0.000017076032718197428 0.000019088382184320965 0.00002053205010782843 0.000025849658985386505 0.00003378055041345735 0.000038182571490199756 0.000039276793556516195 0.00004246476366108822 0.00004804046316260092 0.00005028754494385229 0.00004603987620568666 0.000041852286247621125 0.00004233764706958042 0.000044717298415451535 0.00004323547790220825 0.000036828364883751334 0.00003018052248613238 0.000025034130620912827 0.000019548538281867914 0.00001299998014039852 0.000008151547957648139 0.0000055356148465817726 0.0000036084647764521415 0.0000018701035482080726 0.0000021373228939793935 0.0000027626156523701492 0.0000023858417075119453 0.0000025097644122411145 0.00000554226616858285 0.000011415154720125453 0.000016053898680696026 0.00001784863927513438 0.00002071187565953676 0.00002671170950945761 0.0000353858168292177 0.00004365864520425263 0.00005081018743245168 0.00005773213817806005 0.0000637862729806354 0.00006774528075202899 0.00006979335205075105 0.00007273331620749089 0.00007494986032959587 0.00007386269411413508 0.00006945342397726736 0.00006258753462346807 0.00005384413321554055 0.00004262943994522773 0.00003105710711973258 0.00002223858765754982 0.00001699613417881604 0.000012912197025181602 0.00000804868882886601 0.000003608464776452429 0.0000024559531885541182 0.000002036722977856951 0.000002509764412241885 0.0000054046570067347725 0.000010432721977928645 0.0000154869764750901 0.000019053487707614036 0.000022572177159263184 0.00002876662995246088 0.00003706462000962938 0.00004701150675251019 0.00005906705547390568 0.00007319711621452098 0.00008633426488525763 0.00009660617943874871 0.00010792134312512637 0.00012382628362151183 0.0001400195734721019 0.00014552776986352707 0.00013880284057141276 0.00012834877183814158 0.00011796120117655284 0.00010298248083767368 0.00007998449698244473 0.00005616002450131098 0.00003976068444587585 0.000030311141079121294 0.00002214979980321094 0.00001291219702518201 0.000005535614846582486 0.000004556866447381208 0.000003983409389723775 0.000005542266168584321 0.000010432721977929538 0.00001699753266601417 0.00002242632725749176 0.0000276868003413488 0.00003641977923896503 0.00004966829372031973 0.00006307845147368935 0.00007498642144383799 0.0000897053040096315 0.00010991083482162108 0.00013107499389271288 0.00014969492195175308 0.00017215285754228538 0.00020453187540746886 0.00023703570095634643 0.000249626848933341 0.0002390574811461117 0.00022075191810651295 0.0002022661710982103 0.00017486743176160918 0.0001337877755735311 0.00009205475009134067 0.00006284740975602363 0.00004485817630947686 0.000030311141079121602 0.00001699613417881663 0.000008151547957648943 0.000010512830864501934 0.00001052040382183743 0.000011415154720127518 0.000015486976475091856 0.000022426327257492767 0.000030050283810161233 0.00004046369803591167 0.000057993578281355464 0.00008184139687993365 0.00010322000910759505 0.00011896774347644046 0.00013719159990130853 0.00016417085279852374 0.0001957018338934871 0.00022539912279093702 0.000257889403851152 0.0003006000119108427 0.00034400341974442786 0.00036504846722240934 0.00035604221904844165 0.0003314013116227085 0.00030038990046507455 0.0002556769954001611 0.0001953274840006317 0.00013600659857995748 0.00009243873198667929 0.0000628474097560239 0.0000397606844458764 0.000022238587657550493 0.000012999980140399251 0.000017412833723631628 0.000017076032718199478 0.00001605389868069811 0.000019053487707616045 0.000027686800341350382 0.000040463698035912216 0.00005883925589510527 0.00008587912888930913 0.00012021240778397824 0.00015154206168441168 0.0001759200090281856 0.00020289046441401883 0.00024181346590353568 0.0002898163901862287 0.000334974298923437 0.00037446751049341487 0.00041543744447833944 0.00045571802826237646 0.0004787892601050384 0.0004735132988821235 0.00044462886976899703 0.0003988059216545916 0.00033639172392144326 0.00026232352305726305 0.00019199258158379256 0.00013600659857995756 0.0000920547500913411 0.000056160024501311595 0.000031057107119733166 0.000019548538281868396 0.000020434020735811266 0.000019088382184322808 0.000017848639275136353 0.00002257217715926533 0.000036419779238966876 0.000057993578281356535 0.00008587912888930977 0.0001212177467132263 0.00016484178283184583 0.0002087267249035142 0.00024777767599729424 0.0002890580940773188 0.0003443313341783671 0.0004144589417778407 0.0004813101651604774 0.0005287625121494391 0.0005603349195352476 0.0005865215698875168 0.0006045988410517463 0.0006011759042085234 0.0005666602319166289 0.0005030317145494117 0.0004222368852196871 0.00033846068511081314 0.00026232352305726315 0.00019532748400063189 0.00013378777557353162 0.0000799844969824454 0.000042629439945228246 0.000025034130620913203 0.000022541579159481027 0.000020532050107829862 0.000020711875659538402 0.000028766629952462575 0.00004966829372032134 0.00008184139687993411 0.00012021240778397832 0.00016484178283184505 0.00022033393740473507 0.00028173929364136977 0.00033999731898394584 0.0003957651850725636 0.00046335640422671086 0.0005519973573561747 0.0006423483931220779 0.0007038565058097183 0.0007313386636297369 0.0007465776724080139 0.0007619127265753577 0.0007609761381989924 0.0007178665296542976 0.0006296342986623041 0.0005222137760460878 0.00042223688521968666 0.0003363917239214431 0.00025567699540016104 0.0001748674317616096 0.00010298248083767409 0.00005384413321554087 0.00003018052248613249 0.00002832461997796525 0.000025849658985387877 0.000026711709509459135 0.00003706462000963078 0.00006307845147369058 0.00010322000910759531 0.00015154206168441095 0.00020872672490351241 0.0002817392936413682 0.0003660870006756866 0.0004453625188348372 0.0005122217700908266 0.0005841060597842323 0.0006814304005537422 0.000790059915324497 0.0008701737083641774 0.000905575712490908 0.0009218909549822137 0.0009416347748850418 0.0009450532555018936 0.0008912224146887227 0.0007727221740842523 0.0006296342986623036 0.0005030317145494112 0.00039880592165459126 0.0003003899004650746 0.0002022661710982107 0.00011796120117655318 0.00006258753462346834 0.00003682836488375131 0.00003557185750931561 0.00003378055041345842 0.00003538581682921896 0.00004701150675251137 0.00007498642144383937 0.0001189677434764406 0.00017592000902818487 0.0002477776759972918 0.00033999731898394286 0.0004453625188348356 0.0005424395332519977 0.0006206635119981518 0.0006992403467680987 0.0008039528511211494 0.0009248564411888024 0.001018928388904482 0.0010633634004518998 0.0010826685402583547 0.0011029764516615216 0.0011033690494170367 0.001035912206518223 0.0008912224146887224 0.0007178665296542967 0.000566660231916628 0.0004446288697689966 0.0003314013116227081 0.00022075191810651287 0.00012834877183814122 0.00006945342397726691 0.00004323547790220782 0.000037323660304481796 0.00003818257149020044 0.000043658645204253795 0.00005906705547390675 0.00008970530400963274 0.0001371915999013091 0.00020289046441401829 0.0002890580940773165 0.00039576518507256005 0.0005122217700908235 0.0006206635119981499 0.0007164119706880185 0.0008161527036543696 0.0009370424568941316 0.0010646588843713982 0.0011579051791739618 0.001197342979212863 0.0012065670294402907 0.001209821010486132 0.001189321765510574 0.0011033690494170359 0.0009450532555018922 0.0007609761381989911 0.0006011759042085222 0.00047351329888212245 0.00035604221904844067 0.00023905748114611098 0.00013880284057141203 0.00007386269411413449 0.00004471729841545076 0.000034944686828870195 0.000039276793556516656 0.00005081018743245241 0.0000731971162145221 0.00010991083482162258 0.0001641708527985246 0.0002418134659035361 0.0003443313341783657 0.0004633564042267081 0.0005841060597842293 0.0006992403467680962 0.000816152703654368 0.0009448279369217375 0.0010815579702260227 0.0012018072025311523 0.0012756356763438074 0.0012975573945890684 0.0012883678922504813 0.0012632413019571791 0.0012098210104861315 0.0011029764516615208 0.0009416347748850404 0.0007619127265753562 0.0006045988410517448 0.00047878926010503736 0.0003650484672224079 0.00024962684893333994 0.00014552776986352596 0.00007494986032959456 0.0000423376470695795 0.000035973655853700426 0.0000424647636610883 0.00005773213817806051 0.0000863342648852583 0.00013107499389271402 0.00019570183389348823 0.00028981639018622933 0.00041445894177784026 0.0005519973573561732 0.0006814304005537398 0.0008039528511211471 0.0009370424568941302 0.0010815579702260223 0.0012123734799485142 0.001302133175859918 0.0013445560159961191 0.0013517795309755743 0.001333902222608254 0.001288367892250481 0.0012065670294402902 0.0010826685402583534 0.0009218909549822122 0.0007465776724080122 0.0005865215698875151 0.00045571802826237473 0.00034400341974442634 0.00023703570095634494 0.00014001957347210044 0.0000727333162074897 0.000041852286247620034 0.00004194324107621011 0.000048040463162600965 0.00006378627298063543 0.0000966061794387492 0.00014969492195175438 0.000225399122790938 0.00033497429892343785 0.0004813101651604773 0.000642348393122077 0.0007900599153244959 0.000924856441188801 0.001064658884371397 0.0012018072025311518 0.001302133175859918 0.0013490440679071716 0.001362676440433753 0.001365906690206462 0.001351779530975574 0.0012975573945890678 0.0011973429792128622 0.0010633634004518985 0.0009055757124909065 0.000731338663629735 0.0005603349195352457 0.00041543744447833776 0.0003006000119108408 0.00020453187540746755 0.00012382628362151075 0.00006979335205074981 0.000046039876205685885 0.000045894925507421364 0.0000502875449438521 0.00006774528075202891 0.00010792134312512648 0.00017215285754228644 0.00025788940385115334 0.000374467510493416 0.0005287625121494397 0.0007038565058097182 0.000870173708364177 0.0010189283889044819 0.0011579051791739616 0.0012756356763438076 0.0013445560159961191 0.0013626764404337534 0.0013618288308587497 0.0013626764404337524 0.0013445560159961178 0.0012756356763438067 0.0011579051791739611 0.0010189283889044812 0.0008701737083641763 0.0007038565058097169 0.0005287625121494376 0.0003744675104934133 0.0002578894038511507 0.00017215285754228438 0.00010792134312512537 0.00006774528075202826 0.00005028754494385194 0.00004194324107621028 0.00004603987620568613 0.00006979335205075044 0.0001238262836215117 0.00020453187540746956 0.00030060001191084345 0.00041543744447834047 0.0005603349195352479 0.0007313386636297368 0.0009055757124909078 0.0010633634004519 0.0011973429792128635 0.0012975573945890693 0.0013517795309755751 0.0013659066902064626 0.0013626764404337526 0.0013490440679071705 0.0013021331758599171 0.001201807202531152 0.0010646588843713982 0.0009248564411888022 0.0007900599153244963 0.0006423483931220763 0.00048131016516047545 0.0003349742989234354 0.00022539912279093542 0.00014969492195175238 0.00009660617943874795 0.00006378627298063474 0.00004804046316260086 0.000035973655853700724 0.00004185228624762049 0.00007273331620749024 0.00014001957347210118 0.00023703570095634648 0.00034400341974442846 0.0004557180282623771 0.0005865215698875171 0.0007465776724080136 0.0009218909549822131 0.0010826685402583547 0.001206567029440291 0.0012883678922504824 0.0013339022226082544 0.0013517795309755743 0.001344556015996118 0.001302133175859917 0.0012123734799485135 0.001081557970226023 0.0009370424568941321 0.0008039528511211492 0.000681430400553741 0.000551997357356173 0.00041445894177783875 0.00028981639018622706 0.00019570183389348595 0.00013107499389271212 0.00008633426488525703 0.000057732138178059735 0.00004246476366108836 0.00003494468682887012 0.0000423376470695797 0.0000749498603295947 0.00014552776986352593 0.00024962684893334053 0.00036504846722240907 0.000478789260105039 0.0006045988410517462 0.0007619127265753575 0.0009416347748850411 0.0011029764516615219 0.0012098210104861324 0.0012632413019571802 0.001288367892250482 0.0012975573945890684 0.001275635676343807 0.0012018072025311516 0.0010815579702260227 0.0009448279369217387 0.0008161527036543706 0.0006992403467680988 0.0005841060597842311 0.0004633564042267088 0.0003443313341783647 0.00024181346590353416 0.00016417085279852233 0.00010991083482162034 0.00007319711621452028 0.00005081018743245121 0.00003927679355651635 0.00003732366030448117 0.00004471729841545039 0.0000738626941141338 0.00013880284057141094 0.00023905748114611038 0.00035604221904844056 0.0004735132988821229 0.0006011759042085226 0.0007609761381989913 0.0009450532555018918 0.0011033690494170357 0.0011893217655105735 0.001209821010486132 0.0012065670294402905 0.0011973429792128622 0.0011579051791739607 0.0010646588843713969 0.0009370424568941306 0.0008161527036543691 0.0007164119706880187 0.0006206635119981504 0.0005122217700908238 0.00039576518507256016 0.00028905809407731557 0.00020289046441401652 0.00013719159990130674 0.00008970530400963028 0.00005906705547390435 0.00004365864520425199 0.00003818257149019959 0.000035571857509314636 0.00004323547790220683 0.00006945342397726568 0.0001283487718381392 0.00022075191810651108 0.0003314013116227069 0.0004446288697689961 0.0005666602319166277 0.000717866529654296 0.0008912224146887208 0.0010359122065182213 0.001103369049417035 0.0011029764516615206 0.0010826685402583539 0.0010633634004518985 0.001018928388904481 0.0009248564411888008 0.0008039528511211472 0.0006992403467680964 0.0006206635119981487 0.0005424395332519948 0.0004453625188348333 0.00033999731898394156 0.00024777767599729067 0.00017592000902818327 0.00011896774347643848 0.00007498642144383677 0.000047011506752508744 0.000035385816829217066 0.00003378055041345714 0.000028324619977963917 0.00003682836488374965 0.00006258753462346646 0.00011796120117655025 0.00020226617109820802 0.0003003899004650723 0.0003988059216545899 0.0005030317145494102 0.0006296342986623023 0.0007727221740842499 0.0008912224146887202 0.0009450532555018906 0.0009416347748850399 0.0009218909549822113 0.0009055757124909062 0.0008701737083641757 0.0007900599153244949 0.0006814304005537387 0.0005841060597842278 0.0005122217700908206 0.00044536251883483136 0.00036608700067568175 0.0002817392936413651 0.0002087267249035106 0.000151542061684409 0.00010322000910759298 0.00006307845147368776 0.000037064620009627816 0.000026711709509457082 0.00002584965898538618 0.000022541579159479987 0.000030180522486130877 0.00005384413321553908 0.00010298248083767142 0.00017486743176160693 0.0002556769954001589 0.00033639172392144147 0.00042223688521968557 0.000522213776046086 0.0006296342986623016 0.0007178665296542948 0.0007609761381989897 0.0007619127265753557 0.0007465776724080118 0.0007313386636297346 0.0007038565058097165 0.0006423483931220753 0.0005519973573561715 0.00046335640422670604 0.0003957651850725567 0.0003399973189839388 0.00028173929364136365 0.00022033393740473112 0.0001648417828318429 0.00012021240778397634 0.00008184139687993215 0.000049668293720318825 0.000028766629952460085 0.000020711875659536752 0.000020532050107828385 0.000020434020735809907 0.000025034130620911244 0.000042629439945226186 0.00007998449698244254 0.00013378777557352875 0.00019532748400062942 0.0002623235230572611 0.0003384606851108115 0.0004222368852196851 0.0005030317145494095 0.0005666602319166264 0.0006011759042085212 0.0006045988410517447 0.0005865215698875151 0.0005603349195352459 0.0005287625121494381 0.0004813101651604754 0.0004144589417778384 0.0003443313341783635 0.0002890580940773134 0.00024777767599728833 0.00020872672490350886 0.0001648417828318422 0.00012121774671322424 0.00008587912888930793 0.00005799357828135468 0.000036419779238964504 0.00002257217715926288 0.00001784863927513466 0.0000190883821843211 0.000017412833723629965 0.000019548538281866352 0.000031057107119731086 0.00005616002450130904 0.00009205475009133861 0.00013600659857995525 0.00019199258158379055 0.0002623235230572614 0.0003363917239214416 0.0003988059216545896 0.00044462886976899573 0.00047351329888212207 0.0004787892601050378 0.0004557180282623754 0.00041543744447833874 0.00037446751049341427 0.00033497429892343633 0.0002898163901862277 0.00024181346590353454 0.00020289046441401593 0.0001759200090281825 0.00015154206168440827 0.0001202124077839762 0.00008587912888930825 0.000058839255895104684 0.0000404636980359114 0.000027686800341348983 0.000019053487707614232 0.000016053898680696598 0.000017076032718197743 0.000010512830864499604 0.00001299998014039669 0.000022238587657548094 0.0000397606844458738 0.00006284740975602143 0.00009243873198667693 0.00013600659857995528 0.00019532748400062966 0.00025567699540015893 0.00030038990046507227 0.0003314013116227064 0.00035604221904843975 0.0003650484672224079 0.0003440034197444268 0.00030060001191084177 0.00025788940385115176 0.00022539912279093683 0.00019570183389348693 0.00016417085279852353 0.00013719159990130723 0.00011896774347643869 0.00010322000910759308 0.00008184139687993265 0.00005799357828135557 0.000040463698035912094 0.000030050283810161392 0.00002242632725749212 0.000015486976475090375 0.00001141515472012588 0.00001052040382183519 0.000004556866447378755 0.000008151547957646456 0.000016996134178814386 0.000030311141079119407 0.00004485817630947493 0.0000628474097560218 0.00009205475009133893 0.00013378777557352943 0.0001748674317616075 0.00020226617109820832 0.000220751918106511 0.0002390574811461098 0.0002496268489333395 0.00023703570095634507 0.000204531875407468 0.0001721528575422854 0.0001496949219517536 0.00013107499389271345 0.00010991083482162192 0.00008970530400963177 0.00007498642144383812 0.00006307845147368902 0.000049668293720320214 0.000036419779238966354 0.000027686800341350558 0.000022426327257493204 0.000016997532666014656 0.00001043272197792881 0.000005542266168582924 0.000003983409389721539 0.0000024559531885517627 0.000005535614846580171 0.00001291219702517993 0.000022149799803209 0.00003031114107911963 0.000039760684445874345 0.00005616002450130953 0.00007998449698244325 0.00010298248083767175 0.00011796120117655056 0.00012834877183813878 0.00013880284057141024 0.00014552776986352482 0.00014001957347209963 0.00012382628362151042 0.00010792134312512567 0.00009660617943874856 0.00008633426488525782 0.00007319711621452144 0.00005906705547390559 0.00004701150675251003 0.00003706462000962928 0.00002876662995246159 0.00002257217715926501 0.000019053487707616333 0.000015486976475092236 0.0000104327219779297 0.000005404657006734469 0.0000025097644122407176 0.0000020367229778548194 0.0000021373228939778095 0.0000036084647764509243 0.00000804868882886463 0.000012912197025180331 0.00001699613417881494 0.00002223858765754882 0.000031057107119731594 0.0000426294399452267 0.00005384413321553943 0.00006258753462346658 0.0000694534239772654 0.00007386269411413315 0.0000749498603295937 0.00007273331620748898 0.00006979335205074949 0.00006774528075202831 0.000063786272980635 0.0000577321381780602 0.00005081018743245223 0.00004365864520425314 0.000035385816829218516 0.000026711709509458495 0.000020711875659538334 0.000017848639275136526 0.000016053898680698733 0.000011415154720127911 0.000005542266168584369 0.0000025097644122414376 0.0000023858417075114697 0.0000027626156523688075 0.0000015727588389643586 0.0000018701035482071881 0.0000036084647764512254 0.000005535614846580862 0.000008151547957647203 0.000012999980140397454 0.000019548538281866796 0.000025034130620911597 0.00003018052248613109 0.00003682836488374957 0.00004323547790220643 0.00004471729841544972 0.00004233764706957879 0.000041852286247619465 0.000046039876205685445 0.000050287544943851696 0.000048040463162600735 0.00004246476366108848 0.00003927679355651678 0.0000381825714902004 0.00003378055041345832 0.00002584965898538748 0.00002053205010782981 0.000019088382184322947 0.00001707603271819972 0.000010520403821837366 0.000003983409389723301 0.0000020367229778561213 0.0000027626156523694517 0.000002858921751764244 9.817260510201408E-7 0.0000021373228939813857 0.000003996439040513987 0.000006004795496699741 0.000009341733308211779 0.000014781998225038171 0.000020781451388428117 0.000025213591859049242 0.00002907783457792838 0.000034395759926611653 0.0000413193852483205 0.000046397958466131 0.00004926469609027378 0.00005216389130005138 0.0000553474402433334 0.00005704904950991157 0.00005534744024333362 0.00005216389130005127 0.00004926469609027324 0.00004639795846613046 0.000041319385248319955 0.000034395759926610244 0.000029077834577926698 0.000025213591859047345 0.00002078145138842603 0.000014781998225036355 0.000009341733308210477 0.0000060047954966988465 0.000003996439040513506 0.000002137322893981196 0.0000021373228939808716 0.0000027626156523715595 0.000002385841707513484 0.0000025097644122428716 0.00000554226616858484 0.000011415154720127828 0.00001605389868069832 0.000017848639275136248 0.00002071187565953805 0.000026711709509458193 0.000035385816829217527 0.00004365864520425237 0.00005081018743245086 0.0000577321381780593 0.00006378627298063418 0.00006774528075202785 0.0000697933520507491 0.00007273331620748857 0.00007494986032959292 0.00007386269411413235 0.00006945342397726454 0.00006258753462346589 0.00005384413321553909 0.00004262943994522706 0.00003105710711973233 0.00002223858765755019 0.000016996134178816845 0.00001291219702518283 0.000008048688828867482 0.000003608464776454052 0.000003996439040513075 0.0000023858417075130405 6.283755755600709E-7 6.970502856839491E-7 0.0000032397046829942637 0.000007875181309266322 0.00001132604885683347 0.00001323928814553792 0.00001916527902950354 0.000029796252276296665 0.00004244351625248921 0.000055340012144678935 0.00006872525418735631 0.00008108726648983381 0.00009111223839643629 0.0001009865955692158 0.00011389516179237136 0.0001291653947954474 0.00013665578847337002 0.00013267912482792065 0.0001251445831073876 0.00011779395139745095 0.00010487748323798 0.00008197322550826215 0.000057456869677795186 0.00004136804712597341 0.00003342638176964166 0.000026517972173532293 0.000016860768505252787 0.000008048688828867311 0.000006004795496698804 0.000002509764412242281 6.970502856836598E-7 0.00000210345413853406 0.000004768890798279119 0.00000743690503610258 0.000009782308601454668 0.000013352842787482394 0.00002325992677889557 0.0000381200977722772 0.00005348677304968866 0.00007040658488428554 0.00009227334361629819 0.00011571395533526819 0.00013678820046357412 0.0001608040602893099 0.0001937282923613049 0.00022688081584744393 0.00023897829057065157 0.0002281113462259244 0.0002138467588570359 0.00020424986233035116 0.00018588342694629103 0.00014795151506898899 0.0001045802073061642 0.00007448828453249649 0.000057817829717251914 0.00004337238133691328 0.00002651797217353242 0.000012912197025182901 0.000009341733308210855 0.000005542266168584212 0.000003239704682993852 0.000004768890798279055 0.000008699922739315374 0.000011558312453101056 0.00001433077570750724 0.000021744405128661447 0.00003722540034797436 0.00005473562818606974 0.00006978108319975302 0.00008929388863324293 0.00012122019196753916 0.0001613491010113378 0.00020099329412540356 0.00024459489967905944 0.000299980327941695 0.0003533047695374995 0.0003746363628123272 0.00036059264973204076 0.0003382569558404374 0.0003206654954183211 0.0002900741872742535 0.00023213625592551543 0.0001657061623183757 0.0001159460434494748 0.0000841340859818303 0.00005781782971725231 0.00003342638176964209 0.000016996134178817282 0.00001478199822503726 0.000011415154720127218 0.000007875181309265949 0.000007436905036102507 0.0000115583124531012 0.00001716538851728464 0.000024903658690918604 0.00003947296941473771 0.00006174356940784497 0.00008236911364063759 0.00009890637973825997 0.00012413553643969962 0.00016975481507747303 0.00023073618568791363 0.00029156831156405523 0.00035198131564532874 0.00042271980596803336 0.0004938311102070534 0.000532876705549302 0.0005270594962774765 0.0004984623059909894 0.0004633285841213855 0.0004090335134792757 0.0003264489629536636 0.00023726111223035316 0.00016665216540789774 0.00011594604344947545 0.00007448828453249743 0.00004136804712597433 0.000022238587657551093 0.000020781451388427256 0.000016053898680697737 0.000011326048856832987 0.000009782308601454584 0.000014330775707507347 0.000024903658690918445 0.00004128492951896332 0.00006383462345803208 0.00009202995412545335 0.00011899803177516591 0.0001453677778402728 0.00018599940050380604 0.0002543426496727875 0.0003431122089624043 0.0004273720105761922 0.0004998642579464924 0.0005759894400297521 0.0006575346592259328 0.0007162791068696818 0.0007261632918973094 0.0006923623475488193 0.0006304765274554537 0.0005429488252746256 0.00043445457211483004 0.00032649751656326544 0.00023726111223035384 0.00016570616231837695 0.00010458020730616559 0.00005745686967779637 0.00003105710711973362 0.000025213591859048513 0.000017848639275135902 0.000013239288145537783 0.000013352842787482574 0.000021744405128662003 0.00003947296941473812 0.00006383462345803264 0.00009202547110128832 0.0001254154478450814 0.00016298950258330578 0.0002082531196669474 0.00027449300329203283 0.0003738581341875558 0.0004963521413852157 0.0006092634042455426 0.0006972250267069901 0.000777491075557374 0.0008649531896832557 0.0009395915246891037 0.000963234949391186 0.0009202033550585047 0.0008239745350408541 0.0006969509137475141 0.0005606707485081437 0.00043445457211483085 0.0003264489629536649 0.0002321362559255171 0.00014795151506899075 0.00008197322550826355 0.00004262943994522839 0.000029077834577927704 0.0000207118756595376 0.00001916527902950326 0.000023259926778895813 0.000037225400347975044 0.0000617435694078454 0.0000920299541254542 0.00012541544784508153 0.00016606419909648878 0.00021817936648991368 0.0002867002807287315 0.0003796380781566135 0.0005052944369660894 0.0006561523056794495 0.0008015254916949653 0.0009190083262633692 0.0010183403054298283 0.0011191498215588778 0.0012087368131948224 0.0012408721734380671 0.0011822360315786298 0.0010447624265133978 0.000870308782622395 0.0006969509137475146 0.000542948825274627 0.0004090335134792773 0.00029007418727425554 0.00018588342694629274 0.00010487748323798141 0.00005384413321554032 0.000034395759926611206 0.00002671170950945782 0.000029796252276296618 0.00003812009777227761 0.00005473562818607074 0.00008236911364063883 0.00011899803177516728 0.00016298950258330675 0.00021817936648991452 0.00029029939436916124 0.0003820241157457605 0.0004938979088174669 0.0006317512268016343 0.0007970503483696824 0.0009705099287999358 0.0011270689633863353 0.0012624736503087067 0.0013888305176585206 0.001494949249301127 0.0015311746859497813 0.0014533516270413816 0.0012722104792645434 0.0010447624265133987 0.0008239745350408559 0.000630476527455456 0.0004633285841213879 0.0003206654954183236 0.0002042498623303531 0.00011779395139745253 0.00006258753462346703 0.000041319385248320145 0.00003538581682921707 0.000042443516252489176 0.00005348677304968902 0.00006978108319975416 0.000098906379738261 0.00014536777784027467 0.0002082531196669491 0.00028670028072873304 0.00038202411574576146 0.000493614023555863 0.0006199289354965157 0.000766854104188563 0.0009407587239141569 0.0011311065461327978 0.0013145279401521061 0.0014775571166893019 0.0016224551241649794 0.0017355804206419642 0.0017673346539450873 0.0016700548810745658 0.0014533516270413827 0.0011822360315786313 0.0009202033550585067 0.0006923623475488217 0.0004984623059909914 0.0003382569558404394 0.00021384675885703717 0.0001251445831073882 0.000069453423977265 0.00004639795846613058 0.000043658645204251674 0.00005534001214467875 0.00007040658488428546 0.00008929388863324351 0.00012413553643970078 0.00018599940050380767 0.0002744930032920348 0.00037963807815661547 0.000493897908817469 0.0006199289354965168 0.0007654503468072623 0.0009350204265439997 0.0011239034969201724 0.0013165680957763388 0.0014941165032954476 0.0016478117139200597 0.001779416797872281 0.0018739209437563806 0.0018846393517467884 0.001767334653945088 0.0015311746859497826 0.0012408721734380693 0.0009632349493911884 0.0007261632918973119 0.0005270594962774786 0.00036059264973204244 0.00022811134622592542 0.00013267912482792135 0.00007386269411413248 0.000049264696090273226 0.000050810187432450355 0.00006872525418735568 0.00009227334361629783 0.00012122019196753981 0.00016975481507747376 0.00025434264967278926 0.0003738581341875577 0.0005052944369660916 0.0006317512268016368 0.0007668541041885653 0.0009350204265440004 0.0011362470259058453 0.0013402003972896616 0.0015145682355305664 0.0016503940612064283 0.001758561840287146 0.0018474983033848536 0.0018998605429481883 0.0018739209437563808 0.0017355804206419657 0.0014949492493011288 0.0012087368131948246 0.0009395915246891058 0.0007162791068696841 0.0005328767055493037 0.0003746363628123286 0.00023897829057065227 0.00013665578847337018 0.00007494986032959281 0.00005216389130005117 0.0000577321381780588 0.00008108726648983337 0.0001157139553352678 0.0001613491010113379 0.00023073618568791434 0.00034311220896240556 0.0004963521413852176 0.0006561523056794515 0.0007970503483696849 0.0009407587239141593 0.0011239034969201742 0.0013402003972896627 0.001536173869727399 0.0016687172925344592 0.0017464322160936922 0.001801726194786024 0.0018436353554615215 0.0018474983033848543 0.001779416797872282 0.0016224551241649805 0.0013888305176585221 0.0011191498215588796 0.0008649531896832576 0.0006575346592259345 0.0004938311102070548 0.00035330476953750043 0.00022688081584744429 0.00012916539479544751 0.00007273331620748844 0.00005534744024333344 0.00006378627298063387 0.00009111223839643554 0.00013678820046357347 0.00020099329412540356 0.0002915683115640556 0.00042737201057619316 0.0006092634042455439 0.0008015254916949667 0.0009705099287999377 0.0011311065461328 0.0013165680957763404 0.0015145682355305675 0.0016687172925344597 0.001746878230703638 0.0017766517541786208 0.001796369665921988 0.0018017261947860235 0.001758561840287146 0.0016478117139200597 0.001477557116689303 0.0012624736503087078 0.0010183403054298296 0.0007774910755573752 0.0005759894400297536 0.0004227198059680342 0.00029998032794169586 0.00019372829236130528 0.00011389516179237105 0.0000697933520507489 0.00005704904950991158 0.00006774528075202734 0.0001009865955692151 0.000160804060289309 0.00024459489967905917 0.00035198131564532896 0.000499864257946493 0.0006972250267069912 0.0009190083262633707 0.001127068963386337 0.0013145279401521083 0.0014941165032954493 0.0016503940612064298 0.0017464322160936927 0.001776651754178621 0.0017783579871622293 0.0017766517541786201 0.0017464322160936911 0.0016503940612064283 0.001494116503295448 0.0013145279401521072 0.0011270689633863366 0.0009190083262633707 0.0006972250267069915 0.0004998642579464938 0.00035198131564533 0.00024459489967906025 0.00016080406028930996 0.00010098659556921567 0.00006774528075202769 0.00005534744024333359 0.00006979335205074866 0.00011389516179237051 0.0001937282923613042 0.0002999803279416947 0.000422719805968033 0.0005759894400297524 0.0007774910755573744 0.0010183403054298294 0.0012624736503087084 0.001477557116689304 0.0016478117139200612 0.0017585618402871474 0.0018017261947860248 0.001796369665921989 0.0017766517541786201 0.0017468782307036366 0.0016687172925344584 0.0015145682355305666 0.0013165680957763393 0.0011311065461327991 0.0009705099287999369 0.0008015254916949664 0.0006092634042455439 0.00042737201057619387 0.0002915683115640564 0.0002009932941254045 0.00013678820046357428 0.00009111223839643611 0.00006378627298063429 0.0000521638913000515 0.00007273331620748843 0.00012916539479544703 0.00022688081584744317 0.00035330476953749913 0.0004938311102070532 0.0006575346592259329 0.0008649531896832562 0.0011191498215588785 0.0013888305176585215 0.001622455124164981 0.0017794167978722824 0.0018474983033848554 0.0018436353554615223 0.0018017261947860241 0.0017464322160936916 0.0016687172925344586 0.0015361738697273984 0.001340200397289662 0.001123903496920173 0.000940758723914158 0.0007970503483696835 0.0006561523056794508 0.0004963521413852175 0.00034311220896240604 0.000230736185687915 0.00016134910101133857 0.00011571395533526843 0.00008108726648983387 0.00005773213817805945 0.00004926469609027361 0.00007494986032959294 0.0001366557884733698 0.000238978290570651 0.0003746363628123271 0.0005328767055493019 0.0007162791068696823 0.0009395915246891042 0.0012087368131948237 0.0014949492493011283 0.001735580420641966 0.0018739209437563821 0.0018998605429481905 0.0018474983033848554 0.0017585618402871472 0.0016503940612064294 0.0015145682355305677 0.0013402003972896631 0.0011362470259058466 0.0009350204265440007 0.0007668541041885645 0.0006317512268016359 0.0005052944369660914 0.0003738581341875579 0.00025434264967278975 0.00016975481507747428 0.00012122019196754014 0.00009227334361629816 0.0000687252541873562 0.00005081018743245112 0.000046397958466130725 0.00007386269411413237 0.0001326791248279205 0.00022811134622592366 0.00036059264973204043 0.0005270594962774761 0.0007261632918973096 0.0009632349493911864 0.001240872173438068 0.0015311746859497822 0.0017673346539450884 0.0018846393517467895 0.0018739209437563828 0.001779416797872283 0.0016478117139200614 0.0014941165032954493 0.0013165680957763408 0.0011239034969201748 0.0009350204265440018 0.0007654503468072631 0.000619928935496517 0.0004938979088174686 0.0003796380781566157 0.0002744930032920351 0.00018599940050380802 0.0001241355364397008 0.00008929388863324346 0.00007040658488428528 0.00005534001214467892 0.0000436586452042522 0.00004131938524832026 0.00006945342397726467 0.00012514458310738735 0.0002138467588570351 0.000338256955840437 0.0004984623059909889 0.0006923623475488193 0.0009202033550585049 0.0011822360315786303 0.0014533516270413829 0.0016700548810745673 0.0017673346539450892 0.001735580420641967 0.001622455124164982 0.0014775571166893047 0.0013145279401521092 0.001131106546132801 0.0009407587239141606 0.0007668541041885666 0.0006199289354965183 0.0004936140235558652 0.000382024115745763 0.00028670028072873423 0.00020825311966695008 0.0001453677778402752 0.0000989063797382611 0.00006978108319975388 0.00005348677304968862 0.00004244351625248937 0.000035385816829217384 0.00003439575992661075 0.00006258753462346604 0.00011779395139745125 0.00020424986233035043 0.00032066549541832077 0.0004633285841213848 0.0006304765274554535 0.0008239745350408543 0.0010447624265133982 0.001272210479264544 0.0014533516270413837 0.001531174685949784 0.0014949492493011303 0.001388830517658523 0.0012624736503087095 0.001127068963386338 0.0009705099287999389 0.0007970503483696857 0.0006317512268016386 0.0004938979088174708 0.0003820241157457642 0.000290299394369164 0.0002181793664899162 0.00016298950258330808 0.00011899803177516751 0.0000823691136406385 0.00005473562818606978 0.0000381200977722764 0.00002979625227629616 0.000026711709509457292 0.00002907783457792725 0.00005384413321553934 0.00010487748323798032 0.00018588342694629055 0.0002900741872742531 0.00040903351347927494 0.0005429488252746249 0.0006969509137475136 0.0008703087826223946 0.0010447624265133991 0.001182236031578632 0.00124087217343807 0.0012087368131948255 0.0011191498215588804 0.0010183403054298307 0.0009190083262633721 0.000801525491694968 0.0006561523056794529 0.0005052944369660935 0.00037963807815661775 0.00028670028072873575 0.00021817936648991685 0.0001660641990964909 0.00012541544784508313 0.00009202995412545457 0.00006174356940784516 0.00003722540034797393 0.00002325992677889447 0.00001916527902950255 0.000020711875659536765 0.000025213591859047883 0.000042629439945227365 0.00008197322550826253 0.00014795151506898877 0.00023213625592551497 0.00032644896295366284 0.0004344545721148293 0.0005606707485081431 0.000696950913747514 0.0008239745350408555 0.0009202033550585068 0.0009632349493911887 0.0009395915246891063 0.0008649531896832579 0.0007774910755573756 0.0006972250267069928 0.0006092634042455452 0.0004963521413852191 0.0003738581341875603 0.000274493003292037 0.0002082531196669518 0.00016298950258330903 0.00012541544784508356 0.00009202547110128986 0.00006383462345803265 0.00003947296941473735 0.000021744405128660332 0.000013352842787480663 0.000013239288145536595 0.000017848639275134693 0.000020781451388426948 0.00003105710711973318 0.000057456869677795945 0.00010458020730616448 0.00016570616231837576 0.0002372611122303529 0.00032649751656326506 0.0004344545721148304 0.0005429488252746265 0.0006304765274554557 0.0006923623475488219 0.000726163291897312 0.0007162791068696847 0.0006575346592259347 0.0005759894400297539 0.0004998642579464946 0.000427372010576195 0.0003431122089624073 0.0002543426496727917 0.00018599940050380962 0.00014536777784027708 0.00011899803177516887 0.00009202995412545545 0.0000638346234580331 0.00004128492951896302 0.000024903658690917228 0.000014330775707505503 0.00000978230860145257 0.000011326048856831784 0.000016053898680696832 0.00001478199822503725 0.000022238587657551035 0.00004136804712597435 0.00007448828453249694 0.00011594604344947506 0.00016665216540789763 0.00023726111223035346 0.0003264489629536644 0.0004090335134792767 0.0004633285841213871 0.0004984623059909912 0.0005270594962774785 0.0005328767055493038 0.0004938311102070544 0.0004227198059680341 0.0003519813156453301 0.00029156831156405713 0.00023073618568791556 0.00016975481507747544 0.0001241355364397018 0.00009890637973826253 0.00008236911364063934 0.00006174356940784596 0.00003947296941473778 0.000024903658690917296 0.000017165388517282642 0.000011558312453098908 0.000007436905036100288 0.000007875181309264785 0.000011415154720126562 0.000009341733308211362 0.000016996134178817797 0.00003342638176964267 0.00005781782971725264 0.0000841340859818309 0.0001159460434494757 0.00016570616231837692 0.0002321362559255168 0.0002900741872742551 0.00032066549541832294 0.0003382569558404392 0.0003605926497320423 0.00037463636281232843 0.00035330476953750005 0.0002999803279416953 0.0002445948996790601 0.00020099329412540448 0.00016134910101133878 0.00012122019196754075 0.00008929388863324417 0.00006978108319975487 0.00005473562818607066 0.0000372254003479746 0.000021744405128660878 0.000014330775707505504 0.000011558312453098906 0.000008699922739313134 0.000004768890798277165 0.0000032397046829931215 0.000005542266168584141 0.000006004795496699644 0.000012912197025183723 0.000026517972173533272 0.00004337238133691402 0.00005781782971725297 0.0000744882845324978 0.00010458020730616577 0.0001479515150689906 0.00018588342694629233 0.00020424986233035235 0.0002138467588570364 0.00022811134622592488 0.00023897829057065178 0.00022688081584744353 0.00019372829236130438 0.00016080406028930945 0.00013678820046357374 0.00011571395533526792 0.000092273343616298 0.00007040658488428555 0.00005348677304968876 0.00003812009777227678 0.000023259926778894647 0.000013352842787480995 0.000009782308601452464 0.000007436905036100242 0.000004768890798276993 0.000002103454138532517 6.970502856833257E-7 0.0000025097644122426328 0.000003996439040514289 0.000008048688828868533 0.000016860768505253996 0.000026517972173533455 0.000033426381769643115 0.000041368047125975154 0.000057456869677797124 0.00008197322550826404 0.00010487748323798178 0.00011779395139745266 0.00012514458310738821 0.0001326791248279212 0.00013665578847337024 0.00012916539479544686 0.0001138951617923706 0.00010098659556921528 0.00009111223839643561 0.00008108726648983308 0.0000687252541873559 0.000055340012144678453 0.00004244351625248936 0.00002979625227629596 0.000019165279029502547 0.00001323928814553634 0.000011326048856831317 0.000007875181309264238 0.0000032397046829926785 6.970502856830178E-7 6.283755755602484E-7 0.0000023858417075138655 0.0000021373228939816737 0.0000036084647764549282 0.000008048688828868455 0.000012912197025183933 0.000016996134178818275 0.00002223858765755196 0.00003105710711973445 0.000042629439945228917 0.00005384413321554071 0.00006258753462346711 0.00006945342397726515 0.00007386269411413275 0.000074949860329593 0.00007273331620748825 0.00006979335205074847 0.00006774528075202721 0.00006378627298063388 0.00005773213817805891 0.00005081018743245061 0.0000436586452042516 0.00003538581682921696 0.00002671170950945692 0.000020711875659536427 0.000017848639275134394 0.000016053898680696222 0.000011415154720125956 0.0000055422661685834875 0.0000025097644122421343 0.0000023858417075135064 0.0000027626156523720665 0.0000011014415294991077 0.000002455953188553955 0.0000060047954966982095 0.000011308388178076347 0.00001742322569700267 0.00002394546061241311 0.00003183885277159619 0.0000415809541746676 0.0000515750193740359 0.00006028885013159655 0.00006927841106991377 0.00007921512669109803 0.00008836635431708553 0.00009296217033426626 0.00009223278715530755 0.00009102652667143207 0.00009223278715530755 0.00009296217033426648 0.00008836635431708553 0.00007921512669109847 0.00006927841106991431 0.000060288850131596985 0.00005157501937403579 0.00004158095417466782 0.00003183885277159619 0.000023945460612413 0.000017423225697002563 0.00001130838817807594 0.000006004795496697966 0.0000024559531885535486 0.0000024559531885538493 0.0000020367229778568345 0.000002509764412241785 0.000005404657006734887 0.000010432721977928987 0.000015486976475090745 0.000019053487707614324 0.000022572177159262686 0.0000287666299524591 0.000037064620009627247 0.00004701150675250798 0.0000590670554739036 0.00007319711621451908 0.00008633426488525536 0.00009660617943874613 0.00010792134312512334 0.00012382628362150855 0.00014001957347209852 0.00014552776986352377 0.00013880284057141018 0.00012834877183813895 0.0001179612011765502 0.00010298248083767106 0.00007998449698244306 0.000056160024501310165 0.00003976068444587551 0.000030311141079121406 0.00002214979980321087 0.000012912197025181922 0.0000055356148465822605 0.000006004795496698422 0.0000025097644122420534 6.970502856830586E-7 0.0000021034541385329567 0.000004768890798277777 0.000007436905036100866 0.000009782308601453003 0.000013352842787480588 0.00002325992677889354 0.00003812009777227517 0.00005348677304968756 0.00007040658488428418 0.00009227334361629697 0.00011571395533526673 0.0001367882004635725 0.00016080406028930788 0.00019372829236130398 0.00022688081584744353 0.0002389782905706519 0.00022811134622592518 0.00021384675885703655 0.0002042498623303507 0.00018588342694628962 0.0001479515150689872 0.00010458020730616249 0.00007448828453249478 0.00005781782971725066 0.00004337238133691192 0.00002651797217353142 0.000012912197025182122 0.000011308388178076672 0.000005404657006735217 0.0000021034541385329617 0.0000025328140596884667 0.00000317877217892394 0.0000031201939834984807 0.000004898912629719532 0.000011059872777091713 0.000026642519656199345 0.00004802404642698151 0.00006835590124955169 0.00009168287533173682 0.00012639541981940454 0.0001683149555407384 0.00020775715760439038 0.0002493944217476879 0.00030167391628042526 0.0003502417832487409 0.000364465513432218 0.0003451011794924644 0.0003245071852586884 0.00031586544220100674 0.0002965114623418749 0.0002452872893603429 0.00018025469510181787 0.00013093515947900205 0.00009994215145477061 0.00007225334020257851 0.000043372381336912186 0.000022149799803211352 0.000017423225697003034 0.00001043272197792939 0.000004768890798277753 0.0000031787721789239 0.000004456594710891686 0.000005160683492612734 0.000007592282948860392 0.000017393788614679816 0.000038268184393989986 0.000062243267721062 0.00008400938969302691 0.00011453422882451952 0.00016700154404711122 0.00023540318016430556 0.0003017151935110238 0.0003666949538984365 0.00044161447486532583 0.0005110280207879582 0.0005378107763058998 0.0005189558821759169 0.000491527841542821 0.0004737128545823631 0.00044009280330434156 0.00036629691993682507 0.0002740329507050847 0.0001991324089233129 0.00014628899357183145 0.0000999421514547705 0.000057817829717250735 0.00003031114107912174 0.000023945460612413552 0.000015486976475091155 0.000007436905036101102 0.0000031201939834985823 0.000005160683492613007 0.000010385853195488016 0.00001880341685770464 0.000035082504194899516 0.000060656874779021644 0.00008687310358683714 0.00011318982875864764 0.0001565403139405482 0.00023267207177716633 0.00033243221307557706 0.00042942899124734265 0.000520989639560758 0.000624626478730455 0.0007311047369061573 0.0007970905713095698 0.0008006309005604029 0.0007669655867827643 0.0007181879547709627 0.0006398426918513255 0.0005202161617967752 0.00038815661933965857 0.0002798504780587137 0.00019913240892331318 0.00013093515947900226 0.00007448828453249514 0.00003976068444587607 0.000031838852771596484 0.000019053487707614723 0.000009782308601453074 0.000004898912629719679 0.0000075922829488607 0.000018803416857704492 0.00003721783122293183 0.00006124525023194392 0.00009092448574327717 0.0001243940374230858 0.00016697925239011875 0.00023652325713133428 0.0003471667243337949 0.00048445332287481833 0.0006161688271076252 0.0007402030304244064 0.0008828322819484 0.001044077037541584 0.0011733734294710797 0.0012183841389811474 0.001176654669354027 0.0010719536575662394 0.0009163199990738546 0.0007258660541463047 0.0005389628394804259 0.0003881566193396585 0.0002740329507050849 0.000180254695101818 0.00010458020730616272 0.00005616002450131056 0.00004158095417466803 0.00002257217715926318 0.000013352842787480771 0.000011059872777091947 0.00001739378861468023 0.00003508250419489966 0.0000612452502319441 0.00008987407423056648 0.0001230483526989908 0.00016905754840345746 0.00023964913362904753 0.00034950119417326926 0.000504257417278923 0.0006838316235267759 0.0008589568636188341 0.001031963980737475 0.0012316737057361765 0.0014604341919198362 0.0016589400069480268 0.0017456059351057581 0.0016880521502273208 0.0015115507963728541 0.0012607018118170803 0.000982944920174478 0.0007258660541463049 0.0005202161617967753 0.00036629691993682545 0.00024528728936034315 0.00014795151506898758 0.00007998449698244356 0.00005157501937403612 0.000028766629952459604 0.00002325992677889374 0.000026642519656199555 0.0000382681843939907 0.000060656874779021197 0.0000909244857432773 0.00012304835269899052 0.00016213711920641744 0.00022463885487634464 0.00032749602997659557 0.0004781079751338984 0.0006692846682037849 0.0008835265101450328 0.0011094531117226164 0.001356002967794807 0.0016396186116322178 0.001946569880229298 0.002204423345366915 0.0023155029140805253 0.002231884518609748 0.0019821064539637767 0.0016349871298253276 0.00126070181181708 0.0009163199990738548 0.0006398426918513257 0.00044009280330434205 0.00029651146234187524 0.00018588342694628995 0.00010298248083767152 0.000060288850131597046 0.000037064620009627355 0.00003812009777227552 0.00004802404642698156 0.00006224326772106227 0.0000868731035868369 0.00012439403742308503 0.00016905754840345634 0.0002246388548763436 0.00031008840053104635 0.00044308360009883004 0.0006217834696838479 0.0008297072438039148 0.0010612533502024877 0.0013314457145501772 0.0016584905708846606 0.0020380349828360155 0.0024239791870858617 0.00272520129786015 0.0028419649976218716 0.002727826283899672 0.0024148623704578053 0.0019821064539637767 0.0015115507963728546 0.0010719536575662394 0.0007181879547709629 0.0004737128545823634 0.000315865442201007 0.00020424986233035102 0.00011796120117655029 0.0000692784110699138 0.00004701150675250792 0.000053486773049687424 0.00006835590124955127 0.0000840093896930271 0.00011318982875864675 0.00016697925239011772 0.00023964913362904555 0.00032749602997659335 0.00044308360009882885 0.0006026697091401581 0.0008023405097078608 0.0010219478720986813 0.0012617286215816479 0.0015544662428557971 0.0019295502396633531 0.002369722530313519 0.002801816126635195 0.0031199679870699925 0.0032284375798712255 0.0030869250399333226 0.002727826283899672 0.002231884518609747 0.0016880521502273204 0.0011766546693540265 0.0007669655867827639 0.0004915278415428208 0.000324507185258688 0.000213846758857036 0.00012834877183813849 0.00007921512669109828 0.00005906705547390353 0.00007040658488428433 0.00009168287533173637 0.00011453422882451954 0.0001565403139405482 0.00023652325713133327 0.00034950119417326736 0.0004781079751338952 0.0006217834696838452 0.0008023405097078591 0.0010287461375446986 0.0012781043115712625 0.001534031609806589 0.0018231338833620294 0.0021839809405514547 0.0026064943852817275 0.003017057632244766 0.003310130795263662 0.003393885837083695 0.003228437579871225 0.0028419649976218707 0.0023155029140805245 0.0017456059351057575 0.0012183841389811468 0.0008006309005604022 0.0005189558821759165 0.00034510117949246375 0.0002281113462259248 0.00013880284057140967 0.0000883663543170857 0.0000731971162145191 0.00009227334361629699 0.00012639541981940468 0.00016700154404711143 0.00023267207177716593 0.0003471667243337946 0.0005042574172789216 0.0006692846682037823 0.0008297072438039117 0.0010219478720986787 0.001278104311571261 0.0015723081188699917 0.0018521698782702958 0.0021135152535489174 0.002399856396544477 0.002728447959614903 0.0030503657603172013 0.00327321590283921 0.0033101307952636615 0.003119967987069992 0.002725201297860149 0.002204423345366914 0.0016589400069480257 0.0011733734294710797 0.0007970905713095692 0.0005378107763058997 0.0003644655134322179 0.00023897829057065162 0.0001455277698635239 0.00009296217033426664 0.00008633426488525539 0.00011571395533526693 0.0001683149555407384 0.00023540318016430578 0.00033243221307557755 0.0004844533228748184 0.0006838316235267754 0.0008835265101450314 0.0010612533502024853 0.0012617286215816453 0.0015340316098065873 0.0018521698782702951 0.0021340427011982506 0.0023443134697092006 0.0025286503275099067 0.002732186407408238 0.0029314670065587107 0.003050365760317202 0.0030170576322447666 0.002801816126635194 0.002423979187085861 0.0019465698802292972 0.0014604341919198357 0.0010440770375415834 0.0007311047369061571 0.0005110280207879579 0.0003502417832487408 0.00022688081584744315 0.00014001957347209846 0.00009223278715530771 0.00009660617943874612 0.0001367882004635726 0.00020775715760439043 0.00030171519351102413 0.0004294289912473429 0.0006161688271076253 0.0008589568636188339 0.0011094531117226151 0.0013314457145501757 0.0015544662428557952 0.0018231338833620276 0.002113515253548916 0.0023443134697092 0.002478914196022791 0.002566043478233657 0.0026569839345356025 0.002732186407408238 0.0027284479596149033 0.0026064943852817267 0.0023697225303135187 0.0020380349828360146 0.0016396186116322173 0.0012316737057361758 0.0008828322819484001 0.0006246264787304548 0.00044161447486532616 0.0003016739162804253 0.00019372829236130362 0.0001238262836215087 0.00009102652667143187 0.00010792134312512311 0.00016080406028930807 0.0002493944217476877 0.00036669495389843673 0.0005209896395607587 0.0007402030304244065 0.0010319639807374755 0.0013560029677948066 0.0016584905708846597 0.001929550239663352 0.002183980940551454 0.002399856396544476 0.002528650327509906 0.002566043478233657 0.002566554332134192 0.002566043478233657 0.0025286503275099063 0.002399856396544478 0.0021839809405514547 0.0019295502396633527 0.0016584905708846602 0.0013560029677948063 0.001031963980737475 0.0007402030304244065 0.0005209896395607582 0.0003666949538984366 0.00024939442174768767 0.0001608040602893077 0.00010792134312512316 0.00009223278715530728 0.00012382628362150817 0.00019372829236130351 0.000301673916280425 0.00044161447486532626 0.0006246264787304553 0.0008828322819484007 0.0012316737057361765 0.0016396186116322178 0.0020380349828360155 0.002369722530313519 0.0026064943852817267 0.002728447959614903 0.002732186407408238 0.002656983934535603 0.0025660434782336576 0.0024789141960227918 0.002344313469709201 0.0021135152535489182 0.0018231338833620296 0.0015544662428557978 0.001331445714550177 0.0011094531117226162 0.000858956863618834 0.0006161688271076254 0.00042942899124734244 0.00030171519351102375 0.00020775715760438986 0.00013678820046357176 0.00009660617943874566 0.00009296217033426606 0.00014001957347209795 0.00022688081584744285 0.0003502417832487404 0.0005110280207879581 0.0007311047369061577 0.0010440770375415838 0.0014604341919198362 0.0019465698802292974 0.002423979187085861 0.0028018161266351945 0.003017057632244766 0.0030503657603172018 0.002931467006558711 0.0027321864074082384 0.0025286503275099067 0.0023443134697092014 0.002134042701198252 0.0018521698782702973 0.0015340316098065901 0.0012617286215816479 0.0010612533502024875 0.0008835265101450324 0.0006838316235267758 0.0004844533228748182 0.000332432213075577 0.00023540318016430497 0.0001683149555407375 0.00011571395533526582 0.00008633426488525487 0.00008836635431708509 0.0001455277698635234 0.0002389782905706513 0.0003644655134322173 0.0005378107763058997 0.0007970905713095697 0.0011733734294710804 0.0016589400069480262 0.0022044233453669144 0.002725201297860149 0.003119967987069992 0.003310130795263661 0.00327321590283921 0.0030503657603172018 0.0027284479596149033 0.002399856396544477 0.0021135152535489174 0.0018521698782702962 0.0015723081188699936 0.0012781043115712635 0.001021947872098681 0.000829707243803914 0.0006692846682037836 0.0005042574172789218 0.00034716672433379427 0.00023267207177716517 0.00016700154404711021 0.00012639541981940348 0.0000922733436162959 0.00007319711621451861 0.00007921512669109774 0.00013880284057140918 0.00022811134622592423 0.0003451011794924629 0.0005189558821759162 0.0008006309005604022 0.001218384138981147 0.0017456059351057575 0.002315502914080524 0.0028419649976218694 0.0032284375798712233 0.0033938858370836937 0.0033101307952636606 0.003017057632244765 0.0026064943852817262 0.0021839809405514534 0.0018231338833620283 0.0015340316098065875 0.001278104311571262 0.0010287461375446982 0.0008023405097078592 0.0006217834696838452 0.0004781079751338956 0.0003495011941732671 0.00023652325713133287 0.00015654031394054724 0.00011453422882451833 0.00009168287533173511 0.00007040658488428338 0.00005906705547390318 0.00006927841106991347 0.00012834877183813794 0.00021384675885703554 0.00032450718525868695 0.0004915278415428202 0.0007669655867827636 0.0011766546693540267 0.0016880521502273202 0.002231884518609747 0.00272782628389967 0.003086925039933321 0.0032284375798712233 0.003119967987069991 0.002801816126635193 0.002369722530313518 0.0019295502396633516 0.0015544662428557956 0.0012617286215816453 0.0010219478720986787 0.0008023405097078575 0.0006026697091401552 0.00044308360009882663 0.0003274960299765926 0.00023964913362904528 0.0001669792523901176 0.00011318982875864644 0.0000840093896930262 0.00006835590124955038 0.000053486773049687085 0.000047011506752507714 0.00006028885013159638 0.0001179612011765492 0.00020424986233035018 0.0003158654422010055 0.00047371285458236244 0.0007181879547709622 0.0010719536575662394 0.0015115507963728541 0.001982106453963776 0.0024148623704578036 0.00272782628389967 0.0028419649976218686 0.0027252012978601476 0.002423979187085859 0.002038034982836014 0.0016584905708846595 0.0013314457145501752 0.0010612533502024845 0.0008297072438039106 0.0006217834696838425 0.00044308360009882527 0.00031008840053104277 0.00022463885487634207 0.0001690575484034562 0.0001243940374230849 0.00008687310358683669 0.00006224326772106136 0.00004802404642698051 0.00003812009777227511 0.00003706462000962671 0.00005157501937403566 0.00010298248083767055 0.00018588342694628924 0.00029651146234187416 0.0004400928033043411 0.0006398426918513254 0.0009163199990738546 0.0012607018118170805 0.0016349871298253274 0.001982106453963776 0.0022318845186097462 0.002315502914080523 0.0022044233453669135 0.0019465698802292966 0.001639618611632217 0.0013560029677948063 0.0011094531117226154 0.0008835265101450306 0.0006692846682037811 0.00047810797513389276 0.00032749602997659037 0.00022463885487634106 0.000162137119206416 0.00012304835269899054 0.00009092448574327762 0.00006065687477902151 0.00003826818439399013 0.000026642519656198918 0.00002325992677889364 0.000028766629952459038 0.000041580954174667214 0.00007998449698244225 0.00014795151506898652 0.0002452872893603417 0.0003662969199368241 0.0005202161617967744 0.0007258660541463044 0.0009829449201744784 0.00126070181181708 0.0015115507963728537 0.0016880521502273193 0.001745605935105757 0.0016589400069480257 0.001460434191919835 0.0012316737057361763 0.0010319639807374757 0.000858956863618834 0.0006838316235267749 0.0005042574172789205 0.0003495011941732654 0.00023964913362904366 0.00016905754840345523 0.00012304835269899014 0.00008987407423056675 0.00006124525023194407 0.00003508250419489967 0.000017393788614679453 0.000011059872777091012 0.000013352842787480358 0.000022572177159262192 0.00003183885277159571 0.000056160024501309494 0.00010458020730616176 0.0001802546951018168 0.00027403295070508384 0.0003881566193396578 0.0005389628394804256 0.0007258660541463049 0.000916319999073855 0.0010719536575662394 0.001176654669354027 0.0012183841389811468 0.0011733734294710804 0.0010440770375415834 0.000882832281948401 0.000740203030424407 0.0006161688271076265 0.0004844533228748181 0.0003471667243337943 0.00023652325713133186 0.00016697925239011707 0.00012439403742308416 0.0000909244857432774 0.00006124525023194411 0.00003721783122293218 0.000018803416857704374 0.00000759228294886021 0.00000489891262971896 0.000009782308601452776 0.000019053487707613866 0.000023945460612412563 0.000039760684445874894 0.00007448828453249404 0.00013093515947900102 0.00019913240892331196 0.00027985047805871273 0.0003881566193396579 0.0005202161617967749 0.0006398426918513256 0.0007181879547709623 0.0007669655867827634 0.0008006309005604021 0.0007970905713095697 0.0007311047369061571 0.0006246264787304555 0.0005209896395607591 0.0004294289912473432 0.0003324322130755768 0.00023267207177716552 0.00015654031394054683 0.00011318982875864624 0.00008687310358683604 0.00006065687477902123 0.00003508250419489931 0.00001880341685770431 0.000010385853195487628 0.000005160683492612503 0.000003120193983497831 0.000007436905036100658 0.000015486976475090074 0.000017423225697002126 0.000030311141079120816 0.00005781782971724982 0.00009994215145476952 0.00014628899357183053 0.00019913240892331218 0.0002740329507050841 0.0003662969199368246 0.0004400928033043415 0.0004737128545823627 0.0004915278415428204 0.0005189558821759162 0.0005378107763058997 0.0005110280207879578 0.0004416144748653268 0.0003666949538984373 0.00030171519351102435 0.00023540318016430513 0.00016700154404711038 0.00011453422882451867 0.00008400938969302649 0.00006224326772106169 0.00003826818439399035 0.000017393788614679833 0.0000075922829488604 0.0000051606834926127 0.000004456594710891556 0.000003178772178923408 0.0000047688907982773585 0.000010432721977928382 0.000011308388178075708 0.000022149799803210498 0.000043372381336911197 0.00007225334020257758 0.0000999421514547696 0.00013093515947900129 0.00018025469510181714 0.00024528728936034234 0.0002965114623418742 0.00031586544220100576 0.0003245071852586869 0.00034510117949246316 0.0003644655134322173 0.0003502417832487405 0.0003016739162804254 0.00024939442174768805 0.0002077571576043903 0.00016831495554073776 0.00012639541981940335 0.0000916828753317356 0.00006835590124955031 0.000048024046426980946 0.00002664251965619906 0.00001105987277709156 0.0000048989126297193256 0.000003120193983498295 0.0000031787721789235633 0.0000025328140596876527 0.000002103454138532271 0.0000054046570067340305 0.000006004795496697858 0.000012912197025181817 0.00002651797217353093 0.00004337238133691148 0.000057817829717250125 0.0000744882845324944 0.00010458020730616219 0.00014795151506898687 0.00018588342694628954 0.00020424986233035037 0.00021384675885703576 0.0002281113462259242 0.00023897829057065148 0.00022688081584744255 0.00019372829236130376 0.0001608040602893079 0.0001367882004635722 0.00011571395533526572 0.00009227334361629608 0.00007040658488428344 0.000053486773049687505 0.00003812009777227526 0.00002325992677889372 0.000013352842787480348 0.000009782308601453135 0.000007436905036100798 0.000004768890798277512 0.0000021034541385321444 6.970502856824662E-7 0.0000025097644122411437 0.000002455953188553523 0.0000055356148465823 0.000012912197025181815 0.000022149799803210827 0.00003031114107912119 0.000039760684445875335 0.00005616002450130997 0.0000799844969824428 0.00010298248083767087 0.00011796120117654938 0.0001283487718381381 0.00013880284057140915 0.00014552776986352363 0.00014001957347209792 0.00012382628362150847 0.00010792134312512295 0.000096606179438746 0.00008633426488525512 0.00007319711621451849 0.0000590670554739035 0.00004701150675250808 0.000037064620009627084 0.00002876662995245912 0.000022572177159262612 0.00001905348770761432 0.000015486976475090545 0.0000104327219779287 0.000005404657006734168 0.000002509764412241259 0.000002036722977856108 0.0000031293124925022556 0.000004556866447381577 0.000009341733308211955 0.000017423225697004243 0.000026593106440489555 0.00003634591631691825 0.000050069925101144585 0.0000700209689794523 0.00009202672100430491 0.00010990207288447281 0.00012443697714305192 0.00013968876242537805 0.0001533803348213029 0.00015775652622948013 0.00015267581316423008 0.00014878985649779465 0.0001526758131642303 0.00015775652622948056 0.00015338033482130311 0.0001396887624253787 0.0001244369771430528 0.00010990207288447433 0.00009202672100430643 0.00007002096897945392 0.00005006992510114556 0.00003634591631691852 0.000026593106440488958 0.000017423225697003593 0.000009341733308211643 0.000004556866447381333 0.000004556866447381576 0.000003983409389724147 0.000005542266168585179 0.000010432721977930493 0.000016997532666015232 0.000022426327257492334 0.00002768680034134916 0.00003641977923896486 0.00004966829372031868 0.00006307845147368834 0.0000749864214438376 0.00008970530400963139 0.00010991083482162048 0.0001310749938927117 0.00014969492195175124 0.00017215285754228324 0.0002045318754074673 0.00023703570095634537 0.0002496268489333403 0.00023905748114611146 0.0002207519181065128 0.0002022661710982108 0.00017486743176160964 0.00013378777557353146 0.00009205475009134094 0.00006284740975602359 0.000044858176309477044 0.00003031114107912231 0.00001699613417881791 0.000008151547957649682 0.000009341733308211723 0.000005542266168585128 0.0000032397046829946783 0.000004768890798279072 0.000008699922739315044 0.000011558312453099845 0.000014330775707506477 0.000021744405128660634 0.00003722540034797373 0.00005473562818606947 0.00006978108319975389 0.00008929388863324299 0.00012122019196753952 0.00016134910101133618 0.00020099329412540237 0.0002445948996790583 0.0002999803279416953 0.0003533047695375013 0.00037463636281233006 0.00036059264973204374 0.00033825695584044097 0.00032066549541832397 0.00029007418727425516 0.00023213625592551564 0.00016570616231837494 0.00011594604344947282 0.00008413408598182838 0.00005781782971725101 0.00003342638176964219 0.00001699613417881771 0.000017423225697004243 0.000010432721977930746 0.000004768890798279305 0.000003178772178925172 0.000004456594710892471 0.00000516068349261315 0.000007592282948861032 0.000017393788614680114 0.00003826818439399077 0.00006224326772106257 0.00008400938969302709 0.00011453422882452001 0.00016700154404711105 0.000235403180164305 0.00030171519351102365 0.00036669495389843684 0.00044161447486532713 0.0005110280207879608 0.0005378107763059025 0.0005189558821759202 0.0004915278415428242 0.0004737128545823665 0.0004400928033043449 0.00036629691993682713 0.00027403295070508584 0.0001991324089233129 0.00014628899357183094 0.00009994215145477048 0.00005781782971725158 0.000030311141079122693 0.00002659310644048955 0.00001699753266601552 0.00000869992273931517 0.0000044565947108927375 0.000004787201589209632 0.0000057707171994394186 0.0000092811650637103 0.000021968432045004513 0.000046950126076282304 0.00007553666539708477 0.00010514847136896235 0.00015191940053495878 0.00023265115775077415 0.00033826785089126777 0.0004417062437438282 0.0005404671613561364 0.000650809913868007 0.0007582882900205607 0.0008160465074447732 0.0008095426567044875 0.000775324106980641 0.0007370114712795593 0.0006706709826168852 0.0005542117430241079 0.00041731035941536596 0.00030362571165412953 0.0002190980462848827 0.0001462889935718313 0.00008413408598182914 0.000044858176309477634 0.000036345916316918954 0.000022426327257493296 0.00001155831245310078 0.000005160683492613845 0.000005770717199440049 0.00001065768400657194 0.00001976722459274499 0.000037990950535600114 0.00006762487901667244 0.00010310204404458373 0.00014673972099954008 0.00021758712571749142 0.00033281035166037254 0.00048101407562923935 0.0006333943940810136 0.0007900615193276615 0.0009736510857595714 0.0011702724834703963 0.0013144301327347942 0.001357619312193841 0.0013149137141692095 0.0012147289412613573 0.001054170370761786 0.000837650187846445 0.00061443423145097 0.00043493165283709927 0.0003036257116541299 0.00019913240892331362 0.00011594604344947383 0.00006284740975602416 0.000050069925101145344 0.00002768680034135033 0.00001433077570750713 0.000007592282948861774 0.000009281165063710936 0.000019767224592745063 0.00003797559959623498 0.0000641857891828636 0.00010089256600215905 0.00015107953004165478 0.00022295862859127917 0.00033287461528254023 0.0004921829205170345 0.0006895470735222093 0.0009066580400836052 0.0011543632072385753 0.0014590527240740756 0.0018004153950183027 0.0020849230176929025 0.0022129533178503248 0.00215753309620079 0.0019497470457856582 0.001629992492352759 0.0012523497139305837 0.0008942164552661246 0.00061443423145097 0.0004173103594153662 0.00027403295070508617 0.00016570616231837532 0.00009205475009134103 0.00007002096897945362 0.000036419779238966543 0.000021744405128662118 0.000017393788614681625 0.000021968432045006332 0.00003799095053560157 0.00006418578918286504 0.00009673607156472298 0.00014055573155341824 0.00021079146292320793 0.0003238747221292818 0.000488359505814756 0.0007011280080980822 0.0009554476063526737 0.0012589495116249166 0.001638503470141067 0.0021106035581529687 0.0026293898016959963 0.0030673464280526826 0.0032799082195145495 0.003200677769729534 0.002863405644151266 0.002355939341597527 0.0017836111952503066 0.001252349713930584 0.0008376501878464447 0.0005542117430241079 0.00036629691993682757 0.00023213625592551594 0.00013378777557353146 0.00009202672100430658 0.000049668293720320905 0.00003722540034797547 0.00003826818439399216 0.00004695012607628424 0.00006762487901667339 0.000100892566002161 0.00014055573155341794 0.00019395528069379335 0.0002871615092159507 0.00044466320001632694 0.0006636557209989313 0.0009232854720992075 0.0012310199292264758 0.0016351864912215184 0.002180842443607052 0.0028541081215029012 0.0035548620122397632 0.004117426952608126 0.004379127580087881 0.004261837790878292 0.003804765825581194 0.003124326272372129 0.0023559393415975263 0.0016299924923527589 0.0010541703707617855 0.0006706709826168848 0.00044009280330434476 0.00029007418727425516 0.00017486743176160947 0.00010990207288447468 0.00006307845147369019 0.00005473562818607131 0.00006224326772106361 0.0000755366653970865 0.00010310204404458526 0.0001510795300416558 0.00021079146292320738 0.00028716150921594987 0.0004103825706411249 0.0006090221462856632 0.0008696279545382154 0.0011583572591615165 0.0015021101566728308 0.0019935386997361353 0.0026987296766766236 0.00356559349575431 0.004422978400784092 0.005065990398946283 0.005337764510923133 0.005174646336827468 0.0046228314730095855 0.0038047658255811936 0.002863405644151265 0.0019497470457856575 0.0012147289412613566 0.0007370114712795587 0.0004737128545823666 0.00032066549541832413 0.00020226617109821073 0.00012443697714305314 0.00007498642144383895 0.00006978108319975496 0.00008400938969302804 0.00010514847136896317 0.00014673972099954046 0.00022295862859127987 0.0003238747221292813 0.0004446632000163255 0.000609022146285663 0.0008478810904686633 0.0011458895699827541 0.001460493792564863 0.0018252040088143613 0.0023618270227441967 0.0031582873446044644 0.004139463137881498 0.005081308636276989 0.005751359337704071 0.00600452093612034 0.005795395785142974 0.005174646336827468 0.00426183779087829 0.003200677769729532 0.0021575330962007888 0.001314913714169208 0.0007753241069806399 0.0004915278415428239 0.0003382569558404406 0.00022075191810651308 0.0001396887624253793 0.00008970530400963235 0.00008929388863324446 0.00011453422882452027 0.00015191940053495932 0.00021758712571749264 0.00033287461528254034 0.0004883595058147556 0.0006636557209989296 0.0008696279545382143 0.0011458895699827526 0.001490218126094515 0.0018515398190606298 0.002240658034798414 0.002773962381173297 0.003552837721414815 0.004510620325940204 0.0054211106133543185 0.006050605342605956 0.0062588429466127376 0.0060045209361203385 0.00533776451092313 0.004379127580087878 0.003279908219514547 0.0022129533178503226 0.0013576193121938392 0.0008095426567044858 0.0005189558821759193 0.00036059264973204396 0.00023905748114611154 0.00015338033482130387 0.00010991083482162193 0.00012122019196754055 0.0001670015440471118 0.0002326511577507751 0.0003328103516603732 0.0004921829205170356 0.0007011280080980815 0.0009232854720992061 0.0011583572591615156 0.001460493792564862 0.0018515398190606294 0.0022749560695569785 0.002694549901459466 0.003183343133357702 0.0038416187382218974 0.004640662862214505 0.005402100311051645 0.005918258582049202 0.0060506053426059555 0.00575135933770407 0.005065990398946282 0.004117426952608124 0.00306734642805268 0.002084923017692901 0.0013144301327347927 0.0008160465074447725 0.0005378107763059024 0.0003746363628123302 0.00024962684893334086 0.00015775652622948108 0.00013107499389271285 0.00016134910101133813 0.0002354031801643059 0.0003382678508912686 0.0004810140756292409 0.0006895470735222102 0.0009554476063526743 0.0012310199292264751 0.0015021101566728302 0.0018252040088143598 0.0022406580347984133 0.0026945499014594666 0.0031091760870718323 0.0035057823399257397 0.0039758207687176335 0.004534767905786572 0.005066004126662922 0.005402100311051646 0.0054211106133543185 0.0050813086362769865 0.00442297840078409 0.00355486201223976 0.002629389801695994 0.001800415395018301 0.0011702724834703948 0.0007582882900205598 0.0005110280207879605 0.00035330476953750173 0.00023703570095634594 0.00015267581316423068 0.00014969492195175246 0.0002009932941254036 0.00030171519351102435 0.0004417062437438293 0.0006333943940810149 0.0009066580400836069 0.0012589495116249172 0.0016351864912215184 0.001993538699736136 0.0023618270227441962 0.002773962381173297 0.003183343133357702 0.0035057823399257406 0.0037430278481098904 0.003984092645329025 0.004273017834966273 0.004534767905786573 0.004640662862214506 0.0045106203259402036 0.004139463137881497 0.0035655934957543093 0.0028541081215028995 0.0021106035581529665 0.0014590527240740745 0.0009736510857595701 0.0006508099138680072 0.00044161447486532784 0.0002999803279416962 0.00020453187540746804 0.00014878985649779497 0.00017215285754228413 0.00024459489967905955 0.0003666949538984374 0.0005404671613561379 0.0007900615193276639 0.0011543632072385775 0.0016385034701410694 0.0021808424436070535 0.0026987296766766257 0.0031582873446044657 0.0035528377214148164 0.0038416187382218987 0.003975820768717634 0.003984092645329026 0.003967720801133171 0.003984092645329027 0.003975820768717635 0.003841618738221899 0.003552837721414816 0.003158287344604464 0.0026987296766766227 0.0021808424436070505 0.0016385034701410658 0.0011543632072385747 0.0007900615193276613 0.000540467161356137 0.0003666949538984374 0.0002445948996790594 0.00017215285754228413 0.00015267581316422978 0.00020453187540746723 0.00029998032794169576 0.00044161447486532757 0.0006508099138680079 0.0009736510857595726 0.0014590527240740774 0.002110603558152971 0.002854108121502904 0.003565593495754314 0.004139463137881502 0.004510620325940207 0.0046406628622145075 0.0045347679057865745 0.004273017834966274 0.003984092645329027 0.003743027848109892 0.0035057823399257415 0.003183343133357704 0.0027739623811732974 0.0023618270227441967 0.0019935386997361345 0.0016351864912215158 0.0012589495116249144 0.0009066580400836044 0.0006333943940810125 0.00044170624374382866 0.00030171519351102386 0.00020099329412540278 0.00014969492195175154 0.00015775652622947964 0.00023703570095634486 0.000353304769537501 0.0005110280207879599 0.0007582882900205603 0.001170272483470396 0.0018004153950183029 0.002629389801695997 0.003554862012239764 0.0044229784007840936 0.005081308636276991 0.005421110613354321 0.00540210031105165 0.005066004126662925 0.0045347679057865745 0.003975820768717635 0.003505782339925742 0.0031091760870718336 0.0026945499014594688 0.0022406580347984154 0.0018252040088143611 0.00150211015667283 0.0012310199292264734 0.0009554476063526725 0.0006895470735222084 0.00048101407562923935 0.0003382678508912682 0.00023540318016430543 0.00016134910101133694 0.0001310749938927115 0.00015338033482130225 0.0002496268489333398 0.00037463636281232946 0.0005378107763059015 0.0008160465074447725 0.0013144301327347935 0.002084923017692902 0.003067346428052682 0.0041174269526081265 0.005065990398946285 0.005751359337704073 0.006050605342605959 0.005918258582049207 0.00540210031105165 0.004640662862214508 0.0038416187382219 0.0031833431333577046 0.0026945499014594683 0.0022749560695569807 0.0018515398190606315 0.0014604937925648631 0.0011583572591615154 0.0009232854720992048 0.00070112800809808 0.0004921829205170341 0.000332810351660372 0.00023265115775077458 0.00016700154404711103 0.00012122019196753919 0.00010991083482162033 0.0001396887624253777 0.00023905748114611054 0.00036059264973204314 0.0005189558821759181 0.0008095426567044853 0.001357619312193839 0.002212953317850322 0.0032799082195145474 0.004379127580087879 0.005337764510923132 0.00600452093612034 0.006258842946612739 0.00605060534260596 0.005421110613354321 0.004510620325940207 0.003552837721414817 0.0027739623811732983 0.0022406580347984137 0.0018515398190606307 0.001490218126094514 0.001145889569982752 0.0008696279545382119 0.0006636557209989272 0.0004883595058147534 0.00033287461528253844 0.00021758712571749115 0.0001519194005349586 0.00011453422882451916 0.00008929388863324295 0.00008970530400963067 0.00012443697714305152 0.0002207519181065119 0.0003382569558404398 0.0004915278415428223 0.0007753241069806388 0.0013149137141692069 0.0021575330962007875 0.003200677769729531 0.004261837790878289 0.005174646336827467 0.005795395785142973 0.00600452093612034 0.0057513593377040715 0.005081308636276991 0.0041394631378815 0.0031582873446044657 0.0023618270227441962 0.00182520400881436 0.0014604937925648612 0.00114588956998275 0.0008478810904686599 0.0006090221462856584 0.0004446632000163218 0.00032387472212927845 0.00022295862859127754 0.00014673972099953878 0.00010514847136896181 0.00008400938969302643 0.00006978108319975339 0.00007498642144383692 0.00010990207288447275 0.0002022661710982091 0.00032066549541832304 0.00047371285458236456 0.0007370114712795571 0.0012147289412613544 0.0019497470457856552 0.0028634056441512626 0.00380476582558119 0.004622831473009582 0.005174646336827465 0.005337764510923129 0.0050659903989462825 0.00442297840078409 0.0035655934957543114 0.002698729676676624 0.0019935386997361345 0.0015021101566728278 0.0011583572591615133 0.0008696279545382099 0.0006090221462856575 0.00041038257064111936 0.00028716150921594515 0.0002107914629232052 0.00015107953004165318 0.00010310204404458332 0.00007553666539708456 0.00006224326772106128 0.00005473562818606937 0.00006307845147368759 0.00009202672100430502 0.00017486743176160807 0.00029007418727425424 0.00044009280330434324 0.0006706709826168832 0.0010541703707617834 0.001629992492352756 0.002355939341597524 0.003124326272372125 0.0038047658255811897 0.004261837790878287 0.004379127580087877 0.004117426952608124 0.003554862012239762 0.0028541081215029017 0.0021808424436070527 0.0016351864912215169 0.0012310199292264728 0.0009232854720992034 0.0006636557209989256 0.000444663200016321 0.0002871615092159456 0.00019395528069378974 0.00014055573155341648 0.00010089256600215916 0.00006762487901667237 0.00004695012607628267 0.000038268184393990325 0.000037225400347974075 0.000049668293720318595 0.0000700209689794522 0.00013378777557352997 0.00023213625592551475 0.0003662969199368258 0.0005542117430241061 0.0008376501878464423 0.0012523497139305814 0.0017836111952503038 0.002355939341597523 0.0028634056441512613 0.0032006777697295282 0.003279908219514545 0.00306734642805268 0.0026293898016959954 0.0021106035581529687 0.0016385034701410677 0.0012589495116249161 0.0009554476063526725 0.0007011280080980799 0.0004883595058147531 0.00032387472212927856 0.00021079146292320554 0.00014055573155341656 0.00009673607156472282 0.00006418578918286429 0.000037990950535601395 0.00002196843204500532 0.000017393788614680317 0.000021744405128661362 0.00003641977923896463 0.00005006992510114432 0.00009205475009133987 0.00016570616231837424 0.00027403295070508476 0.00041731035941536477 0.0006144342314509682 0.0008942164552661226 0.0012523497139305814 0.001629992492352756 0.0019497470457856543 0.002157533096200786 0.00221295331785032 0.0020849230176929008 0.0018004153950183005 0.001459052724074076 0.001154363207238576 0.0009066580400836065 0.0006895470735222085 0.0004921829205170346 0.0003328746152825376 0.0002229586285912786 0.00015107953004165364 0.00010089256600215984 0.00006418578918286429 0.000037975599596235755 0.00001976722459274575 0.000009281165063711231 0.000007592282948861567 0.000014330775707507263 0.000027686800341349196 0.000036345916316917815 0.00006284740975602299 0.00011594604344947272 0.00019913240892331237 0.0003036257116541287 0.0004349316528370979 0.0006144342314509684 0.0008376501878464427 0.001054170370761783 0.0012147289412613536 0.001314913714169205 0.001357619312193837 0.001314430132734792 0.0011702724834703946 0.0009736510857595717 0.0007900615193276627 0.0006333943940810151 0.0004810140756292398 0.00033281035166037314 0.00021758712571749033 0.00014673972099954016 0.00010310204404458375 0.00006762487901667336 0.000037990950535601585 0.000019767224592746194 0.000010657684006573166 0.0000057707171994407425 0.000005160683492613977 0.000011558312453100927 0.000022426327257492093 0.000026593106440488467 0.00004485817630947679 0.00008413408598182843 0.00014628899357183077 0.00021909804628488235 0.00030362571165412877 0.00041731035941536493 0.0005542117430241064 0.000670670982616883 0.0007370114712795565 0.0007753241069806378 0.0008095426567044842 0.0008160465074447714 0.0007582882900205593 0.0006508099138680077 0.0005404671613561382 0.00044170624374382996 0.00033826785089126864 0.00023265115775077526 0.00015191940053495935 0.000105148471368963 0.00007553666539708624 0.00004695012607628412 0.000021968432045006756 0.000009281165063712161 0.000005770717199441211 0.000004787201589210744 0.000004456594710892873 0.000008699922739314981 0.000016997532666014256 0.000017423225697003058 0.00003031114107912197 0.0000578178297172511 0.00009994215145477031 0.00014628899357183096 0.00019913240892331256 0.0002740329507050851 0.00036629691993682605 0.000440092803304343 0.00047371285458236423 0.0004915278415428213 0.0005189558821759175 0.0005378107763059015 0.0005110280207879596 0.0004416144748653279 0.0003666949538984386 0.000301715193511025 0.00023540318016430624 0.00016700154404711192 0.00011453422882452015 0.00008400938969302702 0.00006224326772106311 0.00003826818439399188 0.000017393788614682103 0.000007592282948862718 0.000005160683492614906 0.000004456594710893072 0.000003178772178924716 0.0000047688907982784605 0.00001043272197792916 0.000009341733308210957 0.00001699613417881743 0.00003342638176964216 0.00005781782971725131 0.00008413408598182883 0.00011594604344947287 0.00016570616231837448 0.0002321362559255147 0.000290074187274254 0.00032066549541832283 0.00033825695584043924 0.00036059264973204266 0.0003746363628123298 0.00035330476953750124 0.0002999803279416969 0.0002445948996790598 0.00020099329412540397 0.0001613491010113377 0.00012122019196754052 0.0000892938886332434 0.00006978108319975454 0.00005473562818607017 0.000037225400347975586 0.00002174440512866193 0.000014330775707507957 0.000011558312453100982 0.000008699922739314998 0.000004768890798278284 0.000003239704682993797 0.000005542266168583941 0.000004556866447381192 0.000008151547957649602 0.000016996134178818045 0.00003031114107912279 0.00004485817630947777 0.00006284740975602347 0.00009205475009134027 0.00013378777557353013 0.0001748674317616082 0.00020226617109820924 0.00022075191810651178 0.00023905748114611027 0.00024962684893334 0.00023703570095634475 0.00020453187540746755 0.00017215285754228448 0.00014969492195175194 0.00013107499389271174 0.00010991083482162089 0.00008970530400963116 0.00007498642144383785 0.00006307845147368914 0.0000496682937203204 0.0000364197792389662 0.00002768680034135053 0.000022426327257492916 0.00001699753266601474 0.00001043272197792967 0.000005542266168584561 0.000003983409389723437 0.000009565617953679229 0.000010512830864501315 0.000014781998225036111 0.000023945460612412946 0.000036345916316916894 0.0000514295506268594 0.0000736423676416469 0.00010639592520414812 0.00014390693080602716 0.00017526872371932548 0.000198232534474443 0.00021814488333106712 0.00023414234946933727 0.00023864228845880226 0.00023234710462510192 0.0002276846954364642 0.0002323471046251028 0.000238642288458804 0.00023414234946933943 0.00021814488333107103 0.00019823253447444778 0.00017526872371933025 0.00014390693080603128 0.0001063959252041505 0.00007364236764164874 0.000051429550626861135 0.000036345916316917544 0.00002394546061241273 0.000014781998225036735 0.000010512830864501315 0.000010512830864500938 0.000010520403821836045 0.000011415154720125172 0.000015486976475089603 0.000022426327257490114 0.00003005028381015896 0.000040463698035909926 0.000057993578281353885 0.00008184139687992986 0.00010322000910759108 0.00011896774347643668 0.0001371915999013051 0.00016417085279852184 0.00019570183389348505 0.0002253991227909334 0.0002578894038511493 0.00030060001191083944 0.0003440034197444265 0.00036504846722240815 0.0003560422190484409 0.00033140131162270837 0.0003003899004650747 0.0002556769954001614 0.00019532748400063194 0.0001360065985799574 0.00009243873198667915 0.00006284740975602314 0.00003976068444587522 0.00002223858765754991 0.000012999980140398524 0.000014781998225035949 0.000011415154720125412 0.000007875181309262793 0.000007436905036098886 0.00001155831245309693 0.00001716538851728076 0.000024903658690916063 0.00003947296941473592 0.0000617435694078424 0.00008236911364063455 0.00009890637973825918 0.00012413553643969729 0.0001697548150774735 0.000230736185687913 0.0002915683115640538 0.0003519813156453269 0.0004227198059680316 0.0004938311102070528 0.0005328767055493037 0.0005270594962774782 0.0004984623059909915 0.00046332858412138634 0.000409033513479277 0.0003264489629536633 0.00023726111223035243 0.0001666521654078959 0.00011594604344947263 0.00007448828453249409 0.000041368047125972186 0.00002223858765754949 0.000023945460612412106 0.00001548697647508912 0.0000074369050360980084 0.0000031201939834955563 0.000005160683492609013 0.00001038585319548425 0.000018803416857701596 0.000035082504194897476 0.00006065687477901769 0.00008687310358683215 0.00011318982875864333 0.00015654031394054429 0.000232672071777164 0.00033243221307557603 0.0004294289912473399 0.0005209896395607559 0.0006246264787304529 0.0007311047369061561 0.0007970905713095697 0.0008006309005604036 0.0007669655867827656 0.0007181879547709647 0.000639842691851328 0.0005202161617967771 0.00038815661933965976 0.000279850478058714 0.00019913240892331261 0.00013093515947900115 0.00007448828453249432 0.00003976068444587504 0.00003634591631691635 0.000022426327257489908 0.000011558312453096316 0.000005160683492609428 0.000005770717199434233 0.000010657684006565916 0.000019767224592739462 0.000037990950535595554 0.00006762487901666623 0.00010310204404457773 0.00014673972099953328 0.00021758712571748565 0.0003328103516603683 0.0004810140756292372 0.0006333943940810102 0.0007900615193276593 0.0009736510857595673 0.0011702724834703922 0.0013144301327347907 0.0013576193121938379 0.0013149137141692073 0.001214728941261355 0.0010541703707617847 0.0008376501878464435 0.0006144342314509688 0.0004349316528370986 0.0003036257116541291 0.0001991324089233122 0.00011594604344947219 0.00006284740975602233 0.00005142955062685911 0.00003005028381015901 0.00001716538851728061 0.000010385853195484833 0.00001065768400656642 0.000016583212038356986 0.00002852916790209378 0.000051132788221313236 0.00008826731038414268 0.00013978608385999846 0.00021069153291212932 0.00031773507373240753 0.0004765515140829146 0.0006826700179281677 0.000922898554807162 0.0012072437313161203 0.0015553507761918541 0.001935566873213156 0.0022442729591142284 0.0023815163812629966 0.0023263946674731396 0.002110820674846313 0.0017698156072572192 0.0013573848039995394 0.0009616761756505637 0.0006521197197017322 0.00043493165283709835 0.0002798504780587135 0.0001666521654078948 0.0000924387319866776 0.00007364236764164657 0.00004046369803590985 0.000024903658690915422 0.00001880341685770199 0.0000197672245927391 0.000028529167902092255 0.0000466416265857588 0.00007753218240796042 0.00012770593467778012 0.00020537152754663245 0.0003185229014366685 0.0004755767626457426 0.0006872824206897146 0.0009682847789069711 0.0013400322643710167 0.0018268018963580755 0.0024284076200209266 0.003075601895107347 0.0036190780350586114 0.003896104402377146 0.003824457020248541 0.0034314450613520163 0.0028175502559398624 0.0021175621572112483 0.0014682296666435253 0.0009616761756505635 0.0006144342314509684 0.0003881566193396588 0.0002372611122303507 0.0001360065985799555 0.00010639592520414836 0.00005799357828135423 0.00003947296941473617 0.000035082504194898066 0.00003799095053559609 0.000051132788221313134 0.00007753218240796162 0.00011815501475325578 0.00018259355712859317 0.00029086213465636225 0.0004580270798664932 0.0006808862036298985 0.0009614150171436365 0.0013428023934787103 0.0018950825958768758 0.0026546496802874794 0.0035749591955013833 0.00452618886654798 0.00532025186854428 0.0057449444572470745 0.00564867826547514 0.0050451035960170625 0.004111723142629156 0.0030750543906270084 0.0021175621572112474 0.0013573848039995387 0.0008376501878464424 0.0005202161617967756 0.0003264489629536616 0.00019532748400062958 0.00014390693080602862 0.00008184139687993204 0.00006174356940784423 0.000060656874779020126 0.00006762487901666858 0.00008826731038414361 0.00012770593467778394 0.00018259355712859496 0.00026363326213075513 0.00040315658918494703 0.0006269184999834613 0.0009209194452240705 0.0012775314669896 0.0017735870623411683 0.0025357859259002263 0.0036108433250700133 0.004883702047003988 0.006144054076131455 0.007172574512613117 0.007727115860575974 0.007593348891884837 0.006767615584404148 0.005502479458646104 0.004111723142629155 0.002817550255939862 0.0017698156072572181 0.0010541703707617827 0.0006398426918513263 0.0004090335134792741 0.00025567699540015855 0.00017526872371932843 0.0001032200091075937 0.00008236911364063835 0.00008687310358683626 0.0001031020440445812 0.00013978608386000258 0.00020537152754663816 0.000290862134656367 0.0004031565891849512 0.0005817603729256107 0.0008625415369535966 0.0012246577971138633 0.001651926371329776 0.0022502321078609728 0.003201956733093729 0.004570037806178959 0.006171924531510288 0.00771043317878115 0.008932914694551075 0.009578011906467706 0.0093861663720719 0.008343439782146935 0.006767615584404148 0.005045103596017063 0.0034314450613520155 0.0021108206748463123 0.0012147289412613536 0.0007181879547709634 0.00046332858412138493 0.0003003899004650723 0.00019823253447444588 0.00011896774347643942 0.00009890637973826143 0.00011318982875864646 0.0001467397209995374 0.00021069153291213322 0.0003185229014366743 0.0004580270798664997 0.000626918499983468 0.0008625415369536014 0.0012086120836674085 0.0016434510892206968 0.0021391237296633733 0.0028100800161901967 0.003877184629721819 0.005425288999380866 0.007230885503687016 0.008929833570272596 0.010237380254440178 0.010884820552833414 0.010602809983184984 0.0093861663720719 0.007593348891884834 0.005648678265475139 0.0038244570202485392 0.002326394667473138 0.001314913714169205 0.000766965586782764 0.0004984623059909889 0.00033140131162270626 0.00021814488333107019 0.0001371915999013081 0.00012413553643970176 0.0001565403139405482 0.00021758712571749004 0.0003177350737324144 0.0004755767626457488 0.0006808862036299065 0.0009209194452240799 0.0012246577971138728 0.0016434510892207024 0.0021621361682891216 0.0027352573802774567 0.0034530126341166365 0.004537419787465311 0.006089358996347639 0.007885851634352308 0.009543175734881953 0.010762009478327438 0.011287232360719128 0.010884820552833411 0.009578011906467702 0.007727115860575971 0.005744944457247072 0.0038961044023771447 0.0023815163812629953 0.001357619312193836 0.000800630900560402 0.0005270594962774765 0.0003560422190484392 0.0002341423494693385 0.00016417085279852334 0.00016975481507747488 0.0002326720717771661 0.0003328103516603715 0.0004765515140829175 0.0006872824206897205 0.0009614150171436425 0.0012775314669896086 0.0016519263713297859 0.0021391237296633824 0.0027352573802774606 0.0033781442189325314 0.004107130107226397 0.005105322245516997 0.006480340695556078 0.00805326866256104 0.009473934063312555 0.010451266211617063 0.010762009478327434 0.010237380254440176 0.008932914694551073 0.007172574512613115 0.005320251868544277 0.0036190780350586114 0.0022442729591142267 0.0013144301327347894 0.0007970905713095684 0.0005328767055493017 0.0003650484672224066 0.0002386422884588031 0.00019570183389348625 0.00023073618568791488 0.00033243221307557744 0.00048101407562923935 0.0006826700179281712 0.0009682847789069752 0.0013428023934787157 0.0017735870623411753 0.002250232107860982 0.002810080016190206 0.0034530126341166425 0.0041071301072264 0.0047603283170296485 0.0055452060541457005 0.0065805791958524875 0.007765271584428243 0.008819247828205529 0.009473934063312553 0.009543175734881948 0.008929833570272591 0.007710433178781145 0.006144054076131452 0.00452618886654798 0.003075601895107346 0.0019355668732131549 0.0011702724834703913 0.000731104736906156 0.0004938311102070523 0.000344003419744425 0.00023234710462510298 0.00022539912279093512 0.00029156831156405556 0.0004294289912473424 0.0006333943940810131 0.0009228985548071664 0.0013400322643710213 0.0018950825958768806 0.002535785925900232 0.0032019567330937387 0.0038771846297218286 0.004537419787465318 0.0051053222455170015 0.005545206054145705 0.0059636461988787845 0.006507829512702054 0.007171889765094902 0.007765271584428243 0.008053268662561038 0.007885851634352304 0.0072308855036870125 0.006171924531510285 0.004883702047003985 0.003574959195501383 0.0024284076200209266 0.0015553507761918535 0.0009736510857595679 0.0006246264787304535 0.0004227198059680314 0.00030060001191083917 0.00022768469543646433 0.00025788940385114987 0.0003519813156453285 0.0005209896395607576 0.0007900615193276616 0.0012072437313161253 0.0018268018963580792 0.0026546496802874846 0.0036108433250700194 0.004570037806178968 0.005425288999380875 0.006089358996347647 0.006480340695556084 0.006580579195852492 0.006507829512702056 0.006452482316727427 0.0065078295127020515 0.006580579195852485 0.0064803406955560765 0.006089358996347634 0.0054252889993808605 0.004570037806178957 0.0036108433250700116 0.0026546496802874802 0.001826801896358076 0.0012072437313161218 0.0007900615193276601 0.0005209896395607572 0.00035198131564532706 0.0002578894038511489 0.0002323471046251026 0.0003006000119108398 0.0004227198059680326 0.000624626478730454 0.0009736510857595697 0.0015553507761918578 0.0024284076200209305 0.0035749591955013876 0.004883702047003993 0.006171924531510297 0.0072308855036870255 0.007885851634352316 0.008053268662561047 0.0077652715844282495 0.0071718897650949074 0.006507829512702054 0.005963646198878782 0.005545206054145698 0.005105322245516994 0.004537419787465304 0.0038771846297218147 0.0032019567330937265 0.002535785925900224 0.0018950825958768762 0.001340032264371018 0.0009228985548071632 0.0006333943940810121 0.00042942899124734206 0.000291568311564054 0.0002253991227909338 0.00023864228845880243 0.00034400341974442537 0.0004938311102070531 0.0007311047369061564 0.0011702724834703935 0.0019355668732131586 0.003075601895107349 0.004526188866547984 0.00614405407613146 0.007710433178781155 0.008929833570272603 0.00954317573488196 0.009473934063312562 0.008819247828205534 0.007765271584428247 0.006580579195852489 0.0055452060541457 0.004760328317029645 0.004107130107226392 0.003453012634116629 0.00281008001619019 0.0022502321078609697 0.0017735870623411675 0.0013428023934787126 0.0009682847789069727 0.0006826700179281693 0.00048101407562923864 0.0003324322130755773 0.00023073618568791307 0.00019570183389348473 0.0002341423494693375 0.0003650484672224069 0.0005328767055493025 0.000797090571309569 0.0013144301327347916 0.00224427295911423 0.003619078035058615 0.005320251868544282 0.007172574512613122 0.008932914694551082 0.010237380254440188 0.010762009478327445 0.010451266211617072 0.00947393406331256 0.008053268662561045 0.006480340695556082 0.005105322245516998 0.004107130107226395 0.0033781442189325258 0.0027352573802774498 0.002139123729663369 0.001651926371329775 0.0012775314669896017 0.0009614150171436406 0.0006872824206897184 0.00047655151408291634 0.00033281035166037097 0.00023267207177716563 0.00016975481507747303 0.00016417085279852163 0.00021814488333106907 0.00035604221904843926 0.0005270594962774771 0.0008006309005604022 0.001357619312193838 0.002381516381262998 0.0038961044023771477 0.005744944457247076 0.007727115860575977 0.009578011906467709 0.01088482055283342 0.011287232360719136 0.010762009478327443 0.009543175734881957 0.007885851634352313 0.006089358996347642 0.004537419787465313 0.003453012634116636 0.0027352573802774554 0.002162136168289116 0.0016434510892206957 0.0012246577971138665 0.0009209194452240763 0.0006808862036299057 0.0004755767626457476 0.00031773507373241387 0.00021758712571748966 0.0001565403139405474 0.00012413553643969992 0.0001371915999013062 0.0001982325344744452 0.00033140131162270637 0.0004984623059909898 0.0007669655867827641 0.0013149137141692064 0.00232639466747314 0.003824457020248541 0.005648678265475141 0.0075933488918848374 0.009386166372071904 0.010602809983184988 0.010884820552833418 0.010237380254440183 0.0089298335702726 0.00723088550368702 0.00542528899938087 0.0038771846297218234 0.0028100800161902006 0.002139123729663379 0.0016434510892207005 0.0012086120836674128 0.0008625415369536038 0.0006269184999834691 0.00045802707986650096 0.00031852290143667407 0.00021069153291213393 0.00014673972099953702 0.00011318982875864587 0.00009890637973826036 0.00011896774347643793 0.00017526872371932808 0.00030038990046507227 0.0004633285841213856 0.000718187954770963 0.0012147289412613549 0.0021108206748463136 0.0034314450613520176 0.005045103596017065 0.00676761558440415 0.008343439782146933 0.009386166372071902 0.009578011906467706 0.008932914694551078 0.007710433178781151 0.006171924531510292 0.004570037806178964 0.003201956733093734 0.002250232107860979 0.0016519263713297857 0.001224657797113875 0.0008625415369536093 0.0005817603729256206 0.00040315658918495603 0.0002908621346563703 0.00020537152754663854 0.00013978608386000434 0.00010310204404458114 0.00008687310358683577 0.00008236911364063789 0.00010322000910759252 0.0001439069308060293 0.00025567699540015915 0.00040903351347927494 0.0006398426918513264 0.0010541703707617836 0.0017698156072572197 0.002817550255939863 0.004111723142629157 0.005502479458646106 0.0067676155844041495 0.007593348891884835 0.007727115860575974 0.007172574512613119 0.006144054076131457 0.00488370204700399 0.0036108433250700185 0.0025357859259002302 0.0017735870623411755 0.0012775314669896114 0.0009209194452240842 0.0006269184999834771 0.00040315658918495847 0.000263633262130762 0.00018259355712859864 0.00012770593467778532 0.00008826731038414665 0.00006762487901666954 0.00006065687477902062 0.00006174356940784502 0.0000818413968799319 0.00010639592520414935 0.00019532748400063015 0.0003264489629536621 0.0005202161617967754 0.0008376501878464423 0.0013573848039995385 0.0021175621572112474 0.003075054390627009 0.004111723142629155 0.0050451035960170625 0.005648678265475138 0.005744944457247074 0.005320251868544281 0.004526188866547982 0.003574959195501387 0.0026546496802874854 0.0018950825958768814 0.0013428023934787176 0.0009614150171436482 0.0006808862036299125 0.0004580270798665076 0.0002908621346563732 0.0001825935571286007 0.0001181550147532603 0.00007753218240796379 0.00005113278822131678 0.000037990950535597675 0.000035082504194898845 0.00003947296941473756 0.00005799357828135463 0.00007364236764164817 0.00013600659857995658 0.00023726111223035126 0.0003881566193396586 0.0006144342314509681 0.0009616761756505631 0.0014682296666435253 0.002117562157211248 0.0028175502559398633 0.003431445061352016 0.0038244570202485405 0.0038961044023771456 0.003619078035058615 0.0030756018951073488 0.0024284076200209313 0.0018268018963580799 0.0013400322643710232 0.0009682847789069777 0.0006872824206897248 0.0004755767626457522 0.00031852290143668025 0.0002053715275466418 0.00012770593467778803 0.00007753218240796359 0.0000466416265857618 0.000028529167902095897 0.000019767224592741505 0.000018803416857703378 0.000024903658690917645 0.000040463698035911085 0.00005142955062686055 0.00009243873198667857 0.00016665216540789503 0.0002798504780587133 0.00043493165283709764 0.0006521197197017313 0.000961676175650563 0.0013573848039995385 0.0017698156072572181 0.0021108206748463114 0.0023263946674731374 0.0023815163812629958 0.0022442729591142297 0.0019355668732131573 0.0015553507761918582 0.001207243731316125 0.0009228985548071683 0.0006826700179281726 0.0004765515140829219 0.0003177350737324163 0.00021069153291213973 0.0001397860838600053 0.00008826731038414794 0.0000511327882213154 0.000028529167902095413 0.000016583212038359615 0.000010657684006568264 0.000010385853195485914 0.000017165388517282744 0.000030050283810160288 0.00003634591631691775 0.0000628474097560234 0.00011594604344947243 0.00019913240892331245 0.0003036257116541287 0.00043493165283709753 0.0006144342314509678 0.0008376501878464419 0.0010541703707617825 0.0012147289412613527 0.001314913714169205 0.001357619312193835 0.0013144301327347914 0.0011702724834703933 0.0009736510857595705 0.0007900615193276627 0.0006333943940810141 0.0004810140756292426 0.0003328103516603753 0.000217587125717493 0.0001467397209995421 0.00010310204404458428 0.00006762487901667222 0.000037990950535598535 0.00001976722459274149 0.000010657684006568768 0.00000577071719943607 0.000005160683492610466 0.000011558312453098434 0.0000224263272574913 0.000023945460612413054 0.0000397606844458758 0.00007448828453249428 0.0001309351594790015 0.00019913240892331218 0.00027985047805871295 0.000388156619339658 0.0005202161617967749 0.0006398426918513243 0.0007181879547709615 0.0007669655867827621 0.0008006309005604 0.0007970905713095695 0.0007311047369061568 0.0006246264787304543 0.0005209896395607591 0.00042942899124734385 0.0003324322130755808 0.00023267207177716913 0.00015654031394055136 0.00011318982875864875 0.00008687310358683866 0.00006065687477902303 0.000035082504194899746 0.00001880341685770348 0.000010385853195486339 0.00000516068349261015 0.000003120193983496121 0.000007436905036099654 0.00001548697647508999 0.000014781998225036672 0.000022238587657550164 0.00004136804712597216 0.00007448828453249472 0.00011594604344947238 0.0001666521654078945 0.00023726111223035056 0.0003264489629536609 0.00040903351347927353 0.0004633285841213831 0.0004984623059909877 0.0005270594962774742 0.0005328767055493032 0.0004938311102070524 0.00042271980596803347 0.00035198131564532885 0.00029156831156405664 0.00023073618568791532 0.00016975481507747742 0.00012413553643970233 0.00009890637973826463 0.0000823691136406397 0.00006174356940784727 0.00003947296941473751 0.00002490365869091769 0.000017165388517282368 0.000011558312453097915 0.000007436905036099069 0.000007875181309264164 0.000011415154720126097 0.000010512830864501312 0.000012999980140398875 0.00002223858765754962 0.000039760684445875646 0.00006284740975602264 0.00009243873198667753 0.00013600659857995544 0.00019532748400062907 0.0002556769954001573 0.00030038990046506994 0.00033140131162270474 0.000356042219048437 0.000365048467222407 0.000344003419744425 0.0003006000119108392 0.0002578894038511498 0.0002253991227909351 0.0001957018338934871 0.00016417085279852442 0.00013719159990130828 0.00011896774347644118 0.00010322000910759489 0.00008184139687993429 0.00005799357828135562 0.00004046369803591202 0.000030050283810160898 0.00002242632725749099 0.000015486976475089718 0.00001141515472012626 0.000010520403821836417 0.000017222828270286916 0.00001741283372363222 0.000020781451388427683 0.00003183885277159825 0.00005006992510114578 0.00007364236764164874 0.00010556425488906975 0.00014926894555382072 0.00019991623908953513 0.0002451672234140825 0.00027877854625725767 0.0003040176982251567 0.0003235039291855637 0.00033441079730572865 0.0003361344573057923 0.0003352029974325356 0.0003361344573057897 0.0003344107973057278 0.0003235039291855637 0.00030401769822515495 0.0002787785462572568 0.00024516722341408163 0.0001999162390895347 0.00014926894555381985 0.00010556425488906867 0.00007364236764164842 0.000050069925101144585 0.00003183885277159679 0.000020781451388427412 0.00001741283372363184 0.00001741283372363213 0.000017076032718200067 0.000016053898680698075 0.000019053487707616333 0.000027686800341350724 0.00004046369803591242 0.000058839255895106405 0.00008587912888931043 0.00012021240778397742 0.00015154206168441206 0.00017592000902818451 0.00020289046441401942 0.00024181346590353508 0.0002898163901862291 0.0003349742989234373 0.00037446751049341465 0.00041543744447833744 0.00045571802826237603 0.00047878926010503774 0.00047351329888212245 0.00044462886976899606 0.00039880592165459164 0.0003363917239214423 0.00026232352305726326 0.0001919925815837915 0.00013600659857995696 0.00009205475009134023 0.00005616002450131104 0.00003105710711973365 0.00001954853828186915 0.000020781451388428178 0.000016053898680698726 0.000011326048856833274 0.000009782308601454928 0.000014330775707507915 0.000024903658690919322 0.00004128492951896587 0.00006383462345803564 0.00009202995412545742 0.00011899803177517085 0.00014536777784027877 0.00018599940050381022 0.0002543426496727912 0.00034311220896240794 0.0004273720105761965 0.0004998642579464935 0.0005759894400297546 0.0006575346592259349 0.0007162791068696851 0.0007261632918973096 0.000692362347548822 0.0006304765274554558 0.0005429488252746259 0.00043445457211482993 0.0003264975165632639 0.00023726111223035135 0.00016570616231837418 0.00010458020730616313 0.00005745686967779581 0.00003105710711973412 0.00003183885277159818 0.000019053487707616566 0.000009782308601454604 0.000004898912629721735 0.000007592282948862543 0.000018803416857706898 0.00003721783122293514 0.00006124525023194773 0.0000909244857432813 0.00012439403742309124 0.00016697925239012016 0.0002365232571313375 0.00034716672433379584 0.00048445332287482164 0.0006161688271076281 0.0007402030304244086 0.0008828322819484016 0.0010440770375415866 0.0011733734294710817 0.0012183841389811496 0.0011766546693540297 0.001071953657566242 0.0009163199990738567 0.0007258660541463074 0.0005389628394804272 0.000388156619339659 0.0002740329507050848 0.00018025469510181817 0.00010458020730616391 0.00005616002450131228 0.000050069925101145676 0.00002768680034135087 0.000014330775707507634 0.000007592282948862893 0.00000928116506371165 0.000019767224592745703 0.00003797559959623588 0.00006418578918286552 0.0001008925660021609 0.00015107953004165868 0.00022295862859127936 0.0003328746152825414 0.0004921829205170343 0.0006895470735222107 0.0009066580400836058 0.0011543632072385766 0.0014590527240740763 0.0018004153950183042 0.0020849230176929016 0.0022129533178503226 0.0021575330962007896 0.0019497470457856582 0.0016299924923527573 0.0012523497139305829 0.0008942164552661231 0.0006144342314509689 0.0004173103594153651 0.0002740329507050849 0.0001657061623183747 0.00009205475009134124 0.00007364236764164912 0.000040463698035913036 0.000024903658690919647 0.00001880341685770734 0.000019767224592746408 0.0000285291679021 0.000046641626585767215 0.00007753218240796757 0.0001277059346777906 0.0002053715275466433 0.00031852290143667987 0.00047557676264574974 0.0006872824206897223 0.000968284778906975 0.001340032264371022 0.0018268018963580783 0.0024284076200209313 0.003075601895107351 0.003619078035058615 0.0038961044023771477 0.0038244570202485427 0.0034314450613520202 0.0028175502559398637 0.002117562157211251 0.0014682296666435272 0.000961676175650565 0.0006144342314509691 0.00038815661933965954 0.00023726111223035191 0.00013600659857995742 0.0001055642548890696 0.00005883925589510617 0.00004128492951896523 0.00003721783122293537 0.0000379755995962357 0.00004664162658576585 0.00006935526794948106 0.00011089533149965061 0.00018172430257399152 0.0002970360003488049 0.0004639337960051313 0.000679723422008454 0.0009616996260649231 0.0013718781379051658 0.0019875854776645503 0.002834046611981744 0.0038449800445796004 0.004884730385322294 0.005769895370865572 0.006270310653227988 0.006190457485260748 0.005522965993520521 0.004478765621190833 0.003335298109769367 0.002294832699007048 0.0014682296666435276 0.0008942164552661234 0.0005389628394804275 0.00032649751656326414 0.00019199258158379218 0.0001492689455538206 0.0000858791288893104 0.0000638346234580353 0.00006124525023194808 0.00006418578918286539 0.00007753218240796795 0.00011089533149965058 0.0001681751866778894 0.0002627441367086598 0.00041937212860091735 0.0006500135096252661 0.0009448983181505493 0.0013339424895266404 0.001936662429462747 0.002888371790448019 0.004192815454864293 0.005688885411737056 0.007194256015802472 0.00853527201755081 0.009383109611456558 0.009317982583385747 0.008248830730131534 0.006586079256877101 0.0048550501102774335 0.0033352981097693663 0.0021175621572112504 0.0012523497139305824 0.000725866054146307 0.00043445457211482955 0.0002623235230572629 0.00019991623908953627 0.00012021240778397891 0.0000920299541254573 0.00009092448574328152 0.00010089256600216118 0.00012770593467778952 0.00018172430257399247 0.00026274413670865864 0.00038445738581479054 0.0005833386314490051 0.0008847228995316223 0.0012792562992190344 0.0018108488201475682 0.0026549678017238915 0.0040011689290604365 0.005824229496243898 0.007878392384066563 0.009977253075154284 0.011973630808074337 0.013355186574400194 0.013326033228026436 0.011664359723122488 0.009110995346707661 0.006586079256877101 0.004478765621190832 0.0028175502559398646 0.0016299924923527567 0.000916319999073857 0.0005429488252746257 0.0003363917239214429 0.00024516722341408223 0.00015154206168441133 0.00011899803177517026 0.00012439403742308866 0.00015107953004165532 0.00020537152754664256 0.00029703600034880224 0.0004193721286009149 0.0005833386314490033 0.000836403898914005 0.0012208498047828063 0.0017314033525384158 0.00241985937463722 0.0035046384072238627 0.005225728102749312 0.0075469727353497315 0.010174247183974281 0.012938092278920265 0.01569272215250288 0.017674996409659055 0.017646077493263045 0.015258430610257596 0.011664359723122486 0.008248830730131532 0.005522965993520518 0.0034314450613520185 0.0019497470457856552 0.001071953657566242 0.0006304765274554547 0.00039880592165459115 0.000278778546257258 0.00017592000902818462 0.00014536777784027744 0.0001669792523901203 0.00022295862859127868 0.0003185229014366769 0.0004639337960051305 0.0006500135096252628 0.0008847228995316201 0.0012208498047828053 0.0017124336763814888 0.0023548311695479303 0.0031929167216776452 0.0044628838411544195 0.00644373146324931 0.00910666745054715 0.012128142883814001 0.01532637714196794 0.01852265778312246 0.020780306627006542 0.020611122010000135 0.017646077493263045 0.013326033228026432 0.009317982583385745 0.006190457485260745 0.003824457020248542 0.0021575330962007866 0.0011766546693540289 0.0006923623475488206 0.00044462886976899654 0.0003040176982251572 0.00020289046441401736 0.00018599940050381003 0.0002365232571313349 0.0003328746152825381 0.0004755767626457499 0.0006797234220084497 0.0009448983181505469 0.0012792562992190307 0.0017314033525384145 0.0023548311695479277 0.0031372780911037693 0.004098860343354649 0.0054609172296757776 0.007517489748370425 0.010250489182735958 0.013300080450640451 0.01641060648739892 0.01935827036648119 0.021259632970865444 0.02078030662700654 0.017674996409659048 0.01335518657440019 0.009383109611456554 0.006270310653227985 0.003896104402377147 0.002212953317850321 0.0012183841389811492 0.0007261632918973111 0.00047351329888212256 0.000323503929185565 0.00024181346590353462 0.0002543426496727915 0.0003471667243337957 0.0004921829205170333 0.0006872824206897201 0.0009616996260649228 0.0013339424895266383 0.0018108488201475667 0.002419859374637219 0.0031929167216776452 0.004098860343354648 0.005121132327984123 0.006439066476751876 0.008340585241485126 0.010834126637829374 0.013543651521091854 0.016108051723821838 0.0182594250735667 0.019358270366481183 0.018522657783122457 0.015692722152502878 0.011973630808074334 0.008535272017550806 0.005769895370865572 0.0036190780350586135 0.0020849230176929003 0.001173373429471082 0.0007162791068696837 0.0004787892601050378 0.00033441079730572854 0.00028981639018622744 0.00034311220896240767 0.00048445332287481947 0.0006895470735222077 0.0009682847789069749 0.001371878137905162 0.001936662429462744 0.0026549678017238876 0.003504638407223862 0.004462883841154417 0.005460917229675775 0.006439066476751874 0.007521783518469322 0.008986628223726752 0.01091608195421444 0.013006136920165742 0.014842004087681637 0.016108051723821838 0.016410606487398918 0.015326377141967933 0.01293809227892026 0.00997725307515428 0.007194256015802469 0.004884730385322292 0.003075601895107349 0.0018004153950183014 0.0010440770375415866 0.0006575346592259346 0.0004557180282623756 0.00033613445730579103 0.00033497429892343547 0.00042737201057619495 0.0006161688271076264 0.0009066580400836043 0.0013400322643710213 0.001987585477664549 0.002888371790448017 0.004001168929060434 0.005225728102749314 0.00644373146324931 0.007517489748370426 0.008340585241485125 0.008986628223726754 0.009724646432491059 0.010754562411234783 0.01196189193032467 0.013006136920165742 0.013543651521091854 0.013300080450640446 0.012128142883814 0.01017424718397428 0.007878392384066561 0.005688885411737053 0.003844980044579599 0.0024284076200209296 0.0014590527240740763 0.0008828322819484037 0.000575989440029754 0.00041543744447833847 0.00033520299743253527 0.000374467510493413 0.0004998642579464946 0.0007402030304244072 0.0011543632072385755 0.0018268018963580796 0.002834046611981742 0.004192815454864291 0.005824229496243898 0.0075469727353497315 0.00910666745054715 0.010250489182735958 0.010834126637829372 0.010916081954214441 0.010754562411234783 0.010655259614595913 0.010754562411234781 0.010916081954214441 0.010834126637829372 0.010250489182735956 0.009106667450547149 0.00754697273534973 0.005824229496243897 0.004192815454864291 0.002834046611981742 0.0018268018963580788 0.0011543632072385768 0.0007402030304244102 0.0004998642579464946 0.0003744675104934138 0.0003361344573057903 0.00041543744447833717 0.0005759894400297539 0.0008828322819484009 0.0014590527240740752 0.002428407620020931 0.003844980044579599 0.0056888854117370545 0.007878392384066561 0.010174247183974283 0.012128142883814004 0.013300080450640451 0.013543651521091856 0.013006136920165745 0.01196189193032467 0.010754562411234783 0.009724646432491057 0.008986628223726752 0.008340585241485125 0.007517489748370423 0.006443731463249309 0.00522572810274931 0.004001168929060435 0.002888371790448016 0.0019875854776645495 0.0013400322643710202 0.0009066580400836062 0.0006161688271076293 0.0004273720105761948 0.00033497429892343547 0.00033441079730572735 0.0004557180282623742 0.0006575346592259346 0.0010440770375415842 0.001800415395018301 0.00307560189510735 0.004884730385322292 0.007194256015802469 0.00997725307515428 0.012938092278920264 0.01532637714196794 0.01641060648739892 0.016108051723821834 0.014842004087681639 0.013006136920165742 0.01091608195421444 0.00898662822372675 0.007521783518469321 0.006439066476751876 0.005460917229675776 0.004462883841154415 0.0035046384072238623 0.002654967801723887 0.001936662429462745 0.0013718781379051628 0.0009682847789069746 0.0006895470735222096 0.00048445332287482234 0.00034311220896240724 0.0002898163901862271 0.0003235039291855637 0.00047878926010503666 0.0007162791068696842 0.0011733734294710806 0.0020849230176929008 0.003619078035058615 0.005769895370865573 0.008535272017550806 0.011973630808074336 0.01569272215250288 0.018522657783122464 0.01935827036648119 0.0182594250735667 0.016108051723821838 0.013543651521091854 0.010834126637829372 0.008340585241485125 0.006439066476751876 0.005121132327984125 0.00409886034335465 0.0031929167216776452 0.00241985937463722 0.001810848820147567 0.0013339424895266398 0.0009616996260649239 0.0006872824206897204 0.0004921829205170349 0.00034716672433379833 0.0002543426496727912 0.00024181346590353394 0.00030401769822515555 0.00047351329888212137 0.0007261632918973113 0.0012183841389811474 0.0022129533178503213 0.0038961044023771473 0.006270310653227985 0.009383109611456553 0.01335518657440019 0.01767499640965905 0.020780306627006542 0.021259632970865444 0.019358270366481186 0.016410606487398918 0.013300080450640447 0.010250489182735955 0.0075174897483704225 0.005460917229675773 0.004098860343354649 0.0031372780911037663 0.002354831169547929 0.0017314033525384132 0.0012792562992190305 0.0009448983181505475 0.0006797234220084514 0.0004755767626457503 0.00033287461528253953 0.00023652325713133655 0.00018599940050380967 0.00020289046441401612 0.00027877854625725626 0.0004446288697689952 0.0006923623475488209 0.0011766546693540276 0.0021575330962007875 0.0038244570202485414 0.006190457485260745 0.009317982583385743 0.013326033228026429 0.017646077493263038 0.020611122010000132 0.02078030662700654 0.018522657783122454 0.015326377141967934 0.012128142883814 0.009106667450547149 0.006443731463249307 0.004462883841154416 0.003192916721677644 0.0023548311695479256 0.0017124336763814862 0.001220849804782802 0.000884722899531618 0.0006500135096252631 0.0004639337960051314 0.0003185229014366779 0.00022295862859127925 0.00016697925239012108 0.00014536777784027708 0.00017592000902818278 0.00024516722341408033 0.00039880592165458947 0.0006304765274554548 0.0010719536575662402 0.0019497470457856554 0.0034314450613520163 0.005522965993520517 0.008248830730131529 0.011664359723122483 0.015258430610257584 0.017646077493263038 0.017674996409659045 0.015692722152502878 0.012938092278920257 0.01017424718397428 0.007546972735349728 0.00522572810274931 0.003504638407223859 0.0024198593746372174 0.00173140335253841 0.0012208498047828005 0.0008364038989140004 0.0005833386314490006 0.00041937212860091485 0.00029703600034880224 0.00020537152754664364 0.000151079530041655 0.00012439403742308847 0.00011899803177516971 0.00015154206168440894 0.00019991623908953454 0.0003363917239214414 0.0005429488252746257 0.0009163199990738562 0.0016299924923527567 0.0028175502559398633 0.004478765621190831 0.0065860792568770985 0.009110995346707656 0.011664359723122481 0.013326033228026427 0.013355186574400187 0.01197363080807433 0.009977253075154279 0.007878392384066561 0.005824229496243895 0.004001168929060433 0.0026549678017238863 0.001810848820147565 0.0012792562992190264 0.0008847228995316162 0.0005833386314489988 0.00038445738581478647 0.000262744136708658 0.0001817243025739924 0.0001277059346777907 0.00010089256600216032 0.0000909244857432809 0.00009202995412545675 0.00012021240778397656 0.0001492689455538187 0.0002623235230572611 0.0004344545721148291 0.000725866054146306 0.0012523497139305818 0.0021175621572112487 0.0033352981097693646 0.004855050110277432 0.006586079256877097 0.008248830730131523 0.009317982583385738 0.009383109611456551 0.008535272017550803 0.0071942560158024665 0.0056888854117370545 0.004192815454864292 0.0028883717904480168 0.0019366624294627427 0.0013339424895266387 0.0009448983181505443 0.0006500135096252611 0.000419372128600912 0.00026274413670865685 0.000168175186677889 0.00011089533149965108 0.00007753218240796904 0.00006418578918286436 0.00006124525023194694 0.00006383462345803438 0.00008587912888930786 0.00010556425488906781 0.00019199258158379055 0.0003264975165632636 0.0005389628394804269 0.0008942164552661237 0.0014682296666435268 0.002294832699007048 0.003335298109769366 0.004478765621190832 0.005522965993520514 0.006190457485260743 0.006270310653227982 0.005769895370865571 0.004884730385322288 0.003844980044579601 0.00283404661198174 0.0019875854776645503 0.001371878137905161 0.0009616996260649249 0.0006797234220084476 0.00046393379600513077 0.00029703600034879904 0.00018172430257399087 0.00011089533149964874 0.00006935526794948163 0.000046641626585766457 0.00003797559959623504 0.000037217831222933955 0.000041284929518964227 0.00005883925589510377 0.00007364236764164702 0.00013600659857995542 0.00023726111223035086 0.0003881566193396591 0.0006144342314509695 0.0009616761756505648 0.0014682296666435279 0.0021175621572112504 0.0028175502559398624 0.003431445061352015 0.0038244570202485384 0.0038961044023771447 0.003619078035058612 0.0030756018951073475 0.002428407620020932 0.0018268018963580772 0.0013400322643710213 0.0009682847789069726 0.0006872824206897214 0.00047557676264574545 0.000318522901436678 0.00020537152754663865 0.00012770593467778852 0.0000775321824079654 0.0000466416265857667 0.000028529167902100498 0.00001976722459274507 0.00001880341685770536 0.00002490365869091799 0.000040463698035910326 0.00005006992510114385 0.00009205475009133954 0.00016570616231837375 0.00027403295070508525 0.0004173103594153662 0.0006144342314509691 0.0008942164552661246 0.0012523497139305827 0.0016299924923527563 0.001949747045785653 0.0021575330962007857 0.0022129533178503196 0.0020849230176929 0.0018004153950183003 0.0014590527240740771 0.0011543632072385768 0.0009066580400836048 0.0006895470735222084 0.0004921829205170355 0.00033287461528253823 0.00022295862859127857 0.0001510795300416539 0.00010089256600216013 0.00006418578918286504 0.00003797559959623617 0.00001976722459274703 0.000009281165063710943 0.000007592282948861104 0.000014330775707506121 0.000027686800341348515 0.000031838852771596525 0.000056160024501310795 0.00010458020730616288 0.00018025469510181874 0.0002740329507050858 0.00038815661933965943 0.0005389628394804278 0.0007258660541463073 0.0009163199990738565 0.0010719536575662396 0.0011766546693540271 0.0012183841389811483 0.0011733734294710793 0.001044077037541585 0.0008828322819484035 0.0007402030304244084 0.0006161688271076267 0.00048445332287482077 0.00034716672433379654 0.0002365232571313344 0.00016697925239012084 0.00012439403742308845 0.00009092448574328031 0.00006124525023194832 0.000037217831222935094 0.000018803416857707738 0.000007592282948861659 0.000004898912629719904 0.000009782308601453017 0.00001905348770761447 0.00002078145138842714 0.00003105710711973328 0.00005745686967779514 0.00010458020730616406 0.0001657061623183752 0.00023726111223035197 0.00032649751656326506 0.00043445457211483074 0.0005429488252746259 0.0006304765274554537 0.0006923623475488201 0.0007261632918973122 0.0007162791068696839 0.0006575346592259341 0.0005759894400297566 0.0004998642579464945 0.0004273720105761968 0.00034311220896240745 0.0002543426496727941 0.0001859994005038074 0.0001453677778402782 0.00011899803177516738 0.00009202995412545686 0.00006383462345803376 0.000041284929518965385 0.000024903658690919176 0.000014330775707506619 0.000009782308601452996 0.000011326048856832181 0.000016053898680697235 0.00001741283372363156 0.00001954853828186883 0.00003105710711973334 0.000056160024501312015 0.00009205475009134129 0.000136006598579957 0.0001919925815837928 0.00026232352305726337 0.0003363917239214427 0.0003988059216545908 0.00044462886976899616 0.00047351329888212305 0.00047878926010503693 0.00045571802826237614 0.00041543744447833977 0.00037446751049341427 0.0003349742989234356 0.0002898163901862289 0.00024181346590353476 0.00020289046441401568 0.0001759200090281847 0.00015154206168441068 0.00012021240778397708 0.00008587912888930916 0.0000588392558951052 0.00004046369803591241 0.000027686800341349284 0.000019053487707614506 0.000016053898680697317 0.000017076032718199058 0.00002016830905914911 0.000020434020735810585 0.000025213591859049405 0.00004158095417467042 0.0000700209689794537 0.00010639592520414898 0.00014926894555381898 0.00020101434534479162 0.00026156901156281463 0.0003213239699373892 0.00036883179365407824 0.00040141036955367027 0.0004262350267254973 0.0004496109766508917 0.00046879496476522585 0.0004764957920562699 0.00046879496476522585 0.00044961097665089343 0.0004262350267254956 0.00040141036955367373 0.0003688317936540817 0.0003213239699373857 0.00026156901156281637 0.00020101434534479292 0.00014926894555381941 0.00010639592520415115 0.00007002096897945306 0.00004158095417466955 0.000025213591859048808 0.000020434020735811073 0.00002043402073580984 0.000019088382184321653 0.000017848639275136065 0.000022572177159265163 0.00003641977923896626 0.00005799357828135498 0.00008587912888930795 0.000121217746713224 0.00016484178283184304 0.00020872672490351081 0.00024777767599728725 0.0002890580940773158 0.0003443313341783649 0.00041445894177783577 0.0004813101651604745 0.000528762512149438 0.0005603349195352459 0.0005865215698875146 0.0006045988410517434 0.0006011759042085235 0.0005666602319166265 0.0005030317145494069 0.00042223688521968677 0.0003384606851108134 0.0002623235230572627 0.00019532748400063254 0.00013378777557353057 0.00007998449698244487 0.000042629439945227914 0.000025034130620912688 0.000025213591859047748 0.000017848639275135218 0.000013239288145537937 0.000013352842787483133 0.000021744405128662595 0.000039472969414737765 0.00006383462345803325 0.0000920254711012881 0.0001254154478450835 0.00016298950258330854 0.00020825311966695022 0.00027449300329203516 0.0003738581341875596 0.0004963521413852147 0.0006092634042455473 0.0006972250267069924 0.0007774910755573765 0.0008649531896832558 0.0009395915246891064 0.0009632349493911865 0.0009202033550585057 0.000823974535040851 0.0006969509137475159 0.0005606707485081435 0.00043445457211482977 0.00032644896295366403 0.0002321362559255148 0.00014795151506898907 0.00008197322550826237 0.00004262943994522783 0.00004158095417466899 0.000022572177159264133 0.000013352842787482213 0.000011059872777094312 0.00001739378861468206 0.00003508250419490083 0.00006124525023194476 0.00008987407423056634 0.0001230483526989911 0.00016905754840345737 0.00023964913362904425 0.0003495011941732715 0.0005042574172789188 0.0006838316235267738 0.0008589568636188338 0.0010319639807374755 0.001231673705736176 0.001460434191919836 0.001658940006948028 0.0017456059351057603 0.001688052150227322 0.0015115507963728535 0.0012607018118170842 0.0009829449201744812 0.0007258660541463063 0.000520216161796778 0.00036629691993682664 0.00024528728936034445 0.00014795151506898863 0.00007998449698244478 0.00007002096897945306 0.00003641977923896592 0.000021744405128661616 0.000017393788614682303 0.000021968432045006593 0.00003799095053560039 0.00006418578918286177 0.00009673607156471977 0.00014055573155341238 0.00021079146292320167 0.0003238747221292761 0.0004883595058147554 0.0007011280080980785 0.0009554476063526703 0.001258949511624915 0.0016385034701410666 0.0021106035581529656 0.0026293898016959945 0.0030673464280526804 0.0032799082195145495 0.0032006777697295317 0.0028634056441512613 0.0023559393415975268 0.001783611195250306 0.0012523497139305822 0.0008376501878464459 0.0005542117430241074 0.0003662969199368268 0.00023213625592551461 0.00013378777557353097 0.00010639592520415006 0.00005799357828135611 0.00003947296941473816 0.00003508250419490173 0.00003799095053560212 0.00005113278822131752 0.000077532182407965 0.00011815501475325719 0.00018259355712859965 0.0002908621346563631 0.0004580270798665035 0.0006808862036299006 0.0009614150171436405 0.0013428023934787074 0.001895082595876876 0.002654649680287479 0.003574959195501383 0.004526188866547981 0.005320251868544279 0.005744944457247075 0.00564867826547514 0.0050451035960170625 0.004111723142629159 0.0030750543906270123 0.0021175621572112487 0.0013573848039995428 0.0008376501878464442 0.0005202161617967776 0.00032644896295366295 0.0001953274840006314 0.00014926894555381928 0.00008587912888930942 0.00006383462345803247 0.0000612452502319462 0.00006418578918286364 0.00007753218240796379 0.00011089533149964597 0.00016817518667788282 0.00026274413670865197 0.0004193721286009105 0.0006500135096252594 0.0009448983181505456 0.001333942489526634 0.0019366624294627414 0.002888371790448014 0.00419281545486429 0.00568888541173705 0.007194256015802467 0.008535272017550806 0.009383109611456556 0.009317982583385743 0.008248830730131527 0.006586079256877099 0.004855050110277433 0.0033352981097693646 0.002117562157211252 0.0012523497139305829 0.0007258660541463077 0.00043445457211482977 0.0002623235230572628 0.000201014345344792 0.00012121774671322607 0.0000920254711012889 0.00008987407423056888 0.00009673607156472229 0.00011815501475325783 0.0001681751866778857 0.0002515028079262426 0.00038392241691224044 0.000596245251061393 0.0009038676023293271 0.0013044219419490954 0.001873168016668069 0.002815159394638281 0.004314121678006399 0.006298943931691477 0.008518072672587643 0.010880890615936677 0.01331133934917503 0.015142111007148459 0.015236007343764202 0.013230330906524543 0.010128569135575999 0.007181038655257922 0.00485505011027743 0.0030750543906270114 0.001783611195250305 0.0009829449201744815 0.0005606707485081436 0.0003384606851108131 0.00026156901156281555 0.00016484178283184483 0.00012541544784508201 0.0001230483526989928 0.00014055573155341593 0.00018259355712859512 0.00026274413670865474 0.0003839224169122386 0.0005632734506421869 0.0008408650019755421 0.0012460069125889634 0.001795365947832472 0.002613715989201991 0.003986452395490247 0.006129708980026596 0.008910303039589451 0.012113170777656663 0.01593390230487786 0.020422393654937348 0.024168342736126208 0.024603902216747155 0.020864596443750796 0.015156039132763184 0.010128569135575995 0.006586079256877097 0.004111723142629157 0.002355939341597524 0.0012607018118170837 0.0006969509137475145 0.0004222368852196867 0.00032132396993738896 0.0002087267249035122 0.00016298950258330716 0.00016905754840345843 0.00021079146292320532 0.00029086213465636665 0.00041937212860091165 0.0005962452510613939 0.0008408650019755427 0.00120604395331257 0.001739525606265022 0.0024757860587300423 0.0035767109487630246 0.005391246813130981 0.008167517098673105 0.011767808214400967 0.01613095381440367 0.02183352634840638 0.029017297434719518 0.035232198896081986 0.036027717391526014 0.02995435275689363 0.020864596443750796 0.013230330906524548 0.008248830730131527 0.005045103596017065 0.002863405644151262 0.0015115507963728578 0.0008239745350408553 0.0005030317145494113 0.00036883179365408003 0.00024777767599729175 0.0002082531196669498 0.00023964913362904732 0.00032387472212927867 0.00045802707986649857 0.00065001350962526 0.0009038676023293259 0.0012460069125889623 0.0017395256062650221 0.002441698447335635 0.003389059665699427 0.0047539207128256475 0.006923153073596428 0.01017912446384883 0.014399348124765439 0.019618811318097885 0.02661953106469915 0.03552916848266973 0.043157985044019645 0.043882570046413404 0.03602771739152602 0.024603902216747155 0.015236007343764204 0.009317982583385741 0.00564867826547514 0.003200677769729529 0.0016880521502273232 0.0009202033550585056 0.000566660231916628 0.0004014103695536722 0.0002890580940773163 0.0002744930032920358 0.00034950119417326877 0.0004883595058147528 0.0006808862036299052 0.0009448983181505438 0.0013044219419490952 0.0017953659478324702 0.002475786058730045 0.0033890596656994273 0.004548630795370624 0.0061038190074699065 0.008449495985470212 0.011899632005612578 0.016313578902386973 0.021600447001363182 0.028345846801708416 0.03654237041029714 0.04316919361830617 0.043157985044019645 0.03523219889608198 0.02416834273612621 0.015142111007148459 0.009383109611456554 0.005744944457247074 0.0032799082195145456 0.0017456059351057592 0.0009632349493911872 0.0006011759042085222 0.00042623502672549585 0.000344331334178365 0.000373858134187559 0.0005042574172789229 0.0007011280080980793 0.0009614150171436409 0.0013339424895266367 0.001873168016668069 0.0026137159892019955 0.0035767109487630276 0.004753920712825652 0.00610381900746991 0.0077175839492831 0.00996652434644405 0.013205451880473075 0.017291184098801107 0.02187189839919169 0.027043933065993453 0.032628634466063365 0.036542370410297134 0.03552916848266974 0.029017297434719525 0.02042239365493735 0.01331133934917503 0.008535272017550806 0.005320251868544279 0.00306734642805268 0.0016589400069480277 0.0009395915246891048 0.0006045988410517451 0.00044961097665089425 0.00041445894177783886 0.0004963521413852188 0.0006838316235267767 0.000955447606352672 0.0013428023934787137 0.0019366624294627419 0.0028151593946382832 0.003986452395490249 0.005391246813130981 0.006923153073596427 0.008449495985470212 0.00996652434644405 0.011780429057506368 0.014298536985646171 0.0174979794835227 0.020913217290195893 0.02420311060051783 0.027043933065993456 0.02834584680170842 0.026619531064699147 0.021833526348406383 0.015933902304877862 0.010880890615936679 0.007194256015802468 0.0045261888665479805 0.002629389801695995 0.001460434191919838 0.0008649531896832569 0.0005865215698875155 0.00046879496476522563 0.00048131016516047523 0.0006092634042455449 0.0008589568636188349 0.001258949511624915 0.0018950825958768788 0.002888371790448016 0.004314121678006401 0.0061297089800265965 0.008167517098673109 0.010179124463848836 0.011899632005612582 0.013205451880473076 0.014298536985646176 0.01560668739343887 0.017344440296077856 0.019262043358730805 0.020913217290195893 0.021871898399191698 0.021600447001363182 0.01961881131809789 0.016130953814403673 0.012113170777656666 0.008518072672587642 0.005688885411737054 0.0035749591955013824 0.0021106035581529682 0.001231673705736178 0.0007774910755573748 0.0005603349195352458 0.0004764957920562697 0.0005287625121494373 0.0006972250267069924 0.001031963980737476 0.0016385034701410675 0.0026546496802874837 0.004192815454864291 0.006298943931691482 0.008910303039589456 0.011767808214400969 0.014399348124765442 0.016313578902386973 0.01729118409880111 0.0174979794835227 0.017344440296077852 0.017236761403595646 0.017344440296077852 0.017497979483522698 0.017291184098801114 0.01631357890238697 0.014399348124765435 0.011767808214400969 0.008910303039589455 0.0062989439316914805 0.00419281545486429 0.002654649680287479 0.001638503470141067 0.0010319639807374772 0.0006972250267069912 0.0005287625121494371 0.0004687949647652254 0.0005603349195352457 0.0007774910755573758 0.001231673705736177 0.002110603558152969 0.0035749591955013876 0.005688885411737055 0.008518072672587647 0.01211317077765667 0.016130953814403676 0.0196188113180979 0.02160044700136319 0.021871898399191694 0.020913217290195896 0.019262043358730805 0.017344440296077852 0.015606687393438866 0.014298536985646171 0.01320545188047308 0.011899632005612578 0.010179124463848829 0.008167517098673107 0.006129708980026594 0.004314121678006399 0.0028883717904480155 0.0018950825958768736 0.0012589495116249148 0.000858956863618836 0.0006092634042455434 0.0004813101651604746 0.00044961097665089376 0.0005865215698875154 0.0008649531896832575 0.0014604341919198364 0.0026293898016959954 0.004526188866547983 0.00719425601580247 0.01088089061593668 0.015933902304877862 0.021833526348406383 0.02661953106469915 0.028345846801708423 0.02704393306599346 0.02420311060051783 0.02091321729019589 0.017497979483522698 0.01429853698564617 0.011780429057506366 0.009966524346444053 0.008449495985470212 0.006923153073596421 0.005391246813130983 0.003986452395490248 0.002815159394638284 0.0019366624294627414 0.0013428023934787094 0.0009554476063526721 0.0006838316235267776 0.0004963521413852168 0.00041445894177783777 0.0004262350267254957 0.0006045988410517456 0.0009395915246891061 0.001658940006948027 0.0030673464280526813 0.005320251868544282 0.00853527201755081 0.013311339349175033 0.02042239365493735 0.029017297434719525 0.03552916848266974 0.03654237041029714 0.032628634466063365 0.027043933065993456 0.021871898399191694 0.01729118409880111 0.013205451880473073 0.009966524346444051 0.007717583949283106 0.006103819007469913 0.004753920712825648 0.0035767109487630303 0.002613715989201994 0.0018731680166680711 0.001333942489526636 0.0009614150171436376 0.0007011280080980797 0.0005042574172789239 0.00037385813418755763 0.00034433133417836377 0.0004014103695536724 0.0006011759042085231 0.0009632349493911887 0.0017456059351057588 0.0032799082195145474 0.005744944457247076 0.009383109611456556 0.015142111007148462 0.02416834273612621 0.03523219889608198 0.043157985044019645 0.04316919361830618 0.03654237041029714 0.02834584680170842 0.021600447001363186 0.01631357890238697 0.011899632005612577 0.00844949598547021 0.006103819007469915 0.004548630795370626 0.003389059665699425 0.002475786058730046 0.0017953659478324704 0.0013044219419490978 0.0009448983181505447 0.0006808862036299029 0.0004883595058147535 0.00034950119417326904 0.00027449300329203516 0.00028905809407731465 0.00036883179365408057 0.0005666602319166288 0.0009202033550585073 0.0016880521502273221 0.0032006777697295313 0.005648678265475141 0.009317982583385741 0.015236007343764204 0.024603902216747155 0.036027717391526014 0.043882570046413404 0.043157985044019645 0.03552916848266974 0.026619531064699154 0.019618811318097895 0.014399348124765442 0.010179124463848832 0.006923153073596427 0.004753920712825657 0.00338905966569943 0.0024416984473356338 0.0017395256062650252 0.0012460069125889638 0.0009038676023293296 0.0006500135096252617 0.0004580270798664991 0.00032387472212927915 0.0002396491336290471 0.00020825311966695046 0.00024777767599728985 0.0003213239699373895 0.0005030317145494116 0.0008239745350408571 0.0015115507963728565 0.002863405644151264 0.005045103596017065 0.00824883073013153 0.013230330906524547 0.020864596443750796 0.029954352756893624 0.03602771739152602 0.03523219889608198 0.02901729743471953 0.021833526348406376 0.01613095381440368 0.011767808214400969 0.008167517098673107 0.005391246813130981 0.0035767109487630316 0.0024757860587300462 0.001739525606265023 0.0012060439533125736 0.0008408650019755434 0.0005962452510614003 0.0004193721286009138 0.0002908621346563702 0.00021079146292320527 0.00016905754840345767 0.0001629895025833087 0.00020872672490351025 0.0002615690115628162 0.0004222368852196872 0.0006969509137475162 0.001260701811817083 0.0023559393415975246 0.004111723142629158 0.0065860792568770985 0.010128569135575999 0.01515603913276318 0.020864596443750796 0.024603902216747152 0.024168342736126214 0.020422393654937355 0.015933902304877866 0.01211317077765667 0.008910303039589456 0.006129708980026595 0.00398645239549025 0.002613715989201996 0.0017953659478324691 0.0012460069125889647 0.0008408650019755422 0.0005632734506421882 0.0003839224169122433 0.0002627441367086567 0.0001825935571285996 0.00014055573155341607 0.00012304835269899163 0.0001254154478450841 0.00016484178283184318 0.00020101434534479251 0.00033846068511081336 0.0005606707485081452 0.0009829449201744812 0.0017836111952503047 0.003075054390627011 0.004855050110277432 0.007181038655257923 0.010128569135575995 0.013230330906524543 0.015236007343764197 0.015142111007148462 0.013311339349175033 0.010880890615936679 0.008518072672587649 0.006298943931691482 0.004314121678006399 0.0028151593946382837 0.0018731680166680724 0.0013044219419490976 0.0009038676023293309 0.0005962452510613963 0.0003839224169122432 0.00025150280792624844 0.00016817518667788808 0.00011815501475326242 0.00009673607156472203 0.00008987407423056795 0.00009202547110129114 0.00012121774671322484 0.00014926894555382017 0.0002623235230572635 0.00043445457211483193 0.0007258660541463079 0.0012523497139305827 0.0021175621572112504 0.0033352981097693663 0.004855050110277433 0.0065860792568770985 0.008248830730131525 0.009317982583385743 0.009383109611456554 0.008535272017550811 0.007194256015802466 0.005688885411737059 0.004192815454864292 0.002888371790448019 0.0019366624294627419 0.0013339424895266387 0.0009448983181505426 0.0006500135096252624 0.00041937212860091144 0.0002627441367086567 0.00016817518667788605 0.00011089533149964913 0.0000775321824079665 0.0000641857891828635 0.00006124525023194535 0.000063834623458035 0.00008587912888930905 0.00010639592520415098 0.00019532748400063189 0.0003264489629536652 0.0005202161617967776 0.0008376501878464437 0.0013573848039995409 0.00211756215721125 0.003075054390627012 0.004111723142629156 0.005045103596017063 0.005648678265475138 0.0057449444572470745 0.005320251868544285 0.0045261888665479805 0.0035749591955013893 0.002654649680287483 0.0018950825958768806 0.0013428023934787103 0.0009614150171436458 0.0006808862036299009 0.0004580270798665039 0.0002908621346563642 0.00018259355712860008 0.000118155014753258 0.00007753218240796791 0.00005113278822131939 0.00003799095053560132 0.00003508250419490084 0.00003947296941474019 0.000057993578281356325 0.00007002096897945437 0.00013378777557353168 0.00023213625592551722 0.0003662969199368274 0.0005542117430241069 0.0008376501878464438 0.0012523497139305829 0.0017836111952503051 0.0023559393415975237 0.0028634056441512613 0.0032006777697295287 0.003279908219514544 0.0030673464280526826 0.0026293898016959906 0.0021106035581529687 0.0016385034701410675 0.0012589495116249157 0.000955447606352673 0.000701128008098081 0.0004883595058147523 0.0003238747221292777 0.00021079146292320234 0.00014055573155341566 0.00009673607156472213 0.00006418578918286517 0.00003799095053560291 0.000021968432045006254 0.000017393788614681794 0.00002174440512866354 0.00003641977923896701 0.00004158095417467013 0.00007998449698244527 0.0001479515150689909 0.0002452872893603451 0.00036629691993682594 0.0005202161617967763 0.0007258660541463065 0.0009829449201744812 0.0012607018118170816 0.0015115507963728559 0.0016880521502273206 0.0017456059351057592 0.001658940006948028 0.0014604341919198353 0.0012316737057361785 0.0010319639807374783 0.0008589568636188358 0.000683831623526777 0.0005042574172789216 0.0003495011941732703 0.000239649133629049 0.0001690575484034583 0.00012304835269899298 0.00008987407423057003 0.00006124525023194752 0.00003508250419490369 0.000017393788614681676 0.000011059872777093842 0.000013352842787483661 0.000022572177159265424 0.000025213591859048774 0.000042629439945228314 0.00008197322550826467 0.00014795151506899007 0.00023213625592551494 0.00032644896295366235 0.00043445457211482977 0.0005606707485081437 0.0006969509137475148 0.0008239745350408553 0.0009202033550585029 0.0009632349493911877 0.0009395915246891069 0.0008649531896832539 0.0007774910755573774 0.0006972250267069908 0.000609263404245547 0.0004963521413852153 0.0003738581341875597 0.0002744930032920352 0.00020825311966695217 0.00016298950258330453 0.00012541544784508416 0.0000920254711012893 0.0000638346234580349 0.00003947296941473982 0.000021744405128662467 0.000013352842787482537 0.000013239288145538976 0.000017848639275136654 0.000020434020735810358 0.00002503413062091278 0.00004262943994522939 0.00007998449698244577 0.00013378777557353127 0.00019532748400063026 0.000262323523057262 0.00033846068511081255 0.00042223688521968574 0.0005030317145494102 0.000566660231916625 0.0006011759042085214 0.000604598841051746 0.0005865215698875098 0.0005603349195352462 0.0005287625121494361 0.0004813101651604744 0.0004144589417778359 0.00034433133417836133 0.0002890580940773151 0.00024777767599728866 0.00020872672490350748 0.00016484178283184426 0.00012121774671322542 0.00008587912888930863 0.000057993578281356914 0.00003641977923896593 0.000022572177159264526 0.00001784863927513646 0.000019088382184322727 0.000022151566164276253 0.000022541579159477104 0.000029077834577924042 0.000051575019374037524 0.00009202672100430405 0.00014390693080602694 0.0001999162390895347 0.00026156901156281463 0.0003360929645486767 0.00041701622182258036 0.0004837211007552387 0.0005240339424709035 0.0005506553884725048 0.0005832294783845778 0.0006197248184155353 0.0006368373327308822 0.0006197248184155336 0.0005832294783845778 0.0005506553884725065 0.000524033942470907 0.00048372110075524215 0.0004170162218225821 0.00033609296454868275 0.0002615690115628129 0.00019991623908953557 0.00014390693080603215 0.00009202672100430557 0.00005157501937403579 0.00002907783457792426 0.00002254157915947759 0.000022541579159477697 0.000020532050107825877 0.00002071187565953361 0.00002876662995246124 0.00004966829372031848 0.00008184139687993044 0.0001202124077839765 0.0001648417828318425 0.00022033393740472767 0.00028173929364136603 0.00033999731898393863 0.00039576518507256157 0.0004633564042267076 0.0005519973573561739 0.0006423483931220768 0.0007038565058097157 0.0007313386636297324 0.0007465776724080139 0.0007619127265753534 0.0007609761381989967 0.0007178665296543006 0.0006296342986623052 0.0005222137760460901 0.00042223688521968574 0.0003363917239214436 0.00025567699540016316 0.00017486743176160763 0.00010298248083767119 0.00005384413321553652 0.000030180522486128723 0.000029077834577925546 0.0000207118756595351 0.00001916527902949986 0.000023259926778895508 0.000037225400347974265 0.0000617435694078435 0.00009202995412545556 0.00012541544784508136 0.0001660641990964881 0.00021817936648991512 0.00028670028072873445 0.0003796380781566173 0.0005052944369660959 0.0006561523056794493 0.0008015254916949723 0.0009190083262633681 0.0010183403054298296 0.0011191498215588785 0.0012087368131948246 0.0012408721734380747 0.0011822360315786376 0.0010447624265133974 0.0008703087826223994 0.0006969509137475114 0.0005429488252746273 0.00040903351347927846 0.00029007418727425326 0.00018588342694629008 0.00010487748323797793 0.00005384413321553721 0.000051575019374036345 0.000028766629952460214 0.000023259926778892964 0.00002664251965620183 0.00003826818439399159 0.00006065687477902104 0.00009092448574327897 0.00012304835269899003 0.0001621371192064125 0.00022463885487634133 0.000327496029976597 0.0004781079751339023 0.0006692846682037877 0.0008835265101450363 0.001109453111722614 0.0013560029677948042 0.0016396186116322176 0.0019465698802293002 0.0022044233453669157 0.0023155029140805314 0.0022318845186097523 0.001982106453963783 0.001634987129825333 0.001260701811817081 0.0009163199990738582 0.0006398426918513308 0.0004400928033043427 0.00029651146234187616 0.00018588342694628946 0.00010298248083767107 0.00009202672100430471 0.000049668293720319645 0.00003722540034797266 0.000038268184393992676 0.00004695012607628447 0.00006762487901667132 0.00010089256600215854 0.0001405557315534138 0.00019395528069378302 0.0002871615092159448 0.00044466320001632 0.0006636557209989328 0.0009232854720992022 0.001231019929226476 0.0016351864912215125 0.0021808424436070496 0.0028541081215029 0.003554862012239764 0.004117426952608123 0.004379127580087882 0.004261837790878294 0.003804765825581196 0.0031243262723721285 0.002355939341597523 0.0016299924923527578 0.0010541703707617875 0.0006706709826168829 0.0004400928033043434 0.0002900741872742524 0.00017486743176160758 0.00014390693080602897 0.00008184139687993334 0.00006174356940784399 0.00006065687477902385 0.00006762487901667458 0.00008826731038414719 0.00012770593467778914 0.0001825935571285962 0.0002636332621307591 0.0004031565891849483 0.0006269184999834754 0.0009209194452240731 0.0012775314669896014 0.0017735870623411612 0.002535785925900226 0.003610843325070009 0.004883702047003986 0.006144054076131455 0.007172574512613114 0.007727115860575978 0.00759334889188484 0.006767615584404152 0.005502479458646107 0.004111723142629156 0.002817550255939863 0.0017698156072572227 0.0010541703707617836 0.000639842691851328 0.0004090335134792748 0.00025567699540016023 0.0001999162390895334 0.00012021240778397742 0.0000920299541254521 0.00009092448574328022 0.00010089256600215938 0.00012770593467778592 0.00018172430257398808 0.0002627441367086533 0.00038445738581477883 0.0005833386314489981 0.0008847228995316164 0.0012792562992190316 0.0018108488201475637 0.002654967801723887 0.00400116892906043 0.005824229496243894 0.007878392384066558 0.009977253075154284 0.011973630808074323 0.013355186574400194 0.013326033228026434 0.011664359723122485 0.009110995346707656 0.006586079256877096 0.0044787656211908305 0.0028175502559398664 0.0016299924923527565 0.0009163199990738572 0.0005429488252746245 0.0003363917239214428 0.0002615690115628146 0.00016484178283184445 0.00012541544784507957 0.0001230483526989935 0.0001405557315534168 0.00018259355712859702 0.00026274413670865506 0.00038392241691223914 0.0005632734506421879 0.0008408650019755418 0.0012460069125889636 0.0017953659478324802 0.002613715989201993 0.00398645239549025 0.006129708980026597 0.008910303039589451 0.012113170777656668 0.015933902304877862 0.02042239365493734 0.02416834273612621 0.024603902216747162 0.020864596443750796 0.015156039132763184 0.010128569135575992 0.006586079256877095 0.004111723142629158 0.0023559393415975246 0.0012607018118170829 0.0006969509137475126 0.00042223688521968693 0.0003360929645486784 0.00022033393740473374 0.00016606419909648664 0.00016213711920641955 0.00019395528069379028 0.00026363326213075757 0.00038445738581478636 0.0005632734506421869 0.0008231909664002674 0.001209958761093529 0.0017619709067586754 0.0025319910818477533 0.0037347489483499185 0.0057619506783170744 0.008839845022533021 0.01281726508027634 0.01786507350603816 0.025055637667848858 0.034760915202820916 0.04358793167375026 0.04510783438860939 0.037099549047796304 0.02500960208422867 0.015156039132763179 0.009110995346707654 0.0055024794586461066 0.003124326272372126 0.0016349871298253305 0.0008703087826223929 0.0005222137760460876 0.00041701622182258307 0.0002817392936413675 0.00021817936648991227 0.00022463885487634475 0.0002871615092159459 0.0004031565891849524 0.0005833386314489996 0.0008408650019755421 0.0012099587610935284 0.001746532729020491 0.0024978119909228043 0.003543537105845854 0.005172902766082886 0.007869541377713726 0.011889215069225807 0.017197117076335002 0.024608649914735676 0.0363667313100634 0.053219103003259556 0.06896977349167828 0.07184481865601179 0.057874007302206903 0.037099549047796304 0.0208645964437508 0.01166435972312248 0.006767615584404149 0.00380476582558119 0.0019821064539637793 0.0010447624265133959 0.0006296342986623034 0.00048372110075524155 0.00033999731898394275 0.0002867002807287311 0.0003274960299765937 0.0004446632000163215 0.0006269184999834691 0.0008847228995316167 0.0012460069125889628 0.0017619709067586732 0.0024978119909228034 0.0035001160310624765 0.004852504630671366 0.006884090603571319 0.0101486926733028 0.014947087410735692 0.021340499097863345 0.030550059905471983 0.04551782647970808 0.06708402303583846 0.0870489735205125 0.09023345115385845 0.0718448186560118 0.04510783438860939 0.024603902216747155 0.013326033228026427 0.007593348891884835 0.004261837790878287 0.0022318845186097497 0.0011822360315786274 0.0007178665296542961 0.0005240339424709019 0.0003957651850725601 0.0003796380781566136 0.00047810797513389504 0.0006636557209989256 0.0009209194452240809 0.001279256299219027 0.0017953659478324715 0.002531991081847751 0.003543537105845858 0.004852504630671364 0.006514726734788961 0.008851163896473169 0.012455354564246367 0.01767088697656699 0.0244766164533361 0.03380867422689518 0.04815204876374486 0.06795136304519563 0.0854511061047993 0.0870489735205125 0.06896977349167827 0.04358793167375026 0.024168342736126204 0.013355186574400187 0.007727115860575971 0.004379127580087877 0.0023155029140805258 0.0012408721734380648 0.0007609761381989899 0.0005506553884725054 0.0004633564042267077 0.0005052944369660898 0.0006692846682037812 0.0009232854720992028 0.0012775314669896088 0.001810848820147565 0.002613715989201994 0.003734748948349924 0.005172902766082895 0.006884090603571321 0.008851163896473172 0.0113179299397326 0.014864650915170599 0.019899013037081064 0.02625038192951192 0.03407391682098447 0.04456266870809132 0.05761291075195856 0.06795136304519561 0.06708402303583848 0.05321910300325957 0.03476091520282092 0.020422393654937344 0.011973630808074334 0.007172574512613113 0.004117426952608125 0.0022044233453669152 0.00120873681319482 0.000761912726575355 0.0005832294783845778 0.0005519973573561726 0.0006561523056794498 0.0008835265101450297 0.0012310199292264715 0.0017735870623411761 0.0026549678017238863 0.00398645239549025 0.005761950678317075 0.007869541377713727 0.010148692673302801 0.012455354564246368 0.014864650915170599 0.01784026965500825 0.021878320719838733 0.026874775620886443 0.03239910529167102 0.0384400990072735 0.04456266870809132 0.04815204876374486 0.04551782647970807 0.0363667313100634 0.025055637667848855 0.015933902304877862 0.00997725307515428 0.006144054076131451 0.003554862012239763 0.001946569880229299 0.0011191498215588752 0.0007465776724080114 0.0006197248184155333 0.0006423483931220763 0.0008015254916949652 0.0011094531117226132 0.0016351864912215138 0.002535785925900233 0.004001168929060434 0.0061297089800265965 0.008839845022533025 0.011889215069225821 0.0149470874107357 0.01767088697656699 0.019899013037081057 0.02187832071983874 0.024131797236828956 0.026888939960480213 0.029813679189042687 0.03239910529167102 0.03407391682098447 0.03380867422689517 0.03055005990547198 0.02460864991473567 0.017865073506038154 0.012113170777656663 0.00787839238406656 0.004883702047003981 0.0028541081215029017 0.001639618611632218 0.0010183403054298255 0.0007313386636297344 0.0006368373327308818 0.0007038565058097178 0.0009190083262633701 0.0013560029677948042 0.002180842443607049 0.0036108433250700202 0.005824229496243897 0.008910303039589453 0.012817265080276342 0.01719711707633501 0.021340499097863348 0.0244766164533361 0.02625038192951192 0.026874775620886436 0.02688893996048021 0.02682014002358007 0.02688893996048021 0.026874775620886436 0.026250381929511922 0.024476616453336097 0.02134049909786334 0.017197117076335 0.012817265080276339 0.008910303039589451 0.005824229496243895 0.0036108433250700077 0.0021808424436070514 0.0013560029677948072 0.0009190083262633666 0.0007038565058097162 0.000619724818415534 0.0007313386636297371 0.0010183403054298298 0.0016396186116322156 0.0028541081215029 0.004883702047003993 0.007878392384066563 0.012113170777656668 0.017865073506038165 0.024608649914735686 0.030550059905471997 0.03380867422689519 0.03407391682098447 0.032399105291671025 0.029813679189042683 0.026888939960480213 0.024131797236828952 0.021878320719838733 0.019899013037081064 0.017670886976566984 0.014947087410735686 0.011889215069225805 0.008839845022533014 0.006129708980026589 0.004001168929060432 0.0025357859259002194 0.0016351864912215153 0.0011094531117226162 0.0008015254916949628 0.0006423483931220756 0.0005832294783845791 0.0007465776724080148 0.00111914982155888 0.0019465698802292963 0.0035548620122397615 0.00614405407613146 0.009977253075154282 0.015933902304877862 0.02505563766784886 0.036366731310063405 0.04551782647970808 0.04815204876374487 0.044562668708091314 0.0384400990072735 0.03239910529167102 0.02687477562088644 0.02187832071983873 0.01784026965500825 0.014864650915170597 0.012455354564246363 0.010148692673302796 0.007869541377713724 0.005761950678317066 0.00398645239549025 0.0026549678017238855 0.0017735870623411638 0.0012310199292264717 0.0008835265101450334 0.0006561523056794481 0.0005519973573561727 0.0005506553884725077 0.0007619127265753595 0.001208736813194826 0.0022044233453669144 0.004117426952608126 0.007172574512613121 0.011973630808074337 0.020422393654937348 0.03476091520282092 0.05321910300325958 0.06708402303583849 0.06795136304519564 0.05761291075195857 0.04456266870809132 0.03407391682098447 0.02625038192951192 0.01989901303708106 0.0148646509151706 0.011317929939732605 0.008851163896473169 0.006884090603571315 0.00517290276608289 0.003734748948349914 0.0026137159892019963 0.0018108488201475654 0.0012775314669895988 0.0009232854720992025 0.0006692846682037851 0.00050529443696609 0.00046335640422670837 0.0005240339424709044 0.0007609761381989941 0.00124087217343807 0.0023155029140805245 0.004379127580087879 0.0077271158605759765 0.013355186574400192 0.024168342736126208 0.04358793167375025 0.06896977349167828 0.0870489735205125 0.0854511061047993 0.06795136304519563 0.04815204876374486 0.03380867422689518 0.024476616453336097 0.017670886976566987 0.012455354564246363 0.008851163896473172 0.006514726734788954 0.004852504630671363 0.0035435371058458514 0.0025319910818477473 0.0017953659478324737 0.0012792562992190305 0.000920919445224075 0.0006636557209989256 0.0004781079751338974 0.0003796380781566157 0.00039576518507255967 0.0004837211007552442 0.0007178665296542994 0.0011822360315786324 0.0022318845186097484 0.00426183779087829 0.007593348891884837 0.01332603322802643 0.024603902216747155 0.04510783438860937 0.07184481865601179 0.09023345115385845 0.0870489735205125 0.06708402303583848 0.04551782647970808 0.030550059905471983 0.021340499097863345 0.014947087410735692 0.010148692673302796 0.006884090603571322 0.004852504630671363 0.003500116031062476 0.0024978119909228004 0.001761970906758673 0.0012460069125889673 0.0008847228995316207 0.0006269184999834704 0.0004446632000163216 0.0003274960299765947 0.00028670028072873516 0.00033999731898394156 0.00041701622182258567 0.0006296342986623056 0.0010447624265134 0.001982106453963778 0.0038047658255811927 0.006767615584404148 0.011664359723122486 0.020864596443750792 0.0370995490477963 0.05787400730220689 0.07184481865601179 0.06896977349167827 0.05321910300325957 0.036366731310063384 0.02460864991473568 0.017197117076335 0.011889215069225807 0.007869541377713719 0.005172902766082889 0.0035435371058458497 0.002497811990922802 0.0017465327290204981 0.0012099587610935306 0.0008408650019755483 0.0005833386314490053 0.0004031565891849596 0.0002871615092159463 0.000224638854876344 0.00021817936648991747 0.0002817392936413661 0.00033609296454868075 0.0005222137760460894 0.0008703087826223956 0.00163498712982533 0.0031243262723721276 0.005502479458646106 0.009110995346707658 0.015156039132763182 0.025009602084228668 0.037099549047796304 0.04510783438860938 0.04358793167375026 0.03476091520282092 0.02505563766784886 0.017865073506038165 0.012817265080276342 0.008839845022533023 0.0057619506783170675 0.0037347489483499185 0.0025319910818477516 0.0017619709067586795 0.001209958761093529 0.0008231909664002713 0.0005632734506421918 0.00038445738581479065 0.0002636332621307659 0.00019395528069379115 0.0001621371192064178 0.000166064199096492 0.000220333937404733 0.0002615690115628166 0.00042223688521968807 0.0006969509137475142 0.0012607018118170827 0.0023559393415975263 0.004111723142629157 0.006586079256877099 0.010128569135575995 0.015156039132763179 0.020864596443750796 0.024603902216747152 0.02416834273612621 0.020422393654937348 0.01593390230487786 0.012113170777656673 0.008910303039589453 0.006129708980026597 0.003986452395490248 0.0026137159892019985 0.0017953659478324791 0.0012460069125889714 0.0008408650019755503 0.0005632734506421936 0.00038392241691224407 0.00026274413670866113 0.00018259355712860488 0.0001405557315534179 0.0001230483526989916 0.00012541544784508424 0.00016484178283184434 0.00019991623908953543 0.00033639172392144423 0.0005429488252746259 0.000916319999073858 0.0016299924923527595 0.0028175502559398646 0.004478765621190836 0.006586079256877097 0.009110995346707656 0.011664359723122481 0.013326033228026429 0.013355186574400183 0.011973630808074337 0.009977253075154274 0.007878392384066568 0.005824229496243891 0.004001168929060436 0.002654967801723881 0.0018108488201475726 0.0012792562992190305 0.0008847228995316255 0.0005833386314489991 0.0003844573858147898 0.00026274413670865474 0.00018172430257399345 0.00012770593467779115 0.00010089256600216149 0.00009092448574327847 0.00009202995412545612 0.0001202124077839777 0.00014390693080603038 0.0002556769954001614 0.0004090335134792755 0.0006398426918513291 0.0010541703707617855 0.001769815607257221 0.0028175502559398664 0.004111723142629157 0.005502479458646101 0.006767615584404149 0.007593348891884835 0.007727115860575973 0.00717257451261312 0.006144054076131452 0.004883702047003994 0.00361084332507001 0.002535785925900232 0.0017735870623411612 0.00127753146698961 0.0009209194452240697 0.0006269184999834714 0.00040315658918493803 0.00026363326213076397 0.00018259355712859328 0.00012770593467779142 0.00008826731038415093 0.00006762487901667495 0.000060656874779022125 0.00006174356940784631 0.00008184139687993319 0.00009202672100430631 0.00017486743176160945 0.00029007418727425337 0.00044009280330434535 0.0006706709826168844 0.0010541703707617849 0.0016299924923527608 0.0023559393415975233 0.003124326272372123 0.0038047658255811914 0.0042618377908782866 0.004379127580087872 0.004117426952608125 0.0035548620122397567 0.002854108121502904 0.002180842443607048 0.0016351864912215158 0.001231019929226471 0.0009232854720991983 0.0006636557209989321 0.0004446632000163269 0.00028716150921595176 0.00019395528069379324 0.00014055573155341485 0.000100892566002163 0.0000676248790166762 0.000046950126076286004 0.00003826818439399211 0.000037225400347974936 0.00004966829372031998 0.00005157501937403751 0.00010298248083767288 0.00018588342694628992 0.0002965114623418782 0.00044009280330434335 0.000639842691851327 0.0009163199990738591 0.001260701811817083 0.0016349871298253253 0.001982106453963781 0.002231884518609744 0.002315502914080526 0.002204423345366912 0.0019465698802292974 0.0016396186116322212 0.001356002967794805 0.0011094531117226117 0.0008835265101450313 0.0006692846682037799 0.00047810797513390263 0.0003274960299765977 0.00022463885487634488 0.00016213711920642384 0.00012304835269899417 0.0000909244857432821 0.000060656874779025906 0.000038268184393993225 0.000026642519656200917 0.00002325992677889443 0.00002876662995246054 0.00002907783457792697 0.00005384413321553897 0.00010487748323797891 0.00018588342694629247 0.00029007418727425364 0.0004090335134792744 0.0005429488252746284 0.0006969509137475135 0.0008703087826223919 0.0010447624265133995 0.0011822360315786298 0.0012408721734380674 0.0012087368131948261 0.001119149821558876 0.0010183403054298344 0.0009190083262633667 0.0008015254916949675 0.0006561523056794472 0.0005052944369660986 0.00037963807815662013 0.00028670028072873434 0.0002181793664899127 0.00016606419909649594 0.00012541544784508234 0.00009202995412545839 0.00006174356940784803 0.000037225400347975674 0.000023259926778894495 0.000019165279029501507 0.00002071187565953616 0.000022541579159478432 0.00003018052248612914 0.000053844133215536816 0.0001029824808376731 0.00017486743176160758 0.00025567699540015774 0.0003363917239214445 0.00042223688521968465 0.0005222137760460825 0.0006296342986623031 0.0007178665296542929 0.0007609761381989928 0.0007619127265753564 0.0007465776724080108 0.0007313386636297376 0.0007038565058097155 0.000642348393122072 0.0005519973573561703 0.00046335640422670365 0.00039576518507256303 0.0003399973189839436 0.0002817392936413648 0.00022033393740473206 0.00016484178283184225 0.00012021240778397754 0.00008184139687993539 0.00004966829372031977 0.000028766629952459756 0.000020711875659534577 0.00002053205010782692 0.000028768074973657795 0.000028324619977966516 0.000034395759926610244 0.000060288850131598936 0.00010990207288447715 0.00017526872371933112 0.00024516722341408293 0.0003213239699373918 0.00041701622182258556 0.000526217108392556 0.0006161255593246703 0.0006638652867328142 0.0006876207794232064 0.0007212546483763918 0.0007667896670978426 0.0007897162282245115 0.0007667896670978461 0.0007212546483763953 0.0006876207794232134 0.0006638652867328246 0.000616125559324672 0.0005262171083925613 0.0004170162218225925 0.00032132396993739265 0.0002451672234140812 0.00017526872371933112 0.00010990207288447476 0.00006028885013160067 0.00003439575992661111 0.000028324619977961203 0.00002832461997796466 0.000025849658985389592 0.00002671170950945675 0.00003706462000962985 0.000063078451473693 0.00010322000910759584 0.00015154206168441109 0.0002087267249035139 0.0002817392936413671 0.000366087000675691 0.00044536251883482947 0.000512221770090827 0.0005841060597842261 0.0006814304005537463 0.0007900599153245034 0.0008701737083641782 0.0009055757124909107 0.0009218909549822199 0.0009416347748850476 0.0009450532555019055 0.0008912224146887266 0.0007727221740842567 0.0006296342986623078 0.0005030317145494129 0.00039880592165459093 0.0003003899004650741 0.00020226617109820992 0.00011796120117655345 0.00006258753462346653 0.00003682836488374709 0.00003439575992661313 0.000026711709509461476 0.000029796252276295578 0.000038120097772277946 0.00005473562818607579 0.00008236911364064026 0.00011899803177516972 0.0001629895025833104 0.00021817936648992113 0.0002902993943691675 0.0003820241157457591 0.0004938979088174679 0.0006317512268016382 0.0007970503483696848 0.0009705099287999502 0.0011270689633863375 0.0012624736503087186 0.0013888305176585237 0.0014949492493011405 0.0015311746859497898 0.001453351627041389 0.0012722104792645462 0.0010447624265134054 0.0008239745350408578 0.0006304765274554547 0.00046332858412138564 0.0003206654954183226 0.00020424986233035343 0.00011779395139745176 0.00006258753462346452 0.00006028885013160232 0.00003706462000963406 0.0000381200977722763 0.00004802404642698417 0.0000622432677210684 0.0000868731035868383 0.0001243940374230856 0.00016905754840346063 0.00022463885487634472 0.000310088400531053 0.0004430836000988281 0.0006217834696838508 0.0008297072438039136 0.0010612533502024984 0.001331445714550185 0.0016584905708846665 0.00203803498283602 0.0024239791870858678 0.0027252012978601593 0.002841964997621884 0.0027278262838996794 0.0024148623704578105 0.0019821064539637862 0.0015115507963728593 0.0010719536575662409 0.0007181879547709635 0.0004737128545823651 0.0003158654422010087 0.00020424986233035194 0.00011796120117655011 0.00010990207288447766 0.00006307845147369451 0.000054735628186069044 0.00006224326772106424 0.00007553666539709105 0.00010310204404458244 0.00015107953004165302 0.0002107914629232051 0.00028716150921593886 0.00041038257064112326 0.000609022146285657 0.0008696279545382163 0.0011583572591615126 0.0015021101566728339 0.0019935386997361414 0.002698729676676629 0.0035655934957543154 0.004422978400784099 0.00506599039894629 0.005337764510923145 0.005174646336827478 0.004622831473009593 0.0038047658255811975 0.0028634056441512717 0.0019497470457856565 0.001214728941261355 0.0007370114712795588 0.00047371285458236526 0.0003206654954183219 0.0002022661710982085 0.00017526872371933277 0.00010322000910759977 0.00008236911364063782 0.00008687310358683928 0.00010310204404459031 0.00013978608386000234 0.00020537152754664508 0.00029086213465636654 0.0004031565891849637 0.0005817603729256123 0.0008625415369535998 0.0012246577971138563 0.0016519263713297863 0.002250232107860967 0.00320195673309374 0.004570037806178961 0.006171924531510293 0.007710433178781156 0.008932914694551087 0.00957801190646772 0.009386166372071906 0.008343439782146946 0.006767615584404156 0.005045103596017072 0.003431445061352018 0.0021108206748463145 0.0012147289412613573 0.0007181879547709658 0.0004633285841213858 0.00030038990046507325 0.00024516722341408304 0.00015154206168441507 0.0001189980317751659 0.00012439403742308774 0.00015107953004165833 0.00020537152754663445 0.00029703600034880175 0.0004193721286009148 0.0005833386314490031 0.0008364038989140021 0.0012208498047827957 0.0017314033525384091 0.002419859374637218 0.0035046384072238645 0.005225728102749314 0.0075469727353497384 0.010174247183974288 0.012938092278920276 0.015692722152502888 0.017674996409659065 0.017646077493263055 0.015258430610257605 0.011664359723122492 0.008248830730131537 0.005522965993520519 0.0034314450613520176 0.0019497470457856578 0.001071953657566244 0.0006304765274554538 0.00039880592165459077 0.0003213239699373915 0.00020872672490351626 0.00016298950258330648 0.00016905754840346014 0.00021079146292321072 0.0002908621346563621 0.00041937212860091827 0.0005962452510613986 0.0008408650019755518 0.0012060439533125764 0.001739525606265022 0.0024757860587300427 0.00357671094876303 0.005391246813130981 0.008167517098673117 0.011767808214400977 0.016130953814403687 0.02183352634840639 0.02901729743471954 0.035232198896082 0.03602771739152604 0.02995435275689364 0.02086459644375081 0.013230330906524554 0.008248830730131529 0.005045103596017063 0.0028634056441512634 0.0015115507963728598 0.0008239745350408545 0.0005030317145494119 0.00041701622182258627 0.0002817392936413712 0.00021817936648991512 0.0002246388548763481 0.0002871615092159535 0.0004031565891849467 0.0005833386314490058 0.0008408650019755469 0.0012099587610935386 0.0017465327290204968 0.0024978119909227986 0.0035435371058458467 0.005172902766082889 0.007869541377713726 0.01188921506922582 0.017197117076335013 0.024608649914735686 0.036366731310063405 0.05321910300325958 0.0689697734916783 0.0718448186560118 0.05787400730220691 0.03709954904779632 0.020864596443750806 0.011664359723122483 0.006767615584404147 0.0038047658255811892 0.0019821064539637823 0.001044762426513398 0.0006296342986623054 0.0005262171083925555 0.0003660870006756881 0.0002902993943691631 0.0003100884005310505 0.00041038257064112744 0.0005817603729256101 0.000836403898914007 0.0012060439533125749 0.0017465327290205014 0.0025187898826278437 0.0035620064684013302 0.004986649428306462 0.007195842070608358 0.010803241393581735 0.01612544317183192 0.02345686346995568 0.03492861208914283 0.055054691285063385 0.0853932486432805 0.11441220866588603 0.12002991041620258 0.09489057748909485 0.057874007302206903 0.02995435275689364 0.01525843061025759 0.008343439782146932 0.004622831473009578 0.00241486237045781 0.0012722104792645425 0.0007727221740842545 0.0006161255593246769 0.0004453625188348372 0.00038202411574576374 0.0004430836000988335 0.0006090221462856665 0.0008625415369536017 0.0012208498047828072 0.0017395256062650276 0.002497811990922806 0.0035620064684013355 0.004960423816152605 0.006814124455876283 0.00960322788700752 0.01405594523443135 0.020572286992175944 0.029682723819807404 0.04435217915922054 0.07046765868336341 0.1097939337563083 0.14696938808169446 0.15337842354304512 0.12002991041620262 0.0718448186560118 0.03602771739152603 0.017646077493263038 0.009386166372071899 0.005174646336827459 0.002727826283899674 0.00145335162704138 0.0008912224146887244 0.0006638652867328162 0.0005122217700908248 0.0004938979088174711 0.0006217834696838501 0.0008696279545382181 0.0012246577971138728 0.001731403352538417 0.002475786058730051 0.0035435371058458575 0.004986649428306476 0.006814124455876276 0.00913081995232882 0.012428670230404577 0.017509967750017327 0.0248332761242959 0.034771922171507014 0.0497965695295235 0.07491270404560921 0.11099495791676932 0.1434970768803001 0.14696938808169446 0.11441220866588601 0.06896977349167827 0.03523219889608198 0.017674996409659055 0.009578011906467702 0.005337764510923124 0.002841964997621871 0.0015311746859497785 0.0009450532555018935 0.000687620779423208 0.0005841060597842301 0.0006317512268016393 0.000829707243803917 0.0011583572591615206 0.0016519263713297863 0.002419859374637224 0.0035767109487630346 0.0051729027660828986 0.007195842070608365 0.009603227887007525 0.012428670230404578 0.016052285022226307 0.02124810892754825 0.028546983150662536 0.037967471560866946 0.0504913049371569 0.06864617972454859 0.09210298693624547 0.1109949579167693 0.1097939337563083 0.08539324864328052 0.05321910300325957 0.02901729743471952 0.015692722152502885 0.008932914694551075 0.005065990398946277 0.002725201297860149 0.0014949492493011238 0.0009416347748850412 0.0007212546483763905 0.0006814304005537403 0.0007970503483696877 0.0010612533502024906 0.0015021101566728347 0.0022502321078609827 0.0035046384072238653 0.005391246813130988 0.007869541377713727 0.01080324139358174 0.014055945234431346 0.01750996775001733 0.021248108927548248 0.025804124095663225 0.0318112285958015 0.039271442880153225 0.04793840415454885 0.05804858897493285 0.0686461797245486 0.0749127040456092 0.07046765868336338 0.055054691285063385 0.03636673131006339 0.02183352634840638 0.012938092278920265 0.007710433178781149 0.0044229784007840875 0.002423979187085862 0.0013888305176585171 0.000921890954982213 0.0007667896670978386 0.0007900599153244961 0.0009705099287999408 0.00133144571455018 0.0019935386997361393 0.00320195673309374 0.005225728102749316 0.008167517098673117 0.011889215069225816 0.016125443171831934 0.020572286992175958 0.02483327612429591 0.028546983150662536 0.031811228595801516 0.035269934863478375 0.039394509519579526 0.043876076872530166 0.04793840415454884 0.05049130493715689 0.049796569529523466 0.044352179159220524 0.03492861208914282 0.024608649914735672 0.016130953814403666 0.010174247183974283 0.006171924531510287 0.0035655934957543097 0.002038034982836017 0.0012624736503087039 0.0009055757124909079 0.0007897162282245139 0.0008701737083641773 0.00112706896338634 0.001658490570884663 0.0026987296766766275 0.004570037806178969 0.007546972735349737 0.011767808214400977 0.017197117076335006 0.02345686346995568 0.029682723819807404 0.034771922171507014 0.037967471560866946 0.039271442880153225 0.03939450951957951 0.039285425289338295 0.03939450951957952 0.039271442880153204 0.037967471560866946 0.03477192217150699 0.029682723819807365 0.023456863469955666 0.017197117076334992 0.011767808214400963 0.0075469727353497315 0.004570037806178957 0.0026987296766766244 0.0016584905708846639 0.0011270689633863335 0.0008701737083641782 0.0007667896670978398 0.0009055757124909084 0.0012624736503087108 0.002038034982836017 0.003565593495754315 0.006171924531510298 0.010174247183974288 0.016130953814403683 0.024608649914735686 0.03492861208914286 0.044352179159220566 0.049796569529523514 0.050491304937156894 0.047938404154548864 0.04387607687253016 0.03939450951957952 0.035269934863478375 0.031811228595801495 0.02854698315066253 0.02483327612429588 0.020572286992175923 0.016125443171831913 0.011889215069225799 0.0081675170986731 0.005225728102749311 0.0032019567330937248 0.001993538699736137 0.0013314457145501813 0.0009705099287999353 0.0007900599153244982 0.0007212546483763916 0.0009218909549822137 0.0013888305176585232 0.002423979187085861 0.004422978400784094 0.007710433178781157 0.012938092278920265 0.021833526348406386 0.0363667313100634 0.05505469128506339 0.07046765868336342 0.07491270404560922 0.06864617972454862 0.05804858897493286 0.04793840415454885 0.03927144288015322 0.03181122859580151 0.02580412409566321 0.02124810892754824 0.017509967750017317 0.014055945234431325 0.010803241393581731 0.007869541377713712 0.005391246813130979 0.0035046384072238597 0.002250232107860967 0.0015021101566728326 0.0010612533502024916 0.0007970503483696827 0.0006814304005537424 0.0006876207794232091 0.0009416347748850419 0.0014949492493011294 0.0027252012978601485 0.005065990398946286 0.008932914694551082 0.015692722152502885 0.02901729743471953 0.05321910300325958 0.08539324864328053 0.10979393375630835 0.11099495791676933 0.09210298693624547 0.0686461797245486 0.05049130493715689 0.037967471560866946 0.028546983150662536 0.021248108927548245 0.0160522850222263 0.012428670230404578 0.009603227887007511 0.007195842070608357 0.005172902766082885 0.00357671094876303 0.002419859374637219 0.0016519263713297727 0.0011583572591615193 0.0008297072438039185 0.0006317512268016363 0.0005841060597842315 0.0006638652867328166 0.0009450532555018925 0.0015311746859497824 0.002841964997621868 0.005337764510923132 0.009578011906467707 0.01767499640965905 0.03523219889608198 0.06896977349167827 0.11441220866588603 0.14696938808169446 0.14349707688030014 0.11099495791676932 0.07491270404560921 0.049796569529523486 0.03477192217150701 0.024833276124295894 0.017509967750017317 0.012428670230404575 0.009130819952328817 0.006814124455876278 0.004986649428306462 0.003543537105845846 0.002475786058730045 0.0017314033525384163 0.0012246577971138652 0.0008696279545382181 0.0006217834696838501 0.0004938979088174706 0.0005122217700908235 0.0006161255593246767 0.0008912224146887217 0.0014533516270413829 0.0027278262838996694 0.005174646336827465 0.009386166372071904 0.017646077493263038 0.03602771739152602 0.07184481865601178 0.12002991041620259 0.15337842354304512 0.14696938808169446 0.10979393375630832 0.07046765868336341 0.04435217915922054 0.0296827238198074 0.02057228699217594 0.01405594523443134 0.009603227887007522 0.006814124455876277 0.004960423816152613 0.003562006468401314 0.002497811990922799 0.0017395256062650282 0.001220849804782811 0.0008625415369536054 0.0006090221462856666 0.00044308360009883183 0.00038202411574576645 0.0004453625188348333 0.0005262171083925554 0.0007727221740842515 0.0012722104792645447 0.002414862370457803 0.004622831473009581 0.008343439782146932 0.015258430610257591 0.029954352756893624 0.0578740073022069 0.09489057748909481 0.12002991041620258 0.114412208665886 0.0853932486432805 0.055054691285063365 0.03492861208914283 0.023456863469955666 0.016125443171831916 0.010803241393581723 0.00719584207060836 0.004986649428306469 0.0035620064684013346 0.0025187898826278384 0.0017465327290204899 0.0012060439533125807 0.0008364038989140117 0.0005817603729256263 0.0004103825706411281 0.000310088400531048 0.0002902993943691686 0.0003660870006756833 0.00041701622182258605 0.0006296342986623041 0.0010447624265133995 0.001982106453963776 0.003804765825581188 0.006767615584404147 0.011664359723122485 0.020864596443750796 0.03709954904779629 0.05787400730220689 0.07184481865601178 0.06896977349167827 0.05321910300325957 0.03636673131006339 0.02460864991473568 0.017197117076335006 0.011889215069225807 0.007869541377713717 0.005172902766082889 0.0035435371058458415 0.0024978119909227995 0.0017465327290204834 0.0012099587610935293 0.0008408650019755478 0.0005833386314490105 0.0004031565891849658 0.00028716150921595285 0.00022463885487634575 0.00021817936648992146 0.0002817392936413669 0.00032132396993739184 0.0005030317145494129 0.0008239745350408558 0.0015115507963728537 0.00286340564415126 0.005045103596017061 0.008248830730131529 0.013230330906524545 0.02086459644375079 0.029954352756893617 0.036027717391526 0.03523219889608198 0.029017297434719525 0.021833526348406372 0.01613095381440368 0.01176780821440097 0.00816751709867311 0.005391246813130981 0.0035767109487630368 0.002475786058730046 0.0017395256062650386 0.0012060439533125768 0.0008408650019755485 0.0005962452510614011 0.0004193721286009223 0.0002908621346563818 0.00021079146292321104 0.00016905754840345952 0.00016298950258331329 0.00020872672490351304 0.000245167223414084 0.0003988059216545937 0.0006304765274554554 0.0010719536575662396 0.0019497470457856536 0.0034314450613520146 0.005522965993520521 0.008248830730131525 0.011664359723122481 0.015258430610257577 0.017646077493263034 0.017674996409659038 0.015692722152502885 0.01293809227892025 0.010174247183974286 0.0075469727353497254 0.005225728102749313 0.003504638407223856 0.002419859374637237 0.0017314033525384063 0.0012208498047828174 0.0008364038989139964 0.0005833386314490078 0.0004193721286009135 0.000297036000348807 0.00020537152754665028 0.00015107953004165833 0.00012439403742308856 0.00011899803177517318 0.00015154206168441263 0.0001752687237193329 0.0003003899004650764 0.000463328584121386 0.0007181879547709626 0.0012147289412613525 0.0021108206748463114 0.0034314450613520202 0.005045103596017063 0.006767615584404143 0.008343439782146925 0.009386166372071894 0.009578011906467697 0.008932914694551078 0.007710433178781143 0.006171924531510297 0.004570037806178956 0.003201956733093745 0.0022502321078609736 0.0016519263713298074 0.001224657797113856 0.0008625415369536225 0.0005817603729255985 0.000403156589184957 0.0002908621346563638 0.00020537152754664635 0.0001397860838600137 0.00010310204404458767 0.00008687310358684034 0.00008236911364064419 0.00010322000910759706 0.00010990207288447763 0.0002022661710982121 0.0003206654954183218 0.00047371285458236304 0.0007370114712795549 0.0012147289412613527 0.0019497470457856593 0.0028634056441512613 0.00380476582558119 0.004622831473009572 0.005174646336827454 0.005337764510923113 0.005065990398946279 0.004422978400784082 0.003565593495754312 0.0026987296766766184 0.0019935386997361375 0.0015021101566728265 0.0011583572591615354 0.0008696279545382088 0.0006090221462856638 0.00041038257064111204 0.0002871615092159495 0.00021079146292321042 0.00015107953004165608 0.00010310204404459268 0.00007553666539708805 0.00006224326772106643 0.00005473562818607552 0.00006307845147369203 0.000060288850131601315 0.00011796120117655361 0.0002042498623303512 0.0003158654422010065 0.00047371285458236217 0.000718187954770962 0.0010719536575662428 0.0015115507963728576 0.0019821064539637745 0.0024148623704578044 0.0027278262838996655 0.0028419649976218716 0.00272520129786015 0.0024239791870858582 0.0020380349828360176 0.0016584905708846597 0.00133144571455018 0.001061253350202484 0.0008297072438039154 0.0006217834696838464 0.00044308360009883866 0.0003100884005310577 0.00022463885487634778 0.00016905754840346548 0.00012439403742308885 0.00008687310358684594 0.0000622432677210637 0.00004802404642698561 0.000038120097772280616 0.00003706462000963045 0.000034395759926612866 0.00006258753462346925 0.00011779395139745174 0.00020424986233035156 0.0003206654954183222 0.0004633285841213859 0.0006304765274554571 0.0008239745350408571 0.0010447624265133967 0.0012722104792645436 0.0014533516270413785 0.0015311746859497843 0.00149494924930113 0.0013888305176585202 0.0012624736503087145 0.0011270689633863335 0.0009705099287999461 0.0007970503483696849 0.0006317512268016499 0.0004938979088174703 0.00038202411574577295 0.0002902993943691596 0.00021817936648992235 0.0001629895025833073 0.00011899803177517131 0.00008236911364064257 0.0000547356281860716 0.00003812009777227909 0.000029796252276298756 0.00002671170950945748 0.0000283246199779643 0.00003682836488375211 0.00006258753462346604 0.0001179612011765511 0.00020226617109821062 0.0003003899004650742 0.00039880592165459305 0.0005030317145494126 0.0006296342986623011 0.0007727221740842557 0.0008912224146887111 0.0009450532555018952 0.0009416347748850449 0.0009218909549822147 0.0009055757124909083 0.0008701737083641748 0.0007900599153245 0.0006814304005537375 0.0005841060597842309 0.0005122217700908241 0.0004453625188348344 0.0003660870006756852 0.00028173929364136836 0.00020872672490351515 0.0001515420616844106 0.00010322000910759709 0.0000630784514736897 0.00003706462000963082 0.00002671170950945835 0.00002584965898538464 0.00003655595560015577 0.00003557185750931505 0.000041319385248321364 0.00006927841106991529 0.00012443697714304802 0.0001982325344744391 0.00027877854625725593 0.0003688317936540765 0.00048372110075524215 0.0006161255593246789 0.0007258557129460851 0.0007842331047055416 0.0008116561588309215 0.000848652587863017 0.000899596926771197 0.0009254338743022589 0.0008995969267711935 0.0008486525878630274 0.0008116561588309285 0.0007842331047055624 0.000725855712946092 0.0006161255593246789 0.00048372110075524215 0.00036883179365407824 0.00027877854625725246 0.00019823253447444344 0.00012443697714305214 0.0000692784110699141 0.00004131938524831941 0.00003557185750931386 0.00003557185750931063 0.00003378055041345855 0.000035385816829217635 0.00004701150675251061 0.00007498642144383452 0.00011896774347643631 0.00017592000902818525 0.0002477776759972891 0.0003399973189839411 0.00044536251883483543 0.0005424395332519994 0.0006206635119981463 0.0006992403467681046 0.0008039528511211475 0.0009248564411888041 0.0010189283889044897 0.0010633634004519066 0.0010826685402583601 0.0011029764516615383 0.0011033690494170456 0.0010359122065182317 0.0008912224146887286 0.0007178665296542963 0.0005666602319166247 0.0004446288697689905 0.00033140131162270317 0.00022075191810651056 0.00012834877183813854 0.0000694534239772626 0.000043235477902205726 0.00004131938524831631 0.00003538581682921974 0.00004244351625248899 0.0000534867730496908 0.00006978108319975275 0.00009890637973826212 0.00014536777784028253 0.0002082531196669506 0.00028670028072873743 0.0003820241157457642 0.0004936140235558717 0.000619928935496508 0.0007668541041885802 0.0009407587239141591 0.001131106546132809 0.0013145279401521133 0.0014775571166893112 0.0016224551241649828 0.0017355804206419878 0.0017673346539450925 0.0016700548810745848 0.0014533516270413879 0.0011822360315786303 0.0009202033550584999 0.0006923623475488142 0.000498462305990984 0.00033825695584043756 0.0002138467588570359 0.00012514458310738434 0.00006945342397726359 0.00006927841106991042 0.00004701150675251299 0.00005348677304968804 0.00006835590124955515 0.00008400938969302702 0.00011318982875864928 0.00016697925239012322 0.00023964913362904756 0.0003274960299765997 0.0004430836000988382 0.0006026697091401506 0.000802340509707852 0.0010219478720986856 0.0012617286215816496 0.0015544662428558075 0.0019295502396633577 0.0023697225303135235 0.002801816126635201 0.003119967987070013 0.003228437579871231 0.003086925039933336 0.0027278262838996764 0.0022318845186097467 0.0016880521502273173 0.0011766546693540224 0.0007669655867827602 0.0004915278415428211 0.0003245071852586883 0.00021384675885703197 0.00012834877183813626 0.00012443697714304626 0.00007498642144384081 0.00006978108319975293 0.00008400938969303111 0.00010514847136896313 0.00014673972099953975 0.00022295862859128117 0.00032387472212927856 0.0004446632000163196 0.0006090221462856611 0.0008478810904686472 0.0011458895699827402 0.0014604937925648636 0.001825204008814365 0.0023618270227441997 0.003158287344604469 0.004139463137881508 0.005081308636276995 0.005751359337704085 0.006004520936120351 0.005795395785142994 0.005174646336827471 0.004261837790878293 0.003200677769729527 0.002157533096200783 0.0013149137141692023 0.000775324106980638 0.0004915278415428211 0.00033825695584043306 0.00022075191810650628 0.00019823253447444098 0.00011896774347644245 0.00009890637973826047 0.00011318982875865142 0.00014673972099954252 0.00021069153291213466 0.00031852290143668437 0.00045802707986650036 0.0006269184999834852 0.0008625415369536149 0.0012086120836674226 0.0016434510892206775 0.002139123729663383 0.0028100800161901893 0.0038771846297218334 0.005425288999380869 0.007230885503687026 0.008929833570272605 0.010237380254440192 0.010884820552833423 0.010602809983185002 0.00938616637207191 0.0075933488918848374 0.005648678265475139 0.0038244570202485345 0.0023263946674731348 0.0013149137141692056 0.0007669655867827637 0.0004984623059909851 0.0003314013116227013 0.0002787785462572521 0.00017592000902818633 0.0001453677778402738 0.00016697925239012314 0.00022295862859128158 0.00031852290143667385 0.0004639337960051334 0.0006500135096252602 0.0008847228995316183 0.00122084980478281 0.001712433676381477 0.002354831169547929 0.003192916721677649 0.004462883841154424 0.006443731463249312 0.009106667450547156 0.012128142883814006 0.015326377141967948 0.018522657783122464 0.020780306627006553 0.02061112201000015 0.017646077493263048 0.013326033228026436 0.009317982583385745 0.006190457485260739 0.003824457020248536 0.002157533096200785 0.0011766546693540256 0.0006923623475488161 0.00044462886976899036 0.00036883179365407775 0.00024777767599729386 0.00020825311966694886 0.00023964913362905182 0.00032387472212928463 0.0004580270798664974 0.0006500135096252667 0.0009038676023293295 0.0012460069125889664 0.0017395256062650273 0.0024416984473356416 0.00338905966569943 0.00475392071282566 0.006923153073596431 0.010179124463848844 0.01439934812476545 0.019618811318097906 0.026619531064699168 0.03552916848266975 0.04315798504401966 0.04388257004641344 0.03602771739152603 0.024603902216747162 0.015236007343764202 0.009317982583385733 0.005648678265475134 0.0032006777697295256 0.0016880521502273195 0.000920203355058503 0.0005666602319166236 0.0004837211007552403 0.000339997318983945 0.0002867002807287326 0.00032749602997659936 0.0004446632000163286 0.0006269184999834628 0.0008847228995316204 0.0012460069125889643 0.0017619709067586797 0.0024978119909228086 0.003500116031062487 0.00485250463067137 0.006884090603571326 0.010148692673302803 0.014947087410735702 0.021340499097863355 0.030550059905471997 0.0455178264797081 0.06708402303583848 0.08704897352051251 0.09023345115385847 0.0718448186560118 0.0451078343886094 0.024603902216747162 0.01332603322802642 0.0075933488918848305 0.004261837790878281 0.0022318845186097475 0.00118223603157863 0.0007178665296542943 0.0006161255593246733 0.0004453625188348368 0.00038202411574576124 0.00044308360009883286 0.0006090221462856643 0.0008625415369535959 0.0012208498047828024 0.0017395256062650221 0.0024978119909228047 0.0035620064684013346 0.004960423816152617 0.00681412445587629 0.009603227887007527 0.014055945234431357 0.020572286992175955 0.02968272381980741 0.044352179159220545 0.07046765868336342 0.10979393375630832 0.1469693880816945 0.15337842354304512 0.1200299104162026 0.0718448186560118 0.036027717391526035 0.01764607749326303 0.0093861663720719 0.005174646336827457 0.002727826283899673 0.0014533516270413829 0.0008912224146887214 0.0007258557129460842 0.0005424395332519978 0.0004936140235558637 0.0006026697091401597 0.0008478810904686651 0.0012086120836674065 0.0017124336763814814 0.002441698447335636 0.003500116031062475 0.004960423816152626 0.006844460467642525 0.009298505535895465 0.012911808749935786 0.0185772433999658 0.02683461413438965 0.03855471669697163 0.05780088809326292 0.09217668859203688 0.14346166377168398 0.19105889057568617 0.1979651696277933 0.15337842354304515 0.09023345115385846 0.043882570046413424 0.02061112201000013 0.010602809983184988 0.005795395785142966 0.003086925039933325 0.001670054881074567 0.0010359122065182228 0.0007842331047055581 0.00062066351199815 0.0006199289354965178 0.0008023405097078604 0.001145889569982755 0.0016434510892207013 0.002354831169547921 0.0033890596656994294 0.004852504630671363 0.006814124455876296 0.009298505535895476 0.01244252109941377 0.016841301099417103 0.02349789729598117 0.03308671725470336 0.046321660756907544 0.06659102873504198 0.1001822094906155 0.14741724073021095 0.1885942788956873 0.19105889057568615 0.14696938808169446 0.0870489735205125 0.043157985044019645 0.02078030662700654 0.010884820552833413 0.006004520936120335 0.003228437579871226 0.0017673346539450881 0.0011033690494170354 0.0008116561588309164 0.0006992403467680959 0.0007668541041885663 0.00102194787209868 0.0014604937925648649 0.002139123729663382 0.00319291672167764 0.0047539207128256536 0.006884090603571322 0.009603227887007529 0.012911808749935801 0.016841301099417096 0.02177177369997527 0.0286496823361066 0.03834686322647695 0.05122583225919664 0.06866773887166151 0.09348758096382308 0.12425304459139379 0.14741724073021095 0.143461663771684 0.10979393375630832 0.06708402303583848 0.03552916848266974 0.01852265778312246 0.010237380254440178 0.005751359337704071 0.0031199679870699925 0.0017355804206419642 0.00110297645166152 0.0008486525878630239 0.0008039528511211462 0.0009407587239141598 0.0012617286215816463 0.0018252040088143618 0.0028100800161902067 0.004462883841154413 0.0069231530735964315 0.010148692673302805 0.01405594523443136 0.01857724339996581 0.023497897295981174 0.0286496823361066 0.03456537249730393 0.042377732608002046 0.052654803118563104 0.06518714478868118 0.07957358172116913 0.09348758096382308 0.1001822094906155 0.09217668859203684 0.07046765868336341 0.045517826479708076 0.02661953106469916 0.015326377141967936 0.008929833570272593 0.005081308636276989 0.002801816126635195 0.0016224551241649783 0.0010826685402583534 0.0008995969267711873 0.0009248564411887993 0.0011311065461327998 0.0015544662428557954 0.0023618270227441962 0.0038771846297218303 0.00644373146324931 0.010179124463848839 0.014947087410735702 0.020572286992175958 0.02683461413438966 0.03308671725470338 0.03834686322647696 0.04237773260800206 0.04639919581004443 0.05188798945407267 0.05874562097273794 0.06518714478868118 0.06866773887166151 0.06659102873504194 0.057800888093262906 0.044352179159220524 0.030550059905471987 0.01961881131809789 0.012128142883814001 0.007230885503687011 0.004139463137881499 0.0023697225303135195 0.0014775571166893002 0.001063363400451899 0.0009254338743022541 0.0010189283889044795 0.001314527940152107 0.0019295502396633503 0.003158287344604465 0.005425288999380874 0.00910666745054715 0.014399348124765447 0.021340499097863355 0.02968272381980741 0.03855471669697165 0.04632166075690755 0.05122583225919665 0.052654803118563104 0.05188798945407266 0.05123786746513384 0.051887989454072664 0.05265480311856309 0.051225832259196635 0.04632166075690752 0.03855471669697161 0.02968272381980739 0.02134049909786334 0.014399348124765442 0.009106667450547147 0.00542528899938086 0.003158287344604465 0.0019295502396633546 0.0013145279401521044 0.0010189283889044827 0.0008995969267711874 0.001063363400451897 0.0014775571166893028 0.002369722530313517 0.004139463137881499 0.007230885503687026 0.012128142883814003 0.0196188113180979 0.030550059905472007 0.044352179159220566 0.05780088809326296 0.066591028735042 0.06866773887166153 0.06518714478868119 0.05874562097273794 0.051887989454072664 0.04639919581004443 0.04237773260800204 0.03834686322647694 0.033086717254703336 0.026834614134389628 0.02057228699217593 0.014947087410735685 0.010179124463848834 0.006443731463249307 0.0038771846297218113 0.0023618270227441954 0.0015544662428558014 0.001131106546132797 0.0009248564411888035 0.0008486525878630232 0.0010826685402583521 0.0016224551241649802 0.002801816126635193 0.005081308636276988 0.008929833570272603 0.015326377141967938 0.026619531064699158 0.04551782647970809 0.07046765868336342 0.0921766885920369 0.10018220949061553 0.09348758096382309 0.07957358172116913 0.06518714478868116 0.0526548031185631 0.042377732608002046 0.034565372497303924 0.02864968233610659 0.02349789729598116 0.018577243399965776 0.014055945234431351 0.010148692673302786 0.006923153073596436 0.00446288384115441 0.0028100800161901876 0.0018252040088143576 0.0012617286215816537 0.000940758723914156 0.0008039528511211503 0.0008116561588309158 0.00110297645166152 0.0017355804206419666 0.003119967987069992 0.005751359337704071 0.010237380254440187 0.018522657783122464 0.035529168482669744 0.0670840230358385 0.10979393375630833 0.14346166377168404 0.14741724073021098 0.12425304459139382 0.09348758096382308 0.0686677388716615 0.051225832259196635 0.03834686322647694 0.02864968233610659 0.02177177369997526 0.016841301099417092 0.012911808749935779 0.009603227887007527 0.0068840906035713065 0.004753920712825661 0.0031929167216776387 0.002139123729663366 0.001460493792564859 0.001021947872098687 0.0007668541041885632 0.0006992403467680987 0.0007842331047055571 0.0011033690494170344 0.001767334653945089 0.003228437579871225 0.006004520936120338 0.01088482055283342 0.020780306627006542 0.043157985044019645 0.0870489735205125 0.14696938808169446 0.19105889057568615 0.18859427889568733 0.14741724073021098 0.1001822094906155 0.06659102873504195 0.04632166075690754 0.03308671725470335 0.02349789729598115 0.0168413010994171 0.012442521099413757 0.009298505535895462 0.006814124455876292 0.004852504630671351 0.003389059665699437 0.0023548311695479242 0.0016434510892206946 0.001145889569982748 0.0008023405097078638 0.0006199289354965168 0.0006206635119981489 0.0007258557129460834 0.0010359122065182202 0.001670054881074567 0.003086925039933323 0.00579539578514297 0.01060280998318499 0.020611122010000132 0.04388257004641341 0.09023345115385843 0.15337842354304512 0.1979651696277933 0.19105889057568617 0.143461663771684 0.09217668859203687 0.05780088809326291 0.03855471669697162 0.02683461413438964 0.018577243399965783 0.012911808749935784 0.009298505535895457 0.0068444604676425125 0.0049604238161526145 0.003500116031062465 0.0024416984473356446 0.0017124336763814881 0.0012086120836674137 0.0008478810904686578 0.000602669709140158 0.0004936140235558664 0.0005424395332519924 0.0006161255593246732 0.0008912224146887186 0.001453351627041383 0.0027278262838996707 0.0051746463368274615 0.0093861663720719 0.017646077493263038 0.036027717391526014 0.07184481865601179 0.12002991041620256 0.15337842354304512 0.14696938808169444 0.10979393375630832 0.0704676586833634 0.044352179159220545 0.029682723819807393 0.02057228699217595 0.014055945234431337 0.009603227887007524 0.0068141244558762816 0.0049604238161526145 0.0035620064684013315 0.002497811990922798 0.001739525606265033 0.0012208498047828087 0.000862541536953614 0.0006090221462856579 0.0004430836000988263 0.0003820241157457679 0.00044536251883482936 0.00048372110075524047 0.0007178665296542936 0.0011822360315786303 0.0022318845186097462 0.004261837790878282 0.007593348891884832 0.013326033228026423 0.02460390221674716 0.04510783438860937 0.07184481865601178 0.09023345115385843 0.0870489735205125 0.06708402303583849 0.04551782647970808 0.030550059905471993 0.02134049909786335 0.014947087410735698 0.010148692673302786 0.006884090603571321 0.004852504630671358 0.0035001160310624726 0.002497811990922794 0.0017619709067586723 0.0012460069125889682 0.000884722899531625 0.000626918499983482 0.00044466320001632255 0.00032749602997659026 0.0002867002807287414 0.00033999731898393777 0.0003688317936540787 0.0005666602319166262 0.0009202033550585045 0.001688052150227317 0.0032006777697295217 0.005648678265475134 0.009317982583385736 0.0152360073437642 0.02460390221674714 0.03602771739152599 0.0438825700464134 0.04315798504401964 0.03552916848266973 0.02661953106469915 0.019618811318097906 0.014399348124765447 0.01017912446384884 0.00692315307359642 0.004753920712825662 0.0033890596656994294 0.002441698447335657 0.0017395256062650293 0.0012460069125889669 0.000903867602329332 0.0006500135096252711 0.0004580270798665131 0.00032387472212928067 0.00023964913362904173 0.0002082531196669581 0.00024777767599728833 0.0002787785462572542 0.00044462886976899616 0.0006923623475488196 0.0011766546693540232 0.0021575330962007797 0.0038244570202485336 0.006190457485260741 0.00931798258338574 0.013326033228026425 0.017646077493263013 0.02061112201000013 0.02078030662700652 0.01852265778312246 0.015326377141967922 0.012128142883814017 0.009106667450547147 0.006443731463249319 0.0044628838411544065 0.0031929167216776582 0.0023548311695479156 0.0017124336763815128 0.0012208498047827996 0.0008847228995316188 0.0006500135096252572 0.0004639337960051376 0.00031852290143668437 0.00022295862859128123 0.00016697925239011235 0.000145367777840283 0.00017592000902818267 0.0001982325344744422 0.00033140131162270783 0.0004984623059909883 0.0007669655867827594 0.0013149137141691982 0.0023263946674731296 0.003824457020248536 0.0056486782654751365 0.007593348891884826 0.009386166372071885 0.010602809983184976 0.010884820552833404 0.010237380254440183 0.008929833570272588 0.0072308855036870325 0.005425288999380864 0.003877184629721836 0.0028100800161901867 0.0021391237296634062 0.0016434510892206903 0.0012086120836674306 0.0008625415369535828 0.0006269184999834736 0.0004580270798664898 0.00031852290143668155 0.00021069153291214046 0.00014673972099954312 0.0001131898287586402 0.00009890637973826746 0.00011896774347643869 0.00012443697714304775 0.00022075191810651287 0.0003382569558404369 0.0004915278415428163 0.000775324106980632 0.0013149137141691952 0.0021575330962007836 0.0032006777697295248 0.004261837790878279 0.005174646336827446 0.005795395785142959 0.006004520936120316 0.0057513593377040715 0.005081308636276978 0.004139463137881506 0.0031582873446044635 0.0023618270227442084 0.0018252040088143579 0.0014604937925648683 0.0011458895699827595 0.0008478810904686616 0.0006090221462856633 0.0004446632000163286 0.0003238747221292787 0.00022295862859127993 0.0001467397209995456 0.00010514847136896577 0.00008400938969302141 0.00006978108319975903 0.00007498642144383795 0.00006927841106991065 0.00012834877183814063 0.00021384675885703522 0.0003245071852586839 0.000491527841542816 0.0007669655867827531 0.001176654669354023 0.001688052150227317 0.0022318845186097367 0.0027278262838996642 0.0030869250399333183 0.003228437579871211 0.0031199679870699986 0.00280181612663519 0.002369722530313526 0.0019295502396633594 0.0015544662428557978 0.0012617286215816485 0.0010219478720986798 0.0008023405097078758 0.0006026697091401487 0.00044308360009883866 0.00032749602997659584 0.00023964913362905187 0.0001669792523901186 0.0001131898287586526 0.00008400938969303006 0.00006835590124954741 0.000053486773049692154 0.00004701150675250955 0.00004131938524831699 0.00006945342397726673 0.00012514458310738857 0.00021384675885703365 0.0003382569558404347 0.0004984623059909787 0.0006923623475488191 0.0009202033550585009 0.0011822360315786244 0.0014533516270413746 0.0016700548810745675 0.001767334653945067 0.0017355804206419716 0.0016224551241649774 0.0014775571166893142 0.0013145279401521057 0.0011311065461328087 0.0009407587239141525 0.0007668541041885816 0.0006199289354965078 0.0004936140235558746 0.00038202411574576444 0.0002867002807287348 0.0002082531196669457 0.00014536777784027521 0.00009890637973826383 0.00006978108319975709 0.000053486773049685533 0.00004244351625249162 0.000035385816829217384 0.00003557185750931097 0.00004323547790220721 0.00006945342397726619 0.00012834877183813797 0.00022075191810650758 0.000331401311622697 0.00044462886976899416 0.0005666602319166228 0.0007178665296542953 0.0008912224146887197 0.0010359122065182222 0.0011033690494170257 0.001102976451661527 0.0010826685402583489 0.0010633634004519066 0.0010189283889044836 0.0009248564411887997 0.0008039528511211419 0.0006992403467681069 0.000620663511998158 0.0005424395332519974 0.0004453625188348392 0.0003399973189839387 0.00024777767599728774 0.00017592000902818037 0.00011896774347643943 0.00007498642144383883 0.00004701150675250793 0.00003538581682921806 0.00003378055041345674 0.00003710588664386657 0.000037323660304483097 0.000046397958466130786 0.00007921512669110194 0.0001396887624253813 0.00021814488333107016 0.00030401769822515756 0.00040141036955367547 0.0005240339424708983 0.0006638652867328142 0.0007842331047055694 0.0008602438311349526 0.0009088671603585778 0.0009628131037069318 0.0010223797079019666 0.0010503100328411834 0.00102237970790197 0.0009628131037069318 0.0009088671603585674 0.0008602438311349457 0.0007842331047055555 0.0006638652867328246 0.000524033942470907 0.000401410369553672 0.0003040176982251593 0.00021814488333107666 0.00013968876242537653 0.00007921512669110129 0.00004639795846613534 0.00003732366030448136 0.00003732366030448217 0.0000381825714902025 0.000043658645204252785 0.00005906705547390923 0.00008970530400963627 0.00013719159990130793 0.00020289046441402024 0.0002890580940773222 0.0003957651850725558 0.0005122217700908269 0.0006206635119981522 0.0007164119706880387 0.0008161527036543772 0.0009370424568941398 0.0010646588843714019 0.001157905179173965 0.0011973429792128698 0.0012065670294402967 0.0012098210104861202 0.0011893217655105826 0.0011033690494170383 0.0009450532555019064 0.0007609761381989977 0.0006011759042085253 0.00047351329888212587 0.00035604221904844495 0.0002390574811461089 0.00013880284057141338 0.00007386269411413579 0.00004471729841545008 0.00004639795846613285 0.000043658645204256316 0.00005534001214468058 0.00007040658488429089 0.00008929388863325043 0.00012413553643970019 0.00018599940050381252 0.00027449300329204123 0.00037963807815661916 0.0004938979088174731 0.0006199289354965269 0.0007654503468072759 0.0009350204265440118 0.0011239034969201798 0.001316568095776349 0.001494116503295452 0.0016478117139200673 0.0017794167978722845 0.0018739209437563904 0.0018846393517467962 0.00176733465394509 0.0015311746859497852 0.001240872173438077 0.000963234949391188 0.0007261632918973136 0.0005270594962774794 0.0003605926497320415 0.00022811134622592927 0.00013267912482792314 0.00007386269411413397 0.00007921512669110129 0.00005906705547390955 0.00007040658488428776 0.00009168287533174389 0.00011453422882452683 0.00015654031394054602 0.00023652325713134043 0.00034950119417327577 0.00047810797513389623 0.0006217834696838629 0.0008023405097078542 0.0010287461375447157 0.001278104311571265 0.0015340316098065984 0.0018231338833620346 0.002183980940551461 0.0026064943852817293 0.003017057632244775 0.0033101307952636545 0.0033938858370837002 0.003228437579871227 0.002841964997621869 0.0023155029140805305 0.0017456059351057607 0.0012183841389811479 0.0008006309005604039 0.000518955882175917 0.000345101179492469 0.0002281113462259259 0.00013880284057141235 0.0001396887624253797 0.00008970530400963526 0.00008929388863324616 0.00011453422882452715 0.00015191940053496685 0.00021758712571748762 0.00033287461528254435 0.0004883595058147604 0.0006636557209989223 0.0008696279545382316 0.0011458895699827463 0.0014902181260945438 0.0018515398190606307 0.0022406580347984115 0.0027739623811732983 0.003552837721414822 0.004510620325940206 0.005421110613354327 0.006050605342605949 0.006258842946612745 0.006004520936120342 0.005337764510923133 0.004379127580087883 0.0032799082195145513 0.0022129533178503204 0.0013576193121938379 0.0008095426567044831 0.0005189558821759218 0.000360592649732042 0.00023905748114611228 0.00021814488333107254 0.00013719159990131205 0.00012413553643970404 0.0001565403139405559 0.00021758712571749988 0.00031773507373240915 0.00047557676264576226 0.0006808862036299094 0.0009209194452240965 0.0012246577971138746 0.0016434510892206979 0.002162136168289131 0.0027352573802774706 0.003453012634116618 0.004537419787465313 0.006089358996347633 0.007885851634352308 0.009543175734881951 0.01076200947832743 0.01128723236071914 0.01088482055283341 0.009578011906467709 0.007727115860575976 0.005744944457247077 0.0038961044023771425 0.0023815163812629975 0.0013576193121938361 0.0008006309005604077 0.0005270594962774784 0.0003560422190484434 0.00030401769822515956 0.0002028904644140221 0.00018599940050381095 0.0002365232571313414 0.00033287461528254435 0.00047557676264574166 0.0006797234220084588 0.0009448983181505521 0.0012792562992190331 0.0017314033525384223 0.002354831169547914 0.003137278091103788 0.004098860343354643 0.005460917229675777 0.007517489748370425 0.01025048918273596 0.013300080450640442 0.01641060648739892 0.019358270366481176 0.021259632970865458 0.02078030662700654 0.01767499640965906 0.013355186574400192 0.00938310961145656 0.00627031065322798 0.003896104402377146 0.002212953317850318 0.001218384138981152 0.0007261632918973125 0.00047351329888212684 0.00040141036955367867 0.0002890580940773222 0.0002744930032920391 0.00034950119417327647 0.0004883595058147583 0.0006808862036298988 0.0009448983181505558 0.0013044219419491028 0.0017953659478324852 0.0024757860587300558 0.0033890596656994264 0.004548630795370643 0.00610381900746991 0.008449495985470217 0.011899632005612585 0.016313578902386976 0.021600447001363182 0.02834584680170842 0.03654237041029714 0.04316919361830618 0.04315798504401965 0.035232198896081986 0.024168342736126214 0.015142111007148462 0.009383109611456546 0.0057449444572470745 0.0032799082195145417 0.0017456059351057636 0.0009632349493911905 0.0006011759042085286 0.0005240339424709094 0.0003957651850725665 0.0003796380781566204 0.0004781079751339055 0.0006636557209989316 0.0009209194452240732 0.0012792562992190403 0.0017953659478324774 0.0025319910818477646 0.003543537105845861 0.00485250463067136 0.006514726734788965 0.00885116389647317 0.012455354564246365 0.01767088697656699 0.0244766164533361 0.03380867422689518 0.048152048763744876 0.06795136304519563 0.0854511061047993 0.0870489735205125 0.06896977349167828 0.04358793167375027 0.024168342736126214 0.01335518657440018 0.007727115860575974 0.004379127580087871 0.002315502914080532 0.0012408721734380723 0.0007609761381989986 0.0006638652867328214 0.0005122217700908284 0.0004938979088174735 0.0006217834696838544 0.000869627954538214 0.0012246577971138683 0.0017314033525384206 0.0024757860587300493 0.003543537105845862 0.004986649428306471 0.006814124455876287 0.009130819952328827 0.01242867023040457 0.017509967750017324 0.0248332761242959 0.03477192217150701 0.04979656952952348 0.07491270404560924 0.1109949579167693 0.14349707688030017 0.14696938808169446 0.11441220866588603 0.06896977349167828 0.035232198896082 0.01767499640965904 0.009578011906467706 0.005337764510923121 0.002841964997621879 0.0015311746859497856 0.0009450532555018989 0.0007842331047055634 0.0006206635119981527 0.0006199289354965222 0.0008023405097078669 0.001145889569982752 0.0016434510892207057 0.0023548311695479347 0.0033890596656994333 0.00485250463067137 0.006814124455876285 0.009298505535895455 0.012442521099413769 0.016841301099417078 0.02349789729598117 0.03308671725470335 0.04632166075690753 0.06659102873504195 0.10018220949061551 0.14741724073021095 0.18859427889568736 0.19105889057568615 0.1469693880816945 0.0870489735205125 0.043157985044019666 0.02078030662700654 0.010884820552833414 0.006004520936120329 0.0032284375798712333 0.00176733465394509 0.001103369049417041 0.0008602438311349474 0.0007164119706880187 0.0007654503468072695 0.0010287461375447044 0.0014902181260945126 0.002162136168289133 0.0031372780911037693 0.004548630795370629 0.006514726734788959 0.009130819952328827 0.012442521099413758 0.016525152107304975 0.02189076798410276 0.029690429604246074 0.0409670487024712 0.05648559203452079 0.07887991219536251 0.11281644974287013 0.1567811615087032 0.19153674991461137 0.18859427889568733 0.14349707688030014 0.08545110610479931 0.043169193618306186 0.021259632970865448 0.01128723236071913 0.006258842946612733 0.0033938858370837037 0.0018846393517467897 0.0011893217655105767 0.0009088671603585781 0.0008161527036543686 0.0009350204265440095 0.0012781043115712668 0.0018515398190606278 0.0027352573802774728 0.0040988603433546504 0.006103819007469914 0.008851163896473174 0.012428670230404582 0.016841301099417096 0.02189076798410277 0.027636802532900424 0.03518834279291237 0.046238820468267196 0.061744137967736784 0.08242112353905497 0.10918928639667484 0.13854009018097047 0.15678116150870317 0.14741724073021098 0.11099495791676933 0.06795136304519564 0.03654237041029714 0.01935827036648119 0.010762009478327436 0.006050605342605956 0.003310130795263671 0.0018739209437563815 0.001209821010486134 0.0009628131037069287 0.0009370424568941306 0.001123903496920184 0.001534031609806593 0.002240658034798411 0.0034530126341166516 0.005460917229675774 0.008449495985470214 0.012455354564246367 0.017509967750017327 0.023497897295981143 0.02969042960424606 0.035188342792912344 0.04060359154257609 0.048458000595130814 0.06076976938801451 0.0770637825693041 0.09479720627444045 0.10918928639667484 0.11281644974287014 0.1001822094906155 0.07491270404560924 0.04815204876374487 0.02834584680170843 0.016410606487398924 0.009543175734881951 0.005421110613354321 0.0030170576322447774 0.001779416797872282 0.0012065670294402922 0.0010223797079019676 0.0010646588843713969 0.0013165680957763501 0.0018231338833620317 0.002773962381173295 0.004537419787465323 0.007517489748370423 0.011899632005612584 0.017670886976566987 0.02483327612429591 0.03308671725470334 0.0409670487024712 0.046238820468267175 0.048458000595130835 0.0506179217203155 0.05654257027060355 0.06663205520314515 0.0770637825693041 0.082421123539055 0.0788799121953625 0.06659102873504197 0.049796569529523486 0.03380867422689518 0.021600447001363186 0.013300080450640454 0.007885851634352301 0.004510620325940207 0.002606494385281738 0.0016478117139200601 0.0011973429792128628 0.0010503100328411814 0.001157905179173961 0.0014941165032954585 0.0021839809405514565 0.0035528377214148164 0.006089358996347648 0.010250489182735956 0.016313578902386973 0.024476616453336097 0.034771922171507014 0.04632166075690752 0.05648559203452079 0.06174413796773677 0.060769769388014525 0.05654257027060354 0.05427095251989683 0.05654257027060355 0.06076976938801452 0.06174413796773681 0.05648559203452079 0.04632166075690752 0.03477192217150702 0.024476616453336097 0.016313578902386973 0.010250489182735963 0.006089358996347631 0.0035528377214148186 0.0021839809405514664 0.0014941165032954491 0.001157905179173961 0.0010223797079019679 0.0011973429792128628 0.00164781171392007 0.0026064943852817293 0.00451062032594021 0.007885851634352316 0.01330008045064045 0.02160044700136319 0.03380867422689518 0.04979656952952351 0.06659102873504198 0.0788799121953625 0.08242112353905497 0.0770637825693041 0.06663205520314515 0.05654257027060355 0.050617921720315505 0.04845800059513082 0.04623882046826721 0.040967048702471184 0.03308671725470334 0.024833276124295905 0.017670886976566984 0.011899632005612577 0.007517489748370429 0.0045374197874653 0.0027739623811733 0.0018231338833620406 0.0013165680957763415 0.001064658884371397 0.000962813103706928 0.0012065670294402915 0.0017794167978722908 0.0030170576322447688 0.0054211106133543255 0.009543175734881957 0.016410606487398918 0.028345846801708423 0.048152048763744855 0.07491270404560922 0.10018220949061549 0.11281644974287011 0.10918928639667483 0.09479720627444045 0.07706378256930409 0.06076976938801452 0.048458000595130814 0.04060359154257608 0.035188342792912365 0.02969042960424607 0.023497897295981146 0.017509967750017334 0.01245535456424636 0.008449495985470215 0.005460917229675776 0.003453012634116628 0.002240658034798418 0.0015340316098066001 0.0011239034969201763 0.00093704245689413 0.0009088671603585776 0.0012098210104861337 0.001873920943756391 0.003310130795263665 0.006050605342605965 0.010762009478327441 0.019358270366481193 0.03654237041029714 0.06795136304519564 0.11099495791676933 0.14741724073021098 0.15678116150870314 0.13854009018097047 0.10918928639667483 0.08242112353905495 0.061744137967736784 0.04623882046826719 0.035188342792912365 0.027636802532900448 0.021890767984102773 0.016841301099417078 0.012428670230404594 0.008851163896473169 0.006103819007469917 0.00409886034335465 0.0027352573802774493 0.0018515398190606354 0.0012781043115712722 0.000935020426544005 0.0008161527036543664 0.0008602438311349465 0.0011893217655105756 0.0018846393517467975 0.0033938858370836976 0.006258842946612742 0.011287232360719131 0.021259632970865444 0.04316919361830618 0.08545110610479928 0.14349707688030014 0.18859427889568733 0.19153674991461137 0.15678116150870317 0.11281644974287013 0.0788799121953625 0.05648559203452078 0.04096704870247119 0.029690429604246057 0.021890767984102787 0.016525152107304965 0.012442521099413751 0.009130819952328827 0.0065147267347889564 0.004548630795370631 0.003137278091103771 0.002162136168289117 0.0014902181260945193 0.0010287461375447055 0.0007654503468072685 0.0007164119706880131 0.000784233104705562 0.0011033690494170376 0.0017673346539450957 0.0032284375798712277 0.006004520936120339 0.010884820552833413 0.02078030662700654 0.04315798504401965 0.08704897352051248 0.14696938808169446 0.19105889057568612 0.18859427889568733 0.14741724073021098 0.10018220949061551 0.06659102873504195 0.04632166075690754 0.03308671725470335 0.023497897295981156 0.0168413010994171 0.01244252109941375 0.009298505535895457 0.006814124455876288 0.004852504630671364 0.00338905966569944 0.002354831169547936 0.001643451089220705 0.001145889569982758 0.0008023405097078638 0.0006199289354965256 0.000620663511998144 0.0006638652867328201 0.0009450532555018936 0.0015311746859497895 0.002841964997621873 0.005337764510923131 0.009578011906467702 0.017674996409659048 0.03523219889608198 0.06896977349167828 0.114412208665886 0.14696938808169446 0.14349707688030014 0.11099495791676933 0.07491270404560921 0.0497965695295235 0.034771922171507 0.0248332761242959 0.01750996775001732 0.012428670230404582 0.009130819952328811 0.0068141244558762816 0.004986649428306471 0.003543537105845855 0.002475786058730059 0.0017314033525384254 0.00122465779711388 0.0008696279545382199 0.0006217834696838484 0.0004938979088174801 0.0005122217700908189 0.0005240339424709079 0.0007609761381989933 0.0012408721734380737 0.002315502914080527 0.004379127580087877 0.007727115860575972 0.013355186574400185 0.024168342736126214 0.04358793167375025 0.06896977349167827 0.08704897352051248 0.08545110610479931 0.06795136304519564 0.048152048763744876 0.03380867422689519 0.0244766164533361 0.01767088697656699 0.012455354564246358 0.008851163896473172 0.006514726734788941 0.004852504630671362 0.003543537105845842 0.0025319910818477572 0.001795365947832483 0.001279256299219043 0.0009209194452240897 0.0006636557209989366 0.0004781079751338988 0.0003796380781566281 0.0003957651850725581 0.0004014103695536777 0.0006011759042085248 0.0009632349493911909 0.001745605935105759 0.003279908219514546 0.005744944457247073 0.009383109611456551 0.01514211100714846 0.024168342736126204 0.03523219889608198 0.04315798504401964 0.043169193618306186 0.036542370410297155 0.02834584680170842 0.02160044700136319 0.016313578902386976 0.011899632005612589 0.008449495985470215 0.006103819007469912 0.0045486307953706145 0.0033890596656994364 0.0024757860587300475 0.0017953659478324808 0.0013044219419491084 0.0009448983181505612 0.0006808862036299146 0.0004883595058147634 0.00034950119417327083 0.0002744930032920474 0.00028905809407731595 0.0003040176982251596 0.0004735132988821252 0.000726163291897313 0.0012183841389811474 0.0022129533178503217 0.0038961044023771447 0.006270310653227986 0.009383109611456553 0.013355186574400192 0.01767499640965904 0.02078030662700655 0.02125963297086543 0.0193582703664812 0.016410606487398904 0.013300080450640454 0.010250489182735951 0.007517489748370436 0.005460917229675767 0.004098860343354656 0.0031372780911037355 0.00235483116954794 0.0017314033525384054 0.0012792562992190327 0.0009448983181505499 0.0006797234220084657 0.00047557676264575456 0.000332874615282547 0.00023652325713133644 0.00018599940050381932 0.0002028904644140181 0.00021814488333107222 0.0003560422190484422 0.0005270594962774781 0.0008006309005604014 0.0013576193121938379 0.0023815163812629958 0.0038961044023771456 0.005744944457247074 0.007727115860575973 0.009578011906467697 0.010884820552833418 0.011287232360719135 0.01076200947832745 0.009543175734881938 0.007885851634352316 0.006089358996347636 0.004537419787465325 0.003453012634116625 0.002735257380277469 0.0021621361682890917 0.0016434510892207135 0.0012246577971138423 0.0009209194452240791 0.0006808862036298989 0.0004755767626457625 0.0003177350737324186 0.0002175871257174978 0.0001565403139405499 0.0001241355364397104 0.00013719159990130866 0.00013968876242537976 0.00023905748114611203 0.00036059264973204125 0.0005189558821759151 0.0008095426567044845 0.001357619312193837 0.002212953317850322 0.0032799082195145443 0.004379127580087875 0.005337764510923121 0.006004520936120349 0.00625884294661273 0.006050605342605958 0.005421110613354311 0.004510620325940208 0.003552837721414814 0.0027739623811732987 0.0022406580347984076 0.0018515398190606213 0.0014902181260944918 0.001145889569982768 0.0008696279545382156 0.0006636557209989301 0.000488359505814754 0.00033287461528254837 0.00021758712571749717 0.00015191940053496338 0.00011453422882452171 0.00008929388863325178 0.00008970530400963299 0.00007921512669110095 0.0001388028405714125 0.00022811134622592317 0.000345101179492462 0.0005189558821759169 0.0008006309005604034 0.0012183841389811476 0.0017456059351057581 0.0023155029140805214 0.002841964997621871 0.0032284375798712355 0.003393885837083705 0.003310130795263669 0.0030170576322447705 0.002606494385281731 0.0021839809405514565 0.0018231338833620283 0.0015340316098065984 0.001278104311571257 0.0010287461375447075 0.0008023405097078524 0.0006217834696838503 0.0004781079751338971 0.00034950119417326926 0.00023652325713134124 0.0001565403139405562 0.0001145342288245226 0.00009168287533173836 0.00007040658488429245 0.00005906705547390706 0.00004639795846613323 0.00007386269411413525 0.00013267912482791991 0.00022811134622592423 0.0003605926497320429 0.0005270594962774789 0.000726163291897312 0.0009632349493911882 0.0012408721734380622 0.0015311746859497852 0.001767334653945104 0.001884639351746797 0.0018739209437563854 0.0017794167978722787 0.0016478117139200634 0.0014941165032954476 0.0013165680957763547 0.001123903496920176 0.000935020426543997 0.000765450346807241 0.0006199289354965226 0.0004938979088174602 0.00037963807815662425 0.0002744930032920349 0.00018599940050381412 0.00012413553643970759 0.00008929388863324507 0.00007040658488428612 0.000055340012144685616 0.00004365864520425422 0.00003732366030448258 0.00004471729841545175 0.00007386269411413178 0.00013880284057141094 0.00023905748114611222 0.00035604221904844127 0.00047351329888212386 0.0006011759042085248 0.000760976138198986 0.0009450532555018981 0.0011033690494170472 0.0011893217655105871 0.0012098210104861378 0.0012065670294402946 0.0011973429792128678 0.001157905179173967 0.0010646588843714016 0.0009370424568941314 0.0008161527036543481 0.0007164119706880082 0.000620663511998146 0.0005122217700908257 0.0003957651850725602 0.0002890580940773183 0.00020289046441402073 0.0001371915999013154 0.00008970530400963071 0.000059067055473906016 0.00004365864520425762 0.0000381825714902008 0.00003269514350865853 0.00003494468682887391 0.00004926469609027736 0.00008836635431708944 0.00015338033482130593 0.00023414234946933597 0.0003235039291855689 0.0004262350267255008 0.0005506553884725117 0.0006876207794232099 0.0008116561588309111 0.0009088671603585743 0.000988657092739452 0.0010644064853800005 0.0011288125431500387 0.00115538974508363 0.0011288125431500352 0.0010644064853800005 0.000988657092739459 0.0009088671603585639 0.0008116561588309215 0.0006876207794232099 0.0005506553884725048 0.0004262350267254973 0.0003235039291855646 0.00023414234946933727 0.00015338033482130398 0.00008836635431708987 0.00004926469609028029 0.000034944686828872825 0.000034944686828870283 0.00003927679355652081 0.000050810187432453526 0.00007319711621452375 0.00010991083482162319 0.00016417085279851984 0.0002418134659035405 0.000344331334178368 0.00046335640422671005 0.0005841060597842287 0.000699240346768092 0.0008161527036543748 0.0009448279369217254 0.0010815579702260216 0.0012018072025311438 0.0012756356763438043 0.0012975573945890558 0.0012883678922504806 0.001263241301957172 0.0012098210104861237 0.0011029764516615236 0.0009416347748850448 0.0007619127265753586 0.00060459884105175 0.0004787892601050396 0.00036504846722240755 0.0002496268489333387 0.00014552776986352688 0.00007494986032959889 0.00004233764706958161 0.000049264696090275245 0.00005081018743245673 0.00006872525418735784 0.00009227334361630166 0.0001212201919675421 0.00016975481507747048 0.0002543426496727985 0.0003738581341875606 0.0005052944369660939 0.0006317512268016357 0.0007668541041885725 0.0009350204265439971 0.0011362470259058443 0.0013402003972896577 0.001514568235530564 0.0016503940612064224 0.0017585618402871405 0.0018474983033848521 0.0018998605429481868 0.00187392094375638 0.001735580420641968 0.0014949492493011318 0.0012087368131948285 0.0009395915246891072 0.0007162791068696853 0.0005328767055493027 0.0003746363628123273 0.00023897829057065268 0.00013665578847337528 0.00007494986032959574 0.00008836635431708837 0.00007319711621452634 0.00009227334361629799 0.00012639541981940923 0.00016700154404711295 0.00023267207177716276 0.00034716672433380094 0.0005042574172789228 0.0006692846682037822 0.000829707243803918 0.0010219478720986705 0.0012781043115712696 0.0015723081188699908 0.0018521698782703047 0.0021135152535489117 0.0023998563965444814 0.002728447959614896 0.0030503657603172126 0.0032732159028392017 0.0033101307952636575 0.003119967987069993 0.0027252012978601515 0.0022044233453669187 0.0016589400069480307 0.0011733734294710806 0.00079709057130957 0.0005378107763058989 0.0003644655134322177 0.000238978290570656 0.0001455277698635268 0.00015338033482130387 0.00010991083482162575 0.00012122019196753876 0.00016700154404711442 0.00023265115775077518 0.0003328103516603686 0.0004921829205170368 0.0007011280080980817 0.0009232854720991964 0.0011583572591615232 0.0014604937925648553 0.001851539819060632 0.002274956069556984 0.002694549901459474 0.0031833431333577007 0.0038416187382218953 0.004640662862214497 0.005402100311051655 0.0059182585820492005 0.0060506053426059555 0.005751359337704069 0.005065990398946288 0.00411742695260813 0.003067346428052686 0.0020849230176929008 0.0013144301327347916 0.0008160465074447702 0.0005378107763058989 0.00037463636281233077 0.0002496268489333407 0.00023414234946933938 0.00016417085279852656 0.0001697548150774726 0.0002326720717771684 0.00033281035166037097 0.00047655151408291184 0.0006872824206897226 0.0009614150171436383 0.0012775314669896038 0.0016519263713297664 0.00213912372966339 0.00273525738027744 0.0033781442189325306 0.004107130107226387 0.005105322245517002 0.00648034069555607 0.008053268662561034 0.009473934063312555 0.010451266211617063 0.010762009478327436 0.010237380254440175 0.008932914694551077 0.007172574512613121 0.005320251868544285 0.0036190780350586127 0.0022442729591142293 0.0013144301327347922 0.0007970905713095691 0.0005328767055493049 0.00036504846722240907 0.00032350392918556394 0.00024181346590353668 0.000254342649672787 0.00034716672433379714 0.0004921829205170287 0.0006872824206897135 0.000961699626064919 0.0013339424895266322 0.001810848820147552 0.00241985937463721 0.0031929167216776413 0.004098860343354641 0.0051211323279841195 0.006439066476751874 0.00834058524148512 0.010834126637829369 0.013543651521091844 0.01610805172382184 0.018259425073566694 0.019358270366481183 0.01852265778312245 0.01569272215250288 0.011973630808074336 0.008535272017550811 0.00576989537086557 0.0036190780350586122 0.0020849230176929008 0.0011733734294710801 0.0007162791068696838 0.0004787892601050387 0.00042623502672549623 0.0003443313341783667 0.00037385813418755546 0.0005042574172789247 0.0007011280080980739 0.0009614150171436327 0.0013339424895266335 0.001873168016668062 0.002613715989201985 0.003576710948763024 0.004753920712825659 0.0061038190074699005 0.007717583949283099 0.009966524346444055 0.013205451880473075 0.017291184098801104 0.02187189839919169 0.027043933065993463 0.032628634466063365 0.03654237041029714 0.03552916848266974 0.029017297434719525 0.020422393654937355 0.013311339349175035 0.008535272017550801 0.005320251868544278 0.0030673464280526795 0.0016589400069480272 0.0009395915246891047 0.0006045988410517465 0.0005506553884725053 0.00046335640422671026 0.0005052944369660891 0.000669284668203787 0.0009232854720991991 0.0012775314669895965 0.0018108488201475602 0.002613715989201988 0.0037347489483499116 0.0051729027660828856 0.00688409060357132 0.008851163896473157 0.0113179299397326 0.014864650915170597 0.01989901303708106 0.02625038192951192 0.034073916820984464 0.04456266870809133 0.05761291075195857 0.06795136304519563 0.06708402303583848 0.05321910300325957 0.03476091520282093 0.020422393654937355 0.011973630808074325 0.007172574512613115 0.004117426952608121 0.002204423345366916 0.0012087368131948224 0.0007619127265753577 0.0006876207794232071 0.000584106059784232 0.0006317512268016333 0.0008297072438039175 0.0011583572591615091 0.0016519263713297744 0.002419859374637212 0.0035767109487630237 0.005172902766082883 0.007195842070608358 0.009603227887007524 0.012428670230404566 0.01605228502222629 0.02124810892754824 0.028546983150662533 0.03796747156086694 0.050491304937156874 0.06864617972454862 0.09210298693624545 0.11099495791676933 0.1097939337563083 0.08539324864328052 0.05321910300325958 0.029017297434719536 0.015692722152502874 0.008932914694551075 0.005065990398946278 0.0027252012978601515 0.001494949249301125 0.0009416347748850411 0.0008116561588309151 0.0006992403467680977 0.0007668541041885614 0.001021947872098684 0.0014604937925648566 0.002139123729663374 0.003192916721677636 0.0047539207128256475 0.006884090603571311 0.009603227887007525 0.012911808749935777 0.01684130109941709 0.02177177369997525 0.028649682336106586 0.03834686322647694 0.051225832259196635 0.06866773887166149 0.09348758096382309 0.12425304459139376 0.14741724073021095 0.14346166377168398 0.10979393375630833 0.06708402303583849 0.03552916848266975 0.01852265778312245 0.010237380254440178 0.005751359337704067 0.0031199679870699943 0.00173558042064196 0.0011029764516615201 0.0009088671603585745 0.0008161527036543669 0.0009350204265439971 0.0012781043115712644 0.0018515398190606233 0.0027352573802774597 0.004098860343354639 0.006103819007469908 0.008851163896473163 0.012428670230404585 0.016841301099417096 0.021890767984102767 0.02763680253290043 0.03518834279291236 0.04623882046826719 0.061744137967736784 0.08242112353905497 0.10918928639667483 0.13854009018097044 0.15678116150870314 0.14741724073021095 0.11099495791676933 0.06795136304519563 0.03654237041029714 0.019358270366481183 0.010762009478327436 0.0060506053426059555 0.0033101307952636636 0.0018739209437563745 0.0012098210104861291 0.0009886570927394598 0.000944827936921733 0.0011362470259058425 0.001572308118869993 0.002274956069556972 0.0033781442189325358 0.005121132327984115 0.0077175839492831 0.011317929939732595 0.016052285022226307 0.021771773699975263 0.027636802532900427 0.032874540091875515 0.03869452315378 0.04829702195877415 0.06391931164200326 0.08510319364006401 0.10931266537743455 0.13065893556352043 0.13854009018097044 0.12425304459139379 0.09210298693624547 0.057612910751958575 0.032628634466063365 0.018259425073566697 0.010451266211617061 0.005918258582049203 0.0032732159028392134 0.0018998605429481805 0.0012632413019571752 0.0010644064853800035 0.0010815579702260166 0.0013402003972896597 0.001852169878270296 0.0026945499014594592 0.004107130107226406 0.006439066476751865 0.00996652434644405 0.014864650915170597 0.02124810892754825 0.028649682336106597 0.03518834279291236 0.03869452315377998 0.04018000327837753 0.04470094384614952 0.05667798221207814 0.07545099821496906 0.09562570069848383 0.10931266537743456 0.10918928639667483 0.09348758096382308 0.06864617972454862 0.04456266870809132 0.02704393306599346 0.016108051723821834 0.009473934063312556 0.005402100311051646 0.0030503657603172083 0.0018474983033848456 0.001288367892250477 0.0011288125431500441 0.0012018072025311451 0.0015145682355305644 0.002113515253548916 0.003183343133357695 0.005105322245517008 0.008340585241485116 0.013205451880473076 0.019899013037081057 0.028546983150662543 0.03834686322647694 0.046238820468267196 0.04829702195877414 0.04470094384614952 0.041758922589336805 0.046378590835054814 0.05954917846784605 0.07545099821496908 0.08510319364006404 0.08242112353905495 0.0686677388716615 0.050491304937156874 0.03407391682098447 0.02187189839919169 0.013543651521091854 0.00805326866256104 0.004640662862214502 0.00272844795961491 0.0017585618402871362 0.0012975573945890623 0.001155389745083629 0.0012756356763438002 0.0016503940612064266 0.0023998563965444753 0.003841618738221894 0.006480340695556089 0.010834126637829365 0.01729118409880111 0.02625038192951192 0.03796747156086695 0.051225832259196635 0.06174413796773678 0.06391931164200326 0.056677982212078135 0.04637859083505481 0.041682684735277545 0.046378590835054814 0.056677982212078135 0.06391931164200328 0.061744137967736784 0.05122583225919663 0.03796747156086694 0.02625038192951192 0.01729118409880111 0.01083412663782937 0.006480340695556079 0.003841618738221893 0.0023998563965444853 0.0016503940612064183 0.0012756356763438006 0.001128812543150045 0.0012975573945890626 0.0017585618402871446 0.002728447959614901 0.004640662862214505 0.00805326866256105 0.013543651521091849 0.021871898399191694 0.03407391682098447 0.0504913049371569 0.06866773887166151 0.08242112353905495 0.08510319364006401 0.07545099821496906 0.05954917846784604 0.04637859083505481 0.04175892258933681 0.04470094384614951 0.04829702195877415 0.04623882046826718 0.03834686322647693 0.028546983150662526 0.01989901303708105 0.013205451880473076 0.008340585241485123 0.005105322245516997 0.0031833431333576972 0.0021135152535489256 0.0015145682355305569 0.0012018072025311455 0.0010644064853800041 0.0012883678922504776 0.001847498303384853 0.0030503657603172 0.005402100311051649 0.009473934063312563 0.01610805172382183 0.027043933065993456 0.04456266870809132 0.06864617972454862 0.09348758096382308 0.10918928639667481 0.10931266537743455 0.09562570069848383 0.07545099821496906 0.05667798221207814 0.04470094384614952 0.040180003278377535 0.03869452315378 0.035188342792912365 0.028649682336106586 0.02124810892754825 0.014864650915170589 0.009966524346444057 0.0064390664767518735 0.0041071301072263975 0.0026945499014594627 0.001852169878270305 0.0013402003972896538 0.0010815579702260166 0.0009886570927394615 0.001263241301957178 0.001899860542948189 0.003273215902839208 0.0059182585820492075 0.01045126621161707 0.0182594250735667 0.032628634466063365 0.057612910751958575 0.09210298693624547 0.1242530445913938 0.13854009018097044 0.13065893556352043 0.10931266537743455 0.08510319364006401 0.06391931164200326 0.048297021958774146 0.03869452315378 0.03287454009187553 0.02763680253290044 0.021771773699975256 0.016052285022226307 0.011317929939732591 0.007717583949283108 0.005121132327984124 0.0033781442189325314 0.0022749560695569772 0.0015723081188700008 0.0011362470259058406 0.0009448279369217323 0.0009088671603585758 0.001209821010486132 0.001873920943756382 0.003310130795263659 0.006050605342605961 0.010762009478327441 0.019358270366481183 0.03654237041029714 0.06795136304519561 0.11099495791676932 0.14741724073021095 0.15678116150870314 0.13854009018097044 0.10918928639667481 0.08242112353905495 0.06174413796773678 0.04623882046826719 0.03518834279291235 0.027636802532900445 0.021890767984102773 0.016841301099417096 0.012428670230404577 0.008851163896473163 0.006103819007469914 0.0040988603433546504 0.0027352573802774624 0.0018515398190606298 0.0012781043115712683 0.0009350204265439989 0.0008161527036543632 0.0008116561588309162 0.0011029764516615225 0.0017355804206419668 0.00311996798706999 0.005751359337704073 0.010237380254440182 0.018522657783122454 0.03552916848266974 0.06708402303583848 0.10979393375630832 0.143461663771684 0.14741724073021098 0.12425304459139379 0.09348758096382309 0.0686677388716615 0.051225832259196635 0.03834686322647694 0.028649682336106586 0.021771773699975266 0.016841301099417092 0.01291180874993578 0.009603227887007525 0.006884090603571313 0.004753920712825656 0.003192916721677648 0.002139123729663386 0.0014604937925648631 0.0010219478720986837 0.0007668541041885669 0.0006992403467680916 0.000687620779423208 0.0009416347748850431 0.0014949492493011311 0.0027252012978601476 0.005065990398946284 0.008932914694551077 0.01569272215250288 0.029017297434719525 0.05321910300325958 0.0853932486432805 0.10979393375630832 0.1109949579167693 0.09210298693624547 0.06864617972454859 0.050491304937156894 0.03796747156086693 0.028546983150662533 0.02124810892754824 0.016052285022226307 0.012428670230404582 0.009603227887007527 0.007195842070608363 0.005172902766082881 0.0035767109487630337 0.002419859374637222 0.0016519263713297928 0.0011583572591615163 0.0008297072438039136 0.0006317512268016408 0.0005841060597842249 0.0005506553884725063 0.0007619127265753602 0.0012087368131948272 0.0022044233453669144 0.004117426952608125 0.007172574512613119 0.011973630808074332 0.020422393654937355 0.03476091520282092 0.05321910300325958 0.06708402303583848 0.06795136304519564 0.05761291075195858 0.04456266870809133 0.03407391682098448 0.02625038192951192 0.019899013037081057 0.014864650915170597 0.01131792993973261 0.008851163896473165 0.0068840906035713256 0.005172902766082882 0.0037347489483499086 0.002613715989201994 0.0018108488201475682 0.0012775314669896157 0.0009232854720992062 0.0006692846682037825 0.0005052944369660971 0.0004633564042267045 0.00042623502672549764 0.0006045988410517498 0.0009395915246891086 0.001658940006948027 0.0030673464280526817 0.005320251868544281 0.008535272017550806 0.013311339349175033 0.02042239365493735 0.02901729743471953 0.03552916848266973 0.03654237041029715 0.032628634466063365 0.02704393306599347 0.0218718983991917 0.01729118409880111 0.013205451880473078 0.009966524346444053 0.0077175839492831105 0.0061038190074699 0.004753920712825666 0.0035767109487630324 0.002613715989201989 0.001873168016668069 0.0013339424895266391 0.0009614150171436506 0.0007011280080980819 0.000504257417278921 0.00037385813418756435 0.00034433133417836306 0.0003235039291855663 0.00047878926010504316 0.0007162791068696876 0.0011733734294710814 0.002084923017692904 0.003619078035058615 0.005769895370865575 0.00853527201755081 0.011973630808074344 0.015692722152502878 0.018522657783122468 0.019358270366481176 0.01825942507356671 0.016108051723821827 0.013543651521091864 0.010834126637829363 0.008340585241485126 0.0064390664767518604 0.005121132327984138 0.004098860343354634 0.0031929167216776617 0.0024198593746372035 0.0018108488201475583 0.0013339424895266307 0.0009616996260649233 0.0006872824206897265 0.0004921829205170365 0.00034716672433379454 0.0002543426496727969 0.00024181346590353492 0.0002341423494693413 0.00036504846722241324 0.0005328767055493063 0.0007970905713095705 0.0013144301327347953 0.0022442729591142306 0.003619078035058614 0.005320251868544285 0.007172574512613124 0.008932914694551077 0.010237380254440178 0.010762009478327434 0.01045126621161707 0.009473934063312556 0.008053268662561052 0.006480340695556071 0.005105322245517006 0.004107130107226387 0.0033781442189325475 0.002735257380277427 0.0021391237296633976 0.0016519263713297683 0.0012775314669896006 0.0009614150171436285 0.0006872824206897197 0.0004765515140829215 0.0003328103516603765 0.0002326720717771661 0.00016975481507748181 0.00016417085279852488 0.00015338033482130582 0.00024962684893334476 0.00037463636281233147 0.0005378107763059002 0.0008160465074447749 0.001314430132734793 0.0020849230176929025 0.0030673464280526835 0.00411742695260813 0.005065990398946274 0.005751359337704065 0.006050605342605952 0.0059182585820492005 0.005402100311051648 0.00464066286221451 0.0038416187382218935 0.0031833431333576964 0.002694549901459459 0.002274956069556983 0.0018515398190606307 0.0014604937925648688 0.0011583572591615152 0.000923285472099198 0.0007011280080980804 0.0004921829205170339 0.0003328103516603761 0.00023265115775077984 0.0001670015440471132 0.00012122019196754828 0.00010991083482162482 0.00008836635431708948 0.00014552776986352997 0.00023897829057065525 0.0003644655134322182 0.0005378107763059037 0.000797090571309572 0.0011733734294710817 0.001658940006948032 0.0022044233453669205 0.002725201297860147 0.0031199679870699943 0.003310130795263662 0.003273215902839203 0.0030503657603172065 0.0027284479596148947 0.002399856396544473 0.0021135152535489135 0.0018521698782703049 0.0015723081188700055 0.0012781043115712696 0.001021947872098682 0.0008297072438039245 0.0006692846682037784 0.000504257417278921 0.00034716672433379687 0.0002326720717771706 0.00016700154404711675 0.0001263954198194078 0.00009227334361630623 0.00007319711621452528 0.000049264696090276255 0.00007494986032959826 0.0001366557884733742 0.00023897829057065235 0.0003746363628123325 0.0005328767055493044 0.0007162791068696877 0.0009395915246891099 0.001208736813194831 0.001494949249301126 0.0017355804206419562 0.0018739209437563813 0.00189986054294818 0.0018474983033848612 0.0017585618402871398 0.0016503940612064253 0.0015145682355305657 0.0013402003972896558 0.0011362470259058555 0.0009350204265439838 0.0007668541041885774 0.0006317512268016338 0.0005052944369660918 0.000373858134187557 0.00025434264967279246 0.00016975481507747376 0.00012122019196754444 0.00009227334361630001 0.00006872525418736414 0.00005081018743245576 0.000034944686828870887 0.000042337647069583256 0.00007494986032959736 0.0001455277698635257 0.00024962684893334335 0.000365048467222407 0.00047878926010504224 0.0006045988410517504 0.00076191272657536 0.0009416347748850421 0.001102976451661512 0.0012098210104861356 0.0012632413019571674 0.001288367892250478 0.0012975573945890587 0.0012756356763438054 0.0012018072025311362 0.001081557970226014 0.000944827936921733 0.0008161527036543521 0.0006992403467680993 0.0005841060597842307 0.0004633564042267051 0.0003443313341783655 0.00024181346590353573 0.0001641708527985222 0.00010991083482162347 0.0000731971162145234 0.000050810187432458324 0.00003927679355652013 0.000032996005925251914 0.0000359736558537048 0.000052163891300053764 0.00009296217033426778 0.00015775652622948295 0.00023864228845880053 0.00033441079730572865 0.00044961097665089343 0.0005832294783845744 0.0007212546483763918 0.000848652587863017 0.0009628131037069249 0.001064406485380004 0.0011463175132408777 0.0011986080708773564 0.0012163029673619534 0.0011986080708773598 0.0011463175132408812 0.001064406485380004 0.0009628131037069214 0.000848652587863024 0.0007212546483763918 0.0005832294783845796 0.00044961097665089517 0.00033441079730573125 0.00023864228845880573 0.00015775652622948425 0.00009296217033426995 0.000052163891300056474 0.00003597365585370285 0.000035973655853698894 0.00004246476366109258 0.00005773213817806045 0.00008633426488525599 0.00013107499389271513 0.00019570183389348424 0.0002898163901862272 0.0004144589417778363 0.0005519973573561678 0.0006814304005537411 0.0008039528511211472 0.0009370424568941315 0.0010815579702260286 0.0012123734799485114 0.0013021331758599158 0.0013445560159961215 0.0013517795309755777 0.0013339022226082544 0.001288367892250482 0.001206567029440293 0.0010826685402583543 0.0009218909549822153 0.0007465776724080101 0.0005865215698875149 0.00045571802826237874 0.0003440034197444288 0.00023703570095634776 0.0001400195734721015 0.00007273331620749286 0.00004185228624762219 0.00005216389130005243 0.00005773213817806443 0.0000810872664898346 0.00011571395533526701 0.00016134910101134155 0.0002307361856879122 0.0003431122089624084 0.0004963521413852141 0.0006561523056794473 0.0007970503483696845 0.0009407587239141621 0.0011239034969201755 0.0013402003972896642 0.0015361738697273945 0.001668717292534463 0.00174643221609369 0.0018017261947860278 0.001843635355461522 0.0018474983033848567 0.0017794167978722824 0.001622455124164982 0.0013888305176585195 0.0011191498215588802 0.0008649531896832562 0.0006575346592259384 0.0004938311102070549 0.000353304769537503 0.00022688081584744534 0.00012916539479545104 0.00007273331620749191 0.00009296217033426969 0.0000863342648852617 0.00011571395533526814 0.00016831495554073806 0.00023540318016430938 0.0003324322130755759 0.00048445332287481985 0.0006838316235267722 0.0008835265101450215 0.0010612533502024903 0.001261728621581642 0.0015340316098065904 0.0018521698782702973 0.002134042701198249 0.002344313469709197 0.0025286503275099097 0.0027321864074082367 0.0029314670065587163 0.0030503657603172035 0.003017057632244774 0.0028018161266351945 0.002423979187085864 0.0019465698802292994 0.001460434191919837 0.001044077037541588 0.0007311047369061586 0.0005110280207879603 0.00035024178324874244 0.00022688081584744626 0.0001400195734721025 0.00015775652622948197 0.0001310749938927161 0.00016134910101133735 0.00023540318016430464 0.0003382678508912706 0.0004810140756292363 0.000689547073522208 0.0009554476063526676 0.0012310199292264637 0.0015021101566728239 0.0018252040088143496 0.0022406580347984085 0.002694549901459469 0.0031091760870718367 0.0035057823399257384 0.003975820768717632 0.004534767905786571 0.005066004126662923 0.005402100311051645 0.005421110613354323 0.005081308636276988 0.004422978400784093 0.0035548620122397637 0.002629389801695996 0.0018004153950183035 0.001170272483470394 0.0007582882900205593 0.0005110280207879591 0.00035330476953750086 0.00023703570095634654 0.00023864228845880479 0.0001957018338934891 0.0002307361856879137 0.00033243221307557614 0.0004810140756292422 0.0006826700179281662 0.0009682847789069762 0.0013428023934787061 0.0017735870623411712 0.002250232107860971 0.0028100800161902028 0.0034530126341166274 0.0041071301072264 0.004760328317029637 0.005545206054145711 0.006580579195852483 0.007765271584428247 0.00881924782820553 0.009473934063312555 0.009543175734881951 0.008929833570272596 0.00771043317878115 0.006144054076131459 0.004526188866547983 0.0030756018951073488 0.0019355668732131575 0.0011702724834703943 0.000731104736906158 0.000493831110207054 0.0003440034197444272 0.00033441079730572794 0.00028981639018622874 0.00034311220896240393 0.00048445332287481654 0.0006895470735222085 0.0009682847789069693 0.0013718781379051617 0.0019366624294627377 0.0026549678017238807 0.003504638407223862 0.004462883841154415 0.005460917229675768 0.006439066476751867 0.007521783518469318 0.008986628223726747 0.010916081954214436 0.013006136920165733 0.014842004087681642 0.01610805172382183 0.01641060648739892 0.015326377141967943 0.012938092278920265 0.009977253075154284 0.007194256015802471 0.00488473038532229 0.0030756018951073475 0.0018004153950183 0.0010440770375415847 0.0006575346592259329 0.0004557180282623751 0.00044961097665089495 0.00041445894177783923 0.0004963521413852151 0.0006838316235267734 0.0009554476063526714 0.0013428023934787068 0.0019366624294627453 0.002815159394638278 0.003986452395490249 0.00539124681313098 0.006923153073596429 0.008449495985470208 0.009966524346444048 0.011780429057506363 0.014298536985646175 0.017497979483522694 0.02091321729019589 0.024203110600517837 0.02704393306599346 0.02834584680170842 0.026619531064699158 0.021833526348406383 0.01593390230487787 0.010880890615936683 0.007194256015802466 0.004526188866547979 0.002629389801695993 0.0014604341919198368 0.000864953189683256 0.0005865215698875151 0.0005832294783845783 0.0005519973573561725 0.0006561523056794482 0.0008835265101450294 0.0012310199292264719 0.001773587062341164 0.002654967801723887 0.003986452395490245 0.005761950678317071 0.007869541377713724 0.010148692673302807 0.012455354564246358 0.014864650915170599 0.01784026965500825 0.021878320719838737 0.026874775620886443 0.03239910529167102 0.038440099007273514 0.04456266870809132 0.04815204876374487 0.04551782647970808 0.0363667313100634 0.025055637667848872 0.01593390230487787 0.009977253075154275 0.006144054076131452 0.003554862012239758 0.0019465698802292987 0.0011191498215588783 0.0007465776724080122 0.0007212546483763903 0.0006814304005537394 0.0007970503483696805 0.001061253350202484 0.0015021101566728252 0.002250232107860968 0.0035046384072238593 0.005391246813130978 0.007869541377713719 0.010803241393581728 0.014055945234431346 0.017509967750017324 0.02124810892754824 0.02580412409566322 0.03181122859580151 0.03927144288015321 0.04793840415454884 0.05804858897493287 0.06864617972454859 0.07491270404560922 0.0704676586833634 0.055054691285063385 0.036366731310063405 0.021833526348406393 0.012938092278920255 0.007710433178781145 0.004422978400784085 0.0024239791870858617 0.0013888305176585204 0.0009218909549822121 0.0008486525878630225 0.0008039528511211468 0.0009407587239141552 0.001261728621581644 0.0018252040088143555 0.0028100800161901932 0.004462883841154414 0.0069231530735964246 0.010148692673302798 0.014055945234431346 0.01857724339996579 0.02349789729598116 0.02864968233610658 0.03456537249730393 0.04237773260800204 0.05265480311856309 0.06518714478868116 0.07957358172116913 0.09348758096382306 0.1001822094906155 0.09217668859203686 0.07046765868336341 0.04551782647970808 0.026619531064699165 0.01532637714196793 0.008929833570272593 0.005081308636276981 0.002801816126635195 0.0016224551241649785 0.0010826685402583534 0.0009628131037069264 0.0009370424568941283 0.001123903496920171 0.0015340316098065854 0.002240658034798408 0.0034530126341166343 0.005460917229675771 0.008449495985470208 0.012455354564246362 0.017509967750017327 0.02349789729598116 0.029690429604246067 0.03518834279291235 0.04060359154257608 0.04845800059513082 0.06076976938801451 0.0770637825693041 0.09479720627444045 0.10918928639667483 0.11281644974287011 0.1001822094906155 0.07491270404560921 0.048152048763744876 0.028345846801708426 0.01641060648739891 0.009543175734881948 0.0054211106133543125 0.003017057632244766 0.0017794167978722798 0.0012065670294402894 0.0010644064853800065 0.0010815579702260186 0.0013402003972896607 0.0018521698782702925 0.0026945499014594605 0.004107130107226396 0.006439066476751872 0.00996652434644405 0.0148646509151706 0.021248108927548248 0.028649682336106597 0.03518834279291236 0.03869452315378 0.040180003278377535 0.04470094384614951 0.056677982212078135 0.07545099821496906 0.09562570069848383 0.10931266537743455 0.10918928639667481 0.09348758096382308 0.0686461797245486 0.04456266870809133 0.02704393306599346 0.01610805172382183 0.00947393406331255 0.00540210031105164 0.0030503657603172018 0.0018474983033848523 0.0012883678922504796 0.0011463175132408884 0.0012123734799485092 0.0015361738697273982 0.0021340427011982475 0.003109176087071825 0.004760328317029649 0.007521783518469315 0.011780429057506366 0.01784026965500825 0.025804124095663225 0.03456537249730392 0.04060359154257608 0.04018000327837753 0.035044097630737146 0.03325555919185391 0.04165728956585284 0.05996092486880794 0.08137680617881791 0.09562570069848383 0.09479720627444044 0.0795735817211691 0.05804858897493287 0.0384400990072735 0.024203110600517833 0.01484200408768163 0.008819247828205526 0.005066004126662914 0.0029314670065587116 0.001843635355461519 0.0013339022226082512 0.0011986080708773581 0.0013021331758599122 0.0016687172925344594 0.0023443134697091975 0.003505782339925733 0.005545206054145704 0.008986628223726747 0.014298536985646175 0.021878320719838737 0.031811228595801516 0.042377732608002046 0.04845800059513083 0.04470094384614951 0.033255559191853926 0.024326738604191475 0.0263126367861459 0.040029830238656375 0.059960924868807955 0.07545099821496908 0.07706378256930409 0.06518714478868118 0.04793840415454885 0.03239910529167102 0.020913217290195893 0.013006136920165737 0.007765271584428239 0.004534767905786562 0.002732186407408239 0.0018017261947860207 0.00135177953097557 0.0012163029673619573 0.0013445560159961135 0.0017464322160936929 0.0025286503275099032 0.003975820768717628 0.006580579195852492 0.010916081954214436 0.017497979483522698 0.026874775620886443 0.03927144288015322 0.05265480311856309 0.06076976938801451 0.056677982212078135 0.04165728956585284 0.0263126367861459 0.020232834606957056 0.0263126367861459 0.04165728956585283 0.056677982212078135 0.06076976938801451 0.052654803118563076 0.03927144288015321 0.026874775620886436 0.017497979483522698 0.01091608195421443 0.006580579195852481 0.003975820768717622 0.002528650327509907 0.0017464322160936872 0.0013445560159961129 0.0011986080708773588 0.0013517795309755702 0.0018017261947860254 0.0027321864074082358 0.004534767905786569 0.00776527158442825 0.013006136920165742 0.020913217290195896 0.03239910529167102 0.047938404154548864 0.06518714478868119 0.0770637825693041 0.07545099821496906 0.05996092486880796 0.04002983023865638 0.0263126367861459 0.024326738604191475 0.03325555919185392 0.04470094384614951 0.0484580005951308 0.04237773260800204 0.03181122859580151 0.02187832071983873 0.01429853698564617 0.008986628223726742 0.0055452060541456944 0.003505782339925729 0.002344313469709202 0.0016687172925344538 0.001302133175859911 0.0011463175132408895 0.001333902222608251 0.0018436353554615228 0.0029314670065587094 0.00506600412666292 0.008819247828205536 0.014842004087681635 0.02420311060051783 0.0384400990072735 0.05804858897493286 0.07957358172116911 0.09479720627444044 0.09562570069848385 0.08137680617881793 0.059960924868807955 0.04165728956585284 0.03325555919185391 0.03504409763073714 0.04018000327837753 0.040603591542576076 0.03456537249730392 0.025804124095663225 0.017840269655008248 0.011780429057506365 0.007521783518469311 0.004760328317029643 0.0031091760870718224 0.0021340427011982523 0.0015361738697273939 0.001212373479948507 0.0010644064853800087 0.0012883678922504804 0.0018474983033848569 0.0030503657603172005 0.005402100311051647 0.009473934063312562 0.016108051723821838 0.02704393306599346 0.044562668708091335 0.06864617972454862 0.09348758096382309 0.10918928639667483 0.10931266537743457 0.09562570069848383 0.07545099821496906 0.05667798221207814 0.04470094384614952 0.04018000327837753 0.03869452315377999 0.03518834279291235 0.02864968233610659 0.02124810892754825 0.014864650915170597 0.009966524346444051 0.006439066476751869 0.004107130107226395 0.0026945499014594592 0.0018521698782702968 0.0013402003972896597 0.0010815579702260168 0.0009628131037069289 0.0012065670294402905 0.0017794167978722848 0.0030170576322447644 0.0054211106133543185 0.009543175734881957 0.016410606487398918 0.028345846801708423 0.04815204876374487 0.07491270404560921 0.1001822094906155 0.11281644974287011 0.10918928639667483 0.09479720627444044 0.0770637825693041 0.06076976938801452 0.048458000595130814 0.04060359154257607 0.03518834279291236 0.02969042960424605 0.023497897295981153 0.01750996775001732 0.012455354564246363 0.00844949598547021 0.0054609172296757715 0.0034530126341166378 0.0022406580347984076 0.0015340316098065875 0.0011239034969201733 0.0009370424568941256 0.000848652587863025 0.0010826685402583547 0.0016224551241649844 0.002801816126635193 0.0050813086362769865 0.008929833570272598 0.015326377141967933 0.026619531064699158 0.04551782647970807 0.0704676586833634 0.09217668859203684 0.1001822094906155 0.09348758096382308 0.07957358172116913 0.06518714478868118 0.05265480311856309 0.042377732608002046 0.03456537249730392 0.028649682336106583 0.02349789729598115 0.018577243399965786 0.014055945234431346 0.010148692673302798 0.006923153073596429 0.004462883841154416 0.0028100800161902028 0.0018252040088143555 0.0012617286215816446 0.0009407587239141606 0.0008039528511211438 0.0007212546483763925 0.0009218909549822126 0.0013888305176585263 0.002423979187085859 0.004422978400784089 0.00771043317878115 0.012938092278920264 0.021833526348406383 0.0363667313100634 0.055054691285063365 0.07046765868336341 0.0749127040456092 0.0686461797245486 0.05804858897493285 0.04793840415454885 0.039271442880153204 0.031811228595801516 0.025804124095663208 0.021248108927548245 0.01750996775001732 0.01405594523443134 0.01080324139358173 0.007869541377713722 0.005391246813130982 0.003504638407223863 0.002250232107860981 0.001502110156672826 0.0010612533502024825 0.0007970503483696871 0.0006814304005537366 0.00058322947838458 0.000746577672408013 0.0011191498215588837 0.0019465698802292966 0.0035548620122397606 0.006144054076131457 0.009977253075154282 0.01593390230487787 0.025055637667848858 0.03636673131006339 0.04551782647970807 0.04815204876374487 0.04456266870809133 0.0384400990072735 0.03239910529167102 0.02687477562088644 0.021878320719838733 0.01784026965500824 0.014864650915170599 0.012455354564246356 0.010148692673302796 0.007869541377713719 0.005761950678317072 0.00398645239549025 0.002654967801723893 0.0017735870623411777 0.0012310199292264732 0.0008835265101450278 0.0006561523056794547 0.0005519973573561706 0.00044961097665089717 0.0005865215698875163 0.000864953189683261 0.001460434191919835 0.0026293898016959954 0.004526188866547982 0.007194256015802471 0.01088089061593668 0.015933902304877862 0.021833526348406376 0.02661953106469914 0.028345846801708412 0.02704393306599346 0.024203110600517826 0.020913217290195893 0.017497979483522698 0.014298536985646176 0.01178042905750636 0.009966524346444058 0.008449495985470215 0.0069231530735964315 0.005391246813130981 0.0039864523954902505 0.002815159394638282 0.0019366624294627505 0.00134280239347872 0.000955447606352674 0.0006838316235267718 0.0004963521413852214 0.00041445894177783875 0.0003344107973057303 0.0004557180282623764 0.0006575346592259378 0.0010440770375415831 0.001800415395018303 0.0030756018951073483 0.004884730385322296 0.007194256015802468 0.009977253075154284 0.012938092278920257 0.015326377141967933 0.016410606487398904 0.01610805172382184 0.01484200408768162 0.013006136920165745 0.010916081954214429 0.008986628223726754 0.007521783518469299 0.006439066476751875 0.005460917229675762 0.004462883841154419 0.0035046384072238536 0.0026549678017238907 0.0019366624294627388 0.0013718781379051686 0.0009682847789069788 0.0006895470735222122 0.0004844533228748154 0.00034311220896240984 0.0002898163901862289 0.00023864228845880682 0.0003440034197444283 0.0004938311102070575 0.0007311047369061569 0.001170272483470397 0.0019355668732131573 0.0030756018951073522 0.004526188866547982 0.006144054076131453 0.007710433178781145 0.008929833570272593 0.009543175734881941 0.009473934063312556 0.008819247828205515 0.007765271584428254 0.006580579195852482 0.005545206054145712 0.004760328317029631 0.004107130107226406 0.0034530126341166243 0.002810080016190209 0.002250232107860962 0.0017735870623411712 0.0013428023934787055 0.0009682847789069801 0.0006826700179281745 0.00048101407562924477 0.00033243221307557554 0.00023073618568791878 0.00019570183389348904 0.0001577565262294838 0.00023703570095634765 0.0003533047695375032 0.000511028020787958 0.0007582882900205616 0.0011702724834703933 0.001800415395018304 0.0026293898016959937 0.003554862012239762 0.004422978400784084 0.00508130863627698 0.005421110613354311 0.005402100311051644 0.005066004126662912 0.004534767905786564 0.0039758207687176205 0.003505782339925739 0.0031091760870718167 0.0026945499014594653 0.0022406580347984102 0.001825204008814358 0.0015021101566728239 0.001231019929226468 0.0009554476063526678 0.0006895470735222135 0.0004810140756292449 0.00033826785089127465 0.0002354031801643059 0.00016134910101134255 0.0001310749938927161 0.0000929621703342707 0.00014001957347210364 0.000226880815847447 0.00035024178324874104 0.000511028020787961 0.0007311047369061564 0.0010440770375415858 0.001460434191919838 0.001946569880229296 0.0024239791870858617 0.0028018161266351884 0.003017057632244766 0.0030503657603172005 0.0029314670065587046 0.002732186407408235 0.0025286503275099054 0.0023443134697091997 0.002134042701198249 0.0018521698782702975 0.0015340316098065988 0.0012617286215816487 0.0010612533502024897 0.0008835265101450272 0.0006838316235267771 0.00048445332287482364 0.000332432213075583 0.00023540318016431258 0.00016831495554074018 0.00011571395533527272 0.00008633426488526111 0.0000521638913000531 0.00007273331620749368 0.00012916539479545088 0.00022688081584744388 0.00035330476953750303 0.0004938311102070521 0.0006575346592259355 0.0008649531896832559 0.0011191498215588768 0.0013888305176585221 0.0016224551241649757 0.0017794167978722763 0.001847498303384854 0.0018436353554615113 0.0018017261947860224 0.0017464322160936846 0.001668717292534466 0.0015361738697273822 0.0013402003972896727 0.001123903496920165 0.0009407587239141578 0.0007970503483696752 0.0006561523056794501 0.000496352141385213 0.00034311220896241136 0.00023073618568791667 0.00016134910101134423 0.00011571395533526911 0.00008108726648983891 0.0000577321381780634 0.0000359736558536994 0.000041852286247624316 0.00007273331620749141 0.0001400195734720992 0.0002370357009563469 0.0003440034197444236 0.00045571802826237625 0.0005865215698875139 0.0007465776724080085 0.0009218909549822132 0.0010826685402583515 0.0012065670294402857 0.0012883678922504806 0.0013339022226082475 0.001351779530975571 0.0013445560159961172 0.0013021331758599174 0.001212373479948499 0.0010815579702260138 0.00093704245689413 0.0008039528511211465 0.0006814304005537366 0.0005519973573561686 0.0004144589417778351 0.00028981639018623096 0.00019570183389348871 0.0001310749938927175 0.00008633426488525886 0.00005773213817806459 0.000042464763661091196 0.00003999670548055932 0.00004194324107620925 0.00005534744024333362 0.00009223278715530885 0.00015267581316423333 0.00023234710462510235 0.0003361344573057888 0.0004687949647652241 0.0006197248184155353 0.0007667896670978391 0.0008995969267711901 0.0010223797079019666 0.0011288125431500456 0.0011986080708773633 0.0012264093166083276 0.0012312082497994417 0.0012264093166083284 0.0011986080708773564 0.0011288125431500456 0.001022379707901963 0.0008995969267711866 0.0007667896670978391 0.0006197248184155353 0.0004687949647652293 0.0003361344573057923 0.0002323471046251067 0.00015267581316423594 0.00009223278715531362 0.00005534744024333709 0.0000419432410762138 0.00004194324107621045 0.00004804046316260148 0.00006378627298063483 0.00009660617943874872 0.00014969492195175612 0.0002253991227909354 0.0003349742989234351 0.00048131016516047296 0.0006423483931220762 0.000790059915324492 0.0009248564411887966 0.001064658884371408 0.0012018072025311505 0.0013021331758599247 0.0013490440679071677 0.0013626764404337537 0.0013659066902064606 0.0013517795309755736 0.0012975573945890636 0.0011973429792128596 0.001063363400451896 0.0009055757124909062 0.0007313386636297361 0.0005603349195352478 0.00041543744447833885 0.0003006000119108431 0.0002045318754074718 0.0001238262836215145 0.00006979335205075183 0.000046039876205689693 0.000055347440243336934 0.00006378627298063688 0.00009111223839643769 0.00013678820046357593 0.00020099329412540963 0.00029156831156405653 0.0004273720105761972 0.0006092634042455439 0.0008015254916949723 0.0009705099287999346 0.0011311065461328037 0.0013165680957763454 0.0015145682355305631 0.00166871729253446 0.0017468782307036408 0.0017766517541786208 0.0017963696659219913 0.0018017261947860198 0.0017585618402871457 0.0016478117139200527 0.001477557116689299 0.0012624736503087056 0.0010183403054298311 0.0007774910755573753 0.0005759894400297534 0.00042271980596803396 0.0002999803279416986 0.00019372829236130856 0.00011389516179237384 0.00006979335205075364 0.00009223278715531401 0.00009660617943875155 0.00013678820046357612 0.0002077571576043947 0.00030171519351103134 0.00042942899124734493 0.0006161688271076281 0.0008589568636188337 0.0011094531117226162 0.0013314457145501813 0.001554466242855795 0.0018231338833620415 0.0021135152535489165 0.0023443134697092144 0.0024789141960227918 0.002566043478233661 0.0026569839345356007 0.002732186407408237 0.0027284479596148964 0.0026064943852817223 0.0023697225303135135 0.002038034982836015 0.0016396186116322189 0.0012316737057361758 0.0008828322819483993 0.000624626478730455 0.00044161447486532854 0.00030167391628042883 0.00019372829236130693 0.0001238262836215147 0.00015267581316423556 0.00014969492195175647 0.00020099329412540625 0.00030171519351102874 0.000441706243743836 0.0006333943940810152 0.0009066580400836066 0.0012589495116249138 0.0016351864912215125 0.0019935386997361293 0.00236182702274419 0.002773962381173301 0.0031833431333576964 0.003505782339925747 0.003743027848109884 0.003984092645329029 0.004273017834966269 0.004534767905786567 0.004640662862214501 0.0045106203259402036 0.004139463137881489 0.003565593495754305 0.0028541081215029004 0.0021106035581529665 0.0014590527240740717 0.0009736510857595682 0.0006508099138680069 0.00044161447486532827 0.0002999803279416966 0.00020453187540747167 0.0002323471046251079 0.00022539912279093954 0.0002915683115640583 0.0004294289912473471 0.0006333943940810204 0.0009228985548071653 0.0013400322643710232 0.0018950825958768756 0.0025357859259002285 0.0032019567330937287 0.0038771846297218247 0.004537419787465316 0.005105322245516997 0.005545206054145707 0.005963646198878793 0.006507829512702058 0.007171889765094907 0.007765271584428247 0.008053268662561038 0.007885851634352301 0.007230885503687011 0.006171924531510282 0.004883702047003987 0.0035749591955013815 0.002428407620020926 0.0015553507761918532 0.0009736510857595695 0.0006246264787304561 0.0004227198059680344 0.00030060001191084524 0.0003361344573057928 0.00033497429892343915 0.00042737201057619495 0.0006161688271076298 0.0009066580400836098 0.0013400322643710198 0.00198758547766455 0.0028883717904480146 0.00400116892906043 0.0052257281027493115 0.006443731463249304 0.007517489748370434 0.00834058524148512 0.008986628223726756 0.009724646432491055 0.010754562411234786 0.011961891930324662 0.013006136920165744 0.013543651521091845 0.01330008045064044 0.012128142883813992 0.010174247183974278 0.00787839238406656 0.005688885411737051 0.0038449800445795944 0.002428407620020925 0.0014590527240740728 0.0008828322819484014 0.0005759894400297527 0.00041543744447834226 0.0004687949647652281 0.0004813101651604788 0.000609263404245546 0.0008589568636188386 0.0012589495116249198 0.0018950825958768771 0.002888371790448019 0.004314121678006397 0.0061297089800265965 0.008167517098673105 0.01017912446384884 0.011899632005612589 0.013205451880473076 0.01429853698564618 0.015606687393438875 0.017344440296077856 0.01926204335873081 0.020913217290195896 0.02187189839919169 0.021600447001363175 0.019618811318097888 0.01613095381440367 0.012113170777656666 0.008518072672587643 0.00568888541173705 0.0035749591955013802 0.0021106035581529648 0.0012316737057361771 0.0007774910755573744 0.0005603349195352502 0.0006197248184155348 0.0006423483931220795 0.0008015254916949697 0.001109453111722621 0.0016351864912215206 0.0025357859259002268 0.0040011689290604365 0.006129708980026595 0.00883984502253302 0.011889215069225812 0.014947087410735697 0.017670886976566998 0.019899013037081064 0.02187832071983874 0.024131797236828956 0.026888939960480213 0.02981367918904268 0.032399105291671025 0.034073916820984464 0.03380867422689517 0.03055005990547198 0.02460864991473567 0.01786507350603816 0.012113170777656666 0.007878392384066556 0.004883702047003983 0.0028541081215028965 0.001639618611632219 0.0010183403054298285 0.0007313386636297397 0.0007667896670978398 0.0007900599153244995 0.000970509928799941 0.0013314457145501824 0.001993538699736137 0.0032019567330937313 0.005225728102749311 0.008167517098673107 0.011889215069225805 0.01612544317183192 0.020572286992175948 0.02483327612429591 0.028546983150662533 0.03181122859580152 0.03526993486347837 0.03939450951957952 0.04387607687253016 0.047938404154548864 0.05049130493715688 0.04979656952952349 0.04435217915922053 0.03492861208914283 0.024608649914735676 0.016130953814403676 0.010174247183974276 0.006171924531510285 0.003565593495754305 0.0020380349828360176 0.001262473650308706 0.0009055757124909114 0.0008995969267711873 0.0009248564411888047 0.0011311065461328041 0.0015544662428558025 0.002361827022744199 0.003877184629721822 0.00644373146324931 0.010179124463848834 0.014947087410735692 0.02057228699217595 0.026834614134389638 0.03308671725470337 0.038346863226476936 0.04237773260800205 0.046399195810044425 0.05188798945407266 0.05874562097273792 0.06518714478868119 0.0686677388716615 0.06659102873504197 0.057800888093262906 0.044352179159220545 0.030550059905471983 0.0196188113180979 0.012128142883813994 0.007230885503687014 0.004139463137881493 0.0023697225303135213 0.0014775571166893006 0.0010633634004519035 0.001022379707901968 0.0010646588843714 0.0013165680957763451 0.0018231338833620346 0.002773962381173299 0.004537419787465314 0.007517489748370424 0.011899632005612582 0.017670886976566984 0.024833276124295905 0.03308671725470335 0.0409670487024712 0.04623882046826718 0.04845800059513082 0.050617921720315505 0.056542570270603554 0.06663205520314516 0.0770637825693041 0.08242112353905497 0.0788799121953625 0.06659102873504197 0.04979656952952349 0.03380867422689519 0.02160044700136319 0.013300080450640444 0.007885851634352306 0.004510620325940199 0.00260649438528173 0.0016478117139200575 0.0011973429792128667 0.0011288125431500495 0.001201807202531153 0.0015145682355305722 0.0021135152535489217 0.0031833431333577037 0.005105322245517002 0.008340585241485126 0.013205451880473076 0.019899013037081057 0.028546983150662533 0.03834686322647694 0.04623882046826719 0.048297021958774146 0.04470094384614951 0.041758922589336805 0.04637859083505481 0.05954917846784604 0.07545099821496906 0.08510319364006402 0.08242112353905497 0.06866773887166151 0.05049130493715689 0.03407391682098448 0.021871898399191698 0.01354365152109185 0.008053268662561038 0.0046406628622145 0.0027284479596149064 0.001758561840287144 0.0012975573945890712 0.0011986080708773577 0.001302133175859918 0.001668717292534464 0.002344313469709205 0.003505782339925739 0.005545206054145707 0.008986628223726749 0.014298536985646176 0.021878320719838727 0.03181122859580151 0.04237773260800204 0.04845800059513082 0.044700943846149505 0.033255559191853926 0.024326738604191468 0.0263126367861459 0.040029830238656375 0.05996092486880796 0.07545099821496908 0.07706378256930412 0.06518714478868118 0.047938404154548864 0.032399105291671025 0.020913217290195903 0.01300613692016574 0.007765271584428246 0.004534767905786566 0.0027321864074082427 0.0018017261947860228 0.0013517795309755769 0.0012264093166083308 0.001349044067907171 0.0017468782307036416 0.002478914196022795 0.003743027848109888 0.005963646198878789 0.009724646432491053 0.015606687393438871 0.02413179723682895 0.035269934863478375 0.046399195810044425 0.050617921720315505 0.0417589225893368 0.024326738604191475 0.011332167747017898 0.010166722672810909 0.020571592507962828 0.04002983023865639 0.05954917846784606 0.06663205520314516 0.058745620972737944 0.043876076872530166 0.02981367918904269 0.019262043358730812 0.01196189193032467 0.007171889765094905 0.004273017834966266 0.0026569839345356077 0.0017963696659219878 0.001365906690206463 0.0012312082497994408 0.0013626764404337526 0.0017766517541786245 0.0025660434782336606 0.003984092645329023 0.006507829512702059 0.010754562411234778 0.017344440296077852 0.026888939960480206 0.03939450951957951 0.05188798945407265 0.05654257027060354 0.0463785908350548 0.0263126367861459 0.010166722672810907 0.004844895108568839 0.01016672267281091 0.026312636786145913 0.04637859083505483 0.056542570270603554 0.051887989454072664 0.03939450951957952 0.026888939960480213 0.01734444029607786 0.010754562411234783 0.006507829512702056 0.00398409264532902 0.0025660434782336632 0.0017766517541786201 0.0013626764404337526 0.0012264093166083304 0.001365906690206462 0.001796369665921992 0.002656983934535607 0.00427301783496627 0.007171889765094909 0.011961891930324667 0.019262043358730805 0.029813679189042677 0.04387607687253016 0.05874562097273793 0.06663205520314515 0.05954917846784603 0.040029830238656375 0.020571592507962828 0.01016672267281091 0.0113321677470179 0.024326738604191486 0.041758922589336826 0.050617921720315505 0.04639919581004443 0.035269934863478375 0.024131797236828956 0.015606687393438875 0.009724646432491057 0.005963646198878786 0.003743027848109887 0.0024789141960227974 0.0017468782307036366 0.0013490440679071708 0.0011986080708773572 0.0013517795309755743 0.001801726194786027 0.0027321864074082423 0.00453476790578657 0.0077652715844282495 0.013006136920165737 0.020913217290195893 0.03239910529167101 0.04793840415454885 0.06518714478868116 0.07706378256930409 0.07545099821496906 0.059960924868807955 0.040029830238656375 0.026312636786145902 0.024326738604191475 0.03325555919185394 0.044700943846149525 0.04845800059513082 0.042377732608002046 0.031811228595801516 0.021878320719838737 0.014298536985646183 0.008986628223726754 0.005545206054145706 0.003505782339925738 0.0023443134697092075 0.0016687172925344586 0.0013021331758599178 0.0011288125431500493 0.0012975573945890684 0.0017585618402871498 0.0027284479596149064 0.004640662862214506 0.008053268662561045 0.013543651521091852 0.021871898399191694 0.03407391682098447 0.05049130493715688 0.0686677388716615 0.08242112353905495 0.08510319364006401 0.07545099821496906 0.05954917846784605 0.046378590835054814 0.04175892258933681 0.044700943846149525 0.04829702195877417 0.04623882046826719 0.03834686322647695 0.028546983150662536 0.019899013037081064 0.013205451880473083 0.008340585241485128 0.005105322245517002 0.003183343133357703 0.002113515253548923 0.0015145682355305686 0.0012018072025311534 0.0010223797079019674 0.0011973429792128624 0.0016478117139200634 0.0026064943852817293 0.004510620325940204 0.007885851634352313 0.013300080450640447 0.021600447001363186 0.03380867422689518 0.049796569529523486 0.06659102873504195 0.07887991219536249 0.08242112353905497 0.0770637825693041 0.06663205520314515 0.056542570270603554 0.05061792172031551 0.04845800059513083 0.0462388204682672 0.040967048702471184 0.03308671725470336 0.0248332761242959 0.01767088697656699 0.011899632005612584 0.007517489748370427 0.004537419787465315 0.002773962381173298 0.0018231338833620333 0.0013165680957763434 0.0010646588843713995 0.0008995969267711865 0.0010633634004518985 0.0014775571166893067 0.0023697225303135204 0.004139463137881498 0.00723088550368702 0.012128142883813997 0.0196188113180979 0.030550059905471983 0.04435217915922054 0.05780088809326291 0.06659102873504197 0.0686677388716615 0.06518714478868118 0.05874562097273793 0.05188798945407266 0.04639919581004443 0.04237773260800205 0.03834686322647695 0.03308671725470335 0.02683461413438964 0.020572286992175948 0.014947087410735692 0.010179124463848837 0.0064437314632493125 0.003877184629721826 0.0023618270227441967 0.0015544662428557997 0.0011311065461328052 0.0009248564411888041 0.0007667896670978386 0.0009055757124909058 0.0012624736503087115 0.0020380349828360168 0.003565593495754311 0.006171924531510292 0.010174247183974281 0.01613095381440368 0.02460864991473568 0.03492861208914283 0.044352179159220545 0.04979656952952349 0.05049130493715689 0.04793840415454885 0.043876076872530166 0.03939450951957951 0.035269934863478375 0.03181122859580151 0.02854698315066254 0.024833276124295894 0.02057228699217595 0.01612544317183192 0.011889215069225805 0.00816751709867311 0.005225728102749314 0.0032019567330937356 0.0019935386997361345 0.0013314457145501776 0.0009705099287999437 0.0007900599153244978 0.000619724818415533 0.0007313386636297341 0.0010183403054298322 0.001639618611632219 0.002854108121502902 0.004883702047003991 0.007878392384066561 0.012113170777656673 0.017865073506038165 0.024608649914735683 0.030550059905471987 0.033808674226895194 0.03407391682098448 0.032399105291671025 0.029813679189042687 0.026888939960480213 0.024131797236828956 0.021878320719838733 0.019899013037081064 0.017670886976566977 0.014947087410735693 0.011889215069225809 0.008839845022533018 0.0061297089800265965 0.004001168929060437 0.0025357859259002324 0.0016351864912215162 0.0011094531117226169 0.0008015254916949728 0.0006423483931220777 0.00046879496476522623 0.0005603349195352449 0.0007774910755573767 0.0012316737057361774 0.0021106035581529704 0.0035749591955013876 0.005688885411737053 0.00851807267258765 0.012113170777656668 0.01613095381440368 0.0196188113180979 0.02160044700136319 0.021871898399191705 0.020913217290195896 0.01926204335873081 0.017344440296077856 0.015606687393438875 0.014298536985646173 0.013205451880473075 0.011899632005612577 0.010179124463848832 0.008167517098673107 0.0061297089800265965 0.004314121678006401 0.0028883717904480202 0.001895082595876883 0.0012589495116249157 0.0008589568636188347 0.0006092634042455493 0.0004813101651604771 0.000336134457305791 0.0004154374444783369 0.0005759894400297541 0.0008828322819484011 0.0014590527240740782 0.002428407620020931 0.0038449800445796004 0.005688885411737055 0.007878392384066566 0.010174247183974281 0.01212814288381401 0.013300080450640444 0.013543651521091864 0.013006136920165737 0.011961891930324674 0.010754562411234776 0.009724646432491062 0.008986628223726744 0.00834058524148513 0.007517489748370415 0.006443731463249307 0.005225728102749303 0.004001168929060433 0.002888371790448015 0.001987585477664553 0.0013400322643710248 0.0009066580400836072 0.0006161688271076264 0.00042737201057619793 0.000334974298923437 0.0002323471046251049 0.0003006000119108392 0.00042271980596803326 0.0006246264787304549 0.0009736510857595731 0.0015553507761918578 0.0024284076200209305 0.003574959195501386 0.004883702047003992 0.006171924531510288 0.00723088550368703 0.007885851634352308 0.008053268662561053 0.007765271584428246 0.007171889765094913 0.006507829512702053 0.0059636461988787975 0.005545206054145702 0.005105322245517006 0.004537419787465301 0.0038771846297218273 0.003201956733093727 0.0025357859259002285 0.0018950825958768765 0.001340032264371024 0.00092289855480717 0.0006333943940810176 0.0004294289912473436 0.0002915683115640592 0.00022539912279093697 0.00015267581316423255 0.00020453187540746544 0.00029998032794169375 0.00044161447486532556 0.0006508099138680083 0.00097365108575957 0.0014590527240740745 0.0021106035581529665 0.0028541081215029025 0.003565593495754309 0.0041394631378815 0.004510620325940205 0.004640662862214508 0.00453476790578657 0.00427301783496627 0.003984092645329021 0.0037430278481098895 0.0035057823399257354 0.0031833431333577003 0.0027739623811732896 0.002361827022744194 0.0019935386997361393 0.0016351864912215151 0.0012589495116249161 0.0009066580400836086 0.0006333943940810198 0.0004417062437438339 0.00030171519351102603 0.00020099329412540682 0.00014969492195175427 0.00009223278715531097 0.00012382628362150806 0.0001937282923613028 0.0003016739162804245 0.00044161447486532724 0.0006246264787304542 0.0008828322819483994 0.0012316737057361765 0.0016396186116322182 0.0020380349828360163 0.0023697225303135187 0.002606494385281733 0.002728447959614904 0.0027321864074082423 0.002656983934535601 0.0025660434782336637 0.002478914196022798 0.002344313469709213 0.0021135152535489104 0.0018231338833620283 0.001554466242855799 0.001331445714550186 0.0011094531117226162 0.0008589568636188372 0.0006161688271076303 0.00042942899124735 0.00030171519351103037 0.00020775715760439344 0.00013678820046357677 0.00009660617943875017 0.000055347440243335036 0.00006979335205074744 0.00011389516179236943 0.00019372829236130284 0.00029998032794169635 0.0004227198059680317 0.0005759894400297524 0.0007774910755573735 0.0010183403054298322 0.001262473650308705 0.001477557116689308 0.001647811713920054 0.0017585618402871479 0.0018017261947860198 0.001796369665921989 0.001776651754178623 0.0017468782307036427 0.0016687172925344555 0.0015145682355305608 0.0013165680957763323 0.0011311065461327978 0.0009705099287999334 0.0008015254916949723 0.0006092634042455428 0.0004273720105761982 0.00029156831156406006 0.00020099329412540985 0.00013678820046357583 0.00009111223839643924 0.00006378627298063754 0.00004194324107620964 0.000046039876205684096 0.0000697933520507481 0.0001238262836215087 0.00020453187540746804 0.00030060001191083906 0.0004154374444783353 0.0005603349195352435 0.0007313386636297372 0.0009055757124909016 0.001063363400451899 0.0011973429792128626 0.001297557394589067 0.0013517795309755784 0.0013659066902064567 0.001362676440433754 0.0013490440679071708 0.0013021331758599152 0.0012018072025311458 0.0010646588843713888 0.0009248564411887988 0.0007900599153244912 0.0006423483931220755 0.0004813101651604767 0.0003349742989234382 0.00022539912279093976 0.0001496949219517583 0.00009660617943875134 0.00006378627298063758 0.000048040463162604035 0.000044783155923660764 0.00004589492550741451 0.00005704904950990799 0.00009102652667143164 0.00014878985649779573 0.00022768469543646462 0.00033520299743253386 0.00047649579205626645 0.0006368373327308805 0.000789716228224515 0.0009254338743022519 0.0010503100328411868 0.0011553897450836334 0.0012163029673619569 0.0012312082497994443 0.0012297430304380862 0.0012312082497994425 0.0012163029673619603 0.00115538974508363 0.00105031003284118 0.0009254338743022519 0.0007897162282245115 0.0006368373327308822 0.0004764957920562682 0.0003352029974325347 0.0002276846954364642 0.00014878985649779573 0.00009102652667143185 0.000057049049509906254 0.00004589492550742037 0.00004589492550741781 0.000050287544943846146 0.00006774528075202411 0.00010792134312512247 0.00017215285754228543 0.0002578894038511502 0.0003744675104934129 0.0005287625121494359 0.0007038565058097163 0.0008701737083641837 0.0010189283889044795 0.0011579051791739715 0.00127563567634381 0.0013445560159961218 0.001362676440433758 0.0013618288308587564 0.0013626764404337545 0.0013445560159961233 0.001275635676343808 0.0011579051791739661 0.001018928388904478 0.0008701737083641796 0.0007038565058097175 0.0005287625121494382 0.00037446751049341275 0.0002578894038511497 0.00017215285754228383 0.00010792134312512308 0.00006774528075202235 0.000050287544943851215 0.00005704904950991015 0.00006774528075202443 0.0001009865955692126 0.00016080406028930728 0.0002445948996790621 0.00035198131564532917 0.0004998642579464946 0.0006972250267069883 0.0009190083262633714 0.0011270689633863403 0.001314527940152116 0.0014941165032954563 0.0016503940612064305 0.0017464322160936927 0.0017766517541786299 0.0017783579871622375 0.0017766517541786288 0.0017464322160936948 0.0016503940612064333 0.0014941165032954537 0.0013145279401521124 0.0011270689633863362 0.0009190083262633731 0.0006972250267069906 0.0004998642579464931 0.0003519813156453275 0.00024459489967905966 0.00016080406028930741 0.00010098659556921097 0.00006774528075202789 0.00009102652667143248 0.00010792134312512293 0.000160804060289307 0.0002493944217476876 0.00036669495389843977 0.0005209896395607595 0.0007402030304244075 0.0010319639807374735 0.001356002967794804 0.0016584905708846658 0.0019295502396633488 0.0021839809405514625 0.0023998563965444797 0.0025286503275099123 0.002566043478233661 0.002566554332134203 0.0025660434782336615 0.0025286503275099154 0.0023998563965444823 0.002183980940551458 0.0019295502396633505 0.0016584905708846645 0.0013560029677948083 0.0010319639807374755 0.0007402030304244066 0.000520989639560759 0.0003666949538984376 0.0002493944217476875 0.00016080406028930576 0.00010792134312512529 0.0001487898564977942 0.00017215285754228278 0.00024459489967905727 0.00036669495389843624 0.0005404671613561396 0.0007900615193276627 0.0011543632072385755 0.0016385034701410658 0.002180842443607051 0.0026987296766766296 0.0031582873446044657 0.003552837721414823 0.003841618738221895 0.003975820768717631 0.0039840926453290244 0.003967720801133174 0.003984092645329026 0.003975820768717638 0.0038416187382218974 0.00355283772141482 0.0031582873446044635 0.002698729676676628 0.0021808424436070535 0.001638503470141067 0.0011543632072385747 0.0007900615193276616 0.0005404671613561377 0.00036669495389843635 0.000244594899679056 0.00017215285754228435 0.00022768469543646446 0.0002578894038511495 0.00035198131564532733 0.0005209896395607585 0.0007900615193276649 0.0012072437313161246 0.0018268018963580805 0.0026546496802874794 0.003610843325070015 0.004570037806178964 0.005425288999380871 0.006089358996347642 0.006480340695556085 0.0065805791958524875 0.006507829512702066 0.00645248231672743 0.006507829512702066 0.006580579195852489 0.006480340695556085 0.006089358996347637 0.005425288999380869 0.004570037806178958 0.0036108433250700155 0.0026546496802874802 0.0018268018963580766 0.0012072437313161224 0.000790061519327663 0.0005209896395607582 0.0003519813156453257 0.00025788940385115084 0.0003352029974325342 0.00037446751049341167 0.000499864257946491 0.0007402030304244071 0.0011543632072385773 0.0018268018963580781 0.0028340466119817415 0.00419281545486429 0.005824229496243895 0.007546972735349735 0.009106667450547144 0.010250489182735962 0.010834126637829372 0.010916081954214438 0.010754562411234781 0.010655259614595916 0.010754562411234781 0.010916081954214443 0.010834126637829372 0.01025048918273596 0.00910666745054715 0.0075469727353497315 0.005824229496243898 0.004192815454864293 0.0028340466119817394 0.0018268018963580766 0.0011543632072385755 0.0007402030304244069 0.0004998642579464891 0.00037446751049341346 0.0004764957920562704 0.0005287625121494359 0.000697225026706989 0.001031963980737476 0.0016385034701410692 0.0026546496802874815 0.004192815454864293 0.006298943931691479 0.008910303039589455 0.011767808214400974 0.014399348124765444 0.016313578902386976 0.017291184098801114 0.017497979483522698 0.01734444029607786 0.01723676140359565 0.01734444029607786 0.017497979483522705 0.017291184098801114 0.016313578902386973 0.014399348124765447 0.011767808214400967 0.008910303039589456 0.00629894393169148 0.004192815454864289 0.002654649680287479 0.001638503470141067 0.0010319639807374757 0.000697225026706987 0.0005287625121494373 0.0006368373327308822 0.0007038565058097156 0.0009190083262633688 0.0013560029677948083 0.0021808424436070535 0.003610843325070015 0.005824229496243899 0.008910303039589453 0.01281726508027634 0.017197117076335006 0.021340499097863345 0.024476616453336104 0.026250381929511925 0.026874775620886446 0.026888939960480217 0.026820140023580078 0.026888939960480217 0.026874775620886443 0.026250381929511925 0.0244766164533361 0.021340499097863348 0.017197117076335002 0.012817265080276344 0.008910303039589455 0.005824229496243893 0.0036108433250700124 0.002180842443607051 0.0013560029677948083 0.0009190083262633667 0.0007038565058097168 0.0007897162282245146 0.0008701737083641763 0.0011270689633863357 0.0016584905708846623 0.002698729676676625 0.004570037806178961 0.007546972735349731 0.01176780821440097 0.017197117076335 0.023456863469955676 0.029682723819807397 0.034771922171507014 0.03796747156086694 0.03927144288015322 0.03939450951957952 0.039285425289338295 0.03939450951957952 0.03927144288015322 0.03796747156086694 0.03477192217150701 0.029682723819807397 0.023456863469955673 0.017197117076335002 0.011767808214400974 0.007546972735349726 0.0045700378061789585 0.002698729676676622 0.001658490570884663 0.0011270689633863333 0.0008701737083641769 0.0009254338743022539 0.0010189283889044823 0.001314527940152108 0.001929550239663355 0.0031582873446044666 0.0054252889993808675 0.00910666745054715 0.014399348124765442 0.021340499097863338 0.0296827238198074 0.038554716696971615 0.04632166075690754 0.051225832259196635 0.0526548031185631 0.05188798945407265 0.05123786746513384 0.05188798945407265 0.0526548031185631 0.051225832259196635 0.04632166075690754 0.038554716696971615 0.029682723819807397 0.021340499097863345 0.014399348124765446 0.009106667450547145 0.005425288999380865 0.0031582873446044627 0.001929550239663356 0.0013145279401521055 0.001018928388904483 0.0010503100328411823 0.0011579051791739618 0.0014941165032954513 0.0021839809405514578 0.0035528377214148195 0.006089358996347642 0.01025048918273596 0.016313578902386976 0.0244766164533361 0.03477192217150701 0.04632166075690754 0.05648559203452079 0.06174413796773679 0.06076976938801452 0.056542570270603554 0.054270952519896845 0.056542570270603554 0.06076976938801452 0.0617441379677368 0.05648559203452079 0.04632166075690754 0.03477192217150701 0.024476616453336104 0.016313578902386976 0.010250489182735955 0.00608935899634764 0.0035528377214148147 0.0021839809405514586 0.001494116503295449 0.0011579051791739633 0.0011553897450836354 0.0012756356763438071 0.0016503940612064335 0.00239985639654448 0.0038416187382219013 0.006480340695556083 0.010834126637829376 0.01729118409880111 0.026250381929511922 0.037967471560866946 0.05122583225919664 0.06174413796773679 0.06391931164200328 0.05667798221207814 0.046378590835054814 0.04168268473527755 0.046378590835054814 0.05667798221207814 0.06391931164200328 0.06174413796773678 0.05122583225919664 0.03796747156086694 0.026250381929511922 0.01729118409880111 0.01083412663782937 0.006480340695556081 0.0038416187382218974 0.0023998563965444814 0.0016503940612064315 0.0012756356763438093 0.0012163029673619577 0.0013445560159961183 0.0017464322160936976 0.00252865032750991 0.003975820768717635 0.0065805791958524935 0.01091608195421444 0.0174979794835227 0.026874775620886436 0.03927144288015322 0.05265480311856309 0.06076976938801452 0.05667798221207815 0.04165728956585284 0.0263126367861459 0.02023283460695706 0.026312636786145902 0.041657289565852844 0.05667798221207815 0.060769769388014525 0.05265480311856308 0.03927144288015322 0.02687477562088644 0.017497979483522705 0.010916081954214438 0.006580579195852493 0.003975820768717632 0.002528650327509912 0.0017464322160936968 0.001344556015996121 0.0012312082497994432 0.0013626764404337521 0.0017766517541786266 0.002566043478233662 0.003984092645329028 0.006507829512702059 0.010754562411234783 0.017344440296077856 0.026888939960480217 0.03939450951957952 0.051887989454072664 0.056542570270603554 0.04637859083505482 0.026312636786145902 0.010166722672810914 0.004844895108568841 0.010166722672810916 0.026312636786145906 0.046378590835054814 0.056542570270603554 0.05188798945407266 0.03939450951957952 0.026888939960480213 0.01734444029607786 0.010754562411234781 0.0065078295127020585 0.003984092645329024 0.002566043478233663 0.0017766517541786258 0.001362676440433755 0.0012297430304380873 0.0013618288308587492 0.0017783579871622351 0.0025665543321341973 0.003967720801133173 0.006452482316727433 0.010655259614595913 0.017236761403595646 0.026820140023580075 0.03928542528933829 0.05123786746513384 0.05427095251989684 0.041682684735277545 0.02023283460695706 0.0048448951085688415 0.00038991590232485655 0.004844895108568843 0.020232834606957063 0.041682684735277545 0.05427095251989684 0.05123786746513384 0.03928542528933829 0.026820140023580075 0.017236761403595646 0.010655259614595913 0.006452482316727432 0.0039677208011331695 0.0025665543321341977 0.0017783579871622338 0.0013618288308587514 0.0012312082497994434 0.0013626764404337526 0.001776651754178626 0.002566043478233663 0.003984092645329028 0.006507829512702059 0.010754562411234785 0.017344440296077856 0.026888939960480213 0.03939450951957952 0.051887989454072664 0.056542570270603554 0.046378590835054814 0.026312636786145902 0.010166722672810912 0.004844895108568844 0.010166722672810914 0.026312636786145906 0.04637859083505482 0.05654257027060355 0.05188798945407266 0.03939450951957951 0.026888939960480217 0.017344440296077856 0.010754562411234781 0.006507829512702059 0.003984092645329025 0.0025660434782336632 0.0017766517541786234 0.0013626764404337539 0.0012163029673619577 0.0013445560159961187 0.0017464322160936966 0.002528650327509911 0.003975820768717636 0.0065805791958524935 0.01091608195421444 0.017497979483522698 0.026874775620886436 0.03927144288015322 0.05265480311856308 0.06076976938801452 0.05667798221207815 0.041657289565852844 0.026312636786145902 0.02023283460695706 0.0263126367861459 0.04165728956585284 0.05667798221207814 0.06076976938801452 0.05265480311856309 0.03927144288015321 0.026874775620886443 0.017497979483522705 0.01091608195421444 0.006580579195852494 0.003975820768717634 0.0025286503275099115 0.0017464322160936929 0.0013445560159961191 0.0011553897450836358 0.0012756356763438078 0.001650394061206434 0.002399856396544481 0.0038416187382219013 0.006480340695556084 0.010834126637829376 0.01729118409880111 0.026250381929511922 0.037967471560866946 0.05122583225919665 0.06174413796773679 0.06391931164200328 0.05667798221207814 0.04637859083505482 0.04168268473527755 0.046378590835054814 0.05667798221207815 0.06391931164200328 0.061744137967736784 0.05122583225919664 0.03796747156086694 0.026250381929511925 0.017291184098801114 0.010834126637829376 0.006480340695556085 0.003841618738221901 0.0023998563965444814 0.0016503940612064296 0.0012756356763438076 0.0010503100328411825 0.0011579051791739618 0.0014941165032954535 0.0021839809405514565 0.003552837721414818 0.006089358996347644 0.01025048918273596 0.016313578902386976 0.0244766164533361 0.03477192217150701 0.04632166075690754 0.05648559203452079 0.0617441379677368 0.06076976938801452 0.056542570270603554 0.054270952519896845 0.056542570270603554 0.060769769388014525 0.06174413796773679 0.05648559203452078 0.04632166075690754 0.034771922171507 0.024476616453336104 0.016313578902386973 0.01025048918273596 0.006089358996347645 0.003552837721414818 0.002183980940551457 0.00149411650329545 0.0011579051791739613 0.0009254338743022545 0.0010189283889044814 0.0013145279401521126 0.0019295502396633531 0.0031582873446044657 0.00542528899938087 0.009106667450547149 0.014399348124765442 0.02134049909786334 0.029682723819807397 0.038554716696971615 0.04632166075690754 0.051225832259196635 0.05265480311856309 0.05188798945407266 0.051237867465133834 0.05188798945407266 0.0526548031185631 0.051225832259196635 0.04632166075690753 0.038554716696971615 0.029682723819807397 0.021340499097863345 0.014399348124765444 0.009106667450547154 0.005425288999380872 0.003158287344604467 0.001929550239663354 0.0013145279401521103 0.0010189283889044823 0.0007897162282245153 0.0008701737083641748 0.0011270689633863414 0.0016584905708846597 0.0026987296766766244 0.004570037806178963 0.007546972735349732 0.01176780821440097 0.017197117076335002 0.023456863469955666 0.0296827238198074 0.03477192217150701 0.037967471560866946 0.03927144288015321 0.039394509519579526 0.039285425289338295 0.039394509519579526 0.03927144288015321 0.037967471560866946 0.034771922171507 0.0296827238198074 0.023456863469955666 0.017197117076335006 0.011767808214400969 0.007546972735349735 0.004570037806178965 0.0026987296766766253 0.0016584905708846606 0.00112706896338634 0.0008701737083641767 0.0006368373327308828 0.0007038565058097144 0.0009190083262633745 0.001356002967794806 0.0021808424436070527 0.003610843325070017 0.005824229496243899 0.008910303039589456 0.012817265080276342 0.017197117076335002 0.021340499097863345 0.024476616453336108 0.02625038192951193 0.026874775620886443 0.026888939960480217 0.026820140023580078 0.026888939960480217 0.026874775620886443 0.02625038192951193 0.024476616453336104 0.021340499097863348 0.017197117076335002 0.012817265080276344 0.008910303039589456 0.005824229496243902 0.00361084332507002 0.0021808424436070535 0.001356002967794807 0.0009190083262633733 0.0007038565058097171 0.0004764957920562713 0.0005287625121494352 0.0006972250267069946 0.0010319639807374744 0.0016385034701410686 0.0026546496802874846 0.004192815454864295 0.0062989439316914805 0.008910303039589456 0.011767808214400972 0.014399348124765444 0.01631357890238698 0.017291184098801118 0.0174979794835227 0.01734444029607786 0.01723676140359565 0.01734444029607786 0.017497979483522705 0.017291184098801118 0.016313578902386976 0.014399348124765447 0.01176780821440097 0.008910303039589456 0.006298943931691482 0.004192815454864296 0.0026546496802874863 0.0016385034701410694 0.0010319639807374753 0.000697225026706993 0.0005287625121494383 0.0003352029974325353 0.0003744675104934115 0.000499864257946496 0.0007402030304244057 0.0011543632072385783 0.0018268018963580805 0.0028340466119817454 0.004192815454864291 0.0058242294962438995 0.00754697273534973 0.009106667450547154 0.010250489182735956 0.010834126637829379 0.010916081954214429 0.010754562411234786 0.010655259614595906 0.010754562411234795 0.010916081954214434 0.01083412663782938 0.010250489182735953 0.009106667450547156 0.007546972735349725 0.0058242294962439 0.004192815454864291 0.0028340466119817463 0.0018268018963580818 0.0011543632072385786 0.0007402030304244063 0.0004998642579464938 0.0003744675104934143 0.0002276846954364653 0.00025788940385114884 0.0003519813156453309 0.0005209896395607575 0.0007900615193276649 0.0012072437313161264 0.001826801896358081 0.00265464968028748 0.0036108433250700176 0.0045700378061789585 0.005425288999380871 0.006089358996347638 0.006480340695556088 0.006580579195852483 0.0065078295127020645 0.0064524823167274245 0.006507829512702066 0.006580579195852487 0.006480340695556086 0.006089358996347634 0.005425288999380871 0.004570037806178954 0.0036108433250700176 0.002654649680287479 0.0018268018963580812 0.0012072437313161266 0.0007900615193276653 0.0005209896395607576 0.00035198131564532896 0.00025788940385115165 0.00014878985649779492 0.0001721528575422823 0.00024459489967905976 0.00036669495389843597 0.0005404671613561393 0.0007900615193276644 0.0011543632072385777 0.001638503470141066 0.002180842443607053 0.0026987296766766253 0.0031582873446044657 0.0035528377214148173 0.0038416187382218983 0.003975820768717629 0.003984092645329028 0.0039677208011331695 0.0039840926453290305 0.003975820768717629 0.0038416187382218922 0.0035528377214148134 0.003158287344604466 0.0026987296766766236 0.002180842443607054 0.0016385034701410668 0.0011543632072385775 0.0007900615193276644 0.0005404671613561405 0.0003666949538984363 0.00024459489967905857 0.00017215285754228514 0.00009102652667143261 0.00010792134312512213 0.00016080406028930844 0.0002493944217476872 0.00036669495389843895 0.0005209896395607608 0.0007402030304244087 0.0010319639807374746 0.0013560029677948037 0.0016584905708846652 0.0019295502396633525 0.0021839809405514677 0.0023998563965444814 0.0025286503275099097 0.002566043478233659 0.002566554332134203 0.002566043478233664 0.0025286503275099128 0.0023998563965444823 0.0021839809405514634 0.0019295502396633527 0.0016584905708846628 0.001356002967794807 0.0010319639807374764 0.0007402030304244089 0.0005209896395607609 0.00036669495389844036 0.00024939442174768723 0.0001608040602893073 0.00010792134312512541 0.00005704904950991022 0.00006774528075202357 0.00010098659556921375 0.00016080406028930752 0.0002445948996790608 0.0003519813156453298 0.0004998642579464958 0.0006972250267069905 0.0009190083262633712 0.0011270689633863375 0.0013145279401521116 0.0014941165032954478 0.0016503940612064363 0.0017464322160936894 0.001776651754178625 0.0017783579871622347 0.0017766517541786277 0.001746432216093693 0.0016503940612064357 0.0014941165032954452 0.0013145279401521096 0.0011270689633863322 0.0009190083262633719 0.0006972250267069877 0.0004998642579464957 0.0003519813156453289 0.00024459489967906177 0.0001608040602893069 0.00010098659556921245 0.00006774528075202805 0.00004589492550741785 0.00005028754494384571 0.0000677452807520246 0.00010792134312512266 0.0001721528575422849 0.00025788940385115046 0.00037446751049341324 0.0005287625121494353 0.0007038565058097144 0.0008701737083641822 0.0010189283889044814 0.0011579051791739672 0.0012756356763438063 0.0013445560159961161 0.0013626764404337543 0.0013618288308587555 0.0013626764404337539 0.0013445560159961202 0.001275635676343809 0.0011579051791739624 0.0010189283889044786 0.0008701737083641729 0.000703856505809718 0.0005287625121494371 0.0003744675104934144 0.00025788940385115057 0.0001721528575422853 0.00010792134312512288 0.00006774528075202308 0.00005028754494385116 0.00003999670548055596 0.00004194324107620589 0.00005534744024333297 0.00009223278715530712 0.00015267581316422878 0.00023234710462510192 0.00033613445730578447 0.0004687949647652224 0.0006197248184155318 0.0007667896670978357 0.0008995969267711935 0.00102237970790197 0.0011288125431500491 0.0011986080708773564 0.0012264093166083293 0.0012312082497994321 0.0012264093166083276 0.0011986080708773581 0.0011288125431500456 0.001022379707901963 0.0008995969267711831 0.0007667896670978357 0.0006197248184155318 0.0004687949647652224 0.00033613445730578794 0.0002323471046251041 0.00015267581316422878 0.00009223278715531145 0.00005534744024333427 0.00004194324107621044 0.000041943241076205705 0.00004603987620568197 0.00006979335205074732 0.00012382628362150774 0.00020453187540746552 0.0003006000119108388 0.00041543744447833353 0.000560334919535244 0.0007313386636297325 0.0009055757124909107 0.0010633634004519068 0.0011973429792128734 0.001297557394589074 0.0013517795309755715 0.001365906690206458 0.001362676440433748 0.0013490440679071673 0.0013021331758599228 0.0012018072025311497 0.0010646588843713984 0.0009248564411888015 0.0007900599153244988 0.0006423483931220769 0.0004813101651604727 0.00033497429892343406 0.00022539912279093632 0.00014969492195175143 0.00009660617943875016 0.00006378627298063432 0.00004804046316260132 0.00005534744024333038 0.0000697933520507466 0.00011389516179236906 0.0001937282923613023 0.00029998032794169424 0.00042271980596803185 0.0005759894400297503 0.0007774910755573733 0.001018340305429829 0.0012624736503087115 0.0014775571166893116 0.0016478117139200619 0.0017585618402871544 0.0018017261947860187 0.0017963696659219924 0.0017766517541786143 0.0017468782307036386 0.0016687172925344625 0.0015145682355305722 0.0013165680957763406 0.0011311065461328004 0.0009705099287999392 0.0008015254916949674 0.0006092634042455399 0.0004273720105761918 0.000291568311564055 0.00020099329412540405 0.00013678820046357607 0.00009111223839643591 0.00006378627298063536 0.00009223278715530541 0.00012382628362150782 0.0001937282923613024 0.00030167391628042374 0.00044161447486532637 0.0006246264787304545 0.0008828322819483976 0.0012316737057361756 0.0016396186116322173 0.00203803498283602 0.00236972253031352 0.0026064943852817345 0.002728447959614904 0.002732186407408239 0.0026569839345356033 0.0025660434782336554 0.0024789141960227853 0.0023443134697092127 0.0021135152535489135 0.0018231338833620278 0.0015544662428557939 0.0013314457145501835 0.0011094531117226147 0.0008589568636188326 0.0006161688271076232 0.0004294289912473426 0.00030171519351102576 0.0002077571576043944 0.00013678820046357333 0.00009660617943874875 0.0001526758131642261 0.00020453187540746503 0.0002999803279416919 0.0004416144748653246 0.0006508099138680067 0.00097365108575957 0.0014590527240740728 0.0021106035581529674 0.002854108121502899 0.003565593495754314 0.004139463137881501 0.0045106203259402105 0.004640662862214502 0.004534767905786569 0.004273017834966273 0.0039840926453290244 0.00374302784810988 0.003505782339925744 0.0031833431333576964 0.002773962381173288 0.002361827022744189 0.001993538699736136 0.0016351864912215134 0.0012589495116249135 0.0009066580400836018 0.0006333943940810118 0.00044170624374382985 0.00030171519351102717 0.0002009932941254022 0.00014969492195175235 0.00023234710462509907 0.0003006000119108386 0.00042271980596803006 0.0006246264787304536 0.0009736510857595716 0.001555350776191856 0.0024284076200209283 0.0035749591955013837 0.0048837020470039886 0.006171924531510292 0.007230885503687027 0.007885851634352315 0.008053268662561041 0.007765271584428248 0.007171889765094909 0.0065078295127020515 0.005963646198878781 0.005545206054145702 0.005105322245517 0.004537419787465299 0.00387718462972182 0.0032019567330937243 0.002535785925900223 0.0018950825958768706 0.0013400322643710159 0.0009228985548071604 0.0006333943940810139 0.00042942899124734466 0.00029156831156405306 0.00022539912279093493 0.0003361344573057855 0.0004154374444783357 0.0005759894400297491 0.0008828322819483996 0.0014590527240740752 0.0024284076200209287 0.0038449800445795974 0.0056888854117370545 0.007878392384066558 0.010174247183974288 0.012128142883814004 0.013300080450640456 0.013543651521091849 0.013006136920165738 0.011961891930324663 0.010754562411234785 0.009724646432491046 0.00898662822372675 0.008340585241485118 0.007517489748370419 0.006443731463249301 0.005225728102749308 0.004001168929060429 0.0028883717904480124 0.001987585477664543 0.0013400322643710137 0.0009066580400836037 0.0006161688271076269 0.0004273720105761894 0.00033497429892343427 0.0004687949647652226 0.0005603349195352447 0.0007774910755573722 0.0012316737057361767 0.0021106035581529687 0.003574959195501384 0.005688885411737054 0.008518072672587645 0.012113170777656668 0.016130953814403683 0.0196188113180979 0.021600447001363186 0.021871898399191694 0.020913217290195893 0.019262043358730805 0.01734444029607785 0.015606687393438859 0.014298536985646171 0.01320545188047307 0.011899632005612573 0.010179124463848827 0.008167517098673105 0.006129708980026591 0.004314121678006393 0.0028883717904480103 0.0018950825958768695 0.001258949511624913 0.000858956863618835 0.0006092634042455397 0.0004813101651604741 0.0006197248184155306 0.000731338663629735 0.0010183403054298279 0.0016396186116322189 0.002854108121502902 0.004883702047003988 0.007878392384066561 0.012113170777656668 0.01786507350603816 0.024608649914735686 0.030550059905471993 0.03380867422689518 0.034073916820984464 0.03239910529167102 0.02981367918904268 0.02688893996048021 0.024131797236828945 0.021878320719838727 0.019899013037081054 0.01767088697656698 0.014947087410735683 0.011889215069225804 0.008839845022533018 0.006129708980026591 0.004001168929060429 0.002535785925900218 0.001635186491221514 0.001109453111722617 0.0008015254916949625 0.0006423483931220744 0.0007667896670978363 0.0009055757124909078 0.0012624736503087073 0.002038034982836018 0.003565593495754312 0.00617192453151029 0.01017424718397428 0.016130953814403676 0.024608649914735676 0.034928612089142844 0.04435217915922054 0.04979656952952351 0.050491304937156874 0.047938404154548864 0.04387607687253015 0.03939450951957952 0.03526993486347836 0.0318112285958015 0.02854698315066252 0.02483327612429589 0.02057228699217593 0.016125443171831916 0.011889215069225802 0.008167517098673105 0.005225728102749304 0.0032019567330937226 0.0019935386997361314 0.0013314457145501787 0.0009705099287999336 0.0007900599153244941 0.0008995969267711839 0.0010633634004519007 0.0014775571166893028 0.0023697225303135213 0.004139463137881501 0.007230885503687018 0.012128142883814 0.019618811318097895 0.030550059905471983 0.04435217915922055 0.05780088809326291 0.06659102873504198 0.06866773887166149 0.06518714478868119 0.05874562097273792 0.05188798945407266 0.04639919581004441 0.042377732608002046 0.03834686322647693 0.03308671725470335 0.026834614134389624 0.02057228699217594 0.014947087410735683 0.010179124463848832 0.006443731463249304 0.003877184629721814 0.0023618270227441936 0.0015544662428557995 0.0011311065461327963 0.0009248564411887997 0.0010223797079019646 0.001197342979212864 0.0016478117139200605 0.002606494385281729 0.004510620325940209 0.00788585163435231 0.01330008045064045 0.021600447001363186 0.03380867422689518 0.0497965695295235 0.06659102873504197 0.0788799121953625 0.08242112353905495 0.0770637825693041 0.06663205520314515 0.05654257027060355 0.05061792172031549 0.04845800059513081 0.04623882046826718 0.040967048702471184 0.033086717254703336 0.02483327612429589 0.01767088697656698 0.011899632005612578 0.00751748974837042 0.004537419787465307 0.002773962381173295 0.0018231338833620322 0.0013165680957763384 0.0010646588843713958 0.0011288125431500463 0.0012975573945890686 0.001758561840287147 0.002728447959614904 0.004640662862214509 0.008053268662561041 0.013543651521091854 0.02187189839919169 0.03407391682098447 0.05049130493715689 0.0686677388716615 0.08242112353905495 0.08510319364006401 0.07545099821496906 0.05954917846784604 0.04637859083505481 0.0417589225893368 0.044700943846149505 0.048297021958774146 0.04623882046826718 0.038346863226476936 0.028546983150662522 0.019899013037081057 0.013205451880473075 0.008340585241485121 0.005105322245516996 0.0031833431333577003 0.0021135152535489204 0.0015145682355305675 0.0012018072025311503 0.0011986080708773549 0.001351779530975574 0.0018017261947860246 0.0027321864074082393 0.004534767905786574 0.007765271584428245 0.013006136920165738 0.020913217290195893 0.03239910529167102 0.04793840415454885 0.06518714478868116 0.0770637825693041 0.07545099821496906 0.05996092486880796 0.04002983023865638 0.026312636786145902 0.024326738604191468 0.03325555919185392 0.04470094384614951 0.04845800059513082 0.04237773260800204 0.03181122859580151 0.02187832071983873 0.014298536985646175 0.008986628223726749 0.005545206054145702 0.003505782339925737 0.002344313469709204 0.0016687172925344614 0.0013021331758599167 0.0012264093166083284 0.0013659066902064608 0.001796369665921989 0.0026569839345356033 0.004273017834966273 0.007171889765094904 0.011961891930324667 0.0192620433587308 0.029813679189042683 0.04387607687253016 0.05874562097273792 0.06663205520314515 0.05954917846784604 0.04002983023865638 0.02057159250796283 0.010166722672810909 0.011332167747017898 0.02432673860419147 0.04175892258933681 0.050617921720315505 0.04639919581004443 0.035269934863478375 0.024131797236828952 0.015606687393438875 0.009724646432491055 0.005963646198878786 0.003743027848109887 0.0024789141960227935 0.0017468782307036403 0.0013490440679071703 0.001231208249799439 0.0013626764404337515 0.0017766517541786208 0.002566043478233659 0.0039840926453290244 0.006507829512702053 0.010754562411234778 0.017344440296077852 0.02688893996048021 0.03939450951957951 0.05188798945407265 0.05654257027060355 0.0463785908350548 0.0263126367861459 0.010166722672810912 0.0048448951085688415 0.010166722672810914 0.026312636786145906 0.046378590835054814 0.056542570270603554 0.05188798945407266 0.03939450951957951 0.026888939960480213 0.01734444029607786 0.010754562411234781 0.006507829512702058 0.003984092645329023 0.002566043478233658 0.001776651754178623 0.0013626764404337521 0.001226409316608329 0.00134904406790717 0.0017468782307036375 0.002478914196022793 0.0037430278481098895 0.005963646198878784 0.009724646432491053 0.015606687393438864 0.024131797236828952 0.03526993486347836 0.04639919581004442 0.05061792172031549 0.0417589225893368 0.024326738604191475 0.011332167747017903 0.010166722672810909 0.02057159250796283 0.04002983023865638 0.05954917846784604 0.06663205520314516 0.05874562097273793 0.04387607687253016 0.029813679189042687 0.01926204335873081 0.01196189193032467 0.0071718897650949074 0.004273017834966269 0.0026569839345356025 0.0017963696659219893 0.0013659066902064613 0.0011986080708773555 0.0013021331758599171 0.0016687172925344594 0.0023443134697092027 0.003505782339925739 0.005545206054145701 0.008986628223726747 0.014298536985646171 0.021878320719838727 0.0318112285958015 0.04237773260800203 0.048458000595130814 0.044700943846149505 0.033255559191853926 0.024326738604191475 0.026312636786145902 0.04002983023865638 0.059960924868807955 0.07545099821496906 0.07706378256930412 0.06518714478868118 0.04793840415454886 0.032399105291671025 0.020913217290195903 0.013006136920165744 0.0077652715844282495 0.004534767905786571 0.002732186407408238 0.0018017261947860235 0.0013517795309755728 0.0011288125431500476 0.0012018072025311523 0.0015145682355305688 0.0021135152535489187 0.0031833431333577024 0.005105322245516999 0.008340585241485125 0.013205451880473073 0.01989901303708106 0.028546983150662526 0.03834686322647693 0.04623882046826718 0.04829702195877414 0.04470094384614952 0.04175892258933681 0.04637859083505481 0.05954917846784604 0.07545099821496906 0.08510319364006402 0.08242112353905497 0.0686677388716615 0.05049130493715689 0.03407391682098448 0.021871898399191698 0.013543651521091856 0.008053268662561045 0.004640662862214505 0.0027284479596149025 0.0017585618402871457 0.0012975573945890665 0.0010223797079019657 0.0010646588843713977 0.0013165680957763423 0.001823133883362029 0.0027739623811732965 0.004537419787465312 0.0075174897483704225 0.011899632005612575 0.017670886976566984 0.024833276124295887 0.033086717254703336 0.04096704870247118 0.04623882046826718 0.048458000595130814 0.050617921720315505 0.05654257027060355 0.06663205520314515 0.0770637825693041 0.08242112353905498 0.0788799121953625 0.06659102873504197 0.0497965695295235 0.03380867422689519 0.021600447001363186 0.013300080450640451 0.007885851634352313 0.0045106203259402036 0.002606494385281726 0.0016478117139200608 0.0011973429792128609 0.0008995969267711855 0.0009248564411888013 0.0011311065461328028 0.0015544662428557965 0.0023618270227441945 0.003877184629721822 0.006443731463249307 0.010179124463848832 0.01494708741073569 0.020572286992175937 0.026834614134389628 0.03308671725470335 0.038346863226476936 0.042377732608002046 0.046399195810044425 0.05188798945407265 0.05874562097273792 0.06518714478868118 0.0686677388716615 0.06659102873504197 0.05780088809326291 0.04435217915922055 0.030550059905471987 0.019618811318097895 0.012128142883814004 0.007230885503687022 0.004139463137881496 0.0023697225303135182 0.0014775571166893054 0.0010633634004518979 0.0007667896670978382 0.0007900599153244942 0.0009705099287999405 0.0013314457145501752 0.0019935386997361327 0.0032019567330937326 0.005225728102749309 0.008167517098673107 0.011889215069225807 0.016125443171831913 0.020572286992175937 0.0248332761242959 0.028546983150662536 0.03181122859580151 0.035269934863478375 0.03939450951957951 0.043876076872530166 0.04793840415454885 0.0504913049371569 0.04979656952952349 0.04435217915922054 0.03492861208914283 0.024608649914735683 0.016130953814403673 0.010174247183974285 0.006171924531510291 0.0035655934957543067 0.0020380349828360137 0.0012624736503087104 0.0009055757124909056 0.0006197248184155327 0.0006423483931220739 0.0008015254916949692 0.0011094531117226143 0.0016351864912215147 0.0025357859259002285 0.004001168929060432 0.006129708980026596 0.00883984502253302 0.011889215069225807 0.01494708741073569 0.017670886976566987 0.01989901303708106 0.02187832071983873 0.024131797236828952 0.026888939960480206 0.029813679189042687 0.032399105291671025 0.03407391682098448 0.03380867422689519 0.030550059905471976 0.024608649914735683 0.017865073506038165 0.01211317077765667 0.007878392384066565 0.004883702047003991 0.0028541081215028973 0.001639618611632216 0.0010183403054298316 0.0007313386636297343 0.0004687949647652253 0.0004813101651604733 0.0006092634042455458 0.0008589568636188317 0.0012589495116249144 0.0018950825958768797 0.0028883717904480155 0.004314121678006399 0.006129708980026601 0.008167517098673109 0.010179124463848834 0.011899632005612585 0.013205451880473082 0.014298536985646175 0.015606687393438871 0.017344440296077852 0.019262043358730812 0.020913217290195896 0.0218718983991917 0.021600447001363186 0.01961881131809789 0.01613095381440368 0.01211317077765667 0.008518072672587643 0.005688885411737055 0.0035749591955013876 0.0021106035581529643 0.0012316737057361748 0.0007774910755573765 0.0005603349195352455 0.0003361344573057894 0.00033497429892343384 0.00042737201057619517 0.0006161688271076233 0.0009066580400836056 0.0013400322643710217 0.001987585477664548 0.0028883717904480155 0.004001168929060438 0.005225728102749307 0.0064437314632493185 0.007517489748370426 0.008340585241485133 0.00898662822372674 0.009724646432491064 0.010754562411234772 0.011961891930324677 0.013006136920165737 0.013543651521091863 0.013300080450640446 0.012128142883814 0.010174247183974278 0.007878392384066563 0.0056888854117370475 0.0038449800445796004 0.002428407620020931 0.0014590527240740724 0.0008828322819483993 0.0005759894400297552 0.00041543744447833814 0.00023234710462510268 0.00022539912279093444 0.0002915683115640577 0.0004294289912473406 0.0006333943940810149 0.0009228985548071664 0.0013400322643710193 0.001895082595876875 0.002535785925900232 0.003201956733093728 0.003877184629721837 0.004537419787465309 0.005105322245517014 0.005545206054145691 0.0059636461988788 0.006507829512702049 0.007171889765094911 0.007765271584428249 0.008053268662561043 0.007885851634352308 0.007230885503687017 0.006171924531510287 0.004883702047003988 0.0035749591955013794 0.0024284076200209296 0.001555350776191858 0.0009736510857595681 0.0006246264787304553 0.00042271980596803635 0.00030060001191084155 0.00015267581316422965 0.00014969492195175162 0.00020099329412540606 0.00030171519351102305 0.00044170624374383007 0.0006333943940810146 0.0009066580400836023 0.0012589495116249142 0.0016351864912215158 0.001993538699736134 0.0023618270227442023 0.0027739623811733013 0.0031833431333577124 0.0035057823399257376 0.0037430278481098934 0.003984092645329021 0.004273017834966271 0.00453476790578657 0.0046406628622145 0.004510620325940202 0.004139463137881491 0.00356559349575431 0.002854108121502901 0.0021106035581529626 0.001459052724074074 0.0009736510857595725 0.0006508099138680042 0.0004416144748653283 0.00029998032794169885 0.00020453187540746888 0.00009223278715530793 0.00009660617943874651 0.0001367882004635758 0.00020775715760438994 0.00030171519351102457 0.0004294289912473441 0.0006161688271076231 0.0008589568636188358 0.0011094531117226134 0.0013314457145501815 0.0015544662428558047 0.001823133883362037 0.0021135152535489217 0.0023443134697092014 0.002478914196022792 0.0025660434782336567 0.0026569839345356016 0.002732186407408241 0.002728447959614899 0.0026064943852817284 0.0023697225303135156 0.0020380349828360168 0.0016396186116322173 0.0012316737057361735 0.0008828322819483996 0.0006246264787304579 0.00044161447486532453 0.00030167391628042856 0.00019372829236130828 0.00012382628362151183 0.000055347440243331865 0.00006378627298063215 0.00009111223839643755 0.00013678820046357206 0.00020099329412540378 0.0002915683115640557 0.00042737201057619105 0.000609263404245541 0.0008015254916949697 0.0009705099287999337 0.0011311065461328124 0.0013165680957763425 0.0015145682355305757 0.0016687172925344477 0.0017468782307036397 0.001776651754178611 0.001796369665921988 0.0018017261947860224 0.0017585618402871444 0.0016478117139200534 0.0014775571166893004 0.0012624736503087047 0.0010183403054298324 0.0007774910755573704 0.0005759894400297526 0.0004227198059680353 0.00029998032794169326 0.00019372829236130696 0.0001138951617923737 0.00006979335205075092 0.00004194324107620657 0.000048040463162597204 0.00006378627298063461 0.00009660617943874616 0.00014969492195175105 0.0002253991227909347 0.0003349742989234308 0.00048131016516047377 0.0006423483931220736 0.0007900599153244932 0.000924856441188805 0.0010646588843714036 0.0012018072025311486 0.0013021331758599096 0.0013490440679071695 0.0013626764404337448 0.0013659066902064565 0.0013517795309755764 0.0012975573945890628 0.0011973429792128596 0.0010633634004518942 0.0009055757124909079 0.0007313386636297343 0.0005603349195352413 0.00041543744447833554 0.00030060001191084155 0.00020453187540746465 0.00012382628362151218 0.0000697933520507505 0.000046039876205686495 0.00003299600592525473 0.00003597365585370491 0.00005216389130005615 0.000092962170334268 0.00015775652622948642 0.00023864228845880443 0.0003344107973057269 0.00044961097665089343 0.0005832294783845796 0.0007212546483763883 0.000848652587863024 0.0009628131037069249 0.0010644064853800005 0.0011463175132408882 0.0011986080708773546 0.0012163029673619517 0.0011986080708773616 0.0011463175132408847 0.001064406485380004 0.0009628131037069214 0.0008486525878630274 0.0007212546483763883 0.0005832294783845726 0.0004496109766508917 0.0003344107973057304 0.00023864228845880487 0.00015775652622948013 0.0000929621703342706 0.00005216389130005355 0.000035973655853705345 0.000035973655853702086 0.00004185228624762491 0.00007273331620749328 0.00014001957347210055 0.0002370357009563509 0.00034400341974442824 0.0004557180282623762 0.0005865215698875135 0.0007465776724080113 0.000921890954982216 0.0010826685402583554 0.0012065670294402905 0.0012883678922504763 0.001333902222608257 0.001351779530975571 0.001344556015996115 0.0013021331758599176 0.0012123734799485172 0.0010815579702260208 0.0009370424568941393 0.0008039528511211515 0.0006814304005537412 0.000551997357356167 0.00041445894177783723 0.0002898163901862302 0.0001957018338934876 0.0001310749938927124 0.00008633426488525946 0.00005773213817806121 0.000042464763661093724 0.000052163891300055464 0.00007273331620749526 0.00012916539479545172 0.00022688081584744548 0.0003533047695375068 0.0004938311102070564 0.0006575346592259378 0.0008649531896832565 0.0011191498215588833 0.0013888305176585234 0.0016224551241649854 0.001779416797872281 0.00184749830338486 0.0018436353554615293 0.0018017261947860244 0.0017464322160936892 0.0016687172925344657 0.0015361738697273987 0.0013402003972896673 0.001123903496920181 0.0009407587239141637 0.0007970503483696793 0.0006561523056794497 0.0004963521413852153 0.00034311220896241027 0.00023073618568791475 0.00016134910101133876 0.00011571395533526906 0.00008108726648983507 0.000057732138178066003 0.00009296217033427238 0.00014001957347210638 0.00022688081584744732 0.0003502417832487437 0.000511028020787966 0.0007311047369061616 0.0010440770375415899 0.0014604341919198373 0.0019465698802292974 0.002423979187085867 0.0028018161266351953 0.0030170576322447735 0.0030503657603172044 0.0029314670065587237 0.0027321864074082367 0.0025286503275099063 0.002344313469709197 0.002134042701198258 0.0018521698782702916 0.0015340316098065938 0.001261728621581648 0.0010612533502024912 0.0008835265101450246 0.0006838316235267733 0.0004844533228748201 0.0003324322130755776 0.0002354031801643062 0.00016831495554073925 0.00011571395533526804 0.00008633426488526339 0.0001577565262294843 0.00023703570095635077 0.000353304769537502 0.0005110280207879605 0.0007582882900205657 0.0011702724834703985 0.0018004153950183074 0.0026293898016959954 0.003554862012239765 0.004422978400784097 0.005081308636276987 0.005421110613354324 0.0054021003110516505 0.005066004126662931 0.004534767905786569 0.003975820768717635 0.003505782339925739 0.003109176087071831 0.002694549901459452 0.002240658034798413 0.0018252040088143572 0.0015021101566728263 0.001231019929226467 0.00095544760635267 0.0006895470735222081 0.0004810140756292388 0.00033826785089126793 0.0002354031801643047 0.00016134910101133602 0.00013107499389271676 0.00023864228845880647 0.0003440034197444315 0.0004938311102070554 0.0007311047369061594 0.0011702724834704002 0.0019355668732131612 0.0030756018951073553 0.004526188866547983 0.006144054076131457 0.007710433178781155 0.008929833570272596 0.009543175734881953 0.009473934063312556 0.008819247828205534 0.007765271584428251 0.0065805791958524875 0.005545206054145708 0.0047603283170296485 0.0041071301072263975 0.0034530126341166304 0.0028100800161902036 0.0022502321078609715 0.0017735870623411655 0.0013428023934787074 0.0009682847789069727 0.000682670017928165 0.00048101407562923837 0.00033243221307557446 0.00023073618568791117 0.0001957018338934878 0.0003344107973057288 0.00045571802826237863 0.0006575346592259343 0.0010440770375415855 0.0018004153950183044 0.0030756018951073514 0.004884730385322297 0.00719425601580247 0.00997725307515428 0.012938092278920269 0.015326377141967931 0.01641060648739892 0.01610805172382183 0.014842004087681647 0.01300613692016574 0.010916081954214438 0.008986628223726745 0.0075217835184693245 0.006439066476751874 0.005460917229675782 0.004462883841154418 0.003504638407223866 0.0026549678017238824 0.0019366624294627401 0.001371878137905159 0.0009682847789069686 0.0006895470735222058 0.00048445332287481573 0.0003431122089624009 0.00028981639018622575 0.00044961097665089506 0.0005865215698875174 0.000864953189683257 0.0014604341919198368 0.0026293898016959963 0.004526188866547983 0.007194256015802475 0.01088089061593668 0.015933902304877866 0.021833526348406386 0.026619531064699154 0.028345846801708416 0.02704393306599346 0.024203110600517833 0.020913217290195893 0.017497979483522698 0.014298536985646173 0.011780429057506373 0.009966524346444055 0.008449495985470215 0.006923153073596433 0.005391246813130986 0.003986452395490247 0.0028151593946382815 0.0019366624294627393 0.0013428023934787042 0.0009554476063526688 0.0006838316235267724 0.0004963521413852117 0.00041445894177783436 0.0005832294783845777 0.0007465776724080131 0.001119149821558879 0.0019465698802292985 0.0035548620122397606 0.0061440540761314565 0.009977253075154284 0.015933902304877866 0.025055637667848858 0.036366731310063405 0.04551782647970808 0.04815204876374487 0.044562668708091314 0.03844009900727351 0.03239910529167102 0.02687477562088644 0.021878320719838733 0.01784026965500826 0.014864650915170599 0.012455354564246363 0.0101486926733028 0.007869541377713729 0.005761950678317071 0.003986452395490251 0.0026549678017238816 0.0017735870623411614 0.0012310199292264686 0.0008835265101450296 0.000656152305679445 0.0005519973573561665 0.0007212546483763897 0.0009218909549822119 0.0013888305176585206 0.0024239791870858617 0.0044229784007840875 0.007710433178781149 0.012938092278920262 0.021833526348406383 0.036366731310063384 0.055054691285063385 0.0704676586833634 0.07491270404560922 0.06864617972454859 0.058048588974932876 0.04793840415454885 0.03927144288015322 0.0318112285958015 0.02580412409566322 0.021248108927548248 0.017509967750017324 0.014055945234431344 0.010803241393581735 0.007869541377713719 0.005391246813130983 0.003504638407223854 0.0022502321078609654 0.0015021101566728226 0.0010612533502024851 0.0007970503483696779 0.0006814304005537331 0.0008486525878630221 0.0010826685402583528 0.0016224551241649792 0.002801816126635195 0.005081308636276986 0.008929833570272596 0.015326377141967934 0.026619531064699158 0.04551782647970806 0.07046765868336341 0.09217668859203686 0.1001822094906155 0.09348758096382306 0.07957358172116913 0.06518714478868116 0.05265480311856309 0.04237773260800204 0.034565372497303924 0.028649682336106586 0.023497897295981156 0.018577243399965783 0.014055945234431351 0.010148692673302795 0.006923153073596433 0.004462883841154409 0.0028100800161901906 0.0018252040088143529 0.0012617286215816461 0.0009407587239141535 0.0008039528511211408 0.0009628131037069264 0.0012065670294402887 0.0017794167978722815 0.0030170576322447666 0.005421110613354317 0.009543175734881951 0.016410606487398918 0.028345846801708423 0.04815204876374486 0.07491270404560921 0.1001822094906155 0.11281644974287011 0.10918928639667483 0.09479720627444044 0.0770637825693041 0.06076976938801452 0.048458000595130814 0.04060359154257608 0.03518834279291235 0.029690429604246064 0.02349789729598115 0.017509967750017327 0.01245535456424636 0.008449495985470214 0.005460917229675767 0.0034530126341166334 0.0022406580347984063 0.0015340316098065882 0.0011239034969201713 0.0009370424568941241 0.0010644064853800065 0.0012883678922504793 0.0018474983033848552 0.0030503657603172026 0.005402100311051645 0.009473934063312555 0.016108051723821838 0.02704393306599346 0.04456266870809132 0.0686461797245486 0.09348758096382309 0.10918928639667483 0.10931266537743456 0.09562570069848383 0.07545099821496906 0.05667798221207814 0.04470094384614951 0.04018000327837753 0.03869452315378 0.03518834279291235 0.028649682336106586 0.021248108927548245 0.014864650915170599 0.009966524346444055 0.006439066476751869 0.004107130107226395 0.0026945499014594597 0.0018521698782702955 0.0013402003972896636 0.0010815579702260168 0.0011463175132408882 0.0013339022226082522 0.001843635355461523 0.0029314670065587133 0.00506600412666292 0.00881924782820553 0.014842004087681633 0.02420311060051783 0.03844009900727349 0.058048588974932855 0.07957358172116911 0.09479720627444044 0.09562570069848383 0.0813768061788179 0.059960924868807955 0.04165728956585284 0.03325555919185391 0.03504409763073714 0.04018000327837752 0.04060359154257607 0.03456537249730392 0.025804124095663218 0.01784026965500825 0.01178042905750637 0.007521783518469312 0.004760328317029649 0.0031091760870718245 0.002134042701198251 0.0015361738697274032 0.0012123734799485094 0.0011986080708773572 0.0013517795309755725 0.0018017261947860259 0.002732186407408241 0.00453476790578657 0.007765271584428244 0.013006136920165742 0.020913217290195896 0.03239910529167102 0.04793840415454884 0.06518714478868118 0.0770637825693041 0.07545099821496906 0.05996092486880795 0.04002983023865638 0.0263126367861459 0.02432673860419147 0.03325555919185392 0.04470094384614951 0.048458000595130814 0.04237773260800204 0.03181122859580151 0.02187832071983874 0.014298536985646178 0.008986628223726747 0.005545206054145705 0.0035057823399257328 0.0023443134697092 0.0016687172925344653 0.001302133175859914 0.001216302967361956 0.0013445560159961165 0.0017464322160936935 0.0025286503275099093 0.00397582076871763 0.006580579195852487 0.010916081954214438 0.017497979483522698 0.026874775620886436 0.039271442880153204 0.052654803118563076 0.06076976938801451 0.056677982212078135 0.04165728956585282 0.0263126367861459 0.020232834606957052 0.0263126367861459 0.04165728956585282 0.05667798221207813 0.06076976938801451 0.05265480311856308 0.039271442880153204 0.026874775620886443 0.0174979794835227 0.010916081954214436 0.006580579195852492 0.0039758207687176274 0.002528650327509905 0.0017464322160936985 0.0013445560159961157 0.0011986080708773577 0.0013021331758599148 0.00166871729253446 0.0023443134697092036 0.003505782339925736 0.005545206054145699 0.00898662822372675 0.014298536985646175 0.02187832071983873 0.0318112285958015 0.042377732608002046 0.04845800059513081 0.04470094384614952 0.03325555919185391 0.02432673860419148 0.0263126367861459 0.040029830238656375 0.059960924868807955 0.07545099821496906 0.0770637825693041 0.06518714478868118 0.04793840415454886 0.03239910529167103 0.0209132172901959 0.01300613692016574 0.00776527158442825 0.0045347679057865685 0.0027321864074082367 0.0018017261947860293 0.0013517795309755715 0.001146317513240888 0.0012123734799485103 0.0015361738697273989 0.0021340427011982523 0.0031091760870718267 0.004760328317029645 0.007521783518469316 0.011780429057506368 0.017840269655008244 0.02580412409566321 0.03456537249730391 0.040603591542576076 0.04018000327837753 0.03504409763073714 0.03325555919185392 0.04165728956585283 0.05996092486880795 0.0813768061788179 0.09562570069848382 0.09479720627444044 0.07957358172116911 0.058048588974932855 0.03844009900727351 0.024203110600517833 0.014842004087681635 0.008819247828205534 0.0050660041266629196 0.0029314670065587085 0.0018436353554615245 0.0013339022226082505 0.001064406485380007 0.0010815579702260188 0.0013402003972896625 0.0018521698782702964 0.002694549901459462 0.004107130107226395 0.0064390664767518735 0.009966524346444055 0.014864650915170599 0.021248108927548245 0.02864968233610659 0.03518834279291236 0.03869452315378 0.04018000327837753 0.04470094384614952 0.056677982212078135 0.07545099821496906 0.09562570069848383 0.10931266537743456 0.10918928639667481 0.09348758096382308 0.0686461797245486 0.04456266870809133 0.027043933065993456 0.016108051723821838 0.00947393406331256 0.0054021003110516445 0.003050365760317199 0.001847498303384856 0.0012883678922504778 0.0009628131037069266 0.0009370424568941263 0.0011239034969201733 0.0015340316098065867 0.0022406580347984085 0.003453012634116636 0.005460917229675773 0.008449495985470214 0.012455354564246365 0.017509967750017317 0.023497897295981153 0.029690429604246053 0.03518834279291236 0.040603591542576076 0.04845800059513082 0.06076976938801451 0.0770637825693041 0.09479720627444044 0.10918928639667483 0.11281644974287011 0.10018220949061549 0.07491270404560921 0.04815204876374487 0.02834584680170842 0.01641060648739892 0.009543175734881955 0.005421110613354316 0.0030170576322447627 0.0017794167978722824 0.0012065670294402863 0.0008486525878630223 0.0008039528511211433 0.0009407587239141585 0.0012617286215816433 0.0018252040088143553 0.0028100800161901997 0.004462883841154416 0.006923153073596431 0.010148692673302798 0.014055945234431343 0.01857724339996578 0.02349789729598115 0.028649682336106586 0.03456537249730392 0.04237773260800204 0.05265480311856308 0.06518714478868116 0.07957358172116911 0.09348758096382308 0.1001822094906155 0.09217668859203684 0.07046765868336341 0.045517826479708076 0.026619531064699154 0.01532637714196794 0.008929833570272598 0.005081308636276985 0.002801816126635192 0.0016224551241649815 0.0010826685402583495 0.0007212546483763901 0.0006814304005537352 0.0007970503483696838 0.0010612533502024812 0.0015021101566728243 0.002250232107860977 0.0035046384072238614 0.005391246813130983 0.007869541377713726 0.010803241393581726 0.014055945234431341 0.017509967750017313 0.02124810892754825 0.02580412409566321 0.03181122859580151 0.03927144288015321 0.04793840415454885 0.05804858897493284 0.06864617972454862 0.0749127040456092 0.07046765868336341 0.05505469128506337 0.0363667313100634 0.02183352634840638 0.012938092278920267 0.0077104331787811505 0.0044229784007840875 0.002423979187085859 0.001388830517658523 0.0009218909549822074 0.0005832294783845781 0.000551997357356169 0.0006561523056794505 0.0008835265101450259 0.0012310199292264702 0.001773587062341174 0.002654967801723888 0.003986452395490252 0.005761950678317072 0.007869541377713717 0.010148692673302793 0.012455354564246353 0.0148646509151706 0.017840269655008244 0.02187832071983873 0.026874775620886436 0.03239910529167102 0.0384400990072735 0.04456266870809133 0.04815204876374487 0.04551782647970807 0.0363667313100634 0.025055637667848865 0.015933902304877866 0.009977253075154287 0.00614405407613146 0.0035548620122397615 0.0019465698802292985 0.001119149821558881 0.0007465776724080085 0.00044961097665089587 0.0004144589417778374 0.0004963521413852169 0.0006838316235267697 0.0009554476063526705 0.0013428023934787172 0.0019366624294627451 0.0028151593946382863 0.003986452395490254 0.0053912468131309815 0.00692315307359643 0.008449495985470207 0.009966524346444062 0.011780429057506361 0.014298536985646173 0.0174979794835227 0.020913217290195896 0.024203110600517826 0.02704393306599346 0.02834584680170842 0.026619531064699147 0.021833526348406386 0.015933902304877862 0.01088089061593668 0.007194256015802478 0.004526188866547987 0.0026293898016959976 0.0014604341919198383 0.0008649531896832588 0.0005865215698875134 0.00033441079730572957 0.0002898163901862282 0.0003431122089624053 0.0004844533228748129 0.0006895470735222085 0.0009682847789069771 0.001371878137905164 0.0019366624294627419 0.0026549678017238946 0.0035046384072238554 0.004462883841154424 0.005460917229675758 0.0064390664767518795 0.007521783518469307 0.008986628223726752 0.010916081954214429 0.013006136920165749 0.014842004087681628 0.01610805172382184 0.016410606487398904 0.015326377141967938 0.012938092278920257 0.00997725307515428 0.007194256015802468 0.004884730385322302 0.0030756018951073527 0.0018004153950183053 0.0010440770375415873 0.0006575346592259354 0.0004557180282623753 0.00023864228845880625 0.0001957018338934886 0.0002307361856879142 0.00033243221307557234 0.0004810140756292427 0.0006826700179281734 0.0009682847789069752 0.00134280239347871 0.0017735870623411785 0.0022502321078609697 0.0028100800161902123 0.00345301263411662 0.004107130107226409 0.00476032831702963 0.00554520605414571 0.006580579195852482 0.007765271584428254 0.008819247828205526 0.009473934063312563 0.009543175734881943 0.008929833570272596 0.007710433178781151 0.006144054076131453 0.004526188866547984 0.0030756018951073596 0.0019355668732131631 0.0011702724834703987 0.0007311047369061614 0.000493831110207055 0.0003440034197444288 0.0001577565262294836 0.00013107499389271592 0.000161349101011338 0.00023540318016430215 0.00033826785089127254 0.00048101407562924347 0.0006895470735222074 0.000955447606352669 0.0012310199292264728 0.0015021101566728234 0.0018252040088143598 0.002240658034798401 0.002694549901459473 0.0031091760870718254 0.003505782339925739 0.003975820768717632 0.004534767905786573 0.005066004126662919 0.005402100311051647 0.005421110613354317 0.005081308636276988 0.0044229784007840875 0.003554862012239756 0.0026293898016959963 0.001800415395018311 0.0011702724834703991 0.0007582882900205628 0.0005110280207879623 0.0003533047695375002 0.00023703570095634925 0.00009296217033427087 0.00008633426488526103 0.00011571395533526858 0.00016831495554073595 0.00023540318016431068 0.00033243221307558015 0.0004844533228748176 0.0006838316235267763 0.0008835265101450294 0.001061253350202492 0.0012617286215816435 0.0015340316098065869 0.001852169878270292 0.0021340427011982605 0.0023443134697091984 0.0025286503275099084 0.002732186407408242 0.0029314670065587116 0.003050365760317208 0.003017057632244768 0.002801816126635197 0.002423979187085863 0.0019465698802292946 0.0014604341919198377 0.0010440770375415927 0.0007311047369061628 0.0005110280207879618 0.00035024178324874505 0.0002268808158474439 0.00014001957347210527 0.000052163891300054224 0.00005773213817806405 0.00008108726648983629 0.00011571395533526608 0.00016134910101134458 0.000230736185687916 0.00034311220896240697 0.0004963521413852142 0.0006561523056794556 0.000797050348369679 0.0009407587239141674 0.001123903496920162 0.001340200397289664 0.0015361738697273837 0.0016687172925344584 0.0017464322160936855 0.0018017261947860306 0.0018436353554615193 0.0018474983033848584 0.001779416797872274 0.0016224551241649813 0.0013888305176585221 0.001119149821558877 0.0008649531896832564 0.0006575346592259414 0.0004938311102070569 0.00035330476953750195 0.0002268808158474467 0.00012916539479544814 0.0000727333162074948 0.000035973655853701456 0.00004246476366109243 0.000057732138178062974 0.00008633426488525599 0.00013107499389271814 0.00019570183389348687 0.00028981639018622646 0.00041445894177783506 0.0005519973573561698 0.0006814304005537374 0.000803952851121144 0.0009370424568941216 0.001081557970226015 0.0012123734799485088 0.001302133175859909 0.0013445560159961113 0.0013517795309755751 0.0013339022226082548 0.001288367892250477 0.0012065670294402933 0.0010826685402583543 0.000921890954982214 0.0007465776724080076 0.0005865215698875128 0.0004557180282623798 0.00034400341974442884 0.0002370357009563452 0.00014001957347210245 0.00007273331620748998 0.00004185228624762494 0.00003269514350865809 0.00003494468682887586 0.00004926469609027389 0.00008836635431709074 0.00015338033482130246 0.00023414234946934377 0.0003235039291855611 0.0004262350267254973 0.0005506553884725048 0.0006876207794232099 0.000811656158830918 0.0009088671603585639 0.000988657092739459 0.001064406485379997 0.0011288125431500352 0.001155389745083623 0.0011288125431500387 0.0010644064853800005 0.0009886570927394658 0.0009088671603585709 0.0008116561588309111 0.0006876207794232099 0.0005506553884725048 0.0004262350267254973 0.00032350392918556285 0.00023414234946933813 0.00015338033482130333 0.0000883663543170903 0.00004926469609027779 0.000034944686828877487 0.00003494468682886994 0.00004233764706958481 0.00007494986032959229 0.0001455277698635282 0.0002496268489333397 0.00036504846722241254 0.00047878926010503617 0.000604598841051747 0.0007619127265753541 0.0009416347748850403 0.0011029764516615253 0.0012098210104861285 0.0012632413019571787 0.0012883678922504763 0.0012975573945890606 0.0012756356763438035 0.0012018072025311397 0.0010815579702260195 0.0009448279369217497 0.0008161527036543698 0.0006992403467680972 0.0005841060597842339 0.00046335640422670685 0.0003443313341783671 0.00024181346590353262 0.0001641708527985226 0.00010991083482162293 0.00007319711621452497 0.00005081018743245419 0.00003927679355652316 0.000049264696090274995 0.0000749498603295989 0.00013665578847336831 0.00023897829057065422 0.0003746363628123295 0.0005328767055493069 0.0007162791068696843 0.000939591524689107 0.0012087368131948252 0.0014949492493011296 0.0017355804206419722 0.0018739209437563804 0.001899860542948196 0.001847498303384851 0.0017585618402871418 0.0016503940612064257 0.0015145682355305599 0.0013402003972896584 0.0011362470259058631 0.0009350204265439976 0.0007668541041885661 0.0006317512268016322 0.0005052944369660935 0.00037385813418755833 0.00025434264967278807 0.0001697548150774731 0.00012122019196754269 0.00009227334361630228 0.00006872525418735833 0.0000508101874324573 0.0000883663543170882 0.00014552776986352913 0.00023897829057064888 0.0003644655134322192 0.0005378107763059015 0.0007970905713095736 0.0011733734294710804 0.0016589400069480294 0.0022044233453669152 0.0027252012978601537 0.003119967987069998 0.003310130795263664 0.003273215902839205 0.0030503657603172083 0.0027284479596148934 0.0023998563965444758 0.0021135152535489074 0.0018521698782703008 0.0015723081188699962 0.0012781043115712705 0.0010219478720986713 0.0008297072438039105 0.0006692846682037816 0.0005042574172789205 0.0003471667243337908 0.00023267207177716593 0.000167001544047114 0.00012639541981941075 0.00009227334361629918 0.00007319711621452556 0.0001533803348213041 0.00024962684893334205 0.0003746363628123246 0.0005378107763059002 0.0008160465074447724 0.0013144301327347955 0.0020849230176929008 0.0030673464280526835 0.00411742695260812 0.005065990398946286 0.005751359337704072 0.0060506053426059615 0.0059182585820492005 0.005402100311051653 0.004640662862214502 0.0038416187382218927 0.0031833431333576937 0.0026945499014594683 0.0022749560695569816 0.0018515398190606343 0.0014604937925648547 0.0011583572591615137 0.0009232854720991987 0.0007011280080980788 0.0004921829205170276 0.0003328103516603706 0.00023265115775077575 0.00016700154404711688 0.00012122019196753992 0.00010991083482162441 0.00023414234946934022 0.0003650484672224096 0.0005328767055493002 0.00079709057130957 0.001314430132734794 0.0022442729591142336 0.0036190780350586153 0.005320251868544282 0.007172574512613117 0.008932914694551082 0.01023738025444018 0.010762009478327438 0.010451266211617063 0.009473934063312556 0.00805326866256104 0.006480340695556072 0.005105322245516995 0.004107130107226393 0.0033781442189325405 0.0027352573802774554 0.0021391237296633776 0.001651926371329771 0.0012775314669896075 0.0009614150171436347 0.0006872824206897126 0.0004765515140829129 0.0003328103516603713 0.00023267207177717105 0.00016975481507747292 0.00016417085279852507 0.00032350392918556524 0.0004787892601050389 0.0007162791068696814 0.0011733734294710804 0.002084923017692903 0.003619078035058618 0.005769895370865576 0.00853527201755081 0.01197363080807433 0.015692722152502885 0.018522657783122457 0.019358270366481186 0.018259425073566694 0.016108051723821834 0.013543651521091847 0.010834126637829369 0.008340585241485112 0.006439066476751874 0.005121132327984122 0.004098860343354646 0.003192916721677637 0.0024198593746372144 0.00181084882014756 0.001333942489526634 0.0009616996260649131 0.0006872824206897124 0.0004921829205170304 0.00034716672433380056 0.00025434264967278655 0.00024181346590353492 0.000426235026725498 0.0006045988410517469 0.0009395915246891048 0.0016589400069480272 0.0030673464280526826 0.005320251868544286 0.008535272017550811 0.013311339349175031 0.02042239365493735 0.029017297434719532 0.03552916848266974 0.03654237041029714 0.032628634466063365 0.02704393306599346 0.02187189839919169 0.017291184098801104 0.013205451880473071 0.009966524346444057 0.007717583949283111 0.006103819007469902 0.0047539207128256536 0.0035767109487630233 0.00261371598920199 0.0018731680166680666 0.0013339424895266263 0.0009614150171436305 0.0007011280080980748 0.0005042574172789276 0.00037385813418755356 0.00034433133417836366 0.0005506553884725072 0.0007619127265753587 0.001208736813194825 0.002204423345366916 0.004117426952608126 0.007172574512613124 0.011973630808074339 0.02042239365493735 0.03476091520282093 0.053219103003259584 0.06708402303583849 0.06795136304519563 0.05761291075195856 0.04456266870809133 0.034073916820984464 0.02625038192951192 0.019899013037081054 0.0148646509151706 0.011317929939732605 0.008851163896473165 0.006884090603571322 0.005172902766082891 0.003734748948349916 0.0026137159892019937 0.0018108488201475528 0.001277531466989591 0.0009232854720991993 0.0006692846682037894 0.0005052944369660858 0.00046335640422670533 0.0006876207794232085 0.0009416347748850433 0.0014949492493011305 0.0027252012978601506 0.005065990398946282 0.008932914694551082 0.01569272215250288 0.02901729743471953 0.05321910300325956 0.08539324864328052 0.1097939337563083 0.11099495791676933 0.09210298693624545 0.06864617972454862 0.05049130493715687 0.03796747156086694 0.028546983150662522 0.021248108927548255 0.0160522850222263 0.012428670230404578 0.009603227887007524 0.007195842070608356 0.005172902766082883 0.003576710948763031 0.0024198593746372057 0.0016519263713297672 0.001158357259161509 0.000829707243803919 0.0006317512268016295 0.0005841060597842258 0.0008116561588309162 0.0011029764516615236 0.0017355804206419681 0.003119967987069993 0.005751359337704069 0.010237380254440183 0.018522657783122454 0.03552916848266974 0.06708402303583846 0.10979393375630833 0.14346166377168398 0.14741724073021098 0.12425304459139377 0.09348758096382309 0.06866773887166149 0.05122583225919664 0.03834686322647693 0.0286496823361066 0.021771773699975253 0.016841301099417085 0.01291180874993578 0.009603227887007525 0.006884090603571315 0.004753920712825658 0.0031929167216776357 0.002139123729663368 0.001460493792564857 0.0010219478720986848 0.0007668541041885578 0.0006992403467680918 0.0009088671603585749 0.0012098210104861337 0.0018739209437563847 0.0033101307952636615 0.006050605342605957 0.01076200947832744 0.019358270366481186 0.03654237041029714 0.06795136304519563 0.11099495791676932 0.14741724073021095 0.15678116150870317 0.13854009018097044 0.10918928639667483 0.08242112353905495 0.061744137967736784 0.046238820468267175 0.035188342792912365 0.027636802532900434 0.021890767984102763 0.016841301099417096 0.012428670230404582 0.008851163896473165 0.006103819007469916 0.004098860343354645 0.0027352573802774563 0.001851539819060626 0.001278104311571265 0.0009350204265439954 0.0008161527036543632 0.0009886570927394598 0.0012632413019571798 0.001899860542948192 0.003273215902839209 0.005918258582049203 0.010451266211617065 0.0182594250735667 0.03262863446606336 0.05761291075195857 0.09210298693624545 0.12425304459139379 0.13854009018097047 0.13065893556352043 0.10931266537743456 0.08510319364006401 0.06391931164200326 0.048297021958774146 0.03869452315378 0.03287454009187552 0.02763680253290042 0.02177177369997527 0.016052285022226293 0.011317929939732595 0.007717583949283107 0.005121132327984123 0.003378144218932534 0.002274956069556975 0.0015723081188699932 0.0011362470259058427 0.0009448279369217321 0.0010644064853800033 0.0012883678922504809 0.0018474983033848569 0.0030503657603172026 0.005402100311051647 0.009473934063312556 0.01610805172382183 0.027043933065993456 0.04456266870809132 0.0686461797245486 0.09348758096382308 0.10918928639667484 0.10931266537743456 0.09562570069848385 0.07545099821496906 0.05667798221207815 0.04470094384614951 0.040180003278377535 0.03869452315377998 0.03518834279291235 0.028649682336106593 0.021248108927548245 0.014864650915170597 0.009966524346444057 0.006439066476751875 0.004107130107226405 0.0026945499014594636 0.001852169878270297 0.0013402003972896623 0.001081557970226018 0.001128812543150044 0.001297557394589066 0.0017585618402871477 0.0027284479596149033 0.004640662862214507 0.008053268662561038 0.013543651521091852 0.02187189839919169 0.03407391682098447 0.050491304937156874 0.06866773887166151 0.08242112353905495 0.08510319364006401 0.07545099821496905 0.05954917846784604 0.04637859083505481 0.041758922589336805 0.04470094384614952 0.04829702195877413 0.046238820468267196 0.03834686322647695 0.028546983150662536 0.019899013037081057 0.013205451880473083 0.008340585241485125 0.0051053222455170084 0.003183343133357699 0.002113515253548918 0.0015145682355305686 0.001201807202531147 0.001155389745083629 0.0012756356763438037 0.0016503940612064283 0.002399856396544478 0.003841618738221899 0.0064803406955560765 0.010834126637829369 0.01729118409880111 0.02625038192951192 0.037967471560866925 0.051225832259196635 0.061744137967736784 0.06391931164200326 0.056677982212078135 0.046378590835054814 0.041682684735277545 0.04637859083505481 0.056677982212078135 0.06391931164200326 0.061744137967736784 0.051225832259196635 0.03796747156086694 0.02625038192951192 0.01729118409880111 0.010834126637829372 0.0064803406955560895 0.0038416187382218957 0.002399856396544478 0.0016503940612064313 0.0012756356763438022 0.0011288125431500443 0.0012018072025311484 0.001514568235530565 0.002113515253548918 0.003183343133357703 0.005105322245516992 0.008340585241485121 0.013205451880473076 0.019899013037081057 0.028546983150662515 0.03834686322647694 0.04623882046826718 0.048297021958774146 0.04470094384614951 0.041758922589336805 0.04637859083505481 0.05954917846784604 0.07545099821496906 0.08510319364006401 0.08242112353905495 0.06866773887166151 0.05049130493715689 0.03407391682098447 0.021871898399191694 0.013543651521091854 0.008053268662561052 0.004640662862214505 0.0027284479596149046 0.001758561840287149 0.0012975573945890639 0.001064406485380003 0.0010815579702260195 0.0013402003972896588 0.0018521698782702962 0.0026945499014594657 0.00410713010722639 0.00643906647675187 0.009966524346444053 0.014864650915170596 0.021248108927548238 0.028649682336106586 0.035188342792912365 0.03869452315377999 0.04018000327837754 0.04470094384614951 0.05667798221207814 0.07545099821496906 0.09562570069848383 0.10931266537743453 0.10918928639667481 0.09348758096382308 0.0686461797245486 0.04456266870809132 0.02704393306599346 0.016108051723821834 0.009473934063312567 0.005402100311051646 0.0030503657603172044 0.0018474983033848565 0.0012883678922504787 0.0009886570927394602 0.0009448279369217356 0.0011362470259058425 0.001572308118869992 0.002274956069556977 0.003378144218932522 0.005121132327984119 0.0077175839492831045 0.011317929939732603 0.016052285022226297 0.02177177369997526 0.027636802532900434 0.03287454009187552 0.03869452315378 0.04829702195877415 0.06391931164200328 0.08510319364006402 0.10931266537743455 0.13065893556352043 0.13854009018097044 0.1242530445913938 0.09210298693624547 0.057612910751958575 0.032628634466063365 0.018259425073566704 0.010451266211617075 0.005918258582049202 0.003273215902839213 0.0018998605429481911 0.001263241301957178 0.0009088671603585747 0.0008161527036543669 0.0009350204265439979 0.0012781043115712607 0.0018515398190606268 0.0027352573802774498 0.004098860343354643 0.00610381900746991 0.008851163896473172 0.012428670230404568 0.016841301099417096 0.02189076798410276 0.027636802532900445 0.03518834279291236 0.04623882046826719 0.061744137967736784 0.08242112353905497 0.10918928639667481 0.13854009018097044 0.15678116150870314 0.14741724073021095 0.11099495791676933 0.06795136304519563 0.03654237041029714 0.01935827036648119 0.010762009478327448 0.006050605342605954 0.0033101307952636636 0.0018739209437563828 0.0012098210104861309 0.0008116561588309158 0.0006992403467680952 0.0007668541041885636 0.0010219478720986785 0.0014604937925648566 0.002139123729663372 0.0031929167216776366 0.004753920712825652 0.006884090603571321 0.009603227887007513 0.012911808749935779 0.016841301099417078 0.021771773699975256 0.028649682336106586 0.03834686322647694 0.051225832259196635 0.0686677388716615 0.09348758096382308 0.12425304459139377 0.14741724073021095 0.14346166377168398 0.10979393375630833 0.06708402303583848 0.035529168482669744 0.018522657783122464 0.01023738025444019 0.005751359337704066 0.003119967987069994 0.0017355804206419666 0.0011029764516615197 0.000687620779423208 0.0005841060597842278 0.0006317512268016367 0.0008297072438039113 0.0011583572591615083 0.001651926371329778 0.0024198593746372074 0.003576710948763029 0.005172902766082886 0.0071958420706083465 0.009603227887007522 0.012428670230404568 0.016052285022226293 0.021248108927548248 0.028546983150662536 0.03796747156086694 0.050491304937156894 0.0686461797245486 0.09210298693624548 0.11099495791676932 0.10979393375630832 0.0853932486432805 0.05321910300325958 0.029017297434719525 0.01569272215250289 0.008932914694551082 0.005065990398946279 0.0027252012978601485 0.0014949492493011294 0.000941634774885039 0.0005506553884725069 0.0004633564042267069 0.0005052944369660931 0.0006692846682037825 0.0009232854720991991 0.0012775314669896047 0.0018108488201475557 0.0026137159892019933 0.003734748948349921 0.005172902766082875 0.006884090603571317 0.008851163896473151 0.011317929939732596 0.014864650915170599 0.01989901303708105 0.02625038192951192 0.03407391682098447 0.04456266870809133 0.05761291075195858 0.06795136304519565 0.06708402303583848 0.05321910300325959 0.03476091520282093 0.020422393654937355 0.011973630808074343 0.007172574512613125 0.004117426952608123 0.002204423345366914 0.0012087368131948248 0.0007619127265753561 0.00042623502672549835 0.0003443313341783653 0.0003738581341875605 0.0005042574172789226 0.0007011280080980759 0.0009614150171436438 0.0013339424895266328 0.0018731680166680685 0.0026137159892019968 0.00357671094876302 0.00475392071282566 0.006103819007469896 0.007717583949283101 0.00996652434644405 0.013205451880473071 0.01729118409880111 0.021871898399191694 0.027043933065993456 0.03262863446606337 0.03654237041029715 0.03552916848266973 0.029017297434719536 0.020422393654937355 0.013311339349175035 0.008535272017550813 0.005320251868544285 0.0030673464280526813 0.001658940006948026 0.0009395915246891056 0.0006045988410517467 0.0003235039291855666 0.0002418134659035371 0.0002543426496727932 0.00034716672433379617 0.0004921829205170324 0.0006872824206897245 0.0009616996260649202 0.0013339424895266335 0.0018108488201475747 0.002419859374637202 0.0031929167216776487 0.004098860343354625 0.005121132327984129 0.006439066476751863 0.008340585241485125 0.010834126637829363 0.013543651521091861 0.016108051723821827 0.01825942507356672 0.019358270366481176 0.01852265778312246 0.01569272215250288 0.011973630808074337 0.008535272017550805 0.005769895370865579 0.003619078035058616 0.0020849230176929034 0.0011733734294710801 0.000716279106869684 0.0004787892601050411 0.0002341423494693411 0.00016417085279852694 0.00016975481507747759 0.00023267207177716736 0.0003328103516603717 0.00047655151408292366 0.0006872824206897218 0.0009614150171436403 0.0012775314669896203 0.0016519263713297668 0.002139123729663395 0.002735257380277435 0.003378144218932536 0.004107130107226377 0.005105322245517003 0.006480340695556067 0.008053268662561043 0.00947393406331255 0.010451266211617084 0.010762009478327433 0.010237380254440182 0.008932914694551077 0.00717257451261312 0.005320251868544283 0.003619078035058618 0.0022442729591142315 0.0013144301327347944 0.0007970905713095697 0.0005328767055493034 0.0003650484672224121 0.0001533803348213049 0.00010991083482162614 0.00012122019196754284 0.00016700154404711352 0.00023265115775077482 0.00033281035166038024 0.0004921829205170339 0.0007011280080980825 0.0009232854720992042 0.001158357259161511 0.0014604937925648475 0.0018515398190606155 0.0022749560695569816 0.002694549901459462 0.003183343133357701 0.0038416187382218914 0.0046406628622145014 0.005402100311051643 0.005918258582049218 0.006050605342605949 0.005751359337704072 0.0050659903989462764 0.004117426952608124 0.0030673464280526813 0.002084923017692905 0.0013144301327347935 0.0008160465074447729 0.0005378107763059004 0.000374636362812329 0.00024962684893334487 0.00008836635431708842 0.00007319711621452625 0.00009227334361630013 0.00012639541981940755 0.00016700154404711116 0.00023267207177717433 0.000347166724333795 0.0005042574172789249 0.0006692846682037828 0.0008297072438039165 0.0010219478720986744 0.0012781043115712553 0.0015723081188699904 0.0018521698782702968 0.0021135152535489096 0.0023998563965444805 0.0027284479596148977 0.003050365760317207 0.0032732159028392186 0.003310130795263662 0.003119967987069991 0.0027252012978601532 0.002204423345366912 0.00165894000694803 0.001173373429471085 0.000797090571309571 0.0005378107763059011 0.00036446551343221906 0.00023897829057065376 0.00014552776986353152 0.000049264696090275354 0.00005081018743245721 0.00006872525418735778 0.00009227334361630073 0.00012122019196754076 0.0001697548150774814 0.0002543426496727943 0.0003738581341875585 0.000505294436966101 0.0006317512268016302 0.0007668541041885754 0.000935020426543982 0.0011362470259058464 0.0013402003972896419 0.0015145682355305603 0.0016503940612064148 0.0017585618402871396 0.0018474983033848486 0.0018998605429482007 0.0018739209437563787 0.001735580420641968 0.0014949492493011281 0.0012087368131948242 0.0009395915246891073 0.000716279106869686 0.0005328767055493036 0.00037463636281232876 0.00023897829057065395 0.00013665578847337363 0.00007494986032960139 0.00003494468682887023 0.00003927679355652218 0.00005081018743245188 0.00007319711621452404 0.00010991083482162082 0.0001641708527985288 0.00024181346590353332 0.000344331334178365 0.0004633564042267047 0.0005841060597842235 0.0006992403467680941 0.0008161527036543527 0.0009448279369217385 0.0010815579702260155 0.0012018072025311354 0.0012756356763438013 0.0012975573945890556 0.0012883678922504765 0.0012632413019571852 0.0012098210104861283 0.0011029764516615182 0.0009416347748850439 0.000761912726575356 0.0006045988410517475 0.00047878926010503823 0.0003650484672224073 0.0002496268489333397 0.00014552776986352753 0.00007494986032959752 0.000042337647069587214 0.00003710588664386375 0.000037323660304481904 0.000046397958466131654 0.00007921512669109695 0.00013968876242537675 0.00021814488333107016 0.0003040176982251506 0.00040141036955367027 0.0005240339424709018 0.0006638652867328211 0.0007842331047055555 0.0008602438311349457 0.0009088671603585674 0.0009628131037069283 0.0010223797079019596 0.0010503100328411764 0.0010223797079019561 0.0009628131037069179 0.0009088671603585743 0.0008602438311349492 0.0007842331047055624 0.0006638652867328142 0.0005240339424708931 0.00040141036955366853 0.0003040176982251541 0.0002181448833310693 0.00013968876242537675 0.00007921512669109869 0.00004639795846612862 0.000037323660304483097 0.00003732366030447986 0.000044717298415450566 0.00007386269411413186 0.00013880284057140772 0.00023905748114610843 0.00035604221904844273 0.00047351329888211595 0.0006011759042085202 0.000760976138198984 0.0009450532555019045 0.0011033690494170387 0.0011893217655105878 0.0012098210104861259 0.0012065670294402957 0.0011973429792128585 0.001157905179173963 0.0010646588843713904 0.0009370424568941306 0.0008161527036543685 0.0007164119706880244 0.0006206635119981585 0.0005122217700908306 0.00039576518507255197 0.0002890580940773193 0.00020289046441401552 0.00013719159990130614 0.00008970530400963101 0.00005906705547390598 0.000043658645204250014 0.00003818257149020234 0.00004639795846613056 0.00007386269411413363 0.00013267912482791932 0.00022811134622592307 0.00036059264973204114 0.0005270594962774825 0.0007261632918973068 0.0009632349493911841 0.0012408721734380704 0.001531174685949792 0.0017673346539450962 0.0018846393517467934 0.0018739209437563817 0.001779416797872288 0.0016478117139200634 0.0014941165032954509 0.001316568095776341 0.001123903496920179 0.0009350204265440169 0.000765450346807275 0.0006199289354965262 0.0004938979088174652 0.00037963807815661276 0.0002744930032920338 0.00018599940050380818 0.00012413553643969883 0.00008929388863324511 0.00007040658488428744 0.000055340012144677166 0.000043658645204255035 0.00007921512669109862 0.00013880284057141054 0.0002281113462259221 0.00034510117949246327 0.0005189558821759174 0.0008006309005604108 0.0012183841389811444 0.0017456059351057588 0.002315502914080523 0.0028419649976218837 0.003228437579871228 0.0033938858370837046 0.0033101307952636467 0.0030170576322447757 0.002606494385281724 0.0021839809405514573 0.0018231338833620237 0.001534031609806594 0.001278104311571264 0.0010287461375447155 0.0008023405097078695 0.0006217834696838581 0.00047810797513388837 0.00034950119417326937 0.0002365232571313324 0.00015654031394054719 0.00011453422882452295 0.00009168287533174011 0.00007040658488428368 0.00005906705547390712 0.0001396887624253762 0.00023905748114610862 0.00036059264973203783 0.0005189558821759176 0.0008095426567044855 0.0013576193121938474 0.0022129533178503204 0.003279908219514548 0.004379127580087876 0.005337764510923142 0.006004520936120347 0.006258842946612751 0.00605060534260595 0.00542111061335433 0.004510620325940202 0.0035528377214148134 0.002773962381173283 0.002240658034798409 0.001851539819060631 0.0014902181260945345 0.0011458895699827545 0.0008696279545382277 0.0006636557209989187 0.000488359505814749 0.00033287461528253644 0.00021758712571749028 0.00015191940053496268 0.00011453422882452252 0.0000892938886332413 0.00008970530400963142 0.00021814488333106802 0.00035604221904843823 0.000527059496277473 0.0008006309005604044 0.0013576193121938396 0.0023815163812630066 0.0038961044023771464 0.005744944457247076 0.007727115860575966 0.009578011906467723 0.010884820552833414 0.011287232360719148 0.010762009478327431 0.009543175734881953 0.007885851634352308 0.006089358996347635 0.0045374197874653065 0.0034530126341166235 0.002735257380277469 0.0021621361682891077 0.0016434510892206998 0.0012246577971138633 0.0009209194452240764 0.0006808862036298897 0.0004755767626457468 0.0003177350737324117 0.00021758712571749548 0.0001565403139405508 0.00012413553643969889 0.00013719159990130606 0.00030401769822515425 0.0004735132988821201 0.0007261632918973047 0.001218384138981149 0.002212953317850322 0.0038961044023771547 0.006270310653227986 0.009383109611456554 0.01335518657440018 0.01767499640965907 0.020780306627006542 0.021259632970865458 0.019358270366481176 0.016410606487398924 0.013300080450640439 0.010250489182735956 0.007517489748370414 0.0054609172296757715 0.004098860343354649 0.003137278091103773 0.0023548311695479208 0.0017314033525384282 0.0012792562992190227 0.0009448983181505419 0.0006797234220084422 0.00047557676264574404 0.0003328746152825414 0.0002365232571313364 0.00018599940050380534 0.0002028904644140138 0.0004014103695536724 0.00060117590420852 0.0009632349493911804 0.0017456059351057594 0.003279908219514547 0.00574494445724708 0.009383109611456556 0.015142111007148459 0.024168342736126208 0.035232198896082 0.04315798504401966 0.043169193618306186 0.036542370410297134 0.028345846801708426 0.021600447001363182 0.016313578902386966 0.011899632005612577 0.00844949598547021 0.006103819007469923 0.004548630795370629 0.0033890596656994294 0.0024757860587300527 0.0017953659478324702 0.0013044219419490908 0.0009448983181505376 0.000680886203629895 0.0004883595058147552 0.00034950119417327197 0.0002744930032920325 0.000289058094077311 0.0005240339424709029 0.000760976138198989 0.001240872173438061 0.0023155029140805258 0.004379127580087877 0.007727115860575976 0.013355186574400192 0.02416834273612621 0.04358793167375025 0.0689697734916783 0.0870489735205125 0.0854511061047993 0.06795136304519561 0.048152048763744876 0.03380867422689517 0.024476616453336097 0.01767088697656698 0.012455354564246363 0.008851163896473186 0.006514726734788957 0.0048525046306713586 0.003543537105845856 0.002531991081847747 0.00179536594783247 0.0012792562992190203 0.0009209194452240627 0.0006636557209989281 0.00047810797513390306 0.0003796380781566135 0.0003957651850725536 0.0006638652867328161 0.0009450532555018901 0.0015311746859497752 0.002841964997621872 0.0053377645109231285 0.009578011906467704 0.01767499640965905 0.03523219889608198 0.06896977349167825 0.11441220866588603 0.14696938808169444 0.14349707688030014 0.11099495791676929 0.07491270404560924 0.04979656952952348 0.034771922171507 0.024833276124295887 0.01750996775001732 0.012428670230404584 0.009130819952328822 0.006814124455876273 0.004986649428306473 0.003543537105845849 0.0024757860587300454 0.001731403352538404 0.001224657797113856 0.0008696279545382128 0.0006217834696838555 0.0004938979088174678 0.0005122217700908156 0.0007842331047055596 0.0011033690494170344 0.0017673346539450825 0.003228437579871227 0.006004520936120338 0.01088482055283341 0.02078030662700654 0.043157985044019645 0.08704897352051247 0.14696938808169446 0.19105889057568612 0.18859427889568733 0.14741724073021092 0.10018220949061551 0.06659102873504195 0.04632166075690754 0.033086717254703336 0.023497897295981156 0.016841301099417096 0.012442521099413757 0.009298505535895457 0.006814124455876288 0.00485250463067136 0.003389059665699436 0.0023548311695479225 0.0016434510892206922 0.0011458895699827541 0.0008023405097078705 0.0006199289354965183 0.0006206635119981419 0.0008602438311349448 0.0011893217655105724 0.0018846393517467858 0.003393885837083698 0.006258842946612738 0.011287232360719122 0.021259632970865448 0.04316919361830617 0.0854511061047993 0.14349707688030014 0.1885942788956873 0.19153674991461134 0.15678116150870314 0.1128164497428701 0.0788799121953625 0.05648559203452078 0.040967048702471184 0.02969042960424606 0.021890767984102767 0.01652515210730497 0.012442521099413755 0.009130819952328824 0.0065147267347889564 0.004548630795370634 0.0031372780911037646 0.002162136168289122 0.0014902181260945187 0.0010287461375447086 0.0007654503468072667 0.0007164119706880113 0.0009088671603585753 0.00120982101048613 0.0018739209437563802 0.0033101307952636662 0.006050605342605957 0.010762009478327431 0.01935827036648119 0.036542370410297134 0.06795136304519564 0.1109949579167693 0.14741724073021095 0.15678116150870314 0.13854009018097044 0.10918928639667481 0.08242112353905497 0.061744137967736784 0.04623882046826719 0.03518834279291235 0.027636802532900438 0.021890767984102763 0.01684130109941709 0.012428670230404571 0.008851163896473172 0.006103819007469919 0.004098860343354648 0.0027352573802774637 0.001851539819060635 0.0012781043115712696 0.0009350204265440066 0.0008161527036543635 0.0009628131037069247 0.0012065670294402885 0.0017794167978722817 0.003017057632244772 0.005421110613354318 0.009543175734881944 0.016410606487398918 0.028345846801708423 0.04815204876374486 0.07491270404560921 0.10018220949061549 0.11281644974287013 0.10918928639667481 0.09479720627444045 0.0770637825693041 0.06076976938801452 0.048458000595130814 0.040603591542576076 0.03518834279291235 0.029690429604246064 0.023497897295981156 0.01750996775001732 0.012455354564246365 0.00844949598547022 0.005460917229675774 0.0034530126341166464 0.0022406580347984176 0.001534031609806594 0.0011239034969201802 0.0009370424568941268 0.001022379707901963 0.00119734297921286 0.0016478117139200612 0.0026064943852817327 0.004510620325940203 0.007885851634352301 0.013300080450640447 0.021600447001363182 0.03380867422689519 0.04979656952952347 0.06659102873504197 0.07887991219536249 0.08242112353905497 0.07706378256930409 0.06663205520314516 0.05654257027060355 0.05061792172031551 0.04845800059513082 0.04623882046826719 0.0409670487024712 0.033086717254703364 0.024833276124295905 0.017670886976566998 0.011899632005612589 0.007517489748370425 0.004537419787465322 0.002773962381173299 0.0018231338833620326 0.001316568095776346 0.0010646588843713936 0.0010503100328411767 0.0011579051791739598 0.0014941165032954506 0.0021839809405514612 0.003552837721414813 0.0060893589963476324 0.010250489182735956 0.01631357890238697 0.024476616453336104 0.034771922171506986 0.04632166075690752 0.05648559203452079 0.061744137967736784 0.0607697693880145 0.056542570270603554 0.05427095251989683 0.056542570270603554 0.06076976938801451 0.06174413796773679 0.05648559203452079 0.04632166075690755 0.034771922171507 0.02447661645333611 0.01631357890238698 0.01025048918273596 0.006089358996347648 0.0035528377214148164 0.002183980940551458 0.0014941165032954543 0.001157905179173958 0.0010223797079019642 0.0010646588843713977 0.0013165680957763434 0.0018231338833620367 0.002773962381173296 0.004537419787465304 0.0075174897483704225 0.011899632005612575 0.017670886976566994 0.024833276124295874 0.03308671725470334 0.040967048702471184 0.04623882046826719 0.04845800059513079 0.050617921720315505 0.05654257027060355 0.06663205520314516 0.0770637825693041 0.08242112353905495 0.0788799121953625 0.06659102873504198 0.049796569529523486 0.033808674226895194 0.021600447001363196 0.013300080450640451 0.007885851634352318 0.004510620325940205 0.0026064943852817323 0.0016478117139200658 0.001197342979212861 0.0009628131037069259 0.0009370424568941329 0.0011239034969201783 0.0015340316098065975 0.0022406580347984154 0.00345301263411663 0.00546091722967577 0.008449495985470208 0.012455354564246363 0.017509967750017306 0.023497897295981153 0.029690429604246067 0.03518834279291236 0.04060359154257606 0.04845800059513082 0.06076976938801451 0.0770637825693041 0.09479720627444044 0.10918928639667481 0.11281644974287011 0.10018220949061551 0.07491270404560921 0.048152048763744876 0.028345846801708433 0.016410606487398918 0.009543175734881958 0.005421110613354316 0.0030170576322447735 0.0017794167978722863 0.0012065670294402907 0.0009088671603585768 0.0008161527036543716 0.0009350204265440073 0.0012781043115712716 0.001851539819060634 0.0027352573802774524 0.004098860343354646 0.006103819007469911 0.008851163896473174 0.012428670230404565 0.01684130109941709 0.021890767984102773 0.027636802532900438 0.035188342792912344 0.046238820468267196 0.061744137967736784 0.08242112353905497 0.10918928639667481 0.13854009018097044 0.15678116150870314 0.14741724073021098 0.1109949579167693 0.06795136304519565 0.03654237041029715 0.01935827036648119 0.010762009478327441 0.006050605342605949 0.003310130795263669 0.0018739209437563854 0.001209821010486133 0.0008602438311349458 0.0007164119706880196 0.0007654503468072708 0.0010287461375447064 0.001490218126094518 0.0021621361682891186 0.0031372780911037633 0.004548630795370626 0.006514726734788963 0.009130819952328804 0.012442521099413757 0.016525152107304965 0.021890767984102773 0.029690429604246043 0.04096704870247119 0.056485592034520776 0.07887991219536251 0.11281644974287011 0.15678116150870314 0.19153674991461134 0.1885942788956873 0.1434970768803001 0.08545110610479931 0.043169193618306186 0.021259632970865448 0.011287232360719133 0.006258842946612726 0.0033938858370837002 0.0018846393517467908 0.0011893217655105732 0.0007842331047055605 0.000620663511998149 0.0006199289354965262 0.0008023405097078653 0.0011458895699827541 0.0016434510892207035 0.002354831169547925 0.003389059665699428 0.00485250463067137 0.006814124455876269 0.009298505535895459 0.012442521099413748 0.01684130109941709 0.02349789729598114 0.03308671725470335 0.04632166075690753 0.06659102873504197 0.1001822094906155 0.14741724073021095 0.18859427889568733 0.19105889057568612 0.14696938808169446 0.08704897352051251 0.04315798504401966 0.020780306627006546 0.010884820552833416 0.0060045209361203255 0.003228437579871228 0.0017673346539450884 0.0011033690494170328 0.0006638652867328172 0.0005122217700908201 0.0004938979088174777 0.0006217834696838486 0.0008696279545382126 0.0012246577971138767 0.0017314033525384102 0.0024757860587300467 0.0035435371058458605 0.004986649428306458 0.006814124455876292 0.009130819952328818 0.012428670230404587 0.017509967750017317 0.024833276124295905 0.034771922171507 0.0497965695295235 0.07491270404560921 0.11099495791676933 0.1434970768803001 0.14696938808169444 0.114412208665886 0.06896977349167828 0.03523219889608198 0.01767499640965906 0.009578011906467707 0.005337764510923122 0.002841964997621871 0.0015311746859497817 0.0009450532555018865 0.0005240339424709039 0.00039576518507255544 0.00037963807815662273 0.00047810797513389645 0.0006636557209989272 0.0009209194452240858 0.001279256299219027 0.0017953659478324717 0.0025319910818477555 0.0035435371058458393 0.00485250463067136 0.006514726734788946 0.00885116389647317 0.012455354564246351 0.01767088697656699 0.024476616453336097 0.03380867422689518 0.048152048763744876 0.06795136304519564 0.0854511061047993 0.0870489735205125 0.06896977349167828 0.04358793167375026 0.02416834273612621 0.013355186574400197 0.00772711586057598 0.004379127580087873 0.0023155029140805245 0.001240872173438067 0.0007609761381989853 0.00040141036955367325 0.0002890580940773114 0.00027449300329204015 0.0003495011941732663 0.0004883595058147534 0.0006808862036299146 0.0009448983181505471 0.001304421941949099 0.0017953659478324815 0.0024757860587300475 0.0033890596656994338 0.004548630795370619 0.0061038190074699196 0.00844949598547021 0.01189963200561258 0.016313578902386973 0.021600447001363186 0.02834584680170842 0.03654237041029714 0.04316919361830618 0.04315798504401964 0.03523219889608198 0.02416834273612621 0.015142111007148457 0.009383109611456561 0.005744944457247081 0.0032799082195145435 0.001745605935105757 0.0009632349493911854 0.0006011759042085173 0.00030401769822515517 0.00020289046441401343 0.00018599940050381192 0.00023652325713133075 0.0003328746152825388 0.00047557676264575635 0.0006797234220084539 0.0009448983181505466 0.0012792562992190398 0.0017314033525384085 0.002354831169547952 0.0031372780911037568 0.004098860343354656 0.005460917229675762 0.007517489748370426 0.010250489182735951 0.013300080450640454 0.016410606487398914 0.0193582703664812 0.02125963297086543 0.020780306627006542 0.01767499640965904 0.013355186574400189 0.009383109611456547 0.006270310653227992 0.003896104402377152 0.0022129533178503196 0.0012183841389811463 0.0007261632918973092 0.00047351329888211893 0.00021814488333106823 0.00013719159990130446 0.00012413553643970395 0.0001565403139405443 0.00021758712571749326 0.0003177350737324214 0.000475576762645756 0.0006808862036299019 0.0009209194452240968 0.0012246577971138635 0.0016434510892207198 0.002162136168289102 0.0027352573802774645 0.0034530126341166174 0.004537419787465308 0.006089358996347628 0.007885851634352311 0.009543175734881946 0.010762009478327441 0.01128723236071913 0.01088482055283341 0.009578011906467706 0.007727115860575972 0.005744944457247068 0.0038961044023771525 0.002381516381263004 0.0013576193121938352 0.0008006309005604021 0.0005270594962774763 0.0003560422190484379 0.00013968876242537637 0.00008970530400962941 0.00008929388863324627 0.00011453422882451631 0.000151919400534961 0.0002175871257174981 0.00033287461528254175 0.000488359505814756 0.0006636557209989332 0.0008696279545382155 0.0011458895699827604 0.0014902181260945163 0.0018515398190606385 0.002240658034798414 0.002773962381173293 0.003552837721414817 0.004510620325940204 0.005421110613354313 0.0060506053426059555 0.00625884294661272 0.006004520936120328 0.005337764510923121 0.004379127580087869 0.00327990821951454 0.002212953317850325 0.0013576193121938428 0.0008095426567044819 0.0005189558821759161 0.000360592649732041 0.00023905748114610967 0.00007921512669109814 0.00005906705547390443 0.00007040658488428818 0.000091682875331734 0.00011453422882452135 0.00015654031394055326 0.0002365232571313338 0.00034950119417326807 0.00047810797513389477 0.0006217834696838552 0.0008023405097078668 0.001028746137544718 0.0012781043115712668 0.0015340316098066042 0.001823133883362023 0.0021839809405514586 0.002606494385281726 0.0030170576322447714 0.0033101307952636593 0.0033938858370836885 0.0032284375798712172 0.002841964997621874 0.00231550291408052 0.0017456059351057555 0.0012183841389811487 0.0008006309005604074 0.0005189558821759151 0.0003451011794924622 0.000228111346225924 0.00013880284057141143 0.000046397958466130475 0.000043658645204253124 0.0000553400121446822 0.00007040658488428272 0.00008929388863324582 0.00012413553643970208 0.00018599940050380802 0.00027449300329203445 0.0003796380781566229 0.0004938979088174763 0.0006199289354965255 0.0007654503468072535 0.0009350204265439997 0.0011239034969201696 0.0013165680957763432 0.0014941165032954405 0.001647811713920058 0.0017794167978722728 0.001873920943756391 0.001884639351746783 0.0017673346539450892 0.001531174685949782 0.001240872173438061 0.0009632349493911834 0.0007261632918973096 0.0005270594962774799 0.0003605926497320403 0.00022811134622592315 0.00013267912482792 0.00007386269411413491 0.000037323660304479675 0.00003818257149020072 0.000043658645204254106 0.00005906705547390262 0.00008970530400963086 0.0001371915999013078 0.00020289046441401243 0.00028905809407731313 0.0003957651850725546 0.0005122217700908315 0.0006206635119981501 0.0007164119706880192 0.0008161527036543626 0.0009370424568941328 0.001064658884371393 0.0011579051791739616 0.001197342979212855 0.0012065670294402842 0.0012098210104861387 0.001189321765510577 0.001103369049417036 0.0009450532555018878 0.0007609761381989821 0.0006011759042085234 0.00047351329888212023 0.00035604221904844024 0.00023905748114610824 0.0001388028405714085 0.0000738626941141306 0.00004471729841545174 0.000036555955600153605 0.00003557185750931516 0.00004131938524831941 0.00006927841106991485 0.000124436977143053 0.0001982325344744443 0.00027877854625725507 0.0003688317936540765 0.0004837211007552352 0.0006161255593246789 0.0007258557129460955 0.0007842331047055624 0.0008116561588309285 0.000848652587863024 0.0008995969267711901 0.0009254338743022589 0.0008995969267711866 0.0008486525878630205 0.0008116561588309215 0.0007842331047055555 0.0007258557129460746 0.0006161255593246651 0.0004837211007552404 0.0003688317936540791 0.00027877854625724813 0.0001982325344744365 0.00012443697714304976 0.00006927841106991637 0.000041319385248317136 0.000035571857509317326 0.0000355718575093092 0.000043235477902206925 0.00006945342397726398 0.00012834877183813808 0.0002207519181065114 0.0003314013116227033 0.00044462886976899416 0.0005666602319166238 0.000717866529654296 0.0008912224146887258 0.0010359122065182276 0.0011033690494170495 0.0011029764516615273 0.0010826685402583597 0.0010633634004519037 0.001018928388904485 0.0009248564411887989 0.0008039528511211491 0.000699240346768104 0.0006206635119981574 0.0005424395332519846 0.00044536251883483445 0.0003399973189839407 0.00024777767599728844 0.00017592000902817687 0.00011896774347643264 0.0000749864214438372 0.00004701150675251168 0.000035385816829213976 0.00003378055041345974 0.000041319385248315943 0.00006945342397726527 0.00012514458310738689 0.00021384675885703405 0.0003382569558404387 0.0004984623059909844 0.0006923623475488188 0.0009202033550585023 0.0011822360315786305 0.0014533516270413848 0.001670054881074572 0.001767334653945095 0.0017355804206419798 0.001622455124164984 0.001477557116689311 0.0013145279401521155 0.001131106546132808 0.00094075872391416 0.0007668541041885822 0.0006199289354965128 0.0004936140235558583 0.00038202411574575387 0.0002867002807287356 0.000208253119666945 0.00014536777784027055 0.00009890637973825491 0.00006978108319975405 0.000053486773049691144 0.00004244351625248585 0.000035385816829219614 0.00006927841106991099 0.000128348771838139 0.00021384675885703462 0.00032450718525868527 0.0004915278415428217 0.0007669655867827592 0.0011766546693540256 0.0016880521502273182 0.002231884518609751 0.0027278262838996785 0.0030869250399333317 0.003228437579871225 0.003119967987070008 0.0028018161266351984 0.002369722530313525 0.0019295502396633611 0.0015544662428557871 0.0012617286215816442 0.001021947872098684 0.0008023405097078598 0.000602669709140137 0.0004430836000988306 0.00032749602997659037 0.0002396491336290469 0.0001669792523901127 0.0001131898287586416 0.00008400938969302717 0.00006835590124955515 0.00005348677304968547 0.00004701150675251182 0.0001244369771430477 0.00022075191810651 0.00033825695584043517 0.0004915278415428176 0.0007753241069806382 0.0013149137141692014 0.0021575330962007866 0.0032006777697295282 0.004261837790878288 0.005174646336827477 0.005795395785142989 0.006004520936120348 0.005751359337704081 0.005081308636276993 0.004139463137881502 0.003158287344604468 0.0023618270227441945 0.0018252040088143592 0.0014604937925648631 0.0011458895699827706 0.0008478810904686457 0.0006090221462856671 0.0004446632000163215 0.0003238747221292839 0.00022295862859127215 0.00014673972099953124 0.00010514847136896128 0.00008400938969302996 0.00006978108319975004 0.0000749864214438389 0.0001982325344744429 0.00033140131162270566 0.0004984623059909865 0.0007669655867827614 0.0013149137141692062 0.0023263946674731356 0.003824457020248542 0.005648678265475138 0.007593348891884835 0.009386166372071913 0.010602809983184995 0.01088482055283343 0.01023738025444019 0.008929833570272602 0.0072308855036870255 0.005425288999380874 0.00387718462972183 0.002810080016190194 0.0021391237296633915 0.001643451089220701 0.0012086120836674228 0.0008625415369535796 0.0006269184999834714 0.00045802707986649657 0.0003185229014366694 0.0002106915329121225 0.0001467397209995375 0.00011318982875864932 0.00009890637973825788 0.00011896774347644001 0.0002787785462572546 0.0004446288697689947 0.0006923623475488165 0.0011766546693540252 0.0021575330962007853 0.003824457020248539 0.006190457485260748 0.009317982583385741 0.013326033228026425 0.01764607749326306 0.02061112201000015 0.020780306627006556 0.018522657783122468 0.015326377141967946 0.012128142883814001 0.009106667450547161 0.006443731463249307 0.004462883841154415 0.0031929167216776496 0.0023548311695479537 0.0017124336763814718 0.001220849804782795 0.0008847228995316143 0.0006500135096252639 0.0004639337960051206 0.0003185229014366623 0.00022295862859127437 0.00016697925239012162 0.00014536777784027248 0.0001759200090281841 0.00036883179365408036 0.0005666602319166272 0.0009202033550585023 0.00168805215022732 0.003200677769729527 0.005648678265475139 0.009317982583385747 0.015236007343764202 0.024603902216747155 0.03602771739152604 0.04388257004641343 0.043157985044019666 0.03552916848266975 0.026619531064699158 0.0196188113180979 0.01439934812476545 0.010179124463848836 0.00692315307359643 0.004753920712825662 0.0033890596656994355 0.002441698447335629 0.0017395256062650163 0.0012460069125889602 0.0009038676023293324 0.0006500135096252522 0.00045802707986648437 0.00032387472212927514 0.0002396491336290505 0.00020825311966694867 0.0002477776759972914 0.0004837211007552424 0.0007178665296542967 0.001182236031578628 0.002231884518609749 0.004261837790878285 0.007593348891884837 0.013326033228026437 0.02460390221674716 0.045107834388609394 0.07184481865601182 0.09023345115385849 0.08704897352051252 0.06708402303583849 0.04551782647970809 0.030550059905471987 0.021340499097863355 0.014947087410735692 0.010148692673302805 0.006884090603571328 0.004852504630671365 0.003500116031062478 0.0024978119909227913 0.001761970906758676 0.0012460069125889697 0.0008847228995316081 0.0006269184999834524 0.00044466320001631886 0.0003274960299765992 0.00028670028072873353 0.00033999731898394145 0.0006161255593246745 0.0008912224146887227 0.0014533516270413803 0.002727826283899674 0.0051746463368274615 0.009386166372071902 0.017646077493263045 0.03602771739152602 0.07184481865601178 0.12002991041620263 0.15337842354304515 0.14696938808169452 0.10979393375630832 0.07046765868336344 0.04435217915922054 0.02968272381980741 0.020572286992175944 0.014055945234431355 0.009603227887007518 0.006814124455876285 0.0049604238161526076 0.0035620064684013246 0.0024978119909228 0.0017395256062650295 0.001220849804782795 0.0008625415369535896 0.0006090221462856566 0.0004430836000988339 0.0003820241157457625 0.0004453625188348316 0.0007258557129460841 0.0010359122065182241 0.0016700548810745651 0.003086925039933326 0.005795395785142971 0.010602809983184988 0.02061112201000014 0.04388257004641341 0.09023345115385843 0.15337842354304515 0.19796516962779334 0.1910588905756862 0.143461663771684 0.09217668859203688 0.05780088809326291 0.03855471669697163 0.026834614134389638 0.018577243399965797 0.012911808749935779 0.009298505535895465 0.00684446046764251 0.004960423816152609 0.0035001160310624735 0.0024416984473356463 0.0017124336763814849 0.0012086120836674063 0.0008478810904686604 0.0006026697091401616 0.0004936140235558659 0.0005424395332519921 0.0007842331047055572 0.0011033690494170372 0.001767334653945088 0.0032284375798712277 0.0060045209361203385 0.010884820552833414 0.020780306627006546 0.04315798504401965 0.08704897352051251 0.14696938808169446 0.19105889057568615 0.18859427889568733 0.14741724073021098 0.10018220949061551 0.06659102873504197 0.046321660756907544 0.03308671725470335 0.023497897295981167 0.016841301099417096 0.012442521099413769 0.009298505535895469 0.006814124455876281 0.004852504630671365 0.003389059665699442 0.002354831169547931 0.001643451089220707 0.001145889569982753 0.0008023405097078632 0.0006199289354965219 0.0006206635119981462 0.000811656158830915 0.0011029764516615216 0.0017355804206419657 0.0031199679870699947 0.005751359337704072 0.01023738025444018 0.018522657783122464 0.03552916848266974 0.06708402303583848 0.10979393375630832 0.143461663771684 0.14741724073021098 0.1242530445913938 0.09348758096382308 0.06866773887166151 0.051225832259196635 0.03834686322647694 0.028649682336106597 0.021771773699975263 0.01684130109941709 0.012911808749935796 0.009603227887007527 0.006884090603571321 0.004753920712825661 0.0031929167216776517 0.002139123729663389 0.0014604937925648633 0.001021947872098682 0.0007668541041885722 0.0006992403467680955 0.0008486525878630218 0.0010826685402583534 0.00162245512416498 0.0028018161266351966 0.00508130863627699 0.008929833570272596 0.015326377141967936 0.026619531064699154 0.045517826479708076 0.0704676586833634 0.09217668859203684 0.10018220949061551 0.09348758096382308 0.07957358172116913 0.06518714478868119 0.0526548031185631 0.04237773260800205 0.03456537249730394 0.028649682336106593 0.02349789729598116 0.018577243399965804 0.01405594523443135 0.010148692673302807 0.006923153073596439 0.004462883841154424 0.0028100800161902128 0.0018252040088143605 0.0012617286215816476 0.0009407587239141672 0.0008039528511211486 0.0008995969267711849 0.0010633634004518972 0.001477557116689302 0.00236972253031352 0.004139463137881502 0.007230885503687016 0.012128142883814003 0.019618811318097895 0.030550059905471993 0.044352179159220524 0.05780088809326292 0.06659102873504197 0.0686677388716615 0.06518714478868118 0.058745620972737944 0.051887989454072664 0.04639919581004444 0.04237773260800206 0.03834686322647695 0.03308671725470337 0.026834614134389652 0.020572286992175965 0.014947087410735705 0.010179124463848848 0.006443731463249315 0.0038771846297218342 0.002361827022744195 0.0015544662428557952 0.0011311065461328078 0.0009248564411888034 0.0009254338743022519 0.0010189283889044803 0.0013145279401521066 0.0019295502396633546 0.003158287344604469 0.005425288999380865 0.009106667450547149 0.014399348124765444 0.02134049909786334 0.02968272381980739 0.038554716696971615 0.04632166075690752 0.051225832259196635 0.05265480311856309 0.051887989454072664 0.05123786746513384 0.051887989454072664 0.0526548031185631 0.05122583225919664 0.04632166075690754 0.03855471669697162 0.029682723819807397 0.021340499097863355 0.01439934812476545 0.009106667450547154 0.005425288999380878 0.003158287344604463 0.001929550239663349 0.0013145279401521157 0.0010189283889044842 0.0008995969267711861 0.0009248564411888022 0.0011311065461327998 0.0015544662428558012 0.002361827022744202 0.0038771846297218165 0.006443731463249307 0.010179124463848837 0.014947087410735695 0.020572286992175934 0.02683461413438963 0.03308671725470334 0.03834686322647694 0.04237773260800204 0.04639919581004444 0.05188798945407266 0.05874562097273795 0.06518714478868119 0.06866773887166151 0.06659102873504198 0.05780088809326294 0.04435217915922055 0.030550059905472004 0.01961881131809791 0.012128142883814004 0.007230885503687028 0.004139463137881497 0.002369722530313515 0.0014775571166893116 0.0010633634004519024 0.0008486525878630232 0.000803952851121151 0.0009407587239141599 0.0012617286215816528 0.0018252040088143652 0.0028100800161901915 0.004462883841154412 0.00692315307359643 0.010148692673302791 0.014055945234431343 0.018577243399965776 0.023497897295981163 0.02864968233610659 0.034565372497303924 0.04237773260800205 0.05265480311856309 0.06518714478868118 0.07957358172116913 0.09348758096382309 0.1001822094906155 0.09217668859203688 0.07046765868336341 0.0455178264797081 0.026619531064699165 0.015326377141967938 0.008929833570272605 0.005081308636276986 0.0028018161266351906 0.0016224551241649885 0.001082668540258358 0.0008116561588309169 0.0006992403467681019 0.0007668541041885674 0.0010219478720986856 0.001460493792564866 0.002139123729663369 0.003192916721677641 0.004753920712825655 0.00688409060357132 0.009603227887007517 0.01291180874993577 0.016841301099417096 0.02177177369997526 0.028649682336106593 0.03834686322647696 0.05122583225919664 0.06866773887166153 0.09348758096382308 0.12425304459139382 0.14741724073021095 0.14346166377168404 0.10979393375630833 0.0670840230358385 0.035529168482669744 0.01852265778312246 0.01023738025444019 0.005751359337704066 0.0031199679870699895 0.001735580420641973 0.0011029764516615253 0.0007842331047055586 0.0006206635119981534 0.0006199289354965198 0.0008023405097078617 0.0011458895699827528 0.0016434510892206942 0.0023548311695479234 0.0033890596656994303 0.004852504630671367 0.006814124455876277 0.009298505535895452 0.012442521099413762 0.0168413010994171 0.023497897295981153 0.033086717254703364 0.04632166075690754 0.06659102873504198 0.1001822094906155 0.14741724073021098 0.18859427889568733 0.19105889057568615 0.14696938808169446 0.08704897352051251 0.04315798504401965 0.020780306627006542 0.010884820552833423 0.006004520936120331 0.003228437579871222 0.0017673346539450927 0.0011033690494170385 0.000725855712946085 0.0005424395332519972 0.0004936140235558674 0.0006026697091401558 0.0008478810904686588 0.0012086120836674106 0.0017124336763814803 0.0024416984473356394 0.003500116031062482 0.0049604238161526 0.006844460467642506 0.00929850553589546 0.012911808749935779 0.018577243399965786 0.02683461413438965 0.038554716696971615 0.05780088809326293 0.09217668859203687 0.143461663771684 0.19105889057568615 0.1979651696277933 0.15337842354304512 0.09023345115385846 0.04388257004641342 0.02061112201000014 0.010602809983184996 0.0057953957851429655 0.0030869250399333196 0.0016700548810745684 0.0010359122065182224 0.0006161255593246744 0.0004453625188348326 0.0003820241157457662 0.0004430836000988252 0.0006090221462856562 0.0008625415369536079 0.0012208498047827946 0.0017395256062650284 0.0024978119909228004 0.003562006468401324 0.004960423816152609 0.00681412445587629 0.009603227887007527 0.014055945234431346 0.020572286992175955 0.029682723819807397 0.04435217915922056 0.07046765868336341 0.10979393375630833 0.14696938808169444 0.15337842354304512 0.12002991041620258 0.0718448186560118 0.036027717391526014 0.017646077493263048 0.009386166372071904 0.005174646336827461 0.0027278262838996664 0.0014533516270413822 0.0008912224146887185 0.00048372110075524166 0.00033999731898393923 0.0002867002807287375 0.00032749602997659064 0.0004446632000163202 0.0006269184999834747 0.0008847228995316126 0.001246006912588968 0.0017619709067586793 0.0024978119909227956 0.003500116031062479 0.004852504630671364 0.006884090603571323 0.010148692673302796 0.014947087410735697 0.02134049909786335 0.030550059905471997 0.04551782647970808 0.06708402303583849 0.0870489735205125 0.09023345115385845 0.0718448186560118 0.04510783438860939 0.02460390221674716 0.013326033228026439 0.00759334889188484 0.004261837790878287 0.0022318845186097428 0.0011822360315786287 0.0007178665296542925 0.0003688317936540794 0.0002477776759972886 0.00020825311966695258 0.00023964913362904368 0.0003238747221292779 0.0004580270798665073 0.0006500135096252602 0.0009038676023293326 0.001246006912588973 0.0017395256062650273 0.002441698447335647 0.0033890596656994372 0.004753920712825661 0.006923153073596427 0.010179124463848846 0.014399348124765447 0.019618811318097902 0.026619531064699158 0.035529168482669744 0.043157985044019645 0.043882570046413404 0.03602771739152603 0.024603902216747155 0.015236007343764199 0.009317982583385747 0.005648678265475142 0.0032006777697295304 0.001688052150227315 0.0009202033550585025 0.0005666602319166244 0.00027877854625725425 0.00017592000902818273 0.00014536777784027684 0.0001669792523901159 0.00022295862859127868 0.00031852290143668063 0.00046393379600513033 0.0006500135096252618 0.0008847228995316335 0.0012208498047827979 0.0017124336763815024 0.002354831169547917 0.003192916721677661 0.004462883841154403 0.006443731463249317 0.009106667450547147 0.012128142883814013 0.015326377141967927 0.01852265778312248 0.020780306627006518 0.020611122010000135 0.01764607749326303 0.01332603322802643 0.00931798258338573 0.006190457485260748 0.0038244570202485405 0.0021575330962007875 0.0011766546693540221 0.0006923623475488167 0.0004446288697689942 0.0001982325344744418 0.00011896774347643909 0.00009890637973826152 0.00011318982875864426 0.00014673972099954 0.00021069153291213873 0.0003185229014366778 0.00045802707986649955 0.00062691849998349 0.0008625415369535847 0.0012086120836674347 0.001643451089220683 0.002139123729663384 0.0028100800161901768 0.0038771846297218373 0.005425288999380863 0.00723088550368703 0.00892983357027259 0.01023738025444019 0.010884820552833397 0.01060280998318498 0.00938616637207189 0.007593348891884834 0.005648678265475131 0.0038244570202485397 0.002326394667473137 0.0013149137141692045 0.0007669655867827598 0.000498462305990985 0.0003314013116227057 0.00012443697714304694 0.00007498642144383899 0.00006978108319975359 0.0000840093896930257 0.00010514847136896344 0.00014673972099954377 0.00022295862859127708 0.00032387472212927753 0.0004446632000163271 0.0006090221462856554 0.000847881090468675 0.0011458895699827673 0.0014604937925648646 0.001825204008814356 0.002361827022744202 0.0031582873446044627 0.004139463137881507 0.0050813086362769795 0.005751359337704079 0.006004520936120322 0.005795395785142955 0.005174646336827455 0.004261837790878286 0.003200677769729519 0.002157533096200785 0.001314913714169202 0.0007753241069806352 0.0004915278415428176 0.0003382569558404332 0.00022075191810651162 0.00006927841106990965 0.000047011506752511245 0.00005348677304968811 0.00006835590124955128 0.00008400938969302819 0.00011318982875865147 0.00016697925239011807 0.0002396491336290465 0.0003274960299765961 0.00044308360009883416 0.0006026697091401616 0.0008023405097078794 0.0010219478720986965 0.001261728621581665 0.0015544662428557995 0.001929550239663361 0.0023697225303135248 0.0028018161266351867 0.0031199679870699947 0.0032284375798712207 0.0030869250399333087 0.0027278262838996707 0.0022318845186097445 0.0016880521502273152 0.0011766546693540234 0.000766965586782758 0.0004915278415428169 0.00032450718525868597 0.00021384675885703145 0.0001283487718381412 0.000041319385248315476 0.00003538581682921948 0.00004244351625248921 0.000053486773049688854 0.00006978108319975714 0.00009890637973826453 0.00014536777784027852 0.00020825311966694688 0.0002867002807287425 0.0003820241157457652 0.0004936140235558765 0.0006199289354965172 0.0007668541041885844 0.0009407587239141529 0.0011311065461328132 0.0013145279401521074 0.0014775571166893077 0.001622455124164968 0.0017355804206419675 0.0017673346539450847 0.0016700548810745545 0.0014533516270413783 0.0011822360315786316 0.0009202033550584996 0.0006923623475488149 0.0004984623059909811 0.0003382569558404342 0.0002138467588570355 0.00012514458310738442 0.00006945342397726898 0.000035571857509308856 0.0000337805504134586 0.0000353858168292166 0.000047011506752509605 0.00007498642144383934 0.00011896774347644033 0.00017592000902818319 0.0002477776759972869 0.00033999731898393934 0.0004453625188348335 0.0005424395332519976 0.0006206635119981517 0.0006992403467681 0.0008039528511211492 0.0009248564411888036 0.0010189283889044806 0.0010633634004519016 0.0010826685402583495 0.0011029764516615277 0.0011033690494170292 0.001035912206518209 0.0008912224146887179 0.000717866529654296 0.0005666602319166242 0.00044462886976898895 0.0003314013116226965 0.00022075191810650793 0.00012834877183813943 0.00006945342397726169 0.00004323547790221009 0.000028768074973662457 0.000028324619977967112 0.00003439575992661447 0.00006028885013160403 0.00010990207288447541 0.00017526872371933459 0.0002451672234140825 0.00032132396993739265 0.00041701622182258556 0.0005262171083925526 0.0006161255593246772 0.0006638652867328107 0.0006876207794232064 0.0007212546483763883 0.0007667896670978391 0.000789716228224515 0.0007667896670978357 0.0007212546483763918 0.0006876207794232064 0.0006638652867328211 0.0006161255593246668 0.0005262171083925595 0.0004170162218225873 0.0003213239699373866 0.00024516722341408077 0.00017526872371932505 0.00010990207288447606 0.00006028885013160262 0.00003439575992661198 0.000028324619977965486 0.000028324619977969288 0.00003682836488375323 0.00006258753462346968 0.0001179612011765563 0.0002022661710982116 0.000300389900465077 0.00039880592165459305 0.000503031714549414 0.0006296342986623017 0.0007727221740842517 0.0008912224146887254 0.000945053255501897 0.00094163477488504 0.0009218909549822134 0.0009055757124909082 0.0008701737083641827 0.0007900599153244924 0.0006814304005537475 0.0005841060597842247 0.0005122217700908299 0.0004453625188348309 0.00036608700067569856 0.00028173929364136495 0.00020872672490351035 0.00015154206168440856 0.00010322000910759061 0.00006307845147369103 0.00003706462000963355 0.000026711709509458173 0.000025849658985388867 0.000034395759926617156 0.00006258753462347056 0.00011779395139745461 0.00020424986233035655 0.0003206654954183247 0.00046332858412138857 0.0006304765274554577 0.0008239745350408579 0.0010447624265134021 0.0012722104792645395 0.001453351627041393 0.00153117468594978 0.0014949492493011294 0.0013888305176585204 0.0012624736503087134 0.0011270689633863396 0.0009705099287999345 0.0007970503483696879 0.000631751226801641 0.0004938979088174735 0.0003820241157457645 0.0002902993943691713 0.00021817936648991514 0.00016298950258330662 0.00011899803177516696 0.000082369113640634 0.00005473562818607192 0.00003812009777228135 0.00002979625227629649 0.000026711709509460294 0.00006028885013160421 0.00011796120117655539 0.00020424986233035381 0.0003158654422010122 0.0004737128545823659 0.000718187954770966 0.0010719536575662437 0.0015115507963728585 0.0019821064539637784 0.002414862370457804 0.0027278262838996738 0.002841964997621872 0.0027252012978601437 0.002423979187085863 0.002038034982836012 0.0016584905708846669 0.001331445714550177 0.001061253350202495 0.0008297072438039132 0.0006217834696838594 0.00044308360009882023 0.0003100884005310616 0.00022463885487634228 0.00016905754840345927 0.00012439403742308457 0.00008687310358683194 0.0000622432677210635 0.00004802404642698687 0.0000381200977722766 0.00003706462000963173 0.00010990207288447719 0.0002022661710982126 0.0003206654954183231 0.0004737128545823687 0.0007370114712795577 0.001214728941261357 0.0019497470457856601 0.0028634056441512665 0.0038047658255811944 0.004622831473009585 0.0051746463368274685 0.005337764510923129 0.00506599039894628 0.00442297840078409 0.0035655934957543067 0.0026987296766766266 0.00199353869973613 0.0015021101566728304 0.0011583572591615122 0.0008696279545382202 0.0006090221462856684 0.0004103825706411369 0.0002871615092159441 0.00021079146292320332 0.0001510795300416486 0.00010310204404457669 0.00007553666539708584 0.0000622432677210665 0.00005473562818606882 0.00006307845147369061 0.0001752687237193304 0.00030038990046507607 0.00046332858412138656 0.0007181879547709682 0.0012147289412613557 0.002110820674846315 0.0034314450613520202 0.005045103596017067 0.006767615584404145 0.008343439782146935 0.009386166372071895 0.009578011906467702 0.008932914694551073 0.007710433178781151 0.0061719245315102885 0.004570037806178963 0.0032019567330937387 0.0022502321078609775 0.001651926371329788 0.0012246577971138568 0.0008625415369535976 0.0005817603729256054 0.00040315658918495603 0.0002908621346563611 0.00020537152754663638 0.00013978608385999746 0.00010310204404458469 0.0000868731035868409 0.0000823691136406368 0.00010322000910759473 0.0002451672234140804 0.0003988059216545924 0.000630476527455454 0.0010719536575662443 0.0019497470457856573 0.0034314450613520176 0.00552296599352052 0.00824883073013153 0.011664359723122485 0.015258430610257591 0.01764607749326303 0.017674996409659048 0.01569272215250288 0.012938092278920262 0.01017424718397428 0.007546972735349737 0.005225728102749311 0.003504638407223866 0.0024198593746372152 0.0017314033525384113 0.0012208498047827962 0.0008364038989140087 0.000583338631448998 0.0004193721286009111 0.0002970360003487952 0.00020537152754663296 0.0001510795300416534 0.00012439403742308994 0.00011899803177516465 0.0001515420616844099 0.00032132396993738924 0.0005030317145494126 0.0008239745350408541 0.0015115507963728585 0.0028634056441512656 0.005045103596017063 0.008248830730131532 0.013230330906524548 0.0208645964437508 0.02995435275689363 0.03602771739152602 0.03523219889608197 0.029017297434719525 0.021833526348406383 0.016130953814403673 0.011767808214400976 0.008167517098673112 0.005391246813130986 0.0035767109487630376 0.002475786058730046 0.001739525606265023 0.0012060439533125725 0.0008408650019755449 0.0005962452510613948 0.0004193721286009082 0.0002908621346563618 0.00021079146292320551 0.0001690575484034621 0.00016298950258330483 0.0002087267249035111 0.0004170162218225841 0.0006296342986623049 0.0010447624265133965 0.0019821064539637793 0.0038047658255811936 0.006767615584404148 0.011664359723122485 0.0208645964437508 0.037099549047796304 0.057874007302206903 0.07184481865601179 0.06896977349167827 0.05321910300325957 0.0363667313100634 0.02460864991473567 0.017197117076335006 0.011889215069225812 0.007869541377713726 0.005172902766082888 0.003543537105845857 0.0024978119909228 0.0017465327290204908 0.001209958761093527 0.0008408650019755447 0.0005833386314489975 0.00040315658918494546 0.00028716150921594694 0.00022463885487634944 0.00021817936648991287 0.0002817392936413655 0.0005262171083925531 0.0007727221740842528 0.0012722104792645408 0.0024148623704578057 0.004622831473009584 0.008343439782146932 0.015258430610257587 0.02995435275689363 0.05787400730220689 0.09489057748909484 0.12002991041620258 0.11441220866588601 0.0853932486432805 0.05505469128506339 0.034928612089142816 0.02345686346995568 0.01612544317183192 0.010803241393581731 0.007195842070608353 0.004986649428306471 0.00356200646840133 0.002518789882627828 0.0017465327290204895 0.001206043953312578 0.0008364038989139976 0.0005817603729256088 0.0004103825706411209 0.00031008840053105074 0.0002902993943691606 0.0003660870006756813 0.0006161255593246745 0.0008912224146887226 0.0014533516270413792 0.0027278262838996707 0.005174646336827465 0.0093861663720719 0.017646077493263038 0.03602771739152602 0.07184481865601179 0.12002991041620259 0.1533784235430451 0.14696938808169446 0.10979393375630832 0.07046765868336342 0.04435217915922054 0.0296827238198074 0.02057228699217594 0.014055945234431346 0.009603227887007524 0.0068141244558762816 0.004960423816152613 0.0035620064684013185 0.0024978119909228 0.0017395256062650323 0.0012208498047828024 0.0008625415369536012 0.0006090221462856606 0.00044308360009883324 0.0003820241157457617 0.00044536251883483033 0.0006638652867328147 0.0009450532555018928 0.0015311746859497796 0.0028419649976218694 0.00533776451092313 0.009578011906467702 0.017674996409659048 0.03523219889608198 0.06896977349167828 0.11441220866588601 0.14696938808169446 0.14349707688030014 0.11099495791676933 0.07491270404560922 0.0497965695295235 0.03477192217150701 0.024833276124295898 0.01750996775001732 0.012428670230404575 0.009130819952328818 0.006814124455876286 0.0049866494283064625 0.0035435371058458484 0.0024757860587300536 0.0017314033525384158 0.0012246577971138756 0.0008696279545382139 0.0006217834696838496 0.0004938979088174704 0.0005122217700908201 0.0006876207794232075 0.0009416347748850421 0.0014949492493011266 0.002725201297860149 0.0050659903989462825 0.008932914694551075 0.01569272215250288 0.02901729743471953 0.05321910300325958 0.08539324864328052 0.10979393375630832 0.11099495791676932 0.09210298693624547 0.06864617972454862 0.050491304937156894 0.03796747156086694 0.028546983150662536 0.02124810892754824 0.0160522850222263 0.01242867023040457 0.009603227887007529 0.007195842070608347 0.00517290276608289 0.0035767109487630346 0.0024198593746372235 0.0016519263713297915 0.0011583572591615172 0.0008297072438039161 0.0006317512268016397 0.0005841060597842288 0.0007212546483763908 0.0009218909549822148 0.0013888305176585208 0.002423979187085862 0.004422978400784091 0.007710433178781149 0.012938092278920262 0.021833526348406383 0.03636673131006339 0.055054691285063385 0.0704676586833634 0.07491270404560922 0.06864617972454862 0.05804858897493287 0.047938404154548864 0.03927144288015322 0.03181122859580151 0.02580412409566321 0.02124810892754824 0.017509967750017317 0.014055945234431348 0.010803241393581726 0.007869541377713724 0.005391246813130988 0.003504638407223866 0.002250232107860988 0.001502110156672832 0.0010612533502024893 0.0007970503483696889 0.0006814304005537423 0.0007667896670978392 0.0009055757124909097 0.0012624736503087082 0.002038034982836017 0.003565593495754314 0.0061719245315102885 0.010174247183974286 0.016130953814403676 0.024608649914735683 0.03492861208914282 0.04435217915922054 0.04979656952952348 0.05049130493715689 0.04793840415454886 0.043876076872530166 0.03939450951957952 0.03526993486347838 0.0318112285958015 0.02854698315066253 0.0248332761242959 0.02057228699217595 0.01612544317183192 0.011889215069225814 0.008167517098673117 0.005225728102749316 0.003201956733093745 0.0019935386997361375 0.001331445714550179 0.0009705099287999424 0.0007900599153245003 0.0007897162282245144 0.0008701737083641794 0.0011270689633863377 0.0016584905708846628 0.002698729676676629 0.00457003780617896 0.007546972735349735 0.01176780821440097 0.017197117076335 0.023456863469955666 0.029682723819807383 0.03477192217150701 0.037967471560866946 0.03927144288015322 0.039394509519579526 0.03928542528933829 0.039394509519579526 0.039271442880153204 0.03796747156086694 0.034771922171507 0.02968272381980739 0.023456863469955666 0.017197117076335006 0.011767808214400974 0.007546972735349735 0.0045700378061789716 0.002698729676676626 0.0016584905708846623 0.0011270689633863422 0.0008701737083641819 0.0007667896670978396 0.0007900599153244987 0.0009705099287999391 0.00133144571455018 0.001993538699736142 0.0032019567330937295 0.005225728102749315 0.008167517098673109 0.011889215069225805 0.016125443171831916 0.020572286992175944 0.024833276124295884 0.028546983150662533 0.0318112285958015 0.03526993486347838 0.03939450951957952 0.043876076872530166 0.04793840415454885 0.05049130493715688 0.049796569529523486 0.04435217915922054 0.03492861208914284 0.024608649914735686 0.016130953814403683 0.010174247183974285 0.006171924531510298 0.003565593495754312 0.002038034982836017 0.0012624736503087134 0.0009055757124909124 0.0007212546483763909 0.0006814304005537427 0.0007970503483696861 0.0010612533502024908 0.001502110156672837 0.0022502321078609715 0.003504638407223862 0.005391246813130984 0.007869541377713717 0.010803241393581735 0.014055945234431341 0.017509967750017327 0.02124810892754824 0.025804124095663218 0.03181122859580151 0.03927144288015322 0.047938404154548864 0.058048588974932855 0.06864617972454859 0.07491270404560921 0.0704676586833634 0.05505469128506338 0.0363667313100634 0.021833526348406386 0.012938092278920264 0.007710433178781157 0.004422978400784088 0.002423979187085863 0.001388830517658526 0.0009218909549822169 0.0006876207794232083 0.0005841060597842323 0.0006317512268016387 0.0008297072438039172 0.0011583572591615232 0.001651926371329776 0.0024198593746372196 0.0035767109487630324 0.005172902766082889 0.00719584207060836 0.009603227887007527 0.012428670230404585 0.016052285022226304 0.021248108927548245 0.028546983150662543 0.037967471560866946 0.0504913049371569 0.0686461797245486 0.09210298693624547 0.1109949579167693 0.10979393375630833 0.0853932486432805 0.05321910300325958 0.029017297434719532 0.01569272215250288 0.008932914694551082 0.005065990398946277 0.0027252012978601506 0.0014949492493011322 0.0009416347748850447 0.0006638652867328158 0.0005122217700908245 0.0004938979088174713 0.0006217834696838486 0.00086962795453822 0.0012246577971138663 0.0017314033525384135 0.0024757860587300484 0.003543537105845848 0.0049866494283064685 0.006814124455876288 0.009130819952328827 0.012428670230404575 0.017509967750017317 0.024833276124295905 0.034771922171507 0.0497965695295235 0.07491270404560921 0.11099495791676932 0.14349707688030014 0.14696938808169446 0.11441220866588601 0.06896977349167828 0.035232198896081986 0.01767499640965905 0.00957801190646771 0.0053377645109231224 0.0028419649976218716 0.0015311746859497846 0.0009450532555018949 0.0006161255593246757 0.0004453625188348341 0.0003820241157457657 0.00044308360009883 0.000609022146285666 0.0008625415369536038 0.0012208498047828037 0.0017395256062650263 0.0024978119909228004 0.0035620064684013294 0.004960423816152609 0.006814124455876284 0.009603227887007522 0.01405594523443134 0.020572286992175948 0.029682723819807397 0.044352179159220545 0.07046765868336341 0.10979393375630832 0.14696938808169446 0.15337842354304512 0.1200299104162026 0.0718448186560118 0.036027717391526035 0.01764607749326304 0.009386166372071906 0.005174646336827459 0.0027278262838996733 0.0014533516270413844 0.0008912224146887232 0.0005262171083925543 0.0003660870006756829 0.00029029939436916693 0.00031008840053104673 0.0004103825706411251 0.0005817603729256219 0.0008364038989140025 0.0012060439533125773 0.0017465327290204936 0.0025187898826278454 0.003562006468401335 0.004986649428306465 0.007195842070608359 0.01080324139358173 0.016125443171831927 0.023456863469955673 0.034928612089142844 0.05505469128506338 0.08539324864328052 0.11441220866588601 0.12002991041620259 0.09489057748909482 0.057874007302206903 0.02995435275689363 0.015258430610257596 0.008343439782146937 0.004622831473009581 0.002414862370457806 0.0012722104792645455 0.0007727221740842516 0.00041701622182258475 0.00028173929364136544 0.00021817936648992016 0.0002246388548763457 0.00028716150921594965 0.000403156589184961 0.0005833386314490023 0.0008408650019755465 0.0012099587610935284 0.0017465327290204944 0.002497811990922797 0.003543537105845849 0.005172902766082889 0.00786954137771372 0.011889215069225816 0.017197117076335006 0.024608649914735686 0.0363667313100634 0.05321910300325958 0.0689697734916783 0.0718448186560118 0.05787400730220692 0.037099549047796304 0.020864596443750803 0.011664359723122492 0.006767615584404154 0.003804765825581194 0.001982106453963779 0.0010447624265134006 0.0006296342986623027 0.0003213239699373899 0.00020872672490351098 0.00016298950258331223 0.00016905754840345976 0.00021079146292320682 0.0002908621346563778 0.00041937212860091534 0.000596245251061401 0.00084086500197555 0.0012060439533125842 0.0017395256062650267 0.002475786058730054 0.003576710948763036 0.005391246813130979 0.008167517098673114 0.011767808214400977 0.016130953814403683 0.021833526348406386 0.029017297434719532 0.035232198896081986 0.03602771739152603 0.02995435275689364 0.020864596443750803 0.013230330906524552 0.008248830730131535 0.005045103596017068 0.0028634056441512686 0.001511550796372857 0.0008239745350408574 0.0005030317145494104 0.00024516722341408163 0.0001515420616844106 0.00011899803177517174 0.00012439403742308872 0.00015107953004165446 0.00020537152754664781 0.0002970360003488034 0.00041937212860091545 0.0005833386314490128 0.000836403898914009 0.0012208498047828107 0.0017314033525384026 0.002419859374637229 0.0035046384072238567 0.005225728102749319 0.007546972735349732 0.010174247183974293 0.01293809227892026 0.015692722152502902 0.01767499640965905 0.017646077493263048 0.015258430610257596 0.011664359723122488 0.008248830730131525 0.005522965993520526 0.00343144506135202 0.0019497470457856632 0.0010719536575662424 0.0006304765274554577 0.0003988059216545907 0.00017526872371933114 0.00010322000910759549 0.00008236911364064196 0.00008687310358683993 0.00010310204404458433 0.0001397860838600126 0.00020537152754664613 0.0002908621346563706 0.0004031565891849726 0.0005817603729256173 0.00086254153695361 0.0012246577971138585 0.001651926371329783 0.002250232107860959 0.0032019567330937404 0.004570037806178958 0.006171924531510295 0.007710433178781149 0.008932914694551082 0.009578011906467707 0.009386166372071899 0.00834343978214694 0.006767615584404153 0.005045103596017063 0.003431445061352024 0.0021108206748463158 0.0012147289412613622 0.0007181879547709652 0.0004633285841213894 0.0003003899004650735 0.00010990207288447781 0.0000630784514736914 0.00005473562818607286 0.00006224326772106597 0.00007553666539708483 0.00010310204404459096 0.00015107953004165703 0.00021079146292320817 0.0002871615092159451 0.00041038257064112565 0.0006090221462856625 0.0008696279545382138 0.0011583572591615126 0.0015021101566728293 0.0019935386997361414 0.002698729676676627 0.0035655934957543123 0.004422978400784091 0.0050659903989462825 0.005337764510923126 0.00517464633682746 0.004622831473009582 0.0038047658255811914 0.0028634056441512595 0.0019497470457856604 0.0012147289412613564 0.0007370114712795641 0.0004737128545823654 0.0003206654954183253 0.0002022661710982098 0.00006028885013160397 0.00003706462000963189 0.00003812009777227942 0.00004802404642698642 0.00006224326772106257 0.00008687310358684564 0.00012439403742308858 0.00016905754840346345 0.0002246388548763492 0.00031008840053105806 0.0004430836000988292 0.0006217834696838609 0.0008297072438039137 0.0010612533502024897 0.0013314457145501824 0.001658490570884668 0.0020380349828360137 0.002423979187085864 0.00272520129786015 0.0028419649976218755 0.002727826283899671 0.002414862370457813 0.0019821064539637784 0.0015115507963728552 0.0010719536575662443 0.0007181879547709643 0.00047371285458237 0.0003158654422010087 0.00020424986233035425 0.00011796120117655193 0.00003439575992661719 0.000026711709509460995 0.000029796252276299843 0.00003812009777228172 0.00005473562818607164 0.00008236911364064623 0.00011899803177517325 0.0001629895025833117 0.00021817936648991997 0.00029029939436916465 0.00038202411574576775 0.0004938979088174606 0.000631751226801638 0.0007970503483696749 0.0009705099287999425 0.001127068963386337 0.0012624736503087089 0.0013888305176585245 0.0014949492493011294 0.0015311746859497776 0.0014533516270413772 0.0012722104792645499 0.0010447624265133982 0.0008239745350408516 0.0006304765274554577 0.00046332858412138456 0.00032066549541832684 0.00020424986233035387 0.00011779395139745396 0.00006258753462346796 0.000028324619977969094 0.000025849658985389822 0.000026711709509460995 0.00003706462000963425 0.00006307845147369002 0.00010322000910760118 0.0001515420616844126 0.0002087267249035151 0.0002817392936413667 0.0003660870006756826 0.0004453625188348309 0.000512221770090817 0.0005841060597842239 0.0006814304005537388 0.0007900599153244969 0.0008701737083641812 0.000905575712490906 0.0009218909549822178 0.0009416347748850434 0.0009450532555018891 0.0008912224146887153 0.0007727221740842612 0.0006296342986623026 0.0005030317145494055 0.00039880592165459115 0.0003003899004650696 0.00020226617109821238 0.00011796120117655388 0.00006258753462346787 0.000036828364883750995 0.000022151566164280536 0.000022541579159481766 0.000029077834577928216 0.000051575019374038066 0.00009202672100431012 0.00014390693080603475 0.0001999162390895386 0.00026156901156281723 0.000336092964548681 0.0004170162218225873 0.0004837211007552439 0.0005240339424709087 0.0005506553884725048 0.0005832294783845796 0.0006197248184155353 0.000636837332730884 0.0006197248184155336 0.0005832294783845796 0.0005506553884725082 0.0005240339424709001 0.0004837211007552404 0.00041701622182258556 0.000336092964548681 0.00026156901156281463 0.0001999162390895386 0.0001439069308060317 0.00009202672100431034 0.00005157501937403828 0.000029077834577927132 0.00002254157915948247 0.000022541579159482372 0.000030180522486133588 0.000053844133215540664 0.00010298248083767324 0.0001748674317616123 0.0002556769954001648 0.0003363917239214455 0.0004222368852196884 0.0005222137760460877 0.0006296342986623082 0.000717866529654303 0.000760976138198997 0.0007619127265753531 0.0007465776724080165 0.0007313386636297347 0.000703856505809719 0.0006423483931220714 0.0005519973573561758 0.0004633564042267089 0.00039576518507255837 0.00033999731898394 0.00028173929364137015 0.00022033393740473364 0.00016484178283184467 0.00012021240778398076 0.00008184139687993517 0.00004966829372032497 0.00002876662995246254 0.000020711875659537473 0.000020532050107831735 0.000029077834577929998 0.00005384413321554238 0.00010487748323798162 0.00018588342694629182 0.00029007418727425765 0.0004090335134792802 0.0005429488252746297 0.0006969509137475167 0.0008703087826223959 0.0010447624265134 0.0011822360315786385 0.0012408721734380763 0.0012087368131948198 0.0011191498215588802 0.0010183403054298285 0.0009190083262633709 0.0008015254916949685 0.0006561523056794518 0.0005052944369660961 0.00037963807815661374 0.000286700280728732 0.00021817936648991555 0.00016606419909649285 0.00012541544784508535 0.00009202995412546045 0.00006174356940784728 0.000037225400347980404 0.000023259926778897243 0.000019165279029503557 0.00002071187565954053 0.000051575019374040336 0.00010298248083767599 0.00018588342694629242 0.00029651146234187746 0.00044009280330434687 0.0006398426918513317 0.0009163199990738608 0.0012607018118170853 0.0016349871298253318 0.0019821064539637828 0.0022318845186097567 0.002315502914080532 0.0022044233453669096 0.0019465698802292996 0.0016396186116322171 0.001356002967794808 0.0011094531117226132 0.0008835265101450347 0.0006692846682037813 0.0004781079751338991 0.0003274960299765942 0.00022463885487634475 0.00016213711920641887 0.0001230483526989929 0.00009092448574328187 0.00006065687477902413 0.00003826818439399707 0.000026642519656203414 0.00002325992677889598 0.000028766629952464916 0.00009202672100430781 0.00017486743176161148 0.0002900741872742545 0.0004400928033043441 0.0006706709826168872 0.0010541703707617888 0.0016299924923527612 0.0023559393415975285 0.0031243262723721276 0.003804765825581197 0.004261837790878295 0.004379127580087887 0.004117426952608121 0.0035548620122397654 0.0028541081215028995 0.002180842443607052 0.001635186491221512 0.0012310199292264743 0.0009232854720991968 0.0006636557209989204 0.0004446632000163179 0.0002871615092159499 0.00019395528069378738 0.00014055573155341786 0.00010089256600216066 0.00006762487901667203 0.00004695012607628765 0.0000382681843939944 0.00003722540034797463 0.00004966829372032345 0.00014390693080603152 0.00025567699540016327 0.00040903351347927635 0.0006398426918513282 0.0010541703707617883 0.0017698156072572246 0.0028175502559398694 0.00411172314262916 0.0055024794586461066 0.006767615584404155 0.007593348891884841 0.007727115860575981 0.007172574512613112 0.00614405407613146 0.004883702047003988 0.003610843325070013 0.0025357859259002276 0.0017735870623411655 0.0012775314669896038 0.0009209194452240717 0.000626918499983466 0.00040315658918494617 0.00026363326213075866 0.0001825935571285964 0.00012770593467778803 0.0000882673103841458 0.00006762487901667583 0.000060656874779025005 0.00006174356940784516 0.00008184139687993647 0.00019991623908953605 0.0003363917239214457 0.0005429488252746259 0.0009163199990738571 0.001629992492352761 0.0028175502559398685 0.004478765621190837 0.0065860792568771 0.009110995346707656 0.011664359723122492 0.013326033228026436 0.013355186574400197 0.011973630808074325 0.009977253075154286 0.007878392384066558 0.005824229496243895 0.004001168929060427 0.002654967801723886 0.001810848820147553 0.0012792562992190268 0.0008847228995316139 0.0005833386314490027 0.0003844573858147839 0.00026274413670865804 0.0001817243025739877 0.00012770593467778467 0.00010089256600216069 0.00009092448574328166 0.00009202995412545364 0.00012021240778398026 0.0002615690115628175 0.00042223688521968996 0.000696950913747514 0.0012607018118170829 0.002355939341597529 0.004111723142629161 0.0065860792568771045 0.010128569135575999 0.015156039132763182 0.020864596443750806 0.02460390221674716 0.024168342736126214 0.02042239365493734 0.015933902304877866 0.012113170777656664 0.008910303039589453 0.006129708980026593 0.003986452395490244 0.0026137159892019837 0.001795365947832466 0.0012460069125889589 0.0008408650019755398 0.0005632734506421861 0.0003839224169122416 0.00026274413670865425 0.00018259355712859485 0.00014055573155341686 0.00012304835269899507 0.00012541544784508126 0.0001648417828318467 0.0003360929645486815 0.000522213776046091 0.0008703087826223947 0.0016349871298253302 0.00312432627237213 0.005502479458646109 0.009110995346707663 0.015156039132763184 0.02500960208422867 0.03709954904779632 0.04510783438860939 0.04358793167375027 0.034760915202820916 0.025055637667848865 0.01786507350603816 0.012817265080276339 0.008839845022533014 0.0057619506783170675 0.003734748948349907 0.0025319910818477455 0.0017619709067586704 0.0012099587610935232 0.0008231909664002661 0.0005632734506421877 0.0003844573858147841 0.0002636332621307547 0.00019395528069378988 0.00016213711920642053 0.00016606419909648802 0.00022033393740473453 0.0004170162218225857 0.0006296342986623068 0.0010447624265133982 0.0019821064539637793 0.003804765825581194 0.006767615584404151 0.011664359723122486 0.0208645964437508 0.0370995490477963 0.05787400730220692 0.0718448186560118 0.0689697734916783 0.05321910300325956 0.036366731310063405 0.024608649914735672 0.017197117076335002 0.011889215069225802 0.007869541377713717 0.005172902766082877 0.0035435371058458423 0.0024978119909227978 0.0017465327290204836 0.0012099587610935238 0.0008408650019755443 0.0005833386314489976 0.0004031565891849493 0.00028716150921594423 0.00022463885487634524 0.00021817936648991287 0.0002817392936413663 0.00048372110075524356 0.0007178665296542994 0.0011822360315786307 0.0022318845186097497 0.004261837790878291 0.0075933488918848374 0.013326033228026432 0.02460390221674716 0.04510783438860937 0.0718448186560118 0.09023345115385845 0.08704897352051251 0.06708402303583848 0.04551782647970808 0.030550059905471983 0.02134049909786334 0.014947087410735685 0.010148692673302791 0.006884090603571305 0.004852504630671356 0.00350011603106247 0.0024978119909227965 0.0017619709067586678 0.0012460069125889636 0.0008847228995316152 0.0006269184999834658 0.00044466320001631935 0.0003274960299765939 0.0002867002807287315 0.00033999731898394 0.0005240339424709034 0.0007609761381989933 0.0012408721734380684 0.0023155029140805258 0.004379127580087879 0.007727115860575973 0.01335518657440019 0.024168342736126208 0.04358793167375025 0.06896977349167827 0.0870489735205125 0.0854511061047993 0.06795136304519563 0.04815204876374486 0.03380867422689519 0.024476616453336097 0.01767088697656698 0.012455354564246358 0.008851163896473153 0.006514726734788952 0.004852504630671362 0.003543537105845842 0.0025319910818477425 0.0017953659478324717 0.0012792562992190283 0.000920919445224078 0.0006636557209989238 0.0004781079751338952 0.00037963807815661444 0.0003957651850725568 0.0005506553884725067 0.0007619127265753577 0.0012087368131948237 0.0022044233453669157 0.004117426952608124 0.007172574512613115 0.011973630808074334 0.020422393654937348 0.03476091520282092 0.05321910300325957 0.06708402303583848 0.06795136304519563 0.05761291075195856 0.04456266870809132 0.03407391682098448 0.026250381929511915 0.019899013037081057 0.014864650915170589 0.011317929939732588 0.008851163896473162 0.0068840906035713195 0.00517290276608288 0.0037347489483499125 0.002613715989201993 0.0018108488201475654 0.0012775314669896056 0.0009232854720992009 0.0006692846682037818 0.0005052944369660909 0.00046335640422670457 0.0005832294783845791 0.0007465776724080134 0.001119149821558879 0.0019465698802292985 0.0035548620122397593 0.006144054076131452 0.00997725307515428 0.015933902304877862 0.025055637667848855 0.0363667313100634 0.04551782647970806 0.04815204876374487 0.044562668708091314 0.0384400990072735 0.03239910529167102 0.02687477562088644 0.02187832071983873 0.017840269655008244 0.014864650915170585 0.012455354564246362 0.010148692673302801 0.007869541377713715 0.005761950678317068 0.003986452395490247 0.0026549678017238876 0.0017735870623411738 0.0012310199292264704 0.0008835265101450307 0.0006561523056794514 0.0005519973573561696 0.0006197248184155347 0.0007313386636297358 0.0010183403054298294 0.001639618611632218 0.0028541081215028986 0.0048837020470039825 0.007878392384066561 0.01211317077765666 0.017865073506038158 0.024608649914735665 0.03055005990547198 0.03380867422689517 0.034073916820984464 0.03239910529167101 0.029813679189042683 0.02688893996048021 0.024131797236828952 0.02187832071983873 0.019899013037081054 0.01767088697656699 0.014947087410735698 0.01188921506922581 0.00883984502253302 0.006129708980026594 0.004001168929060434 0.0025357859259002307 0.0016351864912215134 0.0011094531117226143 0.0008015254916949671 0.0006423483931220735 0.0006368373327308829 0.0007038565058097171 0.0009190083262633708 0.0013560029677948074 0.002180842443607049 0.003610843325070009 0.005824229496243897 0.008910303039589451 0.012817265080276335 0.017197117076334992 0.02134049909786333 0.024476616453336097 0.02625038192951191 0.02687477562088643 0.026888939960480213 0.026820140023580068 0.026888939960480217 0.026874775620886436 0.026250381929511915 0.0244766164533361 0.021340499097863345 0.017197117076335 0.012817265080276342 0.008910303039589453 0.005824229496243896 0.0036108433250700168 0.0021808424436070483 0.0013560029677948046 0.0009190083262633717 0.0007038565058097149 0.0006197248184155346 0.0006423483931220761 0.0008015254916949667 0.0011094531117226164 0.0016351864912215143 0.0025357859259002202 0.004001168929060435 0.006129708980026589 0.008839845022533014 0.011889215069225797 0.014947087410735685 0.01767088697656698 0.01989901303708105 0.02187832071983872 0.024131797236828952 0.02688893996048021 0.02981367918904269 0.03239910529167102 0.03407391682098447 0.03380867422689519 0.030550059905471993 0.024608649914735676 0.017865073506038165 0.012113170777656666 0.007878392384066561 0.004883702047003989 0.0028541081215028978 0.0016396186116322154 0.001018340305429831 0.000731338663629734 0.0005832294783845787 0.0005519973573561727 0.0006561523056794511 0.0008835265101450324 0.0012310199292264712 0.0017735870623411638 0.002654967801723886 0.0039864523954902436 0.005761950678317063 0.007869541377713712 0.010148692673302788 0.01245535456424636 0.014864650915170585 0.017840269655008244 0.02187832071983873 0.02687477562088644 0.032399105291671025 0.03844009900727349 0.044562668708091314 0.04815204876374487 0.04551782647970808 0.0363667313100634 0.02505563766784886 0.015933902304877862 0.00997725307515428 0.0061440540761314565 0.0035548620122397576 0.0019465698802292955 0.0011191498215588802 0.0007465776724080115 0.0005506553884725064 0.0004633564042267083 0.0005052944369660916 0.0006692846682037828 0.0009232854720992024 0.001277531466989598 0.0018108488201475637 0.00261371598920199 0.003734748948349912 0.005172902766082881 0.0068840906035713125 0.008851163896473162 0.01131792993973259 0.01486465091517059 0.019899013037081064 0.02625038192951192 0.03407391682098448 0.04456266870809132 0.05761291075195857 0.06795136304519564 0.06708402303583849 0.05321910300325957 0.03476091520282093 0.020422393654937348 0.011973630808074336 0.007172574512613119 0.004117426952608121 0.002204423345366912 0.0012087368131948252 0.0007619127265753563 0.0005240339424709026 0.00039576518507255956 0.00037963807815661585 0.000478107975133894 0.0006636557209989251 0.0009209194452240723 0.001279256299219027 0.0017953659478324654 0.002531991081847744 0.00354353710584584 0.00485250463067136 0.006514726734788944 0.00885116389647316 0.012455354564246355 0.017670886976566987 0.024476616453336094 0.03380867422689519 0.04815204876374486 0.06795136304519563 0.08545110610479928 0.0870489735205125 0.06896977349167827 0.04358793167375026 0.024168342736126208 0.013355186574400192 0.0077271158605759765 0.0043791275800878745 0.0023155029140805223 0.0012408721734380687 0.0007609761381989912 0.0004837211007552427 0.0003399973189839411 0.00028670028072873434 0.00032749602997659075 0.00044466320001632006 0.0006269184999834666 0.0008847228995316145 0.0012460069125889589 0.0017619709067586717 0.002497811990922791 0.0035001160310624774 0.004852504630671348 0.006884090603571314 0.010148692673302788 0.01494708741073569 0.02134049909786334 0.03055005990547199 0.045517826479708076 0.06708402303583848 0.0870489735205125 0.09023345115385846 0.0718448186560118 0.04510783438860939 0.02460390221674716 0.013326033228026434 0.00759334889188484 0.004261837790878287 0.0022318845186097467 0.0011822360315786307 0.0007178665296542969 0.00041701622182258486 0.00028173929364136527 0.00021817936648991655 0.0002246388548763406 0.0002871615092159439 0.00040315658918495544 0.000583338631448998 0.0008408650019755401 0.0012099587610935269 0.0017465327290204897 0.0024978119909228004 0.003543537105845844 0.005172902766082885 0.007869541377713713 0.011889215069225807 0.017197117076334995 0.024608649914735683 0.03636673131006339 0.05321910300325958 0.06896977349167827 0.07184481865601179 0.057874007302206903 0.03709954904779631 0.020864596443750796 0.01166435972312249 0.006767615584404152 0.003804765825581192 0.0019821064539637754 0.0010447624265133985 0.0006296342986623039 0.00033609296454868096 0.0002203339374047324 0.0001660641990964923 0.00016213711920641568 0.00019395528069378936 0.0002636332621307638 0.00038445738581478506 0.000563273450642185 0.0008231909664002669 0.0012099587610935275 0.0017619709067586765 0.002531991081847741 0.0037347489483499138 0.005761950678317064 0.008839845022533016 0.012817265080276337 0.017865073506038165 0.02505563766784886 0.034760915202820916 0.04358793167375026 0.04510783438860939 0.03709954904779631 0.02500960208422867 0.015156039132763184 0.009110995346707665 0.005502479458646111 0.0031243262723721285 0.0016349871298253279 0.0008703087826223949 0.0005222137760460888 0.0002615690115628177 0.00016484178283184456 0.000125415447845086 0.00012304835269899108 0.00014055573155341686 0.0001825935571286043 0.0002627441367086569 0.00038392241691224087 0.0005632734506421904 0.0008408650019755488 0.0012460069125889688 0.0017953659478324737 0.002613715989201997 0.003986452395490247 0.006129708980026594 0.008910303039589451 0.012113170777656666 0.01593390230487786 0.020422393654937344 0.024168342736126208 0.024603902216747155 0.020864596443750806 0.015156039132763182 0.010128569135575997 0.006586079256877103 0.004111723142629162 0.002355939341597527 0.001260701811817081 0.0006969509137475145 0.000422236885219689 0.000199916239089537 0.00012021240778397906 0.00009202995412545907 0.00009092448574327907 0.00010089256600216104 0.00012770593467779297 0.0001817243025739935 0.00026274413670865306 0.00038445738581478945 0.000583338631449001 0.000884722899531625 0.0012792562992190188 0.0018108488201475717 0.002654967801723881 0.004001168929060434 0.005824229496243893 0.007878392384066563 0.009977253075154275 0.011973630808074332 0.013355186574400178 0.013326033228026432 0.011664359723122485 0.009110995346707658 0.006586079256877097 0.004478765621190837 0.00281755025593987 0.0016299924923527604 0.0009163199990738566 0.0005429488252746267 0.0003363917239214463 0.00014390693080603217 0.00008184139687993541 0.00006174356940784978 0.00006065687477902309 0.00006762487901667497 0.00008826731038415386 0.0001277059346777914 0.0001825935571285964 0.00026363326213076587 0.00040315658918494953 0.0006269184999834778 0.0009209194452240704 0.0012775314669896155 0.0017735870623411581 0.002535785925900228 0.0036108433250700103 0.004883702047003989 0.006144054076131453 0.007172574512613118 0.007727115860575966 0.0075933488918848374 0.00676761558440415 0.0055024794586461066 0.004111723142629157 0.0028175502559398672 0.001769815607257226 0.0010541703707617873 0.0006398426918513279 0.00040903351347927635 0.0002556769954001641 0.00009202672100430814 0.000049668293720322566 0.00003722540034797812 0.000038268184393992724 0.000046950126076286 0.0000676248790166784 0.00010089256600216112 0.00014055573155341463 0.00019395528069379226 0.00028716150921594873 0.00044466320001632163 0.0006636557209989277 0.0009232854720992041 0.001231019929226472 0.0016351864912215143 0.0021808424436070496 0.0028541081215029012 0.0035548620122397593 0.004117426952608124 0.004379127580087867 0.0042618377908782866 0.0038047658255811936 0.0031243262723721255 0.002355939341597523 0.001629992492352759 0.0010541703707617892 0.0006706709826168864 0.0004400928033043438 0.00029007418727425397 0.00017486743176161219 0.000051575019374039516 0.000028766629952463266 0.000023259926778897205 0.00002664251965620179 0.00003826818439399427 0.00006065687477902831 0.00009092448574328088 0.00012304835269899377 0.00016213711920641606 0.0002246388548763444 0.0003274960299765906 0.0004781079751339033 0.0006692846682037812 0.0008835265101450343 0.0011094531117226169 0.0013560029677948077 0.0016396186116322202 0.001946569880229301 0.0022044233453669126 0.0023155029140805236 0.0022318845186097484 0.001982106453963784 0.001634987129825329 0.0012607018118170833 0.0009163199990738587 0.0006398426918513316 0.0004400928033043455 0.0002965114623418765 0.00018588342694629063 0.0001029824808376757 0.000029077834577929602 0.00002071187565953922 0.000019165279029504448 0.000023259926778896233 0.00003722540034797889 0.00006174356940785098 0.00009202995412545945 0.00012541544784508196 0.000166064199096494 0.00021817936648991693 0.0002867002807287382 0.00037963807815661693 0.0005052944369660933 0.0006561523056794489 0.0008015254916949709 0.0009190083262633708 0.0010183403054298342 0.0011191498215588796 0.0012087368131948252 0.0012408721734380648 0.0011822360315786329 0.0010447624265134045 0.0008703087826223966 0.0006969509137475152 0.0005429488252746278 0.00040903351347927895 0.00029007418727425695 0.00018588342694629122 0.00010487748323797995 0.000053844133215542406 0.000022541579159481864 0.000020532050107830323 0.00002071187565953794 0.000028766629952461616 0.00004966829372032352 0.00008184139687993808 0.00012021240778397925 0.00016484178283184502 0.00022033393740473285 0.0002817392936413682 0.0003399973189839377 0.00039576518507256244 0.0004633564042267068 0.0005519973573561703 0.0006423483931220767 0.0007038565058097207 0.0007313386636297358 0.000746577672408016 0.0007619127265753565 0.0007609761381989931 0.0007178665296542961 0.0006296342986623114 0.0005222137760460883 0.0004222368852196862 0.00033639172392144537 0.00025567699540016224 0.0001748674317616121 0.00010298248083767284 0.0000538441332155389 0.000030180522486133568 0.000020168309059153175 0.000020434020735812537 0.000025213591859050597 0.00004158095417467053 0.0000700209689794562 0.00010639592520415245 0.00014926894555382202 0.0002010143453447938 0.00026156901156281637 0.0003213239699373918 0.0003688317936540826 0.000401410369553672 0.0004262350267254956 0.00044961097665089517 0.00046879496476522585 0.0004764957920562699 0.0004687949647652241 0.00044961097665089517 0.00042623502672549385 0.00040141036955367027 0.0003688317936540791 0.00032132396993738745 0.0002615690115628155 0.00020101434534479205 0.00014926894555382072 0.0001063959252041518 0.00007002096897945598 0.000041580954174672046 0.000025213591859050706 0.000020434020735813675 0.000020434020735814176 0.000025034130620914903 0.00004262943994523017 0.00007998449698244632 0.00013378777557353425 0.00019532748400063433 0.0002623235230572654 0.00033846068511081493 0.0004222368852196865 0.0005030317145494135 0.0005666602319166321 0.0006011759042085248 0.0006045988410517456 0.0005865215698875179 0.0005603349195352443 0.0005287625121494384 0.00048131016516047155 0.0004144589417778395 0.0003443313341783586 0.0002890580940773138 0.00024777767599728617 0.00020872672490351081 0.0001648417828318437 0.00012121774671322516 0.00008587912888930963 0.00005799357828135729 0.000036419779238968434 0.000022572177159267243 0.00001784863927513798 0.000019088382184325383 0.000025213591859051817 0.00004262943994523051 0.00008197322550826526 0.00014795151506899096 0.000232136255925519 0.000326448962953667 0.0004344545721148336 0.0005606707485081453 0.0006969509137475168 0.0008239745350408589 0.0009202033550585111 0.0009632349493911878 0.0009395915246891081 0.0008649531896832593 0.0007774910755573768 0.0006972250267069921 0.0006092634042455441 0.0004963521413852185 0.0003738581341875541 0.00027449300329203104 0.00020825311966694756 0.000162989502583307 0.00012541544784508405 0.00009202547110128884 0.00006383462345803368 0.000039472969414739195 0.000021744405128664364 0.000013352842787484985 0.000013239288145540043 0.000017848639275139158 0.00004158095417467264 0.00007998449698244772 0.0001479515150689918 0.0002452872893603469 0.00036629691993683066 0.000520216161796781 0.0007258660541463104 0.0009829449201744825 0.001260701811817085 0.0015115507963728606 0.001688052150227326 0.00174560593510576 0.0016589400069480294 0.001460434191919839 0.0012316737057361765 0.0010319639807374755 0.0008589568636188316 0.000683831623526777 0.0005042574172789162 0.0003495011941732627 0.00023964913362904187 0.00016905754840345962 0.0001230483526989912 0.0000898740742305677 0.00006124525023194466 0.000035082504194901806 0.000017393788614683787 0.000011059872777096343 0.000013352842787484547 0.000022572177159267897 0.0000700209689794561 0.000133787775573534 0.00023213625592551808 0.00036629691993682946 0.0005542117430241116 0.0008376501878464484 0.0012523497139305861 0.0017836111952503064 0.002355939341597528 0.002863405644151268 0.003200677769729535 0.003279908219514549 0.003067346428052681 0.002629389801695998 0.0021106035581529665 0.0016385034701410664 0.0012589495116249127 0.0009554476063526719 0.000701128008098073 0.0004883595058147472 0.000323874722129273 0.00021079146292320386 0.00014055573155341395 0.00009673607156472153 0.00006418578918286192 0.00003799095053560095 0.000021968432045007298 0.000017393788614684305 0.000021744405128663676 0.000036419779238969105 0.00010639592520415245 0.00019532748400063438 0.00032644896295366637 0.00052021616179678 0.0008376501878464485 0.0013573848039995448 0.002117562157211253 0.003075054390627012 0.004111723142629158 0.0050451035960170695 0.005648678265475143 0.005744944457247075 0.005320251868544281 0.004526188866547986 0.0035749591955013854 0.002654649680287482 0.0018950825958768778 0.0013428023934787107 0.0009614150171436423 0.0006808862036298993 0.000458027079866502 0.00029086213465636784 0.00018259355712859742 0.00011815501475325737 0.00007753218240796333 0.00005113278822131692 0.00003799095053560169 0.0000350825041949035 0.000039472969414739804 0.00005799357828135835 0.00014926894555382115 0.00026232352305726565 0.0004344545721148325 0.00072586605414631 0.0012523497139305866 0.0021175621572112535 0.0033352981097693685 0.004855050110277433 0.0065860792568770985 0.008248830730131534 0.009317982583385743 0.009383109611456556 0.008535272017550805 0.007194256015802473 0.005688885411737054 0.004192815454864294 0.002888371790448015 0.0019366624294627427 0.0013339424895266328 0.0009448983181505428 0.0006500135096252582 0.00041937212860091084 0.00026274413670865474 0.00016817518667788673 0.0001108953314996443 0.00007753218240796398 0.00006418578918286279 0.00006124525023194778 0.0000638346234580336 0.00008587912888931068 0.00020101434534479338 0.00033846068511081574 0.0005606707485081457 0.0009829449201744834 0.0017836111952503086 0.003075054390627014 0.004855050110277434 0.007181038655257922 0.010128569135575997 0.01323033090652455 0.015236007343764207 0.01514211100714846 0.013311339349175031 0.01088089061593668 0.008518072672587645 0.0062989439316914805 0.0043141216780064 0.0028151593946382837 0.0018731680166680688 0.001304421941949093 0.0009038676023293272 0.0005962452510613957 0.0003839224169122432 0.00025150280792624616 0.00016817518667788296 0.0001181550147532579 0.0000967360715647207 0.00008987407423056995 0.00009202547110128937 0.00012121774671322629 0.0002615690115628166 0.0004222368852196893 0.0006969509137475161 0.0012607018118170853 0.0023559393415975285 0.004111723142629159 0.006586079256877099 0.010128569135575997 0.015156039132763182 0.0208645964437508 0.02460390221674716 0.024168342736126214 0.020422393654937348 0.015933902304877866 0.012113170777656668 0.008910303039589455 0.0061297089800265965 0.003986452395490252 0.002613715989201994 0.0017953659478324717 0.0012460069125889658 0.0008408650019755462 0.0005632734506421914 0.00038392241691224217 0.0002627441367086527 0.00018259355712859515 0.0001405557315534144 0.00012304835269899314 0.0001254154478450819 0.00016484178283184407 0.0003213239699373895 0.0005030317145494138 0.0008239745350408566 0.0015115507963728587 0.002863405644151266 0.005045103596017066 0.008248830730131529 0.013230330906524547 0.020864596443750796 0.029954352756893635 0.036027717391526014 0.035232198896081986 0.02901729743471952 0.021833526348406386 0.016130953814403673 0.01176780821440097 0.008167517098673107 0.005391246813130984 0.0035767109487630294 0.0024757860587300484 0.0017395256062650293 0.0012060439533125777 0.0008408650019755473 0.0005962452510613989 0.0004193721286009096 0.00029086213465636627 0.00021079146292320297 0.00016905754840345822 0.00016298950258330637 0.00020872672490351044 0.0003688317936540802 0.0005666602319166303 0.000920203355058507 0.0016880521502273239 0.003200677769729532 0.00564867826547514 0.009317982583385741 0.015236007343764202 0.02460390221674715 0.03602771739152602 0.043882570046413404 0.04315798504401965 0.03552916848266973 0.02661953106469916 0.01961881131809789 0.014399348124765442 0.010179124463848834 0.0069231530735964315 0.004753920712825657 0.0033890596656994355 0.002441698447335644 0.00173952560626503 0.0012460069125889686 0.0009038676023293315 0.0006500135096252594 0.00045802707986649787 0.00032387472212927644 0.00023964913362904648 0.00020825311966694848 0.000247777675997289 0.00040141036955367195 0.0006011759042085242 0.0009632349493911886 0.0017456059351057603 0.0032799082195145474 0.005744944457247074 0.009383109611456554 0.015142111007148459 0.02416834273612621 0.03523219889608198 0.043157985044019645 0.04316919361830618 0.03654237041029714 0.028345846801708423 0.021600447001363186 0.016313578902386973 0.01189963200561258 0.008449495985470214 0.006103819007469914 0.0045486307953706345 0.003389059665699438 0.002475786058730052 0.0017953659478324763 0.0013044219419491008 0.0009448983181505444 0.0006808862036299049 0.000488359505814751 0.0003495011941732675 0.0002744930032920343 0.00028905809407731313 0.0004262350267254954 0.0006045988410517468 0.0009395915246891058 0.0016589400069480283 0.0030673464280526804 0.005320251868544278 0.008535272017550806 0.01331133934917503 0.020422393654937348 0.02901729743471952 0.03552916848266973 0.036542370410297134 0.032628634466063365 0.027043933065993456 0.021871898399191694 0.017291184098801107 0.013205451880473078 0.009966524346444053 0.007717583949283108 0.006103819007469919 0.004753920712825662 0.0035767109487630324 0.002613715989202001 0.0018731680166680733 0.0013339424895266372 0.0009614150171436411 0.0007011280080980777 0.0005042574172789213 0.0003738581341875577 0.000344331334178362 0.0004496109766508938 0.0005865215698875173 0.0008649531896832575 0.001460434191919838 0.002629389801695994 0.004526188866547979 0.007194256015802467 0.010880890615936677 0.01593390230487786 0.021833526348406376 0.026619531064699144 0.028345846801708423 0.027043933065993453 0.02420311060051783 0.020913217290195893 0.017497979483522698 0.014298536985646173 0.011780429057506368 0.009966524346444055 0.008449495985470219 0.006923153073596434 0.005391246813130986 0.003986452395490254 0.0028151593946382867 0.0019366624294627434 0.0013428023934787146 0.000955447606352671 0.0006838316235267752 0.0004963521413852182 0.0004144589417778366 0.0004687949647652256 0.0005603349195352479 0.0007774910755573754 0.001231673705736178 0.0021106035581529674 0.0035749591955013815 0.005688885411737054 0.008518072672587643 0.012113170777656668 0.016130953814403673 0.019618811318097888 0.021600447001363182 0.02187189839919169 0.02091321729019589 0.01926204335873081 0.017344440296077856 0.015606687393438871 0.014298536985646176 0.013205451880473082 0.01189963200561259 0.010179124463848839 0.00816751709867311 0.0061297089800266 0.004314121678006404 0.0028883717904480168 0.0018950825958768804 0.001258949511624914 0.0008589568636188339 0.0006092634042455455 0.00048131016516047404 0.00047649579205627003 0.0005287625121494397 0.000697225026706992 0.001031963980737477 0.0016385034701410658 0.0026546496802874785 0.004192815454864291 0.0062989439316914805 0.008910303039589455 0.011767808214400963 0.014399348124765433 0.016313578902386973 0.017291184098801107 0.017497979483522698 0.01734444029607786 0.01723676140359564 0.017344440296077856 0.0174979794835227 0.017291184098801114 0.016313578902386976 0.014399348124765444 0.011767808214400969 0.008910303039589458 0.006298943931691484 0.004192815454864291 0.0026546496802874846 0.0016385034701410666 0.0010319639807374753 0.0006972250267069939 0.0005287625121494369 0.00046879496476522585 0.00048131016516047724 0.0006092634042455441 0.0008589568636188352 0.0012589495116249135 0.0018950825958768734 0.002888371790448016 0.004314121678006399 0.0061297089800265965 0.008167517098673102 0.010179124463848829 0.011899632005612578 0.013205451880473075 0.01429853698564617 0.015606687393438871 0.017344440296077852 0.019262043358730812 0.020913217290195896 0.021871898399191698 0.021600447001363193 0.0196188113180979 0.016130953814403676 0.012113170777656671 0.008518072672587647 0.0056888854117370545 0.0035749591955013876 0.0021106035581529682 0.0012316737057361767 0.0007774910755573779 0.0005603349195352456 0.00044961097665089387 0.0004144589417778401 0.0004963521413852173 0.0006838316235267764 0.0009554476063526702 0.0013428023934787087 0.0019366624294627419 0.0028151593946382832 0.003986452395490249 0.00539124681313098 0.006923153073596423 0.008449495985470212 0.009966524346444048 0.011780429057506368 0.014298536985646175 0.017497979483522698 0.020913217290195896 0.02420311060051783 0.02704393306599346 0.028345846801708426 0.026619531064699154 0.02183352634840638 0.015933902304877866 0.01088089061593668 0.007194256015802468 0.004526188866547984 0.0026293898016959945 0.0014604341919198364 0.0008649531896832597 0.0005865215698875152 0.0004262350267254952 0.00034433133417836545 0.00037385813418755736 0.000504257417278922 0.0007011280080980773 0.0009614150171436365 0.0013339424895266359 0.0018731680166680707 0.0026137159892019968 0.0035767109487630285 0.0047539207128256536 0.006103819007469916 0.007717583949283103 0.009966524346444053 0.013205451880473078 0.01729118409880111 0.0218718983991917 0.027043933065993456 0.03262863446606337 0.03654237041029714 0.035529168482669744 0.029017297434719525 0.02042239365493735 0.013311339349175031 0.008535272017550806 0.0053202518685442814 0.0030673464280526795 0.0016589400069480266 0.0009395915246891076 0.0006045988410517448 0.00040141036955367124 0.00028905809407731573 0.00027449300329203435 0.0003495011941732668 0.0004883595058147506 0.0006808862036299019 0.0009448983181505436 0.0013044219419490973 0.001795365947832473 0.002475786058730046 0.003389059665699432 0.00454863079537063 0.0061038190074699135 0.00844949598547021 0.01189963200561258 0.01631357890238697 0.02160044700136319 0.02834584680170842 0.03654237041029714 0.04316919361830618 0.043157985044019645 0.03523219889608198 0.024168342736126208 0.015142111007148462 0.009383109611456553 0.005744944457247075 0.003279908219514545 0.0017456059351057584 0.0009632349493911897 0.0006011759042085218 0.00036883179365407905 0.00024777767599729056 0.00020825311966694946 0.00023964913362904496 0.0003238747221292762 0.0004580270798664981 0.0006500135096252593 0.0009038676023293299 0.0012460069125889686 0.0017395256062650256 0.0024416984473356433 0.003389059665699434 0.004753920712825657 0.006923153073596428 0.010179124463848834 0.01439934812476544 0.01961881131809789 0.02661953106469915 0.03552916848266974 0.04315798504401965 0.043882570046413404 0.03602771739152602 0.024603902216747152 0.015236007343764204 0.009317982583385741 0.005648678265475141 0.0032006777697295295 0.0016880521502273217 0.0009202033550585078 0.0005666602319166274 0.00032132396993738815 0.0002087267249035106 0.0001629895025833078 0.00016905754840345597 0.00021079146292320248 0.0002908621346563687 0.0004193721286009101 0.0005962452510613989 0.0008408650019755457 0.0012060439533125773 0.0017395256062650297 0.002475786058730053 0.0035767109487630355 0.005391246813130982 0.008167517098673109 0.011767808214400969 0.016130953814403676 0.02183352634840638 0.02901729743471953 0.03523219889608198 0.03602771739152602 0.029954352756893624 0.0208645964437508 0.013230330906524545 0.00824883073013153 0.005045103596017064 0.002863405644151263 0.001511550796372856 0.0008239745350408573 0.0005030317145494104 0.00026156901156281534 0.00016484178283184345 0.00012541544784508375 0.0001230483526989911 0.0001405557315534141 0.0001825935571285986 0.000262744136708654 0.00038392241691224277 0.0005632734506421927 0.0008408650019755453 0.0012460069125889675 0.0017953659478324735 0.0026137159892019976 0.0039864523954902505 0.006129708980026595 0.008910303039589455 0.012113170777656666 0.015933902304877862 0.02042239365493735 0.024168342736126214 0.024603902216747152 0.0208645964437508 0.015156039132763182 0.010128569135575999 0.0065860792568771 0.004111723142629159 0.0023559393415975255 0.001260701811817083 0.0006969509137475167 0.00042223688521968644 0.00020101434534479232 0.00012121774671322504 0.00009202547110129147 0.00008987407423056794 0.00009673607156472092 0.00011815501475326161 0.00016817518667788605 0.0002515028079262482 0.00038392241691224526 0.000596245251061398 0.0009038676023293329 0.0013044219419490997 0.001873168016668074 0.002815159394638284 0.004314121678006399 0.0062989439316914805 0.008518072672587643 0.010880890615936679 0.013311339349175031 0.015142111007148459 0.015236007343764199 0.013230330906524545 0.010128569135575995 0.007181038655257924 0.004855050110277434 0.0030750543906270123 0.0017836111952503066 0.0009829449201744817 0.0005606707485081462 0.00033846068511081336 0.0001492689455538203 0.00008587912888930897 0.00006383462345803566 0.00006124525023194591 0.0000641857891828629 0.0000775321824079673 0.0001108953314996491 0.00016817518667788597 0.0002627441367086583 0.00041937212860091106 0.0006500135096252648 0.0009448983181505474 0.0013339424895266409 0.0019366624294627406 0.0028883717904480168 0.00419281545486429 0.005688885411737055 0.007194256015802466 0.00853527201755081 0.009383109611456554 0.009317982583385741 0.008248830730131525 0.006586079256877099 0.004855050110277432 0.00333529810976937 0.0021175621572112526 0.0012523497139305853 0.0007258660541463092 0.00043445457211483324 0.000262323523057264 0.00010639592520415103 0.000057993578281355674 0.00003947296941474078 0.000035082504194901535 0.00003799095053560186 0.00005113278822132045 0.00007753218240796772 0.00011815501475325975 0.00018259355712860233 0.0002908621346563656 0.00045802707986650323 0.0006808862036298977 0.0009614150171436444 0.0013428023934787068 0.0018950825958768784 0.0026546496802874802 0.003574959195501385 0.004526188866547982 0.005320251868544281 0.0057449444572470745 0.005648678265475138 0.005045103596017064 0.004111723142629158 0.003075054390627013 0.0021175621572112535 0.0013573848039995441 0.0008376501878464467 0.0005202161617967795 0.0003264489629536666 0.0001953274840006328 0.00007002096897945438 0.000036419779238965934 0.000021744405128663717 0.000017393788614682086 0.000021968432045006695 0.000037990950535603204 0.00006418578918286425 0.0000967360715647213 0.0001405557315534133 0.00021079146292320232 0.00032387472212927764 0.0004883595058147543 0.0007011280080980803 0.0009554476063526689 0.0012589495116249148 0.0016385034701410677 0.0021106035581529665 0.0026293898016959954 0.003067346428052681 0.0032799082195145456 0.0032006777697295274 0.0028634056441512613 0.0023559393415975255 0.0017836111952503051 0.0012523497139305866 0.0008376501878464473 0.0005542117430241103 0.0003662969199368294 0.00023213625592551827 0.00013378777557353246 0.00004158095417467066 0.000022572177159264364 0.000013352842787483865 0.000011059872777093981 0.000017393788614682276 0.0000350825041949032 0.00006124525023194657 0.00008987407423056874 0.0001230483526989883 0.0001690575484034569 0.00023964913362904618 0.00034950119417326953 0.0005042574172789227 0.0006838316235267774 0.0008589568636188337 0.0010319639807374772 0.0012316737057361756 0.0014604341919198397 0.0016589400069480257 0.0017456059351057607 0.0016880521502273208 0.001511550796372858 0.0012607018118170837 0.000982944920174482 0.0007258660541463103 0.0005202161617967802 0.0003662969199368296 0.000245287289360347 0.00014795151506899145 0.00007998449698244612 0.000025213591859050512 0.000017848639275136234 0.000013239288145539521 0.000013352842787482997 0.000021744405128664123 0.00003947296941474061 0.00006383462345803578 0.00009202547110128992 0.00012541544784508304 0.0001629895025833065 0.00020825311966695483 0.0002744930032920344 0.0003738581341875619 0.0004963521413852159 0.0006092634042455441 0.0006972250267069895 0.0007774910755573756 0.0008649531896832586 0.0009395915246891051 0.0009632349493911862 0.0009202033550585051 0.0008239745350408556 0.0006969509137475148 0.0005606707485081441 0.00043445457211483307 0.0003264489629536658 0.00023213625592551825 0.00014795151506899162 0.00008197322550826497 0.00004262943994522971 0.000020434020735813438 0.00001908838218432321 0.000017848639275137545 0.000022572177159265153 0.000036419779238968014 0.0000579935782813576 0.00008587912888930997 0.00012121774671322557 0.0001648417828318415 0.00020872672490350978 0.00024777767599729137 0.0002890580940773153 0.0003443313341783633 0.0004144589417778375 0.00048131016516047393 0.0005287625121494373 0.0005603349195352446 0.0005865215698875153 0.0006045988410517417 0.0006011759042085197 0.0005666602319166268 0.00050303171454941 0.0004222368852196863 0.0003384606851108134 0.0002623235230572648 0.00019532748400063302 0.00013378777557353377 0.00007998449698244745 0.00004262943994523006 0.00002503413062091488 0.000017222828270285886 0.000017412833723630486 0.00002078145138842763 0.00003183885277159771 0.00005006992510114415 0.00007364236764164972 0.00010556425488906997 0.00014926894555382158 0.00019991623908953773 0.00024516722341408467 0.00027877854625726114 0.0003040176982251584 0.0003235039291855663 0.0003344107973057295 0.0003361344573057923 0.0003352029974325356 0.0003361344573057914 0.0003344107973057278 0.0003235039291855646 0.0003040176982251584 0.00027877854625725767 0.0002451672234140825 0.00019991623908953513 0.00014926894555381898 0.0001055642548890678 0.00007364236764164625 0.00005006992510114296 0.00003183885277159603 0.000020781451388425678 0.000017412833723629755 0.00001741283372363054 0.00001954853828186728 0.000031057107119733464 0.00005616002450131203 0.00009205475009134014 0.00013600659857995872 0.00019199258158379297 0.00026232352305726565 0.0003363917239214458 0.00039880592165459413 0.0004446288697689996 0.00047351329888212576 0.00047878926010504045 0.00045571802826237815 0.0004154374444783397 0.00037446751049341465 0.00033497429892343704 0.00028981639018622863 0.00024181346590353427 0.0002028904644140176 0.0001759200090281833 0.00015154206168441144 0.00012021240778397677 0.00008587912888930824 0.00005883925589510313 0.00004046369803590856 0.000027686800341346408 0.00001905348770761315 0.000016053898680695375 0.00001707603271819705 0.000020781451388426304 0.00003105710711973215 0.00005745686967779563 0.00010458020730616448 0.00016570616231837483 0.00023726111223035392 0.00032649751656326637 0.00043445457211483215 0.0005429488252746284 0.0006304765274554577 0.0006923623475488251 0.0007261632918973129 0.0007162791068696867 0.0006575346592259362 0.0005759894400297583 0.0004998642579464963 0.00042737201057619533 0.0003431122089624075 0.00025434264967279057 0.0001859994005038084 0.00014536777784027673 0.00011899803177516816 0.0000920299541254538 0.0000638346234580317 0.00004128492951896136 0.000024903658690914253 0.000014330775707502797 0.000009782308601450687 0.000011326048856829811 0.000016053898680695263 0.0000318388527715962 0.00005616002450131059 0.00010458020730616413 0.00018025469510182012 0.0002740329507050864 0.00038815661933966263 0.0005389628394804299 0.0007258660541463093 0.0009163199990738583 0.0010719536575662433 0.0011766546693540308 0.0012183841389811483 0.0011733734294710823 0.001044077037541587 0.000882832281948404 0.00074020303042441 0.0006161688271076281 0.0004844533228748211 0.00034716672433379297 0.0002365232571313332 0.00016697925239011696 0.0001243940374230868 0.00009092448574327661 0.00006124525023194545 0.00003721783122293056 0.000018803416857701477 0.000007592282948856761 0.0000048989126297168344 0.000009782308601450514 0.0000190534877076129 0.00005006992510114358 0.00009205475009133984 0.00016570616231837521 0.0002740329507050872 0.0004173103594153671 0.0006144342314509729 0.0008942164552661263 0.0012523497139305853 0.0016299924923527582 0.0019497470457856573 0.002157533096200789 0.002212953317850322 0.0020849230176929008 0.0018004153950183035 0.001459052724074077 0.0011543632072385783 0.0009066580400836058 0.0006895470735222088 0.0004921829205170313 0.00033287461528253725 0.00022295862859127475 0.00015107953004165353 0.00010089256600215549 0.00006418578918286242 0.00003797559959623122 0.000019767224592740566 0.000009281165063706064 0.000007592282948857939 0.000014330775707503199 0.00002768680034134704 0.00007364236764164693 0.00013600659857995623 0.00023726111223035235 0.00038815661933966155 0.0006144342314509711 0.0009616761756505689 0.00146822966664353 0.0021175621572112517 0.0028175502559398633 0.0034314450613520176 0.003824457020248541 0.0038961044023771447 0.0036190780350586122 0.0030756018951073505 0.0024284076200209318 0.0018268018963580788 0.0013400322643710202 0.0009682847789069717 0.0006872824206897174 0.0004755767626457441 0.00031852290143667363 0.00020537152754663816 0.000127705934677785 0.0000775321824079642 0.00004664162658576194 0.000028529167902094806 0.00001976722459274082 0.000018803416857702703 0.000024903658690915182 0.00004046369803590922 0.00010556425488906756 0.00019199258158379158 0.00032649751656326474 0.0005389628394804292 0.0008942164552661251 0.0014682296666435305 0.00229483269900705 0.0033352981097693676 0.004478765621190831 0.005522965993520515 0.006190457485260742 0.0062703106532279815 0.005769895370865569 0.004884730385322291 0.0038449800445795983 0.002834046611981741 0.001987585477664547 0.0013718781379051602 0.0009616996260649177 0.0006797234220084449 0.0004639337960051243 0.0002970360003487965 0.0001817243025739854 0.00011089533149964692 0.00006935526794947672 0.00004664162658576097 0.00003797559959623125 0.00003721783122293192 0.00004128492951896136 0.00005883925589510279 0.00014926894555381906 0.0002623235230572631 0.0004344545721148304 0.0007258660541463088 0.0012523497139305842 0.0021175621572112517 0.0033352981097693676 0.004855050110277432 0.006586079256877096 0.008248830730131523 0.009317982583385738 0.009383109611456547 0.008535272017550801 0.007194256015802466 0.005688885411737053 0.004192815454864289 0.002888371790448013 0.0019366624294627408 0.0013339424895266322 0.0009448983181505387 0.0006500135096252576 0.00041937212860090846 0.0002627441367086521 0.00016817518667788575 0.0001108953314996463 0.00007753218240796382 0.0000641857891828621 0.0000612452502319456 0.00006383462345803224 0.00008587912888930779 0.0001999162390895352 0.00033639172392144407 0.0005429488252746271 0.0009163199990738591 0.001629992492352759 0.0028175502559398655 0.004478765621190833 0.006586079256877098 0.009110995346707654 0.01166435972312248 0.013326033228026422 0.01335518657440018 0.011973630808074325 0.009977253075154277 0.007878392384066558 0.005824229496243893 0.0040011689290604295 0.0026549678017238833 0.00181084882014756 0.0012792562992190223 0.0008847228995316136 0.0005833386314489975 0.00038445738581478295 0.00026274413670865533 0.0001817243025739889 0.00012770593467778613 0.0001008925660021591 0.00009092448574328033 0.00009202995412545518 0.00012021240778397717 0.00024516722341408163 0.00039880592165459305 0.0006304765274554567 0.0010719536575662443 0.0019497470457856584 0.0034314450613520194 0.005522965993520518 0.008248830730131529 0.011664359723122478 0.015258430610257584 0.017646077493263027 0.01767499640965904 0.015692722152502867 0.01293809227892026 0.010174247183974276 0.007546972735349727 0.005225728102749305 0.0035046384072238567 0.0024198593746372126 0.0017314033525384065 0.0012208498047827992 0.0008364038989139974 0.0005833386314489984 0.000419372128600914 0.00029703600034880007 0.0002053715275466406 0.00015107953004165492 0.0001243940374230888 0.00011899803177516921 0.0001515420616844104 0.0002787785462572576 0.00044462886976899866 0.0006923623475488227 0.0011766546693540315 0.00215753309620079 0.0038244570202485427 0.0061904574852607456 0.009317982583385743 0.013326033228026427 0.017646077493263038 0.020611122010000125 0.020780306627006535 0.01852265778312245 0.015326377141967934 0.012128142883813996 0.009106667450547145 0.006443731463249305 0.004462883841154414 0.0031929167216776413 0.0023548311695479256 0.0017124336763814864 0.0012208498047828037 0.0008847228995316179 0.0006500135096252637 0.00046393379600513017 0.0003185229014366768 0.00022295862859127966 0.00016697925239012162 0.00014536777784027714 0.0001759200090281842 0.0003040176982251567 0.00047351329888212446 0.000726163291897313 0.0012183841389811511 0.0022129533178503248 0.0038961044023771486 0.006270310653227987 0.009383109611456554 0.013355186574400189 0.017674996409659048 0.02078030662700654 0.02125963297086544 0.019358270366481183 0.016410606487398914 0.013300080450640446 0.010250489182735955 0.007517489748370421 0.005460917229675773 0.004098860343354647 0.0031372780911037685 0.0023548311695479325 0.0017314033525384165 0.0012792562992190314 0.0009448983181505491 0.0006797234220084513 0.00047557676264575115 0.00033287461528254034 0.0002365232571313371 0.00018599940050381046 0.00020289046441401718 0.00032350392918556415 0.000478789260105039 0.000716279106869685 0.0011733734294710834 0.002084923017692904 0.0036190780350586144 0.005769895370865575 0.008535272017550808 0.011973630808074336 0.01569272215250288 0.01852265778312246 0.019358270366481186 0.0182594250735667 0.016108051723821834 0.013543651521091854 0.01083412663782937 0.008340585241485121 0.0064390664767518735 0.0051211323279841256 0.00409886034335465 0.0031929167216776513 0.002419859374637221 0.0018108488201475689 0.0013339424895266413 0.0009616996260649247 0.0006872824206897221 0.0004921829205170362 0.0003471667243337981 0.0002543426496727922 0.00024181346590353435 0.00033441079730572745 0.0004557180282623761 0.000657534659225935 0.0010440770375415864 0.0018004153950183037 0.00307560189510735 0.004884730385322293 0.00719425601580247 0.00997725307515428 0.012938092278920264 0.015326377141967936 0.01641060648739892 0.016108051723821834 0.014842004087681639 0.013006136920165742 0.01091608195421444 0.008986628223726749 0.00752178351846932 0.006439066476751877 0.005460917229675777 0.004462883841154422 0.003504638407223864 0.0026549678017238902 0.0019366624294627475 0.001371878137905165 0.0009682847789069772 0.0006895470735222111 0.0004844533228748221 0.00034311220896240854 0.0002898163901862272 0.0003361344573057902 0.0004154374444783388 0.000575989440029754 0.0008828322819484026 0.0014590527240740782 0.00242840762002093 0.0038449800445796004 0.0056888854117370545 0.007878392384066561 0.01017424718397428 0.012128142883814001 0.013300080450640447 0.013543651521091854 0.013006136920165744 0.011961891930324674 0.010754562411234783 0.009724646432491057 0.008986628223726752 0.008340585241485125 0.007517489748370426 0.006443731463249314 0.005225728102749314 0.004001168929060437 0.0028883717904480207 0.001987585477664552 0.0013400322643710243 0.0009066580400836078 0.0006161688271076291 0.0004273720105761963 0.0003349742989234356 0.00033520299743253527 0.00037446751049341443 0.0004998642579464945 0.0007402030304244087 0.001154363207238578 0.0018268018963580788 0.002834046611981743 0.004192815454864293 0.005824229496243897 0.007546972735349728 0.009106667450547147 0.010250489182735958 0.010834126637829372 0.010916081954214441 0.010754562411234785 0.010655259614595913 0.010754562411234785 0.010916081954214438 0.010834126637829372 0.010250489182735956 0.00910666745054715 0.00754697273534973 0.005824229496243899 0.004192815454864295 0.0028340466119817446 0.0018268018963580827 0.0011543632072385786 0.0007402030304244102 0.0004998642579464966 0.00037446751049341394 0.00033613445730579125 0.00033497429892343693 0.00042737201057619484 0.0006161688271076273 0.000906658040083607 0.0013400322643710198 0.00198758547766455 0.002888371790448017 0.004001168929060434 0.005225728102749307 0.006443731463249307 0.007517489748370423 0.008340585241485125 0.008986628223726752 0.00972464643249106 0.010754562411234783 0.011961891930324674 0.013006136920165742 0.013543651521091852 0.013300080450640446 0.012128142883814001 0.01017424718397428 0.007878392384066563 0.005688885411737056 0.0038449800445796026 0.002428407620020934 0.0014590527240740782 0.0008828322819484041 0.0005759894400297565 0.0004154374444783391 0.0003344107973057291 0.0002898163901862293 0.00034311220896240756 0.0004844533228748201 0.0006895470735222095 0.0009682847789069736 0.0013718781379051625 0.0019366624294627447 0.0026549678017238868 0.0035046384072238575 0.0044628838411544134 0.005460917229675774 0.0064390664767518735 0.007521783518469321 0.008986628223726754 0.010916081954214441 0.013006136920165744 0.014842004087681637 0.016108051723821838 0.016410606487398914 0.015326377141967933 0.012938092278920258 0.00997725307515428 0.007194256015802472 0.004884730385322294 0.0030756018951073535 0.0018004153950183035 0.0010440770375415875 0.0006575346592259378 0.000455718028262377 0.000323503929185566 0.00024181346590353682 0.0002543426496727918 0.0003471667243337961 0.0004921829205170345 0.0006872824206897192 0.0009616996260649229 0.0013339424895266396 0.0018108488201475656 0.002419859374637217 0.0031929167216776435 0.00409886034335465 0.005121132327984124 0.006439066476751879 0.00834058524148513 0.010834126637829376 0.013543651521091857 0.016108051723821838 0.0182594250735667 0.019358270366481183 0.018522657783122457 0.015692722152502878 0.011973630808074336 0.008535272017550808 0.005769895370865576 0.0036190780350586174 0.0020849230176929034 0.0011733734294710843 0.0007162791068696877 0.0004787892601050401 0.00030401769822515826 0.00020289046441401945 0.00018599940050381062 0.00023652325713133463 0.0003328746152825388 0.0004755767626457488 0.0006797234220084503 0.0009448983181505478 0.001279256299219031 0.0017314033525384132 0.002354831169547931 0.00313727809110377 0.004098860343354652 0.005460917229675778 0.007517489748370429 0.01025048918273596 0.013300080450640451 0.01641060648739892 0.01935827036648119 0.021259632970865444 0.02078030662700654 0.017674996409659048 0.013355186574400192 0.009383109611456556 0.0062703106532279885 0.0038961044023771508 0.002212953317850324 0.0012183841389811513 0.0007261632918973152 0.0004735132988821253 0.00027877854625725913 0.00017592000902818609 0.00014536777784027817 0.0001669792523901193 0.00022295862859127827 0.00031852290143667645 0.00046393379600513017 0.0006500135096252643 0.0008847228995316224 0.0012208498047828061 0.001712433676381494 0.0023548311695479355 0.003192916721677651 0.004462883841154422 0.006443731463249314 0.009106667450547152 0.012128142883814004 0.015326377141967941 0.018522657783122464 0.020780306627006546 0.020611122010000135 0.017646077493263045 0.013326033228026434 0.009317982583385747 0.006190457485260749 0.0038244570202485453 0.00215753309620079 0.0011766546693540317 0.0006923623475488246 0.00044462886976899915 0.00024516722341408277 0.0001515420616844115 0.00011899803177517033 0.00012439403742308644 0.00015107953004165348 0.00020537152754664153 0.00029703600034880083 0.00041937212860091675 0.000583338631449006 0.0008364038989140085 0.0012208498047828126 0.0017314033525384236 0.002419859374637228 0.003504638407223867 0.005225728102749317 0.007546972735349733 0.010174247183974286 0.012938092278920267 0.015692722152502888 0.017674996409659055 0.017646077493263048 0.015258430610257596 0.01166435972312249 0.00824883073013153 0.005522965993520521 0.0034314450613520202 0.0019497470457856578 0.0010719536575662435 0.0006304765274554578 0.00039880592165459283 0.00019991623908953646 0.00012021240778397814 0.00009202995412545693 0.00009092448574327846 0.00010089256600215806 0.0001277059346777878 0.00018172430257398998 0.000262744136708659 0.0003844573858147929 0.000583338631449007 0.0008847228995316277 0.0012792562992190383 0.0018108488201475734 0.0026549678017238937 0.00400116892906044 0.005824229496243902 0.007878392384066565 0.009977253075154287 0.011973630808074343 0.0133551865744002 0.013326033228026439 0.011664359723122495 0.009110995346707665 0.006586079256877103 0.004478765621190837 0.0028175502559398677 0.0016299924923527586 0.0009163199990738587 0.0005429488252746277 0.00033639172392144407 0.00014926894555382025 0.00008587912888930866 0.0000638346234580342 0.00006124525023194427 0.00006418578918286168 0.00007753218240796608 0.00011089533149964805 0.00016817518667788982 0.0002627441367086608 0.0004193721286009198 0.000650013509625272 0.0009448983181505545 0.0013339424895266465 0.0019366624294627505 0.0028883717904480237 0.004192815454864296 0.00568888541173706 0.007194256015802474 0.008535272017550815 0.009383109611456563 0.00931798258338575 0.008248830730131537 0.006586079256877104 0.004855050110277435 0.00333529810976937 0.0021175621572112526 0.0012523497139305835 0.000725866054146308 0.0004344545721148306 0.00026232352305726315 0.0001055642548890692 0.0000588392558951041 0.00004128492951896402 0.0000372178312229316 0.00003797559959623187 0.000046641626585763075 0.00006935526794947877 0.00011089533149964947 0.00018172430257399502 0.00029703600034880484 0.00046393379600513873 0.000679723422008455 0.0009616996260649308 0.0013718781379051673 0.001987585477664556 0.0028340466119817468 0.003844980044579606 0.004884730385322296 0.005769895370865581 0.006270310653227993 0.006190457485260754 0.005522965993520526 0.004478765621190838 0.003335298109769368 0.0022948326990070516 0.0014682296666435302 0.0008942164552661252 0.0005389628394804287 0.0003264975165632648 0.00019199258158379223 0.0000736423676416483 0.000040463698035910346 0.000024903658690918004 0.000018803416857703442 0.000019767224592742244 0.00002852916790209723 0.000046641626585764024 0.00007753218240796605 0.00012770593467779286 0.00020537152754664247 0.00031852290143668366 0.00047557676264575147 0.0006872824206897251 0.0009682847789069757 0.0013400322643710254 0.001826801896358082 0.002428407620020936 0.0030756018951073535 0.00361907803505862 0.0038961044023771547 0.0038244570202485466 0.0034314450613520246 0.002817550255939868 0.0021175621572112513 0.0014682296666435302 0.0009616761756505678 0.0006144342314509709 0.0003881566193396608 0.00023726111223035202 0.00013600659857995677 0.00005006992510114477 0.000027686800341348234 0.000014330775707506021 0.00000759228294885953 0.000009281165063707765 0.000019767224592743528 0.00003797559959623296 0.00006418578918286421 0.00010089256600216211 0.00015107953004165752 0.00022295862859128318 0.0003328746152825439 0.0004921829205170385 0.0006895470735222133 0.0009066580400836101 0.0011543632072385796 0.0014590527240740797 0.001800415395018306 0.0020849230176929055 0.0022129533178503282 0.002157533096200793 0.001949747045785661 0.0016299924923527604 0.0012523497139305835 0.000894216455266126 0.0006144342314509711 0.00041731035941536666 0.00027403295070508655 0.00016570616231837456 0.00009205475009134033 0.00003183885277159699 0.000019053487707613934 0.000009782308601453122 0.0000048989126297187724 0.000007592282948858844 0.00001880341685770488 0.00003721783122293279 0.00006124525023194656 0.00009092448574328202 0.0001243940374230898 0.0001669792523901237 0.00023652325713133972 0.00034716672433379893 0.00048445332287482375 0.00061616882710763 0.0007402030304244115 0.0008828322819484036 0.0010440770375415886 0.0011733734294710847 0.0012183841389811548 0.0011766546693540317 0.0010719536575662465 0.0009163199990738592 0.0007258660541463075 0.0005389628394804289 0.00038815661933966057 0.0002740329507050858 0.00018025469510181923 0.0001045802073061631 0.00005616002450131068 0.000020781451388427067 0.00001605389868069649 0.000011326048856832537 0.000009782308601452995 0.000014330775707505047 0.000024903658690918062 0.00004128492951896458 0.00006383462345803447 0.0000920299541254592 0.00011899803177517022 0.00014536777784028017 0.00018599940050380954 0.00025434264967279425 0.00034311220896240615 0.00042737201057619674 0.0004998642579464946 0.0005759894400297556 0.0006575346592259354 0.0007162791068696861 0.000726163291897314 0.0006923623475488232 0.0006304765274554592 0.0005429488252746275 0.0004344545721148302 0.0003264975165632651 0.00023726111223035173 0.0001657061623183743 0.00010458020730616368 0.000057456869677794515 0.00003105710711973228 0.000017412833723630988 0.00001707603271819813 0.000016053898680697794 0.000019053487707615133 0.000027686800341348376 0.00004046369803591219 0.00005883925589510555 0.00008587912888931041 0.0001202124077839796 0.00015154206168441252 0.00017592000902818733 0.00020289046441401926 0.0002418134659035367 0.0002898163901862289 0.0003349742989234369 0.00037446751049341427 0.0004154374444783395 0.00045571802826237587 0.00047878926010503866 0.00047351329888212505 0.0004446288697689967 0.0003988059216545925 0.0003363917239214433 0.000262323523057262 0.00019199258158379196 0.0001360065985799558 0.00009205475009133973 0.000056160024501310856 0.00003105710711973203 0.00001954853828186702 0.000009565617953678985 0.000010512830864501234 0.000014781998225036654 0.000023945460612413 0.000036345916316917165 0.00005142955062686027 0.00007364236764164712 0.00010639592520414898 0.0001439069308060291 0.00017526872371932982 0.00019823253447444691 0.00021814488333107103 0.00023414234946933987 0.00023864228845880357 0.00023234710462510235 0.0002276846954364629 0.00023234710462510192 0.0002386422884588014 0.00023414234946933597 0.00021814488333106712 0.0001982325344744443 0.00017526872371932678 0.00014390693080602868 0.00010639592520414877 0.00007364236764164798 0.000051429550626859726 0.00003634591631691749 0.00002394546061241289 0.000014781998225036355 0.000010512830864500963 0.000010512830864501036 0.000012999980140398885 0.000022238587657550093 0.00003976068444587589 0.00006284740975602294 0.00009243873198667838 0.00013600659857995585 0.00019532748400062996 0.00025567699540015784 0.0003003899004650737 0.00033140131162270805 0.00035604221904844067 0.00036504846722240826 0.0003440034197444269 0.00030060001191083906 0.0002578894038511489 0.00022539912279093314 0.00019570183389348462 0.00016417085279852 0.00013719159990130444 0.000118967743476437 0.00010322000910759203 0.00008184139687993089 0.00005799357828135432 0.00004046369803591065 0.00003005028381015951 0.000022426327257490928 0.000015486976475089955 0.000011415154720125809 0.000010520403821836184 0.000014781998225036477 0.000022238587657550286 0.00004136804712597268 0.00007448828453249503 0.00011594604344947278 0.00016665216540789532 0.0002372611122303509 0.00032644896295366165 0.00040903351347927396 0.00046332858412138645 0.0004984623059909905 0.0005270594962774771 0.0005328767055493041 0.0004938311102070539 0.0004227198059680322 0.00035198131564532695 0.00029156831156405507 0.0002307361856879123 0.0001697548150774713 0.00012413553643969693 0.00009890637973825854 0.00008236911364063511 0.00006174356940784354 0.00003947296941473584 0.000024903658690916327 0.000017165388517281 0.000011558312453097888 0.00000743690503609951 0.000007875181309263721 0.000011415154720126014 0.000023945460612412997 0.00003976068444587614 0.00007448828453249484 0.00013093515947900196 0.00019913240892331261 0.0002798504780587137 0.00038815661933965857 0.0005202161617967755 0.0006398426918513259 0.0007181879547709639 0.0007669655867827645 0.0008006309005604024 0.0007970905713095698 0.0007311047369061571 0.0006246264787304537 0.0005209896395607567 0.00042942899124734054 0.00033243221307557543 0.00023267207177716208 0.00015654031394054298 0.00011318982875864121 0.00008687310358683295 0.0000606568747790176 0.00003508250419489705 0.000018803416857701694 0.0000103858531954846 0.000005160683492610259 0.000003120193983496586 0.000007436905036099254 0.00001548697647509013 0.000036345916316917395 0.00006284740975602353 0.00011594604344947263 0.00019913240892331261 0.0003036257116541288 0.0004349316528370981 0.0006144342314509674 0.0008376501878464422 0.001054170370761782 0.0012147289412613553 0.0013149137141692056 0.001357619312193837 0.0013144301327347907 0.001170272483470393 0.000973651085759568 0.0007900615193276598 0.0006333943940810099 0.0004810140756292361 0.0003328103516603664 0.00021758712571748312 0.00014673972099953127 0.00010310204404457717 0.00006762487901666569 0.0000379909505355954 0.000019767224592738866 0.000010657684006566407 0.00000577071719943569 0.000005160683492610622 0.00001155831245309771 0.000022426327257491175 0.00005142955062686024 0.00009243873198667886 0.00016665216540789513 0.00027985047805871355 0.0004349316528370981 0.0006521197197017316 0.0009616761756505626 0.0013573848039995383 0.0017698156072572181 0.002110820674846313 0.0023263946674731383 0.0023815163812629966 0.002244272959114228 0.0019355668732131568 0.0015553507761918548 0.0012072437313161207 0.0009228985548071619 0.0006826700179281655 0.0004765515140829118 0.0003177350737324053 0.00021069153291212634 0.00013978608385999667 0.00008826731038414147 0.00005113278822131277 0.00002852916790209258 0.00001658321203835733 0.00001065768400656792 0.000010385853195486275 0.000017165388517281853 0.00003005028381016026 0.00007364236764164766 0.00013600659857995688 0.00023726111223035118 0.00038815661933965884 0.0006144342314509684 0.0009616761756505632 0.001468229666643525 0.0021175621572112474 0.002817550255939862 0.0034314450613520168 0.0038244570202485392 0.0038961044023771456 0.0036190780350586114 0.003075601895107348 0.002428407620020926 0.001826801896358075 0.0013400322643710154 0.0009682847789069693 0.0006872824206897105 0.00047557676264573797 0.0003185229014366626 0.0002053715275466303 0.0001277059346777788 0.00007753218240795925 0.00004664162658575797 0.00002852916790209323 0.000019767224592740868 0.000018803416857703425 0.000024903658690916534 0.00004046369803591107 0.00010639592520414919 0.00019532748400063096 0.0003264489629536623 0.000520216161796776 0.000837650187846443 0.0013573848039995387 0.002117562157211248 0.0030750543906270084 0.004111723142629155 0.005045103596017063 0.005648678265475138 0.005744944457247073 0.005320251868544279 0.0045261888665479805 0.003574959195501383 0.002654649680287479 0.0018950825958768739 0.0013428023934787066 0.0009614150171436316 0.000680886203629893 0.0004580270798664877 0.00029086213465635727 0.00018259355712859038 0.0001181550147532549 0.00007753218240796014 0.000051132788221314076 0.000037990950535597546 0.00003508250419489921 0.000039472969414736796 0.000057993578281355024 0.00014390693080602897 0.0002556769954001598 0.0004090335134792749 0.0006398426918513267 0.0010541703707617842 0.001769815607257219 0.002817550255939863 0.004111723142629155 0.005502479458646105 0.006767615584404148 0.007593348891884834 0.007727115860575973 0.007172574512613116 0.006144054076131456 0.004883702047003986 0.0036108433250700124 0.0025357859259002233 0.0017735870623411646 0.0012775314669895943 0.0009209194452240633 0.0006269184999834547 0.0004031565891849417 0.0002636332621307518 0.00018259355712859363 0.0001277059346777822 0.00008826731038414429 0.00006762487901666965 0.000060656874779020776 0.0000617435694078442 0.0000818413968799322 0.00017526872371932795 0.0003003899004650731 0.00046332858412138564 0.0007181879547709638 0.0012147289412613553 0.0021108206748463136 0.0034314450613520163 0.005045103596017064 0.006767615584404147 0.008343439782146933 0.009386166372071897 0.009578011906467704 0.008932914694551073 0.00771043317878115 0.006171924531510287 0.004570037806178959 0.003201956733093727 0.0022502321078609693 0.0016519263713297707 0.0012246577971138572 0.0008625415369535906 0.000581760372925606 0.00040315658918494796 0.0002908621346563656 0.00020537152754663627 0.00013978608386000285 0.00010310204404458158 0.00008687310358683629 0.00008236911364063748 0.00010322000910759289 0.0001982325344744447 0.00033140131162270653 0.0004984623059909896 0.0007669655867827643 0.0013149137141692069 0.0023263946674731387 0.00382445702024854 0.005648678265475139 0.007593348891884834 0.0093861663720719 0.010602809983184984 0.010884820552833413 0.010237380254440176 0.008929833570272596 0.007230885503687015 0.005425288999380865 0.0038771846297218173 0.002810080016190194 0.0021391237296633707 0.001643451089220695 0.001208612083667406 0.0008625415369535991 0.0006269184999834667 0.0004580270798664992 0.00031852290143667266 0.00021069153291213303 0.0001467397209995372 0.00011318982875864602 0.00009890637973825984 0.0001189677434764377 0.00021814488333106864 0.0003560422190484393 0.0005270594962774771 0.0008006309005604024 0.001357619312193838 0.0023815163812629966 0.003896104402377147 0.005744944457247074 0.007727115860575973 0.009578011906467702 0.010884820552833411 0.01128723236071913 0.010762009478327436 0.009543175734881951 0.007885851634352308 0.006089358996347638 0.004537419787465309 0.003453012634116636 0.0027352573802774567 0.0021621361682891234 0.0016434510892207046 0.0012246577971138735 0.0009209194452240801 0.000680886203629907 0.00047557676264574746 0.00031773507373241425 0.00021758712571749 0.0001565403139405475 0.0001241355364397 0.00013719159990130593 0.00023414234946933691 0.00036504846722240663 0.0005328767055493022 0.0007970905713095687 0.0013144301327347916 0.0022442729591142284 0.003619078035058613 0.005320251868544279 0.007172574512613116 0.008932914694551073 0.010237380254440178 0.010762009478327436 0.010451266211617061 0.009473934063312553 0.00805326866256104 0.006480340695556078 0.005105322245516997 0.0041071301072263975 0.0033781442189325345 0.002735257380277466 0.0021391237296633867 0.0016519263713297876 0.00127753146698961 0.0009614150171436439 0.0006872824206897194 0.0004765515140829171 0.00033281035166037146 0.00023267207177716544 0.0001697548150774733 0.00016417085279852117 0.00023864228845880172 0.00034400341974442504 0.0004938311102070529 0.0007311047369061561 0.001170272483470393 0.0019355668732131562 0.003075601895107347 0.0045261888665479805 0.006144054076131453 0.007710433178781145 0.00892983357027259 0.00954317573488195 0.009473934063312551 0.008819247828205529 0.0077652715844282435 0.0065805791958524875 0.005545206054145701 0.004760328317029651 0.0041071301072264045 0.0034530126341166486 0.00281008001619021 0.0022502321078609845 0.0017735870623411772 0.0013428023934787166 0.0009682847789069743 0.0006826700179281708 0.0004810140756292392 0.00033243221307557695 0.00023073618568791366 0.0001957018338934844 0.0002323471046251019 0.0003006000119108395 0.0004227198059680323 0.0006246264787304535 0.0009736510857595694 0.0015553507761918548 0.002428407620020928 0.0035749591955013824 0.004883702047003985 0.006171924531510283 0.007230885503687011 0.007885851634352303 0.008053268662561034 0.007765271584428242 0.007171889765094903 0.006507829512702053 0.005963646198878785 0.005545206054145706 0.005105322245517006 0.004537419787465323 0.003877184629721832 0.00320195673309374 0.0025357859259002333 0.0018950825958768814 0.0013400322643710204 0.0009228985548071656 0.0006333943940810126 0.0004294289912473419 0.00029156831156405475 0.00022539912279093363 0.00022768469543646373 0.0002578894038511497 0.00035198131564532825 0.0005209896395607571 0.0007900615193276615 0.0012072437313161224 0.0018268018963580766 0.00265464968028748 0.003610843325070011 0.004570037806178954 0.005425288999380858 0.0060893589963476324 0.006480340695556072 0.006580579195852484 0.006507829512702052 0.006452482316727426 0.006507829512702057 0.0065805791958524935 0.006480340695556089 0.006089358996347651 0.005425288999380877 0.004570037806178968 0.0036108433250700202 0.0026546496802874846 0.0018268018963580788 0.0012072437313161242 0.0007900615193276608 0.0005209896395607571 0.00035198131564532814 0.0002578894038511489 0.00023234710462510268 0.00022539912279093526 0.00029156831156405567 0.0004294289912473422 0.0006333943940810134 0.0009228985548071641 0.0013400322643710187 0.001895082595876876 0.0025357859259002233 0.003201956733093722 0.003877184629721811 0.004537419787465301 0.005105322245516989 0.005545206054145696 0.005963646198878782 0.006507829512702054 0.007171889765094908 0.007765271584428251 0.00805326866256105 0.00788585163435232 0.007230885503687027 0.006171924531510296 0.004883702047003993 0.0035749591955013876 0.00242840762002093 0.0015553507761918567 0.000973651085759569 0.0006246264787304538 0.0004227198059680327 0.00030060001191083944 0.00023864228845880308 0.00019570183389348682 0.00023073618568791523 0.00033243221307557765 0.00048101407562923994 0.0006826700179281697 0.0009682847789069729 0.0013428023934787122 0.0017735870623411662 0.0022502321078609654 0.002810080016190186 0.0034530126341166256 0.004107130107226387 0.004760328317029643 0.0055452060541457005 0.006580579195852489 0.0077652715844282495 0.008819247828205536 0.009473934063312563 0.009543175734881962 0.008929833570272603 0.007710433178781155 0.00614405407613146 0.004526188866547984 0.0030756018951073488 0.0019355668732131573 0.0011702724834703926 0.0007311047369061564 0.0004938311102070537 0.0003440034197444256 0.00023414234946933846 0.00016417085279852399 0.00016975481507747544 0.00023267207177716606 0.00033281035166037205 0.0004765515140829167 0.0006872824206897184 0.0009614150171436401 0.0012775314669896006 0.0016519263713297716 0.0021391237296633655 0.0027352573802774476 0.003378144218932523 0.004107130107226394 0.005105322245517 0.006480340695556083 0.008053268662561047 0.009473934063312562 0.010451266211617074 0.010762009478327445 0.010237380254440187 0.00893291469455108 0.007172574512613121 0.005320251868544281 0.003619078035058614 0.002244272959114229 0.0013144301327347905 0.0007970905713095687 0.0005328767055493031 0.00036504846722240733 0.00021814488333106983 0.0001371915999013084 0.00012413553643970216 0.0001565403139405476 0.00021758712571749042 0.000317735073732414 0.0004755767626457474 0.0006808862036299053 0.0009209194452240764 0.0012246577971138646 0.0016434510892206948 0.0021621361682891155 0.0027352573802774545 0.003453012634116637 0.004537419787465314 0.006089358996347643 0.007885851634352315 0.009543175734881958 0.010762009478327445 0.011287232360719136 0.01088482055283342 0.009578011906467707 0.0077271158605759765 0.005744944457247075 0.0038961044023771464 0.0023815163812629966 0.0013576193121938368 0.0008006309005604017 0.0005270594962774774 0.0003560422190484397 0.00019823253447444559 0.00011896774347643954 0.00009890637973826207 0.00011318982875864571 0.0001467397209995375 0.00021069153291213377 0.00031852290143667396 0.00045802707986650106 0.000626918499983471 0.0008625415369536057 0.0012086120836674158 0.001643451089220705 0.002139123729663381 0.002810080016190203 0.003877184629721825 0.005425288999380871 0.007230885503687022 0.008929833570272602 0.010237380254440185 0.01088482055283342 0.01060280998318499 0.009386166372071904 0.007593348891884837 0.00564867826547514 0.0038244570202485405 0.0023263946674731387 0.0013149137141692056 0.0007669655867827635 0.0004984623059909899 0.0003314013116227065 0.00017526872371932786 0.0001032200091075933 0.00008236911364063887 0.0000868731035868351 0.00010310204404458101 0.00013978608386000383 0.00020537152754663814 0.0002908621346563715 0.00040315658918495923 0.0005817603729256246 0.000862541536953616 0.001224657797113883 0.0016519263713297915 0.0022502321078609823 0.003201956733093737 0.0045700378061789655 0.006171924531510295 0.007710433178781153 0.00893291469455108 0.009578011906467707 0.009386166372071904 0.008343439782146933 0.0067676155844041495 0.005045103596017063 0.0034314450613520163 0.0021108206748463123 0.001214728941261354 0.0007181879547709624 0.0004633285841213854 0.00030038990046507205 0.00014390693080602865 0.00008184139687993197 0.00006174356940784532 0.00006065687477901948 0.00006762487901666894 0.0000882673103841458 0.00012770593467778473 0.00018259355712860016 0.00026363326213076565 0.0004031565891849643 0.0006269184999834842 0.000920919445224092 0.0012775314669896162 0.0017735870623411792 0.0025357859259002333 0.00361084332507002 0.004883702047003992 0.006144054076131459 0.007172574512613122 0.007727115860575978 0.007593348891884839 0.00676761558440415 0.0055024794586461066 0.004111723142629157 0.002817550255939863 0.001769815607257219 0.0010541703707617834 0.000639842691851326 0.000409033513479275 0.0002556769954001587 0.00010639592520414835 0.00005799357828135403 0.0000394729694147373 0.000035082504194897374 0.00003799095053559662 0.000051132788221315635 0.00007753218240796294 0.0001181550147532616 0.00018259355712860363 0.00029086213465637906 0.0004580270798665133 0.000680886203629919 0.0009614150171436529 0.0013428023934787207 0.0018950825958768834 0.0026546496802874854 0.0035749591955013876 0.004526188866547984 0.005320251868544282 0.005744944457247076 0.005648678265475141 0.005045103596017065 0.004111723142629156 0.0030750543906270093 0.0021175621572112483 0.001357384803999539 0.0008376501878464428 0.0005202161617967753 0.00032644896295366225 0.0001953274840006296 0.00007364236764164687 0.00004046369803590998 0.00002490365869091685 0.000018803416857701602 0.000019767224592740157 0.000028529167902094864 0.000046641626585760575 0.00007753218240796464 0.00012770593467779034 0.00020537152754664613 0.0003185229014366854 0.0004755767626457572 0.0006872824206897284 0.0009682847789069793 0.0013400322643710237 0.0018268018963580794 0.0024284076200209318 0.0030756018951073488 0.0036190780350586157 0.0038961044023771473 0.0038244570202485423 0.003431445061352017 0.0028175502559398637 0.0021175621572112483 0.0014682296666435263 0.0009616761756505639 0.0006144342314509691 0.0003881566193396587 0.00023726111223035148 0.0001360065985799558 0.000051429550626859285 0.000030050283810159038 0.00001716538851728185 0.000010385853195484436 0.00001065768400656722 0.000016583212038359026 0.000028529167902095446 0.00005113278822131675 0.0000882673103841499 0.00013978608386000838 0.0002106915329121427 0.0003177350737324193 0.0004765515140829242 0.0006826700179281732 0.0009228985548071676 0.0012072437313161235 0.0015553507761918576 0.001935566873213157 0.0022442729591142297 0.0023815163812629975 0.002326394667473139 0.002110820674846313 0.0017698156072572194 0.0013573848039995391 0.0009616761756505645 0.0006521197197017324 0.0004349316528370989 0.0002798504780587134 0.0001666521654078953 0.00009243873198667766 0.00003634591631691672 0.000022426327257490284 0.000011558312453097722 0.000005160683492609497 0.000005770717199435334 0.000010657684006568218 0.000019767224592741214 0.00003799095053559868 0.00006762487901667209 0.0001031020440445858 0.00014673972099954385 0.0002175871257174957 0.000332810351660377 0.00048101407562924233 0.0006333943940810151 0.000790061519327662 0.0009736510857595698 0.001170272483470393 0.0013144301327347914 0.0013576193121938366 0.0013149137141692066 0.0012147289412613542 0.001054170370761784 0.000837650187846443 0.0006144342314509694 0.00043493165283709856 0.0003036257116541297 0.00019913240892331248 0.00011594604344947269 0.00006284740975602255 0.00002394546061241231 0.000015486976475089396 0.000007436905036099171 0.000003120193983495674 0.000005160683492609752 0.000010385853195486142 0.000018803416857703042 0.000035082504194899726 0.00006065687477902199 0.00008687310358684024 0.00011318982875865059 0.0001565403139405516 0.0002326720717771701 0.0003324322130755801 0.0004294289912473433 0.000520989639560758 0.0006246264787304539 0.0007311047369061563 0.000797090571309569 0.0008006309005604018 0.000766965586782764 0.0007181879547709634 0.0006398426918513272 0.0005202161617967763 0.0003881566193396596 0.000279850478058714 0.000199132408923313 0.00013093515947900145 0.00007448828453249455 0.000039760684445875124 0.000014781998225036166 0.000011415154720125732 0.000007875181309263935 0.000007436905036099088 0.00001155831245309763 0.00001716538851728199 0.000024903658690917462 0.00003947296941473758 0.00006174356940784689 0.00008236911364064104 0.00009890637973826539 0.00012413553643970303 0.00016975481507747813 0.00023073618568791494 0.00029156831156405605 0.00035198131564532695 0.00042271980596803266 0.0004938311102070523 0.0005328767055493014 0.0005270594962774761 0.00049846230599099 0.00046332858412138526 0.00040903351347927543 0.0003264489629536626 0.00023726111223035205 0.00016665216540789543 0.00011594604344947299 0.00007448828453249453 0.00004136804712597235 0.000022238587657549605 0.00001051283086450085 0.000010520403821836123 0.000011415154720125964 0.00001548697647508965 0.000022426327257490467 0.00003005028381016001 0.00004046369803591042 0.00005799357828135499 0.0000818413968799325 0.00010322000910759546 0.00011896774347644129 0.00013719159990130948 0.0001641708527985246 0.00019570183389348627 0.000225399122790935 0.000257889403851149 0.00030060001191083933 0.0003440034197444238 0.00036504846722240576 0.0003560422190484379 0.00033140131162270555 0.0003003899004650715 0.0002556769954001589 0.0001953274840006299 0.0001360065985799569 0.00009243873198667812 0.00006284740975602322 0.000039760684445875375 0.000022238587657549727 0.000012999980140398365 0.0000031293124925016864 0.000004556866447380845 0.000009341733308210803 0.00001742322569700316 0.00002659310644048874 0.00003634591631691868 0.00005006992510114513 0.00007002096897945338 0.00009202672100430687 0.00010990207288447476 0.0001244369771430528 0.00013968876242537805 0.0001533803348213018 0.00015775652622947948 0.00015267581316422965 0.00014878985649779508 0.00015267581316423138 0.00015775652622948165 0.0001533803348213042 0.00013968876242537978 0.00012443697714305344 0.00010990207288447454 0.00009202672100430665 0.0000700209689794536 0.00005006992510114502 0.00003634591631691771 0.000026593106440488145 0.000017423225697002427 0.00000934173330821003 0.000004556866447380899 0.000004556866447380362 0.00000815154795764844 0.000016996134178816483 0.000030311141079121582 0.00004485817630947705 0.00006284740975602419 0.00009205475009134121 0.00013378777557353152 0.00017486743176160945 0.00020226617109821051 0.00022075191810651216 0.00023905748114611003 0.00024962684893333815 0.00023703570095634348 0.00020453187540746634 0.00017215285754228354 0.00014969492195175219 0.00013107499389271264 0.00010991083482162159 0.00008970530400963203 0.00007498642144383827 0.00006307845147368939 0.000049668293720319984 0.000036419779238965724 0.000027686800341349017 0.000022426327257491294 0.000016997532666013203 0.000010432721977928254 0.0000055422661685828285 0.000003983409389722974 0.00000934173330820988 0.000016996134178816015 0.000033426381769640465 0.00005781782971725022 0.00008413408598182858 0.00011594604344947384 0.00016570616231837573 0.00023213625592551602 0.0002900741872742551 0.0003206654954183235 0.00033825695584043956 0.0003605926497320417 0.0003746363628123273 0.00035330476953749853 0.0002999803279416941 0.00024459489967905825 0.00020099329412540375 0.00016134910101133816 0.00012122019196754034 0.00008929388863324412 0.00006978108319975457 0.00005473562818607025 0.000037225400347974834 0.00002174440512866124 0.000014330775707505953 0.00001155831245309845 0.000008699922739312372 0.00000476889079827607 0.0000032397046829915456 0.000005542266168583185 0.00001742322569700212 0.000030311141079121016 0.00005781782971724997 0.00009994215145476977 0.00014628899357183123 0.00019913240892331383 0.00027403295070508666 0.0003662969199368273 0.00044009280330434427 0.0004737128545823653 0.0004915278415428218 0.0005189558821759167 0.0005378107763058987 0.0005110280207879575 0.0004416144748653255 0.00036669495389843646 0.0003017151935110241 0.0002354031801643062 0.00016700154404711097 0.00011453422882452032 0.00008400938969302754 0.00006224326772106277 0.000038268184393991436 0.000017393788614680703 0.000007592282948860224 0.000005160683492611315 0.000004456594710889651 0.000003178772178921801 0.00000476889079827572 0.000010432721977928293 0.0000265931064404876 0.00004485817630947633 0.00008413408598182793 0.0001462889935718308 0.00021909804628488284 0.00030362571165413 0.00041731035941536623 0.000554211743024107 0.0006706709826168834 0.0007370114712795571 0.0007753241069806379 0.0008095426567044833 0.0008160465074447693 0.0007582882900205576 0.0006508099138680056 0.0005404671613561362 0.0004417062437438284 0.00033826785089126826 0.0002326511577507735 0.00015191940053495872 0.00010514847136896204 0.00007553666539708604 0.00004695012607628337 0.000021968432045005126 0.000009281165063708668 0.000005770717199436939 0.0000047872015892067966 0.000004456594710889641 0.000008699922739311893 0.000016997532666013196 0.00003634591631691744 0.00006284740975602339 0.00011594604344947308 0.00019913240892331335 0.0003036257116541299 0.00043493165283709894 0.000614434231450969 0.0008376501878464424 0.0010541703707617825 0.0012147289412613536 0.0013149137141692051 0.0013576193121938366 0.0013144301327347903 0.0011702724834703933 0.0009736510857595704 0.0007900615193276619 0.0006333943940810138 0.00048101407562923956 0.00033281035166037227 0.00021758712571749145 0.00014673972099953984 0.00010310204404458363 0.00006762487901667244 0.00003799095053559957 0.000019767224592742955 0.000010657684006569102 0.000005770717199437455 0.000005160683492611513 0.000011558312453098307 0.000022426327257491504 0.0000500699251011444 0.00009205475009134091 0.00016570616231837516 0.00027403295070508617 0.0004173103594153659 0.0006144342314509686 0.0008942164552661221 0.0012523497139305796 0.0016299924923527536 0.001949747045785653 0.002157533096200785 0.002212953317850319 0.0020849230176928986 0.0018004153950183003 0.0014590527240740747 0.0011543632072385753 0.0009066580400836042 0.0006895470735222086 0.0004921829205170332 0.0003328746152825381 0.00022295862859127754 0.00015107953004165418 0.00010089256600215894 0.0000641857891828626 0.000037975599596232346 0.000019767224592742142 0.00000928116506370898 0.000007592282948860274 0.000014330775707505384 0.000027686800341349125 0.00007002096897945316 0.00013378777557353192 0.00023213625592551624 0.0003662969199368278 0.0005542117430241076 0.0008376501878464425 0.0012523497139305803 0.0017836111952503012 0.00235593934159752 0.0028634056441512587 0.0032006777697295256 0.0032799082195145426 0.003067346428052678 0.0026293898016959937 0.0021106035581529674 0.0016385034701410666 0.0012589495116249148 0.0009554476063526725 0.0007011280080980795 0.0004883595058147539 0.00032387472212927975 0.00021079146292320587 0.00014055573155341686 0.0000967360715647216 0.00006418578918286243 0.000037990950535598996 0.000021968432045004723 0.00001739378861468048 0.0000217444051286608 0.00003641977923896566 0.00009202672100430627 0.00017486743176161007 0.0002900741872742555 0.00044009280330434486 0.0006706709826168842 0.0010541703707617827 0.0016299924923527545 0.0023559393415975203 0.0031243262723721203 0.0038047658255811845 0.0042618377908782805 0.004379127580087871 0.004117426952608119 0.0035548620122397598 0.0028541081215029 0.002180842443607051 0.0016351864912215162 0.0012310199292264736 0.0009232854720992046 0.0006636557209989274 0.0004446632000163234 0.00028716150921594775 0.00019395528069379172 0.0001405557315534167 0.00010089256600215868 0.00006762487901667132 0.00004695012607628297 0.000038268184393991335 0.00003722540034797428 0.000049668293720320126 0.00010990207288447414 0.00020226617109821087 0.0003206654954183238 0.0004737128545823661 0.0007370114712795575 0.001214728941261354 0.0019497470457856532 0.002863405644151259 0.003804765825581184 0.004622831473009574 0.005174646336827454 0.005337764510923122 0.005065990398946276 0.004422978400784088 0.0035655934957543093 0.0026987296766766223 0.001993538699736133 0.0015021101566728289 0.001158357259161514 0.0008696279545382123 0.0006090221462856599 0.0004103825706411219 0.000287161509215948 0.00021079146292320603 0.00015107953004165345 0.00010310204404458333 0.00007553666539708535 0.00006224326772106292 0.00005473562818607028 0.00006307845147368935 0.00012443697714305209 0.00022075191810651235 0.00033825695584043935 0.0004915278415428226 0.0007753241069806385 0.0013149137141692056 0.0021575330962007853 0.003200677769729527 0.004261837790878281 0.0051746463368274554 0.00579539578514296 0.006004520936120329 0.005751359337704064 0.0050813086362769865 0.004139463137881497 0.003158287344604464 0.002361827022744195 0.0018252040088143602 0.0014604937925648616 0.0011458895699827526 0.0008478810904686614 0.0006090221462856603 0.0004446632000163235 0.0003238747221292794 0.0002229586285912774 0.00014673972099953843 0.0001051484713689618 0.00008400938969302735 0.00006978108319975395 0.0000749864214438379 0.00013968876242537761 0.00023905748114611 0.000360592649732042 0.0005189558821759175 0.0008095426567044843 0.0013576193121938372 0.0022129533178503204 0.003279908219514544 0.004379127580087873 0.0053377645109231224 0.006004520936120329 0.006258842946612731 0.006050605342605953 0.005421110613354318 0.004510620325940204 0.0035528377214148147 0.0027739623811732957 0.0022406580347984133 0.0018515398190606298 0.0014902181260945148 0.0011458895699827522 0.0008696279545382126 0.0006636557209989276 0.0004883595058147531 0.0003328746152825373 0.0002175871257174902 0.0001519194005349578 0.00011453422882451947 0.00008929388863324334 0.00008970530400963091 0.00015338033482130176 0.00024962684893333874 0.0003746363628123278 0.0005378107763059003 0.0008160465074447712 0.0013144301327347916 0.0020849230176929008 0.003067346428052679 0.004117426952608121 0.005065990398946278 0.005751359337704066 0.006050605342605955 0.005918258582049202 0.005402100311051646 0.004640662862214505 0.003841618738221896 0.0031833431333577003 0.0026945499014594653 0.0022749560695569777 0.00185153981906063 0.001460493792564862 0.0011583572591615137 0.0009232854720992034 0.0007011280080980784 0.0004921829205170325 0.0003328103516603706 0.00023265115775077344 0.00016700154404711087 0.0001212201919675394 0.00010991083482162025 0.00015775652622947907 0.0002370357009563439 0.0003533047695374995 0.0005110280207879588 0.000758288290020559 0.0011702724834703946 0.0018004153950183018 0.002629389801695996 0.0035548620122397615 0.00442297840078409 0.005081308636276987 0.00542111061335432 0.005402100311051647 0.005066004126662924 0.004534767905786572 0.003975820768717631 0.003505782339925737 0.00310917608707183 0.0026945499014594653 0.002240658034798413 0.001825204008814359 0.0015021101566728278 0.0012310199292264719 0.0009554476063526708 0.0006895470735222068 0.0004810140756292384 0.00033826785089126707 0.00023540318016430505 0.0001613491010113372 0.00013107499389271136 0.0001526758131642295 0.0002045318754074669 0.00029998032794169494 0.0004416144748653272 0.0006508099138680075 0.0009736510857595715 0.0014590527240740774 0.002110603558152969 0.0028541081215029025 0.0035655934957543114 0.004139463137881499 0.004510620325940207 0.0046406628622145075 0.004534767905786572 0.00427301783496627 0.003984092645329023 0.003743027848109887 0.003505782339925737 0.003183343133357699 0.0027739623811732952 0.0023618270227441936 0.0019935386997361323 0.0016351864912215145 0.001258949511624913 0.0009066580400836034 0.0006333943940810125 0.0004417062437438279 0.00030171519351102365 0.00020099329412540302 0.00014969492195175156 0.00014878985649779486 0.00017215285754228432 0.00024459489967905944 0.0003666949538984378 0.0005404671613561383 0.0007900615193276634 0.0011543632072385777 0.001638503470141069 0.0021808424436070535 0.002698729676676625 0.0031582873446044666 0.003552837721414818 0.0038416187382219 0.0039758207687176335 0.0039840926453290244 0.003967720801133167 0.003984092645329023 0.003975820768717631 0.0038416187382218957 0.003552837721414814 0.003158287344604462 0.0026987296766766205 0.00218084244360705 0.0016385034701410653 0.0011543632072385744 0.0007900615193276617 0.0005404671613561364 0.0003666949538984369 0.00024459489967905944 0.00017215285754228397 0.00015267581316423065 0.00014969492195175292 0.00020099329412540394 0.00030171519351102506 0.0004417062437438301 0.0006333943940810145 0.0009066580400836072 0.0012589495116249168 0.0016351864912215186 0.0019935386997361358 0.002361827022744198 0.0027739623811732996 0.003183343133357704 0.00350578233992574 0.0037430278481098895 0.003984092645329023 0.00427301783496627 0.00453476790578657 0.004640662862214503 0.004510620325940202 0.004139463137881496 0.0035655934957543075 0.0028541081215028995 0.002110603558152967 0.0014590527240740747 0.0009736510857595709 0.0006508099138680069 0.00044161447486532746 0.00029998032794169614 0.00020453187540746783 0.00015775652622948108 0.00013107499389271345 0.0001613491010113385 0.00023540318016430665 0.00033826785089126945 0.0004810140756292406 0.0006895470735222102 0.0009554476063526739 0.0012310199292264751 0.0015021101566728306 0.001825204008814362 0.0022406580347984167 0.002694549901459469 0.0031091760870718336 0.00350578233992574 0.003975820768717633 0.004534767905786572 0.005066004126662922 0.005402100311051644 0.005421110613354315 0.005081308636276982 0.004422978400784086 0.003554862012239759 0.002629389801695994 0.0018004153950183014 0.0011702724834703956 0.0007582882900205602 0.0005110280207879605 0.000353304769537502 0.00023703570095634602 0.0001533803348213039 0.00010991083482162244 0.00012122019196754083 0.00016700154404711217 0.00023265115775077553 0.00033281035166037287 0.0004921829205170355 0.0007011280080980812 0.0009232854720992068 0.0011583572591615165 0.0014604937925648644 0.0018515398190606333 0.002274956069556982 0.0026945499014594696 0.003183343133357704 0.0038416187382218987 0.004640662862214507 0.005402100311051645 0.0059182585820492 0.00605060534260595 0.005751359337704063 0.005065990398946276 0.004117426952608121 0.0030673464280526795 0.0020849230176929016 0.001314430132734794 0.0008160465074447736 0.0005378107763059031 0.0003746363628123311 0.0002496268489333414 0.00013968876242537957 0.00008970530400963289 0.00008929388863324467 0.00011453422882452039 0.00015191940053495975 0.00021758712571749218 0.0003328746152825401 0.0004883595058147553 0.0006636557209989302 0.0008696279545382143 0.0011458895699827543 0.0014902181260945174 0.0018515398190606333 0.002240658034798416 0.0027739623811732987 0.0035528377214148164 0.004510620325940205 0.005421110613354316 0.00605060534260595 0.006258842946612728 0.006004520936120326 0.005337764510923122 0.004379127580087874 0.0032799082195145456 0.002212953317850323 0.0013576193121938409 0.0008095426567044877 0.0005189558821759207 0.00036059264973204526 0.0002390574811461126 0.0001244369771430536 0.00007498642144383937 0.0000697810831997553 0.000084009389693028 0.00010514847136896323 0.0001467397209995402 0.00022295862859127963 0.000323874722129281 0.00044466320001632597 0.0006090221462856622 0.0008478810904686642 0.0011458895699827545 0.0014604937925648646 0.0018252040088143618 0.002361827022744197 0.0031582873446044644 0.004139463137881497 0.005081308636276986 0.0057513593377040645 0.00600452093612033 0.005795395785142963 0.005174646336827457 0.004261837790878285 0.00320067776972953 0.0021575330962007896 0.0013149137141692097 0.000775324106980642 0.0004915278415428254 0.00033825695584044216 0.00022075191810651428 0.00010990207288447494 0.0000630784514736902 0.000054735628186071544 0.00006224326772106326 0.00007553666539708627 0.0001031020440445847 0.00015107953004165478 0.00021079146292320725 0.0002871615092159495 0.0004103825706411241 0.0006090221462856628 0.000869627954538215 0.0011583572591615165 0.0015021101566728297 0.001993538699736135 0.002698729676676623 0.0035655934957543097 0.0044229784007840875 0.005065990398946278 0.005337764510923123 0.005174646336827459 0.004622831473009578 0.0038047658255811892 0.0028634056441512626 0.0019497470457856575 0.0012147289412613575 0.0007370114712795606 0.00047371285458236786 0.00032066549541832565 0.00020226617109821168 0.00009202672100430708 0.00004966829372032104 0.000037225400347976094 0.000038268184393992324 0.000046950126076284215 0.00006762487901667297 0.00010089256600215967 0.00014055573155341737 0.00019395528069379226 0.00028716150921594916 0.000444663200016326 0.0006636557209989297 0.0009232854720992056 0.0012310199292264738 0.0016351864912215166 0.002180842443607052 0.002854108121502901 0.0035548620122397615 0.004117426952608123 0.004379127580087876 0.0042618377908782866 0.0038047658255811892 0.0031243262723721255 0.002355939341597525 0.0016299924923527586 0.001054170370761787 0.0006706709826168871 0.00044009280330434676 0.00029007418727425706 0.0001748674317616107 0.00007002096897945387 0.00003641977923896645 0.00002174440512866272 0.000017393788614681625 0.000021968432045005932 0.00003799095053560086 0.00006418578918286345 0.00009673607156472251 0.00014055573155341786 0.00021079146292320738 0.0003238747221292818 0.0004883595058147553 0.0007011280080980804 0.0009554476063526733 0.0012589495116249157 0.0016385034701410677 0.0021106035581529695 0.0026293898016959963 0.0030673464280526813 0.0032799082195145474 0.0032006777697295313 0.002863405644151264 0.002355939341597525 0.0017836111952503056 0.001252349713930584 0.0008376501878464461 0.00055421174302411 0.00036629691993682925 0.0002321362559255174 0.00013378777557353238 0.00005006992510114558 0.000027686800341350294 0.000014330775707507574 0.000007592282948861648 0.000009281165063710577 0.000019767224592744192 0.00003797559959623394 0.00006418578918286294 0.00010089256600215959 0.0001510795300416542 0.00022295862859127977 0.00033287461528253915 0.0004921829205170349 0.000689547073522208 0.0009066580400836058 0.0011543632072385762 0.0014590527240740774 0.0018004153950183029 0.0020849230176929034 0.002212953317850324 0.002157533096200791 0.0019497470457856578 0.0016299924923527589 0.001252349713930584 0.0008942164552661257 0.0006144342314509717 0.0004173103594153685 0.0002740329507050878 0.00016570616231837654 0.00009205475009134195 0.00003634591631691868 0.00002242632725749264 0.000011558312453100263 0.00000516068349261278 0.000005770717199438788 0.000010657684006570988 0.000019767224592744327 0.00003799095053560012 0.00006762487901667312 0.0001031020440445835 0.00014673972099954032 0.00021758712571749055 0.00033281035166037276 0.00048101407562923913 0.0006333943940810141 0.0007900615193276625 0.0009736510857595726 0.0011702724834703965 0.0013144301327347955 0.001357619312193842 0.0013149137141692106 0.0012147289412613581 0.0010541703707617868 0.000837650187846446 0.0006144342314509717 0.0004349316528371011 0.0003036257116541317 0.00019913240892331448 0.00011594604344947422 0.00006284740975602456 0.000026593106440488904 0.000016997532666014433 0.000008699922739313898 0.000004456594710890996 0.000004787201589208164 0.000005770717199438922 0.000009281165063710175 0.000021968432045005566 0.00004695012607628377 0.00007553666539708578 0.00010514847136896211 0.00015191940053495853 0.0002326511577507748 0.00033826785089126864 0.0004417062437438292 0.0005404671613561379 0.0006508099138680084 0.0007582882900205614 0.0008160465074447749 0.0008095426567044883 0.0007753241069806431 0.0007370114712795613 0.0006706709826168871 0.0005542117430241098 0.00041731035941536797 0.00030362571165413126 0.00021909804628488403 0.00014628899357183148 0.00008413408598182872 0.00004485817630947755 0.000017423225697003186 0.000010432721977929368 0.00000476889079827757 0.0000031787721789231114 0.000004456594710890829 0.000005160683492612901 0.00000759228294886136 0.000017393788614681462 0.000038268184393991585 0.00006224326772106322 0.00008400938969302736 0.00011453422882451999 0.00016700154404711103 0.00023540318016430548 0.00030171519351102435 0.00036669495389843803 0.00044161447486532843 0.0005110280207879617 0.0005378107763059038 0.0005189558821759214 0.000491527841542826 0.0004737128545823684 0.0004400928033043468 0.0003662969199368294 0.00027403295070508747 0.00019913240892331416 0.00014628899357183142 0.00009994215145476973 0.000057817829717250166 0.00003031114107912194 0.000009341733308210943 0.000005542266168584276 0.000003239704682993392 0.0000047688907982775025 0.000008699922739313714 0.000011558312453099984 0.000014330775707507176 0.000021744405128661877 0.000037225400347975945 0.00005473562818607072 0.00006978108319975556 0.00008929388863324338 0.00012122019196753966 0.00016134910101133748 0.0002009932941254033 0.0002445948996790592 0.00029998032794169673 0.00035330476953750233 0.00037463636281233174 0.0003605926497320457 0.00033825695584044276 0.00032066549541832597 0.0002900741872742571 0.00023213625592551738 0.00016570616231837608 0.00011594604344947354 0.00008413408598182843 0.00005781782971724998 0.00003342638176964047 0.00001699613417881695 0.0000045568664473809915 0.000003983409389723577 0.0000055422661685842574 0.000010432721977929368 0.000016997532666014182 0.000022426327257492608 0.000027686800341349945 0.000036419779238965974 0.000049668293720320404 0.00006307845147368975 0.00007498642144383873 0.00008970530400963173 0.00010991083482162044 0.00013107499389271177 0.0001496949219517515 0.0001721528575422842 0.0002045318754074682 0.00023703570095634638 0.0002496268489333416 0.00023905748114611238 0.00022075191810651455 0.00020226617109821146 0.00017486743176161042 0.00013378777557353209 0.00009205475009134133 0.00006284740975602358 0.000044858176309476746 0.00003031114107912113 0.00001699613417881618 0.000008151547957649013 0.0000011014415294988164 0.0000024559531885533724 0.000006004795496697776 0.000011308388178075967 0.000017423225697002373 0.000023945460612413054 0.00003183885277159587 0.00004158095417466771 0.000051575019374036114 0.0000602888501315972 0.0000692784110699141 0.00007921512669109847 0.00008836635431708575 0.00009296217033426713 0.00009223278715530842 0.00009102652667143316 0.0000922327871553082 0.00009296217033426756 0.0000883663543170864 0.00007921512669109934 0.00006927841106991496 0.000060288850131598394 0.000051575019374037415 0.000041580954174669444 0.00003183885277159793 0.00002394546061241479 0.000017423225697004 0.000011308388178077268 0.000006004795496698467 0.000002455953188553603 0.0000024559531885537998 0.0000055356148465826476 0.000012912197025182488 0.000022149799803211674 0.00003031114107912192 0.000039760684445876344 0.000056160024501310565 0.00007998449698244372 0.00010298248083767183 0.00011796120117655059 0.00012834877183813862 0.0001388028405714098 0.00014552776986352358 0.000140019573472099 0.00012382628362150958 0.00010792134312512467 0.00009660617943874742 0.00008633426488525685 0.0000731971162145203 0.00005906705547390492 0.00004701150675250932 0.0000370646200096285 0.000028766629952460654 0.000022572177159264153 0.0000190534877076157 0.00001548697647509194 0.000010432721977929851 0.000005404657006735292 0.0000025097644122416697 0.000002036722977856414 0.000006004795496698778 0.00001291219702518306 0.000026517972173532645 0.000043372381336913385 0.00005781782971725189 0.0000744882845324962 0.00010458020730616355 0.00014795151506898847 0.00018588342694629087 0.00020424986233035167 0.00021384675885703652 0.00022811134622592475 0.00023897829057065165 0.00022688081584744334 0.00019372829236130506 0.00016080406028930929 0.0001367882004635741 0.00011571395533526857 0.00009227334361629835 0.00007040658488428558 0.00005348677304968896 0.000038120097772276624 0.000023259926778894986 0.000013352842787481783 0.000009782308601454165 0.000007436905036101816 0.00000476889079827831 0.000002103454138533134 6.970502856828834E-7 0.0000025097644122418205 0.000011308388178077502 0.000022149799803212833 0.000043372381336913955 0.0000722533402025806 0.00009994215145477239 0.0001309351594790039 0.00018025469510181926 0.0002452872893603442 0.00029651146234187616 0.0003158654422010077 0.00032450718525868846 0.00034510117949246375 0.00036446551343221755 0.0003502417832487414 0.00030167391628042634 0.0002493944217476897 0.0002077571576043921 0.00016831495554074034 0.00012639541981940606 0.00009168287533173801 0.00006835590124955292 0.000048024046426983094 0.00002664251965620066 0.000011059872777092924 0.000004898912629720445 0.0000031201939834991532 0.000003178772178924252 0.0000025328140596886403 0.0000021034541385329884 0.000005404657006735378 0.00001742322569700421 0.000030311141079123608 0.000057817829717253026 0.0000999421514547731 0.00014628899357183392 0.0001991324089233152 0.0002740329507050863 0.0003662969199368263 0.0004400928033043427 0.0004737128545823639 0.0004915278415428208 0.0005189558821759162 0.0005378107763058991 0.0005110280207879582 0.0004416144748653272 0.0003666949538984381 0.00030171519351102565 0.00023540318016430765 0.00016700154404711268 0.00011453422882452125 0.00008400938969302854 0.00006224326772106344 0.00003826818439399177 0.000017393788614681 0.00000759228294886118 0.000005160683492613104 0.000004456594710891873 0.000003178772178924185 0.000004768890798277997 0.000010432721977929905 0.000023945460612414803 0.00003976068444587804 0.00007448828453249762 0.00013093515947900524 0.00019913240892331603 0.0002798504780587163 0.00038815661933966036 0.0005202161617967765 0.0006398426918513266 0.0007181879547709636 0.0007669655867827642 0.0008006309005604021 0.000797090571309569 0.0007311047369061575 0.0006246264787304559 0.0005209896395607601 0.00042942899124734477 0.0003324322130755795 0.0002326720717771683 0.0001565403139405502 0.0001131898287586495 0.00008687310358683868 0.000060656874779023094 0.00003508250419490063 0.000018803416857705018 0.000010385853195488002 0.000005160683492612983 0.000003120193983498801 0.000007436905036101343 0.000015486976475091775 0.00003183885277159762 0.000056160024501312415 0.00010458020730616512 0.00018025469510182088 0.00027403295070508785 0.00038815661933966117 0.0005389628394804278 0.0007258660541463061 0.0009163199990738556 0.0010719536575662402 0.0011766546693540267 0.0012183841389811468 0.001173373429471079 0.0010440770375415834 0.0008828322819484006 0.0007402030304244078 0.0006161688271076271 0.0004844533228748211 0.00034716672433379714 0.0002365232571313365 0.00016697925239012078 0.000124394037423088 0.00009092448574327911 0.0000612452502319453 0.000037217831222932336 0.000018803416857704465 0.000007592282948860588 0.000004898912629719744 0.000009782308601453186 0.000019053487707615276 0.000041580954174669105 0.0000799844969824453 0.00014795151506898974 0.00024528728936034565 0.000366296919936828 0.0005202161617967776 0.0007258660541463067 0.0009829449201744793 0.001260701811817081 0.001511550796372855 0.0016880521502273208 0.0017456059351057575 0.0016589400069480257 0.0014604341919198353 0.0012316737057361767 0.0010319639807374764 0.0008589568636188361 0.0006838316235267788 0.0005042574172789256 0.00034950119417327165 0.00023964913362905033 0.00016905754840346017 0.000123048352698993 0.00008987407423056801 0.00006124525023194468 0.00003508250419489974 0.000017393788614680107 0.00001105987277709196 0.000013352842787480826 0.000022572177159263706 0.000051575019374037226 0.00010298248083767318 0.00018588342694629177 0.0002965114623418773 0.00044009280330434405 0.0006398426918513275 0.0009163199990738562 0.001260701811817081 0.001634987129825328 0.001982106453963777 0.0022318845186097475 0.0023155029140805245 0.002204423345366914 0.0019465698802292972 0.0016396186116322176 0.0013560029677948077 0.0011094531117226182 0.0008835265101450356 0.0006692846682037878 0.00047810797513390165 0.00032749602997659904 0.00022463885487634773 0.0001621371192064199 0.00012304835269899211 0.00009092448574327809 0.000060656874779021495 0.000038268184393990684 0.000026642519656199717 0.000023259926778893855 0.000028766629952460237 0.00006028885013159813 0.00011796120117655174 0.0002042498623303524 0.00031586544220100837 0.0004737128545823648 0.0007181879547709641 0.0010719536575662402 0.0015115507963728546 0.0019821064539637763 0.002414862370457805 0.0027278262838996707 0.0028419649976218703 0.0027252012978601485 0.002423979187085861 0.002038034982836015 0.0016584905708846613 0.0013314457145501785 0.0010612533502024906 0.0008297072438039182 0.0006217834696838515 0.0004430836000988343 0.00031008840053104976 0.00022463885487634608 0.0001690575484034582 0.00012439403742308582 0.00008687310358683723 0.00006224326772106238 0.00004802404642698182 0.00003812009777227575 0.00003706462000962808 0.00006927841106991466 0.00012834877183813952 0.00021384675885703676 0.00032450718525868857 0.0004915278415428214 0.0007669655867827642 0.001176654669354027 0.00168805215022732 0.0022318845186097467 0.0027278262838996707 0.003086925039933321 0.0032284375798712238 0.0031199679870699912 0.0028018161266351945 0.0023697225303135187 0.0019295502396633535 0.0015544662428557984 0.0012617286215816505 0.0010219478720986845 0.0008023405097078645 0.0006026697091401619 0.000443083600098832 0.0003274960299765955 0.00023964913362904694 0.00016697925239011826 0.00011318982875864685 0.00008400938969302702 0.0000683559012495514 0.00005348677304968761 0.000047011506752508595 0.00007921512669109878 0.00013880284057141018 0.00022811134622592485 0.00034510117949246365 0.0005189558821759166 0.0008006309005604022 0.0012183841389811468 0.0017456059351057568 0.002315502914080523 0.002841964997621869 0.003228437579871223 0.003393885837083694 0.003310130795263661 0.003017057632244766 0.0026064943852817275 0.0021839809405514556 0.0018231338833620304 0.0015340316098065914 0.0012781043115712648 0.0010287461375447014 0.0008023405097078619 0.0006217834696838474 0.00047810797513389667 0.00034950119417326823 0.00023652325713133338 0.00015654031394054786 0.00011453422882451915 0.00009168287533173623 0.00007040658488428432 0.00005906705547390401 0.0000883663543170859 0.000145527769863524 0.00023897829057065127 0.0003644655134322173 0.0005378107763058993 0.0007970905713095689 0.0011733734294710797 0.0016589400069480253 0.002204423345366913 0.0027252012978601476 0.003119967987069991 0.003310130795263661 0.00327321590283921 0.003050365760317202 0.0027284479596149038 0.002399856396544478 0.0021135152535489182 0.0018521698782702973 0.0015723081188699934 0.001278104311571262 0.0010219478720986802 0.0008297072438039127 0.0006692846682037828 0.0005042574172789218 0.0003471667243337943 0.00023267207177716539 0.00016700154404711084 0.00012639541981940435 0.00009227334361629688 0.00007319711621451941 0.00009296217033426681 0.00014001957347209855 0.00022688081584744274 0.0003502417832487402 0.0005110280207879575 0.0007311047369061566 0.001044077037541583 0.001460434191919835 0.0019465698802292966 0.00242397918708586 0.0028018161266351936 0.0030170576322447675 0.0030503657603172035 0.002931467006558713 0.0027321864074082397 0.002528650327509908 0.002344313469709201 0.002134042701198251 0.0018521698782702953 0.001534031609806587 0.0012617286215816453 0.0010612533502024851 0.0008835265101450311 0.0006838316235267752 0.0004844533228748179 0.000332432213075577 0.0002354031801643053 0.0001683149555407382 0.00011571395533526693 0.00008633426488525578 0.00009223278715530819 0.00012382628362150912 0.0001937282923613037 0.00030167391628042515 0.00044161447486532605 0.0006246264787304545 0.0008828322819484 0.0012316737057361756 0.0016396186116322171 0.0020380349828360146 0.0023697225303135195 0.0026064943852817284 0.0027284479596149055 0.0027321864074082406 0.0026569839345356046 0.0025660434782336585 0.002478914196022791 0.0023443134697091997 0.0021135152535489148 0.0018231338833620257 0.0015544662428557939 0.0013314457145501741 0.001109453111722614 0.0008589568636188332 0.0006161688271076247 0.00042942899124734244 0.00030171519351102397 0.00020775715760439062 0.00013678820046357293 0.0000966061794387468 0.00009102652667143278 0.00010792134312512423 0.00016080406028930853 0.00024939442174768816 0.0003666949538984369 0.000520989639560758 0.0007402030304244063 0.001031963980737475 0.0013560029677948068 0.0016584905708846608 0.0019295502396633538 0.0021839809405514573 0.002399856396544481 0.0025286503275099093 0.0025660434782336598 0.0025665543321341934 0.0025660434782336567 0.002528650327509904 0.002399856396544474 0.0021839809405514504 0.001929550239663349 0.0016584905708846571 0.0013560029677948044 0.0010319639807374735 0.0007402030304244054 0.000520989639560758 0.00036669495389843657 0.0002493944217476881 0.00016080406028930866 0.00010792134312512408 0.00009223278715530858 0.00009660617943874737 0.0001367882004635733 0.000207757157604391 0.0003017151935110246 0.00042942899124734254 0.0006161688271076255 0.0008589568636188337 0.0011094531117226162 0.0013314457145501776 0.0015544662428557993 0.0018231338833620326 0.0021135152535489213 0.002344313469709204 0.002478914196022794 0.0025660434782336585 0.002656983934535602 0.0027321864074082358 0.0027284479596149 0.002606494385281723 0.0023697225303135156 0.0020380349828360116 0.0016396186116322147 0.0012316737057361737 0.0008828322819483985 0.000624626478730454 0.0004416144748653258 0.00030167391628042536 0.00019372829236130425 0.00012382628362150934 0.00009296217033426759 0.00008633426488525692 0.00011571395533526778 0.00016831495554073912 0.00023540318016430627 0.00033243221307557755 0.00048445332287481876 0.0006838316235267758 0.0008835265101450328 0.0010612533502024884 0.0012617286215816498 0.001534031609806593 0.0018521698782702997 0.0021340427011982536 0.0023443134697092027 0.0025286503275099067 0.0027321864074082367 0.0029314670065587085 0.0030503657603171983 0.0030170576322447627 0.0028018161266351906 0.0024239791870858565 0.0019465698802292937 0.0014604341919198325 0.0010440770375415812 0.0007311047369061559 0.0005110280207879571 0.00035024178324874055 0.00022688081584744353 0.00014001957347209914 0.00008836635431708654 0.00007319711621452062 0.0000922733436162979 0.00012639541981940527 0.00016700154404711184 0.0002326720717771661 0.00034716672433379524 0.0005042574172789222 0.0006692846682037843 0.0008297072438039152 0.0010219478720986835 0.001278104311571266 0.0015723081188699951 0.0018521698782702977 0.0021135152535489182 0.0023998563965444766 0.0027284479596149016 0.003050365760317199 0.0032732159028392074 0.0033101307952636575 0.0031199679870699886 0.002725201297860145 0.002204423345366911 0.0016589400069480227 0.0011733734294710773 0.0007970905713095676 0.0005378107763058986 0.0003644655134322173 0.00023897829057065184 0.00014552776986352447 0.00007921512669109894 0.000059067055473904837 0.00007040658488428508 0.00009168287533173676 0.00011453422882452007 0.00015654031394054843 0.0002365232571313341 0.0003495011941732679 0.0004781079751338967 0.0006217834696838468 0.0008023405097078614 0.0010287461375447001 0.0012781043115712627 0.0015340316098065882 0.0018231338833620276 0.0021839809405514526 0.0026064943852817245 0.0030170576322447627 0.0033101307952636575 0.0033938858370836903 0.00322843757987122 0.002841964997621866 0.0023155029140805206 0.001745605935105754 0.0012183841389811444 0.0008006309005604005 0.0005189558821759154 0.0003451011794924631 0.00022811134622592485 0.00013880284057141013 0.00006927841106991446 0.00004701150675250896 0.00005348677304968837 0.00006835590124955179 0.00008400938969302769 0.00011318982875864753 0.00016697925239011883 0.0002396491336290464 0.0003274960299765939 0.0004430836000988282 0.0006026697091401571 0.0008023405097078586 0.0010219478720986787 0.0012617286215816448 0.0015544662428557943 0.00192955023966335 0.002369722530313516 0.002801816126635191 0.0031199679870699878 0.003228437579871219 0.0030869250399333174 0.002727826283899667 0.002231884518609744 0.0016880521502273178 0.001176654669354025 0.0007669655867827629 0.0004915278415428201 0.00032450718525868776 0.00021384675885703652 0.00012834877183813892 0.00006028885013159725 0.00003706462000962762 0.000038120097772276035 0.00004802404642698167 0.0000622432677210626 0.0000868731035868377 0.00012439403742308614 0.00016905754840345713 0.00022463885487634304 0.0003100884005310438 0.0004430836000988261 0.0006217834696838428 0.0008297072438039096 0.001061253350202483 0.0013314457145501733 0.0016584905708846571 0.002038034982836012 0.002423979187085856 0.0027252012978601445 0.0028419649976218647 0.002727826283899666 0.0024148623704578 0.0019821064539637737 0.001511550796372852 0.0010719536575662385 0.0007181879547709622 0.0004737128545823631 0.0003158654422010068 0.0002042498623303516 0.00011796120117655034 0.00005157501937403647 0.000028766629952459678 0.000023259926778894285 0.00002664251965619989 0.000038268184393991226 0.000060656874779022484 0.00009092448574327865 0.0001230483526989913 0.0001621371192064169 0.00022463885487634141 0.0003274960299765903 0.0004781079751338921 0.0006692846682037793 0.000883526510145028 0.0011094531117226125 0.0013560029677948037 0.001639618611632214 0.0019465698802292937 0.00220442334536691 0.0023155029140805197 0.002231884518609743 0.0019821064539637732 0.0016349871298253257 0.0012607018118170794 0.000916319999073855 0.0006398426918513264 0.0004400928033043426 0.0002965114623418761 0.0001858834269462911 0.00010298248083767191 0.000041580954174667885 0.000022572177159262564 0.000013352842787480693 0.000011059872777091726 0.000017393788614680205 0.0000350825041949004 0.00006124525023194502 0.00008987407423056724 0.00012304835269899054 0.00016905754840345483 0.0002396491336290432 0.0003495011941732639 0.0005042574172789183 0.0006838316235267724 0.0008589568636188309 0.0010319639807374725 0.0012316737057361728 0.0014604341919198323 0.001658940006948023 0.001745605935105754 0.001688052150227317 0.001511550796372852 0.0012607018118170794 0.0009829449201744784 0.0007258660541463059 0.0005202161617967764 0.0003662969199368263 0.00024528728936034413 0.00014795151506898858 0.0000799844969824436 0.000031838852771596227 0.000019053487707613978 0.000009782308601452683 0.0000048989126297191265 0.000007592282948860459 0.000018803416857704716 0.000037217831222932586 0.00006124525023194438 0.0000909244857432777 0.00012439403742308398 0.00016697925239011612 0.00023652325713133032 0.00034716672433379205 0.00048445332287481535 0.000616168827107623 0.0007402030304244037 0.000882832281948398 0.001044077037541581 0.001173373429471078 0.0012183841389811446 0.0011766546693540254 0.001071953657566239 0.0009163199990738555 0.0007258660541463063 0.0005389628394804282 0.0003881566193396606 0.0002740329507050866 0.00018025469510181942 0.0001045802073061638 0.00005616002450131072 0.000023945460612412875 0.00001548697647508985 0.000007436905036099987 0.0000031201939834972893 0.0000051606834926119 0.000010385853195487327 0.000018803416857704235 0.000035082504194899346 0.00006065687477902109 0.0000868731035868355 0.00011318982875864541 0.00015654031394054548 0.00023267207177716333 0.00033243221307557446 0.00042942899124734054 0.000520989639560756 0.0006246264787304525 0.0007311047369061548 0.0007970905713095677 0.0008006309005604008 0.0007669655867827629 0.000718187954770963 0.000639842691851327 0.0005202161617967775 0.0003881566193396614 0.0002798504780587163 0.00019913240892331503 0.00013093515947900364 0.00007448828453249594 0.00003976068444587594 0.000017423225697002177 0.000010432721977927768 0.000004768890798276098 0.000003178772178922116 0.000004456594710890081 0.000005160683492611813 0.0000075922829488596915 0.00001739378861467943 0.000038268184393989945 0.00006224326772106124 0.00008400938969302531 0.00011453422882451759 0.00016700154404710935 0.00023540318016430404 0.00030171519351102256 0.00036669495389843527 0.0004416144748653245 0.0005110280207879563 0.0005378107763058985 0.0005189558821759156 0.0004915278415428206 0.000473712854582364 0.00044009280330434394 0.00036629691993682773 0.000274032950705088 0.00019913240892331592 0.00014628899357183362 0.00009994215145477201 0.00005781782971725153 0.00003031114107912161 0.00001130838817807549 0.0000054046570067331 0.0000021034541385306493 0.00000253281405968594 0.0000031787721789217557 0.0000031201939834970454 0.000004898912629718258 0.000011059872777090857 0.000026642519656198592 0.00004802404642698049 0.00006835590124954975 0.00009168287533173504 0.00012639541981940286 0.00016831495554073706 0.00020775715760438965 0.0002493944217476872 0.000301673916280424 0.00035024178324873973 0.00036446551343221673 0.0003451011794924632 0.00032450718525868787 0.0003158654422010076 0.0002965114623418768 0.00024528728936034543 0.00018025469510182083 0.00013093515947900486 0.00009994215145477252 0.00007225334020257993 0.00004337238133691275 0.000022149799803211027 0.000006004795496697475 0.0000025097644122402102 6.970502856809709E-7 0.000002103454138530692 0.000004768890798275864 0.0000074369050360995644 0.000009782308601451858 0.000013352842787479785 0.00002325992677889343 0.00003812009777227496 0.000053486773049687146 0.00007040658488428341 0.00009227334361629613 0.000115713955335266 0.00013678820046357236 0.00016080406028930782 0.00019372829236130324 0.00022688081584744247 0.00023897829057065132 0.00022811134622592472 0.00021384675885703668 0.0002042498623303522 0.00018588342694629196 0.00014795151506898966 0.00010458020730616531 0.00007448828453249737 0.00005781782971725266 0.00004337238133691351 0.00002651797217353215 0.000012912197025182022 0.0000024559531885531086 0.000002036722977855442 0.0000025097644122402814 0.0000054046570067333105 0.000010432721977927649 0.000015486976475089816 0.000019053487707613446 0.000022572177159262287 0.000028766629952458997 0.00003706462000962706 0.00004701150675250769 0.000059067055473903495 0.00007319711621451902 0.00008633426488525554 0.00009660617943874673 0.00010792134312512376 0.00012382628362150871 0.00014001957347209855 0.000145527769863524 0.00013880284057141013 0.00012834877183813933 0.0001179612011765514 0.000102982480837673 0.00007998449698244497 0.000056160024501312435 0.0000397606844458777 0.000030311141079123158 0.000022149799803212294 0.000012912197025182564 0.000005535614846582187 9.81726051017725E-7 0.0000021373228939795493 0.000003996439040512916 0.000006004795496699307 0.000009341733308212104 0.000014781998225039012 0.000020781451388428957 0.000025213591859049892 0.000029077834577928758 0.00003439575992661176 0.000041319385248320714 0.000046397958466131 0.000049264696090273456 0.00005216389130005105 0.000055347440243332644 0.00005704904950991059 0.000055347440243331994 0.000052163891300049644 0.00004926469609027161 0.000046397958466128835 0.00004131938524831833 0.00003439575992660927 0.000029077834577926048 0.000025213591859047074 0.000020781451388426003 0.00001478199822503603 0.000009341733308209556 0.000006004795496697112 0.000003996439040511005 0.0000021373228939785736 0.0000021373228939791745 0.0000036084647764528056 0.000008048688828866994 0.000012912197025183226 0.000016996134178818387 0.000022238587657552844 0.000031057107119735416 0.000042629439945229676 0.0000538441332155412 0.00006258753462346747 0.00006945342397726543 0.00007386269411413273 0.00007494986032959275 0.00007273331620748795 0.00006979335205074739 0.00006774528075202603 0.00006378627298063204 0.000057732138178057005 0.00005081018743244838 0.000043658645204249756 0.00003538581682921512 0.00002671170950945582 0.000020711875659535844 0.00001784863927513446 0.00001605389868069652 0.000011415154720126163 0.000005542266168583229 0.0000025097644122410624 0.000002385841707511477 0.0000027626156523696605 0.000003996439040512145 0.000008048688828866481 0.000016860768505252387 0.00002651797217353259 0.000033426381769643074 0.00004136804712597599 0.00005745686967779826 0.00008197322550826501 0.00010487748323798244 0.00011779395139745302 0.00012514458310738862 0.00013267912482792127 0.0001366557884733702 0.0001291653947954468 0.00011389516179236978 0.00010098659556921376 0.00009111223839643386 0.00008108726648983121 0.00006872525418735331 0.00005534001214467613 0.000042443516252486866 0.000029796252276294253 0.000019165279029501412 0.0000132392881455362 0.000011326048856831707 0.000007875181309264875 0.0000032397046829930702 6.970502856828241E-7 6.283755755589767E-7 0.000002385841707512079 0.000006004795496698472 0.00001291219702518243 0.00002651797217353209 0.00004337238133691348 0.000057817829717253175 0.00007448828453249885 0.00010458020730616731 0.000147951515068992 0.0001858834269462937 0.00020424986233035343 0.00021384675885703752 0.00022811134622592537 0.00023897829057065176 0.00022688081584744364 0.00019372829236130384 0.00016080406028930812 0.00013678820046357195 0.0001157139553352658 0.00009227334361629518 0.0000704065848842826 0.00005348677304968628 0.0000381200977722749 0.000023259926778893485 0.000013352842787480546 0.00000978230860145279 0.000007436905036100996 0.000004768890798277987 0.0000021034541385332692 6.970502856831253E-7 0.0000025097644122419814 0.000009341733308210992 0.00001699613417881717 0.000033426381769641916 0.000057817829717252456 0.00008413408598183135 0.0001159460434494769 0.00016570616231837847 0.00023213625592551817 0.000290074187274256 0.00032066549541832353 0.00033825695584043897 0.0003605926497320419 0.0003746363628123277 0.00035330476953749956 0.00029998032794169413 0.00024459489967905814 0.00020099329412540167 0.00016134910101133556 0.00012122019196753659 0.00008929388863324011 0.00006978108319975057 0.00005473562818606756 0.00003722540034797237 0.000021744405128659573 0.000014330775707505259 0.000011558312453099384 0.000008699922739314137 0.000004768890798278275 0.000003239704682993547 0.0000055422661685843015 0.000014781998225037773 0.000022238587657551303 0.00004136804712597429 0.0000744882845324975 0.00011594604344947612 0.0001666521654078993 0.00023726111223035538 0.00032644896295366577 0.0004090335134792776 0.00046332858412138727 0.0004984623059909907 0.0005270594962774776 0.0005328767055493025 0.0004938311102070535 0.0004227198059680326 0.00035198131564532776 0.0002915683115640537 0.00023073618568791163 0.00016975481507747054 0.00012413553643969715 0.00009890637973825761 0.00008236911364063543 0.0000617435694078432 0.0000394729694147359 0.000024903658690916645 0.00001716538851728297 0.000011558312453099892 0.00000743690503610177 0.000007875181309265814 0.000011415154720127604 0.000020781451388427978 0.000031057107119734 0.000057456869677796365 0.00010458020730616547 0.0001657061623183771 0.00023726111223035463 0.0003264975165632666 0.000434454572114831 0.0005429488252746263 0.0006304765274554547 0.00069236234754882 0.00072616329189731 0.0007162791068696817 0.0006575346592259326 0.0005759894400297511 0.0004998642579464914 0.00042737201057619067 0.00034311220896240247 0.00025434264967278514 0.00018599940050380352 0.00014536777784027074 0.00011899803177516411 0.00009202995412545186 0.00006383462345803074 0.000041284929518961834 0.000024903658690917062 0.000014330775707506279 0.000009782308601454028 0.000011326048856833026 0.0000160538986806983 0.000025213591859049242 0.00004262943994522873 0.00008197322550826339 0.0001479515150689903 0.00023213625592551667 0.0003264489629536647 0.00043445457211483074 0.0005606707485081433 0.0006969509137475135 0.0008239745350408541 0.0009202033550585044 0.0009632349493911857 0.000939591524689103 0.0008649531896832548 0.0007774910755573726 0.0006972250267069887 0.0006092634042455408 0.0004963521413852135 0.0003738581341875531 0.0002744930032920301 0.00020825311966694518 0.00016298950258330377 0.0001254154478450801 0.00009202547110128748 0.00006383462345803163 0.000039472969414737236 0.000021744405128661257 0.00001335284278748225 0.000013239288145537956 0.0000178486392751365 0.000029077834577928375 0.000053844133215540556 0.0001048774832379811 0.00018588342694629196 0.00029007418727425445 0.0004090335134792761 0.0005429488252746256 0.0006969509137475128 0.0008703087826223931 0.0010447624265133965 0.0011822360315786283 0.0012408721734380656 0.0012087368131948207 0.0011191498215588763 0.0010183403054298266 0.0009190083262633676 0.0008015254916949629 0.0006561523056794468 0.0005052944369660862 0.0003796380781566101 0.00028670028072872876 0.00021817936648991154 0.00016606419909648762 0.00012541544784508088 0.00009202995412545372 0.00006174356940784493 0.00003722540034797466 0.000023259926778895705 0.000019165279029503527 0.000020711875659538192 0.000034395759926611816 0.0000625875346234672 0.00011779395139745214 0.0002042498623303521 0.000320665495418322 0.0004633285841213858 0.0006304765274554535 0.0008239745350408528 0.0010447624265133954 0.0012722104792645403 0.001453351627041378 0.001531174685949778 0.001494949249301124 0.0013888305176585182 0.0012624736503087045 0.0011270689633863331 0.0009705099287999332 0.0007970503483696792 0.0006317512268016305 0.0004938979088174631 0.0003820241157457572 0.00029029939436915896 0.00021817936648991327 0.00016298950258330627 0.00011899803177516705 0.0000823691136406388 0.00005473562818607056 0.00003812009777227764 0.000029796252276296933 0.00002671170950945837 0.00004131938524832065 0.00006945342397726513 0.00012514458310738783 0.00021384675885703611 0.00033825695584043766 0.000498462305990989 0.0006923623475488187 0.0009202033550585028 0.0011822360315786266 0.0014533516270413775 0.0016700548810745601 0.0017673346539450819 0.0017355804206419594 0.0016224551241649761 0.0014775571166892995 0.001314527940152104 0.0011311065461327954 0.0009407587239141541 0.0007668541041885596 0.000619928935496512 0.00049361402355586 0.00038202411574575956 0.0002867002807287322 0.00020825311966694894 0.00014536777784027486 0.00009890637973826121 0.00006978108319975414 0.0000534867730496891 0.000042443516252489434 0.00003538581682921752 0.0000463979584661309 0.00007386269411413252 0.000132679124827921 0.00022811134622592447 0.0003605926497320408 0.0005270594962774761 0.0007261632918973087 0.000963234949391184 0.0012408721734380637 0.001531174685949776 0.0017673346539450803 0.0018846393517467812 0.0018739209437563748 0.001779416797872277 0.0016478117139200573 0.0014941165032954463 0.0013165680957763373 0.0011239034969201707 0.0009350204265439972 0.0007654503468072599 0.0006199289354965151 0.0004938979088174678 0.0003796380781566151 0.0002744930032920351 0.00018599940050380816 0.00012413553643970124 0.00008929388863324354 0.00007040658488428546 0.00005534001214467886 0.0000436586452042519 0.00004926469609027327 0.00007494986032959262 0.00013665578847336972 0.00023897829057065127 0.00037463636281232697 0.0005328767055493013 0.000716279106869681 0.0009395915246891014 0.0012087368131948187 0.0014949492493011216 0.0017355804206419573 0.001873920943756373 0.0018998605429481818 0.00184749830338485 0.0017585618402871442 0.0016503940612064283 0.0015145682355305668 0.0013402003972896616 0.001136247025905845 0.000935020426544 0.0007668541041885649 0.0006317512268016363 0.0005052944369660918 0.00037385813418755833 0.0002543426496727901 0.00016975481507747447 0.00012122019196753992 0.00009227334361629777 0.00006872525418735562 0.0000508101874324503 0.00005216389130005088 0.0000727333162074879 0.0001291653947954468 0.00022688081584744315 0.0003533047695374988 0.0004938311102070524 0.0006575346592259315 0.0008649531896832535 0.0011191498215588744 0.0013888305176585152 0.0016224551241649724 0.001779416797872274 0.0018474983033848478 0.0018436353554615178 0.0018017261947860226 0.0017464322160936929 0.001668717292534461 0.001536173869727401 0.0013402003972896642 0.0011239034969201752 0.0009407587239141604 0.0007970503483696854 0.0006561523056794524 0.0004963521413852187 0.00034311220896240675 0.00023073618568791534 0.00016134910101133827 0.00011571395533526785 0.00008108726648983324 0.0000577321381780585 0.000055347440243332746 0.00006979335205074802 0.00011389516179237009 0.000193728292361304 0.00029998032794169424 0.000422719805968032 0.0005759894400297508 0.0007774910755573715 0.0010183403054298248 0.0012624736503087015 0.0014775571166892956 0.0016478117139200523 0.0017585618402871396 0.0018017261947860196 0.001796369665921987 0.0017766517541786214 0.00174687823070364 0.0016687172925344623 0.00151456823553057 0.0013165680957763425 0.0011311065461328017 0.0009705099287999391 0.0008015254916949681 0.0006092634042455452 0.00042737201057619473 0.000291568311564057 0.0002009932941254042 0.00013678820046357368 0.00009111223839643536 0.00006378627298063327 0.000057049049509910456 0.00006774528075202643 0.00010098659556921448 0.0001608040602893086 0.0002445948996790586 0.0003519813156453279 0.0004998642579464915 0.0006972250267069885 0.0009190083262633666 0.001127068963386331 0.0013145279401521005 0.001494116503295441 0.0016503940612064222 0.0017464322160936868 0.0017766517541786186 0.0017783579871622295 0.001776651754178623 0.001746432216093695 0.0016503940612064322 0.0014941165032954517 0.0013145279401521105 0.0011270689633863388 0.0009190083262633726 0.0006972250267069928 0.0004998642579464948 0.00035198131564533053 0.0002445948996790599 0.0001608040602893092 0.00010098659556921475 0.00006774528075202641 0.000055347440243332136 0.00006378627298063274 0.0000911122383964348 0.00013678820046357293 0.00020099329412540302 0.00029156831156405464 0.0004273720105761917 0.0006092634042455413 0.000801525491694963 0.0009705099287999322 0.0011311065461327933 0.001316568095776333 0.0015145682355305608 0.001668717292534454 0.0017468782307036345 0.0017766517541786193 0.0017963696659219891 0.0018017261947860259 0.001758561840287149 0.0016478117139200632 0.0014775571166893064 0.0012624736503087104 0.0010183403054298311 0.0007774910755573762 0.0005759894400297542 0.0004227198059680346 0.0002999803279416955 0.00019372829236130444 0.00011389516179237006 0.00006979335205074748 0.00005216389130004984 0.00005773213817805767 0.0000810872664898324 0.0001157139553352671 0.00016134910101133718 0.0002307361856879134 0.0003431122089624042 0.0004963521413852153 0.000656152305679448 0.0007970503483696796 0.000940758723914153 0.0011239034969201679 0.0013402003972896568 0.0015361738697273939 0.0016687172925344553 0.0017464322160936894 0.0018017261947860226 0.0018436353554615215 0.0018474983033848554 0.0017794167978722837 0.0016224551241649824 0.001388830517658523 0.0011191498215588802 0.0008649531896832576 0.0006575346592259345 0.0004938311102070548 0.00035330476953750005 0.0002268808158474435 0.0001291653947954466 0.00007273331620748715 0.000049264696090271817 0.00005081018743244911 0.00006872525418735452 0.00009227334361629671 0.00012122019196753882 0.0001697548150774728 0.000254342649672788 0.000373858134187556 0.0005052944369660891 0.0006317512268016328 0.000766854104188561 0.0009350204265439969 0.0011362470259058427 0.0013402003972896592 0.0015145682355305642 0.0016503940612064261 0.0017585618402871444 0.0018474983033848534 0.0018998605429481894 0.0018739209437563821 0.0017355804206419664 0.0014949492493011288 0.0012087368131948244 0.0009395915246891051 0.0007162791068696837 0.0005328767055493034 0.000374636362812328 0.00023897829057065138 0.00013665578847336943 0.00007494986032959166 0.00004639795846612882 0.00004365864520425 0.00005534001214467697 0.00007040658488428361 0.00008929388863324196 0.00012413553643969932 0.00018599940050380629 0.0002744930032920332 0.0003796380781566137 0.0004938979088174662 0.0006199289354965147 0.0007654503468072608 0.0009350204265439996 0.0011239034969201722 0.0013165680957763384 0.0014941165032954463 0.0016478117139200584 0.0017794167978722802 0.0018739209437563806 0.0018846393517467875 0.0017673346539450866 0.001531174685949781 0.0012408721734380678 0.0009632349493911869 0.0007261632918973106 0.0005270594962774775 0.00036059264973204135 0.0002281113462259241 0.00013267912482792018 0.00007386269411413107 0.00004131938524831839 0.00003538581682921517 0.00004244351625248737 0.00005348677304968685 0.00006978108319975224 0.00009890637973825949 0.00014536777784027334 0.00020825311966694832 0.00028670028072873255 0.0003820241157457613 0.0004936140235558639 0.0006199289354965177 0.0007668541041885661 0.0009407587239141592 0.0011311065461327996 0.001314527940152107 0.0014775571166893023 0.0016224551241649794 0.0017355804206419638 0.0017673346539450858 0.001670054881074564 0.0014533516270413805 0.0011822360315786294 0.0009202033550585047 0.0006923623475488202 0.0004984623059909901 0.000338256955840438 0.0002138467588570357 0.0001251445831073871 0.00006945342397726345 0.00003439575992660924 0.000026711709509455493 0.000029796252276294477 0.00003812009777227482 0.00005473562818606821 0.00008236911364063684 0.00011899803177516564 0.00016298950258330637 0.00021817936648991493 0.00029029939436916313 0.000382024115745764 0.0004938979088174711 0.0006317512268016389 0.0007970503483696857 0.0009705099287999384 0.0011270689633863368 0.0012624736503087078 0.0013888305176585204 0.0014949492493011266 0.0015311746859497793 0.0014533516270413796 0.001272210479264541 0.0010447624265133965 0.0008239745350408537 0.0006304765274554541 0.0004633285841213861 0.0003206654954183219 0.0002042498623303512 0.0001177939513974512 0.00006258753462346509 0.000029077834577926434 0.000020711875659535735 0.000019165279029501592 0.000023259926778893438 0.00003722540034797272 0.00006174356940784373 0.00009202995412545284 0.00012541544784508155 0.00016606419909648984 0.00021817936648991642 0.000286700280728736 0.0003796380781566185 0.0005052944369660947 0.0006561523056794536 0.0008015254916949681 0.0009190083262633716 0.0010183403054298292 0.0011191498215588783 0.0012087368131948222 0.0012408721734380658 0.0011822360315786277 0.0010447624265133956 0.0008703087826223929 0.0006969509137475131 0.0005429488252746255 0.0004090335134792762 0.0002900741872742544 0.00018588342694629163 0.00010487748323798067 0.00005384413321553895 0.00002521359185904781 0.00001784863927513455 0.000013239288145536533 0.00001335284278748044 0.0000217444051286598 0.000039472969414736464 0.0000638346234580312 0.00009202547110128851 0.00012541544784508264 0.0001629895025833087 0.0002082531196669524 0.00027449300329203814 0.00037385813418756137 0.0004963521413852202 0.0006092634042455458 0.0006972250267069927 0.0007774910755573752 0.0008649531896832565 0.0009395915246891038 0.0009632349493911852 0.0009202033550585032 0.0008239745350408527 0.0006969509137475122 0.0005606707485081424 0.00043445457211482966 0.00032644896295366403 0.00023213625592551632 0.00014795151506899 0.00008197322550826322 0.00004262943994522755 0.00002078145138842728 0.000016053898680697313 0.000011326048856832496 0.000009782308601453196 0.000014330775707505806 0.000024903658690917167 0.00004128492951896229 0.00006383462345803226 0.00009202995412545496 0.00011899803177516879 0.00014536777784027787 0.0001859994005038109 0.00025434264967279317 0.00034311220896240843 0.00042737201057619576 0.0004998642579464947 0.0005759894400297537 0.0006575346592259335 0.0007162791068696828 0.0007261632918973093 0.000692362347548819 0.000630476527455453 0.0005429488252746246 0.0004344545721148293 0.0003264975165632649 0.00023726111223035354 0.0001657061623183768 0.00010458020730616544 0.00005745686967779656 0.000031057107119733545 0.000014781998225037387 0.000011415154720127074 0.000007875181309265827 0.000007436905036101565 0.000011558312453100087 0.000017165388517283577 0.000024903658690917567 0.000039472969414737616 0.00006174356940784585 0.00008236911364063969 0.00009890637973826364 0.0001241355364397033 0.00016975481507747718 0.00023073618568791675 0.0002915683115640578 0.0003519813156453304 0.0004227198059680342 0.0004938311102070538 0.0005328767055493023 0.0005270594962774761 0.0004984623059909885 0.00046332858412138456 0.0004090335134792746 0.0003264489629536629 0.00023726111223035273 0.00016665216540789746 0.00011594604344947528 0.00007448828453249714 0.00004136804712597431 0.00002223858765755101 0.000009341733308210754 0.000005542266168584129 0.0000032397046829939325 0.000004768890798278595 0.000008699922739314856 0.000011558312453100626 0.000014330775707506627 0.000021744405128661525 0.00003722540034797516 0.00005473562818607148 0.00006978108319975598 0.00008929388863324568 0.00012122019196754244 0.00016134910101134014 0.00020099329412540538 0.00024459489967906063 0.0002999803279416955 0.0003533047695374996 0.00037463636281232735 0.00036059264973204043 0.0003382569558404369 0.0003206654954183206 0.0002900741872742528 0.00023213625592551489 0.0001657061623183754 0.00011594604344947457 0.00008413408598182995 0.00005781782971725161 0.000033426381769641516 0.00001699613417881685 0.00000600479549669807 0.0000025097644122418175 6.970502856835564E-7 0.0000021034541385337067 0.000004768890798278901 0.000007436905036102499 0.000009782308601454277 0.000013352842787482321 0.000023259926778895657 0.000038120097772277824 0.00005348677304968987 0.00007040658488428666 0.00009227334361629942 0.00011571395533526948 0.00013678820046357463 0.0001608040602893099 0.00019372829236130444 0.00022688081584744323 0.0002389782905706508 0.00022811134622592328 0.0002138467588570345 0.00020424986233035 0.00018588342694628987 0.0001479515150689883 0.00010458020730616361 0.00007448828453249581 0.000057817829717250905 0.00004337238133691177 0.000026517972173530918 0.000012912197025181688 0.00000399643904051191 0.0000023858417075123582 6.283755755599387E-7 6.970502856838313E-7 0.0000032397046829945525 0.000007875181309266803 0.000011326048856833751 0.000013239288145538268 0.000019165279029504045 0.000029796252276297184 0.00004244351625249042 0.000055340012144679626 0.00006872525418735701 0.00008108726648983418 0.00009111223839643622 0.00010098659556921542 0.00011389516179237047 0.0001291653947954465 0.00013665578847336918 0.00013267912482791962 0.00012514458310738648 0.00011779395139745038 0.0001048774832379793 0.00008197322550826157 0.00005745686967779466 0.00004136804712597267 0.00003342638176964038 0.00002651797217353041 0.000016860768505250757 0.000008048688828865619 0.000002137322893978969 0.000002762615652370274 0.0000023858417075129033 0.0000025097644122426565 0.0000055422661685851985 0.00001141515472012854 0.000016053898680698926 0.000017848639275136702 0.000020711875659538226 0.000026711709509458285 0.00003538581682921774 0.00004365864520425236 0.00005081018743245126 0.000057732138178059254 0.0000637862729806338 0.00006774528075202696 0.00006979335205074783 0.00007273331620748723 0.00007494986032959162 0.00007386269411413088 0.00006945342397726313 0.00006258753462346482 0.00005384413321553829 0.00004262943994522644 0.00003105710711973199 0.000022238587657549456 0.000016996134178815524 0.000012912197025180743 0.000008048688828864992 0.0000036084647764516905 8.73149757648946E-7 0.000001572758838966122 0.000002137322893979895 0.000002455953188554111 0.000004556866447380913 0.000010512830864501505 0.000017412833723631164 0.00002043402073581053 0.00002254157915948041 0.000028324619977964293 0.00003557185750931483 0.00003732366030448136 0.000034944686828870006 0.00003597365585370068 0.000041943241076210116 0.000045894925507421126 0.00004194324107621001 0.000035973655853700466 0.000034944686828870114 0.00003732366030448158 0.000035571857509315375 0.00002832461997796478 0.000022541579159481115 0.000020434020735811832 0.00001741283372363271 0.000010512830864502996 0.000004556866447382051 0.0000024559531885546803 0.0000021373228939800372 0.0000015727588389660542 0.0000015727588389653844 0.0000018701035482082512 0.000003608464776452416 0.000005535614846582189 0.000008151547957648525 0.00001299998014039879 0.00001954853828186793 0.000025034130620912433 0.000030180522486131775 0.000036828364883750426 0.000043235477902207156 0.00004471729841545048 0.000042337647069579435 0.00004185228624762004 0.000046039876205685614 0.000050287544943851445 0.000048040463162600606 0.000042464763661088364 0.00003927679355651664 0.0000381825714902006 0.00003378055041345835 0.00002584965898538766 0.000020532050107830184 0.00001908838218432385 0.000017076032718201206 0.000010520403821839167 0.000003983409389725189 0.0000020367229778577654 0.0000027626156523706003 0.0000028589217517652334 0.0000021373228939785494 0.000003608464776451687 0.000008048688828865551 0.000012912197025181463 0.000016996134178816103 0.000022238587657550002 0.000031057107119732766 0.00004262943994522755 0.00005384413321554019 0.00006258753462346737 0.00006945342397726634 0.00007386269411413395 0.00007494986032959446 0.0000727333162074898 0.0000697933520507496 0.00006774528075202793 0.00006378627298063517 0.0000577321381780606 0.000050810187432452754 0.000043658645204254134 0.00003538581682921929 0.000026711709509459118 0.000020711875659539025 0.000017848639275137772 0.000016053898680700457 0.000011415154720129993 0.0000055422661685865275 0.0000025097644122433337 0.0000023858417075126293 0.000002762615652369644 0.000002455953188552689 0.000005535614846581098 0.000012912197025180914 0.000022149799803210258 0.00003031114107912091 0.000039760684445875734 0.000056160024501310903 0.00007998449698244437 0.00010298248083767322 0.00011796120117655212 0.00012834877183814046 0.00013880284057141154 0.0001455277698635257 0.0001400195734721005 0.00012382628362151048 0.00010792134312512538 0.00009660617943874882 0.00008633426488525863 0.0000731971162145227 0.00005906705547390762 0.00004701150675251195 0.000037064620009630994 0.000028766629952463148 0.000022572177159266623 0.000019053487707618325 0.00001548697647509452 0.000010432721977932138 0.000005404657006736728 0.0000025097644122421957 0.0000020367229778559735 0.0000045568664473796735 0.000008151547957647344 0.000016996134178815236 0.00003031114107912057 0.000044858176309476136 0.0000628474097560231 0.00009205475009134019 0.00013378777557353032 0.0001748674317616085 0.00020226617109820954 0.00022075191810651205 0.00023905748114611065 0.0002496268489333396 0.00023703570095634513 0.0002045318754074676 0.00017215285754228465 0.0001496949219517533 0.0001310749938927138 0.00010991083482162284 0.00008970530400963329 0.00007498642144383938 0.00006307845147369026 0.0000496682937203212 0.00003641977923896746 0.000027686800341352137 0.000022426327257495115 0.0000169975326660168 0.000010432721977930847 0.000005542266168584273 0.00000398340938972269 0.000010512830864500727 0.000012999980140397884 0.000022238587657549172 0.00003976068444587528 0.000062847409756023 0.00009243873198667849 0.0001360065985799567 0.00019532748400063064 0.0002556769954001602 0.00030038990046507395 0.00033140131162270805 0.000356042219048441 0.0003650484672224081 0.0003440034197444266 0.0003006000119108411 0.00025788940385115095 0.00022539912279093648 0.00019570183389348744 0.00016417085279852464 0.0001371915999013091 0.0001189677434764404 0.00010322000910759442 0.00008184139687993344 0.00005799357828135614 0.00004046369803591311 0.00003005028381016287 0.000022426327257493984 0.000015486976475092303 0.000011415154720127205 0.00001052040382183655 0.00001741283372363091 0.000019548538281867484 0.00003105710711973213 0.00005616002450131058 0.00009205475009134022 0.00013600659857995672 0.00019199258158379177 0.0002623235230572621 0.00033639172392144255 0.0003988059216545913 0.00044462886976899714 0.0004735132988821233 0.0004787892601050375 0.0004557180282623749 0.00041543744447833744 0.00037446751049341297 0.0003349742989234355 0.0002898163901862278 0.00024181346590353492 0.00020289046441401755 0.0001759200090281835 0.00015154206168440916 0.0001202124077839763 0.00008587912888930806 0.000058839255895104785 0.00004046369803591205 0.000027686800341350223 0.000019053487707615692 0.0000160538986806976 0.000017076032718198902 0.000020434020735810795 0.000025034130620912586 0.00004262943994522741 0.00007998449698244444 0.00013378777557353076 0.00019532748400063115 0.00026232352305726267 0.0003384606851108126 0.00042223688521968693 0.0005030317145494122 0.0005666602319166294 0.0006011759042085236 0.0006045988410517454 0.0005865215698875149 0.000560334919535245 0.0005287625121494365 0.00048131016516047485 0.00041445894177783837 0.0003443313341783644 0.0002890580940773154 0.0002477776759972901 0.0002087267249035101 0.0001648417828318426 0.00012121774671322388 0.0000858791288893079 0.00005799357828135503 0.00003641977923896559 0.000022572177159264296 0.000017848639275135577 0.000019088382184322324 0.000022541579159480438 0.000030180522486131836 0.00005384413321553998 0.00010298248083767297 0.00017486743176160858 0.0002556769954001603 0.00033639172392144277 0.00042223688521968655 0.000522213776046088 0.0006296342986623047 0.0007178665296542983 0.0007609761381989926 0.0007619127265753567 0.0007465776724080118 0.000731338663629734 0.0007038565058097151 0.0006423483931220747 0.0005519973573561713 0.00046335640422670647 0.000395765185072558 0.00033999731898393977 0.0002817392936413644 0.0002203339374047312 0.00016484178283184225 0.00012021240778397596 0.00008184139687993205 0.000049668293720319455 0.000028766629952461023 0.00002071187565953727 0.000020532050107829174 0.0000283246199779644 0.00003682836488375047 0.00006258753462346728 0.0001179612011765518 0.00020226617109820946 0.0003003899004650738 0.00039880592165459104 0.0005030317145494111 0.0006296342986623036 0.0007727221740842524 0.0008912224146887228 0.0009450532555018931 0.0009416347748850405 0.0009218909549822114 0.0009055757124909051 0.0008701737083641742 0.0007900599153244937 0.0006814304005537377 0.0005841060597842265 0.0005122217700908191 0.0004453625188348296 0.0003660870006756803 0.000281739293641364 0.00020872672490350954 0.0001515420616844086 0.00010322000910759309 0.00006307845147368843 0.00003706462000962894 0.000026711709509457732 0.00002584965898538693 0.00003557185750931473 0.00004323547790220699 0.00006945342397726592 0.00012834877183813987 0.00022075191810651165 0.0003314013116227074 0.0004446288697689965 0.0005666602319166277 0.0007178665296542958 0.0008912224146887213 0.0010359122065182215 0.0011033690494170352 0.0011029764516615197 0.0010826685402583528 0.0010633634004518972 0.0010189283889044795 0.000924856441188799 0.0008039528511211447 0.0006992403467680923 0.0006206635119981436 0.0005424395332519894 0.0004453625188348291 0.00033999731898393874 0.00024777767599728904 0.00017592000902818243 0.00011896774347643816 0.00007498642144383707 0.000047011506752509497 0.000035385816829217554 0.000033780550413457466 0.00003732366030448127 0.000044717298415450275 0.00007386269411413385 0.00013880284057141108 0.00023905748114611027 0.00035604221904844046 0.0004735132988821227 0.0006011759042085219 0.0007609761381989897 0.0009450532555018899 0.0011033690494170328 0.0011893217655105709 0.0012098210104861294 0.0012065670294402883 0.0011973429792128606 0.0011579051791739592 0.001064658884371395 0.0009370424568941269 0.0008161527036543634 0.0007164119706880112 0.0006206635119981425 0.0005122217700908176 0.00039576518507255626 0.00028905809407731367 0.00020289046441401555 0.00013719159990130647 0.00008970530400963048 0.00005906705547390514 0.000043658645204252765 0.00003818257149019987 0.00003494468682887018 0.00004233764706957948 0.00007494986032959442 0.00014552776986352558 0.00024962684893333994 0.0003650484672224083 0.00047878926010503796 0.0006045988410517448 0.0007619127265753547 0.0009416347748850375 0.001102976451661517 0.0012098210104861276 0.0012632413019571759 0.001288367892250479 0.001297557394589066 0.0012756356763438045 0.0012018072025311488 0.0010815579702260186 0.0009448279369217326 0.0008161527036543626 0.0006992403467680908 0.0005841060597842248 0.0004633564042267046 0.0003443313341783627 0.00024181346590353313 0.00016417085279852193 0.00010991083482162055 0.00007319711621452102 0.000050810187432451995 0.00003927679355651668 0.00003597365585370076 0.00004185228624762028 0.00007273331620748986 0.00014001957347210052 0.00023703570095634545 0.00034400341974442726 0.00045571802826237576 0.0005865215698875154 0.000746577672408011 0.0009218909549822096 0.0010826685402583502 0.0012065670294402868 0.0012883678922504783 0.0013339022226082516 0.0013517795309755719 0.001344556015996116 0.0013021331758599143 0.0012123734799485103 0.0010815579702260186 0.0009370424568941262 0.0008039528511211433 0.0006814304005537364 0.0005519973573561699 0.000414458941777837 0.00028981639018622613 0.0001957018338934856 0.0001310749938927123 0.00008633426488525771 0.00005773213817806066 0.00004246476366108878 0.000041943241076210354 0.000046039876205686075 0.00006979335205075006 0.00012382628362151105 0.00020453187540746845 0.0003006000119108421 0.00041543744447833906 0.0005603349195352462 0.0007313386636297344 0.0009055757124909049 0.0010633634004518961 0.0011973429792128596 0.0012975573945890652 0.0013517795309755717 0.0013659066902064595 0.0013626764404337497 0.0013490440679071677 0.001302133175859914 0.0012018072025311484 0.0010646588843713938 0.0009248564411887978 0.0007900599153244927 0.0006423483931220738 0.0004813101651604738 0.00033497429892343454 0.00022539912279093526 0.0001496949219517527 0.00009660617943874877 0.00006378627298063568 0.000048040463162601446 0.00004589492550742116 0.000050287544943851825 0.00006774528075202842 0.00010792134312512572 0.0001721528575422854 0.00025788940385115203 0.0003744675104934146 0.0005287625121494382 0.0007038565058097165 0.0008701737083641753 0.00101892838890448 0.001157905179173959 0.0012756356763438045 0.0013445560159961157 0.00136267644043375 0.0013618288308587466 0.0013626764404337493 0.001344556015996115 0.001275635676343804 0.0011579051791739585 0.0010189283889044793 0.0008701737083641743 0.0007038565058097152 0.0005287625121494363 0.0003744675104934125 0.0002578894038511504 0.00017215285754228454 0.00010792134312512586 0.0000677452807520289 0.000050287544943852164 0.00004194324107620965 0.00004804046316260057 0.000063786272980635 0.00009660617943874859 0.0001496949219517536 0.00022539912279093688 0.0003349742989234367 0.00048131016516047615 0.000642348393122076 0.0007900599153244952 0.0009248564411888004 0.0010646588843713958 0.0012018072025311495 0.0013021331758599145 0.0013490440679071682 0.0013626764404337493 0.0013659066902064589 0.001351779530975571 0.0012975573945890658 0.001197342979212861 0.0010633634004518983 0.0009055757124909059 0.0007313386636297341 0.0005603349195352446 0.00041543744447833695 0.00030060001191084036 0.00020453187540746758 0.00012382628362151088 0.0000697933520507501 0.000046039876205685736 0.00003597365585370008 0.00004246476366108828 0.00005773213817806051 0.00008633426488525826 0.00013107499389271383 0.00019570183389348777 0.0002898163901862286 0.00041445894177783934 0.0005519973573561722 0.0006814304005537391 0.0008039528511211465 0.0009370424568941289 0.0010815579702260199 0.0012123734799485107 0.0013021331758599143 0.001344556015996115 0.0013517795309755708 0.001333902222608251 0.0012883678922504796 0.0012065670294402898 0.001082668540258354 0.0009218909549822121 0.0007465776724080115 0.000586521569887514 0.0004557180282623739 0.00034400341974442586 0.00023703570095634486 0.00014001957347210052 0.00007273331620748989 0.000041852286247619986 0.00003494468682886992 0.000039276793556516913 0.000050810187432452794 0.0000731971162145224 0.00010991083482162277 0.0001641708527985245 0.0002418134659035356 0.00034433133417836496 0.0004633564042267073 0.0005841060597842276 0.0006992403467680943 0.0008161527036543659 0.0009448279369217349 0.0010815579702260199 0.001201807202531149 0.0012756356763438039 0.0012975573945890654 0.001288367892250479 0.0012632413019571782 0.0012098210104861317 0.0011029764516615219 0.000941634774885041 0.0007619127265753562 0.000604598841051744 0.00047878926010503677 0.00036504846722240744 0.0002496268489333397 0.00014552776986352585 0.00007494986032959475 0.000042337647069579536 0.00003732366030448152 0.00003818257149020075 0.00004365864520425418 0.00005906705547390704 0.00008970530400963302 0.0001371915999013088 0.00020289046441401753 0.0002890580940773151 0.00039576518507255766 0.0005122217700908191 0.0006206635119981446 0.0007164119706880132 0.0008161527036543651 0.0009370424568941278 0.0010646588843713947 0.0011579051791739583 0.0011973429792128598 0.0012065670294402879 0.0012098210104861302 0.0011893217655105726 0.0011033690494170354 0.0009450532555018917 0.0007609761381989906 0.0006011759042085212 0.00047351329888212186 0.0003560422190484401 0.00023905748114611062 0.00013880284057141162 0.00007386269411413446 0.00004471729841545076 0.00003557185750931526 0.000033780550413458475 0.000035385816829219336 0.000047011506752511394 0.00007498642144383921 0.00011896774347643996 0.0001759200090281835 0.0002477776759972896 0.0003399973189839388 0.0004453625188348288 0.0005424395332519895 0.0006206635119981439 0.0006992403467680928 0.0008039528511211452 0.0009248564411887994 0.0010189283889044797 0.001063363400451897 0.001082668540258352 0.0011029764516615188 0.0011033690494170335 0.0010359122065182207 0.0008912224146887203 0.0007178665296542953 0.0005666602319166269 0.0004446288697689959 0.00033140131162270745 0.00022075191810651222 0.0001283487718381406 0.00006945342397726687 0.00004323547790220758 0.00002832461997796456 0.00002584965898538739 0.000026711709509459108 0.00003706462000963019 0.00006307845147368975 0.00010322000910759397 0.00015154206168440892 0.0002087267249035096 0.0002817392936413632 0.0003660870006756789 0.000445362518834828 0.0005122217700908177 0.0005841060597842259 0.0006814304005537374 0.0007900599153244942 0.0008701737083641752 0.0009055757124909055 0.0009218909549822101 0.0009416347748850379 0.0009450532555018884 0.0008912224146887185 0.0007727221740842489 0.0006296342986623015 0.0005030317145494099 0.00039880592165459017 0.0003003899004650734 0.00020226617109820965 0.00011796120117655204 0.00006258753462346795 0.00003682836488375057 0.000022541579159480838 0.000020532050107829706 0.000020711875659538812 0.000028766629952462443 0.00004966829372032076 0.00008184139687993308 0.0001202124077839763 0.00016484178283184236 0.00022033393740473033 0.00028173929364136267 0.00033999731898393766 0.00039576518507255577 0.0004633564042267051 0.0005519973573561708 0.0006423483931220749 0.0007038565058097163 0.0007313386636297343 0.0007465776724080108 0.0007619127265753537 0.0007609761381989874 0.0007178665296542929 0.0006296342986623004 0.0005222137760460855 0.0004222368852196855 0.00033639172392144217 0.00025567699540016023 0.00017486743176160888 0.00010298248083767345 0.000053844133215540834 0.000030180522486132033 0.000020434020735811588 0.00001908838218432317 0.00001784863927513727 0.000022572177159265654 0.00003641977923896669 0.00005799357828135579 0.00008587912888930802 0.00012121774671322405 0.00016484178283184212 0.00020872672490350892 0.00024777767599728833 0.0002890580940773132 0.00034433133417836295 0.0004144589417778378 0.00048131016516047507 0.0005287625121494377 0.0005603349195352457 0.0005865215698875145 0.0006045988410517431 0.0006011759042085194 0.0005666602319166252 0.0005030317145494089 0.00042223688521968514 0.00033846068511081217 0.0002623235230572623 0.0001953274840006312 0.00013378777557353106 0.00007998449698244501 0.00004262943994522851 0.000025034130620913118 0.000017412833723632983 0.00001707603271820102 0.000016053898680700068 0.00001905348770761748 0.000027686800341351327 0.00004046369803591245 0.00005883925589510464 0.00008587912888930786 0.00012021240778397615 0.00015154206168440832 0.00017592000902818243 0.00020289046441401544 0.00024181346590353365 0.00028981639018622684 0.0003349742989234357 0.0003744675104934138 0.0004154374444783384 0.0004557180282623746 0.0004787892601050369 0.000473513298882121 0.00044462886976899524 0.0003988059216545899 0.0003363917239214424 0.0002623235230572628 0.0001919925815837926 0.00013600659857995767 0.00009205475009134139 0.000056160024501312055 0.00003105710711973423 0.000019548538281869368 0.00001051283086450379 0.00001052040382183948 0.000011415154720129966 0.000015486976475093797 0.000022426327257494238 0.000030050283810161985 0.00004046369803591153 0.00005799357828135471 0.00008184139687993207 0.00010322000910759261 0.00011896774347643806 0.0001371915999013061 0.000164170852798522 0.0001957018338934858 0.00022539912279093588 0.00025788940385115117 0.00030060001191084144 0.00034400341974442645 0.00036504846722240755 0.0003560422190484396 0.00033140131162270685 0.00030038990046507325 0.00025567699540016034 0.00019532748400063164 0.00013600659857995772 0.00009243873198667972 0.00006284740975602455 0.00003976068444587723 0.00002223858765755192 0.00001299998014040068 0.000004556866447383407 0.000003983409389726192 0.000005542266168587071 0.000010432721977931928 0.000016997532666016137 0.000022426327257493113 0.000027686800341349423 0.00003641977923896498 0.00004966829372031921 0.00006307845147368805 0.0000749864214438368 0.00008970530400963029 0.00010991083482162049 0.00013107499389271237 0.0001496949219517529 0.00017215285754228516 0.00020453187540746831 0.00023703570095634535 0.00024962684893333983 0.00023905748114611027 0.00022075191810651203 0.00020226617109820967 0.00017486743176160912 0.00013378777557353154 0.00009205475009134147 0.00006284740975602455 0.00004485817630947802 0.00003031114107912289 0.00001699613417881837 0.000008151547957650781 0.000002455953188556177 0.000002036722977859156 0.000002509764412244402 0.000005404657006736967 0.00001043272197793052 0.00001548697647509154 0.000019053487707614757 0.000022572177159263425 0.000028766629952460417 0.00003706462000962825 0.0000470115067525089 0.000059067055473904586 0.00007319711621452056 0.0000863342648852576 0.00009660617943874849 0.00010792134312512591 0.00012382628362151126 0.0001400195734721007 0.00014552776986352564 0.00013880284057141124 0.00012834877183813995 0.00011796120117655186 0.0001029824808376733 0.0000799844969824451 0.000056160024501311744 0.00003976068444587685 0.000030311141079122477 0.000022149799803212206 0.000012912197025183665 0.000005535614846584238 0.0000021373228939814696 0.0000027626156523723193 0.0000023858417075143212 0.0000025097644122432617 0.000005542266168584792 0.00001141515472012714 0.00001605389868069723 0.000017848639275135038 0.000020711875659537294 0.000026711709509457614 0.00003538581682921766 0.000043658645204252616 0.00005081018743245207 0.00005773213817806058 0.00006378627298063556 0.00006774528075202873 0.00006979335205075053 0.00007273331620748996 0.00007494986032959469 0.00007386269411413401 0.00006945342397726653 0.00006258753462346775 0.00005384413321554071 0.00004262943994522832 0.0000310571071197336 0.000022238587657551042 0.00001699613417881745 0.0000129121970251831 0.000008048688828867775 0.0000036084647764543023 0.0000015727588389669031 0.0000028589217517666437 0.0000027626156523713634 0.0000020367229778573796 0.000003983409389723629 0.000010520403821836887 0.000017076032718198702 0.000019088382184321667 0.00002053205010782885 0.00002584965898538662 0.000033780550413457534 0.00003818257149019994 0.00003927679355651675 0.00004246476366108888 0.00004804046316260131 0.000050287544943852075 0.000046039876205686116 0.00004185228624762024 0.0000423376470695796 0.000044717298415450525 0.00004323547790220745 0.00003682836488375059 0.00003018052248613219 0.000025034130620913226 0.000019548538281868944 0.000012999980140399761 0.000008151547957649562 0.000005535614846583136 0.0000036084647764535853 0.0000018701035482095566 v_sim-3.7.0/examples/coord_vib_g_co.xyz0000644000353400050620000326704312215546211015126 0000000000000061 Mode 1: freq= 7.09 N -0.44003451495 -0.00038510790 2.12369783068 0.001 -0.151 -0.002 C -1.76594470239 0.00039861437 2.37754210613 0.001 -0.175 0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.003 -0.198 0.001 C -1.33887502024 -0.00450793845 4.73956848945 0.005 -0.183 -0.000 C 0.02462671625 -0.00591801736 4.46614405978 0.005 -0.146 -0.003 C 0.43187566201 -0.00376957955 3.13352499014 0.003 -0.126 -0.003 C -2.63984642995 0.00218980399 1.17162612704 -0.001 -0.187 0.002 N -1.98513620489 0.00132140951 0.00153900685 -0.003 -0.176 0.001 C -2.63911589169 0.00167522827 -1.17277445342 -0.005 -0.167 0.002 C -4.02452897564 0.00329996303 -1.20791476641 -0.005 -0.197 0.004 C -4.73391255267 0.00451580118 -0.00020876193 -0.003 -0.223 0.005 C -4.02924140493 0.00399189729 1.20660077672 -0.001 -0.218 0.004 Co 0.00000000000 0.00000000000 0.00000000000 -0.006 -0.244 -0.006 N -0.43839318333 -0.00054206762 -2.12229806799 -0.007 -0.111 -0.002 C -1.76408906064 -0.00030645034 -2.37697009192 -0.007 -0.135 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 -0.009 -0.136 0.001 C -1.33713102227 -0.00526459193 -4.73855802198 -0.010 -0.103 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 -0.010 -0.070 -0.002 C 0.43371721952 -0.00363389350 -3.13225443930 -0.008 -0.071 -0.003 S -6.53329279136 0.00637481657 -0.11611178087 -0.005 -0.423 0.013 N 2.00981687167 0.00259443239 -0.00000686048 -0.003 -0.057 -0.006 C 2.67119656792 1.17263645248 0.00045766926 -0.036 -0.034 0.003 C 4.06129317470 1.20536051565 0.00241240325 -0.036 0.004 0.001 C 4.76783866331 0.00148799420 0.00346798881 -0.003 0.024 -0.010 C 4.05723810074 -1.20352939940 0.00211502115 0.031 0.004 -0.019 C 2.67108506586 -1.17139122066 0.00026591651 0.030 -0.034 -0.017 C 1.82209539371 2.39842937406 -0.00175320633 -0.070 -0.058 0.015 C 2.33938959521 3.68993217240 -0.00584554905 -0.105 -0.044 0.025 C 1.45736908622 4.77231118002 -0.00917967851 -0.135 -0.068 0.035 C 0.08658913130 4.53522926787 -0.00833235387 -0.129 -0.106 0.036 C -0.35359617412 3.21325694137 -0.00400174376 -0.092 -0.118 0.026 N 0.49290585413 2.18198449515 -0.00068475564 -0.069 -0.103 0.017 S 6.56718562933 -0.11349126889 0.00673479967 0.001 0.121 -0.022 C 1.82142022278 -2.39594383179 -0.00206827421 0.064 -0.058 -0.026 C 2.33969079820 -3.68709653410 -0.00625612120 0.100 -0.044 -0.037 C 1.45789786198 -4.76953179608 -0.00945089783 0.130 -0.068 -0.045 C 0.08684213972 -4.53272927032 -0.00840538011 0.123 -0.106 -0.041 C -0.35393854068 -3.21111942258 -0.00398541364 0.087 -0.119 -0.030 N 0.49225266031 -2.17934076887 -0.00084210065 0.063 -0.103 -0.024 H 1.83694111827 5.77332096953 -0.01265611066 -0.047 -0.017 0.012 H -0.61802819388 5.33967450634 -0.01131742088 -0.044 -0.036 0.013 H 3.39175422949 3.87200638269 -0.00704552340 -0.032 -0.004 0.007 H -1.39787683933 2.98334799634 -0.00369736757 -0.025 -0.043 0.008 H 1.83794742242 -5.77033326187 -0.01295832570 0.046 -0.017 -0.015 H -0.61749414542 -5.33746053721 -0.01121572048 0.042 -0.036 -0.014 H -1.39833026435 -2.98175334118 -0.00345676225 0.023 -0.043 -0.008 H 3.39230213722 -3.86796714602 -0.00754158092 0.030 -0.004 -0.011 H 4.58301895157 2.13678100538 0.00314824260 -0.018 0.005 0.003 H 4.58784714512 -2.12983634010 0.00211631073 0.016 0.005 -0.008 H -1.68997263563 -0.00719388386 -5.74925805817 -0.003 -0.030 0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.003 -0.013 -0.001 H -3.29620044300 -0.00255800648 -3.88456579214 -0.003 -0.047 0.001 H 1.47161249279 -0.00457826661 -2.87685200854 -0.002 -0.013 -0.001 H -1.69176120521 -0.00597000955 5.75026973076 0.002 -0.058 0.000 H 0.75025791005 -0.00892914887 5.25161119224 0.002 -0.039 -0.001 H 1.46975366817 -0.00523069331 2.87805400798 0.001 -0.028 -0.001 H -3.29750276746 -0.00099200484 3.88584245085 0.001 -0.065 0.001 H -4.55513299541 0.00377930937 -2.13473279421 -0.002 -0.058 0.001 H -4.55107479454 0.00501307822 2.13844314827 0.000 -0.069 0.001 H -6.83436893102 0.00806057203 1.19721860356 -0.000 -0.081 0.003 H 6.86748209639 1.20005966818 0.00372860376 -0.010 0.024 -0.001 61 Mode 2: freq= 6.96 N -0.44003451495 -0.00038510790 2.12369783068 -0.074 -0.053 0.052 C -1.76594470239 0.00039861437 2.37754210613 -0.077 -0.053 0.005 C -2.24923313135 -0.00145267054 3.67997125809 -0.118 -0.083 -0.010 C -1.33887502024 -0.00450793845 4.73956848945 -0.152 -0.109 0.019 C 0.02462671625 -0.00591801736 4.46614405978 -0.144 -0.106 0.062 C 0.43187566201 -0.00376957955 3.13352499014 -0.101 -0.075 0.075 C -2.63984642995 0.00218980399 1.17162612704 -0.038 -0.022 -0.023 N -1.98513620489 0.00132140951 0.00153900685 -0.000 0.006 -0.002 C -2.63911589169 0.00167522827 -1.17277445342 0.037 0.035 -0.023 C -4.02452897564 0.00329996303 -1.20791476641 0.039 0.037 -0.067 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 0.007 -0.090 C -4.02924140493 0.00399189729 1.20660077672 -0.039 -0.023 -0.067 Co 0.00000000000 0.00000000000 0.00000000000 -0.001 0.010 0.139 N -0.43839318333 -0.00054206762 -2.12229806799 0.074 0.063 0.052 C -1.76408906064 -0.00030645034 -2.37697009192 0.076 0.064 0.005 C -2.24773885821 -0.00257631963 -3.67934971086 0.118 0.095 -0.010 C -1.33713102227 -0.00526459193 -4.73855802198 0.152 0.121 0.019 C 0.02654101484 -0.00591797621 -4.46472703619 0.143 0.115 0.063 C 0.43371721952 -0.00363389350 -3.13225443930 0.100 0.083 0.076 S -6.53329279136 0.00637481657 -0.11611178087 0.006 0.018 -0.241 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 0.003 0.136 C 2.67119656792 1.17263645248 0.00045766926 0.001 0.002 0.174 C 4.06129317470 1.20536051565 0.00241240325 0.001 0.001 0.216 C 4.76783866331 0.00148799420 0.00346798881 -0.000 -0.000 0.206 C 4.05723810074 -1.20352939940 0.00211502115 -0.001 0.001 0.155 C 2.67108506586 -1.17139122066 0.00026591651 -0.001 0.002 0.115 C 1.82209539371 2.39842937406 -0.00175320633 0.002 0.003 0.178 C 2.33938959521 3.68993217240 -0.00584554905 0.003 0.002 0.224 C 1.45736908622 4.77231118002 -0.00917967851 0.004 0.003 0.223 C 0.08658913130 4.53522926787 -0.00833235387 0.004 0.004 0.177 C -0.35359617412 3.21325694137 -0.00400174376 0.003 0.005 0.133 N 0.49290585413 2.18198449515 -0.00068475564 0.002 0.004 0.144 S 6.56718562933 -0.11349126889 0.00673479967 -0.001 -0.003 0.414 C 1.82142022278 -2.39594383179 -0.00206827421 -0.002 0.003 0.058 C 2.33969079820 -3.68709653410 -0.00625612120 -0.003 0.002 0.042 C 1.45789786198 -4.76953179608 -0.00945089783 -0.004 0.003 -0.012 C 0.08684213972 -4.53272927032 -0.00840538011 -0.004 0.004 -0.049 C -0.35393854068 -3.21111942258 -0.00398541364 -0.003 0.005 -0.030 N 0.49225266031 -2.17934076887 -0.00084210065 -0.002 0.004 0.024 H 1.83694111827 5.77332096953 -0.01265611066 0.002 0.001 0.075 H -0.61802819388 5.33967450634 -0.01131742088 0.001 0.001 0.051 H 3.39175422949 3.87200638269 -0.00704552340 0.001 0.000 0.075 H -1.39787683933 2.98334799634 -0.00369736757 0.001 0.002 0.028 H 1.83794742242 -5.77033326187 -0.01295832570 -0.001 0.001 -0.007 H -0.61749414542 -5.33746053721 -0.01121572048 -0.001 0.001 -0.026 H -1.39833026435 -2.98175334118 -0.00345676225 -0.001 0.002 -0.016 H 3.39230213722 -3.86796714602 -0.00754158092 -0.001 0.000 0.020 H 4.58301895157 2.13678100538 0.00314824260 0.000 0.000 0.074 H 4.58784714512 -2.12983634010 0.00211631073 -0.001 0.000 0.043 H -1.68997263563 -0.00719388386 -5.74925805817 0.053 0.042 0.002 H 0.75224758084 -0.00860493512 -5.25016290812 0.049 0.039 0.025 H -3.29620044300 -0.00255800648 -3.88456579214 0.036 0.029 -0.013 H 1.47161249279 -0.00457826661 -2.87685200854 0.027 0.022 0.032 H -1.69176120521 -0.00597000955 5.75026973076 -0.053 -0.038 0.002 H 0.75025791005 -0.00892914887 5.25161119224 -0.049 -0.036 0.025 H 1.46975366817 -0.00523069331 2.87805400798 -0.027 -0.021 0.031 H -3.29750276746 -0.00099200484 3.88584245085 -0.036 -0.025 -0.013 H -4.55513299541 0.00377930937 -2.13473279421 0.020 0.017 -0.024 H -4.55107479454 0.00501307822 2.13844314827 -0.020 -0.013 -0.024 H -6.83436893102 0.00806057203 1.19721860356 -0.011 -0.006 -0.046 H 6.86748209639 1.20005966818 0.00372860376 0.000 -0.001 0.086 61 Mode 3: freq= 6.60 N -0.44003451495 -0.00038510790 2.12369783068 -0.038 0.088 0.028 C -1.76594470239 0.00039861437 2.37754210613 -0.040 0.085 0.004 C -2.24923313135 -0.00145267054 3.67997125809 -0.061 0.141 -0.003 C -1.33887502024 -0.00450793845 4.73956848945 -0.078 0.194 0.012 C 0.02462671625 -0.00591801736 4.46614405978 -0.074 0.190 0.034 C 0.43187566201 -0.00376957955 3.13352499014 -0.052 0.133 0.041 C -2.63984642995 0.00218980399 1.17162612704 -0.020 0.026 -0.010 N -1.98513620489 0.00132140951 0.00153900685 -0.001 -0.028 0.001 C -2.63911589169 0.00167522827 -1.17277445342 0.019 -0.083 -0.010 C -4.02452897564 0.00329996303 -1.20791476641 0.019 -0.089 -0.033 C -4.73391255267 0.00451580118 -0.00020876193 -0.001 -0.036 -0.044 C -4.02924140493 0.00399189729 1.20660077672 -0.021 0.023 -0.033 Co 0.00000000000 0.00000000000 0.00000000000 -0.002 -0.039 0.075 N -0.43839318333 -0.00054206762 -2.12229806799 0.037 -0.130 0.029 C -1.76408906064 -0.00030645034 -2.37697009192 0.039 -0.135 0.005 C -2.24773885821 -0.00257631963 -3.67934971086 0.060 -0.195 -0.003 C -1.33713102227 -0.00526459193 -4.73855802198 0.078 -0.240 0.012 C 0.02654101484 -0.00591797621 -4.46472703619 0.073 -0.225 0.034 C 0.43371721952 -0.00363389350 -3.13225443930 0.051 -0.164 0.041 S -6.53329279136 0.00637481657 -0.11611178087 0.002 -0.076 -0.121 N 2.00981687167 0.00259443239 -0.00000686048 -0.001 -0.009 0.071 C 2.67119656792 1.17263645248 0.00045766926 -0.006 -0.006 0.021 C 4.06129317470 1.20536051565 0.00241240325 -0.006 0.000 0.040 C 4.76783866331 0.00148799420 0.00346798881 -0.001 0.004 0.107 C 4.05723810074 -1.20352939940 0.00211502115 0.005 0.000 0.153 C 2.67108506586 -1.17139122066 0.00026591651 0.005 -0.006 0.131 C 1.82209539371 2.39842937406 -0.00175320633 -0.011 -0.010 -0.050 C 2.33938959521 3.68993217240 -0.00584554905 -0.016 -0.008 -0.100 C 1.45736908622 4.77231118002 -0.00917967851 -0.021 -0.011 -0.165 C 0.08658913130 4.53522926787 -0.00833235387 -0.020 -0.017 -0.178 C -0.35359617412 3.21325694137 -0.00400174376 -0.014 -0.019 -0.124 N 0.49290585413 2.18198449515 -0.00068475564 -0.011 -0.016 -0.067 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.019 0.226 C 1.82142022278 -2.39594383179 -0.00206827421 0.010 -0.010 0.174 C 2.33969079820 -3.68709653410 -0.00625612120 0.016 -0.008 0.240 C 1.45789786198 -4.76953179608 -0.00945089783 0.021 -0.012 0.276 C 0.08684213972 -4.53272927032 -0.00840538011 0.020 -0.018 0.246 C -0.35393854068 -3.21111942258 -0.00398541364 0.014 -0.020 0.180 N 0.49225266031 -2.17934076887 -0.00084210065 0.010 -0.017 0.157 H 1.83694111827 5.77332096953 -0.01265611066 -0.007 -0.003 -0.059 H -0.61802819388 5.33967450634 -0.01131742088 -0.007 -0.006 -0.066 H 3.39175422949 3.87200638269 -0.00704552340 -0.005 -0.001 -0.026 H -1.39787683933 2.98334799634 -0.00369736757 -0.004 -0.007 -0.038 H 1.83794742242 -5.77033326187 -0.01295832570 0.007 -0.003 0.094 H -0.61749414542 -5.33746053721 -0.01121572048 0.007 -0.006 0.079 H -1.39833026435 -2.98175334118 -0.00345676225 0.004 -0.007 0.045 H 3.39230213722 -3.86796714602 -0.00754158092 0.005 -0.001 0.076 H 4.58301895157 2.13678100538 0.00314824260 -0.003 0.001 0.001 H 4.58784714512 -2.12983634010 0.00211631073 0.003 0.001 0.059 H -1.68997263563 -0.00719388386 -5.74925805817 0.027 -0.083 0.002 H 0.75224758084 -0.00860493512 -5.25016290812 0.025 -0.075 0.013 H -3.29620044300 -0.00255800648 -3.88456579214 0.018 -0.060 -0.006 H 1.47161249279 -0.00457826661 -2.87685200854 0.014 -0.044 0.017 H -1.69176120521 -0.00597000955 5.75026973076 -0.027 0.069 0.002 H 0.75025791005 -0.00892914887 5.25161119224 -0.025 0.067 0.013 H 1.46975366817 -0.00523069331 2.87805400798 -0.014 0.037 0.017 H -3.29750276746 -0.00099200484 3.88584245085 -0.019 0.041 -0.006 H -4.55513299541 0.00377930937 -2.13473279421 0.010 -0.039 -0.012 H -4.55107479454 0.00501307822 2.13844314827 -0.010 0.019 -0.012 H -6.83436893102 0.00806057203 1.19721860356 -0.006 0.004 -0.023 H 6.86748209639 1.20005966818 0.00372860376 -0.002 0.004 0.024 61 Mode 4: freq= 0.86 N -0.44003451495 -0.00038510790 2.12369783068 -0.154 0.004 -0.002 C -1.76594470239 0.00039861437 2.37754210613 -0.143 0.003 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.141 0.004 0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.140 0.003 -0.001 C 0.02462671625 -0.00591801736 4.46614405978 -0.140 0.003 -0.003 C 0.43187566201 -0.00376957955 3.13352499014 -0.142 0.003 -0.003 C -2.63984642995 0.00218980399 1.17162612704 -0.144 0.004 0.001 N -1.98513620489 0.00132140951 0.00153900685 -0.156 0.004 0.001 C -2.63911589169 0.00167522827 -1.17277445342 -0.144 0.003 0.001 C -4.02452897564 0.00329996303 -1.20791476641 -0.144 0.004 0.000 C -4.73391255267 0.00451580118 -0.00020876193 -0.144 0.004 0.001 C -4.02924140493 0.00399189729 1.20660077672 -0.144 0.004 0.001 Co 0.00000000000 0.00000000000 0.00000000000 -0.321 0.007 0.001 N -0.43839318333 -0.00054206762 -2.12229806799 -0.155 0.004 0.003 C -1.76408906064 -0.00030645034 -2.37697009192 -0.143 0.003 0.001 C -2.24773885821 -0.00257631963 -3.67934971086 -0.142 0.003 0.001 C -1.33713102227 -0.00526459193 -4.73855802198 -0.141 0.003 0.002 C 0.02654101484 -0.00591797621 -4.46472703619 -0.141 0.003 0.003 C 0.43371721952 -0.00363389350 -3.13225443930 -0.142 0.003 0.004 S -6.53329279136 0.00637481657 -0.11611178087 -0.235 0.006 0.001 N 2.00981687167 0.00259443239 -0.00000686048 -0.155 0.003 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.143 0.003 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.143 0.003 -0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.143 0.003 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.143 0.003 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.144 0.003 0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.142 0.004 0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.141 0.003 0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.140 0.004 0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.140 0.006 0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.142 0.006 0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.154 0.006 0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.234 0.005 -0.001 C 1.82142022278 -2.39594383179 -0.00206827421 -0.143 0.002 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.142 0.003 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.141 0.002 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.141 0.001 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.142 0.001 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.154 0.001 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.040 0.001 0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.040 0.002 0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.041 0.001 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.041 0.002 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.041 0.001 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.041 0.000 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.041 -0.000 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.041 0.001 -0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.041 0.001 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.042 0.001 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.040 0.001 0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.041 0.001 0.001 H -3.29620044300 -0.00255800648 -3.88456579214 -0.041 0.001 0.000 H 1.47161249279 -0.00457826661 -2.87685200854 -0.041 0.001 0.001 H -1.69176120521 -0.00597000955 5.75026973076 -0.040 0.001 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.040 0.001 -0.001 H 1.46975366817 -0.00523069331 2.87805400798 -0.041 0.001 -0.001 H -3.29750276746 -0.00099200484 3.88584245085 -0.041 0.001 0.000 H -4.55513299541 0.00377930937 -2.13473279421 -0.042 0.001 0.000 H -4.55107479454 0.00501307822 2.13844314827 -0.042 0.001 0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.042 0.001 0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.042 0.001 -0.000 61 Mode 5: freq= 3.65 N -0.44003451495 -0.00038510790 2.12369783068 0.044 -0.000 0.144 C -1.76594470239 0.00039861437 2.37754210613 0.046 -0.000 0.159 C -2.24923313135 -0.00145267054 3.67997125809 0.071 -0.001 0.168 C -1.33887502024 -0.00450793845 4.73956848945 0.091 -0.001 0.151 C 0.02462671625 -0.00591801736 4.46614405978 0.086 -0.001 0.124 C 0.43187566201 -0.00376957955 3.13352499014 0.061 -0.001 0.117 C -2.63984642995 0.00218980399 1.17162612704 0.023 0.001 0.176 N -1.98513620489 0.00132140951 0.00153900685 0.001 0.001 0.176 C -2.63911589169 0.00167522827 -1.17277445342 -0.022 0.001 0.176 C -4.02452897564 0.00329996303 -1.20791476641 -0.023 0.002 0.202 C -4.73391255267 0.00451580118 -0.00020876193 0.001 0.002 0.216 C -4.02924140493 0.00399189729 1.20660077672 0.024 0.001 0.202 Co 0.00000000000 0.00000000000 0.00000000000 0.001 0.001 0.279 N -0.43839318333 -0.00054206762 -2.12229806799 -0.043 0.001 0.144 C -1.76408906064 -0.00030645034 -2.37697009192 -0.045 0.002 0.159 C -2.24773885821 -0.00257631963 -3.67934971086 -0.070 0.002 0.168 C -1.33713102227 -0.00526459193 -4.73855802198 -0.090 0.002 0.151 C 0.02654101484 -0.00591797621 -4.46472703619 -0.085 0.002 0.125 C 0.43371721952 -0.00363389350 -3.13225443930 -0.059 0.001 0.117 S -6.53329279136 0.00637481657 -0.11611178087 -0.003 0.004 0.409 N 2.00981687167 0.00259443239 -0.00000686048 0.000 0.000 0.095 C 2.67119656792 1.17263645248 0.00045766926 0.001 0.000 0.074 C 4.06129317470 1.20536051565 0.00241240325 0.001 -0.000 0.043 C 4.76783866331 0.00148799420 0.00346798881 0.001 -0.000 0.026 C 4.05723810074 -1.20352939940 0.00211502115 0.000 -0.000 0.041 C 2.67108506586 -1.17139122066 0.00026591651 0.000 0.000 0.073 C 1.82209539371 2.39842937406 -0.00175320633 0.001 0.000 0.094 C 2.33938959521 3.68993217240 -0.00584554905 0.001 0.000 0.088 C 1.45736908622 4.77231118002 -0.00917967851 0.001 0.000 0.108 C 0.08658913130 4.53522926787 -0.00833235387 0.001 0.001 0.133 C -0.35359617412 3.21325694137 -0.00400174376 0.001 0.001 0.137 N 0.49290585413 2.18198449515 -0.00068475564 0.001 0.001 0.128 S 6.56718562933 -0.11349126889 0.00673479967 0.001 -0.001 -0.025 C 1.82142022278 -2.39594383179 -0.00206827421 0.000 0.000 0.091 C 2.33969079820 -3.68709653410 -0.00625612120 -0.000 0.000 0.084 C 1.45789786198 -4.76953179608 -0.00945089783 -0.000 0.000 0.102 C 0.08684213972 -4.53272927032 -0.00840538011 -0.000 0.000 0.128 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 0.000 0.134 N 0.49225266031 -2.17934076887 -0.00084210065 0.000 0.000 0.126 H 1.83694111827 5.77332096953 -0.01265611066 0.000 0.000 0.030 H -0.61802819388 5.33967450634 -0.01131742088 0.000 0.000 0.043 H 3.39175422949 3.87200638269 -0.00704552340 0.000 -0.000 0.020 H -1.39787683933 2.98334799634 -0.00369736757 0.000 0.000 0.045 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 0.000 0.028 H -0.61749414542 -5.33746053721 -0.01121572048 -0.000 0.000 0.041 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 0.000 0.045 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 -0.000 0.019 H 4.58301895157 2.13678100538 0.00314824260 0.000 -0.000 0.009 H 4.58784714512 -2.12983634010 0.00211631073 0.000 -0.000 0.008 H -1.68997263563 -0.00719388386 -5.74925805817 -0.032 0.001 0.046 H 0.75224758084 -0.00860493512 -5.25016290812 -0.029 0.001 0.032 H -3.29620044300 -0.00255800648 -3.88456579214 -0.021 0.001 0.055 H 1.47161249279 -0.00457826661 -2.87685200854 -0.016 0.000 0.028 H -1.69176120521 -0.00597000955 5.75026973076 0.032 -0.000 0.046 H 0.75025791005 -0.00892914887 5.25161119224 0.029 -0.001 0.032 H 1.46975366817 -0.00523069331 2.87805400798 0.016 -0.000 0.028 H -3.29750276746 -0.00099200484 3.88584245085 0.022 -0.000 0.055 H -4.55513299541 0.00377930937 -2.13473279421 -0.012 0.001 0.062 H -4.55107479454 0.00501307822 2.13844314827 0.012 0.000 0.061 H -6.83436893102 0.00806057203 1.19721860356 0.007 0.001 0.074 H 6.86748209639 1.20005966818 0.00372860376 0.000 -0.000 -0.006 61 Mode 6: freq= 7.35 N -0.44003451495 -0.00038510790 2.12369783068 -0.002 -0.091 -0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.002 -0.046 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.002 -0.037 -0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.002 -0.067 -0.000 C 0.02462671625 -0.00591801736 4.46614405978 -0.002 -0.105 -0.000 C 0.43187566201 -0.00376957955 3.13352499014 -0.002 -0.112 -0.001 C -2.63984642995 0.00218980399 1.17162612704 -0.002 -0.017 -0.000 N -1.98513620489 0.00132140951 0.00153900685 -0.002 -0.042 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.002 -0.017 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.002 0.031 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 -0.002 0.055 -0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.002 0.030 -0.000 Co 0.00000000000 0.00000000000 0.00000000000 -0.005 -0.212 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.002 -0.090 0.001 C -1.76408906064 -0.00030645034 -2.37697009192 -0.002 -0.046 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 -0.001 -0.036 -0.000 C -1.33713102227 -0.00526459193 -4.73855802198 -0.001 -0.065 0.000 C 0.02654101484 -0.00591797621 -4.46472703619 -0.001 -0.103 0.001 C 0.43371721952 -0.00363389350 -3.13225443930 -0.001 -0.111 0.001 S -6.53329279136 0.00637481657 -0.11611178087 -0.003 0.193 -0.001 N 2.00981687167 0.00259443239 -0.00000686048 -0.002 -0.164 0.000 C 2.67119656792 1.17263645248 0.00045766926 0.033 -0.172 0.000 C 4.06129317470 1.20536051565 0.00241240325 0.034 -0.213 0.001 C 4.76783866331 0.00148799420 0.00346798881 -0.002 -0.234 0.001 C 4.05723810074 -1.20352939940 0.00211502115 -0.037 -0.213 0.001 C 2.67108506586 -1.17139122066 0.00026591651 -0.036 -0.172 0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.069 -0.147 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.107 -0.162 0.001 C 1.45736908622 4.77231118002 -0.00917967851 0.139 -0.136 0.001 C 0.08658913130 4.53522926787 -0.00833235387 0.132 -0.095 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.093 -0.082 0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.067 -0.116 0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.009 -0.469 0.002 C 1.82142022278 -2.39594383179 -0.00206827421 -0.072 -0.147 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.110 -0.162 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.142 -0.136 -0.001 C 0.08684213972 -4.53272927032 -0.00840538011 -0.135 -0.096 -0.001 C -0.35393854068 -3.21111942258 -0.00398541364 -0.096 -0.083 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.071 -0.117 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.049 -0.043 0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.045 -0.021 0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.033 -0.056 0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.025 -0.015 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.050 -0.043 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.046 -0.022 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.026 -0.015 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.033 -0.056 -0.000 H 4.58301895157 2.13678100538 0.00314824260 0.018 -0.066 0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.019 -0.066 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.000 -0.017 0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 -0.037 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 -0.002 -0.000 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 -0.041 0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.001 -0.017 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.001 -0.037 -0.000 H 1.46975366817 -0.00523069331 2.87805400798 -0.001 -0.041 -0.000 H -3.29750276746 -0.00099200484 3.88584245085 -0.001 -0.002 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 -0.001 0.014 -0.000 H -4.55107479454 0.00501307822 2.13844314827 -0.001 0.014 -0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.001 0.037 -0.000 H 6.86748209639 1.20005966818 0.00372860376 0.010 -0.086 0.000 61 Mode 7: freq= 18.65 N -0.44003451495 -0.00038510790 2.12369783068 0.058 -0.003 -0.027 C -1.76594470239 0.00039861437 2.37754210613 0.061 -0.004 0.008 C -2.24923313135 -0.00145267054 3.67997125809 0.093 -0.007 0.020 C -1.33887502024 -0.00450793845 4.73956848945 0.118 -0.010 -0.003 C 0.02462671625 -0.00591801736 4.46614405978 0.112 -0.009 -0.036 C 0.43187566201 -0.00376957955 3.13352499014 0.079 -0.005 -0.046 C -2.63984642995 0.00218980399 1.17162612704 0.030 -0.002 0.030 N -1.98513620489 0.00132140951 0.00153900685 0.000 -0.000 0.014 C -2.63911589169 0.00167522827 -1.17277445342 -0.030 0.002 0.030 C -4.02452897564 0.00329996303 -1.20791476641 -0.031 0.003 0.065 C -4.73391255267 0.00451580118 -0.00020876193 0.000 0.002 0.084 C -4.02924140493 0.00399189729 1.20660077672 0.031 -0.001 0.066 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 -0.001 -0.077 N -0.43839318333 -0.00054206762 -2.12229806799 -0.058 0.002 -0.027 C -1.76408906064 -0.00030645034 -2.37697009192 -0.060 0.004 0.008 C -2.24773885821 -0.00257631963 -3.67934971086 -0.092 0.006 0.020 C -1.33713102227 -0.00526459193 -4.73855802198 -0.118 0.007 -0.003 C 0.02654101484 -0.00591797621 -4.46472703619 -0.111 0.006 -0.036 C 0.43371721952 -0.00363389350 -3.13225443930 -0.078 0.003 -0.046 S -6.53329279136 0.00637481657 -0.11611178087 -0.005 0.006 0.216 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 0.000 -0.034 C 2.67119656792 1.17263645248 0.00045766926 -0.000 0.000 0.016 C 4.06129317470 1.20536051565 0.00241240325 -0.001 0.001 0.141 C 4.76783866331 0.00148799420 0.00346798881 -0.000 0.001 0.212 C 4.05723810074 -1.20352939940 0.00211502115 0.000 0.001 0.143 C 2.67108506586 -1.17139122066 0.00026591651 0.000 0.000 0.019 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 0.000 -0.060 C 2.33938959521 3.68993217240 -0.00584554905 -0.001 -0.000 -0.130 C 1.45736908622 4.77231118002 -0.00917967851 -0.001 -0.000 -0.201 C 0.08658913130 4.53522926787 -0.00833235387 -0.001 -0.000 -0.201 C -0.35359617412 3.21325694137 -0.00400174376 -0.001 -0.000 -0.133 N 0.49290585413 2.18198449515 -0.00068475564 -0.000 0.000 -0.072 S 6.56718562933 -0.11349126889 0.00673479967 -0.001 0.002 0.662 C 1.82142022278 -2.39594383179 -0.00206827421 0.001 0.000 -0.055 C 2.33969079820 -3.68709653410 -0.00625612120 0.001 0.001 -0.116 C 1.45789786198 -4.76953179608 -0.00945089783 0.002 0.000 -0.186 C 0.08684213972 -4.53272927032 -0.00840538011 0.002 -0.000 -0.193 C -0.35393854068 -3.21111942258 -0.00398541364 0.001 -0.000 -0.133 N 0.49225266031 -2.17934076887 -0.00084210065 0.001 -0.000 -0.073 H 1.83694111827 5.77332096953 -0.01265611066 -0.000 -0.000 -0.074 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 -0.000 -0.073 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 -0.000 -0.040 H -1.39787683933 2.98334799634 -0.00369736757 -0.000 -0.000 -0.038 H 1.83794742242 -5.77033326187 -0.01295832570 0.001 0.000 -0.068 H -0.61749414542 -5.33746053721 -0.01121572048 0.001 -0.000 -0.071 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 -0.000 -0.040 H 3.39230213722 -3.86796714602 -0.00754158092 0.000 0.000 -0.034 H 4.58301895157 2.13678100538 0.00314824260 -0.000 0.000 0.056 H 4.58784714512 -2.12983634010 0.00211631073 0.000 0.000 0.057 H -1.68997263563 -0.00719388386 -5.74925805817 -0.041 0.003 0.002 H 0.75224758084 -0.00860493512 -5.25016290812 -0.038 0.002 -0.016 H -3.29620044300 -0.00255800648 -3.88456579214 -0.028 0.002 0.013 H 1.47161249279 -0.00457826661 -2.87685200854 -0.021 0.001 -0.020 H -1.69176120521 -0.00597000955 5.75026973076 0.041 -0.004 0.002 H 0.75025791005 -0.00892914887 5.25161119224 0.038 -0.003 -0.016 H 1.46975366817 -0.00523069331 2.87805400798 0.021 -0.001 -0.020 H -3.29750276746 -0.00099200484 3.88584245085 0.028 -0.002 0.013 H -4.55513299541 0.00377930937 -2.13473279421 -0.016 0.001 0.023 H -4.55107479454 0.00501307822 2.13844314827 0.016 -0.000 0.023 H -6.83436893102 0.00806057203 1.19721860356 0.009 0.000 0.041 H 6.86748209639 1.20005966818 0.00372860376 -0.000 0.000 0.119 61 Mode 8: freq=19.65 N -0.44003451495 -0.00038510790 2.12369783068 0.001 0.077 0.000 C -1.76594470239 0.00039861437 2.37754210613 0.001 0.047 0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.001 0.095 0.001 C -1.33887502024 -0.00450793845 4.73956848945 0.001 0.165 0.000 C 0.02462671625 -0.00591801736 4.46614405978 0.001 0.185 0.000 C 0.43187566201 -0.00376957955 3.13352499014 0.001 0.137 -0.000 C -2.63984642995 0.00218980399 1.17162612704 0.000 -0.024 0.001 N -1.98513620489 0.00132140951 0.00153900685 0.000 0.028 0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.000 -0.027 0.001 C -4.02452897564 0.00329996303 -1.20791476641 -0.001 -0.150 0.001 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 -0.217 0.001 C -4.02924140493 0.00399189729 1.20660077672 0.000 -0.147 0.001 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.097 -0.001 N -0.43839318333 -0.00054206762 -2.12229806799 -0.001 0.076 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.001 0.042 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 -0.001 0.084 0.000 C -1.33713102227 -0.00526459193 -4.73855802198 -0.001 0.152 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 -0.001 0.178 -0.001 C 0.43371721952 -0.00363389350 -3.13225443930 -0.001 0.135 -0.001 S -6.53329279136 0.00637481657 -0.11611178087 -0.001 -0.665 0.003 N 2.00981687167 0.00259443239 -0.00000686048 0.000 -0.008 -0.000 C 2.67119656792 1.17263645248 0.00045766926 0.034 -0.027 0.002 C 4.06129317470 1.20536051565 0.00241240325 0.035 -0.067 0.003 C 4.76783866331 0.00148799420 0.00346798881 0.000 -0.087 0.002 C 4.05723810074 -1.20352939940 0.00211502115 -0.035 -0.067 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.034 -0.027 -0.001 C 1.82209539371 2.39842937406 -0.00175320633 0.068 -0.003 0.003 C 2.33938959521 3.68993217240 -0.00584554905 0.103 -0.018 0.005 C 1.45736908622 4.77231118002 -0.00917967851 0.133 0.007 0.006 C 0.08658913130 4.53522926787 -0.00833235387 0.127 0.044 0.004 C -0.35359617412 3.21325694137 -0.00400174376 0.090 0.056 0.002 N 0.49290585413 2.18198449515 -0.00068475564 0.066 0.036 0.001 S 6.56718562933 -0.11349126889 0.00673479967 -0.006 -0.231 0.005 C 1.82142022278 -2.39594383179 -0.00206827421 -0.068 -0.003 -0.004 C 2.33969079820 -3.68709653410 -0.00625612120 -0.104 -0.018 -0.007 C 1.45789786198 -4.76953179608 -0.00945089783 -0.133 0.007 -0.009 C 0.08684213972 -4.53272927032 -0.00840538011 -0.127 0.045 -0.008 C -0.35393854068 -3.21111942258 -0.00398541364 -0.090 0.057 -0.004 N 0.49225266031 -2.17934076887 -0.00084210065 -0.066 0.036 -0.003 H 1.83694111827 5.77332096953 -0.01265611066 0.046 -0.001 0.002 H -0.61802819388 5.33967450634 -0.01131742088 0.043 0.019 0.001 H 3.39175422949 3.87200638269 -0.00704552340 0.031 -0.014 0.002 H -1.39787683933 2.98334799634 -0.00369736757 0.024 0.024 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.047 -0.001 -0.003 H -0.61749414542 -5.33746053721 -0.01121572048 -0.043 0.019 -0.003 H -1.39833026435 -2.98175334118 -0.00345676225 -0.024 0.025 -0.001 H 3.39230213722 -3.86796714602 -0.00754158092 -0.031 -0.014 -0.002 H 4.58301895157 2.13678100538 0.00314824260 0.018 -0.024 0.001 H 4.58784714512 -2.12983634010 0.00211631073 -0.018 -0.024 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.000 0.054 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 0.067 -0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 0.020 0.000 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 0.045 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 0.001 0.059 0.000 H 0.75025791005 -0.00892914887 5.25161119224 0.000 0.069 0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.000 0.044 -0.000 H -3.29750276746 -0.00099200484 3.88584245085 0.000 0.024 0.000 H -4.55513299541 0.00377930937 -2.13473279421 -0.000 -0.059 0.000 H -4.55107479454 0.00501307822 2.13844314827 0.000 -0.057 0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.000 -0.119 0.001 H 6.86748209639 1.20005966818 0.00372860376 0.010 -0.044 0.001 61 Mode 9: freq=28.18 N -0.44003451495 -0.00038510790 2.12369783068 -0.002 -0.060 0.002 C -1.76594470239 0.00039861437 2.37754210613 -0.002 -0.121 0.001 C -2.24923313135 -0.00145267054 3.67997125809 -0.003 -0.238 -0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.004 -0.285 0.001 C 0.02462671625 -0.00591801736 4.46614405978 -0.004 -0.209 0.002 C 0.43187566201 -0.00376957955 3.13352499014 -0.003 -0.095 0.003 C -2.63984642995 0.00218980399 1.17162612704 -0.001 -0.062 -0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 0.000 0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.001 0.060 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 0.001 0.057 -0.001 C -4.73391255267 0.00451580118 -0.00020876193 0.000 -0.007 -0.002 C -4.02924140493 0.00399189729 1.20660077672 -0.001 -0.066 -0.001 Co 0.00000000000 0.00000000000 0.00000000000 0.001 0.003 0.004 N -0.43839318333 -0.00054206762 -2.12229806799 0.002 0.065 0.001 C -1.76408906064 -0.00030645034 -2.37697009192 0.002 0.123 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.003 0.242 -0.000 C -1.33713102227 -0.00526459193 -4.73855802198 0.004 0.292 0.000 C 0.02654101484 -0.00591797621 -4.46472703619 0.003 0.220 0.001 C 0.43371721952 -0.00363389350 -3.13225443930 0.002 0.103 0.001 S -6.53329279136 0.00637481657 -0.11611178087 0.000 -0.009 -0.006 N 2.00981687167 0.00259443239 -0.00000686048 0.000 0.000 0.001 C 2.67119656792 1.17263645248 0.00045766926 0.001 -0.000 -0.059 C 4.06129317470 1.20536051565 0.00241240325 0.001 -0.001 -0.062 C 4.76783866331 0.00148799420 0.00346798881 0.000 -0.002 -0.007 C 4.05723810074 -1.20352939940 0.00211502115 -0.001 -0.001 0.052 C 2.67108506586 -1.17139122066 0.00026591651 -0.001 -0.000 0.057 C 1.82209539371 2.39842937406 -0.00175320633 0.002 0.000 -0.117 C 2.33938959521 3.68993217240 -0.00584554905 0.002 -0.001 -0.250 C 1.45736908622 4.77231118002 -0.00917967851 0.003 -0.000 -0.293 C 0.08658913130 4.53522926787 -0.00833235387 0.003 0.001 -0.200 C -0.35359617412 3.21325694137 -0.00400174376 0.002 0.001 -0.072 N 0.49290585413 2.18198449515 -0.00068475564 0.002 0.001 -0.038 S 6.56718562933 -0.11349126889 0.00673479967 0.000 -0.005 -0.012 C 1.82142022278 -2.39594383179 -0.00206827421 -0.002 0.000 0.119 C 2.33969079820 -3.68709653410 -0.00625612120 -0.003 -0.001 0.254 C 1.45789786198 -4.76953179608 -0.00945089783 -0.004 -0.000 0.303 C 0.08684213972 -4.53272927032 -0.00840538011 -0.004 0.001 0.213 C -0.35393854068 -3.21111942258 -0.00398541364 -0.003 0.002 0.082 N 0.49225266031 -2.17934076887 -0.00084210065 -0.002 0.002 0.045 H 1.83694111827 5.77332096953 -0.01265611066 0.001 -0.000 -0.115 H -0.61802819388 5.33967450634 -0.01131742088 0.001 0.000 -0.065 H 3.39175422949 3.87200638269 -0.00704552340 0.001 -0.000 -0.094 H -1.39787683933 2.98334799634 -0.00369736757 0.001 0.001 0.001 H 1.83794742242 -5.77033326187 -0.01295832570 -0.001 -0.000 0.118 H -0.61749414542 -5.33746053721 -0.01121572048 -0.001 0.001 0.070 H -1.39833026435 -2.98175334118 -0.00345676225 -0.001 0.001 0.003 H 3.39230213722 -3.86796714602 -0.00754158092 -0.001 -0.001 0.094 H 4.58301895157 2.13678100538 0.00314824260 0.000 -0.000 -0.030 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 -0.000 0.026 H -1.68997263563 -0.00719388386 -5.74925805817 0.001 0.112 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 0.001 0.073 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 0.001 0.086 -0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.001 0.013 0.001 H -1.69176120521 -0.00597000955 5.75026973076 -0.002 -0.109 0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.001 -0.069 0.001 H 1.46975366817 -0.00523069331 2.87805400798 -0.001 -0.010 0.001 H -3.29750276746 -0.00099200484 3.88584245085 -0.001 -0.086 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.001 0.029 -0.001 H -4.55107479454 0.00501307822 2.13844314827 -0.000 -0.032 -0.001 H -6.83436893102 0.00806057203 1.19721860356 -0.000 -0.021 -0.001 H 6.86748209639 1.20005966818 0.00372860376 0.000 -0.001 -0.021 61 Mode 10: freq=47.21 N -0.44003451495 -0.00038510790 2.12369783068 0.063 0.001 -0.130 C -1.76594470239 0.00039861437 2.37754210613 0.066 -0.001 -0.083 C -2.24923313135 -0.00145267054 3.67997125809 0.105 -0.003 -0.069 C -1.33887502024 -0.00450793845 4.73956848945 0.137 -0.004 -0.096 C 0.02462671625 -0.00591801736 4.46614405978 0.129 -0.002 -0.136 C 0.43187566201 -0.00376957955 3.13352499014 0.089 0.001 -0.148 C -2.63984642995 0.00218980399 1.17162612704 0.033 -0.000 -0.059 N -1.98513620489 0.00132140951 0.00153900685 0.000 0.000 -0.085 C -2.63911589169 0.00167522827 -1.17277445342 -0.033 0.000 -0.059 C -4.02452897564 0.00329996303 -1.20791476641 -0.035 0.000 -0.019 C -4.73391255267 0.00451580118 -0.00020876193 0.000 -0.000 0.001 C -4.02924140493 0.00399189729 1.20660077672 0.035 -0.000 -0.019 Co 0.00000000000 0.00000000000 0.00000000000 0.001 0.001 -0.261 N -0.43839318333 -0.00054206762 -2.12229806799 -0.062 -0.000 -0.131 C -1.76408906064 -0.00030645034 -2.37697009192 -0.066 0.000 -0.084 C -2.24773885821 -0.00257631963 -3.67934971086 -0.105 0.000 -0.069 C -1.33713102227 -0.00526459193 -4.73855802198 -0.137 -0.000 -0.097 C 0.02654101484 -0.00591797621 -4.46472703619 -0.130 -0.001 -0.137 C 0.43371721952 -0.00363389350 -3.13225443930 -0.089 -0.001 -0.148 S -6.53329279136 0.00637481657 -0.11611178087 -0.006 -0.000 0.094 N 2.00981687167 0.00259443239 -0.00000686048 0.000 0.000 -0.043 C 2.67119656792 1.17263645248 0.00045766926 0.000 0.000 0.001 C 4.06129317470 1.20536051565 0.00241240325 0.000 0.000 0.033 C 4.76783866331 0.00148799420 0.00346798881 0.000 -0.000 0.042 C 4.05723810074 -1.20352939940 0.00211502115 -0.000 0.000 0.034 C 2.67108506586 -1.17139122066 0.00026591651 0.000 0.000 0.003 C 1.82209539371 2.39842937406 -0.00175320633 0.000 0.001 0.057 C 2.33938959521 3.68993217240 -0.00584554905 0.001 0.001 0.270 C 1.45736908622 4.77231118002 -0.00917967851 0.001 0.001 0.347 C 0.08658913130 4.53522926787 -0.00833235387 0.001 0.001 0.202 C -0.35359617412 3.21325694137 -0.00400174376 0.001 0.001 -0.008 N 0.49290585413 2.18198449515 -0.00068475564 0.000 0.000 -0.074 S 6.56718562933 -0.11349126889 0.00673479967 0.000 -0.001 0.151 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 0.000 0.058 C 2.33969079820 -3.68709653410 -0.00625612120 -0.000 -0.000 0.269 C 1.45789786198 -4.76953179608 -0.00945089783 -0.001 -0.001 0.347 C 0.08684213972 -4.53272927032 -0.00840538011 -0.001 0.000 0.204 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 0.001 -0.004 N 0.49225266031 -2.17934076887 -0.00084210065 -0.000 0.001 -0.070 H 1.83694111827 5.77332096953 -0.01265611066 0.000 0.001 0.150 H -0.61802819388 5.33967450634 -0.01131742088 0.000 0.000 0.073 H 3.39175422949 3.87200638269 -0.00704552340 0.000 0.000 0.112 H -1.39787683933 2.98334799634 -0.00369736757 0.000 0.000 -0.035 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 -0.000 0.149 H -0.61749414542 -5.33746053721 -0.01121572048 -0.000 0.000 0.073 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 0.000 -0.034 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 -0.000 0.111 H 4.58301895157 2.13678100538 0.00314824260 0.000 -0.000 0.015 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 0.000 0.016 H -1.68997263563 -0.00719388386 -5.74925805817 -0.049 0.000 -0.025 H 0.75224758084 -0.00860493512 -5.25016290812 -0.044 -0.000 -0.046 H -3.29620044300 -0.00255800648 -3.88456579214 -0.032 0.000 -0.011 H 1.47161249279 -0.00457826661 -2.87685200854 -0.023 -0.000 -0.052 H -1.69176120521 -0.00597000955 5.75026973076 0.048 -0.002 -0.025 H 0.75025791005 -0.00892914887 5.25161119224 0.044 -0.001 -0.046 H 1.46975366817 -0.00523069331 2.87805400798 0.023 0.001 -0.052 H -3.29750276746 -0.00099200484 3.88584245085 0.032 -0.001 -0.011 H -4.55513299541 0.00377930937 -2.13473279421 -0.018 0.000 -0.001 H -4.55107479454 0.00501307822 2.13844314827 0.018 -0.000 -0.001 H -6.83436893102 0.00806057203 1.19721860356 0.011 -0.000 0.019 H 6.86748209639 1.20005966818 0.00372860376 0.000 -0.000 0.019 61 Mode 11: freq=48.49 N -0.44003451495 -0.00038510790 2.12369783068 0.000 0.053 0.001 C -1.76594470239 0.00039861437 2.37754210613 -0.000 -0.062 0.001 C -2.24923313135 -0.00145267054 3.67997125809 -0.001 -0.271 0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.001 -0.361 0.000 C 0.02462671625 -0.00591801736 4.46614405978 -0.001 -0.231 0.001 C 0.43187566201 -0.00376957955 3.13352499014 -0.000 -0.023 0.001 C -2.63984642995 0.00218980399 1.17162612704 0.000 -0.002 0.000 N -1.98513620489 0.00132140951 0.00153900685 0.001 0.040 0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.001 -0.003 0.000 C -4.02452897564 0.00329996303 -1.20791476641 0.001 -0.027 0.000 C -4.73391255267 0.00451580118 -0.00020876193 0.000 -0.028 0.000 C -4.02924140493 0.00399189729 1.20660077672 0.000 -0.026 0.000 Co 0.00000000000 0.00000000000 0.00000000000 0.002 0.256 0.001 N -0.43839318333 -0.00054206762 -2.12229806799 0.001 0.051 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 0.001 -0.063 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 -0.269 0.001 C -1.33713102227 -0.00526459193 -4.73855802198 0.000 -0.359 0.001 C 0.02654101484 -0.00591797621 -4.46472703619 0.000 -0.231 0.001 C 0.43371721952 -0.00363389350 -3.13225443930 0.000 -0.024 0.000 S -6.53329279136 0.00637481657 -0.11611178087 0.001 -0.096 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 0.090 0.000 C 2.67119656792 1.17263645248 0.00045766926 0.030 0.066 0.000 C 4.06129317470 1.20536051565 0.00241240325 0.032 0.030 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.000 0.012 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.031 0.030 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.029 0.066 0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.060 0.087 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.096 0.072 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.126 0.097 -0.001 C 0.08658913130 4.53522926787 -0.00833235387 0.120 0.133 -0.001 C -0.35359617412 3.21325694137 -0.00400174376 0.083 0.145 -0.001 N 0.49290585413 2.18198449515 -0.00068475564 0.058 0.130 -0.001 S 6.56718562933 -0.11349126889 0.00673479967 -0.005 -0.062 -0.001 C 1.82142022278 -2.39594383179 -0.00206827421 -0.060 0.087 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.096 0.072 -0.002 C 1.45789786198 -4.76953179608 -0.00945089783 -0.127 0.097 -0.003 C 0.08684213972 -4.53272927032 -0.00840538011 -0.121 0.134 -0.001 C -0.35393854068 -3.21111942258 -0.00398541364 -0.083 0.146 0.001 N 0.49225266031 -2.17934076887 -0.00084210065 -0.058 0.131 0.001 H 1.83694111827 5.77332096953 -0.01265611066 0.044 0.025 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.041 0.044 -0.001 H 3.39175422949 3.87200638269 -0.00704552340 0.029 0.012 0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.022 0.050 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.045 0.025 -0.001 H -0.61749414542 -5.33746053721 -0.01121572048 -0.041 0.044 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.022 0.051 0.001 H 3.39230213722 -3.86796714602 -0.00754158092 -0.029 0.012 -0.001 H 4.58301895157 2.13678100538 0.00314824260 0.016 0.005 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.016 0.005 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.000 -0.152 0.000 H 0.75224758084 -0.00860493512 -5.25016290812 0.000 -0.084 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 0.000 -0.107 0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 0.022 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.001 -0.153 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.000 -0.084 0.000 H 1.46975366817 -0.00523069331 2.87805400798 -0.000 0.023 0.001 H -3.29750276746 -0.00099200484 3.88584245085 -0.000 -0.109 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.000 -0.013 0.000 H -4.55107479454 0.00501307822 2.13844314827 0.000 -0.013 0.000 H -6.83436893102 0.00806057203 1.19721860356 0.000 -0.010 -0.000 H 6.86748209639 1.20005966818 0.00372860376 0.010 -0.014 -0.000 61 Mode 12: freq=56.40 N -0.44003451495 -0.00038510790 2.12369783068 -0.027 -0.000 -0.173 C -1.76594470239 0.00039861437 2.37754210613 -0.014 0.000 -0.055 C -2.24923313135 -0.00145267054 3.67997125809 0.088 0.000 -0.023 C -1.33887502024 -0.00450793845 4.73956848945 0.172 -0.001 -0.092 C 0.02462671625 -0.00591801736 4.46614405978 0.150 -0.003 -0.197 C 0.43187566201 -0.00376957955 3.13352499014 0.051 -0.002 -0.227 C -2.63984642995 0.00218980399 1.17162612704 -0.087 0.001 0.001 N -1.98513620489 0.00132140951 0.00153900685 -0.118 0.002 -0.001 C -2.63911589169 0.00167522827 -1.17277445342 -0.087 0.001 -0.002 C -4.02452897564 0.00329996303 -1.20791476641 -0.086 0.001 -0.009 C -4.73391255267 0.00451580118 -0.00020876193 -0.082 0.000 -0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.086 0.000 0.008 Co 0.00000000000 0.00000000000 0.00000000000 -0.323 0.001 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.027 -0.001 0.172 C -1.76408906064 -0.00030645034 -2.37697009192 -0.014 0.001 0.054 C -2.24773885821 -0.00257631963 -3.67934971086 0.088 0.002 0.022 C -1.33713102227 -0.00526459193 -4.73855802198 0.172 0.001 0.091 C 0.02654101484 -0.00591797621 -4.46472703619 0.150 -0.002 0.196 C 0.43371721952 -0.00363389350 -3.13225443930 0.051 -0.003 0.226 S -6.53329279136 0.00637481657 -0.11611178087 -0.137 -0.003 -0.001 N 2.00981687167 0.00259443239 -0.00000686048 -0.069 0.001 -0.001 C 2.67119656792 1.17263645248 0.00045766926 -0.049 -0.001 -0.001 C 4.06129317470 1.20536051565 0.00241240325 -0.047 -0.006 -0.001 C 4.76783866331 0.00148799420 0.00346798881 -0.044 0.001 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.047 0.008 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.049 0.003 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.010 0.044 -0.001 C 2.33938959521 3.68993217240 -0.00584554905 0.097 0.014 -0.002 C 1.45736908622 4.77231118002 -0.00917967851 0.174 0.073 -0.001 C 0.08658913130 4.53522926787 -0.00833235387 0.157 0.166 0.002 C -0.35359617412 3.21325694137 -0.00400174376 0.071 0.195 0.003 N 0.49290585413 2.18198449515 -0.00068475564 0.001 0.147 0.002 S 6.56718562933 -0.11349126889 0.00673479967 -0.073 0.001 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.010 -0.042 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.097 -0.012 -0.001 C 1.45789786198 -4.76953179608 -0.00945089783 0.174 -0.071 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.157 -0.165 0.002 C -0.35393854068 -3.21111942258 -0.00398541364 0.070 -0.193 0.002 N 0.49225266031 -2.17934076887 -0.00084210065 0.000 -0.145 0.001 H 1.83694111827 5.77332096953 -0.01265611066 0.071 0.014 -0.001 H -0.61802819388 5.33967450634 -0.01131742088 0.061 0.062 0.001 H 3.39175422949 3.87200638269 -0.00704552340 0.031 -0.015 -0.001 H -1.39787683933 2.98334799634 -0.00369736757 0.016 0.077 0.002 H 1.83794742242 -5.77033326187 -0.01295832570 0.070 -0.013 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.061 -0.061 0.001 H -1.39833026435 -2.98175334118 -0.00345676225 0.016 -0.076 0.001 H 3.39230213722 -3.86796714602 -0.00754158092 0.031 0.015 -0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.013 -0.002 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.014 0.003 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.073 0.000 0.018 H 0.75224758084 -0.00860493512 -5.25016290812 0.061 -0.001 0.073 H -3.29620044300 -0.00255800648 -3.88456579214 0.029 0.001 -0.015 H 1.47161249279 -0.00457826661 -2.87685200854 0.009 -0.001 0.088 H -1.69176120521 -0.00597000955 5.75026973076 0.073 -0.001 -0.019 H 0.75025791005 -0.00892914887 5.25161119224 0.061 -0.001 -0.073 H 1.46975366817 -0.00523069331 2.87805400798 0.009 -0.001 -0.088 H -3.29750276746 -0.00099200484 3.88584245085 0.029 0.000 0.014 H -4.55513299541 0.00377930937 -2.13473279421 -0.025 0.000 -0.003 H -4.55107479454 0.00501307822 2.13844314827 -0.025 -0.000 0.003 H -6.83436893102 0.00806057203 1.19721860356 -0.024 -0.001 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.013 0.000 -0.000 61 Mode 13: freq=73.34 N -0.44003451495 -0.00038510790 2.12369783068 -0.000 -0.171 -0.001 C -1.76594470239 0.00039861437 2.37754210613 0.000 0.029 -0.001 C -2.24923313135 -0.00145267054 3.67997125809 0.000 0.212 -0.001 C -1.33887502024 -0.00450793845 4.73956848945 0.000 0.163 -0.001 C 0.02462671625 -0.00591801736 4.46614405978 -0.000 -0.076 -0.001 C 0.43187566201 -0.00376957955 3.13352499014 -0.000 -0.224 -0.001 C -2.63984642995 0.00218980399 1.17162612704 0.000 0.027 -0.001 N -1.98513620489 0.00132140951 0.00153900685 0.000 0.005 -0.001 C -2.63911589169 0.00167522827 -1.17277445342 0.000 -0.017 -0.001 C -4.02452897564 0.00329996303 -1.20791476641 0.000 -0.016 -0.001 C -4.73391255267 0.00451580118 -0.00020876193 0.000 0.003 -0.001 C -4.02924140493 0.00399189729 1.20660077672 0.000 0.025 -0.001 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.002 -0.004 N -0.43839318333 -0.00054206762 -2.12229806799 0.000 0.167 -0.001 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 -0.024 -0.001 C -2.24773885821 -0.00257631963 -3.67934971086 -0.000 -0.204 -0.001 C -1.33713102227 -0.00526459193 -4.73855802198 -0.000 -0.166 -0.001 C 0.02654101484 -0.00591797621 -4.46472703619 0.000 0.060 -0.001 C 0.43371721952 -0.00363389350 -3.13225443930 0.000 0.209 -0.002 S -6.53329279136 0.00637481657 -0.11611178087 0.000 -0.009 -0.003 N 2.00981687167 0.00259443239 -0.00000686048 0.000 0.000 -0.010 C 2.67119656792 1.17263645248 0.00045766926 -0.000 0.000 -0.040 C 4.06129317470 1.20536051565 0.00241240325 -0.000 0.000 -0.036 C 4.76783866331 0.00148799420 0.00346798881 0.000 0.001 -0.005 C 4.05723810074 -1.20352939940 0.00211502115 0.000 0.000 0.022 C 2.67108506586 -1.17139122066 0.00026591651 0.000 0.000 0.022 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 0.000 -0.035 C 2.33938959521 3.68993217240 -0.00584554905 -0.000 -0.000 -0.255 C 1.45736908622 4.77231118002 -0.00917967851 -0.001 -0.000 -0.159 C 0.08658913130 4.53522926787 -0.00833235387 -0.001 0.000 0.163 C -0.35359617412 3.21325694137 -0.00400174376 -0.000 0.001 0.329 N 0.49290585413 2.18198449515 -0.00068475564 -0.000 0.001 0.231 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.001 0.018 C 1.82142022278 -2.39594383179 -0.00206827421 0.000 0.000 0.025 C 2.33969079820 -3.68709653410 -0.00625612120 0.000 -0.000 0.236 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 -0.000 0.162 C 0.08684213972 -4.53272927032 -0.00840538011 -0.000 0.001 -0.130 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 0.001 -0.295 N 0.49225266031 -2.17934076887 -0.00084210065 -0.000 0.001 -0.218 H 1.83694111827 5.77332096953 -0.01265611066 -0.000 -0.000 -0.094 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 0.000 0.077 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 -0.000 -0.144 H -1.39787683933 2.98334799634 -0.00369736757 -0.000 0.000 0.158 H 1.83794742242 -5.77033326187 -0.01295832570 0.000 -0.000 0.093 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 0.000 -0.062 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 0.001 -0.143 H 3.39230213722 -3.86796714602 -0.00754158092 0.000 -0.000 0.132 H 4.58301895157 2.13678100538 0.00314824260 -0.000 0.000 -0.011 H 4.58784714512 -2.12983634010 0.00211631073 0.000 0.000 0.008 H -1.68997263563 -0.00719388386 -5.74925805817 -0.000 -0.089 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 0.000 0.032 -0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 -0.108 -0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 0.105 -0.001 H -1.69176120521 -0.00597000955 5.75026973076 0.000 0.088 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.000 -0.039 -0.000 H 1.46975366817 -0.00523069331 2.87805400798 -0.000 -0.111 -0.000 H -3.29750276746 -0.00099200484 3.88584245085 0.000 0.114 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.000 -0.006 -0.000 H -4.55107479454 0.00501307822 2.13844314827 -0.000 0.008 -0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.000 0.008 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.000 0.000 -0.012 61 Mode 14: freq=79.05 N -0.44003451495 -0.00038510790 2.12369783068 -0.001 0.010 -0.014 C -1.76594470239 0.00039861437 2.37754210613 -0.001 -0.002 -0.014 C -2.24923313135 -0.00145267054 3.67997125809 -0.002 -0.013 -0.014 C -1.33887502024 -0.00450793845 4.73956848945 -0.002 -0.008 -0.014 C 0.02462671625 -0.00591801736 4.46614405978 -0.002 0.007 -0.013 C 0.43187566201 -0.00376957955 3.13352499014 -0.002 0.015 -0.013 C -2.63984642995 0.00218980399 1.17162612704 -0.001 -0.002 -0.015 N -1.98513620489 0.00132140951 0.00153900685 0.001 0.000 -0.014 C -2.63911589169 0.00167522827 -1.17277445342 0.003 0.002 -0.015 C -4.02452897564 0.00329996303 -1.20791476641 0.004 0.002 -0.019 C -4.73391255267 0.00451580118 -0.00020876193 0.001 -0.000 -0.021 C -4.02924140493 0.00399189729 1.20660077672 -0.002 -0.002 -0.019 Co 0.00000000000 0.00000000000 0.00000000000 0.002 0.000 -0.075 N -0.43839318333 -0.00054206762 -2.12229806799 0.002 -0.010 -0.015 C -1.76408906064 -0.00030645034 -2.37697009192 0.002 0.002 -0.014 C -2.24773885821 -0.00257631963 -3.67934971086 0.002 0.013 -0.014 C -1.33713102227 -0.00526459193 -4.73855802198 0.001 0.008 -0.015 C 0.02654101484 -0.00591797621 -4.46472703619 0.001 -0.007 -0.015 C 0.43371721952 -0.00363389350 -3.13225443930 0.002 -0.015 -0.016 S -6.53329279136 0.00637481657 -0.11611178087 0.003 0.000 -0.052 N 2.00981687167 0.00259443239 -0.00000686048 0.000 0.000 -0.194 C 2.67119656792 1.17263645248 0.00045766926 0.000 0.000 -0.180 C 4.06129317470 1.20536051565 0.00241240325 0.000 0.000 -0.126 C 4.76783866331 0.00148799420 0.00346798881 -0.000 0.000 -0.062 C 4.05723810074 -1.20352939940 0.00211502115 0.000 -0.000 -0.127 C 2.67108506586 -1.17139122066 0.00026591651 0.000 0.000 -0.181 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 -0.000 -0.120 C 2.33938959521 3.68993217240 -0.00584554905 -0.001 -0.000 -0.225 C 1.45736908622 4.77231118002 -0.00917967851 -0.002 -0.000 -0.011 C 0.08658913130 4.53522926787 -0.00833235387 -0.002 -0.000 0.301 C -0.35359617412 3.21325694137 -0.00400174376 -0.001 -0.000 0.331 N 0.49290585413 2.18198449515 -0.00068475564 -0.000 -0.000 0.119 S 6.56718562933 -0.11349126889 0.00673479967 -0.001 0.000 0.342 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 0.000 -0.122 C 2.33969079820 -3.68709653410 -0.00625612120 -0.001 0.000 -0.248 C 1.45789786198 -4.76953179608 -0.00945089783 -0.002 0.000 -0.031 C 0.08684213972 -4.53272927032 -0.00840538011 -0.002 0.000 0.306 C -0.35393854068 -3.21111942258 -0.00398541364 -0.001 0.000 0.354 N 0.49225266031 -2.17934076887 -0.00084210065 -0.000 0.001 0.139 H 1.83694111827 5.77332096953 -0.01265611066 -0.001 -0.000 -0.022 H -0.61802819388 5.33967450634 -0.01131742088 -0.001 0.000 0.144 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 -0.000 -0.132 H -1.39787683933 2.98334799634 -0.00369736757 -0.000 -0.000 0.154 H 1.83794742242 -5.77033326187 -0.01295832570 -0.001 0.000 -0.033 H -0.61749414542 -5.33746053721 -0.01121572048 -0.001 0.000 0.147 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 0.000 0.166 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 0.000 -0.144 H 4.58301895157 2.13678100538 0.00314824260 -0.000 0.000 -0.022 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 -0.000 -0.023 H -1.68997263563 -0.00719388386 -5.74925805817 0.000 0.005 -0.004 H 0.75224758084 -0.00860493512 -5.25016290812 0.000 -0.003 -0.004 H -3.29620044300 -0.00255800648 -3.88456579214 0.001 0.007 -0.004 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 -0.007 -0.005 H -1.69176120521 -0.00597000955 5.75026973076 -0.001 -0.005 -0.004 H 0.75025791005 -0.00892914887 5.25161119224 -0.001 0.004 -0.004 H 1.46975366817 -0.00523069331 2.87805400798 -0.000 0.007 -0.004 H -3.29750276746 -0.00099200484 3.88584245085 -0.001 -0.007 -0.004 H -4.55513299541 0.00377930937 -2.13473279421 0.002 0.001 -0.006 H -4.55107479454 0.00501307822 2.13844314827 -0.001 -0.001 -0.006 H -6.83436893102 0.00806057203 1.19721860356 -0.002 -0.001 -0.010 H 6.86748209639 1.20005966818 0.00372860376 0.000 -0.000 0.039 61 Mode 15: freq=81.60 N -0.44003451495 -0.00038510790 2.12369783068 -0.000 -0.091 0.001 C -1.76594470239 0.00039861437 2.37754210613 -0.000 0.143 0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.001 0.234 0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.002 0.010 0.000 C 0.02462671625 -0.00591801736 4.46614405978 -0.002 -0.299 0.001 C 0.43187566201 -0.00376957955 3.13352499014 -0.001 -0.316 0.001 C -2.63984642995 0.00218980399 1.17162612704 0.001 0.209 -0.000 N -1.98513620489 0.00132140951 0.00153900685 0.001 0.219 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.000 0.203 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 0.000 0.147 0.000 C -4.73391255267 0.00451580118 -0.00020876193 0.000 0.075 0.000 C -4.02924140493 0.00399189729 1.20660077672 0.000 0.153 -0.000 Co 0.00000000000 0.00000000000 0.00000000000 0.002 0.063 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 -0.094 -0.001 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 0.140 -0.000 C -2.24773885821 -0.00257631963 -3.67934971086 -0.001 0.236 -0.000 C -1.33713102227 -0.00526459193 -4.73855802198 -0.002 0.020 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 -0.002 -0.285 -0.001 C 0.43371721952 -0.00363389350 -3.13225443930 -0.001 -0.309 -0.001 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 -0.388 0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.001 0.001 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.004 0.004 0.002 C 4.06129317470 1.20536051565 0.00241240325 -0.004 0.010 0.003 C 4.76783866331 0.00148799420 0.00346798881 0.001 0.013 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.006 0.010 -0.002 C 2.67108506586 -1.17139122066 0.00026591651 0.005 0.004 -0.002 C 1.82209539371 2.39842937406 -0.00175320633 -0.006 0.001 0.002 C 2.33938959521 3.68993217240 -0.00584554905 -0.011 0.003 0.009 C 1.45736908622 4.77231118002 -0.00917967851 -0.015 -0.000 0.004 C 0.08658913130 4.53522926787 -0.00833235387 -0.014 -0.005 -0.009 C -0.35359617412 3.21325694137 -0.00400174376 -0.009 -0.006 -0.013 N 0.49290585413 2.18198449515 -0.00068475564 -0.006 -0.003 -0.008 S 6.56718562933 -0.11349126889 0.00673479967 0.003 0.044 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.007 0.002 -0.002 C 2.33969079820 -3.68709653410 -0.00625612120 0.010 0.003 -0.008 C 1.45789786198 -4.76953179608 -0.00945089783 0.013 0.001 -0.003 C 0.08684213972 -4.53272927032 -0.00840538011 0.012 -0.002 0.008 C -0.35393854068 -3.21111942258 -0.00398541364 0.009 -0.003 0.012 N 0.49225266031 -2.17934076887 -0.00084210065 0.006 -0.001 0.007 H 1.83694111827 5.77332096953 -0.01265611066 -0.005 0.000 0.002 H -0.61802819388 5.33967450634 -0.01131742088 -0.005 -0.002 -0.004 H 3.39175422949 3.87200638269 -0.00704552340 -0.003 0.002 0.005 H -1.39787683933 2.98334799634 -0.00369736757 -0.002 -0.003 -0.006 H 1.83794742242 -5.77033326187 -0.01295832570 0.004 0.000 -0.002 H -0.61749414542 -5.33746053721 -0.01121572048 0.004 -0.001 0.004 H -1.39833026435 -2.98175334118 -0.00345676225 0.002 -0.002 0.006 H 3.39230213722 -3.86796714602 -0.00754158092 0.003 0.002 -0.005 H 4.58301895157 2.13678100538 0.00314824260 -0.002 0.003 0.001 H 4.58784714512 -2.12983634010 0.00211631073 0.003 0.003 -0.001 H -1.68997263563 -0.00719388386 -5.74925805817 -0.001 0.023 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.001 -0.140 -0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 0.132 -0.000 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 -0.147 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.001 0.019 0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.001 -0.146 0.000 H 1.46975366817 -0.00523069331 2.87805400798 -0.000 -0.149 0.000 H -3.29750276746 -0.00099200484 3.88584245085 -0.000 0.133 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.000 0.028 0.000 H -4.55107479454 0.00501307822 2.13844314827 0.000 0.030 -0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.000 -0.040 0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.003 0.009 0.001 61 Mode 16: freq=91.60 N -0.44003451495 -0.00038510790 2.12369783068 -0.000 0.109 0.001 C -1.76594470239 0.00039861437 2.37754210613 -0.000 -0.100 0.001 C -2.24923313135 -0.00145267054 3.67997125809 -0.001 -0.210 0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.001 -0.034 0.001 C 0.02462671625 -0.00591801736 4.46614405978 -0.000 0.253 0.002 C 0.43187566201 -0.00376957955 3.13352499014 -0.000 0.292 0.002 C -2.63984642995 0.00218980399 1.17162612704 -0.000 -0.101 0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 0.006 0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.000 0.111 0.000 C -4.02452897564 0.00329996303 -1.20791476641 0.000 0.132 0.000 C -4.73391255267 0.00451580118 -0.00020876193 0.000 -0.003 0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.000 -0.130 0.000 Co 0.00000000000 0.00000000000 0.00000000000 0.001 0.003 0.002 N -0.43839318333 -0.00054206762 -2.12229806799 0.000 -0.115 0.001 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 0.108 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 0.225 0.000 C -1.33713102227 -0.00526459193 -4.73855802198 -0.000 0.036 0.000 C 0.02654101484 -0.00591797621 -4.46472703619 -0.000 -0.271 0.001 C 0.43371721952 -0.00363389350 -3.13225443930 -0.000 -0.311 0.001 S -6.53329279136 0.00637481657 -0.11611178087 0.000 0.002 0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 0.000 0.003 C 2.67119656792 1.17263645248 0.00045766926 0.000 0.000 -0.085 C 4.06129317470 1.20536051565 0.00241240325 0.000 0.000 -0.110 C 4.76783866331 0.00148799420 0.00346798881 0.000 0.000 -0.003 C 4.05723810074 -1.20352939940 0.00211502115 0.000 0.000 0.108 C 2.67108506586 -1.17139122066 0.00026591651 0.000 0.000 0.089 C 1.82209539371 2.39842937406 -0.00175320633 0.000 0.000 -0.082 C 2.33938959521 3.68993217240 -0.00584554905 -0.000 -0.000 -0.144 C 1.45736908622 4.77231118002 -0.00917967851 -0.000 0.000 0.003 C 0.08658913130 4.53522926787 -0.00833235387 -0.000 0.001 0.210 C -0.35359617412 3.21325694137 -0.00400174376 -0.000 0.001 0.216 N 0.49290585413 2.18198449515 -0.00068475564 0.000 0.000 0.067 S 6.56718562933 -0.11349126889 0.00673479967 0.000 0.001 0.006 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 0.000 0.085 C 2.33969079820 -3.68709653410 -0.00625612120 -0.000 -0.000 0.153 C 1.45789786198 -4.76953179608 -0.00945089783 -0.000 0.001 -0.001 C 0.08684213972 -4.53272927032 -0.00840538011 -0.000 0.001 -0.220 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 0.001 -0.229 N 0.49225266031 -2.17934076887 -0.00084210065 -0.000 0.001 -0.072 H 1.83694111827 5.77332096953 -0.01265611066 -0.000 0.000 -0.009 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 0.000 0.101 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 -0.000 -0.083 H -1.39787683933 2.98334799634 -0.00369736757 -0.000 0.000 0.101 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 0.000 0.011 H -0.61749414542 -5.33746053721 -0.01121572048 -0.000 0.001 -0.106 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 0.001 -0.107 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 -0.000 0.088 H 4.58301895157 2.13678100538 0.00314824260 0.000 0.000 -0.055 H 4.58784714512 -2.12983634010 0.00211631073 0.000 0.000 0.053 H -1.68997263563 -0.00719388386 -5.74925805817 -0.000 0.032 0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 -0.132 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 0.000 0.126 -0.000 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 -0.147 0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.000 -0.030 0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.000 0.123 0.001 H 1.46975366817 -0.00523069331 2.87805400798 0.000 0.138 0.001 H -3.29750276746 -0.00099200484 3.88584245085 -0.000 -0.118 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.000 0.064 0.000 H -4.55107479454 0.00501307822 2.13844314827 -0.000 -0.065 0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.000 -0.053 0.000 H 6.86748209639 1.20005966818 0.00372860376 0.000 0.000 -0.045 61 Mode 17: freq=93.03 N -0.44003451495 -0.00038510790 2.12369783068 -0.117 -0.000 0.060 C -1.76594470239 0.00039861437 2.37754210613 -0.118 -0.000 0.008 C -2.24923313135 -0.00145267054 3.67997125809 -0.179 -0.000 -0.013 C -1.33887502024 -0.00450793845 4.73956848945 -0.232 0.000 0.029 C 0.02462671625 -0.00591801736 4.46614405978 -0.221 0.001 0.085 C 0.43187566201 -0.00376957955 3.13352499014 -0.158 0.000 0.102 C -2.63984642995 0.00218980399 1.17162612704 -0.081 -0.000 -0.009 N -1.98513620489 0.00132140951 0.00153900685 -0.064 -0.001 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.081 -0.001 0.008 C -4.02452897564 0.00329996303 -1.20791476641 -0.082 -0.001 0.008 C -4.73391255267 0.00451580118 -0.00020876193 -0.090 -0.000 -0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.082 -0.000 -0.009 Co 0.00000000000 0.00000000000 0.00000000000 0.003 -0.001 -0.001 N -0.43839318333 -0.00054206762 -2.12229806799 -0.116 -0.000 -0.059 C -1.76408906064 -0.00030645034 -2.37697009192 -0.117 -0.001 -0.009 C -2.24773885821 -0.00257631963 -3.67934971086 -0.178 -0.001 0.013 C -1.33713102227 -0.00526459193 -4.73855802198 -0.231 -0.000 -0.029 C 0.02654101484 -0.00591797621 -4.46472703619 -0.219 0.001 -0.084 C 0.43371721952 -0.00363389350 -3.13225443930 -0.157 0.001 -0.102 S -6.53329279136 0.00637481657 -0.11611178087 -0.151 0.001 0.002 N 2.00981687167 0.00259443239 -0.00000686048 0.072 -0.000 -0.001 C 2.67119656792 1.17263645248 0.00045766926 0.087 -0.009 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.089 -0.008 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.097 -0.000 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.089 0.008 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.087 0.008 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.119 0.004 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.171 -0.016 -0.001 C 1.45736908622 4.77231118002 -0.00917967851 0.218 0.019 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.210 0.067 0.001 C -0.35359617412 3.21325694137 -0.00400174376 0.157 0.083 0.001 N 0.49290585413 2.18198449515 -0.00068475564 0.120 0.046 0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.163 0.002 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.118 -0.004 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.170 0.015 -0.001 C 1.45789786198 -4.76953179608 -0.00945089783 0.216 -0.019 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.208 -0.066 0.001 C -0.35393854068 -3.21111942258 -0.00398541364 0.155 -0.082 0.001 N 0.49225266031 -2.17934076887 -0.00084210065 0.120 -0.046 0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.074 0.001 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.069 0.027 0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.051 -0.017 -0.001 H -1.39787683933 2.98334799634 -0.00369736757 0.042 0.037 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.073 -0.001 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.069 -0.026 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.042 -0.037 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.051 0.016 -0.000 H 4.58301895157 2.13678100538 0.00314824260 0.025 -0.002 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.024 0.002 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.080 -0.000 -0.004 H 0.75224758084 -0.00860493512 -5.25016290812 -0.073 0.000 -0.033 H -3.29620044300 -0.00255800648 -3.88456579214 -0.054 -0.000 0.018 H 1.47161249279 -0.00457826661 -2.87685200854 -0.042 0.000 -0.044 H -1.69176120521 -0.00597000955 5.75026973076 -0.080 0.000 0.004 H 0.75025791005 -0.00892914887 5.25161119224 -0.074 0.000 0.034 H 1.46975366817 -0.00523069331 2.87805400798 -0.042 0.000 0.045 H -3.29750276746 -0.00099200484 3.88584245085 -0.054 -0.000 -0.018 H -4.55513299541 0.00377930937 -2.13473279421 -0.022 -0.000 0.002 H -4.55107479454 0.00501307822 2.13844314827 -0.023 -0.000 -0.002 H -6.83436893102 0.00806057203 1.19721860356 -0.026 0.000 0.001 H 6.86748209639 1.20005966818 0.00372860376 0.028 0.001 0.000 61 Mode 18: freq=124.32 N -0.44003451495 -0.00038510790 2.12369783068 0.002 -0.164 -0.010 C -1.76594470239 0.00039861437 2.37754210613 0.003 -0.168 -0.006 C -2.24923313135 -0.00145267054 3.67997125809 0.008 -0.048 -0.004 C -1.33887502024 -0.00450793845 4.73956848945 0.012 0.134 -0.007 C 0.02462671625 -0.00591801736 4.46614405978 0.011 0.160 -0.012 C 0.43187566201 -0.00376957955 3.13352499014 0.006 -0.008 -0.013 C -2.63984642995 0.00218980399 1.17162612704 0.000 -0.170 -0.005 N -1.98513620489 0.00132140951 0.00153900685 -0.000 -0.005 -0.006 C -2.63911589169 0.00167522827 -1.17277445342 -0.001 0.154 -0.005 C -4.02452897564 0.00329996303 -1.20791476641 -0.001 0.215 -0.004 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 -0.017 -0.004 C -4.02924140493 0.00399189729 1.20660077672 0.000 -0.245 -0.004 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.000 -0.003 N -0.43839318333 -0.00054206762 -2.12229806799 -0.002 0.141 -0.010 C -1.76408906064 -0.00030645034 -2.37697009192 -0.003 0.162 -0.006 C -2.24773885821 -0.00257631963 -3.67934971086 -0.008 0.066 -0.004 C -1.33713102227 -0.00526459193 -4.73855802198 -0.012 -0.117 -0.007 C 0.02654101484 -0.00591797621 -4.46472703619 -0.011 -0.172 -0.012 C 0.43371721952 -0.00363389350 -3.13225443930 -0.006 -0.021 -0.013 S -6.53329279136 0.00637481657 -0.11611178087 0.000 0.033 -0.009 N 2.00981687167 0.00259443239 -0.00000686048 0.000 0.003 0.014 C 2.67119656792 1.17263645248 0.00045766926 0.000 0.003 0.210 C 4.06129317470 1.20536051565 0.00241240325 -0.000 0.002 0.305 C 4.76783866331 0.00148799420 0.00346798881 0.000 0.002 0.028 C 4.05723810074 -1.20352939940 0.00211502115 0.000 0.002 -0.247 C 2.67108506586 -1.17139122066 0.00026591651 0.000 0.003 -0.171 C 1.82209539371 2.39842937406 -0.00175320633 0.001 0.003 0.203 C 2.33938959521 3.68993217240 -0.00584554905 0.004 0.002 0.059 C 1.45736908622 4.77231118002 -0.00917967851 0.007 0.003 -0.151 C 0.08658913130 4.53522926787 -0.00833235387 0.006 0.006 -0.178 C -0.35359617412 3.21325694137 -0.00400174376 0.003 0.007 0.019 N 0.49290585413 2.18198449515 -0.00068475564 0.001 0.006 0.201 S 6.56718562933 -0.11349126889 0.00673479967 0.000 0.007 -0.054 C 1.82142022278 -2.39594383179 -0.00206827421 -0.001 0.003 -0.182 C 2.33969079820 -3.68709653410 -0.00625612120 -0.004 0.002 -0.079 C 1.45789786198 -4.76953179608 -0.00945089783 -0.007 0.003 0.122 C 0.08684213972 -4.53272927032 -0.00840538011 -0.006 0.006 0.188 C -0.35393854068 -3.21111942258 -0.00398541364 -0.003 0.007 0.024 N 0.49225266031 -2.17934076887 -0.00084210065 -0.001 0.006 -0.156 H 1.83694111827 5.77332096953 -0.01265611066 0.003 0.001 -0.087 H -0.61802819388 5.33967450634 -0.01131742088 0.002 0.002 -0.100 H 3.39175422949 3.87200638269 -0.00704552340 0.001 -0.000 0.016 H -1.39787683933 2.98334799634 -0.00369736757 0.001 0.003 0.005 H 1.83794742242 -5.77033326187 -0.01295832570 -0.003 0.001 0.069 H -0.61749414542 -5.33746053721 -0.01121572048 -0.002 0.002 0.103 H -1.39833026435 -2.98175334118 -0.00345676225 -0.001 0.003 0.014 H 3.39230213722 -3.86796714602 -0.00754158092 -0.001 -0.000 -0.030 H 4.58301895157 2.13678100538 0.00314824260 -0.000 0.001 0.155 H 4.58784714512 -2.12983634010 0.00211631073 0.000 0.001 -0.135 H -1.68997263563 -0.00719388386 -5.74925805817 -0.005 -0.065 -0.002 H 0.75224758084 -0.00860493512 -5.25016290812 -0.004 -0.094 -0.004 H -3.29620044300 -0.00255800648 -3.88456579214 -0.002 0.025 -0.000 H 1.47161249279 -0.00457826661 -2.87685200854 -0.001 -0.012 -0.005 H -1.69176120521 -0.00597000955 5.75026973076 0.005 0.076 -0.002 H 0.75025791005 -0.00892914887 5.25161119224 0.004 0.088 -0.004 H 1.46975366817 -0.00523069331 2.87805400798 0.001 -0.001 -0.005 H -3.29750276746 -0.00099200484 3.88584245085 0.002 -0.014 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 -0.000 0.115 -0.001 H -4.55107479454 0.00501307822 2.13844314827 0.000 -0.126 -0.001 H -6.83436893102 0.00806057203 1.19721860356 -0.001 -0.099 -0.002 H 6.86748209639 1.20005966818 0.00372860376 -0.001 0.002 0.119 61 Mode 19: freq=131.51 N -0.44003451495 -0.00038510790 2.12369783068 -0.018 -0.032 0.098 C -1.76594470239 0.00039861437 2.37754210613 -0.028 -0.025 0.051 C -2.24923313135 -0.00145267054 3.67997125809 -0.086 0.001 0.030 C -1.33887502024 -0.00450793845 4.73956848945 -0.139 0.024 0.073 C 0.02462671625 -0.00591801736 4.46614405978 -0.129 0.015 0.126 C 0.43187566201 -0.00376957955 3.13352499014 -0.067 -0.015 0.140 C -2.63984642995 0.00218980399 1.17162612704 -0.002 -0.028 0.039 N -1.98513620489 0.00132140951 0.00153900685 0.000 -0.006 0.047 C -2.63911589169 0.00167522827 -1.17277445342 0.002 0.015 0.039 C -4.02452897564 0.00329996303 -1.20791476641 -0.000 0.023 0.037 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 -0.007 0.042 C -4.02924140493 0.00399189729 1.20660077672 0.000 -0.039 0.037 Co 0.00000000000 0.00000000000 0.00000000000 0.000 -0.003 -0.030 N -0.43839318333 -0.00054206762 -2.12229806799 0.019 0.017 0.098 C -1.76408906064 -0.00030645034 -2.37697009192 0.028 0.018 0.051 C -2.24773885821 -0.00257631963 -3.67934971086 0.087 0.007 0.030 C -1.33713102227 -0.00526459193 -4.73855802198 0.141 -0.013 0.073 C 0.02654101484 -0.00591797621 -4.46472703619 0.130 -0.018 0.126 C 0.43371721952 -0.00363389350 -3.13225443930 0.068 -0.001 0.141 S -6.53329279136 0.00637481657 -0.11611178087 -0.006 0.011 0.166 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 0.001 -0.190 C 2.67119656792 1.17263645248 0.00045766926 -0.000 0.001 -0.199 C 4.06129317470 1.20536051565 0.00241240325 -0.000 0.001 -0.224 C 4.76783866331 0.00148799420 0.00346798881 -0.000 0.002 -0.186 C 4.05723810074 -1.20352939940 0.00211502115 0.000 0.001 -0.274 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 0.001 -0.231 C 1.82209539371 2.39842937406 -0.00175320633 0.001 0.002 -0.112 C 2.33938959521 3.68993217240 -0.00584554905 0.003 0.002 0.093 C 1.45736908622 4.77231118002 -0.00917967851 0.005 0.004 0.152 C 0.08658913130 4.53522926787 -0.00833235387 0.005 0.005 -0.033 C -0.35359617412 3.21325694137 -0.00400174376 0.002 0.005 -0.205 N 0.49290585413 2.18198449515 -0.00068475564 0.000 0.004 -0.223 S 6.56718562933 -0.11349126889 0.00673479967 -0.001 0.008 0.293 C 1.82142022278 -2.39594383179 -0.00206827421 -0.001 0.001 -0.150 C 2.33969079820 -3.68709653410 -0.00625612120 -0.003 -0.000 0.068 C 1.45789786198 -4.76953179608 -0.00945089783 -0.005 0.001 0.170 C 0.08684213972 -4.53272927032 -0.00840538011 -0.005 0.004 0.009 C -0.35393854068 -3.21111942258 -0.00398541364 -0.003 0.005 -0.193 N 0.49225266031 -2.17934076887 -0.00084210065 -0.001 0.003 -0.251 H 1.83694111827 5.77332096953 -0.01265611066 0.002 0.001 0.095 H -0.61802819388 5.33967450634 -0.01131742088 0.002 0.002 -0.007 H 3.39175422949 3.87200638269 -0.00704552340 0.001 0.000 0.063 H -1.39787683933 2.98334799634 -0.00369736757 0.001 0.002 -0.092 H 1.83794742242 -5.77033326187 -0.01295832570 -0.002 -0.000 0.105 H -0.61749414542 -5.33746053721 -0.01121572048 -0.002 0.001 0.016 H -1.39833026435 -2.98175334118 -0.00345676225 -0.001 0.002 -0.086 H 3.39230213722 -3.86796714602 -0.00754158092 -0.001 -0.001 0.052 H 4.58301895157 2.13678100538 0.00314824260 -0.000 0.000 -0.060 H 4.58784714512 -2.12983634010 0.00211631073 0.000 0.000 -0.089 H -1.68997263563 -0.00719388386 -5.74925805817 0.054 -0.007 0.017 H 0.75224758084 -0.00860493512 -5.25016290812 0.047 -0.010 0.045 H -3.29620044300 -0.00255800648 -3.88456579214 0.028 0.003 -0.006 H 1.47161249279 -0.00457826661 -2.87685200854 0.016 -0.001 0.056 H -1.69176120521 -0.00597000955 5.75026973076 -0.053 0.014 0.017 H 0.75025791005 -0.00892914887 5.25161119224 -0.046 0.009 0.045 H 1.46975366817 -0.00523069331 2.87805400798 -0.016 -0.006 0.056 H -3.29750276746 -0.00099200484 3.88584245085 -0.027 0.003 -0.005 H -4.55513299541 0.00377930937 -2.13473279421 0.001 0.014 0.010 H -4.55107479454 0.00501307822 2.13844314827 -0.000 -0.019 0.010 H -6.83436893102 0.00806057203 1.19721860356 0.015 -0.015 0.033 H 6.86748209639 1.20005966818 0.00372860376 -0.001 0.001 -0.031 61 Mode 20: freq=133.14 N -0.44003451495 -0.00038510790 2.12369783068 -0.000 0.221 0.003 C -1.76594470239 0.00039861437 2.37754210613 -0.001 0.096 0.001 C -2.24923313135 -0.00145267054 3.67997125809 -0.003 -0.120 0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.005 -0.163 0.002 C 0.02462671625 -0.00591801736 4.46614405978 -0.005 0.053 0.004 C 0.43187566201 -0.00376957955 3.13352499014 -0.002 0.226 0.005 C -2.63984642995 0.00218980399 1.17162612704 0.000 0.177 0.001 N -1.98513620489 0.00132140951 0.00153900685 0.000 0.184 0.001 C -2.63911589169 0.00167522827 -1.17277445342 0.000 0.188 0.001 C -4.02452897564 0.00329996303 -1.20791476641 0.000 0.210 0.001 C -4.73391255267 0.00451580118 -0.00020876193 0.000 0.154 0.001 C -4.02924140493 0.00399189729 1.20660077672 0.000 0.193 0.001 Co 0.00000000000 0.00000000000 0.00000000000 0.001 0.130 -0.002 N -0.43839318333 -0.00054206762 -2.12229806799 0.001 0.228 0.003 C -1.76408906064 -0.00030645034 -2.37697009192 0.001 0.111 0.002 C -2.24773885821 -0.00257631963 -3.67934971086 0.002 -0.103 0.001 C -1.33713102227 -0.00526459193 -4.73855802198 0.004 -0.165 0.003 C 0.02654101484 -0.00591797621 -4.46472703619 0.004 0.031 0.004 C 0.43371721952 -0.00363389350 -3.13225443930 0.002 0.212 0.004 S -6.53329279136 0.00637481657 -0.11611178087 -0.001 -0.226 0.006 N 2.00981687167 0.00259443239 -0.00000686048 0.000 -0.029 -0.006 C 2.67119656792 1.17263645248 0.00045766926 0.008 -0.027 0.008 C 4.06129317470 1.20536051565 0.00241240325 0.013 -0.035 0.016 C 4.76783866331 0.00148799420 0.00346798881 -0.000 -0.049 -0.005 C 4.05723810074 -1.20352939940 0.00211502115 -0.012 -0.035 -0.030 C 2.67108506586 -1.17139122066 0.00026591651 -0.008 -0.027 -0.022 C 1.82209539371 2.39842937406 -0.00175320633 -0.024 -0.040 0.011 C 2.33938959521 3.68993217240 -0.00584554905 -0.096 -0.013 0.005 C 1.45736908622 4.77231118002 -0.00917967851 -0.163 -0.063 -0.007 C 0.08658913130 4.53522926787 -0.00833235387 -0.152 -0.129 -0.010 C -0.35359617412 3.21325694137 -0.00400174376 -0.077 -0.150 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.015 -0.098 0.010 S 6.56718562933 -0.11349126889 0.00673479967 -0.013 -0.278 0.007 C 1.82142022278 -2.39594383179 -0.00206827421 0.025 -0.040 -0.020 C 2.33969079820 -3.68709653410 -0.00625612120 0.098 -0.012 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.166 -0.064 0.017 C 0.08684213972 -4.53272927032 -0.00840538011 0.155 -0.130 0.010 C -0.35393854068 -3.21111942258 -0.00398541364 0.079 -0.152 -0.012 N 0.49225266031 -2.17934076887 -0.00084210065 0.016 -0.099 -0.025 H 1.83694111827 5.77332096953 -0.01265611066 -0.063 -0.012 -0.004 H -0.61802819388 5.33967450634 -0.01131742088 -0.056 -0.048 -0.006 H 3.39175422949 3.87200638269 -0.00704552340 -0.030 0.013 0.002 H -1.39787683933 2.98334799634 -0.00369736757 -0.018 -0.062 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.064 -0.012 0.010 H -0.61749414542 -5.33746053721 -0.01121572048 0.057 -0.048 0.007 H -1.39833026435 -2.98175334118 -0.00345676225 0.019 -0.063 -0.005 H 3.39230213722 -3.86796714602 -0.00754158092 0.031 0.014 0.002 H 4.58301895157 2.13678100538 0.00314824260 0.005 -0.010 0.010 H 4.58784714512 -2.12983634010 0.00211631073 -0.005 -0.010 -0.014 H -1.68997263563 -0.00719388386 -5.74925805817 0.002 -0.101 0.001 H 0.75224758084 -0.00860493512 -5.25016290812 0.001 0.006 0.001 H -3.29620044300 -0.00255800648 -3.88456579214 0.001 -0.067 0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.001 0.096 0.002 H -1.69176120521 -0.00597000955 5.75026973076 -0.002 -0.100 0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.002 0.018 0.001 H 1.46975366817 -0.00523069331 2.87805400798 -0.000 0.103 0.002 H -3.29750276746 -0.00099200484 3.88584245085 -0.001 -0.076 -0.001 H -4.55513299541 0.00377930937 -2.13473279421 0.000 0.064 0.000 H -4.55107479454 0.00501307822 2.13844314827 0.000 0.052 0.000 H -6.83436893102 0.00806057203 1.19721860356 0.001 0.033 0.001 H 6.86748209639 1.20005966818 0.00372860376 0.029 -0.056 0.009 61 Mode 21: freq=151.59 N -0.44003451495 -0.00038510790 2.12369783068 -0.008 0.070 -0.045 C -1.76594470239 0.00039861437 2.37754210613 -0.011 0.043 -0.104 C -2.24923313135 -0.00145267054 3.67997125809 -0.098 -0.024 -0.137 C -1.33887502024 -0.00450793845 4.73956848945 -0.170 -0.054 -0.085 C 0.02462671625 -0.00591801736 4.46614405978 -0.155 0.002 -0.011 C 0.43187566201 -0.00376957955 3.13352499014 -0.070 0.060 0.014 C -2.63984642995 0.00218980399 1.17162612704 0.031 0.057 -0.110 N -1.98513620489 0.00132140951 0.00153900685 -0.005 0.004 -0.133 C -2.63911589169 0.00167522827 -1.17277445342 -0.044 -0.029 -0.109 C -4.02452897564 0.00329996303 -1.20791476641 -0.066 -0.042 -0.053 C -4.73391255267 0.00451580118 -0.00020876193 -0.009 0.026 -0.003 C -4.02924140493 0.00399189729 1.20660077672 0.053 0.098 -0.054 Co 0.00000000000 0.00000000000 0.00000000000 0.003 -0.034 -0.154 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 -0.043 -0.032 C -1.76408906064 -0.00030645034 -2.37697009192 0.005 -0.034 -0.100 C -2.24773885821 -0.00257631963 -3.67934971086 0.102 -0.002 -0.137 C -1.33713102227 -0.00526459193 -4.73855802198 0.184 0.029 -0.078 C 0.02654101484 -0.00591797621 -4.46472703619 0.166 0.017 0.006 C 0.43371721952 -0.00363389350 -3.13225443930 0.070 -0.021 0.034 S -6.53329279136 0.00637481657 -0.11611178087 -0.062 -0.038 0.678 N 2.00981687167 0.00259443239 -0.00000686048 0.010 -0.030 0.011 C 2.67119656792 1.17263645248 0.00045766926 0.001 -0.025 0.082 C 4.06129317470 1.20536051565 0.00241240325 -0.003 -0.013 0.149 C 4.76783866331 0.00148799420 0.00346798881 0.011 -0.002 0.078 C 4.05723810074 -1.20352939940 0.00211502115 0.023 -0.013 0.037 C 2.67108506586 -1.17139122066 0.00026591651 0.018 -0.024 0.015 C 1.82209539371 2.39842937406 -0.00175320633 0.006 -0.026 0.047 C 2.33938959521 3.68993217240 -0.00584554905 0.017 -0.031 -0.043 C 1.45736908622 4.77231118002 -0.00917967851 0.026 -0.025 -0.066 C 0.08658913130 4.53522926787 -0.00833235387 0.024 -0.016 0.021 C -0.35359617412 3.21325694137 -0.00400174376 0.014 -0.012 0.088 N 0.49290585413 2.18198449515 -0.00068475564 0.007 -0.020 0.087 S 6.56718562933 -0.11349126889 0.00673479967 0.030 0.142 -0.112 C 1.82142022278 -2.39594383179 -0.00206827421 0.005 -0.020 -0.008 C 2.33969079820 -3.68709653410 -0.00625612120 -0.021 -0.030 -0.021 C 1.45789786198 -4.76953179608 -0.00945089783 -0.044 -0.014 -0.006 C 0.08684213972 -4.53272927032 -0.00840538011 -0.040 0.010 0.023 C -0.35393854068 -3.21111942258 -0.00398541364 -0.014 0.018 0.021 N 0.49225266031 -2.17934076887 -0.00084210065 0.007 0.001 0.003 H 1.83694111827 5.77332096953 -0.01265611066 0.009 -0.008 -0.042 H -0.61802819388 5.33967450634 -0.01131742088 0.009 -0.003 0.007 H 3.39175422949 3.87200638269 -0.00704552340 0.005 -0.011 -0.030 H -1.39787683933 2.98334799634 -0.00369736757 0.003 -0.001 0.039 H 1.83794742242 -5.77033326187 -0.01295832570 -0.018 -0.006 -0.004 H -0.61749414542 -5.33746053721 -0.01121572048 -0.016 0.007 0.012 H -1.39833026435 -2.98175334118 -0.00345676225 -0.003 0.011 0.009 H 3.39230213722 -3.86796714602 -0.00754158092 -0.007 -0.014 -0.011 H 4.58301895157 2.13678100538 0.00314824260 -0.004 -0.002 0.062 H 4.58784714512 -2.12983634010 0.00211631073 0.009 -0.003 0.005 H -1.68997263563 -0.00719388386 -5.74925805817 0.073 0.018 -0.029 H 0.75224758084 -0.00860493512 -5.25016290812 0.063 0.011 0.016 H -3.29620044300 -0.00255800648 -3.88456579214 0.033 0.003 -0.060 H 1.47161249279 -0.00457826661 -2.87685200854 0.015 -0.009 0.032 H -1.69176120521 -0.00597000955 5.75026973076 -0.066 -0.033 -0.031 H 0.75025791005 -0.00892914887 5.25161119224 -0.058 -0.003 0.009 H 1.46975366817 -0.00523069331 2.87805400798 -0.015 0.026 0.023 H -3.29750276746 -0.00099200484 3.88584245085 -0.031 -0.018 -0.058 H -4.55513299541 0.00377930937 -2.13473279421 -0.030 -0.027 -0.011 H -4.55107479454 0.00501307822 2.13844314827 0.028 0.047 -0.010 H -6.83436893102 0.00806057203 1.19721860356 0.097 0.053 0.145 H 6.86748209639 1.20005966818 0.00372860376 -0.018 0.031 0.074 61 Mode 22: freq=152.34 N -0.44003451495 -0.00038510790 2.12369783068 0.004 -0.135 -0.008 C -1.76594470239 0.00039861437 2.37754210613 0.002 -0.069 -0.030 C -2.24923313135 -0.00145267054 3.67997125809 -0.029 0.075 -0.042 C -1.33887502024 -0.00450793845 4.73956848945 -0.055 0.110 -0.023 C 0.02462671625 -0.00591801736 4.46614405978 -0.049 -0.035 0.004 C 0.43187566201 -0.00376957955 3.13352499014 -0.019 -0.142 0.013 C -2.63984642995 0.00218980399 1.17162612704 0.018 -0.120 -0.034 N -1.98513620489 0.00132140951 0.00153900685 0.007 -0.033 -0.042 C -2.63911589169 0.00167522827 -1.17277445342 -0.005 -0.021 -0.035 C -4.02452897564 0.00329996303 -1.20791476641 -0.011 -0.045 -0.017 C -4.73391255267 0.00451580118 -0.00020876193 0.007 -0.106 -0.002 C -4.02924140493 0.00399189729 1.20660077672 0.025 -0.204 -0.018 Co 0.00000000000 0.00000000000 0.00000000000 0.007 0.137 -0.044 N -0.43839318333 -0.00054206762 -2.12229806799 0.006 -0.006 -0.020 C -1.76408906064 -0.00030645034 -2.37697009192 0.006 0.015 -0.035 C -2.24773885821 -0.00257631963 -3.67934971086 0.029 0.040 -0.044 C -1.33713102227 -0.00526459193 -4.73855802198 0.048 0.012 -0.030 C 0.02654101484 -0.00591797621 -4.46472703619 0.044 -0.042 -0.011 C 0.43371721952 -0.00363389350 -3.13225443930 0.022 -0.040 -0.005 S -6.53329279136 0.00637481657 -0.11611178087 -0.001 0.146 0.205 N 2.00981687167 0.00259443239 -0.00000686048 -0.005 0.132 0.010 C 2.67119656792 1.17263645248 0.00045766926 0.031 0.109 -0.031 C 4.06129317470 1.20536051565 0.00241240325 0.050 0.059 -0.054 C 4.76783866331 0.00148799420 0.00346798881 -0.008 0.011 0.022 C 4.05723810074 -1.20352939940 0.00211502115 -0.062 0.058 0.115 C 2.67108506586 -1.17139122066 0.00026591651 -0.042 0.108 0.070 C 1.82209539371 2.39842937406 -0.00175320633 -0.004 0.105 -0.035 C 2.33938959521 3.68993217240 -0.00584554905 -0.076 0.135 -0.002 C 1.45736908622 4.77231118002 -0.00917967851 -0.139 0.092 0.028 C 0.08658913130 4.53522926787 -0.00833235387 -0.127 0.027 0.015 C -0.35359617412 3.21325694137 -0.00400174376 -0.056 0.003 -0.023 N 0.49290585413 2.18198449515 -0.00068475564 -0.002 0.053 -0.043 S 6.56718562933 -0.11349126889 0.00673479967 -0.056 -0.613 -0.027 C 1.82142022278 -2.39594383179 -0.00206827421 -0.001 0.101 0.055 C 2.33969079820 -3.68709653410 -0.00625612120 0.082 0.135 -0.018 C 1.45789786198 -4.76953179608 -0.00945089783 0.154 0.086 -0.057 C 0.08684213972 -4.53272927032 -0.00840538011 0.140 0.011 -0.004 C -0.35393854068 -3.21111942258 -0.00398541364 0.058 -0.016 0.063 N 0.49225266031 -2.17934076887 -0.00084210065 -0.005 0.041 0.081 H 1.83694111827 5.77332096953 -0.01265611066 -0.055 0.032 0.018 H -0.61802819388 5.33967450634 -0.01131742088 -0.049 -0.002 0.010 H 3.39175422949 3.87200638269 -0.00704552340 -0.024 0.054 0.003 H -1.39787683933 2.98334799634 -0.00369736757 -0.013 -0.015 -0.009 H 1.83794742242 -5.77033326187 -0.01295832570 0.061 0.031 -0.036 H -0.61749414542 -5.33746053721 -0.01121572048 0.054 -0.009 -0.006 H -1.39833026435 -2.98175334118 -0.00345676225 0.013 -0.024 0.027 H 3.39230213722 -3.86796714602 -0.00754158092 0.026 0.057 -0.017 H 4.58301895157 2.13678100538 0.00314824260 0.026 0.012 -0.035 H 4.58784714512 -2.12983634010 0.00211631073 -0.027 0.013 0.056 H -1.68997263563 -0.00719388386 -5.74925805817 0.018 0.007 -0.010 H 0.75224758084 -0.00860493512 -5.25016290812 0.016 -0.023 -0.000 H -3.29620044300 -0.00255800648 -3.88456579214 0.009 0.021 -0.017 H 1.47161249279 -0.00457826661 -2.87685200854 0.005 -0.018 0.004 H -1.69176120521 -0.00597000955 5.75026973076 -0.022 0.068 -0.009 H 0.75025791005 -0.00892914887 5.25161119224 -0.019 -0.012 0.006 H 1.46975366817 -0.00523069331 2.87805400798 -0.004 -0.064 0.011 H -3.29750276746 -0.00099200484 3.88584245085 -0.009 0.050 -0.019 H -4.55513299541 0.00377930937 -2.13473279421 -0.007 -0.002 -0.003 H -4.55107479454 0.00501307822 2.13844314827 0.011 -0.083 -0.003 H -6.83436893102 0.00806057203 1.19721860356 0.033 -0.104 0.044 H 6.86748209639 1.20005966818 0.00372860376 0.090 -0.131 -0.031 61 Mode 23: freq=154.19 N -0.44003451495 -0.00038510790 2.12369783068 0.005 0.161 0.017 C -1.76594470239 0.00039861437 2.37754210613 0.004 0.121 0.022 C -2.24923313135 -0.00145267054 3.67997125809 0.013 -0.012 0.026 C -1.33887502024 -0.00450793845 4.73956848945 0.020 -0.115 0.021 C 0.02462671625 -0.00591801736 4.46614405978 0.019 -0.041 0.014 C 0.43187566201 -0.00376957955 3.13352499014 0.010 0.101 0.011 C -2.63984642995 0.00218980399 1.17162612704 -0.000 0.117 0.022 N -1.98513620489 0.00132140951 0.00153900685 0.006 -0.032 0.026 C -2.63911589169 0.00167522827 -1.17277445342 0.012 -0.199 0.021 C -4.02452897564 0.00329996303 -1.20791476641 0.016 -0.310 0.012 C -4.73391255267 0.00451580118 -0.00020876193 0.007 -0.033 0.003 C -4.02924140493 0.00399189729 1.20660077672 -0.004 0.207 0.012 Co 0.00000000000 0.00000000000 0.00000000000 0.003 0.040 0.019 N -0.43839318333 -0.00054206762 -2.12229806799 0.004 -0.247 0.006 C -1.76408906064 -0.00030645034 -2.37697009192 0.003 -0.163 0.019 C -2.24773885821 -0.00257631963 -3.67934971086 -0.014 0.062 0.025 C -1.33713102227 -0.00526459193 -4.73855802198 -0.029 0.184 0.014 C 0.02654101484 -0.00591797621 -4.46472703619 -0.025 0.016 -0.001 C 0.43371721952 -0.00363389350 -3.13225443930 -0.009 -0.194 -0.005 S -6.53329279136 0.00637481657 -0.11611178087 0.021 0.031 -0.112 N 2.00981687167 0.00259443239 -0.00000686048 -0.006 0.058 -0.016 C 2.67119656792 1.17263645248 0.00045766926 0.008 0.049 0.116 C 4.06129317470 1.20536051565 0.00241240325 0.016 0.028 0.209 C 4.76783866331 0.00148799420 0.00346798881 -0.008 0.008 -0.008 C 4.05723810074 -1.20352939940 0.00211502115 -0.030 0.028 -0.248 C 2.67108506586 -1.17139122066 0.00026591651 -0.021 0.048 -0.155 C 1.82209539371 2.39842937406 -0.00175320633 -0.004 0.048 0.105 C 2.33938959521 3.68993217240 -0.00584554905 -0.027 0.058 -0.023 C 1.45736908622 4.77231118002 -0.00917967851 -0.047 0.045 -0.102 C 0.08658913130 4.53522926787 -0.00833235387 -0.043 0.024 -0.017 C -0.35359617412 3.21325694137 -0.00400174376 -0.020 0.017 0.106 N 0.49290585413 2.18198449515 -0.00068475564 -0.004 0.033 0.147 S 6.56718562933 -0.11349126889 0.00673479967 -0.032 -0.247 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.004 0.045 -0.130 C 2.33969079820 -3.68709653410 -0.00625612120 0.030 0.058 0.035 C 1.45789786198 -4.76953179608 -0.00945089783 0.060 0.038 0.132 C 0.08684213972 -4.53272927032 -0.00840538011 0.054 0.007 0.016 C -0.35393854068 -3.21111942258 -0.00398541364 0.020 -0.003 -0.140 N 0.49225266031 -2.17934076887 -0.00084210065 -0.005 0.019 -0.188 H 1.83694111827 5.77332096953 -0.01265611066 -0.018 0.015 -0.065 H -0.61802819388 5.33967450634 -0.01131742088 -0.016 0.004 -0.018 H 3.39175422949 3.87200638269 -0.00704552340 -0.008 0.021 -0.027 H -1.39787683933 2.98334799634 -0.00369736757 -0.005 -0.000 0.046 H 1.83794742242 -5.77033326187 -0.01295832570 0.024 0.013 0.084 H -0.61749414542 -5.33746053721 -0.01121572048 0.021 -0.003 0.019 H -1.39833026435 -2.98175334118 -0.00345676225 0.004 -0.009 -0.061 H 3.39230213722 -3.86796714602 -0.00754158092 0.010 0.024 0.035 H 4.58301895157 2.13678100538 0.00314824260 0.009 0.006 0.117 H 4.58784714512 -2.12983634010 0.00211631073 -0.012 0.006 -0.127 H -1.68997263563 -0.00719388386 -5.74925805817 -0.012 0.115 0.005 H 0.75224758084 -0.00860493512 -5.25016290812 -0.010 0.021 -0.003 H -3.29620044300 -0.00255800648 -3.88456579214 -0.005 0.052 0.011 H 1.47161249279 -0.00457826661 -2.87685200854 -0.002 -0.085 -0.005 H -1.69176120521 -0.00597000955 5.75026973076 0.007 -0.072 0.007 H 0.75025791005 -0.00892914887 5.25161119224 0.007 -0.030 0.003 H 1.46975366817 -0.00523069331 2.87805400798 0.003 0.043 0.001 H -3.29750276746 -0.00099200484 3.88584245085 0.004 -0.021 0.009 H -4.55513299541 0.00377930937 -2.13473279421 0.006 -0.153 0.003 H -4.55107479454 0.00501307822 2.13844314827 -0.003 0.123 0.002 H -6.83436893102 0.00806057203 1.19721860356 -0.015 0.127 -0.024 H 6.86748209639 1.20005966818 0.00372860376 0.035 -0.053 0.122 61 Mode 24: freq=162.67 N -0.44003451495 -0.00038510790 2.12369783068 0.098 0.001 0.111 C -1.76594470239 0.00039861437 2.37754210613 0.081 -0.001 0.030 C -2.24923313135 -0.00145267054 3.67997125809 -0.005 -0.005 0.002 C -1.33887502024 -0.00450793845 4.73956848945 -0.081 -0.002 0.063 C 0.02462671625 -0.00591801736 4.46614405978 -0.063 0.005 0.146 C 0.43187566201 -0.00376957955 3.13352499014 0.024 0.005 0.169 C -2.63984642995 0.00218980399 1.17162612704 0.126 0.004 -0.001 N -1.98513620489 0.00132140951 0.00153900685 0.121 0.000 -0.008 C -2.63911589169 0.00167522827 -1.17277445342 0.120 0.009 -0.013 C -4.02452897564 0.00329996303 -1.20791476641 0.126 0.019 -0.003 C -4.73391255267 0.00451580118 -0.00020876193 0.144 0.012 0.002 C -4.02924140493 0.00399189729 1.20660077672 0.135 0.009 -0.001 Co 0.00000000000 0.00000000000 0.00000000000 0.032 -0.020 -0.014 N -0.43839318333 -0.00054206762 -2.12229806799 0.097 0.008 -0.116 C -1.76408906064 -0.00030645034 -2.37697009192 0.081 0.004 -0.043 C -2.24773885821 -0.00257631963 -3.67934971086 0.008 -0.005 -0.019 C -1.33713102227 -0.00526459193 -4.73855802198 -0.058 -0.007 -0.073 C 0.02654101484 -0.00591797621 -4.46472703619 -0.042 0.003 -0.146 C 0.43371721952 -0.00363389350 -3.13225443930 0.033 0.009 -0.165 S -6.53329279136 0.00637481657 -0.11611178087 0.265 -0.015 0.044 N 2.00981687167 0.00259443239 -0.00000686048 -0.146 -0.011 -0.001 C 2.67119656792 1.17263645248 0.00045766926 -0.152 -0.002 0.002 C 4.06129317470 1.20536051565 0.00241240325 -0.163 -0.003 0.005 C 4.76783866331 0.00148799420 0.00346798881 -0.173 0.002 0.007 C 4.05723810074 -1.20352939940 0.00211502115 -0.152 -0.004 0.012 C 2.67108506586 -1.17139122066 0.00026591651 -0.144 -0.016 0.006 C 1.82209539371 2.39842937406 -0.00175320633 -0.095 0.034 -0.001 C 2.33938959521 3.68993217240 -0.00584554905 0.020 -0.009 -0.002 C 1.45736908622 4.77231118002 -0.00917967851 0.128 0.073 -0.001 C 0.08658913130 4.53522926787 -0.00833235387 0.108 0.186 0.002 C -0.35359617412 3.21325694137 -0.00400174376 -0.013 0.221 0.001 N 0.49290585413 2.18198449515 -0.00068475564 -0.118 0.141 -0.001 S 6.56718562933 -0.11349126889 0.00673479967 -0.320 0.055 -0.010 C 1.82142022278 -2.39594383179 -0.00206827421 -0.094 -0.052 0.003 C 2.33969079820 -3.68709653410 -0.00625612120 0.006 -0.014 -0.003 C 1.45789786198 -4.76953179608 -0.00945089783 0.100 -0.087 -0.004 C 0.08684213972 -4.53272927032 -0.00840538011 0.083 -0.187 0.001 C -0.35393854068 -3.21111942258 -0.00398541364 -0.023 -0.217 0.005 N 0.49225266031 -2.17934076887 -0.00084210065 -0.116 -0.148 0.005 H 1.83694111827 5.77332096953 -0.01265611066 0.063 0.011 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.051 0.071 0.001 H 3.39175422949 3.87200638269 -0.00704552340 0.010 -0.030 -0.001 H -1.39787683933 2.98334799634 -0.00369736757 -0.010 0.093 0.001 H 1.83794742242 -5.77033326187 -0.01295832570 0.052 -0.016 -0.003 H -0.61749414542 -5.33746053721 -0.01121572048 0.041 -0.069 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.012 -0.089 0.002 H 3.39230213722 -3.86796714602 -0.00754158092 0.006 0.019 -0.002 H 4.58301895157 2.13678100538 0.00314824260 -0.044 -0.003 0.001 H 4.58784714512 -2.12983634010 0.00211631073 -0.039 0.002 0.005 H -1.68997263563 -0.00719388386 -5.74925805817 -0.034 -0.005 -0.015 H 0.75224758084 -0.00860493512 -5.25016290812 -0.024 0.001 -0.054 H -3.29620044300 -0.00255800648 -3.88456579214 -0.001 -0.003 0.011 H 1.47161249279 -0.00457826661 -2.87685200854 0.014 0.004 -0.066 H -1.69176120521 -0.00597000955 5.75026973076 -0.043 -0.001 0.011 H 0.75025791005 -0.00892914887 5.25161119224 -0.032 0.002 0.055 H 1.46975366817 -0.00523069331 2.87805400798 0.012 0.002 0.070 H -3.29750276746 -0.00099200484 3.88584245085 -0.005 -0.003 -0.019 H -4.55513299541 0.00377930937 -2.13473279421 0.033 0.008 0.002 H -4.55107479454 0.00501307822 2.13844314827 0.037 0.002 -0.002 H -6.83436893102 0.00806057203 1.19721860356 0.052 0.007 0.009 H 6.86748209639 1.20005966818 0.00372860376 -0.063 0.011 0.004 61 Mode 25: freq=191.04 N -0.44003451495 -0.00038510790 2.12369783068 0.003 0.146 0.010 C -1.76594470239 0.00039861437 2.37754210613 0.002 0.130 0.008 C -2.24923313135 -0.00145267054 3.67997125809 -0.000 0.076 0.008 C -1.33887502024 -0.00450793845 4.73956848945 -0.003 -0.062 0.010 C 0.02462671625 -0.00591801736 4.46614405978 -0.003 -0.094 0.012 C 0.43187566201 -0.00376957955 3.13352499014 -0.001 0.043 0.012 C -2.63984642995 0.00218980399 1.17162612704 0.001 0.066 0.008 N -1.98513620489 0.00132140951 0.00153900685 0.001 0.147 0.009 C -2.63911589169 0.00167522827 -1.17277445342 0.001 0.012 0.008 C -4.02452897564 0.00329996303 -1.20791476641 0.002 -0.186 0.007 C -4.73391255267 0.00451580118 -0.00020876193 0.001 -0.184 0.006 C -4.02924140493 0.00399189729 1.20660077672 -0.000 -0.080 0.007 Co 0.00000000000 0.00000000000 0.00000000000 -0.001 0.210 -0.028 N -0.43839318333 -0.00054206762 -2.12229806799 -0.001 0.036 0.008 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 0.027 0.008 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 0.018 0.008 C -1.33713102227 -0.00526459193 -4.73855802198 0.002 -0.015 0.009 C 0.02654101484 -0.00591797621 -4.46472703619 0.002 -0.023 0.010 C 0.43371721952 -0.00363389350 -3.13225443930 0.001 0.013 0.010 S -6.53329279136 0.00637481657 -0.11611178087 0.005 0.248 -0.020 N 2.00981687167 0.00259443239 -0.00000686048 -0.002 -0.047 -0.031 C 2.67119656792 1.17263645248 0.00045766926 -0.001 -0.044 -0.007 C 4.06129317470 1.20536051565 0.00241240325 -0.009 -0.038 0.035 C 4.76783866331 0.00148799420 0.00346798881 -0.002 -0.031 0.038 C 4.05723810074 -1.20352939940 0.00211502115 0.005 -0.037 0.011 C 2.67108506586 -1.17139122066 0.00026591651 -0.003 -0.044 -0.017 C 1.82209539371 2.39842937406 -0.00175320633 0.005 -0.044 -0.028 C 2.33938959521 3.68993217240 -0.00584554905 0.001 -0.046 -0.026 C 1.45736908622 4.77231118002 -0.00917967851 -0.006 -0.052 0.008 C 0.08658913130 4.53522926787 -0.00833235387 -0.006 -0.055 0.029 C -0.35359617412 3.21325694137 -0.00400174376 -0.002 -0.053 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.009 -0.046 -0.030 S 6.56718562933 -0.11349126889 0.00673479967 0.008 0.115 -0.056 C 1.82142022278 -2.39594383179 -0.00206827421 -0.008 -0.045 -0.012 C 2.33969079820 -3.68709653410 -0.00625612120 -0.002 -0.046 0.004 C 1.45789786198 -4.76953179608 -0.00945089783 0.007 -0.054 0.014 C 0.08684213972 -4.53272927032 -0.00840538011 0.007 -0.059 -0.001 C -0.35393854068 -3.21111942258 -0.00398541364 0.000 -0.058 -0.017 N 0.49225266031 -2.17934076887 -0.00084210065 -0.012 -0.049 -0.017 H 1.83694111827 5.77332096953 -0.01265611066 -0.003 -0.015 0.006 H -0.61802819388 5.33967450634 -0.01131742088 -0.002 -0.016 0.018 H 3.39175422949 3.87200638269 -0.00704552340 0.000 -0.011 -0.012 H -1.39787683933 2.98334799634 -0.00369736757 0.000 -0.018 0.001 H 1.83794742242 -5.77033326187 -0.01295832570 0.004 -0.015 0.009 H -0.61749414542 -5.33746053721 -0.01121572048 0.003 -0.018 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.001 -0.020 -0.008 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 -0.011 0.003 H 4.58301895157 2.13678100538 0.00314824260 -0.004 -0.010 0.012 H 4.58784714512 -2.12983634010 0.00211631073 0.003 -0.010 0.010 H -1.68997263563 -0.00719388386 -5.74925805817 0.001 -0.009 0.003 H 0.75224758084 -0.00860493512 -5.25016290812 0.001 -0.014 0.003 H -3.29620044300 -0.00255800648 -3.88456579214 0.000 0.010 0.002 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 0.005 0.003 H -1.69176120521 -0.00597000955 5.75026973076 -0.002 -0.042 0.003 H 0.75025791005 -0.00892914887 5.25161119224 -0.001 -0.061 0.004 H 1.46975366817 -0.00523069331 2.87805400798 0.000 0.015 0.004 H -3.29750276746 -0.00099200484 3.88584245085 -0.000 0.030 0.002 H -4.55513299541 0.00377930937 -2.13473279421 0.001 -0.110 0.002 H -4.55107479454 0.00501307822 2.13844314827 -0.000 -0.011 0.002 H -6.83436893102 0.00806057203 1.19721860356 -0.005 -0.772 -0.004 H 6.86748209639 1.20005966818 0.00372860376 -0.026 0.027 0.208 61 Mode 26: freq=192.86 N -0.44003451495 -0.00038510790 2.12369783068 0.006 -0.044 0.035 C -1.76594470239 0.00039861437 2.37754210613 0.003 -0.038 0.033 C -2.24923313135 -0.00145267054 3.67997125809 -0.002 -0.012 0.034 C -1.33887502024 -0.00450793845 4.73956848945 -0.010 0.025 0.040 C 0.02462671625 -0.00591801736 4.46614405978 -0.009 0.017 0.044 C 0.43187566201 -0.00376957955 3.13352499014 -0.004 -0.023 0.044 C -2.63984642995 0.00218980399 1.17162612704 -0.002 -0.027 0.034 N -1.98513620489 0.00132140951 0.00153900685 -0.002 -0.037 0.037 C -2.63911589169 0.00167522827 -1.17277445342 -0.001 0.010 0.034 C -4.02452897564 0.00329996303 -1.20791476641 0.004 0.074 0.029 C -4.73391255267 0.00451580118 -0.00020876193 -0.001 0.047 0.024 C -4.02924140493 0.00399189729 1.20660077672 -0.007 -0.004 0.029 Co 0.00000000000 0.00000000000 0.00000000000 -0.001 -0.055 -0.122 N -0.43839318333 -0.00054206762 -2.12229806799 -0.009 -0.001 0.038 C -1.76408906064 -0.00030645034 -2.37697009192 -0.005 -0.001 0.034 C -2.24773885821 -0.00257631963 -3.67934971086 0.001 -0.014 0.034 C -1.33713102227 -0.00526459193 -4.73855802198 0.011 -0.007 0.042 C 0.02654101484 -0.00591797621 -4.46472703619 0.010 0.013 0.048 C 0.43371721952 -0.00363389350 -3.13225443930 0.002 0.010 0.048 S -6.53329279136 0.00637481657 -0.11611178087 0.005 -0.060 -0.080 N 2.00981687167 0.00259443239 -0.00000686048 0.002 0.011 -0.129 C 2.67119656792 1.17263645248 0.00045766926 0.001 0.011 -0.077 C 4.06129317470 1.20536051565 0.00241240325 0.003 0.009 0.043 C 4.76783866331 0.00148799420 0.00346798881 0.002 0.008 0.163 C 4.05723810074 -1.20352939940 0.00211502115 -0.000 0.009 0.163 C 2.67108506586 -1.17139122066 0.00026591651 0.002 0.011 -0.017 C 1.82209539371 2.39842937406 -0.00175320633 -0.001 0.010 -0.139 C 2.33938959521 3.68993217240 -0.00584554905 -0.000 0.011 -0.077 C 1.45736908622 4.77231118002 -0.00917967851 0.001 0.013 0.069 C 0.08658913130 4.53522926787 -0.00833235387 0.001 0.013 0.096 C -0.35359617412 3.21325694137 -0.00400174376 0.001 0.012 -0.052 N 0.49290585413 2.18198449515 -0.00068475564 -0.001 0.010 -0.157 S 6.56718562933 -0.11349126889 0.00673479967 0.000 -0.028 -0.230 C 1.82142022278 -2.39594383179 -0.00206827421 0.003 0.011 -0.030 C 2.33969079820 -3.68709653410 -0.00625612120 0.000 0.011 -0.017 C 1.45789786198 -4.76953179608 -0.00945089783 -0.003 0.014 0.020 C 0.08684213972 -4.53272927032 -0.00840538011 -0.003 0.016 0.025 C -0.35393854068 -3.21111942258 -0.00398541364 0.000 0.017 -0.017 N 0.49225266031 -2.17934076887 -0.00084210065 0.004 0.013 -0.041 H 1.83694111827 5.77332096953 -0.01265611066 0.000 0.004 0.047 H -0.61802819388 5.33967450634 -0.01131742088 0.000 0.004 0.063 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 0.003 -0.030 H -1.39787683933 2.98334799634 -0.00369736757 0.000 0.004 -0.020 H 1.83794742242 -5.77033326187 -0.01295832570 -0.002 0.004 0.012 H -0.61749414542 -5.33746053721 -0.01121572048 -0.001 0.005 0.016 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 0.006 -0.007 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 0.002 -0.010 H 4.58301895157 2.13678100538 0.00314824260 0.001 0.003 -0.007 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 0.002 0.102 H -1.68997263563 -0.00719388386 -5.74925805817 0.005 -0.004 0.011 H 0.75224758084 -0.00860493512 -5.25016290812 0.004 0.007 0.015 H -3.29620044300 -0.00255800648 -3.88456579214 0.001 -0.008 0.007 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 0.005 0.017 H -1.69176120521 -0.00597000955 5.75026973076 -0.004 0.016 0.011 H 0.75025791005 -0.00892914887 5.25161119224 -0.003 0.012 0.013 H 1.46975366817 -0.00523069331 2.87805400798 -0.000 -0.009 0.015 H -3.29750276746 -0.00099200484 3.88584245085 -0.001 -0.003 0.008 H -4.55513299541 0.00377930937 -2.13473279421 0.002 0.042 0.008 H -4.55107479454 0.00501307822 2.13844314827 -0.004 -0.010 0.008 H -6.83436893102 0.00806057203 1.19721860356 -0.018 0.174 -0.019 H 6.86748209639 1.20005966818 0.00372860376 0.005 -0.004 0.820 61 Mode 27: freq=216.37 N -0.44003451495 -0.00038510790 2.12369783068 -0.002 -0.056 -0.003 C -1.76594470239 0.00039861437 2.37754210613 -0.001 -0.042 -0.002 C -2.24923313135 -0.00145267054 3.67997125809 -0.000 -0.067 -0.001 C -1.33887502024 -0.00450793845 4.73956848945 0.001 -0.005 -0.002 C 0.02462671625 -0.00591801736 4.46614405978 0.001 0.064 -0.003 C 0.43187566201 -0.00376957955 3.13352499014 -0.000 0.008 -0.004 C -2.63984642995 0.00218980399 1.17162612704 -0.001 0.037 -0.001 N -1.98513620489 0.00132140951 0.00153900685 -0.001 -0.176 -0.001 C -2.63911589169 0.00167522827 -1.17277445342 -0.001 0.022 -0.001 C -4.02452897564 0.00329996303 -1.20791476641 -0.001 0.278 -0.001 C -4.73391255267 0.00451580118 -0.00020876193 -0.001 0.224 -0.001 C -4.02924140493 0.00399189729 1.20660077672 -0.001 0.299 -0.002 Co 0.00000000000 0.00000000000 0.00000000000 0.002 -0.480 0.009 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 -0.121 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 -0.099 -0.001 C -2.24773885821 -0.00257631963 -3.67934971086 -0.000 -0.110 -0.001 C -1.33713102227 -0.00526459193 -4.73855802198 0.000 0.018 -0.001 C 0.02654101484 -0.00591797621 -4.46472703619 0.000 0.109 -0.001 C 0.43371721952 -0.00363389350 -3.13225443930 -0.000 -0.011 -0.001 S -6.53329279136 0.00637481657 -0.11611178087 -0.003 -0.135 0.003 N 2.00981687167 0.00259443239 -0.00000686048 0.002 0.050 0.005 C 2.67119656792 1.17263645248 0.00045766926 -0.013 0.055 0.005 C 4.06129317470 1.20536051565 0.00241240325 -0.000 0.057 0.008 C 4.76783866331 0.00148799420 0.00346798881 0.001 0.056 -0.007 C 4.05723810074 -1.20352939940 0.00211502115 0.004 0.056 -0.023 C 2.67108506586 -1.17139122066 0.00026591651 0.017 0.055 -0.005 C 1.82209539371 2.39842937406 -0.00175320633 -0.023 0.056 0.002 C 2.33938959521 3.68993217240 -0.00584554905 -0.004 0.054 -0.003 C 1.45736908622 4.77231118002 -0.00917967851 0.020 0.073 -0.004 C 0.08658913130 4.53522926787 -0.00833235387 0.018 0.088 0.002 C -0.35359617412 3.21325694137 -0.00400174376 -0.001 0.089 0.004 N 0.49290585413 2.18198449515 -0.00068475564 -0.030 0.065 0.002 S 6.56718562933 -0.11349126889 0.00673479967 -0.014 -0.141 0.005 C 1.82142022278 -2.39594383179 -0.00206827421 0.026 0.056 0.004 C 2.33969079820 -3.68709653410 -0.00625612120 0.005 0.053 0.009 C 1.45789786198 -4.76953179608 -0.00945089783 -0.022 0.075 0.002 C 0.08684213972 -4.53272927032 -0.00840538011 -0.019 0.093 -0.008 C -0.35393854068 -3.21111942258 -0.00398541364 0.003 0.095 -0.002 N 0.49225266031 -2.17934076887 -0.00084210065 0.034 0.068 0.006 H 1.83694111827 5.77332096953 -0.01265611066 0.011 0.019 -0.002 H -0.61802819388 5.33967450634 -0.01131742088 0.007 0.028 0.001 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 0.010 -0.002 H -1.39787683933 2.98334799634 -0.00369736757 -0.002 0.033 0.002 H 1.83794742242 -5.77033326187 -0.01295832570 -0.012 0.020 0.001 H -0.61749414542 -5.33746053721 -0.01121572048 -0.008 0.029 -0.005 H -1.39833026435 -2.98175334118 -0.00345676225 0.003 0.036 -0.001 H 3.39230213722 -3.86796714602 -0.00754158092 0.000 0.009 0.004 H 4.58301895157 2.13678100538 0.00314824260 0.000 0.017 0.005 H 4.58784714512 -2.12983634010 0.00211631073 0.002 0.017 -0.012 H -1.68997263563 -0.00719388386 -5.74925805817 0.000 0.017 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 0.000 0.070 -0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 -0.050 -0.000 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 -0.001 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 0.001 -0.001 -0.001 H 0.75025791005 -0.00892914887 5.25161119224 0.001 0.040 -0.001 H 1.46975366817 -0.00523069331 2.87805400798 -0.000 0.005 -0.001 H -3.29750276746 -0.00099200484 3.88584245085 0.000 -0.034 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 -0.000 0.098 -0.000 H -4.55107479454 0.00501307822 2.13844314827 -0.000 0.138 -0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.000 -0.530 0.001 H 6.86748209639 1.20005966818 0.00372860376 0.037 -0.034 0.002 61 Mode 28: freq=223.19 N -0.44003451495 -0.00038510790 2.12369783068 -0.031 0.003 -0.061 C -1.76594470239 0.00039861437 2.37754210613 -0.022 0.001 -0.052 C -2.24923313135 -0.00145267054 3.67997125809 0.001 0.006 -0.048 C -1.33887502024 -0.00450793845 4.73956848945 0.031 0.003 -0.072 C 0.02462671625 -0.00591801736 4.46614405978 0.028 -0.006 -0.091 C 0.43187566201 -0.00376957955 3.13352499014 0.002 -0.003 -0.092 C -2.63984642995 0.00218980399 1.17162612704 -0.012 -0.006 -0.054 N -1.98513620489 0.00132140951 0.00153900685 0.002 0.003 -0.051 C -2.63911589169 0.00167522827 -1.17277445342 0.015 0.004 -0.054 C -4.02452897564 0.00329996303 -1.20791476641 0.003 0.009 -0.058 C -4.73391255267 0.00451580118 -0.00020876193 0.000 -0.004 -0.057 C -4.02924140493 0.00399189729 1.20660077672 -0.001 -0.020 -0.058 Co 0.00000000000 0.00000000000 0.00000000000 0.003 0.009 0.385 N -0.43839318333 -0.00054206762 -2.12229806799 0.034 0.000 -0.064 C -1.76408906064 -0.00030645034 -2.37697009192 0.025 0.001 -0.052 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 -0.003 -0.048 C -1.33713102227 -0.00526459193 -4.73855802198 -0.031 -0.003 -0.074 C 0.02654101484 -0.00591797621 -4.46472703619 -0.027 0.003 -0.094 C 0.43371721952 -0.00363389350 -3.13225443930 0.000 0.003 -0.096 S -6.53329279136 0.00637481657 -0.11611178087 -0.015 0.002 0.123 N 2.00981687167 0.00259443239 -0.00000686048 -0.001 -0.001 0.206 C 2.67119656792 1.17263645248 0.00045766926 -0.001 -0.001 -0.012 C 4.06129317470 1.20536051565 0.00241240325 -0.001 -0.001 -0.313 C 4.76783866331 0.00148799420 0.00346798881 -0.001 -0.001 -0.265 C 4.05723810074 -1.20352939940 0.00211502115 -0.001 -0.001 -0.316 C 2.67108506586 -1.17139122066 0.00026591651 -0.001 -0.001 -0.006 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 -0.001 0.095 C 2.33938959521 3.68993217240 -0.00584554905 0.000 -0.001 0.096 C 1.45736908622 4.77231118002 -0.00917967851 0.001 -0.001 -0.029 C 0.08658913130 4.53522926787 -0.00833235387 0.001 -0.001 -0.097 C -0.35359617412 3.21325694137 -0.00400174376 -0.000 -0.000 0.030 N 0.49290585413 2.18198449515 -0.00068475564 -0.000 -0.000 0.121 S 6.56718562933 -0.11349126889 0.00673479967 -0.004 0.003 0.164 C 1.82142022278 -2.39594383179 -0.00206827421 -0.001 -0.002 0.148 C 2.33969079820 -3.68709653410 -0.00625612120 -0.000 -0.001 0.140 C 1.45789786198 -4.76953179608 -0.00945089783 0.001 -0.002 -0.048 C 0.08684213972 -4.53272927032 -0.00840538011 0.001 -0.002 -0.142 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 -0.003 0.047 N 0.49225266031 -2.17934076887 -0.00084210065 -0.001 -0.003 0.183 H 1.83694111827 5.77332096953 -0.01265611066 0.000 -0.000 -0.023 H -0.61802819388 5.33967450634 -0.01131742088 0.000 -0.000 -0.063 H 3.39175422949 3.87200638269 -0.00704552340 0.000 -0.000 0.045 H -1.39787683933 2.98334799634 -0.00369736757 -0.000 0.000 0.011 H 1.83794742242 -5.77033326187 -0.01295832570 0.001 -0.000 -0.038 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 -0.001 -0.093 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 -0.001 0.017 H 3.39230213722 -3.86796714602 -0.00754158092 0.000 -0.000 0.063 H 4.58301895157 2.13678100538 0.00314824260 -0.000 -0.000 -0.140 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 -0.000 -0.117 H -1.68997263563 -0.00719388386 -5.74925805817 -0.016 -0.002 -0.019 H 0.75224758084 -0.00860493512 -5.25016290812 -0.011 0.002 -0.030 H -3.29620044300 -0.00255800648 -3.88456579214 -0.001 -0.002 -0.006 H 1.47161249279 -0.00457826661 -2.87685200854 0.003 0.002 -0.038 H -1.69176120521 -0.00597000955 5.75026973076 0.015 0.002 -0.019 H 0.75025791005 -0.00892914887 5.25161119224 0.011 -0.004 -0.029 H 1.46975366817 -0.00523069331 2.87805400798 -0.002 -0.002 -0.036 H -3.29750276746 -0.00099200484 3.88584245085 0.002 0.003 -0.007 H -4.55513299541 0.00377930937 -2.13473279421 0.002 0.006 -0.017 H -4.55107479454 0.00501307822 2.13844314827 -0.000 -0.011 -0.017 H -6.83436893102 0.00806057203 1.19721860356 0.034 0.014 0.030 H 6.86748209639 1.20005966818 0.00372860376 -0.002 0.002 0.450 61 Mode 29: freq=252.71 N -0.44003451495 -0.00038510790 2.12369783068 0.003 0.139 0.004 C -1.76594470239 0.00039861437 2.37754210613 0.003 0.090 0.003 C -2.24923313135 -0.00145267054 3.67997125809 0.000 0.131 0.002 C -1.33887502024 -0.00450793845 4.73956848945 -0.002 -0.018 0.004 C 0.02462671625 -0.00591801736 4.46614405978 -0.002 -0.126 0.005 C 0.43187566201 -0.00376957955 3.13352499014 0.000 0.034 0.006 C -2.63984642995 0.00218980399 1.17162612704 0.002 -0.056 0.003 N -1.98513620489 0.00132140951 0.00153900685 -0.000 0.003 0.002 C -2.63911589169 0.00167522827 -1.17277445342 -0.002 0.049 0.003 C -4.02452897564 0.00329996303 -1.20791476641 -0.001 0.252 0.004 C -4.73391255267 0.00451580118 -0.00020876193 0.000 0.004 0.004 C -4.02924140493 0.00399189729 1.20660077672 0.001 -0.260 0.004 Co 0.00000000000 0.00000000000 0.00000000000 -0.001 0.030 -0.034 N -0.43839318333 -0.00054206762 -2.12229806799 -0.003 -0.150 0.004 C -1.76408906064 -0.00030645034 -2.37697009192 -0.003 -0.101 0.003 C -2.24773885821 -0.00257631963 -3.67934971086 -0.001 -0.136 0.002 C -1.33713102227 -0.00526459193 -4.73855802198 0.002 0.025 0.004 C 0.02654101484 -0.00591797621 -4.46472703619 0.002 0.131 0.006 C 0.43371721952 -0.00363389350 -3.13225443930 -0.000 -0.041 0.006 S -6.53329279136 0.00637481657 -0.11611178087 0.001 -0.004 -0.007 N 2.00981687167 0.00259443239 -0.00000686048 0.000 -0.001 -0.008 C 2.67119656792 1.17263645248 0.00045766926 0.001 -0.002 0.066 C 4.06129317470 1.20536051565 0.00241240325 0.000 -0.002 0.354 C 4.76783866331 0.00148799420 0.00346798881 0.000 -0.002 0.002 C 4.05723810074 -1.20352939940 0.00211502115 -0.000 -0.002 -0.331 C 2.67108506586 -1.17139122066 0.00026591651 -0.001 -0.002 -0.059 C 1.82209539371 2.39842937406 -0.00175320633 0.001 -0.002 -0.144 C 2.33938959521 3.68993217240 -0.00584554905 0.000 -0.002 -0.189 C 1.45736908622 4.77231118002 -0.00917967851 -0.001 -0.003 0.042 C 0.08658913130 4.53522926787 -0.00833235387 -0.001 -0.003 0.181 C -0.35359617412 3.21325694137 -0.00400174376 0.000 -0.004 -0.070 N 0.49290585413 2.18198449515 -0.00068475564 0.002 -0.003 -0.216 S 6.56718562933 -0.11349126889 0.00673479967 0.001 0.004 0.001 C 1.82142022278 -2.39594383179 -0.00206827421 -0.001 -0.002 0.147 C 2.33969079820 -3.68709653410 -0.00625612120 -0.000 -0.002 0.187 C 1.45789786198 -4.76953179608 -0.00945089783 0.001 -0.003 -0.046 C 0.08684213972 -4.53272927032 -0.00840538011 0.001 -0.003 -0.179 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 -0.004 0.072 N 0.49225266031 -2.17934076887 -0.00084210065 -0.002 -0.003 0.217 H 1.83694111827 5.77332096953 -0.01265611066 -0.001 -0.001 0.037 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 -0.001 0.119 H 3.39175422949 3.87200638269 -0.00704552340 0.000 -0.000 -0.091 H -1.39787683933 2.98334799634 -0.00369736757 0.000 -0.002 -0.032 H 1.83794742242 -5.77033326187 -0.01295832570 0.001 -0.001 -0.039 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 -0.001 -0.118 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 -0.002 0.033 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 -0.000 0.089 H 4.58301895157 2.13678100538 0.00314824260 -0.000 -0.001 0.205 H 4.58784714512 -2.12983634010 0.00211631073 0.000 -0.001 -0.192 H -1.68997263563 -0.00719388386 -5.74925805817 0.001 0.024 0.001 H 0.75224758084 -0.00860493512 -5.25016290812 0.001 0.086 0.002 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 -0.064 0.000 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 -0.018 0.003 H -1.69176120521 -0.00597000955 5.75026973076 -0.001 -0.018 0.001 H 0.75025791005 -0.00892914887 5.25161119224 -0.001 -0.082 0.002 H 1.46975366817 -0.00523069331 2.87805400798 0.000 0.015 0.002 H -3.29750276746 -0.00099200484 3.88584245085 0.000 0.063 0.000 H -4.55513299541 0.00377930937 -2.13473279421 -0.000 0.144 0.001 H -4.55107479454 0.00501307822 2.13844314827 0.000 -0.150 0.001 H -6.83436893102 0.00806057203 1.19721860356 -0.002 0.039 -0.002 H 6.86748209639 1.20005966818 0.00372860376 -0.001 0.001 -0.056 61 Mode 30: freq=266.39 N -0.44003451495 -0.00038510790 2.12369783068 0.005 -0.187 0.004 C -1.76594470239 0.00039861437 2.37754210613 0.004 -0.128 0.002 C -2.24923313135 -0.00145267054 3.67997125809 0.001 -0.154 0.001 C -1.33887502024 -0.00450793845 4.73956848945 -0.002 0.054 0.005 C 0.02462671625 -0.00591801736 4.46614405978 -0.002 0.138 0.008 C 0.43187566201 -0.00376957955 3.13352499014 0.001 -0.089 0.008 C -2.63984642995 0.00218980399 1.17162612704 0.003 0.043 0.003 N -1.98513620489 0.00132140951 0.00153900685 -0.000 -0.012 0.001 C -2.63911589169 0.00167522827 -1.17277445342 -0.004 -0.038 0.003 C -4.02452897564 0.00329996303 -1.20791476641 -0.003 -0.324 0.005 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 -0.032 0.006 C -4.02924140493 0.00399189729 1.20660077672 0.002 0.285 0.005 Co 0.00000000000 0.00000000000 0.00000000000 0.000 -0.108 -0.048 N -0.43839318333 -0.00054206762 -2.12229806799 -0.006 0.282 0.004 C -1.76408906064 -0.00030645034 -2.37697009192 -0.005 0.206 0.002 C -2.24773885821 -0.00257631963 -3.67934971086 -0.001 0.221 0.001 C -1.33713102227 -0.00526459193 -4.73855802198 0.003 -0.095 0.005 C 0.02654101484 -0.00591797621 -4.46472703619 0.002 -0.197 0.009 C 0.43371721952 -0.00363389350 -3.13225443930 -0.002 0.143 0.008 S -6.53329279136 0.00637481657 -0.11611178087 0.001 0.015 -0.010 N 2.00981687167 0.00259443239 -0.00000686048 0.000 -0.001 -0.012 C 2.67119656792 1.17263645248 0.00045766926 -0.008 0.003 0.022 C 4.06129317470 1.20536051565 0.00241240325 -0.005 0.008 0.206 C 4.76783866331 0.00148799420 0.00346798881 -0.000 0.011 -0.008 C 4.05723810074 -1.20352939940 0.00211502115 0.006 0.008 -0.209 C 2.67108506586 -1.17139122066 0.00026591651 0.008 0.003 -0.022 C 1.82209539371 2.39842937406 -0.00175320633 -0.010 0.003 -0.113 C 2.33938959521 3.68993217240 -0.00584554905 -0.004 0.001 -0.124 C 1.45736908622 4.77231118002 -0.00917967851 0.004 0.007 0.054 C 0.08658913130 4.53522926787 -0.00833235387 0.003 0.014 0.109 C -0.35359617412 3.21325694137 -0.00400174376 -0.004 0.014 -0.085 N 0.49290585413 2.18198449515 -0.00068475564 -0.012 0.007 -0.159 S 6.56718562933 -0.11349126889 0.00673479967 -0.003 -0.019 0.003 C 1.82142022278 -2.39594383179 -0.00206827421 0.011 0.003 0.138 C 2.33969079820 -3.68709653410 -0.00625612120 0.004 0.001 0.146 C 1.45789786198 -4.76953179608 -0.00945089783 -0.004 0.008 -0.066 C 0.08684213972 -4.53272927032 -0.00840538011 -0.002 0.015 -0.129 C -0.35393854068 -3.21111942258 -0.00398541364 0.005 0.015 0.101 N 0.49225266031 -2.17934076887 -0.00084210065 0.013 0.008 0.189 H 1.83694111827 5.77332096953 -0.01265611066 0.003 0.002 0.043 H -0.61802819388 5.33967450634 -0.01131742088 0.002 0.005 0.075 H 3.39175422949 3.87200638269 -0.00704552340 -0.001 -0.002 -0.058 H -1.39787683933 2.98334799634 -0.00369736757 -0.002 0.006 -0.040 H 1.83794742242 -5.77033326187 -0.01295832570 -0.003 0.002 -0.052 H -0.61749414542 -5.33746053721 -0.01121572048 -0.002 0.005 -0.089 H -1.39833026435 -2.98175334118 -0.00345676225 0.002 0.006 0.047 H 3.39230213722 -3.86796714602 -0.00754158092 0.001 -0.001 0.067 H 4.58301895157 2.13678100538 0.00314824260 -0.003 0.003 0.123 H 4.58784714512 -2.12983634010 0.00211631073 0.003 0.003 -0.119 H -1.68997263563 -0.00719388386 -5.74925805817 0.002 -0.077 0.001 H 0.75224758084 -0.00860493512 -5.25016290812 0.001 -0.136 0.003 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 0.099 -0.001 H 1.47161249279 -0.00457826661 -2.87685200854 -0.001 0.065 0.004 H -1.69176120521 -0.00597000955 5.75026973076 -0.002 0.044 0.001 H 0.75025791005 -0.00892914887 5.25161119224 -0.001 0.094 0.003 H 1.46975366817 -0.00523069331 2.87805400798 0.001 -0.042 0.003 H -3.29750276746 -0.00099200484 3.88584245085 0.000 -0.072 -0.001 H -4.55513299541 0.00377930937 -2.13473279421 -0.001 -0.179 0.002 H -4.55107479454 0.00501307822 2.13844314827 0.001 0.173 0.002 H -6.83436893102 0.00806057203 1.19721860356 -0.004 -0.010 -0.003 H 6.86748209639 1.20005966818 0.00372860376 0.006 -0.005 -0.014 61 Mode 31: freq=269.49 N -0.44003451495 -0.00038510790 2.12369783068 -0.005 0.315 -0.003 C -1.76594470239 0.00039861437 2.37754210613 -0.004 0.246 -0.001 C -2.24923313135 -0.00145267054 3.67997125809 -0.001 0.236 -0.000 C -1.33887502024 -0.00450793845 4.73956848945 0.003 -0.122 -0.004 C 0.02462671625 -0.00591801736 4.46614405978 0.002 -0.207 -0.008 C 0.43187566201 -0.00376957955 3.13352499014 -0.001 0.171 -0.007 C -2.63984642995 0.00218980399 1.17162612704 -0.004 -0.020 -0.002 N -1.98513620489 0.00132140951 0.00153900685 -0.000 -0.077 -0.001 C -2.63911589169 0.00167522827 -1.17277445342 0.003 -0.000 -0.002 C -4.02452897564 0.00329996303 -1.20791476641 0.001 -0.069 -0.004 C -4.73391255267 0.00451580118 -0.00020876193 -0.002 -0.166 -0.006 C -4.02924140493 0.00399189729 1.20660077672 -0.003 -0.198 -0.005 Co 0.00000000000 0.00000000000 0.00000000000 0.006 -0.543 0.042 N -0.43839318333 -0.00054206762 -2.12229806799 0.005 0.229 -0.004 C -1.76408906064 -0.00030645034 -2.37697009192 0.004 0.187 -0.002 C -2.24773885821 -0.00257631963 -3.67934971086 0.001 0.165 -0.001 C -1.33713102227 -0.00526459193 -4.73855802198 -0.002 -0.097 -0.003 C 0.02654101484 -0.00591797621 -4.46472703619 -0.001 -0.143 -0.006 C 0.43371721952 -0.00363389350 -3.13225443930 0.001 0.129 -0.006 S -6.53329279136 0.00637481657 -0.11611178087 -0.005 0.074 0.008 N 2.00981687167 0.00259443239 -0.00000686048 0.001 -0.006 0.012 C 2.67119656792 1.17263645248 0.00045766926 -0.038 0.015 -0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.025 0.038 -0.023 C 4.76783866331 0.00148799420 0.00346798881 -0.001 0.053 0.008 C 4.05723810074 -1.20352939940 0.00211502115 0.026 0.037 0.033 C 2.67108506586 -1.17139122066 0.00026591651 0.040 0.014 0.005 C 1.82209539371 2.39842937406 -0.00175320633 -0.050 0.014 0.005 C 2.33938959521 3.68993217240 -0.00584554905 -0.018 0.006 0.005 C 1.45736908622 4.77231118002 -0.00917967851 0.019 0.034 -0.003 C 0.08658913130 4.53522926787 -0.00833235387 0.014 0.063 -0.004 C -0.35359617412 3.21325694137 -0.00400174376 -0.019 0.068 0.006 N 0.49290585413 2.18198449515 -0.00068475564 -0.056 0.037 0.008 S 6.56718562933 -0.11349126889 0.00673479967 -0.017 -0.088 -0.003 C 1.82142022278 -2.39594383179 -0.00206827421 0.053 0.015 -0.031 C 2.33969079820 -3.68709653410 -0.00625612120 0.020 0.007 -0.032 C 1.45789786198 -4.76953179608 -0.00945089783 -0.018 0.036 0.015 C 0.08684213972 -4.53272927032 -0.00840538011 -0.013 0.067 0.028 C -0.35393854068 -3.21111942258 -0.00398541364 0.021 0.072 -0.022 N 0.49225266031 -2.17934076887 -0.00084210065 0.059 0.040 -0.042 H 1.83694111827 5.77332096953 -0.01265611066 0.014 0.006 -0.002 H -0.61802819388 5.33967450634 -0.01131742088 0.009 0.023 -0.003 H 3.39175422949 3.87200638269 -0.00704552340 -0.004 -0.006 0.003 H -1.39787683933 2.98334799634 -0.00369736757 -0.008 0.029 0.003 H 1.83794742242 -5.77033326187 -0.01295832570 -0.014 0.007 0.012 H -0.61749414542 -5.33746053721 -0.01121572048 -0.009 0.024 0.020 H -1.39833026435 -2.98175334118 -0.00345676225 0.008 0.031 -0.010 H 3.39230213722 -3.86796714602 -0.00754158092 0.005 -0.006 -0.014 H 4.58301895157 2.13678100538 0.00314824260 -0.012 0.014 -0.016 H 4.58784714512 -2.12983634010 0.00211631073 0.013 0.014 0.016 H -1.68997263563 -0.00719388386 -5.74925805817 -0.001 -0.077 -0.001 H 0.75224758084 -0.00860493512 -5.25016290812 -0.001 -0.102 -0.002 H -3.29620044300 -0.00255800648 -3.88456579214 0.000 0.065 0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.001 0.056 -0.003 H -1.69176120521 -0.00597000955 5.75026973076 0.002 -0.098 -0.001 H 0.75025791005 -0.00892914887 5.25161119224 0.001 -0.146 -0.003 H 1.46975366817 -0.00523069331 2.87805400798 -0.001 0.076 -0.003 H -3.29750276746 -0.00099200484 3.88584245085 0.000 0.098 0.001 H -4.55513299541 0.00377930937 -2.13473279421 0.001 0.007 -0.002 H -4.55107479454 0.00501307822 2.13844314827 -0.001 -0.073 -0.001 H -6.83436893102 0.00806057203 1.19721860356 0.002 0.098 0.002 H 6.86748209639 1.20005966818 0.00372860376 0.030 -0.023 -0.002 61 Mode 32: freq=270.15 N -0.44003451495 -0.00038510790 2.12369783068 -0.067 -0.031 -0.046 C -1.76594470239 0.00039861437 2.37754210613 -0.058 -0.023 -0.024 C -2.24923313135 -0.00145267054 3.67997125809 -0.013 -0.024 -0.013 C -1.33887502024 -0.00450793845 4.73956848945 0.038 0.012 -0.052 C 0.02462671625 -0.00591801736 4.46614405978 0.030 0.021 -0.089 C 0.43187566201 -0.00376957955 3.13352499014 -0.016 -0.017 -0.094 C -2.63984642995 0.00218980399 1.17162612704 -0.043 0.003 -0.031 N -1.98513620489 0.00132140951 0.00153900685 0.001 0.004 -0.010 C -2.63911589169 0.00167522827 -1.17277445342 0.044 -0.002 -0.031 C -4.02452897564 0.00329996303 -1.20791476641 0.027 -0.012 -0.060 C -4.73391255267 0.00451580118 -0.00020876193 -0.003 0.009 -0.078 C -4.02924140493 0.00399189729 1.20660077672 -0.027 0.028 -0.062 Co 0.00000000000 0.00000000000 0.00000000000 0.008 0.031 0.606 N -0.43839318333 -0.00054206762 -2.12229806799 0.071 -0.000 -0.052 C -1.76408906064 -0.00030645034 -2.37697009192 0.061 -0.001 -0.027 C -2.24773885821 -0.00257631963 -3.67934971086 0.018 0.001 -0.017 C -1.33713102227 -0.00526459193 -4.73855802198 -0.033 0.001 -0.057 C 0.02654101484 -0.00591797621 -4.46472703619 -0.026 -0.001 -0.095 C 0.43371721952 -0.00363389350 -3.13225443930 0.019 -0.001 -0.099 S -6.53329279136 0.00637481657 -0.11611178087 -0.027 -0.004 0.113 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 0.000 0.181 C 2.67119656792 1.17263645248 0.00045766926 0.001 -0.001 0.046 C 4.06129317470 1.20536051565 0.00241240325 0.000 -0.002 0.107 C 4.76783866331 0.00148799420 0.00346798881 -0.002 -0.003 0.115 C 4.05723810074 -1.20352939940 0.00211502115 -0.003 -0.002 0.054 C 2.67108506586 -1.17139122066 0.00026591651 -0.003 -0.001 0.038 C 1.82209539371 2.39842937406 -0.00175320633 0.002 -0.002 -0.200 C 2.33938959521 3.68993217240 -0.00584554905 0.001 -0.002 -0.212 C 1.45736908622 4.77231118002 -0.00917967851 0.000 -0.002 0.087 C 0.08658913130 4.53522926787 -0.00833235387 0.000 -0.002 0.190 C -0.35359617412 3.21325694137 -0.00400174376 0.001 -0.003 -0.132 N 0.49290585413 2.18198449515 -0.00068475564 0.002 -0.003 -0.267 S 6.56718562933 -0.11349126889 0.00673479967 -0.003 0.005 -0.045 C 1.82142022278 -2.39594383179 -0.00206827421 -0.004 -0.000 -0.177 C 2.33969079820 -3.68709653410 -0.00625612120 -0.001 0.001 -0.184 C 1.45789786198 -4.76953179608 -0.00945089783 0.002 -0.002 0.078 C 0.08684213972 -4.53272927032 -0.00840538011 0.002 -0.005 0.164 C -0.35393854068 -3.21111942258 -0.00398541364 -0.001 -0.004 -0.115 N 0.49225266031 -2.17934076887 -0.00084210065 -0.004 -0.002 -0.232 H 1.83694111827 5.77332096953 -0.01265611066 -0.000 -0.000 0.073 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 -0.001 0.132 H 3.39175422949 3.87200638269 -0.00704552340 0.000 -0.000 -0.089 H -1.39787683933 2.98334799634 -0.00369736757 0.000 -0.001 -0.060 H 1.83794742242 -5.77033326187 -0.01295832570 0.001 -0.001 0.065 H -0.61749414542 -5.33746053721 -0.01121572048 0.001 -0.002 0.114 H -1.39833026435 -2.98175334118 -0.00345676225 -0.001 -0.002 -0.052 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 0.001 -0.075 H 4.58301895157 2.13678100538 0.00314824260 0.000 -0.001 0.021 H 4.58784714512 -2.12983634010 0.00211631073 -0.001 -0.001 -0.013 H -1.68997263563 -0.00719388386 -5.74925805817 -0.021 0.001 -0.013 H 0.75224758084 -0.00860493512 -5.25016290812 -0.014 -0.000 -0.033 H -3.29620044300 -0.00255800648 -3.88456579214 0.003 0.001 0.007 H 1.47161249279 -0.00457826661 -2.87685200854 0.009 -0.000 -0.042 H -1.69176120521 -0.00597000955 5.75026973076 0.022 0.009 -0.011 H 0.75025791005 -0.00892914887 5.25161119224 0.015 0.015 -0.032 H 1.46975366817 -0.00523069331 2.87805400798 -0.008 -0.008 -0.041 H -3.29750276746 -0.00099200484 3.88584245085 -0.002 -0.010 0.008 H -4.55513299541 0.00377930937 -2.13473279421 0.015 -0.010 -0.021 H -4.55107479454 0.00501307822 2.13844314827 -0.013 0.014 -0.021 H -6.83436893102 0.00806057203 1.19721860356 0.039 -0.007 0.030 H 6.86748209639 1.20005966818 0.00372860376 -0.002 0.001 -0.060 61 Mode 33: freq=292.99 N -0.44003451495 -0.00038510790 2.12369783068 -0.032 -0.002 0.148 C -1.76594470239 0.00039861437 2.37754210613 -0.030 -0.001 0.141 C -2.24923313135 -0.00145267054 3.67997125809 0.074 -0.002 0.209 C -1.33887502024 -0.00450793845 4.73956848945 0.150 0.000 0.171 C 0.02462671625 -0.00591801736 4.46614405978 0.142 0.001 0.121 C 0.43187566201 -0.00376957955 3.13352499014 0.036 -0.001 0.090 C -2.63984642995 0.00218980399 1.17162612704 -0.043 0.001 0.049 N -1.98513620489 0.00132140951 0.00153900685 -0.054 0.004 0.004 C -2.63911589169 0.00167522827 -1.17277445342 -0.038 0.001 -0.044 C -4.02452897564 0.00329996303 -1.20791476641 -0.058 0.001 -0.016 C -4.73391255267 0.00451580118 -0.00020876193 -0.074 0.001 -0.005 C -4.02924140493 0.00399189729 1.20660077672 -0.062 0.000 0.010 Co 0.00000000000 0.00000000000 0.00000000000 -0.074 0.011 -0.012 N -0.43839318333 -0.00054206762 -2.12229806799 -0.024 -0.002 -0.145 C -1.76408906064 -0.00030645034 -2.37697009192 -0.023 -0.002 -0.132 C -2.24773885821 -0.00257631963 -3.67934971086 0.075 -0.003 -0.197 C -1.33713102227 -0.00526459193 -4.73855802198 0.145 0.001 -0.164 C 0.02654101484 -0.00591797621 -4.46472703619 0.138 0.002 -0.120 C 0.43371721952 -0.00363389350 -3.13225443930 0.039 -0.002 -0.091 S -6.53329279136 0.00637481657 -0.11611178087 -0.213 0.000 -0.005 N 2.00981687167 0.00259443239 -0.00000686048 -0.066 -0.006 -0.006 C 2.67119656792 1.17263645248 0.00045766926 -0.048 -0.055 -0.002 C 4.06129317470 1.20536051565 0.00241240325 -0.067 -0.013 -0.001 C 4.76783866331 0.00148799420 0.00346798881 -0.074 0.007 -0.001 C 4.05723810074 -1.20352939940 0.00211502115 -0.059 0.020 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.038 0.048 -0.002 C 1.82209539371 2.39842937406 -0.00175320633 -0.028 -0.148 0.002 C 2.33938959521 3.68993217240 -0.00584554905 0.075 -0.221 0.003 C 1.45736908622 4.77231118002 -0.00917967851 0.152 -0.188 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.145 -0.139 -0.002 C -0.35359617412 3.21325694137 -0.00400174376 0.040 -0.104 0.002 N 0.49290585413 2.18198449515 -0.00068475564 -0.027 -0.159 0.003 S 6.56718562933 -0.11349126889 0.00673479967 -0.217 0.001 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.013 0.137 0.002 C 2.33969079820 -3.68709653410 -0.00625612120 0.080 0.204 0.003 C 1.45789786198 -4.76953179608 -0.00945089783 0.144 0.179 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.139 0.144 -0.002 C -0.35393854068 -3.21111942258 -0.00398541364 0.048 0.113 0.001 N 0.49225266031 -2.17934076887 -0.00084210065 -0.008 0.158 0.003 H 1.83694111827 5.77332096953 -0.01265611066 0.055 -0.059 -0.001 H -0.61802819388 5.33967450634 -0.01131742088 0.056 -0.028 -0.001 H 3.39175422949 3.87200638269 -0.00704552340 0.025 -0.089 0.001 H -1.39787683933 2.98334799634 -0.00369736757 0.007 -0.007 0.001 H 1.83794742242 -5.77033326187 -0.01295832570 0.050 0.055 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.052 0.032 -0.001 H -1.39833026435 -2.98175334118 -0.00345676225 0.010 0.013 0.001 H 3.39230213722 -3.86796714602 -0.00754158092 0.026 0.081 0.001 H 4.58301895157 2.13678100538 0.00314824260 -0.022 -0.004 0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.017 0.007 0.001 H -1.68997263563 -0.00719388386 -5.74925805817 0.052 0.001 -0.051 H 0.75224758084 -0.00860493512 -5.25016290812 0.052 0.001 -0.024 H -3.29620044300 -0.00255800648 -3.88456579214 0.025 -0.001 -0.082 H 1.47161249279 -0.00457826661 -2.87685200854 0.006 -0.001 -0.005 H -1.69176120521 -0.00597000955 5.75026973076 0.055 0.000 0.054 H 0.75025791005 -0.00892914887 5.25161119224 0.055 0.001 0.023 H 1.46975366817 -0.00523069331 2.87805400798 0.005 -0.001 0.003 H -3.29750276746 -0.00099200484 3.88584245085 0.025 -0.001 0.086 H -4.55513299541 0.00377930937 -2.13473279421 -0.017 -0.000 -0.006 H -4.55107479454 0.00501307822 2.13844314827 -0.020 -0.000 0.003 H -6.83436893102 0.00806057203 1.19721860356 -0.033 -0.000 0.001 H 6.86748209639 1.20005966818 0.00372860376 -0.032 -0.002 -0.000 61 Mode 34: freq=302.98 N -0.44003451495 -0.00038510790 2.12369783068 -0.002 0.031 0.015 C -1.76594470239 0.00039861437 2.37754210613 -0.002 0.019 0.015 C -2.24923313135 -0.00145267054 3.67997125809 0.006 0.038 0.021 C -1.33887502024 -0.00450793845 4.73956848945 0.012 -0.008 0.019 C 0.02462671625 -0.00591801736 4.46614405978 0.011 -0.035 0.014 C 0.43187566201 -0.00376957955 3.13352499014 0.003 0.018 0.012 C -2.63984642995 0.00218980399 1.17162612704 -0.003 -0.028 0.006 N -1.98513620489 0.00132140951 0.00153900685 -0.006 -0.090 0.001 C -2.63911589169 0.00167522827 -1.17277445342 -0.002 -0.028 -0.005 C -4.02452897564 0.00329996303 -1.20791476641 -0.003 0.014 -0.002 C -4.73391255267 0.00451580118 -0.00020876193 -0.003 0.009 -0.001 C -4.02924140493 0.00399189729 1.20660077672 -0.004 0.015 0.002 Co 0.00000000000 0.00000000000 0.00000000000 -0.025 -0.203 -0.001 N -0.43839318333 -0.00054206762 -2.12229806799 0.001 0.031 -0.016 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 0.019 -0.013 C -2.24773885821 -0.00257631963 -3.67934971086 0.007 0.039 -0.019 C -1.33713102227 -0.00526459193 -4.73855802198 0.011 -0.009 -0.018 C 0.02654101484 -0.00591797621 -4.46472703619 0.011 -0.035 -0.015 C 0.43371721952 -0.00363389350 -3.13225443930 0.004 0.019 -0.013 S -6.53329279136 0.00637481657 -0.11611178087 -0.010 -0.007 0.001 N 2.00981687167 0.00259443239 -0.00000686048 -0.004 0.153 -0.001 C 2.67119656792 1.17263645248 0.00045766926 0.148 0.088 0.000 C 4.06129317470 1.20536051565 0.00241240325 0.119 -0.047 0.002 C 4.76783866331 0.00148799420 0.00346798881 0.007 -0.113 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.119 -0.043 -0.002 C 2.67108506586 -1.17139122066 0.00026591651 -0.152 0.091 -0.001 C 1.82209539371 2.39842937406 -0.00175320633 0.254 0.126 -0.001 C 2.33938959521 3.68993217240 -0.00584554905 0.112 0.200 -0.001 C 1.45736908622 4.77231118002 -0.00917967851 -0.071 0.068 0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.038 -0.138 0.001 C -0.35359617412 3.21325694137 -0.00400174376 0.153 -0.192 0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.316 -0.047 -0.001 S 6.56718562933 -0.11349126889 0.00673479967 0.053 0.199 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.261 0.125 0.001 C 2.33969079820 -3.68709653410 -0.00625612120 -0.118 0.200 0.002 C 1.45789786198 -4.76953179608 -0.00945089783 0.069 0.064 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.036 -0.147 -0.001 C -0.35393854068 -3.21111942258 -0.00398541364 -0.159 -0.202 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.327 -0.053 0.001 H 1.83694111827 5.77332096953 -0.01265611066 -0.068 0.038 0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.046 -0.070 0.001 H 3.39175422949 3.87200638269 -0.00704552340 0.027 0.099 -0.001 H -1.39787683933 2.98334799634 -0.00369736757 0.054 -0.100 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.069 0.037 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.046 -0.074 -0.001 H -1.39833026435 -2.98175334118 -0.00345676225 -0.056 -0.105 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.029 0.099 0.001 H 4.58301895157 2.13678100538 0.00314824260 0.054 -0.024 0.001 H 4.58784714512 -2.12983634010 0.00211631073 -0.058 -0.025 -0.001 H -1.68997263563 -0.00719388386 -5.74925805817 0.004 -0.008 -0.005 H 0.75224758084 -0.00860493512 -5.25016290812 0.004 -0.023 -0.004 H -3.29620044300 -0.00255800648 -3.88456579214 0.002 0.018 -0.007 H 1.47161249279 -0.00457826661 -2.87685200854 0.001 0.012 -0.002 H -1.69176120521 -0.00597000955 5.75026973076 0.004 -0.008 0.006 H 0.75025791005 -0.00892914887 5.25161119224 0.004 -0.023 0.003 H 1.46975366817 -0.00523069331 2.87805400798 0.000 0.012 0.002 H -3.29750276746 -0.00099200484 3.88584245085 0.002 0.017 0.008 H -4.55513299541 0.00377930937 -2.13473279421 -0.001 0.015 -0.001 H -4.55107479454 0.00501307822 2.13844314827 -0.002 0.017 0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.001 -0.009 0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.070 0.053 0.000 61 Mode 35: freq=309.50 N -0.44003451495 -0.00038510790 2.12369783068 -0.106 -0.001 0.123 C -1.76594470239 0.00039861437 2.37754210613 -0.097 -0.001 0.161 C -2.24923313135 -0.00145267054 3.67997125809 0.034 -0.002 0.243 C -1.33887502024 -0.00450793845 4.73956848945 0.140 -0.000 0.185 C 0.02462671625 -0.00591801736 4.46614405978 0.122 0.001 0.091 C 0.43187566201 -0.00376957955 3.13352499014 -0.018 -0.001 0.049 C -2.63984642995 0.00218980399 1.17162612704 -0.090 0.001 0.066 N -1.98513620489 0.00132140951 0.00153900685 -0.034 0.004 0.053 C -2.63911589169 0.00167522827 -1.17277445342 0.012 0.001 -0.002 C -4.02452897564 0.00329996303 -1.20791476641 -0.029 -0.001 -0.026 C -4.73391255267 0.00451580118 -0.00020876193 -0.115 -0.000 -0.050 C -4.02924140493 0.00399189729 1.20660077672 -0.114 0.000 -0.021 Co 0.00000000000 0.00000000000 0.00000000000 0.131 0.009 -0.079 N -0.43839318333 -0.00054206762 -2.12229806799 0.107 -0.001 -0.141 C -1.76408906064 -0.00030645034 -2.37697009192 0.073 -0.000 -0.065 C -2.24773885821 -0.00257631963 -3.67934971086 0.101 -0.001 -0.095 C -1.33713102227 -0.00526459193 -4.73855802198 0.083 -0.000 -0.128 C 0.02654101484 -0.00591797621 -4.46472703619 0.092 0.001 -0.175 C 0.43371721952 -0.00363389350 -3.13225443930 0.088 -0.001 -0.168 S -6.53329279136 0.00637481657 -0.11611178087 -0.366 0.001 0.053 N 2.00981687167 0.00259443239 -0.00000686048 0.049 -0.007 -0.046 C 2.67119656792 1.17263645248 0.00045766926 0.023 0.041 -0.015 C 4.06129317470 1.20536051565 0.00241240325 0.044 0.013 0.009 C 4.76783866331 0.00148799420 0.00346798881 0.064 0.001 0.007 C 4.05723810074 -1.20352939940 0.00211502115 0.056 -0.014 0.009 C 2.67108506586 -1.17139122066 0.00026591651 0.039 -0.050 -0.015 C 1.82209539371 2.39842937406 -0.00175320633 -0.003 0.119 0.006 C 2.33938959521 3.68993217240 -0.00584554905 -0.066 0.170 0.016 C 1.45736908622 4.77231118002 -0.00917967851 -0.097 0.169 -0.002 C 0.08658913130 4.53522926787 -0.00833235387 -0.095 0.155 -0.016 C -0.35359617412 3.21325694137 -0.00400174376 -0.041 0.132 0.007 N 0.49290585413 2.18198449515 -0.00068475564 -0.017 0.144 0.013 S 6.56718562933 -0.11349126889 0.00673479967 0.197 -0.017 -0.004 C 1.82142022278 -2.39594383179 -0.00206827421 0.025 -0.129 0.006 C 2.33969079820 -3.68709653410 -0.00625612120 -0.051 -0.187 0.016 C 1.45789786198 -4.76953179608 -0.00945089783 -0.101 -0.172 -0.002 C 0.08684213972 -4.53272927032 -0.00840538011 -0.095 -0.137 -0.015 C -0.35393854068 -3.21111942258 -0.00398541364 -0.022 -0.108 0.007 N 0.49225266031 -2.17934076887 -0.00084210065 0.018 -0.135 0.013 H 1.83694111827 5.77332096953 -0.01265611066 -0.030 0.050 -0.002 H -0.61802819388 5.33967450634 -0.01131742088 -0.035 0.039 -0.010 H 3.39175422949 3.87200638269 -0.00704552340 -0.020 0.062 0.007 H -1.39787683933 2.98334799634 -0.00369736757 -0.010 0.028 0.005 H 1.83794742242 -5.77033326187 -0.01295832570 -0.036 -0.052 -0.002 H -0.61749414542 -5.33746053721 -0.01121572048 -0.038 -0.031 -0.010 H -1.39833026435 -2.98175334118 -0.00345676225 -0.003 -0.017 0.005 H 3.39230213722 -3.86796714602 -0.00754158092 -0.017 -0.071 0.007 H 4.58301895157 2.13678100538 0.00314824260 0.013 0.005 0.009 H 4.58784714512 -2.12983634010 0.00211631073 0.018 -0.004 0.008 H -1.68997263563 -0.00719388386 -5.74925805817 0.012 0.000 -0.033 H 0.75224758084 -0.00860493512 -5.25016290812 0.024 0.001 -0.053 H -3.29620044300 -0.00255800648 -3.88456579214 0.029 -0.001 -0.031 H 1.47161249279 -0.00457826661 -2.87685200854 0.026 -0.000 -0.050 H -1.69176120521 -0.00597000955 5.75026973076 0.061 0.000 0.061 H 0.75025791005 -0.00892914887 5.25161119224 0.056 0.001 0.007 H 1.46975366817 -0.00523069331 2.87805400798 -0.012 -0.000 -0.015 H -3.29750276746 -0.00099200484 3.88584245085 0.014 -0.001 0.103 H -4.55513299541 0.00377930937 -2.13473279421 0.004 -0.001 -0.016 H -4.55107479454 0.00501307822 2.13844314827 -0.038 -0.000 -0.007 H -6.83436893102 0.00806057203 1.19721860356 -0.028 0.000 0.018 H 6.86748209639 1.20005966818 0.00372860376 0.034 -0.002 -0.005 61 Mode 36: freq=311.74 N -0.44003451495 -0.00038510790 2.12369783068 0.292 -0.000 0.094 C -1.76594470239 0.00039861437 2.37754210613 0.228 0.000 -0.071 C -2.24923313135 -0.00145267054 3.67997125809 0.126 0.000 -0.114 C -1.33887502024 -0.00450793845 4.73956848945 -0.021 -0.000 0.005 C 0.02462671625 -0.00591801736 4.46614405978 0.014 -0.000 0.185 C 0.43187566201 -0.00376957955 3.13352499014 0.163 -0.000 0.220 C -2.63984642995 0.00218980399 1.17162612704 0.123 0.000 -0.067 N -1.98513620489 0.00132140951 0.00153900685 -0.022 0.001 -0.144 C -2.63911589169 0.00167522827 -1.17277445342 -0.158 0.001 -0.105 C -4.02452897564 0.00329996303 -1.20791476641 -0.140 0.001 0.041 C -4.73391255267 0.00451580118 -0.00020876193 -0.033 0.000 0.112 C -4.02924140493 0.00399189729 1.20660077672 0.086 -0.001 0.052 Co 0.00000000000 0.00000000000 0.00000000000 -0.011 0.003 0.200 N -0.43839318333 -0.00054206762 -2.12229806799 -0.306 -0.000 -0.020 C -1.76408906064 -0.00030645034 -2.37697009192 -0.248 -0.000 -0.176 C -2.24773885821 -0.00257631963 -3.67934971086 -0.076 -0.001 -0.269 C -1.33713102227 -0.00526459193 -4.73855802198 0.113 -0.000 -0.135 C 0.02654101484 -0.00591797621 -4.46472703619 0.074 0.001 0.073 C 0.43371721952 -0.00363389350 -3.13225443930 -0.142 0.000 0.131 S -6.53329279136 0.00637481657 -0.11611178087 -0.072 0.000 -0.182 N 2.00981687167 0.00259443239 -0.00000686048 0.014 -0.003 0.106 C 2.67119656792 1.17263645248 0.00045766926 0.010 0.012 0.036 C 4.06129317470 1.20536051565 0.00241240325 0.020 0.002 -0.022 C 4.76783866331 0.00148799420 0.00346798881 0.033 -0.000 -0.017 C 4.05723810074 -1.20352939940 0.00211502115 0.024 -0.004 -0.021 C 2.67108506586 -1.17139122066 0.00026591651 0.015 -0.016 0.036 C 1.82209539371 2.39842937406 -0.00175320633 -0.002 0.040 -0.011 C 2.33938959521 3.68993217240 -0.00584554905 -0.025 0.058 -0.036 C 1.45736908622 4.77231118002 -0.00917967851 -0.035 0.059 0.002 C 0.08658913130 4.53522926787 -0.00833235387 -0.035 0.055 0.033 C -0.35359617412 3.21325694137 -0.00400174376 -0.015 0.047 -0.014 N 0.49290585413 2.18198449515 -0.00068475564 -0.008 0.050 -0.027 S 6.56718562933 -0.11349126889 0.00673479967 0.103 -0.007 0.011 C 1.82142022278 -2.39594383179 -0.00206827421 0.009 -0.043 -0.012 C 2.33969079820 -3.68709653410 -0.00625612120 -0.019 -0.064 -0.036 C 1.45789786198 -4.76953179608 -0.00945089783 -0.036 -0.059 0.003 C 0.08684213972 -4.53272927032 -0.00840538011 -0.034 -0.047 0.034 C -0.35393854068 -3.21111942258 -0.00398541364 -0.008 -0.037 -0.015 N 0.49225266031 -2.17934076887 -0.00084210065 0.006 -0.046 -0.027 H 1.83694111827 5.77332096953 -0.01265611066 -0.011 0.017 0.004 H -0.61802819388 5.33967450634 -0.01131742088 -0.013 0.014 0.022 H 3.39175422949 3.87200638269 -0.00704552340 -0.008 0.022 -0.017 H -1.39787683933 2.98334799634 -0.00369736757 -0.004 0.010 -0.010 H 1.83794742242 -5.77033326187 -0.01295832570 -0.013 -0.018 0.004 H -0.61749414542 -5.33746053721 -0.01121572048 -0.014 -0.011 0.022 H -1.39833026435 -2.98175334118 -0.00345676225 -0.001 -0.006 -0.010 H 3.39230213722 -3.86796714602 -0.00754158092 -0.006 -0.025 -0.017 H 4.58301895157 2.13678100538 0.00314824260 0.005 0.001 -0.021 H 4.58784714512 -2.12983634010 0.00211631073 0.007 -0.002 -0.019 H -1.68997263563 -0.00719388386 -5.74925805817 0.081 -0.000 -0.056 H 0.75224758084 -0.00860493512 -5.25016290812 0.058 0.000 0.055 H -3.29620044300 -0.00255800648 -3.88456579214 -0.015 -0.000 -0.125 H 1.47161249279 -0.00457826661 -2.87685200854 -0.053 0.000 0.086 H -1.69176120521 -0.00597000955 5.75026973076 -0.049 -0.000 -0.013 H 0.75025791005 -0.00892914887 5.25161119224 -0.024 -0.000 0.079 H 1.46975366817 -0.00523069331 2.87805400798 0.056 -0.000 0.099 H -3.29750276746 -0.00099200484 3.88584245085 0.031 0.000 -0.065 H -4.55513299541 0.00377930937 -2.13473279421 -0.064 0.000 0.024 H -4.55107479454 0.00501307822 2.13844314827 0.045 -0.001 0.026 H -6.83436893102 0.00806057203 1.19721860356 -0.085 0.000 -0.048 H 6.86748209639 1.20005966818 0.00372860376 0.017 -0.001 0.012 61 Mode 37: freq=323.84 N -0.44003451495 -0.00038510790 2.12369783068 -0.062 0.002 0.053 C -1.76594470239 0.00039861437 2.37754210613 -0.042 0.001 0.086 C -2.24923313135 -0.00145267054 3.67997125809 -0.016 0.001 0.109 C -1.33887502024 -0.00450793845 4.73956848945 0.018 -0.000 0.089 C 0.02462671625 -0.00591801736 4.46614405978 0.011 -0.001 0.043 C 0.43187566201 -0.00376957955 3.13352499014 -0.028 0.001 0.027 C -2.63984642995 0.00218980399 1.17162612704 -0.004 -0.001 0.052 N -1.98513620489 0.00132140951 0.00153900685 -0.061 -0.004 0.014 C -2.63911589169 0.00167522827 -1.17277445342 0.021 -0.001 -0.037 C -4.02452897564 0.00329996303 -1.20791476641 0.054 0.000 -0.028 C -4.73391255267 0.00451580118 -0.00020876193 0.133 0.000 0.005 C -4.02924140493 0.00399189729 1.20660077672 0.035 0.001 0.040 Co 0.00000000000 0.00000000000 0.00000000000 -0.683 0.006 -0.014 N -0.43839318333 -0.00054206762 -2.12229806799 0.001 0.002 -0.071 C -1.76408906064 -0.00030645034 -2.37697009192 0.006 0.001 -0.070 C -2.24773885821 -0.00257631963 -3.67934971086 0.012 0.001 -0.084 C -1.33713102227 -0.00526459193 -4.73855802198 0.016 -0.001 -0.089 C 0.02654101484 -0.00591797621 -4.46472703619 0.016 -0.001 -0.081 C 0.43371721952 -0.00363389350 -3.13225443930 0.008 0.001 -0.072 S -6.53329279136 0.00637481657 -0.11611178087 0.426 -0.001 0.030 N 2.00981687167 0.00259443239 -0.00000686048 -0.040 -0.008 0.002 C 2.67119656792 1.17263645248 0.00045766926 0.006 -0.028 0.001 C 4.06129317470 1.20536051565 0.00241240325 0.047 -0.033 -0.001 C 4.76783866331 0.00148799420 0.00346798881 0.133 -0.009 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.056 0.016 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.020 0.020 0.001 C 1.82209539371 2.39842937406 -0.00175320633 -0.030 -0.025 -0.001 C 2.33938959521 3.68993217240 -0.00584554905 -0.035 -0.024 -0.001 C 1.45736908622 4.77231118002 -0.00917967851 -0.019 -0.009 0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.023 0.020 0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.030 0.023 -0.001 N 0.49290585413 2.18198449515 -0.00068475564 -0.049 0.007 -0.001 S 6.56718562933 -0.11349126889 0.00673479967 0.435 -0.024 0.001 C 1.82142022278 -2.39594383179 -0.00206827421 -0.001 0.020 -0.001 C 2.33969079820 -3.68709653410 -0.00625612120 -0.015 0.015 -0.001 C 1.45789786198 -4.76953179608 -0.00945089783 -0.015 0.014 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.015 0.007 0.001 C -0.35393854068 -3.21111942258 -0.00398541364 -0.007 0.007 -0.001 N 0.49225266031 -2.17934076887 -0.00084210065 -0.011 0.010 -0.001 H 1.83694111827 5.77332096953 -0.01265611066 0.001 -0.005 0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.003 0.009 0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.010 -0.009 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.010 0.011 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.003 0.005 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.004 0.002 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.002 0.002 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.004 0.003 -0.000 H 4.58301895157 2.13678100538 0.00314824260 0.003 -0.003 -0.001 H 4.58784714512 -2.12983634010 0.00211631073 0.004 -0.003 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.005 -0.000 -0.026 H 0.75224758084 -0.00860493512 -5.25016290812 0.007 -0.001 -0.022 H -3.29620044300 -0.00255800648 -3.88456579214 0.004 0.001 -0.026 H 1.47161249279 -0.00457826661 -2.87685200854 0.002 0.001 -0.019 H -1.69176120521 -0.00597000955 5.75026973076 0.014 -0.000 0.029 H 0.75025791005 -0.00892914887 5.25161119224 0.011 -0.001 0.005 H 1.46975366817 -0.00523069331 2.87805400798 -0.011 0.000 -0.001 H -3.29750276746 -0.00099200484 3.88584245085 -0.003 0.000 0.041 H -4.55513299541 0.00377930937 -2.13473279421 0.001 0.001 0.000 H -4.55107479454 0.00501307822 2.13844314827 -0.004 0.001 0.003 H -6.83436893102 0.00806057203 1.19721860356 0.068 -0.000 0.003 H 6.86748209639 1.20005966818 0.00372860376 0.066 -0.001 0.001 61 Mode 38: freq=340.90 N -0.44003451495 -0.00038510790 2.12369783068 0.001 0.132 -0.001 C -1.76594470239 0.00039861437 2.37754210613 0.000 0.006 -0.001 C -2.24923313135 -0.00145267054 3.67997125809 0.000 0.147 -0.001 C -1.33887502024 -0.00450793845 4.73956848945 -0.001 0.026 -0.001 C 0.02462671625 -0.00591801736 4.46614405978 -0.001 -0.150 -0.001 C 0.43187566201 -0.00376957955 3.13352499014 0.000 0.062 -0.001 C -2.63984642995 0.00218980399 1.17162612704 0.000 -0.260 -0.001 N -1.98513620489 0.00132140951 0.00153900685 0.001 -0.658 0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.000 -0.261 0.001 C -4.02452897564 0.00329996303 -1.20791476641 -0.000 0.148 0.000 C -4.73391255267 0.00451580118 -0.00020876193 -0.001 0.152 -0.000 C -4.02924140493 0.00399189729 1.20660077672 0.000 0.155 -0.001 Co 0.00000000000 0.00000000000 0.00000000000 0.009 0.367 -0.002 N -0.43839318333 -0.00054206762 -2.12229806799 0.000 0.134 0.001 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 0.006 0.001 C -2.24773885821 -0.00257631963 -3.67934971086 -0.000 0.150 0.002 C -1.33713102227 -0.00526459193 -4.73855802198 -0.001 0.025 0.002 C 0.02654101484 -0.00591797621 -4.46472703619 -0.001 -0.152 0.002 C 0.43371721952 -0.00363389350 -3.13225443930 -0.000 0.064 0.001 S -6.53329279136 0.00637481657 -0.11611178087 -0.005 -0.077 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.001 -0.011 0.002 C 2.67119656792 1.17263645248 0.00045766926 0.004 -0.023 0.001 C 4.06129317470 1.20536051565 0.00241240325 0.002 -0.026 -0.001 C 4.76783866331 0.00148799420 0.00346798881 -0.001 -0.028 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.004 -0.026 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.006 -0.023 0.001 C 1.82209539371 2.39842937406 -0.00175320633 -0.015 -0.034 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.009 -0.045 -0.001 C 1.45736908622 4.77231118002 -0.00917967851 0.001 -0.038 0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.002 -0.016 0.001 C -0.35359617412 3.21325694137 -0.00400174376 -0.018 -0.008 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.026 -0.012 -0.001 S 6.56718562933 -0.11349126889 0.00673479967 0.002 0.015 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.013 -0.032 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.009 -0.042 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.001 -0.037 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.004 -0.017 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.016 -0.009 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.023 -0.011 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.004 -0.013 0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.003 -0.001 0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.002 -0.016 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.006 0.001 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.003 -0.012 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.002 -0.002 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.006 0.000 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.002 -0.014 -0.000 H 4.58301895157 2.13678100538 0.00314824260 0.002 -0.009 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.003 -0.009 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.000 0.004 0.001 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 -0.102 0.001 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 0.065 0.001 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 0.041 0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.000 0.005 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.000 -0.101 -0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.000 0.040 -0.000 H -3.29750276746 -0.00099200484 3.88584245085 -0.000 0.063 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.000 0.125 -0.000 H -4.55107479454 0.00501307822 2.13844314827 0.000 0.135 -0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.001 -0.066 0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.011 0.005 0.000 61 Mode 39: freq=350.16 N -0.44003451495 -0.00038510790 2.12369783068 -0.029 -0.000 0.006 C -1.76594470239 0.00039861437 2.37754210613 -0.015 0.000 0.039 C -2.24923313135 -0.00145267054 3.67997125809 -0.013 -0.000 0.049 C -1.33887502024 -0.00450793845 4.73956848945 -0.007 -0.000 0.044 C 0.02462671625 -0.00591801736 4.46614405978 -0.012 0.000 0.016 C 0.43187566201 -0.00376957955 3.13352499014 -0.026 0.000 0.007 C -2.63984642995 0.00218980399 1.17162612704 0.004 0.001 0.034 N -1.98513620489 0.00132140951 0.00153900685 -0.001 0.002 0.022 C -2.63911589169 0.00167522827 -1.17277445342 -0.008 0.001 0.034 C -4.02452897564 0.00329996303 -1.20791476641 -0.006 -0.000 0.050 C -4.73391255267 0.00451580118 -0.00020876193 -0.003 -0.001 0.054 C -4.02924140493 0.00399189729 1.20660077672 0.001 -0.001 0.050 Co 0.00000000000 0.00000000000 0.00000000000 0.015 -0.001 -0.435 N -0.43839318333 -0.00054206762 -2.12229806799 0.024 -0.001 0.006 C -1.76408906064 -0.00030645034 -2.37697009192 0.011 -0.000 0.037 C -2.24773885821 -0.00257631963 -3.67934971086 0.012 -0.001 0.045 C -1.33713102227 -0.00526459193 -4.73855802198 0.010 0.000 0.043 C 0.02654101484 -0.00591797621 -4.46472703619 0.014 0.001 0.018 C 0.43371721952 -0.00363389350 -3.13225443930 0.024 -0.001 0.010 S -6.53329279136 0.00637481657 -0.11611178087 0.002 0.000 -0.024 N 2.00981687167 0.00259443239 -0.00000686048 0.001 0.000 0.630 C 2.67119656792 1.17263645248 0.00045766926 0.000 0.001 0.259 C 4.06129317470 1.20536051565 0.00241240325 0.000 0.001 -0.148 C 4.76783866331 0.00148799420 0.00346798881 -0.002 0.001 -0.155 C 4.05723810074 -1.20352939940 0.00211502115 0.000 -0.000 -0.142 C 2.67108506586 -1.17139122066 0.00026591651 0.000 -0.001 0.259 C 1.82209539371 2.39842937406 -0.00175320633 0.001 0.002 0.012 C 2.33938959521 3.68993217240 -0.00584554905 0.000 0.002 -0.134 C 1.45736908622 4.77231118002 -0.00917967851 -0.001 0.002 -0.035 C 0.08658913130 4.53522926787 -0.00833235387 -0.000 0.001 0.142 C -0.35359617412 3.21325694137 -0.00400174376 0.001 0.000 -0.056 N 0.49290585413 2.18198449515 -0.00068475564 0.001 0.001 -0.119 S 6.56718562933 -0.11349126889 0.00673479967 -0.008 0.000 0.074 C 1.82142022278 -2.39594383179 -0.00206827421 0.001 -0.001 0.011 C 2.33969079820 -3.68709653410 -0.00625612120 -0.000 -0.002 -0.136 C 1.45789786198 -4.76953179608 -0.00945089783 -0.001 -0.002 -0.034 C 0.08684213972 -4.53272927032 -0.00840538011 -0.001 -0.002 0.144 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 -0.001 -0.058 N 0.49225266031 -2.17934076887 -0.00084210065 0.001 -0.001 -0.120 H 1.83694111827 5.77332096953 -0.01265611066 -0.000 0.001 -0.013 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 0.000 0.095 H 3.39175422949 3.87200638269 -0.00704552340 0.000 0.001 -0.059 H -1.39787683933 2.98334799634 -0.00369736757 0.000 -0.000 -0.038 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 -0.001 -0.012 H -0.61749414542 -5.33746053721 -0.01121572048 -0.000 -0.001 0.096 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 0.000 -0.040 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 -0.001 -0.061 H 4.58301895157 2.13678100538 0.00314824260 0.000 0.000 -0.129 H 4.58784714512 -2.12983634010 0.00211631073 0.000 0.000 -0.119 H -1.68997263563 -0.00719388386 -5.74925805817 -0.000 0.000 0.014 H 0.75224758084 -0.00860493512 -5.25016290812 0.000 0.000 0.002 H -3.29620044300 -0.00255800648 -3.88456579214 0.003 -0.000 0.014 H 1.47161249279 -0.00457826661 -2.87685200854 0.008 -0.000 0.002 H -1.69176120521 -0.00597000955 5.75026973076 0.002 -0.000 0.014 H 0.75025791005 -0.00892914887 5.25161119224 0.001 0.000 0.001 H 1.46975366817 -0.00523069331 2.87805400798 -0.008 -0.000 0.001 H -3.29750276746 -0.00099200484 3.88584245085 -0.003 -0.000 0.016 H -4.55513299541 0.00377930937 -2.13473279421 -0.005 -0.000 0.016 H -4.55107479454 0.00501307822 2.13844314827 0.004 -0.000 0.016 H -6.83436893102 0.00806057203 1.19721860356 -0.020 0.000 -0.009 H 6.86748209639 1.20005966818 0.00372860376 -0.001 0.000 0.062 61 Mode 40: freq=372.59 N -0.44003451495 -0.00038510790 2.12369783068 -0.170 0.001 0.012 C -1.76594470239 0.00039861437 2.37754210613 -0.129 -0.000 0.085 C -2.24923313135 -0.00145267054 3.67997125809 -0.059 0.001 0.134 C -1.33887502024 -0.00450793845 4.73956848945 0.037 0.000 0.066 C 0.02462671625 -0.00591801736 4.46614405978 0.018 -0.001 -0.043 C 0.43187566201 -0.00376957955 3.13352499014 -0.087 0.001 -0.068 C -2.63984642995 0.00218980399 1.17162612704 -0.040 -0.002 0.032 N -1.98513620489 0.00132140951 0.00153900685 -0.038 -0.004 0.008 C -2.63911589169 0.00167522827 -1.17277445342 -0.037 -0.002 -0.021 C -4.02452897564 0.00329996303 -1.20791476641 -0.005 0.001 0.010 C -4.73391255267 0.00451580118 -0.00020876193 0.069 0.002 0.034 C -4.02924140493 0.00399189729 1.20660077672 -0.006 0.001 0.047 Co 0.00000000000 0.00000000000 0.00000000000 -0.044 0.006 0.009 N -0.43839318333 -0.00054206762 -2.12229806799 -0.148 0.001 -0.037 C -1.76408906064 -0.00030645034 -2.37697009192 -0.116 -0.000 -0.093 C -2.24773885821 -0.00257631963 -3.67934971086 -0.038 0.001 -0.148 C -1.33713102227 -0.00526459193 -4.73855802198 0.055 0.000 -0.088 C 0.02654101484 -0.00591797621 -4.46472703619 0.038 -0.001 0.009 C 0.43371721952 -0.00363389350 -3.13225443930 -0.069 0.001 0.037 S -6.53329279136 0.00637481657 -0.11611178087 0.350 -0.001 0.007 N 2.00981687167 0.00259443239 -0.00000686048 0.038 0.011 -0.006 C 2.67119656792 1.17263645248 0.00045766926 0.051 0.037 -0.003 C 4.06129317470 1.20536051565 0.00241240325 0.004 0.058 0.002 C 4.76783866331 0.00148799420 0.00346798881 -0.095 0.045 0.003 C 4.05723810074 -1.20352939940 0.00211502115 0.003 0.016 0.002 C 2.67108506586 -1.17139122066 0.00026591651 0.048 -0.023 -0.003 C 1.82209539371 2.39842937406 -0.00175320633 0.184 0.111 -0.001 C 2.33938959521 3.68993217240 -0.00584554905 0.090 0.181 0.001 C 1.45736908622 4.77231118002 -0.00917967851 -0.049 0.087 0.001 C 0.08658913130 4.53522926787 -0.00833235387 -0.027 -0.067 -0.002 C -0.35359617412 3.21325694137 -0.00400174376 0.120 -0.105 0.001 N 0.49290585413 2.18198449515 -0.00068475564 0.241 0.007 0.001 S 6.56718562933 -0.11349126889 0.00673479967 -0.479 0.009 -0.002 C 1.82142022278 -2.39594383179 -0.00206827421 0.171 -0.121 -0.001 C 2.33969079820 -3.68709653410 -0.00625612120 0.065 -0.201 0.001 C 1.45789786198 -4.76953179608 -0.00945089783 -0.073 -0.114 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.054 0.027 -0.002 C -0.35393854068 -3.21111942258 -0.00398541364 0.098 0.068 0.001 N 0.49225266031 -2.17934076887 -0.00084210065 0.217 -0.038 0.001 H 1.83694111827 5.77332096953 -0.01265611066 -0.050 0.039 0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.034 -0.043 -0.001 H 3.39175422949 3.87200638269 -0.00704552340 0.021 0.087 0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.043 -0.065 0.001 H 1.83794742242 -5.77033326187 -0.01295832570 -0.054 -0.046 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.042 0.031 -0.001 H -1.39833026435 -2.98175334118 -0.00345676225 0.036 0.055 0.001 H 3.39230213722 -3.86796714602 -0.00754158092 0.014 -0.093 0.000 H 4.58301895157 2.13678100538 0.00314824260 0.007 0.013 0.002 H 4.58784714512 -2.12983634010 0.00211631073 0.016 0.013 0.001 H -1.68997263563 -0.00719388386 -5.74925805817 0.039 0.000 -0.034 H 0.75224758084 -0.00860493512 -5.25016290812 0.029 -0.001 0.019 H -3.29620044300 -0.00255800648 -3.88456579214 -0.007 0.000 -0.068 H 1.47161249279 -0.00457826661 -2.87685200854 -0.026 0.000 0.035 H -1.69176120521 -0.00597000955 5.75026973076 0.036 0.000 0.028 H 0.75025791005 -0.00892914887 5.25161119224 0.024 -0.001 -0.030 H 1.46975366817 -0.00523069331 2.87805400798 -0.032 0.000 -0.044 H -3.29750276746 -0.00099200484 3.88584245085 -0.013 0.000 0.064 H -4.55513299541 0.00377930937 -2.13473279421 -0.013 0.001 0.010 H -4.55107479454 0.00501307822 2.13844314827 -0.007 0.001 0.010 H -6.83436893102 0.00806057203 1.19721860356 0.040 -0.000 -0.005 H 6.86748209639 1.20005966818 0.00372860376 -0.055 -0.006 -0.002 61 Mode 41: freq=394.34 N -0.44003451495 -0.00038510790 2.12369783068 0.258 0.000 0.040 C -1.76594470239 0.00039861437 2.37754210613 0.190 -0.000 -0.066 C -2.24923313135 -0.00145267054 3.67997125809 0.109 0.001 -0.118 C -1.33887502024 -0.00450793845 4.73956848945 -0.031 -0.000 -0.005 C 0.02462671625 -0.00591801736 4.46614405978 -0.003 -0.001 0.150 C 0.43187566201 -0.00376957955 3.13352499014 0.139 0.001 0.172 C -2.63984642995 0.00218980399 1.17162612704 0.044 -0.002 -0.021 N -1.98513620489 0.00132140951 0.00153900685 -0.019 -0.003 -0.027 C -2.63911589169 0.00167522827 -1.17277445342 0.042 -0.002 -0.025 C -4.02452897564 0.00329996303 -1.20791476641 0.014 0.001 -0.100 C -4.73391255267 0.00451580118 -0.00020876193 -0.040 0.001 -0.111 C -4.02924140493 0.00399189729 1.20660077672 0.012 0.001 -0.095 Co 0.00000000000 0.00000000000 0.00000000000 -0.463 0.005 -0.018 N -0.43839318333 -0.00054206762 -2.12229806799 0.218 0.001 0.029 C -1.76408906064 -0.00030645034 -2.37697009192 0.174 0.000 0.088 C -2.24773885821 -0.00257631963 -3.67934971086 0.057 0.001 0.168 C -1.33713102227 -0.00526459193 -4.73855802198 -0.090 -0.000 0.070 C 0.02654101484 -0.00591797621 -4.46472703619 -0.068 -0.001 -0.061 C 0.43371721952 -0.00363389350 -3.13225443930 0.098 0.001 -0.095 S -6.53329279136 0.00637481657 -0.11611178087 -0.307 -0.000 0.016 N 2.00981687167 0.00259443239 -0.00000686048 -0.018 0.015 0.012 C 2.67119656792 1.17263645248 0.00045766926 0.025 0.009 0.006 C 4.06129317470 1.20536051565 0.00241240325 0.005 0.050 -0.003 C 4.76783866331 0.00148799420 0.00346798881 -0.029 0.060 -0.004 C 4.05723810074 -1.20352939940 0.00211502115 0.007 0.056 -0.003 C 2.67108506586 -1.17139122066 0.00026591651 0.025 0.016 0.006 C 1.82209539371 2.39842937406 -0.00175320633 0.128 0.045 0.001 C 2.33938959521 3.68993217240 -0.00584554905 0.071 0.086 -0.003 C 1.45736908622 4.77231118002 -0.00917967851 -0.024 0.014 -0.001 C 0.08658913130 4.53522926787 -0.00833235387 -0.010 -0.090 0.003 C -0.35359617412 3.21325694137 -0.00400174376 0.089 -0.109 -0.002 N 0.49290585413 2.18198449515 -0.00068475564 0.171 -0.023 -0.002 S 6.56718562933 -0.11349126889 0.00673479967 -0.206 -0.007 0.001 C 1.82142022278 -2.39594383179 -0.00206827421 0.121 -0.057 0.001 C 2.33969079820 -3.68709653410 -0.00625612120 0.045 -0.113 -0.003 C 1.45789786198 -4.76953179608 -0.00945089783 -0.057 -0.048 -0.001 C 0.08684213972 -4.53272927032 -0.00840538011 -0.045 0.044 0.003 C -0.35393854068 -3.21111942258 -0.00398541364 0.068 0.070 -0.002 N 0.49225266031 -2.17934076887 -0.00084210065 0.153 -0.014 -0.002 H 1.83694111827 5.77332096953 -0.01265611066 -0.033 0.014 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.020 -0.041 0.002 H 3.39175422949 3.87200638269 -0.00704552340 0.017 0.048 -0.001 H -1.39787683933 2.98334799634 -0.00369736757 0.031 -0.055 -0.001 H 1.83794742242 -5.77033326187 -0.01295832570 -0.040 -0.023 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.031 0.028 0.002 H -1.39833026435 -2.98175334118 -0.00345676225 0.025 0.046 -0.001 H 3.39230213722 -3.86796714602 -0.00754158092 0.009 -0.059 -0.001 H 4.58301895157 2.13678100538 0.00314824260 -0.003 0.017 -0.003 H 4.58784714512 -2.12983634010 0.00211631073 0.008 0.019 -0.002 H -1.68997263563 -0.00719388386 -5.74925805817 -0.060 -0.000 0.032 H 0.75224758084 -0.00860493512 -5.25016290812 -0.045 -0.001 -0.041 H -3.29620044300 -0.00255800648 -3.88456579214 0.010 0.001 0.088 H 1.47161249279 -0.00457826661 -2.87685200854 0.038 0.000 -0.065 H -1.69176120521 -0.00597000955 5.75026973076 -0.048 -0.000 -0.015 H 0.75025791005 -0.00892914887 5.25161119224 -0.025 -0.001 0.066 H 1.46975366817 -0.00523069331 2.87805400798 0.049 0.000 0.084 H -3.29750276746 -0.00099200484 3.88584245085 0.025 0.001 -0.069 H -4.55513299541 0.00377930937 -2.13473279421 0.016 0.001 -0.035 H -4.55107479454 0.00501307822 2.13844314827 -0.004 0.001 -0.031 H -6.83436893102 0.00806057203 1.19721860356 -0.006 -0.000 0.015 H 6.86748209639 1.20005966818 0.00372860376 -0.009 -0.008 0.001 61 Mode 42: freq=403.32 N -0.44003451495 -0.00038510790 2.12369783068 0.014 0.000 -0.131 C -1.76594470239 0.00039861437 2.37754210613 0.038 0.000 -0.069 C -2.24923313135 -0.00145267054 3.67997125809 -0.068 0.000 -0.146 C -1.33887502024 -0.00450793845 4.73956848945 -0.134 0.000 -0.140 C 0.02462671625 -0.00591801736 4.46614405978 -0.134 0.000 -0.136 C 0.43187566201 -0.00376957955 3.13352499014 -0.034 0.000 -0.102 C -2.63984642995 0.00218980399 1.17162612704 0.002 -0.001 0.101 N -1.98513620489 0.00132140951 0.00153900685 -0.012 -0.001 0.112 C -2.63911589169 0.00167522827 -1.17277445342 0.005 -0.001 0.102 C -4.02452897564 0.00329996303 -1.20791476641 -0.018 0.001 0.395 C -4.73391255267 0.00451580118 -0.00020876193 -0.033 0.000 0.439 C -4.02924140493 0.00399189729 1.20660077672 -0.005 -0.000 0.397 Co 0.00000000000 0.00000000000 0.00000000000 -0.080 0.002 0.054 N -0.43839318333 -0.00054206762 -2.12229806799 0.140 -0.000 -0.134 C -1.76408906064 -0.00030645034 -2.37697009192 0.076 -0.000 -0.013 C -2.24773885821 -0.00257631963 -3.67934971086 0.128 0.001 -0.051 C -1.33713102227 -0.00526459193 -4.73855802198 0.103 -0.001 -0.111 C 0.02654101484 -0.00591797621 -4.46472703619 0.120 -0.001 -0.202 C 0.43371721952 -0.00363389350 -3.13225443930 0.113 0.000 -0.186 S -6.53329279136 0.00637481657 -0.11611178087 -0.086 -0.000 -0.117 N 2.00981687167 0.00259443239 -0.00000686048 -0.003 0.011 -0.027 C 2.67119656792 1.17263645248 0.00045766926 0.003 0.008 -0.015 C 4.06129317470 1.20536051565 0.00241240325 0.001 0.038 0.008 C 4.76783866331 0.00148799420 0.00346798881 -0.001 0.044 0.011 C 4.05723810074 -1.20352939940 0.00211502115 0.002 0.040 0.007 C 2.67108506586 -1.17139122066 0.00026591651 0.003 0.012 -0.015 C 1.82209539371 2.39842937406 -0.00175320633 0.016 -0.000 -0.004 C 2.33938959521 3.68993217240 -0.00584554905 0.016 -0.001 0.007 C 1.45736908622 4.77231118002 -0.00917967851 0.007 -0.011 0.002 C 0.08658913130 4.53522926787 -0.00833235387 0.009 -0.026 -0.007 C -0.35359617412 3.21325694137 -0.00400174376 0.016 -0.026 0.006 N 0.49290585413 2.18198449515 -0.00068475564 0.025 -0.015 0.005 S 6.56718562933 -0.11349126889 0.00673479967 -0.021 -0.010 -0.004 C 1.82142022278 -2.39594383179 -0.00206827421 0.014 -0.008 -0.004 C 2.33969079820 -3.68709653410 -0.00625612120 -0.002 -0.020 0.007 C 1.45789786198 -4.76953179608 -0.00945089783 -0.017 -0.013 0.002 C 0.08684213972 -4.53272927032 -0.00840538011 -0.016 -0.006 -0.007 C -0.35393854068 -3.21111942258 -0.00398541364 0.002 -0.001 0.006 N 0.49225266031 -2.17934076887 -0.00084210065 0.014 -0.012 0.005 H 1.83694111827 5.77332096953 -0.01265611066 -0.002 -0.002 0.001 H -0.61802819388 5.33967450634 -0.01131742088 0.001 -0.009 -0.005 H 3.39175422949 3.87200638269 -0.00704552340 0.004 0.002 0.003 H -1.39787683933 2.98334799634 -0.00369736757 0.005 -0.009 0.003 H 1.83794742242 -5.77033326187 -0.01295832570 -0.007 -0.005 0.001 H -0.61749414542 -5.33746053721 -0.01121572048 -0.007 0.000 -0.005 H -1.39833026435 -2.98175334118 -0.00345676225 0.002 0.004 0.003 H 3.39230213722 -3.86796714602 -0.00754158092 -0.001 -0.010 0.003 H 4.58301895157 2.13678100538 0.00314824260 -0.003 0.013 0.006 H 4.58784714512 -2.12983634010 0.00211631073 0.004 0.013 0.006 H -1.68997263563 -0.00719388386 -5.74925805817 0.008 -0.000 -0.025 H 0.75224758084 -0.00860493512 -5.25016290812 0.029 -0.000 -0.065 H -3.29620044300 -0.00255800648 -3.88456579214 0.035 0.000 -0.014 H 1.47161249279 -0.00457826661 -2.87685200854 0.034 0.000 -0.056 H -1.69176120521 -0.00597000955 5.75026973076 -0.040 0.000 -0.042 H 0.75025791005 -0.00892914887 5.25161119224 -0.049 0.000 -0.031 H 1.46975366817 -0.00523069331 2.87805400798 -0.005 0.000 -0.009 H -3.29750276746 -0.00099200484 3.88584245085 -0.022 0.000 -0.064 H -4.55513299541 0.00377930937 -2.13473279421 -0.042 0.001 0.134 H -4.55107479454 0.00501307822 2.13844314827 0.035 0.000 0.135 H -6.83436893102 0.00806057203 1.19721860356 -0.164 0.000 -0.054 H 6.86748209639 1.20005966818 0.00372860376 0.012 -0.005 -0.003 61 Mode 43: freq=405.04 N -0.44003451495 -0.00038510790 2.12369783068 0.019 -0.002 -0.008 C -1.76594470239 0.00039861437 2.37754210613 0.016 -0.000 -0.009 C -2.24923313135 -0.00145267054 3.67997125809 0.002 -0.004 -0.020 C -1.33887502024 -0.00450793845 4.73956848945 -0.014 0.002 -0.011 C 0.02462671625 -0.00591801736 4.46614405978 -0.012 0.001 -0.000 C 0.43187566201 -0.00376957955 3.13352499014 0.007 -0.005 0.004 C -2.63984642995 0.00218980399 1.17162612704 0.003 0.003 0.008 N -1.98513620489 0.00132140951 0.00153900685 -0.004 0.006 0.008 C -2.63911589169 0.00167522827 -1.17277445342 0.003 0.003 0.006 C -4.02452897564 0.00329996303 -1.20791476641 -0.001 -0.002 0.027 C -4.73391255267 0.00451580118 -0.00020876193 -0.005 -0.003 0.031 C -4.02924140493 0.00399189729 1.20660077672 0.000 -0.002 0.029 Co 0.00000000000 0.00000000000 0.00000000000 -0.049 -0.021 0.003 N -0.43839318333 -0.00054206762 -2.12229806799 0.028 -0.002 -0.010 C -1.76408906064 -0.00030645034 -2.37697009192 0.019 -0.000 0.004 C -2.24773885821 -0.00257631963 -3.67934971086 0.016 -0.004 0.006 C -1.33713102227 -0.00526459193 -4.73855802198 0.003 0.002 -0.007 C 0.02654101484 -0.00591797621 -4.46472703619 0.006 0.001 -0.024 C 0.43371721952 -0.00363389350 -3.13225443930 0.017 -0.005 -0.024 S -6.53329279136 0.00637481657 -0.11611178087 -0.025 0.001 -0.009 N 2.00981687167 0.00259443239 -0.00000686048 -0.012 -0.119 -0.001 C 2.67119656792 1.17263645248 0.00045766926 -0.000 -0.107 -0.001 C 4.06129317470 1.20536051565 0.00241240325 -0.007 -0.408 0.001 C 4.76783866331 0.00148799420 0.00346798881 -0.029 -0.453 0.001 C 4.05723810074 -1.20352939940 0.00211502115 -0.021 -0.406 -0.001 C 2.67108506586 -1.17139122066 0.00026591651 -0.004 -0.107 -0.001 C 1.82209539371 2.39842937406 -0.00175320633 0.028 0.062 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.072 0.138 0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.133 0.139 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.136 0.146 -0.001 C -0.35359617412 3.21325694137 -0.00400174376 -0.044 0.111 0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.000 0.136 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.053 0.117 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.049 0.022 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.116 0.071 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.116 0.114 0.001 C 0.08684213972 -4.53272927032 -0.00840538011 0.128 0.188 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.097 0.167 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.105 0.138 0.001 H 1.83694111827 5.77332096953 -0.01265611066 -0.038 0.041 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.048 0.035 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.022 0.059 0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.009 0.013 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.017 0.027 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.034 0.057 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.028 0.044 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.032 0.025 0.000 H 4.58301895157 2.13678100538 0.00314824260 0.034 -0.137 0.001 H 4.58784714512 -2.12983634010 0.00211631073 -0.043 -0.137 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.004 0.002 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 0.002 -0.009 H -3.29620044300 -0.00255800648 -3.88456579214 0.004 -0.002 0.004 H 1.47161249279 -0.00457826661 -2.87685200854 0.006 -0.002 -0.010 H -1.69176120521 -0.00597000955 5.75026973076 -0.007 0.002 -0.004 H 0.75025791005 -0.00892914887 5.25161119224 -0.006 0.002 0.002 H 1.46975366817 -0.00523069331 2.87805400798 0.003 -0.002 0.005 H -3.29750276746 -0.00099200484 3.88584245085 -0.000 -0.002 -0.010 H -4.55513299541 0.00377930937 -2.13473279421 -0.003 -0.001 0.009 H -4.55107479454 0.00501307822 2.13844314827 0.003 -0.002 0.010 H -6.83436893102 0.00806057203 1.19721860356 -0.014 0.001 -0.004 H 6.86748209639 1.20005966818 0.00372860376 -0.165 0.055 -0.000 61 Mode 44: freq=473.28 N -0.44003451495 -0.00038510790 2.12369783068 -0.000 -0.229 -0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.000 -0.051 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.000 0.198 0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.000 -0.185 -0.000 C 0.02462671625 -0.00591801736 4.46614405978 0.000 0.028 -0.000 C 0.43187566201 -0.00376957955 3.13352499014 0.000 0.171 0.000 C -2.63984642995 0.00218980399 1.17162612704 -0.000 -0.015 -0.000 N -1.98513620489 0.00132140951 0.00153900685 -0.000 -0.000 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.000 0.015 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.000 -0.031 0.000 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 -0.001 0.000 C -4.02924140493 0.00399189729 1.20660077672 0.000 0.032 0.000 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.000 0.228 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 0.050 -0.000 C -2.24773885821 -0.00257631963 -3.67934971086 -0.000 -0.197 0.000 C -1.33713102227 -0.00526459193 -4.73855802198 0.000 0.184 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 -0.000 -0.028 -0.000 C 0.43371721952 -0.00363389350 -3.13225443930 -0.000 -0.170 0.000 S -6.53329279136 0.00637481657 -0.11611178087 0.000 -0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 0.000 0.000 C 2.67119656792 1.17263645248 0.00045766926 0.000 0.000 0.016 C 4.06129317470 1.20536051565 0.00241240325 0.000 -0.000 -0.037 C 4.76783866331 0.00148799420 0.00346798881 0.000 -0.000 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.000 -0.000 0.036 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 0.000 -0.016 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 0.000 0.057 C 2.33938959521 3.68993217240 -0.00584554905 -0.000 -0.001 -0.228 C 1.45736908622 4.77231118002 -0.00917967851 -0.000 0.001 0.219 C 0.08658913130 4.53522926787 -0.00833235387 -0.000 0.000 -0.036 C -0.35359617412 3.21325694137 -0.00400174376 -0.000 -0.001 -0.199 N 0.49290585413 2.18198449515 -0.00068475564 -0.000 0.001 0.270 S 6.56718562933 -0.11349126889 0.00673479967 0.000 0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.000 0.000 -0.055 C 2.33969079820 -3.68709653410 -0.00625612120 0.000 -0.001 0.226 C 1.45789786198 -4.76953179608 -0.00945089783 -0.000 0.001 -0.217 C 0.08684213972 -4.53272927032 -0.00840538011 0.000 0.000 0.036 C -0.35393854068 -3.21111942258 -0.00398541364 0.000 -0.001 0.196 N 0.49225266031 -2.17934076887 -0.00084210065 0.000 0.001 -0.266 H 1.83694111827 5.77332096953 -0.01265611066 0.000 0.001 0.141 H -0.61802819388 5.33967450634 -0.01131742088 0.000 -0.000 -0.030 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 -0.001 -0.172 H -1.39787683933 2.98334799634 -0.00369736757 0.000 -0.000 -0.150 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 0.000 -0.140 H -0.61749414542 -5.33746053721 -0.01121572048 -0.000 -0.000 0.030 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 -0.000 0.148 H 3.39230213722 -3.86796714602 -0.00754158092 0.000 -0.001 0.169 H 4.58301895157 2.13678100538 0.00314824260 0.000 -0.000 -0.013 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 -0.000 0.012 H -1.68997263563 -0.00719388386 -5.74925805817 0.000 0.119 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 -0.024 -0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 -0.147 0.000 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 -0.129 0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.000 -0.119 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 0.000 0.024 0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.000 0.130 0.000 H -3.29750276746 -0.00099200484 3.88584245085 0.000 0.148 0.000 H -4.55513299541 0.00377930937 -2.13473279421 -0.000 -0.011 0.000 H -4.55107479454 0.00501307822 2.13844314827 0.000 0.012 0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.000 -0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.000 0.000 0.000 61 Mode 45: freq=481.40 N -0.44003451495 -0.00038510790 2.12369783068 -0.004 0.003 0.003 C -1.76594470239 0.00039861437 2.37754210613 0.001 0.001 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.001 -0.002 0.000 C -1.33887502024 -0.00450793845 4.73956848945 0.002 0.002 -0.002 C 0.02462671625 -0.00591801736 4.46614405978 0.001 -0.000 -0.004 C 0.43187566201 -0.00376957955 3.13352499014 -0.001 -0.002 -0.004 C -2.63984642995 0.00218980399 1.17162612704 0.007 0.000 -0.003 N -1.98513620489 0.00132140951 0.00153900685 -0.000 0.000 -0.006 C -2.63911589169 0.00167522827 -1.17277445342 -0.008 -0.000 -0.003 C -4.02452897564 0.00329996303 -1.20791476641 -0.006 0.001 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 0.000 0.006 C -4.02924140493 0.00399189729 1.20660077672 0.005 -0.001 -0.000 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.000 -0.042 N -0.43839318333 -0.00054206762 -2.12229806799 0.004 -0.003 0.003 C -1.76408906064 -0.00030645034 -2.37697009192 -0.001 -0.001 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.001 0.003 0.000 C -1.33713102227 -0.00526459193 -4.73855802198 -0.002 -0.002 -0.002 C 0.02654101484 -0.00591797621 -4.46472703619 -0.001 0.000 -0.004 C 0.43371721952 -0.00363389350 -3.13225443930 0.002 0.002 -0.004 S -6.53329279136 0.00637481657 -0.11611178087 0.000 -0.000 -0.002 N 2.00981687167 0.00259443239 -0.00000686048 0.000 -0.000 -0.080 C 2.67119656792 1.17263645248 0.00045766926 -0.000 0.000 0.016 C 4.06129317470 1.20536051565 0.00241240325 0.000 0.000 -0.002 C 4.76783866331 0.00148799420 0.00346798881 0.000 -0.000 -0.097 C 4.05723810074 -1.20352939940 0.00211502115 0.000 -0.000 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.000 -0.000 0.018 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 0.000 0.105 C 2.33938959521 3.68993217240 -0.00584554905 -0.000 -0.001 -0.290 C 1.45736908622 4.77231118002 -0.00917967851 -0.000 0.001 0.275 C 0.08658913130 4.53522926787 -0.00833235387 -0.000 -0.000 -0.050 C -0.35359617412 3.21325694137 -0.00400174376 -0.000 -0.001 -0.243 N 0.49290585413 2.18198449515 -0.00068475564 -0.000 0.001 0.370 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.000 0.014 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 -0.000 0.105 C 2.33969079820 -3.68709653410 -0.00625612120 -0.000 0.001 -0.290 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 -0.001 0.274 C 0.08684213972 -4.53272927032 -0.00840538011 -0.000 0.000 -0.050 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 0.001 -0.242 N 0.49225266031 -2.17934076887 -0.00084210065 0.000 -0.001 0.368 H 1.83694111827 5.77332096953 -0.01265611066 0.000 0.001 0.171 H -0.61802819388 5.33967450634 -0.01131742088 0.000 -0.000 -0.045 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 -0.001 -0.230 H -1.39787683933 2.98334799634 -0.00369736757 0.000 -0.001 -0.193 H 1.83794742242 -5.77033326187 -0.01295832570 0.000 -0.001 0.171 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 0.000 -0.045 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 0.001 -0.192 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 0.001 -0.229 H 4.58301895157 2.13678100538 0.00314824260 -0.000 0.000 0.042 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 -0.000 0.043 H -1.68997263563 -0.00719388386 -5.74925805817 -0.001 -0.001 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.001 0.000 -0.001 H -3.29620044300 -0.00255800648 -3.88456579214 0.000 0.002 0.001 H 1.47161249279 -0.00457826661 -2.87685200854 0.001 0.002 -0.002 H -1.69176120521 -0.00597000955 5.75026973076 0.001 0.001 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 0.001 -0.000 -0.001 H 1.46975366817 -0.00523069331 2.87805400798 -0.001 -0.002 -0.002 H -3.29750276746 -0.00099200484 3.88584245085 -0.000 -0.002 0.001 H -4.55513299541 0.00377930937 -2.13473279421 -0.004 0.000 0.001 H -4.55107479454 0.00501307822 2.13844314827 0.003 -0.000 0.001 H -6.83436893102 0.00806057203 1.19721860356 -0.003 -0.000 -0.001 H 6.86748209639 1.20005966818 0.00372860376 0.000 0.000 0.011 61 Mode 46: freq=486.06 N -0.44003451495 -0.00038510790 2.12369783068 -0.001 -0.378 -0.001 C -1.76594470239 0.00039861437 2.37754210613 -0.000 -0.126 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.000 0.292 0.001 C -1.33887502024 -0.00450793845 4.73956848945 -0.000 -0.265 -0.001 C 0.02462671625 -0.00591801736 4.46614405978 0.000 0.045 -0.000 C 0.43187566201 -0.00376957955 3.13352499014 0.000 0.239 0.000 C -2.63984642995 0.00218980399 1.17162612704 -0.000 -0.019 -0.000 N -1.98513620489 0.00132140951 0.00153900685 -0.000 0.090 0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.000 -0.019 0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.000 -0.001 0.000 C -4.73391255267 0.00451580118 -0.00020876193 0.000 0.104 -0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.000 0.002 0.000 Co 0.00000000000 0.00000000000 0.00000000000 0.001 0.054 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 -0.370 0.001 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 -0.122 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 0.287 -0.001 C -1.33713102227 -0.00526459193 -4.73855802198 -0.000 -0.260 0.001 C 0.02654101484 -0.00591797621 -4.46472703619 0.000 0.044 -0.000 C 0.43371721952 -0.00363389350 -3.13225443930 0.000 0.233 -0.000 S -6.53329279136 0.00637481657 -0.11611178087 0.000 -0.015 0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 0.007 0.000 C 2.67119656792 1.17263645248 0.00045766926 0.008 0.004 -0.001 C 4.06129317470 1.20536051565 0.00241240325 0.006 -0.001 0.001 C 4.76783866331 0.00148799420 0.00346798881 -0.000 -0.008 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.007 -0.000 -0.001 C 2.67108506586 -1.17139122066 0.00026591651 -0.009 0.004 0.001 C 1.82209539371 2.39842937406 -0.00175320633 0.001 0.000 -0.002 C 2.33938959521 3.68993217240 -0.00584554905 -0.001 -0.000 0.003 C 1.45736908622 4.77231118002 -0.00917967851 0.002 0.003 -0.003 C 0.08658913130 4.53522926787 -0.00833235387 0.002 0.004 0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.001 0.005 0.003 N 0.49290585413 2.18198449515 -0.00068475564 -0.005 -0.003 -0.004 S 6.56718562933 -0.11349126889 0.00673479967 0.000 0.003 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.001 0.000 0.002 C 2.33969079820 -3.68709653410 -0.00625612120 0.002 -0.000 -0.003 C 1.45789786198 -4.76953179608 -0.00945089783 -0.002 0.003 0.003 C 0.08684213972 -4.53272927032 -0.00840538011 -0.002 0.005 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.002 0.005 -0.003 N 0.49225266031 -2.17934076887 -0.00084210065 0.005 -0.003 0.004 H 1.83694111827 5.77332096953 -0.01265611066 0.001 0.001 -0.002 H -0.61802819388 5.33967450634 -0.01131742088 0.001 0.001 0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 -0.001 0.003 H -1.39787683933 2.98334799634 -0.00369736757 -0.001 0.002 0.002 H 1.83794742242 -5.77033326187 -0.01295832570 -0.001 0.001 0.002 H -0.61749414542 -5.33746053721 -0.01121572048 -0.001 0.002 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.001 0.003 -0.002 H 3.39230213722 -3.86796714602 -0.00754158092 0.000 -0.001 -0.003 H 4.58301895157 2.13678100538 0.00314824260 0.004 -0.001 0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.004 -0.001 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.000 -0.161 0.000 H 0.75224758084 -0.00860493512 -5.25016290812 0.000 0.044 -0.000 H -3.29620044300 -0.00255800648 -3.88456579214 0.000 0.230 -0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 0.192 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.000 -0.164 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 0.000 0.045 0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.000 0.196 0.000 H -3.29750276746 -0.00099200484 3.88584245085 0.000 0.235 0.000 H -4.55513299541 0.00377930937 -2.13473279421 -0.000 -0.046 0.000 H -4.55107479454 0.00501307822 2.13844314827 -0.000 -0.044 0.000 H -6.83436893102 0.00806057203 1.19721860356 0.000 -0.012 0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.004 0.001 0.000 61 Mode 47: freq=488.64 N -0.44003451495 -0.00038510790 2.12369783068 0.000 0.259 0.000 C -1.76594470239 0.00039861437 2.37754210613 0.000 0.130 0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.000 -0.224 -0.000 C -1.33887502024 -0.00450793845 4.73956848945 0.000 0.167 0.001 C 0.02462671625 -0.00591801736 4.46614405978 -0.000 0.005 0.000 C 0.43187566201 -0.00376957955 3.13352499014 -0.000 -0.192 -0.000 C -2.63984642995 0.00218980399 1.17162612704 0.000 0.067 0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 0.002 0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.000 -0.068 0.000 C -4.02452897564 0.00329996303 -1.20791476641 0.000 0.069 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 0.000 0.003 -0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.000 -0.071 -0.000 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 -0.270 0.001 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 -0.133 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 0.233 -0.001 C -1.33713102227 -0.00526459193 -4.73855802198 -0.000 -0.175 0.000 C 0.02654101484 -0.00591797621 -4.46472703619 0.000 -0.004 0.000 C 0.43371721952 -0.00363389350 -3.13225443930 0.000 0.199 -0.000 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 0.001 0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 0.000 0.001 C 2.67119656792 1.17263645248 0.00045766926 0.000 0.000 0.057 C 4.06129317470 1.20536051565 0.00241240325 0.000 -0.000 -0.061 C 4.76783866331 0.00148799420 0.00346798881 -0.000 -0.001 0.002 C 4.05723810074 -1.20352939940 0.00211502115 -0.000 -0.000 0.060 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 0.000 -0.058 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 0.000 0.111 C 2.33938959521 3.68993217240 -0.00584554905 -0.000 -0.001 -0.193 C 1.45736908622 4.77231118002 -0.00917967851 0.000 0.001 0.147 C 0.08658913130 4.53522926787 -0.00833235387 0.000 0.000 0.002 C -0.35359617412 3.21325694137 -0.00400174376 -0.000 -0.000 -0.166 N 0.49290585413 2.18198449515 -0.00068475564 -0.000 0.001 0.226 S 6.56718562933 -0.11349126889 0.00673479967 0.000 0.000 0.001 C 1.82142022278 -2.39594383179 -0.00206827421 0.000 0.000 -0.112 C 2.33969079820 -3.68709653410 -0.00625612120 0.000 -0.001 0.197 C 1.45789786198 -4.76953179608 -0.00945089783 -0.000 0.001 -0.151 C 0.08684213972 -4.53272927032 -0.00840538011 -0.000 0.000 -0.001 C -0.35393854068 -3.21111942258 -0.00398541364 0.000 -0.000 0.169 N 0.49225266031 -2.17934076887 -0.00084210065 0.000 0.001 -0.231 H 1.83694111827 5.77332096953 -0.01265611066 0.000 0.000 0.088 H -0.61802819388 5.33967450634 -0.01131742088 0.000 0.000 -0.010 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 -0.001 -0.154 H -1.39787683933 2.98334799634 -0.00369736757 -0.000 -0.000 -0.137 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 0.000 -0.091 H -0.61749414542 -5.33746053721 -0.01121572048 -0.000 0.000 0.011 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 -0.000 0.140 H 3.39230213722 -3.86796714602 -0.00754158092 0.000 -0.001 0.156 H 4.58301895157 2.13678100538 0.00314824260 0.000 -0.000 -0.033 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 -0.000 0.031 H -1.68997263563 -0.00719388386 -5.74925805817 -0.000 -0.106 0.000 H 0.75224758084 -0.00860493512 -5.25016290812 0.000 0.012 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 0.000 0.184 -0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 0.165 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 0.000 0.101 0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.000 -0.010 0.000 H 1.46975366817 -0.00523069331 2.87805400798 -0.000 -0.160 -0.000 H -3.29750276746 -0.00099200484 3.88584245085 -0.000 -0.177 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.000 0.036 -0.000 H -4.55107479454 0.00501307822 2.13844314827 -0.000 -0.039 -0.000 H -6.83436893102 0.00806057203 1.19721860356 0.000 -0.006 0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.000 0.000 -0.005 61 Mode 48: freq=518.55 N -0.44003451495 -0.00038510790 2.12369783068 0.000 0.022 -0.000 C -1.76594470239 0.00039861437 2.37754210613 0.000 0.055 0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.000 -0.029 -0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.000 -0.001 -0.000 C 0.02462671625 -0.00591801736 4.46614405978 0.000 0.029 0.000 C 0.43187566201 -0.00376957955 3.13352499014 -0.000 -0.040 -0.000 C -2.63984642995 0.00218980399 1.17162612704 -0.000 0.037 0.000 N -1.98513620489 0.00132140951 0.00153900685 -0.000 0.000 0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.000 -0.037 0.000 C -4.02452897564 0.00329996303 -1.20791476641 0.000 0.025 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 0.000 0.001 -0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.000 -0.025 -0.000 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 0.000 0.001 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 -0.022 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 -0.056 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 0.030 -0.000 C -1.33713102227 -0.00526459193 -4.73855802198 0.000 0.001 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 -0.000 -0.030 -0.000 C 0.43371721952 -0.00363389350 -3.13225443930 -0.000 0.041 -0.000 S -6.53329279136 0.00637481657 -0.11611178087 0.000 0.000 0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 -0.002 -0.003 C 2.67119656792 1.17263645248 0.00045766926 -0.000 -0.001 -0.254 C 4.06129317470 1.20536051565 0.00241240325 -0.001 0.001 0.155 C 4.76783866331 0.00148799420 0.00346798881 0.000 0.001 -0.004 C 4.05723810074 -1.20352939940 0.00211502115 0.002 0.000 -0.154 C 2.67108506586 -1.17139122066 0.00026591651 0.001 -0.001 0.257 C 1.82209539371 2.39842937406 -0.00175320633 0.000 -0.001 -0.328 C 2.33938959521 3.68993217240 -0.00584554905 0.000 0.000 0.012 C 1.45736908622 4.77231118002 -0.00917967851 -0.000 0.001 0.222 C 0.08658913130 4.53522926787 -0.00833235387 -0.000 -0.001 -0.298 C -0.35359617412 3.21325694137 -0.00400174376 0.000 0.001 0.168 N 0.49290585413 2.18198449515 -0.00068475564 0.000 0.001 0.137 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 -0.000 -0.004 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 -0.001 0.332 C 2.33969079820 -3.68709653410 -0.00625612120 -0.000 0.001 -0.011 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 0.001 -0.225 C 0.08684213972 -4.53272927032 -0.00840538011 0.000 -0.001 0.302 C -0.35393854068 -3.21111942258 -0.00398541364 -0.001 0.000 -0.170 N 0.49225266031 -2.17934076887 -0.00084210065 -0.001 0.001 -0.140 H 1.83694111827 5.77332096953 -0.01265611066 -0.000 0.001 0.177 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 -0.001 -0.167 H 3.39175422949 3.87200638269 -0.00704552340 0.000 0.000 0.049 H -1.39787683933 2.98334799634 -0.00369736757 0.000 0.000 0.158 H 1.83794742242 -5.77033326187 -0.01295832570 0.000 0.001 -0.180 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 -0.001 0.169 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 0.000 -0.160 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 0.001 -0.050 H 4.58301895157 2.13678100538 0.00314824260 -0.001 0.000 0.124 H 4.58784714512 -2.12983634010 0.00211631073 0.001 0.000 -0.119 H -1.68997263563 -0.00719388386 -5.74925805817 0.000 0.006 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 0.000 -0.014 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 0.000 0.029 -0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 0.035 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.000 -0.006 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.000 0.014 0.000 H 1.46975366817 -0.00523069331 2.87805400798 -0.000 -0.034 -0.000 H -3.29750276746 -0.00099200484 3.88584245085 -0.000 -0.029 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.000 0.017 -0.000 H -4.55107479454 0.00501307822 2.13844314827 -0.000 -0.018 -0.000 H -6.83436893102 0.00806057203 1.19721860356 0.000 -0.003 0.000 H 6.86748209639 1.20005966818 0.00372860376 0.001 -0.000 0.022 61 Mode 49: freq=519.38 N -0.44003451495 -0.00038510790 2.12369783068 0.000 -0.164 -0.000 C -1.76594470239 0.00039861437 2.37754210613 0.000 0.314 0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.000 0.007 -0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.000 -0.236 -0.001 C 0.02462671625 -0.00591801736 4.46614405978 0.000 0.302 0.001 C 0.43187566201 -0.00376957955 3.13352499014 0.000 -0.157 -0.000 C -2.63984642995 0.00218980399 1.17162612704 0.000 0.251 0.001 N -1.98513620489 0.00132140951 0.00153900685 0.000 0.003 0.001 C -2.63911589169 0.00167522827 -1.17277445342 0.000 -0.254 0.001 C -4.02452897564 0.00329996303 -1.20791476641 0.001 0.151 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 0.000 0.004 -0.001 C -4.02924140493 0.00399189729 1.20660077672 -0.001 -0.152 -0.000 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 -0.001 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 0.167 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 -0.317 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 -0.000 -0.008 -0.000 C -1.33713102227 -0.00526459193 -4.73855802198 0.000 0.239 -0.001 C 0.02654101484 -0.00591797621 -4.46472703619 -0.000 -0.306 0.001 C 0.43371721952 -0.00363389350 -3.13225443930 -0.000 0.158 -0.000 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 0.004 0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 -0.000 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.000 -0.000 0.021 C 4.06129317470 1.20536051565 0.00241240325 -0.000 -0.000 -0.010 C 4.76783866331 0.00148799420 0.00346798881 -0.000 0.000 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.000 0.000 0.010 C 2.67108506586 -1.17139122066 0.00026591651 0.000 -0.000 -0.021 C 1.82209539371 2.39842937406 -0.00175320633 0.000 0.000 0.018 C 2.33938959521 3.68993217240 -0.00584554905 0.000 0.000 0.028 C 1.45736908622 4.77231118002 -0.00917967851 -0.000 -0.000 -0.051 C 0.08658913130 4.53522926787 -0.00833235387 -0.000 0.000 0.039 C -0.35359617412 3.21325694137 -0.00400174376 0.000 0.000 0.002 N 0.49290585413 2.18198449515 -0.00068475564 0.000 -0.000 -0.056 S 6.56718562933 -0.11349126889 0.00673479967 0.000 -0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.000 0.000 -0.018 C 2.33969079820 -3.68709653410 -0.00625612120 -0.000 0.000 -0.028 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 -0.000 0.051 C 0.08684213972 -4.53272927032 -0.00840538011 0.000 0.000 -0.040 C -0.35393854068 -3.21111942258 -0.00398541364 0.000 0.000 -0.002 N 0.49225266031 -2.17934076887 -0.00084210065 0.000 -0.000 0.057 H 1.83694111827 5.77332096953 -0.01265611066 -0.000 -0.000 -0.035 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 0.000 0.025 H 3.39175422949 3.87200638269 -0.00704552340 0.000 0.000 0.019 H -1.39787683933 2.98334799634 -0.00369736757 0.000 -0.000 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.000 -0.000 0.036 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 0.000 -0.025 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 -0.000 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 0.000 -0.019 H 4.58301895157 2.13678100538 0.00314824260 -0.000 0.000 -0.010 H 4.58784714512 -2.12983634010 0.00211631073 0.000 0.000 0.010 H -1.68997263563 -0.00719388386 -5.74925805817 0.000 0.187 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 -0.173 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 0.000 0.032 -0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 0.147 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.000 -0.184 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 0.000 0.171 0.000 H 1.46975366817 -0.00523069331 2.87805400798 -0.000 -0.146 -0.000 H -3.29750276746 -0.00099200484 3.88584245085 -0.000 -0.032 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.000 0.118 -0.000 H -4.55107479454 0.00501307822 2.13844314827 -0.000 -0.123 -0.000 H -6.83436893102 0.00806057203 1.19721860356 0.000 -0.022 0.000 H 6.86748209639 1.20005966818 0.00372860376 0.000 -0.000 -0.002 61 Mode 50: freq=541.38 N -0.44003451495 -0.00038510790 2.12369783068 -0.069 -0.001 0.007 C -1.76594470239 0.00039861437 2.37754210613 -0.037 0.005 0.036 C -2.24923313135 -0.00145267054 3.67997125809 -0.058 0.000 0.039 C -1.33887502024 -0.00450793845 4.73956848945 -0.003 -0.003 -0.009 C 0.02462671625 -0.00591801736 4.46614405978 -0.008 0.004 -0.062 C 0.43187566201 -0.00376957955 3.13352499014 -0.029 -0.003 -0.055 C -2.63984642995 0.00218980399 1.17162612704 0.131 0.002 -0.039 N -1.98513620489 0.00132140951 0.00153900685 0.221 -0.004 0.007 C -2.63911589169 0.00167522827 -1.17277445342 0.135 0.002 0.053 C -4.02452897564 0.00329996303 -1.20791476641 0.142 0.000 0.071 C -4.73391255267 0.00451580118 -0.00020876193 0.036 -0.005 0.004 C -4.02924140493 0.00399189729 1.20660077672 0.139 -0.000 -0.053 Co 0.00000000000 0.00000000000 0.00000000000 0.045 -0.000 -0.001 N -0.43839318333 -0.00054206762 -2.12229806799 -0.076 -0.001 -0.013 C -1.76408906064 -0.00030645034 -2.37697009192 -0.043 0.005 -0.036 C -2.24773885821 -0.00257631963 -3.67934971086 -0.057 0.000 -0.045 C -1.33713102227 -0.00526459193 -4.73855802198 0.003 -0.003 0.003 C 0.02654101484 -0.00591797621 -4.46472703619 -0.002 0.004 0.056 C 0.43371721952 -0.00363389350 -3.13225443930 -0.031 -0.003 0.052 S -6.53329279136 0.00637481657 -0.11611178087 -0.182 0.001 -0.011 N 2.00981687167 0.00259443239 -0.00000686048 -0.410 0.015 0.002 C 2.67119656792 1.17263645248 0.00045766926 -0.244 -0.065 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.257 -0.097 -0.001 C 4.76783866331 0.00148799420 0.00346798881 -0.068 0.007 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.266 0.131 -0.001 C 2.67108506586 -1.17139122066 0.00026591651 -0.253 0.093 0.001 C 1.82209539371 2.39842937406 -0.00175320633 0.070 0.074 -0.001 C 2.33938959521 3.68993217240 -0.00584554905 0.104 0.088 -0.001 C 1.45736908622 4.77231118002 -0.00917967851 0.010 0.014 0.001 C 0.08658913130 4.53522926787 -0.00833235387 0.019 -0.097 -0.001 C -0.35359617412 3.21325694137 -0.00400174376 0.058 -0.092 0.001 N 0.49290585413 2.18198449515 -0.00068475564 0.124 0.002 0.001 S 6.56718562933 -0.11349126889 0.00673479967 0.342 -0.020 0.001 C 1.82142022278 -2.39594383179 -0.00206827421 0.082 -0.075 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.103 -0.101 -0.001 C 1.45789786198 -4.76953179608 -0.00945089783 -0.002 -0.025 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.007 0.086 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.062 0.086 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.137 -0.014 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.029 0.016 0.001 H -0.61802819388 5.33967450634 -0.01131742088 -0.006 -0.039 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.028 0.041 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.021 -0.043 0.001 H 1.83794742242 -5.77033326187 -0.01295832570 -0.033 -0.020 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.011 0.037 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.023 0.045 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.027 -0.049 -0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.115 -0.007 -0.001 H 4.58784714512 -2.12983634010 0.00211631073 -0.121 0.015 -0.001 H -1.68997263563 -0.00719388386 -5.74925805817 0.019 -0.003 -0.005 H 0.75224758084 -0.00860493512 -5.25016290812 0.005 0.002 0.022 H -3.29620044300 -0.00255800648 -3.88456579214 -0.014 -0.001 -0.025 H 1.47161249279 -0.00457826661 -2.87685200854 -0.012 -0.003 0.027 H -1.69176120521 -0.00597000955 5.75026973076 0.017 -0.003 0.004 H 0.75025791005 -0.00892914887 5.25161119224 0.002 0.002 -0.023 H 1.46975366817 -0.00523069331 2.87805400798 -0.011 -0.003 -0.026 H -3.29750276746 -0.00099200484 3.88584245085 -0.015 -0.001 0.021 H -4.55513299541 0.00377930937 -2.13473279421 0.065 0.001 0.008 H -4.55107479454 0.00501307822 2.13844314827 0.062 0.001 -0.004 H -6.83436893102 0.00806057203 1.19721860356 -0.017 0.001 0.003 H 6.86748209639 1.20005966818 0.00372860376 0.032 0.005 0.000 61 Mode 51: freq=550.50 N -0.44003451495 -0.00038510790 2.12369783068 0.004 0.002 -0.006 C -1.76594470239 0.00039861437 2.37754210613 -0.001 -0.007 -0.002 C -2.24923313135 -0.00145267054 3.67997125809 -0.002 -0.001 -0.008 C -1.33887502024 -0.00450793845 4.73956848945 -0.003 0.005 -0.009 C 0.02462671625 -0.00591801736 4.46614405978 -0.004 -0.006 -0.009 C 0.43187566201 -0.00376957955 3.13352499014 0.001 0.004 -0.006 C -2.63984642995 0.00218980399 1.17162612704 -0.011 -0.002 0.013 N -1.98513620489 0.00132140951 0.00153900685 0.010 0.007 0.029 C -2.63911589169 0.00167522827 -1.17277445342 0.025 -0.001 0.017 C -4.02452897564 0.00329996303 -1.20791476641 0.028 -0.001 0.002 C -4.73391255267 0.00451580118 -0.00020876193 0.003 0.006 -0.014 C -4.02924140493 0.00399189729 1.20660077672 -0.013 -0.000 -0.004 Co 0.00000000000 0.00000000000 0.00000000000 -0.007 -0.001 0.066 N -0.43839318333 -0.00054206762 -2.12229806799 -0.010 0.002 -0.007 C -1.76408906064 -0.00030645034 -2.37697009192 -0.003 -0.007 -0.006 C -2.24773885821 -0.00257631963 -3.67934971086 -0.003 -0.001 -0.013 C -1.33713102227 -0.00526459193 -4.73855802198 0.003 0.005 -0.010 C 0.02654101484 -0.00591797621 -4.46472703619 0.003 -0.006 -0.003 C 0.43371721952 -0.00363389350 -3.13225443930 -0.004 0.004 -0.001 S -6.53329279136 0.00637481657 -0.11611178087 -0.010 -0.001 0.005 N 2.00981687167 0.00259443239 -0.00000686048 0.004 -0.001 -0.320 C 2.67119656792 1.17263645248 0.00045766926 0.003 0.000 0.067 C 4.06129317470 1.20536051565 0.00241240325 0.003 0.001 0.026 C 4.76783866331 0.00148799420 0.00346798881 0.002 0.000 -0.300 C 4.05723810074 -1.20352939940 0.00211502115 0.004 -0.001 0.031 C 2.67108506586 -1.17139122066 0.00026591651 0.004 -0.002 0.064 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 0.000 0.349 C 2.33938959521 3.68993217240 -0.00584554905 -0.001 -0.000 0.044 C 1.45736908622 4.77231118002 -0.00917967851 -0.000 -0.000 -0.220 C 0.08658913130 4.53522926787 -0.00833235387 -0.000 0.002 0.286 C -0.35359617412 3.21325694137 -0.00400174376 -0.000 0.000 -0.178 N 0.49290585413 2.18198449515 -0.00068475564 -0.001 -0.000 -0.084 S 6.56718562933 -0.11349126889 0.00673479967 -0.004 0.000 0.038 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 -0.000 0.343 C 2.33969079820 -3.68709653410 -0.00625612120 -0.001 0.001 0.043 C 1.45789786198 -4.76953179608 -0.00945089783 -0.000 0.001 -0.216 C 0.08684213972 -4.53272927032 -0.00840538011 -0.000 -0.002 0.281 C -0.35393854068 -3.21111942258 -0.00398541364 -0.001 -0.000 -0.175 N 0.49225266031 -2.17934076887 -0.00084210065 -0.001 0.001 -0.083 H 1.83694111827 5.77332096953 -0.01265611066 0.000 -0.001 -0.198 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 0.001 0.142 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 -0.000 -0.056 H -1.39787683933 2.98334799634 -0.00369736757 -0.000 -0.000 -0.178 H 1.83794742242 -5.77033326187 -0.01295832570 0.000 0.001 -0.195 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 -0.001 0.140 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 0.000 -0.175 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 0.001 -0.056 H 4.58301895157 2.13678100538 0.00314824260 0.001 0.000 0.109 H 4.58784714512 -2.12983634010 0.00211631073 0.002 -0.000 0.115 H -1.68997263563 -0.00719388386 -5.74925805817 0.002 0.004 -0.003 H 0.75224758084 -0.00860493512 -5.25016290812 0.002 -0.003 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.001 0.001 -0.006 H 1.47161249279 -0.00457826661 -2.87685200854 -0.002 0.004 0.003 H -1.69176120521 -0.00597000955 5.75026973076 -0.001 0.004 -0.003 H 0.75025791005 -0.00892914887 5.25161119224 -0.002 -0.003 -0.002 H 1.46975366817 -0.00523069331 2.87805400798 0.001 0.004 0.001 H -3.29750276746 -0.00099200484 3.88584245085 -0.001 0.001 -0.004 H -4.55513299541 0.00377930937 -2.13473279421 0.015 -0.002 -0.003 H -4.55107479454 0.00501307822 2.13844314827 -0.008 -0.002 -0.003 H -6.83436893102 0.00806057203 1.19721860356 0.008 -0.001 0.003 H 6.86748209639 1.20005966818 0.00372860376 0.000 -0.000 0.034 61 Mode 52: freq=550.82 N -0.44003451495 -0.00038510790 2.12369783068 -0.003 0.098 0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.001 -0.341 0.001 C -2.24923313135 -0.00145267054 3.67997125809 -0.002 -0.050 0.002 C -1.33887502024 -0.00450793845 4.73956848945 0.000 0.227 0.000 C 0.02462671625 -0.00591801736 4.46614405978 -0.001 -0.292 -0.003 C 0.43187566201 -0.00376957955 3.13352499014 -0.001 0.177 -0.002 C -2.63984642995 0.00218980399 1.17162612704 0.006 -0.070 -0.002 N -1.98513620489 0.00132140951 0.00153900685 0.009 0.309 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.005 -0.067 0.002 C -4.02452897564 0.00329996303 -1.20791476641 0.006 -0.029 0.003 C -4.73391255267 0.00451580118 -0.00020876193 0.002 0.296 0.000 C -4.02924140493 0.00399189729 1.20660077672 0.006 -0.024 -0.002 Co 0.00000000000 0.00000000000 0.00000000000 -0.003 -0.065 -0.001 N -0.43839318333 -0.00054206762 -2.12229806799 -0.003 0.097 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.002 -0.336 -0.001 C -2.24773885821 -0.00257631963 -3.67934971086 -0.002 -0.048 -0.002 C -1.33713102227 -0.00526459193 -4.73855802198 0.000 0.223 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 -0.001 -0.287 0.003 C 0.43371721952 -0.00363389350 -3.13225443930 -0.001 0.175 0.002 S -6.53329279136 0.00637481657 -0.11611178087 -0.008 -0.038 -0.001 N 2.00981687167 0.00259443239 -0.00000686048 -0.004 -0.030 0.007 C 2.67119656792 1.17263645248 0.00045766926 -0.020 -0.016 -0.001 C 4.06129317470 1.20536051565 0.00241240325 -0.024 0.002 -0.001 C 4.76783866331 0.00148799420 0.00346798881 -0.000 0.017 0.006 C 4.05723810074 -1.20352939940 0.00211502115 0.019 0.005 -0.001 C 2.67108506586 -1.17139122066 0.00026591651 0.016 -0.014 -0.002 C 1.82209539371 2.39842937406 -0.00175320633 0.003 0.004 -0.007 C 2.33938959521 3.68993217240 -0.00584554905 0.004 0.010 -0.001 C 1.45736908622 4.77231118002 -0.00917967851 -0.003 0.007 0.005 C 0.08658913130 4.53522926787 -0.00833235387 -0.004 0.003 -0.006 C -0.35359617412 3.21325694137 -0.00400174376 0.002 0.001 0.004 N 0.49290585413 2.18198449515 -0.00068475564 0.010 0.008 0.002 S 6.56718562933 -0.11349126889 0.00673479967 0.002 -0.007 -0.001 C 1.82142022278 -2.39594383179 -0.00206827421 -0.002 0.002 -0.008 C 2.33969079820 -3.68709653410 -0.00625612120 -0.002 0.008 -0.001 C 1.45789786198 -4.76953179608 -0.00945089783 0.003 0.006 0.005 C 0.08684213972 -4.53272927032 -0.00840538011 0.004 0.005 -0.006 C -0.35393854068 -3.21111942258 -0.00398541364 -0.001 0.003 0.004 N 0.49225266031 -2.17934076887 -0.00084210065 -0.008 0.008 0.002 H 1.83694111827 5.77332096953 -0.01265611066 -0.002 0.002 0.004 H -0.61802819388 5.33967450634 -0.01131742088 -0.002 0.000 -0.003 H 3.39175422949 3.87200638269 -0.00704552340 0.001 0.006 0.001 H -1.39787683933 2.98334799634 -0.00369736757 0.002 -0.003 0.004 H 1.83794742242 -5.77033326187 -0.01295832570 0.001 0.002 0.004 H -0.61749414542 -5.33746053721 -0.01121572048 0.002 0.001 -0.003 H -1.39833026435 -2.98175334118 -0.00345676225 -0.001 -0.002 0.004 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 0.005 0.001 H 4.58301895157 2.13678100538 0.00314824260 -0.013 0.004 -0.002 H 4.58784714512 -2.12983634010 0.00211631073 0.011 0.004 -0.002 H -1.68997263563 -0.00719388386 -5.74925805817 0.001 0.198 -0.001 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 -0.145 0.001 H -3.29620044300 -0.00255800648 -3.88456579214 -0.001 0.047 -0.001 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 0.172 0.001 H -1.69176120521 -0.00597000955 5.75026973076 0.001 0.201 0.001 H 0.75025791005 -0.00892914887 5.25161119224 -0.000 -0.147 -0.001 H 1.46975366817 -0.00523069331 2.87805400798 -0.000 0.175 -0.001 H -3.29750276746 -0.00099200484 3.88584245085 -0.001 0.047 0.001 H -4.55513299541 0.00377930937 -2.13473279421 0.002 -0.110 0.000 H -4.55107479454 0.00501307822 2.13844314827 0.003 -0.104 -0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.001 -0.034 0.000 H 6.86748209639 1.20005966818 0.00372860376 0.010 -0.003 -0.001 61 Mode 53: freq=557.41 N -0.44003451495 -0.00038510790 2.12369783068 0.104 0.002 -0.006 C -1.76594470239 0.00039861437 2.37754210613 0.048 -0.005 -0.077 C -2.24923313135 -0.00145267054 3.67997125809 0.100 -0.001 -0.081 C -1.33887502024 -0.00450793845 4.73956848945 0.017 0.004 -0.009 C 0.02462671625 -0.00591801736 4.46614405978 0.027 -0.005 0.096 C 0.43187566201 -0.00376957955 3.13352499014 0.045 0.002 0.086 C -2.63984642995 0.00218980399 1.17162612704 -0.249 -0.000 0.057 N -1.98513620489 0.00132140951 0.00153900685 -0.379 0.005 -0.015 C -2.63911589169 0.00167522827 -1.17277445342 -0.259 -0.000 -0.087 C -4.02452897564 0.00329996303 -1.20791476641 -0.278 -0.000 -0.124 C -4.73391255267 0.00451580118 -0.00020876193 -0.087 0.004 -0.005 C -4.02924140493 0.00399189729 1.20660077672 -0.269 -0.000 0.092 Co 0.00000000000 0.00000000000 0.00000000000 0.248 -0.002 0.003 N -0.43839318333 -0.00054206762 -2.12229806799 0.118 0.002 0.018 C -1.76408906064 -0.00030645034 -2.37697009192 0.062 -0.005 0.077 C -2.24773885821 -0.00257631963 -3.67934971086 0.100 -0.001 0.094 C -1.33713102227 -0.00526459193 -4.73855802198 0.005 0.004 0.019 C 0.02654101484 -0.00591797621 -4.46472703619 0.015 -0.005 -0.086 C 0.43371721952 -0.00363389350 -3.13225443930 0.051 0.002 -0.080 S -6.53329279136 0.00637481657 -0.11611178087 0.335 -0.001 0.020 N 2.00981687167 0.00259443239 -0.00000686048 -0.198 0.009 -0.010 C 2.67119656792 1.17263645248 0.00045766926 -0.132 -0.028 0.001 C 4.06129317470 1.20536051565 0.00241240325 -0.142 -0.048 0.001 C 4.76783866331 0.00148799420 0.00346798881 -0.046 0.002 -0.008 C 4.05723810074 -1.20352939940 0.00211502115 -0.148 0.065 0.001 C 2.67108506586 -1.17139122066 0.00026591651 -0.138 0.045 0.001 C 1.82209539371 2.39842937406 -0.00175320633 0.024 0.039 0.009 C 2.33938959521 3.68993217240 -0.00584554905 0.053 0.039 0.002 C 1.45736908622 4.77231118002 -0.00917967851 0.010 0.002 -0.006 C 0.08658913130 4.53522926787 -0.00833235387 0.013 -0.050 0.008 C -0.35359617412 3.21325694137 -0.00400174376 0.019 -0.044 -0.005 N 0.49290585413 2.18198449515 -0.00068475564 0.052 0.004 -0.003 S 6.56718562933 -0.11349126889 0.00673479967 0.179 -0.010 0.001 C 1.82142022278 -2.39594383179 -0.00206827421 0.032 -0.039 0.009 C 2.33969079820 -3.68709653410 -0.00625612120 0.054 -0.046 0.002 C 1.45789786198 -4.76953179608 -0.00945089783 0.003 -0.008 -0.007 C 0.08684213972 -4.53272927032 -0.00840538011 0.006 0.044 0.008 C -0.35393854068 -3.21111942258 -0.00398541364 0.022 0.041 -0.005 N 0.49225266031 -2.17934076887 -0.00084210065 0.060 -0.011 -0.003 H 1.83694111827 5.77332096953 -0.01265611066 -0.013 0.007 -0.006 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 -0.018 0.004 H 3.39175422949 3.87200638269 -0.00704552340 0.015 0.017 -0.001 H -1.39787683933 2.98334799634 -0.00369736757 0.008 -0.021 -0.005 H 1.83794742242 -5.77033326187 -0.01295832570 -0.015 -0.008 -0.006 H -0.61749414542 -5.33746053721 -0.01121572048 -0.003 0.017 0.004 H -1.39833026435 -2.98175334118 -0.00345676225 0.009 0.022 -0.005 H 3.39230213722 -3.86796714602 -0.00754158092 0.014 -0.022 -0.001 H 4.58301895157 2.13678100538 0.00314824260 -0.061 -0.004 0.003 H 4.58784714512 -2.12983634010 0.00211631073 -0.065 0.007 0.003 H -1.68997263563 -0.00719388386 -5.74925805817 -0.030 0.003 0.017 H 0.75224758084 -0.00860493512 -5.25016290812 -0.006 -0.002 -0.035 H -3.29620044300 -0.00255800648 -3.88456579214 0.026 0.001 0.043 H 1.47161249279 -0.00457826661 -2.87685200854 0.020 0.003 -0.041 H -1.69176120521 -0.00597000955 5.75026973076 -0.026 0.003 -0.013 H 0.75025791005 -0.00892914887 5.25161119224 -0.001 -0.002 0.036 H 1.46975366817 -0.00523069331 2.87805400798 0.017 0.002 0.039 H -3.29750276746 -0.00099200484 3.88584245085 0.027 0.000 -0.035 H -4.55513299541 0.00377930937 -2.13473279421 -0.123 -0.002 -0.013 H -4.55107479454 0.00501307822 2.13844314827 -0.116 -0.002 0.007 H -6.83436893102 0.00806057203 1.19721860356 0.028 -0.000 -0.006 H 6.86748209639 1.20005966818 0.00372860376 0.015 0.003 0.001 61 Mode 54: freq=611.57 N -0.44003451495 -0.00038510790 2.12369783068 0.000 -0.009 0.001 C -1.76594470239 0.00039861437 2.37754210613 -0.000 0.015 -0.001 C -2.24923313135 -0.00145267054 3.67997125809 0.000 0.013 -0.001 C -1.33887502024 -0.00450793845 4.73956848945 0.000 -0.020 -0.001 C 0.02462671625 -0.00591801736 4.46614405978 0.001 0.023 0.000 C 0.43187566201 -0.00376957955 3.13352499014 0.000 -0.014 0.000 C -2.63984642995 0.00218980399 1.17162612704 -0.001 -0.021 -0.000 N -1.98513620489 0.00132140951 0.00153900685 -0.001 -0.031 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.001 -0.021 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.002 0.002 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 -0.001 0.008 0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.001 0.002 0.000 Co 0.00000000000 0.00000000000 0.00000000000 0.006 0.045 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.000 -0.009 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 0.016 0.001 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 0.013 0.001 C -1.33713102227 -0.00526459193 -4.73855802198 0.000 -0.020 0.001 C 0.02654101484 -0.00591797621 -4.46472703619 0.000 0.023 -0.000 C 0.43371721952 -0.00363389350 -3.13225443930 0.000 -0.014 -0.000 S -6.53329279136 0.00637481657 -0.11611178087 0.002 -0.002 0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.019 -0.420 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.226 -0.279 0.001 C 4.06129317470 1.20536051565 0.00241240325 -0.306 0.027 -0.001 C 4.76783866331 0.00148799420 0.00346798881 -0.000 0.232 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.286 0.034 0.001 C 2.67108506586 -1.17139122066 0.00026591651 0.205 -0.271 -0.001 C 1.82209539371 2.39842937406 -0.00175320633 0.128 0.005 0.002 C 2.33938959521 3.68993217240 -0.00584554905 0.058 0.133 0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.067 0.080 -0.001 C 0.08658913130 4.53522926787 -0.00833235387 -0.076 0.033 0.001 C -0.35359617412 3.21325694137 -0.00400174376 0.095 0.004 -0.001 N 0.49290585413 2.18198449515 -0.00068475564 0.195 0.091 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.004 -0.063 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.125 0.001 -0.002 C 2.33969079820 -3.68709653410 -0.00625612120 -0.050 0.128 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.068 0.080 0.001 C 0.08684213972 -4.53272927032 -0.00840538011 0.076 0.039 -0.001 C -0.35393854068 -3.21111942258 -0.00398541364 -0.094 0.008 0.001 N 0.49225266031 -2.17934076887 -0.00084210065 -0.189 0.088 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.036 0.030 -0.001 H -0.61802819388 5.33967450634 -0.01131742088 -0.043 -0.008 0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.008 0.094 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.037 -0.040 -0.001 H 1.83794742242 -5.77033326187 -0.01295832570 0.034 0.029 0.001 H -0.61749414542 -5.33746053721 -0.01121572048 0.042 -0.006 -0.001 H -1.39833026435 -2.98175334118 -0.00345676225 -0.037 -0.038 0.001 H 3.39230213722 -3.86796714602 -0.00754158092 -0.006 0.092 0.001 H 4.58301895157 2.13678100538 0.00314824260 -0.178 0.055 -0.001 H 4.58784714512 -2.12983634010 0.00211631073 0.172 0.058 0.001 H -1.68997263563 -0.00719388386 -5.74925805817 -0.000 -0.018 0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 0.011 -0.000 H -3.29620044300 -0.00255800648 -3.88456579214 0.000 0.002 0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 -0.014 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.000 -0.018 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 0.000 0.011 0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.000 -0.014 -0.000 H -3.29750276746 -0.00099200484 3.88584245085 0.000 0.002 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 -0.001 0.008 -0.000 H -4.55107479454 0.00501307822 2.13844314827 -0.001 0.009 0.000 H -6.83436893102 0.00806057203 1.19721860356 0.000 -0.002 -0.000 H 6.86748209639 1.20005966818 0.00372860376 0.140 -0.042 0.000 61 Mode 55: freq=614.50 N -0.44003451495 -0.00038510790 2.12369783068 0.194 -0.000 -0.092 C -1.76594470239 0.00039861437 2.37754210613 0.128 -0.001 -0.009 C -2.24923313135 -0.00145267054 3.67997125809 0.051 -0.000 -0.135 C -1.33887502024 -0.00450793845 4.73956848945 -0.070 0.001 -0.082 C 0.02462671625 -0.00591801736 4.46614405978 -0.076 -0.000 -0.033 C 0.43187566201 -0.00376957955 3.13352499014 0.099 0.000 -0.006 C -2.63984642995 0.00218980399 1.17162612704 -0.226 -0.000 0.282 N -1.98513620489 0.00132140951 0.00153900685 -0.020 0.000 0.418 C -2.63911589169 0.00167522827 -1.17277445342 0.203 0.000 0.274 C -4.02452897564 0.00329996303 -1.20791476641 0.286 -0.001 -0.028 C -4.73391255267 0.00451580118 -0.00020876193 -0.001 -0.000 -0.225 C -4.02924140493 0.00399189729 1.20660077672 -0.309 0.001 -0.020 Co 0.00000000000 0.00000000000 0.00000000000 0.007 0.000 -0.042 N -0.43839318333 -0.00054206762 -2.12229806799 -0.187 0.000 -0.089 C -1.76408906064 -0.00030645034 -2.37697009192 -0.125 0.001 -0.004 C -2.24773885821 -0.00257631963 -3.67934971086 -0.043 -0.000 -0.130 C -1.33713102227 -0.00526459193 -4.73855802198 0.071 -0.001 -0.084 C 0.02654101484 -0.00591797621 -4.46472703619 0.077 0.000 -0.040 C 0.43371721952 -0.00363389350 -3.13225443930 -0.098 -0.000 -0.011 S -6.53329279136 0.00637481657 -0.11611178087 -0.003 -0.000 0.062 N 2.00981687167 0.00259443239 -0.00000686048 -0.001 -0.000 0.031 C 2.67119656792 1.17263645248 0.00045766926 -0.001 -0.000 0.021 C 4.06129317470 1.20536051565 0.00241240325 -0.001 -0.000 -0.002 C 4.76783866331 0.00148799420 0.00346798881 -0.001 0.000 -0.008 C 4.05723810074 -1.20352939940 0.00211502115 -0.001 0.000 -0.002 C 2.67108506586 -1.17139122066 0.00026591651 -0.001 0.000 0.021 C 1.82209539371 2.39842937406 -0.00175320633 0.000 0.000 -0.015 C 2.33938959521 3.68993217240 -0.00584554905 0.000 0.000 -0.012 C 1.45736908622 4.77231118002 -0.00917967851 0.000 0.000 0.018 C 0.08658913130 4.53522926787 -0.00833235387 0.000 -0.000 -0.021 C -0.35359617412 3.21325694137 -0.00400174376 -0.000 -0.000 0.013 N 0.49290585413 2.18198449515 -0.00068475564 0.000 0.000 0.007 S 6.56718562933 -0.11349126889 0.00673479967 0.001 -0.000 0.002 C 1.82142022278 -2.39594383179 -0.00206827421 0.000 -0.000 -0.015 C 2.33969079820 -3.68709653410 -0.00625612120 0.000 -0.000 -0.012 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 -0.000 0.019 C 0.08684213972 -4.53272927032 -0.00840538011 0.000 0.000 -0.021 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 0.000 0.014 N 0.49225266031 -2.17934076887 -0.00084210065 0.000 -0.000 0.007 H 1.83694111827 5.77332096953 -0.01265611066 -0.000 0.000 0.016 H -0.61802819388 5.33967450634 -0.01131742088 0.000 -0.000 -0.010 H 3.39175422949 3.87200638269 -0.00704552340 0.000 0.000 -0.002 H -1.39787683933 2.98334799634 -0.00369736757 0.000 -0.000 0.013 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 -0.000 0.016 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 0.000 -0.010 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 0.000 0.013 H 3.39230213722 -3.86796714602 -0.00754158092 0.000 -0.000 -0.002 H 4.58301895157 2.13678100538 0.00314824260 -0.000 -0.000 -0.008 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 0.000 -0.008 H -1.68997263563 -0.00719388386 -5.74925805817 0.034 -0.001 -0.030 H 0.75224758084 -0.00860493512 -5.25016290812 0.043 0.000 0.008 H -3.29620044300 -0.00255800648 -3.88456579214 -0.003 -0.000 -0.092 H 1.47161249279 -0.00457826661 -2.87685200854 -0.039 -0.000 0.036 H -1.69176120521 -0.00597000955 5.75026973076 -0.036 0.001 -0.030 H 0.75025791005 -0.00892914887 5.25161119224 -0.043 -0.000 0.010 H 1.46975366817 -0.00523069331 2.87805400798 0.039 0.000 0.039 H -3.29750276746 -0.00099200484 3.88584245085 0.005 0.000 -0.094 H -4.55513299541 0.00377930937 -2.13473279421 0.172 -0.000 -0.057 H -4.55107479454 0.00501307822 2.13844314827 -0.179 0.000 -0.054 H -6.83436893102 0.00806057203 1.19721860356 0.137 -0.000 0.042 H 6.86748209639 1.20005966818 0.00372860376 0.000 0.000 0.002 61 Mode 56: freq=664.08 N -0.44003451495 -0.00038510790 2.12369783068 0.007 0.000 -0.004 C -1.76594470239 0.00039861437 2.37754210613 0.008 0.000 0.003 C -2.24923313135 -0.00145267054 3.67997125809 0.001 0.000 -0.001 C -1.33887502024 -0.00450793845 4.73956848945 -0.004 -0.000 0.001 C 0.02462671625 -0.00591801736 4.46614405978 -0.005 0.000 -0.003 C 0.43187566201 -0.00376957955 3.13352499014 0.004 -0.000 -0.002 C -2.63984642995 0.00218980399 1.17162612704 -0.002 -0.000 0.012 N -1.98513620489 0.00132140951 0.00153900685 -0.000 0.000 0.013 C -2.63911589169 0.00167522827 -1.17277445342 0.002 -0.000 0.011 C -4.02452897564 0.00329996303 -1.20791476641 0.006 -0.000 -0.003 C -4.73391255267 0.00451580118 -0.00020876193 0.000 0.001 -0.007 C -4.02924140493 0.00399189729 1.20660077672 -0.006 -0.000 -0.003 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 -0.000 -0.021 N -0.43839318333 -0.00054206762 -2.12229806799 -0.007 0.000 -0.004 C -1.76408906064 -0.00030645034 -2.37697009192 -0.007 0.000 0.004 C -2.24773885821 -0.00257631963 -3.67934971086 -0.001 0.000 -0.001 C -1.33713102227 -0.00526459193 -4.73855802198 0.004 -0.000 0.001 C 0.02654101484 -0.00591797621 -4.46472703619 0.005 0.000 -0.003 C 0.43371721952 -0.00363389350 -3.13225443930 -0.004 -0.000 -0.002 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 -0.000 0.001 N 2.00981687167 0.00259443239 -0.00000686048 0.000 -0.000 0.076 C 2.67119656792 1.17263645248 0.00045766926 0.000 -0.000 -0.194 C 4.06129317470 1.20536051565 0.00241240325 0.000 0.000 -0.199 C 4.76783866331 0.00148799420 0.00346798881 -0.001 0.000 0.718 C 4.05723810074 -1.20352939940 0.00211502115 0.000 0.000 -0.203 C 2.67108506586 -1.17139122066 0.00026591651 0.000 -0.000 -0.197 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 0.000 0.132 C 2.33938959521 3.68993217240 -0.00584554905 -0.000 0.000 0.044 C 1.45736908622 4.77231118002 -0.00917967851 0.000 -0.000 -0.084 C 0.08658913130 4.53522926787 -0.00833235387 0.000 0.000 0.129 C -0.35359617412 3.21325694137 -0.00400174376 0.000 -0.000 -0.120 N 0.49290585413 2.18198449515 -0.00068475564 -0.000 0.000 0.100 S 6.56718562933 -0.11349126889 0.00673479967 0.000 -0.000 -0.070 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 -0.000 0.135 C 2.33969079820 -3.68709653410 -0.00625612120 -0.000 -0.000 0.044 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 0.000 -0.085 C 0.08684213972 -4.53272927032 -0.00840538011 0.000 -0.000 0.133 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 0.000 -0.123 N 0.49225266031 -2.17934076887 -0.00084210065 -0.000 0.000 0.102 H 1.83694111827 5.77332096953 -0.01265611066 0.000 -0.000 -0.097 H -0.61802819388 5.33967450634 -0.01131742088 0.000 0.000 0.041 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 -0.000 -0.021 H -1.39787683933 2.98334799634 -0.00369736757 0.000 -0.000 -0.136 H 1.83794742242 -5.77033326187 -0.01295832570 0.000 0.000 -0.099 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 -0.000 0.042 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 0.000 -0.140 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 0.000 -0.022 H 4.58301895157 2.13678100538 0.00314824260 0.000 -0.000 -0.232 H 4.58784714512 -2.12983634010 0.00211631073 0.001 0.000 -0.242 H -1.68997263563 -0.00719388386 -5.74925805817 0.001 -0.000 0.000 H 0.75224758084 -0.00860493512 -5.25016290812 0.002 0.000 -0.000 H -3.29620044300 -0.00255800648 -3.88456579214 0.000 -0.000 -0.003 H 1.47161249279 -0.00457826661 -2.87685200854 -0.001 -0.000 0.001 H -1.69176120521 -0.00597000955 5.75026973076 -0.001 -0.000 0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.002 0.000 -0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.001 -0.000 0.001 H -3.29750276746 -0.00099200484 3.88584245085 -0.000 -0.000 -0.003 H -4.55513299541 0.00377930937 -2.13473279421 0.005 -0.000 -0.003 H -4.55107479454 0.00501307822 2.13844314827 -0.005 -0.000 -0.003 H -6.83436893102 0.00806057203 1.19721860356 0.004 -0.000 0.001 H 6.86748209639 1.20005966818 0.00372860376 -0.001 0.000 -0.064 61 Mode 57: freq=664.95 N -0.44003451495 -0.00038510790 2.12369783068 -0.000 -0.100 0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.000 -0.130 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.000 -0.046 -0.000 C -1.33887502024 -0.00450793845 4.73956848945 0.000 0.083 0.000 C 0.02462671625 -0.00591801736 4.46614405978 -0.000 -0.129 -0.000 C 0.43187566201 -0.00376957955 3.13352499014 0.000 0.119 0.000 C -2.63984642995 0.00218980399 1.17162612704 0.000 0.196 -0.000 N -1.98513620489 0.00132140951 0.00153900685 -0.000 -0.079 0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.000 0.199 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 0.000 0.203 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 -0.001 -0.718 0.000 C -4.02924140493 0.00399189729 1.20660077672 0.000 0.199 -0.000 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.022 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 -0.103 0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 -0.133 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 -0.000 -0.046 0.000 C -1.33713102227 -0.00526459193 -4.73855802198 0.000 0.085 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 0.000 -0.132 0.000 C 0.43371721952 -0.00363389350 -3.13225443930 0.000 0.122 -0.000 S -6.53329279136 0.00637481657 -0.11611178087 0.000 0.070 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 -0.014 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.002 -0.012 -0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.007 0.003 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.000 0.007 0.001 C 4.05723810074 -1.20352939940 0.00211502115 0.007 0.003 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.002 -0.012 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.007 -0.004 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.000 0.002 0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.004 0.001 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.005 0.003 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.005 0.002 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.007 0.003 0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 -0.001 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.007 -0.004 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.000 0.002 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.004 0.001 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.005 0.003 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.005 0.002 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.007 0.003 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.001 0.000 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.002 0.000 0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 0.003 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.002 -0.001 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.001 0.000 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.002 0.000 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.002 -0.001 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.000 0.003 0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.005 0.003 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.005 0.003 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.000 0.099 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 -0.041 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 0.023 -0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 0.139 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 0.000 0.097 0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.000 -0.040 -0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.000 0.135 0.000 H -3.29750276746 -0.00099200484 3.88584245085 0.000 0.022 0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.000 0.241 -0.000 H -4.55107479454 0.00501307822 2.13844314827 0.000 0.231 -0.000 H -6.83436893102 0.00806057203 1.19721860356 0.000 0.064 -0.000 H 6.86748209639 1.20005966818 0.00372860376 0.004 -0.001 -0.000 61 Mode 58: freq=696.79 N -0.44003451495 -0.00038510790 2.12369783068 0.056 0.000 -0.248 C -1.76594470239 0.00039861437 2.37754210613 0.092 -0.000 -0.001 C -2.24923313135 -0.00145267054 3.67997125809 0.165 -0.000 0.081 C -1.33887502024 -0.00450793845 4.73956848945 -0.053 -0.001 0.283 C 0.02462671625 -0.00591801736 4.46614405978 -0.137 0.000 -0.007 C 0.43187566201 -0.00376957955 3.13352499014 -0.168 0.000 -0.064 C -2.63984642995 0.00218980399 1.17162612704 0.019 -0.000 0.035 N -1.98513620489 0.00132140951 0.00153900685 -0.007 0.000 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.016 0.000 -0.034 C -4.02452897564 0.00329996303 -1.20791476641 0.017 0.000 -0.024 C -4.73391255267 0.00451580118 -0.00020876193 0.034 -0.000 0.001 C -4.02924140493 0.00399189729 1.20660077672 0.021 0.000 0.025 Co 0.00000000000 0.00000000000 0.00000000000 0.033 -0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.055 0.000 0.244 C -1.76408906064 -0.00030645034 -2.37697009192 0.090 -0.000 0.003 C -2.24773885821 -0.00257631963 -3.67934971086 0.164 -0.000 -0.079 C -1.33713102227 -0.00526459193 -4.73855802198 -0.051 -0.000 -0.279 C 0.02654101484 -0.00591797621 -4.46472703619 -0.134 0.000 0.005 C 0.43371721952 -0.00363389350 -3.13225443930 -0.166 0.000 0.062 S -6.53329279136 0.00637481657 -0.11611178087 -0.033 0.000 -0.002 N 2.00981687167 0.00259443239 -0.00000686048 -0.007 0.000 -0.000 C 2.67119656792 1.17263645248 0.00045766926 0.009 -0.034 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.009 -0.025 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.024 -0.000 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.006 0.025 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.006 0.033 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.091 0.004 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.166 -0.078 0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.056 -0.275 0.001 C 0.08658913130 4.53522926787 -0.00833235387 -0.131 0.004 0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.164 0.063 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.063 0.244 -0.001 S 6.56718562933 -0.11349126889 0.00673479967 -0.023 0.001 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.088 -0.006 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.164 0.076 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.054 0.268 0.001 C 0.08684213972 -4.53272927032 -0.00840538011 -0.127 -0.003 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.161 -0.060 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.062 -0.239 -0.001 H 1.83694111827 5.77332096953 -0.01265611066 -0.024 -0.078 0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.022 0.054 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.040 0.027 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.036 -0.037 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.024 0.076 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.022 -0.053 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.036 0.037 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.039 -0.026 -0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.003 -0.005 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.004 0.004 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.020 -0.000 -0.080 H 0.75224758084 -0.00860493512 -5.25016290812 0.020 0.000 0.056 H -3.29620044300 -0.00255800648 -3.88456579214 0.038 0.000 0.026 H 1.47161249279 -0.00457826661 -2.87685200854 -0.035 0.000 -0.037 H -1.69176120521 -0.00597000955 5.75026973076 -0.020 -0.000 0.081 H 0.75025791005 -0.00892914887 5.25161119224 0.020 0.000 -0.058 H 1.46975366817 -0.00523069331 2.87805400798 -0.036 -0.000 0.037 H -3.29750276746 -0.00099200484 3.88584245085 0.038 0.000 -0.026 H -4.55513299541 0.00377930937 -2.13473279421 -0.001 0.000 -0.004 H -4.55107479454 0.00501307822 2.13844314827 0.001 0.000 0.005 H -6.83436893102 0.00806057203 1.19721860356 -0.003 0.000 0.001 H 6.86748209639 1.20005966818 0.00372860376 -0.002 -0.000 -0.000 61 Mode 59: freq=707.89 N -0.44003451495 -0.00038510790 2.12369783068 -0.004 -0.004 0.019 C -1.76594470239 0.00039861437 2.37754210613 -0.008 -0.002 0.001 C -2.24923313135 -0.00145267054 3.67997125809 -0.013 0.001 -0.005 C -1.33887502024 -0.00450793845 4.73956848945 0.004 -0.003 -0.021 C 0.02462671625 -0.00591801736 4.46614405978 0.010 0.002 0.001 C 0.43187566201 -0.00376957955 3.13352499014 0.013 -0.004 0.005 C -2.63984642995 0.00218980399 1.17162612704 -0.001 0.003 -0.002 N -1.98513620489 0.00132140951 0.00153900685 0.001 0.002 0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.001 0.003 0.002 C -4.02452897564 0.00329996303 -1.20791476641 -0.001 -0.001 0.002 C -4.73391255267 0.00451580118 -0.00020876193 -0.003 0.001 0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.002 -0.001 -0.002 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 -0.047 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.004 -0.004 -0.017 C -1.76408906064 -0.00030645034 -2.37697009192 -0.007 -0.002 -0.001 C -2.24773885821 -0.00257631963 -3.67934971086 -0.013 0.001 0.005 C -1.33713102227 -0.00526459193 -4.73855802198 0.004 -0.003 0.019 C 0.02654101484 -0.00591797621 -4.46472703619 0.009 0.002 -0.001 C 0.43371721952 -0.00363389350 -3.13225443930 0.012 -0.004 -0.005 S -6.53329279136 0.00637481657 -0.11611178087 0.002 0.000 0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.003 0.034 0.000 C 2.67119656792 1.17263645248 0.00045766926 0.033 -0.010 0.002 C 4.06129317470 1.20536051565 0.00241240325 0.050 0.028 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.004 0.024 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.047 0.032 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.031 -0.005 -0.002 C 1.82209539371 2.39842937406 -0.00175320633 0.131 0.035 -0.001 C 2.33938959521 3.68993217240 -0.00584554905 0.271 -0.094 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.068 -0.398 0.002 C 0.08658913130 4.53522926787 -0.00833235387 -0.178 -0.004 -0.001 C -0.35359617412 3.21325694137 -0.00400174376 -0.260 0.089 0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.076 0.351 -0.001 S 6.56718562933 -0.11349126889 0.00673479967 -0.002 0.007 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.119 0.035 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.251 -0.085 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.062 -0.366 -0.002 C 0.08684213972 -4.53272927032 -0.00840538011 0.161 -0.007 0.001 C -0.35393854068 -3.21111942258 -0.00398541364 0.241 0.080 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.068 0.322 0.001 H 1.83694111827 5.77332096953 -0.01265611066 -0.039 -0.110 0.001 H -0.61802819388 5.33967450634 -0.01131742088 0.041 0.080 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.066 0.043 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.060 -0.051 0.001 H 1.83794742242 -5.77033326187 -0.01295832570 0.036 -0.101 -0.001 H -0.61749414542 -5.33746053721 -0.01121572048 -0.038 0.073 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.055 -0.047 -0.001 H 3.39230213722 -3.86796714602 -0.00754158092 -0.062 0.039 0.000 H 4.58301895157 2.13678100538 0.00314824260 0.014 0.008 -0.001 H 4.58784714512 -2.12983634010 0.00211631073 -0.015 0.008 0.001 H -1.68997263563 -0.00719388386 -5.74925805817 0.002 0.000 0.005 H 0.75224758084 -0.00860493512 -5.25016290812 -0.002 0.004 -0.004 H -3.29620044300 -0.00255800648 -3.88456579214 -0.003 0.003 -0.002 H 1.47161249279 -0.00457826661 -2.87685200854 0.003 0.001 0.002 H -1.69176120521 -0.00597000955 5.75026973076 0.002 -0.000 -0.006 H 0.75025791005 -0.00892914887 5.25161119224 -0.002 0.004 0.005 H 1.46975366817 -0.00523069331 2.87805400798 0.003 0.001 -0.003 H -3.29750276746 -0.00099200484 3.88584245085 -0.003 0.003 0.002 H -4.55513299541 0.00377930937 -2.13473279421 0.000 -0.002 0.000 H -4.55107479454 0.00501307822 2.13844314827 -0.000 -0.002 -0.000 H -6.83436893102 0.00806057203 1.19721860356 0.000 -0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 0.001 0.001 -0.000 61 Mode 60: freq=709.67 N -0.44003451495 -0.00038510790 2.12369783068 0.054 0.000 -0.252 C -1.76594470239 0.00039861437 2.37754210613 0.103 -0.000 -0.016 C -2.24923313135 -0.00145267054 3.67997125809 0.186 -0.000 0.065 C -1.33887502024 -0.00450793845 4.73956848945 -0.052 -0.001 0.282 C 0.02462671625 -0.00591801736 4.46614405978 -0.139 0.000 -0.014 C 0.43187566201 -0.00376957955 3.13352499014 -0.178 0.000 -0.071 C -2.63984642995 0.00218980399 1.17162612704 0.019 0.000 0.032 N -1.98513620489 0.00132140951 0.00153900685 -0.014 0.000 -0.002 C -2.63911589169 0.00167522827 -1.17277445342 0.013 0.000 -0.029 C -4.02452897564 0.00329996303 -1.20791476641 0.014 0.000 -0.026 C -4.73391255267 0.00451580118 -0.00020876193 0.037 -0.000 -0.001 C -4.02924140493 0.00399189729 1.20660077672 0.023 0.000 0.024 Co 0.00000000000 0.00000000000 0.00000000000 0.010 -0.003 0.003 N -0.43839318333 -0.00054206762 -2.12229806799 0.048 -0.000 0.221 C -1.76408906064 -0.00030645034 -2.37697009192 0.090 -0.000 0.015 C -2.24773885821 -0.00257631963 -3.67934971086 0.164 -0.000 -0.056 C -1.33713102227 -0.00526459193 -4.73855802198 -0.045 -0.001 -0.246 C 0.02654101484 -0.00591797621 -4.46472703619 -0.121 0.000 0.012 C 0.43371721952 -0.00363389350 -3.13225443930 -0.156 0.000 0.062 S -6.53329279136 0.00637481657 -0.11611178087 -0.032 0.000 -0.002 N 2.00981687167 0.00259443239 -0.00000686048 0.014 0.002 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.020 0.032 -0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.023 0.029 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.042 0.002 -0.001 C 4.05723810074 -1.20352939940 0.00211502115 -0.025 -0.024 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.020 -0.032 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.093 -0.008 0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.157 0.062 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.053 0.243 -0.001 C 0.08658913130 4.53522926787 -0.00833235387 0.122 -0.020 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.150 -0.067 0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.055 -0.219 0.001 S 6.56718562933 -0.11349126889 0.00673479967 0.037 -0.002 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.109 0.016 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.196 -0.072 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.060 -0.294 -0.001 C 0.08684213972 -4.53272927032 -0.00840538011 0.143 0.016 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.186 0.077 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.064 0.265 0.001 H 1.83694111827 5.77332096953 -0.01265611066 0.022 0.069 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.020 -0.055 0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.037 -0.029 0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.033 0.030 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.028 -0.082 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.026 0.064 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.042 -0.037 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.047 0.035 0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.001 0.006 0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.001 -0.004 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.021 -0.000 -0.069 H 0.75224758084 -0.00860493512 -5.25016290812 0.020 0.000 0.055 H -3.29620044300 -0.00255800648 -3.88456579214 0.039 0.000 0.030 H 1.47161249279 -0.00457826661 -2.87685200854 -0.034 0.000 -0.031 H -1.69176120521 -0.00597000955 5.75026973076 -0.024 -0.000 0.080 H 0.75025791005 -0.00892914887 5.25161119224 0.023 0.000 -0.063 H 1.46975366817 -0.00523069331 2.87805400798 -0.038 0.000 0.036 H -3.29750276746 -0.00099200484 3.88584245085 0.043 0.000 -0.034 H -4.55513299541 0.00377930937 -2.13473279421 -0.002 -0.000 -0.005 H -4.55107479454 0.00501307822 2.13844314827 0.001 0.000 0.004 H -6.83436893102 0.00806057203 1.19721860356 -0.002 0.000 0.001 H 6.86748209639 1.20005966818 0.00372860376 0.003 0.001 0.000 61 Mode 61: freq=711.74 N -0.44003451495 -0.00038510790 2.12369783068 0.060 0.001 -0.323 C -1.76594470239 0.00039861437 2.37754210613 0.122 0.000 -0.041 C -2.24923313135 -0.00145267054 3.67997125809 0.260 0.000 0.072 C -1.33887502024 -0.00450793845 4.73956848945 -0.054 -0.001 0.367 C 0.02462671625 -0.00591801736 4.46614405978 -0.165 0.001 0.006 C 0.43187566201 -0.00376957955 3.13352499014 -0.245 0.000 -0.079 C -2.63984642995 0.00218980399 1.17162612704 0.028 -0.001 0.008 N -1.98513620489 0.00132140951 0.00153900685 -0.001 -0.000 -0.029 C -2.63911589169 0.00167522827 -1.17277445342 -0.030 0.001 0.010 C -4.02452897564 0.00329996303 -1.20791476641 -0.045 -0.000 -0.027 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 -0.000 -0.024 C -4.02924140493 0.00399189729 1.20660077672 0.043 0.000 -0.028 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 0.000 0.062 N -0.43839318333 -0.00054206762 -2.12229806799 -0.065 -0.001 -0.347 C -1.76408906064 -0.00030645034 -2.37697009192 -0.132 -0.000 -0.044 C -2.24773885821 -0.00257631963 -3.67934971086 -0.279 -0.000 0.078 C -1.33713102227 -0.00526459193 -4.73855802198 0.058 0.001 0.394 C 0.02654101484 -0.00591797621 -4.46472703619 0.178 -0.001 0.005 C 0.43371721952 -0.00363389350 -3.13225443930 0.263 0.000 -0.085 S -6.53329279136 0.00637481657 -0.11611178087 0.002 -0.000 -0.006 N 2.00981687167 0.00259443239 -0.00000686048 -0.001 -0.000 -0.004 C 2.67119656792 1.17263645248 0.00045766926 0.001 -0.001 -0.005 C 4.06129317470 1.20536051565 0.00241240325 0.001 -0.001 0.002 C 4.76783866331 0.00148799420 0.00346798881 0.002 -0.000 -0.005 C 4.05723810074 -1.20352939940 0.00211502115 0.001 0.001 0.003 C 2.67108506586 -1.17139122066 0.00026591651 0.001 0.001 -0.005 C 1.82209539371 2.39842937406 -0.00175320633 0.004 0.000 0.002 C 2.33938959521 3.68993217240 -0.00584554905 0.007 -0.003 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.002 -0.010 0.002 C 0.08658913130 4.53522926787 -0.00833235387 -0.005 0.001 -0.001 C -0.35359617412 3.21325694137 -0.00400174376 -0.007 0.003 0.003 N 0.49290585413 2.18198449515 -0.00068475564 0.002 0.009 0.003 S 6.56718562933 -0.11349126889 0.00673479967 -0.002 0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.004 -0.001 0.002 C 2.33969079820 -3.68709653410 -0.00625612120 0.008 0.003 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.002 0.011 0.002 C 0.08684213972 -4.53272927032 -0.00840538011 -0.006 -0.001 -0.001 C -0.35393854068 -3.21111942258 -0.00398541364 -0.007 -0.003 0.003 N 0.49225266031 -2.17934076887 -0.00084210065 0.002 -0.010 0.003 H 1.83694111827 5.77332096953 -0.01265611066 -0.001 -0.003 -0.001 H -0.61802819388 5.33967450634 -0.01131742088 0.001 0.002 -0.003 H 3.39175422949 3.87200638269 -0.00704552340 0.002 0.001 -0.003 H -1.39787683933 2.98334799634 -0.00369736757 -0.001 -0.001 -0.001 H 1.83794742242 -5.77033326187 -0.01295832570 -0.001 0.003 -0.001 H -0.61749414542 -5.33746053721 -0.01121572048 0.001 -0.003 -0.003 H -1.39833026435 -2.98175334118 -0.00345676225 -0.002 0.001 -0.001 H 3.39230213722 -3.86796714602 -0.00754158092 0.002 -0.001 -0.003 H 4.58301895157 2.13678100538 0.00314824260 0.000 -0.000 0.005 H 4.58784714512 -2.12983634010 0.00211631073 0.000 0.000 0.005 H -1.68997263563 -0.00719388386 -5.74925805817 0.037 0.001 0.109 H 0.75224758084 -0.00860493512 -5.25016290812 -0.038 -0.000 -0.082 H -3.29620044300 -0.00255800648 -3.88456579214 -0.067 0.000 -0.047 H 1.47161249279 -0.00457826661 -2.87685200854 0.059 0.001 0.051 H -1.69176120521 -0.00597000955 5.75026973076 -0.035 -0.001 0.101 H 0.75025791005 -0.00892914887 5.25161119224 0.036 0.000 -0.076 H 1.46975366817 -0.00523069331 2.87805400798 -0.055 -0.001 0.047 H -3.29750276746 -0.00099200484 3.88584245085 0.063 -0.000 -0.044 H -4.55513299541 0.00377930937 -2.13473279421 -0.012 -0.000 -0.008 H -4.55107479454 0.00501307822 2.13844314827 0.011 0.000 -0.008 H -6.83436893102 0.00806057203 1.19721860356 0.002 0.000 -0.001 H 6.86748209639 1.20005966818 0.00372860376 -0.000 -0.000 0.000 61 Mode 62: freq=722.64 N -0.44003451495 -0.00038510790 2.12369783068 0.001 0.129 0.001 C -1.76594470239 0.00039861437 2.37754210613 0.001 0.061 0.002 C -2.24923313135 -0.00145267054 3.67997125809 -0.002 0.132 0.001 C -1.33887502024 -0.00450793845 4.73956848945 -0.001 -0.100 -0.001 C 0.02462671625 -0.00591801736 4.46614405978 -0.000 0.151 -0.001 C 0.43187566201 -0.00376957955 3.13352499014 0.002 -0.121 -0.001 C -2.63984642995 0.00218980399 1.17162612704 0.001 -0.442 0.001 N -1.98513620489 0.00132140951 0.00153900685 -0.000 0.002 0.001 C -2.63911589169 0.00167522827 -1.17277445342 -0.001 0.441 0.001 C -4.02452897564 0.00329996303 -1.20791476641 -0.001 -0.074 -0.001 C -4.73391255267 0.00451580118 -0.00020876193 0.000 0.004 -0.000 C -4.02924140493 0.00399189729 1.20660077672 0.001 0.068 -0.001 Co 0.00000000000 0.00000000000 0.00000000000 0.000 -0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.001 -0.128 0.001 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 -0.061 0.001 C -2.24773885821 -0.00257631963 -3.67934971086 0.002 -0.130 0.001 C -1.33713102227 -0.00526459193 -4.73855802198 0.001 0.099 -0.001 C 0.02654101484 -0.00591797621 -4.46472703619 0.000 -0.150 -0.001 C 0.43371721952 -0.00363389350 -3.13225443930 -0.002 0.121 -0.001 S -6.53329279136 0.00637481657 -0.11611178087 0.000 -0.005 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 -0.001 -0.001 C 2.67119656792 1.17263645248 0.00045766926 0.001 -0.001 0.276 C 4.06129317470 1.20536051565 0.00241240325 0.001 0.001 -0.042 C 4.76783866331 0.00148799420 0.00346798881 -0.000 0.000 -0.002 C 4.05723810074 -1.20352939940 0.00211502115 -0.001 0.001 0.046 C 2.67108506586 -1.17139122066 0.00026591651 -0.001 -0.001 -0.275 C 1.82209539371 2.39842937406 -0.00175320633 0.000 -0.001 -0.036 C 2.33938959521 3.68993217240 -0.00584554905 -0.001 -0.001 -0.085 C 1.45736908622 4.77231118002 -0.00917967851 -0.000 0.001 0.063 C 0.08658913130 4.53522926787 -0.00833235387 -0.000 0.001 -0.094 C -0.35359617412 3.21325694137 -0.00400174376 0.002 0.001 0.074 N 0.49290585413 2.18198449515 -0.00068475564 0.001 -0.001 -0.077 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.000 0.003 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 -0.001 0.036 C 2.33969079820 -3.68709653410 -0.00625612120 0.001 -0.001 0.083 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 0.001 -0.063 C 0.08684213972 -4.53272927032 -0.00840538011 0.000 0.001 0.094 C -0.35393854068 -3.21111942258 -0.00398541364 -0.001 0.001 -0.074 N 0.49225266031 -2.17934076887 -0.00084210065 -0.001 -0.001 0.077 H 1.83694111827 5.77332096953 -0.01265611066 0.000 0.000 0.097 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 0.000 -0.007 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 0.000 0.019 H -1.39787683933 2.98334799634 -0.00369736757 0.000 0.000 0.102 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 0.000 -0.096 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 0.000 0.007 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 0.000 -0.102 H 3.39230213722 -3.86796714602 -0.00754158092 0.000 0.000 -0.019 H 4.58301895157 2.13678100538 0.00314824260 0.000 0.000 -0.098 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 0.000 0.096 H -1.68997263563 -0.00719388386 -5.74925805817 -0.000 0.153 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 0.000 -0.010 -0.000 H -3.29620044300 -0.00255800648 -3.88456579214 0.001 0.032 -0.000 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 0.163 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 0.000 -0.154 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.000 0.010 -0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.000 -0.164 -0.000 H -3.29750276746 -0.00099200484 3.88584245085 -0.001 -0.033 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 -0.000 -0.153 -0.000 H -4.55107479454 0.00501307822 2.13844314827 0.000 0.157 -0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.000 0.024 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.000 -0.000 -0.015 61 Mode 63: freq=726.16 N -0.44003451495 -0.00038510790 2.12369783068 -0.001 -0.084 -0.001 C -1.76594470239 0.00039861437 2.37754210613 -0.001 -0.044 -0.002 C -2.24923313135 -0.00145267054 3.67997125809 0.002 -0.078 -0.001 C -1.33887502024 -0.00450793845 4.73956848945 0.001 0.058 0.001 C 0.02462671625 -0.00591801736 4.46614405978 0.001 -0.091 0.002 C 0.43187566201 -0.00376957955 3.13352499014 -0.002 0.077 0.001 C -2.63984642995 0.00218980399 1.17162612704 -0.001 0.277 -0.001 N -1.98513620489 0.00132140951 0.00153900685 0.000 -0.001 -0.001 C -2.63911589169 0.00167522827 -1.17277445342 0.001 -0.276 -0.001 C -4.02452897564 0.00329996303 -1.20791476641 0.002 0.044 0.001 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 -0.002 0.001 C -4.02924140493 0.00399189729 1.20660077672 -0.002 -0.041 0.001 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 -0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.001 0.084 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 0.001 0.044 -0.002 C -2.24773885821 -0.00257631963 -3.67934971086 -0.002 0.077 -0.001 C -1.33713102227 -0.00526459193 -4.73855802198 -0.001 -0.058 0.000 C 0.02654101484 -0.00591797621 -4.46472703619 -0.001 0.090 0.002 C 0.43371721952 -0.00363389350 -3.13225443930 0.002 -0.077 0.001 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 0.003 0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 -0.001 -0.002 C 2.67119656792 1.17263645248 0.00045766926 0.002 -0.002 0.445 C 4.06129317470 1.20536051565 0.00241240325 0.003 0.002 -0.065 C 4.76783866331 0.00148799420 0.00346798881 0.000 0.001 -0.003 C 4.05723810074 -1.20352939940 0.00211502115 -0.003 0.002 0.071 C 2.67108506586 -1.17139122066 0.00026591651 -0.002 -0.002 -0.444 C 1.82209539371 2.39842937406 -0.00175320633 0.002 -0.004 -0.066 C 2.33938959521 3.68993217240 -0.00584554905 -0.004 -0.002 -0.129 C 1.45736908622 4.77231118002 -0.00917967851 -0.002 0.001 0.095 C 0.08658913130 4.53522926787 -0.00833235387 -0.002 0.003 -0.146 C -0.35359617412 3.21325694137 -0.00400174376 0.004 0.002 0.120 N 0.49290585413 2.18198449515 -0.00068475564 0.002 -0.001 -0.131 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.000 0.005 C 1.82142022278 -2.39594383179 -0.00206827421 -0.001 -0.004 0.066 C 2.33969079820 -3.68709653410 -0.00625612120 0.004 -0.002 0.127 C 1.45789786198 -4.76953179608 -0.00945089783 0.002 0.001 -0.094 C 0.08684213972 -4.53272927032 -0.00840538011 0.002 0.003 0.145 C -0.35393854068 -3.21111942258 -0.00398541364 -0.004 0.002 -0.120 N 0.49225266031 -2.17934076887 -0.00084210065 -0.002 -0.001 0.131 H 1.83694111827 5.77332096953 -0.01265611066 0.001 0.000 0.152 H -0.61802819388 5.33967450634 -0.01131742088 -0.001 0.001 -0.007 H 3.39175422949 3.87200638269 -0.00704552340 -0.001 0.000 0.038 H -1.39787683933 2.98334799634 -0.00369736757 0.001 0.001 0.162 H 1.83794742242 -5.77033326187 -0.01295832570 -0.001 0.000 -0.151 H -0.61749414542 -5.33746053721 -0.01121572048 0.001 0.001 0.008 H -1.39833026435 -2.98175334118 -0.00345676225 -0.001 0.001 -0.161 H 3.39230213722 -3.86796714602 -0.00754158092 0.001 0.000 -0.038 H 4.58301895157 2.13678100538 0.00314824260 0.001 0.001 -0.161 H 4.58784714512 -2.12983634010 0.00211631073 -0.001 0.001 0.156 H -1.68997263563 -0.00719388386 -5.74925805817 0.000 -0.093 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.001 0.005 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.001 -0.025 0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 -0.100 0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.000 0.094 0.000 H 0.75025791005 -0.00892914887 5.25161119224 0.001 -0.005 0.000 H 1.46975366817 -0.00523069331 2.87805400798 -0.000 0.100 0.000 H -3.29750276746 -0.00099200484 3.88584245085 0.001 0.025 0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.000 0.097 0.000 H -4.55107479454 0.00501307822 2.13844314827 -0.000 -0.100 0.000 H -6.83436893102 0.00806057203 1.19721860356 0.000 -0.015 0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.000 0.000 -0.024 61 Mode 64: freq=731.79 N -0.44003451495 -0.00038510790 2.12369783068 -0.126 0.002 0.006 C -1.76594470239 0.00039861437 2.37754210613 -0.128 0.001 -0.232 C -2.24923313135 -0.00145267054 3.67997125809 0.216 0.001 -0.167 C -1.33887502024 -0.00450793845 4.73956848945 0.131 -0.001 -0.036 C 0.02462671625 -0.00591801736 4.46614405978 0.146 0.001 0.256 C 0.43187566201 -0.00376957955 3.13352499014 -0.199 -0.001 0.130 C -2.63984642995 0.00218980399 1.17162612704 -0.218 -0.004 -0.149 N -1.98513620489 0.00132140951 0.00153900685 0.004 -0.000 -0.065 C -2.63911589169 0.00167522827 -1.17277445342 0.220 0.004 -0.143 C -4.02452897564 0.00329996303 -1.20791476641 0.232 -0.001 0.163 C -4.73391255267 0.00451580118 -0.00020876193 -0.006 0.000 0.086 C -4.02924140493 0.00399189729 1.20660077672 -0.231 0.001 0.155 Co 0.00000000000 0.00000000000 0.00000000000 -0.001 -0.000 -0.023 N -0.43839318333 -0.00054206762 -2.12229806799 0.126 -0.001 0.011 C -1.76408906064 -0.00030645034 -2.37697009192 0.129 -0.001 -0.228 C -2.24773885821 -0.00257631963 -3.67934971086 -0.209 -0.001 -0.167 C -1.33713102227 -0.00526459193 -4.73855802198 -0.130 0.001 -0.042 C 0.02654101484 -0.00591797621 -4.46472703619 -0.146 -0.001 0.252 C 0.43371721952 -0.00363389350 -3.13225443930 0.193 0.001 0.130 S -6.53329279136 0.00637481657 -0.11611178087 -0.003 -0.000 0.027 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 -0.001 -0.002 C 2.67119656792 1.17263645248 0.00045766926 0.002 -0.002 0.003 C 4.06129317470 1.20536051565 0.00241240325 0.002 0.001 -0.006 C 4.76783866331 0.00148799420 0.00346798881 0.000 0.001 0.013 C 4.05723810074 -1.20352939940 0.00211502115 -0.002 0.002 -0.007 C 2.67108506586 -1.17139122066 0.00026591651 -0.002 -0.001 0.006 C 1.82209539371 2.39842937406 -0.00175320633 0.001 -0.003 0.004 C 2.33938959521 3.68993217240 -0.00584554905 -0.003 -0.002 -0.003 C 1.45736908622 4.77231118002 -0.00917967851 -0.001 0.000 0.002 C 0.08658913130 4.53522926787 -0.00833235387 -0.001 0.003 -0.002 C -0.35359617412 3.21325694137 -0.00400174376 0.003 0.001 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.001 -0.000 0.002 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.000 -0.001 C 1.82142022278 -2.39594383179 -0.00206827421 -0.001 -0.002 0.004 C 2.33969079820 -3.68709653410 -0.00625612120 0.001 -0.001 -0.004 C 1.45789786198 -4.76953179608 -0.00945089783 0.001 -0.001 0.003 C 0.08684213972 -4.53272927032 -0.00840538011 0.001 0.002 -0.003 C -0.35393854068 -3.21111942258 -0.00398541364 -0.001 0.001 0.001 N 0.49225266031 -2.17934076887 -0.00084210065 -0.001 0.001 0.001 H 1.83694111827 5.77332096953 -0.01265611066 0.001 -0.000 0.002 H -0.61802819388 5.33967450634 -0.01131742088 -0.001 0.000 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.001 -0.000 -0.002 H -1.39787683933 2.98334799634 -0.00369736757 0.001 0.000 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 -0.001 0.003 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 0.001 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 -0.000 0.002 H 3.39230213722 -3.86796714602 -0.00754158092 0.001 0.000 -0.001 H 4.58301895157 2.13678100538 0.00314824260 0.000 0.001 -0.007 H 4.58784714512 -2.12983634010 0.00211631073 -0.001 0.001 -0.008 H -1.68997263563 -0.00719388386 -5.74925805817 0.055 0.001 -0.045 H 0.75224758084 -0.00860493512 -5.25016290812 -0.061 0.000 0.057 H -3.29620044300 -0.00255800648 -3.88456579214 -0.071 0.000 0.002 H 1.47161249279 -0.00457826661 -2.87685200854 0.065 0.002 0.001 H -1.69176120521 -0.00597000955 5.75026973076 -0.057 -0.001 -0.044 H 0.75025791005 -0.00892914887 5.25161119224 0.063 -0.000 0.057 H 1.46975366817 -0.00523069331 2.87805400798 -0.067 -0.002 0.002 H -3.29750276746 -0.00099200484 3.88584245085 0.073 -0.001 0.002 H -4.55513299541 0.00377930937 -2.13473279421 0.048 -0.002 0.059 H -4.55107479454 0.00501307822 2.13844314827 -0.043 0.002 0.060 H -6.83436893102 0.00806057203 1.19721860356 0.015 0.000 0.008 H 6.86748209639 1.20005966818 0.00372860376 -0.000 0.000 -0.001 61 Mode 65: freq=731.85 N -0.44003451495 -0.00038510790 2.12369783068 -0.001 -0.002 0.001 C -1.76594470239 0.00039861437 2.37754210613 -0.001 -0.004 -0.002 C -2.24923313135 -0.00145267054 3.67997125809 0.001 0.003 -0.002 C -1.33887502024 -0.00450793845 4.73956848945 0.001 -0.002 -0.001 C 0.02462671625 -0.00591801736 4.46614405978 0.002 0.002 0.002 C 0.43187566201 -0.00376957955 3.13352499014 -0.001 0.000 0.001 C -2.63984642995 0.00218980399 1.17162612704 -0.002 -0.002 -0.001 N -1.98513620489 0.00132140951 0.00153900685 -0.000 0.001 -0.001 C -2.63911589169 0.00167522827 -1.17277445342 0.002 -0.006 -0.002 C -4.02452897564 0.00329996303 -1.20791476641 0.002 0.007 0.002 C -4.73391255267 0.00451580118 -0.00020876193 0.000 -0.013 0.001 C -4.02924140493 0.00399189729 1.20660077672 -0.002 0.006 0.002 Co 0.00000000000 0.00000000000 0.00000000000 -0.001 0.020 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.001 -0.001 -0.001 C -1.76408906064 -0.00030645034 -2.37697009192 0.001 -0.004 -0.003 C -2.24773885821 -0.00257631963 -3.67934971086 -0.003 0.004 -0.002 C -1.33713102227 -0.00526459193 -4.73855802198 -0.001 -0.003 0.000 C 0.02654101484 -0.00591797621 -4.46472703619 -0.001 0.003 0.003 C 0.43371721952 -0.00363389350 -3.13225443930 0.003 -0.001 0.001 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 0.001 0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.004 0.067 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.217 0.151 0.007 C 4.06129317470 1.20536051565 0.00241240325 -0.232 -0.156 -0.001 C 4.76783866331 0.00148799420 0.00346798881 -0.006 -0.085 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.232 -0.163 0.001 C 2.67108506586 -1.17139122066 0.00026591651 0.219 0.145 -0.007 C 1.82209539371 2.39842937406 -0.00175320633 -0.123 0.235 -0.002 C 2.33938959521 3.68993217240 -0.00584554905 0.221 0.161 -0.003 C 1.45736908622 4.77231118002 -0.00917967851 0.132 0.030 0.001 C 0.08658913130 4.53522926787 -0.00833235387 0.138 -0.258 -0.002 C -0.35359617412 3.21325694137 -0.00400174376 -0.205 -0.123 0.002 N 0.49290585413 2.18198449515 -0.00068475564 -0.126 -0.001 -0.002 S 6.56718562933 -0.11349126889 0.00673479967 -0.003 -0.027 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.123 0.231 0.002 C 2.33969079820 -3.68709653410 -0.00625612120 -0.214 0.160 0.003 C 1.45789786198 -4.76953179608 -0.00945089783 -0.131 0.036 -0.001 C 0.08684213972 -4.53272927032 -0.00840538011 -0.138 -0.255 0.002 C -0.35393854068 -3.21111942258 -0.00398541364 0.198 -0.123 -0.002 N 0.49225266031 -2.17934076887 -0.00084210065 0.126 -0.006 0.002 H 1.83694111827 5.77332096953 -0.01265611066 -0.055 0.044 0.002 H -0.61802819388 5.33967450634 -0.01131742088 0.062 -0.057 0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.074 -0.004 0.001 H -1.39787683933 2.98334799634 -0.00369736757 -0.068 -0.001 0.003 H 1.83794742242 -5.77033326187 -0.01295832570 0.054 0.046 -0.002 H -0.61749414542 -5.33746053721 -0.01121572048 -0.060 -0.058 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.066 0.000 -0.003 H 3.39230213722 -3.86796714602 -0.00754158092 -0.072 -0.004 -0.001 H 4.58301895157 2.13678100538 0.00314824260 -0.043 -0.060 -0.003 H 4.58784714512 -2.12983634010 0.00211631073 0.048 -0.059 0.002 H -1.68997263563 -0.00719388386 -5.74925805817 0.001 -0.003 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.001 0.000 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.001 0.001 -0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.001 -0.002 0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.000 -0.002 -0.001 H 0.75025791005 -0.00892914887 5.25161119224 0.000 0.000 0.001 H 1.46975366817 -0.00523069331 2.87805400798 -0.000 -0.000 -0.000 H -3.29750276746 -0.00099200484 3.88584245085 0.000 0.002 0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.000 0.008 0.001 H -4.55107479454 0.00501307822 2.13844314827 -0.000 0.006 0.001 H -6.83436893102 0.00806057203 1.19721860356 0.000 0.001 0.000 H 6.86748209639 1.20005966818 0.00372860376 0.015 -0.008 -0.000 61 Mode 66: freq=759.85 N -0.44003451495 -0.00038510790 2.12369783068 0.098 -0.000 0.009 C -1.76594470239 0.00039861437 2.37754210613 0.075 -0.000 0.136 C -2.24923313135 -0.00145267054 3.67997125809 -0.139 -0.000 0.107 C -1.33887502024 -0.00450793845 4.73956848945 -0.082 0.000 0.019 C 0.02462671625 -0.00591801736 4.46614405978 -0.083 0.000 -0.148 C 0.43187566201 -0.00376957955 3.13352499014 0.160 -0.000 -0.063 C -2.63984642995 0.00218980399 1.17162612704 0.011 0.000 0.111 N -1.98513620489 0.00132140951 0.00153900685 -0.103 0.000 0.001 C -2.63911589169 0.00167522827 -1.17277445342 0.014 -0.000 -0.112 C -4.02452897564 0.00329996303 -1.20791476641 -0.004 0.000 -0.091 C -4.73391255267 0.00451580118 -0.00020876193 0.082 -0.000 0.001 C -4.02924140493 0.00399189729 1.20660077672 -0.006 0.000 0.094 Co 0.00000000000 0.00000000000 0.00000000000 -0.004 -0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.100 0.000 -0.008 C -1.76408906064 -0.00030645034 -2.37697009192 0.077 -0.000 -0.139 C -2.24773885821 -0.00257631963 -3.67934971086 -0.141 -0.000 -0.109 C -1.33713102227 -0.00526459193 -4.73855802198 -0.083 0.000 -0.021 C 0.02654101484 -0.00591797621 -4.46472703619 -0.086 0.000 0.151 C 0.43371721952 -0.00363389350 -3.13225443930 0.162 -0.000 0.064 S -6.53329279136 0.00637481657 -0.11611178087 -0.049 0.000 -0.002 N 2.00981687167 0.00259443239 -0.00000686048 0.140 0.001 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.018 0.152 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.004 0.128 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.117 0.002 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.001 -0.123 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.021 -0.154 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.103 0.188 -0.001 C 2.33938959521 3.68993217240 -0.00584554905 0.188 0.141 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.114 0.026 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.112 -0.209 0.001 C -0.35359617412 3.21325694137 -0.00400174376 -0.215 -0.083 0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.132 0.011 0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.070 -0.002 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.105 -0.192 -0.001 C 2.33969079820 -3.68709653410 -0.00625612120 0.192 -0.144 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.117 -0.029 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.115 0.213 0.001 C -0.35393854068 -3.21111942258 -0.00398541364 -0.219 0.085 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.136 -0.010 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.048 0.039 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.059 -0.038 0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.062 0.001 0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.070 0.008 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.049 -0.040 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.060 0.040 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.072 -0.009 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.063 -0.001 -0.000 H 4.58301895157 2.13678100538 0.00314824260 0.044 0.014 0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.045 -0.011 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.037 -0.000 -0.028 H 0.75224758084 -0.00860493512 -5.25016290812 -0.045 0.000 0.026 H -3.29620044300 -0.00255800648 -3.88456579214 -0.047 0.000 -0.003 H 1.47161249279 -0.00457826661 -2.87685200854 0.053 -0.000 -0.004 H -1.69176120521 -0.00597000955 5.75026973076 0.037 -0.000 0.027 H 0.75025791005 -0.00892914887 5.25161119224 -0.044 0.000 -0.025 H 1.46975366817 -0.00523069331 2.87805400798 0.052 -0.000 0.004 H -3.29750276746 -0.00099200484 3.88584245085 -0.046 0.000 0.003 H -4.55513299541 0.00377930937 -2.13473279421 -0.033 0.000 -0.009 H -4.55107479454 0.00501307822 2.13844314827 -0.033 0.000 0.011 H -6.83436893102 0.00806057203 1.19721860356 -0.006 -0.000 0.001 H 6.86748209639 1.20005966818 0.00372860376 0.008 0.001 0.000 61 Mode 67: freq=763.87 N -0.44003451495 -0.00038510790 2.12369783068 -0.134 0.000 -0.012 C -1.76594470239 0.00039861437 2.37754210613 -0.102 0.001 -0.184 C -2.24923313135 -0.00145267054 3.67997125809 0.189 0.000 -0.148 C -1.33887502024 -0.00450793845 4.73956848945 0.110 -0.000 -0.026 C 0.02462671625 -0.00591801736 4.46614405978 0.113 -0.001 0.206 C 0.43187566201 -0.00376957955 3.13352499014 -0.217 0.000 0.086 C -2.63984642995 0.00218980399 1.17162612704 -0.009 -0.000 -0.150 N -1.98513620489 0.00132140951 0.00153900685 0.141 -0.000 -0.001 C -2.63911589169 0.00167522827 -1.17277445342 -0.012 0.000 0.151 C -4.02452897564 0.00329996303 -1.20791476641 0.015 -0.000 0.126 C -4.73391255267 0.00451580118 -0.00020876193 -0.107 0.000 -0.001 C -4.02924140493 0.00399189729 1.20660077672 0.018 -0.000 -0.129 Co 0.00000000000 0.00000000000 0.00000000000 -0.063 -0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.136 -0.000 0.011 C -1.76408906064 -0.00030645034 -2.37697009192 -0.104 0.001 0.187 C -2.24773885821 -0.00257631963 -3.67934971086 0.192 0.000 0.151 C -1.33713102227 -0.00526459193 -4.73855802198 0.112 0.000 0.028 C 0.02654101484 -0.00591797621 -4.46472703619 0.115 -0.001 -0.209 C 0.43371721952 -0.00363389350 -3.13225443930 -0.220 0.000 -0.087 S -6.53329279136 0.00637481657 -0.11611178087 0.059 -0.000 0.002 N 2.00981687167 0.00259443239 -0.00000686048 0.101 0.001 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.008 0.109 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.011 0.093 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.080 0.001 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.009 -0.090 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.009 -0.110 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.071 0.137 -0.001 C 2.33938959521 3.68993217240 -0.00584554905 0.143 0.105 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.082 0.014 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.078 -0.154 0.001 C -0.35359617412 3.21325694137 -0.00400174376 -0.161 -0.058 0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.096 0.013 0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.045 -0.001 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.073 -0.139 -0.001 C 2.33969079820 -3.68709653410 -0.00625612120 0.145 -0.107 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.083 -0.015 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.079 0.156 0.001 C -0.35393854068 -3.21111942258 -0.00398541364 -0.163 0.059 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.098 -0.012 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.037 0.027 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.043 -0.027 0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.047 0.003 0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.053 0.008 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.038 -0.028 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.044 0.028 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.054 -0.008 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.047 -0.003 -0.000 H 4.58301895157 2.13678100538 0.00314824260 0.035 0.010 0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.035 -0.008 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.053 0.000 0.038 H 0.75224758084 -0.00860493512 -5.25016290812 0.060 -0.000 -0.037 H -3.29620044300 -0.00255800648 -3.88456579214 0.064 -0.000 0.005 H 1.47161249279 -0.00457826661 -2.87685200854 -0.073 0.000 0.009 H -1.69176120521 -0.00597000955 5.75026973076 -0.052 0.000 -0.037 H 0.75025791005 -0.00892914887 5.25161119224 0.059 -0.000 0.036 H 1.46975366817 -0.00523069331 2.87805400798 -0.072 0.000 -0.009 H -3.29750276746 -0.00099200484 3.88584245085 0.063 -0.000 -0.005 H -4.55513299541 0.00377930937 -2.13473279421 0.049 -0.000 0.012 H -4.55107479454 0.00501307822 2.13844314827 0.049 -0.000 -0.014 H -6.83436893102 0.00806057203 1.19721860356 0.008 0.000 -0.001 H 6.86748209639 1.20005966818 0.00372860376 0.006 0.001 0.000 61 Mode 68: freq=850.59 N -0.44003451495 -0.00038510790 2.12369783068 -0.000 -0.176 -0.000 C -1.76594470239 0.00039861437 2.37754210613 0.000 0.207 0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.000 -0.154 -0.001 C -1.33887502024 -0.00450793845 4.73956848945 0.000 0.056 -0.000 C 0.02462671625 -0.00591801736 4.46614405978 -0.000 -0.132 0.000 C 0.43187566201 -0.00376957955 3.13352499014 0.000 0.079 0.000 C -2.63984642995 0.00218980399 1.17162612704 0.000 0.344 0.001 N -1.98513620489 0.00132140951 0.00153900685 -0.001 -0.431 0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.001 0.343 0.000 C -4.02452897564 0.00329996303 -1.20791476641 0.001 -0.135 0.000 C -4.73391255267 0.00451580118 -0.00020876193 0.000 0.174 -0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.001 -0.122 0.000 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.033 -0.002 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 -0.192 0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 0.222 -0.001 C -2.24773885821 -0.00257631963 -3.67934971086 -0.001 -0.157 -0.000 C -1.33713102227 -0.00526459193 -4.73855802198 -0.000 0.066 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 -0.000 -0.137 0.001 C 0.43371721952 -0.00363389350 -3.13225443930 0.000 0.089 0.000 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 0.002 0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 -0.004 0.030 C 2.67119656792 1.17263645248 0.00045766926 -0.003 -0.005 -0.025 C 4.06129317470 1.20536051565 0.00241240325 -0.010 -0.002 0.008 C 4.76783866331 0.00148799420 0.00346798881 -0.000 0.001 -0.012 C 4.05723810074 -1.20352939940 0.00211502115 0.010 -0.002 0.009 C 2.67108506586 -1.17139122066 0.00026591651 0.003 -0.006 -0.024 C 1.82209539371 2.39842937406 -0.00175320633 0.004 0.001 -0.012 C 2.33938959521 3.68993217240 -0.00584554905 0.007 0.006 0.010 C 1.45736908622 4.77231118002 -0.00917967851 0.000 0.001 -0.002 C 0.08658913130 4.53522926787 -0.00833235387 0.001 -0.006 0.009 C -0.35359617412 3.21325694137 -0.00400174376 -0.001 -0.001 -0.004 N 0.49290585413 2.18198449515 -0.00068475564 -0.001 -0.001 0.010 S 6.56718562933 -0.11349126889 0.00673479967 -0.001 -0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.004 0.002 -0.017 C 2.33969079820 -3.68709653410 -0.00625612120 -0.007 0.006 0.011 C 1.45789786198 -4.76953179608 -0.00945089783 -0.000 0.002 -0.006 C 0.08684213972 -4.53272927032 -0.00840538011 -0.001 -0.006 0.010 C -0.35393854068 -3.21111942258 -0.00398541364 0.001 -0.001 -0.007 N 0.49225266031 -2.17934076887 -0.00084210065 0.001 -0.002 0.014 H 1.83694111827 5.77332096953 -0.01265611066 -0.003 0.002 -0.012 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 -0.002 -0.007 H 3.39175422949 3.87200638269 -0.00704552340 0.002 0.003 -0.004 H -1.39787683933 2.98334799634 -0.00369736757 -0.001 0.003 -0.011 H 1.83794742242 -5.77033326187 -0.01295832570 0.003 0.002 -0.009 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 -0.002 -0.002 H -1.39833026435 -2.98175334118 -0.00345676225 0.001 0.003 -0.011 H 3.39230213722 -3.86796714602 -0.00754158092 -0.002 0.003 0.002 H 4.58301895157 2.13678100538 0.00314824260 -0.004 0.000 0.020 H 4.58784714512 -2.12983634010 0.00211631073 0.004 0.000 0.018 H -1.68997263563 -0.00719388386 -5.74925805817 0.000 0.148 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 0.000 0.052 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 -0.007 -0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 0.161 -0.001 H -1.69176120521 -0.00597000955 5.75026973076 0.000 0.153 0.000 H 0.75025791005 -0.00892914887 5.25161119224 0.000 0.065 0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.000 0.158 0.000 H -3.29750276746 -0.00099200484 3.88584245085 0.000 0.010 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 -0.000 -0.255 0.000 H -4.55107479454 0.00501307822 2.13844314827 -0.001 -0.272 0.000 H -6.83436893102 0.00806057203 1.19721860356 0.000 -0.003 0.000 H 6.86748209639 1.20005966818 0.00372860376 0.004 -0.001 0.000 61 Mode 69: freq=850.67 N -0.44003451495 -0.00038510790 2.12369783068 -0.001 0.014 0.002 C -1.76594470239 0.00039861437 2.37754210613 0.003 -0.017 -0.001 C -2.24923313135 -0.00145267054 3.67997125809 0.005 0.011 -0.006 C -1.33887502024 -0.00450793845 4.73956848945 0.000 -0.005 -0.002 C 0.02462671625 -0.00591801736 4.46614405978 0.002 0.010 0.007 C 0.43187566201 -0.00376957955 3.13352499014 0.001 -0.007 0.002 C -2.63984642995 0.00218980399 1.17162612704 -0.003 -0.023 0.005 N -1.98513620489 0.00132140951 0.00153900685 0.000 0.030 0.003 C -2.63911589169 0.00167522827 -1.17277445342 0.003 -0.025 0.005 C -4.02452897564 0.00329996303 -1.20791476641 0.009 0.009 0.002 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 -0.012 -0.001 C -4.02924140493 0.00399189729 1.20660077672 -0.010 0.009 0.002 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 -0.002 -0.033 N -0.43839318333 -0.00054206762 -2.12229806799 0.001 0.012 0.002 C -1.76408906064 -0.00030645034 -2.37697009192 -0.003 -0.014 -0.001 C -2.24773885821 -0.00257631963 -3.67934971086 -0.006 0.011 -0.006 C -1.33713102227 -0.00526459193 -4.73855802198 -0.000 -0.003 -0.002 C 0.02654101484 -0.00591797621 -4.46472703619 -0.002 0.009 0.007 C 0.43371721952 -0.00363389350 -3.13225443930 -0.001 -0.005 0.002 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 -0.000 0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 0.000 0.438 C 2.67119656792 1.17263645248 0.00045766926 0.001 0.000 -0.349 C 4.06129317470 1.20536051565 0.00241240325 0.000 0.000 0.118 C 4.76783866331 0.00148799420 0.00346798881 0.000 -0.000 -0.168 C 4.05723810074 -1.20352939940 0.00211502115 -0.001 0.000 0.132 C 2.67108506586 -1.17139122066 0.00026591651 0.000 0.001 -0.348 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 -0.001 -0.198 C 2.33938959521 3.68993217240 -0.00584554905 -0.001 -0.000 0.155 C 1.45736908622 4.77231118002 -0.00917967851 -0.000 -0.000 -0.051 C 0.08658913130 4.53522926787 -0.00833235387 -0.000 0.001 0.129 C -0.35359617412 3.21325694137 -0.00400174376 0.000 -0.000 -0.074 N 0.49290585413 2.18198449515 -0.00068475564 0.000 0.001 0.164 S 6.56718562933 -0.11349126889 0.00673479967 0.000 0.000 -0.002 C 1.82142022278 -2.39594383179 -0.00206827421 0.000 0.001 -0.217 C 2.33969079820 -3.68709653410 -0.00625612120 0.000 -0.001 0.158 C 1.45789786198 -4.76953179608 -0.00945089783 -0.000 0.000 -0.066 C 0.08684213972 -4.53272927032 -0.00840538011 -0.000 -0.000 0.136 C -0.35393854068 -3.21111942258 -0.00398541364 0.000 0.000 -0.089 N 0.49225266031 -2.17934076887 -0.00084210065 0.000 -0.000 0.186 H 1.83694111827 5.77332096953 -0.01265611066 0.000 -0.001 -0.157 H -0.61802819388 5.33967450634 -0.01131742088 0.000 -0.000 -0.070 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 -0.000 -0.020 H -1.39787683933 2.98334799634 -0.00369736757 0.000 -0.001 -0.156 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 0.000 -0.149 H -0.61749414542 -5.33746053721 -0.01121572048 -0.000 0.000 -0.051 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 0.000 -0.158 H 3.39230213722 -3.86796714602 -0.00754158092 0.000 -0.000 0.004 H 4.58301895157 2.13678100538 0.00314824260 -0.000 0.000 0.278 H 4.58784714512 -2.12983634010 0.00211631073 -0.001 -0.000 0.259 H -1.68997263563 -0.00719388386 -5.74925805817 0.003 -0.011 -0.002 H 0.75224758084 -0.00860493512 -5.25016290812 0.001 -0.006 0.003 H -3.29620044300 -0.00255800648 -3.88456579214 -0.002 -0.002 -0.002 H 1.47161249279 -0.00457826661 -2.87685200854 0.001 -0.011 -0.003 H -1.69176120521 -0.00597000955 5.75026973076 -0.003 -0.010 -0.002 H 0.75025791005 -0.00892914887 5.25161119224 -0.001 -0.002 0.003 H 1.46975366817 -0.00523069331 2.87805400798 -0.001 -0.011 -0.003 H -3.29750276746 -0.00099200484 3.88584245085 0.002 0.002 -0.002 H -4.55513299541 0.00377930937 -2.13473279421 0.004 0.018 -0.000 H -4.55107479454 0.00501307822 2.13844314827 -0.004 0.018 -0.000 H -6.83436893102 0.00806057203 1.19721860356 0.004 0.000 0.001 H 6.86748209639 1.20005966818 0.00372860376 -0.000 0.000 0.003 61 Mode 70: freq=859.24 N -0.44003451495 -0.00038510790 2.12369783068 -0.001 -0.148 0.000 C -1.76594470239 0.00039861437 2.37754210613 0.001 0.140 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.002 -0.020 -0.001 C -1.33887502024 -0.00450793845 4.73956848945 0.000 0.110 -0.000 C 0.02462671625 -0.00591801736 4.46614405978 -0.000 -0.032 -0.000 C 0.43187566201 -0.00376957955 3.13352499014 -0.002 0.108 -0.000 C -2.63984642995 0.00218980399 1.17162612704 0.001 -0.039 0.001 N -1.98513620489 0.00132140951 0.00153900685 0.000 -0.003 0.001 C -2.63911589169 0.00167522827 -1.17277445342 -0.001 0.043 0.001 C -4.02452897564 0.00329996303 -1.20791476641 -0.001 0.012 -0.001 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 0.006 -0.000 C -4.02924140493 0.00399189729 1.20660077672 0.001 -0.022 -0.001 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.001 -0.002 N -0.43839318333 -0.00054206762 -2.12229806799 0.001 0.120 0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.001 -0.114 -0.000 C -2.24773885821 -0.00257631963 -3.67934971086 -0.002 0.015 -0.001 C -1.33713102227 -0.00526459193 -4.73855802198 -0.000 -0.092 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 0.000 0.024 -0.000 C 0.43371721952 -0.00363389350 -3.13225443930 0.002 -0.090 -0.000 S -6.53329279136 0.00637481657 -0.11611178087 0.000 -0.001 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 -0.000 -0.018 C 2.67119656792 1.17263645248 0.00045766926 0.000 -0.000 0.082 C 4.06129317470 1.20536051565 0.00241240325 0.000 0.000 0.051 C 4.76783866331 0.00148799420 0.00346798881 0.000 0.000 -0.025 C 4.05723810074 -1.20352939940 0.00211502115 -0.000 0.000 -0.014 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 -0.000 -0.044 C 1.82209539371 2.39842937406 -0.00175320633 0.000 -0.001 -0.288 C 2.33938959521 3.68993217240 -0.00584554905 0.000 0.000 0.037 C 1.45736908622 4.77231118002 -0.00917967851 0.000 -0.001 -0.238 C 0.08658913130 4.53522926787 -0.00833235387 0.000 0.000 0.069 C -0.35359617412 3.21325694137 -0.00400174376 -0.000 -0.001 -0.235 N 0.49290585413 2.18198449515 -0.00068475564 -0.000 0.001 0.327 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.000 0.004 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 -0.000 0.139 C 2.33969079820 -3.68709653410 -0.00625612120 -0.000 0.000 -0.017 C 1.45789786198 -4.76953179608 -0.00945089783 -0.000 -0.000 0.115 C 0.08684213972 -4.53272927032 -0.00840538011 -0.000 0.000 -0.031 C -0.35393854068 -3.21111942258 -0.00398541364 0.000 -0.000 0.114 N 0.49225266031 -2.17934076887 -0.00084210065 0.000 0.000 -0.152 H 1.83694111827 5.77332096953 -0.01265611066 -0.000 0.001 0.181 H -0.61802819388 5.33967450634 -0.01131742088 0.000 0.001 0.344 H 3.39175422949 3.87200638269 -0.00704552340 0.000 0.001 0.387 H -1.39787683933 2.98334799634 -0.00369736757 -0.000 0.000 0.016 H 1.83794742242 -5.77033326187 -0.01295832570 0.000 0.000 -0.091 H -0.61749414542 -5.33746053721 -0.01121572048 -0.000 0.001 -0.170 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 0.000 -0.013 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 0.001 -0.187 H 4.58301895157 2.13678100538 0.00314824260 0.000 -0.000 -0.091 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 0.000 0.036 H -1.68997263563 -0.00719388386 -5.74925805817 0.001 0.073 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 0.136 -0.001 H -3.29620044300 -0.00255800648 -3.88456579214 -0.001 0.150 -0.001 H 1.47161249279 -0.00457826661 -2.87685200854 0.001 0.010 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.001 -0.081 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.000 -0.158 -0.001 H 1.46975366817 -0.00523069331 2.87805400798 -0.001 -0.006 -0.000 H -3.29750276746 -0.00099200484 3.88584245085 0.000 -0.178 -0.001 H -4.55513299541 0.00377930937 -2.13473279421 -0.000 -0.034 -0.000 H -4.55107479454 0.00501307822 2.13844314827 0.000 0.038 -0.000 H -6.83436893102 0.00806057203 1.19721860356 0.000 0.003 -0.000 H 6.86748209639 1.20005966818 0.00372860376 0.000 -0.000 -0.003 61 Mode 71: freq=860.67 N -0.44003451495 -0.00038510790 2.12369783068 -0.002 0.061 0.001 C -1.76594470239 0.00039861437 2.37754210613 0.004 -0.056 -0.002 C -2.24923313135 -0.00145267054 3.67997125809 0.006 0.008 -0.003 C -1.33887502024 -0.00450793845 4.73956848945 0.000 -0.045 -0.001 C 0.02462671625 -0.00591801736 4.46614405978 -0.001 0.013 -0.002 C 0.43187566201 -0.00376957955 3.13352499014 -0.006 -0.044 -0.002 C -2.63984642995 0.00218980399 1.17162612704 0.003 0.016 0.003 N -1.98513620489 0.00132140951 0.00153900685 0.000 -0.000 0.004 C -2.63911589169 0.00167522827 -1.17277445342 -0.003 -0.015 0.003 C -4.02452897564 0.00329996303 -1.20791476641 -0.003 -0.005 -0.002 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 -0.002 -0.001 C -4.02924140493 0.00399189729 1.20660077672 0.003 0.009 -0.002 Co 0.00000000000 0.00000000000 0.00000000000 0.000 -0.000 -0.003 N -0.43839318333 -0.00054206762 -2.12229806799 0.002 -0.047 0.001 C -1.76408906064 -0.00030645034 -2.37697009192 -0.004 0.044 -0.002 C -2.24773885821 -0.00257631963 -3.67934971086 -0.006 -0.006 -0.003 C -1.33713102227 -0.00526459193 -4.73855802198 -0.000 0.036 -0.001 C 0.02654101484 -0.00591797621 -4.46472703619 0.001 -0.009 -0.002 C 0.43371721952 -0.00363389350 -3.13225443930 0.006 0.035 -0.002 S -6.53329279136 0.00637481657 -0.11611178087 0.000 0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 0.000 -0.112 C 2.67119656792 1.17263645248 0.00045766926 -0.000 0.000 0.089 C 4.06129317470 1.20536051565 0.00241240325 -0.000 -0.000 0.034 C 4.76783866331 0.00148799420 0.00346798881 0.000 -0.000 -0.060 C 4.05723810074 -1.20352939940 0.00211502115 0.000 0.000 0.043 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 0.000 0.129 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 -0.001 -0.163 C 2.33938959521 3.68993217240 -0.00584554905 -0.000 -0.000 0.008 C 1.45736908622 4.77231118002 -0.00917967851 -0.000 -0.001 -0.149 C 0.08658913130 4.53522926787 -0.00833235387 0.000 0.000 0.032 C -0.35359617412 3.21325694137 -0.00400174376 0.000 -0.000 -0.145 N 0.49290585413 2.18198449515 -0.00068475564 0.000 0.001 0.202 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.000 0.009 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 0.001 -0.282 C 2.33969079820 -3.68709653410 -0.00625612120 0.000 -0.000 0.026 C 1.45789786198 -4.76953179608 -0.00945089783 -0.000 0.001 -0.245 C 0.08684213972 -4.53272927032 -0.00840538011 0.000 -0.000 0.058 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 0.001 -0.240 N 0.49225266031 -2.17934076887 -0.00084210065 -0.000 -0.001 0.331 H 1.83694111827 5.77332096953 -0.01265611066 0.000 0.000 0.131 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 0.001 0.227 H 3.39175422949 3.87200638269 -0.00704552340 0.000 0.001 0.250 H -1.39787683933 2.98334799634 -0.00369736757 0.000 0.000 0.022 H 1.83794742242 -5.77033326187 -0.01295832570 0.000 -0.001 0.205 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 -0.001 0.368 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 -0.000 0.033 H 3.39230213722 -3.86796714602 -0.00754158092 0.000 -0.001 0.403 H 4.58301895157 2.13678100538 0.00314824260 0.000 -0.000 -0.101 H 4.58784714512 -2.12983634010 0.00211631073 0.000 0.000 -0.122 H -1.68997263563 -0.00719388386 -5.74925805817 0.001 -0.028 -0.001 H 0.75224758084 -0.00860493512 -5.25016290812 -0.001 -0.053 -0.001 H -3.29620044300 -0.00255800648 -3.88456579214 -0.002 -0.058 -0.002 H 1.47161249279 -0.00457826661 -2.87685200854 0.002 -0.004 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.001 0.034 -0.001 H 0.75025791005 -0.00892914887 5.25161119224 0.001 0.065 -0.001 H 1.46975366817 -0.00523069331 2.87805400798 -0.002 0.003 -0.000 H -3.29750276746 -0.00099200484 3.88584245085 0.002 0.073 -0.002 H -4.55513299541 0.00377930937 -2.13473279421 -0.000 0.012 -0.001 H -4.55107479454 0.00501307822 2.13844314827 0.000 -0.016 -0.001 H -6.83436893102 0.00806057203 1.19721860356 -0.000 -0.001 -0.000 H 6.86748209639 1.20005966818 0.00372860376 0.000 -0.000 0.009 61 Mode 72: freq=864.32 N -0.44003451495 -0.00038510790 2.12369783068 -0.001 -0.344 -0.001 C -1.76594470239 0.00039861437 2.37754210613 0.000 0.281 0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.000 -0.021 -0.000 C -1.33887502024 -0.00450793845 4.73956848945 0.000 0.246 0.000 C 0.02462671625 -0.00591801736 4.46614405978 -0.000 -0.054 -0.000 C 0.43187566201 -0.00376957955 3.13352499014 0.000 0.237 0.000 C -2.63984642995 0.00218980399 1.17162612704 0.000 -0.125 0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 0.112 0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.000 -0.093 0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.000 -0.024 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 0.000 0.056 -0.000 C -4.02924140493 0.00399189729 1.20660077672 0.000 -0.051 0.000 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.006 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 -0.193 0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 0.157 -0.000 C -2.24773885821 -0.00257631963 -3.67934971086 -0.000 -0.009 -0.000 C -1.33713102227 -0.00526459193 -4.73855802198 0.000 0.141 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 0.000 -0.026 -0.000 C 0.43371721952 -0.00363389350 -3.13225443930 0.000 0.136 -0.000 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 -0.009 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 -0.005 -0.005 C 2.67119656792 1.17263645248 0.00045766926 0.003 -0.003 -0.009 C 4.06129317470 1.20536051565 0.00241240325 0.003 0.002 -0.008 C 4.76783866331 0.00148799420 0.00346798881 -0.000 0.001 -0.001 C 4.05723810074 -1.20352939940 0.00211502115 -0.003 0.002 0.008 C 2.67108506586 -1.17139122066 0.00026591651 -0.003 -0.003 0.018 C 1.82209539371 2.39842937406 -0.00175320633 0.004 0.002 0.044 C 2.33938959521 3.68993217240 -0.00584554905 0.006 0.003 -0.005 C 1.45736908622 4.77231118002 -0.00917967851 0.000 0.001 0.037 C 0.08658913130 4.53522926787 -0.00833235387 -0.001 0.001 -0.010 C -0.35359617412 3.21325694137 -0.00400174376 -0.006 0.002 0.036 N 0.49290585413 2.18198449515 -0.00068475564 -0.003 -0.001 -0.053 S 6.56718562933 -0.11349126889 0.00673479967 0.000 0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.004 0.002 -0.053 C 2.33969079820 -3.68709653410 -0.00625612120 -0.006 0.003 0.005 C 1.45789786198 -4.76953179608 -0.00945089783 -0.001 0.001 -0.046 C 0.08684213972 -4.53272927032 -0.00840538011 0.001 0.001 0.011 C -0.35393854068 -3.21111942258 -0.00398541364 0.006 0.002 -0.045 N 0.49225266031 -2.17934076887 -0.00084210065 0.003 -0.001 0.065 H 1.83694111827 5.77332096953 -0.01265611066 -0.001 0.001 -0.028 H -0.61802819388 5.33967450634 -0.01131742088 0.001 0.001 -0.052 H 3.39175422949 3.87200638269 -0.00704552340 0.002 0.002 -0.059 H -1.39787683933 2.98334799634 -0.00369736757 -0.002 0.001 -0.002 H 1.83794742242 -5.77033326187 -0.01295832570 0.001 0.001 0.038 H -0.61749414542 -5.33746053721 -0.01121572048 -0.001 0.001 0.069 H -1.39833026435 -2.98175334118 -0.00345676225 0.002 0.001 0.005 H 3.39230213722 -3.86796714602 -0.00754158092 -0.002 0.002 0.075 H 4.58301895157 2.13678100538 0.00314824260 0.000 0.001 0.011 H 4.58784714512 -2.12983634010 0.00211631073 -0.001 0.001 -0.017 H -1.68997263563 -0.00719388386 -5.74925805817 -0.000 -0.129 0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 -0.220 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 -0.237 0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 -0.023 0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.000 -0.212 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.001 -0.371 -0.001 H 1.46975366817 -0.00523069331 2.87805400798 -0.000 -0.028 -0.000 H -3.29750276746 -0.00099200484 3.88584245085 -0.000 -0.410 -0.001 H -4.55513299541 0.00377930937 -2.13473279421 0.000 0.089 -0.000 H -4.55107479454 0.00501307822 2.13844314827 0.000 0.137 -0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.000 -0.006 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.001 0.000 0.001 61 Mode 73: freq=865.63 N -0.44003451495 -0.00038510790 2.12369783068 0.000 0.163 0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.000 -0.141 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.000 0.022 0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.000 -0.110 -0.000 C 0.02462671625 -0.00591801736 4.46614405978 0.000 0.034 0.000 C 0.43187566201 -0.00376957955 3.13352499014 0.000 -0.108 -0.000 C -2.63984642995 0.00218980399 1.17162612704 -0.000 0.019 -0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 0.045 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.000 -0.106 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 0.000 -0.037 0.000 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 0.014 0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.000 0.022 0.000 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.002 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 -0.333 0.001 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 0.278 -0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 -0.027 0.000 C -1.33713102227 -0.00526459193 -4.73855802198 0.000 0.237 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 -0.000 -0.054 0.000 C 0.43371721952 -0.00363389350 -3.13225443930 -0.000 0.230 -0.000 S -6.53329279136 0.00637481657 -0.11611178087 0.000 -0.002 0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 -0.002 0.010 C 2.67119656792 1.17263645248 0.00045766926 0.001 -0.001 0.022 C 4.06129317470 1.20536051565 0.00241240325 0.001 0.001 0.020 C 4.76783866331 0.00148799420 0.00346798881 -0.000 0.000 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.001 0.001 -0.018 C 2.67108506586 -1.17139122066 0.00026591651 -0.001 -0.001 -0.041 C 1.82209539371 2.39842937406 -0.00175320633 0.001 0.000 -0.107 C 2.33938959521 3.68993217240 -0.00584554905 0.002 0.001 0.012 C 1.45736908622 4.77231118002 -0.00917967851 0.000 0.000 -0.091 C 0.08658913130 4.53522926787 -0.00833235387 -0.000 0.001 0.025 C -0.35359617412 3.21325694137 -0.00400174376 -0.002 0.000 -0.090 N 0.49290585413 2.18198449515 -0.00068475564 -0.001 0.000 0.135 S 6.56718562933 -0.11349126889 0.00673479967 0.000 0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.001 0.000 0.124 C 2.33969079820 -3.68709653410 -0.00625612120 -0.002 0.001 -0.012 C 1.45789786198 -4.76953179608 -0.00945089783 -0.000 0.000 0.108 C 0.08684213972 -4.53272927032 -0.00840538011 0.000 0.001 -0.026 C -0.35393854068 -3.21111942258 -0.00398541364 0.002 0.000 0.107 N 0.49225266031 -2.17934076887 -0.00084210065 0.001 0.000 -0.156 H 1.83694111827 5.77332096953 -0.01265611066 -0.000 0.000 0.071 H -0.61802819388 5.33967450634 -0.01131742088 0.000 0.001 0.130 H 3.39175422949 3.87200638269 -0.00704552340 0.001 0.001 0.147 H -1.39787683933 2.98334799634 -0.00369736757 -0.001 0.000 0.004 H 1.83794742242 -5.77033326187 -0.01295832570 0.000 0.001 -0.091 H -0.61749414542 -5.33746053721 -0.01121572048 -0.000 0.001 -0.162 H -1.39833026435 -2.98175334118 -0.00345676225 0.001 0.000 -0.011 H 3.39230213722 -3.86796714602 -0.00754158092 -0.001 0.001 -0.177 H 4.58301895157 2.13678100538 0.00314824260 0.000 0.000 -0.028 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 0.000 0.041 H -1.68997263563 -0.00719388386 -5.74925805817 -0.000 -0.199 0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 -0.354 0.001 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 -0.388 0.001 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 -0.025 0.000 H -1.69176120521 -0.00597000955 5.75026973076 0.000 0.079 0.000 H 0.75025791005 -0.00892914887 5.25161119224 0.000 0.153 0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.000 -0.000 0.000 H -3.29750276746 -0.00099200484 3.88584245085 0.000 0.176 0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.000 0.097 0.000 H -4.55107479454 0.00501307822 2.13844314827 -0.000 -0.019 0.000 H -6.83436893102 0.00806057203 1.19721860356 0.000 -0.007 0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.000 0.000 -0.003 61 Mode 74: freq=887.91 N -0.44003451495 -0.00038510790 2.12369783068 0.084 -0.000 -0.026 C -1.76594470239 0.00039861437 2.37754210613 -0.004 0.000 0.015 C -2.24923313135 -0.00145267054 3.67997125809 -0.049 -0.000 0.058 C -1.33887502024 -0.00450793845 4.73956848945 -0.025 -0.000 0.070 C 0.02462671625 -0.00591801736 4.46614405978 -0.028 -0.000 -0.030 C 0.43187566201 -0.00376957955 3.13352499014 0.100 -0.000 -0.013 C -2.63984642995 0.00218980399 1.17162612704 -0.029 -0.000 -0.110 N -1.98513620489 0.00132140951 0.00153900685 0.159 -0.000 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.026 -0.000 0.101 C -4.02452897564 0.00329996303 -1.20791476641 -0.078 0.000 0.196 C -4.73391255267 0.00451580118 -0.00020876193 -0.306 0.000 -0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.090 -0.000 -0.209 Co 0.00000000000 0.00000000000 0.00000000000 -0.046 -0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.078 0.000 0.025 C -1.76408906064 -0.00030645034 -2.37697009192 -0.004 0.000 -0.014 C -2.24773885821 -0.00257631963 -3.67934971086 -0.045 -0.000 -0.054 C -1.33713102227 -0.00526459193 -4.73855802198 -0.024 -0.000 -0.064 C 0.02654101484 -0.00591797621 -4.46472703619 -0.026 -0.000 0.027 C 0.43371721952 -0.00363389350 -3.13225443930 0.094 -0.000 0.011 S -6.53329279136 0.00637481657 -0.11611178087 0.135 -0.000 0.012 N 2.00981687167 0.00259443239 -0.00000686048 0.235 -0.001 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.045 0.152 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.141 0.290 -0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.446 0.001 -0.001 C 4.05723810074 -1.20352939940 0.00211502115 -0.123 -0.269 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.042 -0.141 0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.003 -0.022 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.064 -0.080 0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.041 -0.103 0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.045 0.053 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.143 0.021 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.122 0.034 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.198 -0.018 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.003 0.020 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.059 0.075 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.039 0.094 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.042 -0.050 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.134 -0.018 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.115 -0.033 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.028 -0.046 0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.020 0.009 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.024 -0.006 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.050 -0.026 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.025 0.043 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.019 -0.008 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.047 0.025 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.022 0.006 0.000 H 4.58301895157 2.13678100538 0.00314824260 0.014 0.053 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.025 -0.043 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.018 0.000 -0.028 H 0.75224758084 -0.00860493512 -5.25016290812 -0.013 0.001 0.002 H -3.29620044300 -0.00255800648 -3.88456579214 -0.016 0.000 -0.007 H 1.47161249279 -0.00457826661 -2.87685200854 0.033 0.000 -0.016 H -1.69176120521 -0.00597000955 5.75026973076 0.020 0.000 0.031 H 0.75025791005 -0.00892914887 5.25161119224 -0.014 0.000 -0.003 H 1.46975366817 -0.00523069331 2.87805400798 0.036 0.000 0.017 H -3.29750276746 -0.00099200484 3.88584245085 -0.018 -0.000 0.007 H -4.55513299541 0.00377930937 -2.13473279421 0.021 0.000 0.032 H -4.55107479454 0.00501307822 2.13844314827 0.013 0.000 -0.039 H -6.83436893102 0.00806057203 1.19721860356 -0.013 -0.000 -0.008 H 6.86748209639 1.20005966818 0.00372860376 -0.020 0.012 0.000 61 Mode 75: freq=889.38 N -0.44003451495 -0.00038510790 2.12369783068 0.122 -0.000 -0.036 C -1.76594470239 0.00039861437 2.37754210613 0.009 -0.000 0.020 C -2.24923313135 -0.00145267054 3.67997125809 -0.054 -0.000 0.081 C -1.33887502024 -0.00450793845 4.73956848945 -0.040 0.000 0.110 C 0.02462671625 -0.00591801736 4.46614405978 -0.052 0.000 -0.059 C 0.43187566201 -0.00376957955 3.13352499014 0.138 0.000 -0.029 C -2.63984642995 0.00218980399 1.17162612704 -0.042 0.001 -0.154 N -1.98513620489 0.00132140951 0.00153900685 0.228 -0.000 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.038 0.000 0.142 C -4.02452897564 0.00329996303 -1.20791476641 -0.119 0.000 0.277 C -4.73391255267 0.00451580118 -0.00020876193 -0.443 0.000 -0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.137 0.000 -0.297 Co 0.00000000000 0.00000000000 0.00000000000 -0.014 0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.114 -0.000 0.035 C -1.76408906064 -0.00030645034 -2.37697009192 0.009 -0.000 -0.019 C -2.24773885821 -0.00257631963 -3.67934971086 -0.048 -0.000 -0.075 C -1.33713102227 -0.00526459193 -4.73855802198 -0.038 -0.000 -0.101 C 0.02654101484 -0.00591797621 -4.46472703619 -0.049 0.000 0.056 C 0.43371721952 -0.00363389350 -3.13225443930 0.128 0.000 0.026 S -6.53329279136 0.00637481657 -0.11611178087 0.197 -0.000 0.018 N 2.00981687167 0.00259443239 -0.00000686048 -0.161 0.000 -0.000 C 2.67119656792 1.17263645248 0.00045766926 0.030 -0.106 0.000 C 4.06129317470 1.20536051565 0.00241240325 0.100 -0.201 0.000 C 4.76783866331 0.00148799420 0.00346798881 0.310 -0.000 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.087 0.186 0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.028 0.097 0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.008 0.015 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.038 0.055 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.030 0.075 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.036 -0.044 0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.097 -0.018 0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.085 -0.022 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.138 0.013 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.008 -0.013 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.035 -0.051 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.029 -0.069 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.034 0.042 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.090 0.017 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.080 0.021 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.020 0.034 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.014 -0.010 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.015 0.002 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.034 0.018 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.018 -0.031 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.013 0.009 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.032 -0.017 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.014 -0.002 -0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.009 -0.037 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.017 0.030 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.026 -0.000 -0.044 H 0.75224758084 -0.00860493512 -5.25016290812 -0.019 -0.000 0.012 H -3.29620044300 -0.00255800648 -3.88456579214 -0.019 -0.000 -0.004 H 1.47161249279 -0.00457826661 -2.87685200854 0.046 -0.000 -0.023 H -1.69176120521 -0.00597000955 5.75026973076 0.029 -0.000 0.048 H 0.75025791005 -0.00892914887 5.25161119224 -0.020 -0.000 -0.013 H 1.46975366817 -0.00523069331 2.87805400798 0.050 -0.000 0.024 H -3.29750276746 -0.00099200484 3.88584245085 -0.022 -0.000 0.004 H -4.55513299541 0.00377930937 -2.13473279421 0.026 -0.000 0.046 H -4.55107479454 0.00501307822 2.13844314827 0.015 -0.000 -0.056 H -6.83436893102 0.00806057203 1.19721860356 -0.020 0.000 -0.012 H 6.86748209639 1.20005966818 0.00372860376 0.014 -0.009 -0.000 61 Mode 76: freq=917.01 N -0.44003451495 -0.00038510790 2.12369783068 0.003 0.107 -0.001 C -1.76594470239 0.00039861437 2.37754210613 -0.000 -0.330 -0.001 C -2.24923313135 -0.00145267054 3.67997125809 -0.003 0.118 0.004 C -1.33887502024 -0.00450793845 4.73956848945 -0.002 0.046 0.004 C 0.02462671625 -0.00591801736 4.46614405978 -0.001 0.162 -0.001 C 0.43187566201 -0.00376957955 3.13352499014 0.005 0.019 -0.000 C -2.63984642995 0.00218980399 1.17162612704 -0.003 0.186 -0.006 N -1.98513620489 0.00132140951 0.00153900685 -0.000 -0.020 -0.006 C -2.63911589169 0.00167522827 -1.17277445342 0.004 -0.144 -0.006 C -4.02452897564 0.00329996303 -1.20791476641 0.006 -0.022 0.003 C -4.73391255267 0.00451580118 -0.00020876193 0.000 -0.008 0.001 C -4.02924140493 0.00399189729 1.20660077672 -0.006 0.042 0.003 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.001 -0.001 N -0.43839318333 -0.00054206762 -2.12229806799 -0.003 -0.090 -0.001 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 0.272 -0.001 C -2.24773885821 -0.00257631963 -3.67934971086 0.003 -0.097 0.004 C -1.33713102227 -0.00526459193 -4.73855802198 0.002 -0.033 0.004 C 0.02654101484 -0.00591797621 -4.46472703619 0.001 -0.131 -0.002 C 0.43371721952 -0.00363389350 -3.13225443930 -0.005 -0.012 -0.000 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 0.003 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 0.010 0.014 C 2.67119656792 1.17263645248 0.00045766926 -0.006 0.009 -0.134 C 4.06129317470 1.20536051565 0.00241240325 -0.009 -0.005 -0.031 C 4.76783866331 0.00148799420 0.00346798881 -0.000 -0.001 0.006 C 4.05723810074 -1.20352939940 0.00211502115 0.009 -0.006 0.017 C 2.67108506586 -1.17139122066 0.00026591651 0.006 0.009 0.104 C 1.82209539371 2.39842937406 -0.00175320633 0.000 0.001 0.237 C 2.33938959521 3.68993217240 -0.00584554905 -0.005 -0.006 -0.087 C 1.45736908622 4.77231118002 -0.00917967851 -0.003 -0.006 -0.032 C 0.08658913130 4.53522926787 -0.00833235387 -0.002 0.003 -0.116 C -0.35359617412 3.21325694137 -0.00400174376 0.008 0.001 -0.013 N 0.49290585413 2.18198449515 -0.00068475564 0.005 0.001 -0.075 S 6.56718562933 -0.11349126889 0.00673479967 -0.001 0.000 -0.002 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 0.001 -0.194 C 2.33969079820 -3.68709653410 -0.00625612120 0.005 -0.006 0.071 C 1.45789786198 -4.76953179608 -0.00945089783 0.003 -0.006 0.023 C 0.08684213972 -4.53272927032 -0.00840538011 0.002 0.003 0.093 C -0.35393854068 -3.21111942258 -0.00398541364 -0.008 0.001 0.008 N 0.49225266031 -2.17934076887 -0.00084210065 -0.005 0.001 0.062 H 1.83694111827 5.77332096953 -0.01265611066 0.002 -0.002 0.177 H -0.61802819388 5.33967450634 -0.01131742088 -0.001 0.001 0.197 H 3.39175422949 3.87200638269 -0.00704552340 -0.001 -0.001 0.037 H -1.39787683933 2.98334799634 -0.00369736757 0.003 -0.000 0.151 H 1.83794742242 -5.77033326187 -0.01295832570 -0.002 -0.002 -0.140 H -0.61749414542 -5.33746053721 -0.01121572048 0.001 0.001 -0.154 H -1.39833026435 -2.98175334118 -0.00345676225 -0.003 -0.001 -0.121 H 3.39230213722 -3.86796714602 -0.00754158092 0.001 -0.001 -0.027 H 4.58301895157 2.13678100538 0.00314824260 -0.002 -0.002 0.107 H 4.58784714512 -2.12983634010 0.00211631073 0.002 -0.002 -0.063 H -1.68997263563 -0.00719388386 -5.74925805817 -0.001 0.195 0.001 H 0.75224758084 -0.00860493512 -5.25016290812 0.001 0.219 -0.001 H -3.29620044300 -0.00255800648 -3.88456579214 0.001 0.036 0.001 H 1.47161249279 -0.00457826661 -2.87685200854 -0.001 0.171 0.000 H -1.69176120521 -0.00597000955 5.75026973076 0.001 -0.246 0.001 H 0.75025791005 -0.00892914887 5.25161119224 -0.001 -0.278 -0.001 H 1.46975366817 -0.00523069331 2.87805400798 0.001 -0.213 0.000 H -3.29750276746 -0.00099200484 3.88584245085 -0.001 -0.050 0.001 H -4.55513299541 0.00377930937 -2.13473279421 0.001 0.085 0.001 H -4.55107479454 0.00501307822 2.13844314827 -0.001 -0.146 0.001 H -6.83436893102 0.00806057203 1.19721860356 0.003 -0.010 0.001 H 6.86748209639 1.20005966818 0.00372860376 0.005 -0.001 0.007 61 Mode 77: freq=919.03 N -0.44003451495 -0.00038510790 2.12369783068 0.006 -0.088 -0.001 C -1.76594470239 0.00039861437 2.37754210613 -0.000 0.257 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.005 -0.090 0.007 C -1.33887502024 -0.00450793845 4.73956848945 -0.003 -0.036 0.008 C 0.02462671625 -0.00591801736 4.46614405978 -0.002 -0.126 -0.004 C 0.43187566201 -0.00376957955 3.13352499014 0.010 -0.015 -0.001 C -2.63984642995 0.00218980399 1.17162612704 -0.007 -0.149 -0.011 N -1.98513620489 0.00132140951 0.00153900685 -0.000 0.035 -0.013 C -2.63911589169 0.00167522827 -1.17277445342 0.007 0.074 -0.011 C -4.02452897564 0.00329996303 -1.20791476641 0.011 0.011 0.007 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 0.011 0.002 C -4.02924140493 0.00399189729 1.20660077672 -0.012 -0.033 0.006 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 -0.001 -0.002 N -0.43839318333 -0.00054206762 -2.12229806799 -0.006 0.061 -0.001 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 -0.162 -0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.005 0.057 0.007 C -1.33713102227 -0.00526459193 -4.73855802198 0.003 0.016 0.008 C 0.02654101484 -0.00591797621 -4.46472703619 0.002 0.077 -0.003 C 0.43371721952 -0.00363389350 -3.13225443930 -0.010 0.004 -0.001 S -6.53329279136 0.00637481657 -0.11611178087 -0.001 -0.004 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 -0.013 0.045 C 2.67119656792 1.17263645248 0.00045766926 0.008 -0.012 -0.205 C 4.06129317470 1.20536051565 0.00241240325 0.012 0.007 -0.047 C 4.76783866331 0.00148799420 0.00346798881 -0.000 0.002 0.015 C 4.05723810074 -1.20352939940 0.00211502115 -0.012 0.007 0.017 C 2.67108506586 -1.17139122066 0.00026591651 -0.008 -0.012 0.108 C 1.82209539371 2.39842937406 -0.00175320633 0.000 0.000 0.358 C 2.33938959521 3.68993217240 -0.00584554905 0.006 0.007 -0.129 C 1.45736908622 4.77231118002 -0.00917967851 0.003 0.008 -0.049 C 0.08658913130 4.53522926787 -0.00833235387 0.002 -0.004 -0.176 C -0.35359617412 3.21325694137 -0.00400174376 -0.011 -0.001 -0.019 N 0.49290585413 2.18198449515 -0.00068475564 -0.007 -0.001 -0.120 S 6.56718562933 -0.11349126889 0.00673479967 0.001 -0.000 -0.005 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 -0.000 -0.231 C 2.33969079820 -3.68709653410 -0.00625612120 -0.006 0.007 0.083 C 1.45789786198 -4.76953179608 -0.00945089783 -0.003 0.008 0.023 C 0.08684213972 -4.53272927032 -0.00840538011 -0.002 -0.004 0.110 C -0.35393854068 -3.21111942258 -0.00398541364 0.011 -0.001 0.005 N 0.49225266031 -2.17934076887 -0.00084210065 0.007 -0.001 0.084 H 1.83694111827 5.77332096953 -0.01265611066 -0.002 0.005 0.268 H -0.61802819388 5.33967450634 -0.01131742088 0.001 0.001 0.300 H 3.39175422949 3.87200638269 -0.00704552340 0.002 0.002 0.054 H -1.39787683933 2.98334799634 -0.00369736757 -0.004 0.002 0.232 H 1.83794742242 -5.77033326187 -0.01295832570 0.002 0.004 -0.160 H -0.61749414542 -5.33746053721 -0.01121572048 -0.001 0.000 -0.175 H -1.39833026435 -2.98175334118 -0.00345676225 0.004 0.002 -0.143 H 3.39230213722 -3.86796714602 -0.00754158092 -0.002 0.002 -0.026 H 4.58301895157 2.13678100538 0.00314824260 0.002 0.003 0.172 H 4.58784714512 -2.12983634010 0.00211631073 -0.002 0.003 -0.052 H -1.68997263563 -0.00719388386 -5.74925805817 -0.002 -0.112 0.004 H 0.75224758084 -0.00860493512 -5.25016290812 0.001 -0.124 -0.000 H -3.29620044300 -0.00255800648 -3.88456579214 0.002 -0.017 0.002 H 1.47161249279 -0.00457826661 -2.87685200854 -0.004 -0.102 0.001 H -1.69176120521 -0.00597000955 5.75026973076 0.002 0.192 0.004 H 0.75025791005 -0.00892914887 5.25161119224 -0.001 0.218 0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.004 0.169 0.001 H -3.29750276746 -0.00099200484 3.88584245085 -0.002 0.037 0.002 H -4.55513299541 0.00377930937 -2.13473279421 0.002 -0.033 0.003 H -4.55107479454 0.00501307822 2.13844314827 -0.002 0.123 0.003 H -6.83436893102 0.00806057203 1.19721860356 0.005 0.006 0.001 H 6.86748209639 1.20005966818 0.00372860376 -0.006 0.001 0.009 61 Mode 78: freq=919.94 N -0.44003451495 -0.00038510790 2.12369783068 0.002 0.035 -0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.000 -0.157 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.001 0.051 0.002 C -1.33887502024 -0.00450793845 4.73956848945 -0.001 0.040 0.002 C 0.02462671625 -0.00591801736 4.46614405978 -0.001 0.084 -0.001 C 0.43187566201 -0.00376957955 3.13352499014 0.003 0.026 -0.000 C -2.63984642995 0.00218980399 1.17162612704 -0.002 0.153 -0.003 N -1.98513620489 0.00132140951 0.00153900685 -0.000 -0.171 -0.003 C -2.63911589169 0.00167522827 -1.17277445342 0.002 0.228 -0.003 C -4.02452897564 0.00329996303 -1.20791476641 0.003 0.029 0.002 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 -0.039 0.001 C -4.02924140493 0.00399189729 1.20660077672 -0.003 0.034 0.001 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.006 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.002 0.079 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 -0.284 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.002 0.095 0.001 C -1.33713102227 -0.00526459193 -4.73855802198 0.001 0.053 0.002 C 0.02654101484 -0.00591797621 -4.46472703619 0.001 0.144 -0.001 C 0.43371721952 -0.00363389350 -3.13225443930 -0.003 0.031 -0.000 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 0.010 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.005 0.206 0.008 C 2.67119656792 1.17263645248 0.00045766926 -0.115 0.184 -0.020 C 4.06129317470 1.20536051565 0.00241240325 -0.187 -0.104 -0.004 C 4.76783866331 0.00148799420 0.00346798881 0.002 -0.033 0.002 C 4.05723810074 -1.20352939940 0.00211502115 0.188 -0.103 0.001 C 2.67108506586 -1.17139122066 0.00026591651 0.115 0.186 0.003 C 1.82209539371 2.39842937406 -0.00175320633 -0.005 0.011 0.032 C 2.33938959521 3.68993217240 -0.00584554905 -0.091 -0.110 -0.011 C 1.45736908622 4.77231118002 -0.00917967851 -0.051 -0.124 -0.004 C 0.08658913130 4.53522926787 -0.00833235387 -0.037 0.062 -0.016 C -0.35359617412 3.21325694137 -0.00400174376 0.162 0.013 -0.002 N 0.49290585413 2.18198449515 -0.00068475564 0.100 0.016 -0.011 S 6.56718562933 -0.11349126889 0.00673479967 -0.014 -0.000 -0.001 C 1.82142022278 -2.39594383179 -0.00206827421 0.005 0.011 -0.011 C 2.33969079820 -3.68709653410 -0.00625612120 0.092 -0.111 0.004 C 1.45789786198 -4.76953179608 -0.00945089783 0.051 -0.125 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.037 0.062 0.005 C -0.35393854068 -3.21111942258 -0.00398541364 -0.163 0.014 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.101 0.017 0.005 H 1.83694111827 5.77332096953 -0.01265611066 0.037 -0.058 0.025 H -0.61802819388 5.33967450634 -0.01131742088 -0.018 0.010 0.028 H 3.39175422949 3.87200638269 -0.00704552340 -0.029 -0.032 0.005 H -1.39787683933 2.98334799634 -0.00369736757 0.055 -0.021 0.022 H 1.83794742242 -5.77033326187 -0.01295832570 -0.037 -0.058 -0.007 H -0.61749414542 -5.33746053721 -0.01121572048 0.018 0.010 -0.008 H -1.39833026435 -2.98175334118 -0.00345676225 -0.055 -0.021 -0.007 H 3.39230213722 -3.86796714602 -0.00754158092 0.029 -0.032 -0.001 H 4.58301895157 2.13678100538 0.00314824260 -0.034 -0.043 0.017 H 4.58784714512 -2.12983634010 0.00211631073 0.038 -0.041 0.001 H -1.68997263563 -0.00719388386 -5.74925805817 -0.001 -0.226 0.001 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 -0.269 0.001 H -3.29620044300 -0.00255800648 -3.88456579214 0.000 -0.050 0.001 H 1.47161249279 -0.00457826661 -2.87685200854 -0.001 -0.194 0.001 H -1.69176120521 -0.00597000955 5.75026973076 0.000 -0.139 0.001 H 0.75025791005 -0.00892914887 5.25161119224 -0.001 -0.170 -0.001 H 1.46975366817 -0.00523069331 2.87805400798 0.001 -0.116 0.000 H -3.29750276746 -0.00099200484 3.88584245085 -0.000 -0.037 0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.000 -0.204 0.001 H -4.55107479454 0.00501307822 2.13844314827 -0.001 -0.183 0.001 H -6.83436893102 0.00806057203 1.19721860356 0.001 0.008 0.000 H 6.86748209639 1.20005966818 0.00372860376 0.085 -0.020 0.001 61 Mode 79: freq=920.54 N -0.44003451495 -0.00038510790 2.12369783068 0.057 0.010 -0.011 C -1.76594470239 0.00039861437 2.37754210613 -0.004 -0.028 -0.006 C -2.24923313135 -0.00145267054 3.67997125809 -0.050 0.009 0.063 C -1.33887502024 -0.00450793845 4.73956848945 -0.027 0.003 0.073 C 0.02462671625 -0.00591801736 4.46614405978 -0.021 0.014 -0.032 C 0.43187566201 -0.00376957955 3.13352499014 0.093 0.001 -0.010 C -2.63984642995 0.00218980399 1.17162612704 -0.066 0.015 -0.105 N -1.98513620489 0.00132140951 0.00153900685 -0.003 -0.002 -0.115 C -2.63911589169 0.00167522827 -1.17277445342 0.066 -0.010 -0.105 C -4.02452897564 0.00329996303 -1.20791476641 0.107 -0.001 0.058 C -4.73391255267 0.00451580118 -0.00020876193 0.001 -0.001 0.019 C -4.02924140493 0.00399189729 1.20660077672 -0.106 0.003 0.059 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.000 -0.009 N -0.43839318333 -0.00054206762 -2.12229806799 -0.058 -0.008 -0.012 C -1.76408906064 -0.00030645034 -2.37697009192 0.004 0.021 -0.006 C -2.24773885821 -0.00257631963 -3.67934971086 0.050 -0.007 0.064 C -1.33713102227 -0.00526459193 -4.73855802198 0.027 -0.002 0.074 C 0.02654101484 -0.00591797621 -4.46472703619 0.021 -0.010 -0.033 C 0.43371721952 -0.00363389350 -3.13225443930 -0.094 -0.001 -0.010 S -6.53329279136 0.00637481657 -0.11611178087 -0.008 0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 -0.010 0.205 C 2.67119656792 1.17263645248 0.00045766926 0.005 -0.009 -0.180 C 4.06129317470 1.20536051565 0.00241240325 0.009 0.005 -0.043 C 4.76783866331 0.00148799420 0.00346798881 -0.000 0.002 0.050 C 4.05723810074 -1.20352939940 0.00211502115 -0.009 0.005 -0.039 C 2.67108506586 -1.17139122066 0.00026591651 -0.005 -0.009 -0.278 C 1.82209539371 2.39842937406 -0.00175320633 0.000 0.000 0.188 C 2.33938959521 3.68993217240 -0.00584554905 0.004 0.005 -0.063 C 1.45736908622 4.77231118002 -0.00917967851 0.002 0.006 -0.046 C 0.08658913130 4.53522926787 -0.00833235387 0.002 -0.003 -0.101 C -0.35359617412 3.21325694137 -0.00400174376 -0.007 -0.001 -0.029 N 0.49290585413 2.18198449515 -0.00068475564 -0.005 -0.001 -0.045 S 6.56718562933 -0.11349126889 0.00673479967 0.001 -0.000 -0.012 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 -0.002 0.357 C 2.33969079820 -3.68709653410 -0.00625612120 -0.004 0.006 -0.123 C 1.45789786198 -4.76953179608 -0.00945089783 -0.002 0.006 -0.064 C 0.08684213972 -4.53272927032 -0.00840538011 -0.002 -0.002 -0.180 C -0.35393854068 -3.21111942258 -0.00398541364 0.007 -0.001 -0.035 N 0.49225266031 -2.17934076887 -0.00084210065 0.005 -0.000 -0.103 H 1.83694111827 5.77332096953 -0.01265611066 -0.002 0.003 0.168 H -0.61802819388 5.33967450634 -0.01131742088 0.001 0.000 0.201 H 3.39175422949 3.87200638269 -0.00704552340 0.001 0.002 0.046 H -1.39787683933 2.98334799634 -0.00369736757 -0.003 0.002 0.138 H 1.83794742242 -5.77033326187 -0.01295832570 0.002 0.002 0.284 H -0.61749414542 -5.33746053721 -0.01121572048 -0.001 -0.002 0.331 H -1.39833026435 -2.98175334118 -0.00345676225 0.002 0.000 0.242 H 3.39230213722 -3.86796714602 -0.00754158092 -0.001 0.001 0.064 H 4.58301895157 2.13678100538 0.00314824260 0.001 0.002 0.221 H 4.58784714512 -2.12983634010 0.00211631073 -0.002 0.002 0.251 H -1.68997263563 -0.00719388386 -5.74925805817 -0.021 0.014 0.033 H 0.75224758084 -0.00860493512 -5.25016290812 0.011 0.016 -0.005 H -3.29620044300 -0.00255800648 -3.88456579214 0.016 0.002 0.018 H 1.47161249279 -0.00457826661 -2.87685200854 -0.032 0.014 0.010 H -1.69176120521 -0.00597000955 5.75026973076 0.021 -0.020 0.032 H 0.75025791005 -0.00892914887 5.25161119224 -0.011 -0.023 -0.005 H 1.46975366817 -0.00523069331 2.87805400798 0.031 -0.018 0.010 H -3.29750276746 -0.00099200484 3.88584245085 -0.016 -0.003 0.018 H -4.55513299541 0.00377930937 -2.13473279421 0.022 0.005 0.023 H -4.55107479454 0.00501307822 2.13844314827 -0.019 -0.012 0.025 H -6.83436893102 0.00806057203 1.19721860356 0.048 -0.001 0.011 H 6.86748209639 1.20005966818 0.00372860376 -0.004 0.001 -0.010 61 Mode 80: freq=921.79 N -0.44003451495 -0.00038510790 2.12369783068 -0.002 0.051 0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.000 -0.167 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.002 0.054 -0.002 C -1.33887502024 -0.00450793845 4.73956848945 0.001 0.035 -0.003 C 0.02462671625 -0.00591801736 4.46614405978 0.001 0.088 0.002 C 0.43187566201 -0.00376957955 3.13352499014 -0.003 0.017 0.001 C -2.63984642995 0.00218980399 1.17162612704 0.003 0.147 0.004 N -1.98513620489 0.00132140951 0.00153900685 -0.000 -0.152 0.004 C -2.63911589169 0.00167522827 -1.17277445342 -0.002 0.186 0.004 C -4.02452897564 0.00329996303 -1.20791476641 -0.004 0.027 -0.002 C -4.73391255267 0.00451580118 -0.00020876193 0.000 -0.037 -0.001 C -4.02924140493 0.00399189729 1.20660077672 0.004 0.037 -0.002 Co 0.00000000000 0.00000000000 0.00000000000 -0.001 0.009 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.002 0.073 0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 -0.230 0.001 C -2.24773885821 -0.00257631963 -3.67934971086 -0.002 0.075 -0.003 C -1.33713102227 -0.00526459193 -4.73855802198 -0.001 0.040 -0.003 C 0.02654101484 -0.00591797621 -4.46472703619 -0.001 0.116 0.001 C 0.43371721952 -0.00363389350 -3.13225443930 0.003 0.019 0.000 S -6.53329279136 0.00637481657 -0.11611178087 0.000 0.009 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.006 -0.237 -0.003 C 2.67119656792 1.17263645248 0.00045766926 0.130 -0.217 -0.004 C 4.06129317470 1.20536051565 0.00241240325 0.216 0.118 -0.001 C 4.76783866331 0.00148799420 0.00346798881 -0.004 0.042 -0.001 C 4.05723810074 -1.20352939940 0.00211502115 -0.218 0.114 0.001 C 2.67108506586 -1.17139122066 0.00026591651 -0.130 -0.220 0.011 C 1.82209539371 2.39842937406 -0.00175320633 0.009 -0.013 0.012 C 2.33938959521 3.68993217240 -0.00584554905 0.107 0.128 -0.005 C 1.45736908622 4.77231118002 -0.00917967851 0.055 0.142 -0.001 C 0.08658913130 4.53522926787 -0.00833235387 0.042 -0.074 -0.005 C -0.35359617412 3.21325694137 -0.00400174376 -0.183 -0.016 0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.115 -0.017 -0.005 S 6.56718562933 -0.11349126889 0.00673479967 0.016 0.001 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.009 -0.013 -0.020 C 2.33969079820 -3.68709653410 -0.00625612120 -0.108 0.129 0.007 C 1.45789786198 -4.76953179608 -0.00945089783 -0.056 0.144 0.003 C 0.08684213972 -4.53272927032 -0.00840538011 -0.042 -0.075 0.009 C -0.35393854068 -3.21111942258 -0.00398541364 0.185 -0.017 0.001 N 0.49225266031 -2.17934076887 -0.00084210065 0.117 -0.018 0.007 H 1.83694111827 5.77332096953 -0.01265611066 -0.045 0.067 0.007 H -0.61802819388 5.33967450634 -0.01131742088 0.020 -0.014 0.008 H 3.39175422949 3.87200638269 -0.00704552340 0.034 0.039 0.001 H -1.39787683933 2.98334799634 -0.00369736757 -0.063 0.028 0.007 H 1.83794742242 -5.77033326187 -0.01295832570 0.045 0.068 -0.014 H -0.61749414542 -5.33746053721 -0.01121572048 -0.020 -0.014 -0.016 H -1.39833026435 -2.98175334118 -0.00345676225 0.063 0.028 -0.012 H 3.39230213722 -3.86796714602 -0.00754158092 -0.034 0.039 -0.002 H 4.58301895157 2.13678100538 0.00314824260 0.038 0.050 0.002 H 4.58784714512 -2.12983634010 0.00211631073 -0.043 0.047 -0.008 H -1.68997263563 -0.00719388386 -5.74925805817 0.001 -0.180 -0.001 H 0.75224758084 -0.00860493512 -5.25016290812 -0.001 -0.211 0.001 H -3.29620044300 -0.00255800648 -3.88456579214 -0.001 -0.036 -0.001 H 1.47161249279 -0.00457826661 -2.87685200854 0.001 -0.155 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.001 -0.139 -0.002 H 0.75025791005 -0.00892914887 5.25161119224 0.000 -0.165 -0.000 H 1.46975366817 -0.00523069331 2.87805400798 -0.001 -0.117 -0.001 H -3.29750276746 -0.00099200484 3.88584245085 0.001 -0.032 -0.001 H -4.55513299541 0.00377930937 -2.13473279421 -0.001 -0.174 -0.001 H -4.55107479454 0.00501307822 2.13844314827 0.000 -0.175 -0.001 H -6.83436893102 0.00806057203 1.19721860356 -0.002 0.007 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.093 0.022 0.000 61 Mode 81: freq=923.04 N -0.44003451495 -0.00038510790 2.12369783068 -0.143 0.003 0.026 C -1.76594470239 0.00039861437 2.37754210613 0.015 -0.007 0.017 C -2.24923313135 -0.00145267054 3.67997125809 0.127 0.002 -0.159 C -1.33887502024 -0.00450793845 4.73956848945 0.062 0.001 -0.180 C 0.02462671625 -0.00591801736 4.46614405978 0.054 0.003 0.087 C 0.43187566201 -0.00376957955 3.13352499014 -0.225 0.000 0.027 C -2.63984642995 0.00218980399 1.17162612704 0.160 0.003 0.268 N -1.98513620489 0.00132140951 0.00153900685 0.007 0.001 0.285 C -2.63911589169 0.00167522827 -1.17277445342 -0.160 -0.004 0.272 C -4.02452897564 0.00329996303 -1.20791476641 -0.268 -0.000 -0.138 C -4.73391255267 0.00451580118 -0.00020876193 -0.005 0.000 -0.054 C -4.02924140493 0.00399189729 1.20660077672 0.266 0.000 -0.145 Co 0.00000000000 0.00000000000 0.00000000000 -0.001 -0.000 -0.009 N -0.43839318333 -0.00054206762 -2.12229806799 0.146 -0.003 0.027 C -1.76408906064 -0.00030645034 -2.37697009192 -0.015 0.008 0.017 C -2.24773885821 -0.00257631963 -3.67934971086 -0.128 -0.003 -0.161 C -1.33713102227 -0.00526459193 -4.73855802198 -0.063 -0.001 -0.183 C 0.02654101484 -0.00591797621 -4.46472703619 -0.055 -0.003 0.088 C 0.43371721952 -0.00363389350 -3.13225443930 0.227 -0.000 0.027 S -6.53329279136 0.00637481657 -0.11611178087 0.020 0.000 -0.001 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 0.002 0.085 C 2.67119656792 1.17263645248 0.00045766926 -0.001 0.001 -0.082 C 4.06129317470 1.20536051565 0.00241240325 -0.001 -0.001 -0.023 C 4.76783866331 0.00148799420 0.00346798881 0.000 -0.000 0.023 C 4.05723810074 -1.20352939940 0.00211502115 0.002 -0.001 -0.017 C 2.67108506586 -1.17139122066 0.00026591651 0.001 0.002 -0.103 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 0.000 0.098 C 2.33938959521 3.68993217240 -0.00584554905 -0.001 -0.001 -0.033 C 1.45736908622 4.77231118002 -0.00917967851 -0.000 -0.001 -0.019 C 0.08658913130 4.53522926787 -0.00833235387 -0.000 0.000 -0.052 C -0.35359617412 3.21325694137 -0.00400174376 0.001 -0.000 -0.007 N 0.49290585413 2.18198449515 -0.00068475564 0.001 0.000 -0.034 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 -0.000 -0.005 C 1.82142022278 -2.39594383179 -0.00206827421 0.000 -0.000 0.131 C 2.33969079820 -3.68709653410 -0.00625612120 0.001 -0.001 -0.044 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 -0.001 -0.022 C 0.08684213972 -4.53272927032 -0.00840538011 0.000 0.001 -0.067 C -0.35393854068 -3.21111942258 -0.00398541364 -0.001 0.000 -0.008 N 0.49225266031 -2.17934076887 -0.00084210065 -0.001 0.000 -0.045 H 1.83694111827 5.77332096953 -0.01265611066 0.000 -0.000 0.081 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 0.000 0.094 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 -0.000 0.018 H -1.39787683933 2.98334799634 -0.00369736757 0.000 -0.000 0.068 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 -0.001 0.102 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 -0.000 0.117 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 -0.000 0.087 H 3.39230213722 -3.86796714602 -0.00754158092 0.000 -0.000 0.021 H 4.58301895157 2.13678100538 0.00314824260 -0.000 -0.000 0.102 H 4.58784714512 -2.12983634010 0.00211631073 0.000 -0.000 0.100 H -1.68997263563 -0.00719388386 -5.74925805817 0.057 0.005 -0.083 H 0.75224758084 -0.00860493512 -5.25016290812 -0.025 0.006 0.016 H -3.29620044300 -0.00255800648 -3.88456579214 -0.041 0.001 -0.048 H 1.47161249279 -0.00457826661 -2.87685200854 0.079 0.005 -0.032 H -1.69176120521 -0.00597000955 5.75026973076 -0.057 -0.004 -0.082 H 0.75025791005 -0.00892914887 5.25161119224 0.025 -0.005 0.016 H 1.46975366817 -0.00523069331 2.87805400798 -0.078 -0.004 -0.031 H -3.29750276746 -0.00099200484 3.88584245085 0.040 -0.000 -0.049 H -4.55513299541 0.00377930937 -2.13473279421 -0.051 0.003 -0.058 H -4.55107479454 0.00501307822 2.13844314827 0.046 -0.002 -0.061 H -6.83436893102 0.00806057203 1.19721860356 -0.112 -0.000 -0.027 H 6.86748209639 1.20005966818 0.00372860376 0.000 -0.000 -0.004 61 Mode 82: freq=1008.19 N -0.44003451495 -0.00038510790 2.12369783068 0.030 0.000 -0.012 C -1.76594470239 0.00039861437 2.37754210613 -0.021 -0.000 -0.009 C -2.24923313135 -0.00145267054 3.67997125809 -0.012 0.000 -0.002 C -1.33887502024 -0.00450793845 4.73956848945 0.003 -0.000 0.029 C 0.02462671625 -0.00591801736 4.46614405978 -0.003 0.000 0.009 C 0.43187566201 -0.00376957955 3.13352499014 0.028 -0.000 -0.013 C -2.63984642995 0.00218980399 1.17162612704 -0.040 0.000 -0.034 N -1.98513620489 0.00132140951 0.00153900685 0.050 -0.000 0.064 C -2.63911589169 0.00167522827 -1.17277445342 0.091 0.000 -0.063 C -4.02452897564 0.00329996303 -1.20791476641 0.098 -0.001 -0.195 C -4.73391255267 0.00451580118 -0.00020876193 0.011 0.000 0.041 C -4.02924140493 0.00399189729 1.20660077672 -0.095 -0.000 -0.071 Co 0.00000000000 0.00000000000 0.00000000000 -0.006 -0.000 -0.002 N -0.43839318333 -0.00054206762 -2.12229806799 -0.057 0.000 -0.032 C -1.76408906064 -0.00030645034 -2.37697009192 0.040 -0.000 -0.022 C -2.24773885821 -0.00257631963 -3.67934971086 0.034 0.000 0.011 C -1.33713102227 -0.00526459193 -4.73855802198 0.003 0.000 0.056 C 0.02654101484 -0.00591797621 -4.46472703619 0.001 0.000 0.017 C 0.43371721952 -0.00363389350 -3.13225443930 -0.068 -0.000 -0.014 S -6.53329279136 0.00637481657 -0.11611178087 0.113 0.000 0.189 N 2.00981687167 0.00259443239 -0.00000686048 -0.002 0.001 0.004 C 2.67119656792 1.17263645248 0.00045766926 0.001 -0.000 -0.004 C 4.06129317470 1.20536051565 0.00241240325 0.002 0.001 0.004 C 4.76783866331 0.00148799420 0.00346798881 -0.002 0.001 -0.002 C 4.05723810074 -1.20352939940 0.00211502115 -0.001 -0.005 0.003 C 2.67108506586 -1.17139122066 0.00026591651 -0.001 -0.002 -0.003 C 1.82209539371 2.39842937406 -0.00175320633 0.001 -0.000 0.002 C 2.33938959521 3.68993217240 -0.00584554905 0.001 0.000 -0.001 C 1.45736908622 4.77231118002 -0.00917967851 -0.000 0.000 -0.001 C 0.08658913130 4.53522926787 -0.00833235387 -0.001 0.001 -0.001 C -0.35359617412 3.21325694137 -0.00400174376 -0.001 0.000 0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.001 -0.001 0.001 S 6.56718562933 -0.11349126889 0.00673479967 -0.001 0.003 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.000 -0.000 0.002 C 2.33969079820 -3.68709653410 -0.00625612120 0.000 0.000 -0.001 C 1.45789786198 -4.76953179608 -0.00945089783 -0.000 0.001 -0.001 C 0.08684213972 -4.53272927032 -0.00840538011 -0.001 -0.001 -0.001 C -0.35393854068 -3.21111942258 -0.00398541364 0.001 -0.001 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.001 0.001 0.001 H 1.83694111827 5.77332096953 -0.01265611066 0.000 0.000 0.002 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 0.001 0.001 H 3.39175422949 3.87200638269 -0.00704552340 0.000 0.000 0.001 H -1.39787683933 2.98334799634 -0.00369736757 -0.000 0.000 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.000 0.001 0.002 H -0.61749414542 -5.33746053721 -0.01121572048 -0.000 -0.000 0.001 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 0.000 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.000 -0.000 0.001 H 4.58301895157 2.13678100538 0.00314824260 0.002 -0.000 -0.005 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 -0.001 -0.002 H -1.68997263563 -0.00719388386 -5.74925805817 -0.010 0.000 0.021 H 0.75224758084 -0.00860493512 -5.25016290812 0.004 0.000 0.010 H -3.29620044300 -0.00255800648 -3.88456579214 0.013 -0.000 -0.002 H 1.47161249279 -0.00457826661 -2.87685200854 -0.024 0.000 0.007 H -1.69176120521 -0.00597000955 5.75026973076 0.005 -0.000 0.010 H 0.75025791005 -0.00892914887 5.25161119224 -0.001 -0.000 0.003 H 1.46975366817 -0.00523069331 2.87805400798 0.010 -0.000 0.002 H -3.29750276746 -0.00099200484 3.88584245085 -0.006 0.000 -0.007 H -4.55513299541 0.00377930937 -2.13473279421 0.043 0.000 -0.068 H -4.55107479454 0.00501307822 2.13844314827 -0.062 0.000 -0.041 H -6.83436893102 0.00806057203 1.19721860356 -0.896 0.001 -0.176 H 6.86748209639 1.20005966818 0.00372860376 0.014 -0.003 0.000 61 Mode 83: freq=1008.49 N -0.44003451495 -0.00038510790 2.12369783068 0.001 -0.001 -0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.000 -0.002 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.001 0.001 0.000 C -1.33887502024 -0.00450793845 4.73956848945 0.000 0.001 0.000 C 0.02462671625 -0.00591801736 4.46614405978 0.000 0.001 0.000 C 0.43187566201 -0.00376957955 3.13352499014 0.000 -0.000 -0.000 C -2.63984642995 0.00218980399 1.17162612704 -0.001 0.004 -0.001 N -1.98513620489 0.00132140951 0.00153900685 0.000 -0.004 0.001 C -2.63911589169 0.00167522827 -1.17277445342 0.002 0.003 -0.001 C -4.02452897564 0.00329996303 -1.20791476641 0.002 -0.002 -0.002 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 0.002 0.001 C -4.02924140493 0.00399189729 1.20660077672 -0.001 -0.004 -0.002 Co 0.00000000000 0.00000000000 0.00000000000 -0.005 0.002 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.001 -0.001 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 0.001 -0.001 -0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 0.000 0.000 C -1.33713102227 -0.00526459193 -4.73855802198 0.000 0.001 0.001 C 0.02654101484 -0.00591797621 -4.46472703619 0.000 0.001 0.000 C 0.43371721952 -0.00363389350 -3.13225443930 -0.001 0.000 -0.000 S -6.53329279136 0.00637481657 -0.11611178087 0.002 -0.000 0.003 N 2.00981687167 0.00259443239 -0.00000686048 0.053 -0.063 -0.001 C 2.67119656792 1.17263645248 0.00045766926 -0.043 0.035 0.002 C 4.06129317470 1.20536051565 0.00241240325 -0.097 0.067 -0.004 C 4.76783866331 0.00148799420 0.00346798881 0.015 -0.038 0.001 C 4.05723810074 -1.20352939940 0.00211502115 0.097 0.196 -0.002 C 2.67108506586 -1.17139122066 0.00026591651 0.093 0.068 0.002 C 1.82209539371 2.39842937406 -0.00175320633 -0.021 0.010 -0.001 C 2.33938959521 3.68993217240 -0.00584554905 -0.015 0.001 0.001 C 1.45736908622 4.77231118002 -0.00917967851 0.001 -0.030 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.001 -0.011 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.031 0.011 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.031 0.012 0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.113 -0.189 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.038 0.024 -0.001 C 2.33969079820 -3.68709653410 -0.00625612120 0.034 -0.011 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.006 -0.058 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.000 -0.016 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.071 0.012 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.057 0.030 0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.005 -0.011 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.001 -0.004 0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.007 0.007 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.011 -0.002 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.010 -0.022 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.004 -0.009 -0.001 H -1.39833026435 -2.98175334118 -0.00345676225 -0.025 -0.008 -0.001 H 3.39230213722 -3.86796714602 -0.00754158092 0.013 0.004 0.001 H 4.58301895157 2.13678100538 0.00314824260 -0.063 0.040 0.004 H 4.58784714512 -2.12983634010 0.00211631073 0.041 0.067 0.002 H -1.68997263563 -0.00719388386 -5.74925805817 -0.000 -0.002 0.000 H 0.75224758084 -0.00860493512 -5.25016290812 0.000 -0.002 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 0.000 -0.001 -0.000 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 -0.000 0.000 H -1.69176120521 -0.00597000955 5.75026973076 0.000 -0.002 0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.000 -0.002 0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.000 -0.000 0.000 H -3.29750276746 -0.00099200484 3.88584245085 -0.000 -0.001 0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.001 0.001 -0.001 H -4.55107479454 0.00501307822 2.13844314827 -0.001 0.004 -0.001 H -6.83436893102 0.00806057203 1.19721860356 -0.015 -0.000 -0.003 H 6.86748209639 1.20005966818 0.00372860376 -0.895 0.175 -0.002 61 Mode 84: freq=1017.90 N -0.44003451495 -0.00038510790 2.12369783068 0.001 -0.004 0.002 C -1.76594470239 0.00039861437 2.37754210613 0.001 0.015 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.000 -0.008 0.002 C -1.33887502024 -0.00450793845 4.73956848945 -0.000 -0.000 0.000 C 0.02462671625 -0.00591801736 4.46614405978 -0.001 -0.002 -0.004 C 0.43187566201 -0.00376957955 3.13352499014 -0.000 0.005 0.000 C -2.63984642995 0.00218980399 1.17162612704 -0.001 -0.023 -0.002 N -1.98513620489 0.00132140951 0.00153900685 0.001 0.007 -0.001 C -2.63911589169 0.00167522827 -1.17277445342 0.002 -0.009 -0.003 C -4.02452897564 0.00329996303 -1.20791476641 0.002 0.010 -0.001 C -4.73391255267 0.00451580118 -0.00020876193 0.000 -0.015 0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.002 0.036 -0.000 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 -0.000 0.003 N -0.43839318333 -0.00054206762 -2.12229806799 -0.001 -0.001 0.001 C -1.76408906064 -0.00030645034 -2.37697009192 -0.001 0.002 -0.001 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 0.004 0.002 C -1.33713102227 -0.00526459193 -4.73855802198 0.000 0.002 0.001 C 0.02654101484 -0.00591797621 -4.46472703619 0.001 -0.002 -0.004 C 0.43371721952 -0.00363389350 -3.13225443930 -0.000 -0.004 0.000 S -6.53329279136 0.00637481657 -0.11611178087 0.001 0.001 0.002 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 0.001 -0.099 C 2.67119656792 1.17263645248 0.00045766926 -0.000 -0.000 0.322 C 4.06129317470 1.20536051565 0.00241240325 0.001 -0.001 -0.505 C 4.76783866331 0.00148799420 0.00346798881 -0.000 0.000 0.226 C 4.05723810074 -1.20352939940 0.00211502115 -0.000 -0.001 -0.168 C 2.67108506586 -1.17139122066 0.00026591651 -0.001 -0.000 0.151 C 1.82209539371 2.39842937406 -0.00175320633 0.000 -0.001 -0.201 C 2.33938959521 3.68993217240 -0.00584554905 0.000 0.000 0.079 C 1.45736908622 4.77231118002 -0.00917967851 -0.000 0.000 -0.011 C 0.08658913130 4.53522926787 -0.00833235387 -0.000 0.001 0.031 C -0.35359617412 3.21325694137 -0.00400174376 -0.000 -0.000 -0.033 N 0.49290585413 2.18198449515 -0.00068475564 -0.000 -0.000 0.059 S 6.56718562933 -0.11349126889 0.00673479967 -0.001 0.001 -0.019 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 0.000 -0.068 C 2.33969079820 -3.68709653410 -0.00625612120 -0.000 -0.000 -0.001 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 0.000 -0.004 C 0.08684213972 -4.53272927032 -0.00840538011 -0.000 0.000 0.026 C -0.35393854068 -3.21111942258 -0.00398541364 0.000 -0.000 0.005 N 0.49225266031 -2.17934076887 -0.00084210065 0.000 -0.000 0.017 H 1.83694111827 5.77332096953 -0.01265611066 0.000 -0.000 -0.040 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 0.000 -0.012 H 3.39175422949 3.87200638269 -0.00704552340 0.000 -0.000 -0.017 H -1.39787683933 2.98334799634 -0.00369736757 0.000 -0.000 0.003 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 0.000 -0.009 H -0.61749414542 -5.33746053721 -0.01121572048 -0.000 0.000 -0.039 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 0.000 -0.027 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 -0.000 0.036 H 4.58301895157 2.13678100538 0.00314824260 -0.001 -0.000 0.661 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 -0.001 0.156 H -1.68997263563 -0.00719388386 -5.74925805817 -0.002 -0.003 0.001 H 0.75224758084 -0.00860493512 -5.25016290812 0.000 0.004 -0.001 H -3.29620044300 -0.00255800648 -3.88456579214 0.000 -0.009 0.000 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 0.007 0.001 H -1.69176120521 -0.00597000955 5.75026973076 0.002 0.006 0.001 H 0.75025791005 -0.00892914887 5.25161119224 -0.000 0.000 -0.001 H 1.46975366817 -0.00523069331 2.87805400798 0.000 -0.003 0.001 H -3.29750276746 -0.00099200484 3.88584245085 0.000 0.006 0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.001 -0.009 -0.000 H -4.55107479454 0.00501307822 2.13844314827 -0.001 -0.047 -0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.008 0.000 -0.002 H 6.86748209639 1.20005966818 0.00372860376 0.006 -0.001 -0.004 61 Mode 85: freq=1018.47 N -0.44003451495 -0.00038510790 2.12369783068 -0.000 -0.055 -0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.000 0.190 0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.000 -0.057 -0.000 C -1.33887502024 -0.00450793845 4.73956848945 0.000 0.013 -0.000 C 0.02462671625 -0.00591801736 4.46614405978 -0.000 -0.038 0.000 C 0.43187566201 -0.00376957955 3.13352499014 0.000 0.020 -0.000 C -2.63984642995 0.00218980399 1.17162612704 -0.000 -0.316 0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 0.098 0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.000 -0.154 0.000 C -4.02452897564 0.00329996303 -1.20791476641 0.000 0.176 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 -0.228 0.000 C -4.02924140493 0.00399189729 1.20660077672 0.001 0.503 -0.000 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 -0.003 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.000 -0.017 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 0.069 -0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 0.004 -0.000 C -1.33713102227 -0.00526459193 -4.73855802198 0.000 0.005 0.000 C 0.02654101484 -0.00591797621 -4.46472703619 -0.000 -0.028 0.000 C 0.43371721952 -0.00363389350 -3.13225443930 -0.000 -0.007 -0.000 S -6.53329279136 0.00637481657 -0.11611178087 0.000 0.020 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.001 0.001 0.007 C 2.67119656792 1.17263645248 0.00045766926 -0.001 0.002 -0.022 C 4.06129317470 1.20536051565 0.00241240325 -0.002 0.000 0.036 C 4.76783866331 0.00148799420 0.00346798881 0.000 -0.000 -0.017 C 4.05723810074 -1.20352939940 0.00211502115 0.002 0.001 0.014 C 2.67108506586 -1.17139122066 0.00026591651 0.001 0.003 -0.013 C 1.82209539371 2.39842937406 -0.00175320633 0.001 0.000 0.012 C 2.33938959521 3.68993217240 -0.00584554905 -0.000 -0.002 -0.002 C 1.45736908622 4.77231118002 -0.00917967851 -0.000 -0.000 0.002 C 0.08658913130 4.53522926787 -0.00833235387 -0.001 0.004 -0.003 C -0.35359617412 3.21325694137 -0.00400174376 0.000 -0.000 -0.001 N 0.49290585413 2.18198449515 -0.00068475564 0.001 -0.001 -0.004 S 6.56718562933 -0.11349126889 0.00673479967 0.001 -0.002 0.001 C 1.82142022278 -2.39594383179 -0.00206827421 -0.001 0.001 0.007 C 2.33969079820 -3.68709653410 -0.00625612120 0.000 -0.002 -0.004 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 -0.001 -0.001 C 0.08684213972 -4.53272927032 -0.00840538011 0.001 0.004 -0.001 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 -0.000 0.003 N 0.49225266031 -2.17934076887 -0.00084210065 -0.001 -0.001 -0.002 H 1.83694111827 5.77332096953 -0.01265611066 0.001 -0.001 -0.001 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 0.001 0.003 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 -0.000 -0.005 H -1.39787683933 2.98334799634 -0.00369736757 0.000 -0.001 0.004 H 1.83794742242 -5.77033326187 -0.01295832570 -0.001 -0.001 0.004 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 0.001 0.001 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 -0.001 -0.003 H 3.39230213722 -3.86796714602 -0.00754158092 0.000 -0.000 0.003 H 4.58301895157 2.13678100538 0.00314824260 -0.001 0.000 -0.047 H 4.58784714512 -2.12983634010 0.00211631073 0.000 0.000 -0.014 H -1.68997263563 -0.00719388386 -5.74925805817 0.000 0.007 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 0.043 -0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 -0.043 0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 0.031 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.000 0.031 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.000 0.031 0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.000 0.017 -0.000 H -3.29750276746 -0.00099200484 3.88584245085 0.000 -0.012 0.000 H -4.55513299541 0.00377930937 -2.13473279421 -0.000 -0.169 0.000 H -4.55107479454 0.00501307822 2.13844314827 -0.001 -0.663 0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.000 0.005 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.007 0.001 0.000 61 Mode 86: freq=1034.72 N -0.44003451495 -0.00038510790 2.12369783068 0.000 0.006 0.001 C -1.76594470239 0.00039861437 2.37754210613 0.001 -0.018 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.000 0.033 0.001 C -1.33887502024 -0.00450793845 4.73956848945 -0.000 0.005 -0.000 C 0.02462671625 -0.00591801736 4.46614405978 -0.001 -0.011 -0.002 C 0.43187566201 -0.00376957955 3.13352499014 -0.000 -0.021 0.000 C -2.63984642995 0.00218980399 1.17162612704 -0.000 0.009 -0.001 N -1.98513620489 0.00132140951 0.00153900685 0.000 0.008 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.000 -0.053 -0.001 C -4.02452897564 0.00329996303 -1.20791476641 0.001 0.096 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 -0.026 -0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.001 -0.021 0.000 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 -0.000 0.001 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 -0.012 0.001 C -1.76408906064 -0.00030645034 -2.37697009192 -0.001 0.041 -0.000 C -2.24773885821 -0.00257631963 -3.67934971086 -0.000 -0.035 0.001 C -1.33713102227 -0.00526459193 -4.73855802198 0.000 -0.003 0.000 C 0.02654101484 -0.00591797621 -4.46472703619 0.000 0.004 -0.002 C 0.43371721952 -0.00363389350 -3.13225443930 0.000 0.021 0.000 S -6.53329279136 0.00637481657 -0.11611178087 0.000 0.002 0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 0.000 -0.035 C 2.67119656792 1.17263645248 0.00045766926 0.000 -0.000 -0.045 C 4.06129317470 1.20536051565 0.00241240325 -0.000 -0.000 0.105 C 4.76783866331 0.00148799420 0.00346798881 -0.000 0.000 0.111 C 4.05723810074 -1.20352939940 0.00211502115 0.001 0.000 -0.424 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 -0.000 0.245 C 1.82209539371 2.39842937406 -0.00175320633 0.000 0.000 0.082 C 2.33938959521 3.68993217240 -0.00584554905 -0.000 -0.001 -0.144 C 1.45736908622 4.77231118002 -0.00917967851 0.000 -0.000 -0.017 C 0.08658913130 4.53522926787 -0.00833235387 0.000 0.000 0.053 C -0.35359617412 3.21325694137 -0.00400174376 -0.000 0.000 0.086 N 0.49290585413 2.18198449515 -0.00068475564 0.000 -0.000 -0.034 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.000 -0.007 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 0.001 -0.195 C 2.33969079820 -3.68709653410 -0.00625612120 0.000 -0.001 0.186 C 1.45789786198 -4.76953179608 -0.00945089783 -0.000 -0.000 0.012 C 0.08684213972 -4.53272927032 -0.00840538011 -0.000 0.000 -0.035 C -0.35393854068 -3.21111942258 -0.00398541364 0.000 0.000 -0.106 N 0.49225266031 -2.17934076887 -0.00084210065 -0.000 -0.000 0.066 H 1.83694111827 5.77332096953 -0.01265611066 0.000 0.000 0.065 H -0.61802819388 5.33967450634 -0.01131742088 0.000 -0.000 -0.132 H 3.39175422949 3.87200638269 -0.00704552340 0.000 0.001 0.204 H -1.39787683933 2.98334799634 -0.00369736757 0.000 -0.000 -0.130 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 0.000 -0.088 H -0.61749414542 -5.33746053721 -0.01121572048 -0.000 -0.000 0.123 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 -0.000 0.136 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 0.001 -0.213 H 4.58301895157 2.13678100538 0.00314824260 0.000 -0.000 -0.187 H 4.58784714512 -2.12983634010 0.00211631073 -0.001 -0.001 0.597 H -1.68997263563 -0.00719388386 -5.74925805817 -0.001 0.019 0.000 H 0.75224758084 -0.00860493512 -5.25016290812 0.000 -0.018 -0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 0.038 0.000 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 -0.025 0.001 H -1.69176120521 -0.00597000955 5.75026973076 0.001 -0.017 0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.000 0.029 -0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.000 0.031 0.001 H -3.29750276746 -0.00099200484 3.88584245085 0.000 -0.049 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.000 -0.136 -0.000 H -4.55107479454 0.00501307822 2.13844314827 -0.000 0.039 -0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.002 0.005 -0.000 H 6.86748209639 1.20005966818 0.00372860376 0.001 -0.000 -0.024 61 Mode 87: freq=1036.58 N -0.44003451495 -0.00038510790 2.12369783068 0.000 0.037 -0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.000 -0.088 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.000 0.143 0.000 C -1.33887502024 -0.00450793845 4.73956848945 0.000 0.015 0.000 C 0.02462671625 -0.00591801736 4.46614405978 0.000 -0.051 0.000 C 0.43187566201 -0.00376957955 3.13352499014 -0.000 -0.083 -0.000 C -2.63984642995 0.00218980399 1.17162612704 0.000 0.057 0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 0.031 0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.000 -0.241 0.000 C -4.02452897564 0.00329996303 -1.20791476641 0.000 0.439 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 -0.108 0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.000 -0.129 -0.000 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 -0.001 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 -0.061 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 0.182 -0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 -0.148 0.000 C -1.33713102227 -0.00526459193 -4.73855802198 -0.000 -0.004 0.000 C 0.02654101484 -0.00591797621 -4.46472703619 -0.000 0.019 0.000 C 0.43371721952 -0.00363389350 -3.13225443930 0.000 0.080 -0.000 S -6.53329279136 0.00637481657 -0.11611178087 0.000 0.007 0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 0.000 0.007 C 2.67119656792 1.17263645248 0.00045766926 -0.000 0.001 0.014 C 4.06129317470 1.20536051565 0.00241240325 -0.000 -0.000 -0.030 C 4.76783866331 0.00148799420 0.00346798881 0.000 0.000 -0.023 C 4.05723810074 -1.20352939940 0.00211502115 0.000 0.000 0.095 C 2.67108506586 -1.17139122066 0.00026591651 0.000 0.001 -0.054 C 1.82209539371 2.39842937406 -0.00175320633 0.001 0.000 -0.018 C 2.33938959521 3.68993217240 -0.00584554905 0.000 -0.001 0.027 C 1.45736908622 4.77231118002 -0.00917967851 -0.000 0.000 0.001 C 0.08658913130 4.53522926787 -0.00833235387 -0.000 0.001 -0.010 C -0.35359617412 3.21325694137 -0.00400174376 -0.000 -0.000 -0.015 N 0.49290585413 2.18198449515 -0.00068475564 0.000 -0.001 0.009 S 6.56718562933 -0.11349126889 0.00673479967 0.000 -0.000 0.001 C 1.82142022278 -2.39594383179 -0.00206827421 -0.001 0.000 0.042 C 2.33969079820 -3.68709653410 -0.00625612120 -0.000 -0.001 -0.039 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 0.000 -0.001 C 0.08684213972 -4.53272927032 -0.00840538011 0.000 0.001 0.008 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 -0.000 0.020 N 0.49225266031 -2.17934076887 -0.00084210065 -0.000 -0.001 -0.016 H 1.83694111827 5.77332096953 -0.01265611066 0.000 -0.000 -0.010 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 0.000 0.026 H 3.39175422949 3.87200638269 -0.00704552340 0.000 -0.000 -0.036 H -1.39787683933 2.98334799634 -0.00369736757 0.000 -0.000 0.022 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 -0.000 0.016 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 0.000 -0.027 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 -0.000 -0.026 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 -0.000 0.043 H 4.58301895157 2.13678100538 0.00314824260 -0.000 0.000 0.051 H 4.58784714512 -2.12983634010 0.00211631073 0.000 0.000 -0.135 H -1.68997263563 -0.00719388386 -5.74925805817 0.000 0.067 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 -0.086 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 0.000 0.155 -0.000 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 -0.093 0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.000 -0.063 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 0.000 0.129 0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.000 0.122 0.000 H -3.29750276746 -0.00099200484 3.88584245085 -0.000 -0.200 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 -0.001 -0.630 0.000 H -4.55107479454 0.00501307822 2.13844314827 0.000 0.221 -0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.000 0.026 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.002 0.000 0.006 61 Mode 88: freq=1040.50 N -0.44003451495 -0.00038510790 2.12369783068 0.000 -0.008 -0.002 C -1.76594470239 0.00039861437 2.37754210613 -0.001 0.013 0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.002 -0.033 0.001 C -1.33887502024 -0.00450793845 4.73956848945 -0.000 -0.006 -0.000 C 0.02462671625 -0.00591801736 4.46614405978 0.002 0.014 0.001 C 0.43187566201 -0.00376957955 3.13352499014 0.001 0.021 0.001 C -2.63984642995 0.00218980399 1.17162612704 0.000 -0.006 -0.000 N -1.98513620489 0.00132140951 0.00153900685 -0.000 0.002 0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.000 -0.005 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 0.001 0.017 0.000 C -4.73391255267 0.00451580118 -0.00020876193 0.000 -0.004 0.001 C -4.02924140493 0.00399189729 1.20660077672 -0.001 -0.006 -0.000 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 0.002 -0.002 C -1.76408906064 -0.00030645034 -2.37697009192 0.001 -0.002 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.002 0.013 0.001 C -1.33713102227 -0.00526459193 -4.73855802198 0.000 0.003 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 -0.002 -0.006 0.001 C 0.43371721952 -0.00363389350 -3.13225443930 -0.001 -0.009 0.001 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 0.000 0.028 C 2.67119656792 1.17263645248 0.00045766926 0.000 -0.000 -0.049 C 4.06129317470 1.20536051565 0.00241240325 -0.000 -0.000 -0.042 C 4.76783866331 0.00148799420 0.00346798881 -0.000 0.000 -0.006 C 4.05723810074 -1.20352939940 0.00211502115 -0.000 0.000 0.059 C 2.67108506586 -1.17139122066 0.00026591651 0.000 0.000 -0.063 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 0.000 0.126 C 2.33938959521 3.68993217240 -0.00584554905 -0.000 -0.001 -0.332 C 1.45736908622 4.77231118002 -0.00917967851 0.000 -0.000 -0.063 C 0.08658913130 4.53522926787 -0.00833235387 -0.000 0.000 0.147 C -0.35359617412 3.21325694137 -0.00400174376 -0.000 0.001 0.211 N 0.49290585413 2.18198449515 -0.00068475564 0.000 -0.000 -0.067 S 6.56718562933 -0.11349126889 0.00673479967 0.000 -0.000 -0.002 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 -0.000 0.091 C 2.33969079820 -3.68709653410 -0.00625612120 -0.000 0.001 -0.192 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 0.000 -0.035 C 0.08684213972 -4.53272927032 -0.00840538011 0.000 -0.000 0.078 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 -0.000 0.121 N 0.49225266031 -2.17934076887 -0.00084210065 0.000 -0.000 -0.043 H 1.83694111827 5.77332096953 -0.01265611066 0.000 0.001 0.176 H -0.61802819388 5.33967450634 -0.01131742088 0.000 -0.001 -0.336 H 3.39175422949 3.87200638269 -0.00704552340 0.000 0.002 0.521 H -1.39787683933 2.98334799634 -0.00369736757 0.000 -0.001 -0.335 H 1.83794742242 -5.77033326187 -0.01295832570 0.000 -0.000 0.103 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 0.001 -0.184 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 0.001 -0.188 H 3.39230213722 -3.86796714602 -0.00754158092 0.000 -0.001 0.291 H 4.58301895157 2.13678100538 0.00314824260 -0.000 -0.000 0.117 H 4.58784714512 -2.12983634010 0.00211631073 0.000 0.000 -0.054 H -1.68997263563 -0.00719388386 -5.74925805817 -0.000 -0.008 0.000 H 0.75224758084 -0.00860493512 -5.25016290812 0.000 0.014 0.001 H -3.29620044300 -0.00255800648 -3.88456579214 0.001 -0.022 0.001 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 0.015 -0.001 H -1.69176120521 -0.00597000955 5.75026973076 0.000 0.018 0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.000 -0.032 0.001 H 1.46975366817 -0.00523069331 2.87805400798 0.000 -0.033 -0.001 H -3.29750276746 -0.00099200484 3.88584245085 -0.001 0.052 0.001 H -4.55513299541 0.00377930937 -2.13473279421 0.000 -0.026 -0.000 H -4.55107479454 0.00501307822 2.13844314827 -0.000 0.015 -0.000 H -6.83436893102 0.00806057203 1.19721860356 0.002 0.001 0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.000 0.000 0.005 61 Mode 89: freq=1041.86 N -0.44003451495 -0.00038510790 2.12369783068 0.001 0.072 -0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.000 -0.138 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.000 0.340 0.001 C -1.33887502024 -0.00450793845 4.73956848945 0.000 0.063 0.000 C 0.02462671625 -0.00591801736 4.46614405978 -0.000 -0.148 -0.000 C 0.43187566201 -0.00376957955 3.13352499014 -0.000 -0.212 -0.001 C -2.63984642995 0.00218980399 1.17162612704 0.000 0.063 -0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 -0.034 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.000 0.081 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 0.000 -0.104 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 0.000 0.023 0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.000 0.035 0.000 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 -0.001 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.000 0.040 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 -0.091 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 0.158 -0.000 C -1.33713102227 -0.00526459193 -4.73855802198 0.000 0.025 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 -0.000 -0.059 0.000 C 0.43371721952 -0.00363389350 -3.13225443930 -0.000 -0.095 0.000 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 -0.001 0.001 C 2.67119656792 1.17263645248 0.00045766926 0.000 0.000 -0.003 C 4.06129317470 1.20536051565 0.00241240325 -0.001 0.000 0.017 C 4.76783866331 0.00148799420 0.00346798881 -0.000 -0.001 0.010 C 4.05723810074 -1.20352939940 0.00211502115 0.001 0.000 -0.046 C 2.67108506586 -1.17139122066 0.00026591651 -0.001 0.000 0.006 C 1.82209539371 2.39842937406 -0.00175320633 -0.001 -0.000 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.002 -0.001 0.006 C 1.45736908622 4.77231118002 -0.00917967851 -0.000 0.000 0.003 C 0.08658913130 4.53522926787 -0.00833235387 0.001 -0.002 -0.003 C -0.35359617412 3.21325694137 -0.00400174376 0.001 -0.001 -0.006 N 0.49290585413 2.18198449515 -0.00068475564 0.001 0.002 0.002 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.000 -0.001 C 1.82142022278 -2.39594383179 -0.00206827421 0.001 -0.000 0.019 C 2.33969079820 -3.68709653410 -0.00625612120 0.002 -0.001 -0.074 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 0.000 -0.017 C 0.08684213972 -4.53272927032 -0.00840538011 -0.001 -0.002 0.035 C -0.35393854068 -3.21111942258 -0.00398541364 -0.001 -0.001 0.050 N 0.49225266031 -2.17934076887 -0.00084210065 -0.000 0.002 -0.014 H 1.83694111827 5.77332096953 -0.01265611066 0.000 -0.000 -0.005 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 -0.001 0.007 H 3.39175422949 3.87200638269 -0.00704552340 -0.001 -0.001 -0.012 H -1.39787683933 2.98334799634 -0.00369736757 0.000 0.000 0.009 H 1.83794742242 -5.77033326187 -0.01295832570 0.000 -0.000 0.043 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 -0.001 -0.078 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 0.001 -0.080 H 3.39230213722 -3.86796714602 -0.00754158092 0.001 -0.001 0.122 H 4.58301895157 2.13678100538 0.00314824260 -0.000 0.000 -0.029 H 4.58784714512 -2.12983634010 0.00211631073 0.000 0.000 0.079 H -1.68997263563 -0.00719388386 -5.74925805817 -0.000 -0.082 0.000 H 0.75224758084 -0.00860493512 -5.25016290812 0.000 0.144 -0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 -0.230 0.001 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 0.143 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.000 -0.179 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 0.000 0.340 0.001 H 1.46975366817 -0.00523069331 2.87805400798 0.001 0.330 0.001 H -3.29750276746 -0.00099200484 3.88584245085 -0.001 -0.532 -0.001 H -4.55513299541 0.00377930937 -2.13473279421 0.000 0.123 -0.000 H -4.55107479454 0.00501307822 2.13844314827 -0.000 -0.113 0.000 H -6.83436893102 0.00806057203 1.19721860356 0.000 -0.007 0.000 H 6.86748209639 1.20005966818 0.00372860376 0.002 -0.000 -0.003 61 Mode 90: freq=1042.91 N -0.44003451495 -0.00038510790 2.12369783068 -0.000 -0.002 0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.000 -0.002 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.000 -0.012 -0.001 C -1.33887502024 -0.00450793845 4.73956848945 0.000 -0.005 0.000 C 0.02462671625 -0.00591801736 4.46614405978 -0.000 0.007 0.000 C 0.43187566201 -0.00376957955 3.13352499014 -0.000 0.011 -0.000 C -2.63984642995 0.00218980399 1.17162612704 0.000 0.011 0.000 N -1.98513620489 0.00132140951 0.00153900685 -0.000 -0.008 0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.000 0.006 0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.000 0.099 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 -0.019 -0.000 C -4.02924140493 0.00399189729 1.20660077672 0.000 -0.047 -0.000 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 -0.001 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.000 0.047 0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 -0.077 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 -0.000 0.235 -0.001 C -1.33713102227 -0.00526459193 -4.73855802198 0.000 0.051 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 0.000 -0.108 0.000 C 0.43371721952 -0.00363389350 -3.13225443930 -0.000 -0.152 0.000 S -6.53329279136 0.00637481657 -0.11611178087 0.000 0.001 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 -0.000 0.003 C 2.67119656792 1.17263645248 0.00045766926 -0.000 0.000 0.004 C 4.06129317470 1.20536051565 0.00241240325 -0.001 0.000 -0.077 C 4.76783866331 0.00148799420 0.00346798881 0.000 -0.000 -0.037 C 4.05723810074 -1.20352939940 0.00211502115 0.001 0.000 0.180 C 2.67108506586 -1.17139122066 0.00026591651 0.000 0.000 -0.037 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 -0.000 0.024 C 2.33938959521 3.68993217240 -0.00584554905 -0.001 -0.001 -0.090 C 1.45736908622 4.77231118002 -0.00917967851 -0.000 0.000 -0.022 C 0.08658913130 4.53522926787 -0.00833235387 0.001 -0.000 0.043 C -0.35359617412 3.21325694137 -0.00400174376 0.000 -0.000 0.061 N 0.49290585413 2.18198449515 -0.00068475564 0.000 0.001 -0.017 S 6.56718562933 -0.11349126889 0.00673479967 0.000 -0.000 0.002 C 1.82142022278 -2.39594383179 -0.00206827421 0.000 -0.000 -0.048 C 2.33969079820 -3.68709653410 -0.00625612120 0.001 -0.001 0.220 C 1.45789786198 -4.76953179608 -0.00945089783 -0.000 -0.000 0.055 C 0.08684213972 -4.53272927032 -0.00840538011 -0.001 -0.000 -0.111 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 0.000 -0.149 N 0.49225266031 -2.17934076887 -0.00084210065 -0.001 0.001 0.037 H 1.83694111827 5.77332096953 -0.01265611066 0.000 0.000 0.053 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 -0.001 -0.096 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 0.000 0.149 H -1.39787683933 2.98334799634 -0.00369736757 0.000 -0.000 -0.098 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 0.000 -0.130 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 -0.001 0.240 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 -0.001 0.243 H 3.39230213722 -3.86796714602 -0.00754158092 0.000 0.001 -0.372 H 4.58301895157 2.13678100538 0.00314824260 -0.001 0.000 0.137 H 4.58784714512 -2.12983634010 0.00211631073 0.001 0.000 -0.297 H -1.68997263563 -0.00719388386 -5.74925805817 0.000 -0.133 0.000 H 0.75224758084 -0.00860493512 -5.25016290812 0.000 0.242 -0.001 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 -0.381 0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 0.241 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.000 0.010 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 0.000 -0.014 -0.000 H 1.46975366817 -0.00523069331 2.87805400798 -0.000 -0.017 -0.000 H -3.29750276746 -0.00099200484 3.88584245085 0.000 0.024 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 -0.000 -0.180 0.000 H -4.55107479454 0.00501307822 2.13844314827 0.000 0.074 -0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.000 0.008 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.000 0.000 0.014 61 Mode 91: freq=1044.54 N -0.44003451495 -0.00038510790 2.12369783068 -0.000 -0.022 0.000 C -1.76594470239 0.00039861437 2.37754210613 0.000 0.039 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.000 -0.126 0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.000 -0.027 -0.000 C 0.02462671625 -0.00591801736 4.46614405978 0.000 0.061 -0.000 C 0.43187566201 -0.00376957955 3.13352499014 0.000 0.079 0.000 C -2.63984642995 0.00218980399 1.17162612704 -0.000 0.000 -0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 0.002 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.000 -0.026 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 0.000 0.162 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 -0.030 0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.000 -0.079 0.000 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 -0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.000 0.039 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 -0.058 -0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 0.227 -0.000 C -1.33713102227 -0.00526459193 -4.73855802198 0.000 0.052 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 -0.000 -0.113 -0.000 C 0.43371721952 -0.00363389350 -3.13225443930 -0.000 -0.146 0.001 S -6.53329279136 0.00637481657 -0.11611178087 0.000 0.001 0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 -0.000 -0.004 C 2.67119656792 1.17263645248 0.00045766926 0.000 0.000 -0.006 C 4.06129317470 1.20536051565 0.00241240325 -0.001 -0.000 0.075 C 4.76783866331 0.00148799420 0.00346798881 -0.000 -0.000 0.030 C 4.05723810074 -1.20352939940 0.00211502115 0.001 0.000 -0.158 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 0.000 0.040 C 1.82209539371 2.39842937406 -0.00175320633 0.000 -0.000 -0.027 C 2.33938959521 3.68993217240 -0.00584554905 -0.000 -0.000 0.102 C 1.45736908622 4.77231118002 -0.00917967851 -0.000 0.000 0.023 C 0.08658913130 4.53522926787 -0.00833235387 0.000 0.000 -0.051 C -0.35359617412 3.21325694137 -0.00400174376 0.000 -0.000 -0.065 N 0.49290585413 2.18198449515 -0.00068475564 0.000 0.000 0.016 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.000 -0.001 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 0.000 0.028 C 2.33969079820 -3.68709653410 -0.00625612120 0.000 0.000 -0.162 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 0.000 -0.041 C 0.08684213972 -4.53272927032 -0.00840538011 -0.000 -0.000 0.086 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 -0.001 0.108 N 0.49225266031 -2.17934076887 -0.00084210065 -0.000 0.000 -0.024 H 1.83694111827 5.77332096953 -0.01265611066 0.000 -0.000 -0.057 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 0.000 0.110 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 -0.001 -0.169 H -1.39787683933 2.98334799634 -0.00369736757 -0.000 0.000 0.108 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 -0.000 0.095 H -0.61749414542 -5.33746053721 -0.01121572048 -0.000 0.001 -0.182 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 0.001 -0.181 H 3.39230213722 -3.86796714602 -0.00754158092 0.000 -0.001 0.279 H 4.58301895157 2.13678100538 0.00314824260 0.000 -0.000 -0.134 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 -0.000 0.256 H -1.68997263563 -0.00719388386 -5.74925805817 -0.000 -0.129 0.000 H 0.75224758084 -0.00860493512 -5.25016290812 0.000 0.245 -0.001 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 -0.379 0.001 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 0.238 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 0.000 0.069 0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.000 -0.134 -0.000 H 1.46975366817 -0.00523069331 2.87805400798 -0.000 -0.128 -0.000 H -3.29750276746 -0.00099200484 3.88584245085 0.000 0.207 0.000 H -4.55513299541 0.00377930937 -2.13473279421 -0.000 -0.271 0.000 H -4.55107479454 0.00501307822 2.13844314827 0.000 0.142 -0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.000 0.013 -0.000 H 6.86748209639 1.20005966818 0.00372860376 0.001 -0.000 -0.012 61 Mode 92: freq=1088.92 N -0.44003451495 -0.00038510790 2.12369783068 -0.114 -0.000 0.291 C -1.76594470239 0.00039861437 2.37754210613 0.107 -0.000 0.051 C -2.24923313135 -0.00145267054 3.67997125809 0.281 -0.000 -0.028 C -1.33887502024 -0.00450793845 4.73956848945 -0.004 0.000 -0.052 C 0.02462671625 -0.00591801736 4.46614405978 -0.175 0.001 -0.236 C 0.43187566201 -0.00376957955 3.13352499014 -0.053 0.000 0.018 C -2.63984642995 0.00218980399 1.17162612704 0.029 -0.000 0.044 N -1.98513620489 0.00132140951 0.00153900685 0.091 -0.000 -0.001 C -2.63911589169 0.00167522827 -1.17277445342 0.018 0.000 -0.045 C -4.02452897564 0.00329996303 -1.20791476641 -0.059 -0.000 -0.015 C -4.73391255267 0.00451580118 -0.00020876193 -0.131 0.000 -0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.060 0.000 0.021 Co 0.00000000000 0.00000000000 0.00000000000 -0.024 0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.106 -0.000 -0.278 C -1.76408906064 -0.00030645034 -2.37697009192 0.100 -0.000 -0.049 C -2.24773885821 -0.00257631963 -3.67934971086 0.270 -0.000 0.028 C -1.33713102227 -0.00526459193 -4.73855802198 -0.004 0.000 0.049 C 0.02654101484 -0.00591797621 -4.46472703619 -0.169 0.001 0.225 C 0.43371721952 -0.00363389350 -3.13225443930 -0.048 0.000 -0.016 S -6.53329279136 0.00637481657 -0.11611178087 0.031 -0.000 -0.005 N 2.00981687167 0.00259443239 -0.00000686048 0.017 0.000 -0.000 C 2.67119656792 1.17263645248 0.00045766926 0.022 -0.024 -0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.022 0.022 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.094 -0.000 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.021 -0.024 0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.016 0.025 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.078 -0.036 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.223 0.021 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.003 0.026 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.135 0.192 -0.001 C -0.35359617412 3.21325694137 -0.00400174376 -0.037 -0.007 0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.093 -0.235 0.001 S 6.56718562933 -0.11349126889 0.00673479967 0.023 0.002 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.074 0.035 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.216 -0.021 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.003 -0.025 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.131 -0.186 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.035 0.006 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.089 0.227 0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.009 0.008 0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.034 0.068 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.065 0.035 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.014 -0.005 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.008 -0.007 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.034 -0.065 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.013 0.005 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.063 -0.033 -0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.001 0.002 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 -0.002 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.009 -0.000 0.015 H 0.75224758084 -0.00860493512 -5.25016290812 -0.048 0.000 0.076 H -3.29620044300 -0.00255800648 -3.88456579214 0.079 0.000 0.038 H 1.47161249279 -0.00457826661 -2.87685200854 -0.017 -0.000 -0.009 H -1.69176120521 -0.00597000955 5.75026973076 0.010 -0.000 -0.016 H 0.75025791005 -0.00892914887 5.25161119224 -0.049 0.001 -0.080 H 1.46975366817 -0.00523069331 2.87805400798 -0.019 -0.000 0.009 H -3.29750276746 -0.00099200484 3.88584245085 0.082 -0.000 -0.040 H -4.55513299541 0.00377930937 -2.13473279421 -0.015 0.000 -0.008 H -4.55107479454 0.00501307822 2.13844314827 -0.014 0.000 0.011 H -6.83436893102 0.00806057203 1.19721860356 0.037 -0.000 0.005 H 6.86748209639 1.20005966818 0.00372860376 0.017 -0.002 0.000 61 Mode 93: freq=1100.13 N -0.44003451495 -0.00038510790 2.12369783068 0.085 0.001 -0.216 C -1.76594470239 0.00039861437 2.37754210613 -0.069 -0.000 -0.046 C -2.24923313135 -0.00145267054 3.67997125809 -0.212 0.000 0.013 C -1.33887502024 -0.00450793845 4.73956848945 -0.006 -0.000 0.058 C 0.02462671625 -0.00591801736 4.46614405978 0.138 -0.000 0.174 C 0.43187566201 -0.00376957955 3.13352499014 0.044 -0.000 -0.027 C -2.63984642995 0.00218980399 1.17162612704 -0.022 0.000 -0.036 N -1.98513620489 0.00132140951 0.00153900685 -0.112 0.000 0.002 C -2.63911589169 0.00167522827 -1.17277445342 -0.014 0.000 0.040 C -4.02452897564 0.00329996303 -1.20791476641 0.056 -0.000 0.044 C -4.73391255267 0.00451580118 -0.00020876193 0.101 -0.000 0.000 C -4.02924140493 0.00399189729 1.20660077672 0.060 -0.000 -0.050 Co 0.00000000000 0.00000000000 0.00000000000 -0.002 0.001 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.074 0.001 0.190 C -1.76408906064 -0.00030645034 -2.37697009192 -0.060 -0.000 0.043 C -2.24773885821 -0.00257631963 -3.67934971086 -0.190 0.000 -0.013 C -1.33713102227 -0.00526459193 -4.73855802198 -0.006 -0.000 -0.055 C 0.02654101484 -0.00591797621 -4.46472703619 0.124 -0.000 -0.153 C 0.43371721952 -0.00363389350 -3.13225443930 0.040 -0.000 0.024 S -6.53329279136 0.00637481657 -0.11611178087 -0.023 0.000 0.004 N 2.00981687167 0.00259443239 -0.00000686048 0.211 0.003 0.000 C 2.67119656792 1.17263645248 0.00045766926 0.030 -0.053 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.106 -0.107 -0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.136 0.001 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.096 0.098 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.016 0.061 0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.083 -0.067 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.290 0.017 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.019 0.079 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.187 0.241 -0.001 C -0.35359617412 3.21325694137 -0.00400174376 -0.070 -0.030 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.115 -0.295 0.001 S 6.56718562933 -0.11349126889 0.00673479967 0.031 0.007 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.067 0.063 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.238 -0.015 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.019 -0.075 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.155 -0.193 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.061 0.027 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.091 0.235 0.001 H 1.83694111827 5.77332096953 -0.01265611066 0.019 0.024 0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.058 0.077 -0.001 H 3.39175422949 3.87200638269 -0.00704552340 0.089 0.018 0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.022 -0.023 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.015 -0.023 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.051 -0.060 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.019 0.021 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.074 -0.013 -0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.029 -0.038 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.029 0.033 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.010 0.000 -0.017 H 0.75224758084 -0.00860493512 -5.25016290812 0.041 -0.000 -0.047 H -3.29620044300 -0.00255800648 -3.88456579214 -0.058 -0.000 -0.013 H 1.47161249279 -0.00457826661 -2.87685200854 0.013 0.000 0.014 H -1.69176120521 -0.00597000955 5.75026973076 -0.012 0.000 0.018 H 0.75025791005 -0.00892914887 5.25161119224 0.044 -0.000 0.054 H 1.46975366817 -0.00523069331 2.87805400798 0.015 0.000 -0.015 H -3.29750276746 -0.00099200484 3.88584245085 -0.065 -0.000 0.015 H -4.55513299541 0.00377930937 -2.13473279421 0.014 0.000 0.017 H -4.55107479454 0.00501307822 2.13844314827 0.014 0.000 -0.020 H -6.83436893102 0.00806057203 1.19721860356 -0.030 0.000 -0.005 H 6.86748209639 1.20005966818 0.00372860376 0.049 -0.008 0.000 61 Mode 94: freq=1106.09 N -0.44003451495 -0.00038510790 2.12369783068 -0.006 0.008 0.017 C -1.76594470239 0.00039861437 2.37754210613 0.005 -0.004 0.004 C -2.24923313135 -0.00145267054 3.67997125809 0.016 0.003 -0.001 C -1.33887502024 -0.00450793845 4.73956848945 0.001 -0.002 -0.005 C 0.02462671625 -0.00591801736 4.46614405978 -0.011 -0.003 -0.014 C 0.43187566201 -0.00376957955 3.13352499014 -0.004 0.002 0.003 C -2.63984642995 0.00218980399 1.17162612704 0.002 0.002 0.003 N -1.98513620489 0.00132140951 0.00153900685 0.009 0.000 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.001 0.002 -0.003 C -4.02452897564 0.00329996303 -1.20791476641 -0.004 -0.002 -0.004 C -4.73391255267 0.00451580118 -0.00020876193 -0.008 0.001 -0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.005 -0.001 0.004 Co 0.00000000000 0.00000000000 0.00000000000 -0.001 0.015 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.004 0.008 -0.011 C -1.76408906064 -0.00030645034 -2.37697009192 0.004 -0.004 -0.003 C -2.24773885821 -0.00257631963 -3.67934971086 0.012 0.003 0.000 C -1.33713102227 -0.00526459193 -4.73855802198 0.001 -0.002 0.005 C 0.02654101484 -0.00591797621 -4.46472703619 -0.008 -0.003 0.009 C 0.43371721952 -0.00363389350 -3.13225443930 -0.003 0.002 -0.002 S -6.53329279136 0.00637481657 -0.11611178087 0.002 -0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.005 0.054 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.006 0.053 -0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.068 -0.014 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.008 0.013 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.069 0.002 0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.007 0.048 0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.066 -0.007 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.325 0.013 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.007 0.001 0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.215 0.296 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.000 -0.021 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.133 -0.369 0.001 S 6.56718562933 -0.11349126889 0.00673479967 0.004 -0.015 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.078 -0.015 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.374 0.015 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.005 0.010 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.248 0.338 0.001 C -0.35393854068 -3.21111942258 -0.00398541364 0.006 -0.026 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.151 -0.420 -0.001 H 1.83694111827 5.77332096953 -0.01265611066 0.026 -0.006 0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.062 0.097 -0.001 H 3.39175422949 3.87200638269 -0.00704552340 0.097 0.026 0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.002 -0.015 0.001 H 1.83794742242 -5.77033326187 -0.01295832570 -0.031 -0.003 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.073 0.110 0.001 H -1.39833026435 -2.98175334118 -0.00345676225 0.004 -0.019 -0.001 H 3.39230213722 -3.86796714602 -0.00754158092 -0.112 0.030 -0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.021 -0.005 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.021 -0.000 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.001 0.003 0.001 H 0.75224758084 -0.00860493512 -5.25016290812 -0.003 0.005 0.003 H -3.29620044300 -0.00255800648 -3.88456579214 0.004 -0.004 0.000 H 1.47161249279 -0.00457826661 -2.87685200854 -0.001 -0.005 -0.002 H -1.69176120521 -0.00597000955 5.75026973076 0.001 0.003 -0.002 H 0.75025791005 -0.00892914887 5.25161119224 -0.004 0.005 -0.004 H 1.46975366817 -0.00523069331 2.87805400798 -0.001 -0.006 0.002 H -3.29750276746 -0.00099200484 3.88584245085 0.005 -0.003 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 -0.001 0.002 -0.002 H -4.55107479454 0.00501307822 2.13844314827 -0.001 0.002 0.002 H -6.83436893102 0.00806057203 1.19721860356 0.002 0.000 0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.047 0.008 -0.000 61 Mode 95: freq=1108.94 N -0.44003451495 -0.00038510790 2.12369783068 -0.132 -0.001 0.377 C -1.76594470239 0.00039861437 2.37754210613 0.075 -0.000 0.010 C -2.24923313135 -0.00145267054 3.67997125809 0.336 -0.000 -0.007 C -1.33887502024 -0.00450793845 4.73956848945 -0.005 0.000 -0.023 C 0.02462671625 -0.00591801736 4.46614405978 -0.232 0.000 -0.304 C 0.43187566201 -0.00376957955 3.13352499014 -0.004 0.000 0.039 C -2.63984642995 0.00218980399 1.17162612704 -0.006 0.000 -0.054 N -1.98513620489 0.00132140951 0.00153900685 0.014 -0.000 -0.059 C -2.63911589169 0.00167522827 -1.17277445342 0.010 -0.000 -0.052 C -4.02452897564 0.00329996303 -1.20791476641 0.068 0.000 -0.005 C -4.73391255267 0.00451580118 -0.00020876193 0.001 -0.000 -0.013 C -4.02924140493 0.00399189729 1.20660077672 -0.075 0.000 0.020 Co 0.00000000000 0.00000000000 0.00000000000 -0.001 -0.000 -0.021 N -0.43839318333 -0.00054206762 -2.12229806799 0.140 0.001 0.404 C -1.76408906064 -0.00030645034 -2.37697009192 -0.080 0.000 0.013 C -2.24773885821 -0.00257631963 -3.67934971086 -0.362 0.000 -0.009 C -1.33713102227 -0.00526459193 -4.73855802198 0.004 -0.000 -0.025 C 0.02654101484 -0.00591797621 -4.46472703619 0.250 -0.000 -0.325 C 0.43371721952 -0.00363389350 -3.13225443930 0.004 -0.000 0.041 S -6.53329279136 0.00637481657 -0.11611178087 0.006 0.000 0.015 N 2.00981687167 0.00259443239 -0.00000686048 0.010 -0.000 0.001 C 2.67119656792 1.17263645248 0.00045766926 0.001 -0.002 -0.003 C 4.06129317470 1.20536051565 0.00241240325 -0.004 -0.006 0.002 C 4.76783866331 0.00148799420 0.00346798881 -0.004 -0.000 -0.001 C 4.05723810074 -1.20352939940 0.00211502115 -0.004 0.005 0.002 C 2.67108506586 -1.17139122066 0.00026591651 0.000 0.002 -0.003 C 1.82209539371 2.39842937406 -0.00175320633 0.001 -0.002 0.004 C 2.33938959521 3.68993217240 -0.00584554905 0.003 -0.000 -0.003 C 1.45736908622 4.77231118002 -0.00917967851 0.001 0.003 0.003 C 0.08658913130 4.53522926787 -0.00833235387 -0.003 0.003 0.003 C -0.35359617412 3.21325694137 -0.00400174376 -0.002 -0.001 -0.002 N 0.49290585413 2.18198449515 -0.00068475564 -0.001 -0.003 -0.007 S 6.56718562933 -0.11349126889 0.00673479967 0.001 0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.001 0.002 0.004 C 2.33969079820 -3.68709653410 -0.00625612120 0.007 -0.000 -0.003 C 1.45789786198 -4.76953179608 -0.00945089783 0.001 -0.003 0.002 C 0.08684213972 -4.53272927032 -0.00840538011 -0.005 -0.006 0.003 C -0.35393854068 -3.21111942258 -0.00398541364 -0.002 0.001 -0.002 N 0.49225266031 -2.17934076887 -0.00084210065 -0.002 0.007 -0.007 H 1.83694111827 5.77332096953 -0.01265611066 0.001 0.001 -0.003 H -0.61802819388 5.33967450634 -0.01131742088 -0.001 0.001 -0.005 H 3.39175422949 3.87200638269 -0.00704552340 0.001 -0.001 0.004 H -1.39787683933 2.98334799634 -0.00369736757 -0.001 -0.001 0.006 H 1.83794742242 -5.77033326187 -0.01295832570 0.001 -0.001 -0.003 H -0.61749414542 -5.33746053721 -0.01121572048 -0.002 -0.002 -0.005 H -1.39833026435 -2.98175334118 -0.00345676225 -0.001 0.001 0.006 H 3.39230213722 -3.86796714602 -0.00754158092 0.002 0.000 0.004 H 4.58301895157 2.13678100538 0.00314824260 -0.001 -0.002 -0.002 H 4.58784714512 -2.12983634010 0.00211631073 -0.001 0.002 -0.002 H -1.68997263563 -0.00719388386 -5.74925805817 -0.034 0.000 -0.001 H 0.75224758084 -0.00860493512 -5.25016290812 0.080 -0.001 -0.101 H -3.29620044300 -0.00255800648 -3.88456579214 -0.109 0.000 -0.018 H 1.47161249279 -0.00457826661 -2.87685200854 0.003 0.001 0.026 H -1.69176120521 -0.00597000955 5.75026973076 0.032 -0.000 -0.001 H 0.75025791005 -0.00892914887 5.25161119224 -0.074 0.001 -0.095 H 1.46975366817 -0.00523069331 2.87805400798 -0.003 -0.001 0.024 H -3.29750276746 -0.00099200484 3.88584245085 0.102 -0.000 -0.016 H -4.55513299541 0.00377930937 -2.13473279421 0.022 -0.000 -0.001 H -4.55107479454 0.00501307822 2.13844314827 -0.023 0.000 0.007 H -6.83436893102 0.00806057203 1.19721860356 -0.046 0.000 -0.008 H 6.86748209639 1.20005966818 0.00372860376 0.002 -0.000 -0.000 61 Mode 96: freq=1125.58 N -0.44003451495 -0.00038510790 2.12369783068 0.005 -0.001 -0.037 C -1.76594470239 0.00039861437 2.37754210613 -0.015 -0.001 -0.031 C -2.24923313135 -0.00145267054 3.67997125809 -0.050 0.003 -0.014 C -1.33887502024 -0.00450793845 4.73956848945 -0.029 -0.002 0.060 C 0.02462671625 -0.00591801736 4.46614405978 0.050 -0.004 0.047 C 0.43187566201 -0.00376957955 3.13352499014 0.044 0.006 -0.033 C -2.63984642995 0.00218980399 1.17162612704 -0.014 0.000 -0.021 N -1.98513620489 0.00132140951 0.00153900685 -0.087 -0.000 -0.001 C -2.63911589169 0.00167522827 -1.17277445342 -0.009 0.000 0.021 C -4.02452897564 0.00329996303 -1.20791476641 0.034 -0.000 0.046 C -4.73391255267 0.00451580118 -0.00020876193 0.056 -0.000 -0.001 C -4.02924140493 0.00399189729 1.20660077672 0.034 -0.000 -0.047 Co 0.00000000000 0.00000000000 0.00000000000 0.044 0.001 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.007 -0.001 0.042 C -1.76408906064 -0.00030645034 -2.37697009192 -0.014 -0.001 0.030 C -2.24773885821 -0.00257631963 -3.67934971086 -0.056 0.003 0.014 C -1.33713102227 -0.00526459193 -4.73855802198 -0.028 -0.002 -0.060 C 0.02654101484 -0.00591797621 -4.46472703619 0.054 -0.004 -0.051 C 0.43371721952 -0.00363389350 -3.13225443930 0.041 0.006 0.034 S -6.53329279136 0.00637481657 -0.11611178087 -0.011 0.000 0.002 N 2.00981687167 0.00259443239 -0.00000686048 -0.597 0.004 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.030 0.027 -0.001 C 4.06129317470 1.20536051565 0.00241240325 0.228 0.398 0.000 C 4.76783866331 0.00148799420 0.00346798881 0.103 0.000 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.228 -0.384 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.003 -0.027 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.019 0.028 0.001 C 2.33938959521 3.68993217240 -0.00584554905 0.106 0.017 -0.002 C 1.45736908622 4.77231118002 -0.00917967851 -0.041 -0.066 0.002 C 0.08658913130 4.53522926787 -0.00833235387 -0.042 0.092 0.003 C -0.35359617412 3.21325694137 -0.00400174376 0.063 0.009 -0.005 N 0.49290585413 2.18198449515 -0.00068475564 -0.073 -0.140 0.001 S 6.56718562933 -0.11349126889 0.00673479967 -0.023 -0.015 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.023 -0.022 0.001 C 2.33969079820 -3.68709653410 -0.00625612120 0.081 -0.015 -0.002 C 1.45789786198 -4.76953179608 -0.00945089783 -0.035 0.057 0.002 C 0.08684213972 -4.53272927032 -0.00840538011 -0.028 -0.074 0.003 C -0.35393854068 -3.21111942258 -0.00398541364 0.047 -0.007 -0.005 N 0.49225266031 -2.17934076887 -0.00084210065 -0.064 0.115 0.001 H 1.83694111827 5.77332096953 -0.01265611066 -0.011 -0.020 -0.003 H -0.61802819388 5.33967450634 -0.01131742088 -0.005 0.034 -0.005 H 3.39175422949 3.87200638269 -0.00704552340 0.023 0.054 0.003 H -1.39787683933 2.98334799634 -0.00369736757 0.013 0.025 0.008 H 1.83794742242 -5.77033326187 -0.01295832570 -0.010 0.018 -0.003 H -0.61749414542 -5.33746053721 -0.01121572048 0.001 -0.031 -0.004 H -1.39833026435 -2.98175334118 -0.00345676225 0.009 -0.023 0.007 H 3.39230213722 -3.86796714602 -0.00754158092 0.017 -0.048 0.003 H 4.58301895157 2.13678100538 0.00314824260 0.063 0.129 0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.075 -0.118 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.022 0.004 -0.015 H 0.75224758084 -0.00860493512 -5.25016290812 0.025 0.005 -0.010 H -3.29620044300 -0.00255800648 -3.88456579214 -0.022 -0.004 0.026 H 1.47161249279 -0.00457826661 -2.87685200854 0.007 -0.010 0.035 H -1.69176120521 -0.00597000955 5.75026973076 -0.022 0.004 0.015 H 0.75025791005 -0.00892914887 5.25161119224 0.023 0.005 0.009 H 1.46975366817 -0.00523069331 2.87805400798 0.008 -0.009 -0.035 H -3.29750276746 -0.00099200484 3.88584245085 -0.020 -0.004 -0.026 H -4.55513299541 0.00377930937 -2.13473279421 0.005 -0.000 0.018 H -4.55107479454 0.00501307822 2.13844314827 0.004 -0.000 -0.019 H -6.83436893102 0.00806057203 1.19721860356 -0.016 0.000 -0.003 H 6.86748209639 1.20005966818 0.00372860376 -0.086 0.015 -0.000 61 Mode 97: freq=1126.61 N -0.44003451495 -0.00038510790 2.12369783068 -0.000 -0.001 -0.000 C -1.76594470239 0.00039861437 2.37754210613 0.000 0.000 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.000 -0.000 -0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.000 0.002 0.000 C 0.02462671625 -0.00591801736 4.46614405978 0.000 -0.001 0.000 C 0.43187566201 -0.00376957955 3.13352499014 0.000 -0.001 -0.000 C -2.63984642995 0.00218980399 1.17162612704 -0.000 -0.003 0.000 N -1.98513620489 0.00132140951 0.00153900685 -0.000 0.000 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.000 0.003 0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.000 -0.003 0.000 C -4.73391255267 0.00451580118 -0.00020876193 0.000 0.000 -0.000 C -4.02924140493 0.00399189729 1.20660077672 0.000 0.003 -0.000 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.000 0.000 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 -0.000 -0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 0.001 -0.000 C -1.33713102227 -0.00526459193 -4.73855802198 0.000 -0.002 0.000 C 0.02654101484 -0.00591797621 -4.46472703619 -0.000 0.000 0.000 C 0.43371721952 -0.00363389350 -3.13225443930 -0.000 0.001 -0.000 S -6.53329279136 0.00637481657 -0.11611178087 0.000 0.000 0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.001 0.000 0.001 C 2.67119656792 1.17263645248 0.00045766926 0.000 0.000 0.020 C 4.06129317470 1.20536051565 0.00241240325 -0.000 -0.000 0.002 C 4.76783866331 0.00148799420 0.00346798881 -0.000 -0.000 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.000 0.000 -0.002 C 2.67108506586 -1.17139122066 0.00026591651 0.000 0.000 -0.024 C 1.82209539371 2.39842937406 -0.00175320633 0.000 -0.000 -0.055 C 2.33938959521 3.68993217240 -0.00584554905 0.000 0.000 0.125 C 1.45736908622 4.77231118002 -0.00917967851 0.000 0.000 -0.106 C 0.08658913130 4.53522926787 -0.00833235387 -0.001 0.000 -0.163 C -0.35359617412 3.21325694137 -0.00400174376 -0.000 0.001 0.270 N 0.49290585413 2.18198449515 -0.00068475564 0.000 -0.001 -0.032 S 6.56718562933 -0.11349126889 0.00673479967 0.000 0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 -0.000 0.065 C 2.33969079820 -3.68709653410 -0.00625612120 -0.001 0.000 -0.149 C 1.45789786198 -4.76953179608 -0.00945089783 -0.000 0.000 0.121 C 0.08684213972 -4.53272927032 -0.00840538011 0.001 0.000 0.197 C -0.35393854068 -3.21111942258 -0.00398541364 0.000 0.001 -0.321 N 0.49225266031 -2.17934076887 -0.00084210065 -0.000 -0.001 0.038 H 1.83694111827 5.77332096953 -0.01265611066 0.001 0.001 0.181 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 0.001 0.223 H 3.39175422949 3.87200638269 -0.00704552340 0.000 -0.001 -0.169 H -1.39787683933 2.98334799634 -0.00369736757 0.000 -0.002 -0.416 H 1.83794742242 -5.77033326187 -0.01295832570 -0.001 0.001 -0.208 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 0.001 -0.270 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 -0.002 0.493 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 -0.001 0.204 H 4.58301895157 2.13678100538 0.00314824260 -0.000 -0.000 -0.012 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 0.000 0.014 H -1.68997263563 -0.00719388386 -5.74925805817 0.000 0.003 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 -0.001 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 0.000 -0.000 -0.000 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 -0.002 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.000 -0.003 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 0.000 0.001 0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.000 0.001 -0.000 H -3.29750276746 -0.00099200484 3.88584245085 -0.000 -0.000 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 -0.000 0.004 0.000 H -4.55107479454 0.00501307822 2.13844314827 0.000 -0.004 -0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.000 -0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 0.000 -0.000 -0.001 61 Mode 98: freq=1126.78 N -0.44003451495 -0.00038510790 2.12369783068 -0.001 0.000 -0.004 C -1.76594470239 0.00039861437 2.37754210613 0.001 -0.000 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.002 0.000 -0.001 C -1.33887502024 -0.00450793845 4.73956848945 -0.002 -0.000 0.001 C 0.02462671625 -0.00591801736 4.46614405978 0.003 0.000 0.004 C 0.43187566201 -0.00376957955 3.13352499014 0.002 0.000 -0.001 C -2.63984642995 0.00218980399 1.17162612704 -0.002 0.000 0.003 N -1.98513620489 0.00132140951 0.00153900685 -0.003 0.000 -0.001 C -2.63911589169 0.00167522827 -1.17277445342 0.002 -0.000 0.002 C -4.02452897564 0.00329996303 -1.20791476641 -0.003 0.000 0.003 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 -0.000 -0.003 C -4.02924140493 0.00399189729 1.20660077672 0.005 -0.000 -0.001 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 -0.000 -0.002 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 -0.000 -0.007 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 0.000 -0.001 C -2.24773885821 -0.00257631963 -3.67934971086 0.005 -0.000 -0.001 C -1.33713102227 -0.00526459193 -4.73855802198 0.003 0.000 0.002 C 0.02654101484 -0.00591797621 -4.46472703619 -0.006 0.000 0.007 C 0.43371721952 -0.00363389350 -3.13225443930 -0.003 -0.000 -0.003 S -6.53329279136 0.00637481657 -0.11611178087 0.000 -0.000 0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.010 -0.000 0.012 C 2.67119656792 1.17263645248 0.00045766926 0.000 -0.000 -0.027 C 4.06129317470 1.20536051565 0.00241240325 -0.004 -0.007 0.003 C 4.76783866331 0.00148799420 0.00346798881 -0.001 0.000 -0.001 C 4.05723810074 -1.20352939940 0.00211502115 -0.004 0.007 0.003 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 -0.000 -0.023 C 1.82209539371 2.39842937406 -0.00175320633 -0.001 0.000 0.064 C 2.33938959521 3.68993217240 -0.00584554905 -0.002 -0.000 -0.147 C 1.45736908622 4.77231118002 -0.00917967851 -0.000 0.000 0.125 C 0.08658913130 4.53522926787 -0.00833235387 0.001 -0.001 0.193 C -0.35359617412 3.21325694137 -0.00400174376 0.000 -0.001 -0.322 N 0.49290585413 2.18198449515 -0.00068475564 0.001 0.003 0.039 S 6.56718562933 -0.11349126889 0.00673479967 0.000 0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.001 -0.000 0.054 C 2.33969079820 -3.68709653410 -0.00625612120 -0.002 0.000 -0.125 C 1.45789786198 -4.76953179608 -0.00945089783 -0.000 -0.000 0.102 C 0.08684213972 -4.53272927032 -0.00840538011 0.001 0.001 0.165 C -0.35393854068 -3.21111942258 -0.00398541364 0.000 0.001 -0.270 N 0.49225266031 -2.17934076887 -0.00084210065 0.001 -0.002 0.033 H 1.83694111827 5.77332096953 -0.01265611066 -0.001 -0.001 -0.215 H -0.61802819388 5.33967450634 -0.01131742088 0.000 -0.002 -0.263 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 0.000 0.200 H -1.39787683933 2.98334799634 -0.00369736757 -0.000 0.002 0.495 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 0.000 -0.175 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 0.001 -0.226 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 -0.002 0.415 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 -0.000 0.171 H 4.58301895157 2.13678100538 0.00314824260 -0.001 -0.002 0.010 H 4.58784714512 -2.12983634010 0.00211631073 -0.001 0.002 0.008 H -1.68997263563 -0.00719388386 -5.74925805817 0.004 -0.000 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.002 -0.000 0.002 H -3.29620044300 -0.00255800648 -3.88456579214 0.002 0.000 -0.002 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 0.001 -0.004 H -1.69176120521 -0.00597000955 5.75026973076 -0.003 0.000 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 0.001 -0.000 0.002 H 1.46975366817 -0.00523069331 2.87805400798 0.000 -0.000 -0.003 H -3.29750276746 -0.00099200484 3.88584245085 -0.001 0.000 -0.002 H -4.55513299541 0.00377930937 -2.13473279421 -0.001 -0.000 0.001 H -4.55107479454 0.00501307822 2.13844314827 0.001 0.000 -0.001 H -6.83436893102 0.00806057203 1.19721860356 -0.002 0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 0.001 -0.000 0.000 61 Mode 99: freq=1128.28 N -0.44003451495 -0.00038510790 2.12369783068 -0.000 -0.039 -0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.000 -0.059 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.000 0.137 0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.001 -0.118 0.000 C 0.02462671625 -0.00591801736 4.46614405978 0.000 -0.182 0.000 C 0.43187566201 -0.00376957955 3.13352499014 0.001 0.308 0.000 C -2.63984642995 0.00218980399 1.17162612704 -0.000 0.022 0.000 N -1.98513620489 0.00132140951 0.00153900685 -0.000 -0.000 0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.000 -0.020 0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.000 -0.002 0.000 C -4.73391255267 0.00451580118 -0.00020876193 0.000 0.000 -0.000 C -4.02924140493 0.00399189729 1.20660077672 0.000 0.002 -0.000 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.000 0.037 -0.001 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 0.056 -0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 -0.131 0.000 C -1.33713102227 -0.00526459193 -4.73855802198 0.001 0.108 0.000 C 0.02654101484 -0.00591797621 -4.46472703619 -0.001 0.175 0.000 C 0.43371721952 -0.00363389350 -3.13225443930 -0.001 -0.290 0.000 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 0.000 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.000 -0.000 -0.003 C 4.06129317470 1.20536051565 0.00241240325 0.000 -0.000 0.003 C 4.76783866331 0.00148799420 0.00346798881 -0.000 0.000 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.000 0.000 -0.003 C 2.67108506586 -1.17139122066 0.00026591651 0.000 -0.000 0.003 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 -0.000 0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.000 0.000 0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.000 -0.000 0.001 C 0.08658913130 4.53522926787 -0.00833235387 0.000 -0.000 -0.002 C -0.35359617412 3.21325694137 -0.00400174376 0.000 0.000 0.001 N 0.49290585413 2.18198449515 -0.00068475564 0.000 0.000 -0.001 S 6.56718562933 -0.11349126889 0.00673479967 0.000 0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 0.000 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.000 0.000 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 -0.000 -0.001 C 0.08684213972 -4.53272927032 -0.00840538011 -0.000 -0.000 0.002 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 0.000 -0.001 N 0.49225266031 -2.17934076887 -0.00084210065 0.000 0.000 0.001 H 1.83694111827 5.77332096953 -0.01265611066 -0.000 0.000 -0.001 H -0.61802819388 5.33967450634 -0.01131742088 0.000 -0.000 0.002 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 0.000 -0.001 H -1.39787683933 2.98334799634 -0.00369736757 0.000 0.000 -0.001 H 1.83794742242 -5.77033326187 -0.01295832570 0.000 -0.000 0.002 H -0.61749414542 -5.33746053721 -0.01121572048 -0.000 -0.000 -0.002 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 0.000 0.001 H 3.39230213722 -3.86796714602 -0.00754158092 0.000 0.000 0.001 H 4.58301895157 2.13678100538 0.00314824260 0.000 -0.000 -0.004 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 0.000 0.004 H -1.68997263563 -0.00719388386 -5.74925805817 0.000 -0.186 0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.001 -0.239 0.001 H -3.29620044300 -0.00255800648 -3.88456579214 0.000 0.180 -0.001 H 1.47161249279 -0.00457826661 -2.87685200854 0.001 0.447 -0.001 H -1.69176120521 -0.00597000955 5.75026973076 -0.000 0.203 0.000 H 0.75025791005 -0.00892914887 5.25161119224 0.001 0.247 0.001 H 1.46975366817 -0.00523069331 2.87805400798 -0.001 -0.474 -0.001 H -3.29750276746 -0.00099200484 3.88584245085 -0.000 -0.187 -0.001 H -4.55513299541 0.00377930937 -2.13473279421 0.000 0.011 0.000 H -4.55107479454 0.00501307822 2.13844314827 0.000 -0.011 -0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.000 -0.001 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.000 0.000 -0.000 61 Mode 100: freq=1128.50 N -0.44003451495 -0.00038510790 2.12369783068 -0.001 -0.039 0.001 C -1.76594470239 0.00039861437 2.37754210613 0.000 -0.055 0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.001 0.129 0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.000 -0.111 -0.001 C 0.02462671625 -0.00591801736 4.46614405978 -0.001 -0.172 -0.001 C 0.43187566201 -0.00376957955 3.13352499014 0.000 0.292 0.001 C -2.63984642995 0.00218980399 1.17162612704 0.000 0.023 0.000 N -1.98513620489 0.00132140951 0.00153900685 0.001 -0.012 0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.000 0.025 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.000 -0.003 -0.001 C -4.73391255267 0.00451580118 -0.00020876193 -0.001 0.001 0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.000 -0.003 0.001 Co 0.00000000000 0.00000000000 0.00000000000 -0.001 0.003 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.001 -0.041 -0.001 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 -0.059 -0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.001 0.137 -0.000 C -1.33713102227 -0.00526459193 -4.73855802198 -0.000 -0.114 0.001 C 0.02654101484 -0.00591797621 -4.46472703619 -0.001 -0.185 0.001 C 0.43371721952 -0.00363389350 -3.13225443930 0.000 0.308 -0.001 S -6.53329279136 0.00637481657 -0.11611178087 0.000 0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.013 0.002 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.002 -0.003 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.000 -0.010 -0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.002 0.003 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.009 0.007 0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.002 -0.002 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.000 -0.000 0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.005 0.000 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.002 0.001 0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.005 -0.007 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.001 0.001 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.001 0.009 0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.001 0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.001 0.001 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.001 0.001 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.003 -0.002 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.004 -0.004 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.003 0.001 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.001 0.004 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.003 0.001 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.001 -0.003 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.001 0.000 0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.000 0.002 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.003 0.000 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.001 -0.001 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 0.003 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.001 0.002 -0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.000 -0.003 0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.003 0.002 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.000 0.196 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 0.251 -0.000 H -3.29620044300 -0.00255800648 -3.88456579214 0.000 -0.189 0.000 H 1.47161249279 -0.00457826661 -2.87685200854 -0.001 -0.473 0.001 H -1.69176120521 -0.00597000955 5.75026973076 0.000 0.191 0.000 H 0.75025791005 -0.00892914887 5.25161119224 0.000 0.232 0.000 H 1.46975366817 -0.00523069331 2.87805400798 -0.001 -0.448 -0.001 H -3.29750276746 -0.00099200484 3.88584245085 0.000 -0.176 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.000 -0.008 -0.000 H -4.55107479454 0.00501307822 2.13844314827 0.000 -0.008 0.000 H -6.83436893102 0.00806057203 1.19721860356 0.000 0.000 0.000 H 6.86748209639 1.20005966818 0.00372860376 0.000 0.000 0.000 61 Mode 101: freq=1133.54 N -0.44003451495 -0.00038510790 2.12369783068 -0.068 -0.000 0.126 C -1.76594470239 0.00039861437 2.37754210613 0.019 0.000 -0.020 C -2.24923313135 -0.00145267054 3.67997125809 0.097 -0.000 -0.016 C -1.33887502024 -0.00450793845 4.73956848945 -0.036 0.000 0.053 C 0.02462671625 -0.00591801736 4.46614405978 -0.037 0.000 -0.082 C 0.43187566201 -0.00376957955 3.13352499014 0.057 -0.001 -0.004 C -2.63984642995 0.00218980399 1.17162612704 -0.035 0.000 -0.005 N -1.98513620489 0.00132140951 0.00153900685 -0.609 0.001 -0.004 C -2.63911589169 0.00167522827 -1.17277445342 -0.008 -0.000 0.006 C -4.02452897564 0.00329996303 -1.20791476641 0.225 -0.000 0.406 C -4.73391255267 0.00451580118 -0.00020876193 0.132 -0.000 -0.000 C -4.02924140493 0.00399189729 1.20660077672 0.227 -0.000 -0.419 Co 0.00000000000 0.00000000000 0.00000000000 0.043 -0.000 -0.001 N -0.43839318333 -0.00054206762 -2.12229806799 -0.060 -0.000 -0.106 C -1.76408906064 -0.00030645034 -2.37697009192 0.024 0.000 0.013 C -2.24773885821 -0.00257631963 -3.67934971086 0.074 -0.000 0.014 C -1.33713102227 -0.00526459193 -4.73855802198 -0.029 0.000 -0.044 C 0.02654101484 -0.00591797621 -4.46472703619 -0.025 0.000 0.067 C 0.43371721952 -0.00363389350 -3.13225443930 0.039 -0.000 0.003 S -6.53329279136 0.00637481657 -0.11611178087 -0.029 0.000 0.014 N 2.00981687167 0.00259443239 -0.00000686048 0.072 -0.000 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.001 0.011 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.028 -0.055 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.007 0.000 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.028 0.053 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.003 -0.011 0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.008 0.015 -0.001 C 2.33938959521 3.68993217240 -0.00584554905 -0.028 0.008 0.001 C 1.45736908622 4.77231118002 -0.00917967851 -0.018 -0.027 -0.001 C 0.08658913130 4.53522926787 -0.00833235387 0.028 -0.031 -0.001 C -0.35359617412 3.21325694137 -0.00400174376 0.022 0.020 0.002 N 0.49290585413 2.18198449515 -0.00068475564 0.003 0.024 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.001 0.002 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.008 -0.015 -0.001 C 2.33969079820 -3.68709653410 -0.00625612120 -0.026 -0.009 0.001 C 1.45789786198 -4.76953179608 -0.00945089783 -0.019 0.029 -0.001 C 0.08684213972 -4.53272927032 -0.00840538011 0.027 0.030 -0.001 C -0.35393854068 -3.21111942258 -0.00398541364 0.024 -0.020 0.002 N 0.49225266031 -2.17934076887 -0.00084210065 0.002 -0.022 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.016 -0.005 0.002 H -0.61802819388 5.33967450634 -0.01131742088 0.011 -0.009 0.002 H 3.39175422949 3.87200638269 -0.00704552340 -0.010 0.010 -0.001 H -1.39787683933 2.98334799634 -0.00369736757 0.004 0.022 -0.004 H 1.83794742242 -5.77033326187 -0.01295832570 -0.016 0.006 0.001 H -0.61749414542 -5.33746053721 -0.01121572048 0.011 0.008 0.002 H -1.39833026435 -2.98175334118 -0.00345676225 0.004 -0.023 -0.004 H 3.39230213722 -3.86796714602 -0.00754158092 -0.010 -0.011 -0.001 H 4.58301895157 2.13678100538 0.00314824260 -0.010 -0.016 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.011 0.015 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.008 -0.000 -0.013 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 -0.000 0.027 H -3.29620044300 -0.00255800648 -3.88456579214 0.014 0.000 0.047 H 1.47161249279 -0.00457826661 -2.87685200854 0.006 0.001 0.020 H -1.69176120521 -0.00597000955 5.75026973076 -0.010 -0.001 0.016 H 0.75025791005 -0.00892914887 5.25161119224 -0.007 -0.000 -0.029 H 1.46975366817 -0.00523069331 2.87805400798 0.011 0.001 -0.022 H -3.29750276746 -0.00099200484 3.88584245085 0.020 0.000 -0.052 H -4.55513299541 0.00377930937 -2.13473279421 0.055 0.000 0.136 H -4.55107479454 0.00501307822 2.13844314827 0.044 0.000 -0.146 H -6.83436893102 0.00806057203 1.19721860356 -0.085 0.000 -0.015 H 6.86748209639 1.20005966818 0.00372860376 0.008 -0.002 0.000 61 Mode 102: freq=1150.51 N -0.44003451495 -0.00038510790 2.12369783068 0.066 0.000 -0.057 C -1.76594470239 0.00039861437 2.37754210613 0.024 -0.000 0.058 C -2.24923313135 -0.00145267054 3.67997125809 -0.013 0.000 0.057 C -1.33887502024 -0.00450793845 4.73956848945 0.095 -0.000 -0.138 C 0.02462671625 -0.00591801736 4.46614405978 -0.055 0.000 -0.028 C 0.43187566201 -0.00376957955 3.13352499014 -0.123 0.000 0.087 C -2.63984642995 0.00218980399 1.17162612704 0.011 0.000 0.044 N -1.98513620489 0.00132140951 0.00153900685 -0.101 0.000 0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.013 -0.000 -0.045 C -4.02452897564 0.00329996303 -1.20791476641 0.035 -0.000 0.091 C -4.73391255267 0.00451580118 -0.00020876193 -0.028 0.000 0.001 C -4.02924140493 0.00399189729 1.20660077672 0.035 -0.000 -0.094 Co 0.00000000000 0.00000000000 0.00000000000 0.012 0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.070 0.000 0.062 C -1.76408906064 -0.00030645034 -2.37697009192 0.024 -0.000 -0.059 C -2.24773885821 -0.00257631963 -3.67934971086 -0.016 0.000 -0.059 C -1.33713102227 -0.00526459193 -4.73855802198 0.099 -0.000 0.142 C 0.02654101484 -0.00591797621 -4.46472703619 -0.056 0.000 0.027 C 0.43371721952 -0.00363389350 -3.13225443930 -0.128 0.000 -0.089 S -6.53329279136 0.00637481657 -0.11611178087 0.005 -0.000 0.002 N 2.00981687167 0.00259443239 -0.00000686048 -0.135 -0.001 -0.000 C 2.67119656792 1.17263645248 0.00045766926 0.024 -0.072 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.044 0.131 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.068 -0.002 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.044 -0.127 0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.024 0.073 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.045 -0.104 0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.046 -0.107 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.183 0.249 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.090 0.049 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.237 -0.156 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.132 0.118 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.014 -0.002 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.045 0.106 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.050 0.111 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.189 -0.257 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.092 -0.049 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.244 0.161 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.138 -0.124 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.152 0.044 -0.001 H -0.61802819388 5.33967450634 -0.01131742088 -0.048 0.005 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.006 -0.149 0.001 H -1.39787683933 2.98334799634 -0.00369736757 -0.041 -0.196 0.001 H 1.83794742242 -5.77033326187 -0.01295832570 0.157 -0.045 -0.001 H -0.61749414542 -5.33746053721 -0.01121572048 -0.050 -0.004 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.042 0.203 0.002 H 3.39230213722 -3.86796714602 -0.00754158092 0.006 0.155 0.001 H 4.58301895157 2.13678100538 0.00314824260 0.012 0.039 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.016 -0.036 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.082 0.000 0.028 H 0.75224758084 -0.00860493512 -5.25016290812 -0.030 0.000 0.001 H -3.29620044300 -0.00255800648 -3.88456579214 0.008 -0.000 -0.083 H 1.47161249279 -0.00457826661 -2.87685200854 -0.020 -0.001 -0.110 H -1.69176120521 -0.00597000955 5.75026973076 0.079 0.000 -0.027 H 0.75025791005 -0.00892914887 5.25161119224 -0.030 0.000 -0.001 H 1.46975366817 -0.00523069331 2.87805400798 -0.019 -0.000 0.106 H -3.29750276746 -0.00099200484 3.88584245085 0.009 -0.000 0.080 H -4.55513299541 0.00377930937 -2.13473279421 0.008 0.000 0.029 H -4.55107479454 0.00501307822 2.13844314827 0.006 0.000 -0.031 H -6.83436893102 0.00806057203 1.19721860356 -0.008 -0.000 -0.002 H 6.86748209639 1.20005966818 0.00372860376 -0.008 0.002 -0.000 61 Mode 103: freq=1152.96 N -0.44003451495 -0.00038510790 2.12369783068 -0.149 -0.000 0.148 C -1.76594470239 0.00039861437 2.37754210613 -0.038 0.000 -0.093 C -2.24923313135 -0.00145267054 3.67997125809 0.063 -0.000 -0.117 C -1.33887502024 -0.00450793845 4.73956848945 -0.184 0.000 0.258 C 0.02462671625 -0.00591801736 4.46614405978 0.088 -0.000 0.035 C 0.43187566201 -0.00376957955 3.13352499014 0.239 -0.000 -0.166 C -2.63984642995 0.00218980399 1.17162612704 -0.024 0.000 -0.059 N -1.98513620489 0.00132140951 0.00153900685 0.072 -0.000 -0.001 C -2.63911589169 0.00167522827 -1.17277445342 -0.022 0.000 0.061 C -4.02452897564 0.00329996303 -1.20791476641 -0.019 -0.000 -0.079 C -4.73391255267 0.00451580118 -0.00020876193 0.063 -0.000 -0.001 C -4.02924140493 0.00399189729 1.20660077672 -0.017 0.000 0.081 Co 0.00000000000 0.00000000000 0.00000000000 -0.004 -0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.148 -0.000 -0.149 C -1.76408906064 -0.00030645034 -2.37697009192 -0.037 0.000 0.092 C -2.24773885821 -0.00257631963 -3.67934971086 0.064 -0.000 0.116 C -1.33713102227 -0.00526459193 -4.73855802198 -0.182 0.000 -0.255 C 0.02654101484 -0.00591797621 -4.46472703619 0.087 -0.000 -0.033 C 0.43371721952 -0.00363389350 -3.13225443930 0.237 -0.000 0.164 S -6.53329279136 0.00637481657 -0.11611178087 -0.014 0.000 -0.001 N 2.00981687167 0.00259443239 -0.00000686048 -0.002 0.000 -0.000 C 2.67119656792 1.17263645248 0.00045766926 0.016 -0.026 -0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.006 0.015 -0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.044 -0.000 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.004 -0.014 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.013 0.027 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.023 -0.049 0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.051 -0.069 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.109 0.143 0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.043 0.018 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.142 -0.093 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.092 0.093 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.010 0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.022 0.047 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.050 0.064 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.101 -0.134 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.038 -0.014 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.132 0.086 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.087 -0.090 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.094 0.023 -0.001 H -0.61802819388 5.33967450634 -0.01131742088 -0.023 0.001 0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.002 -0.098 0.001 H -1.39787683933 2.98334799634 -0.00369736757 -0.024 -0.120 0.001 H 1.83794742242 -5.77033326187 -0.01295832570 0.087 -0.021 -0.001 H -0.61749414542 -5.33746053721 -0.01121572048 -0.021 -0.000 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.022 0.111 0.001 H 3.39230213722 -3.86796714602 -0.00754158092 -0.003 0.090 0.001 H 4.58301895157 2.13678100538 0.00314824260 0.002 0.001 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.003 -0.001 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.157 -0.001 -0.046 H 0.75224758084 -0.00860493512 -5.25016290812 0.048 0.000 0.002 H -3.29620044300 -0.00255800648 -3.88456579214 -0.006 0.001 0.165 H 1.47161249279 -0.00457826661 -2.87685200854 0.035 0.001 0.206 H -1.69176120521 -0.00597000955 5.75026973076 -0.158 -0.001 0.047 H 0.75025791005 -0.00892914887 5.25161119224 0.048 0.000 -0.001 H 1.46975366817 -0.00523069331 2.87805400798 0.035 0.001 -0.208 H -3.29750276746 -0.00099200484 3.88584245085 -0.007 0.001 -0.167 H -4.55513299541 0.00377930937 -2.13473279421 -0.007 -0.000 -0.022 H -4.55107479454 0.00501307822 2.13844314827 -0.004 -0.000 0.024 H -6.83436893102 0.00806057203 1.19721860356 0.001 -0.000 0.001 H 6.86748209639 1.20005966818 0.00372860376 0.004 -0.000 0.000 61 Mode 104: freq=1154.53 N -0.44003451495 -0.00038510790 2.12369783068 -0.003 0.003 0.004 C -1.76594470239 0.00039861437 2.37754210613 -0.001 0.000 -0.002 C -2.24923313135 -0.00145267054 3.67997125809 0.002 0.000 -0.003 C -1.33887502024 -0.00450793845 4.73956848945 -0.004 -0.002 0.006 C 0.02462671625 -0.00591801736 4.46614405978 0.002 0.002 0.000 C 0.43187566201 -0.00376957955 3.13352499014 0.005 -0.003 -0.004 C -2.63984642995 0.00218980399 1.17162612704 -0.001 -0.004 -0.002 N -1.98513620489 0.00132140951 0.00153900685 0.002 0.006 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.001 -0.004 0.002 C -4.02452897564 0.00329996303 -1.20791476641 -0.001 0.001 -0.002 C -4.73391255267 0.00451580118 -0.00020876193 0.001 -0.001 -0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.001 0.001 0.002 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 0.003 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.004 0.003 -0.004 C -1.76408906064 -0.00030645034 -2.37697009192 -0.001 0.000 0.002 C -2.24773885821 -0.00257631963 -3.67934971086 0.002 0.000 0.003 C -1.33713102227 -0.00526459193 -4.73855802198 -0.004 -0.002 -0.006 C 0.02654101484 -0.00591797621 -4.46472703619 0.002 0.002 -0.001 C 0.43371721952 -0.00363389350 -3.13225443930 0.006 -0.003 0.004 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 -0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.008 -0.058 0.000 C 2.67119656792 1.17263645248 0.00045766926 0.021 -0.017 0.000 C 4.06129317470 1.20536051565 0.00241240325 0.020 0.002 -0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.001 -0.028 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.026 0.010 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.022 -0.015 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.007 0.050 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.039 0.153 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.222 -0.265 0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.149 -0.100 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.238 0.204 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.175 -0.121 0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.004 0.009 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.006 0.051 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.042 0.151 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.223 -0.264 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.147 -0.097 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.237 0.201 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.176 -0.124 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.210 -0.032 0.001 H -0.61802819388 5.33967450634 -0.01131742088 0.078 -0.012 0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.019 0.229 -0.001 H -1.39787683933 2.98334799634 -0.00369736757 0.030 0.265 -0.002 H 1.83794742242 -5.77033326187 -0.01295832570 0.210 -0.032 -0.001 H -0.61749414542 -5.33746053721 -0.01121572048 -0.078 -0.010 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.030 0.264 0.002 H 3.39230213722 -3.86796714602 -0.00754158092 0.018 0.227 0.001 H 4.58301895157 2.13678100538 0.00314824260 -0.007 0.009 0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.003 0.011 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.004 0.003 -0.001 H 0.75224758084 -0.00860493512 -5.25016290812 0.001 -0.003 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 -0.000 0.004 H 1.47161249279 -0.00457826661 -2.87685200854 0.001 0.005 0.005 H -1.69176120521 -0.00597000955 5.75026973076 -0.003 0.003 0.001 H 0.75025791005 -0.00892914887 5.25161119224 0.001 -0.003 -0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.001 0.005 -0.004 H -3.29750276746 -0.00099200484 3.88584245085 -0.000 -0.000 -0.004 H -4.55513299541 0.00377930937 -2.13473279421 -0.000 0.000 -0.001 H -4.55107479454 0.00501307822 2.13844314827 -0.000 0.000 0.001 H -6.83436893102 0.00806057203 1.19721860356 0.000 0.000 0.000 H 6.86748209639 1.20005966818 0.00372860376 0.033 -0.006 0.000 61 Mode 105: freq=1156.03 N -0.44003451495 -0.00038510790 2.12369783068 -0.182 0.000 0.140 C -1.76594470239 0.00039861437 2.37754210613 0.001 0.000 -0.047 C -2.24923313135 -0.00145267054 3.67997125809 0.045 -0.000 -0.151 C -1.33887502024 -0.00450793845 4.73956848945 -0.216 0.000 0.266 C 0.02462671625 -0.00591801736 4.46614405978 0.148 -0.000 0.082 C 0.43187566201 -0.00376957955 3.13352499014 0.231 -0.000 -0.203 C -2.63984642995 0.00218980399 1.17162612704 0.019 -0.000 0.018 N -1.98513620489 0.00132140951 0.00153900685 0.007 0.000 0.049 C -2.63911589169 0.00167522827 -1.17277445342 -0.019 0.000 0.016 C -4.02452897564 0.00329996303 -1.20791476641 -0.023 0.000 -0.008 C -4.73391255267 0.00451580118 -0.00020876193 -0.002 0.000 0.022 C -4.02924140493 0.00399189729 1.20660077672 0.017 -0.000 -0.000 Co 0.00000000000 0.00000000000 0.00000000000 -0.001 0.000 -0.006 N -0.43839318333 -0.00054206762 -2.12229806799 0.185 0.000 0.144 C -1.76408906064 -0.00030645034 -2.37697009192 -0.002 -0.000 -0.048 C -2.24773885821 -0.00257631963 -3.67934971086 -0.048 0.000 -0.150 C -1.33713102227 -0.00526459193 -4.73855802198 0.218 -0.000 0.266 C 0.02654101484 -0.00591797621 -4.46472703619 -0.147 0.000 0.079 C 0.43371721952 -0.00363389350 -3.13225443930 -0.232 0.000 -0.202 S -6.53329279136 0.00637481657 -0.11611178087 -0.003 -0.000 -0.007 N 2.00981687167 0.00259443239 -0.00000686048 0.001 -0.000 -0.007 C 2.67119656792 1.17263645248 0.00045766926 -0.000 0.001 0.005 C 4.06129317470 1.20536051565 0.00241240325 -0.000 -0.001 -0.001 C 4.76783866331 0.00148799420 0.00346798881 0.001 -0.000 0.001 C 4.05723810074 -1.20352939940 0.00211502115 -0.000 0.001 -0.001 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 -0.001 0.005 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 0.001 -0.001 C 2.33938959521 3.68993217240 -0.00584554905 0.001 0.001 -0.001 C 1.45736908622 4.77231118002 -0.00917967851 -0.002 -0.002 0.002 C 0.08658913130 4.53522926787 -0.00833235387 0.001 -0.000 -0.003 C -0.35359617412 3.21325694137 -0.00400174376 0.002 0.002 0.004 N 0.49290585413 2.18198449515 -0.00068475564 -0.002 -0.002 -0.003 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 -0.001 -0.001 C 2.33969079820 -3.68709653410 -0.00625612120 0.001 -0.001 -0.001 C 1.45789786198 -4.76953179608 -0.00945089783 -0.001 0.002 0.003 C 0.08684213972 -4.53272927032 -0.00840538011 0.000 0.000 -0.003 C -0.35393854068 -3.21111942258 -0.00398541364 0.002 -0.001 0.004 N 0.49225266031 -2.17934076887 -0.00084210065 -0.001 0.001 -0.003 H 1.83694111827 5.77332096953 -0.01265611066 -0.002 -0.000 -0.004 H -0.61802819388 5.33967450634 -0.01131742088 0.000 0.000 0.003 H 3.39175422949 3.87200638269 -0.00704552340 0.000 0.002 0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.000 0.002 -0.006 H 1.83794742242 -5.77033326187 -0.01295832570 -0.001 0.000 -0.004 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 -0.000 0.004 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 -0.001 -0.006 H 3.39230213722 -3.86796714602 -0.00754158092 0.000 -0.001 0.001 H 4.58301895157 2.13678100538 0.00314824260 -0.000 -0.000 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 0.000 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.208 0.001 0.037 H 0.75224758084 -0.00860493512 -5.25016290812 -0.078 -0.000 0.003 H -3.29620044300 -0.00255800648 -3.88456579214 0.021 -0.001 -0.232 H 1.47161249279 -0.00457826661 -2.87685200854 -0.022 -0.001 -0.265 H -1.69176120521 -0.00597000955 5.75026973076 -0.207 -0.001 0.037 H 0.75025791005 -0.00892914887 5.25161119224 0.078 -0.000 0.004 H 1.46975366817 -0.00523069331 2.87805400798 0.022 0.001 -0.265 H -3.29750276746 -0.00099200484 3.88584245085 -0.022 0.001 -0.233 H -4.55513299541 0.00377930937 -2.13473279421 0.006 0.000 -0.011 H -4.55107479454 0.00501307822 2.13844314827 -0.009 -0.000 -0.009 H -6.83436893102 0.00806057203 1.19721860356 0.027 -0.000 0.005 H 6.86748209639 1.20005966818 0.00372860376 0.000 -0.000 -0.000 61 Mode 106: freq=1164.51 N -0.44003451495 -0.00038510790 2.12369783068 -0.002 -0.000 0.001 C -1.76594470239 0.00039861437 2.37754210613 -0.000 -0.000 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.001 0.000 -0.001 C -1.33887502024 -0.00450793845 4.73956848945 -0.001 -0.000 0.002 C 0.02462671625 -0.00591801736 4.46614405978 0.001 -0.000 0.001 C 0.43187566201 -0.00376957955 3.13352499014 0.002 0.001 -0.002 C -2.63984642995 0.00218980399 1.17162612704 -0.000 0.000 0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 -0.000 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.000 -0.000 0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.001 0.000 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 -0.000 -0.000 C -4.02924140493 0.00399189729 1.20660077672 0.001 -0.000 0.000 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 -0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.001 0.000 0.001 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 0.000 -0.000 C -2.24773885821 -0.00257631963 -3.67934971086 -0.001 0.000 -0.001 C -1.33713102227 -0.00526459193 -4.73855802198 0.001 -0.000 0.002 C 0.02654101484 -0.00591797621 -4.46472703619 -0.001 0.001 0.001 C 0.43371721952 -0.00363389350 -3.13225443930 -0.002 -0.001 -0.001 S -6.53329279136 0.00637481657 -0.11611178087 0.000 -0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 -0.000 -0.003 C 2.67119656792 1.17263645248 0.00045766926 -0.000 0.000 0.005 C 4.06129317470 1.20536051565 0.00241240325 0.000 -0.000 0.010 C 4.76783866331 0.00148799420 0.00346798881 0.000 -0.000 -0.001 C 4.05723810074 -1.20352939940 0.00211502115 -0.000 0.000 -0.003 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 -0.000 0.001 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 0.000 -0.006 C 2.33938959521 3.68993217240 -0.00584554905 -0.000 0.000 0.216 C 1.45736908622 4.77231118002 -0.00917967851 0.000 -0.001 -0.402 C 0.08658913130 4.53522926787 -0.00833235387 -0.000 0.001 0.288 C -0.35359617412 3.21325694137 -0.00400174376 -0.000 -0.001 -0.104 N 0.49290585413 2.18198449515 -0.00068475564 0.000 0.001 -0.010 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 -0.000 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.000 0.000 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 -0.000 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.000 -0.000 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 0.000 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.000 0.000 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.000 0.002 0.628 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 -0.002 -0.419 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 -0.002 -0.317 H -1.39787683933 2.98334799634 -0.00369736757 -0.000 0.000 0.167 H 1.83794742242 -5.77033326187 -0.01295832570 0.000 0.000 -0.001 H -0.61749414542 -5.33746053721 -0.01121572048 -0.000 -0.000 0.001 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 0.000 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.000 0.000 0.000 H 4.58301895157 2.13678100538 0.00314824260 0.000 -0.000 -0.027 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 0.000 0.002 H -1.68997263563 -0.00719388386 -5.74925805817 0.002 0.001 0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 -0.001 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 -0.000 -0.002 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 0.002 -0.002 H -1.69176120521 -0.00597000955 5.75026973076 -0.002 0.001 0.000 H 0.75025791005 -0.00892914887 5.25161119224 0.000 0.000 0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.000 -0.001 -0.002 H -3.29750276746 -0.00099200484 3.88584245085 0.000 -0.000 -0.002 H -4.55513299541 0.00377930937 -2.13473279421 -0.000 -0.000 0.000 H -4.55107479454 0.00501307822 2.13844314827 0.000 0.000 0.000 H -6.83436893102 0.00806057203 1.19721860356 0.000 0.000 0.000 H 6.86748209639 1.20005966818 0.00372860376 0.000 -0.000 -0.001 61 Mode 107: freq=1164.78 N -0.44003451495 -0.00038510790 2.12369783068 -0.002 0.000 0.001 C -1.76594470239 0.00039861437 2.37754210613 -0.000 -0.000 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.001 0.003 -0.001 C -1.33887502024 -0.00450793845 4.73956848945 -0.002 -0.007 0.002 C 0.02462671625 -0.00591801736 4.46614405978 0.001 0.005 0.001 C 0.43187566201 -0.00376957955 3.13352499014 0.002 -0.003 -0.002 C -2.63984642995 0.00218980399 1.17162612704 -0.000 -0.000 0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 -0.000 0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.000 0.000 0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.001 -0.000 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 -0.000 -0.000 C -4.02924140493 0.00399189729 1.20660077672 0.001 0.000 0.000 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.002 -0.000 0.001 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 -0.000 -0.000 C -2.24773885821 -0.00257631963 -3.67934971086 -0.001 -0.001 -0.001 C -1.33713102227 -0.00526459193 -4.73855802198 0.001 0.002 0.002 C 0.02654101484 -0.00591797621 -4.46472703619 -0.001 -0.002 0.001 C 0.43371721952 -0.00363389350 -3.13225443930 -0.002 0.001 -0.002 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 0.000 -0.003 C 2.67119656792 1.17263645248 0.00045766926 -0.000 0.000 0.001 C 4.06129317470 1.20536051565 0.00241240325 -0.000 -0.000 -0.003 C 4.76783866331 0.00148799420 0.00346798881 0.000 0.000 -0.001 C 4.05723810074 -1.20352939940 0.00211502115 0.000 0.000 0.011 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 -0.000 0.005 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 0.000 0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.000 -0.000 0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.000 0.000 -0.001 C 0.08658913130 4.53522926787 -0.00833235387 -0.000 0.000 0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.000 -0.000 0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.000 0.000 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 -0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 -0.000 -0.007 C 2.33969079820 -3.68709653410 -0.00625612120 -0.000 -0.000 0.220 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 0.001 -0.403 C 0.08684213972 -4.53272927032 -0.00840538011 -0.000 -0.001 0.284 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 0.001 -0.101 N 0.49225266031 -2.17934076887 -0.00084210065 0.000 -0.001 -0.010 H 1.83694111827 5.77332096953 -0.01265611066 0.000 -0.000 0.001 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 0.000 -0.001 H 3.39175422949 3.87200638269 -0.00704552340 0.000 -0.000 -0.001 H -1.39787683933 2.98334799634 -0.00369736757 -0.000 -0.000 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.000 -0.002 0.628 H -0.61749414542 -5.33746053721 -0.01121572048 -0.000 0.002 -0.414 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 -0.000 0.162 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 0.002 -0.324 H 4.58301895157 2.13678100538 0.00314824260 -0.000 -0.000 0.002 H 4.58784714512 -2.12983634010 0.00211631073 0.000 0.000 -0.030 H -1.68997263563 -0.00719388386 -5.74925805817 0.002 -0.003 0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 0.002 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 0.001 -0.002 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 -0.002 -0.002 H -1.69176120521 -0.00597000955 5.75026973076 -0.002 0.010 0.000 H 0.75025791005 -0.00892914887 5.25161119224 0.000 -0.007 0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.000 0.004 -0.002 H -3.29750276746 -0.00099200484 3.88584245085 0.000 -0.005 -0.002 H -4.55513299541 0.00377930937 -2.13473279421 -0.000 0.000 0.000 H -4.55107479454 0.00501307822 2.13844314827 0.000 -0.001 0.000 H -6.83436893102 0.00806057203 1.19721860356 0.000 -0.000 0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.000 0.000 0.001 61 Mode 108: freq=1164.81 N -0.44003451495 -0.00038510790 2.12369783068 0.000 0.009 -0.001 C -1.76594470239 0.00039861437 2.37754210613 -0.000 0.007 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.000 -0.216 0.000 C -1.33887502024 -0.00450793845 4.73956848945 0.001 0.403 0.000 C 0.02462671625 -0.00591801736 4.46614405978 -0.001 -0.287 -0.000 C 0.43187566201 -0.00376957955 3.13352499014 0.000 0.103 0.000 C -2.63984642995 0.00218980399 1.17162612704 -0.000 -0.006 -0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 0.003 0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.000 -0.001 0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.000 0.003 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 0.000 0.000 -0.000 C -4.02924140493 0.00399189729 1.20660077672 0.000 -0.009 0.000 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.000 0.000 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 0.000 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 -0.001 -0.000 C -1.33713102227 -0.00526459193 -4.73855802198 0.000 0.002 0.000 C 0.02654101484 -0.00591797621 -4.46472703619 -0.000 -0.001 0.000 C 0.43371721952 -0.00363389350 -3.13225443930 -0.000 0.000 -0.000 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 -0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 0.000 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.000 -0.000 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.001 -0.000 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.000 0.000 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.001 -0.000 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.000 -0.000 0.001 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 0.000 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.001 0.001 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.001 -0.001 0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.000 -0.001 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.002 0.001 -0.001 N 0.49290585413 2.18198449515 -0.00068475564 -0.001 -0.001 0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.000 0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.000 0.000 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.001 0.001 0.004 C 1.45789786198 -4.76953179608 -0.00945089783 0.001 -0.001 -0.007 C 0.08684213972 -4.53272927032 -0.00840538011 -0.001 -0.001 0.005 C -0.35393854068 -3.21111942258 -0.00398541364 -0.002 0.001 -0.001 N 0.49225266031 -2.17934076887 -0.00084210065 0.001 -0.001 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.002 -0.000 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.000 -0.000 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.000 0.001 0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.000 0.001 0.002 H 1.83794742242 -5.77033326187 -0.01295832570 0.002 -0.000 0.011 H -0.61749414542 -5.33746053721 -0.01121572048 -0.000 -0.000 -0.007 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 0.001 0.001 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 0.001 -0.006 H 4.58301895157 2.13678100538 0.00314824260 0.000 -0.000 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 -0.000 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.000 -0.002 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 0.001 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 0.000 0.001 -0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 -0.000 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.001 -0.628 -0.001 H 0.75025791005 -0.00892914887 5.25161119224 0.000 0.418 0.001 H 1.46975366817 -0.00523069331 2.87805400798 -0.000 -0.165 0.000 H -3.29750276746 -0.00099200484 3.88584245085 0.000 0.316 0.002 H -4.55513299541 0.00377930937 -2.13473279421 -0.000 -0.001 -0.000 H -4.55107479454 0.00501307822 2.13844314827 0.000 0.025 0.000 H -6.83436893102 0.00806057203 1.19721860356 0.000 0.001 0.000 H 6.86748209639 1.20005966818 0.00372860376 0.000 -0.000 0.000 61 Mode 109: freq=1165.12 N -0.44003451495 -0.00038510790 2.12369783068 0.000 0.000 0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.000 -0.000 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.000 0.001 0.000 C -1.33887502024 -0.00450793845 4.73956848945 0.000 -0.001 0.000 C 0.02462671625 -0.00591801736 4.46614405978 -0.000 0.001 -0.000 C 0.43187566201 -0.00376957955 3.13352499014 0.000 -0.001 0.000 C -2.63984642995 0.00218980399 1.17162612704 -0.000 -0.001 -0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 0.003 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.000 -0.006 0.000 C -4.02452897564 0.00329996303 -1.20791476641 0.000 -0.010 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 0.000 0.001 -0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.000 0.003 0.000 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.001 0.010 0.001 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 0.008 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 -0.000 -0.220 -0.000 C -1.33713102227 -0.00526459193 -4.73855802198 0.001 0.404 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 -0.001 -0.284 0.000 C 0.43371721952 -0.00363389350 -3.13225443930 -0.000 0.100 -0.001 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 -0.000 0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 0.000 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.000 -0.000 0.000 C 4.06129317470 1.20536051565 0.00241240325 0.001 -0.000 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.000 0.000 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.001 -0.000 0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.000 -0.000 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 0.000 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.001 0.001 0.001 C 1.45736908622 4.77231118002 -0.00917967851 -0.001 -0.002 -0.001 C 0.08658913130 4.53522926787 -0.00833235387 0.000 -0.001 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.002 0.001 0.001 N 0.49290585413 2.18198449515 -0.00068475564 -0.001 -0.001 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.000 0.000 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.001 0.001 -0.001 C 1.45789786198 -4.76953179608 -0.00945089783 0.001 -0.001 0.003 C 0.08684213972 -4.53272927032 -0.00840538011 -0.001 -0.001 -0.001 C -0.35393854068 -3.21111942258 -0.00398541364 -0.002 0.001 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.001 -0.001 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.002 -0.000 0.001 H -0.61802819388 5.33967450634 -0.01131742088 0.000 -0.000 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.000 0.001 -0.001 H -1.39787683933 2.98334799634 -0.00369736757 0.000 0.002 -0.001 H 1.83794742242 -5.77033326187 -0.01295832570 0.001 -0.000 -0.004 H -0.61749414542 -5.33746053721 -0.01121572048 -0.000 -0.000 0.002 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 0.001 0.001 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 0.001 0.002 H 4.58301895157 2.13678100538 0.00314824260 0.000 -0.000 0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 -0.000 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.000 -0.629 0.002 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 0.413 -0.001 H -3.29620044300 -0.00255800648 -3.88456579214 0.000 0.324 -0.002 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 -0.160 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 0.000 0.002 0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.000 -0.002 -0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.000 0.001 0.000 H -3.29750276746 -0.00099200484 3.88584245085 0.000 -0.001 0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.000 0.028 -0.000 H -4.55107479454 0.00501307822 2.13844314827 0.000 -0.001 0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.000 -0.001 -0.000 H 6.86748209639 1.20005966818 0.00372860376 0.000 -0.000 -0.000 61 Mode 110: freq=1194.78 N -0.44003451495 -0.00038510790 2.12369783068 0.045 -0.000 0.001 C -1.76594470239 0.00039861437 2.37754210613 -0.230 0.001 -0.195 C -2.24923313135 -0.00145267054 3.67997125809 0.119 -0.000 0.070 C -1.33887502024 -0.00450793845 4.73956848945 0.048 -0.001 0.043 C 0.02462671625 -0.00591801736 4.46614405978 -0.191 0.001 -0.062 C 0.43187566201 -0.00376957955 3.13352499014 0.176 -0.000 0.026 C -2.63984642995 0.00218980399 1.17162612704 -0.121 0.000 -0.228 N -1.98513620489 0.00132140951 0.00153900685 -0.056 0.000 -0.005 C -2.63911589169 0.00167522827 -1.17277445342 -0.094 0.000 0.239 C -4.02452897564 0.00329996303 -1.20791476641 0.051 -0.000 -0.113 C -4.73391255267 0.00451580118 -0.00020876193 0.157 -0.000 -0.009 C -4.02924140493 0.00399189729 1.20660077672 0.070 -0.000 0.115 Co 0.00000000000 0.00000000000 0.00000000000 0.003 0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.051 -0.000 -0.011 C -1.76408906064 -0.00030645034 -2.37697009192 -0.217 0.001 0.191 C -2.24773885821 -0.00257631963 -3.67934971086 0.098 -0.000 -0.062 C -1.33713102227 -0.00526459193 -4.73855802198 0.056 -0.001 -0.047 C 0.02654101484 -0.00591797621 -4.46472703619 -0.182 0.001 0.066 C 0.43371721952 -0.00363389350 -3.13225443930 0.153 -0.000 -0.029 S -6.53329279136 0.00637481657 -0.11611178087 -0.033 0.000 0.001 N 2.00981687167 0.00259443239 -0.00000686048 -0.028 0.003 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.057 0.105 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.033 -0.052 0.000 C 4.76783866331 0.00148799420 0.00346798881 0.073 0.004 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.024 0.051 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.044 -0.111 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.102 0.093 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.059 -0.041 0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.023 -0.013 0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.092 0.033 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.082 -0.020 0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.017 0.003 0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.015 -0.001 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.096 -0.091 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.049 0.037 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.027 0.015 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.088 -0.034 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.071 0.021 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.021 0.001 0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.034 -0.013 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.082 -0.037 0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.034 -0.115 0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.034 -0.044 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.039 0.015 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.073 0.030 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.031 0.045 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.030 0.107 0.000 H 4.58301895157 2.13678100538 0.00314824260 0.070 -0.048 0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.063 0.046 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.082 0.000 -0.035 H 0.75224758084 -0.00860493512 -5.25016290812 -0.143 -0.000 -0.059 H -3.29620044300 -0.00255800648 -3.88456579214 0.065 -0.001 -0.214 H 1.47161249279 -0.00457826661 -2.87685200854 0.068 0.000 -0.090 H -1.69176120521 -0.00597000955 5.75026973076 0.069 0.000 0.030 H 0.75025791005 -0.00892914887 5.25161119224 -0.162 -0.000 0.075 H 1.46975366817 -0.00523069331 2.87805400798 0.075 0.000 0.087 H -3.29750276746 -0.00099200484 3.88584245085 0.074 -0.001 0.232 H -4.55513299541 0.00377930937 -2.13473279421 0.135 -0.000 -0.099 H -4.55107479454 0.00501307822 2.13844314827 0.151 -0.000 0.104 H -6.83436893102 0.00806057203 1.19721860356 -0.023 0.000 -0.003 H 6.86748209639 1.20005966818 0.00372860376 -0.011 0.001 -0.000 61 Mode 111: freq=1195.41 N -0.44003451495 -0.00038510790 2.12369783068 -0.023 -0.000 -0.005 C -1.76594470239 0.00039861437 2.37754210613 0.109 -0.000 0.102 C -2.24923313135 -0.00145267054 3.67997125809 -0.045 -0.000 -0.029 C -1.33887502024 -0.00450793845 4.73956848945 -0.019 0.000 -0.032 C 0.02462671625 -0.00591801736 4.46614405978 0.082 -0.000 0.032 C 0.43187566201 -0.00376957955 3.13352499014 -0.085 0.000 -0.011 C -2.63984642995 0.00218980399 1.17162612704 0.058 -0.000 0.116 N -1.98513620489 0.00132140951 0.00153900685 0.026 0.000 0.003 C -2.63911589169 0.00167522827 -1.17277445342 0.046 -0.000 -0.122 C -4.02452897564 0.00329996303 -1.20791476641 -0.022 0.000 0.059 C -4.73391255267 0.00451580118 -0.00020876193 -0.078 0.000 0.004 C -4.02924140493 0.00399189729 1.20660077672 -0.031 0.000 -0.061 Co 0.00000000000 0.00000000000 0.00000000000 -0.001 0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.027 -0.000 0.010 C -1.76408906064 -0.00030645034 -2.37697009192 0.102 -0.000 -0.100 C -2.24773885821 -0.00257631963 -3.67934971086 -0.035 -0.000 0.025 C -1.33713102227 -0.00526459193 -4.73855802198 -0.024 0.000 0.034 C 0.02654101484 -0.00591797621 -4.46472703619 0.077 -0.000 -0.034 C 0.43371721952 -0.00363389350 -3.13225443930 -0.073 0.000 0.012 S -6.53329279136 0.00637481657 -0.11611178087 0.016 -0.000 -0.001 N 2.00981687167 0.00259443239 -0.00000686048 -0.044 0.006 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.118 0.242 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.061 -0.137 0.000 C 4.76783866331 0.00148799420 0.00346798881 0.151 0.009 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.042 0.134 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.092 -0.255 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.210 0.217 -0.001 C 2.33938959521 3.68993217240 -0.00584554905 0.092 -0.080 0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.043 -0.049 0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.173 0.073 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.168 -0.042 0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.047 0.005 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.031 -0.001 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.198 -0.214 -0.001 C 2.33969079820 -3.68709653410 -0.00625612120 0.072 0.070 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.053 0.054 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.164 -0.076 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.144 0.044 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.055 0.005 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.078 -0.037 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.148 -0.060 0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.060 -0.233 0.001 H -1.39787683933 2.98334799634 -0.00369736757 0.072 -0.099 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.091 0.043 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.129 0.045 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.065 0.102 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.051 0.216 0.001 H 4.58301895157 2.13678100538 0.00314824260 0.153 -0.113 0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.137 0.108 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.041 -0.000 0.022 H 0.75224758084 -0.00860493512 -5.25016290812 0.057 0.000 0.020 H -3.29620044300 -0.00255800648 -3.88456579214 -0.026 0.000 0.094 H 1.47161249279 -0.00457826661 -2.87685200854 -0.033 0.000 0.045 H -1.69176120521 -0.00597000955 5.75026973076 -0.035 -0.000 -0.019 H 0.75025791005 -0.00892914887 5.25161119224 0.066 0.000 -0.028 H 1.46975366817 -0.00523069331 2.87805400798 -0.037 0.000 -0.043 H -3.29750276746 -0.00099200484 3.88584245085 -0.030 0.000 -0.103 H -4.55513299541 0.00377930937 -2.13473279421 -0.064 0.000 0.049 H -4.55107479454 0.00501307822 2.13844314827 -0.072 0.000 -0.052 H -6.83436893102 0.00806057203 1.19721860356 0.011 -0.000 0.001 H 6.86748209639 1.20005966818 0.00372860376 -0.021 0.002 -0.000 61 Mode 112: freq=1214.56 N -0.44003451495 -0.00038510790 2.12369783068 -0.001 0.003 -0.002 C -1.76594470239 0.00039861437 2.37754210613 -0.002 -0.001 0.001 C -2.24923313135 -0.00145267054 3.67997125809 0.003 0.000 0.001 C -1.33887502024 -0.00450793845 4.73956848945 -0.000 0.000 -0.001 C 0.02462671625 -0.00591801736 4.46614405978 -0.002 -0.001 0.001 C 0.43187566201 -0.00376957955 3.13352499014 0.002 0.001 -0.001 C -2.63984642995 0.00218980399 1.17162612704 -0.001 0.002 0.001 N -1.98513620489 0.00132140951 0.00153900685 0.000 -0.003 0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.001 0.002 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.001 -0.001 0.000 C -4.73391255267 0.00451580118 -0.00020876193 0.000 0.000 -0.000 C -4.02924140493 0.00399189729 1.20660077672 0.001 -0.001 -0.001 Co 0.00000000000 0.00000000000 0.00000000000 0.001 0.001 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.001 0.003 -0.001 C -1.76408906064 -0.00030645034 -2.37697009192 0.002 -0.001 -0.001 C -2.24773885821 -0.00257631963 -3.67934971086 -0.002 0.000 0.001 C -1.33713102227 -0.00526459193 -4.73855802198 0.001 0.000 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 0.001 -0.001 0.001 C 0.43371721952 -0.00363389350 -3.13225443930 -0.003 0.001 -0.001 S -6.53329279136 0.00637481657 -0.11611178087 0.000 0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.016 0.008 -0.000 C 2.67119656792 1.17263645248 0.00045766926 0.113 0.046 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.110 -0.018 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.001 -0.047 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.128 -0.004 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.115 0.023 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.161 0.001 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.221 0.109 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.042 -0.080 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.140 0.091 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.232 -0.068 0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.068 -0.150 0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.003 -0.005 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.178 -0.022 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.231 0.123 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.045 -0.078 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.151 0.087 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.254 -0.062 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.073 -0.158 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.125 -0.071 0.001 H -0.61802819388 5.33967450634 -0.01131742088 0.279 0.236 -0.001 H 3.39175422949 3.87200638269 -0.00704552340 -0.098 0.214 -0.001 H -1.39787683933 2.98334799634 -0.00369736757 -0.066 -0.058 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.125 -0.070 -0.001 H -0.61749414542 -5.33746053721 -0.01121572048 -0.296 0.247 0.001 H -1.39833026435 -2.98175334118 -0.00345676225 0.073 -0.053 -0.001 H 3.39230213722 -3.86796714602 -0.00754158092 0.105 0.243 0.001 H 4.58301895157 2.13678100538 0.00314824260 -0.100 0.031 0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.129 0.049 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.001 -0.000 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 0.002 0.001 0.002 H -3.29620044300 -0.00255800648 -3.88456579214 -0.001 -0.000 0.002 H 1.47161249279 -0.00457826661 -2.87685200854 -0.001 -0.003 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.001 -0.000 -0.001 H 0.75025791005 -0.00892914887 5.25161119224 -0.003 0.001 0.003 H 1.46975366817 -0.00523069331 2.87805400798 0.001 -0.003 -0.001 H -3.29750276746 -0.00099200484 3.88584245085 0.001 -0.000 0.003 H -4.55513299541 0.00377930937 -2.13473279421 -0.002 0.000 0.001 H -4.55107479454 0.00501307822 2.13844314827 0.001 0.000 0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.000 -0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 0.004 -0.002 0.000 61 Mode 113: freq=1214.77 N -0.44003451495 -0.00038510790 2.12369783068 0.063 -0.000 0.149 C -1.76594470239 0.00039861437 2.37754210613 0.171 -0.000 0.001 C -2.24923313135 -0.00145267054 3.67997125809 -0.217 0.000 -0.099 C -1.33887502024 -0.00450793845 4.73956848945 0.044 0.000 0.073 C 0.02462671625 -0.00591801736 4.46614405978 0.137 -0.000 -0.099 C 0.43187566201 -0.00376957955 3.13352499014 -0.231 0.000 0.080 C -2.63984642995 0.00218980399 1.17162612704 0.109 -0.000 -0.046 N -1.98513620489 0.00132140951 0.00153900685 -0.018 -0.000 -0.018 C -2.63911589169 0.00167522827 -1.17277445342 -0.113 0.000 -0.024 C -4.02452897564 0.00329996303 -1.20791476641 0.131 -0.000 0.007 C -4.73391255267 0.00451580118 -0.00020876193 0.001 0.000 0.043 C -4.02924140493 0.00399189729 1.20660077672 -0.112 0.000 0.018 Co 0.00000000000 0.00000000000 0.00000000000 0.001 0.000 -0.003 N -0.43839318333 -0.00054206762 -2.12229806799 -0.067 0.000 0.156 C -1.76408906064 -0.00030645034 -2.37697009192 -0.190 0.000 0.022 C -2.24773885821 -0.00257631963 -3.67934971086 0.230 -0.000 -0.111 C -1.33713102227 -0.00526459193 -4.73855802198 -0.046 -0.000 0.070 C 0.02654101484 -0.00591797621 -4.46472703619 -0.150 0.000 -0.096 C 0.43371721952 -0.00363389350 -3.13225443930 0.254 -0.000 0.078 S -6.53329279136 0.00637481657 -0.11611178087 -0.002 0.000 0.006 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 0.000 0.003 C 2.67119656792 1.17263645248 0.00045766926 0.001 -0.001 -0.002 C 4.06129317470 1.20536051565 0.00241240325 -0.001 0.001 0.001 C 4.76783866331 0.00148799420 0.00346798881 0.000 -0.001 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.001 -0.001 0.001 C 2.67108506586 -1.17139122066 0.00026591651 -0.001 0.001 -0.002 C 1.82209539371 2.39842937406 -0.00175320633 0.002 -0.001 0.001 C 2.33938959521 3.68993217240 -0.00584554905 -0.001 0.001 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.000 0.000 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.001 0.000 0.001 C -0.35359617412 3.21325694137 -0.00400174376 -0.002 -0.000 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.000 -0.001 -0.003 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 -0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.002 0.001 0.001 C 2.33969079820 -3.68709653410 -0.00625612120 0.004 0.002 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.000 -0.002 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.002 0.001 0.001 C -0.35393854068 -3.21111942258 -0.00398541364 0.003 -0.001 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.001 -0.002 -0.003 H 1.83694111827 5.77332096953 -0.01265611066 0.001 -0.000 0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.002 0.001 -0.001 H 3.39175422949 3.87200638269 -0.00704552340 -0.001 0.002 0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.001 0.000 0.002 H 1.83794742242 -5.77033326187 -0.01295832570 -0.002 -0.001 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.004 0.004 -0.001 H -1.39833026435 -2.98175334118 -0.00345676225 0.001 -0.001 0.003 H 3.39230213722 -3.86796714602 -0.00754158092 0.001 0.003 0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.002 0.001 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.001 -0.000 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.131 0.001 0.066 H 0.75224758084 -0.00860493512 -5.25016290812 -0.284 -0.001 -0.252 H -3.29620044300 -0.00255800648 -3.88456579214 0.111 -0.001 -0.245 H 1.47161249279 -0.00457826661 -2.87685200854 0.073 0.000 0.056 H -1.69176120521 -0.00597000955 5.75026973076 0.130 -0.001 0.067 H 0.75025791005 -0.00892914887 5.25161119224 0.266 0.000 -0.239 H 1.46975366817 -0.00523069331 2.87805400798 -0.065 -0.000 0.060 H -3.29750276746 -0.00099200484 3.88584245085 -0.103 0.001 -0.217 H -4.55513299541 0.00377930937 -2.13473279421 0.131 -0.000 -0.048 H -4.55107479454 0.00501307822 2.13844314827 -0.101 0.000 -0.032 H -6.83436893102 0.00806057203 1.19721860356 0.001 -0.000 0.002 H 6.86748209639 1.20005966818 0.00372860376 -0.000 -0.000 0.000 61 Mode 114: freq=1228.24 N -0.44003451495 -0.00038510790 2.12369783068 0.034 -0.000 0.081 C -1.76594470239 0.00039861437 2.37754210613 0.015 0.000 -0.060 C -2.24923313135 -0.00145267054 3.67997125809 -0.077 0.000 -0.045 C -1.33887502024 -0.00450793845 4.73956848945 0.020 -0.000 0.062 C 0.02462671625 -0.00591801736 4.46614405978 0.032 0.000 -0.067 C 0.43187566201 -0.00376957955 3.13352499014 -0.052 0.000 0.047 C -2.63984642995 0.00218980399 1.17162612704 -0.010 -0.000 -0.047 N -1.98513620489 0.00132140951 0.00153900685 -0.008 -0.000 -0.004 C -2.63911589169 0.00167522827 -1.17277445342 -0.007 -0.000 0.050 C -4.02452897564 0.00329996303 -1.20791476641 -0.009 0.000 -0.021 C -4.73391255267 0.00451580118 -0.00020876193 0.028 -0.000 -0.003 C -4.02924140493 0.00399189729 1.20660077672 -0.009 0.000 0.025 Co 0.00000000000 0.00000000000 0.00000000000 0.004 0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.037 -0.000 -0.083 C -1.76408906064 -0.00030645034 -2.37697009192 0.010 0.000 0.060 C -2.24773885821 -0.00257631963 -3.67934971086 -0.076 0.000 0.049 C -1.33713102227 -0.00526459193 -4.73855802198 0.024 -0.000 -0.064 C 0.02654101484 -0.00591797621 -4.46472703619 0.027 0.000 0.065 C 0.43371721952 -0.00363389350 -3.13225443930 -0.052 0.000 -0.042 S -6.53329279136 0.00637481657 -0.11611178087 -0.004 0.000 0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.019 -0.011 -0.000 C 2.67119656792 1.17263645248 0.00045766926 0.027 -0.121 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.017 0.069 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.065 -0.009 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.019 -0.060 0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.020 0.130 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.035 -0.155 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.194 -0.105 0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.050 0.144 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.076 -0.148 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.133 0.109 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.096 0.172 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.010 0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.018 0.156 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.190 0.112 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.061 -0.150 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.061 0.142 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.129 -0.097 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.105 -0.175 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.178 0.110 -0.001 H -0.61802819388 5.33967450634 -0.01131742088 -0.255 -0.250 0.001 H 3.39175422949 3.87200638269 -0.00704552340 0.079 -0.137 0.001 H -1.39787683933 2.98334799634 -0.00369736757 0.021 0.130 -0.001 H 1.83794742242 -5.77033326187 -0.01295832570 -0.185 -0.113 -0.001 H -0.61749414542 -5.33746053721 -0.01121572048 -0.242 0.241 0.001 H -1.39833026435 -2.98175334118 -0.00345676225 0.020 -0.128 -0.001 H 3.39230213722 -3.86796714602 -0.00754158092 0.077 0.132 0.001 H 4.58301895157 2.13678100538 0.00314824260 0.003 0.020 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 -0.019 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.076 -0.000 -0.045 H 0.75224758084 -0.00860493512 -5.25016290812 0.101 0.000 0.106 H -3.29620044300 -0.00255800648 -3.88456579214 -0.034 0.000 0.067 H 1.47161249279 -0.00457826661 -2.87685200854 -0.007 -0.000 -0.052 H -1.69176120521 -0.00597000955 5.75026973076 0.074 -0.000 0.044 H 0.75025791005 -0.00892914887 5.25161119224 0.104 0.000 -0.109 H 1.46975366817 -0.00523069331 2.87805400798 -0.007 -0.000 0.053 H -3.29750276746 -0.00099200484 3.88584245085 -0.035 0.000 -0.068 H -4.55513299541 0.00377930937 -2.13473279421 -0.004 -0.000 -0.005 H -4.55107479454 0.00501307822 2.13844314827 -0.005 -0.000 0.005 H -6.83436893102 0.00806057203 1.19721860356 -0.001 -0.000 0.000 H 6.86748209639 1.20005966818 0.00372860376 0.004 -0.000 0.000 61 Mode 115: freq=1229.92 N -0.44003451495 -0.00038510790 2.12369783068 -0.113 0.000 -0.168 C -1.76594470239 0.00039861437 2.37754210613 -0.015 -0.000 0.158 C -2.24923313135 -0.00145267054 3.67997125809 0.193 -0.000 0.107 C -1.33887502024 -0.00450793845 4.73956848945 -0.073 0.000 -0.146 C 0.02462671625 -0.00591801736 4.46614405978 -0.052 -0.000 0.146 C 0.43187566201 -0.00376957955 3.13352499014 0.128 0.000 -0.109 C -2.63984642995 0.00218980399 1.17162612704 0.034 0.000 0.130 N -1.98513620489 0.00132140951 0.00153900685 0.033 -0.000 0.012 C -2.63911589169 0.00167522827 -1.17277445342 0.026 -0.000 -0.139 C -4.02452897564 0.00329996303 -1.20791476641 0.008 -0.000 0.062 C -4.73391255267 0.00451580118 -0.00020876193 -0.062 0.000 0.009 C -4.02924140493 0.00399189729 1.20660077672 0.006 -0.000 -0.072 Co 0.00000000000 0.00000000000 0.00000000000 0.015 0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.123 0.000 0.171 C -1.76408906064 -0.00030645034 -2.37697009192 0.003 -0.000 -0.158 C -2.24773885821 -0.00257631963 -3.67934971086 0.188 -0.000 -0.116 C -1.33713102227 -0.00526459193 -4.73855802198 -0.085 0.000 0.151 C 0.02654101484 -0.00591797621 -4.46472703619 -0.037 -0.000 -0.138 C 0.43371721952 -0.00363389350 -3.13225443930 0.124 0.000 0.095 S -6.53329279136 0.00637481657 -0.11611178087 0.010 -0.000 -0.001 N 2.00981687167 0.00259443239 -0.00000686048 0.012 -0.005 0.000 C 2.67119656792 1.17263645248 0.00045766926 0.012 -0.060 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.001 0.043 -0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.010 -0.004 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.002 -0.039 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.008 0.064 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.013 -0.072 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.086 -0.040 0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.025 0.058 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.028 -0.059 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.056 0.048 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.049 0.061 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.002 0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.005 0.073 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.085 0.043 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.030 -0.061 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.022 0.056 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.055 -0.043 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.053 -0.063 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.079 0.047 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.103 -0.101 0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.033 -0.043 0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.008 0.058 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.083 -0.048 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.097 0.097 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.008 -0.057 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.032 0.042 0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.019 0.023 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.020 -0.023 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.209 0.001 0.113 H 0.75224758084 -0.00860493512 -5.25016290812 -0.216 -0.000 -0.234 H -3.29620044300 -0.00255800648 -3.88456579214 0.078 -0.000 -0.127 H 1.47161249279 -0.00457826661 -2.87685200854 0.014 0.000 0.132 H -1.69176120521 -0.00597000955 5.75026973076 -0.202 0.001 -0.111 H 0.75025791005 -0.00892914887 5.25161119224 -0.230 -0.000 0.245 H 1.46975366817 -0.00523069331 2.87805400798 0.016 0.000 -0.136 H -3.29750276746 -0.00099200484 3.88584245085 0.081 -0.001 0.132 H -4.55513299541 0.00377930937 -2.13473279421 -0.020 0.000 0.029 H -4.55107479454 0.00501307822 2.13844314827 -0.017 0.000 -0.030 H -6.83436893102 0.00806057203 1.19721860356 0.005 0.000 0.000 H 6.86748209639 1.20005966818 0.00372860376 0.001 -0.000 -0.000 61 Mode 116: freq=1242.20 N -0.44003451495 -0.00038510790 2.12369783068 -0.079 0.000 -0.036 C -1.76594470239 0.00039861437 2.37754210613 0.112 0.000 -0.054 C -2.24923313135 -0.00145267054 3.67997125809 -0.026 -0.000 0.088 C -1.33887502024 -0.00450793845 4.73956848945 -0.116 0.000 -0.022 C 0.02462671625 -0.00591801736 4.46614405978 0.102 0.000 -0.048 C 0.43187566201 -0.00376957955 3.13352499014 0.009 -0.001 0.082 C -2.63984642995 0.00218980399 1.17162612704 0.073 -0.000 -0.081 N -1.98513620489 0.00132140951 0.00153900685 -0.234 0.001 0.061 C -2.63911589169 0.00167522827 -1.17277445342 0.034 -0.000 0.044 C -4.02452897564 0.00329996303 -1.20791476641 0.112 -0.000 -0.169 C -4.73391255267 0.00451580118 -0.00020876193 -0.373 0.000 0.053 C -4.02924140493 0.00399189729 1.20660077672 0.106 -0.000 0.115 Co 0.00000000000 0.00000000000 0.00000000000 0.013 -0.001 -0.001 N -0.43839318333 -0.00054206762 -2.12229806799 -0.158 0.000 0.081 C -1.76408906064 -0.00030645034 -2.37697009192 0.222 0.000 0.054 C -2.24773885821 -0.00257631963 -3.67934971086 -0.021 -0.000 -0.176 C -1.33713102227 -0.00526459193 -4.73855802198 -0.210 0.000 0.077 C 0.02654101484 -0.00591797621 -4.46472703619 0.189 0.000 0.092 C 0.43371721952 -0.00363389350 -3.13225443930 0.011 -0.001 -0.169 S -6.53329279136 0.00637481657 -0.11611178087 0.055 -0.000 -0.006 N 2.00981687167 0.00259443239 -0.00000686048 0.051 0.031 0.001 C 2.67119656792 1.17263645248 0.00045766926 -0.026 -0.025 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.022 0.029 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.102 0.025 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.026 -0.055 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.008 0.004 0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.025 -0.015 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.006 0.021 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.030 -0.004 0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.025 -0.010 0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.005 0.018 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.020 -0.009 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.015 -0.003 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.078 0.011 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.001 -0.062 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.076 0.032 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.067 0.030 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.005 -0.059 -0.001 N 0.49225266031 -2.17934076887 -0.00084210065 0.059 0.030 0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.027 -0.008 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.022 -0.015 0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.001 0.022 0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.000 0.002 0.001 H 1.83794742242 -5.77033326187 -0.01295832570 0.065 0.026 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.048 0.033 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.001 -0.009 0.001 H 3.39230213722 -3.86796714602 -0.00754158092 -0.002 -0.029 0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.079 0.050 0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.063 -0.049 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.171 0.000 0.059 H 0.75224758084 -0.00860493512 -5.25016290812 0.141 0.000 0.104 H -3.29620044300 -0.00255800648 -3.88456579214 0.003 -0.000 -0.095 H 1.47161249279 -0.00457826661 -2.87685200854 -0.005 0.001 -0.030 H -1.69176120521 -0.00597000955 5.75026973076 -0.094 0.000 -0.026 H 0.75025791005 -0.00892914887 5.25161119224 0.085 0.000 -0.064 H 1.46975366817 -0.00523069331 2.87805400798 -0.002 0.001 0.011 H -3.29750276746 -0.00099200484 3.88584245085 0.003 -0.000 0.077 H -4.55513299541 0.00377930937 -2.13473279421 0.267 -0.000 -0.186 H -4.55107479454 0.00501307822 2.13844314827 0.299 -0.000 0.186 H -6.83436893102 0.00806057203 1.19721860356 0.038 0.000 0.004 H 6.86748209639 1.20005966818 0.00372860376 -0.016 0.002 -0.000 61 Mode 117: freq=1243.07 N -0.44003451495 -0.00038510790 2.12369783068 0.001 0.000 0.004 C -1.76594470239 0.00039861437 2.37754210613 -0.005 0.001 0.012 C -2.24923313135 -0.00145267054 3.67997125809 0.008 -0.001 -0.005 C -1.33887502024 -0.00450793845 4.73956848945 0.008 0.000 -0.003 C 0.02462671625 -0.00591801736 4.46614405978 -0.006 0.001 0.001 C 0.43187566201 -0.00376957955 3.13352499014 -0.001 -0.001 -0.002 C -2.63984642995 0.00218980399 1.17162612704 -0.020 -0.000 0.023 N -1.98513620489 0.00132140951 0.00153900685 0.055 0.004 -0.032 C -2.63911589169 0.00167522827 -1.17277445342 -0.003 -0.000 -0.004 C -4.02452897564 0.00329996303 -1.20791476641 -0.027 -0.001 0.044 C -4.73391255267 0.00451580118 -0.00020876193 0.083 0.000 -0.026 C -4.02924140493 0.00399189729 1.20660077672 -0.025 -0.001 -0.017 Co 0.00000000000 0.00000000000 0.00000000000 -0.008 -0.005 0.001 N -0.43839318333 -0.00054206762 -2.12229806799 0.045 0.000 -0.031 C -1.76408906064 -0.00030645034 -2.37697009192 -0.064 0.001 -0.010 C -2.24773885821 -0.00257631963 -3.67934971086 0.002 -0.001 0.055 C -1.33713102227 -0.00526459193 -4.73855802198 0.059 0.000 -0.028 C 0.02654101484 -0.00591797621 -4.46472703619 -0.052 0.001 -0.022 C 0.43371721952 -0.00363389350 -3.13225443930 -0.004 -0.001 0.046 S -6.53329279136 0.00637481657 -0.11611178087 -0.011 -0.000 0.003 N 2.00981687167 0.00259443239 -0.00000686048 0.108 0.252 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.094 -0.115 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.035 -0.021 0.000 C 4.76783866331 0.00148799420 0.00346798881 0.187 0.193 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.065 -0.173 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.035 -0.051 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.128 -0.052 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.041 -0.110 0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.103 0.095 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.090 0.035 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.004 -0.091 0.001 N 0.49290585413 2.18198449515 -0.00068475564 -0.103 0.066 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.015 -0.023 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.303 0.011 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.015 -0.248 -0.001 C 1.45789786198 -4.76953179608 -0.00945089783 0.278 0.151 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.246 0.112 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.011 -0.228 -0.001 N 0.49225266031 -2.17934076887 -0.00084210065 0.226 0.126 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.100 0.056 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.031 0.014 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.007 0.008 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.004 -0.009 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.243 0.105 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.161 0.108 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.008 -0.033 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.009 -0.088 -0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.205 0.101 -0.001 H 4.58784714512 -2.12983634010 0.00211631073 -0.071 -0.085 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.051 -0.000 -0.020 H 0.75224758084 -0.00860493512 -5.25016290812 -0.033 -0.001 -0.022 H -3.29620044300 -0.00255800648 -3.88456579214 -0.002 0.001 0.030 H 1.47161249279 -0.00457826661 -2.87685200854 0.001 0.003 0.006 H -1.69176120521 -0.00597000955 5.75026973076 0.007 -0.000 0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.007 -0.000 0.005 H 1.46975366817 -0.00523069331 2.87805400798 0.000 0.003 0.001 H -3.29750276746 -0.00099200484 3.88584245085 -0.001 0.001 -0.017 H -4.55513299541 0.00377930937 -2.13473279421 -0.056 0.001 0.041 H -4.55107479454 0.00501307822 2.13844314827 -0.074 0.001 -0.042 H -6.83436893102 0.00806057203 1.19721860356 -0.015 0.000 -0.002 H 6.86748209639 1.20005966818 0.00372860376 -0.097 0.017 -0.000 61 Mode 118: freq=1243.74 N -0.44003451495 -0.00038510790 2.12369783068 0.208 -0.000 0.134 C -1.76594470239 0.00039861437 2.37754210613 -0.271 0.000 -0.015 C -2.24923313135 -0.00145267054 3.67997125809 -0.034 0.000 -0.234 C -1.33887502024 -0.00450793845 4.73956848945 0.243 -0.001 0.149 C 0.02462671625 -0.00591801736 4.46614405978 -0.207 0.000 0.084 C 0.43187566201 -0.00376957955 3.13352499014 -0.020 0.000 -0.191 C -2.63984642995 0.00218980399 1.17162612704 0.047 -0.000 -0.067 N -1.98513620489 0.00132140951 0.00153900685 0.029 0.001 0.250 C -2.63911589169 0.00167522827 -1.17277445342 -0.067 -0.000 -0.081 C -4.02452897564 0.00329996303 -1.20791476641 -0.007 -0.000 -0.074 C -4.73391255267 0.00451580118 -0.00020876193 0.059 0.000 0.192 C -4.02924140493 0.00399189729 1.20660077672 -0.020 -0.000 -0.120 Co 0.00000000000 0.00000000000 0.00000000000 0.000 -0.002 -0.008 N -0.43839318333 -0.00054206762 -2.12229806799 -0.158 0.000 0.106 C -1.76408906064 -0.00030645034 -2.37697009192 0.205 0.000 -0.018 C -2.24773885821 -0.00257631963 -3.67934971086 0.032 -0.001 -0.181 C -1.33713102227 -0.00526459193 -4.73855802198 -0.180 0.000 0.121 C 0.02654101484 -0.00591797621 -4.46472703619 0.154 0.000 0.066 C 0.43371721952 -0.00363389350 -3.13225443930 0.014 -0.001 -0.152 S -6.53329279136 0.00637481657 -0.11611178087 -0.025 -0.000 -0.024 N 2.00981687167 0.00259443239 -0.00000686048 -0.056 0.072 0.005 C 2.67119656792 1.17263645248 0.00045766926 0.003 -0.008 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.030 -0.070 -0.001 C 4.76783866331 0.00148799420 0.00346798881 -0.110 0.052 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.023 0.018 -0.001 C 2.67108506586 -1.17139122066 0.00026591651 0.034 -0.039 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.119 0.004 0.001 C 2.33938959521 3.68993217240 -0.00584554905 0.007 -0.099 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.112 0.059 0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.096 0.039 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.008 -0.084 -0.001 N 0.49290585413 2.18198449515 -0.00068475564 -0.090 0.053 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.022 -0.006 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.007 -0.019 0.001 C 2.33969079820 -3.68709653410 -0.00625612120 -0.014 -0.009 -0.001 C 1.45789786198 -4.76953179608 -0.00945089783 0.001 0.016 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.000 -0.000 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.000 -0.006 -0.001 N 0.49225266031 -2.17934076887 -0.00084210065 0.008 0.007 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.103 0.044 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.060 0.038 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.005 -0.044 0.002 H -1.39787683933 2.98334799634 -0.00369736757 -0.003 -0.008 0.002 H 1.83794742242 -5.77033326187 -0.01295832570 0.003 0.006 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.010 -0.009 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 -0.000 0.003 H 3.39230213722 -3.86796714602 -0.00754158092 -0.001 0.015 0.002 H 4.58301895157 2.13678100538 0.00314824260 0.057 -0.050 0.001 H 4.58784714512 -2.12983634010 0.00211631073 0.096 0.056 0.002 H -1.68997263563 -0.00719388386 -5.74925805817 -0.162 0.000 0.075 H 0.75224758084 -0.00860493512 -5.25016290812 0.074 -0.000 0.045 H -3.29620044300 -0.00255800648 -3.88456579214 0.010 0.000 -0.047 H 1.47161249279 -0.00457826661 -2.87685200854 -0.004 0.001 -0.023 H -1.69176120521 -0.00597000955 5.75026973076 0.223 -0.000 0.097 H 0.75025791005 -0.00892914887 5.25161119224 -0.106 -0.000 0.064 H 1.46975366817 -0.00523069331 2.87805400798 0.006 0.000 -0.022 H -3.29750276746 -0.00099200484 3.88584245085 -0.013 0.001 -0.078 H -4.55513299541 0.00377930937 -2.13473279421 -0.112 0.001 0.037 H -4.55107479454 0.00501307822 2.13844314827 0.031 0.000 -0.019 H -6.83436893102 0.00806057203 1.19721860356 0.089 -0.000 0.018 H 6.86748209639 1.20005966818 0.00372860376 -0.020 0.005 0.000 61 Mode 119: freq=1243.95 N -0.44003451495 -0.00038510790 2.12369783068 -0.097 0.000 -0.070 C -1.76594470239 0.00039861437 2.37754210613 0.130 0.000 -0.002 C -2.24923313135 -0.00145267054 3.67997125809 0.010 -0.001 0.114 C -1.33887502024 -0.00450793845 4.73956848945 -0.119 0.000 -0.069 C 0.02462671625 -0.00591801736 4.46614405978 0.100 0.000 -0.036 C 0.43187566201 -0.00376957955 3.13352499014 0.011 -0.001 0.088 C -2.63984642995 0.00218980399 1.17162612704 -0.004 -0.000 0.013 N -1.98513620489 0.00132140951 0.00153900685 -0.063 0.002 -0.089 C -2.63911589169 0.00167522827 -1.17277445342 0.034 -0.000 0.040 C -4.02452897564 0.00329996303 -1.20791476641 0.028 -0.000 -0.003 C -4.73391255267 0.00451580118 -0.00020876193 -0.102 0.000 -0.067 C -4.02924140493 0.00399189729 1.20660077672 0.032 -0.000 0.070 Co 0.00000000000 0.00000000000 0.00000000000 0.012 -0.003 0.003 N -0.43839318333 -0.00054206762 -2.12229806799 0.035 0.000 -0.018 C -1.76408906064 -0.00030645034 -2.37697009192 -0.041 0.000 0.015 C -2.24773885821 -0.00257631963 -3.67934971086 -0.015 -0.000 0.035 C -1.33713102227 -0.00526459193 -4.73855802198 0.033 0.000 -0.030 C 0.02654101484 -0.00591797621 -4.46472703619 -0.029 0.000 -0.016 C 0.43371721952 -0.00363389350 -3.13225443930 -0.002 -0.001 0.033 S -6.53329279136 0.00637481657 -0.11611178087 0.021 -0.000 0.008 N 2.00981687167 0.00259443239 -0.00000686048 -0.161 0.134 -0.002 C 2.67119656792 1.17263645248 0.00045766926 0.023 -0.000 0.000 C 4.06129317470 1.20536051565 0.00241240325 0.080 -0.169 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.304 0.096 -0.001 C 4.05723810074 -1.20352939940 0.00211502115 0.068 0.074 0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.079 -0.086 0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.271 0.018 -0.001 C 2.33938959521 3.68993217240 -0.00584554905 0.011 -0.226 0.001 C 1.45736908622 4.77231118002 -0.00917967851 -0.258 0.131 -0.001 C 0.08658913130 4.53522926787 -0.00833235387 0.221 0.090 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.018 -0.192 0.001 N 0.49290585413 2.18198449515 -0.00068475564 -0.204 0.120 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.056 -0.012 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.035 -0.049 -0.001 C 2.33969079820 -3.68709653410 -0.00625612120 -0.030 0.022 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.046 0.012 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.041 -0.019 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.002 0.025 0.001 N 0.49225266031 -2.17934076887 -0.00084210065 -0.018 -0.004 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.236 0.099 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.141 0.090 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.013 -0.111 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.007 -0.017 -0.001 H 1.83794742242 -5.77033326187 -0.01295832570 -0.036 -0.004 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.051 -0.039 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.001 0.003 -0.001 H 3.39230213722 -3.86796714602 -0.00754158092 -0.001 0.055 -0.000 H 4.58301895157 2.13678100538 0.00314824260 0.177 -0.140 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.252 0.153 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.029 -0.000 -0.016 H 0.75224758084 -0.00860493512 -5.25016290812 -0.011 -0.000 -0.007 H -3.29620044300 -0.00255800648 -3.88456579214 -0.001 0.001 -0.008 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 0.002 0.007 H -1.69176120521 -0.00597000955 5.75026973076 -0.111 0.000 -0.047 H 0.75025791005 -0.00892914887 5.25161119224 0.051 -0.000 -0.029 H 1.46975366817 -0.00523069331 2.87805400798 -0.003 0.002 0.007 H -3.29750276746 -0.00099200484 3.88584245085 0.008 0.001 0.054 H -4.55513299541 0.00377930937 -2.13473279421 0.102 0.001 -0.054 H -4.55107479454 0.00501307822 2.13844314827 0.051 0.001 0.046 H -6.83436893102 0.00806057203 1.19721860356 -0.028 0.000 -0.007 H 6.86748209639 1.20005966818 0.00372860376 -0.033 0.009 -0.000 61 Mode 120: freq=1281.91 N -0.44003451495 -0.00038510790 2.12369783068 0.101 -0.000 0.074 C -1.76594470239 0.00039861437 2.37754210613 -0.060 -0.000 0.119 C -2.24923313135 -0.00145267054 3.67997125809 -0.039 0.000 -0.160 C -1.33887502024 -0.00450793845 4.73956848945 0.152 -0.000 0.050 C 0.02462671625 -0.00591801736 4.46614405978 -0.107 -0.000 0.124 C 0.43187566201 -0.00376957955 3.13352499014 -0.075 0.001 -0.181 C -2.63984642995 0.00218980399 1.17162612704 0.079 0.000 0.060 N -1.98513620489 0.00132140951 0.00153900685 -0.173 -0.000 -0.001 C -2.63911589169 0.00167522827 -1.17277445342 0.051 0.000 -0.070 C -4.02452897564 0.00329996303 -1.20791476641 0.113 -0.000 -0.093 C -4.73391255267 0.00451580118 -0.00020876193 -0.323 0.000 0.011 C -4.02924140493 0.00399189729 1.20660077672 0.094 -0.000 0.086 Co 0.00000000000 0.00000000000 0.00000000000 0.007 0.000 0.001 N -0.43839318333 -0.00054206762 -2.12229806799 0.110 -0.000 -0.083 C -1.76408906064 -0.00030645034 -2.37697009192 -0.076 -0.000 -0.102 C -2.24773885821 -0.00257631963 -3.67934971086 -0.046 0.000 0.173 C -1.33713102227 -0.00526459193 -4.73855802198 0.156 -0.000 -0.064 C 0.02654101484 -0.00591797621 -4.46472703619 -0.109 -0.000 -0.117 C 0.43371721952 -0.00363389350 -3.13225443930 -0.071 0.001 0.177 S -6.53329279136 0.00637481657 -0.11611178087 0.047 -0.000 0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.091 -0.001 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.042 0.021 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.051 0.059 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.179 0.005 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.061 -0.062 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.028 -0.026 0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.027 0.052 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.026 -0.081 0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.072 0.029 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.050 0.057 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.040 -0.086 0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.054 0.040 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.026 0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.036 -0.043 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.031 0.089 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.075 -0.037 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.052 -0.054 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.038 0.084 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.059 -0.045 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.072 0.028 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.045 0.044 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.012 -0.054 0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.019 -0.060 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.079 -0.033 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.040 -0.037 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.017 0.054 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.013 0.057 0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.117 0.076 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.127 -0.081 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.162 -0.000 -0.060 H 0.75224758084 -0.00860493512 -5.25016290812 -0.105 -0.000 -0.102 H -3.29620044300 -0.00255800648 -3.88456579214 -0.027 0.000 0.130 H 1.47161249279 -0.00457826661 -2.87685200854 -0.036 0.000 0.115 H -1.69176120521 -0.00597000955 5.75026973076 0.149 -0.000 0.051 H 0.75025791005 -0.00892914887 5.25161119224 -0.117 -0.000 0.115 H 1.46975366817 -0.00523069331 2.87805400798 -0.039 0.000 -0.127 H -3.29750276746 -0.00099200484 3.88584245085 -0.024 0.000 -0.123 H -4.55513299541 0.00377930937 -2.13473279421 0.220 -0.000 -0.135 H -4.55107479454 0.00501307822 2.13844314827 0.202 -0.000 0.125 H -6.83436893102 0.00806057203 1.19721860356 0.012 0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.007 -0.000 -0.000 61 Mode 121: freq=1284.76 N -0.44003451495 -0.00038510790 2.12369783068 0.048 0.000 0.030 C -1.76594470239 0.00039861437 2.37754210613 -0.030 -0.000 0.064 C -2.24923313135 -0.00145267054 3.67997125809 -0.017 0.000 -0.078 C -1.33887502024 -0.00450793845 4.73956848945 0.075 -0.000 0.024 C 0.02462671625 -0.00591801736 4.46614405978 -0.054 -0.000 0.069 C 0.43187566201 -0.00376957955 3.13352499014 -0.033 0.000 -0.100 C -2.63984642995 0.00218980399 1.17162612704 0.041 -0.000 0.032 N -1.98513620489 0.00132140951 0.00153900685 -0.089 0.000 -0.001 C -2.63911589169 0.00167522827 -1.17277445342 0.025 -0.000 -0.038 C -4.02452897564 0.00329996303 -1.20791476641 0.058 -0.000 -0.045 C -4.73391255267 0.00451580118 -0.00020876193 -0.161 0.000 0.006 C -4.02924140493 0.00399189729 1.20660077672 0.046 -0.000 0.041 Co 0.00000000000 0.00000000000 0.00000000000 0.018 -0.001 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.053 0.000 -0.035 C -1.76408906064 -0.00030645034 -2.37697009192 -0.039 -0.000 -0.054 C -2.24773885821 -0.00257631963 -3.67934971086 -0.021 0.000 0.085 C -1.33713102227 -0.00526459193 -4.73855802198 0.077 -0.000 -0.032 C 0.02654101484 -0.00591797621 -4.46472703619 -0.054 -0.000 -0.064 C 0.43371721952 -0.00363389350 -3.13225443930 -0.031 0.000 0.097 S -6.53329279136 0.00637481657 -0.11611178087 0.023 -0.000 0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.172 0.003 -0.000 C 2.67119656792 1.17263645248 0.00045766926 0.086 -0.045 0.000 C 4.06129317470 1.20536051565 0.00241240325 0.091 -0.109 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.339 -0.012 -0.001 C 4.05723810074 -1.20352939940 0.00211502115 0.115 0.115 0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.053 0.057 0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.052 -0.112 0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.045 0.154 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.139 -0.055 0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.099 -0.121 0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.070 0.183 -0.001 N 0.49290585413 2.18198449515 -0.00068475564 0.097 -0.070 0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.049 -0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.071 0.090 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.053 -0.169 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.143 0.072 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.100 0.112 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.064 -0.177 -0.001 N 0.49225266031 -2.17934076887 -0.00084210065 0.108 0.080 0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.139 -0.054 0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.113 -0.109 0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.022 0.112 -0.001 H -1.39787683933 2.98334799634 -0.00369736757 -0.036 0.129 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.154 0.064 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.098 0.094 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.031 -0.114 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.025 -0.118 -0.001 H 4.58301895157 2.13678100538 0.00314824260 0.214 -0.139 0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.236 0.150 0.001 H -1.68997263563 -0.00719388386 -5.74925805817 0.081 -0.000 -0.030 H 0.75224758084 -0.00860493512 -5.25016290812 -0.064 -0.000 -0.063 H -3.29620044300 -0.00255800648 -3.88456579214 -0.013 0.000 0.066 H 1.47161249279 -0.00457826661 -2.87685200854 -0.017 -0.000 0.063 H -1.69176120521 -0.00597000955 5.75026973076 0.075 -0.000 0.025 H 0.75025791005 -0.00892914887 5.25161119224 -0.071 -0.000 0.071 H 1.46975366817 -0.00523069331 2.87805400798 -0.019 -0.000 -0.070 H -3.29750276746 -0.00099200484 3.88584245085 -0.012 0.000 -0.063 H -4.55513299541 0.00377930937 -2.13473279421 0.110 -0.000 -0.066 H -4.55107479454 0.00501307822 2.13844314827 0.099 -0.000 0.061 H -6.83436893102 0.00806057203 1.19721860356 0.006 0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 0.013 0.000 0.000 61 Mode 122: freq=1298.90 N -0.44003451495 -0.00038510790 2.12369783068 0.000 -0.003 0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.001 0.000 0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.000 0.000 -0.001 C -1.33887502024 -0.00450793845 4.73956848945 0.000 0.000 0.000 C 0.02462671625 -0.00591801736 4.46614405978 -0.000 -0.000 0.000 C 0.43187566201 -0.00376957955 3.13352499014 0.000 0.001 -0.001 C -2.63984642995 0.00218980399 1.17162612704 -0.000 0.003 0.000 N -1.98513620489 0.00132140951 0.00153900685 -0.001 -0.009 0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.001 0.003 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 0.000 -0.000 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 -0.001 0.000 -0.000 C -4.02924140493 0.00399189729 1.20660077672 0.001 -0.000 0.000 Co 0.00000000000 0.00000000000 0.00000000000 0.001 0.013 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.000 -0.003 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 0.000 -0.001 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 0.000 0.001 C -1.33713102227 -0.00526459193 -4.73855802198 0.001 0.000 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 -0.000 -0.000 -0.001 C 0.43371721952 -0.00363389350 -3.13225443930 -0.000 0.001 0.001 S -6.53329279136 0.00637481657 -0.11611178087 0.000 0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.004 -0.329 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.175 0.006 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.157 0.081 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.023 -0.043 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.147 0.090 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.175 0.015 0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.144 0.237 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.023 0.014 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.081 -0.085 0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.050 0.132 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.103 -0.135 0.001 N 0.49290585413 2.18198449515 -0.00068475564 0.035 -0.024 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.001 0.017 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.146 0.252 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.019 0.002 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.087 -0.083 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.053 0.141 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.111 -0.149 -0.001 N 0.49225266031 -2.17934076887 -0.00084210065 -0.027 -0.018 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.090 -0.004 0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.217 0.217 -0.001 H 3.39175422949 3.87200638269 -0.00704552340 0.012 -0.132 0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.069 -0.206 0.001 H 1.83794742242 -5.77033326187 -0.01295832570 0.095 -0.002 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.220 0.221 0.001 H -1.39833026435 -2.98175334118 -0.00345676225 -0.073 -0.217 -0.001 H 3.39230213722 -3.86796714602 -0.00754158092 -0.014 -0.143 -0.001 H 4.58301895157 2.13678100538 0.00314824260 0.246 -0.081 0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.219 -0.065 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.001 0.000 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.001 0.000 -0.001 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 -0.000 0.001 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 0.001 0.001 H -1.69176120521 -0.00597000955 5.75026973076 0.000 0.000 0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.000 0.000 0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.000 0.001 -0.000 H -3.29750276746 -0.00099200484 3.88584245085 -0.000 -0.000 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.000 -0.001 -0.000 H -4.55107479454 0.00501307822 2.13844314827 0.001 -0.001 0.001 H -6.83436893102 0.00806057203 1.19721860356 0.000 -0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 0.037 -0.005 0.000 61 Mode 123: freq=1300.93 N -0.44003451495 -0.00038510790 2.12369783068 0.049 -0.000 0.036 C -1.76594470239 0.00039861437 2.37754210613 -0.168 0.000 -0.223 C -2.24923313135 -0.00145267054 3.67997125809 -0.028 0.000 -0.039 C -1.33887502024 -0.00450793845 4.73956848945 -0.064 -0.000 0.098 C 0.02462671625 -0.00591801736 4.46614405978 0.040 0.000 -0.132 C 0.43187566201 -0.00376957955 3.13352499014 0.101 -0.000 0.127 C -2.63984642995 0.00218980399 1.17162612704 -0.217 0.000 0.040 N -1.98513620489 0.00132140951 0.00153900685 -0.002 0.000 0.247 C -2.63911589169 0.00167522827 -1.17277445342 0.217 -0.000 0.030 C -4.02452897564 0.00329996303 -1.20791476641 -0.186 0.000 -0.057 C -4.73391255267 0.00451580118 -0.00020876193 -0.025 0.000 -0.025 C -4.02924140493 0.00399189729 1.20660077672 0.194 -0.000 -0.047 Co 0.00000000000 0.00000000000 0.00000000000 0.001 -0.000 -0.014 N -0.43839318333 -0.00054206762 -2.12229806799 -0.042 0.000 0.032 C -1.76408906064 -0.00030645034 -2.37697009192 0.174 -0.000 -0.242 C -2.24773885821 -0.00257631963 -3.67934971086 0.024 -0.000 -0.029 C -1.33713102227 -0.00526459193 -4.73855802198 0.070 0.000 0.099 C 0.02654101484 -0.00591797621 -4.46472703619 -0.042 -0.000 -0.142 C 0.43371721952 -0.00363389350 -3.13225443930 -0.111 0.000 0.140 S -6.53329279136 0.00637481657 -0.11611178087 0.003 -0.000 -0.013 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 0.001 0.009 C 2.67119656792 1.17263645248 0.00045766926 0.001 -0.000 -0.003 C 4.06129317470 1.20536051565 0.00241240325 0.000 -0.000 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.001 0.000 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.001 0.000 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 0.000 -0.003 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 -0.001 -0.001 C 2.33938959521 3.68993217240 -0.00584554905 0.000 0.000 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.000 -0.000 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.000 -0.001 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.000 0.001 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.000 -0.000 0.004 S 6.56718562933 -0.11349126889 0.00673479967 0.000 -0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.001 0.000 -0.001 C 2.33969079820 -3.68709653410 -0.00625612120 -0.000 -0.001 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 0.000 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.000 0.000 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.000 -0.001 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.000 0.000 0.004 H 1.83694111827 5.77332096953 -0.01265611066 0.000 -0.000 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.001 -0.001 0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 0.001 0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.000 0.001 -0.001 H 1.83794742242 -5.77033326187 -0.01295832570 0.000 0.000 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.000 0.000 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 -0.000 -0.001 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 -0.000 0.000 H 4.58301895157 2.13678100538 0.00314824260 0.000 -0.000 0.001 H 4.58784714512 -2.12983634010 0.00211631073 0.001 0.000 0.001 H -1.68997263563 -0.00719388386 -5.74925805817 0.074 0.000 0.015 H 0.75224758084 -0.00860493512 -5.25016290812 -0.219 -0.000 -0.234 H -3.29620044300 -0.00255800648 -3.88456579214 -0.012 0.000 0.113 H 1.47161249279 -0.00457826661 -2.87685200854 -0.080 0.000 0.221 H -1.69176120521 -0.00597000955 5.75026973076 -0.070 0.000 0.015 H 0.75025791005 -0.00892914887 5.25161119224 0.216 0.000 -0.228 H 1.46975366817 -0.00523069331 2.87805400798 0.074 -0.000 0.208 H -3.29750276746 -0.00099200484 3.88584245085 0.009 -0.000 0.100 H -4.55513299541 0.00377930937 -2.13473279421 -0.218 0.000 0.068 H -4.55107479454 0.00501307822 2.13844314827 0.244 -0.000 0.084 H -6.83436893102 0.00806057203 1.19721860356 0.016 -0.000 0.001 H 6.86748209639 1.20005966818 0.00372860376 -0.000 0.000 0.000 61 Mode 124: freq=1316.89 N -0.44003451495 -0.00038510790 2.12369783068 0.000 0.003 0.000 C -1.76594470239 0.00039861437 2.37754210613 0.000 -0.001 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.000 0.000 0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.000 -0.000 -0.000 C 0.02462671625 -0.00591801736 4.46614405978 0.000 -0.000 -0.000 C 0.43187566201 -0.00376957955 3.13352499014 -0.000 0.001 0.001 C -2.63984642995 0.00218980399 1.17162612704 -0.000 -0.000 -0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 -0.001 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.000 -0.000 0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.000 0.000 0.000 C -4.73391255267 0.00451580118 -0.00020876193 0.001 -0.000 -0.000 C -4.02924140493 0.00399189729 1.20660077672 0.000 0.000 0.000 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 -0.004 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.000 0.003 0.000 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 -0.001 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 -0.000 0.000 -0.000 C -1.33713102227 -0.00526459193 -4.73855802198 -0.000 -0.000 0.000 C 0.02654101484 -0.00591797621 -4.46472703619 0.000 -0.000 0.000 C 0.43371721952 -0.00363389350 -3.13225443930 -0.000 0.001 -0.001 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 0.000 0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.002 -0.346 0.000 C 2.67119656792 1.17263645248 0.00045766926 0.277 0.232 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.262 0.184 -0.001 C 4.76783866331 0.00148799420 0.00346798881 0.029 -0.350 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.260 0.160 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.278 0.229 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.080 -0.057 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.041 -0.117 0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.068 0.082 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.031 -0.003 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.016 0.012 0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.017 0.043 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.023 0.015 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.097 -0.088 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.038 -0.113 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.063 0.091 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.031 -0.014 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.032 0.026 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.012 0.040 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.228 0.106 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.042 0.027 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.038 -0.186 0.001 H -1.39787683933 2.98334799634 -0.00369736757 -0.009 0.020 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.230 0.110 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.038 0.020 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.017 0.037 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.035 -0.171 -0.001 H 4.58301895157 2.13678100538 0.00314824260 -0.037 0.032 0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.010 0.008 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.000 0.000 0.000 H 0.75224758084 -0.00860493512 -5.25016290812 0.001 0.000 0.001 H -3.29620044300 -0.00255800648 -3.88456579214 0.000 -0.000 -0.001 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 -0.005 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 0.000 0.000 0.000 H 0.75025791005 -0.00892914887 5.25161119224 0.001 0.000 -0.001 H 1.46975366817 -0.00523069331 2.87805400798 -0.000 -0.005 0.000 H -3.29750276746 -0.00099200484 3.88584245085 -0.000 -0.000 0.000 H -4.55513299541 0.00377930937 -2.13473279421 -0.000 -0.000 0.000 H -4.55107479454 0.00501307822 2.13844314827 -0.000 -0.000 -0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.000 -0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 0.092 -0.020 0.000 61 Mode 125: freq=1319.86 N -0.44003451495 -0.00038510790 2.12369783068 0.022 0.000 -0.022 C -1.76594470239 0.00039861437 2.37754210613 0.030 -0.000 0.039 C -2.24923313135 -0.00145267054 3.67997125809 0.034 -0.000 0.088 C -1.33887502024 -0.00450793845 4.73956848945 -0.067 0.000 -0.060 C 0.02462671625 -0.00591801736 4.46614405978 0.025 0.000 -0.007 C 0.43187566201 -0.00376957955 3.13352499014 -0.009 0.000 -0.020 C -2.63984642995 0.00218980399 1.17162612704 0.239 -0.000 -0.218 N -1.98513620489 0.00132140951 0.00153900685 -0.003 0.000 0.370 C -2.63911589169 0.00167522827 -1.17277445342 -0.240 0.000 -0.216 C -4.02452897564 0.00329996303 -1.20791476641 0.230 -0.000 -0.175 C -4.73391255267 0.00451580118 -0.00020876193 0.023 0.000 0.363 C -4.02924140493 0.00399189729 1.20660077672 -0.230 0.000 -0.196 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 -0.000 0.003 N -0.43839318333 -0.00054206762 -2.12229806799 -0.024 0.000 -0.021 C -1.76408906064 -0.00030645034 -2.37697009192 -0.049 0.000 0.066 C -2.24773885821 -0.00257631963 -3.67934971086 -0.033 0.000 0.087 C -1.33713102227 -0.00526459193 -4.73855802198 0.064 -0.000 -0.069 C 0.02654101484 -0.00591797621 -4.46472703619 -0.026 -0.000 0.002 C 0.43371721952 -0.00363389350 -3.13225443930 0.022 -0.000 -0.030 S -6.53329279136 0.00637481657 -0.11611178087 -0.023 -0.000 -0.018 N 2.00981687167 0.00259443239 -0.00000686048 0.000 -0.000 0.002 C 2.67119656792 1.17263645248 0.00045766926 0.000 0.000 -0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.000 0.000 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.000 -0.000 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.000 0.000 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 0.000 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.000 0.000 0.001 C 2.33938959521 3.68993217240 -0.00584554905 -0.000 -0.000 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.000 0.000 0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.000 0.000 0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.000 -0.001 -0.001 N 0.49290585413 2.18198449515 -0.00068475564 0.000 -0.000 -0.002 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 -0.000 0.001 C 2.33969079820 -3.68709653410 -0.00625612120 -0.000 -0.000 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 0.000 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.000 -0.000 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 0.001 -0.001 N 0.49225266031 -2.17934076887 -0.00084210065 0.000 0.000 -0.002 H 1.83694111827 5.77332096953 -0.01265611066 -0.000 0.000 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.001 0.001 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.000 -0.000 0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.000 -0.000 0.004 H 1.83794742242 -5.77033326187 -0.01295832570 0.000 0.000 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 -0.001 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 0.000 0.004 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 0.000 0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.000 0.000 0.001 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 -0.000 0.001 H -1.68997263563 -0.00719388386 -5.74925805817 0.269 -0.000 -0.110 H 0.75224758084 -0.00860493512 -5.25016290812 -0.087 -0.000 -0.072 H -3.29620044300 -0.00255800648 -3.88456579214 -0.044 0.001 0.200 H 1.47161249279 -0.00457826661 -2.87685200854 0.006 -0.000 -0.002 H -1.69176120521 -0.00597000955 5.75026973076 -0.270 0.001 -0.107 H 0.75025791005 -0.00892914887 5.25161119224 0.094 0.000 -0.081 H 1.46975366817 -0.00523069331 2.87805400798 0.002 0.000 0.013 H -3.29750276746 -0.00099200484 3.88584245085 0.046 -0.001 0.215 H -4.55513299541 0.00377930937 -2.13473279421 -0.022 0.000 -0.001 H -4.55107479454 0.00501307822 2.13844314827 0.002 -0.000 -0.020 H -6.83436893102 0.00806057203 1.19721860356 0.100 -0.000 0.022 H 6.86748209639 1.20005966818 0.00372860376 0.000 -0.000 0.000 61 Mode 126: freq=1344.52 N -0.44003451495 -0.00038510790 2.12369783068 0.248 -0.001 0.110 C -1.76594470239 0.00039861437 2.37754210613 -0.210 -0.000 0.130 C -2.24923313135 -0.00145267054 3.67997125809 0.008 0.000 -0.106 C -1.33887502024 -0.00450793845 4.73956848945 0.050 -0.000 0.010 C 0.02462671625 -0.00591801736 4.46614405978 -0.077 0.000 0.036 C 0.43187566201 -0.00376957955 3.13352499014 -0.031 0.001 -0.164 C -2.63984642995 0.00218980399 1.17162612704 -0.001 0.000 0.073 N -1.98513620489 0.00132140951 0.00153900685 -0.015 0.000 -0.004 C -2.63911589169 0.00167522827 -1.17277445342 -0.003 0.000 -0.070 C -4.02452897564 0.00329996303 -1.20791476641 0.020 -0.000 0.019 C -4.73391255267 0.00451580118 -0.00020876193 -0.026 0.000 -0.003 C -4.02924140493 0.00399189729 1.20660077672 0.021 -0.000 -0.016 Co 0.00000000000 0.00000000000 0.00000000000 0.001 0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.247 -0.000 -0.108 C -1.76408906064 -0.00030645034 -2.37697009192 -0.209 -0.000 -0.130 C -2.24773885821 -0.00257631963 -3.67934971086 0.008 0.000 0.105 C -1.33713102227 -0.00526459193 -4.73855802198 0.049 -0.000 -0.009 C 0.02654101484 -0.00591797621 -4.46472703619 -0.076 0.000 -0.036 C 0.43371721952 -0.00363389350 -3.13225443930 -0.030 0.000 0.163 S -6.53329279136 0.00637481657 -0.11611178087 0.003 -0.000 0.001 N 2.00981687167 0.00259443239 -0.00000686048 -0.001 -0.000 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.000 0.001 0.000 C 4.06129317470 1.20536051565 0.00241240325 0.002 -0.002 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.003 -0.000 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.002 0.002 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 -0.001 0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.011 0.006 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.001 -0.004 0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.003 -0.001 0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.006 0.002 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.004 -0.009 0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.019 0.007 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.000 0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.011 -0.006 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.001 0.003 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.003 0.002 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.005 -0.002 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.004 0.009 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.018 -0.007 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.027 -0.011 0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.018 -0.016 0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.004 0.022 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.000 0.003 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.026 0.011 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.017 0.016 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 -0.003 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.003 -0.021 -0.000 H 4.58301895157 2.13678100538 0.00314824260 0.000 -0.000 0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.000 0.000 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.371 0.001 0.133 H 0.75224758084 -0.00860493512 -5.25016290812 0.225 0.000 0.218 H -3.29620044300 -0.00255800648 -3.88456579214 0.049 -0.000 -0.211 H 1.47161249279 -0.00457826661 -2.87685200854 0.025 -0.000 -0.078 H -1.69176120521 -0.00597000955 5.75026973076 -0.370 0.001 -0.132 H 0.75025791005 -0.00892914887 5.25161119224 0.226 0.000 -0.219 H 1.46975366817 -0.00523069331 2.87805400798 0.024 -0.000 0.077 H -3.29750276746 -0.00099200484 3.88584245085 0.049 -0.000 0.211 H -4.55513299541 0.00377930937 -2.13473279421 0.044 -0.000 -0.017 H -4.55107479454 0.00501307822 2.13844314827 0.039 -0.000 0.014 H -6.83436893102 0.00806057203 1.19721860356 -0.002 0.000 -0.001 H 6.86748209639 1.20005966818 0.00372860376 0.000 0.000 0.000 61 Mode 127: freq=1345.66 N -0.44003451495 -0.00038510790 2.12369783068 0.015 -0.000 0.009 C -1.76594470239 0.00039861437 2.37754210613 -0.019 -0.000 0.012 C -2.24923313135 -0.00145267054 3.67997125809 0.002 0.000 -0.011 C -1.33887502024 -0.00450793845 4.73956848945 0.004 -0.000 0.003 C 0.02462671625 -0.00591801736 4.46614405978 -0.005 0.000 0.003 C 0.43187566201 -0.00376957955 3.13352499014 0.001 0.000 -0.014 C -2.63984642995 0.00218980399 1.17162612704 -0.001 0.000 0.009 N -1.98513620489 0.00132140951 0.00153900685 -0.003 0.000 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.001 -0.000 -0.009 C -4.02452897564 0.00329996303 -1.20791476641 0.005 -0.000 0.001 C -4.73391255267 0.00451580118 -0.00020876193 -0.006 0.000 -0.000 C -4.02924140493 0.00399189729 1.20660077672 0.005 -0.000 -0.001 Co 0.00000000000 0.00000000000 0.00000000000 0.003 -0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.015 -0.000 -0.009 C -1.76408906064 -0.00030645034 -2.37697009192 -0.020 -0.000 -0.013 C -2.24773885821 -0.00257631963 -3.67934971086 0.002 0.000 0.011 C -1.33713102227 -0.00526459193 -4.73855802198 0.004 -0.000 -0.003 C 0.02654101484 -0.00591797621 -4.46472703619 -0.006 0.000 -0.003 C 0.43371721952 -0.00363389350 -3.13225443930 0.001 0.000 0.014 S -6.53329279136 0.00637481657 -0.11611178087 0.000 -0.000 0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.010 0.003 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.009 -0.065 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.019 0.018 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.012 0.002 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.020 -0.021 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.012 0.064 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.216 -0.126 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.009 0.102 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.051 -0.010 0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.080 -0.037 0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.022 0.166 -0.001 N 0.49290585413 2.18198449515 -0.00068475564 0.246 -0.108 0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.001 -0.001 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.215 0.122 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.010 -0.100 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.050 0.010 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.078 0.036 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.020 -0.163 -0.001 N 0.49225266031 -2.17934076887 -0.00084210065 0.242 0.105 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.370 0.144 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.229 0.210 -0.001 H 3.39175422949 3.87200638269 -0.00704552340 0.045 -0.221 0.001 H -1.39787683933 2.98334799634 -0.00369736757 0.026 -0.084 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.365 -0.142 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.226 -0.208 -0.001 H -1.39833026435 -2.98175334118 -0.00345676225 0.027 0.086 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.044 0.218 0.001 H 4.58301895157 2.13678100538 0.00314824260 0.041 -0.015 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.046 0.017 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.025 0.000 0.008 H 0.75224758084 -0.00860493512 -5.25016290812 0.014 0.000 0.014 H -3.29620044300 -0.00255800648 -3.88456579214 0.003 -0.000 -0.008 H 1.47161249279 -0.00457826661 -2.87685200854 0.004 -0.000 -0.008 H -1.69176120521 -0.00597000955 5.75026973076 -0.025 0.000 -0.008 H 0.75025791005 -0.00892914887 5.25161119224 0.014 -0.000 -0.014 H 1.46975366817 -0.00523069331 2.87805400798 0.004 -0.000 0.008 H -3.29750276746 -0.00099200484 3.88584245085 0.003 -0.000 0.007 H -4.55513299541 0.00377930937 -2.13473279421 0.007 -0.000 -0.003 H -4.55107479454 0.00501307822 2.13844314827 0.006 -0.000 0.002 H -6.83436893102 0.00806057203 1.19721860356 -0.000 0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.003 0.001 0.000 61 Mode 128: freq=1355.36 N -0.44003451495 -0.00038510790 2.12369783068 0.000 0.000 0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.000 0.000 0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.000 -0.000 -0.000 C -1.33887502024 -0.00450793845 4.73956848945 0.000 -0.000 0.000 C 0.02462671625 -0.00591801736 4.46614405978 -0.000 -0.000 0.000 C 0.43187566201 -0.00376957955 3.13352499014 -0.000 0.000 -0.000 C -2.63984642995 0.00218980399 1.17162612704 -0.000 0.001 0.000 N -1.98513620489 0.00132140951 0.00153900685 -0.000 -0.002 -0.001 C -2.63911589169 0.00167522827 -1.17277445342 -0.000 0.001 0.000 C -4.02452897564 0.00329996303 -1.20791476641 0.000 -0.000 0.000 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 0.000 -0.000 C -4.02924140493 0.00399189729 1.20660077672 0.000 -0.000 0.000 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.001 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 0.000 0.000 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 0.000 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 -0.000 -0.000 C -1.33713102227 -0.00526459193 -4.73855802198 -0.000 -0.000 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 0.000 -0.000 0.000 C 0.43371721952 -0.00363389350 -3.13225443930 0.000 0.000 -0.000 S -6.53329279136 0.00637481657 -0.11611178087 0.000 -0.000 0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 -0.272 -0.000 C 2.67119656792 1.17263645248 0.00045766926 0.013 0.077 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.012 0.084 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.002 -0.135 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.015 0.081 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.015 0.080 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.163 0.191 -0.001 C 2.33938959521 3.68993217240 -0.00584554905 -0.003 -0.098 0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.079 -0.008 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.095 0.068 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.063 -0.203 0.001 N 0.49290585413 2.18198449515 -0.00068475564 -0.250 0.120 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.008 0.012 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.172 0.187 0.001 C 2.33969079820 -3.68709653410 -0.00625612120 0.003 -0.100 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.079 -0.006 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.096 0.067 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.060 -0.204 -0.001 N 0.49225266031 -2.17934076887 -0.00084210065 0.254 0.121 0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.331 -0.139 0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.175 -0.158 0.001 H 3.39175422949 3.87200638269 -0.00704552340 -0.035 0.171 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.000 0.016 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.337 -0.140 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.179 -0.162 -0.001 H -1.39833026435 -2.98175334118 -0.00345676225 0.002 0.021 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.036 0.177 0.000 H 4.58301895157 2.13678100538 0.00314824260 0.055 -0.003 0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.054 -0.005 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.001 0.000 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 0.000 -0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 0.001 0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 -0.001 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.000 0.000 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 0.000 0.000 -0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.000 -0.001 0.000 H -3.29750276746 -0.00099200484 3.88584245085 0.000 0.001 0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.000 0.001 -0.000 H -4.55107479454 0.00501307822 2.13844314827 -0.000 0.001 -0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.000 0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 0.042 -0.008 0.000 61 Mode 129: freq=1357.62 N -0.44003451495 -0.00038510790 2.12369783068 -0.247 0.001 -0.123 C -1.76594470239 0.00039861437 2.37754210613 0.152 0.000 -0.191 C -2.24923313135 -0.00145267054 3.67997125809 -0.000 -0.000 0.102 C -1.33887502024 -0.00450793845 4.73956848945 -0.083 0.000 0.008 C 0.02462671625 -0.00591801736 4.46614405978 0.095 -0.000 -0.070 C 0.43187566201 -0.00376957955 3.13352499014 0.074 -0.001 0.200 C -2.63984642995 0.00218980399 1.17162612704 0.013 -0.000 -0.099 N -1.98513620489 0.00132140951 0.00153900685 -0.001 0.000 0.329 C -2.63911589169 0.00167522827 -1.17277445342 -0.015 -0.000 -0.102 C -4.02452897564 0.00329996303 -1.20791476641 0.030 -0.000 -0.113 C -4.73391255267 0.00451580118 -0.00020876193 0.003 0.000 0.183 C -4.02924140493 0.00399189729 1.20660077672 -0.027 0.000 -0.118 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.248 -0.000 -0.122 C -1.76408906064 -0.00030645034 -2.37697009192 -0.160 -0.000 -0.184 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 0.000 0.103 C -1.33713102227 -0.00526459193 -4.73855802198 0.083 -0.000 0.005 C 0.02654101484 -0.00591797621 -4.46472703619 -0.096 -0.000 -0.069 C 0.43371721952 -0.00363389350 -3.13225443930 -0.069 0.001 0.199 S -6.53329279136 0.00637481657 -0.11611178087 -0.010 -0.000 -0.015 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 -0.000 0.002 C 2.67119656792 1.17263645248 0.00045766926 -0.000 0.000 -0.001 C 4.06129317470 1.20536051565 0.00241240325 0.000 0.000 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.000 -0.000 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.000 0.000 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 0.000 -0.001 C 1.82209539371 2.39842937406 -0.00175320633 0.000 0.000 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.000 -0.000 0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.000 -0.000 0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.000 0.000 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.000 -0.000 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.001 0.000 0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 0.000 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.000 -0.000 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 0.000 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.000 0.000 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 -0.000 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.000 0.000 0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.001 -0.000 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 -0.000 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 0.001 -0.001 H -1.39787683933 2.98334799634 -0.00369736757 0.000 -0.000 0.001 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 -0.000 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 -0.000 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 0.000 0.001 H 3.39230213722 -3.86796714602 -0.00754158092 0.000 -0.000 -0.001 H 4.58301895157 2.13678100538 0.00314824260 0.000 -0.000 -0.001 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 0.000 -0.001 H -1.68997263563 -0.00719388386 -5.74925805817 -0.311 0.000 0.120 H 0.75224758084 -0.00860493512 -5.25016290812 0.158 0.000 0.152 H -3.29620044300 -0.00255800648 -3.88456579214 0.036 -0.000 -0.154 H 1.47161249279 -0.00457826661 -2.87685200854 -0.003 -0.000 -0.006 H -1.69176120521 -0.00597000955 5.75026973076 0.309 -0.001 0.120 H 0.75025791005 -0.00892914887 5.25161119224 -0.156 -0.000 0.150 H 1.46975366817 -0.00523069331 2.87805400798 0.006 0.000 -0.001 H -3.29750276746 -0.00099200484 3.88584245085 -0.036 0.000 -0.150 H -4.55513299541 0.00377930937 -2.13473279421 -0.090 0.000 0.017 H -4.55107479454 0.00501307822 2.13844314827 0.089 -0.000 0.014 H -6.83436893102 0.00806057203 1.19721860356 0.055 -0.000 0.011 H 6.86748209639 1.20005966818 0.00372860376 0.000 -0.000 -0.000 61 Mode 130: freq=1427.77 N -0.44003451495 -0.00038510790 2.12369783068 -0.092 0.000 -0.035 C -1.76594470239 0.00039861437 2.37754210613 -0.175 0.001 -0.270 C -2.24923313135 -0.00145267054 3.67997125809 0.002 0.000 -0.034 C -1.33887502024 -0.00450793845 4.73956848945 -0.007 -0.000 0.086 C 0.02462671625 -0.00591801736 4.46614405978 -0.013 0.000 -0.031 C 0.43187566201 -0.00376957955 3.13352499014 0.123 -0.000 0.052 C -2.63984642995 0.00218980399 1.17162612704 0.257 -0.000 0.124 N -1.98513620489 0.00132140951 0.00153900685 -0.001 0.000 -0.053 C -2.63911589169 0.00167522827 -1.17277445342 -0.240 0.000 0.108 C -4.02452897564 0.00329996303 -1.20791476641 -0.047 0.000 0.062 C -4.73391255267 0.00451580118 -0.00020876193 -0.007 0.000 0.090 C -4.02924140493 0.00399189729 1.20660077672 0.052 -0.000 0.071 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 -0.000 0.004 N -0.43839318333 -0.00054206762 -2.12229806799 0.084 -0.000 -0.032 C -1.76408906064 -0.00030645034 -2.37697009192 0.162 -0.000 -0.245 C -2.24773885821 -0.00257631963 -3.67934971086 -0.003 -0.000 -0.031 C -1.33713102227 -0.00526459193 -4.73855802198 0.005 0.000 0.078 C 0.02654101484 -0.00591797621 -4.46472703619 0.013 -0.000 -0.028 C 0.43371721952 -0.00363389350 -3.13225443930 -0.113 0.000 0.047 S -6.53329279136 0.00637481657 -0.11611178087 -0.004 -0.000 -0.008 N 2.00981687167 0.00259443239 -0.00000686048 0.000 0.000 -0.001 C 2.67119656792 1.17263645248 0.00045766926 0.001 -0.000 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.000 -0.000 -0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.000 -0.000 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.000 -0.000 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.001 -0.000 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.001 0.001 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.000 0.000 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.000 -0.000 0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.000 0.000 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.000 -0.000 -0.001 N 0.49290585413 2.18198449515 -0.00068475564 -0.000 0.000 0.001 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.000 0.001 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.000 0.000 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 -0.000 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.000 -0.000 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 0.000 -0.001 N 0.49225266031 -2.17934076887 -0.00084210065 0.000 -0.000 0.001 H 1.83694111827 5.77332096953 -0.01265611066 0.000 -0.000 0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.000 0.000 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.000 -0.000 0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.000 -0.001 0.001 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 -0.000 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 -0.000 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 -0.000 0.001 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 -0.001 0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.001 0.001 0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.001 0.001 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.043 0.000 0.041 H 0.75224758084 -0.00860493512 -5.25016290812 -0.003 -0.000 -0.014 H -3.29620044300 -0.00255800648 -3.88456579214 -0.024 0.000 0.140 H 1.47161249279 -0.00457826661 -2.87685200854 -0.066 0.000 0.132 H -1.69176120521 -0.00597000955 5.75026973076 0.050 -0.000 0.047 H 0.75025791005 -0.00892914887 5.25161119224 0.003 0.000 -0.014 H 1.46975366817 -0.00523069331 2.87805400798 0.072 -0.000 0.142 H -3.29750276746 -0.00099200484 3.88584245085 0.027 -0.000 0.152 H -4.55513299541 0.00377930937 -2.13473279421 0.417 -0.001 -0.220 H -4.55107479454 0.00501307822 2.13844314827 -0.439 0.001 -0.226 H -6.83436893102 0.00806057203 1.19721860356 0.031 -0.000 0.008 H 6.86748209639 1.20005966818 0.00372860376 0.000 -0.000 0.000 61 Mode 131: freq=1427.85 N -0.44003451495 -0.00038510790 2.12369783068 0.000 -0.001 0.000 C -1.76594470239 0.00039861437 2.37754210613 0.001 0.000 0.001 C -2.24923313135 -0.00145267054 3.67997125809 -0.000 0.000 0.000 C -1.33887502024 -0.00450793845 4.73956848945 0.000 -0.000 -0.000 C 0.02462671625 -0.00591801736 4.46614405978 -0.000 -0.000 0.000 C 0.43187566201 -0.00376957955 3.13352499014 -0.000 0.001 -0.000 C -2.63984642995 0.00218980399 1.17162612704 -0.001 0.000 -0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 0.001 0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.001 0.000 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 0.000 0.000 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 0.000 -0.000 -0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.000 0.000 -0.000 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 -0.004 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 -0.001 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 0.000 0.001 C -2.24773885821 -0.00257631963 -3.67934971086 -0.000 0.000 0.000 C -1.33713102227 -0.00526459193 -4.73855802198 -0.000 -0.000 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 -0.000 -0.000 0.000 C 0.43371721952 -0.00363389350 -3.13225443930 0.000 0.001 -0.000 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 0.000 0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.002 0.068 0.000 C 2.67119656792 1.17263645248 0.00045766926 0.267 -0.138 0.000 C 4.06129317470 1.20536051565 0.00241240325 0.042 -0.078 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.006 -0.061 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.038 -0.070 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.248 -0.122 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.169 0.282 -0.001 C 2.33938959521 3.68993217240 -0.00584554905 -0.001 0.034 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.005 -0.087 0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.019 0.027 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.115 -0.045 0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.078 0.026 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.003 0.006 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.159 0.257 0.001 C 2.33969079820 -3.68709653410 -0.00625612120 -0.001 0.030 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.003 -0.079 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.019 0.025 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.107 -0.041 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.072 0.025 0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.040 -0.044 0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.004 0.015 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.025 -0.174 0.001 H -1.39787683933 2.98334799634 -0.00369736757 0.064 -0.130 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.033 -0.039 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.004 0.015 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.060 -0.124 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.023 -0.158 -0.001 H 4.58301895157 2.13678100538 0.00314824260 -0.433 0.217 -0.001 H 4.58784714512 -2.12983634010 0.00211631073 0.412 0.211 0.001 H -1.68997263563 -0.00719388386 -5.74925805817 0.000 -0.000 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 0.000 0.000 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 0.000 -0.000 -0.001 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 -0.002 0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.000 0.000 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 0.000 0.000 -0.000 H 1.46975366817 -0.00523069331 2.87805400798 -0.000 -0.002 -0.001 H -3.29750276746 -0.00099200484 3.88584245085 -0.000 -0.000 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 -0.001 -0.000 0.001 H -4.55107479454 0.00501307822 2.13844314827 0.001 -0.000 0.001 H -6.83436893102 0.00806057203 1.19721860356 -0.000 -0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 0.023 -0.006 0.000 61 Mode 132: freq=1438.49 N -0.44003451495 -0.00038510790 2.12369783068 -0.110 0.000 -0.088 C -1.76594470239 0.00039861437 2.37754210613 -0.142 -0.000 0.103 C -2.24923313135 -0.00145267054 3.67997125809 0.059 -0.000 -0.026 C -1.33887502024 -0.00450793845 4.73956848945 0.027 0.000 -0.006 C 0.02462671625 -0.00591801736 4.46614405978 0.024 -0.000 -0.018 C 0.43187566201 -0.00376957955 3.13352499014 0.094 -0.000 0.037 C -2.63984642995 0.00218980399 1.17162612704 -0.032 0.000 0.064 N -1.98513620489 0.00132140951 0.00153900685 0.032 -0.000 -0.001 C -2.63911589169 0.00167522827 -1.17277445342 -0.028 0.000 -0.066 C -4.02452897564 0.00329996303 -1.20791476641 0.043 -0.000 -0.007 C -4.73391255267 0.00451580118 -0.00020876193 -0.029 0.000 0.001 C -4.02924140493 0.00399189729 1.20660077672 0.045 -0.000 0.007 Co 0.00000000000 0.00000000000 0.00000000000 0.009 0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.110 0.000 0.086 C -1.76408906064 -0.00030645034 -2.37697009192 -0.139 -0.000 -0.095 C -2.24773885821 -0.00257631963 -3.67934971086 0.057 0.000 0.028 C -1.33713102227 -0.00526459193 -4.73855802198 0.025 0.000 0.003 C 0.02654101484 -0.00591797621 -4.46472703619 0.023 0.000 0.018 C 0.43371721952 -0.00363389350 -3.13225443930 0.094 -0.000 -0.038 S -6.53329279136 0.00637481657 -0.11611178087 0.001 0.000 0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.035 0.002 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.042 -0.072 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.058 -0.012 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.036 -0.003 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.055 0.011 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.040 0.075 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.177 -0.125 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.071 0.036 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.034 0.005 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.029 0.020 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.117 -0.049 0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.131 0.114 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.001 -0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.170 0.115 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.067 -0.038 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.031 -0.002 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.028 -0.020 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.113 0.048 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.128 -0.109 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.016 0.012 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.018 0.014 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.018 0.271 -0.001 H -1.39787683933 2.98334799634 -0.00369736757 0.109 -0.329 0.001 H 1.83794742242 -5.77033326187 -0.01295832570 -0.011 -0.009 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.018 -0.013 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.105 0.315 0.001 H 3.39230213722 -3.86796714602 -0.00754158092 -0.016 -0.257 -0.001 H 4.58301895157 2.13678100538 0.00314824260 0.066 -0.029 0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.074 0.034 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.013 0.000 0.009 H 0.75224758084 -0.00860493512 -5.25016290812 0.012 -0.000 0.010 H -3.29620044300 -0.00255800648 -3.88456579214 -0.018 0.000 0.211 H 1.47161249279 -0.00457826661 -2.87685200854 0.092 -0.001 -0.255 H -1.69176120521 -0.00597000955 5.75026973076 -0.017 0.000 -0.011 H 0.75025791005 -0.00892914887 5.25161119224 0.012 -0.000 -0.010 H 1.46975366817 -0.00523069331 2.87805400798 0.094 -0.001 0.261 H -3.29750276746 -0.00099200484 3.88584245085 -0.019 0.000 -0.220 H -4.55513299541 0.00377930937 -2.13473279421 0.051 -0.000 -0.023 H -4.55107479454 0.00501307822 2.13844314827 0.049 -0.000 0.021 H -6.83436893102 0.00806057203 1.19721860356 -0.001 0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.001 0.000 0.000 61 Mode 133: freq=1444.91 N -0.44003451495 -0.00038510790 2.12369783068 -0.125 0.001 -0.116 C -1.76594470239 0.00039861437 2.37754210613 -0.174 -0.000 0.142 C -2.24923313135 -0.00145267054 3.67997125809 0.070 -0.000 -0.027 C -1.33887502024 -0.00450793845 4.73956848945 0.043 0.000 -0.011 C 0.02462671625 -0.00591801736 4.46614405978 0.027 -0.000 -0.017 C 0.43187566201 -0.00376957955 3.13352499014 0.111 -0.000 0.033 C -2.63984642995 0.00218980399 1.17162612704 -0.038 0.000 0.057 N -1.98513620489 0.00132140951 0.00153900685 0.038 0.000 -0.002 C -2.63911589169 0.00167522827 -1.17277445342 -0.035 0.000 -0.062 C -4.02452897564 0.00329996303 -1.20791476641 0.043 -0.000 -0.010 C -4.73391255267 0.00451580118 -0.00020876193 -0.026 0.000 0.003 C -4.02924140493 0.00399189729 1.20660077672 0.046 -0.000 0.010 Co 0.00000000000 0.00000000000 0.00000000000 0.002 -0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.120 0.000 0.109 C -1.76408906064 -0.00030645034 -2.37697009192 -0.165 -0.000 -0.127 C -2.24773885821 -0.00257631963 -3.67934971086 0.065 -0.000 0.030 C -1.33713102227 -0.00526459193 -4.73855802198 0.038 0.000 0.008 C 0.02654101484 -0.00591797621 -4.46472703619 0.026 -0.000 0.016 C 0.43371721952 -0.00363389350 -3.13225443930 0.107 -0.000 -0.033 S -6.53329279136 0.00637481657 -0.11611178087 0.001 -0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.029 -0.003 0.000 C 2.67119656792 1.17263645248 0.00045766926 0.030 0.035 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.037 0.012 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.020 0.008 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.035 -0.014 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.031 -0.043 0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.150 0.125 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.059 -0.025 0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.038 -0.009 0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.023 -0.012 0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.093 0.028 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.102 -0.101 0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.001 -0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.128 -0.096 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.048 0.026 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.030 0.004 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.020 0.010 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.082 -0.026 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.088 0.086 0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.030 -0.019 0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.014 -0.009 0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.016 -0.236 0.001 H -1.39787683933 2.98334799634 -0.00369736757 -0.094 0.289 -0.001 H 1.83794742242 -5.77033326187 -0.01295832570 0.018 0.012 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.013 0.008 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.080 -0.245 -0.001 H 3.39230213722 -3.86796714602 -0.00754158092 0.013 0.195 0.001 H 4.58301895157 2.13678100538 0.00314824260 -0.050 0.024 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.059 -0.031 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.029 0.000 0.017 H 0.75224758084 -0.00860493512 -5.25016290812 0.014 0.000 0.009 H -3.29620044300 -0.00255800648 -3.88456579214 -0.023 0.001 0.255 H 1.47161249279 -0.00457826661 -2.87685200854 0.113 -0.001 -0.316 H -1.69176120521 -0.00597000955 5.75026973076 -0.036 0.000 -0.022 H 0.75025791005 -0.00892914887 5.25161119224 0.014 0.000 -0.009 H 1.46975366817 -0.00523069331 2.87805400798 0.119 -0.001 0.335 H -3.29750276746 -0.00099200484 3.88584245085 -0.025 0.001 -0.275 H -4.55513299541 0.00377930937 -2.13473279421 0.065 -0.000 -0.031 H -4.55107479454 0.00501307822 2.13844314827 0.061 -0.000 0.028 H -6.83436893102 0.00806057203 1.19721860356 -0.001 0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.001 0.000 -0.000 61 Mode 134: freq=1446.89 N -0.44003451495 -0.00038510790 2.12369783068 -0.005 -0.002 -0.005 C -1.76594470239 0.00039861437 2.37754210613 -0.007 0.000 0.006 C -2.24923313135 -0.00145267054 3.67997125809 0.003 0.000 -0.001 C -1.33887502024 -0.00450793845 4.73956848945 0.002 0.000 -0.000 C 0.02462671625 -0.00591801736 4.46614405978 0.001 0.000 -0.001 C 0.43187566201 -0.00376957955 3.13352499014 0.004 0.000 0.001 C -2.63984642995 0.00218980399 1.17162612704 -0.002 0.001 0.002 N -1.98513620489 0.00132140951 0.00153900685 0.002 -0.001 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.001 0.001 -0.002 C -4.02452897564 0.00329996303 -1.20791476641 0.002 0.000 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 -0.001 -0.000 0.000 C -4.02924140493 0.00399189729 1.20660077672 0.002 0.000 0.000 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 0.002 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.005 -0.002 0.005 C -1.76408906064 -0.00030645034 -2.37697009192 -0.007 0.000 -0.006 C -2.24773885821 -0.00257631963 -3.67934971086 0.003 0.000 0.001 C -1.33713102227 -0.00526459193 -4.73855802198 0.002 0.000 0.000 C 0.02654101484 -0.00591797621 -4.46472703619 0.001 0.000 0.001 C 0.43371721952 -0.00363389350 -3.13225443930 0.004 0.000 -0.001 S -6.53329279136 0.00637481657 -0.11611178087 0.000 0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.003 0.047 -0.000 C 2.67119656792 1.17263645248 0.00045766926 0.012 0.064 -0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.001 0.031 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.000 -0.141 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.003 0.031 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.002 0.060 0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.178 -0.241 0.001 C 2.33938959521 3.68993217240 -0.00584554905 0.090 -0.001 0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.072 0.035 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.024 0.011 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.097 -0.012 0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.123 0.125 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.005 0.009 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.195 -0.265 -0.001 C 2.33969079820 -3.68709653410 -0.00625612120 -0.099 0.004 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.078 0.037 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.029 0.012 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.109 -0.015 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.138 0.139 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.094 0.057 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.006 0.002 0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.024 0.346 -0.001 H -1.39787683933 2.98334799634 -0.00369736757 0.116 -0.376 0.001 H 1.83794742242 -5.77033326187 -0.01295832570 0.097 0.059 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.007 0.002 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.129 -0.415 -0.001 H 3.39230213722 -3.86796714602 -0.00754158092 0.027 0.384 0.001 H 4.58301895157 2.13678100538 0.00314824260 -0.054 0.041 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.036 0.032 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.001 -0.000 0.001 H 0.75224758084 -0.00860493512 -5.25016290812 0.001 -0.000 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.001 -0.001 0.011 H 1.47161249279 -0.00457826661 -2.87685200854 0.005 -0.000 -0.013 H -1.69176120521 -0.00597000955 5.75026973076 -0.002 -0.000 -0.001 H 0.75025791005 -0.00892914887 5.25161119224 0.001 -0.000 -0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.005 -0.000 0.014 H -3.29750276746 -0.00099200484 3.88584245085 -0.001 -0.001 -0.011 H -4.55513299541 0.00377930937 -2.13473279421 0.003 -0.001 -0.001 H -4.55107479454 0.00501307822 2.13844314827 0.003 -0.001 0.001 H -6.83436893102 0.00806057203 1.19721860356 -0.000 -0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 0.032 -0.007 0.000 61 Mode 135: freq=1449.30 N -0.44003451495 -0.00038510790 2.12369783068 -0.122 0.000 -0.122 C -1.76594470239 0.00039861437 2.37754210613 -0.172 -0.000 0.260 C -2.24923313135 -0.00145267054 3.67997125809 0.093 -0.000 0.005 C -1.33887502024 -0.00450793845 4.73956848945 0.077 0.000 -0.042 C 0.02462671625 -0.00591801736 4.46614405978 0.025 -0.000 -0.011 C 0.43187566201 -0.00376957955 3.13352499014 0.092 -0.000 0.002 C -2.63984642995 0.00218980399 1.17162612704 0.002 0.000 -0.063 N -1.98513620489 0.00132140951 0.00153900685 -0.001 0.000 -0.055 C -2.63911589169 0.00167522827 -1.17277445342 0.004 -0.000 -0.061 C -4.02452897564 0.00329996303 -1.20791476641 0.001 -0.000 -0.031 C -4.73391255267 0.00451580118 -0.00020876193 -0.001 0.000 0.130 C -4.02924140493 0.00399189729 1.20660077672 -0.003 -0.000 -0.030 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 0.000 -0.001 N -0.43839318333 -0.00054206762 -2.12229806799 0.131 -0.000 -0.130 C -1.76408906064 -0.00030645034 -2.37697009192 0.179 0.000 0.275 C -2.24773885821 -0.00257631963 -3.67934971086 -0.097 0.000 0.002 C -1.33713102227 -0.00526459193 -4.73855802198 -0.080 -0.000 -0.044 C 0.02654101484 -0.00591797621 -4.46472703619 -0.027 0.000 -0.011 C 0.43371721952 -0.00363389350 -3.13225443930 -0.097 0.000 0.003 S -6.53329279136 0.00637481657 -0.11611178087 -0.005 -0.000 -0.008 N 2.00981687167 0.00259443239 -0.00000686048 0.000 -0.000 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.000 -0.000 -0.001 C 4.06129317470 1.20536051565 0.00241240325 0.000 -0.000 -0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.000 -0.000 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.000 0.000 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 0.000 -0.001 C 1.82209539371 2.39842937406 -0.00175320633 -0.002 -0.002 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.001 0.000 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.001 0.000 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.000 0.000 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.001 -0.000 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.001 0.001 0.002 S 6.56718562933 -0.11349126889 0.00673479967 0.000 0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.002 0.001 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.001 -0.000 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 -0.000 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.000 -0.000 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.001 0.000 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.001 -0.001 0.002 H 1.83694111827 5.77332096953 -0.01265611066 -0.001 0.000 0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.000 0.000 0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 0.003 0.001 H -1.39787683933 2.98334799634 -0.00369736757 0.001 -0.004 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 -0.000 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 -0.000 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.001 0.003 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 -0.003 0.001 H 4.58301895157 2.13678100538 0.00314824260 0.001 -0.000 0.001 H 4.58784714512 -2.12983634010 0.00211631073 0.001 0.000 0.001 H -1.68997263563 -0.00719388386 -5.74925805817 0.109 -0.000 -0.062 H 0.75224758084 -0.00860493512 -5.25016290812 -0.002 0.000 0.003 H -3.29620044300 -0.00255800648 -3.88456579214 0.037 -0.001 -0.383 H 1.47161249279 -0.00457826661 -2.87685200854 -0.132 0.001 0.397 H -1.69176120521 -0.00597000955 5.75026973076 -0.107 0.000 -0.061 H 0.75025791005 -0.00892914887 5.25161119224 0.002 -0.000 0.002 H 1.46975366817 -0.00523069331 2.87805400798 0.126 -0.001 0.377 H -3.29750276746 -0.00099200484 3.88584245085 -0.035 0.001 -0.362 H -4.55513299541 0.00377930937 -2.13473279421 0.025 -0.000 -0.025 H -4.55107479454 0.00501307822 2.13844314827 -0.037 0.000 -0.031 H -6.83436893102 0.00806057203 1.19721860356 0.029 -0.000 0.006 H 6.86748209639 1.20005966818 0.00372860376 0.000 -0.000 0.000 61 Mode 136: freq=1487.47 N -0.44003451495 -0.00038510790 2.12369783068 0.009 0.000 -0.003 C -1.76594470239 0.00039861437 2.37754210613 0.011 -0.000 0.039 C -2.24923313135 -0.00145267054 3.67997125809 0.004 -0.000 0.014 C -1.33887502024 -0.00450793845 4.73956848945 0.007 0.000 -0.013 C 0.02462671625 -0.00591801736 4.46614405978 0.001 -0.000 0.000 C 0.43187566201 -0.00376957955 3.13352499014 -0.011 0.000 -0.003 C -2.63984642995 0.00218980399 1.17162612704 -0.031 0.000 -0.043 N -1.98513620489 0.00132140951 0.00153900685 0.008 -0.000 0.001 C -2.63911589169 0.00167522827 -1.17277445342 -0.036 0.000 0.042 C -4.02452897564 0.00329996303 -1.20791476641 -0.010 0.000 0.004 C -4.73391255267 0.00451580118 -0.00020876193 0.040 -0.000 0.001 C -4.02924140493 0.00399189729 1.20660077672 -0.012 0.000 -0.004 Co 0.00000000000 0.00000000000 0.00000000000 -0.003 -0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.011 0.000 0.003 C -1.76408906064 -0.00030645034 -2.37697009192 0.013 -0.000 -0.040 C -2.24773885821 -0.00257631963 -3.67934971086 0.004 -0.000 -0.015 C -1.33713102227 -0.00526459193 -4.73855802198 0.007 0.000 0.014 C 0.02654101484 -0.00591797621 -4.46472703619 0.001 -0.000 -0.000 C 0.43371721952 -0.00363389350 -3.13225443930 -0.012 0.000 0.003 S -6.53329279136 0.00637481657 -0.11611178087 -0.004 0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.058 -0.007 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.247 0.327 -0.001 C 4.06129317470 1.20536051565 0.00241240325 -0.081 0.034 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.311 -0.006 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.069 -0.036 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.283 -0.324 -0.001 C 1.82209539371 2.39842937406 -0.00175320633 0.120 -0.266 0.001 C 2.33938959521 3.68993217240 -0.00584554905 0.019 -0.107 0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.032 0.090 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.013 0.003 0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.103 0.027 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.094 -0.020 0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.034 0.001 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.130 0.277 0.001 C 2.33969079820 -3.68709653410 -0.00625612120 0.019 0.110 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.030 -0.095 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.014 -0.003 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.111 -0.026 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.105 0.025 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.100 0.073 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.021 -0.018 0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.029 0.204 -0.001 H -1.39787683933 2.98334799634 -0.00369736757 -0.054 0.094 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.100 -0.074 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.020 0.017 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.061 -0.113 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.030 -0.210 -0.001 H 4.58301895157 2.13678100538 0.00314824260 0.184 -0.096 0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.211 0.110 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.016 0.000 0.011 H 0.75224758084 -0.00860493512 -5.25016290812 -0.002 0.000 -0.002 H -3.29620044300 -0.00255800648 -3.88456579214 -0.006 0.000 0.035 H 1.47161249279 -0.00457826661 -2.87685200854 -0.004 -0.000 0.002 H -1.69176120521 -0.00597000955 5.75026973076 -0.016 0.000 -0.011 H 0.75025791005 -0.00892914887 5.25161119224 -0.002 0.000 0.002 H 1.46975366817 -0.00523069331 2.87805400798 -0.003 -0.000 0.000 H -3.29750276746 -0.00099200484 3.88584245085 -0.005 0.000 -0.034 H -4.55513299541 0.00377930937 -2.13473279421 0.029 -0.000 -0.015 H -4.55107479454 0.00501307822 2.13844314827 0.025 -0.000 0.014 H -6.83436893102 0.00806057203 1.19721860356 -0.002 -0.000 0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.012 -0.001 -0.000 61 Mode 137: freq=1489.42 N -0.44003451495 -0.00038510790 2.12369783068 -0.099 0.000 -0.021 C -1.76594470239 0.00039861437 2.37754210613 -0.123 0.000 -0.258 C -2.24923313135 -0.00145267054 3.67997125809 -0.022 0.000 -0.111 C -1.33887502024 -0.00450793845 4.73956848945 -0.033 -0.000 0.091 C 0.02462671625 -0.00591801736 4.46614405978 -0.012 0.000 0.004 C 0.43187566201 -0.00376957955 3.13352499014 0.105 -0.000 0.027 C -2.63984642995 0.00218980399 1.17162612704 0.247 -0.000 0.317 N -1.98513620489 0.00132140951 0.00153900685 -0.057 0.000 -0.008 C -2.63911589169 0.00167522827 -1.17277445342 0.283 -0.001 -0.313 C -4.02452897564 0.00329996303 -1.20791476641 0.075 -0.000 -0.041 C -4.73391255267 0.00451580118 -0.00020876193 -0.315 0.000 -0.007 C -4.02924140493 0.00399189729 1.20660077672 0.086 -0.000 0.040 Co 0.00000000000 0.00000000000 0.00000000000 0.003 -0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.110 0.000 0.025 C -1.76408906064 -0.00030645034 -2.37697009192 -0.133 0.000 0.270 C -2.24773885821 -0.00257631963 -3.67934971086 -0.022 0.000 0.115 C -1.33713102227 -0.00526459193 -4.73855802198 -0.031 -0.000 -0.096 C 0.02654101484 -0.00591797621 -4.46472703619 -0.012 0.000 -0.003 C 0.43371721952 -0.00363389350 -3.13225443930 0.113 -0.000 -0.026 S -6.53329279136 0.00637481657 -0.11611178087 0.034 -0.000 0.001 N 2.00981687167 0.00259443239 -0.00000686048 0.007 -0.001 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.035 0.041 -0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.010 0.006 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.042 -0.001 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.008 -0.006 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.040 -0.041 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.020 -0.030 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.001 -0.014 0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.001 0.011 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.002 0.001 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.016 0.004 0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.016 -0.008 0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.005 0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.022 0.032 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.001 0.015 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.001 -0.012 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.002 -0.001 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.017 -0.004 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.017 0.008 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.011 0.008 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.004 -0.003 0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.003 0.020 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.011 0.024 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.011 -0.008 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.003 0.003 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.012 -0.026 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.003 -0.021 -0.000 H 4.58301895157 2.13678100538 0.00314824260 0.025 -0.012 0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.029 0.014 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.108 -0.000 -0.074 H 0.75224758084 -0.00860493512 -5.25016290812 0.021 0.000 0.019 H -3.29620044300 -0.00255800648 -3.88456579214 0.035 -0.000 -0.210 H 1.47161249279 -0.00457826661 -2.87685200854 0.064 -0.000 -0.111 H -1.69176120521 -0.00597000955 5.75026973076 0.108 -0.000 0.072 H 0.75025791005 -0.00892914887 5.25161119224 0.022 0.000 -0.020 H 1.46975366817 -0.00523069331 2.87805400798 0.057 -0.000 0.094 H -3.29750276746 -0.00099200484 3.88584245085 0.034 -0.000 0.203 H -4.55513299541 0.00377930937 -2.13473279421 -0.215 0.000 0.113 H -4.55107479454 0.00501307822 2.13844314827 -0.188 0.000 -0.098 H -6.83436893102 0.00806057203 1.19721860356 0.012 -0.000 -0.001 H 6.86748209639 1.20005966818 0.00372860376 -0.002 -0.000 -0.000 61 Mode 138: freq=1570.89 N -0.44003451495 -0.00038510790 2.12369783068 0.010 0.000 0.019 C -1.76594470239 0.00039861437 2.37754210613 0.007 -0.000 -0.005 C -2.24923313135 -0.00145267054 3.67997125809 -0.009 -0.000 0.019 C -1.33887502024 -0.00450793845 4.73956848945 0.022 -0.000 0.010 C 0.02462671625 -0.00591801736 4.46614405978 0.012 0.000 -0.019 C 0.43187566201 -0.00376957955 3.13352499014 -0.021 0.000 -0.015 C -2.63984642995 0.00218980399 1.17162612704 0.027 -0.000 -0.044 N -1.98513620489 0.00132140951 0.00153900685 -0.033 0.000 -0.001 C -2.63911589169 0.00167522827 -1.17277445342 0.040 -0.000 0.043 C -4.02452897564 0.00329996303 -1.20791476641 -0.002 0.000 -0.023 C -4.73391255267 0.00451580118 -0.00020876193 -0.020 0.000 0.009 C -4.02924140493 0.00399189729 1.20660077672 0.007 0.000 0.017 Co 0.00000000000 0.00000000000 0.00000000000 0.002 -0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.004 0.000 -0.019 C -1.76408906064 -0.00030645034 -2.37697009192 0.008 -0.000 0.006 C -2.24773885821 -0.00257631963 -3.67934971086 -0.011 -0.000 -0.014 C -1.33713102227 -0.00526459193 -4.73855802198 0.022 -0.000 -0.013 C 0.02654101484 -0.00591797621 -4.46472703619 0.013 0.000 0.017 C 0.43371721952 -0.00363389350 -3.13225443930 -0.020 0.000 0.019 S -6.53329279136 0.00637481657 -0.11611178087 0.002 0.000 -0.001 N 2.00981687167 0.00259443239 -0.00000686048 0.195 -0.003 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.190 -0.271 -0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.032 0.110 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.128 0.050 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.015 -0.140 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.257 0.264 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.035 -0.032 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.069 0.107 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.161 0.076 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.077 -0.103 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.106 -0.108 0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.033 0.074 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.013 -0.004 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.041 0.035 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.076 -0.080 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.162 -0.090 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.083 0.096 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.099 0.130 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.002 -0.072 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.247 -0.088 0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.180 0.144 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.046 -0.099 0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.003 0.140 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.240 0.081 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.186 -0.153 -0.001 H -1.39833026435 -2.98175334118 -0.00345676225 -0.018 -0.188 -0.001 H 3.39230213722 -3.86796714602 -0.00754158092 0.044 0.080 0.000 H 4.58301895157 2.13678100538 0.00314824260 0.255 -0.109 0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.216 0.070 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.037 0.000 0.011 H 0.75224758084 -0.00860493512 -5.25016290812 -0.030 -0.000 -0.025 H -3.29620044300 -0.00255800648 -3.88456579214 -0.006 -0.000 0.010 H 1.47161249279 -0.00457826661 -2.87685200854 -0.002 -0.000 -0.013 H -1.69176120521 -0.00597000955 5.75026973076 -0.038 0.000 -0.012 H 0.75025791005 -0.00892914887 5.25161119224 -0.029 -0.000 0.024 H 1.46975366817 -0.00523069331 2.87805400798 -0.005 -0.000 0.004 H -3.29750276746 -0.00099200484 3.88584245085 -0.007 -0.000 -0.014 H -4.55513299541 0.00377930937 -2.13473279421 -0.034 -0.000 0.011 H -4.55107479454 0.00501307822 2.13844314827 -0.041 -0.000 -0.018 H -6.83436893102 0.00806057203 1.19721860356 0.004 -0.000 0.001 H 6.86748209639 1.20005966818 0.00372860376 -0.023 0.003 -0.000 61 Mode 139: freq=1572.37 N -0.44003451495 -0.00038510790 2.12369783068 0.023 -0.002 0.007 C -1.76594470239 0.00039861437 2.37754210613 -0.002 0.000 0.001 C -2.24923313135 -0.00145267054 3.67997125809 0.001 -0.000 0.026 C -1.33887502024 -0.00450793845 4.73956848945 0.009 0.000 -0.004 C 0.02462671625 -0.00591801736 4.46614405978 0.001 -0.000 -0.013 C 0.43187566201 -0.00376957955 3.13352499014 -0.013 0.000 0.008 C -2.63984642995 0.00218980399 1.17162612704 -0.031 0.000 -0.026 N -1.98513620489 0.00132140951 0.00153900685 -0.010 -0.002 0.003 C -2.63911589169 0.00167522827 -1.17277445342 0.051 0.000 0.004 C -4.02452897564 0.00329996303 -1.20791476641 -0.031 -0.000 -0.020 C -4.73391255267 0.00451580118 -0.00020876193 -0.007 0.000 0.053 C -4.02924140493 0.00399189729 1.20660077672 0.035 -0.000 -0.005 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.006 -0.001 N -0.43839318333 -0.00054206762 -2.12229806799 -0.019 -0.001 -0.003 C -1.76408906064 -0.00030645034 -2.37697009192 0.006 0.000 0.004 C -2.24773885821 -0.00257631963 -3.67934971086 -0.008 -0.000 0.014 C -1.33713102227 -0.00526459193 -4.73855802198 0.007 0.000 -0.012 C 0.02654101484 -0.00591797621 -4.46472703619 0.006 -0.000 -0.001 C 0.43371721952 -0.00363389350 -3.13225443930 0.000 0.000 0.018 S -6.53329279136 0.00637481657 -0.11611178087 -0.001 -0.000 -0.004 N 2.00981687167 0.00259443239 -0.00000686048 0.026 -0.032 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.329 0.066 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.258 0.093 0.000 C 4.76783866331 0.00148799420 0.00346798881 0.007 -0.396 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.240 0.083 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.264 0.106 0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.034 -0.018 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.034 -0.143 0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.001 0.066 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.027 0.044 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.041 -0.107 0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.157 -0.012 0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.014 0.032 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.022 -0.008 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.017 -0.150 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.031 0.043 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.008 0.062 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.059 -0.076 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.148 -0.025 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.048 0.042 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.015 0.039 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.016 0.109 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.076 0.236 -0.001 H 1.83794742242 -5.77033326187 -0.01295832570 0.091 0.054 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.023 0.006 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.068 0.186 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.023 0.116 0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.226 0.208 -0.001 H 4.58784714512 -2.12983634010 0.00211631073 0.253 0.218 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.004 0.000 -0.002 H 0.75224758084 -0.00860493512 -5.25016290812 -0.009 0.000 -0.011 H -3.29620044300 -0.00255800648 -3.88456579214 0.001 0.000 -0.011 H 1.47161249279 -0.00457826661 -2.87685200854 0.010 0.001 -0.034 H -1.69176120521 -0.00597000955 5.75026973076 -0.022 0.000 -0.010 H 0.75025791005 -0.00892914887 5.25161119224 -0.010 0.000 0.004 H 1.46975366817 -0.00523069331 2.87805400798 -0.011 0.001 -0.024 H -3.29750276746 -0.00099200484 3.88584245085 -0.006 0.000 -0.021 H -4.55513299541 0.00377930937 -2.13473279421 0.016 0.000 -0.022 H -4.55107479454 0.00501307822 2.13844314827 -0.043 0.001 -0.033 H -6.83436893102 0.00806057203 1.19721860356 0.012 0.000 0.002 H 6.86748209639 1.20005966818 0.00372860376 0.081 -0.018 0.000 61 Mode 140: freq=1572.48 N -0.44003451495 -0.00038510790 2.12369783068 0.164 -0.000 0.025 C -1.76594470239 0.00039861437 2.37754210613 -0.024 -0.000 0.014 C -2.24923313135 -0.00145267054 3.67997125809 0.022 -0.000 0.168 C -1.33887502024 -0.00450793845 4.73956848945 0.036 0.000 -0.048 C 0.02462671625 -0.00591801736 4.46614405978 -0.007 0.000 -0.069 C 0.43187566201 -0.00376957955 3.13352499014 -0.067 -0.000 0.081 C -2.63984642995 0.00218980399 1.17162612704 -0.280 0.000 -0.128 N -1.98513620489 0.00132140951 0.00153900685 -0.024 0.000 0.025 C -2.63911589169 0.00167522827 -1.17277445342 0.326 -0.000 -0.034 C -4.02452897564 0.00329996303 -1.20791476641 -0.234 0.000 -0.116 C -4.73391255267 0.00451580118 -0.00020876193 -0.026 0.000 0.389 C -4.02924140493 0.00399189729 1.20660077672 0.258 -0.000 -0.063 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 -0.001 -0.006 N -0.43839318333 -0.00054206762 -2.12229806799 -0.145 0.000 0.002 C -1.76408906064 -0.00030645034 -2.37697009192 0.031 -0.000 0.024 C -2.24773885821 -0.00257631963 -3.67934971086 -0.041 0.000 0.127 C -1.33713102227 -0.00526459193 -4.73855802198 0.016 -0.000 -0.068 C 0.02654101484 -0.00591797621 -4.46472703619 0.028 -0.000 -0.033 C 0.43371721952 -0.00363389350 -3.13225443930 0.031 0.000 0.109 S -6.53329279136 0.00637481657 -0.11611178087 -0.010 -0.000 -0.032 N 2.00981687167 0.00259443239 -0.00000686048 -0.012 0.005 0.002 C 2.67119656792 1.17263645248 0.00045766926 0.055 0.003 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.035 -0.018 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.007 0.054 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.033 -0.005 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.025 -0.027 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.006 0.004 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.008 0.016 0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.008 -0.013 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.007 -0.002 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.002 0.020 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.021 -0.001 0.001 S 6.56718562933 -0.11349126889 0.00673479967 0.003 -0.004 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.002 -0.000 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.001 0.025 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.012 -0.002 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.002 -0.013 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.012 0.005 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.021 0.006 0.002 H 1.83694111827 5.77332096953 -0.01265611066 -0.004 -0.002 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.010 -0.012 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.000 -0.011 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.011 -0.041 -0.001 H 1.83794742242 -5.77033326187 -0.01295832570 -0.024 -0.011 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.011 0.006 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.008 -0.016 -0.001 H 3.39230213722 -3.86796714602 -0.00754158092 -0.005 -0.020 -0.000 H 4.58301895157 2.13678100538 0.00314824260 0.020 -0.024 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.045 -0.034 -0.001 H -1.68997263563 -0.00719388386 -5.74925805817 0.025 -0.000 -0.031 H 0.75224758084 -0.00860493512 -5.25016290812 -0.026 -0.000 -0.046 H -3.29620044300 -0.00255800648 -3.88456579214 0.014 -0.000 -0.101 H 1.47161249279 -0.00457826661 -2.87685200854 0.078 -0.001 -0.230 H -1.69176120521 -0.00597000955 5.75026973076 -0.106 0.000 -0.059 H 0.75025791005 -0.00892914887 5.25161119224 -0.029 0.000 -0.002 H 1.46975366817 -0.00523069331 2.87805400798 -0.080 0.000 -0.197 H -3.29750276746 -0.00099200484 3.88584245085 -0.031 0.000 -0.138 H -4.55513299541 0.00377930937 -2.13473279421 0.176 -0.000 -0.186 H -4.55107479454 0.00501307822 2.13844314827 -0.267 0.000 -0.221 H -6.83436893102 0.00806057203 1.19721860356 0.082 -0.000 0.017 H 6.86748209639 1.20005966818 0.00372860376 -0.010 0.002 -0.000 61 Mode 141: freq=1573.97 N -0.44003451495 -0.00038510790 2.12369783068 -0.007 -0.000 0.071 C -1.76594470239 0.00039861437 2.37754210613 0.044 0.000 -0.045 C -2.24923313135 -0.00145267054 3.67997125809 -0.078 -0.000 0.064 C -1.33887502024 -0.00450793845 4.73956848945 0.161 -0.000 0.093 C 0.02462671625 -0.00591801736 4.46614405978 0.082 0.000 -0.097 C 0.43187566201 -0.00376957955 3.13352499014 -0.096 0.000 -0.127 C -2.63984642995 0.00218980399 1.17162612704 0.263 -0.000 -0.241 N -1.98513620489 0.00132140951 0.00153900685 -0.196 0.000 -0.011 C -2.63911589169 0.00167522827 -1.17277445342 0.165 -0.000 0.280 C -4.02452897564 0.00329996303 -1.20791476641 0.059 -0.000 -0.111 C -4.73391255267 0.00451580118 -0.00020876193 -0.127 0.000 -0.059 C -4.02924140493 0.00399189729 1.20660077672 -0.030 0.000 0.131 Co 0.00000000000 0.00000000000 0.00000000000 -0.001 -0.000 0.001 N -0.43839318333 -0.00054206762 -2.12229806799 0.047 -0.000 -0.077 C -1.76408906064 -0.00030645034 -2.37697009192 0.034 0.000 0.040 C -2.24773885821 -0.00257631963 -3.67934971086 -0.069 -0.000 -0.119 C -1.33713102227 -0.00526459193 -4.73855802198 0.170 -0.000 -0.076 C 0.02654101484 -0.00591797621 -4.46472703619 0.079 0.000 0.118 C 0.43371721952 -0.00363389350 -3.13225443930 -0.116 0.000 0.097 S -6.53329279136 0.00637481657 -0.11611178087 0.016 -0.000 0.004 N 2.00981687167 0.00259443239 -0.00000686048 -0.027 0.001 -0.000 C 2.67119656792 1.17263645248 0.00045766926 0.038 0.037 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.003 -0.019 -0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.019 0.004 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.005 0.018 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.030 -0.041 0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.004 0.005 0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.012 -0.010 0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.027 -0.013 0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.011 0.013 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.011 0.018 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.003 -0.005 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.002 -0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.004 -0.005 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.011 0.014 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.028 0.012 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.011 -0.015 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.013 -0.016 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.002 0.006 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.035 0.012 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.025 -0.021 0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.007 0.013 0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.006 -0.039 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.038 -0.014 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.026 0.021 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.004 0.034 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.008 -0.017 0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.030 0.010 0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.039 -0.016 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.262 0.000 0.085 H 0.75224758084 -0.00860493512 -5.25016290812 -0.186 -0.000 -0.155 H -3.29620044300 -0.00255800648 -3.88456579214 -0.052 0.000 0.106 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 -0.000 -0.128 H -1.69176120521 -0.00597000955 5.75026973076 -0.231 0.000 -0.067 H 0.75025791005 -0.00892914887 5.25161119224 -0.180 -0.000 0.158 H 1.46975366817 -0.00523069331 2.87805400798 0.027 -0.000 0.197 H -3.29750276746 -0.00099200484 3.88584245085 -0.043 0.000 -0.060 H -4.55513299541 0.00377930937 -2.13473279421 -0.270 0.000 0.125 H -4.55107479454 0.00501307822 2.13844314827 -0.184 0.000 -0.051 H -6.83436893102 0.00806057203 1.19721860356 0.000 -0.000 -0.002 H 6.86748209639 1.20005966818 0.00372860376 0.001 0.000 0.000 61 Mode 142: freq=1599.48 N -0.44003451495 -0.00038510790 2.12369783068 -0.000 0.001 -0.000 C -1.76594470239 0.00039861437 2.37754210613 0.000 -0.000 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.000 -0.000 -0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.000 0.000 0.000 C 0.02462671625 -0.00591801736 4.46614405978 0.000 -0.000 0.000 C 0.43187566201 -0.00376957955 3.13352499014 0.000 -0.000 -0.000 C -2.63984642995 0.00218980399 1.17162612704 -0.000 0.001 0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 -0.003 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.000 0.001 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.000 -0.000 0.000 C -4.73391255267 0.00451580118 -0.00020876193 0.000 0.000 0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.000 -0.000 -0.000 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 0.002 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 0.001 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 -0.000 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 -0.000 -0.000 0.000 C -1.33713102227 -0.00526459193 -4.73855802198 0.000 0.000 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 0.000 -0.000 0.000 C 0.43371721952 -0.00363389350 -3.13225443930 -0.000 -0.000 0.000 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 -0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 -0.065 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.014 -0.002 0.000 C 4.06129317470 1.20536051565 0.00241240325 0.029 -0.033 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.002 0.072 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.028 -0.032 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.015 -0.001 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.084 0.172 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.133 -0.066 0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.163 -0.166 0.001 C 0.08658913130 4.53522926787 -0.00833235387 0.190 0.216 -0.001 C -0.35359617412 3.21325694137 -0.00400174376 -0.168 0.096 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.061 -0.126 0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.002 -0.003 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.080 0.167 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.128 -0.066 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.158 -0.160 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.184 0.209 0.001 C -0.35393854068 -3.21111942258 -0.00398541364 0.162 0.092 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.061 -0.122 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.294 0.073 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.284 -0.229 0.001 H 3.39175422949 3.87200638269 -0.00704552340 -0.059 0.044 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.015 -0.162 0.001 H 1.83794742242 -5.77033326187 -0.01295832570 0.284 0.071 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.275 -0.222 -0.001 H -1.39833026435 -2.98175334118 -0.00345676225 0.016 -0.155 -0.001 H 3.39230213722 -3.86796714602 -0.00754158092 0.057 0.045 0.000 H 4.58301895157 2.13678100538 0.00314824260 0.003 -0.006 0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.004 -0.006 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.000 0.000 0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 0.000 -0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 0.000 -0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 -0.000 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 0.000 0.000 0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.000 0.000 0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.000 -0.000 0.000 H -3.29750276746 -0.00099200484 3.88584245085 0.000 0.000 0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.000 0.000 -0.000 H -4.55107479454 0.00501307822 2.13844314827 0.000 0.000 0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.000 0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.010 0.002 -0.000 61 Mode 143: freq=1601.21 N -0.44003451495 -0.00038510790 2.12369783068 0.066 -0.000 0.125 C -1.76594470239 0.00039861437 2.37754210613 0.079 0.000 -0.178 C -2.24923313135 -0.00145267054 3.67997125809 -0.133 0.000 0.065 C -1.33887502024 -0.00450793845 4.73956848945 0.168 -0.001 0.166 C 0.02462671625 -0.00591801736 4.46614405978 0.184 0.000 -0.226 C 0.43187566201 -0.00376957955 3.13352499014 -0.169 0.000 -0.084 C -2.63984642995 0.00218980399 1.17162612704 -0.013 -0.000 0.002 N -1.98513620489 0.00132140951 0.00153900685 -0.001 -0.000 0.069 C -2.63911589169 0.00167522827 -1.17277445342 0.015 0.000 0.001 C -4.02452897564 0.00329996303 -1.20791476641 -0.029 0.000 0.030 C -4.73391255267 0.00451580118 -0.00020876193 -0.002 -0.000 -0.066 C -4.02924140493 0.00399189729 1.20660077672 0.030 -0.000 0.031 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 0.000 -0.002 N -0.43839318333 -0.00054206762 -2.12229806799 -0.065 0.000 0.121 C -1.76408906064 -0.00030645034 -2.37697009192 -0.075 -0.000 -0.172 C -2.24773885821 -0.00257631963 -3.67934971086 0.128 0.000 0.065 C -1.33713102227 -0.00526459193 -4.73855802198 -0.162 0.000 0.160 C 0.02654101484 -0.00591797621 -4.46472703619 -0.179 -0.000 -0.219 C 0.43371721952 -0.00363389350 -3.13225443930 0.164 -0.000 -0.080 S -6.53329279136 0.00637481657 -0.11611178087 0.002 0.000 0.002 N 2.00981687167 0.00259443239 -0.00000686048 0.000 -0.000 0.003 C 2.67119656792 1.17263645248 0.00045766926 -0.000 -0.000 -0.001 C 4.06129317470 1.20536051565 0.00241240325 -0.000 0.000 0.000 C 4.76783866331 0.00148799420 0.00346798881 0.000 0.000 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.000 -0.000 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 0.000 -0.001 C 1.82209539371 2.39842937406 -0.00175320633 0.000 0.000 0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.000 0.000 0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.000 -0.000 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.000 0.000 0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.000 0.000 0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.000 -0.000 -0.001 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 -0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.000 0.000 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.000 -0.000 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.000 0.000 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.000 0.000 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.000 -0.000 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.000 -0.000 -0.001 H 1.83694111827 5.77332096953 -0.01265611066 -0.000 -0.000 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 -0.000 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 -0.000 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.000 -0.000 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.000 0.000 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 0.000 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 0.000 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.000 0.000 -0.000 H 4.58301895157 2.13678100538 0.00314824260 0.000 -0.000 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.000 0.000 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.286 -0.000 -0.062 H 0.75224758084 -0.00860493512 -5.25016290812 0.270 0.000 0.229 H -3.29620044300 -0.00255800648 -3.88456579214 0.057 -0.000 -0.035 H 1.47161249279 -0.00457826661 -2.87685200854 0.014 0.000 0.147 H -1.69176120521 -0.00597000955 5.75026973076 -0.295 0.001 -0.064 H 0.75025791005 -0.00892914887 5.25161119224 -0.279 -0.000 0.237 H 1.46975366817 -0.00523069331 2.87805400798 -0.014 -0.000 0.154 H -3.29750276746 -0.00099200484 3.88584245085 -0.059 0.000 -0.034 H -4.55513299541 0.00377930937 -2.13473279421 -0.000 0.000 0.004 H -4.55107479454 0.00501307822 2.13844314827 -0.001 -0.000 0.003 H -6.83436893102 0.00806057203 1.19721860356 -0.009 0.000 -0.002 H 6.86748209639 1.20005966818 0.00372860376 -0.000 0.000 -0.000 61 Mode 144: freq=1621.93 N -0.44003451495 -0.00038510790 2.12369783068 0.011 0.000 -0.053 C -1.76594470239 0.00039861437 2.37754210613 -0.082 -0.000 0.069 C -2.24923313135 -0.00145267054 3.67997125809 0.062 -0.000 0.054 C -1.33887502024 -0.00450793845 4.73956848945 -0.019 0.000 -0.081 C 0.02462671625 -0.00591801736 4.46614405978 -0.098 -0.000 0.073 C 0.43187566201 -0.00376957955 3.13352499014 0.061 -0.000 0.060 C -2.63984642995 0.00218980399 1.17162612704 0.088 -0.000 -0.130 N -1.98513620489 0.00132140951 0.00153900685 -0.088 0.000 -0.004 C -2.63911589169 0.00167522827 -1.17277445342 0.087 -0.000 0.139 C -4.02452897564 0.00329996303 -1.20791476641 0.048 -0.000 -0.076 C -4.73391255267 0.00451580118 -0.00020876193 -0.080 0.000 0.001 C -4.02924140493 0.00399189729 1.20660077672 0.041 -0.000 0.071 Co 0.00000000000 0.00000000000 0.00000000000 0.007 -0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.016 0.000 0.056 C -1.76408906064 -0.00030645034 -2.37697009192 -0.089 -0.000 -0.072 C -2.24773885821 -0.00257631963 -3.67934971086 0.066 -0.000 -0.060 C -1.33713102227 -0.00526459193 -4.73855802198 -0.019 0.000 0.086 C 0.02654101484 -0.00591797621 -4.46472703619 -0.103 -0.000 -0.074 C 0.43371721952 -0.00363389350 -3.13225443930 0.063 -0.000 -0.067 S -6.53329279136 0.00637481657 -0.11611178087 0.007 -0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.138 0.006 -0.000 C 2.67119656792 1.17263645248 0.00045766926 0.141 0.213 0.000 C 4.06129317470 1.20536051565 0.00241240325 0.047 -0.104 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.110 -0.004 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.057 0.113 0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.141 -0.225 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.105 -0.117 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.091 -0.061 0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.033 0.124 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.156 -0.126 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.096 -0.073 0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.001 0.080 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.010 0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.114 0.121 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.096 0.070 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.033 -0.131 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.164 0.128 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.100 0.082 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.006 -0.084 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.105 0.001 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.164 0.147 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.017 0.080 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.002 0.139 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.107 -0.003 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.170 -0.154 -0.001 H -1.39833026435 -2.98175334118 -0.00345676225 -0.005 -0.153 -0.001 H 3.39230213722 -3.86796714602 -0.00754158092 0.016 -0.090 -0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.175 0.069 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.188 -0.076 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.059 -0.000 0.008 H 0.75224758084 -0.00860493512 -5.25016290812 0.104 0.000 0.104 H -3.29620044300 -0.00255800648 -3.88456579214 0.005 0.000 0.080 H 1.47161249279 -0.00457826661 -2.87685200854 -0.012 0.000 0.114 H -1.69176120521 -0.00597000955 5.75026973076 0.058 -0.000 -0.007 H 0.75025791005 -0.00892914887 5.25161119224 0.100 0.000 -0.098 H 1.46975366817 -0.00523069331 2.87805400798 -0.009 0.000 -0.103 H -3.29750276746 -0.00099200484 3.88584245085 0.006 0.000 -0.071 H -4.55513299541 0.00377930937 -2.13473279421 -0.125 0.000 0.052 H -4.55107479454 0.00501307822 2.13844314827 -0.116 0.000 -0.047 H -6.83436893102 0.00806057203 1.19721860356 0.006 -0.000 0.000 H 6.86748209639 1.20005966818 0.00372860376 0.009 -0.001 -0.000 61 Mode 145: freq=1625.26 N -0.44003451495 -0.00038510790 2.12369783068 0.008 0.000 -0.077 C -1.76594470239 0.00039861437 2.37754210613 -0.107 -0.000 0.111 C -2.24923313135 -0.00145267054 3.67997125809 0.094 -0.000 0.075 C -1.33887502024 -0.00450793845 4.73956848945 -0.038 0.000 -0.126 C 0.02462671625 -0.00591801736 4.46614405978 -0.148 -0.000 0.124 C 0.43187566201 -0.00376957955 3.13352499014 0.092 -0.000 0.072 C -2.63984642995 0.00218980399 1.17162612704 0.128 -0.000 -0.213 N -1.98513620489 0.00132140951 0.00153900685 -0.135 0.000 -0.007 C -2.63911589169 0.00167522827 -1.17277445342 0.129 -0.000 0.226 C -4.02452897564 0.00329996303 -1.20791476641 0.069 -0.000 -0.115 C -4.73391255267 0.00451580118 -0.00020876193 -0.113 0.000 0.004 C -4.02924140493 0.00399189729 1.20660077672 0.058 -0.000 0.106 Co 0.00000000000 0.00000000000 0.00000000000 0.004 0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.016 0.000 0.082 C -1.76408906064 -0.00030645034 -2.37697009192 -0.118 -0.000 -0.114 C -2.24773885821 -0.00257631963 -3.67934971086 0.099 -0.000 -0.085 C -1.33713102227 -0.00526459193 -4.73855802198 -0.038 0.000 0.133 C 0.02654101484 -0.00591797621 -4.46472703619 -0.155 -0.000 -0.125 C 0.43371721952 -0.00363389350 -3.13225443930 0.095 -0.000 -0.083 S -6.53329279136 0.00637481657 -0.11611178087 0.009 -0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.089 -0.004 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.090 -0.154 -0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.025 0.066 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.063 0.004 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.031 -0.073 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.092 0.162 0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.050 0.088 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.060 0.029 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.032 -0.085 0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.104 0.100 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.067 0.027 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.012 -0.053 0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.006 -0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.057 -0.090 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.063 -0.034 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.032 0.089 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.109 -0.101 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.069 -0.033 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.009 0.056 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.084 0.005 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.115 -0.097 0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.015 -0.035 0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.005 -0.074 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.085 -0.004 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.119 0.102 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.004 0.083 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.014 0.042 0.000 H 4.58301895157 2.13678100538 0.00314824260 0.115 -0.045 0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.122 0.049 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.099 -0.000 0.009 H 0.75224758084 -0.00860493512 -5.25016290812 0.161 0.000 0.155 H -3.29620044300 -0.00255800648 -3.88456579214 0.010 0.000 0.107 H 1.47161249279 -0.00457826661 -2.87685200854 -0.014 0.000 0.162 H -1.69176120521 -0.00597000955 5.75026973076 0.099 -0.000 -0.007 H 0.75025791005 -0.00892914887 5.25161119224 0.155 0.000 -0.147 H 1.46975366817 -0.00523069331 2.87805400798 -0.010 0.000 -0.146 H -3.29750276746 -0.00099200484 3.88584245085 0.011 0.000 -0.094 H -4.55513299541 0.00377930937 -2.13473279421 -0.188 0.000 0.079 H -4.55107479454 0.00501307822 2.13844314827 -0.176 0.000 -0.072 H -6.83436893102 0.00806057203 1.19721860356 0.009 -0.000 0.001 H 6.86748209639 1.20005966818 0.00372860376 -0.006 0.001 0.000 61 Mode 146: freq=1643.60 N -0.44003451495 -0.00038510790 2.12369783068 0.116 -0.000 -0.006 C -1.76594470239 0.00039861437 2.37754210613 -0.135 0.000 -0.113 C -2.24923313135 -0.00145267054 3.67997125809 0.002 -0.000 0.108 C -1.33887502024 -0.00450793845 4.73956848945 0.054 -0.000 0.022 C 0.02462671625 -0.00591801736 4.46614405978 0.026 0.000 -0.129 C 0.43187566201 -0.00376957955 3.13352499014 -0.025 -0.000 0.151 C -2.63984642995 0.00218980399 1.17162612704 -0.040 0.000 0.135 N -1.98513620489 0.00132140951 0.00153900685 0.056 -0.000 0.001 C -2.63911589169 0.00167522827 -1.17277445342 -0.044 -0.000 -0.138 C -4.02452897564 0.00329996303 -1.20791476641 0.057 -0.000 0.008 C -4.73391255267 0.00451580118 -0.00020876193 -0.039 0.000 -0.007 C -4.02924140493 0.00399189729 1.20660077672 0.055 -0.000 -0.003 Co 0.00000000000 0.00000000000 0.00000000000 -0.002 -0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.119 -0.000 0.006 C -1.76408906064 -0.00030645034 -2.37697009192 -0.139 0.000 0.115 C -2.24773885821 -0.00257631963 -3.67934971086 0.002 -0.000 -0.112 C -1.33713102227 -0.00526459193 -4.73855802198 0.056 -0.000 -0.022 C 0.02654101484 -0.00591797621 -4.46472703619 0.026 0.000 0.132 C 0.43371721952 -0.00363389350 -3.13225443930 -0.025 -0.000 -0.156 S -6.53329279136 0.00637481657 -0.11611178087 0.001 0.000 0.001 N 2.00981687167 0.00259443239 -0.00000686048 0.045 0.000 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.036 -0.137 0.000 C 4.06129317470 1.20536051565 0.00241240325 0.082 -0.014 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.069 0.006 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.086 0.010 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.038 0.139 0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.186 0.132 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.010 -0.153 0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.071 -0.010 0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.009 0.142 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.021 -0.197 0.001 N 0.49290585413 2.18198449515 -0.00068475564 0.150 0.017 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.003 -0.001 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.196 -0.136 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.011 0.161 0.001 C 1.45789786198 -4.76953179608 -0.00945089783 0.075 0.009 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.008 -0.147 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.021 0.207 0.001 N 0.49225266031 -2.17934076887 -0.00084210065 0.157 -0.019 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.122 0.053 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.053 0.003 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.037 0.181 -0.001 H -1.39787683933 2.98334799634 -0.00369736757 -0.070 0.207 -0.001 H 1.83794742242 -5.77033326187 -0.01295832570 -0.127 -0.056 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.054 -0.005 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.073 -0.218 -0.001 H 3.39230213722 -3.86796714602 -0.00754158092 -0.039 -0.192 -0.001 H 4.58301895157 2.13678100538 0.00314824260 0.002 0.009 0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.002 -0.014 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.107 0.000 0.037 H 0.75224758084 -0.00860493512 -5.25016290812 -0.062 0.000 -0.016 H -3.29620044300 -0.00255800648 -3.88456579214 -0.033 0.000 0.130 H 1.47161249279 -0.00457826661 -2.87685200854 -0.062 0.000 0.154 H -1.69176120521 -0.00597000955 5.75026973076 -0.104 0.000 -0.036 H 0.75025791005 -0.00892914887 5.25161119224 -0.060 0.000 0.017 H 1.46975366817 -0.00523069331 2.87805400798 -0.060 0.000 -0.149 H -3.29750276746 -0.00099200484 3.88584245085 -0.032 0.000 -0.125 H -4.55513299541 0.00377930937 -2.13473279421 0.019 -0.000 0.003 H -4.55107479454 0.00501307822 2.13844314827 0.021 -0.000 0.001 H -6.83436893102 0.00806057203 1.19721860356 -0.002 -0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.001 0.000 0.000 61 Mode 147: freq=1644.81 N -0.44003451495 -0.00038510790 2.12369783068 0.150 -0.000 -0.025 C -1.76594470239 0.00039861437 2.37754210613 -0.191 0.000 -0.135 C -2.24923313135 -0.00145267054 3.67997125809 0.014 -0.000 0.151 C -1.33887502024 -0.00450793845 4.73956848945 0.064 -0.000 0.010 C 0.02462671625 -0.00591801736 4.46614405978 0.014 0.000 -0.145 C 0.43187566201 -0.00376957955 3.13352499014 -0.017 -0.000 0.200 C -2.63984642995 0.00218980399 1.17162612704 -0.041 0.000 0.155 N -1.98513620489 0.00132140951 0.00153900685 0.060 -0.000 0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.044 -0.000 -0.157 C -4.02452897564 0.00329996303 -1.20791476641 0.084 -0.000 -0.003 C -4.73391255267 0.00451580118 -0.00020876193 -0.065 0.000 -0.007 C -4.02924140493 0.00399189729 1.20660077672 0.080 -0.000 0.008 Co 0.00000000000 0.00000000000 0.00000000000 -0.001 0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.156 -0.000 0.027 C -1.76408906064 -0.00030645034 -2.37697009192 -0.199 0.000 0.139 C -2.24773885821 -0.00257631963 -3.67934971086 0.015 -0.000 -0.158 C -1.33713102227 -0.00526459193 -4.73855802198 0.067 -0.000 -0.010 C 0.02654101484 -0.00591797621 -4.46472703619 0.013 0.000 0.151 C 0.43371721952 -0.00363389350 -3.13225443930 -0.017 -0.000 -0.208 S -6.53329279136 0.00637481657 -0.11611178087 0.002 -0.000 0.001 N 2.00981687167 0.00259443239 -0.00000686048 -0.035 -0.000 -0.000 C 2.67119656792 1.17263645248 0.00045766926 0.024 0.102 -0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.067 0.015 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.059 -0.005 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.070 -0.012 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.025 -0.103 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.154 -0.099 0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.013 0.123 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.053 -0.000 0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.002 -0.100 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.008 0.155 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.117 -0.023 0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.002 0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.162 0.103 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.014 -0.131 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.056 0.001 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.003 0.105 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.008 -0.164 -0.001 N 0.49225266031 -2.17934076887 -0.00084210065 -0.122 0.024 0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.087 -0.041 0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.030 -0.011 0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.028 -0.147 0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.052 -0.161 0.001 H 1.83794742242 -5.77033326187 -0.01295832570 0.091 0.044 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.031 0.013 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.054 0.171 0.001 H 3.39230213722 -3.86796714602 -0.00754158092 0.030 0.156 0.001 H 4.58301895157 2.13678100538 0.00314824260 0.005 -0.010 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.008 0.014 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.124 0.000 0.049 H 0.75224758084 -0.00860493512 -5.25016290812 -0.056 0.000 -0.001 H -3.29620044300 -0.00255800648 -3.88456579214 -0.042 0.000 0.184 H 1.47161249279 -0.00457826661 -2.87685200854 -0.077 0.000 0.208 H -1.69176120521 -0.00597000955 5.75026973076 -0.119 0.000 -0.047 H 0.75025791005 -0.00892914887 5.25161119224 -0.055 0.000 0.002 H 1.46975366817 -0.00523069331 2.87805400798 -0.074 0.001 -0.199 H -3.29750276746 -0.00099200484 3.88584245085 -0.041 0.000 -0.175 H -4.55513299541 0.00377930937 -2.13473279421 0.005 -0.000 0.012 H -4.55107479454 0.00501307822 2.13844314827 0.009 -0.000 -0.007 H -6.83436893102 0.00806057203 1.19721860356 -0.002 0.000 -0.001 H 6.86748209639 1.20005966818 0.00372860376 0.000 -0.000 -0.000 61 Mode 148: freq=1657.89 N -0.44003451495 -0.00038510790 2.12369783068 -0.000 -0.002 0.000 C -1.76594470239 0.00039861437 2.37754210613 0.000 0.000 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.000 0.000 -0.000 C -1.33887502024 -0.00450793845 4.73956848945 0.000 0.000 0.000 C 0.02462671625 -0.00591801736 4.46614405978 0.000 0.000 -0.000 C 0.43187566201 -0.00376957955 3.13352499014 -0.000 0.000 -0.000 C -2.63984642995 0.00218980399 1.17162612704 -0.000 -0.000 0.001 N -1.98513620489 0.00132140951 0.00153900685 0.000 -0.000 0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.000 -0.000 -0.001 C -4.02452897564 0.00329996303 -1.20791476641 -0.000 -0.000 0.000 C -4.73391255267 0.00451580118 -0.00020876193 0.000 -0.000 -0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.000 0.000 -0.000 Co 0.00000000000 0.00000000000 0.00000000000 0.000 -0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 -0.002 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 0.000 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 -0.000 0.000 0.000 C -1.33713102227 -0.00526459193 -4.73855802198 0.000 0.000 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 0.000 0.000 0.000 C 0.43371721952 -0.00363389350 -3.13225443930 -0.000 0.000 0.000 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 -0.000 0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.008 -0.058 -0.000 C 2.67119656792 1.17263645248 0.00045766926 0.240 -0.021 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.093 -0.094 -0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.000 0.246 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.084 -0.093 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.215 -0.027 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.281 0.118 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.041 -0.199 0.001 C 1.45736908622 4.77231118002 -0.00917967851 0.092 0.029 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.066 0.102 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.033 -0.251 0.001 N 0.49290585413 2.18198449515 -0.00068475564 0.141 0.073 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.007 -0.016 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.265 0.114 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.037 -0.187 -0.001 C 1.45789786198 -4.76953179608 -0.00945089783 -0.088 0.025 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.058 0.101 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.029 -0.238 -0.001 N 0.49225266031 -2.17934076887 -0.00084210065 -0.135 0.067 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.104 0.064 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.004 0.062 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.040 0.259 -0.001 H -1.39787683933 2.98334799634 -0.00369736757 -0.067 0.261 -0.001 H 1.83794742242 -5.77033326187 -0.01295832570 0.101 0.061 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.000 0.056 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.064 0.246 0.001 H 3.39230213722 -3.86796714602 -0.00754158092 0.038 0.245 0.001 H 4.58301895157 2.13678100538 0.00314824260 0.066 -0.088 0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.066 -0.086 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.000 -0.000 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 -0.000 -0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 0.000 -0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 -0.000 -0.001 H -1.69176120521 -0.00597000955 5.75026973076 -0.000 -0.000 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 -0.000 -0.000 0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.000 -0.000 0.001 H -3.29750276746 -0.00099200484 3.88584245085 -0.000 0.000 0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.001 0.000 -0.000 H -4.55107479454 0.00501307822 2.13844314827 0.000 0.000 0.000 H -6.83436893102 0.00806057203 1.19721860356 -0.000 0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.040 0.009 -0.000 61 Mode 149: freq=1658.38 N -0.44003451495 -0.00038510790 2.12369783068 0.136 -0.000 -0.078 C -1.76594470239 0.00039861437 2.37754210613 -0.282 0.000 -0.115 C -2.24923313135 -0.00145267054 3.67997125809 0.049 -0.000 0.198 C -1.33887502024 -0.00450793845 4.73956848945 0.082 -0.000 -0.033 C 0.02462671625 -0.00591801736 4.46614405978 -0.062 0.000 -0.100 C 0.43187566201 -0.00376957955 3.13352499014 0.038 -0.001 0.249 C -2.63984642995 0.00218980399 1.17162612704 0.253 -0.000 0.016 N -1.98513620489 0.00132140951 0.00153900685 -0.010 0.000 0.066 C -2.63911589169 0.00167522827 -1.17277445342 -0.227 0.000 0.025 C -4.02452897564 0.00329996303 -1.20791476641 0.088 -0.000 0.093 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 -0.000 -0.247 C -4.02924140493 0.00399189729 1.20660077672 -0.097 0.000 0.095 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.000 0.001 N -0.43839318333 -0.00054206762 -2.12229806799 -0.133 -0.000 -0.073 C -1.76408906064 -0.00030645034 -2.37697009192 0.269 -0.000 -0.114 C -2.24773885821 -0.00257631963 -3.67934971086 -0.045 0.000 0.187 C -1.33713102227 -0.00526459193 -4.73855802198 -0.079 0.000 -0.027 C 0.02654101484 -0.00591797621 -4.46472703619 0.054 -0.000 -0.102 C 0.43371721952 -0.00363389350 -3.13225443930 -0.033 0.001 0.239 S -6.53329279136 0.00637481657 -0.11611178087 0.007 0.000 0.016 N 2.00981687167 0.00259443239 -0.00000686048 0.000 -0.000 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.000 -0.000 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.000 0.000 0.000 C 4.76783866331 0.00148799420 0.00346798881 0.000 -0.000 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.000 -0.000 0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.000 0.000 0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.001 -0.000 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.000 0.001 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.000 -0.000 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.000 -0.000 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.000 0.000 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.000 -0.000 0.002 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.001 0.000 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.000 -0.001 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 0.000 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.000 0.000 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 -0.000 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.000 0.000 0.002 H 1.83694111827 5.77332096953 -0.01265611066 -0.000 -0.000 0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.000 -0.000 0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.000 -0.001 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.000 -0.001 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 0.000 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.000 0.000 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 0.001 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.000 0.001 -0.000 H 4.58301895157 2.13678100538 0.00314824260 0.000 -0.000 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.000 0.000 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.098 -0.000 -0.056 H 0.75224758084 -0.00860493512 -5.25016290812 0.003 -0.000 -0.054 H -3.29620044300 -0.00255800648 -3.88456579214 0.043 -0.001 -0.238 H 1.47161249279 -0.00457826661 -2.87685200854 0.071 -0.001 -0.244 H -1.69176120521 -0.00597000955 5.75026973076 -0.099 0.000 -0.058 H 0.75025791005 -0.00892914887 5.25161119224 0.002 0.000 -0.060 H 1.46975366817 -0.00523069331 2.87805400798 -0.073 0.001 -0.256 H -3.29750276746 -0.00099200484 3.88584245085 -0.044 0.001 -0.250 H -4.55513299541 0.00377930937 -2.13473279421 -0.061 0.000 0.085 H -4.55107479454 0.00501307822 2.13844314827 0.060 -0.000 0.086 H -6.83436893102 0.00806057203 1.19721860356 -0.040 0.000 -0.009 H 6.86748209639 1.20005966818 0.00372860376 -0.000 0.000 -0.000 61 Mode 150: freq=1733.12 N -0.44003451495 -0.00038510790 2.12369783068 -0.000 -0.001 -0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.000 0.000 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.000 -0.000 0.000 C -1.33887502024 -0.00450793845 4.73956848945 0.000 0.000 -0.000 C 0.02462671625 -0.00591801736 4.46614405978 -0.000 -0.000 0.000 C 0.43187566201 -0.00376957955 3.13352499014 0.000 -0.000 -0.000 C -2.63984642995 0.00218980399 1.17162612704 0.000 0.001 0.000 N -1.98513620489 0.00132140951 0.00153900685 -0.000 -0.004 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.000 0.001 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.000 -0.000 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 0.000 0.000 0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.000 -0.000 -0.000 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.006 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 -0.001 0.000 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 0.000 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 -0.000 -0.000 -0.000 C -1.33713102227 -0.00526459193 -4.73855802198 0.000 0.000 0.000 C 0.02654101484 -0.00591797621 -4.46472703619 -0.000 -0.000 -0.000 C 0.43371721952 -0.00363389350 -3.13225443930 0.000 -0.000 -0.000 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 -0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.001 -0.438 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.004 0.362 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.227 -0.287 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.018 0.422 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.182 -0.264 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.019 0.341 0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.085 -0.034 0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.004 -0.060 0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.022 0.052 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.076 -0.106 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.013 0.109 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.035 -0.020 0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.010 -0.016 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.072 -0.031 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.002 -0.057 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.020 0.049 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.071 -0.097 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.013 0.099 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.032 -0.017 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.018 0.015 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.049 0.028 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.006 0.015 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.024 -0.042 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.016 0.014 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.046 0.027 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.022 -0.037 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.006 0.018 0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.165 0.039 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.132 0.021 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.000 0.000 0.000 H 0.75224758084 -0.00860493512 -5.25016290812 0.000 0.000 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 0.000 0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 0.001 0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.000 0.000 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 0.000 0.000 -0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.000 0.001 -0.000 H -3.29750276746 -0.00099200484 3.88584245085 -0.000 0.000 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.000 0.000 -0.000 H -4.55107479454 0.00501307822 2.13844314827 0.000 0.000 0.000 H -6.83436893102 0.00806057203 1.19721860356 0.000 0.000 0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.051 0.012 -0.000 61 Mode 151: freq=1738.03 N -0.44003451495 -0.00038510790 2.12369783068 -0.032 -0.000 0.025 C -1.76594470239 0.00039861437 2.37754210613 0.087 -0.000 0.027 C -2.24923313135 -0.00145267054 3.67997125809 -0.001 -0.000 0.065 C -1.33887502024 -0.00450793845 4.73956848945 0.016 0.000 -0.054 C 0.02462671625 -0.00591801736 4.46614405978 -0.070 -0.000 0.108 C 0.43187566201 -0.00376957955 3.13352499014 0.007 0.000 -0.115 C -2.63984642995 0.00218980399 1.17162612704 -0.009 0.000 -0.368 N -1.98513620489 0.00132140951 0.00153900685 0.000 0.000 0.455 C -2.63911589169 0.00167522827 -1.17277445342 -0.021 -0.000 -0.346 C -4.02452897564 0.00329996303 -1.20791476641 -0.175 0.000 0.255 C -4.73391255267 0.00451580118 -0.00020876193 -0.019 -0.000 -0.407 C -4.02924140493 0.00399189729 1.20660077672 0.226 -0.000 0.280 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.000 -0.007 N -0.43839318333 -0.00054206762 -2.12229806799 0.030 0.000 0.020 C -1.76408906064 -0.00030645034 -2.37697009192 -0.073 0.000 0.024 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 0.000 0.063 C -1.33713102227 -0.00526459193 -4.73855802198 -0.017 -0.000 -0.051 C 0.02654101484 -0.00591797621 -4.46472703619 0.067 0.000 0.100 C 0.43371721952 -0.00363389350 -3.13225443930 -0.009 -0.000 -0.103 S -6.53329279136 0.00637481657 -0.11611178087 0.009 0.000 0.016 N 2.00981687167 0.00259443239 -0.00000686048 0.000 -0.000 0.004 C 2.67119656792 1.17263645248 0.00045766926 0.000 -0.000 -0.001 C 4.06129317470 1.20536051565 0.00241240325 -0.000 0.000 0.000 C 4.76783866331 0.00148799420 0.00346798881 0.000 0.000 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.000 -0.000 0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.000 0.000 -0.001 C 1.82209539371 2.39842937406 -0.00175320633 0.000 0.000 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.000 -0.000 0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.000 0.000 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.000 -0.000 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.000 0.000 0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.000 0.000 0.001 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 -0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.000 -0.000 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.000 0.000 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 -0.000 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.000 0.000 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.000 0.000 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.000 -0.000 0.001 H 1.83694111827 5.77332096953 -0.01265611066 -0.000 0.000 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.000 0.000 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.000 0.000 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.000 0.000 -0.001 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 -0.000 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 -0.000 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 -0.000 -0.001 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 -0.000 -0.000 H 4.58301895157 2.13678100538 0.00314824260 0.000 -0.000 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.000 0.000 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.016 -0.000 -0.015 H 0.75224758084 -0.00860493512 -5.25016290812 -0.044 -0.000 -0.027 H -3.29620044300 -0.00255800648 -3.88456579214 0.007 -0.000 -0.020 H 1.47161249279 -0.00457826661 -2.87685200854 -0.023 0.000 0.039 H -1.69176120521 -0.00597000955 5.75026973076 0.019 0.000 -0.015 H 0.75025791005 -0.00892914887 5.25161119224 0.047 -0.000 -0.027 H 1.46975366817 -0.00523069331 2.87805400798 0.025 -0.000 0.045 H -3.29750276746 -0.00099200484 3.88584245085 -0.006 0.000 -0.016 H -4.55513299541 0.00377930937 -2.13473279421 0.128 -0.000 -0.020 H -4.55107479454 0.00501307822 2.13844314827 -0.163 0.000 -0.040 H -6.83436893102 0.00806057203 1.19721860356 -0.049 0.000 -0.012 H 6.86748209639 1.20005966818 0.00372860376 -0.000 -0.000 -0.000 61 Mode 152: freq=1758.61 N -0.44003451495 -0.00038510790 2.12369783068 0.174 -0.000 0.070 C -1.76594470239 0.00039861437 2.37754210613 -0.129 0.000 0.062 C -2.24923313135 -0.00145267054 3.67997125809 0.120 -0.000 0.018 C -1.33887502024 -0.00450793845 4.73956848945 -0.302 0.000 -0.054 C 0.02462671625 -0.00591801736 4.46614405978 0.228 -0.000 -0.053 C 0.43187566201 -0.00376957955 3.13352499014 -0.128 0.000 -0.094 C -2.63984642995 0.00218980399 1.17162612704 -0.102 0.000 -0.018 N -1.98513620489 0.00132140951 0.00153900685 0.023 -0.000 -0.012 C -2.63911589169 0.00167522827 -1.17277445342 -0.099 0.000 0.040 C -4.02452897564 0.00329996303 -1.20791476641 0.157 -0.000 -0.063 C -4.73391255267 0.00451580118 -0.00020876193 -0.091 0.000 0.008 C -4.02924140493 0.00399189729 1.20660077672 0.141 -0.000 0.049 Co 0.00000000000 0.00000000000 0.00000000000 -0.002 0.000 0.001 N -0.43839318333 -0.00054206762 -2.12229806799 0.237 -0.000 -0.093 C -1.76408906064 -0.00030645034 -2.37697009192 -0.184 -0.000 -0.082 C -2.24773885821 -0.00257631963 -3.67934971086 0.166 -0.000 -0.033 C -1.33713102227 -0.00526459193 -4.73855802198 -0.410 0.000 0.077 C 0.02654101484 -0.00591797621 -4.46472703619 0.306 -0.000 0.069 C 0.43371721952 -0.00363389350 -3.13225443930 -0.171 0.000 0.129 S -6.53329279136 0.00637481657 -0.11611178087 0.001 -0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.004 -0.002 -0.001 C 2.67119656792 1.17263645248 0.00045766926 0.023 -0.003 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.039 0.015 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.028 0.001 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.043 -0.018 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.023 0.008 0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.058 0.020 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.048 0.012 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.117 -0.026 0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.087 -0.017 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.047 -0.037 0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.068 0.027 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.001 -0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.068 -0.024 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.056 -0.014 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.135 0.030 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.101 0.019 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.054 0.043 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.079 -0.031 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.046 0.025 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.011 0.031 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.017 0.005 0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.007 0.026 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.054 -0.028 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.013 -0.036 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.008 -0.030 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.020 -0.006 0.000 H 4.58301895157 2.13678100538 0.00314824260 0.023 -0.015 0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.026 0.016 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.164 -0.000 -0.082 H 0.75224758084 -0.00860493512 -5.25016290812 -0.038 -0.000 -0.113 H -3.29620044300 -0.00255800648 -3.88456579214 0.060 -0.000 -0.020 H 1.47161249279 -0.00457826661 -2.87685200854 -0.024 -0.000 -0.094 H -1.69176120521 -0.00597000955 5.75026973076 0.120 -0.000 0.061 H 0.75025791005 -0.00892914887 5.25161119224 -0.030 -0.000 0.085 H 1.46975366817 -0.00523069331 2.87805400798 -0.018 -0.000 0.070 H -3.29750276746 -0.00099200484 3.88584245085 0.044 -0.000 0.020 H -4.55513299541 0.00377930937 -2.13473279421 -0.091 0.000 0.060 H -4.55107479454 0.00501307822 2.13844314827 -0.077 0.000 -0.053 H -6.83436893102 0.00806057203 1.19721860356 0.003 0.000 0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.001 -0.000 0.000 61 Mode 153: freq=1759.61 N -0.44003451495 -0.00038510790 2.12369783068 0.038 0.000 0.016 C -1.76594470239 0.00039861437 2.37754210613 -0.019 -0.000 0.020 C -2.24923313135 -0.00145267054 3.67997125809 0.024 -0.000 -0.002 C -1.33887502024 -0.00450793845 4.73956848945 -0.066 0.000 -0.009 C 0.02462671625 -0.00591801736 4.46614405978 0.052 -0.000 -0.015 C 0.43187566201 -0.00376957955 3.13352499014 -0.030 0.000 -0.020 C -2.63984642995 0.00218980399 1.17162612704 -0.052 -0.000 -0.009 N -1.98513620489 0.00132140951 0.00153900685 0.012 0.000 -0.006 C -2.63911589169 0.00167522827 -1.17277445342 -0.045 -0.000 0.023 C -4.02452897564 0.00329996303 -1.20791476641 0.069 -0.000 -0.029 C -4.73391255267 0.00451580118 -0.00020876193 -0.038 0.000 0.006 C -4.02924140493 0.00399189729 1.20660077672 0.062 -0.000 0.019 Co 0.00000000000 0.00000000000 0.00000000000 -0.003 -0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.091 -0.000 -0.035 C -1.76408906064 -0.00030645034 -2.37697009192 -0.068 -0.000 -0.035 C -2.24773885821 -0.00257631963 -3.67934971086 0.063 -0.000 -0.009 C -1.33713102227 -0.00526459193 -4.73855802198 -0.158 0.000 0.028 C 0.02654101484 -0.00591797621 -4.46472703619 0.119 -0.000 0.029 C 0.43371721952 -0.00363389350 -3.13225443930 -0.067 0.000 0.047 S -6.53329279136 0.00637481657 -0.11611178087 0.000 0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.026 0.010 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.115 0.025 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.163 -0.058 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.106 -0.007 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.180 0.072 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.113 -0.046 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.130 -0.062 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.118 -0.019 0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.296 0.060 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.226 0.049 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.124 0.092 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.173 -0.071 0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.001 0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.183 0.080 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.160 0.033 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.395 -0.085 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.298 -0.062 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.163 -0.123 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.231 0.093 0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.116 -0.063 0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.033 -0.083 0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.044 -0.025 0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.020 -0.065 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.155 0.084 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.041 0.108 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.026 0.086 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.058 0.025 0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.092 0.061 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.106 -0.069 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.062 -0.000 -0.032 H 0.75224758084 -0.00860493512 -5.25016290812 -0.016 -0.000 -0.045 H -3.29620044300 -0.00255800648 -3.88456579214 0.023 -0.000 -0.010 H 1.47161249279 -0.00457826661 -2.87685200854 -0.010 -0.000 -0.034 H -1.69176120521 -0.00597000955 5.75026973076 0.025 -0.000 0.014 H 0.75025791005 -0.00892914887 5.25161119224 -0.009 -0.000 0.020 H 1.46975366817 -0.00523069331 2.87805400798 -0.005 -0.000 0.015 H -3.29750276746 -0.00099200484 3.88584245085 0.010 -0.000 0.010 H -4.55513299541 0.00377930937 -2.13473279421 -0.040 0.000 0.026 H -4.55107479454 0.00501307822 2.13844314827 -0.033 0.000 -0.024 H -6.83436893102 0.00806057203 1.19721860356 0.002 -0.000 0.000 H 6.86748209639 1.20005966818 0.00372860376 0.003 -0.000 0.000 61 Mode 154: freq=1760.53 N -0.44003451495 -0.00038510790 2.12369783068 0.267 -0.000 0.092 C -1.76594470239 0.00039861437 2.37754210613 -0.246 0.000 0.075 C -2.24923313135 -0.00145267054 3.67997125809 0.192 -0.000 0.050 C -1.33887502024 -0.00450793845 4.73956848945 -0.455 0.001 -0.088 C 0.02462671625 -0.00591801736 4.46614405978 0.338 -0.000 -0.082 C 0.43187566201 -0.00376957955 3.13352499014 -0.185 0.001 -0.125 C -2.63984642995 0.00218980399 1.17162612704 0.035 -0.000 -0.038 N -1.98513620489 0.00132140951 0.00153900685 0.003 0.000 0.025 C -2.63911589169 0.00167522827 -1.17277445342 -0.067 0.000 -0.025 C -4.02452897564 0.00329996303 -1.20791476641 0.025 -0.000 0.020 C -4.73391255267 0.00451580118 -0.00020876193 -0.016 -0.000 -0.049 C -4.02924140493 0.00399189729 1.20660077672 0.026 -0.000 0.040 Co 0.00000000000 0.00000000000 0.00000000000 -0.001 -0.000 -0.003 N -0.43839318333 -0.00054206762 -2.12229806799 -0.195 0.000 0.061 C -1.76408906064 -0.00030645034 -2.37697009192 0.192 -0.000 0.053 C -2.24773885821 -0.00257631963 -3.67934971086 -0.142 0.000 0.037 C -1.33713102227 -0.00526459193 -4.73855802198 0.329 -0.000 -0.063 C 0.02654101484 -0.00591797621 -4.46472703619 -0.245 0.000 -0.063 C 0.43371721952 -0.00363389350 -3.13225443930 0.131 -0.000 -0.082 S -6.53329279136 0.00637481657 -0.11611178087 0.001 0.000 0.003 N 2.00981687167 0.00259443239 -0.00000686048 0.003 0.001 0.003 C 2.67119656792 1.17263645248 0.00045766926 -0.011 0.002 -0.001 C 4.06129317470 1.20536051565 0.00241240325 0.014 -0.004 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.009 -0.001 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.015 0.006 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.010 -0.005 -0.001 C 1.82209539371 2.39842937406 -0.00175320633 -0.005 -0.004 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.006 -0.000 0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.015 0.003 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.012 0.003 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.007 0.005 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.009 -0.004 0.001 S 6.56718562933 -0.11349126889 0.00673479967 0.000 0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.014 0.006 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.012 0.002 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.030 -0.006 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.023 -0.005 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.013 -0.009 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.018 0.007 0.001 H 1.83694111827 5.77332096953 -0.01265611066 0.006 -0.003 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.002 -0.005 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.002 -0.002 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.001 -0.003 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.012 0.006 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.003 0.008 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.002 0.006 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.004 0.002 -0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.007 0.005 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.009 -0.006 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.130 0.000 0.065 H 0.75224758084 -0.00860493512 -5.25016290812 0.031 0.000 0.087 H -3.29620044300 -0.00255800648 -3.88456579214 -0.046 0.000 -0.005 H 1.47161249279 -0.00457826661 -2.87685200854 0.022 0.000 0.062 H -1.69176120521 -0.00597000955 5.75026973076 0.180 -0.000 0.090 H 0.75025791005 -0.00892914887 5.25161119224 -0.041 -0.000 0.122 H 1.46975366817 -0.00523069331 2.87805400798 -0.029 -0.000 0.092 H -3.29750276746 -0.00099200484 3.88584245085 0.064 -0.000 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.000 -0.000 0.013 H -4.55107479454 0.00501307822 2.13844314827 -0.030 0.000 -0.006 H -6.83436893102 0.00806057203 1.19721860356 -0.006 0.000 -0.001 H 6.86748209639 1.20005966818 0.00372860376 0.000 -0.000 -0.000 61 Mode 155: freq=1761.76 N -0.44003451495 -0.00038510790 2.12369783068 0.006 -0.001 0.002 C -1.76594470239 0.00039861437 2.37754210613 -0.004 0.000 0.002 C -2.24923313135 -0.00145267054 3.67997125809 0.004 -0.000 0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.010 0.000 -0.002 C 0.02462671625 -0.00591801736 4.46614405978 0.008 -0.000 -0.002 C 0.43187566201 -0.00376957955 3.13352499014 -0.004 0.000 -0.003 C -2.63984642995 0.00218980399 1.17162612704 -0.004 0.001 -0.001 N -1.98513620489 0.00132140951 0.00153900685 0.001 -0.003 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.005 0.001 0.001 C -4.02452897564 0.00329996303 -1.20791476641 0.006 -0.000 -0.002 C -4.73391255267 0.00451580118 -0.00020876193 -0.003 0.000 -0.000 C -4.02924140493 0.00399189729 1.20660077672 0.005 -0.000 0.002 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 0.002 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.002 -0.001 -0.001 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 0.000 -0.001 C -2.24773885821 -0.00257631963 -3.67934971086 0.001 -0.000 0.000 C -1.33713102227 -0.00526459193 -4.73855802198 -0.004 0.000 0.001 C 0.02654101484 -0.00591797621 -4.46472703619 0.003 -0.000 0.001 C 0.43371721952 -0.00363389350 -3.13225443930 -0.002 0.000 0.001 S -6.53329279136 0.00637481657 -0.11611178087 0.000 -0.000 0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.002 -0.030 0.000 C 2.67119656792 1.17263645248 0.00045766926 0.039 0.041 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.025 -0.043 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.013 0.056 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.016 -0.027 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.064 0.031 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.252 -0.070 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.187 -0.053 0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.439 0.097 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.329 0.075 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.174 0.118 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.263 -0.091 0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.001 -0.003 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.209 -0.055 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.148 -0.040 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.343 0.074 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.258 0.063 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.135 0.084 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.207 -0.067 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.171 -0.091 0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.043 -0.115 0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.062 -0.001 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.031 -0.082 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.133 -0.071 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.035 -0.090 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.026 -0.060 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.049 0.003 0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.030 0.005 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.006 -0.010 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.001 0.000 -0.001 H 0.75224758084 -0.00860493512 -5.25016290812 -0.001 0.000 -0.001 H -3.29620044300 -0.00255800648 -3.88456579214 0.001 0.000 -0.001 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 -0.000 -0.001 H -1.69176120521 -0.00597000955 5.75026973076 0.004 0.000 0.002 H 0.75025791005 -0.00892914887 5.25161119224 -0.001 0.000 0.003 H 1.46975366817 -0.00523069331 2.87805400798 -0.001 -0.000 0.002 H -3.29750276746 -0.00099200484 3.88584245085 0.001 0.000 0.001 H -4.55513299541 0.00377930937 -2.13473279421 -0.003 0.000 0.002 H -4.55107479454 0.00501307822 2.13844314827 -0.003 0.000 -0.002 H -6.83436893102 0.00806057203 1.19721860356 0.000 0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.007 0.002 -0.000 61 Mode 156: freq=1782.72 N -0.44003451495 -0.00038510790 2.12369783068 0.005 0.001 0.006 C -1.76594470239 0.00039861437 2.37754210613 0.002 -0.000 -0.012 C -2.24923313135 -0.00145267054 3.67997125809 0.002 -0.000 0.015 C -1.33887502024 -0.00450793845 4.73956848945 -0.005 0.000 -0.008 C 0.02462671625 -0.00591801736 4.46614405978 -0.000 -0.000 0.008 C 0.43187566201 -0.00376957955 3.13352499014 -0.003 -0.000 -0.014 C -2.63984642995 0.00218980399 1.17162612704 -0.016 0.000 0.005 N -1.98513620489 0.00132140951 0.00153900685 0.008 -0.000 -0.001 C -2.63911589169 0.00167522827 -1.17277445342 -0.017 0.000 -0.004 C -4.02452897564 0.00329996303 -1.20791476641 0.018 -0.000 -0.004 C -4.73391255267 0.00451580118 -0.00020876193 -0.009 0.000 0.000 C -4.02924140493 0.00399189729 1.20660077672 0.017 -0.000 0.004 Co 0.00000000000 0.00000000000 0.00000000000 -0.002 -0.002 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.005 0.001 -0.008 C -1.76408906064 -0.00030645034 -2.37697009192 0.003 -0.000 0.015 C -2.24773885821 -0.00257631963 -3.67934971086 0.002 -0.000 -0.020 C -1.33713102227 -0.00526459193 -4.73855802198 -0.005 0.000 0.010 C 0.02654101484 -0.00591797621 -4.46472703619 -0.002 -0.000 -0.012 C 0.43371721952 -0.00363389350 -3.13225443930 -0.003 -0.000 0.018 S -6.53329279136 0.00637481657 -0.11611178087 0.000 0.000 0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.055 0.045 -0.000 C 2.67119656792 1.17263645248 0.00045766926 0.166 -0.129 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.210 0.106 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.103 -0.052 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.160 -0.023 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.176 -0.029 0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.008 0.354 -0.001 C 2.33938959521 3.68993217240 -0.00584554905 0.053 -0.457 0.001 C 1.45736908622 4.77231118002 -0.00917967851 -0.083 0.224 -0.001 C 0.08658913130 4.53522926787 -0.00833235387 -0.091 -0.258 0.001 C -0.35359617412 3.21325694137 -0.00400174376 -0.035 0.356 -0.001 N 0.49290585413 2.18198449515 -0.00068475564 0.068 -0.173 0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.002 0.002 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.106 0.084 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.033 -0.089 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.059 0.037 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.082 -0.089 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.016 0.096 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.039 -0.043 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.076 0.042 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.113 0.034 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.047 0.221 -0.001 H -1.39787683933 2.98334799634 -0.00369736757 0.051 -0.142 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.010 0.025 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.036 0.024 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.022 -0.037 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.022 0.025 0.000 H 4.58301895157 2.13678100538 0.00314824260 0.126 -0.074 0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.062 0.060 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.004 0.000 0.002 H 0.75224758084 -0.00860493512 -5.25016290812 0.005 0.000 0.001 H -3.29620044300 -0.00255800648 -3.88456579214 -0.002 -0.000 0.008 H 1.47161249279 -0.00457826661 -2.87685200854 0.003 -0.000 -0.010 H -1.69176120521 -0.00597000955 5.75026973076 0.003 0.000 -0.001 H 0.75025791005 -0.00892914887 5.25161119224 0.003 0.000 -0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.002 -0.000 0.009 H -3.29750276746 -0.00099200484 3.88584245085 -0.001 -0.000 -0.006 H -4.55513299541 0.00377930937 -2.13473279421 -0.006 -0.000 0.005 H -4.55107479454 0.00501307822 2.13844314827 -0.005 -0.000 -0.005 H -6.83436893102 0.00806057203 1.19721860356 0.000 -0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 0.005 -0.002 -0.000 61 Mode 157: freq=1783.53 N -0.44003451495 -0.00038510790 2.12369783068 -0.008 0.001 -0.015 C -1.76594470239 0.00039861437 2.37754210613 -0.003 -0.000 0.033 C -2.24923313135 -0.00145267054 3.67997125809 -0.004 -0.000 -0.040 C -1.33887502024 -0.00450793845 4.73956848945 0.007 -0.000 0.020 C 0.02462671625 -0.00591801736 4.46614405978 0.007 -0.000 -0.024 C 0.43187566201 -0.00376957955 3.13352499014 0.004 -0.000 0.033 C -2.63984642995 0.00218980399 1.17162612704 0.012 0.000 -0.012 N -1.98513620489 0.00132140951 0.00153900685 -0.008 -0.000 0.001 C -2.63911589169 0.00167522827 -1.17277445342 0.012 0.000 0.011 C -4.02452897564 0.00329996303 -1.20791476641 -0.011 0.000 0.001 C -4.73391255267 0.00451580118 -0.00020876193 0.006 -0.000 -0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.010 0.000 -0.000 Co 0.00000000000 0.00000000000 0.00000000000 0.003 -0.002 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.008 0.001 0.017 C -1.76408906064 -0.00030645034 -2.37697009192 -0.004 -0.000 -0.035 C -2.24773885821 -0.00257631963 -3.67934971086 -0.004 0.000 0.044 C -1.33713102227 -0.00526459193 -4.73855802198 0.007 -0.000 -0.021 C 0.02654101484 -0.00591797621 -4.46472703619 0.008 -0.000 0.026 C 0.43371721952 -0.00363389350 -3.13225443930 0.005 -0.000 -0.036 S -6.53329279136 0.00637481657 -0.11611178087 0.000 0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.031 0.049 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.116 -0.005 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.107 -0.017 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.078 -0.046 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.173 0.096 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.126 -0.146 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.054 -0.020 0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.026 0.038 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.045 -0.023 0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.025 0.002 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.015 -0.017 0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.033 0.009 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.002 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.012 0.385 0.001 C 2.33969079820 -3.68709653410 -0.00625612120 -0.047 -0.489 -0.002 C 1.45789786198 -4.76953179608 -0.00945089783 0.075 0.238 0.001 C 0.08684213972 -4.53272927032 -0.00840538011 0.109 -0.281 -0.001 C -0.35393854068 -3.21111942258 -0.00398541364 0.033 0.385 0.001 N 0.49225266031 -2.17934076887 -0.00084210065 -0.063 -0.187 -0.001 H 1.83694111827 5.77332096953 -0.01265611066 -0.019 0.005 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.003 0.006 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.003 -0.027 0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.002 0.007 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.076 0.048 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.123 0.039 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.057 -0.153 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.052 0.234 0.001 H 4.58301895157 2.13678100538 0.00314824260 -0.050 0.042 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.118 -0.067 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.007 0.000 -0.004 H 0.75224758084 -0.00860493512 -5.25016290812 -0.011 0.000 -0.003 H -3.29620044300 -0.00255800648 -3.88456579214 0.005 -0.000 -0.019 H 1.47161249279 -0.00457826661 -2.87685200854 -0.006 -0.000 0.017 H -1.69176120521 -0.00597000955 5.75026973076 -0.006 0.000 0.004 H 0.75025791005 -0.00892914887 5.25161119224 -0.010 0.000 0.003 H 1.46975366817 -0.00523069331 2.87805400798 -0.005 -0.000 -0.015 H -3.29750276746 -0.00099200484 3.88584245085 0.005 -0.000 0.018 H -4.55513299541 0.00377930937 -2.13473279421 0.001 -0.000 -0.002 H -4.55107479454 0.00501307822 2.13844314827 0.000 -0.000 0.002 H -6.83436893102 0.00806057203 1.19721860356 0.000 -0.000 0.000 H 6.86748209639 1.20005966818 0.00372860376 0.008 -0.001 0.000 61 Mode 158: freq=1784.90 N -0.44003451495 -0.00038510790 2.12369783068 -0.085 0.000 -0.102 C -1.76594470239 0.00039861437 2.37754210613 0.103 -0.000 0.219 C -2.24923313135 -0.00145267054 3.67997125809 -0.075 0.001 -0.292 C -1.33887502024 -0.00450793845 4.73956848945 0.114 -0.000 0.143 C 0.02462671625 -0.00591801736 4.46614405978 0.004 0.000 -0.132 C 0.43187566201 -0.00376957955 3.13352499014 0.045 -0.000 0.203 C -2.63984642995 0.00218980399 1.17162612704 -0.325 0.000 -0.066 N -1.98513620489 0.00132140951 0.00153900685 0.123 -0.000 0.003 C -2.63911589169 0.00167522827 -1.17277445342 -0.345 0.000 0.031 C -4.02452897564 0.00329996303 -1.20791476641 0.343 -0.000 -0.096 C -4.73391255267 0.00451580118 -0.00020876193 -0.180 0.000 -0.014 C -4.02924140493 0.00399189729 1.20660077672 0.334 -0.000 0.114 Co 0.00000000000 0.00000000000 0.00000000000 0.003 0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.078 0.000 0.020 C -1.76408906064 -0.00030645034 -2.37697009192 0.149 -0.000 -0.058 C -2.24773885821 -0.00257631963 -3.67934971086 -0.070 0.000 0.094 C -1.33713102227 -0.00526459193 -4.73855802198 0.112 -0.000 -0.050 C 0.02654101484 -0.00591797621 -4.46472703619 -0.063 0.000 -0.001 C 0.43371721952 -0.00363389350 -3.13225443930 0.035 -0.000 -0.034 S -6.53329279136 0.00637481657 -0.11611178087 0.000 0.000 0.001 N 2.00981687167 0.00259443239 -0.00000686048 -0.024 -0.006 -0.000 C 2.67119656792 1.17263645248 0.00045766926 0.054 0.012 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.051 0.011 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.031 0.005 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.061 -0.020 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.057 0.004 0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.020 -0.030 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.003 0.035 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.001 -0.017 0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.013 0.026 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.002 -0.036 0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.001 0.017 0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.000 -0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.017 0.000 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.004 0.000 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.004 0.001 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.003 -0.005 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.001 0.008 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.002 -0.003 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.004 -0.005 0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.010 -0.003 0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.005 -0.012 0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.007 0.019 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.001 0.001 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.001 -0.000 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.002 -0.008 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.001 -0.005 -0.000 H 4.58301895157 2.13678100538 0.00314824260 0.018 -0.016 0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.026 0.020 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.046 0.000 0.012 H 0.75224758084 -0.00860493512 -5.25016290812 -0.006 0.000 0.015 H -3.29620044300 -0.00255800648 -3.88456579214 -0.005 -0.000 -0.071 H 1.47161249279 -0.00457826661 -2.87685200854 0.005 0.000 0.015 H -1.69176120521 -0.00597000955 5.75026973076 -0.066 0.000 0.015 H 0.75025791005 -0.00892914887 5.25161119224 -0.060 0.000 0.009 H 1.46975366817 -0.00523069331 2.87805400798 -0.025 0.000 -0.081 H -3.29750276746 -0.00099200484 3.88584245085 0.023 -0.000 0.155 H -4.55513299541 0.00377930937 -2.13473279421 -0.147 0.000 0.119 H -4.55107479454 0.00501307822 2.13844314827 -0.154 0.000 -0.112 H -6.83436893102 0.00806057203 1.19721860356 0.001 0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.001 0.000 -0.000 61 Mode 159: freq=1786.46 N -0.44003451495 -0.00038510790 2.12369783068 -0.021 0.000 -0.006 C -1.76594470239 0.00039861437 2.37754210613 0.036 -0.000 0.003 C -2.24923313135 -0.00145267054 3.67997125809 -0.019 0.000 -0.013 C -1.33887502024 -0.00450793845 4.73956848945 0.034 -0.000 0.009 C 0.02462671625 -0.00591801736 4.46614405978 -0.024 0.000 0.005 C 0.43187566201 -0.00376957955 3.13352499014 0.012 -0.000 0.007 C -2.63984642995 0.00218980399 1.17162612704 -0.078 0.000 -0.002 N -1.98513620489 0.00132140951 0.00153900685 0.037 0.000 0.011 C -2.63911589169 0.00167522827 -1.17277445342 -0.080 0.000 -0.039 C -4.02452897564 0.00329996303 -1.20791476641 0.066 -0.000 -0.005 C -4.73391255267 0.00451580118 -0.00020876193 -0.037 0.000 -0.013 C -4.02924140493 0.00399189729 1.20660077672 0.077 -0.000 0.025 Co 0.00000000000 0.00000000000 0.00000000000 -0.001 -0.001 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.012 0.000 -0.054 C -1.76408906064 -0.00030645034 -2.37697009192 0.061 0.000 0.118 C -2.24773885821 -0.00257631963 -3.67934971086 -0.011 -0.000 -0.133 C -1.33713102227 -0.00526459193 -4.73855802198 0.027 0.000 0.059 C 0.02654101484 -0.00591797621 -4.46472703619 -0.068 -0.000 -0.098 C 0.43371721952 -0.00363389350 -3.13225443930 0.004 0.000 0.114 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 0.000 0.001 N 2.00981687167 0.00259443239 -0.00000686048 0.142 0.027 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.315 -0.076 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.286 -0.059 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.164 -0.017 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.330 0.092 0.001 C 2.67108506586 -1.17139122066 0.00026591651 -0.334 0.013 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.182 0.191 -0.001 C 2.33938959521 3.68993217240 -0.00584554905 -0.054 -0.202 0.001 C 1.45736908622 4.77231118002 -0.00917967851 0.094 0.085 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.150 -0.177 0.001 C -0.35359617412 3.21325694137 -0.00400174376 0.023 0.198 -0.001 N 0.49290585413 2.18198449515 -0.00068475564 -0.057 -0.092 0.001 S 6.56718562933 -0.11349126889 0.00673479967 -0.001 0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.174 -0.097 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.059 0.095 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.101 -0.036 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.120 0.115 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.027 -0.118 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.066 0.051 0.001 H 1.83694111827 5.77332096953 -0.01265611066 -0.011 0.048 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.071 0.045 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.044 0.068 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.042 -0.075 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.023 -0.036 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.044 -0.034 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.029 0.043 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.030 -0.017 0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.089 0.086 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.122 -0.104 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.002 0.000 0.024 H 0.75224758084 -0.00860493512 -5.25016290812 0.040 -0.000 0.023 H -3.29620044300 -0.00255800648 -3.88456579214 -0.024 0.000 0.053 H 1.47161249279 -0.00457826661 -2.87685200854 0.022 -0.000 -0.038 H -1.69176120521 -0.00597000955 5.75026973076 -0.013 0.000 -0.006 H 0.75025791005 -0.00892914887 5.25161119224 0.001 0.000 -0.007 H 1.46975366817 -0.00523069331 2.87805400798 0.001 -0.000 -0.010 H -3.29750276746 -0.00099200484 3.88584245085 -0.004 -0.000 0.011 H -4.55513299541 0.00377930937 -2.13473279421 -0.013 -0.000 0.020 H -4.55107479454 0.00501307822 2.13844314827 -0.028 0.000 -0.022 H -6.83436893102 0.00806057203 1.19721860356 -0.002 -0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 0.003 -0.000 0.000 61 Mode 160: freq=1787.32 N -0.44003451495 -0.00038510790 2.12369783068 -0.003 -0.000 0.103 C -1.76594470239 0.00039861437 2.37754210613 0.077 0.000 -0.216 C -2.24923313135 -0.00145267054 3.67997125809 -0.004 -0.000 0.247 C -1.33887502024 -0.00450793845 4.73956848945 0.018 0.000 -0.112 C 0.02462671625 -0.00591801736 4.46614405978 -0.097 -0.000 0.168 C 0.43187566201 -0.00376957955 3.13352499014 -0.006 0.000 -0.210 C -2.63984642995 0.00218980399 1.17162612704 -0.082 0.000 0.094 N -1.98513620489 0.00132140951 0.00153900685 0.030 -0.000 -0.075 C -2.63911589169 0.00167522827 -1.17277445342 -0.093 0.000 0.136 C -4.02452897564 0.00329996303 -1.20791476641 0.136 -0.000 -0.088 C -4.73391255267 0.00451580118 -0.00020876193 -0.047 0.000 0.070 C -4.02924140493 0.00399189729 1.20660077672 0.043 -0.000 -0.029 Co 0.00000000000 0.00000000000 0.00000000000 0.001 -0.000 0.002 N -0.43839318333 -0.00054206762 -2.12229806799 -0.047 0.000 0.164 C -1.76408906064 -0.00030645034 -2.37697009192 -0.019 -0.001 -0.344 C -2.24773885821 -0.00257631963 -3.67934971086 -0.039 0.001 0.416 C -1.33713102227 -0.00526459193 -4.73855802198 0.050 -0.000 -0.194 C 0.02654101484 -0.00591797621 -4.46472703619 0.098 0.000 0.245 C 0.43371721952 -0.00363389350 -3.13225443930 0.033 -0.001 -0.330 S -6.53329279136 0.00637481657 -0.11611178087 -0.002 -0.000 -0.003 N 2.00981687167 0.00259443239 -0.00000686048 0.027 0.005 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.059 -0.017 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.052 -0.010 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.029 -0.003 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.060 0.015 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.063 0.007 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.039 0.045 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.011 -0.049 0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.020 0.021 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.034 -0.041 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.005 0.046 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.013 -0.022 -0.002 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.038 -0.031 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.012 0.033 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.021 -0.013 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.030 0.032 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.006 -0.035 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.014 0.016 -0.002 H 1.83694111827 5.77332096953 -0.01265611066 -0.002 0.011 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.017 0.010 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.010 0.017 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.009 -0.016 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.004 -0.009 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.013 -0.009 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.008 0.012 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.008 -0.010 0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.015 0.015 0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.020 -0.018 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.055 -0.000 -0.046 H 0.75224758084 -0.00860493512 -5.25016290812 -0.103 0.000 -0.038 H -3.29620044300 -0.00255800648 -3.88456579214 0.053 -0.000 -0.192 H 1.47161249279 -0.00457826661 -2.87685200854 -0.054 0.000 0.132 H -1.69176120521 -0.00597000955 5.75026973076 0.016 0.000 -0.037 H 0.75025791005 -0.00892914887 5.25161119224 0.068 -0.000 -0.034 H 1.46975366817 -0.00523069331 2.87805400798 0.038 -0.000 0.081 H -3.29750276746 -0.00099200484 3.88584245085 -0.039 0.000 -0.103 H -4.55513299541 0.00377930937 -2.13473279421 -0.089 0.000 0.047 H -4.55107479454 0.00501307822 2.13844314827 0.005 -0.000 -0.016 H -6.83436893102 0.00806057203 1.19721860356 0.010 -0.000 0.002 H 6.86748209639 1.20005966818 0.00372860376 0.000 -0.000 0.000 61 Mode 161: freq=1789.64 N -0.44003451495 -0.00038510790 2.12369783068 -0.011 -0.000 0.143 C -1.76594470239 0.00039861437 2.37754210613 0.135 0.000 -0.297 C -2.24923313135 -0.00145267054 3.67997125809 -0.018 -0.001 0.334 C -1.33887502024 -0.00450793845 4.73956848945 0.039 0.000 -0.149 C 0.02462671625 -0.00591801736 4.46614405978 -0.142 -0.000 0.236 C 0.43187566201 -0.00376957955 3.13352499014 -0.006 0.001 -0.293 C -2.63984642995 0.00218980399 1.17162612704 -0.199 0.000 0.113 N -1.98513620489 0.00132140951 0.00153900685 0.106 -0.000 -0.022 C -2.63911589169 0.00167522827 -1.17277445342 -0.210 0.000 -0.062 C -4.02452897564 0.00329996303 -1.20791476641 0.191 -0.000 -0.041 C -4.73391255267 0.00451580118 -0.00020876193 -0.089 0.000 0.015 C -4.02924140493 0.00399189729 1.20660077672 0.160 -0.000 0.014 Co 0.00000000000 0.00000000000 0.00000000000 -0.003 0.000 0.001 N -0.43839318333 -0.00054206762 -2.12229806799 -0.018 -0.000 -0.107 C -1.76408906064 -0.00030645034 -2.37697009192 0.125 0.000 0.213 C -2.24773885821 -0.00257631963 -3.67934971086 -0.022 -0.000 -0.241 C -1.33713102227 -0.00526459193 -4.73855802198 0.041 0.000 0.108 C 0.02654101484 -0.00591797621 -4.46472703619 -0.115 -0.000 -0.181 C 0.43371721952 -0.00363389350 -3.13225443930 -0.001 0.000 0.222 S -6.53329279136 0.00637481657 -0.11611178087 -0.001 0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.026 -0.004 -0.000 C 2.67119656792 1.17263645248 0.00045766926 0.055 0.025 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.046 0.006 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.026 0.002 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.052 -0.011 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.058 -0.017 0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.040 -0.069 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.007 0.079 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.010 -0.036 0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.036 0.058 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.001 -0.075 0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.007 0.038 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.000 0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.040 0.061 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.007 -0.071 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.010 0.033 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.033 -0.054 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.001 0.069 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.007 -0.035 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.005 -0.013 0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.023 -0.010 0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.012 -0.030 0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.013 0.032 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.004 0.012 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.021 0.009 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.012 -0.030 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.011 0.027 0.000 H 4.58301895157 2.13678100538 0.00314824260 0.009 -0.012 0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.013 0.015 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.008 0.000 0.042 H 0.75224758084 -0.00860493512 -5.25016290812 0.071 -0.000 0.037 H -3.29620044300 -0.00255800648 -3.88456579214 -0.043 0.000 0.090 H 1.47161249279 -0.00457826661 -2.87685200854 0.042 -0.000 -0.086 H -1.69176120521 -0.00597000955 5.75026973076 0.016 0.000 -0.054 H 0.75025791005 -0.00892914887 5.25161119224 0.094 -0.000 -0.047 H 1.46975366817 -0.00523069331 2.87805400798 0.054 -0.000 0.114 H -3.29750276746 -0.00099200484 3.88584245085 -0.056 0.000 -0.132 H -4.55513299541 0.00377930937 -2.13473279421 -0.048 0.000 0.053 H -4.55107479454 0.00501307822 2.13844314827 -0.024 0.000 -0.041 H -6.83436893102 0.00806057203 1.19721860356 0.001 0.000 0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.000 -0.000 0.000 61 Mode 162: freq=2753.40 N -0.44003451495 -0.00038510790 2.12369783068 -0.000 -0.000 0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.000 0.000 0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.000 0.000 -0.000 C -1.33887502024 -0.00450793845 4.73956848945 0.000 0.000 0.000 C 0.02462671625 -0.00591801736 4.46614405978 -0.000 -0.000 0.000 C 0.43187566201 -0.00376957955 3.13352499014 0.000 -0.000 -0.000 C -2.63984642995 0.00218980399 1.17162612704 -0.000 0.000 0.000 N -1.98513620489 0.00132140951 0.00153900685 -0.000 -0.000 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.000 0.000 0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.000 -0.000 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 0.000 0.000 0.000 C -4.02924140493 0.00399189729 1.20660077672 0.000 -0.000 -0.000 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 -0.000 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 0.000 -0.000 C -2.24773885821 -0.00257631963 -3.67934971086 -0.000 0.000 0.000 C -1.33713102227 -0.00526459193 -4.73855802198 0.000 0.000 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 -0.000 -0.000 -0.000 C 0.43371721952 -0.00363389350 -3.13225443930 0.000 -0.000 0.000 S -6.53329279136 0.00637481657 -0.11611178087 -0.001 0.000 0.004 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 -0.001 -0.000 C 2.67119656792 1.17263645248 0.00045766926 0.001 0.000 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.002 -0.002 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.005 0.005 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.000 -0.001 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 0.000 0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 -0.000 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.000 -0.000 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.000 -0.000 0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.000 -0.000 0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.000 0.000 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.000 0.000 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.043 0.170 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.000 -0.000 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.000 0.000 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 -0.000 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.000 -0.000 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.000 -0.000 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.000 -0.000 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.000 0.000 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.000 0.000 0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.000 -0.000 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.000 0.000 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 0.000 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 -0.000 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.000 0.000 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 0.000 -0.000 H 4.58301895157 2.13678100538 0.00314824260 0.002 0.001 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.002 -0.001 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.000 0.000 0.000 H 0.75224758084 -0.00860493512 -5.25016290812 0.000 0.000 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 0.000 0.000 0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 0.000 0.000 H -1.69176120521 -0.00597000955 5.75026973076 -0.000 0.000 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 0.000 0.000 -0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.000 0.000 -0.000 H -3.29750276746 -0.00099200484 3.88584245085 0.000 0.000 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.000 0.000 -0.000 H -4.55107479454 0.00501307822 2.13844314827 -0.000 0.000 0.000 H -6.83436893102 0.00806057203 1.19721860356 0.005 -0.000 -0.024 H 6.86748209639 1.20005966818 0.00372860376 -0.219 -0.960 0.002 61 Mode 163: freq=2753.72 N -0.44003451495 -0.00038510790 2.12369783068 0.000 -0.000 -0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.000 0.000 0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.000 -0.000 0.000 C -1.33887502024 -0.00450793845 4.73956848945 0.000 0.000 0.000 C 0.02462671625 -0.00591801736 4.46614405978 -0.000 0.000 0.000 C 0.43187566201 -0.00376957955 3.13352499014 -0.000 -0.000 -0.000 C -2.63984642995 0.00218980399 1.17162612704 0.001 -0.000 -0.000 N -1.98513620489 0.00132140951 0.00153900685 -0.000 -0.000 0.001 C -2.63911589169 0.00167522827 -1.17277445342 -0.000 0.000 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 0.000 0.000 0.001 C -4.73391255267 0.00451580118 -0.00020876193 -0.005 0.000 -0.005 C -4.02924140493 0.00399189729 1.20660077672 -0.002 0.000 0.002 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.000 -0.000 0.000 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 0.000 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 -0.000 -0.000 C -1.33713102227 -0.00526459193 -4.73855802198 -0.000 0.000 0.000 C 0.02654101484 -0.00591797621 -4.46472703619 0.000 -0.000 0.000 C 0.43371721952 -0.00363389350 -3.13225443930 0.000 0.000 0.000 S -6.53329279136 0.00637481657 -0.11611178087 0.043 -0.000 -0.170 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 -0.000 0.000 C 2.67119656792 1.17263645248 0.00045766926 0.000 0.000 -0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.000 -0.000 0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.000 0.000 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.000 -0.000 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 0.000 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 -0.000 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.000 0.000 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.000 -0.000 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.000 -0.000 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.000 0.000 0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.000 0.000 0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.001 0.004 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 0.000 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.000 -0.000 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 -0.000 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.000 0.000 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.000 -0.000 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.000 -0.000 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.000 0.000 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.000 0.000 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.000 -0.000 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.000 0.000 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 -0.000 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 -0.000 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 -0.000 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.000 0.000 -0.000 H 4.58301895157 2.13678100538 0.00314824260 0.000 0.000 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 -0.000 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.000 -0.000 -0.000 H 0.75224758084 -0.00860493512 -5.25016290812 0.000 0.000 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 0.000 -0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.000 0.000 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 0.000 0.000 -0.000 H 0.75025791005 -0.00892914887 5.25161119224 0.000 0.000 -0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.000 0.000 -0.000 H -3.29750276746 -0.00099200484 3.88584245085 0.000 0.000 0.000 H -4.55513299541 0.00377930937 -2.13473279421 -0.002 0.000 0.001 H -4.55107479454 0.00501307822 2.13844314827 0.002 -0.000 -0.001 H -6.83436893102 0.00806057203 1.19721860356 -0.219 0.001 0.960 H 6.86748209639 1.20005966818 0.00372860376 -0.005 -0.024 0.000 61 Mode 164: freq=3424.18 N -0.44003451495 -0.00038510790 2.12369783068 -0.000 -0.000 -0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.000 0.000 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.001 -0.000 -0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.000 -0.000 0.001 C 0.02462671625 -0.00591801736 4.46614405978 -0.001 0.000 -0.001 C 0.43187566201 -0.00376957955 3.13352499014 0.001 0.000 -0.000 C -2.63984642995 0.00218980399 1.17162612704 0.000 0.000 -0.000 N -1.98513620489 0.00132140951 0.00153900685 -0.000 -0.000 0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.000 0.000 0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.000 0.000 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 -0.000 -0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.000 0.000 0.000 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.000 -0.000 0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 0.000 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 -0.000 0.000 C -1.33713102227 -0.00526459193 -4.73855802198 -0.000 -0.000 -0.001 C 0.02654101484 -0.00591797621 -4.46472703619 -0.001 0.000 0.001 C 0.43371721952 -0.00363389350 -3.13225443930 0.001 0.000 0.000 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 0.000 0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 -0.000 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.001 -0.000 0.000 C 4.06129317470 1.20536051565 0.00241240325 0.011 0.021 0.000 C 4.76783866331 0.00148799420 0.00346798881 0.001 -0.002 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.004 0.007 0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.000 -0.000 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.004 0.002 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.060 -0.020 0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.065 0.181 -0.001 C 0.08658913130 4.53522926787 -0.00833235387 0.085 -0.104 0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.115 -0.020 0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.003 -0.002 0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.001 0.001 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.022 -0.007 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.023 0.066 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.034 -0.040 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.047 -0.008 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.001 -0.001 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.223 -0.589 0.002 H -0.61802819388 5.33967450634 -0.01131742088 -0.297 0.341 -0.001 H 3.39175422949 3.87200638269 -0.00704552340 0.211 0.037 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.377 0.084 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.081 -0.215 -0.001 H -0.61749414542 -5.33746053721 -0.01121572048 0.116 0.133 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.153 0.034 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.075 0.013 0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.037 -0.066 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.012 -0.021 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.001 0.000 0.004 H 0.75224758084 -0.00860493512 -5.25016290812 0.002 0.000 -0.003 H -3.29620044300 -0.00255800648 -3.88456579214 -0.002 0.000 -0.000 H 1.47161249279 -0.00457826661 -2.87685200854 -0.004 -0.000 -0.001 H -1.69176120521 -0.00597000955 5.75026973076 0.002 0.000 -0.005 H 0.75025791005 -0.00892914887 5.25161119224 0.003 0.000 0.003 H 1.46975366817 -0.00523069331 2.87805400798 -0.004 -0.000 0.001 H -3.29750276746 -0.00099200484 3.88584245085 -0.002 0.000 0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.000 0.000 0.000 H -4.55107479454 0.00501307822 2.13844314827 0.000 0.000 -0.001 H -6.83436893102 0.00806057203 1.19721860356 0.000 0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.000 -0.000 0.000 61 Mode 165: freq=3424.31 N -0.44003451495 -0.00038510790 2.12369783068 0.000 -0.000 0.000 C -1.76594470239 0.00039861437 2.37754210613 0.000 0.000 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.002 -0.000 0.001 C -1.33887502024 -0.00450793845 4.73956848945 0.001 0.000 -0.004 C 0.02462671625 -0.00591801736 4.46614405978 0.002 -0.000 0.002 C 0.43187566201 -0.00376957955 3.13352499014 -0.003 0.000 0.001 C -2.63984642995 0.00218980399 1.17162612704 -0.000 0.000 0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 -0.000 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.000 0.000 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 0.000 0.000 0.000 C -4.73391255267 0.00451580118 -0.00020876193 0.000 -0.000 0.000 C -4.02924140493 0.00399189729 1.20660077672 0.000 0.000 -0.001 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.000 -0.000 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 0.000 -0.000 C -2.24773885821 -0.00257631963 -3.67934971086 -0.001 -0.000 -0.000 C -1.33713102227 -0.00526459193 -4.73855802198 0.001 0.000 0.004 C 0.02654101484 -0.00591797621 -4.46472703619 0.002 -0.000 -0.002 C 0.43371721952 -0.00363389350 -3.13225443930 -0.003 0.000 -0.001 S -6.53329279136 0.00637481657 -0.11611178087 0.000 0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 -0.000 0.000 C 2.67119656792 1.17263645248 0.00045766926 0.001 0.000 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.004 -0.007 -0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.001 -0.001 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.009 0.017 0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.001 -0.000 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.001 -0.001 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.022 0.008 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.025 -0.069 0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.032 0.039 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.043 0.008 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.001 0.001 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.000 0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.004 0.002 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.056 -0.019 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.062 0.175 0.001 C 0.08684213972 -4.53272927032 -0.00840538011 -0.089 -0.107 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.122 -0.022 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.003 -0.002 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.085 0.224 -0.001 H -0.61802819388 5.33967450634 -0.01131742088 0.113 -0.129 0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.078 -0.014 0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.141 -0.031 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.215 -0.569 -0.002 H -0.61749414542 -5.33746053721 -0.01121572048 0.308 0.353 0.001 H -1.39833026435 -2.98175334118 -0.00345676225 -0.400 0.089 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.195 0.034 0.000 H 4.58301895157 2.13678100538 0.00314824260 0.013 0.023 0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.030 -0.052 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.004 -0.000 -0.012 H 0.75224758084 -0.00860493512 -5.25016290812 -0.007 0.000 0.007 H -3.29620044300 -0.00255800648 -3.88456579214 0.005 0.000 0.001 H 1.47161249279 -0.00457826661 -2.87685200854 0.009 -0.000 0.002 H -1.69176120521 -0.00597000955 5.75026973076 -0.005 -0.000 0.013 H 0.75025791005 -0.00892914887 5.25161119224 -0.007 0.000 -0.007 H 1.46975366817 -0.00523069331 2.87805400798 0.009 -0.000 -0.002 H -3.29750276746 -0.00099200484 3.88584245085 0.005 0.000 -0.001 H -4.55513299541 0.00377930937 -2.13473279421 -0.001 0.000 -0.001 H -4.55107479454 0.00501307822 2.13844314827 -0.001 0.000 0.002 H -6.83436893102 0.00806057203 1.19721860356 -0.000 0.000 0.000 H 6.86748209639 1.20005966818 0.00372860376 0.000 0.000 -0.000 61 Mode 166: freq=3425.56 N -0.44003451495 -0.00038510790 2.12369783068 0.002 -0.000 0.001 C -1.76594470239 0.00039861437 2.37754210613 0.003 0.000 -0.004 C -2.24923313135 -0.00145267054 3.67997125809 -0.079 0.000 0.027 C -1.33887502024 -0.00450793845 4.73956848945 0.070 0.000 -0.207 C 0.02462671625 -0.00591801736 4.46614405978 0.083 -0.000 0.101 C 0.43187566201 -0.00376957955 3.13352499014 -0.075 0.000 0.013 C -2.63984642995 0.00218980399 1.17162612704 -0.002 0.000 0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 0.000 0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.000 0.000 0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.004 0.000 -0.007 C -4.73391255267 0.00451580118 -0.00020876193 0.001 0.000 0.002 C -4.02924140493 0.00399189729 1.20660077672 0.016 -0.000 -0.030 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 0.000 0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.001 -0.000 -0.001 C -2.24773885821 -0.00257631963 -3.67934971086 0.020 0.000 0.007 C -1.33713102227 -0.00526459193 -4.73855802198 -0.018 -0.000 -0.053 C 0.02654101484 -0.00591797621 -4.46472703619 -0.022 0.000 0.027 C 0.43371721952 -0.00363389350 -3.13225443930 0.021 -0.000 0.004 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 -0.000 0.000 C 2.67119656792 1.17263645248 0.00045766926 0.000 0.000 0.000 C 4.06129317470 1.20536051565 0.00241240325 0.000 0.000 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.000 -0.000 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.000 -0.000 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.000 -0.000 0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.000 0.000 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.001 -0.000 0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.001 0.003 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.001 -0.001 0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.001 -0.000 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.000 0.000 0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 -0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.000 -0.000 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.001 0.000 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.001 -0.003 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.001 0.001 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.001 0.000 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.000 -0.000 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.003 -0.008 0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.003 0.004 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.003 0.001 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.002 0.000 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.003 0.009 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.004 -0.004 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.003 -0.001 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.003 -0.001 -0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.001 -0.001 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 0.001 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.061 0.000 0.175 H 0.75224758084 -0.00860493512 -5.25016290812 0.080 -0.000 -0.087 H -3.29620044300 -0.00255800648 -3.88456579214 -0.070 0.000 -0.014 H 1.47161249279 -0.00457826661 -2.87685200854 -0.069 0.000 -0.017 H -1.69176120521 -0.00597000955 5.75026973076 -0.236 -0.001 0.677 H 0.75025791005 -0.00892914887 5.25161119224 -0.295 0.001 -0.322 H 1.46975366817 -0.00523069331 2.87805400798 0.246 -0.000 -0.061 H -3.29750276746 -0.00099200484 3.88584245085 0.273 -0.000 -0.054 H -4.55513299541 0.00377930937 -2.13473279421 0.013 -0.000 0.022 H -4.55107479454 0.00501307822 2.13844314827 -0.053 0.000 0.094 H -6.83436893102 0.00806057203 1.19721860356 -0.000 0.000 0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.000 0.000 -0.000 61 Mode 167: freq=3425.70 N -0.44003451495 -0.00038510790 2.12369783068 -0.001 0.000 -0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.001 -0.000 0.001 C -2.24923313135 -0.00145267054 3.67997125809 0.020 -0.000 -0.007 C -1.33887502024 -0.00450793845 4.73956848945 -0.018 -0.000 0.055 C 0.02462671625 -0.00591801736 4.46614405978 -0.022 0.000 -0.027 C 0.43187566201 -0.00376957955 3.13352499014 0.019 -0.000 -0.003 C -2.63984642995 0.00218980399 1.17162612704 0.001 -0.000 -0.000 N -1.98513620489 0.00132140951 0.00153900685 -0.000 -0.000 0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.002 -0.000 0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.013 0.000 -0.024 C -4.73391255267 0.00451580118 -0.00020876193 -0.001 0.000 0.001 C -4.02924140493 0.00399189729 1.20660077672 -0.004 0.000 0.007 Co 0.00000000000 0.00000000000 0.00000000000 0.000 -0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.002 0.000 0.001 C -1.76408906064 -0.00030645034 -2.37697009192 -0.003 -0.000 -0.003 C -2.24773885821 -0.00257631963 -3.67934971086 0.075 0.000 0.026 C -1.33713102227 -0.00526459193 -4.73855802198 -0.069 -0.000 -0.205 C 0.02654101484 -0.00591797621 -4.46472703619 -0.087 0.000 0.104 C 0.43371721952 -0.00363389350 -3.13225443930 0.080 -0.000 0.014 S -6.53329279136 0.00637481657 -0.11611178087 0.000 -0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 0.000 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.000 -0.000 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.000 -0.000 -0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.000 0.000 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.000 0.000 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 0.000 0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 -0.000 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.001 0.000 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.002 -0.004 0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.001 0.002 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.001 0.000 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.000 -0.000 0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.000 0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 0.000 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.001 -0.001 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.002 0.005 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.002 -0.002 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.001 -0.000 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.000 0.000 0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.005 0.014 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.005 -0.006 0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.005 -0.001 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.002 -0.000 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.006 -0.015 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.006 0.007 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.004 0.001 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.005 0.001 -0.000 H 4.58301895157 2.13678100538 0.00314824260 0.001 0.001 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.001 -0.001 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.233 0.001 0.668 H 0.75224758084 -0.00860493512 -5.25016290812 0.307 -0.001 -0.335 H -3.29620044300 -0.00255800648 -3.88456579214 -0.260 0.000 -0.051 H 1.47161249279 -0.00457826661 -2.87685200854 -0.261 0.000 -0.064 H -1.69176120521 -0.00597000955 5.75026973076 0.062 0.000 -0.178 H 0.75025791005 -0.00892914887 5.25161119224 0.078 -0.000 0.085 H 1.46975366817 -0.00523069331 2.87805400798 -0.063 0.000 0.016 H -3.29750276746 -0.00099200484 3.88584245085 -0.070 0.000 0.014 H -4.55513299541 0.00377930937 -2.13473279421 0.043 -0.000 0.075 H -4.55107479454 0.00501307822 2.13844314827 0.012 -0.000 -0.022 H -6.83436893102 0.00806057203 1.19721860356 0.000 -0.000 0.000 H 6.86748209639 1.20005966818 0.00372860376 0.000 -0.000 -0.000 61 Mode 168: freq=3431.96 N -0.44003451495 -0.00038510790 2.12369783068 -0.000 -0.000 0.000 C -1.76594470239 0.00039861437 2.37754210613 0.000 -0.000 0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.000 0.000 -0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.000 -0.000 0.001 C 0.02462671625 -0.00591801736 4.46614405978 0.000 -0.000 -0.000 C 0.43187566201 -0.00376957955 3.13352499014 -0.001 -0.000 0.000 C -2.63984642995 0.00218980399 1.17162612704 -0.000 -0.000 0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 0.001 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.000 -0.000 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.000 -0.000 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 -0.000 0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.000 -0.000 0.000 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 -0.000 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 -0.000 -0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 0.000 0.000 C -1.33713102227 -0.00526459193 -4.73855802198 -0.000 -0.000 -0.001 C 0.02654101484 -0.00591797621 -4.46472703619 0.000 -0.000 0.000 C 0.43371721952 -0.00363389350 -3.13225443930 -0.001 -0.000 -0.000 S -6.53329279136 0.00637481657 -0.11611178087 0.000 0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 -0.001 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.002 -0.000 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.016 0.028 0.000 C 4.76783866331 0.00148799420 0.00346798881 0.001 -0.002 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.007 0.012 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.001 -0.000 0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.002 0.003 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.059 -0.017 0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.057 0.134 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.056 0.039 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.194 0.043 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.004 0.003 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.001 0.002 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.028 -0.008 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.029 0.069 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.025 0.016 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.092 0.020 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.002 0.001 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.168 -0.438 0.002 H -0.61802819388 5.33967450634 -0.01131742088 0.145 -0.159 0.001 H 3.39175422949 3.87200638269 -0.00704552340 0.203 0.035 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.633 -0.143 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.086 -0.226 -0.001 H -0.61749414542 -5.33746053721 -0.01121572048 -0.062 -0.068 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.299 -0.067 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.098 0.017 0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.051 -0.091 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.022 -0.038 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.001 0.000 0.004 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 -0.000 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.002 -0.000 -0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.004 0.000 0.001 H -1.69176120521 -0.00597000955 5.75026973076 0.001 -0.000 -0.003 H 0.75025791005 -0.00892914887 5.25161119224 -0.000 0.000 -0.000 H 1.46975366817 -0.00523069331 2.87805400798 0.004 0.000 -0.001 H -3.29750276746 -0.00099200484 3.88584245085 -0.002 -0.000 0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.000 -0.000 0.001 H -4.55107479454 0.00501307822 2.13844314827 0.000 -0.000 -0.001 H -6.83436893102 0.00806057203 1.19721860356 0.000 -0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.000 -0.000 0.000 61 Mode 169: freq=3432.06 N -0.44003451495 -0.00038510790 2.12369783068 -0.000 0.000 0.000 C -1.76594470239 0.00039861437 2.37754210613 0.000 0.000 0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.001 -0.000 -0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.001 -0.000 0.003 C 0.02462671625 -0.00591801736 4.46614405978 0.000 0.000 -0.000 C 0.43187566201 -0.00376957955 3.13352499014 -0.003 0.000 0.001 C -2.63984642995 0.00218980399 1.17162612704 -0.000 0.000 0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 -0.000 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.000 0.000 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.000 0.000 -0.001 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 0.000 -0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.000 0.000 0.001 Co 0.00000000000 0.00000000000 0.00000000000 0.000 -0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 0.000 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 0.000 -0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.001 -0.000 0.000 C -1.33713102227 -0.00526459193 -4.73855802198 -0.001 -0.000 -0.003 C 0.02654101484 -0.00591797621 -4.46472703619 0.000 0.000 0.000 C 0.43371721952 -0.00363389350 -3.13225443930 -0.003 0.000 -0.001 S -6.53329279136 0.00637481657 -0.11611178087 0.000 -0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 0.000 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.001 -0.000 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.007 0.013 0.000 C 4.76783866331 0.00148799420 0.00346798881 0.001 0.000 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.013 -0.023 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.002 0.000 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.001 0.002 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.028 -0.008 0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.028 0.065 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.027 0.019 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.094 0.021 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.002 0.001 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 -0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.002 -0.003 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.058 0.017 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.061 -0.143 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.052 -0.033 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.190 -0.042 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.003 -0.002 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.081 -0.212 0.001 H -0.61802819388 5.33967450634 -0.01131742088 0.071 -0.078 0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.097 0.017 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.305 -0.069 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.179 0.468 0.002 H -0.61749414542 -5.33746053721 -0.01121572048 0.131 0.143 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.620 0.140 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.201 -0.035 -0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.023 -0.041 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.041 0.072 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.004 0.000 0.010 H 0.75224758084 -0.00860493512 -5.25016290812 -0.000 0.000 0.000 H -3.29620044300 -0.00255800648 -3.88456579214 -0.005 0.000 -0.001 H 1.47161249279 -0.00457826661 -2.87685200854 0.011 -0.000 0.003 H -1.69176120521 -0.00597000955 5.75026973076 0.003 0.000 -0.010 H 0.75025791005 -0.00892914887 5.25161119224 -0.001 0.000 -0.001 H 1.46975366817 -0.00523069331 2.87805400798 0.011 -0.000 -0.003 H -3.29750276746 -0.00099200484 3.88584245085 -0.005 0.000 0.001 H -4.55513299541 0.00377930937 -2.13473279421 0.001 0.000 0.002 H -4.55107479454 0.00501307822 2.13844314827 0.001 0.000 -0.002 H -6.83436893102 0.00806057203 1.19721860356 0.000 0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.000 -0.000 0.000 61 Mode 170: freq=3435.62 N -0.44003451495 -0.00038510790 2.12369783068 0.002 -0.000 0.002 C -1.76594470239 0.00039861437 2.37754210613 0.001 -0.000 0.003 C -2.24923313135 -0.00145267054 3.67997125809 0.060 -0.000 -0.015 C -1.33887502024 -0.00450793845 4.73956848945 -0.032 -0.000 0.068 C 0.02462671625 -0.00591801736 4.46614405978 0.070 -0.000 0.060 C 0.43187566201 -0.00376957955 3.13352499014 -0.137 0.000 0.031 C -2.63984642995 0.00218980399 1.17162612704 0.003 -0.000 -0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 -0.000 -0.001 C -2.63911589169 0.00167522827 -1.17277445342 -0.002 0.000 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 0.019 -0.000 0.032 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 -0.000 -0.003 C -4.02924140493 0.00399189729 1.20660077672 -0.023 0.000 0.041 Co 0.00000000000 0.00000000000 0.00000000000 0.000 -0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.003 0.000 0.002 C -1.76408906064 -0.00030645034 -2.37697009192 -0.001 0.000 0.003 C -2.24773885821 -0.00257631963 -3.67934971086 -0.061 -0.000 -0.016 C -1.33713102227 -0.00526459193 -4.73855802198 0.037 0.000 0.084 C 0.02654101484 -0.00591797621 -4.46472703619 -0.073 0.000 0.062 C 0.43371721952 -0.00363389350 -3.13225443930 0.149 -0.000 0.034 S -6.53329279136 0.00637481657 -0.11611178087 0.000 0.000 0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 -0.000 0.001 C 2.67119656792 1.17263645248 0.00045766926 -0.000 -0.000 0.000 C 4.06129317470 1.20536051565 0.00241240325 0.000 0.000 -0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.000 -0.000 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.000 -0.000 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 0.000 0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 -0.000 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.000 -0.000 0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.000 0.000 0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.000 0.000 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.000 0.000 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.000 -0.000 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.000 0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 0.000 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.000 0.000 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 -0.000 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.000 -0.000 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.000 -0.000 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.000 0.000 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.000 -0.000 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.000 -0.000 0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.000 0.000 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.001 -0.000 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 0.000 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 0.000 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.001 0.000 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.000 -0.000 -0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.000 -0.000 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.000 0.000 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.098 -0.001 -0.277 H 0.75224758084 -0.00860493512 -5.25016290812 0.212 -0.001 -0.225 H -3.29620044300 -0.00255800648 -3.88456579214 0.205 -0.000 0.040 H 1.47161249279 -0.00457826661 -2.87685200854 -0.485 0.000 -0.122 H -1.69176120521 -0.00597000955 5.75026973076 0.081 0.000 -0.226 H 0.75025791005 -0.00892914887 5.25161119224 -0.204 0.001 -0.218 H 1.46975366817 -0.00523069331 2.87805400798 0.446 -0.001 -0.112 H -3.29750276746 -0.00099200484 3.88584245085 -0.201 0.000 0.039 H -4.55513299541 0.00377930937 -2.13473279421 -0.059 0.000 -0.104 H -4.55107479454 0.00501307822 2.13844314827 0.075 -0.000 -0.135 H -6.83436893102 0.00806057203 1.19721860356 0.000 -0.000 -0.001 H 6.86748209639 1.20005966818 0.00372860376 -0.000 -0.000 0.000 61 Mode 171: freq=3435.73 N -0.44003451495 -0.00038510790 2.12369783068 -0.003 0.000 -0.002 C -1.76594470239 0.00039861437 2.37754210613 -0.001 0.000 -0.003 C -2.24923313135 -0.00145267054 3.67997125809 -0.064 0.000 0.016 C -1.33887502024 -0.00450793845 4.73956848945 0.035 0.000 -0.075 C 0.02462671625 -0.00591801736 4.46614405978 -0.075 0.000 -0.065 C 0.43187566201 -0.00376957955 3.13352499014 0.147 -0.000 -0.034 C -2.63984642995 0.00218980399 1.17162612704 -0.003 0.000 0.000 N -1.98513620489 0.00132140951 0.00153900685 -0.000 0.000 0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.002 0.000 -0.001 C -4.02452897564 0.00329996303 -1.20791476641 0.015 -0.000 0.027 C -4.73391255267 0.00451580118 -0.00020876193 0.002 -0.000 0.001 C -4.02924140493 0.00399189729 1.20660077672 0.023 -0.000 -0.041 Co 0.00000000000 0.00000000000 0.00000000000 0.001 -0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.002 0.000 0.002 C -1.76408906064 -0.00030645034 -2.37697009192 -0.001 0.000 0.003 C -2.24773885821 -0.00257631963 -3.67934971086 -0.055 -0.000 -0.015 C -1.33713102227 -0.00526459193 -4.73855802198 0.035 0.000 0.080 C 0.02654101484 -0.00591797621 -4.46472703619 -0.068 0.000 0.057 C 0.43371721952 -0.00363389350 -3.13225443930 0.139 -0.000 0.032 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 0.000 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.000 -0.000 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.000 0.001 0.000 C 4.76783866331 0.00148799420 0.00346798881 0.000 -0.000 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.000 -0.000 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 0.000 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 -0.000 0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.001 -0.000 0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.001 0.002 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.002 0.002 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.003 0.001 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.000 -0.000 0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.000 0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 0.000 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.001 0.000 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.001 -0.002 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.002 -0.002 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.003 -0.001 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.000 0.000 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.002 -0.006 0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.006 -0.007 0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.004 0.001 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.011 -0.002 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.002 0.006 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.006 0.007 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.011 0.002 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.003 -0.001 -0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.001 -0.002 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.001 0.002 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.093 -0.000 -0.262 H 0.75224758084 -0.00860493512 -5.25016290812 0.197 -0.001 -0.210 H -3.29620044300 -0.00255800648 -3.88456579214 0.187 -0.000 0.036 H 1.47161249279 -0.00457826661 -2.87685200854 -0.452 0.000 -0.114 H -1.69176120521 -0.00597000955 5.75026973076 -0.088 -0.000 0.248 H 0.75025791005 -0.00892914887 5.25161119224 0.221 -0.001 0.235 H 1.46975366817 -0.00523069331 2.87805400798 -0.481 0.001 0.121 H -3.29750276746 -0.00099200484 3.88584245085 0.214 -0.000 -0.042 H -4.55513299541 0.00377930937 -2.13473279421 -0.048 0.000 -0.085 H -4.55107479454 0.00501307822 2.13844314827 -0.074 0.000 0.134 H -6.83436893102 0.00806057203 1.19721860356 -0.000 0.000 0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.000 -0.000 0.000 61 Mode 172: freq=3442.05 N -0.44003451495 -0.00038510790 2.12369783068 0.003 -0.000 0.002 C -1.76594470239 0.00039861437 2.37754210613 0.005 0.000 -0.008 C -2.24923313135 -0.00145267054 3.67997125809 -0.140 0.000 0.023 C -1.33887502024 -0.00450793845 4.73956848945 -0.029 -0.000 0.103 C 0.02462671625 -0.00591801736 4.46614405978 -0.009 0.000 -0.024 C 0.43187566201 -0.00376957955 3.13352499014 -0.088 0.000 0.024 C -2.63984642995 0.00218980399 1.17162612704 -0.011 0.000 0.000 N -1.98513620489 0.00132140951 0.00153900685 -0.000 0.000 0.002 C -2.63911589169 0.00167522827 -1.17277445342 0.001 -0.000 0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.017 0.000 -0.029 C -4.73391255267 0.00451580118 -0.00020876193 0.005 -0.000 0.010 C -4.02924140493 0.00399189729 1.20660077672 0.105 -0.000 -0.185 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 0.000 0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.001 -0.000 -0.001 C -2.24773885821 -0.00257631963 -3.67934971086 0.024 -0.000 0.004 C -1.33713102227 -0.00526459193 -4.73855802198 0.005 0.000 0.017 C 0.02654101484 -0.00591797621 -4.46472703619 0.002 -0.000 -0.005 C 0.43371721952 -0.00363389350 -3.13225443930 0.014 -0.000 0.004 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 -0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 0.000 0.000 C 2.67119656792 1.17263645248 0.00045766926 0.000 0.000 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.000 -0.001 -0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.000 0.000 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.000 0.000 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.000 -0.000 0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 -0.000 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.001 0.000 0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.000 0.000 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.001 -0.001 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.000 0.000 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.000 0.000 0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 -0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 -0.000 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.001 -0.000 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.000 0.000 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.001 0.001 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 -0.000 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.000 -0.000 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.000 -0.000 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.003 0.003 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.003 -0.001 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.000 -0.000 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.000 -0.001 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.002 -0.002 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 -0.000 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.002 0.000 -0.000 H 4.58301895157 2.13678100538 0.00314824260 0.002 0.003 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.000 -0.001 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.018 -0.000 -0.052 H 0.75224758084 -0.00860493512 -5.25016290812 -0.011 0.000 0.013 H -3.29620044300 -0.00255800648 -3.88456579214 -0.077 0.000 -0.014 H 1.47161249279 -0.00457826661 -2.87685200854 -0.047 0.000 -0.012 H -1.69176120521 -0.00597000955 5.75026973076 0.109 0.000 -0.317 H 0.75025791005 -0.00892914887 5.25161119224 0.050 -0.000 0.059 H 1.46975366817 -0.00523069331 2.87805400798 0.287 -0.000 -0.073 H -3.29750276746 -0.00099200484 3.88584245085 0.443 -0.000 -0.084 H -4.55513299541 0.00377930937 -2.13473279421 0.055 -0.000 0.098 H -4.55107479454 0.00501307822 2.13844314827 -0.335 0.001 0.604 H -6.83436893102 0.00806057203 1.19721860356 -0.001 0.000 0.002 H 6.86748209639 1.20005966818 0.00372860376 0.000 0.000 -0.000 61 Mode 173: freq=3443.68 N -0.44003451495 -0.00038510790 2.12369783068 0.000 -0.000 -0.000 C -1.76594470239 0.00039861437 2.37754210613 0.000 0.000 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.000 -0.000 -0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.000 0.000 0.000 C 0.02462671625 -0.00591801736 4.46614405978 0.001 -0.000 0.001 C 0.43187566201 -0.00376957955 3.13352499014 -0.000 0.000 0.000 C -2.63984642995 0.00218980399 1.17162612704 0.000 0.000 -0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 -0.000 0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.000 0.000 0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.003 0.000 -0.005 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 0.000 0.000 C -4.02924140493 0.00399189729 1.20660077672 0.000 0.000 -0.000 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 -0.000 0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 0.000 -0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.005 -0.000 0.001 C -1.33713102227 -0.00526459193 -4.73855802198 0.001 0.000 0.003 C 0.02654101484 -0.00591797621 -4.46472703619 0.001 -0.000 -0.002 C 0.43371721952 -0.00363389350 -3.13225443930 0.002 0.000 0.001 S -6.53329279136 0.00637481657 -0.11611178087 0.000 -0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 -0.002 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.011 -0.001 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.098 0.174 0.000 C 4.76783866331 0.00148799420 0.00346798881 0.005 -0.009 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.016 0.027 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.001 -0.000 0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.005 0.009 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.171 -0.027 0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.013 -0.065 0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.049 0.066 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.066 -0.019 0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.003 -0.002 0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.001 0.001 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.028 -0.004 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.002 -0.010 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.009 0.012 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.011 -0.003 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.000 -0.000 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.070 0.194 -0.001 H -0.61802819388 5.33967450634 -0.01131742088 0.174 -0.202 0.001 H 3.39175422949 3.87200638269 -0.00704552340 0.547 0.090 -0.001 H -1.39787683933 2.98334799634 -0.00369736757 0.212 0.049 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.011 0.030 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.031 -0.036 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.034 0.008 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.089 0.015 0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.314 -0.567 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.050 -0.089 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.003 -0.000 -0.008 H 0.75224758084 -0.00860493512 -5.25016290812 -0.004 0.000 0.005 H -3.29620044300 -0.00255800648 -3.88456579214 -0.016 0.000 -0.003 H 1.47161249279 -0.00457826661 -2.87685200854 -0.008 0.000 -0.002 H -1.69176120521 -0.00597000955 5.75026973076 0.000 0.000 -0.001 H 0.75025791005 -0.00892914887 5.25161119224 -0.002 0.000 -0.002 H 1.46975366817 -0.00523069331 2.87805400798 0.000 0.000 -0.000 H -3.29750276746 -0.00099200484 3.88584245085 -0.001 0.000 0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.009 0.000 0.016 H -4.55107479454 0.00501307822 2.13844314827 -0.000 0.000 0.001 H -6.83436893102 0.00806057203 1.19721860356 0.000 0.000 0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.001 -0.002 0.000 61 Mode 174: freq=3444.05 N -0.44003451495 -0.00038510790 2.12369783068 -0.001 0.000 -0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.001 -0.000 0.002 C -2.24923313135 -0.00145267054 3.67997125809 0.027 -0.000 -0.005 C -1.33887502024 -0.00450793845 4.73956848945 0.004 0.000 -0.015 C 0.02462671625 -0.00591801736 4.46614405978 0.003 -0.000 0.006 C 0.43187566201 -0.00376957955 3.13352499014 0.014 -0.000 -0.004 C -2.63984642995 0.00218980399 1.17162612704 0.003 -0.000 -0.000 N -1.98513620489 0.00132140951 0.00153900685 0.001 0.000 0.001 C -2.63911589169 0.00167522827 -1.17277445342 0.011 -0.000 0.001 C -4.02452897564 0.00329996303 -1.20791476641 -0.096 0.000 -0.166 C -4.73391255267 0.00451580118 -0.00020876193 -0.005 0.000 0.006 C -4.02924140493 0.00399189729 1.20660077672 -0.017 0.000 0.029 Co 0.00000000000 0.00000000000 0.00000000000 0.000 -0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.004 0.000 0.002 C -1.76408906064 -0.00030645034 -2.37697009192 -0.006 -0.000 -0.009 C -2.24773885821 -0.00257631963 -3.67934971086 0.171 -0.000 0.030 C -1.33713102227 -0.00526459193 -4.73855802198 0.022 0.000 0.092 C 0.02654101484 -0.00591797621 -4.46472703619 0.026 -0.000 -0.041 C 0.43371721952 -0.00363389350 -3.13225443930 0.086 -0.000 0.024 S -6.53329279136 0.00637481657 -0.11611178087 0.001 -0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 0.000 0.000 C 2.67119656792 1.17263645248 0.00045766926 0.000 -0.000 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.003 -0.005 -0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.000 0.000 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.002 -0.003 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 0.000 0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 -0.000 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.004 0.001 0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.001 0.002 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.000 -0.001 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.002 0.000 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.000 -0.000 0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.000 -0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.000 -0.000 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.003 0.001 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 0.001 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.002 -0.002 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.001 0.000 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.000 0.000 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.002 -0.007 0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.002 0.002 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.014 -0.002 0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.006 -0.001 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.000 -0.001 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.007 0.008 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.004 -0.001 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.011 -0.002 -0.000 H 4.58301895157 2.13678100538 0.00314824260 0.009 0.016 0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.005 0.009 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.094 -0.001 -0.278 H 0.75224758084 -0.00860493512 -5.25016290812 -0.103 0.000 0.115 H -3.29620044300 -0.00255800648 -3.88456579214 -0.545 0.000 -0.102 H 1.47161249279 -0.00457826661 -2.87685200854 -0.279 0.000 -0.071 H -1.69176120521 -0.00597000955 5.75026973076 -0.016 -0.000 0.047 H 0.75025791005 -0.00892914887 5.25161119224 -0.014 0.000 -0.016 H 1.46975366817 -0.00523069331 2.87805400798 -0.046 0.000 0.012 H -3.29750276746 -0.00099200484 3.88584245085 -0.086 0.000 0.016 H -4.55513299541 0.00377930937 -2.13473279421 0.304 -0.000 0.540 H -4.55107479454 0.00501307822 2.13844314827 0.052 -0.000 -0.093 H -6.83436893102 0.00806057203 1.19721860356 0.001 -0.000 0.000 H 6.86748209639 1.20005966818 0.00372860376 0.000 0.000 -0.000 61 Mode 175: freq=3445.53 N -0.44003451495 -0.00038510790 2.12369783068 -0.000 -0.000 0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.000 0.000 0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.001 -0.000 -0.000 C -1.33887502024 -0.00450793845 4.73956848945 0.000 0.000 -0.001 C 0.02462671625 -0.00591801736 4.46614405978 -0.001 0.000 -0.001 C 0.43187566201 -0.00376957955 3.13352499014 0.000 0.000 -0.000 C -2.63984642995 0.00218980399 1.17162612704 0.000 0.000 0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 -0.000 0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.000 0.000 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.002 0.000 -0.003 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 0.000 0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.001 0.000 0.001 Co 0.00000000000 0.00000000000 0.00000000000 0.000 0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 -0.000 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 0.000 -0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.002 -0.000 0.000 C -1.33713102227 -0.00526459193 -4.73855802198 0.001 0.000 0.002 C 0.02654101484 -0.00591797621 -4.46472703619 -0.001 0.000 0.000 C 0.43371721952 -0.00363389350 -3.13225443930 0.001 0.000 0.000 S -6.53329279136 0.00637481657 -0.11611178087 0.000 -0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 -0.001 0.000 C 2.67119656792 1.17263645248 0.00045766926 0.002 0.000 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.014 -0.025 -0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.005 -0.005 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.085 0.147 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.010 -0.001 0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.001 -0.002 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.030 0.005 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.001 0.009 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.010 -0.013 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.013 0.004 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.001 0.000 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.000 0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.006 0.009 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.186 -0.030 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.004 -0.049 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.069 0.089 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.079 -0.023 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.004 -0.002 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.009 -0.025 0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.036 0.041 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.095 -0.016 0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.040 -0.009 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.049 0.139 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.237 -0.274 -0.001 H -1.39833026435 -2.98175334118 -0.00345676225 -0.253 0.059 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.599 0.098 0.001 H 4.58301895157 2.13678100538 0.00314824260 0.044 0.080 0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.268 -0.477 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.002 -0.000 -0.005 H 0.75224758084 -0.00860493512 -5.25016290812 0.001 0.000 -0.001 H -3.29620044300 -0.00255800648 -3.88456579214 -0.007 0.000 -0.001 H 1.47161249279 -0.00457826661 -2.87685200854 -0.004 -0.000 -0.001 H -1.69176120521 -0.00597000955 5.75026973076 -0.001 -0.000 0.003 H 0.75025791005 -0.00892914887 5.25161119224 0.002 -0.000 0.003 H 1.46975366817 -0.00523069331 2.87805400798 -0.001 -0.000 0.000 H -3.29750276746 -0.00099200484 3.88584245085 -0.002 0.000 0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.005 0.000 0.009 H -4.55107479454 0.00501307822 2.13844314827 0.002 0.000 -0.004 H -6.83436893102 0.00806057203 1.19721860356 0.000 0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 0.001 -0.000 -0.000 61 Mode 176: freq=3451.88 N -0.44003451495 -0.00038510790 2.12369783068 -0.000 0.000 -0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.000 0.000 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.001 -0.000 -0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.001 -0.000 0.002 C 0.02462671625 -0.00591801736 4.46614405978 0.004 -0.000 0.004 C 0.43187566201 -0.00376957955 3.13352499014 0.003 0.000 -0.001 C -2.63984642995 0.00218980399 1.17162612704 -0.000 -0.000 -0.000 N -1.98513620489 0.00132140951 0.00153900685 -0.000 -0.000 0.000 C -2.63911589169 0.00167522827 -1.17277445342 -0.000 -0.000 0.000 C -4.02452897564 0.00329996303 -1.20791476641 0.001 -0.000 0.002 C -4.73391255267 0.00451580118 -0.00020876193 0.000 -0.000 0.000 C -4.02924140493 0.00399189729 1.20660077672 0.001 -0.000 -0.003 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 -0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 0.000 0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 0.000 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 0.000 -0.000 0.000 C -1.33713102227 -0.00526459193 -4.73855802198 -0.001 -0.000 -0.002 C 0.02654101484 -0.00591797621 -4.46472703619 0.003 -0.000 -0.003 C 0.43371721952 -0.00363389350 -3.13225443930 0.002 0.000 0.001 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 -0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 0.001 -0.000 C 2.67119656792 1.17263645248 0.00045766926 0.005 -0.000 0.000 C 4.06129317470 1.20536051565 0.00241240325 -0.049 -0.086 -0.000 C 4.76783866331 0.00148799420 0.00346798881 -0.002 0.005 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.014 -0.024 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.001 0.000 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 0.002 -0.002 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.005 -0.004 0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.045 0.088 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.146 0.169 -0.001 C -0.35359617412 3.21325694137 -0.00400174376 -0.123 -0.040 0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.003 -0.003 0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.000 -0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 -0.001 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.007 -0.000 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.012 0.026 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.038 0.044 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.032 -0.010 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.001 -0.001 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.109 -0.278 0.001 H -0.61802819388 5.33967450634 -0.01131742088 0.462 -0.530 0.002 H 3.39175422949 3.87200638269 -0.00704552340 -0.002 -0.000 0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.387 0.091 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.031 -0.081 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.119 -0.137 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.099 0.023 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.021 -0.003 -0.000 H 4.58301895157 2.13678100538 0.00314824260 0.156 0.284 0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.044 0.079 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.002 0.000 0.005 H 0.75224758084 -0.00860493512 -5.25016290812 -0.008 0.000 0.009 H -3.29620044300 -0.00255800648 -3.88456579214 -0.000 0.000 -0.000 H 1.47161249279 -0.00457826661 -2.87685200854 -0.007 -0.000 -0.002 H -1.69176120521 -0.00597000955 5.75026973076 0.002 0.000 -0.005 H 0.75025791005 -0.00892914887 5.25161119224 -0.011 0.000 -0.012 H 1.46975366817 -0.00523069331 2.87805400798 -0.010 -0.000 0.003 H -3.29750276746 -0.00099200484 3.88584245085 -0.005 0.000 0.001 H -4.55513299541 0.00377930937 -2.13473279421 -0.004 0.000 -0.007 H -4.55107479454 0.00501307822 2.13844314827 -0.005 0.000 0.008 H -6.83436893102 0.00806057203 1.19721860356 -0.000 0.000 0.000 H 6.86748209639 1.20005966818 0.00372860376 0.000 0.001 -0.000 61 Mode 177: freq=3452.32 N -0.44003451495 -0.00038510790 2.12369783068 0.000 0.000 0.000 C -1.76594470239 0.00039861437 2.37754210613 0.000 0.000 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.004 -0.000 0.001 C -1.33887502024 -0.00450793845 4.73956848945 0.002 0.000 -0.004 C 0.02462671625 -0.00591801736 4.46614405978 -0.009 0.000 -0.010 C 0.43187566201 -0.00376957955 3.13352499014 -0.008 0.000 0.003 C -2.63984642995 0.00218980399 1.17162612704 0.000 -0.000 0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 -0.000 -0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.000 -0.000 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.003 0.000 -0.004 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 -0.000 -0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.004 0.000 0.006 Co 0.00000000000 0.00000000000 0.00000000000 0.000 -0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.000 0.000 -0.000 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 0.000 -0.000 C -2.24773885821 -0.00257631963 -3.67934971086 -0.000 -0.000 -0.000 C -1.33713102227 -0.00526459193 -4.73855802198 0.002 0.000 0.003 C 0.02654101484 -0.00591797621 -4.46472703619 -0.006 0.000 0.006 C 0.43371721952 -0.00363389350 -3.13225443930 -0.005 0.000 -0.002 S -6.53329279136 0.00637481657 -0.11611178087 0.000 -0.000 0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 0.001 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.002 -0.000 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.014 0.025 0.000 C 4.76783866331 0.00148799420 0.00346798881 0.003 0.003 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.056 -0.097 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.006 0.000 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 0.001 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.007 0.000 0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.012 -0.025 0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.037 -0.043 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.032 0.010 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.001 0.001 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 -0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.001 -0.005 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.050 0.003 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.047 0.101 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.138 0.159 0.001 C -0.35393854068 -3.21111942258 -0.00398541364 0.115 -0.037 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.003 -0.003 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.030 0.077 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.118 0.135 -0.001 H 3.39175422949 3.87200638269 -0.00704552340 0.019 0.003 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.099 -0.023 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.123 -0.316 -0.001 H -0.61749414542 -5.33746053721 -0.01121572048 -0.434 -0.498 -0.002 H -1.39833026435 -2.98175334118 -0.00345676225 -0.363 0.086 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.147 -0.024 -0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.044 -0.080 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.177 0.316 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.004 -0.000 -0.011 H 0.75224758084 -0.00860493512 -5.25016290812 0.018 -0.000 -0.019 H -3.29620044300 -0.00255800648 -3.88456579214 0.001 0.000 0.000 H 1.47161249279 -0.00457826661 -2.87685200854 0.015 -0.000 0.004 H -1.69176120521 -0.00597000955 5.75026973076 -0.004 -0.000 0.012 H 0.75025791005 -0.00892914887 5.25161119224 0.028 -0.000 0.030 H 1.46975366817 -0.00523069331 2.87805400798 0.027 -0.000 -0.007 H -3.29750276746 -0.00099200484 3.88584245085 0.013 0.000 -0.002 H -4.55513299541 0.00377930937 -2.13473279421 0.008 0.000 0.014 H -4.55107479454 0.00501307822 2.13844314827 0.011 -0.000 -0.020 H -6.83436893102 0.00806057203 1.19721860356 0.000 0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.000 0.000 0.000 61 Mode 178: freq=3453.00 N -0.44003451495 -0.00038510790 2.12369783068 -0.004 0.000 -0.003 C -1.76594470239 0.00039861437 2.37754210613 -0.003 -0.000 0.002 C -2.24923313135 -0.00145267054 3.67997125809 0.065 -0.000 -0.016 C -1.33887502024 -0.00450793845 4.73956848945 -0.031 -0.000 0.050 C 0.02462671625 -0.00591801736 4.46614405978 0.131 -0.001 0.150 C 0.43187566201 -0.00376957955 3.13352499014 0.149 -0.000 -0.048 C -2.63984642995 0.00218980399 1.17162612704 -0.005 0.000 -0.001 N -1.98513620489 0.00132140951 0.00153900685 -0.000 0.000 0.001 C -2.63911589169 0.00167522827 -1.17277445342 0.001 -0.000 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.016 0.000 -0.027 C -4.73391255267 0.00451580118 -0.00020876193 0.002 0.000 0.005 C -4.02924140493 0.00399189729 1.20660077672 0.052 -0.000 -0.091 Co 0.00000000000 0.00000000000 0.00000000000 0.000 -0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.001 -0.000 -0.001 C -1.76408906064 -0.00030645034 -2.37697009192 0.001 -0.000 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 -0.011 -0.000 -0.003 C -1.33713102227 -0.00526459193 -4.73855802198 0.010 0.000 0.019 C 0.02654101484 -0.00591797621 -4.46472703619 -0.040 0.000 0.046 C 0.43371721952 -0.00363389350 -3.13225443930 -0.044 0.000 -0.014 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 0.000 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.000 -0.000 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.001 0.002 0.000 C 4.76783866331 0.00148799420 0.00346798881 0.000 0.000 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.002 -0.004 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 0.000 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 0.000 0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.000 0.000 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.001 -0.003 0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.004 -0.005 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.004 0.001 0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.000 0.000 0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 -0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 -0.000 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.002 0.000 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.002 0.004 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.006 0.007 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.006 -0.002 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.000 -0.000 0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.003 0.008 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.014 0.016 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.000 0.000 0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.013 -0.003 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.005 -0.013 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.018 -0.021 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.017 0.004 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.005 -0.001 0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.004 -0.008 0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.007 0.012 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.022 -0.000 -0.061 H 0.75224758084 -0.00860493512 -5.25016290812 0.130 -0.000 -0.142 H -3.29620044300 -0.00255800648 -3.88456579214 0.040 -0.000 0.007 H 1.47161249279 -0.00457826661 -2.87685200854 0.141 -0.000 0.037 H -1.69176120521 -0.00597000955 5.75026973076 0.060 0.000 -0.162 H 0.75025791005 -0.00892914887 5.25161119224 -0.424 0.002 -0.463 H 1.46975366817 -0.00523069331 2.87805400798 -0.473 0.001 0.123 H -3.29750276746 -0.00099200484 3.88584245085 -0.223 0.000 0.041 H -4.55513299541 0.00377930937 -2.13473279421 0.050 -0.000 0.090 H -4.55107479454 0.00501307822 2.13844314827 -0.165 0.000 0.300 H -6.83436893102 0.00806057203 1.19721860356 -0.000 -0.000 0.001 H 6.86748209639 1.20005966818 0.00372860376 -0.000 -0.000 0.000 61 Mode 179: freq=3453.40 N -0.44003451495 -0.00038510790 2.12369783068 -0.001 0.000 -0.001 C -1.76594470239 0.00039861437 2.37754210613 -0.001 0.000 0.000 C -2.24923313135 -0.00145267054 3.67997125809 0.015 -0.000 -0.004 C -1.33887502024 -0.00450793845 4.73956848945 -0.010 -0.000 0.017 C 0.02462671625 -0.00591801736 4.46614405978 0.039 -0.000 0.044 C 0.43187566201 -0.00376957955 3.13352499014 0.044 -0.000 -0.014 C -2.63984642995 0.00218980399 1.17162612704 -0.002 0.000 -0.000 N -1.98513620489 0.00132140951 0.00153900685 -0.001 -0.000 -0.001 C -2.63911589169 0.00167522827 -1.17277445342 -0.006 0.000 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 0.054 -0.000 0.092 C -4.73391255267 0.00451580118 -0.00020876193 0.003 -0.000 -0.003 C -4.02924140493 0.00399189729 1.20660077672 0.016 -0.000 -0.028 Co 0.00000000000 0.00000000000 0.00000000000 0.000 -0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.004 0.000 0.003 C -1.76408906064 -0.00030645034 -2.37697009192 -0.003 -0.000 0.001 C -2.24773885821 -0.00257631963 -3.67934971086 0.020 0.000 0.008 C -1.33713102227 -0.00526459193 -4.73855802198 -0.036 -0.000 -0.070 C 0.02654101484 -0.00591797621 -4.46472703619 0.135 -0.000 -0.152 C 0.43371721952 -0.00363389350 -3.13225443930 0.149 -0.000 0.049 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 0.000 0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.000 0.000 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.000 0.000 0.000 C 4.06129317470 1.20536051565 0.00241240325 0.002 0.003 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.000 0.000 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.002 -0.004 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 0.000 0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 0.000 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 -0.000 0.000 0.000 C 1.45736908622 4.77231118002 -0.00917967851 -0.002 -0.003 0.000 C 0.08658913130 4.53522926787 -0.00833235387 0.005 -0.006 0.000 C -0.35359617412 3.21325694137 -0.00400174376 0.006 0.002 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.000 -0.000 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 -0.000 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.002 0.000 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.002 0.004 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.007 0.008 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.007 -0.002 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.000 0.000 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 0.004 0.010 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 -0.017 0.020 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 0.000 -0.000 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 -0.018 -0.004 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.005 -0.014 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.021 -0.024 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.021 0.005 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.005 -0.001 -0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.005 -0.010 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.007 0.012 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.080 0.000 0.222 H 0.75224758084 -0.00860493512 -5.25016290812 -0.432 0.002 0.471 H -3.29620044300 -0.00255800648 -3.88456579214 -0.078 0.000 -0.014 H 1.47161249279 -0.00457826661 -2.87685200854 -0.475 0.000 -0.124 H -1.69176120521 -0.00597000955 5.75026973076 0.020 0.000 -0.054 H 0.75025791005 -0.00892914887 5.25161119224 -0.126 0.001 -0.137 H 1.46975366817 -0.00523069331 2.87805400798 -0.141 0.000 0.037 H -3.29750276746 -0.00099200484 3.88584245085 -0.051 0.000 0.010 H -4.55513299541 0.00377930937 -2.13473279421 -0.170 0.000 -0.304 H -4.55107479454 0.00501307822 2.13844314827 -0.051 0.000 0.092 H -6.83436893102 0.00806057203 1.19721860356 -0.000 -0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.000 -0.000 -0.000 61 Mode 180: freq=3459.28 N -0.44003451495 -0.00038510790 2.12369783068 0.000 -0.000 0.002 C -1.76594470239 0.00039861437 2.37754210613 -0.001 -0.000 0.011 C -2.24923313135 -0.00145267054 3.67997125809 0.209 -0.000 -0.037 C -1.33887502024 -0.00450793845 4.73956848945 0.028 0.000 -0.093 C 0.02462671625 -0.00591801736 4.46614405978 -0.062 0.000 -0.065 C 0.43187566201 -0.00376957955 3.13352499014 -0.058 0.000 0.020 C -2.63984642995 0.00218980399 1.17162612704 -0.006 0.000 -0.001 N -1.98513620489 0.00132140951 0.00153900685 -0.001 -0.000 0.001 C -2.63911589169 0.00167522827 -1.17277445342 0.000 -0.000 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.009 0.000 -0.016 C -4.73391255267 0.00451580118 -0.00020876193 0.003 -0.000 0.006 C -4.02924140493 0.00399189729 1.20660077672 0.072 -0.000 -0.127 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.000 0.000 0.000 C -1.76408906064 -0.00030645034 -2.37697009192 0.000 0.000 0.001 C -2.24773885821 -0.00257631963 -3.67934971086 -0.026 0.000 -0.005 C -1.33713102227 -0.00526459193 -4.73855802198 -0.003 -0.000 -0.011 C 0.02654101484 -0.00591797621 -4.46472703619 0.007 -0.000 -0.007 C 0.43371721952 -0.00363389350 -3.13225443930 0.006 -0.000 0.002 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 0.000 0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.000 -0.000 0.000 C 4.06129317470 1.20536051565 0.00241240325 0.000 0.001 -0.000 C 4.76783866331 0.00148799420 0.00346798881 0.000 -0.000 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.000 -0.000 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 0.000 0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 -0.000 -0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.001 0.000 0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.000 0.000 0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.000 0.000 0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.000 -0.000 0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.000 0.000 -0.000 S 6.56718562933 -0.11349126889 0.00673479967 0.000 0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 0.000 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.000 -0.000 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.000 -0.000 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.000 -0.000 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 0.000 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.000 -0.000 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.000 -0.001 -0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.000 -0.000 -0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.003 -0.000 -0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.001 0.000 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.000 0.000 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 0.000 0.000 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.001 -0.000 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.001 0.000 -0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.001 -0.002 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.001 0.001 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.011 0.000 0.033 H 0.75224758084 -0.00860493512 -5.25016290812 -0.021 0.000 0.022 H -3.29620044300 -0.00255800648 -3.88456579214 0.084 -0.000 0.015 H 1.47161249279 -0.00457826661 -2.87685200854 -0.020 0.000 -0.005 H -1.69176120521 -0.00597000955 5.75026973076 -0.096 -0.000 0.277 H 0.75025791005 -0.00892914887 5.25161119224 0.187 -0.001 0.203 H 1.46975366817 -0.00523069331 2.87805400798 0.181 -0.000 -0.047 H -3.29750276746 -0.00099200484 3.88584245085 -0.674 0.000 0.124 H -4.55513299541 0.00377930937 -2.13473279421 0.030 -0.000 0.054 H -4.55107479454 0.00501307822 2.13844314827 -0.231 0.000 0.422 H -6.83436893102 0.00806057203 1.19721860356 -0.001 0.000 0.002 H 6.86748209639 1.20005966818 0.00372860376 -0.000 -0.000 0.000 61 Mode 181: freq=3460.36 N -0.44003451495 -0.00038510790 2.12369783068 0.000 -0.000 0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.000 -0.000 0.001 C -2.24923313135 -0.00145267054 3.67997125809 0.024 -0.000 -0.004 C -1.33887502024 -0.00450793845 4.73956848945 0.003 0.000 -0.010 C 0.02462671625 -0.00591801736 4.46614405978 -0.006 0.000 -0.006 C 0.43187566201 -0.00376957955 3.13352499014 -0.006 0.000 0.002 C -2.63984642995 0.00218980399 1.17162612704 -0.002 0.000 -0.000 N -1.98513620489 0.00132140951 0.00153900685 -0.001 0.000 -0.001 C -2.63911589169 0.00167522827 -1.17277445342 -0.008 0.000 0.001 C -4.02452897564 0.00329996303 -1.20791476641 0.091 -0.000 0.156 C -4.73391255267 0.00451580118 -0.00020876193 0.004 -0.000 -0.006 C -4.02924140493 0.00399189729 1.20660077672 0.011 -0.000 -0.020 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 -0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 -0.000 -0.000 -0.002 C -1.76408906064 -0.00030645034 -2.37697009192 -0.001 -0.000 -0.010 C -2.24773885821 -0.00257631963 -3.67934971086 0.199 -0.000 0.036 C -1.33713102227 -0.00526459193 -4.73855802198 0.022 0.000 0.080 C 0.02654101484 -0.00591797621 -4.46472703619 -0.046 0.000 0.048 C 0.43371721952 -0.00363389350 -3.13225443930 -0.042 0.000 -0.015 S -6.53329279136 0.00637481657 -0.11611178087 -0.000 0.000 0.000 N 2.00981687167 0.00259443239 -0.00000686048 0.000 -0.000 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.000 -0.000 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.001 0.001 0.000 C 4.76783866331 0.00148799420 0.00346798881 0.000 -0.000 -0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.000 -0.000 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.000 0.000 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 -0.000 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.001 0.000 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.000 0.000 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.000 0.000 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.000 -0.000 -0.000 N 0.49290585413 2.18198449515 -0.00068475564 0.000 0.000 0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.000 0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.000 0.000 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.000 -0.000 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.000 -0.000 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.000 0.000 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.000 0.000 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.000 -0.000 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.000 -0.001 0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.000 -0.000 0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.004 -0.001 0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.001 0.000 0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.000 -0.000 0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.000 -0.000 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.000 -0.000 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.002 0.000 0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.002 -0.003 0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.001 0.002 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 -0.081 -0.000 -0.236 H 0.75224758084 -0.00860493512 -5.25016290812 0.138 -0.001 -0.150 H -3.29620044300 -0.00255800648 -3.88456579214 -0.644 0.000 -0.118 H 1.47161249279 -0.00457826661 -2.87685200854 0.133 -0.000 0.035 H -1.69176120521 -0.00597000955 5.75026973076 -0.010 -0.000 0.030 H 0.75025791005 -0.00892914887 5.25161119224 0.019 -0.000 0.020 H 1.46975366817 -0.00523069331 2.87805400798 0.018 -0.000 -0.005 H -3.29750276746 -0.00099200484 3.88584245085 -0.079 0.000 0.014 H -4.55513299541 0.00377930937 -2.13473279421 -0.287 0.000 -0.515 H -4.55107479454 0.00501307822 2.13844314827 -0.035 0.000 0.064 H -6.83436893102 0.00806057203 1.19721860356 -0.001 -0.000 -0.001 H 6.86748209639 1.20005966818 0.00372860376 -0.000 -0.000 -0.000 61 Mode 182: freq=3463.13 N -0.44003451495 -0.00038510790 2.12369783068 0.000 0.000 -0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.000 0.000 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.001 -0.000 0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.000 -0.000 0.000 C 0.02462671625 -0.00591801736 4.46614405978 0.000 -0.000 0.000 C 0.43187566201 -0.00376957955 3.13352499014 0.000 -0.000 -0.000 C -2.63984642995 0.00218980399 1.17162612704 0.000 -0.000 0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 -0.000 0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.000 -0.000 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.000 -0.000 -0.001 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 -0.000 0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.000 0.000 0.001 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 -0.000 0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.000 0.000 0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 0.000 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 -0.001 -0.000 -0.000 C -1.33713102227 -0.00526459193 -4.73855802198 -0.000 -0.000 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 0.000 -0.000 -0.000 C 0.43371721952 -0.00363389350 -3.13225443930 0.000 -0.000 0.000 S -6.53329279136 0.00637481657 -0.11611178087 0.000 0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.001 -0.001 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.008 0.002 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.088 0.155 0.000 C 4.76783866331 0.00148799420 0.00346798881 0.004 -0.008 0.000 C 4.05723810074 -1.20352939940 0.00211502115 -0.010 0.016 -0.000 C 2.67108506586 -1.17139122066 0.00026591651 0.000 0.000 0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.002 -0.011 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.212 0.034 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.019 0.069 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.030 0.031 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.023 -0.008 0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.001 -0.001 0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.000 0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 0.000 -0.001 -0.000 C 2.33969079820 -3.68709653410 -0.00625612120 -0.024 0.004 0.000 C 1.45789786198 -4.76953179608 -0.00945089783 -0.002 0.008 0.000 C 0.08684213972 -4.53272927032 -0.00840538011 0.003 0.003 0.000 C -0.35393854068 -3.21111942258 -0.00398541364 0.003 -0.001 -0.000 N 0.49225266031 -2.17934076887 -0.00084210065 0.000 -0.000 -0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.075 -0.201 0.001 H -0.61802819388 5.33967450634 -0.01131742088 0.087 -0.099 0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.690 -0.109 0.001 H -1.39787683933 2.98334799634 -0.00369736757 0.071 0.017 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 0.008 -0.022 -0.000 H -0.61749414542 -5.33746053721 -0.01121572048 -0.009 -0.010 -0.000 H -1.39833026435 -2.98175334118 -0.00345676225 -0.008 0.002 0.000 H 3.39230213722 -3.86796714602 -0.00754158092 0.077 -0.012 -0.000 H 4.58301895157 2.13678100538 0.00314824260 -0.282 -0.516 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 0.031 -0.056 -0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.000 0.000 0.001 H 0.75224758084 -0.00860493512 -5.25016290812 -0.001 0.000 0.001 H -3.29620044300 -0.00255800648 -3.88456579214 0.003 0.000 0.001 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 0.000 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 0.000 0.000 -0.001 H 0.75025791005 -0.00892914887 5.25161119224 -0.001 0.000 -0.001 H 1.46975366817 -0.00523069331 2.87805400798 -0.000 0.000 0.000 H -3.29750276746 -0.00099200484 3.88584245085 0.003 0.000 -0.001 H -4.55513299541 0.00377930937 -2.13473279421 0.001 0.000 0.002 H -4.55107479454 0.00501307822 2.13844314827 0.001 0.000 -0.002 H -6.83436893102 0.00806057203 1.19721860356 0.000 -0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.001 -0.002 0.000 61 Mode 183: freq=3464.87 N -0.44003451495 -0.00038510790 2.12369783068 0.000 -0.000 -0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.000 -0.000 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.001 0.000 0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.000 0.000 0.000 C 0.02462671625 -0.00591801736 4.46614405978 0.000 0.000 0.000 C 0.43187566201 -0.00376957955 3.13352499014 0.000 0.000 -0.000 C -2.63984642995 0.00218980399 1.17162612704 0.000 0.000 0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 0.000 0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.000 0.000 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.000 0.000 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 0.000 0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.000 0.000 0.000 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.000 -0.000 0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 -0.000 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 -0.000 0.000 -0.000 C -1.33713102227 -0.00526459193 -4.73855802198 -0.000 -0.000 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 0.000 0.000 -0.000 C 0.43371721952 -0.00363389350 -3.13225443930 0.000 0.000 0.000 S -6.53329279136 0.00637481657 -0.11611178087 0.000 -0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.001 0.001 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.002 0.000 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.012 0.021 0.000 C 4.76783866331 0.00148799420 0.00346798881 0.005 0.007 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.103 -0.176 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.010 -0.001 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 -0.001 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.021 0.003 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.002 0.006 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.003 0.003 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.002 -0.001 0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.000 -0.000 0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.001 -0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.002 0.009 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.194 -0.031 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.015 -0.058 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.023 -0.023 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.017 0.006 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.001 0.001 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.007 -0.018 0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.008 -0.009 0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.068 -0.011 0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.006 0.001 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.062 0.168 0.001 H -0.61749414542 -5.33746053721 -0.01121572048 0.064 0.073 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.053 -0.012 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.633 0.099 0.001 H 4.58301895157 2.13678100538 0.00314824260 -0.036 -0.066 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.324 0.585 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.000 -0.000 0.001 H 0.75224758084 -0.00860493512 -5.25016290812 -0.001 -0.000 0.001 H -3.29620044300 -0.00255800648 -3.88456579214 0.002 -0.000 0.000 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 -0.000 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 0.000 -0.000 -0.001 H 0.75025791005 -0.00892914887 5.25161119224 -0.001 -0.000 -0.001 H 1.46975366817 -0.00523069331 2.87805400798 -0.000 -0.000 0.000 H -3.29750276746 -0.00099200484 3.88584245085 0.002 -0.000 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.001 -0.000 0.001 H -4.55107479454 0.00501307822 2.13844314827 0.001 -0.000 -0.001 H -6.83436893102 0.00806057203 1.19721860356 0.000 -0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.001 0.001 0.000 61 Mode 184: freq=3464.87 N -0.44003451495 -0.00038510790 2.12369783068 0.000 -0.000 -0.000 C -1.76594470239 0.00039861437 2.37754210613 -0.000 -0.000 -0.000 C -2.24923313135 -0.00145267054 3.67997125809 -0.001 0.000 0.000 C -1.33887502024 -0.00450793845 4.73956848945 -0.000 0.000 0.000 C 0.02462671625 -0.00591801736 4.46614405978 0.000 0.000 0.000 C 0.43187566201 -0.00376957955 3.13352499014 0.000 0.000 -0.000 C -2.63984642995 0.00218980399 1.17162612704 0.000 0.000 0.000 N -1.98513620489 0.00132140951 0.00153900685 0.000 0.000 0.000 C -2.63911589169 0.00167522827 -1.17277445342 0.000 0.000 -0.000 C -4.02452897564 0.00329996303 -1.20791476641 -0.000 0.000 -0.000 C -4.73391255267 0.00451580118 -0.00020876193 -0.000 0.000 0.000 C -4.02924140493 0.00399189729 1.20660077672 -0.000 0.000 0.000 Co 0.00000000000 0.00000000000 0.00000000000 -0.000 0.000 -0.000 N -0.43839318333 -0.00054206762 -2.12229806799 0.000 -0.000 0.000 C -1.76408906064 -0.00030645034 -2.37697009192 -0.000 -0.000 0.000 C -2.24773885821 -0.00257631963 -3.67934971086 -0.000 0.000 -0.000 C -1.33713102227 -0.00526459193 -4.73855802198 -0.000 -0.000 -0.000 C 0.02654101484 -0.00591797621 -4.46472703619 0.000 0.000 -0.000 C 0.43371721952 -0.00363389350 -3.13225443930 0.000 0.000 0.000 S -6.53329279136 0.00637481657 -0.11611178087 0.000 -0.000 -0.000 N 2.00981687167 0.00259443239 -0.00000686048 -0.001 0.001 -0.000 C 2.67119656792 1.17263645248 0.00045766926 -0.002 0.000 -0.000 C 4.06129317470 1.20536051565 0.00241240325 0.012 0.021 0.000 C 4.76783866331 0.00148799420 0.00346798881 0.005 0.007 0.000 C 4.05723810074 -1.20352939940 0.00211502115 0.103 -0.176 0.000 C 2.67108506586 -1.17139122066 0.00026591651 -0.010 -0.001 -0.000 C 1.82209539371 2.39842937406 -0.00175320633 -0.000 -0.001 0.000 C 2.33938959521 3.68993217240 -0.00584554905 0.021 0.003 -0.000 C 1.45736908622 4.77231118002 -0.00917967851 0.002 0.006 -0.000 C 0.08658913130 4.53522926787 -0.00833235387 -0.003 0.003 -0.000 C -0.35359617412 3.21325694137 -0.00400174376 -0.002 -0.001 0.000 N 0.49290585413 2.18198449515 -0.00068475564 -0.000 -0.000 0.000 S 6.56718562933 -0.11349126889 0.00673479967 -0.001 -0.000 -0.000 C 1.82142022278 -2.39594383179 -0.00206827421 -0.002 0.009 0.000 C 2.33969079820 -3.68709653410 -0.00625612120 0.194 -0.031 -0.000 C 1.45789786198 -4.76953179608 -0.00945089783 0.015 -0.058 -0.000 C 0.08684213972 -4.53272927032 -0.00840538011 -0.023 -0.023 -0.000 C -0.35393854068 -3.21111942258 -0.00398541364 -0.017 0.006 0.000 N 0.49225266031 -2.17934076887 -0.00084210065 -0.001 0.001 0.000 H 1.83694111827 5.77332096953 -0.01265611066 -0.007 -0.018 0.000 H -0.61802819388 5.33967450634 -0.01131742088 0.008 -0.009 0.000 H 3.39175422949 3.87200638269 -0.00704552340 -0.068 -0.011 0.000 H -1.39787683933 2.98334799634 -0.00369736757 0.006 0.001 -0.000 H 1.83794742242 -5.77033326187 -0.01295832570 -0.062 0.168 0.001 H -0.61749414542 -5.33746053721 -0.01121572048 0.064 0.073 0.000 H -1.39833026435 -2.98175334118 -0.00345676225 0.053 -0.012 -0.000 H 3.39230213722 -3.86796714602 -0.00754158092 -0.633 0.099 0.001 H 4.58301895157 2.13678100538 0.00314824260 -0.036 -0.066 -0.000 H 4.58784714512 -2.12983634010 0.00211631073 -0.324 0.585 0.000 H -1.68997263563 -0.00719388386 -5.74925805817 0.000 -0.000 0.001 H 0.75224758084 -0.00860493512 -5.25016290812 -0.001 -0.000 0.001 H -3.29620044300 -0.00255800648 -3.88456579214 0.002 -0.000 0.000 H 1.47161249279 -0.00457826661 -2.87685200854 -0.000 -0.000 -0.000 H -1.69176120521 -0.00597000955 5.75026973076 0.000 -0.000 -0.001 H 0.75025791005 -0.00892914887 5.25161119224 -0.001 -0.000 -0.001 H 1.46975366817 -0.00523069331 2.87805400798 -0.000 -0.000 0.000 H -3.29750276746 -0.00099200484 3.88584245085 0.002 -0.000 -0.000 H -4.55513299541 0.00377930937 -2.13473279421 0.001 -0.000 0.001 H -4.55107479454 0.00501307822 2.13844314827 0.001 -0.000 -0.001 H -6.83436893102 0.00806057203 1.19721860356 0.000 -0.000 -0.000 H 6.86748209639 1.20005966818 0.00372860376 -0.001 0.001 0.000 v_sim-3.7.0/examples/values.xml0000644000353400050620000000145312215546211013422 00000000000000 v_sim-3.7.0/Documentation/0000755000353400050620000000000012216331354012452 500000000000000v_sim-3.7.0/Documentation/Makefile.am0000644000353400050620000000073412215546176014443 00000000000000v_simlegal_DATA = \ authors \ licence.en.txt \ licence.fr.txt \ readme \ pot2surf_help man1_MANS = $(PACKAGE).1 v_sim.1: $(srcdir)/v_sim.cli.xml $(srcdir)/man.xsl xsltproc $(srcdir)/man.xsl $(srcdir)/v_sim.cli.xml > v_sim.1 v_sim-dev.1: $(srcdir)/v_sim.cli.xml $(srcdir)/man.xsl xsltproc $(srcdir)/man.xsl $(srcdir)/v_sim.cli.xml > v_sim-dev.1 EXTRA_DIST = $(v_simlegal_DATA) $(man1_MANS) man.xsl v_sim.cli.xml CLEANFILES = v_sim-dev.1 v_sim.1 SUBDIRS = reference v_sim-3.7.0/Documentation/Makefile.in0000644000353400050620000006321112216330210014430 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = Documentation DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/abinit.m4 \ $(top_srcdir)/m4/ax_check_gl.m4 \ $(top_srcdir)/m4/ax_check_glu.m4 \ $(top_srcdir)/m4/ax_lang_compiler_ms.m4 \ $(top_srcdir)/m4/ax_lapack.m4 $(top_srcdir)/m4/bigdft.m4 \ $(top_srcdir)/m4/etsf_io.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/libxc.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/netcdf.m4 \ $(top_srcdir)/m4/python.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(v_simlegaldir)" NROFF = nroff MANS = $(man1_MANS) DATA = $(v_simlegal_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" AB_CPPFLAGS = @AB_CPPFLAGS@ AB_LIBS = @AB_LIBS@ ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIGDFT_CPPFLAGS = @BIGDFT_CPPFLAGS@ BIGDFT_LIBS = @BIGDFT_LIBS@ BLAS_LIBS = @BLAS_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETSF_IO_LIBS = @ETSF_IO_LIBS@ EXEEXT = @EXEEXT@ EXTRA_CFLAGS = @EXTRA_CFLAGS@ EXTRA_LDFLAGS = @EXTRA_LDFLAGS@ EXTRA_LIBS = @EXTRA_LIBS@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ FCLIBS = @FCLIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLIBS = @FLIBS@ FONT_BOLD = @FONT_BOLD@ FONT_NORMAL = @FONT_NORMAL@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_BIGDFT_CFLAGS = @GLIB_BIGDFT_CFLAGS@ GLIB_BIGDFT_LIBS = @GLIB_BIGDFT_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GOBJECT_INTROSPECTION_REQUIRED = @GOBJECT_INTROSPECTION_REQUIRED@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTKS_CFLAGS = @GTKS_CFLAGS@ GTKS_LIBS = @GTKS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_SCANNER = @G_IR_SCANNER@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LAPACK_LIBS = @LAPACK_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXC_LIBS = @LIBXC_LIBS@ LIB_ARCHIVE_CFLAGS = @LIB_ARCHIVE_CFLAGS@ LIB_ARCHIVE_LIBS = @LIB_ARCHIVE_LIBS@ LIB_YAML_CFLAGS = @LIB_YAML_CFLAGS@ LIB_YAML_LIBS = @LIB_YAML_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NC_CPPFLAGS = @NC_CPPFLAGS@ NC_LDFLAGS = @NC_LDFLAGS@ NC_LIBS = @NC_LIBS@ NC_NETCDF_3_CPPFLAG = @NC_NETCDF_3_CPPFLAG@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBABEL_CFLAGS = @OPENBABEL_CFLAGS@ OPENBABEL_LIBS = @OPENBABEL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PYGOBJECT_CFLAGS = @PYGOBJECT_CFLAGS@ PYGOBJECT_LIBS = @PYGOBJECT_LIBS@ PYGOBJECT_REQUIRED = @PYGOBJECT_REQUIRED@ PYGTK_CFLAGS = @PYGTK_CFLAGS@ PYGTK_LIBS = @PYGTK_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_INCLUDES = @PYTHON_INCLUDES@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ V_SIM_MAJOR_VERSION = @V_SIM_MAJOR_VERSION@ V_SIM_MICRO_VERSION = @V_SIM_MICRO_VERSION@ V_SIM_MINOR_VERSION = @V_SIM_MINOR_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ girdir = @girdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ lib_v_sim_version = @lib_v_sim_version@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typelibsdir = @typelibsdir@ v_simexamplesdir = @v_simexamplesdir@ v_simexedir = @v_simexedir@ v_simiconsdir = @v_simiconsdir@ v_simlegaldir = @v_simlegaldir@ v_simpixmapsdir = @v_simpixmapsdir@ v_simpluginsdir = @v_simpluginsdir@ v_simresourcesdir = @v_simresourcesdir@ visupyexecdir = @visupyexecdir@ visutypelibsdir = @visutypelibsdir@ v_simlegal_DATA = \ authors \ licence.en.txt \ licence.fr.txt \ readme \ pot2surf_help man1_MANS = $(PACKAGE).1 EXTRA_DIST = $(v_simlegal_DATA) $(man1_MANS) man.xsl v_sim.cli.xml CLEANFILES = v_sim-dev.1 v_sim.1 SUBDIRS = reference all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Documentation/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Documentation/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man1_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list='$(man1_MANS)'; test -n "$(man1dir)" || exit 0; \ { for i in $$list; do echo "$$i"; done; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(man1_MANS)'; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-v_simlegalDATA: $(v_simlegal_DATA) @$(NORMAL_INSTALL) test -z "$(v_simlegaldir)" || $(MKDIR_P) "$(DESTDIR)$(v_simlegaldir)" @list='$(v_simlegal_DATA)'; test -n "$(v_simlegaldir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(v_simlegaldir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(v_simlegaldir)" || exit $$?; \ done uninstall-v_simlegalDATA: @$(NORMAL_UNINSTALL) @list='$(v_simlegal_DATA)'; test -n "$(v_simlegaldir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(v_simlegaldir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(MANS) $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(v_simlegaldir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-man install-v_simlegalDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-man1 install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-man uninstall-v_simlegalDATA uninstall-man: uninstall-man1 .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-man1 install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ install-v_simlegalDATA installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-man uninstall-man1 \ uninstall-v_simlegalDATA v_sim.1: $(srcdir)/v_sim.cli.xml $(srcdir)/man.xsl xsltproc $(srcdir)/man.xsl $(srcdir)/v_sim.cli.xml > v_sim.1 v_sim-dev.1: $(srcdir)/v_sim.cli.xml $(srcdir)/man.xsl xsltproc $(srcdir)/man.xsl $(srcdir)/v_sim.cli.xml > v_sim-dev.1 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: v_sim-3.7.0/Documentation/authors0000644000353400050620000000166112215546176014017 00000000000000*Luc Billard* Now on retirement Creator (all versions until 2.2) *Damien Caliste* damien.caliste (AT) cea.fr Developer and maintainer *Olivier D'Astier* dastier (AT) iie.cnam.fr Contributor (spin rendering method, portage of isosurfaces code from an older version) *Aurlien Lherbier* aurelien.lherbier (AT) cea.fr Contributor (non-linear mesh grid for densities, isolines) *Jrmy Blanc* Jeremy.Blanc (AT) bvra.etu.upmf-grenoble.fr Contributor (phonon visualisation) *Simon Plans* simon.planes (AT) laposte.net Contributor (loop selection visualisation) *Thomas Jourdan* Thomas.Jourdan (AT) cea.fr Contributor (torus representation) *Yoann Ratao* Ratao.yoann (AT) hotmail.fr Contributor (scale drawing) *Tristan Berthelot* tristan.berthelot (AT) isen.fr Contributor (GI integration) *Trung Vu* trungvp2000 (AT) yahoo.fr Contributor (adaptive colour map) v_sim-3.7.0/Documentation/licence.en.txt0000644000353400050620000005431112215546176015153 00000000000000 FREE SOFTWARE LICENSING AGREEMENT CeCILL ======================================== Notice ------ This Agreement is a free software license that is the result of discussions between its authors in order to ensure compliance with the two main principles guiding its drafting: - firstly, its conformity with French law, both as regards the law of torts and intellectual property law, and the protection that it offers to authors and the holders of economic rights over software. - secondly, compliance with the principles for the distribution of free software: access to source codes, extended user-rights. The following bodies are the authors of this license CeCILL (Ce : CEA, C : CNRS, I : INRIA, LL : Logiciel Libre): Commissariat l'Energie Atomique - CEA, a public scientific, technical and industrial establishment, having its principal place of business at 31-33 rue de la Fdration, 75752 PARIS cedex 15, France. Centre National de la Recherche Scientifique - CNRS, a public scientific and technological establishment, having its principal place of business at 3 rue Michel-Ange 75794 Paris cedex 16, France. Institut National de Recherche en Informatique et en Automatique - INRIA, a public scientific and technological establishment, having its principal place of business at Domaine de Voluceau, Rocquencourt, BP 105, 78153 Le Chesnay cedex. PREAMBLE -------- The purpose of this Free Software Licensing Agreement is to grant users the right to modify and redistribute the software governed by this license within the framework of an "open source" distribution model. The exercising of these rights is conditional upon certain obligations for users so as to ensure that this status is retained for subsequent redistribution operations. As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the successive licensors only have limited liability. In this respect, it is brought to the user's attention that the risks associated with loading, using, modifying and/or developing or reproducing the software by the user given its nature of Free Software, that may mean that it is complicated to manipulate, and that also therefore means that it is reserved for developers and experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the Software's suitability as regards their requirements in conditions enabling the security of their systems and/or data to be ensured and, more generally, to use and operate it in the same conditions of security. This Agreement may be freely reproduced and published, provided it is not altered, and that no Articles are either added or removed herefrom. This Agreement may apply to any or all software for which the holder of the economic rights decides to submit the operation thereof to its provisions. Article 1 - DEFINITIONS ------------------------ For the purposes of this Agreement, when the following expressions commence with a capital letter, they shall have the following meaning: Agreement: means this Licensing Agreement, and any or all of its subsequent versions. Software: means the software in its Object Code and/or Source Code form and, where applicable, its documentation, "as is" at the time when the Licensee accepts the Agreement. Initial Software: means the Software in its Source Code and/or Object Code form and, where applicable, its documentation, "as is" at the time when it is distributed for the first time under the terms and conditions of the Agreement. Modified Software: means the Software modified by at least one Contribution. Source Code: means all the Software's instructions and program lines to which access is required so as to modify the Software. Object Code: means the binary files originating from the compilation of the Source Code. Holder: means the holder of the economic rights over the Initial Software. Licensee(s): mean(s) the Software user(s) having accepted the Agreement. Contributor: means a Licensee having made at least one Contribution. Licensor: means the Holder, or any or all other individual or legal entity, that distributes the Software under the Agreement. Contributions: mean any or all modifications, corrections, translations, adaptations and/or new functionalities integrated into the Software by any or all Contributor, and the Static Modules. Module: means a set of sources files including their documentation that, once compiled in executable form, enables supplementary functionalities or services to be developed in addition to those offered by the Software. Dynamic Module: means any or all module, created by the Contributor, that is independent of the Software, so that this module and the Software are in two different executable forms that are run in separate address spaces, with one calling the other when they are run. Static Module: means any or all module, created by the Contributor and connected to the Software by a static link that makes their object codes interdependent. This module and the Software to which it is connected, are combined in a single executable. Parties: mean both the Licensee and the Licensor. These expressions may be used both in singular and plural form. Article 2 - PURPOSE ------------------- The purpose of the Agreement is to enable the Licensor to grant the Licensee a free, non-exclusive, transferable and worldwide License for the Software as set forth in Article 5 hereinafter for the whole term of protection of the rights over said Software. Article 3 - ACCEPTANCE ---------------------- 3.1. The Licensee shall be deemed as having accepted the terms and conditions of this Agreement by the occurrence of the first of the following events: - (i) loading the Software by any or all means, notably, by downloading from a remote server, or by loading from a physical medium; - (ii) the first time the Licensee exercises any of the rights granted hereunder. 3.2. One copy of the Agreement, containing a notice relating to the specific nature of the Software, to the limited warranty, and to the limitation to use by experienced users has been provided to the Licensee prior to its acceptance as set forth in Article 3.1 hereinabove, and the Licensee hereby acknowledges that it is aware thereof. Article 4 - EFFECTIVE DATE AND TERM ----------------------------------- 4.1. EFFECTIVE DATE The Agreement shall become effective on the date when it is accepted by the Licensee as set forth in Article 3.1. 4.2. TERM The Agreement shall remain in force during the whole legal term of protection of the economic rights over the Software. Article 5 - SCOPE OF THE RIGHTS GRANTED --------------------------------------- The Licensor hereby grants to the Licensee, that accepts such, the following rights as regards the Software for any or all use, and for the term of the Agreement, on the basis of the terms and conditions set forth hereinafter. Otherwise, the Licensor grants to the Licensee free of charge exploitation rights on the patents he holds on whole or part of the inventions implemented in the Software. 5.1. RIGHTS OF USE The Licensee is authorized to use the Software, unrestrictedly, as regards the fields of application, with it being hereinafter specified that this relates to: - permanent or temporary reproduction of all or part of the Software by any or all means and in any or all form. - loading, displaying, running, or storing the Software on any or all medium. - entitlement to observe, study or test the operation thereof so as to establish the ideas and principles that form the basis for any or all constituent elements of said Software. This shall apply when the Licensee carries out any or all loading, displaying, running, transmission or storage operation as regards the Software, that it is entitled to carry out hereunder. 5.2. entitlement to make CONTRIBUTIONS The right to make Contributions includes the right to translate, adapt, arrange, or make any or all modification to the Software, and the right to reproduce the resulting Software. The Licensee is authorized to make any or all Contribution to the Software provided that it explicitly mentions its name as the author of said Contribution and the date of the development thereof. 5.3. DISTRIBUTION AND PUBLICATION RIGHTS In particular, the right of distribution and publication includes the right to transmit and communicate the Software to the general public on any or all medium, and by any or all means, and the right to market, either in consideration of a fee, or free of charge, a copy or copies of the Software by means of any or all process. The Licensee is further authorized to redistribute copies of the modified or unmodified Software to third parties according to the terms and conditions set forth hereinafter. 5.3.1. REDISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION The Licensee is authorized to redistribute true copies of the Software in Source Code or Object Code form, provided that said redistribution complies with all the provisions of the Agreement and is accompanied by: - a copy of the Agreement, - a notice relating to the limitation of both the Licensor's warranty and liability as set forth in Articles 8 and 9, and that, in the event that only the Software's Object Code is redistributed, the Licensee allows future Licensees unhindered access to the Software's full Source Code by providing them with the terms and conditions for access thereto, it being understood that the additional cost of acquiring the Source Code shall not exceed the cost of transferring the data. 5.3.2. REDISTRIBUTION OF MODIFIED SOFTWARE When the Licensee makes a Contribution to the Software, the terms and conditions for the redistribution of the Modified Software shall then be subject to all the provisions hereof. The Licensee is authorized to redistribute the Modified Software, in Source Code or Object Code form, provided that said redistribution complies with all the provisions of the Agreement and is accompanied by: - a copy of the Agreement, - a notice relating to the limitation of both the Licensor's warranty and liability as set forth in Articles 8 and 9, and that, in the event that only the Modified Software's Object Code is redistributed, the Licensee allows future Licensees unhindered access to the Modified Software's full Source Code by providing them with the terms and conditions for access thereto, it being understood that the additional cost of acquiring the Source Code shall not exceed the cost of transferring the data. 5.3.3. redistribution OF DYNAMIC MODULES When the Licensee has developed a Dynamic Module, the terms and conditions hereof do not apply to said Dynamic Module, that may be distributed under a separate Licensing Agreement. 5.3.4. COMPATIBILITY WITH THE GPL LICENSE In the event that the Modified or unmodified Software is included in a code that is subject to the provisions of the GPL License, the Licensee is authorized to redistribute the whole under the GPL License. In the event that the Modified Software includes a code that is subject to the provisions of the GPL License, the Licensee is authorized to redistribute the Modified Software under the GPL License. Article 6 - INTELLECTUAL PROPERTY ---------------------------------- 6.1. OVER THE INITIAL SOFTWARE The Holder owns the economic rights over the Initial Software. Any or all use of the Initial Software is subject to compliance with the terms and conditions under which the Holder has elected to distribute its work and no one shall be entitled to and it shall have sole entitlement to modify the terms and conditions for the distribution of said Initial Software. The Holder undertakes to maintain the distribution of the Initial Software under the conditions of the Agreement, for the duration set forth in article 4.2.. 6.2. OVER THE CONTRIBUTIONS The intellectual property rights over the Contributions belong to the holder of the economic rights as designated by effective legislation. 6.3. OVER THE DYNAMIC MODULES The Licensee having developed a Dynamic Module is the holder of the intellectual property rights over said Dynamic Module and is free to choose the agreement that shall govern its distribution. 6.4. JOINT PROVISIONS 6.4.1. The Licensee expressly undertakes: - not to remove, or modify, in any or all manner, the intellectual property notices affixed to the Software; - to reproduce said notices, in an identical manner, in the copies of the Software. 6.4.2. The Licensee undertakes not to directly or indirectly infringe the intellectual property rights of the Holder and/or Contributors and to take, where applicable, vis--vis its staff, any or all measures required to ensure respect for said intellectual property rights of the Holder and/or Contributors. Article 7 - RELATED SERVICES ----------------------------- 7.1. Under no circumstances shall the Agreement oblige the Licensor to provide technical assistance or maintenance services for the Software. However, the Licensor is entitled to offer this type of service. The terms and conditions of such technical assistance, and/or such maintenance, shall then be set forth in a separate instrument. Only the Licensor offering said maintenance and/or technical assistance services shall incur liability therefor. 7.2. Similarly, any or all Licensor shall be entitled to offer to its Licensees, under its own responsibility, a warranty, that shall only be binding upon itself, for the redistribution of the Software and/or the Modified Software, under terms and conditions that it shall decide upon itself. Said warranty, and the financial terms and conditions of its application, shall be subject to a separate instrument executed between the Licensor and the Licensee. Article 8 - LIABILITY ---------------------- 8.1. Subject to the provisions of Article 8.2, should the Licensor fail to fulfill all or part of its obligations hereunder, the Licensee shall be entitled to claim compensation for the direct loss suffered as a result of a fault on the part of the Licensor, subject to providing evidence of it. 8.2. The Licensor's liability is limited to the commitments made under this Licensing Agreement and shall not be incurred as a result , in particular: (i) of loss due the Licensee's total or partial failure to fulfill its obligations, (ii) direct or consequential loss due to the Software's use or performance that is suffered by the Licensee, when the latter is a professional using said Software for professional purposes and (iii) consequential loss due to the Software's use or performance. The Parties expressly agree that any or all pecuniary or business loss (i.e. loss of data, loss of profits, operating loss, loss of customers or orders, opportunity cost, any disturbance to business activities) or any or all legal proceedings instituted against the Licensee by a third party, shall constitute consequential loss and shall not provide entitlement to any or all compensation from the Licensor. Article 9 - WARRANTY --------------------- 9.1. The Licensee acknowledges that the current situation as regards scientific and technical know-how at the time when the Software was distributed did not enable all possible uses to be tested and verified, nor for the presence of any or all faults to be detected. In this respect, the Licensee's attention has been drawn to the risks associated with loading, using, modifying and/or developing and reproducing the Software that are reserved for experienced users. The Licensee shall be responsible for verifying, by any or all means, the product's suitability for its requirements, its due and proper functioning, and for ensuring that it shall not cause damage to either persons or property. 9.2. The Licensor hereby represents, in good faith, that it is entitled to grant all the rights on the Software (including in particular the rights set forth in Article 5 hereof over the Software). 9.3. The Licensee acknowledges that the Software is supplied "as is" by the Licensor without any or all other express or tacit warranty, other than that provided for in Article 9.2 and, in particular, without any or all warranty as to its market value, its secured, innovative or relevant nature. Specifically, the Licensor does not warrant that the Software is free from any or all error, that it shall operate continuously, that it shall be compatible with the Licensee's own equipment and its software configuration, nor that it shall meet the Licensee's requirements. 9.4. The Licensor does not either expressly or tacitly warrant that the Software does not infringe any or all third party intellectual right relating to a patent, software or to any or all other property right. Moreover, the Licensor shall not hold the Licensee harmless against any or all proceedings for infringement that may be instituted in respect of the use, modification and redistribution of the Software. Nevertheless, should such proceedings be instituted against the Licensee, the Licensor shall provide it with technical and legal assistance for its defense. Such technical and legal assistance shall be decided upon on a case-by-case basis between the relevant Licensor and the Licensee pursuant to a memorandum of understanding. The Licensor disclaims any or all liability as regards the Licensee's use of the Software's name. No warranty shall be provided as regards the existence of prior rights over the name of the Software and as regards the existence of a trademark. Article 10 - TERMINATION ------------------------- 10.1. In the event of a breach by the Licensee of its obligations hereunder, the Licensor may automatically terminate this Agreement thirty (30) days after notice has been sent to the Licensee and has remained ineffective. 10.2. The Licensee whose Agreement is terminated shall no longer be authorized to use, modify or distribute the Software. However, any or all licenses that it may have granted prior to termination of the Agreement shall remain valid subject to their having been granted in compliance with the terms and conditions hereof. Article 11 - MISCELLANEOUS PROVISIONS -------------------------------------- 11.1. EXCUSABLE EVENTS Neither Party shall be liable for any or all delay, or failure to perform the Agreement, that may be attributable to an event of force majeure, an act of God or an outside cause, such as, notably, defective functioning, or interruptions affecting the electricity or telecommunications networks, blocking of the network following a virus attack, the intervention of the government authorities, natural disasters, water damage, earthquakes, fire, explosions, strikes and labor unrest, war, etc. 11.2. The fact that either Party may fail, on one or several occasions, to invoke one or several of the provisions hereof, shall under no circumstances be interpreted as being a waiver by the interested Party of its entitlement to invoke said provision(s) subsequently. 11.3. The Agreement cancels and replaces any or all previous agreement, whether written or oral, between the Parties and having the same purpose, and constitutes the entirety of the agreement between said Parties concerning said purpose. No supplement or modification to the terms and conditions hereof shall be effective as regards the Parties unless it is made in writing and signed by their duly authorized representatives. 11.4. In the event that one or several of the provisions hereof were to conflict with a current or future applicable act or legislative text, said act or legislative text shall take precedence, and the Parties shall make the necessary amendments so as to be in compliance with said act or legislative text. All the other provisions shall remain effective. Similarly, the fact that a provision of the Agreement may be null and void, for any reason whatsoever, shall not cause the Agreement as a whole to be null and void. 11.5. LANGUAGE The Agreement is drafted in both French and English. In the event of a conflict as regards construction, the French version shall be deemed authentic. Article 12 - NEW VERSIONS OF THE AGREEMENT ------------------------------------------- 12.1. Any or all person is authorized to duplicate and distribute copies of this Agreement. 12.2. So as to ensure coherence, the wording of this Agreement is protected and may only be modified by the authors of the License, that reserve the right to periodically publish updates or new versions of the Agreement, each with a separate number. These subsequent versions may address new issues encountered by Free Software. 12.3. Any or all Software distributed under a given version of the Agreement may only be subsequently distributed under the same version of the Agreement, or a subsequent version, subject to the provisions of article 5.3.4. Article 13 - GOVERNING LAW AND JURISDICTION ------------------------------------------- 13.1. The Agreement is governed by French law. The Parties agree to endeavor to settle the disagreements or disputes that may arise during the performance of the Agreement out-of-court. 13.2. In the absence of an out-of-court settlement within two (2) months as from their occurrence, and unless emergency proceedings are necessary, the disagreements or disputes shall be referred to the Paris Courts having jurisdiction, by the first Party to take action. Version 1.1 of 10/26/2004 v_sim-3.7.0/Documentation/licence.fr.txt0000754000353400050620000005425412215546176015170 00000000000000 CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL =========================================== Avertissement ------------- Ce contrat est une licence de logiciel libre issue d'une concertation entre ses auteurs afin que le respect de deux grands principes prside sa rdaction : - d'une part, sa conformit au droit franais, tant au regard du droit de la responsabilit civile que du droit de la proprit intellectuelle et de la protection qu'il offre aux auteurs et titulaires des droits patrimoniaux sur un logiciel. - d'autre part, le respect des principes de diffusion des logiciels libres : accs au code source, droits tendus confrs aux utilisateurs. Les auteurs de la cette licence CeCILL (Ce : CEA, C : CNRS, I : INRIA, LL : Logiciel Libre) sont : Commissariat l'Energie Atomique - CEA, tablissement public de caractre scientifique technique et industriel, dont le sige est situ 31-33 rue de la Fdration, 75752 PARIS cedex 15. Centre National de la Recherche Scientifique - CNRS, tablissement public caractre scientifique et technologique, dont le sige est situ 3 rue Michel-Ange 75794 Paris cedex 16. Institut National de Recherche en Informatique et en Automatique - INRIA, tablissement public caractre scientifique et technologique, dont le sige est situ Domaine de Voluceau, Rocquencourt, BP 105, 78153 Le Chesnay cedex. PREAMBULE --------- Ce contrat est une licence de logiciel libre dont l'objectif est de confrer aux utilisateurs la libert de modification et de redistribution du logiciel rgi par cette licence dans le cadre d'un modle de diffusion open source fonde sur le droit franais. L'exercice de ces liberts est assorti de certains devoirs la charge des utilisateurs afin de prserver ce statut au cours des redistributions ultrieures. L'accessibilit au code source et les droits de copie, de modification et de redistribution qui en dcoulent ont pour contrepartie de n'offrir aux utilisateurs qu'une garantie limite et de ne faire peser sur l'auteur du logiciel, le titulaire des droits patrimoniaux et les concdants successifs qu'une responsabilit restreinte. A cet gard l'attention de l'utilisateur est attire sur les risques associs au chargement, l'utilisation, la modification et/ou au dveloppement et la reproduction du logiciel par l'utilisateur tant donn sa spcificit de logiciel libre, qui peut le rendre complexe manipuler et qui le rserve donc des dveloppeurs et des professionnels avertis possdant des connaissances informatiques approfondies. Les utilisateurs sont donc invits charger et tester l'adquation du Logiciel leurs besoins dans des conditions permettant d'assurer la scurit de leurs systmes et ou de leurs donnes et, plus gnralement, l'utiliser et l'exploiter dans les mme conditions de scurit. Ce contrat peut tre reproduit et diffus librement, sous rserve de le conserver en l'tat, sans ajout ni suppression de clauses. Ce contrat est susceptible de s'appliquer tout logiciel dont le titulaire des droits patrimoniaux dcide de soumettre l'exploitation aux dispositions qu'il contient. Article 1er - DEFINITIONS ------------------------- Dans ce contrat, les termes suivants, lorsqu'ils seront crits avec une lettre capitale, auront la signification suivante : Contrat : dsigne le prsent contrat de licence, ses ventuelles versions postrieures avenants et annexes. Logiciel : dsigne le logiciel sous sa forme de Code Objet et/ou de Code Source et le cas chant sa documentation, dans leur tat au moment de l'acceptation du Contrat par le Licenci. Logiciel Initial : dsigne le Logiciel sous sa forme de Code Source et de Code Objet et le cas chant sa documentation, dans leur tat au moment de leur premire diffusion sous les termes du Contrat. Logiciel Modifi : dsigne le Logiciel modifi par au moins une Contribution. Code Source : dsigne l'ensemble des instructions et des lignes de programme du Logiciel et auquel l'accs est ncessaire en vue de modifier le Logiciel. Code Objet : dsigne les fichiers binaires issus de la compilation du Code Source. Titulaire : dsigne le dtenteur des droits patrimoniaux d'auteur sur le Logiciel Initial. Licenci(s) : dsigne le ou les utilisateur(s) du Logiciel ayant accept le Contrat. Contributeur : dsigne le Licenci auteur d'au moins une Contribution. Concdant : dsigne le Titulaire ou toute personne physique ou morale distribuant le Logiciel sous le Contrat. Contributions : dsigne l'ensemble des modifications, corrections, traductions, adaptations et/ou nouvelles fonctionnalits intgres dans le Logiciel par tout Contributeur, ainsi que les Modules Statiques. Module : dsigne un ensemble de fichiers sources y compris leur documentation qui, une fois compil sous forme excutable, permet de raliser des fonctionnalits ou services supplmentaires ceux fournis par le Logiciel. Module Dynamique : dsigne tout Module, cr par le Contributeur, indpendant du Logiciel, tel que ce Module et le Logiciel sont sous forme de deux excutables indpendants qui s'excutent dans un espace d'adressage indpendant, l'un appelant l'autre au moment de leur excution. Module Statique : dsigne tout Module cr par le Contributeur et li au Logiciel par un lien statique rendant leur code objet dpendant l'un de l'autre. Ce Module et le Logiciel auquel il est li, sont regroups en un seul excutable. Parties : dsigne collectivement le Licenci et le Concdant. Ces termes s'entendent au singulier comme au pluriel. Article 2 - OBJET ----------------- Le Contrat a pour objet la concession par le Concdant au Licenci d'une Licence non exclusive, transfrable et mondiale du Logiciel telle que dfinie ci-aprs l'article 5 pour toute la dure de protection des droits portant sur ce Logiciel. Article 3 - ACCEPTATION ----------------------- 3.1. L'acceptation par le Licenci des termes du Contrat est rpute acquise du fait du premier des faits suivants : - (i) le chargement du Logiciel par tout moyen notamment par tlchargement partir d'un serveur distant ou par chargement partir d'un support physique ; - (ii) le premier exercice par le Licenci de l'un quelconque des droits concds par le Contrat. 3.2. Un exemplaire du Contrat, contenant notamment un avertissement relatif aux spcificits du Logiciel, la restriction de garantie et la limitation un usage par des utilisateurs expriments a t mis disposition du Licenci pralablement son acceptation telle que dfinie l'article 3.1 ci dessus et le Licenci reconnat en avoir pris connaissances. Article 4 - ENTREE EN VIGUEUR ET DUREE -------------------------------------- 4.1. ENTREE EN VIGUEUR Le Contrat entre en vigueur la date de son acceptation par le Licenci telle que dfinie en 3.1. 4.2. DUREE Le Contrat produira ses effets pendant toute la dure lgale de protection des droits patrimoniaux portant sur le Logiciel. Article 5 - ETENDUE DES DROITS CONCEDES --------------------------------------- Le Concdant concde au Licenci, qui accepte, les droits suivants sur le Logiciel pour toutes destinations et pour la dure du Contrat dans les conditions ci-aprs dtailles. Par ailleurs, le Concdant concde au Licenci titre gracieux les droits d'exploitation du ou des brevets qu'il dtient sur toute ou partie des inventions implmentes dans le Logiciel. 5.1. DROITS D'UTILISATION Le Licenci est autoris utiliser le Logiciel, sans restriction quant aux domaines d'application, tant ci-aprs prcis que cela comporte : - la reproduction permanente ou provisoire du Logiciel en tout ou partie par tout moyen et sous toute forme. - le chargement, l'affichage, l'excution, ou le stockage du Logiciel sur tout support. - la possibilit d'en observer, d'en tudier, ou d'en tester le fonctionnement afin de dterminer les ides et principes qui sont la base de n'importe quel lment de ce Logiciel ; et ceci, lorsque le Licenci effectue toute opration de chargement, d'affichage, d'excution, de transmission ou de stockage du Logiciel qu'il est en droit d'effectuer en vertu du Contrat. 5.2. DROIT D'APPORTER DES CONTRIBUTIONS Le droit d'apporter des Contributions comporte le droit de traduire, d'adapter, d'arranger ou d'apporter toute autre modification du Logiciel et le droit de reproduire le Logiciel en rsultant. Le Licenci est autoris apporter toute Contribution au Logiciel sous rserve de mentionner, de faon explicite, son nom en tant qu'auteur de cette Contribution et la date de cration de celle-ci. 5.3. DROITS DE DISTRIBUTION ET DE DIFFUSION Le droit de distribution et de diffusion comporte notamment le droit de transmettre et de communiquer le Logiciel au public sur tout support et par tout moyen ainsi que le droit de mettre sur le march titre onreux ou gratuit, un ou des exemplaires du Logiciel par tout procd. Le Licenci est autoris redistribuer des copies du Logiciel, modifi ou non, des tiers dans les conditions ci-aprs dtailles. 5.3.1. REDISTRIBUTION DU LOGICIEL SANS MODIFICATION Le Licenci est autoris redistribuer des copies conformes du Logiciel, sous forme de Code Source ou de Code Objet, condition que cette redistribution respecte les dispositions du Contrat dans leur totalit et soit accompagne : - d'un exemplaire du Contrat, - d'un avertissement relatif la restriction de garantie et de responsabilit du Concdant telle que prvue aux articles 8 et 9, et que, dans le cas o seul le Code Objet du Logiciel est redistribu, le Licenci permette aux futurs Licencis d'accder facilement au Code Source complet du Logiciel en indiquant les modalits d'accs, tant entendu que le cot additionnel d'acquisition du Code Source ne devra pas excder le simple cot de transfert des donnes. 5.3.2. REDISTRIBUTION DU LOGICIEL MODIFIE Lorsque le Licenci apporte une Contribution au Logiciel, les conditions de redistribution du Logiciel Modifi sont alors soumises l'intgralit des dispositions du Contrat. Le Licenci est autoris redistribuer le Logiciel Modifi, sous forme de Code Source ou de Code Objet, condition que cette redistribution respecte les dispositions du Contrat dans leur totalit et soit accompagne : - d'un exemplaire du Contrat, - d'un avertissement relatif la restriction de garantie et de responsabilit du concdant telle que prvue aux articles 8 et 9, et que, dans le cas o seul le Code Objet du Logiciel Modifi est redistribu, le Licenci permette aux futurs Licencis d'accder facilement au Code Source complet du Logiciel Modifi en indiquant les modalits d'accs, tant entendu que le cot additionnel d'acquisition du Code Source ne devra pas excder le simple cot de transfert des donnes. 5.3.3. redistribution des MODULES DYNAMIQUES Lorsque le Licenci a dvelopp un Module Dynamique les conditions du Contrat ne s'appliquent pas ce Module Dynamique, qui peut tre distribu sous un contrat de licence diffrent. 5.3.4. COMPATIBILITE AVEC LA LICENCE GPL Dans le cas o le Logiciel, Modifi ou non, est intgr un code soumis aux dispositions de la licence GPL, le Licenci est autoris redistribuer l'ensemble sous la licence GPL. Dans le cas o le Logiciel Modifi intgre un code soumis aux dispositions de la licence GPL, le Licenci est autoris redistribuer le Logiciel Modifi sous la licence GPL. Article 6 - PROPRIETE INTELLECTUELLE ------------------------------------ 6.1. SUR LE LOGICIEL INITIAL Le Titulaire est dtenteur des droits patrimoniaux sur le Logiciel Initial. Toute utilisation du Logiciel Initial est soumise au respect des conditions dans lesquelles le Titulaire a choisi de diffuser son oeuvre et nul autre n'a la facult de modifier les conditions de diffusion de ce Logiciel Initial. Le Titulaire s'engage maintenir la diffusion du Logiciel initial sous les conditions du Contrat et ce, pour la dure vise l'article 4.2. 6.2. SUR LES CONTRIBUTIONS Les droits de proprit intellectuelle sur les Contributions sont attachs au titulaire de droits patrimoniaux dsigns par la lgislation applicable. 6.3. SUR LES MODULES DYNAMIQUES Le Licenci ayant dvelopp un Module Dynamique est titulaire des droits de proprit intellectuelle sur ce Module Dynamique et reste libre du choix du contrat rgissant sa diffusion. 6.4. DISPOSITIONS COMMUNES 6.4.1. Le Licenci s'engage expressment : - ne pas supprimer ou modifier de quelque manire que ce soit les mentions de proprit intellectuelle apposes sur le Logiciel; - reproduire l'identique lesdites mentions de proprit intellectuelle sur les copies du Logiciel. 6.4.2. Le Licenci s'engage ne pas porter atteinte, directement ou indirectement, aux droits de proprit intellectuelle du Titulaire et/ou des Contributeurs et prendre, le cas chant, l'gard de son personnel toutes les mesures ncessaires pour assurer le respect des dits droits de proprit intellectuelle du Titulaire et/ou des Contributeurs. Article 7 - SERVICES ASSOCIES ----------------------------- 7.1. Le Contrat n'oblige en aucun cas le Concdant la ralisation de prestations d'assistance technique ou de maintenance du Logiciel. Cependant le Concdant reste libre de proposer ce type de services. Les termes et conditions d'une telle assistance technique et/ou d'une telle maintenance seront alors dtermins dans un acte spar. Ces actes de maintenance et/ou assistance technique n'engageront que la seule responsabilit du Concdant qui les propose. 7.2. De mme, tout Concdant est libre de proposer, sous sa seule responsabilit, ses licencis une garantie, qui n'engagera que lui, lors de la redistribution du Logiciel et/ou du Logiciel Modifi et ce, dans les conditions qu'il souhaite. Cette garantie et les modalits financires de son application feront l'objet d'un acte spar entre le Concdant et le Licenci. Article 8 - RESPONSABILITE -------------------------- 8.1. Sous rserve des dispositions de l'article 8.2, si le Concdant n'excute pas tout ou partie des obligations mises sa charge par le Contrat, le Licenci a la facult, sous rserve de prouver la faute du Concdant concern, de solliciter la rparation du prjudice direct qu'il subit et dont il apportera la preuve. 8.2. La responsabilit du Concdant est limite aux engagements pris en application du Contrat et ne saurait tre engage en raison notamment :(i) des dommages dus l'inexcution, totale ou partielle, de ses obligations par le Licenci, (ii) des dommages directs ou indirects dcoulant de l'utilisation ou des performances du Logiciel subis par le Licenci lorsqu'il s'agit d'un professionnel utilisant le Logiciel des fins professionnelles et (iii) des dommages indirects dcoulant de l'utilisation ou des performances du Logiciel. Les Parties conviennent expressment que tout prjudice financier ou commercial (par exemple perte de donnes, perte de bnfices, perte d'exploitation, perte de clientle ou de commandes, manque gagner, trouble commercial quelconque) ou toute action dirige contre le Licenci par un tiers, constitue un dommage indirect et n'ouvre pas droit rparation par le Concdant. Article 9 - GARANTIE -------------------- 9.1. Le Licenci reconnat que l'tat actuel des connaissances scientifiques et techniques au moment de la mise en circulation du Logiciel ne permet pas d'en tester et d'en vrifier toutes les utilisations ni de dtecter l'existence d'ventuels dfauts. L'attention du Licenci a t attire sur ce point sur les risques associs au chargement, l'utilisation, la modification et/ou au dveloppement et la reproduction du Logiciel qui sont rservs des utilisateurs avertis. Il relve de la responsabilit du Licenci de contrler, par tous moyens, l'adquation du produit ses besoins, son bon fonctionnement et de s'assurer qu'il ne causera pas de dommages aux personnes et aux biens. 9.2. Le Concdant dclare de bonne foi tre en droit de concder l'ensemble des droits attachs au Logiciel (comprenant notamment les droits viss l'article 5). 9.3. Le Licenci reconnat que le Logiciel est fourni en l'tat par le Concdant sans autre garantie, expresse ou tacite, que celle prvue l'article 9.2 et notamment sans aucune garantie sur sa valeur commerciale, son caractre scuris, innovant ou pertinent. En particulier, le Concdant ne garantit pas que le Logiciel est exempt d'erreur, qu'il fonctionnera sans interruption, qu'il sera compatible avec l'quipement du Licenci et sa configuration logicielle ni qu'il remplira les besoins du Licenci. 9.4. Le Concdant ne garantit pas, de manire expresse ou tacite, que le Logiciel ne porte pas atteinte un quelconque droit de proprit intellectuelle d'un tiers portant sur un brevet, un logiciel ou sur tout autre droit de proprit. Ainsi, le Concdant exclut toute garantie au profit du Licenci contre les actions en contrefaon qui pourraient tre diligentes au titre de l'utilisation, de la modification, et de la redistribution du Logiciel. Nanmoins, si de telles actions sont exerces contre le Licenci, le Concdant lui apportera son aide technique et juridique pour sa dfense. Cette aide technique et juridique est dtermine au cas par cas entre le Concdant concern et le Licenci dans le cadre d'un protocole d'accord. Le Concdant dgage toute responsabilit quant l'utilisation de la dnomination du Logiciel par le Licenci. Aucune garantie n'est apporte quant l'existence de droits antrieurs sur le nom du Logiciel et sur l'existence d'une marque. Article 10 - RESILIATION ------------------------- 10.1. En cas de manquement par le Licenci aux obligations mises sa charge par le Contrat, le Concdant pourra rsilier de plein droit le Contrat trente (30) jours aprs notification adresse au Licenci et reste sans effet. 10.2. Le Licenci dont le Contrat est rsili n'est plus autoris utiliser, modifier ou distribuer le Logiciel. Cependant, toutes les Licences licences qu'il aura concdes antrieurement la rsiliation du Contrat resteront valides sous rserve qu'elles aient t effectues en conformit avec le Contrat. Article 11 - DISPOSITIONS DIVERSES ---------------------------------- 11.1. CAUSE EXTERIEURE Aucune des Parties ne sera responsable d'un retard ou d'une dfaillance d'excution du Contrat qui serait d un cas de force majeure, un cas fortuit ou une cause extrieure, telle que, notamment, le mauvais fonctionnement ou les interruptions du rseau lectrique ou de tlcommunication, la paralysie du rseau lie une attaque informatique, l'intervention des autorits gouvernementales, les catastrophes naturelles, les dgts des eaux, les tremblements de terre, le feu, les explosions, les grves et les conflits sociaux, l'tat de guerre. 11.2. Le fait, par l'une ou l'autre des Parties, d'omettre en une ou plusieurs occasions de se prvaloir d'une ou plusieurs dispositions du Contrat, ne pourra en aucun cas impliquer renonciation par la Partie intresse s'en prvaloir ultrieurement. 11.3. Le Contrat annule et remplace toute convention antrieure, crite ou orale, entre les Parties sur le mme objet et constitue l'accord entier entre les Parties sur cet objet. Aucune addition ou modification aux termes du Contrat n'aura d'effet l'gard des Parties moins d'tre faite par crit et signe par leurs reprsentants dment habilits. 11.4. Dans l'hypothse o une ou plusieurs des dispositions du Contrat s'avrerait contraire une loi ou un texte applicable, existants ou futurs, cette loi ou ce texte prvaudrait, et les Parties feraient les amendements ncessaires pour se conformer cette loi ou ce texte. Toutes les autres dispositions resteront en vigueur. De mme, la nullit, pour quelque raison que ce soit, d'une des dispositions du Contrat ne saurait entraner la nullit de l'ensemble du Contrat. 11.5. LANGUE Le Contrat est rdig en langue franaise et en langue anglaise. En cas de divergence d'interprtation, seule la version franaise fait foi. Article 12 - NOUVELLES VERSIONS DU CONTRAT ------------------------------------------ 12.1. Toute personne est autorise copier et distribuer des copies de ce Contrat. 12.2. Afin d'en prserver la cohrence, le texte du Contrat est protg et ne peut tre modifi que par les auteurs de la licence, lesquels se rservent le droit de publier priodiquement des mises jour ou de nouvelles versions du Contrat, qui possderont chacune un numro distinct. Ces versions ultrieures seront susceptibles de prendre en compte de nouvelles problmatiques rencontres par les logiciels libres. 12.3. Tout Logiciel diffus sous une version donne du Contrat ne pourra faire l'objet d'une diffusion ultrieure que sous la mme version du Contrat ou une version postrieure, sous rserve des dispositions de l'article 5.3.4. Article 13 - LOI APPLICABLE ET COMPETENCE TERRITORIALE ------------------------------------------------------ 13.1. Le Contrat est rgi par la loi franaise. Les Parties conviennent de tenter de rgler l'amiable les diffrends ou litiges qui viendraient se produire par suite ou l'occasion du Contrat. 13.2. A dfaut d'accord amiable dans un dlai de deux (2) mois compter de leur survenance et sauf situation relevant d'une procdure d'urgence, les diffrends ou litiges seront ports par la Partie la plus diligente devant les Tribunaux comptents de Paris. Version 1 du 21/06/2004 v_sim-3.7.0/Documentation/readme0000644000353400050620000000165212216005700013547 00000000000000 V_Sim visualizes atomic structures such as crystals, grain boundaries, molecules and so on (either in binary format, or in plain text format). The rendering is done in pseudo-3D with spheres (atoms) or arrows (spins). The user can interact through many functions to choose the view, set the bindings, draw cutting planes, compute surfaces from scalar fields, duplicate nodes, measure geometry... Moreover V_Sim allows to export the view as images in PNG, JPG, PDF (bitmap), SVG (scheme) and other formats. Some tools are also available to colorize atoms from data values or to animate on screen many position files. A comprehensive manual is available on the web site, see http://inac.cea.fr/L_Sim/V_Sim/user_guide.html. Compiling and installing V_Sim is detailled at http://inac.cea.fr/L_Sim/V_Sim/install.html and in the INSTALL file of the package (providing dependencies information as well). 1998 - 2013, CEA (France) v_sim-3.7.0/Documentation/pot2surf_help0000644000353400050620000000366512215546176015134 00000000000000HOWTO use pot2surf through V_Sim to create a .surf file. Originnally written by Luc Billard for his program VISUALIZE, pot2surf allows you to create .surf files from .pot files. Please refer to V_Sim's website to learn about .pot files specifications. To use pot2surf through V_Sim, you need to select the "pot2surf" tab under the "convert" button of the "isosurfaces" module. You must then select a .pot file from which to build a .surf file and a name for the .surf file to build (notice that if you first select a .pot file, the other field will be auto filled by V_Sim but you can always specify the file names you want by yourself). Once you've selected your .pot file, pot_min and pot_max fields are automatically filled by V_Sim. These are the min and max values V_Sim found in your .pot file. Of course you can't create surfaces which isovalues aren't in the ]pot_min, pot_max[ range. You can now add surfaces to build by using the "+" button on the right column. Surfaces' names are auto-filled but you can change them by selecting and clicking them. Surfaces' name can't contain space character, but can contain any other you want. They should always by with the 'surface_' prefix. You can also specify the value of a surface by selecting and clicking the value field of a surface. You can remove any surface by clicking the "-" button, or re-orders them all by using the up and down arrows. The order is important if you want to use the "Play" function of the "isosurface" tab. Once you've added several surfaces to the list, you can click the "Build target .surf file" button to have your .surf file created. If no error message appears, it means the surf file you specified have been created succesfully. If you have selected "Autoload", your .surf file should be displayed in V_Sim (don't forget to check the "Use isosurfaces" button in the main panel !). Buttons in the toolbar are used to save/restore settings by exporting/reading it as a .instruc file. v_sim-3.7.0/Documentation/v_sim.10000644000353400050620000001774512216053554013612 00000000000000 .\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH "V_SIM" "1" "September 17, 2013" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME v_sim \- a GTK program for 3D visualisation of atomic systems .SH SYNOPSIS .B v_sim .B [-e .I file .B ] .B [-r .I file .B ] .B [-h .B ] .B [-g .I x .B ] .B [-s .I file .B ] .B [-m .I id .B ] .B [-a .B ] .B [-c .I file .B ] .B [-u .I l:m:n .B ] .B [-d .I id .B ] .B [-t .I x:y:z .B ] .B [-x .I x:y:z .B ] .B [-p .I file .B ] .B [-f .I file .B ] .B [-v .I v[:v] .B ] .B [-i .I file .B ] .B [-b .I id[:id] .B ] .B [--log-scale .I id .B ] .B [-n .I val .B ] .B [--color-iso-lines .I [R:G:B] or auto .B ] .B [--fit-to-box .I val .B ] .B [--bg-image .I file .B ] .B [-o .I id=value .B ] .B [-w .I mode .B ] .B [--i-set .I i .B ] .B [--value-file .I file .B ] .B [--map-precision .I prec .B ] .B [--map-clamp .I min:max or auto .B ] .B [--introspect-dump .I fileToDump .B ] .B [--color-clamp .I col#min:max or auto .B ] .B [--scaling-column .I id .B ] .B [ .I fileToRender .B ] .PP This manual page documents briefly the .B v_sim commands. It is a software to visualise atomic structures with OpenGl rendering. .SH OPTIONS .PP This program follows the usual GNU command line syntax, with long options starting with two dashes (`-'). .PP A complete list of options is included below. .TP .B \-e, \-\-export file (from v3.0.0) make an image from the fileToRender argument. The format is specified through the extension of the argument or by the -o fileFormatId=id option (get the id of available file formats with -o list). .TP .B \-r, \-\-resources file (from v3.4.0) load the given resources file on startup instead of looking for a valid resources file in the standard locations. .TP .B \-h, \-\-help (from v3.0.0) show this little help. .TP .B \-g, \-\-geometry x (from v3.0.0) specify the size of the rendering window, the size argument must have the following format: x with positive non null values. (Default value: 600x600) .TP .B \-s, \-\-spin-file file (from v3.1.0) use the given argument as a spin indicator. If this option is used, V_Sim switches automatically to spin rendering whatever method is specified in the parameter file. .TP .B \-m, \-\-hiding-mode id (from v3.2.0) policy used to show or not null modulus spins possible values are positives. (Default value: 0) .TP .B \-a, \-\-spin-and-atomic (from v3.3.0) always draws atomic rendering on node position in addition to spin rendering. .TP .B \-c, \-\-colorize file (from v3.1.0) the argument fileToRender must be called, then the given file of the option is used to colorize the elements. .TP .B \-u, \-\-use-column l:m:n (from v3.1.0) it specifies the columns to use from the data file for the three colour channels [l;m;n]. Columns are counted from 1. Use -3, -2, -1 and 0 to use the special values, constant 1, coord. x, coord. y, and coord. z, respectively. .TP .B \-d, \-\-color-preset id (from v3.1.0) this option can be used with the '--colorize' one or the '--build-map' one. It chooses a preset color scheme. The id argument is an integer that corresponds to a defined color shade (ranging from 0). .TP .B \-t, \-\-translate x:y:z (from v3.3.0) a file must be loaded. It applies the given translations to the loaded file. The units are those of the file. This is available for periodic file formats only. .TP .B \-x, \-\-expand x:y:z (from v3.4.0) a file must be loaded. It applies the given expansion to the loaded file. The values are given in box coordinates. This is available for periodic file formats only. .TP .B \-p, \-\-planes file (from v3.2.0) the argument fileToRender must be called, then the given file of the option is parsed as a list of planes and they are rendered. .TP .B \-f, \-\-scalar-field file (from v3.3.0) the argument fileToRender must be called, then the given file of the option is parsed as a scalar field and loaded. .TP .B \-v, \-\-iso-values v[:v] (from v3.3.0) must be used with the '--scalar-field' option, then the given surfaces are built and rendered. If a name is appended to a value using '#' as a separator, this name is used as the name for the iso-surface (i.e. 0.25#Blue). .TP .B \-i, \-\-iso-surfaces file (from v3.2.0) the argument fileToRender must be given, then the given file of the option is parsed and surfaces are rendered. .TP .B \-b, \-\-build-map id[:id] (from v3.4.0) the argument fileToRender must be given, as the '--planes', '--color-preset' and '--scalar-field' options used, then the given plane 'id' is replaced by a coloured map using given scalar field and shade. 'id' ranges from 0. If several ids are given, several maps are built. .TP .B \-\-log-scale id (from v3.4.0) select the scaling method to use with gradients (0: linear, 1: log scaled and 2 is zero-centred log scale), default is linear scale. .TP .B \-n, \-\-n-iso-lines val (from v3.4.0) when positive, val isolines are plotted on the coloured map. .TP .B \-\-color-iso-lines [R:G:B] or auto (from v3.5.0) when given, generated iso-lines are colourised [R:G:B] or auto with the values. The specific value 'auto' will produced iso-lines in inversed colours. (Default value: [0:0:0]) .TP .B \-\-fit-to-box val (from v3.3.0) if val is not TRUE, the surfaces use their own bounding box. (Default value: TRUE) .TP .B \-\-bg-image file (from v3.4.0) draw the given image on the background. .TP .B \-o, \-\-option id=value (from v3.3.0) this is a generic way to give extended option. to V_Sim. As much as -o can be used. Each one store a key and its value (boolean, integer or float). .TP .B \-w, \-\-window-mode mode (from v3.5.0) used to choose the windowing mode. By default the command panel and the rendering window are separated. In the 'oneWindow' mode they are joined. In the 'renderOnly' mode, the command panel is not used. (Default value: classic) .TP .B \-\-i-set i (from v3.5.0) this flag is used to choose the id of the loaded file if the format has support for multiple ids in one file (see XYZ format or -posi.d3 ones). (Default value: 0) .TP .B \-\-value-file file (from v3.5.0) specify an XML file with some value information for V_Sim, like a list of planes, highlighted nodes... It replaces and extend the previous --planes option. .TP .B \-\-map-precision prec (from v3.5.0) Give the precision in percent to render the coloured map. (Default value: 100) .TP .B \-\-map-clamp min:max or auto (from v3.6.0) Set the minimum and maximum values for the coloured map rendering. (Default value: auto) .TP .B \-\-introspect-dump fileToDump (from v3.6.0) Dump object signals and properties for introspection. .TP .B \-\-color-clamp col#min:max or auto (from v3.7.0) Range to adjust values into for colourisation. col specifiesthe column to apply the range to. Use -2, -1 and 0 for x, yand z directions respectively. (Default value: auto) .TP .B \-\-scaling-column id (from v3.7.0) used with a data file (see -c), it specifies the column id to be used to scale the nodes. .SH FILES .IR /usr/share/v_sim/v_sim.res specify all rendering informations from position of the camera to colour of the elements. .br .IR /usr/share/v_sim/v_sim.par specify all interface and non-rendering options such as the positions of the panels. .br .IR ~/$XDG_CONFIG_DIR/v_sim a directory where overloading .B v_sim.res and .B v_sim.par can be put. .SH AUTHOR V_Sim was written by Luc Billard, Damien Caliste, Olivier D'Astier Aurélien Lherbier, Jérémy Blanc, Simon Planès, Thomas Jourdan and Yoann Ratao. .PP This manual page was written by Damien Caliste . v_sim-3.7.0/Documentation/man.xsl0000644000353400050620000001007012215546176013704 00000000000000 .\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH "V_SIM" "1" " , " .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp <n> insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME v_sim \- a GTK program for 3D visualisation of atomic systems .SH SYNOPSIS .B v_sim .PP This manual page documents briefly the .B v_sim commands. It is a software to visualise atomic structures with OpenGl rendering. .SH OPTIONS .PP This program follows the usual GNU command line syntax, with long options starting with two dashes (`-'). .PP A complete list of options is included below. .SH FILES .IR /usr/share/v_sim/v_sim.res specify all rendering informations from position of the camera to colour of the elements. .br .IR /usr/share/v_sim/v_sim.par specify all interface and non-rendering options such as the positions of the panels. .br .IR ~/$XDG_CONFIG_DIR/v_sim a directory where overloading .B v_sim.res and .B v_sim.par can be put. .SH AUTHOR V_Sim was written by Luc Billard, Damien Caliste, Olivier D'Astier Aurlien Lherbier, Jrmy Blanc, Simon Plans, Thomas Jourdan and Yoann Ratao. .PP This manual page was written by Damien Caliste <damien.caliste@cea.fr>. .B [ - -- .I .B ] .B [ .I fileToRender .B ] .TP .B \-, .B \-\- (from v.0) (Default value: ) v_sim-3.7.0/Documentation/v_sim.cli.xml0000644000353400050620000001665412216053414015011 00000000000000 v_sim-3.7.0/Documentation/reference/0000755000353400050620000000000012216331355014411 500000000000000v_sim-3.7.0/Documentation/reference/Makefile.am0000644000353400050620000000773712215546175016412 00000000000000## Process this file with automake to produce Makefile.in # We require automake 1.6 at least. AUTOMAKE_OPTIONS = 1.6 # This is a blank Makefile.am for using gtk-doc. # Copy this to your project's API docs directory and modify the variables to # suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples # of using the various options. # The name of the module, e.g. 'glib'. DOC_MODULE=v_sim # The top-level SGML file. You can change this if you want to. DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml # The directory containing the source code. Relative to $(srcdir). # gtk-doc will search all .c & .h files beneath here for inline comments # documenting the functions and macros. # e.g. DOC_SOURCE_DIR=../../../gtk DOC_SOURCE_DIR=$(top_srcdir)/src # Extra options to pass to gtkdoc-scangobj. Not normally needed. SCANGOBJ_OPTIONS= # Extra options to supply to gtkdoc-scan. # e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" SCAN_OPTIONS=--rebuild-types --rebuild-sections --deprecated-guards="V_SIM_DISABLE_DEPRECATED" # Extra options to supply to gtkdoc-mkdb. # e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml MKDB_OPTIONS=--xml-mode --output-format=xml --name-space=visu # Extra options to supply to gtkdoc-mktmpl # e.g. MKTMPL_OPTIONS=--only-section-tmpl MKTMPL_OPTIONS= # Extra options to supply to gtkdoc-mkhtml MKHTML_OPTIONS=--path=$(abs_top_builddir)/Documentation/reference # Extra options to supply to gtkdoc-fixref. Not normally needed. # e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html FIXXREF_OPTIONS= # Used for dependencies. The docs will be rebuilt if any of these change. # e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h # e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c HFILE_GLOB=$(top_srcdir)/src/*.h $(top_srcdir)/src/*/*.h CFILE_GLOB=$(top_srcdir)/src/*.c $(top_srcdir)/src/*/*.c # Extra header to include when scanning, which are not under DOC_SOURCE_DIR # e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h EXTRA_HFILES= # Header files to ignore when scanning. Use base file name, no paths # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h IGNORE_HFILES=support.h interface.h visu_tools.h externalModules.h externalPairsExtensions.h externalGtkPairsExtensions.h externalDumpModules.h externalVisuExtensions.h atoms_yaml.h rings.h dumpToGif.h callbacks.h # Images to copy into HTML directory. # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png HTML_IMAGES=../../pixmaps/illustration/axesTransform.png # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.sgml building.sgml changes-2.0.sgml content_files= # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded # These files must be listed here *and* in content_files # e.g. expand_content_files=running.sgml expand_content_files= # CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. # Only needed if you are using gtkdoc-scangobj to dynamically query widget # signals and properties. # e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) # e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) CFLAGS=-Wno-error INCLUDES=-I$(top_srcdir) -I$(top_srcdir)/src @GTKS_CFLAGS@ @GLU_CFLAGS@ GTKDOC_LIBS= \ $(top_builddir)/src/lib@PACKAGE_TARNAME@-3.la \ @GTKS_LIBS@ @GLU_LIBS@ @EXTRA_LDFLAGS@ @EXTRA_LIBS@ # This includes the standard gtk-doc make rules, copied by gtkdocize. include $(srcdir)/gtk-doc.make # Other files to distribute # e.g. EXTRA_DIST += version.xml.in EXTRA_DIST += version.in # Files not to distribute # for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types # for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt DISTCLEANFILES = $(DOC_MODULE).types $(DOC_MODULE)-sections.txt # Comment this out if you want your docs-status tested during 'make check' if ENABLE_GTK_DOC TESTS_ENVIRONMENT = cd $(srcdir) && \ DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \ SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) TESTS = $(GTKDOC_CHECK) endif #-include $(top_srcdir)/git.mkv_sim-3.7.0/Documentation/reference/Makefile.in0000644000353400050620000007213012216330210016366 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # -*- mode: makefile -*- #################################### # Everything below here is generic # #################################### VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/gtk-doc.make $(srcdir)/version.in subdir = Documentation/reference ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/abinit.m4 \ $(top_srcdir)/m4/ax_check_gl.m4 \ $(top_srcdir)/m4/ax_check_glu.m4 \ $(top_srcdir)/m4/ax_lang_compiler_ms.m4 \ $(top_srcdir)/m4/ax_lapack.m4 $(top_srcdir)/m4/bigdft.m4 \ $(top_srcdir)/m4/etsf_io.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/libxc.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/netcdf.m4 \ $(top_srcdir)/m4/python.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = version CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__tty_colors = \ red=; grn=; lgn=; blu=; std= DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AB_CPPFLAGS = @AB_CPPFLAGS@ AB_LIBS = @AB_LIBS@ ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIGDFT_CPPFLAGS = @BIGDFT_CPPFLAGS@ BIGDFT_LIBS = @BIGDFT_LIBS@ BLAS_LIBS = @BLAS_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ # CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. # Only needed if you are using gtkdoc-scangobj to dynamically query widget # signals and properties. # e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) # e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) CFLAGS = -Wno-error CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETSF_IO_LIBS = @ETSF_IO_LIBS@ EXEEXT = @EXEEXT@ EXTRA_CFLAGS = @EXTRA_CFLAGS@ EXTRA_LDFLAGS = @EXTRA_LDFLAGS@ EXTRA_LIBS = @EXTRA_LIBS@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ FCLIBS = @FCLIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLIBS = @FLIBS@ FONT_BOLD = @FONT_BOLD@ FONT_NORMAL = @FONT_NORMAL@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_BIGDFT_CFLAGS = @GLIB_BIGDFT_CFLAGS@ GLIB_BIGDFT_LIBS = @GLIB_BIGDFT_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GOBJECT_INTROSPECTION_REQUIRED = @GOBJECT_INTROSPECTION_REQUIRED@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTKS_CFLAGS = @GTKS_CFLAGS@ GTKS_LIBS = @GTKS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_SCANNER = @G_IR_SCANNER@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LAPACK_LIBS = @LAPACK_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXC_LIBS = @LIBXC_LIBS@ LIB_ARCHIVE_CFLAGS = @LIB_ARCHIVE_CFLAGS@ LIB_ARCHIVE_LIBS = @LIB_ARCHIVE_LIBS@ LIB_YAML_CFLAGS = @LIB_YAML_CFLAGS@ LIB_YAML_LIBS = @LIB_YAML_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NC_CPPFLAGS = @NC_CPPFLAGS@ NC_LDFLAGS = @NC_LDFLAGS@ NC_LIBS = @NC_LIBS@ NC_NETCDF_3_CPPFLAG = @NC_NETCDF_3_CPPFLAG@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBABEL_CFLAGS = @OPENBABEL_CFLAGS@ OPENBABEL_LIBS = @OPENBABEL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PYGOBJECT_CFLAGS = @PYGOBJECT_CFLAGS@ PYGOBJECT_LIBS = @PYGOBJECT_LIBS@ PYGOBJECT_REQUIRED = @PYGOBJECT_REQUIRED@ PYGTK_CFLAGS = @PYGTK_CFLAGS@ PYGTK_LIBS = @PYGTK_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_INCLUDES = @PYTHON_INCLUDES@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ V_SIM_MAJOR_VERSION = @V_SIM_MAJOR_VERSION@ V_SIM_MICRO_VERSION = @V_SIM_MICRO_VERSION@ V_SIM_MINOR_VERSION = @V_SIM_MINOR_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ girdir = @girdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ lib_v_sim_version = @lib_v_sim_version@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typelibsdir = @typelibsdir@ v_simexamplesdir = @v_simexamplesdir@ v_simexedir = @v_simexedir@ v_simiconsdir = @v_simiconsdir@ v_simlegaldir = @v_simlegaldir@ v_simpixmapsdir = @v_simpixmapsdir@ v_simpluginsdir = @v_simpluginsdir@ v_simresourcesdir = @v_simresourcesdir@ visupyexecdir = @visupyexecdir@ visutypelibsdir = @visutypelibsdir@ # We require automake 1.6 at least. AUTOMAKE_OPTIONS = 1.6 # This is a blank Makefile.am for using gtk-doc. # Copy this to your project's API docs directory and modify the variables to # suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples # of using the various options. # The name of the module, e.g. 'glib'. DOC_MODULE = v_sim # The top-level SGML file. You can change this if you want to. DOC_MAIN_SGML_FILE = $(DOC_MODULE)-docs.sgml # The directory containing the source code. Relative to $(srcdir). # gtk-doc will search all .c & .h files beneath here for inline comments # documenting the functions and macros. # e.g. DOC_SOURCE_DIR=../../../gtk DOC_SOURCE_DIR = $(top_srcdir)/src # Extra options to pass to gtkdoc-scangobj. Not normally needed. SCANGOBJ_OPTIONS = # Extra options to supply to gtkdoc-scan. # e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" SCAN_OPTIONS = --rebuild-types --rebuild-sections --deprecated-guards="V_SIM_DISABLE_DEPRECATED" # Extra options to supply to gtkdoc-mkdb. # e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml MKDB_OPTIONS = --xml-mode --output-format=xml --name-space=visu # Extra options to supply to gtkdoc-mktmpl # e.g. MKTMPL_OPTIONS=--only-section-tmpl MKTMPL_OPTIONS = # Extra options to supply to gtkdoc-mkhtml MKHTML_OPTIONS = --path=$(abs_top_builddir)/Documentation/reference # Extra options to supply to gtkdoc-fixref. Not normally needed. # e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html FIXXREF_OPTIONS = # Used for dependencies. The docs will be rebuilt if any of these change. # e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h # e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c HFILE_GLOB = $(top_srcdir)/src/*.h $(top_srcdir)/src/*/*.h CFILE_GLOB = $(top_srcdir)/src/*.c $(top_srcdir)/src/*/*.c # Extra header to include when scanning, which are not under DOC_SOURCE_DIR # e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h EXTRA_HFILES = # Header files to ignore when scanning. Use base file name, no paths # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h IGNORE_HFILES = support.h interface.h visu_tools.h externalModules.h externalPairsExtensions.h externalGtkPairsExtensions.h externalDumpModules.h externalVisuExtensions.h atoms_yaml.h rings.h dumpToGif.h callbacks.h # Images to copy into HTML directory. # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png HTML_IMAGES = ../../pixmaps/illustration/axesTransform.png # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.sgml building.sgml changes-2.0.sgml content_files = # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded # These files must be listed here *and* in content_files # e.g. expand_content_files=running.sgml expand_content_files = INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src @GTKS_CFLAGS@ @GLU_CFLAGS@ GTKDOC_LIBS = \ $(top_builddir)/src/lib@PACKAGE_TARNAME@-3.la \ @GTKS_LIBS@ @GLU_LIBS@ @EXTRA_LDFLAGS@ @EXTRA_LIBS@ @GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) @GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) @GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_RUN = @GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_RUN = $(LIBTOOL) --mode=execute # We set GPATH here; this gives us semantics for GNU make # which are more like other make's VPATH, when it comes to # whether a source that is a target of one rule is then # searched for in VPATH/GPATH. # GPATH = $(srcdir) TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE) SETUP_FILES = \ $(content_files) \ $(DOC_MAIN_SGML_FILE) \ $(DOC_MODULE)-sections.txt \ $(DOC_MODULE)-overrides.txt # This includes the standard gtk-doc make rules, copied by gtkdocize. # Other files to distribute # e.g. EXTRA_DIST += version.xml.in EXTRA_DIST = $(HTML_IMAGES) $(SETUP_FILES) version.in DOC_STAMPS = setup-build.stamp scan-build.stamp sgml-build.stamp \ html-build.stamp pdf-build.stamp \ sgml.stamp html.stamp pdf.stamp SCANOBJ_FILES = \ $(DOC_MODULE).args \ $(DOC_MODULE).hierarchy \ $(DOC_MODULE).interfaces \ $(DOC_MODULE).prerequisites \ $(DOC_MODULE).signals REPORT_FILES = \ $(DOC_MODULE)-undocumented.txt \ $(DOC_MODULE)-undeclared.txt \ $(DOC_MODULE)-unused.txt CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) @ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_FALSE@HTML_BUILD_STAMP = @ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_TRUE@HTML_BUILD_STAMP = html-build.stamp @ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_FALSE@PDF_BUILD_STAMP = @ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_TRUE@PDF_BUILD_STAMP = pdf-build.stamp # Files not to distribute # for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types # for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt DISTCLEANFILES = $(DOC_MODULE).types $(DOC_MODULE)-sections.txt # Comment this out if you want your docs-status tested during 'make check' @ENABLE_GTK_DOC_TRUE@TESTS_ENVIRONMENT = cd $(srcdir) && \ @ENABLE_GTK_DOC_TRUE@ DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \ @ENABLE_GTK_DOC_TRUE@ SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) @ENABLE_GTK_DOC_TRUE@TESTS = $(GTKDOC_CHECK) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/gtk-doc.make $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Documentation/reference/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Documentation/reference/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(srcdir)/gtk-doc.make: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): version: $(top_builddir)/config.status $(srcdir)/version.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list=' $(TESTS) '; \ $(am__tty_colors); \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ col=$$red; res=XPASS; \ ;; \ *) \ col=$$grn; res=PASS; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xfail=`expr $$xfail + 1`; \ col=$$lgn; res=XFAIL; \ ;; \ *) \ failed=`expr $$failed + 1`; \ col=$$red; res=FAIL; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ col=$$blu; res=SKIP; \ fi; \ echo "$${col}$$res$${std}: $$tst"; \ done; \ if test "$$all" -eq 1; then \ tests="test"; \ All=""; \ else \ tests="tests"; \ All="All "; \ fi; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="$$All$$all $$tests passed"; \ else \ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all $$tests failed"; \ else \ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ if test "$$skip" -eq 1; then \ skipped="($$skip test was not run)"; \ else \ skipped="($$skip tests were not run)"; \ fi; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ if test "$$failed" -eq 0; then \ col="$$grn"; \ else \ col="$$red"; \ fi; \ echo "$${col}$$dashes$${std}"; \ echo "$${col}$$banner$${std}"; \ test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \ test -z "$$report" || echo "$${col}$$report$${std}"; \ echo "$${col}$$dashes$${std}"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile all-local installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-local dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic \ maintainer-clean-local mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local .MAKE: check-am install-am install-strip .PHONY: all all-am all-local check check-TESTS check-am clean \ clean-generic clean-libtool clean-local dist-hook distclean \ distclean-generic distclean-libtool distclean-local distdir \ dvi dvi-am html html-am info info-am install install-am \ install-data install-data-am install-data-local install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic \ maintainer-clean-local mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-local @ENABLE_GTK_DOC_TRUE@all-local: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) @ENABLE_GTK_DOC_FALSE@all-local: docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) $(REPORT_FILES): sgml-build.stamp #### setup #### setup-build.stamp: -@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ echo ' DOC Preparing build'; \ files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \ if test "x$$files" != "x" ; then \ for file in $$files ; do \ test -f $(abs_srcdir)/$$file && \ cp -pu $(abs_srcdir)/$$file $(abs_builddir)/ || true; \ done; \ fi; \ fi @touch setup-build.stamp #### scan #### scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB) @echo ' DOC Scanning header files' @_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) @if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ echo " DOC Introspecting gobjects"; \ scanobj_options=""; \ gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$(?)" = "0"; then \ if test "x$(V)" = "x1"; then \ scanobj_options="--verbose"; \ fi; \ fi; \ CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \ else \ for i in $(SCANOBJ_FILES) ; do \ test -f $$i || touch $$i ; \ done \ fi @touch scan-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp @true #### xml #### sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) @echo ' DOC Building XML' @_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) @touch sgml-build.stamp sgml.stamp: sgml-build.stamp @true #### html #### html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) @echo ' DOC Building HTML' @rm -rf html @mkdir html @mkhtml_options=""; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$(?)" = "0"; then \ if test "x$(V)" = "x1"; then \ mkhtml_options="$$mkhtml_options --verbose"; \ fi; \ fi; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ if test "$(?)" = "0"; then \ mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \ fi; \ cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) -@test "x$(HTML_IMAGES)" = "x" || \ for file in $(HTML_IMAGES) ; do \ if test -f $(abs_srcdir)/$$file ; then \ cp $(abs_srcdir)/$$file $(abs_builddir)/html; \ fi; \ if test -f $(abs_builddir)/$$file ; then \ cp $(abs_builddir)/$$file $(abs_builddir)/html; \ fi; \ done; @echo ' DOC Fixing cross-references' @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) @touch html-build.stamp #### pdf #### pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) @echo ' DOC Building PDF' @rm -f $(DOC_MODULE).pdf @mkpdf_options=""; \ gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$(?)" = "0"; then \ if test "x$(V)" = "x1"; then \ mkpdf_options="$$mkpdf_options --verbose"; \ fi; \ fi; \ if test "x$(HTML_IMAGES)" != "x"; then \ for img in $(HTML_IMAGES); do \ part=`dirname $$img`; \ echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \ if test $$? != 0; then \ mkpdf_options="$$mkpdf_options --imgdir=$$part"; \ fi; \ done; \ fi; \ gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) @touch pdf-build.stamp ############## clean-local: @rm -f *~ *.bak @rm -rf .libs distclean-local: @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \ $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \ fi maintainer-clean-local: clean @rm -rf xml html install-data-local: @installfiles=`echo $(builddir)/html/*`; \ if test "$$installfiles" = '$(builddir)/html/*'; \ then echo 1>&2 'Nothing to install' ; \ else \ if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ $(mkinstalldirs) $${installdir} ; \ for i in $$installfiles; do \ echo ' $(INSTALL_DATA) '$$i ; \ $(INSTALL_DATA) $$i $${installdir}; \ done; \ if test -n "$(DOC_MODULE_VERSION)"; then \ mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ fi; \ $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ fi uninstall-local: @if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ rm -rf $${installdir} # # Require gtk-doc when making dist # @ENABLE_GTK_DOC_TRUE@dist-check-gtkdoc: @ENABLE_GTK_DOC_FALSE@dist-check-gtkdoc: @ENABLE_GTK_DOC_FALSE@ @echo "*** gtk-doc must be installed and enabled in order to make dist" @ENABLE_GTK_DOC_FALSE@ @false dist-hook: dist-check-gtkdoc dist-hook-local @mkdir $(distdir)/html @cp ./html/* $(distdir)/html @-cp ./$(DOC_MODULE).pdf $(distdir)/ @-cp ./$(DOC_MODULE).types $(distdir)/ @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/ @cd $(distdir) && rm -f $(DISTCLEANFILES) @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html .PHONY : dist-hook-local docs #-include $(top_srcdir)/git.mk # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: v_sim-3.7.0/Documentation/reference/gtk-doc.make0000644000353400050620000001726712215546515016542 00000000000000# -*- mode: makefile -*- #################################### # Everything below here is generic # #################################### if GTK_DOC_USE_LIBTOOL GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) GTKDOC_RUN = $(LIBTOOL) --mode=execute else GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) GTKDOC_RUN = endif # We set GPATH here; this gives us semantics for GNU make # which are more like other make's VPATH, when it comes to # whether a source that is a target of one rule is then # searched for in VPATH/GPATH. # GPATH = $(srcdir) TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE) SETUP_FILES = \ $(content_files) \ $(DOC_MAIN_SGML_FILE) \ $(DOC_MODULE)-sections.txt \ $(DOC_MODULE)-overrides.txt EXTRA_DIST = \ $(HTML_IMAGES) \ $(SETUP_FILES) DOC_STAMPS=setup-build.stamp scan-build.stamp sgml-build.stamp \ html-build.stamp pdf-build.stamp \ sgml.stamp html.stamp pdf.stamp SCANOBJ_FILES = \ $(DOC_MODULE).args \ $(DOC_MODULE).hierarchy \ $(DOC_MODULE).interfaces \ $(DOC_MODULE).prerequisites \ $(DOC_MODULE).signals REPORT_FILES = \ $(DOC_MODULE)-undocumented.txt \ $(DOC_MODULE)-undeclared.txt \ $(DOC_MODULE)-unused.txt CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) if ENABLE_GTK_DOC if GTK_DOC_BUILD_HTML HTML_BUILD_STAMP=html-build.stamp else HTML_BUILD_STAMP= endif if GTK_DOC_BUILD_PDF PDF_BUILD_STAMP=pdf-build.stamp else PDF_BUILD_STAMP= endif all-local: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) else all-local: endif docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) $(REPORT_FILES): sgml-build.stamp #### setup #### setup-build.stamp: -@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ echo ' DOC Preparing build'; \ files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \ if test "x$$files" != "x" ; then \ for file in $$files ; do \ test -f $(abs_srcdir)/$$file && \ cp -pu $(abs_srcdir)/$$file $(abs_builddir)/ || true; \ done; \ fi; \ fi @touch setup-build.stamp #### scan #### scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB) @echo ' DOC Scanning header files' @_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) @if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ echo " DOC Introspecting gobjects"; \ scanobj_options=""; \ gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$(?)" = "0"; then \ if test "x$(V)" = "x1"; then \ scanobj_options="--verbose"; \ fi; \ fi; \ CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \ else \ for i in $(SCANOBJ_FILES) ; do \ test -f $$i || touch $$i ; \ done \ fi @touch scan-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp @true #### xml #### sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) @echo ' DOC Building XML' @_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) @touch sgml-build.stamp sgml.stamp: sgml-build.stamp @true #### html #### html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) @echo ' DOC Building HTML' @rm -rf html @mkdir html @mkhtml_options=""; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$(?)" = "0"; then \ if test "x$(V)" = "x1"; then \ mkhtml_options="$$mkhtml_options --verbose"; \ fi; \ fi; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ if test "$(?)" = "0"; then \ mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \ fi; \ cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) -@test "x$(HTML_IMAGES)" = "x" || \ for file in $(HTML_IMAGES) ; do \ if test -f $(abs_srcdir)/$$file ; then \ cp $(abs_srcdir)/$$file $(abs_builddir)/html; \ fi; \ if test -f $(abs_builddir)/$$file ; then \ cp $(abs_builddir)/$$file $(abs_builddir)/html; \ fi; \ done; @echo ' DOC Fixing cross-references' @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) @touch html-build.stamp #### pdf #### pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) @echo ' DOC Building PDF' @rm -f $(DOC_MODULE).pdf @mkpdf_options=""; \ gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$(?)" = "0"; then \ if test "x$(V)" = "x1"; then \ mkpdf_options="$$mkpdf_options --verbose"; \ fi; \ fi; \ if test "x$(HTML_IMAGES)" != "x"; then \ for img in $(HTML_IMAGES); do \ part=`dirname $$img`; \ echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \ if test $$? != 0; then \ mkpdf_options="$$mkpdf_options --imgdir=$$part"; \ fi; \ done; \ fi; \ gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) @touch pdf-build.stamp ############## clean-local: @rm -f *~ *.bak @rm -rf .libs distclean-local: @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \ $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \ fi maintainer-clean-local: clean @rm -rf xml html install-data-local: @installfiles=`echo $(builddir)/html/*`; \ if test "$$installfiles" = '$(builddir)/html/*'; \ then echo 1>&2 'Nothing to install' ; \ else \ if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ $(mkinstalldirs) $${installdir} ; \ for i in $$installfiles; do \ echo ' $(INSTALL_DATA) '$$i ; \ $(INSTALL_DATA) $$i $${installdir}; \ done; \ if test -n "$(DOC_MODULE_VERSION)"; then \ mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ fi; \ $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ fi uninstall-local: @if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ rm -rf $${installdir} # # Require gtk-doc when making dist # if ENABLE_GTK_DOC dist-check-gtkdoc: else dist-check-gtkdoc: @echo "*** gtk-doc must be installed and enabled in order to make dist" @false endif dist-hook: dist-check-gtkdoc dist-hook-local @mkdir $(distdir)/html @cp ./html/* $(distdir)/html @-cp ./$(DOC_MODULE).pdf $(distdir)/ @-cp ./$(DOC_MODULE).types $(distdir)/ @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/ @cd $(distdir) && rm -f $(DISTCLEANFILES) @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html .PHONY : dist-hook-local docs v_sim-3.7.0/Documentation/reference/version.in0000644000353400050620000000002212215546175016347 00000000000000@PACKAGE_VERSION@ v_sim-3.7.0/Documentation/reference/v_sim-docs.sgml0000644000353400050620000002540012215546175017270 00000000000000 ]> V_Sim API - Reference Manual for V_Sim Core This is the program itself without the interface. Basically V_Sim allows the user to see in a pseudo 3D representation a list of elements known by their positions in space, all contained in a box. And it gives tools to rotate, zoom and retrieve informations on positions, angles and distances. The program is supposed to be modular and the programer can add new functions "easily". There are three sections. The first section deals with all the main functions to handle with this modularity, with the 3D drawing... The second section gathers all the extensions that have been added to improve V_Sim in the rendering area. The third section deals with the different possibilities that exist for the user to render different kind of elements. Main capabilities of V_Sim Main capabilities. Methods to read input files and draw nodes Main purpose of V_Sim is to render some file describing positions and other informations n a graphical way. This is achieved implementing VisuRendering. Currently two methods exist, one draw spheres (or other geometric forms such as cubes) on defined positions. The other is a more specialised version of the former, adding a direction information on each position. This method is called SpinRendering and is usefull to render spin configurations. OpenGL drawing methods All rendering is done via objects inherited from VisuExtension. Dealing with pairs Drawing pairs is done via external modules. For the moment, two modules exist to draw pairs : one draws flat lines between elements (colour and width are user-defined) and the other use cylinders to represents pairs (radius and colour also user-defined). Methods to export to other formats Generic tools There are differents tools that can be shared by every modules in V_Sim, such as file support, list of colors, common shades... OpenGL tools These little utilities are dealing with OpenGL. They are not essential to V_Sim but can add some nice features that can be shared between different modules. Miscellaneous Other methods, including OS dependancy and rendering window backend. Gtk interface Main interface V_Sim specific widgets Panel add-ons Additional information Object Hierarchy New symbols in 3.1 New symbols in 3.2 New symbols in 3.3 New symbols in 3.4 New symbols in 3.5 New symbols in 3.6 New symbols in 3.7 API Index v_sim-3.7.0/Documentation/reference/v_sim-overrides.txt0000644000353400050620000000000012215553016020174 00000000000000v_sim-3.7.0/Documentation/reference/html/0000755000353400050620000000000012216331357015357 500000000000000v_sim-3.7.0/Documentation/reference/html/annotation-glossary.html0000644000353400050620000001152312216331356022201 00000000000000 Annotation Glossary

    Annotation Glossary

    O

    out

    Parameter for returning results. Default is transfer full.

    A

    allow-none

    NULL is ok, both for passing and for returning.

    I

    inout

    Parameter for input and for returning results. Default is transfer full.

    C

    closure

    This parameter is a 'user_data', for callbacks; many bindings can pass NULL here.

    T

    transfer none

    Don't free data after the code is done.

    A

    array

    Parameter points to an array of items.

    E

    element-type

    Generics and defining elements of containers and arrays.

    I

    in

    Parameter for input. Default is transfer none.

    T

    transfer container

    Free data container after the code is done.

    transfer full

    Free data after the code is done.

    S

    scope call

    The callback is valid only during the call to the method.

    T

    type

    Override the parsed C type with given type

    v_sim-3.7.0/Documentation/reference/html/api-3.1.html0000644000353400050620000001115212216331356017234 00000000000000 New symbols in 3.1 v_sim-3.7.0/Documentation/reference/html/api-3.2.html0000644000353400050620000001400012216331356017230 00000000000000 New symbols in 3.2 v_sim-3.7.0/Documentation/reference/html/api-3.3.html0000644000353400050620000003523112216331356017242 00000000000000 New symbols in 3.3

    New symbols in 3.3

    D

    VisuData::objectFreed, object signal in VisuData
    VisuDataNode::propertyUnused, object signal in dataNode
    VisuDataNode::propertyUsed, object signal in dataNode
    VisuDataNode::valueChanged, object signal in dataNode

    G

    VisuGlExtScale, struct in VisuGlExtScale
    VisuGlExtScaleClass, struct in VisuGlExtScale
    visu_gl_ext_scale_draw, function in VisuGlExtScale
    visu_gl_ext_scale_getDefaultLineWidth, function in VisuGlExtScale
    visu_gl_ext_scale_getDefaultRGB, function in VisuGlExtScale
    visu_gl_ext_scale_getDefaultStipple, function in VisuGlExtScale
    visu_gl_ext_scale_getLegend, function in VisuGlExtScale
    visu_gl_ext_scale_getLength, function in VisuGlExtScale
    visu_gl_ext_scale_getOrientation, function in VisuGlExtScale
    visu_gl_ext_scale_getOrigin, function in VisuGlExtScale
    visu_gl_ext_scale_setDefaultLineWidth, function in VisuGlExtScale
    visu_gl_ext_scale_setDefaultRGB, function in VisuGlExtScale
    visu_gl_ext_scale_setDefaultStipple, function in VisuGlExtScale
    visu_gl_ext_scale_setLegend, function in VisuGlExtScale
    visu_gl_ext_scale_setLength, function in VisuGlExtScale
    visu_gl_ext_scale_setOrientation, function in VisuGlExtScale
    visu_gl_ext_scale_setOrigin, function in VisuGlExtScale

    P

    VisuPlane::moved, object signal in plane

    T

    tool_matrix_cartesianToSpherical, function in toolMatrix
    tool_matrix_sphericalToCartesian, function in toolMatrix
    TOOL_XYZ_MASK_ALL, macro in toolMatrix
    TOOL_XYZ_MASK_X, macro in toolMatrix
    TOOL_XYZ_MASK_Y, macro in toolMatrix
    TOOL_XYZ_MASK_Z, macro in toolMatrix

    U

    VisuUiColorCombobox::color-value-changed, object signal in gtk_colorComboBoxWidget
    VisuUiColorCombobox::material-value-changed, object signal in gtk_colorComboBoxWidget
    VisuUiPanel::page-entered, object signal in gtk_toolPanelWidget
    VisuUiShadeCombobox, struct in gtk_shadeComboBoxWidget
    VisuUiShadeCombobox::shade-selected, object signal in gtk_shadeComboBoxWidget
    VisuUiShadeComboboxClass, struct in gtk_shadeComboBoxWidget
    visu_ui_color_combobox_getRangeMaterial, function in gtk_colorComboBoxWidget
    visu_ui_color_combobox_getRangeWidgets, function in gtk_colorComboBoxWidget
    visu_ui_color_combobox_newWithRanges, function in gtk_colorComboBoxWidget
    visu_ui_color_combobox_setExpanded, function in gtk_colorComboBoxWidget
    visu_ui_color_combobox_setRangeColor, function in gtk_colorComboBoxWidget
    visu_ui_color_combobox_setRangeMaterial, function in gtk_colorComboBoxWidget
    visu_ui_shade_combobox_buildStamp, function in gtk_shadeComboBoxWidget
    visu_ui_shade_combobox_getSelection, function in gtk_shadeComboBoxWidget
    visu_ui_shade_combobox_getStamp, function in gtk_shadeComboBoxWidget
    visu_ui_shade_combobox_new, function in gtk_shadeComboBoxWidget
    visu_ui_shade_combobox_setSelectionByShade, function in gtk_shadeComboBoxWidget
    v_sim-3.7.0/Documentation/reference/html/api-3.4.html0000644000353400050620000003156712216331356017253 00000000000000 New symbols in 3.4

    New symbols in 3.4

    B

    visu_basic_getDataDir, function in visu_basic
    visu_basic_getIconsDir, function in visu_basic
    visu_basic_getLegalDir, function in visu_basic
    visu_basic_getLocalDir, function in visu_basic
    visu_basic_getLocaleDir, function in visu_basic
    visu_basic_getOldLocalDir, function in visu_basic
    visu_basic_getPixmapsDir, function in visu_basic
    visu_basic_getPluginsDir, function in visu_basic

    L

    visu_line_draw, function in isoline
    visu_line_free, function in isoline

    N

    VisuNodeArray::PopulationDecrease, object signal in VisuNodeArray
    VisuNodeArray::PopulationIncrease, object signal in VisuNodeArray

    T

    ToolMatrixScalingFlag, enum in toolMatrix
    tool_matrix_getScaledValue, user_function in toolMatrix

    U

    VisuUiLine, struct in gtk_lineObjectWidget
    VisuUiLine::color-changed, object signal in gtk_lineObjectWidget
    VisuUiLine::stipple-changed, object signal in gtk_lineObjectWidget
    VisuUiLine::use-changed, object signal in gtk_lineObjectWidget
    VisuUiLine::width-changed, object signal in gtk_lineObjectWidget
    VisuUiLineClass, struct in gtk_lineObjectWidget
    VisuUiOrientationChooser::values-changed, object signal in gtk_orientationChooser
    VisuUiStippleCombobox, struct in gtk_stippleComboBoxWidget
    VisuUiStippleCombobox::stipple-selected, object signal in gtk_stippleComboBoxWidget
    VisuUiStippleComboboxClass, struct in gtk_stippleComboBoxWidget
    visu_ui_color_combobox_setPrintValues, function in gtk_colorComboBoxWidget
    visu_ui_line_new, function in gtk_lineObjectWidget
    visu_ui_line_setColor, function in gtk_lineObjectWidget
    visu_ui_line_setStipple, function in gtk_lineObjectWidget
    visu_ui_line_setUsed, function in gtk_lineObjectWidget
    visu_ui_line_setWidth, function in gtk_lineObjectWidget
    visu_ui_panel_map_setData, function in panelMap
    visu_ui_panel_map_setNIsolines, function in panelMap
    visu_ui_panel_map_setScale, function in panelMap
    visu_ui_stipple_combobox_add, function in gtk_stippleComboBoxWidget
    visu_ui_stipple_combobox_class_buildStamp, function in gtk_stippleComboBoxWidget
    visu_ui_stipple_combobox_getSelection, function in gtk_stippleComboBoxWidget
    visu_ui_stipple_combobox_getStamp, function in gtk_stippleComboBoxWidget
    visu_ui_stipple_combobox_new, function in gtk_stippleComboBoxWidget
    visu_ui_stipple_combobox_setSelection, function in gtk_stippleComboBoxWidget
    v_sim-3.7.0/Documentation/reference/html/api-3.5.html0000644000353400050620000004237312216331356017251 00000000000000 New symbols in 3.5

    New symbols in 3.5

    B

    visu_basic_freeAll, function in visu_basic
    visu_basic_getPreferedUnit, function in visu_basic
    visu_basic_setPreferedUnit, function in visu_basic

    C

    commandLineExport, function in visu_commandLine
    commandLineFree_all, function in visu_commandLine
    commandLineGet_iSet, function in visu_commandLine
    commandLineGet_isoLinesColor, function in visu_commandLine
    commandLineGet_valueFile, function in visu_commandLine
    commandLineGet_windowMode, function in visu_commandLine

    D

    visu_data_getDistanceList, function in VisuData
    visu_data_getNodeScalingFactor, function in VisuData
    visu_data_setNodeScalingFunc, function in VisuData

    G

    visu_geodiff_getPeriodicDistance, function in geometry
    visu_geodiff_new, function in geometry
    visu_geometry_init, function in geometry
    visu_gl_drawTorus, function in objectList
    visu_gl_ext_marks_exportXMLFile, function in marks
    visu_gl_ext_marks_parseXMLFile, function in marks

    N

    VisuNodeArray::PopulationDefined, object signal in VisuNodeArray
    VisuNodeInfo, typedef in VisuNodeArray

    T

    ToolUnits, enum in toolPhysic
    tool_file_format_getPropertyByName, function in ToolFileFormat
    tool_matrix_getScaledLinear, function in toolMatrix
    tool_matrix_getScaledLinearInv, function in toolMatrix
    tool_matrix_getScaledLog, function in toolMatrix
    tool_matrix_getScaledLogInv, function in toolMatrix
    tool_matrix_getScaledZeroCentredLog, function in toolMatrix
    tool_matrix_getScaledZeroCentredLogInv, function in toolMatrix
    tool_matrix_init, function in toolMatrix
    tool_physic_getUnitFromName, function in toolPhysic
    tool_physic_getUnitNames, function in toolPhysic
    tool_physic_getUnitValueInMeter, function in toolPhysic

    U

    VisuUiValueIo, struct in gtk_valueIOWidget
    VisuUiValueIoClass, struct in gtk_valueIOWidget
    visu_ui_curve_frame_setStyle, function in gtk_curveWidget
    visu_ui_panel_map_setIsolinesColor, function in panelMap
    visu_ui_rendering_window_setCurrent, function in gtk_renderingWindowWidget
    visu_ui_value_io_connectOnOpen, function in gtk_valueIOWidget
    visu_ui_value_io_connectOnSave, function in gtk_valueIOWidget
    visu_ui_value_io_getFilename, function in gtk_valueIOWidget
    visu_ui_value_io_new, function in gtk_valueIOWidget
    visu_ui_value_io_setFilename, function in gtk_valueIOWidget
    visu_ui_value_io_setSensitiveOpen, function in gtk_valueIOWidget
    visu_ui_value_io_setSensitiveSave, function in gtk_valueIOWidget

    V

    visu_vibration_getCharacteristic, function in vibration
    visu_vibration_getCurrentMode, function in vibration
    visu_vibration_getNPhonons, function in vibration
    visu_vibration_init, function in vibration
    visu_vibration_isSet, function in vibration
    visu_vibration_play, function in vibration
    visu_vibration_resetPosition, function in vibration
    visu_vibration_setAmplitude, function in vibration
    visu_vibration_setCharacteristic, function in vibration
    visu_vibration_setCurrentMode, function in vibration
    visu_vibration_setDisplacements, function in vibration
    visu_vibration_setUserFrequency, function in vibration
    visu_vibration_setZeroTime, function in vibration
    visu_vibration_stop, function in vibration
    v_sim-3.7.0/Documentation/reference/html/api-3.6.html0000644000353400050620000013556612216331356017261 00000000000000 New symbols in 3.6

    New symbols in 3.6

    B

    visu_basic_getMainContext, function in visu_basic
    visu_basic_setExePath, function in visu_basic
    visu_basic_showOptionHelp, function in visu_basic

    C

    visu_colorization_getFileSet, function in dataFile
    commandLineGet_coloredMap, function in visu_commandLine
    commandLineGet_introspect, function in visu_commandLine
    commandLineGet_mapMinMax, function in visu_commandLine
    commandLineGet_mapPrecision, function in visu_commandLine
    visu_config_file_getPathToResources, function in visu_configFile

    D

    visu_data_addNodeFromElementName, function in VisuData
    visu_data_getFilesAsLabel, function in VisuData
    visu_data_getNodeCoordinates, function in VisuData
    visu_data_getUserColor, function in VisuData
    visu_data_hasUserColorFunc, function in VisuData
    visu_data_reorder, function in VisuData
    visu_data_setNewBasis, function in VisuData
    visu_data_setNewBasisFromNodes, function in VisuData
    visu_dump_write, function in visu_dump

    E

    VisuElement::ElementMaterialChanged, object signal in visu_elements
    VisuElement::ElementNew, object signal in visu_elements
    VisuElement::ElementPlaneChanged, object signal in visu_elements
    VisuElement::ElementVisibilityChanged, object signal in visu_elements
    visu_element_lookup, function in visu_elements

    G

    visu_geodiff_export, function in geometry
    visu_geodiff_hasData, function in geometry
    VisuGlExtMarks, struct in marks
    VisuGlExtMarks::highlightChanged, object signal in marks
    VisuGlExtMarks::measurementChanged, object signal in marks
    VisuGlExtMarksClass, struct in marks
    VisuGlExtMarksStatus, enum in marks
    visu_gl_camera_getRefLength, function in VisuGlView
    visu_gl_camera_setRefLength, function in VisuGlView
    visu_gl_camera_setUpAxis, function in VisuGlView
    visu_gl_drawAngle, function in objectList
    visu_gl_drawDistance, function in objectList
    visu_gl_drawEdgeArrow, function in objectList
    visu_gl_drawEllipsoid, function in objectList
    visu_gl_drawSmoothArrow, function in objectList
    visu_gl_ext_marks_getHighlightedList, function in marks
    visu_gl_ext_marks_getMeasurementLabels, function in marks
    visu_gl_ext_marks_getMeasurementStrings, function in marks
    visu_gl_ext_marks_setHighlightedList, function in marks
    visu_gl_ext_pairs_getDrawMethod, function in VisuGlExtPairs
    visu_gl_ext_pairs_setDrawMethod, function in VisuGlExtPairs
    visu_gl_initGraphics, function in opengl
    visu_gl_pairs_wire_getShade, function in wire
    visu_gl_pairs_wire_getStatic, function in wire
    visu_gl_pairs_wire_setShade, function in wire
    visu_gl_text_onNewContext, function in text

    I

    VisuInteractive::move, object signal in interactive
    VisuInteractive::node-selection, object signal in interactive
    VisuInteractive::observe, object signal in interactive
    VisuInteractive::region-selection, object signal in interactive
    VisuInteractive::selection-error, object signal in interactive
    VisuInteractive::start-move, object signal in interactive
    VisuInteractive::stop, object signal in interactive
    visu_interactive_getSavedCameras, function in interactive
    visu_interactive_popSavedCamera, function in interactive
    visu_interactive_pushSavedCamera, function in interactive

    L

    visu_line_getValue, function in isoline
    visu_line_newFromTriangles, function in isoline
    visu_line_project, function in isoline

    M

    VisuMap, struct in map
    VisuMapExportFormat, enum in map
    visu_map_compute, function in map
    visu_map_draw, function in map
    visu_map_export, function in map
    visu_map_free, function in map
    visu_map_getFieldMinMax, function in map
    visu_map_getScaledMinMax, function in map
    visu_map_new, function in map
    visu_map_newFromPlane, function in map
    visu_map_setField, function in map
    visu_map_setLevel, function in map
    visu_map_setLines, function in map

    N

    VisuNodeArray::MaterialChanged, object signal in VisuNodeArray
    VisuNodeArrayIterType, enum in VisuNodeArray
    visu_node_array_iterNextNodeOriginal, function in VisuNodeArray
    visu_node_array_iter_next, function in VisuNodeArray
    visu_node_array_iter_next2, function in VisuNodeArray
    visu_node_array_switchNumber, function in VisuNodeArray

    O

    VisuObject::DirectoryChanged, object signal in VisuObject
    visu_object_setLoadMessage, function in VisuObject
    visu_object_setLoadMessageFunc, function in VisuObject

    P

    visu_pair_distribution_getNextPick, function in VisuPairLink
    visu_pair_extension_getByName, function in VisuGlExtPairs
    VisuPaths, struct in geometry
    visu_paths_addFromDiff, function in geometry
    visu_paths_addNodeStep, function in geometry
    visu_paths_constrainInBox, function in geometry
    visu_paths_draw, function in geometry
    visu_paths_empty, function in geometry
    visu_paths_exportXMLFile, function in geometry
    visu_paths_free, function in geometry
    visu_paths_getLength, function in geometry
    visu_paths_getToolShade, function in geometry
    visu_paths_new, function in geometry
    visu_paths_parseFromXML, function in geometry
    visu_paths_pinPositions, function in geometry
    visu_paths_setToolShade, function in geometry
    visu_paths_setTranslation, function in geometry
    visu_plane_getLineIntersection, function in plane
    visu_plane_getReducedIntersection, function in plane
    visu_plugin_getAuthors, function in visu_plugins
    visu_plugin_getDescription, function in visu_plugins
    visu_plugin_getIconPath, function in visu_plugins
    visu_plugin_getName, function in visu_plugins
    visu_plugin_initGtk, function in visu_plugins

    R

    VisuRendering::elementSizeChanged, object signal in VisuRendering
    VisuRendering::fileTypeChanged, object signal in VisuRendering
    VisuRenderingSpin::colorisationChange, object signal in renderingSpin
    visu_rendering_atomic_new, function in renderingAtomic
    visu_rendering_createElement, function in VisuRendering
    visu_rendering_createNode, function in VisuRendering
    visu_rendering_getByName, function in VisuRendering
    visu_rendering_getFileFormat, function in VisuRendering
    visu_rendering_setFileFormat, function in VisuRendering
    visu_rendering_spin_new, function in renderingSpin

    T

    ToolFileFormatIter, struct in ToolFileFormat
    ToolMatrixSphericalCoord, enum in toolMatrix
    tool_file_format_canMatch, function in ToolFileFormat
    tool_file_format_copy, function in ToolFileFormat
    tool_file_format_getFilePatterns, function in ToolFileFormat
    tool_file_format_iterNextProperty, function in ToolFileFormat
    tool_matrix_determinant, function in toolMatrix
    tool_matrix_getRotationFromFull, function in toolMatrix
    tool_matrix_invert, function in toolMatrix

    U

    VisuUiCurveFrame, struct in gtk_curveWidget
    VisuUiCurveFrameClass, struct in gtk_curveWidget
    VisuUiElementCombobox, struct in gtk_elementComboBox
    VisuUiElementCombobox::element-selected, object signal in gtk_elementComboBox
    VisuUiElementComboboxClass, struct in gtk_elementComboBox
    VisuUiRenderingWindow::export, object signal in gtk_renderingWindowWidget
    VisuUiRenderingWindow::open, object signal in gtk_renderingWindowWidget
    VisuUiRenderingWindow::reload, object signal in gtk_renderingWindowWidget
    VisuUiRenderingWindow::show-action-dialog, object signal in gtk_renderingWindowWidget
    VisuUiRenderingWindow::show-main-panel, object signal in gtk_renderingWindowWidget
    visu_ui_curve_frame_addData, function in gtk_curveWidget
    visu_ui_curve_frame_draw, function in gtk_curveWidget
    visu_ui_curve_frame_getHighlightRange, function in gtk_curveWidget
    visu_ui_curve_frame_getIntegralInRange, function in gtk_curveWidget
    visu_ui_curve_frame_getMeanInRange, function in gtk_curveWidget
    visu_ui_curve_frame_getSpan, function in gtk_curveWidget
    visu_ui_curve_frame_hasData, function in gtk_curveWidget
    visu_ui_curve_frame_new, function in gtk_curveWidget
    visu_ui_curve_frame_setData, function in gtk_curveWidget
    visu_ui_curve_frame_setFilter, function in gtk_curveWidget
    visu_ui_curve_frame_setHighlightRange, function in gtk_curveWidget
    visu_ui_curve_frame_setNNodes, function in gtk_curveWidget
    visu_ui_curve_frame_setSpan, function in gtk_curveWidget
    visu_ui_element_combobox_getSelection, function in gtk_elementComboBox
    visu_ui_element_combobox_new, function in gtk_elementComboBox
    visu_ui_element_combobox_setSelection, function in gtk_elementComboBox
    visu_ui_interactive_addAction, function in gtk_interactive
    visu_ui_interactive_pick_init, function in gtk_pick
    visu_ui_interactive_setMessage, function in gtk_interactive
    visu_ui_interactive_toggle, function in gtk_interactive
    visu_ui_interactive_unsetMessage, function in gtk_interactive
    visu_ui_line_getOptionBox, function in gtk_lineObjectWidget
    visu_ui_pairs_show, function in gtk_pairs
    visu_ui_panel_browser_setMessage, function in panelBrowser
    visu_ui_panel_elements_getSelected, function in panelElements
    visu_ui_panel_map_setMinMax, function in panelMap
    visu_ui_panel_map_setPrecision, function in panelMap
    visu_ui_rendering_window_class_getAutoAdjust, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_class_getDisplayCoordinatesInReduce, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_class_getInteractive, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_class_setAutoAdjust, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_class_setDisplayCoordinatesInReduce, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_getMarks, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_popInteractive, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_pushInteractive, function in gtk_renderingWindowWidget
    v_sim-3.7.0/Documentation/reference/html/api-3.7.html0000644000353400050620000026257312216331356017261 00000000000000 New symbols in 3.7

    New symbols in 3.7

    B

    VisuBox::BoundaryChanged, object signal in VisuBox
    VisuBox::ExtensionChanged, object signal in VisuBox
    VisuBox::SizeChanged, object signal in VisuBox
    VisuBox::UnitChanged, object signal in VisuBox
    VisuBoxCell, struct in VisuBox
    VisuBoxedInterface, struct in VisuBoxed
    visu_boxed_getBox, function in VisuBoxed
    visu_boxed_setBox, function in VisuBoxed
    VisuBoxVector, enum in VisuBox
    VisuBoxVertices, struct in VisuBox
    visu_box_constrainInside, function in VisuBox
    visu_box_convertBoxCoordinatestoXYZ, function in VisuBox
    visu_box_convertFullToCell, function in VisuBox
    visu_box_convertReducedToXYZ, function in VisuBox
    visu_box_convertXYZtoBoxCoordinates, function in VisuBox
    visu_box_convertXYZToReduced, function in VisuBox
    visu_box_getBoundary, function in VisuBox
    visu_box_getCellMatrix, function in VisuBox
    visu_box_getCellMatrixv, function in VisuBox
    visu_box_getCentre, function in VisuBox
    visu_box_getExtension, function in VisuBox
    visu_box_getGeometry, function in VisuBox
    visu_box_getGlobalSize, function in VisuBox
    visu_box_getInvMatrix, function in VisuBox
    visu_box_getPeriodicArray, function in VisuBox
    visu_box_getPeriodicity, function in VisuBox
    visu_box_getPeriodicVector, function in VisuBox
    visu_box_getPeriodicVectorv, function in VisuBox
    visu_box_getUnit, function in VisuBox
    visu_box_new, function in VisuBox
    visu_box_new_full, function in VisuBox
    visu_box_setBoundary, function in VisuBox
    visu_box_setExtension, function in VisuBox
    visu_box_setGeometry, function in VisuBox
    visu_box_setGeometryFull, function in VisuBox
    visu_box_setMargin, function in VisuBox
    visu_box_setUnit, function in VisuBox

    C

    VisuColorization, struct in dataFile
    VisuColorizationHidingFunc, user_function in dataFile
    visu_colorization_applyHide, function in dataFile
    visu_colorization_get, function in dataFile
    visu_colorization_getRestrictInRange, function in dataFile
    visu_colorization_new, function in dataFile
    visu_colorization_new_fromData, function in dataFile
    visu_colorization_ref, function in dataFile
    visu_colorization_setHidingFunc, function in dataFile
    visu_colorization_setRestrictInRange, function in dataFile
    visu_colorization_unref, function in dataFile
    commandLineGet_colorMinMax, function in visu_commandLine
    commandLineGet_programName, function in visu_commandLine
    commandLineGet_scalingColumn, function in visu_commandLine
    visu_config_file_addBooleanEntry, function in visu_configFile
    visu_config_file_addFloatArrayEntry, function in visu_configFile
    visu_config_file_addStringEntry, function in visu_configFile
    visu_config_file_exportComment, function in visu_configFile
    visu_config_file_exportEntry, function in visu_configFile
    visu_config_file_saveResourcesToXML, function in visu_configFile

    D

    VisuData::FilesChanged, object signal in VisuData
    VisuData::TranslationsChanged, object signal in VisuData
    visu_data_forceXYZtranslation, function in VisuData
    visu_data_getAllNodeExtens, function in VisuData
    visu_data_getNodeUserPosition, function in VisuData
    visu_data_new_withFiles, function in VisuData
    visu_dump_cairo_setPostFunc, function in dumpToSVG
    visu_dump_new, function in visu_dump

    E

    VisuElement::ElementRenderingChanged, object signal in visu_elements
    visu_element_getName, function in visu_elements
    visu_element_getPhysical, function in visu_elements

    G

    VisuGlExtAxes, struct in VisuGlExtAxes
    VisuGlExtAxesClass, struct in VisuGlExtAxes
    VisuGlExtBg, struct in VisuGlExtBg
    VisuGlExtBgClass, struct in VisuGlExtBg
    VisuGlExtBox, struct in VisuGlExtBoxLegend
    VisuGlExtBoxClass, struct in VisuGlExtBoxLegend
    VisuGlExtBoxLegend, struct in VisuGlExtBoxLegend
    VisuGlExtBoxLegendClass, struct in VisuGlExtBoxLegend
    VisuGlExtForces, struct in VisuGlExtForces
    VisuGlExtForcesClass, struct in VisuGlExtForces
    VisuGlExtFrame, struct in VisuGlExtFrame
    VisuGlExtFrameClass, struct in VisuGlExtFrame
    VisuGlExtInfos, struct in VisuGlExtInfos
    VisuGlExtInfosClass, struct in VisuGlExtInfos
    VisuGlExtLegend, struct in VisuGlExtLegend
    VisuGlExtLegendClass, struct in VisuGlExtLegend
    VisuGlExtMaps, struct in VisuGlExtMaps
    VisuGlExtMapsClass, struct in VisuGlExtMaps
    VisuGlExtNodes, struct in VisuGlExtNodes
    VisuGlExtNodesClass, struct in VisuGlExtNodes
    VisuGlExtNodesEffects, enum in VisuGlExtNodes
    VisuGlExtNodeVectors, struct in VisuGlExtNodeVectors
    VisuGlExtNodeVectorsClass, struct in VisuGlExtNodeVectors
    VisuGlExtPairs, struct in VisuGlExtPairs
    VisuGlExtPairsClass, struct in VisuGlExtPairs
    VisuGlExtPaths, struct in VisuGlExtPaths
    VisuGlExtPathsClass, struct in VisuGlExtPaths
    VisuGlExtPlanes, struct in VisuGlExtPlanes
    VisuGlExtPlanesClass, struct in VisuGlExtPlanes
    VisuGlExtShade, struct in VisuGlExtShade
    VisuGlExtShadeClass, struct in VisuGlExtShade
    VisuGlExtSurfaces, struct in VisuGlExtSurfaces
    VisuGlExtSurfacesClass, struct in VisuGlExtSurfaces
    VisuGlTextFunc, user_function in text
    VisuGlView::RefLengthChanged, object signal in VisuGlView
    visu_gl_camera_copy, function in VisuGlView
    visu_gl_ext_axes_getDefault, function in VisuGlExtAxes
    visu_gl_ext_axes_getPosition, function in VisuGlExtAxes
    visu_gl_ext_axes_new, function in VisuGlExtAxes
    visu_gl_ext_axes_setBasis, function in VisuGlExtAxes
    visu_gl_ext_axes_setBasisFromBox, function in VisuGlExtAxes
    visu_gl_ext_axes_setGlView, function in VisuGlExtAxes
    visu_gl_ext_axes_setPosition, function in VisuGlExtAxes
    visu_gl_ext_bg_draw, function in VisuGlExtBg
    visu_gl_ext_bg_getDefault, function in VisuGlExtBg
    visu_gl_ext_bg_new, function in VisuGlExtBg
    visu_gl_ext_bg_setCamera, function in VisuGlExtBg
    visu_gl_ext_bg_setFollowCamera, function in VisuGlExtBg
    visu_gl_ext_bg_setGlView, function in VisuGlExtBg
    visu_gl_ext_box_getDefault, function in VisuGlExtBoxLegend
    visu_gl_ext_box_legend_getDefault, function in VisuGlExtBoxLegend
    visu_gl_ext_box_legend_new, function in VisuGlExtBoxLegend
    visu_gl_ext_box_legend_setBox, function in VisuGlExtBoxLegend
    visu_gl_ext_box_new, function in VisuGlExtBoxLegend
    visu_gl_ext_box_setBasis, function in VisuGlExtBoxLegend
    visu_gl_ext_box_setBox, function in VisuGlExtBoxLegend
    visu_gl_ext_box_setOrigin, function in VisuGlExtBoxLegend
    visu_gl_ext_box_setSideRGB, function in VisuGlExtBoxLegend
    visu_gl_ext_forces_getDefault, function in VisuGlExtForces
    visu_gl_ext_forces_new, function in VisuGlExtForces
    visu_gl_ext_frame_draw, function in VisuGlExtFrame
    visu_gl_ext_frame_getPosition, function in VisuGlExtFrame
    visu_gl_ext_frame_getScale, function in VisuGlExtFrame
    visu_gl_ext_frame_setBgRGBA, function in VisuGlExtFrame
    visu_gl_ext_frame_setFontRGB, function in VisuGlExtFrame
    visu_gl_ext_frame_setGlView, function in VisuGlExtFrame
    visu_gl_ext_frame_setPosition, function in VisuGlExtFrame
    visu_gl_ext_frame_setRequisition, function in VisuGlExtFrame
    visu_gl_ext_frame_setScale, function in VisuGlExtFrame
    visu_gl_ext_frame_setTitle, function in VisuGlExtFrame
    visu_gl_ext_geodiff_getDefault, function in VisuGlExtNodeVectors
    visu_gl_ext_getFromName, function in VisuGlExt
    visu_gl_ext_getGlList, function in VisuGlExt
    visu_gl_ext_getPreferedRenderingMode, function in VisuGlExt
    visu_gl_ext_getSensitiveToRenderingMode, function in VisuGlExt
    visu_gl_ext_infos_draw, function in VisuGlExtInfos
    visu_gl_ext_infos_getDefault, function in VisuGlExtInfos
    visu_gl_ext_infos_new, function in VisuGlExtInfos
    visu_gl_ext_infos_setData, function in VisuGlExtInfos
    visu_gl_ext_infos_setGlView, function in VisuGlExtInfos
    visu_gl_ext_legend_getDefault, function in VisuGlExtLegend
    visu_gl_ext_legend_new, function in VisuGlExtLegend
    visu_gl_ext_legend_setNodes, function in VisuGlExtLegend
    visu_gl_ext_maps_add, function in VisuGlExtMaps
    visu_gl_ext_maps_draw, function in VisuGlExtMaps
    visu_gl_ext_maps_new, function in VisuGlExtMaps
    visu_gl_ext_maps_remove, function in VisuGlExtMaps
    visu_gl_ext_maps_setDirty, function in VisuGlExtMaps
    visu_gl_ext_maps_setGlView, function in VisuGlExtMaps
    visu_gl_ext_maps_setLineColor, function in VisuGlExtMaps
    visu_gl_ext_maps_setPrecision, function in VisuGlExtMaps
    visu_gl_ext_maps_setShade, function in VisuGlExtMaps
    visu_gl_ext_maps_setTransparent, function in VisuGlExtMaps
    visu_gl_ext_marks_getHighlightStatus, function in marks
    visu_gl_ext_marks_getInternalList, function in marks
    visu_gl_ext_marks_setGlView, function in marks
    visu_gl_ext_marks_setInteractive, function in marks
    visu_gl_ext_nodes_draw, function in VisuGlExtNodes
    visu_gl_ext_nodes_getData, function in VisuGlExtNodes
    visu_gl_ext_nodes_getSelection, function in VisuGlExtNodes
    visu_gl_ext_nodes_getSelectionByRegion, function in VisuGlExtNodes
    visu_gl_ext_nodes_new, function in VisuGlExtNodes
    visu_gl_ext_nodes_setData, function in VisuGlExtNodes
    visu_gl_ext_nodes_setMaterialEffect, function in VisuGlExtNodes
    visu_gl_ext_nodes_setRendering, function in VisuGlExtNodes
    visu_gl_ext_node_vectors_draw, function in VisuGlExtNodeVectors
    visu_gl_ext_node_vectors_getData, function in VisuGlExtNodeVectors
    visu_gl_ext_node_vectors_getNormalisation, function in VisuGlExtNodeVectors
    visu_gl_ext_node_vectors_new, function in VisuGlExtNodeVectors
    visu_gl_ext_node_vectors_setArrow, function in VisuGlExtNodeVectors
    visu_gl_ext_node_vectors_setCentering, function in VisuGlExtNodeVectors
    visu_gl_ext_node_vectors_setColor, function in VisuGlExtNodeVectors
    visu_gl_ext_node_vectors_setData, function in VisuGlExtNodeVectors
    visu_gl_ext_node_vectors_setLabelThreshold, function in VisuGlExtNodeVectors
    visu_gl_ext_node_vectors_setNormalisation, function in VisuGlExtNodeVectors
    visu_gl_ext_node_vectors_setRenderedSize, function in VisuGlExtNodeVectors
    visu_gl_ext_node_vectors_setTranslation, function in VisuGlExtNodeVectors
    visu_gl_ext_node_vectors_setVectorThreshold, function in VisuGlExtNodeVectors
    visu_gl_ext_pairs_draw, function in VisuGlExtPairs
    visu_gl_ext_pairs_getDefault, function in VisuGlExtPairs
    visu_gl_ext_pairs_getDrawnPair, function in VisuGlExtPairs
    visu_gl_ext_pairs_getNDrawn, function in VisuGlExtPairs
    visu_gl_ext_pairs_new, function in VisuGlExtPairs
    visu_gl_ext_pairs_setData, function in VisuGlExtPairs
    visu_gl_ext_paths_new, function in VisuGlExtPaths
    visu_gl_ext_paths_set, function in VisuGlExtPaths
    visu_gl_ext_paths_setDirty, function in VisuGlExtPaths
    visu_gl_ext_planes_add, function in VisuGlExtPlanes
    visu_gl_ext_planes_draw, function in VisuGlExtPlanes
    visu_gl_ext_planes_getDefault, function in VisuGlExtPlanes
    visu_gl_ext_planes_new, function in VisuGlExtPlanes
    visu_gl_ext_planes_remove, function in VisuGlExtPlanes
    visu_gl_ext_scale_add, function in VisuGlExtScale
    visu_gl_ext_scale_getDefault, function in VisuGlExtScale
    visu_gl_ext_scale_getNArrows, function in VisuGlExtScale
    visu_gl_ext_scale_setGlView, function in VisuGlExtScale
    visu_gl_ext_shade_new, function in VisuGlExtShade
    visu_gl_ext_shade_setMarks, function in VisuGlExtShade
    visu_gl_ext_shade_setMinMax, function in VisuGlExtShade
    visu_gl_ext_shade_setScaling, function in VisuGlExtShade
    visu_gl_ext_shade_setShade, function in VisuGlExtShade
    visu_gl_ext_surfaces_add, function in VisuGlExtSurfaces
    visu_gl_ext_surfaces_draw, function in VisuGlExtSurfaces
    visu_gl_ext_surfaces_getDefault, function in VisuGlExtSurfaces
    visu_gl_ext_surfaces_new, function in VisuGlExtSurfaces
    visu_gl_ext_surfaces_remove, function in VisuGlExtSurfaces
    visu_gl_ext_surfaces_setOnObserveOrdering, function in VisuGlExtSurfaces
    visu_gl_ext_surfaces_setOnTheFlyOrdering, function in VisuGlExtSurfaces
    visu_gl_ext_vibration_getDefault, function in VisuGlExtNodeVectors
    visu_gl_lights_ref, function in light
    visu_gl_lights_unref, function in light
    visu_gl_text_putTextWithFTGL, function in text
    visu_gl_text_setFontSize, function in text
    visu_gl_text_setFunc, function in text
    visu_gl_view_new_withSize, function in VisuGlView
    visu_gl_view_setObjectRadius, function in VisuGlView
    visu_gl_window_getAddLength, function in VisuGlView
    visu_gl_window_setAddLength, function in VisuGlView

    I

    VisuInteractive::menu, object signal in interactive
    visu_interactive_apply, function in interactive
    visu_interactive_getEvent, function in interactive
    visu_interactive_highlight, function in interactive
    visu_interactive_setNodeList, function in interactive

    L

    visu_line_ref, function in isoline
    visu_line_unref, function in isoline

    M

    visu_map_getPlane, function in map
    visu_map_init, function in map
    visu_map_ref, function in map
    visu_map_setPlane, function in map
    visu_map_unref, function in map

    N

    VisuNodeArray::ElementRenderingChanged, object signal in VisuNodeArray
    VisuNodeArray::RenderingChanged, object signal in VisuNodeArray
    VisuNodeArrayElementPropertyInit, user_function in VisuNodeArray
    visu_node_array_allocateNodesForElement, function in VisuNodeArray
    visu_node_array_askForShowHide, function in VisuNodeArray
    visu_node_array_getElement, function in VisuNodeArray
    visu_node_array_getElementId, function in VisuNodeArray
    visu_node_array_getElementProperty, function in VisuNodeArray
    visu_node_array_getNElements, function in VisuNodeArray
    visu_node_array_getNNodes, function in VisuNodeArray
    visu_node_array_iterNextList, function in VisuNodeArray
    visu_node_array_iterStartList, function in VisuNodeArray
    visu_node_array_removeNodesOfElement, function in VisuNodeArray
    visu_node_array_setElementProperty, function in VisuNodeArray
    visu_node_setCoordinates, function in VisuNodeArray

    O

    VisuObject::dataUnRendered, object signal in VisuObject
    VisuObject::entryParsed, object signal in VisuObject
    VisuObject::shadeNewAvailable, object signal in VisuObject
    VisuObject::viewNew, object signal in VisuObject

    P

    VisuPairLink::ParameterChanged, object signal in VisuPairLink
    visu_pair_extension_getName, function in VisuGlExtPairs
    visu_pair_extension_ref, function in VisuGlExtPairs
    visu_pair_extension_unref, function in VisuGlExtPairs
    visu_pair_getElements, function in VisuPairLink
    visu_pair_link_getPair, function in VisuPairLink
    visu_pair_link_isDrawn, function in VisuPairLink
    visu_paths_ref, function in geometry
    visu_paths_unref, function in geometry
    VisuPlane::rendering, object signal in plane
    visu_plane_getPlaneIntersection, function in plane
    VisuPluginFreeFunc, user_function in visu_plugins
    visu_plugins_free, function in visu_plugins

    R

    VisuRenderingAtomic::ForcesChanged, object signal in renderingAtomic
    VisuRenderingGetElementGlId, user_function in VisuRendering
    visu_rendering_atomic_getMaxForces, function in renderingAtomic
    visu_rendering_atomic_setForces, function in renderingAtomic
    visu_rendering_getElementGlId, function in VisuRendering
    visu_rendering_spin_getResource, function in renderingSpin
    visu_rendering_spin_setResource, function in renderingSpin

    S

    visu_scalar_field_getDataArray, function in VisuScalarField
    visu_scalar_field_getOriginShift, function in VisuScalarField
    visu_scalar_field_method_load, function in VisuScalarField
    visu_scalar_field_setOriginShift, function in VisuScalarField
    VisuSurfaces::added, object signal in surfaces
    VisuSurfaces::masked, object signal in surfaces
    VisuSurfaces::removed, object signal in surfaces
    VisuSurfaces::rendering, object signal in surfaces
    visu_surfaces_getResource, function in surfaces
    visu_surfaces_points_transform, function in surfaces_points
    visu_surfaces_resources_getRendered, function in surfaces_resources
    visu_surfaces_setColorAndMaterial, function in surfaces
    visu_surfaces_setRendered, function in surfaces

    T

    ToolFileFormatValidate, user_function in ToolFileFormat
    ToolGridSize, struct in toolMatrix
    ToolShadeStep, struct in toolShade
    ToolVector, struct in toolMatrix
    tool_color_get_stamp, function in visu_gtk
    tool_color_new_bright, function in toolColor
    tool_file_format_addOption, function in ToolFileFormat
    tool_file_format_addPatterns, function in ToolFileFormat
    tool_file_format_addPropertyDouble, function in ToolFileFormat
    tool_file_format_setValidator, function in ToolFileFormat
    tool_file_format_validate, function in ToolFileFormat
    tool_matrix_dtof, function in toolMatrix
    tool_matrix_setIdentity, function in toolMatrix
    tool_shade_newFromSteps, function in toolShade
    tool_shade_newFromString, function in toolShade

    U

    VisuUiBoxFit, enum in gtk_fieldChooser
    VisuUiFieldChooser::validate, object signal in gtk_fieldChooser
    VisuUiMain::DataFocused, object signal in gtk_main
    VisuUiRenderingWindow::load-next-file, object signal in gtk_renderingWindowWidget
    VisuUiRenderingWindow::load-prev-file, object signal in gtk_renderingWindowWidget
    VisuUiRenderingWindow::search, object signal in gtk_renderingWindowWidget
    VisuUiRenderingWindow::show-orientation-chooser, object signal in gtk_renderingWindowWidget
    visu_ui_buildRenderingWindow, function in visu_gtk
    visu_ui_element_combobox_setUnphysicalStatus, function in gtk_elementComboBox
    visu_ui_field_chooser_getFileFormat, function in gtk_fieldChooser
    visu_ui_field_chooser_getFit, function in gtk_fieldChooser
    visu_ui_field_chooser_new, function in gtk_fieldChooser
    visu_ui_field_chooser_setOptions, function in gtk_fieldChooser
    visu_ui_interactive_pick_exportXMLFile, function in gtk_pick
    visu_ui_pairs_iter_empty, function in gtk_pairs
    visu_ui_pairs_newIter, function in gtk_pairs
    visu_ui_pairs_select, function in gtk_pairs
    visu_ui_panel_axes_setAxesExtension, function in panelAxes
    visu_ui_panel_class_setCurrent, function in gtk_toolPanelWidget
    visu_ui_panel_colorization_setManualRange, function in panelDataFile
    visu_ui_panel_colorization_setRangeMode, function in panelDataFile
    visu_ui_panel_config_getArea, function in panelConfig
    visu_ui_panel_elements_atomic_initMethod, function in gtkAtomic
    visu_ui_panel_geometry_getPaths, function in panelGeometry
    visu_ui_panel_geometry_runTests, function in panelGeometry
    visu_ui_panel_getFocused, function in gtk_toolPanelWidget
    visu_ui_panel_getView, function in gtk_toolPanelWidget
    visu_ui_panel_map_update, function in panelMap
    visu_ui_panel_planes_add, function in panelPlanes
    visu_ui_panel_surfaces_addField, function in panelSurfaces
    visu_ui_panel_surfaces_addSurfaces, function in panelSurfaces
    visu_ui_panel_surfaces_compute, function in panelSurfaces
    visu_ui_panel_surfaces_computeAuto, function in panelSurfaces
    visu_ui_panel_surfaces_exportXMLFile, function in panelSurfaces
    visu_ui_panel_surfaces_updateAtIter, function in panelSurfaces
    visu_ui_rendering_window_getAccelGroup, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_getGlView, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_reload, function in gtk_renderingWindowWidget
    visu_ui_setRenderWidget, function in visu_gtk
    visu_ui_setWindowTitle, function in visu_gtk
    v_sim-3.7.0/Documentation/reference/html/api-index-full.html0000644000353400050620000152256412216331356021021 00000000000000 API Index

    API Index

    B

    VisuBasicCLISet, struct in visu_basic
    visu_basic_applyCommandLine, function in visu_basic
    visu_basic_createExtensions, function in visu_basic
    visu_basic_freeAll, function in visu_basic
    visu_basic_getDataDir, function in visu_basic
    visu_basic_getIconsDir, function in visu_basic
    visu_basic_getLegalDir, function in visu_basic
    visu_basic_getLocalDir, function in visu_basic
    visu_basic_getLocaleDir, function in visu_basic
    visu_basic_getMainContext, function in visu_basic
    visu_basic_getOldLocalDir, function in visu_basic
    visu_basic_getPixmapsDir, function in visu_basic
    visu_basic_getPluginsDir, function in visu_basic
    visu_basic_getPreferedUnit, function in visu_basic
    visu_basic_init, function in visu_basic
    visu_basic_mainExport, function in visu_basic
    visu_basic_parseConfigFiles, function in visu_basic
    visu_basic_setDataFromCommandLine, function in visu_basic
    visu_basic_setExePath, function in visu_basic
    visu_basic_setExtInfos, function in visu_basic
    visu_basic_setPreferedUnit, function in visu_basic
    visu_basic_showOptionHelp, function in visu_basic
    VisuBox, struct in VisuBox
    VisuBox::BoundaryChanged, object signal in VisuBox
    VisuBox::ExtensionChanged, object signal in VisuBox
    VisuBox::SizeChanged, object signal in VisuBox
    VisuBox::UnitChanged, object signal in VisuBox
    VisuBoxBoundaries, enum in VisuBox
    VisuBoxCell, struct in VisuBox
    VisuBoxClass, struct in VisuBox
    VisuBoxedInterface, struct in VisuBoxed
    visu_boxed_getBox, function in VisuBoxed
    visu_boxed_setBox, function in VisuBoxed
    VisuBoxVector, enum in VisuBox
    VisuBoxVertices, struct in VisuBox
    visu_box_constrainInside, function in VisuBox
    visu_box_convertBoxCoordinatestoXYZ, function in VisuBox
    visu_box_convertFullToCell, function in VisuBox
    visu_box_convertReducedToXYZ, function in VisuBox
    visu_box_convertXYZtoBoxCoordinates, function in VisuBox
    visu_box_convertXYZToReduced, function in VisuBox
    visu_box_getBoundary, function in VisuBox
    visu_box_getCellMatrix, function in VisuBox
    visu_box_getCellMatrixv, function in VisuBox
    visu_box_getCentre, function in VisuBox
    visu_box_getExtension, function in VisuBox
    visu_box_getGeometry, function in VisuBox
    visu_box_getGlobalSize, function in VisuBox
    visu_box_getInvMatrix, function in VisuBox
    visu_box_getPeriodicArray, function in VisuBox
    visu_box_getPeriodicity, function in VisuBox
    visu_box_getPeriodicVector, function in VisuBox
    visu_box_getPeriodicVectorv, function in VisuBox
    visu_box_getUnit, function in VisuBox
    visu_box_getVertices, function in VisuBox
    visu_box_new, function in VisuBox
    visu_box_new_full, function in VisuBox
    visu_box_setBoundary, function in VisuBox
    visu_box_setExtension, function in VisuBox
    visu_box_setGeometry, function in VisuBox
    visu_box_setGeometryFull, function in VisuBox
    visu_box_setMargin, function in VisuBox
    visu_box_setUnit, function in VisuBox

    C

    VisuColorization, struct in dataFile
    VisuColorizationErrorFlag, enum in dataFile
    VisuColorizationHidingFunc, user_function in dataFile
    VisuColorizationInputScaleId, enum in dataFile
    VisuColorizationNodeData, struct in dataFile
    visu_colorization_applyHide, function in dataFile
    visu_colorization_get, function in dataFile
    visu_colorization_getColumnMinMax, function in dataFile
    visu_colorization_getColUsed, function in dataFile
    visu_colorization_getErrorQuark, function in dataFile
    visu_colorization_getFile, function in dataFile
    visu_colorization_getFileSet, function in dataFile
    visu_colorization_getMax, function in dataFile
    visu_colorization_getMin, function in dataFile
    visu_colorization_getNColumns, function in dataFile
    visu_colorization_getRestrictInRange, function in dataFile
    visu_colorization_getScaleType, function in dataFile
    visu_colorization_getScalingUsed, function in dataFile
    visu_colorization_getShade, function in dataFile
    visu_colorization_getSingleColumnId, function in dataFile
    visu_colorization_getUsed, function in dataFile
    visu_colorization_init, function in dataFile
    visu_colorization_new, function in dataFile
    visu_colorization_new_fromData, function in dataFile
    visu_colorization_new_fromFile, function in dataFile
    visu_colorization_ref, function in dataFile
    visu_colorization_setColUsed, function in dataFile
    visu_colorization_setHidingFunc, function in dataFile
    visu_colorization_setMax, function in dataFile
    visu_colorization_setMin, function in dataFile
    visu_colorization_setRestrictInRange, function in dataFile
    visu_colorization_setScaleType, function in dataFile
    visu_colorization_setScalingUsed, function in dataFile
    visu_colorization_setShade, function in dataFile
    visu_colorization_setUsed, function in dataFile
    visu_colorization_unref, function in dataFile
    commandLineExport, function in visu_commandLine
    commandLineFree_all, function in visu_commandLine
    commandLineGet_ArgFilename, function in visu_commandLine
    commandLineGet_ArgSpinFileName, function in visu_commandLine
    commandLineGet_bgImage, function in visu_commandLine
    commandLineGet_coloredMap, function in visu_commandLine
    commandLineGet_colorizeColUsed, function in visu_commandLine
    commandLineGet_colorizeFileName, function in visu_commandLine
    commandLineGet_colorizePresetColor, macro in visu_commandLine
    commandLineGet_colorMinMax, function in visu_commandLine
    commandLineGet_ExportFileName, function in visu_commandLine
    commandLineGet_extension, function in visu_commandLine
    commandLineGet_fitToBox, function in visu_commandLine
    commandLineGet_introspect, function in visu_commandLine
    commandLineGet_iSet, function in visu_commandLine
    commandLineGet_isoLinesColor, function in visu_commandLine
    commandLineGet_isoNames, function in visu_commandLine
    commandLineGet_isoValues, function in visu_commandLine
    commandLineGet_isoVisuSurfacesFileName, function in visu_commandLine
    commandLineGet_logScale, function in visu_commandLine
    commandLineGet_mapMinMax, function in visu_commandLine
    commandLineGet_mapPrecision, function in visu_commandLine
    commandLineGet_nIsoLines, function in visu_commandLine
    commandLineGet_options, function in visu_commandLine
    commandLineGet_planesFileName, function in visu_commandLine
    commandLineGet_presetColor, function in visu_commandLine
    commandLineGet_programName, function in visu_commandLine
    commandLineGet_resourcesFile, function in visu_commandLine
    commandLineGet_scalarFieldFileName, function in visu_commandLine
    commandLineGet_scalingColumn, function in visu_commandLine
    commandLineGet_spinAndAtomic, function in visu_commandLine
    commandLineGet_spinHidingMode, function in visu_commandLine
    commandLineGet_translation, function in visu_commandLine
    commandLineGet_valueFile, function in visu_commandLine
    commandLineGet_windowMode, function in visu_commandLine
    commandLineGet_WithGtk, function in visu_commandLine
    commandLineGet_XWindowGeometry, function in visu_commandLine
    commandLineParse, function in visu_commandLine
    VisuConfigFileEntry, struct in visu_configFile
    VisuConfigFileExportFunc, user_function in visu_configFile
    VisuConfigFileForeachFuncExport, struct in visu_configFile
    VisuConfigFileReadFunc, user_function in visu_configFile
    visu_config_file_addBooleanEntry, function in visu_configFile
    visu_config_file_addEntry, function in visu_configFile
    visu_config_file_addExportFunction, function in visu_configFile
    visu_config_file_addFloatArrayEntry, function in visu_configFile
    visu_config_file_addKnownTag, function in visu_configFile
    visu_config_file_addStringEntry, function in visu_configFile
    visu_config_file_entry_setReplace, function in visu_configFile
    visu_config_file_entry_setTag, function in visu_configFile
    visu_config_file_entry_setVersion, function in visu_configFile
    visu_config_file_exportComment, function in visu_configFile
    visu_config_file_exportEntry, function in visu_configFile
    visu_config_file_exportToXML, function in visu_configFile
    visu_config_file_getDefaultFilename, function in visu_configFile
    visu_config_file_getEntries, function in visu_configFile
    visu_config_file_getNextValidPath, function in visu_configFile
    visu_config_file_getPathList, function in visu_configFile
    visu_config_file_getPathToResources, function in visu_configFile
    visu_config_file_getValidPath, function in visu_configFile
    visu_config_file_load, function in visu_configFile
    VISU_CONFIG_FILE_PARAMETER, macro in visu_configFile
    VISU_CONFIG_FILE_RESOURCE, macro in visu_configFile
    visu_config_file_save, function in visu_configFile
    visu_config_file_saveResourcesToXML, function in visu_configFile

    D

    VisuData, struct in VisuData
    VisuData::FilesChanged, object signal in VisuData
    VisuData::objectFreed, object signal in VisuData
    VisuData::TranslationsChanged, object signal in VisuData
    VisuData:totalEnergy, object property in VisuData
    VisuDataClass, struct in VisuData
    VisuDataColorFunc, user_function in VisuData
    VisuDataNode, struct in dataNode
    VisuDataNode::propertyUnused, object signal in dataNode
    VisuDataNode::propertyUsed, object signal in dataNode
    VisuDataNode::valueChanged, object signal in dataNode
    VisuDataNodeCallbackMethod, user_function in dataNode
    VisuDataNodeClass, struct in dataNode
    VisuDataNodeFromStringFunc, user_function in dataNode
    VisuDataNodeToStringFunc, user_function in dataNode
    VisuDataScalingFunc, user_function in VisuData
    visu_data_addFile, function in VisuData
    visu_data_addNodeFromElement, function in VisuData
    visu_data_addNodeFromElementName, function in VisuData
    visu_data_addNodeFromIndex, function in VisuData
    visu_data_addTimeout, function in VisuData
    visu_data_class_getAllObjects, function in VisuData
    visu_data_constrainedElementInTheBox, function in VisuData
    visu_data_constrainedFree, function in VisuData
    visu_data_constrainedInTheBox, function in VisuData
    visu_data_forceXYZtranslation, function in VisuData
    visu_data_freePopulation, function in VisuData
    visu_data_getAllNodeExtens, function in VisuData
    visu_data_getChangeElementFlag, function in VisuData
    visu_data_getDistanceList, function in VisuData
    visu_data_getFile, function in VisuData
    visu_data_getFileCommentary, function in VisuData
    visu_data_getFilesAsLabel, function in VisuData
    visu_data_getISubset, function in VisuData
    visu_data_getNodeBoxFromCoord, function in VisuData
    visu_data_getNodeBoxFromNumber, function in VisuData
    visu_data_getNodeCoordinates, function in VisuData
    visu_data_getNodePosition, function in VisuData
    visu_data_getNodeScalingFactor, function in VisuData
    visu_data_getNodeUserPosition, function in VisuData
    visu_data_getNSubset, function in VisuData
    visu_data_getTranslationStatus, function in VisuData
    visu_data_getUserColor, function in VisuData
    visu_data_getXYZtranslation, function in VisuData
    visu_data_hasUserColorFunc, function in VisuData
    visu_data_new, function in VisuData
    visu_data_new_withFiles, function in VisuData
    visu_data_node_class_getAll, function in dataNode
    visu_data_node_emitValueChanged, function in dataNode
    visu_data_node_getEditable, function in dataNode
    visu_data_node_getLabel, function in dataNode
    visu_data_node_getUsed, function in dataNode
    visu_data_node_getValueAsString, function in dataNode
    visu_data_node_new, function in dataNode
    visu_data_node_newWithCallbacks, function in dataNode
    visu_data_node_setCallback, function in dataNode
    visu_data_node_setEditable, function in dataNode
    visu_data_node_setLabel, function in dataNode
    visu_data_node_setUsed, function in dataNode
    visu_data_node_setValueAsString, function in dataNode
    visu_data_removeAllFiles, function in VisuData
    visu_data_removeTimeout, function in VisuData
    visu_data_reorder, function in VisuData
    visu_data_replicate, function in VisuData
    visu_data_restore, function in VisuData
    visu_data_setChangeElementFlag, function in VisuData
    visu_data_setColorFunc, function in VisuData
    visu_data_setFileCommentary, function in VisuData
    visu_data_setISubset, function in VisuData
    visu_data_setNewBasis, function in VisuData
    visu_data_setNewBasisFromNodes, function in VisuData
    visu_data_setNodeScalingFunc, function in VisuData
    visu_data_setNSubset, function in VisuData
    visu_data_setTightBox, function in VisuData
    visu_data_setXYZtranslation, function in VisuData
    VisuDump, struct in visu_dump
    VisuDumpCairoAdd, user_function in dumpToSVG
    VisuDumpClass, struct in visu_dump
    VisuDumpErrorFlag, enum in visu_dump
    VisuDumpInitFunc, user_function in visu_dump
    VisuDumpWriteFunc, user_function in visu_dump
    visu_dump_abinit_getStatic, function in dumpToABINIT
    visu_dump_abort, function in visu_dump
    visu_dump_ascii_getStatic, function in dumpToAscii
    visu_dump_bitmap_pdf_getStatic, function in dumpToPsAndPdf
    visu_dump_bitmap_ps_getStatic, function in dumpToPsAndPdf
    visu_dump_cairo_pdf_getStatic, function in dumpToSVG
    visu_dump_cairo_setPostFunc, function in dumpToSVG
    visu_dump_cairo_svg_getStatic, function in dumpToSVG
    visu_dump_getAllModules, function in visu_dump
    visu_dump_getAlphaStatus, function in visu_dump
    visu_dump_getBitmapStatus, function in visu_dump
    visu_dump_getGlStatus, function in visu_dump
    visu_dump_getNModules, function in visu_dump
    visu_dump_getQuark, function in visu_dump
    visu_dump_jpeg_getStatic, function in dumpThroughGdkPixbuf
    visu_dump_new, function in visu_dump
    visu_dump_png_getStatic, function in dumpThroughGdkPixbuf
    visu_dump_setGl, function in visu_dump
    visu_dump_setHasAlpha, function in visu_dump
    visu_dump_tiff_getStatic, function in dumpToTiff
    visu_dump_write, function in visu_dump
    visu_dump_xyz_getStatic, function in dumpToXyz

    E

    VisuElement, struct in visu_elements
    VisuElement::ElementMaterialChanged, object signal in visu_elements
    VisuElement::ElementNew, object signal in visu_elements
    VisuElement::ElementPlaneChanged, object signal in visu_elements
    VisuElement::ElementRenderingChanged, object signal in visu_elements
    VisuElement::ElementVisibilityChanged, object signal in visu_elements
    VisuElementClass, struct in visu_elements
    visu_element_createMaterial, function in visu_elements
    visu_element_getAllElements, function in visu_elements
    visu_element_getMaterialId, function in visu_elements
    visu_element_getName, function in visu_elements
    visu_element_getPhysical, function in visu_elements
    visu_element_getRendered, function in visu_elements
    visu_element_getSensitiveToPlanes, function in visu_elements
    visu_element_getUpdateNodesOnMaterialChange, function in visu_elements
    visu_element_lookup, function in visu_elements
    visu_element_new, function in visu_elements
    visu_element_retrieveFromName, function in visu_elements
    visu_element_setAllColorValues, function in visu_elements
    visu_element_setAllMaterialValues, function in visu_elements
    visu_element_setAllRGBValues, function in visu_elements
    visu_element_setMaterialValue, function in visu_elements
    visu_element_setRendered, function in visu_elements
    visu_element_setRGBValue, function in visu_elements
    visu_element_setSensitiveToPlanes, function in visu_elements
    visu_element_setUpdateNodesOnMaterialChange, function in visu_elements
    visu_element_unsetUpdateNodesOnMaterialChange, function in visu_elements
    VISU_ERROR_ISOSURFACES, macro in surfaces
    visu_extra_node_addLabel, function in extraNode
    visu_extra_node_getLabel, function in extraNode
    visu_extra_node_setLabel, function in extraNode

    G

    GDKGLEXT_MULTIHEAD_SUPPORT, macro in visu_openGL
    visu_geodiff_export, function in geometry
    visu_geodiff_getPeriodicDistance, function in geometry
    visu_geodiff_hasData, function in geometry
    VISU_GEODIFF_ID, macro in geometry
    visu_geodiff_new, function in geometry
    visu_geometry_init, function in geometry
    VisuGlArrowCentering, enum in objectList
    VisuGlCamera, struct in VisuGlView
    VisuGlCameraAxis, enum in VisuGlView
    VisuGlExt, struct in VisuGlExt
    VisuGlExt:active, object property in VisuGlExt
    VisuGlExt:description, object property in VisuGlExt
    VisuGlExt:label, object property in VisuGlExt
    VisuGlExt:name, object property in VisuGlExt
    VisuGlExt:nGlObj, object property in VisuGlExt
    VisuGlExt:priority, object property in VisuGlExt
    VisuGlExt:saveState, object property in VisuGlExt
    VisuGlExtAxes, struct in VisuGlExtAxes
    VisuGlExtAxesClass, struct in VisuGlExtAxes
    VisuGlExtBg, struct in VisuGlExtBg
    VisuGlExtBgClass, struct in VisuGlExtBg
    VisuGlExtBox, struct in VisuGlExtBoxLegend
    VisuGlExtBoxClass, struct in VisuGlExtBoxLegend
    VisuGlExtBoxLegend, struct in VisuGlExtBoxLegend
    VisuGlExtBoxLegendClass, struct in VisuGlExtBoxLegend
    VisuGlExtClass, struct in VisuGlExt
    VisuGlExtClassPrivate, struct in VisuGlExt
    VisuGlExtForces, struct in VisuGlExtForces
    VisuGlExtForcesClass, struct in VisuGlExtForces
    VisuGlExtFrame, struct in VisuGlExtFrame
    VisuGlExtFrameClass, struct in VisuGlExtFrame
    VisuGlExtInfos, struct in VisuGlExtInfos
    VisuGlExtInfosClass, struct in VisuGlExtInfos
    VisuGlExtInfosDrawId, enum in VisuGlExtInfos
    VisuGlExtInfosDrawMethod, enum in VisuGlExtInfos
    VisuGlExtLegend, struct in VisuGlExtLegend
    VisuGlExtLegendClass, struct in VisuGlExtLegend
    VisuGlExtMaps, struct in VisuGlExtMaps
    VisuGlExtMapsClass, struct in VisuGlExtMaps
    VisuGlExtMarks, struct in marks
    VisuGlExtMarks::highlightChanged, object signal in marks
    VisuGlExtMarks::measurementChanged, object signal in marks
    VisuGlExtMarksClass, struct in marks
    VisuGlExtMarksStatus, enum in marks
    VisuGlExtNodes, struct in VisuGlExtNodes
    VisuGlExtNodesClass, struct in VisuGlExtNodes
    VisuGlExtNodesEffects, enum in VisuGlExtNodes
    VisuGlExtNodeVectors, struct in VisuGlExtNodeVectors
    VisuGlExtNodeVectors:propId, object property in VisuGlExtNodeVectors
    VisuGlExtNodeVectorsClass, struct in VisuGlExtNodeVectors
    VisuGlExtPairs, struct in VisuGlExtPairs
    VisuGlExtPairsClass, struct in VisuGlExtPairs
    VisuGlExtPaths, struct in VisuGlExtPaths
    VisuGlExtPathsClass, struct in VisuGlExtPaths
    VisuGlExtPlanes, struct in VisuGlExtPlanes
    VisuGlExtPlanesClass, struct in VisuGlExtPlanes
    VisuGlExtScale, struct in VisuGlExtScale
    VisuGlExtScaleClass, struct in VisuGlExtScale
    VisuGlExtShade, struct in VisuGlExtShade
    VisuGlExtShadeClass, struct in VisuGlExtShade
    VisuGlExtSurfaces, struct in VisuGlExtSurfaces
    VisuGlExtSurfacesClass, struct in VisuGlExtSurfaces
    VisuGlLight, struct in light
    VisuGlLightMaterial, enum in light
    VisuGlLights, struct in light
    VisuGlPairsCylinderColorId, enum in cylinder
    VisuGlRenderingMode, enum in renderingMode
    VisuGlTextFunc, user_function in text
    VisuGlTextSize, enum in text
    VisuGlView, struct in VisuGlView
    VisuGlView::DetailLevelChanged, object signal in VisuGlView
    VisuGlView::GrossChanged, object signal in VisuGlView
    VisuGlView::NearFarChanged, object signal in VisuGlView
    VisuGlView::PerspChanged, object signal in VisuGlView
    VisuGlView::RefLengthChanged, object signal in VisuGlView
    VisuGlView::ThetaPhiOmegaChanged, object signal in VisuGlView
    VisuGlView::WidthHeightChanged, object signal in VisuGlView
    VisuGlView::XsYsChanged, object signal in VisuGlView
    VisuGlViewClass, struct in VisuGlView
    VisuGlViewClassPrivate, struct in VisuGlView
    VisuGlWindow, struct in VisuGlView
    visu_gl_camera_copy, function in VisuGlView
    visu_gl_camera_getRefLength, function in VisuGlView
    visu_gl_camera_getScreenAxes, function in VisuGlView
    visu_gl_camera_modelize, function in VisuGlView
    VISU_GL_CAMERA_OMEGA, macro in VisuGlView
    VISU_GL_CAMERA_PHI, macro in VisuGlView
    visu_gl_camera_setGross, function in VisuGlView
    visu_gl_camera_setPersp, function in VisuGlView
    visu_gl_camera_setRefLength, function in VisuGlView
    visu_gl_camera_setThetaPhiOmega, function in VisuGlView
    visu_gl_camera_setUpAxis, function in VisuGlView
    visu_gl_camera_setXsYs, function in VisuGlView
    VISU_GL_CAMERA_THETA, macro in VisuGlView
    VISU_GL_CAMERA_XS, macro in VisuGlView
    VISU_GL_CAMERA_YS, macro in VisuGlView
    visu_gl_drawAngle, function in objectList
    visu_gl_drawDistance, function in objectList
    visu_gl_drawEdgeArrow, function in objectList
    visu_gl_drawEllipsoid, function in objectList
    visu_gl_drawSmoothArrow, function in objectList
    visu_gl_drawTorus, function in objectList
    visu_gl_ext_axes_draw, function in VisuGlExtAxes
    visu_gl_ext_axes_getDefault, function in VisuGlExtAxes
    visu_gl_ext_axes_getLineStipple, function in VisuGlExtAxes
    visu_gl_ext_axes_getLineWidth, function in VisuGlExtAxes
    visu_gl_ext_axes_getPosition, function in VisuGlExtAxes
    visu_gl_ext_axes_getRGB, function in VisuGlExtAxes
    VISU_GL_EXT_AXES_ID, macro in VisuGlExtAxes
    visu_gl_ext_axes_new, function in VisuGlExtAxes
    visu_gl_ext_axes_setBasis, function in VisuGlExtAxes
    visu_gl_ext_axes_setBasisFromBox, function in VisuGlExtAxes
    visu_gl_ext_axes_setGlView, function in VisuGlExtAxes
    visu_gl_ext_axes_setLineStipple, function in VisuGlExtAxes
    visu_gl_ext_axes_setLineWidth, function in VisuGlExtAxes
    visu_gl_ext_axes_setPosition, function in VisuGlExtAxes
    visu_gl_ext_axes_setRGB, function in VisuGlExtAxes
    visu_gl_ext_bg_draw, function in VisuGlExtBg
    visu_gl_ext_bg_getDefault, function in VisuGlExtBg
    visu_gl_ext_bg_getRGBA, function in VisuGlExtBg
    VISU_GL_EXT_BG_ID, macro in VisuGlExtBg
    visu_gl_ext_bg_new, function in VisuGlExtBg
    visu_gl_ext_bg_setCamera, function in VisuGlExtBg
    visu_gl_ext_bg_setFollowCamera, function in VisuGlExtBg
    visu_gl_ext_bg_setGlView, function in VisuGlExtBg
    visu_gl_ext_bg_setImage, function in VisuGlExtBg
    visu_gl_ext_bg_setRGBA, function in VisuGlExtBg
    visu_gl_ext_box_draw, function in VisuGlExtBoxLegend
    visu_gl_ext_box_getDefault, function in VisuGlExtBoxLegend
    visu_gl_ext_box_getExpandStipple, function in VisuGlExtBoxLegend
    visu_gl_ext_box_getLineStipple, function in VisuGlExtBoxLegend
    visu_gl_ext_box_getLineWidth, function in VisuGlExtBoxLegend
    visu_gl_ext_box_getRGB, function in VisuGlExtBoxLegend
    visu_gl_ext_box_getSideRGB, function in VisuGlExtBoxLegend
    VISU_GL_EXT_BOX_ID, macro in VisuGlExtBoxLegend
    visu_gl_ext_box_legend_getDefault, function in VisuGlExtBoxLegend
    VISU_GL_EXT_BOX_LEGEND_ID, macro in VisuGlExtBoxLegend
    visu_gl_ext_box_legend_new, function in VisuGlExtBoxLegend
    visu_gl_ext_box_legend_setBox, function in VisuGlExtBoxLegend
    visu_gl_ext_box_new, function in VisuGlExtBoxLegend
    visu_gl_ext_box_setBasis, function in VisuGlExtBoxLegend
    visu_gl_ext_box_setBox, function in VisuGlExtBoxLegend
    visu_gl_ext_box_setExpandStipple, function in VisuGlExtBoxLegend
    visu_gl_ext_box_setLineStipple, function in VisuGlExtBoxLegend
    visu_gl_ext_box_setLineWidth, function in VisuGlExtBoxLegend
    visu_gl_ext_box_setOrigin, function in VisuGlExtBoxLegend
    visu_gl_ext_box_setRGB, function in VisuGlExtBoxLegend
    visu_gl_ext_box_setSideRGB, function in VisuGlExtBoxLegend
    visu_gl_ext_call, function in VisuGlExt
    visu_gl_ext_fog_create, function in VisuGlExtBg
    visu_gl_ext_fog_create_color, function in VisuGlExtBg
    visu_gl_ext_fog_getEnd, function in VisuGlExtBg
    visu_gl_ext_fog_getOn, function in VisuGlExtBg
    visu_gl_ext_fog_getStart, function in VisuGlExtBg
    visu_gl_ext_fog_getUseSpecificColor, function in VisuGlExtBg
    visu_gl_ext_fog_getValues, function in VisuGlExtBg
    visu_gl_ext_fog_init, function in VisuGlExtBg
    VISU_GL_EXT_FOG_MASK_END, macro in VisuGlExtBg
    VISU_GL_EXT_FOG_MASK_START, macro in VisuGlExtBg
    visu_gl_ext_fog_setOn, function in VisuGlExtBg
    visu_gl_ext_fog_setStartEndValues, function in VisuGlExtBg
    visu_gl_ext_fog_setUseSpecificColor, function in VisuGlExtBg
    visu_gl_ext_fog_setValues, function in VisuGlExtBg
    visu_gl_ext_forces_getDefault, function in VisuGlExtForces
    visu_gl_ext_forces_new, function in VisuGlExtForces
    visu_gl_ext_frame_draw, function in VisuGlExtFrame
    visu_gl_ext_frame_getPosition, function in VisuGlExtFrame
    visu_gl_ext_frame_getScale, function in VisuGlExtFrame
    visu_gl_ext_frame_setBgRGBA, function in VisuGlExtFrame
    visu_gl_ext_frame_setFontRGB, function in VisuGlExtFrame
    visu_gl_ext_frame_setGlView, function in VisuGlExtFrame
    visu_gl_ext_frame_setPosition, function in VisuGlExtFrame
    visu_gl_ext_frame_setRequisition, function in VisuGlExtFrame
    visu_gl_ext_frame_setScale, function in VisuGlExtFrame
    visu_gl_ext_frame_setTitle, function in VisuGlExtFrame
    visu_gl_ext_geodiff_getDefault, function in VisuGlExtNodeVectors
    visu_gl_ext_getActive, function in VisuGlExt
    visu_gl_ext_getAll, function in VisuGlExt
    visu_gl_ext_getFromName, function in VisuGlExt
    visu_gl_ext_getGlList, function in VisuGlExt
    visu_gl_ext_getPreferedRenderingMode, function in VisuGlExt
    visu_gl_ext_getSensitiveToRenderingMode, function in VisuGlExt
    visu_gl_ext_infos_draw, function in VisuGlExtInfos
    visu_gl_ext_infos_drawData, function in VisuGlExtInfos
    visu_gl_ext_infos_drawElements, function in VisuGlExtInfos
    visu_gl_ext_infos_drawIds, function in VisuGlExtInfos
    visu_gl_ext_infos_getDefault, function in VisuGlExtInfos
    VISU_GL_EXT_INFOS_ID, macro in VisuGlExtInfos
    visu_gl_ext_infos_new, function in VisuGlExtInfos
    visu_gl_ext_infos_setData, function in VisuGlExtInfos
    visu_gl_ext_infos_setGlView, function in VisuGlExtInfos
    visu_gl_ext_legend_getDefault, function in VisuGlExtLegend
    VISU_GL_EXT_LEGEND_ID, macro in VisuGlExtLegend
    visu_gl_ext_legend_new, function in VisuGlExtLegend
    visu_gl_ext_legend_setNodes, function in VisuGlExtLegend
    visu_gl_ext_maps_add, function in VisuGlExtMaps
    visu_gl_ext_maps_draw, function in VisuGlExtMaps
    VISU_GL_EXT_MAPS_ID, macro in VisuGlExtMaps
    visu_gl_ext_maps_new, function in VisuGlExtMaps
    visu_gl_ext_maps_remove, function in VisuGlExtMaps
    visu_gl_ext_maps_setDirty, function in VisuGlExtMaps
    visu_gl_ext_maps_setGlView, function in VisuGlExtMaps
    visu_gl_ext_maps_setLineColor, function in VisuGlExtMaps
    visu_gl_ext_maps_setPrecision, function in VisuGlExtMaps
    visu_gl_ext_maps_setShade, function in VisuGlExtMaps
    visu_gl_ext_maps_setTransparent, function in VisuGlExtMaps
    visu_gl_ext_marks_exportXMLFile, function in marks
    visu_gl_ext_marks_getActive, function in marks
    visu_gl_ext_marks_getHighlightedList, function in marks
    visu_gl_ext_marks_getHighlightStatus, function in marks
    visu_gl_ext_marks_getInternalList, function in marks
    visu_gl_ext_marks_getMeasurementLabels, function in marks
    visu_gl_ext_marks_getMeasurementStrings, function in marks
    visu_gl_ext_marks_new, function in marks
    visu_gl_ext_marks_parseXMLFile, function in marks
    visu_gl_ext_marks_removeMeasures, function in marks
    visu_gl_ext_marks_setData, function in marks
    visu_gl_ext_marks_setDrawValues, function in marks
    visu_gl_ext_marks_setGlView, function in marks
    visu_gl_ext_marks_setHighlightedList, function in marks
    visu_gl_ext_marks_setInfos, function in marks
    visu_gl_ext_marks_setInteractive, function in marks
    visu_gl_ext_nodes_draw, function in VisuGlExtNodes
    visu_gl_ext_nodes_getData, function in VisuGlExtNodes
    visu_gl_ext_nodes_getSelection, function in VisuGlExtNodes
    visu_gl_ext_nodes_getSelectionByRegion, function in VisuGlExtNodes
    visu_gl_ext_nodes_new, function in VisuGlExtNodes
    visu_gl_ext_nodes_setData, function in VisuGlExtNodes
    visu_gl_ext_nodes_setMaterialEffect, function in VisuGlExtNodes
    visu_gl_ext_nodes_setRendering, function in VisuGlExtNodes
    visu_gl_ext_node_vectors_draw, function in VisuGlExtNodeVectors
    visu_gl_ext_node_vectors_getData, function in VisuGlExtNodeVectors
    visu_gl_ext_node_vectors_getNormalisation, function in VisuGlExtNodeVectors
    visu_gl_ext_node_vectors_new, function in VisuGlExtNodeVectors
    visu_gl_ext_node_vectors_setArrow, function in VisuGlExtNodeVectors
    visu_gl_ext_node_vectors_setCentering, function in VisuGlExtNodeVectors
    visu_gl_ext_node_vectors_setColor, function in VisuGlExtNodeVectors
    visu_gl_ext_node_vectors_setData, function in VisuGlExtNodeVectors
    visu_gl_ext_node_vectors_setLabelThreshold, function in VisuGlExtNodeVectors
    visu_gl_ext_node_vectors_setNormalisation, function in VisuGlExtNodeVectors
    visu_gl_ext_node_vectors_setRenderedSize, function in VisuGlExtNodeVectors
    visu_gl_ext_node_vectors_setTranslation, function in VisuGlExtNodeVectors
    visu_gl_ext_node_vectors_setVectorThreshold, function in VisuGlExtNodeVectors
    visu_gl_ext_pairs_draw, function in VisuGlExtPairs
    visu_gl_ext_pairs_getDefault, function in VisuGlExtPairs
    visu_gl_ext_pairs_getDrawMethod, function in VisuGlExtPairs
    visu_gl_ext_pairs_getDrawnPair, function in VisuGlExtPairs
    visu_gl_ext_pairs_getNDrawn, function in VisuGlExtPairs
    VISU_GL_EXT_PAIRS_ID, macro in VisuGlExtPairs
    visu_gl_ext_pairs_new, function in VisuGlExtPairs
    visu_gl_ext_pairs_setData, function in VisuGlExtPairs
    visu_gl_ext_pairs_setDrawMethod, function in VisuGlExtPairs
    visu_gl_ext_paths_draw, function in VisuGlExtPaths
    VISU_GL_EXT_PATHS_ID, macro in VisuGlExtPaths
    visu_gl_ext_paths_new, function in VisuGlExtPaths
    visu_gl_ext_paths_set, function in VisuGlExtPaths
    visu_gl_ext_paths_setDirty, function in VisuGlExtPaths
    visu_gl_ext_planes_add, function in VisuGlExtPlanes
    visu_gl_ext_planes_draw, function in VisuGlExtPlanes
    visu_gl_ext_planes_getDefault, function in VisuGlExtPlanes
    VISU_GL_EXT_PLANES_ID, macro in VisuGlExtPlanes
    visu_gl_ext_planes_new, function in VisuGlExtPlanes
    visu_gl_ext_planes_remove, function in VisuGlExtPlanes
    VISU_GL_EXT_PRIORITY_BACKGROUND, macro in VisuGlExt
    VISU_GL_EXT_PRIORITY_HIGH, macro in VisuGlExt
    VISU_GL_EXT_PRIORITY_LAST, macro in VisuGlExt
    VISU_GL_EXT_PRIORITY_LOW, macro in VisuGlExt
    VISU_GL_EXT_PRIORITY_NODES, macro in VisuGlExt
    VISU_GL_EXT_PRIORITY_NODE_DECORATIONS, macro in VisuGlExt
    VISU_GL_EXT_PRIORITY_NORMAL, macro in VisuGlExt
    visu_gl_ext_rebuild, function in VisuGlExt
    visu_gl_ext_rebuildAll, function in VisuGlExt
    visu_gl_ext_scale_add, function in VisuGlExtScale
    visu_gl_ext_scale_draw, function in VisuGlExtScale
    visu_gl_ext_scale_getDefault, function in VisuGlExtScale
    visu_gl_ext_scale_getDefaultLineWidth, function in VisuGlExtScale
    visu_gl_ext_scale_getDefaultRGB, function in VisuGlExtScale
    visu_gl_ext_scale_getDefaultStipple, function in VisuGlExtScale
    visu_gl_ext_scale_getLegend, function in VisuGlExtScale
    visu_gl_ext_scale_getLength, function in VisuGlExtScale
    visu_gl_ext_scale_getNArrows, function in VisuGlExtScale
    visu_gl_ext_scale_getOrientation, function in VisuGlExtScale
    visu_gl_ext_scale_getOrigin, function in VisuGlExtScale
    visu_gl_ext_scale_setDefaultLineWidth, function in VisuGlExtScale
    visu_gl_ext_scale_setDefaultRGB, function in VisuGlExtScale
    visu_gl_ext_scale_setDefaultStipple, function in VisuGlExtScale
    visu_gl_ext_scale_setGlView, function in VisuGlExtScale
    visu_gl_ext_scale_setLegend, function in VisuGlExtScale
    visu_gl_ext_scale_setLength, function in VisuGlExtScale
    visu_gl_ext_scale_setOrientation, function in VisuGlExtScale
    visu_gl_ext_scale_setOrigin, function in VisuGlExtScale
    visu_gl_ext_setActive, function in VisuGlExt
    visu_gl_ext_setPreferedRenderingMode, function in VisuGlExt
    visu_gl_ext_setPriority, function in VisuGlExt
    visu_gl_ext_setSaveState, function in VisuGlExt
    visu_gl_ext_setSensitiveToRenderingMode, function in VisuGlExt
    VISU_GL_EXT_SHADE_ID, macro in VisuGlExtShade
    visu_gl_ext_shade_new, function in VisuGlExtShade
    visu_gl_ext_shade_setMarks, function in VisuGlExtShade
    visu_gl_ext_shade_setMinMax, function in VisuGlExtShade
    visu_gl_ext_shade_setScaling, function in VisuGlExtShade
    visu_gl_ext_shade_setShade, function in VisuGlExtShade
    visu_gl_ext_surfaces_add, function in VisuGlExtSurfaces
    visu_gl_ext_surfaces_draw, function in VisuGlExtSurfaces
    visu_gl_ext_surfaces_getDefault, function in VisuGlExtSurfaces
    visu_gl_ext_surfaces_getDrawIntra, function in VisuGlExtSurfaces
    VISU_GL_EXT_SURFACES_ID, macro in VisuGlExtSurfaces
    visu_gl_ext_surfaces_new, function in VisuGlExtSurfaces
    visu_gl_ext_surfaces_remove, function in VisuGlExtSurfaces
    visu_gl_ext_surfaces_setDrawIntra, function in VisuGlExtSurfaces
    visu_gl_ext_surfaces_setOnObserveOrdering, function in VisuGlExtSurfaces
    visu_gl_ext_surfaces_setOnTheFlyOrdering, function in VisuGlExtSurfaces
    visu_gl_ext_vibration_getDefault, function in VisuGlExtNodeVectors
    visu_gl_getAntialias, function in opengl
    visu_gl_getGLConfig, function in visu_openGL
    visu_gl_getImmediate, function in opengl
    visu_gl_getLights, function in opengl
    visu_gl_getStereo, function in opengl
    visu_gl_getStereoAngle, function in opengl
    visu_gl_getStereoCapability, function in opengl
    visu_gl_getTrueTransparency, function in opengl
    visu_gl_getVisualInfo, function in visu_openGL
    visu_gl_init, function in opengl
    visu_gl_initContext, function in opengl
    visu_gl_initFontList, function in visu_openGL
    visu_gl_initGraphics, function in opengl
    visu_gl_lights_add, function in light
    visu_gl_lights_apply, function in light
    visu_gl_lights_free, function in light
    visu_gl_lights_getList, function in light
    visu_gl_lights_new, function in light
    visu_gl_lights_ref, function in light
    visu_gl_lights_remove, function in light
    visu_gl_lights_removeAll, function in light
    visu_gl_lights_unref, function in light
    visu_gl_light_newDefault, function in light
    visu_gl_objectlist_init, function in objectList
    visu_gl_objectlist_new, function in objectList
    visu_gl_pairs_cylinder_getColorType, function in cylinder
    visu_gl_pairs_cylinder_getGeneralRadius, function in cylinder
    visu_gl_pairs_cylinder_getRadius, function in cylinder
    visu_gl_pairs_cylinder_getStatic, function in cylinder
    visu_gl_pairs_cylinder_init, function in cylinder
    VISU_GL_PAIRS_CYLINDER_RADIUS_MAX, macro in cylinder
    VISU_GL_PAIRS_CYLINDER_RADIUS_MIN, macro in cylinder
    visu_gl_pairs_cylinder_setColorType, function in cylinder
    visu_gl_pairs_cylinder_setGeneralRadius, function in cylinder
    visu_gl_pairs_cylinder_setRadius, function in cylinder
    visu_gl_pairs_wire_getGeneralWidth, function in wire
    visu_gl_pairs_wire_getShade, function in wire
    visu_gl_pairs_wire_getStatic, function in wire
    visu_gl_pairs_wire_getStipple, function in wire
    visu_gl_pairs_wire_getWidth, function in wire
    visu_gl_pairs_wire_init, function in wire
    visu_gl_pairs_wire_setGeneralWidth, function in wire
    visu_gl_pairs_wire_setShade, function in wire
    visu_gl_pairs_wire_setStipple, function in wire
    visu_gl_pairs_wire_setWidth, function in wire
    visu_gl_redraw, function in opengl
    visu_gl_rendering_applyMode, function in renderingMode
    visu_gl_rendering_getAllModeLabels, function in renderingMode
    visu_gl_rendering_getAllModes, function in renderingMode
    visu_gl_rendering_getGlobalMode, function in renderingMode
    visu_gl_rendering_getModeFromName, function in renderingMode
    visu_gl_rendering_init, function in renderingMode
    visu_gl_rendering_setGlobalMode, function in renderingMode
    visu_gl_setAntialias, function in opengl
    visu_gl_setColor, function in opengl
    visu_gl_setHighlightColor, function in opengl
    visu_gl_setImmediate, function in opengl
    visu_gl_setStereo, function in opengl
    visu_gl_setStereoAngle, function in opengl
    visu_gl_setTrueTransparency, function in opengl
    visu_gl_setupPixelFormat, function in visu_openGL
    visu_gl_text_drawChars, function in text
    visu_gl_text_initFontList, function in text
    visu_gl_text_onNewContext, function in text
    visu_gl_text_putTextWithFTGL, function in text
    visu_gl_text_rebuildFontList, function in text
    visu_gl_text_setFontSize, function in text
    visu_gl_text_setFunc, function in text
    visu_gl_view_class_getPrecision, function in VisuGlView
    visu_gl_view_class_setPrecision, function in VisuGlView
    visu_gl_view_getDetailLevel, function in VisuGlView
    visu_gl_view_getRealCoordinates, function in VisuGlView
    visu_gl_view_getZCoordinate, function in VisuGlView
    visu_gl_view_new, function in VisuGlView
    visu_gl_view_new_withSize, function in VisuGlView
    visu_gl_view_rotateBox, function in VisuGlView
    visu_gl_view_rotateCamera, function in VisuGlView
    visu_gl_view_setGross, function in VisuGlView
    visu_gl_view_setObjectRadius, function in VisuGlView
    visu_gl_view_setPersp, function in VisuGlView
    visu_gl_view_setRefLength, function in VisuGlView
    visu_gl_view_setThetaPhiOmega, function in VisuGlView
    visu_gl_view_setViewport, function in VisuGlView
    visu_gl_view_setXsYs, function in VisuGlView
    visu_gl_window_getAddLength, function in VisuGlView
    visu_gl_window_getFileUnitPerPixel, function in VisuGlView
    visu_gl_window_project, function in VisuGlView
    visu_gl_window_setAddLength, function in VisuGlView
    visu_gl_window_setViewport, function in VisuGlView
    gtk_tree_model_iter_previous, function in panelSurfacesTools

    I

    IMPL_BUILTIN_WIN32, macro in visu_openGL
    IMPL_BUILTIN_X11, macro in visu_openGL
    IMPL_GTKGLEXT, macro in visu_openGL
    initAtomicAscii, function in renderingAtomic_ascii
    initAtomicD3, function in renderingAtomic_d3
    initAtomicXyz, function in atomic_xyz
    VisuInteractive, struct in interactive
    VisuInteractive::menu, object signal in interactive
    VisuInteractive::move, object signal in interactive
    VisuInteractive::node-selection, object signal in interactive
    VisuInteractive::observe, object signal in interactive
    VisuInteractive::region-selection, object signal in interactive
    VisuInteractive::selection-error, object signal in interactive
    VisuInteractive::start-move, object signal in interactive
    VisuInteractive::stop, object signal in interactive
    VisuInteractiveClass, struct in interactive
    VisuInteractiveId, enum in interactive
    VisuInteractiveMethod, enum in interactive
    VisuInteractivePick, enum in interactive
    VisuInteractivePickError, enum in interactive
    visu_interactive_apply, function in interactive
    visu_interactive_class_getNodes2DCoordinates, function in interactive
    visu_interactive_class_getPreferedObserveMethod, function in interactive
    visu_interactive_class_setPreferedObserveMethod, function in interactive
    visu_interactive_getEvent, function in interactive
    visu_interactive_getSavedCameras, function in interactive
    visu_interactive_getType, function in interactive
    visu_interactive_handleEvent, function in interactive
    visu_interactive_highlight, function in interactive
    visu_interactive_new, function in interactive
    visu_interactive_popSavedCamera, function in interactive
    visu_interactive_pushSavedCamera, function in interactive
    visu_interactive_setMovingAxe, function in interactive
    visu_interactive_setMovingNodes, function in interactive
    visu_interactive_setNodeList, function in interactive
    visu_interactive_setReferences, function in interactive
    visu_interactive_setType, function in interactive

    L

    VisuLine, struct in isoline
    visu_line_draw, function in isoline
    visu_line_free, function in isoline
    visu_line_getValue, function in isoline
    visu_line_newFromTriangles, function in isoline
    visu_line_project, function in isoline
    visu_line_ref, function in isoline
    visu_line_unref, function in isoline

    M

    VisuMap, struct in map
    VisuMapExportFormat, enum in map
    visu_map_compute, function in map
    visu_map_draw, function in map
    visu_map_export, function in map
    visu_map_free, function in map
    visu_map_getFieldMinMax, function in map
    visu_map_getPlane, function in map
    visu_map_getScaledMinMax, function in map
    visu_map_init, function in map
    visu_map_new, function in map
    visu_map_newFromPlane, function in map
    visu_map_ref, function in map
    visu_map_setField, function in map
    visu_map_setLevel, function in map
    visu_map_setLines, function in map
    visu_map_setPlane, function in map
    visu_map_unref, function in map
    visu_meth_asciiFree, function in renderingAtomic_ascii
    visu_meth_asciiValToNb, function in renderingAtomic_ascii
    visu_meth_asciiValToType, function in renderingAtomic_ascii

    N

    VisuNode, struct in VisuNodeArray
    VisuNodeArray, struct in VisuNodeArray
    VisuNodeArray::AskForShowHide, object signal in VisuNodeArray
    VisuNodeArray::ElementRenderingChanged, object signal in VisuNodeArray
    VisuNodeArray::MaterialChanged, object signal in VisuNodeArray
    VisuNodeArray::PopulationDecrease, object signal in VisuNodeArray
    VisuNodeArray::PopulationDefined, object signal in VisuNodeArray
    VisuNodeArray::PopulationIncrease, object signal in VisuNodeArray
    VisuNodeArray::PositionChanged, object signal in VisuNodeArray
    VisuNodeArray::RenderingChanged, object signal in VisuNodeArray
    VisuNodeArray::VisibilityChanged, object signal in VisuNodeArray
    VisuNodeArrayClass, struct in VisuNodeArray
    VisuNodeArrayElementPropertyInit, user_function in VisuNodeArray
    VisuNodeArrayIter, struct in VisuNodeArray
    VisuNodeArrayIterType, enum in VisuNodeArray
    VisuNodeInfo, typedef in VisuNodeArray
    VisuNodeProperty, struct in VisuNodeArray
    visu_node_array_allocate, function in VisuNodeArray
    visu_node_array_allocateByNames, function in VisuNodeArray
    visu_node_array_allocateNodesForElement, function in VisuNodeArray
    visu_node_array_askForShowHide, function in VisuNodeArray
    visu_node_array_compareElements, function in VisuNodeArray
    visu_node_array_freeNodes, function in VisuNodeArray
    visu_node_array_freeProperty, function in VisuNodeArray
    visu_node_array_getCopyNode, function in VisuNodeArray
    visu_node_array_getElement, function in VisuNodeArray
    visu_node_array_getElementId, function in VisuNodeArray
    visu_node_array_getElementProperty, function in VisuNodeArray
    visu_node_array_getFromId, function in VisuNodeArray
    visu_node_array_getMaxElementSize, function in VisuNodeArray
    visu_node_array_getNElements, function in VisuNodeArray
    visu_node_array_getNewNode, function in VisuNodeArray
    visu_node_array_getNNodes, function in VisuNodeArray
    visu_node_array_getOriginal, function in VisuNodeArray
    visu_node_array_getProperty, function in VisuNodeArray
    visu_node_array_getPropertyValue, macro in VisuNodeArray
    visu_node_array_iterNew, function in VisuNodeArray
    visu_node_array_iterNext, function in VisuNodeArray
    visu_node_array_iterNextElement, function in VisuNodeArray
    visu_node_array_iterNextList, function in VisuNodeArray
    visu_node_array_iterNextNode, function in VisuNodeArray
    visu_node_array_iterNextNodeNumber, function in VisuNodeArray
    visu_node_array_iterNextNodeOriginal, function in VisuNodeArray
    visu_node_array_iterNextVisible, function in VisuNodeArray
    visu_node_array_iterRestartNode, function in VisuNodeArray
    visu_node_array_iterStart, function in VisuNodeArray
    visu_node_array_iterStartList, function in VisuNodeArray
    visu_node_array_iterStartNumber, function in VisuNodeArray
    visu_node_array_iterStartVisible, function in VisuNodeArray
    visu_node_array_iter_next, function in VisuNodeArray
    visu_node_array_iter_next2, function in VisuNodeArray
    visu_node_array_property_newInteger, function in VisuNodeArray
    visu_node_array_property_newPointer, function in VisuNodeArray
    visu_node_array_removeAllDuplicateNodes, function in VisuNodeArray
    visu_node_array_removeNodes, function in VisuNodeArray
    visu_node_array_removeNodesOfElement, function in VisuNodeArray
    visu_node_array_setElementProperty, function in VisuNodeArray
    visu_node_array_setOriginal, function in VisuNodeArray
    visu_node_array_switchNumber, function in VisuNodeArray
    visu_node_array_traceProperty, function in VisuNodeArray
    visu_node_copy, function in VisuNodeArray
    visu_node_getVisibility, function in VisuNodeArray
    visu_node_newValues, function in VisuNodeArray
    visu_node_property_getValue, function in VisuNodeArray
    visu_node_property_setValue, function in VisuNodeArray
    visu_node_setCoordinates, function in VisuNodeArray
    visu_node_setpropertyValue, macro in VisuNodeArray
    visu_node_setVisibility, function in VisuNodeArray

    O

    VisuObject, struct in VisuObject
    VisuObject::colorNewAvailable, object signal in VisuObject
    VisuObject::dataLoaded, object signal in VisuObject
    VisuObject::dataNew, object signal in VisuObject
    VisuObject::dataRendered, object signal in VisuObject
    VisuObject::dataUnRendered, object signal in VisuObject
    VisuObject::DirectoryChanged, object signal in VisuObject
    VisuObject::entryParsed, object signal in VisuObject
    VisuObject::OpenGLAskForReDraw, object signal in VisuObject
    VisuObject::OpenGLForceReDraw, object signal in VisuObject
    VisuObject::renderingChanged, object signal in VisuObject
    VisuObject::resourcesLoaded, object signal in VisuObject
    VisuObject::shadeNewAvailable, object signal in VisuObject
    VisuObject::viewNew, object signal in VisuObject
    VisuObjectClass, struct in VisuObject
    visu_object_class_getStatic, function in VisuObject
    visu_object_getRendering, function in VisuObject
    VISU_OBJECT_INSTANCE, macro in VisuObject
    visu_object_load, function in VisuObject
    visu_object_redraw, function in VisuObject
    visu_object_redrawForce, function in VisuObject
    visu_object_setLoadMessage, function in VisuObject
    visu_object_setLoadMessageFunc, function in VisuObject
    visu_object_setRendering, function in VisuObject

    P

    VisuPair, struct in VisuPairLink
    VisuPairDistribution, struct in VisuPairLink
    VisuPairDrawFuncs, struct in VisuGlExtPairs
    VisuPairExtension, struct in VisuGlExtPairs
    VisuPairForeachFunc, user_function in VisuPairLink
    VisuPairLink, struct in VisuPairLink
    VisuPairLink::ParameterChanged, object signal in VisuPairLink
    VisuPairLinkClass, struct in VisuPairLink
    VISU_PAIR_DISTANCE_MAX, macro in VisuPairLink
    VISU_PAIR_DISTANCE_MIN, macro in VisuPairLink
    visu_pair_distribution_getNextPick, function in VisuPairLink
    visu_pair_extension_free, function in VisuGlExtPairs
    visu_pair_extension_getAllMethods, function in VisuGlExtPairs
    visu_pair_extension_getByName, function in VisuGlExtPairs
    visu_pair_extension_getDefault, function in VisuGlExtPairs
    visu_pair_extension_getName, function in VisuGlExtPairs
    visu_pair_extension_new, function in VisuGlExtPairs
    visu_pair_extension_ref, function in VisuGlExtPairs
    visu_pair_extension_setDefault, function in VisuGlExtPairs
    visu_pair_extension_unref, function in VisuGlExtPairs
    visu_pair_foreach, function in VisuPairLink
    visu_pair_getDistanceDistribution, function in VisuPairLink
    visu_pair_getElements, function in VisuPairLink
    visu_pair_getPair, function in VisuPairLink
    visu_pair_getProperty, function in VisuPairLink
    visu_pair_link_getAll, function in VisuPairLink
    visu_pair_link_getColor, function in VisuPairLink
    visu_pair_link_getDistance, function in VisuPairLink
    visu_pair_link_getDrawn, function in VisuPairLink
    visu_pair_link_getFromId, function in VisuPairLink
    visu_pair_link_getPair, function in VisuPairLink
    visu_pair_link_getPrintLength, function in VisuPairLink
    visu_pair_link_isDrawn, function in VisuPairLink
    visu_pair_link_new, function in VisuPairLink
    visu_pair_link_setColor, function in VisuPairLink
    visu_pair_link_setDistance, function in VisuPairLink
    visu_pair_link_setDrawn, function in VisuPairLink
    visu_pair_link_setPrintLength, function in VisuPairLink
    visu_pair_readLinkFromTokens, function in VisuPairLink
    visu_pair_removePairLink, function in VisuPairLink
    visu_pair_setProperty, function in VisuPairLink
    VisuPaths, struct in geometry
    visu_paths_addFromDiff, function in geometry
    visu_paths_addNodeStep, function in geometry
    visu_paths_constrainInBox, function in geometry
    visu_paths_draw, function in geometry
    visu_paths_empty, function in geometry
    visu_paths_exportXMLFile, function in geometry
    visu_paths_free, function in geometry
    visu_paths_getLength, function in geometry
    visu_paths_getToolShade, function in geometry
    visu_paths_new, function in geometry
    visu_paths_parseFromXML, function in geometry
    visu_paths_pinPositions, function in geometry
    visu_paths_ref, function in geometry
    visu_paths_setToolShade, function in geometry
    visu_paths_setTranslation, function in geometry
    visu_paths_unref, function in geometry
    VisuPixmapContext, struct in visu_openGL
    visu_pixmap_context_free, function in visu_openGL
    visu_pixmap_context_new, function in visu_openGL
    visu_pixmap_getData, function in visu_openGL
    VisuPlane, struct in plane
    VisuPlane::moved, object signal in plane
    VisuPlane::rendering, object signal in plane
    VisuPlaneClass, struct in plane
    VisuPlaneHidingMode, enum in plane
    visu_plane_class_exportXMLFile, function in plane
    visu_plane_class_getIntersection, function in plane
    visu_plane_class_getOrderedIntersections, function in plane
    visu_plane_class_getVisibility, function in plane
    visu_plane_class_parseXMLFile, function in plane
    visu_plane_class_setHiddingMode, function in plane
    visu_plane_class_showHideAll, function in plane
    visu_plane_getBasis, function in plane
    visu_plane_getColor, function in plane
    visu_plane_getDistanceFromOrigin, function in plane
    visu_plane_getHiddenState, function in plane
    visu_plane_getIntersection, function in plane
    visu_plane_getLineIntersection, function in plane
    visu_plane_getNVect, function in plane
    visu_plane_getNVectUser, function in plane
    visu_plane_getPlaneIntersection, function in plane
    visu_plane_getReducedIntersection, function in plane
    visu_plane_getRendered, function in plane
    visu_plane_new, function in plane
    visu_plane_newUndefined, function in plane
    visu_plane_setColor, function in plane
    visu_plane_setDistanceFromOrigin, function in plane
    visu_plane_setHiddenState, function in plane
    visu_plane_setNormalVector, function in plane
    visu_plane_setRendered, function in plane
    VISU_PLANE_SIDE_MINUS, macro in plane
    VISU_PLANE_SIDE_NONE, macro in plane
    VISU_PLANE_SIDE_PLUS, macro in plane
    VisuPlugin, struct in visu_plugins
    VisuPluginFreeFunc, user_function in visu_plugins
    VisuPluginInfoFunc, user_function in visu_plugins
    VisuPluginInitFunc, user_function in visu_plugins
    visu_plugins_free, function in visu_plugins
    visu_plugins_getListLoaded, function in visu_plugins
    visu_plugins_init, function in visu_plugins
    visu_plugin_getAuthors, function in visu_plugins
    visu_plugin_getDescription, function in visu_plugins
    visu_plugin_getIconPath, function in visu_plugins
    visu_plugin_getName, function in visu_plugins
    visu_plugin_initGtk, function in visu_plugins

    R

    VISU_REDRAW_ADD, macro in VisuObject
    VISU_REDRAW_FORCE, macro in VisuObject
    VisuRendering, struct in VisuRendering
    VisuRendering::elementSizeChanged, object signal in VisuRendering
    VisuRendering::fileTypeChanged, object signal in VisuRendering
    VisuRendering:description, object property in VisuRendering
    VisuRendering:label, object property in VisuRendering
    VisuRendering:name, object property in VisuRendering
    VisuRendering:nFiles, object property in VisuRendering
    VisuRenderingAtomic, struct in renderingAtomic
    VisuRenderingAtomic::ForcesChanged, object signal in renderingAtomic
    VisuRenderingAtomicClass, struct in renderingAtomic
    VisuRenderingAtomicShapeId, enum in renderingAtomic
    VisuRenderingClass, struct in VisuRendering
    VisuRenderingCreateElementFunc, user_function in VisuRendering
    VisuRenderingCreateNodeFunc, user_function in VisuRendering
    VisuRenderingErrorFlag, enum in VisuRendering
    VisuRenderingGetElementGlId, user_function in VisuRendering
    VisuRenderingGetNodeExtendFunc, user_function in VisuRendering
    VisuRenderingLoadFormatFunc, user_function in VisuRendering
    VisuRenderingSpin, struct in renderingSpin
    VisuRenderingSpin::colorisationChange, object signal in renderingSpin
    VisuRenderingSpin:cone-omega, object property in renderingSpin
    VisuRenderingSpin:cone-phi, object property in renderingSpin
    VisuRenderingSpin:cone-theta, object property in renderingSpin
    VisuRenderingSpin:hiding-mode, object property in renderingSpin
    VisuRenderingSpin:modulus-scaling, object property in renderingSpin
    VisuRenderingSpin:use-atomic, object property in renderingSpin
    VisuRenderingSpinClass, struct in renderingSpin
    VisuRenderingSpinDrawingPolicy, enum in renderingSpin
    VisuRenderingSpinFileType, enum in renderingSpin
    VisuRenderingSpinModulusPolicy, enum in renderingSpin
    VisuRenderingSpinResources, enum in renderingSpin
    VisuRenderingSpinShapeId, enum in renderingSpin
    visu_rendering_addFileFormat, function in VisuRendering
    VISU_RENDERING_ATOMIC_FORCES, macro in renderingAtomic
    VISU_RENDERING_ATOMIC_FORCES_ELE_MAX, macro in renderingAtomic
    visu_rendering_atomic_getAllShapes, function in renderingAtomic
    visu_rendering_atomic_getAllShapesI18n, function in renderingAtomic
    visu_rendering_atomic_getElipsoidPhi, function in renderingAtomic
    visu_rendering_atomic_getElipsoidRatio, function in renderingAtomic
    visu_rendering_atomic_getElipsoidTheta, function in renderingAtomic
    visu_rendering_atomic_getMaxForces, function in renderingAtomic
    visu_rendering_atomic_getRadius, function in renderingAtomic
    visu_rendering_atomic_getRadiusDefault, function in renderingAtomic
    visu_rendering_atomic_getShape, function in renderingAtomic
    visu_rendering_atomic_getShapeDefault, function in renderingAtomic
    visu_rendering_atomic_getShapeName, function in renderingAtomic
    visu_rendering_atomic_getShapeNameDefault, function in renderingAtomic
    VISU_RENDERING_ATOMIC_NAME, macro in renderingAtomic
    visu_rendering_atomic_new, function in renderingAtomic
    visu_rendering_atomic_setElipsoidParameters, function in renderingAtomic
    visu_rendering_atomic_setElipsoidPhi, function in renderingAtomic
    visu_rendering_atomic_setElipsoidRatio, function in renderingAtomic
    visu_rendering_atomic_setElipsoidTheta, function in renderingAtomic
    visu_rendering_atomic_setForces, function in renderingAtomic
    visu_rendering_atomic_setRadius, function in renderingAtomic
    visu_rendering_atomic_setShape, function in renderingAtomic
    visu_rendering_atomic_setShapeFromName, function in renderingAtomic
    visu_rendering_atomic_yaml_init, function in atomic_yaml
    visu_rendering_class_getErrorQuark, function in VisuRendering
    visu_rendering_createElement, function in VisuRendering
    visu_rendering_createNode, function in VisuRendering
    visu_rendering_getAllObjects, function in VisuRendering
    visu_rendering_getByName, function in VisuRendering
    visu_rendering_getDescription, function in VisuRendering
    visu_rendering_getElementGlId, function in VisuRendering
    visu_rendering_getFileFormat, function in VisuRendering
    visu_rendering_getFileTypeName, function in VisuRendering
    visu_rendering_getIconPath, function in VisuRendering
    visu_rendering_getName, function in VisuRendering
    visu_rendering_getNFileTypes, function in VisuRendering
    visu_rendering_getSizeOfElement, function in VisuRendering
    visu_rendering_load, function in VisuRendering
    visu_rendering_setFileFormat, function in VisuRendering
    visu_rendering_setFileTypeLabel, function in VisuRendering
    visu_rendering_setIcon, function in VisuRendering
    visu_rendering_spin_getHidingPolicyFromName, function in renderingSpin
    visu_rendering_spin_getHidingPolicyName, function in renderingSpin
    visu_rendering_spin_getHidingPolicyNameI18n, function in renderingSpin
    visu_rendering_spin_getResource, function in renderingSpin
    visu_rendering_spin_getResourceBoolean, function in renderingSpin
    visu_rendering_spin_getResourceFloat, function in renderingSpin
    visu_rendering_spin_getResourceUint, function in renderingSpin
    visu_rendering_spin_getShapeNameI18n, function in renderingSpin
    VISU_RENDERING_SPIN_MAX_MODULUS_ID, macro in renderingSpin
    VISU_RENDERING_SPIN_NAME, macro in renderingSpin
    visu_rendering_spin_new, function in renderingSpin
    visu_rendering_spin_setResource, function in renderingSpin
    visu_rendering_spin_setResourceBoolean, function in renderingSpin
    visu_rendering_spin_setResourceFloat, function in renderingSpin
    visu_rendering_spin_setResourceUint, function in renderingSpin
    VISU_RENDERING_SPIN_VALUES_ID, macro in renderingSpin

    S

    VisuScalarField, struct in VisuScalarField
    VisuScalarFieldClass, struct in VisuScalarField
    VisuScalarFieldMeshFlags, enum in VisuScalarField
    VisuScalarFieldMethod, struct in VisuScalarField
    VisuScalarFieldMethodClass, struct in VisuScalarField
    VisuScalarFieldMethodLoadFunc, user_function in VisuScalarField
    visu_scalar_field_addOption, function in VisuScalarField
    VISU_SCALAR_FIELD_DEFINED_IN_STRUCT_FILE, macro in VisuScalarField
    visu_scalar_field_getAllOptions, function in VisuScalarField
    visu_scalar_field_getCommentary, function in VisuScalarField
    visu_scalar_field_getData, function in VisuScalarField
    visu_scalar_field_getDataArray, function in VisuScalarField
    visu_scalar_field_getFilename, function in VisuScalarField
    visu_scalar_field_getGridSize, function in VisuScalarField
    visu_scalar_field_getMeshtype, function in VisuScalarField
    visu_scalar_field_getMeshx, function in VisuScalarField
    visu_scalar_field_getMeshy, function in VisuScalarField
    visu_scalar_field_getMeshz, function in VisuScalarField
    visu_scalar_field_getMinMax, function in VisuScalarField
    visu_scalar_field_getOriginShift, function in VisuScalarField
    visu_scalar_field_getValue, function in VisuScalarField
    visu_scalar_field_method_getAll, function in VisuScalarField
    visu_scalar_field_method_load, function in VisuScalarField
    visu_scalar_field_method_new, function in VisuScalarField
    visu_scalar_field_new, function in VisuScalarField
    visu_scalar_field_new_fromFile, function in VisuScalarField
    visu_scalar_field_setCommentary, function in VisuScalarField
    visu_scalar_field_setData, function in VisuScalarField
    visu_scalar_field_setGridSize, function in VisuScalarField
    visu_scalar_field_setMeshtype, function in VisuScalarField
    visu_scalar_field_setOriginShift, function in VisuScalarField
    VisuSurfaces, struct in surfaces
    VisuSurfaces::added, object signal in surfaces
    VisuSurfaces::masked, object signal in surfaces
    VisuSurfaces::removed, object signal in surfaces
    VisuSurfaces::rendering, object signal in surfaces
    VisuSurfacesClass, struct in surfaces
    VisuSurfacesPoints, struct in surfaces_points
    VisuSurfacesResources, struct in surfaces_resources
    visu_surfaces_add, function in surfaces
    visu_surfaces_addPropertyFloat, function in surfaces
    visu_surfaces_allocate, function in surfaces
    visu_surfaces_checkConsistency, function in surfaces
    visu_surfaces_createFromPotentialFile, function in pot2surf
    visu_surfaces_createFromScalarField, function in pot2surf
    visu_surfaces_exportXMLFile, function in pot2surf
    visu_surfaces_getErrorQuark, function in surfaces
    visu_surfaces_getId, function in surfaces
    visu_surfaces_getN, function in surfaces
    visu_surfaces_getName, function in surfaces
    visu_surfaces_getNewId, function in surfaces
    visu_surfaces_getPosition, function in surfaces
    visu_surfaces_getPropertyFloat, function in surfaces
    visu_surfaces_getPropertyValueFloat, function in surfaces
    visu_surfaces_getRendered, function in surfaces
    visu_surfaces_getResource, function in surfaces
    visu_surfaces_getResourceById, function in surfaces
    visu_surfaces_getSortedById, function in surfaces
    visu_surfaces_hide, function in surfaces
    visu_surfaces_loadFile, function in surfaces
    visu_surfaces_new, function in surfaces
    visu_surfaces_parseXMLFile, function in pot2surf
    visu_surfaces_points_allocate, function in surfaces_points
    visu_surfaces_points_check, function in surfaces_points
    visu_surfaces_points_free, function in surfaces_points
    visu_surfaces_points_init, function in surfaces_points
    VISU_SURFACES_POINTS_OFFSET_NORMAL, macro in surfaces_points
    VISU_SURFACES_POINTS_OFFSET_TRANSLATION, macro in surfaces_points
    VISU_SURFACES_POINTS_OFFSET_USER, macro in surfaces_points
    visu_surfaces_points_remove, function in surfaces_points
    visu_surfaces_points_transform, function in surfaces_points
    visu_surfaces_points_translate, function in surfaces_points
    VISU_SURFACES_PROPERTY_POTENTIAL, macro in surfaces
    visu_surfaces_remove, function in surfaces
    visu_surfaces_resources_copy, function in surfaces_resources
    visu_surfaces_resources_free, function in surfaces_resources
    visu_surfaces_resources_getFromName, function in surfaces_resources
    visu_surfaces_resources_getRendered, function in surfaces_resources
    visu_surfaces_resources_init, function in surfaces_resources
    visu_surfaces_setColorAndMaterial, function in surfaces
    visu_surfaces_setRendered, function in surfaces
    visu_surfaces_setResource, function in surfaces
    visu_surfaces_setShowAll, function in surfaces

    T

    ToolColor, struct in toolColor
    ToolConfigFileError, enum in toolConfigFile
    ToolFileFormat, struct in ToolFileFormat
    ToolFileFormat:ignore-type, object property in ToolFileFormat
    ToolFileFormat:label, object property in ToolFileFormat
    ToolFileFormat:name, object property in ToolFileFormat
    ToolFileFormatClass, struct in ToolFileFormat
    ToolFileFormatErrorFlag, enum in ToolFileFormat
    ToolFileFormatIter, struct in ToolFileFormat
    ToolFileFormatValidate, user_function in ToolFileFormat
    ToolFortranEndianId, enum in toolFortran
    ToolGridSize, struct in toolMatrix
    ToolMatrixScalingFlag, enum in toolMatrix
    ToolMatrixSphericalCoord, enum in toolMatrix
    ToolOption, struct in toolOptions
    ToolShade, struct in toolShade
    ToolShadeColorMode, enum in toolShade
    ToolShadeMode, enum in toolShade
    ToolShadeStep, struct in toolShade
    ToolSimplifiedEvents, struct in visu_actionInterface
    ToolSpecialKeyStroke, enum in visu_actionInterface
    ToolUnits, enum in toolPhysic
    ToolVector, struct in toolMatrix
    TOOL_BUTTON_TYPE_PRESS, macro in visu_actionInterface
    TOOL_BUTTON_TYPE_RELEASE, macro in visu_actionInterface
    tool_color_addColor, function in toolColor
    tool_color_addFloatRGBA, function in toolColor
    tool_color_addIntRGBA, function in toolColor
    tool_color_convertHSLtoRGB, function in toolColor
    tool_color_convertHSVtoRGB, function in toolColor
    tool_color_convertRGBtoHSL, function in toolColor
    tool_color_copy, function in toolColor
    tool_color_equal, function in toolColor
    tool_color_freeAll, function in toolColor
    tool_color_getByColor, function in toolColor
    tool_color_getById, function in toolColor
    tool_color_getByValues, function in toolColor
    tool_color_getLastStored, function in toolColor
    tool_color_getStoredColors, function in toolColor
    tool_color_get_stamp, function in visu_gtk
    TOOL_COLOR_MASK_A, macro in toolColor
    TOOL_COLOR_MASK_B, macro in toolColor
    TOOL_COLOR_MASK_G, macro in toolColor
    TOOL_COLOR_MASK_R, macro in toolColor
    TOOL_COLOR_MASK_RGBA, macro in toolColor
    tool_color_new, function in toolColor
    tool_color_new_bright, function in toolColor
    tool_config_file_clampFloat, function in toolConfigFile
    TOOL_CONFIG_FILE_ERROR, macro in toolConfigFile
    tool_config_file_getQuark, function in toolConfigFile
    tool_config_file_readBoolean, function in toolConfigFile
    tool_config_file_readBooleanFromTokens, function in toolConfigFile
    tool_config_file_readBooleanWithElement, function in toolConfigFile
    tool_config_file_readElementFromTokens, function in toolConfigFile
    tool_config_file_readFloat, function in toolConfigFile
    tool_config_file_readFloatFromTokens, function in toolConfigFile
    tool_config_file_readFloatWithElement, function in toolConfigFile
    tool_config_file_readInteger, function in toolConfigFile
    tool_config_file_readIntegerFromTokens, function in toolConfigFile
    tool_config_file_readString, function in toolConfigFile
    tool_config_file_readStringFromTokens, function in toolConfigFile
    tool_config_file_readStringWithElement, function in toolConfigFile
    tool_file_format_addOption, function in ToolFileFormat
    tool_file_format_addPatterns, function in ToolFileFormat
    tool_file_format_addPropertyBoolean, function in ToolFileFormat
    tool_file_format_addPropertyDouble, function in ToolFileFormat
    tool_file_format_addPropertyInt, function in ToolFileFormat
    tool_file_format_canMatch, function in ToolFileFormat
    tool_file_format_copy, function in ToolFileFormat
    TOOL_FILE_FORMAT_ERROR, macro in ToolFileFormat
    tool_file_format_getFilePatterns, function in ToolFileFormat
    tool_file_format_getLabel, function in ToolFileFormat
    tool_file_format_getName, function in ToolFileFormat
    tool_file_format_getPropertyByName, function in ToolFileFormat
    tool_file_format_getQuark, function in ToolFileFormat
    tool_file_format_iterNextProperty, function in ToolFileFormat
    tool_file_format_match, function in ToolFileFormat
    tool_file_format_new, function in ToolFileFormat
    tool_file_format_newRestricted, function in ToolFileFormat
    tool_file_format_setValidator, function in ToolFileFormat
    tool_file_format_validate, function in ToolFileFormat
    tool_fortran_readCharacter, function in toolFortran
    tool_fortran_readDouble, function in toolFortran
    tool_fortran_readFlag, function in toolFortran
    tool_fortran_readInteger, function in toolFortran
    tool_fortran_readReal, function in toolFortran
    tool_fortran_testEndianness, function in toolFortran
    tool_matrix_cartesianToSpherical, function in toolMatrix
    tool_matrix_determinant, function in toolMatrix
    tool_matrix_dtof, function in toolMatrix
    tool_matrix_getInter2D, function in toolMatrix
    tool_matrix_getInter2DFromList, function in toolMatrix
    tool_matrix_getRotationFromFull, function in toolMatrix
    tool_matrix_getScaledLinear, function in toolMatrix
    tool_matrix_getScaledLinearInv, function in toolMatrix
    tool_matrix_getScaledLog, function in toolMatrix
    tool_matrix_getScaledLogInv, function in toolMatrix
    tool_matrix_getScaledValue, user_function in toolMatrix
    tool_matrix_getScaledZeroCentredLog, function in toolMatrix
    tool_matrix_getScaledZeroCentredLogInv, function in toolMatrix
    tool_matrix_init, function in toolMatrix
    tool_matrix_invert, function in toolMatrix
    tool_matrix_productMatrix, function in toolMatrix
    tool_matrix_productVector, function in toolMatrix
    tool_matrix_reducePrimitiveVectors, function in toolMatrix
    tool_matrix_setIdentity, function in toolMatrix
    tool_matrix_sphericalToCartesian, function in toolMatrix
    tool_option_copy, function in toolOptions
    tool_option_free, function in toolOptions
    tool_option_getLabel, function in toolOptions
    tool_option_getName, function in toolOptions
    tool_option_getType, function in toolOptions
    tool_option_getValue, function in toolOptions
    tool_option_getValueAndLabel, function in toolOptions
    tool_option_new, function in toolOptions
    tool_physic_getSymbolFromZ, function in toolPhysic
    tool_physic_getUnitFromName, function in toolPhysic
    tool_physic_getUnitNames, function in toolPhysic
    tool_physic_getUnitValueInMeter, function in toolPhysic
    tool_physic_getZFromSymbol, function in toolPhysic
    TOOL_PI180, macro in VisuGlView
    tool_shade_appendList, function in toolShade
    tool_shade_channelToRGB, function in toolShade
    tool_shade_compare, function in toolShade
    tool_shade_copy, function in toolShade
    tool_shade_free, function in toolShade
    tool_shade_getColorMode, function in toolShade
    tool_shade_getLabel, function in toolShade
    tool_shade_getLinearCoeff, function in toolShade
    tool_shade_getList, function in toolShade
    tool_shade_getMode, function in toolShade
    tool_shade_new, function in toolShade
    tool_shade_newFromData, function in toolShade
    tool_shade_newFromSteps, function in toolShade
    tool_shade_newFromString, function in toolShade
    tool_shade_setColorMode, function in toolShade
    tool_shade_setLinearCoeff, function in toolShade
    tool_shade_valueToRGB, function in toolShade
    TOOL_XYZ_MASK_ALL, macro in toolMatrix
    TOOL_XYZ_MASK_X, macro in toolMatrix
    TOOL_XYZ_MASK_Y, macro in toolMatrix
    TOOL_XYZ_MASK_Z, macro in toolMatrix

    U

    VisuUiBoxFit, enum in gtk_fieldChooser
    VisuUiColorCombobox, struct in gtk_colorComboBoxWidget
    VisuUiColorCombobox::color-selected, object signal in gtk_colorComboBoxWidget
    VisuUiColorCombobox::color-value-changed, object signal in gtk_colorComboBoxWidget
    VisuUiColorCombobox::material-value-changed, object signal in gtk_colorComboBoxWidget
    VisuUiColorComboboxClass, struct in gtk_colorComboBoxWidget
    VisuUiCurveFrame, struct in gtk_curveWidget
    VisuUiCurveFrameClass, struct in gtk_curveWidget
    VisuUiCurveFrameStyle, enum in gtk_curveWidget
    VisuUiDirectoryType, enum in visu_gtk
    VisuUiDockWindow, struct in gtk_toolPanelWidget
    VisuUiDumpDialog, struct in gtk_dumpDialogWidget
    VisuUiDumpDialogClass, struct in gtk_dumpDialogWidget
    VisuUiElementCombobox, struct in gtk_elementComboBox
    VisuUiElementCombobox::element-selected, object signal in gtk_elementComboBox
    VisuUiElementComboboxClass, struct in gtk_elementComboBox
    VisuUiFieldChooser, struct in gtk_fieldChooser
    VisuUiFieldChooser::validate, object signal in gtk_fieldChooser
    VisuUiFieldChooserClass, struct in gtk_fieldChooser
    VisuUiFileFilter, struct in visu_gtk
    VisuUiGlWidget, struct in gtk_openGLWidget
    VisuUiGlWidgetClass, struct in gtk_openGLWidget
    VisuUiGlWidgetRedrawMethod, user_function in gtk_openGLWidget
    VisuUiInitWidgetFunc, user_function in visu_gtk
    VisuUiInteractiveActionId, enum in gtk_interactive
    VisuUiInteractiveBuild, user_function in gtk_interactive
    VisuUiInteractiveStartStop, user_function in gtk_interactive
    VisuUiLine, struct in gtk_lineObjectWidget
    VisuUiLine::color-changed, object signal in gtk_lineObjectWidget
    VisuUiLine::stipple-changed, object signal in gtk_lineObjectWidget
    VisuUiLine::use-changed, object signal in gtk_lineObjectWidget
    VisuUiLine::width-changed, object signal in gtk_lineObjectWidget
    VisuUiLineClass, struct in gtk_lineObjectWidget
    VisuUiMain, struct in gtk_main
    VisuUiMain::DataFocused, object signal in gtk_main
    VisuUiMainClass, struct in gtk_main
    VisuUiMain_private, typedef in gtk_main
    VisuUiNewWidgetFunc, user_function in visu_gtk
    VisuUiNumericalEntry, struct in gtk_numericalEntryWidget
    VisuUiNumericalEntry::value-changed, object signal in gtk_numericalEntryWidget
    VisuUiNumericalEntryClass, struct in gtk_numericalEntryWidget
    VisuUiOrientationChooser, struct in gtk_orientationChooser
    VisuUiOrientationChooser::values-changed, object signal in gtk_orientationChooser
    VisuUiOrientationChooserClass, struct in gtk_orientationChooser
    VisuUiOrientationChooserKind, enum in gtk_orientationChooser
    VisuUiPairsBuildWidgetsFunc, user_function in gtk_pairs
    VisuUiPairsInitFunc, user_function in gtk_pairs
    VisuUiPairsIter, struct in gtk_pairs
    VisuUiPairsSetValuesFunc, user_function in gtk_pairs
    VisuUiPairsToLabelFunc, user_function in gtk_pairs
    VisuUiPanel, struct in gtk_toolPanelWidget
    VisuUiPanel::page-entered, object signal in gtk_toolPanelWidget
    VisuUiPanelClass, struct in gtk_toolPanelWidget
    VisuUiPanelDestroyFunc, user_function in panelMethod
    VisuUiPanelElementsChangeFunc, user_function in panelElements
    VisuUiPanelPlanesColumnId, enum in panelPlanes
    VisuUiPreview, struct in visu_gtk
    VisuUiRenderingWindow, struct in gtk_renderingWindowWidget
    VisuUiRenderingWindow::export, object signal in gtk_renderingWindowWidget
    VisuUiRenderingWindow::load-next-file, object signal in gtk_renderingWindowWidget
    VisuUiRenderingWindow::load-prev-file, object signal in gtk_renderingWindowWidget
    VisuUiRenderingWindow::open, object signal in gtk_renderingWindowWidget
    VisuUiRenderingWindow::reload, object signal in gtk_renderingWindowWidget
    VisuUiRenderingWindow::search, object signal in gtk_renderingWindowWidget
    VisuUiRenderingWindow::show-action-dialog, object signal in gtk_renderingWindowWidget
    VisuUiRenderingWindow::show-main-panel, object signal in gtk_renderingWindowWidget
    VisuUiRenderingWindow::show-orientation-chooser, object signal in gtk_renderingWindowWidget
    VisuUiRenderingWindowClass, struct in gtk_renderingWindowWidget
    VisuUiSetFilesFunc, user_function in visu_gtk
    VisuUiShadeCombobox, struct in gtk_shadeComboBoxWidget
    VisuUiShadeCombobox::shade-selected, object signal in gtk_shadeComboBoxWidget
    VisuUiShadeComboboxClass, struct in gtk_shadeComboBoxWidget
    VisuUiStippleCombobox, struct in gtk_stippleComboBoxWidget
    VisuUiStippleCombobox::stipple-selected, object signal in gtk_stippleComboBoxWidget
    VisuUiStippleComboboxClass, struct in gtk_stippleComboBoxWidget
    VisuUiSurfacesFieldId, enum in panelSurfaces
    VisuUiValueIo, struct in gtk_valueIOWidget
    VisuUiValueIoCallback, user_function in gtk_valueIOWidget
    VisuUiValueIoClass, struct in gtk_valueIOWidget
    visu_ui_about_initBuild, function in gtk_about
    visu_ui_buildRenderingWindow, function in visu_gtk
    visu_ui_color_combobox_getPixbufFromColor, function in gtk_colorComboBoxWidget
    visu_ui_color_combobox_getRangeColor, function in gtk_colorComboBoxWidget
    visu_ui_color_combobox_getRangeMaterial, function in gtk_colorComboBoxWidget
    visu_ui_color_combobox_getRangeWidgets, function in gtk_colorComboBoxWidget
    visu_ui_color_combobox_getSelection, function in gtk_colorComboBoxWidget
    visu_ui_color_combobox_new, function in gtk_colorComboBoxWidget
    visu_ui_color_combobox_newWithRanges, function in gtk_colorComboBoxWidget
    visu_ui_color_combobox_setExpanded, function in gtk_colorComboBoxWidget
    visu_ui_color_combobox_setPrintValues, function in gtk_colorComboBoxWidget
    visu_ui_color_combobox_setRangeColor, function in gtk_colorComboBoxWidget
    visu_ui_color_combobox_setRangeMaterial, function in gtk_colorComboBoxWidget
    visu_ui_color_combobox_setSelection, function in gtk_colorComboBoxWidget
    visu_ui_createFilter, function in visu_gtk
    visu_ui_createInterface, function in visu_gtk
    visu_ui_createPixbuf, function in visu_gtk
    visu_ui_curve_frame_addData, function in gtk_curveWidget
    visu_ui_curve_frame_draw, function in gtk_curveWidget
    visu_ui_curve_frame_getHighlightRange, function in gtk_curveWidget
    visu_ui_curve_frame_getIntegralInRange, function in gtk_curveWidget
    visu_ui_curve_frame_getMeanInRange, function in gtk_curveWidget
    visu_ui_curve_frame_getSpan, function in gtk_curveWidget
    visu_ui_curve_frame_hasData, function in gtk_curveWidget
    visu_ui_curve_frame_new, function in gtk_curveWidget
    visu_ui_curve_frame_setData, function in gtk_curveWidget
    visu_ui_curve_frame_setFilter, function in gtk_curveWidget
    visu_ui_curve_frame_setHighlightRange, function in gtk_curveWidget
    visu_ui_curve_frame_setNNodes, function in gtk_curveWidget
    visu_ui_curve_frame_setSpan, function in gtk_curveWidget
    visu_ui_curve_frame_setStyle, function in gtk_curveWidget
    visu_ui_dock_window_getCharacteristics, function in gtk_toolPanelWidget
    visu_ui_dock_window_getContainer, function in gtk_toolPanelWidget
    visu_ui_dock_window_getNotebook, function in gtk_toolPanelWidget
    visu_ui_dock_window_getWindow, function in gtk_toolPanelWidget
    visu_ui_dock_window_setPosition, function in gtk_toolPanelWidget
    visu_ui_dock_window_setSize, function in gtk_toolPanelWidget
    visu_ui_dock_window_setVisibility, function in gtk_toolPanelWidget
    visu_ui_dump_dialog_getCancelButton, function in gtk_dumpDialogWidget
    visu_ui_dump_dialog_getFilename, function in gtk_dumpDialogWidget
    visu_ui_dump_dialog_getHeight, function in gtk_dumpDialogWidget
    visu_ui_dump_dialog_getProgressBar, function in gtk_dumpDialogWidget
    visu_ui_dump_dialog_getType, function in gtk_dumpDialogWidget
    visu_ui_dump_dialog_getWidth, function in gtk_dumpDialogWidget
    visu_ui_dump_dialog_new, function in gtk_dumpDialogWidget
    visu_ui_dump_dialog_start, function in gtk_dumpDialogWidget
    visu_ui_dump_dialog_stop, function in gtk_dumpDialogWidget
    visu_ui_element_combobox_getSelection, function in gtk_elementComboBox
    visu_ui_element_combobox_new, function in gtk_elementComboBox
    visu_ui_element_combobox_setSelection, function in gtk_elementComboBox
    visu_ui_element_combobox_setUnphysicalStatus, function in gtk_elementComboBox
    visu_ui_field_chooser_getFileFormat, function in gtk_fieldChooser
    visu_ui_field_chooser_getFit, function in gtk_fieldChooser
    visu_ui_field_chooser_new, function in gtk_fieldChooser
    visu_ui_field_chooser_setOptions, function in gtk_fieldChooser
    visu_ui_getFileFromDefaultFileChooser, function in visu_gtk
    visu_ui_getLastOpenDirectory, function in visu_gtk
    visu_ui_getPanel, function in visu_gtk
    visu_ui_getRenderingSpecificOpen, function in visu_gtk
    visu_ui_getRenderWidget, function in visu_gtk
    visu_ui_getRenderWindow, function in visu_gtk
    visu_ui_getSelectedDirectory, function in visu_gtk
    visu_ui_gl_widget_class_getCurrentContext, function in gtk_openGLWidget
    visu_ui_gl_widget_getPixmapData, function in gtk_openGLWidget
    visu_ui_gl_widget_new, function in gtk_openGLWidget
    visu_ui_gl_widget_redraw, function in gtk_openGLWidget
    visu_ui_gl_widget_setCurrent, function in gtk_openGLWidget
    visu_ui_gl_widget_setRedraw, function in gtk_openGLWidget
    visu_ui_gl_widget_swapBuffers, function in gtk_openGLWidget
    visu_ui_interactive_addAction, function in gtk_interactive
    visu_ui_interactive_init, function in gtk_interactive
    visu_ui_interactive_initBuild, function in gtk_interactive
    visu_ui_interactive_move_initBuild, function in gtk_move
    visu_ui_interactive_move_start, function in gtk_move
    visu_ui_interactive_move_stop, function in gtk_move
    visu_ui_interactive_pick_exportXMLFile, function in gtk_pick
    visu_ui_interactive_pick_getNodeSelection, function in gtk_pick
    visu_ui_interactive_pick_init, function in gtk_pick
    visu_ui_interactive_pick_initBuild, function in gtk_pick
    visu_ui_interactive_pick_parseXMLFile, function in gtk_pick
    visu_ui_interactive_pick_start, function in gtk_pick
    visu_ui_interactive_pick_stop, function in gtk_pick
    visu_ui_interactive_setMessage, function in gtk_interactive
    visu_ui_interactive_start, function in gtk_interactive
    visu_ui_interactive_toggle, function in gtk_interactive
    visu_ui_interactive_unsetMessage, function in gtk_interactive
    visu_ui_line_getOptionBox, function in gtk_lineObjectWidget
    visu_ui_line_new, function in gtk_lineObjectWidget
    visu_ui_line_setColor, function in gtk_lineObjectWidget
    visu_ui_line_setStipple, function in gtk_lineObjectWidget
    visu_ui_line_setUsed, function in gtk_lineObjectWidget
    visu_ui_line_setWidth, function in gtk_lineObjectWidget
    visu_ui_mainCreate, function in visu_gtk
    visu_ui_main_buildInteractiveDialog, function in gtk_main
    visu_ui_main_class_createMain, function in gtk_main
    visu_ui_main_class_getCurrentPanel, function in gtk_main
    visu_ui_main_class_getDefaultRendering, function in gtk_main
    visu_ui_main_class_getRememberPosition, function in gtk_main
    visu_ui_main_class_setCurrentPanel, function in gtk_main
    visu_ui_main_class_setRememberPosition, function in gtk_main
    visu_ui_main_initPanels, function in gtk_main
    visu_ui_main_new, function in gtk_main
    visu_ui_main_quit, function in gtk_main
    visu_ui_main_runCommandLine, function in gtk_main
    visu_ui_numerical_entry_getValue, function in gtk_numericalEntryWidget
    visu_ui_numerical_entry_new, function in gtk_numericalEntryWidget
    visu_ui_numerical_entry_setValue, function in gtk_numericalEntryWidget
    visu_ui_orientation_chooser_getAnglesValues, function in gtk_orientationChooser
    visu_ui_orientation_chooser_getBoxValues, function in gtk_orientationChooser
    visu_ui_orientation_chooser_getOrthoValues, function in gtk_orientationChooser
    visu_ui_orientation_chooser_new, function in gtk_orientationChooser
    visu_ui_orientation_chooser_setAnglesValues, function in gtk_orientationChooser
    visu_ui_orientation_chooser_setBoxValues, function in gtk_orientationChooser
    visu_ui_orientation_chooser_setOrthoValues, function in gtk_orientationChooser
    visu_ui_pairs_cylinder_getValues, function in gtk_cylinder
    visu_ui_pairs_cylinder_init, function in gtk_cylinder
    visu_ui_pairs_cylinder_initBuild, function in gtk_cylinder
    visu_ui_pairs_cylinder_setValues, function in gtk_cylinder
    visu_ui_pairs_init, function in gtk_pairs
    visu_ui_pairs_initBuild, function in gtk_pairs
    visu_ui_pairs_iter_empty, function in gtk_pairs
    visu_ui_pairs_iter_nextSelected, function in gtk_pairs
    visu_ui_pairs_iter_startSelected, function in gtk_pairs
    visu_ui_pairs_newIter, function in gtk_pairs
    visu_ui_pairs_select, function in gtk_pairs
    visu_ui_pairs_setSpecificLabels, function in gtk_pairs
    visu_ui_pairs_show, function in gtk_pairs
    visu_ui_pairs_update, function in gtk_pairs
    visu_ui_pairs_wire_getValues, function in gtk_wire
    visu_ui_pairs_wire_init, function in gtk_wire
    visu_ui_pairs_wire_initBuild, function in gtk_wire
    visu_ui_pairs_wire_setValues, function in gtk_wire
    visu_ui_panel_attach, function in gtk_toolPanelWidget
    visu_ui_panel_axes_init, function in panelAxes
    visu_ui_panel_axes_setAxesExtension, function in panelAxes
    visu_ui_panel_bg_init, function in panelFogBgColor
    visu_ui_panel_bg_setImage, function in panelFogBgColor
    visu_ui_panel_browser_getCurrentSelected, function in panelBrowser
    visu_ui_panel_browser_getNextSelected, function in panelBrowser
    visu_ui_panel_browser_init, function in panelBrowser
    VISU_UI_PANEL_BROWSER_NEXT, macro in panelBrowser
    VISU_UI_PANEL_BROWSER_PREVIOUS, macro in panelBrowser
    visu_ui_panel_browser_setCurrentDirectories, function in panelBrowser
    visu_ui_panel_browser_setCurrentDirectory, function in panelBrowser
    visu_ui_panel_browser_setMessage, function in panelBrowser
    visu_ui_panel_class_getAllPanels, function in gtk_toolPanelWidget
    visu_ui_panel_class_getAllWindows, function in gtk_toolPanelWidget
    visu_ui_panel_class_getCommandPanel, function in gtk_toolPanelWidget
    visu_ui_panel_class_getDockById, function in gtk_toolPanelWidget
    visu_ui_panel_class_getPanelById, function in gtk_toolPanelWidget
    visu_ui_panel_class_setCurrent, function in gtk_toolPanelWidget
    visu_ui_panel_class_setHeaderVisibility, function in gtk_toolPanelWidget
    visu_ui_panel_colorization_init, function in panelDataFile
    visu_ui_panel_colorization_load, function in panelDataFile
    visu_ui_panel_colorization_setManualRange, function in panelDataFile
    visu_ui_panel_colorization_setPresetShade, function in panelDataFile
    visu_ui_panel_colorization_setRangeMode, function in panelDataFile
    visu_ui_panel_colorization_setUsed, function in panelDataFile
    visu_ui_panel_colorization_update, function in panelDataFile
    visu_ui_panel_config_getArea, function in panelConfig
    visu_ui_panel_config_init, function in panelConfig
    visu_ui_panel_config_setAutomaticRefresh, function in panelConfig
    visu_ui_panel_config_setRefreshPeriod, function in panelConfig
    visu_ui_panel_config_setTabView, function in panelConfig
    visu_ui_panel_detach, function in gtk_toolPanelWidget
    VISU_UI_PANEL_ELEMENTS, macro in panelElements
    visu_ui_panel_elements_atomic_init, function in gtkAtomic
    visu_ui_panel_elements_atomic_initBuild, function in gtkAtomic
    visu_ui_panel_elements_atomic_initMethod, function in gtkAtomic
    visu_ui_panel_elements_atomic_initOpen, function in gtkAtomic
    visu_ui_panel_elements_atomic_onChange, function in gtkAtomic
    visu_ui_panel_elements_getSelected, function in panelElements
    visu_ui_panel_elements_getStatic, function in panelElements
    visu_ui_panel_elements_init, function in panelElements
    visu_ui_panel_elements_setMethod, function in panelElements
    visu_ui_panel_elements_spin_init, function in gtkSpin
    visu_ui_panel_elements_spin_initMethod, function in gtkSpin
    visu_ui_panel_elements_spin_initOpen, function in gtkSpin
    visu_ui_panel_geometry_getPaths, function in panelGeometry
    visu_ui_panel_geometry_init, function in panelGeometry
    visu_ui_panel_geometry_runTests, function in panelGeometry
    visu_ui_panel_getContainer, function in gtk_toolPanelWidget
    visu_ui_panel_getContainerId, function in gtk_toolPanelWidget
    visu_ui_panel_getContainerWindow, function in gtk_toolPanelWidget
    visu_ui_panel_getData, function in gtk_toolPanelWidget
    visu_ui_panel_getFocused, function in gtk_toolPanelWidget
    visu_ui_panel_getHeaderWidget, function in gtk_toolPanelWidget
    visu_ui_panel_getId, function in gtk_toolPanelWidget
    visu_ui_panel_getLabel, function in gtk_toolPanelWidget
    visu_ui_panel_getView, function in gtk_toolPanelWidget
    visu_ui_panel_getVisible, function in gtk_toolPanelWidget
    visu_ui_panel_gl_init, function in panelOpenGL
    visu_ui_panel_map_init, function in panelMap
    visu_ui_panel_map_setData, function in panelMap
    visu_ui_panel_map_setIsolinesColor, function in panelMap
    visu_ui_panel_map_setMinMax, function in panelMap
    visu_ui_panel_map_setNIsolines, function in panelMap
    visu_ui_panel_map_setPrecision, function in panelMap
    visu_ui_panel_map_setScale, function in panelMap
    visu_ui_panel_map_update, function in panelMap
    visu_ui_panel_method_init, function in panelMethod
    visu_ui_panel_method_set, function in panelMethod
    visu_ui_panel_new, function in gtk_toolPanelWidget
    visu_ui_panel_newWithIconFromPath, function in gtk_toolPanelWidget
    visu_ui_panel_newWithIconFromStock, function in gtk_toolPanelWidget
    visu_ui_panel_planes_add, function in panelPlanes
    visu_ui_panel_planes_applyHidingScheme, function in panelPlanes
    visu_ui_panel_planes_getAll, function in panelPlanes
    visu_ui_panel_planes_getList, function in panelPlanes
    visu_ui_panel_planes_init, function in panelPlanes
    visu_ui_panel_planes_load, function in panelPlanes
    visu_ui_panel_planes_setRendered, function in panelPlanes
    visu_ui_panel_planes_setUsed, function in panelPlanes
    visu_ui_panel_setContainer, function in gtk_toolPanelWidget
    visu_ui_panel_setContainerId, function in gtk_toolPanelWidget
    visu_ui_panel_setDockable, function in gtk_toolPanelWidget
    visu_ui_panel_surfaces_add, function in panelSurfaces
    visu_ui_panel_surfaces_addField, function in panelSurfaces
    visu_ui_panel_surfaces_addSurfaces, function in panelSurfaces
    visu_ui_panel_surfaces_compute, function in panelSurfaces
    visu_ui_panel_surfaces_computeAuto, function in panelSurfaces
    visu_ui_panel_surfaces_editProperties, function in panelSurfaces
    visu_ui_panel_surfaces_exportXMLFile, function in panelSurfaces
    visu_ui_panel_surfaces_generateValues, function in panelSurfaces
    visu_ui_panel_surfaces_getFields, function in panelSurfaces
    visu_ui_panel_surfaces_hide, function in panelSurfaces
    visu_ui_panel_surfaces_init, function in panelSurfaces
    visu_ui_panel_surfaces_loadFile, function in panelSurfaces
    visu_ui_panel_surfaces_parseXMLFile, function in panelSurfaces
    visu_ui_panel_surfaces_setUsed, function in panelSurfaces
    visu_ui_panel_surfaces_showAll, function in panelSurfaces
    visu_ui_panel_surfaces_tools_convertWidget, function in panelSurfacesTools
    visu_ui_panel_surfaces_tools_fileWidget, function in panelSurfacesTools
    visu_ui_panel_surfaces_tools_init, function in panelSurfacesTools
    visu_ui_panel_surfaces_updateAtIter, function in panelSurfaces
    visu_ui_panel_vibration_init, function in panelVibration
    visu_ui_preview_add, function in visu_gtk
    visu_ui_preview_update, function in visu_gtk
    visu_ui_raiseWarning, function in visu_gtk
    visu_ui_raiseWarningLong, function in visu_gtk
    visu_ui_rendering_window_class_getAutoAdjust, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_class_getDisplayCoordinatesInReduce, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_class_getInteractive, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_class_setAutoAdjust, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_class_setDisplayCoordinatesInReduce, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_dump, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_getAccelGroup, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_getData, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_getGlView, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_getMarks, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_loadFile, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_new, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_open, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_popInteractive, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_popMessage, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_pushInteractive, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_pushMessage, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_reload, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_setCurrent, function in gtk_renderingWindowWidget
    visu_ui_rendering_window_setData, function in gtk_renderingWindowWidget
    visu_ui_runCommandLine, function in visu_gtk
    visu_ui_save_initBuild, function in gtk_save
    visu_ui_setLastOpenDirectory, function in visu_gtk
    visu_ui_setRenderingSpecificMethod, function in visu_gtk
    visu_ui_setRenderWidget, function in visu_gtk
    visu_ui_setWindowTitle, function in visu_gtk
    visu_ui_shade_combobox_buildStamp, function in gtk_shadeComboBoxWidget
    visu_ui_shade_combobox_getSelection, function in gtk_shadeComboBoxWidget
    visu_ui_shade_combobox_getStamp, function in gtk_shadeComboBoxWidget
    visu_ui_shade_combobox_new, function in gtk_shadeComboBoxWidget
    visu_ui_shade_combobox_setSelectionByShade, function in gtk_shadeComboBoxWidget
    visu_ui_stipple_combobox_add, function in gtk_stippleComboBoxWidget
    visu_ui_stipple_combobox_class_buildStamp, function in gtk_stippleComboBoxWidget
    visu_ui_stipple_combobox_getSelection, function in gtk_stippleComboBoxWidget
    visu_ui_stipple_combobox_getStamp, function in gtk_stippleComboBoxWidget
    visu_ui_stipple_combobox_new, function in gtk_stippleComboBoxWidget
    visu_ui_stipple_combobox_setSelection, function in gtk_stippleComboBoxWidget
    VISU_UI_SURFACE_NAME_CHOOSE, macro in panelSurfaces
    VISU_UI_SURFACE_NAME_STR, macro in panelSurfaces
    VISU_UI_TYPE_DOCK_WINDOW, macro in gtk_toolPanelWidget
    visu_ui_value_io_connectOnOpen, function in gtk_valueIOWidget
    visu_ui_value_io_connectOnSave, function in gtk_valueIOWidget
    visu_ui_value_io_getFilename, function in gtk_valueIOWidget
    visu_ui_value_io_new, function in gtk_valueIOWidget
    visu_ui_value_io_setFilename, function in gtk_valueIOWidget
    visu_ui_value_io_setSensitiveOpen, function in gtk_valueIOWidget
    visu_ui_value_io_setSensitiveSave, function in gtk_valueIOWidget
    visu_ui_wait, function in visu_gtk

    V

    VISU_VERSION, macro in visu_basic
    visu_vibration_getCharacteristic, function in vibration
    visu_vibration_getCurrentMode, function in vibration
    visu_vibration_getNPhonons, function in vibration
    VISU_VIBRATION_ID, macro in vibration
    visu_vibration_init, function in vibration
    visu_vibration_isSet, function in vibration
    visu_vibration_play, function in vibration
    visu_vibration_resetPosition, function in vibration
    visu_vibration_setAmplitude, function in vibration
    visu_vibration_setCharacteristic, function in vibration
    visu_vibration_setCurrentMode, function in vibration
    visu_vibration_setDisplacements, function in vibration
    visu_vibration_setUserFrequency, function in vibration
    visu_vibration_setZeroTime, function in vibration
    visu_vibration_stop, function in vibration
    V_SIM_DATA_DIR, macro in visu_basic
    V_SIM_ICONS_DIR, macro in visu_basic
    V_SIM_LEGAL_DIR, macro in visu_basic
    V_SIM_LOCALE_DIR, macro in visu_basic
    V_SIM_LOCAL_CONF_DIR, macro in visu_basic
    V_SIM_OLD_LOCAL_CONF_DIR, macro in visu_basic
    V_SIM_PIXMAPS_DIR, macro in visu_basic
    V_SIM_PLUGINS_DIR, macro in visu_basic

    W

    VISU_WEB_SITE, macro in visu_basic

    S

    visu_surfaces_createFromPotentialFile, function in pot2surf
    v_sim-3.7.0/Documentation/reference/html/axesTransform.png0000644000353400050620000000576112216331354020647 00000000000000PNG  IHDRsBIT|dtEXtSoftwarewww.inkscape.org< IDATxy\E?B#B8*$@D(b<,JB,@r$Ja @ H *A`J?7Y̛jkwfoݯG6eGҷ'olYHh2pWE c*VrQz ipS`. @``ER&ZF Se(3VIH:hYJIӀǀi;v&+Q9)}}rZD6$hs9IڜmNR6')@I $hs9IڜmNR6')@I $hs9I2@xIoޖ&ty}5P'O'Ia2\ V^ۥ͠خ"I cFV'Ȇ2;EYS|=Gqn'p 06Z$鼑?N-m<)@H4XLAof[~H`۳l?_<ޗM!"BGlI#?kk,Q8 9o"dv0K {V'Iv:ۏ%7~Y)A^!d6m/h`W/rsyq1 K*mll |-7CCRjX i,0xUjK%E BREQWߐt8h* ~\7dg9m-L%ISd_ 0x`"Y:AحlWP} Y:8s%*J,@9m ')@ D9U_;@)Gbd9= >NvIU;I~v'U}$ P%6I>I#ߵKVl$ PI;'~50غqReG i[@J-"3u_{GؾZBi)`0x; I{Sm~'xm Q#W?[I ?AMO[U%*5GЌ]o ^u#Z].ި!`[2w5Vi8y`1ЙIӟ{҆M{ lk;cg%޲&5VXl ,u=P3U j# p5VV{Im(==]( C~5Gl?LH?$۬4YR)[Z"cF$iXS@ `T0 2?6f"i;J`AL^lw;,~ov+u9 >wW`Ϝb3_W]? 떵1a,`gSáE-@=%H@$l RL`HD.['O&‘MKXXLjo*X)94g$m\YGy&Ā">V{m %p !U*^ت1*nGz 48 X|y0X')ӺU2 "a+VdHjjbmW Bm@ߓ9ZI:_}2$,F|&7oB+ICm8, n^@Xos=_ )29.򽁧Kg$ f[o[1 yEfx"IO/.t0G,ƒE0 ت{$F+#/H:a&rn\I5TiֈՄ%Ӂl*]zp`tn$!+g0?% ? 6^W p`]ہ%¦K;yN2BPҼPj@҇mV@œnSb8`kDy6Da4D=ڍ>\sk; M'veN} EӔ?G i&񻁩 hD4Y]eф!gTBW;)Ҽ]>D_h* L鯊uB]?^w?}j4 :w.ŭ+ikn2a^ 4D΅eEǂPc_gͽqH ;_rr ¡R^# =na p!|^Q4u UIp%kmL+ZlX )@҉ۏ"@$~k;G_`U s,o=$./Mrh ^k5pscIXDQ=2AÎwbS&74Pgy7!|D&94) :^fؾ5&x㽴IS@'ѹ3=zIGl"Puu"iΝ3 MbOڞ[,0 ΢svJEL?Uҩ1h#E&(@tKpPB-DMQ@mz2Wt.2Tˮ; Li)@لLM'1)t&a!ɡ}%S d`a;>G S7)@6c)p8LLշ n P`}rREO;wS(8+r rjIL Fδ}uIL@BK#N"oVܙMUmDeRX~}\:wڑG8yw;wڍ,tE-Eg$Co 0PRxBKMK aΉGgPLq~ù(<= Main capabilities of V_Sim

    Main capabilities of V_Sim

    dataFile — Adds a possibility to colorize nodes depending on data read in an input file.
    plane — Adds capabilities to draw and handle planes.
    VisuScalarField — Gives capabilities to load a scalar field.
    surfaces — Supports loading of .surf files and drawing of surfaces through OpenGL.
    geometry — different routines to do high level geometry studies on a box or a set of boxes.
    vibration — Add a support to animate the node positions with a phonon frequency.
    map — Describe how to handle and draw coloured map on a plane from a density field.
    dataNode — Extends capabilities of node properties.
    extraNode — add further characteristics to the nodes.
    isoline — handle the drawing and the computation of isolines.
    surfaces_points — Define a structure to store a set of triangles defining a surface.
    surfaces_resources — Define the rendering parameters of a surface.
    pot2surf — Creates surfaces from scalar fields.

    Main capabilities.

    v_sim-3.7.0/Documentation/reference/html/ch02.html0000644000353400050620000000653112216331356016725 00000000000000 Methods to read input files and draw nodes

    Methods to read input files and draw nodes

    VisuRendering — Methods to create and add new rendering methods.
    renderingAtomic — A rendering method to draw atoms positioned in a box.
    renderingAtomic_d3 — Method to load d3 position file.
    renderingAtomic_ascii — Method to load ascii position file.
    atomic_xyz — Method to load xyz position file.
    atomic_yaml — Method to load YAML position file.
    renderingSpin — A module able to represent atoms by their position and spin.

    Main purpose of V_Sim is to render some file describing positions and other informations n a graphical way. This is achieved implementing VisuRendering. Currently two methods exist, one draw spheres (or other geometric forms such as cubes) on defined positions. The other is a more specialised version of the former, adding a direction information on each position. This method is called SpinRendering and is usefull to render spin configurations.

    v_sim-3.7.0/Documentation/reference/html/ch03.html0000644000353400050620000001174612216331356016732 00000000000000 OpenGL drawing methods

    OpenGL drawing methods

    VisuGlExt — All objects drawn by V_Sim are defined in by a VisuGlExt object
    VisuGlExtNodes — Defines methods to draw a set of nodes.
    VisuGlExtPairs — Draw links between nodes.
    VisuGlExtFrame — Draw a frame with the representation of a color frame.
    VisuGlExtBoxLegend — Draw a bounding box around nodes.
    VisuGlExtAxes — Defines methods to draw axes.
    VisuGlExtLegend — Draw a frame with the representation of each atom species, its name and the number of elements.
    VisuGlExtShade — Draw a frame with the representation of a color shade.
    VisuGlExtNodeVectors — Draw arrows at each node to represent forces, displacements, vibrations...
    VisuGlExtForces — Draw arrows at each node to represent forces.
    VisuGlExtPlanes — Draw a list of VisuPlane.
    VisuGlExtSurfaces — Defines methods to draw surfaces.
    VisuGlExtMaps — Defines methods to draw maps.
    VisuGlExtInfos — give the capability to draw some information near each node.
    VisuGlExtScale — Draw an arrow with a label.
    VisuGlExtBg — Handle the background colour and the fog.
    marks — Draw features on nodes, like measurement marks or highlights.
    VisuGlExtPaths — Defines methods to draw paths.

    All rendering is done via objects inherited from VisuExtension.

    v_sim-3.7.0/Documentation/reference/html/ch04.html0000644000353400050620000000473312216331356016731 00000000000000 Dealing with pairs

    Dealing with pairs

    VisuPairLink — V_Sim can draw link between nodes. This part defines a pair object and interface to draw pairs.
    cylinder — Gives methods to draw cylinders as OpenGl objects pairing two elements.
    wire — Gives methods to draw lines as OpenGl objects pairing two elements.

    Drawing pairs is done via external modules. For the moment, two modules exist to draw pairs : one draws flat lines between elements (colour and width are user-defined) and the other use cylinders to represents pairs (radius and colour also user-defined).

    v_sim-3.7.0/Documentation/reference/html/ch05.html0000644000353400050620000000620012216331356016721 00000000000000 Methods to export to other formats

    Methods to export to other formats

    visu_dump — Some resources to add the ability to export the rendered data to an other format (usually image format).
    dumpThroughGdkPixbuf — add an export capability into PNG and JPG files.
    dumpToAscii — add an export capability of current positions.
    dumpToTiff — add an export capability into TIFF files.
    dumpToXyz — add an export capability of current positions.
    dumpToPsAndPdf — add an export capability into PS and PDF files (encapsulating bitmaps).
    dumpToSVG — add an export capability into SVG files.
    dumpToABINIT — add an export capability of current positions in ABINIT format.
    v_sim-3.7.0/Documentation/reference/html/ch06.html0000644000353400050620000000630212216331356016725 00000000000000 Generic tools

    Generic tools

    toolOptions — A convienent wrapper around GHashTable that can support types.
    toolMatrix — Defines basic handlings on matrix.
    toolConfigFile — Generic read methods of the configuration files are defined here.
    toolFortran — Introduces routines to read the binary Fortran data format.
    toolPhysic — introduce physical values for the chemical species.
    toolColor — Simple handling and storage of RGBA colours.
    toolShade — ToolShades are color gradients.
    ToolFileFormat — Describes file format objects (name patterns, description, properties...).

    There are differents tools that can be shared by every modules in V_Sim, such as file support, list of colors, common shades...

    v_sim-3.7.0/Documentation/reference/html/ch07.html0000644000353400050620000000537012216331356016732 00000000000000 OpenGL tools

    OpenGL tools

    opengl — This part is responsible for the pseudo3D rendering through OpenGl and gives methods to adapt the view.
    renderingMode — Controls the way OpenGL renders objects.
    light — Controls the use of lights in the rendering window.
    text — Enables capabilities to write some text on rendering screen.
    objectList — Gives storage for ids used by OpenGL lists and provides primitive routine for common drawing operations (distances, torus...).

    These little utilities are dealing with OpenGL. They are not essential to V_Sim but can add some nice features that can be shared between different modules.

    v_sim-3.7.0/Documentation/reference/html/ch08.html0000644000353400050620000000611212216331356016726 00000000000000 Miscellaneous

    Miscellaneous

    VisuBoxed — Defines a common interface for objects with a VisuBox.
    visu_configFile — Defines methods to access (read/write) to config files and to create different entries.
    visu_basic — Main functions of V_Sim (except graphical ones).
    visu_plugins — Introduces the basic handling of plug-ins.
    visu_commandLine — All methods needed to parse options from the command line.
    visu_actionInterface — Interface for defining actions and events.
    visu_openGL — Define the OS dependent routines related to OpenGL.

    Other methods, including OS dependancy and rendering window backend.

    v_sim-3.7.0/Documentation/reference/html/ch09.html0000644000353400050620000000663112216331356016735 00000000000000 Main interface

    Main interface

    visu_gtk — Basic GUI routines, for preview, standard dialogs...
    gtk_main — The command panel definition.
    gtk_interactive — The interactive dialog.
    gtk_pick — The pick and measurement tab in the interactive dialog.
    gtk_move — The move tab in the interactive dialog.
    gtk_about — The about dialog with a readme, the copyright, the author list, the plug-in list and the version notes.
    gtk_save — The load/save dialog for resources and parameters.
    gtk_pairs — The pairs dialog.
    gtk_openGLWidget — defines an OpenGL capable GtkWidget.
    gtk_renderingWindowWidget — Defines a complex widget used to render files and print information.
    v_sim-3.7.0/Documentation/reference/html/ch10.html0000644000353400050620000001157612216331356016731 00000000000000 V_Sim specific widgets

    V_Sim specific widgets

    gtk_dumpDialogWidget — Defines a widget to export into different file formats.
    gtk_toolPanelWidget — Defines a widget that hold a set of V_Sim panel.
    gtk_numericalEntryWidget — Defines a widget to enter numerical values without any boundary or precision constrains.
    gtk_valueIOWidget — Defines a specialised GtkHBox with three button to open, save and save as XML value files.
    gtk_colorComboBoxWidget — Defines a specialised GtkComboBox to choose stored colours.
    gtk_stippleComboBoxWidget — Defines a specialised GtkComboBox to choose patterns for lines.
    gtk_orientationChooser — Defines a dialog widget to choose the camera position.
    gtk_shadeComboBoxWidget — Defines a specialised GtkComboBox to choose pre-built shades.
    gtk_lineObjectWidget — Defines a specialised GtkBox to choose all characteristic of lines.
    gtk_elementComboBox — Defines a specialised GtkComboBox to choose VisuElement.
    gtk_curveWidget — A specialised curve widget to draw distance distribution for pairs.
    gtk_fieldChooser — Defines a widget to choose a scalar field or an isosurface.
    v_sim-3.7.0/Documentation/reference/html/ch11.html0000644000353400050620000001232712216331356016725 00000000000000 Panel add-ons

    Panel add-ons

    panelSurfaces — Gtk interface to load isosurfaces.
    panelElements — The tab where VisuElement characteristics can be tuned.
    panelMethod — The tab where drawing method is chosen (atomic or spin).
    panelPlanes — The tab where planes are defined.
    panelBrowser — A tab to view a list of files and quickly change from one to another.
    panelVibration — The tab where phonons are loaded and listed.
    panelDataFile — The tab where to configure the action of an external data file on colourisation of nodes.
    panelMap — The widget to create coloured map.
    panelFogBgColor — The widget to tune the background and the fog.
    panelGeometry — This tab gathers the geometry operation on a VisuData, like periodic translation, physical units, ...
    panelOpenGL — The tab where OpenGL options like lights or quality are setup.
    panelSurfacesTools — Gtk interface to manage isosurfaces.
    panelAxes — The tab where axes, box, scale and legend are setup.
    panelConfig — The tab where miscellaneous options are setup.
    gtkAtomic — The gtk interface elements that are specific to the atomic rendering method.
    gtkSpin — The gtk interface elements that can interfere with renderingSpin parameters.
    gtk_wire — The additional widgets displayed in the pair dialog to handle wire pairs.
    gtk_cylinder — The additional widgets displayed in the pair dialog to handle cylinder pairs.
    v_sim-3.7.0/Documentation/reference/html/core.html0000644000353400050620000004231412216331356017120 00000000000000 Part I. Core

    Part I. Core

    This is the program itself without the interface. Basically V_Sim allows the user to see in a pseudo 3D representation a list of elements known by their positions in space, all contained in a box. And it gives tools to rotate, zoom and retrieve informations on positions, angles and distances. The program is supposed to be modular and the programer can add new functions "easily".

    There are three sections. The first section deals with all the main functions to handle with this modularity, with the 3D drawing... The second section gathers all the extensions that have been added to improve V_Sim in the rendering area. The third section deals with the different possibilities that exist for the user to render different kind of elements.

    Table of Contents

    VisuObject — A general object to store the signals.
    visu_elements — defines methods to create and acccess to VisuElement.
    VisuNodeArray — Defines the elementary structure to store informations about an element in a box.
    VisuData — Give methods to store and manage data from input file(s).
    VisuBox — Defines a bounding box.
    VisuGlView — Defines all necessary informations for the rendering of a view.
    interactive — Gives tools to interact with the rendered area.
    Main capabilities of V_Sim
    dataFile — Adds a possibility to colorize nodes depending on data read in an input file.
    plane — Adds capabilities to draw and handle planes.
    VisuScalarField — Gives capabilities to load a scalar field.
    surfaces — Supports loading of .surf files and drawing of surfaces through OpenGL.
    geometry — different routines to do high level geometry studies on a box or a set of boxes.
    vibration — Add a support to animate the node positions with a phonon frequency.
    map — Describe how to handle and draw coloured map on a plane from a density field.
    dataNode — Extends capabilities of node properties.
    extraNode — add further characteristics to the nodes.
    isoline — handle the drawing and the computation of isolines.
    surfaces_points — Define a structure to store a set of triangles defining a surface.
    surfaces_resources — Define the rendering parameters of a surface.
    pot2surf — Creates surfaces from scalar fields.
    Methods to read input files and draw nodes
    VisuRendering — Methods to create and add new rendering methods.
    renderingAtomic — A rendering method to draw atoms positioned in a box.
    renderingAtomic_d3 — Method to load d3 position file.
    renderingAtomic_ascii — Method to load ascii position file.
    atomic_xyz — Method to load xyz position file.
    atomic_yaml — Method to load YAML position file.
    renderingSpin — A module able to represent atoms by their position and spin.
    OpenGL drawing methods
    VisuGlExt — All objects drawn by V_Sim are defined in by a VisuGlExt object
    VisuGlExtNodes — Defines methods to draw a set of nodes.
    VisuGlExtPairs — Draw links between nodes.
    VisuGlExtFrame — Draw a frame with the representation of a color frame.
    VisuGlExtBoxLegend — Draw a bounding box around nodes.
    VisuGlExtAxes — Defines methods to draw axes.
    VisuGlExtLegend — Draw a frame with the representation of each atom species, its name and the number of elements.
    VisuGlExtShade — Draw a frame with the representation of a color shade.
    VisuGlExtNodeVectors — Draw arrows at each node to represent forces, displacements, vibrations...
    VisuGlExtForces — Draw arrows at each node to represent forces.
    VisuGlExtPlanes — Draw a list of VisuPlane.
    VisuGlExtSurfaces — Defines methods to draw surfaces.
    VisuGlExtMaps — Defines methods to draw maps.
    VisuGlExtInfos — give the capability to draw some information near each node.
    VisuGlExtScale — Draw an arrow with a label.
    VisuGlExtBg — Handle the background colour and the fog.
    marks — Draw features on nodes, like measurement marks or highlights.
    VisuGlExtPaths — Defines methods to draw paths.
    Dealing with pairs
    VisuPairLink — V_Sim can draw link between nodes. This part defines a pair object and interface to draw pairs.
    cylinder — Gives methods to draw cylinders as OpenGl objects pairing two elements.
    wire — Gives methods to draw lines as OpenGl objects pairing two elements.
    Methods to export to other formats
    visu_dump — Some resources to add the ability to export the rendered data to an other format (usually image format).
    dumpThroughGdkPixbuf — add an export capability into PNG and JPG files.
    dumpToAscii — add an export capability of current positions.
    dumpToTiff — add an export capability into TIFF files.
    dumpToXyz — add an export capability of current positions.
    dumpToPsAndPdf — add an export capability into PS and PDF files (encapsulating bitmaps).
    dumpToSVG — add an export capability into SVG files.
    dumpToABINIT — add an export capability of current positions in ABINIT format.
    Generic tools
    toolOptions — A convienent wrapper around GHashTable that can support types.
    toolMatrix — Defines basic handlings on matrix.
    toolConfigFile — Generic read methods of the configuration files are defined here.
    toolFortran — Introduces routines to read the binary Fortran data format.
    toolPhysic — introduce physical values for the chemical species.
    toolColor — Simple handling and storage of RGBA colours.
    toolShade — ToolShades are color gradients.
    ToolFileFormat — Describes file format objects (name patterns, description, properties...).
    OpenGL tools
    opengl — This part is responsible for the pseudo3D rendering through OpenGl and gives methods to adapt the view.
    renderingMode — Controls the way OpenGL renders objects.
    light — Controls the use of lights in the rendering window.
    text — Enables capabilities to write some text on rendering screen.
    objectList — Gives storage for ids used by OpenGL lists and provides primitive routine for common drawing operations (distances, torus...).
    Miscellaneous
    VisuBoxed — Defines a common interface for objects with a VisuBox.
    visu_configFile — Defines methods to access (read/write) to config files and to create different entries.
    visu_basic — Main functions of V_Sim (except graphical ones).
    visu_plugins — Introduces the basic handling of plug-ins.
    visu_commandLine — All methods needed to parse options from the command line.
    visu_actionInterface — Interface for defining actions and events.
    visu_openGL — Define the OS dependent routines related to OpenGL.
    v_sim-3.7.0/Documentation/reference/html/gtkInterface.html0000644000353400050620000002447212216331356020603 00000000000000 Part II. Gtk interface

    Part II. Gtk interface

    Table of Contents

    Main interface
    visu_gtk — Basic GUI routines, for preview, standard dialogs...
    gtk_main — The command panel definition.
    gtk_interactive — The interactive dialog.
    gtk_pick — The pick and measurement tab in the interactive dialog.
    gtk_move — The move tab in the interactive dialog.
    gtk_about — The about dialog with a readme, the copyright, the author list, the plug-in list and the version notes.
    gtk_save — The load/save dialog for resources and parameters.
    gtk_pairs — The pairs dialog.
    gtk_openGLWidget — defines an OpenGL capable GtkWidget.
    gtk_renderingWindowWidget — Defines a complex widget used to render files and print information.
    V_Sim specific widgets
    gtk_dumpDialogWidget — Defines a widget to export into different file formats.
    gtk_toolPanelWidget — Defines a widget that hold a set of V_Sim panel.
    gtk_numericalEntryWidget — Defines a widget to enter numerical values without any boundary or precision constrains.
    gtk_valueIOWidget — Defines a specialised GtkHBox with three button to open, save and save as XML value files.
    gtk_colorComboBoxWidget — Defines a specialised GtkComboBox to choose stored colours.
    gtk_stippleComboBoxWidget — Defines a specialised GtkComboBox to choose patterns for lines.
    gtk_orientationChooser — Defines a dialog widget to choose the camera position.
    gtk_shadeComboBoxWidget — Defines a specialised GtkComboBox to choose pre-built shades.
    gtk_lineObjectWidget — Defines a specialised GtkBox to choose all characteristic of lines.
    gtk_elementComboBox — Defines a specialised GtkComboBox to choose VisuElement.
    gtk_curveWidget — A specialised curve widget to draw distance distribution for pairs.
    gtk_fieldChooser — Defines a widget to choose a scalar field or an isosurface.
    Panel add-ons
    panelSurfaces — Gtk interface to load isosurfaces.
    panelElements — The tab where VisuElement characteristics can be tuned.
    panelMethod — The tab where drawing method is chosen (atomic or spin).
    panelPlanes — The tab where planes are defined.
    panelBrowser — A tab to view a list of files and quickly change from one to another.
    panelVibration — The tab where phonons are loaded and listed.
    panelDataFile — The tab where to configure the action of an external data file on colourisation of nodes.
    panelMap — The widget to create coloured map.
    panelFogBgColor — The widget to tune the background and the fog.
    panelGeometry — This tab gathers the geometry operation on a VisuData, like periodic translation, physical units, ...
    panelOpenGL — The tab where OpenGL options like lights or quality are setup.
    panelSurfacesTools — Gtk interface to manage isosurfaces.
    panelAxes — The tab where axes, box, scale and legend are setup.
    panelConfig — The tab where miscellaneous options are setup.
    gtkAtomic — The gtk interface elements that are specific to the atomic rendering method.
    gtkSpin — The gtk interface elements that can interfere with renderingSpin parameters.
    gtk_wire — The additional widgets displayed in the pair dialog to handle wire pairs.
    gtk_cylinder — The additional widgets displayed in the pair dialog to handle cylinder pairs.
    v_sim-3.7.0/Documentation/reference/html/home.png0000644000353400050620000000110212216331354016724 00000000000000PNG  IHDRשPLTE  $$$(((,,,000888<<<@@@OOOPPP[[[___```lll{{{?*tRNS  $(,4@GKSghkotwa7IDATxڭ[WP̳ij2LK<`[4jg8b袋y/5F~QЈJT*N/ q]1zJ+zD=94bv«1;ÈP= ]j*P got ׻>&*B@ $n?q nAC&ޙc~a|ZL\!CVF@ڐ~IENDB`v_sim-3.7.0/Documentation/reference/html/index.html0000644000353400050620000006336512216331356017310 00000000000000 V_Sim API - Reference Manual

    for V_Sim 3.7.0


    I. Core
    VisuObject — A general object to store the signals.
    visu_elements — defines methods to create and acccess to VisuElement.
    VisuNodeArray — Defines the elementary structure to store informations about an element in a box.
    VisuData — Give methods to store and manage data from input file(s).
    VisuBox — Defines a bounding box.
    VisuGlView — Defines all necessary informations for the rendering of a view.
    interactive — Gives tools to interact with the rendered area.
    Main capabilities of V_Sim
    dataFile — Adds a possibility to colorize nodes depending on data read in an input file.
    plane — Adds capabilities to draw and handle planes.
    VisuScalarField — Gives capabilities to load a scalar field.
    surfaces — Supports loading of .surf files and drawing of surfaces through OpenGL.
    geometry — different routines to do high level geometry studies on a box or a set of boxes.
    vibration — Add a support to animate the node positions with a phonon frequency.
    map — Describe how to handle and draw coloured map on a plane from a density field.
    dataNode — Extends capabilities of node properties.
    extraNode — add further characteristics to the nodes.
    isoline — handle the drawing and the computation of isolines.
    surfaces_points — Define a structure to store a set of triangles defining a surface.
    surfaces_resources — Define the rendering parameters of a surface.
    pot2surf — Creates surfaces from scalar fields.
    Methods to read input files and draw nodes
    VisuRendering — Methods to create and add new rendering methods.
    renderingAtomic — A rendering method to draw atoms positioned in a box.
    renderingAtomic_d3 — Method to load d3 position file.
    renderingAtomic_ascii — Method to load ascii position file.
    atomic_xyz — Method to load xyz position file.
    atomic_yaml — Method to load YAML position file.
    renderingSpin — A module able to represent atoms by their position and spin.
    OpenGL drawing methods
    VisuGlExt — All objects drawn by V_Sim are defined in by a VisuGlExt object
    VisuGlExtNodes — Defines methods to draw a set of nodes.
    VisuGlExtPairs — Draw links between nodes.
    VisuGlExtFrame — Draw a frame with the representation of a color frame.
    VisuGlExtBoxLegend — Draw a bounding box around nodes.
    VisuGlExtAxes — Defines methods to draw axes.
    VisuGlExtLegend — Draw a frame with the representation of each atom species, its name and the number of elements.
    VisuGlExtShade — Draw a frame with the representation of a color shade.
    VisuGlExtNodeVectors — Draw arrows at each node to represent forces, displacements, vibrations...
    VisuGlExtForces — Draw arrows at each node to represent forces.
    VisuGlExtPlanes — Draw a list of VisuPlane.
    VisuGlExtSurfaces — Defines methods to draw surfaces.
    VisuGlExtMaps — Defines methods to draw maps.
    VisuGlExtInfos — give the capability to draw some information near each node.
    VisuGlExtScale — Draw an arrow with a label.
    VisuGlExtBg — Handle the background colour and the fog.
    marks — Draw features on nodes, like measurement marks or highlights.
    VisuGlExtPaths — Defines methods to draw paths.
    Dealing with pairs
    VisuPairLink — V_Sim can draw link between nodes. This part defines a pair object and interface to draw pairs.
    cylinder — Gives methods to draw cylinders as OpenGl objects pairing two elements.
    wire — Gives methods to draw lines as OpenGl objects pairing two elements.
    Methods to export to other formats
    visu_dump — Some resources to add the ability to export the rendered data to an other format (usually image format).
    dumpThroughGdkPixbuf — add an export capability into PNG and JPG files.
    dumpToAscii — add an export capability of current positions.
    dumpToTiff — add an export capability into TIFF files.
    dumpToXyz — add an export capability of current positions.
    dumpToPsAndPdf — add an export capability into PS and PDF files (encapsulating bitmaps).
    dumpToSVG — add an export capability into SVG files.
    dumpToABINIT — add an export capability of current positions in ABINIT format.
    Generic tools
    toolOptions — A convienent wrapper around GHashTable that can support types.
    toolMatrix — Defines basic handlings on matrix.
    toolConfigFile — Generic read methods of the configuration files are defined here.
    toolFortran — Introduces routines to read the binary Fortran data format.
    toolPhysic — introduce physical values for the chemical species.
    toolColor — Simple handling and storage of RGBA colours.
    toolShade — ToolShades are color gradients.
    ToolFileFormat — Describes file format objects (name patterns, description, properties...).
    OpenGL tools
    opengl — This part is responsible for the pseudo3D rendering through OpenGl and gives methods to adapt the view.
    renderingMode — Controls the way OpenGL renders objects.
    light — Controls the use of lights in the rendering window.
    text — Enables capabilities to write some text on rendering screen.
    objectList — Gives storage for ids used by OpenGL lists and provides primitive routine for common drawing operations (distances, torus...).
    Miscellaneous
    VisuBoxed — Defines a common interface for objects with a VisuBox.
    visu_configFile — Defines methods to access (read/write) to config files and to create different entries.
    visu_basic — Main functions of V_Sim (except graphical ones).
    visu_plugins — Introduces the basic handling of plug-ins.
    visu_commandLine — All methods needed to parse options from the command line.
    visu_actionInterface — Interface for defining actions and events.
    visu_openGL — Define the OS dependent routines related to OpenGL.
    II. Gtk interface
    Main interface
    visu_gtk — Basic GUI routines, for preview, standard dialogs...
    gtk_main — The command panel definition.
    gtk_interactive — The interactive dialog.
    gtk_pick — The pick and measurement tab in the interactive dialog.
    gtk_move — The move tab in the interactive dialog.
    gtk_about — The about dialog with a readme, the copyright, the author list, the plug-in list and the version notes.
    gtk_save — The load/save dialog for resources and parameters.
    gtk_pairs — The pairs dialog.
    gtk_openGLWidget — defines an OpenGL capable GtkWidget.
    gtk_renderingWindowWidget — Defines a complex widget used to render files and print information.
    V_Sim specific widgets
    gtk_dumpDialogWidget — Defines a widget to export into different file formats.
    gtk_toolPanelWidget — Defines a widget that hold a set of V_Sim panel.
    gtk_numericalEntryWidget — Defines a widget to enter numerical values without any boundary or precision constrains.
    gtk_valueIOWidget — Defines a specialised GtkHBox with three button to open, save and save as XML value files.
    gtk_colorComboBoxWidget — Defines a specialised GtkComboBox to choose stored colours.
    gtk_stippleComboBoxWidget — Defines a specialised GtkComboBox to choose patterns for lines.
    gtk_orientationChooser — Defines a dialog widget to choose the camera position.
    gtk_shadeComboBoxWidget — Defines a specialised GtkComboBox to choose pre-built shades.
    gtk_lineObjectWidget — Defines a specialised GtkBox to choose all characteristic of lines.
    gtk_elementComboBox — Defines a specialised GtkComboBox to choose VisuElement.
    gtk_curveWidget — A specialised curve widget to draw distance distribution for pairs.
    gtk_fieldChooser — Defines a widget to choose a scalar field or an isosurface.
    Panel add-ons
    panelSurfaces — Gtk interface to load isosurfaces.
    panelElements — The tab where VisuElement characteristics can be tuned.
    panelMethod — The tab where drawing method is chosen (atomic or spin).
    panelPlanes — The tab where planes are defined.
    panelBrowser — A tab to view a list of files and quickly change from one to another.
    panelVibration — The tab where phonons are loaded and listed.
    panelDataFile — The tab where to configure the action of an external data file on colourisation of nodes.
    panelMap — The widget to create coloured map.
    panelFogBgColor — The widget to tune the background and the fog.
    panelGeometry — This tab gathers the geometry operation on a VisuData, like periodic translation, physical units, ...
    panelOpenGL — The tab where OpenGL options like lights or quality are setup.
    panelSurfacesTools — Gtk interface to manage isosurfaces.
    panelAxes — The tab where axes, box, scale and legend are setup.
    panelConfig — The tab where miscellaneous options are setup.
    gtkAtomic — The gtk interface elements that are specific to the atomic rendering method.
    gtkSpin — The gtk interface elements that can interfere with renderingSpin parameters.
    gtk_wire — The additional widgets displayed in the pair dialog to handle wire pairs.
    gtk_cylinder — The additional widgets displayed in the pair dialog to handle cylinder pairs.
    III. Additional information
    Object Hierarchy
    New symbols in 3.1
    New symbols in 3.2
    New symbols in 3.3
    New symbols in 3.4
    New symbols in 3.5
    New symbols in 3.6
    New symbols in 3.7
    Annotation Glossary
    API Index
    v_sim-3.7.0/Documentation/reference/html/index.sgml0000644000353400050620000100016212216331355017270 00000000000000 v_sim-3.7.0/Documentation/reference/html/left.png0000644000353400050620000000056512216331355016743 00000000000000PNG  IHDRש~PLTE(((;;;@@@v:tRNS $04 Part III. Additional information v_sim-3.7.0/Documentation/reference/html/object-tree.html0000644000353400050620000002265012216331356020374 00000000000000 Object Hierarchy v_sim-3.7.0/Documentation/reference/html/right.png0000644000353400050620000000057412216331355017126 00000000000000PNG  IHDRש{PLTE ###+++@@@WtRNS (48@GX[ytIDATxڅ0 PS@XZ -%e I<`eA٬Z9(1'n/"U!Dhw$4QX$ AlXR^>8Mzmt>k7 O$ٞ=mVQ.JO9  IENDB`v_sim-3.7.0/Documentation/reference/html/style.css0000644000353400050620000001210012216331355017141 00000000000000.synopsis, .classsynopsis { /* tango:aluminium 1/2 */ background: #eeeeec; border: solid 1px #d3d7cf; padding: 0.5em; } .programlisting { /* tango:sky blue 0/1 */ background: #e6f3ff; border: solid 1px #729fcf; padding: 0.5em; } .variablelist { padding: 4px; margin-left: 3em; } .variablelist td:first-child { vertical-align: top; } @media screen { sup a.footnote { position: relative; top: 0em ! important; } /* this is needed so that the local anchors are displayed below the naviagtion */ div.footnote a[name], div.refnamediv a[name], div.refsect1 a[name], div.refsect2 a[name], div.index a[name], div.glossary a[name], div.sect1 a[name] { display: inline-block; position: relative; top:-5em; } /* this seems to be a bug in the xsl style sheets when generating indexes */ div.index div.index { top: 0em; } /* make space for the fixed navigation bar and add space at the bottom so that * link targets appear somewhat close to top */ body { padding-top: 3.2em; padding-bottom: 20em; } /* style and size the navigation bar */ table.navigation#top { position: fixed; /* tango:scarlet red 0/1 */ background: #ffe6e6; border: solid 1px #ef2929; margin-top: 0; margin-bottom: 0; top: 0; left: 0; height: 3em; z-index: 10; } .navigation a, .navigation a:visited { /* tango:scarlet red 3 */ color: #a40000; } .navigation a:hover { /* tango:scarlet red 1 */ color: #ef2929; } td.shortcuts { /* tango:scarlet red 1 */ color: #ef2929; font-size: 80%; white-space: nowrap; } } @media print { table.navigation { visibility: collapse; display: none; } div.titlepage table.navigation { visibility: visible; display: table; /* tango:scarlet red 0/1 */ background: #ffe6e6; border: solid 1px #ef2929; margin-top: 0; margin-bottom: 0; top: 0; left: 0; height: 3em; } } .navigation .title { font-size: 200%; } div.gallery-float { float: left; padding: 10px; } div.gallery-float img { border-style: none; } div.gallery-spacer { clear: both; } a, a:visited { text-decoration: none; /* tango:sky blue 2 */ color: #3465a4; } a:hover { text-decoration: underline; /* tango:sky blue 1 */ color: #729fcf; } div.table table { border-collapse: collapse; border-spacing: 0px; /* tango:aluminium 3 */ border: solid 1px #babdb6; } div.table table td, div.table table th { /* tango:aluminium 3 */ border: solid 1px #babdb6; padding: 3px; vertical-align: top; } div.table table th { /* tango:aluminium 2 */ background-color: #d3d7cf; } hr { /* tango:aluminium 3 */ color: #babdb6; background: #babdb6; border: none 0px; height: 1px; clear: both; } .footer { padding-top: 3.5em; /* tango:aluminium 3 */ color: #babdb6; text-align: center; font-size: 80%; } .warning { /* tango:orange 0/1 */ background: #ffeed9; border-color: #ffb04f; } .note { /* tango:chameleon 0/0.5 */ background: #d8ffb2; border-color: #abf562; } .note, .warning { padding: 0.5em; border-width: 1px; border-style: solid; } .note h3, .warning h3 { margin-top: 0.0em } .note p, .warning p { margin-bottom: 0.0em } /* blob links */ h2 .extralinks, h3 .extralinks { float: right; /* tango:aluminium 3 */ color: #babdb6; font-size: 80%; font-weight: normal; } .annotation { /* tango:aluminium 5 */ color: #555753; font-size: 80%; font-weight: normal; } /* code listings */ .listing_code .programlisting .cbracket { color: #a40000; } /* tango: scarlet red 3 */ .listing_code .programlisting .comment { color: #a1a39d; } /* tango: aluminium 4 */ .listing_code .programlisting .function { color: #000000; font-weight: bold; } .listing_code .programlisting .function a { color: #11326b; font-weight: bold; } /* tango: sky blue 4 */ .listing_code .programlisting .keyword { color: #4e9a06; } /* tango: chameleon 3 */ .listing_code .programlisting .linenum { color: #babdb6; } /* tango: aluminium 3 */ .listing_code .programlisting .normal { color: #000000; } .listing_code .programlisting .number { color: #75507b; } /* tango: plum 2 */ .listing_code .programlisting .preproc { color: #204a87; } /* tango: sky blue 3 */ .listing_code .programlisting .string { color: #c17d11; } /* tango: chocolate 2 */ .listing_code .programlisting .type { color: #000000; } .listing_code .programlisting .type a { color: #11326b; } /* tango: sky blue 4 */ .listing_code .programlisting .symbol { color: #ce5c00; } /* tango: orange 3 */ .listing_frame { /* tango:sky blue 1 */ border: solid 1px #729fcf; padding: 0px; } .listing_lines, .listing_code { margin-top: 0px; margin-bottom: 0px; padding: 0.5em; } .listing_lines { /* tango:sky blue 0.5 */ background: #a6c5e3; /* tango:aluminium 6 */ color: #2e3436; } .listing_code { /* tango:sky blue 0 */ background: #e6f3ff; } .listing_code .programlisting { /* override from previous */ border: none 0px; padding: 0px; } .listing_lines pre, .listing_code pre { margin: 0px; } v_sim-3.7.0/Documentation/reference/html/ToolFileFormat.html0000644000353400050620000015644012216331356021064 00000000000000 ToolFileFormat

    ToolFileFormat

    ToolFileFormat — Describes file format objects (name patterns, description, properties...).

    Synopsis

    #define             TOOL_FILE_FORMAT_ERROR
    struct              ToolFileFormat;
    struct              ToolFileFormatClass;
    enum                ToolFileFormatErrorFlag;
    struct              ToolFileFormatIter;
    gboolean            (*ToolFileFormatValidate)           (const gchar *filename);
    void                tool_file_format_addOption          (ToolFileFormat *format,
                                                             ToolOption *opt);
    void                tool_file_format_addPatterns        (ToolFileFormat *fmt,
                                                             const gchar **patterns);
    ToolOption *        tool_file_format_addPropertyBoolean (ToolFileFormat *format,
                                                             const gchar *name,
                                                             const gchar *label,
                                                             gboolean defaultVal);
    ToolOption *        tool_file_format_addPropertyDouble  (ToolFileFormat *format,
                                                             const gchar *name,
                                                             const gchar *label,
                                                             gdouble defaultVal);
    ToolOption *        tool_file_format_addPropertyInt     (ToolFileFormat *format,
                                                             const gchar *name,
                                                             const gchar *label,
                                                             gint defaultVal);
    gboolean            tool_file_format_canMatch           (ToolFileFormat *format);
    ToolFileFormat *    tool_file_format_copy               (const ToolFileFormat *from);
    const GList *       tool_file_format_getFilePatterns    (ToolFileFormat *format);
    const gchar *       tool_file_format_getLabel           (ToolFileFormat *format);
    const gchar *       tool_file_format_getName            (ToolFileFormat *format);
    ToolOption *        tool_file_format_getPropertyByName  (ToolFileFormat *format,
                                                             const gchar *name);
    GQuark              tool_file_format_getQuark           (void);
    gboolean            tool_file_format_iterNextProperty   (ToolFileFormat *format,
                                                             ToolFileFormatIter *iter);
    const gchar *       tool_file_format_match              (ToolFileFormat *format,
                                                             const gchar *filename);
    ToolFileFormat *    tool_file_format_new                (const gchar *descr,
                                                             const gchar **patterns);
    ToolFileFormat *    tool_file_format_newRestricted      (const gchar *descr,
                                                             const gchar **patterns);
    void                tool_file_format_setValidator       (ToolFileFormat *format,
                                                             ToolFileFormatValidate validate);
    gboolean            tool_file_format_validate           (ToolFileFormat *format,
                                                             const gchar *filename);
    

    Object Hierarchy

      GObject
       +----ToolFileFormat
             +----VisuDump
             +----VisuScalarFieldMethod
    

    Properties

      "ignore-type"              gboolean              : Read / Write
      "label"                    gchar*                : Read
      "name"                     gchar*                : Read / Write / Construct Only
    

    Description

    When dealing with files, it is convenient to class then by formats, one format for JPEG files, one other for postscript... Such file formats are characterized by their description, explaining what they are, one or more name pattern (e.g. "*.jpg") and some properties (e.g. compression level for JPEG file).

    This module describes objects that can store all these informations and deals with them. To create a new file format, use tool_file_format_new(). A ToolFileFormat object can be used in a GtkFileChooser object, using a GtkFileFilter. tool_file_format_getLabel() will return directly the label to give to the GtkFileFilter and the name patterns can be passed to it also.

    A file format property is a ToolOption value. There are some convenient routines to add common boolean or integer properties. For instance, use tool_file_format_addPropertyBoolean() to add a boolean property to a given ToolFileFormat object. Then the stored properties can be iterated on using a ToolFileFormatIter iterator.

    Details

    TOOL_FILE_FORMAT_ERROR

    #define TOOL_FILE_FORMAT_ERROR tool_file_format_getQuark()
    

    Internal function for error handling.


    struct ToolFileFormat

    struct ToolFileFormat;

    An opaque structure.


    struct ToolFileFormatClass

    struct ToolFileFormatClass {
      GObjectClass parent;
    };
    

    An opaque structure.

    GObjectClass parent;

    the parent.

    enum ToolFileFormatErrorFlag

    typedef enum {
        TOOL_FILE_FORMAT_ERROR_METHOD,   /* Error from the rendering method. */
        TOOL_FILE_FORMAT_ERROR_FILE,     /* Error when opening. */
        TOOL_FILE_FORMAT_ERROR_FORMAT,   /* Wrongness in format. */
        TOOL_FILE_FORMAT_ERROR_UNKNOWN_FORMAT
    } ToolFileFormatErrorFlag;
    

    These are flags used when reading a file with a loading method associated to a file format.

    TOOL_FILE_FORMAT_ERROR_METHOD

    Error from the loading method.

    TOOL_FILE_FORMAT_ERROR_FILE

    Error when opening.

    TOOL_FILE_FORMAT_ERROR_FORMAT

    Wrongness in format.

    TOOL_FILE_FORMAT_ERROR_UNKNOWN_FORMAT

    the file is not recognised.

    struct ToolFileFormatIter

    struct ToolFileFormatIter {
      GList *lst;
    
      gchar *name;
      gchar *label;
      GValue *val;
    };
    

    Iterator on ToolFileFormat object properties. See tool_file_format_iterNextProperty().

    GList *lst;

    internal pointer.

    gchar *name;

    name of the current iterated property (read only).

    gchar *label;

    label of the current iterated property (read only).

    GValue *val;

    its value (read only).

    Since 3.6


    ToolFileFormatValidate ()

    gboolean            (*ToolFileFormatValidate)           (const gchar *filename);

    Function to match a given filename for a file format. See tool_file_format_setValidator().

    filename :

    a path. [type filename]

    Returns :

    TRUE if filename is a valid name for a file format.

    Since 3.7


    tool_file_format_addOption ()

    void                tool_file_format_addOption          (ToolFileFormat *format,
                                                             ToolOption *opt);

    File format may have options, like pseudo-potential pparameters in case of BigDFT calculations.

    format :

    a ToolFileFormat object.

    opt :

    a ToolOption object.

    Since 3.7


    tool_file_format_addPatterns ()

    void                tool_file_format_addPatterns        (ToolFileFormat *fmt,
                                                             const gchar **patterns);

    A file format may have pattern for the naming scheme of files, like "*.jpg" and "*.jpeg" for JPEG files. It's not mandatory for a file format to match its own pattern anyway.

    fmt :

    a ToolFileFormat object.

    patterns :

    a list of matching patterns. [array zero-terminated=1]

    Since 3.7


    tool_file_format_addPropertyBoolean ()

    ToolOption *        tool_file_format_addPropertyBoolean (ToolFileFormat *format,
                                                             const gchar *name,
                                                             const gchar *label,
                                                             gboolean defaultVal);

    Add a new boolean property to the file format format.

    format :

    the ToolFileFormat object.

    name :

    a name ;

    label :

    a description ;

    defaultVal :

    a default value.

    Returns :

    a newly created ToolOption, free with tool_option_free(). [transfer none]

    tool_file_format_addPropertyDouble ()

    ToolOption *        tool_file_format_addPropertyDouble  (ToolFileFormat *format,
                                                             const gchar *name,
                                                             const gchar *label,
                                                             gdouble defaultVal);

    Add a new integer property to the file format format.

    format :

    the ToolFileFormat object.

    name :

    a name ;

    label :

    a description ;

    defaultVal :

    a default value.

    Returns :

    a newly created ToolOption, free with tool_option_free(). [transfer none]

    Since 3.7


    tool_file_format_addPropertyInt ()

    ToolOption *        tool_file_format_addPropertyInt     (ToolFileFormat *format,
                                                             const gchar *name,
                                                             const gchar *label,
                                                             gint defaultVal);

    Add a new integer property to the file format format.

    format :

    the ToolFileFormat object.

    name :

    a name ;

    label :

    a description ;

    defaultVal :

    a default value.

    Returns :

    a newly created ToolOption, free with tool_option_free(). [transfer none]

    tool_file_format_canMatch ()

    gboolean            tool_file_format_canMatch           (ToolFileFormat *format);

    This method is used to know if the file pattern list can be used to match a given filename with tool_file_format_match().

    format :

    a ToolFileFormat.

    Returns :

    TRUE if a call to tool_file_format_match() is safe.

    Since 3.6


    tool_file_format_copy ()

    ToolFileFormat *    tool_file_format_copy               (const ToolFileFormat *from);

    Copy the given file format from a create a new one.

    from :

    a ToolFileFormat object.

    Returns :

    a newly created ToolFileFormat. Should be freed with g_object_unref(). [transfer full]

    Since 3.6


    tool_file_format_getFilePatterns ()

    const GList *       tool_file_format_getFilePatterns    (ToolFileFormat *format);

    This method gives a list with the file patterns.

    format :

    a ToolFileFormat.

    Returns :

    a list with the file patterns. This list should not be freed. [transfer none][element-type utf8]

    Since 3.6


    tool_file_format_getLabel ()

    const gchar *       tool_file_format_getLabel           (ToolFileFormat *format);

    This method gives a label describing the file format.

    format :

    a ToolFileFormat.

    Returns :

    a string made by the name and all the paterns of the given format, given in parentethis. This string should not be freed. [transfer none]

    tool_file_format_getName ()

    const gchar *       tool_file_format_getName            (ToolFileFormat *format);

    This method gives the name describing the file format.

    format :

    a ToolFileFormat.

    Returns :

    a string with the name. This string should not be freed. [transfer none]

    tool_file_format_getPropertyByName ()

    ToolOption *        tool_file_format_getPropertyByName  (ToolFileFormat *format,
                                                             const gchar *name);

    Retrieve the corresponding property to name from the biven format.

    format :

    a ToolFileFormat.

    name :

    the name of a property.

    Returns :

    the found ToolOption or NULL. [transfer none]

    Since 3.5


    tool_file_format_getQuark ()

    GQuark              tool_file_format_getQuark           (void);

    Internal routine to get the GQuark to handle error related to file formats.


    tool_file_format_iterNextProperty ()

    gboolean            tool_file_format_iterNextProperty   (ToolFileFormat *format,
                                                             ToolFileFormatIter *iter);

    Run to the next property of the file format format. The iterator attributes are updated so it's convenient to access the property values and details, see ToolFileFormatIter.

    format :

    a ToolFileFormat object.

    iter :

    an iterator.

    Returns :

    TRUE if any.

    Since 3.6


    tool_file_format_match ()

    const gchar *       tool_file_format_match              (ToolFileFormat *format,
                                                             const gchar *filename);

    This method try to match the given string to one of the patterns of the ToolFileFormat format.

    format :

    a ToolFileFormat ;

    filename :

    a string to match.

    Returns :

    the matching pattern, if any.

    tool_file_format_new ()

    ToolFileFormat *    tool_file_format_new                (const gchar *descr,
                                                             const gchar **patterns);

    Allocate a new ToolFileFormat. The patterns argument is copied in the ToolFileFormat object and can be freed safely after the call to this method.

    descr :

    a short string to label a new file format.

    patterns :

    a set of patterns to identify files of this format. [array zero-terminated=1][element-type utf8]

    Returns :

    a newly allocated ToolFileFormat, or NULL if something goes wrong. [transfer none]

    tool_file_format_newRestricted ()

    ToolFileFormat *    tool_file_format_newRestricted      (const gchar *descr,
                                                             const gchar **patterns);

    Allocate a new ToolFileFormat. The patterns argument is copied in the ToolFileFormat object and can be freed safely after the call to this method. The patterns list is not all the patterns supported by the format.

    descr :

    a short string to label a new file format.

    patterns :

    a set of patterns to identify files of this format.

    Returns :

    a newly allocated ToolFileFormat, or NULL if something goes wrong. [transfer none]

    tool_file_format_setValidator ()

    void                tool_file_format_setValidator       (ToolFileFormat *format,
                                                             ToolFileFormatValidate validate);

    Set up a validating routine that do a minimal parsing to check that a provided file corresponds to this file format.

    format :

    a ToolFileFormat ;

    validate :

    a pointer to a validator routine. [scope call]

    Since 3.7


    tool_file_format_validate ()

    gboolean            tool_file_format_validate           (ToolFileFormat *format,
                                                             const gchar *filename);

    This method runs a minimal parsing routine set with tool_file_format_setValidator() to check if the provided filename correspond to this file format.

    format :

    a ToolFileFormat ;

    filename :

    a string to match.

    Returns :

    TRUE, if the file (after minimal parsing) is of this file format. If there is no validator routine, it returns FALSE anyway.

    Since 3.7

    Property Details

    The "ignore-type" property

      "ignore-type"              gboolean              : Read / Write

    Don't restrict file matching to the given patterns.

    Default value: FALSE


    The "label" property

      "label"                    gchar*                : Read

    Label used to show the file pattern.

    Default value: ""


    The "name" property

      "name"                     gchar*                : Read / Write / Construct Only

    File format description.

    Default value: ""

    v_sim-3.7.0/Documentation/reference/html/up.png0000644000353400050620000000044312216331355016430 00000000000000PNG  IHDRw=IDATx!0Ȋ $11Dppʉɉɉ D%@ o%/!eg*/iY`]1@Y ʃ ( &b(&b'"r>b/#r>b/#~@ɇ<)V!@)ExR>~4 tE RkdX~4%2 M {ۙ~:[d9t) IENDB`v_sim-3.7.0/Documentation/reference/html/VisuBox.html0000644000353400050620000025303712216331356017575 00000000000000 VisuBox

    VisuBox

    VisuBox — Defines a bounding box.

    Synopsis

    struct              VisuBox;
    enum                VisuBoxBoundaries;
    struct              VisuBoxCell;
    struct              VisuBoxClass;
    enum                VisuBoxVector;
    struct              VisuBoxVertices;
    gboolean            visu_box_constrainInside            (VisuBox *box,
                                                             float translat[3],
                                                             float xyz[3],
                                                             gboolean withExt);
    void                visu_box_convertBoxCoordinatestoXYZ (VisuBox *box,
                                                             float xyz[3],
                                                             float boxCoord[3]);
    void                visu_box_convertFullToCell          (VisuBox *box,
                                                             float cell[3],
                                                             float full[3]);
    void                visu_box_convertReducedToXYZ        (VisuBox *box,
                                                             GArray *red,
                                                             float *x,
                                                             float *y,
                                                             float *z);
    void                visu_box_convertXYZToReduced        (VisuBox *box,
                                                             GArray *xyz,
                                                             float *u,
                                                             float *v,
                                                             float *w);
    void                visu_box_convertXYZtoBoxCoordinates (VisuBox *box,
                                                             float boxCoord[3],
                                                             float xyz[3]);
    VisuBoxBoundaries   visu_box_getBoundary                (VisuBox *box);
    void                visu_box_getCellMatrix              (VisuBox *box,
                                                             double matrix[3][3]);
    void                visu_box_getCellMatrixv             (VisuBox *box,
                                                             double *m11,
                                                             double *m12,
                                                             double *m13,
                                                             double *m21,
                                                             double *m22,
                                                             double *m23,
                                                             double *m31,
                                                             double *m32,
                                                             double *m33);
    void                visu_box_getCentre                  (VisuBox *box,
                                                             float centre[3]);
    void                visu_box_getExtension               (const VisuBox *boxObj,
                                                             float extension[3]);
    double              visu_box_getGeometry                (VisuBox *box,
                                                             VisuBoxVector vector);
    float               visu_box_getGlobalSize              (VisuBox *box,
                                                             gboolean withExt);
    void                visu_box_getInvMatrix               (VisuBox *box,
                                                             double matrix[3][3]);
    void                visu_box_getPeriodicArray           (VisuBox *box,
                                                             float *array,
                                                             guint nEle);
    void                visu_box_getPeriodicVector          (VisuBox *box,
                                                             float vect[3]);
    void                visu_box_getPeriodicVectorv         (VisuBox *box,
                                                             float *x,
                                                             float *y,
                                                             float *z,
                                                             float vect[3]);
    void                visu_box_getPeriodicity             (VisuBox *box,
                                                             gboolean per[3]);
    ToolUnits           visu_box_getUnit                    (VisuBox *box);
    void                visu_box_getVertices                (VisuBox *box,
                                                             float v[8][3],
                                                             gboolean withExtension);
    VisuBox *           visu_box_new                        (double geometry[VISU_BOX_N_VECTORS],
                                                             VisuBoxBoundaries bc);
    VisuBox *           visu_box_new_full                   (double full[3][3],
                                                             VisuBoxBoundaries bc);
    gboolean            visu_box_setBoundary                (VisuBox *box,
                                                             VisuBoxBoundaries bc);
    gboolean            visu_box_setExtension               (VisuBox *boxObj,
                                                             float extension[3]);
    gboolean            visu_box_setGeometry                (VisuBox *box,
                                                             double geometry[VISU_BOX_N_VECTORS]);
    gboolean            visu_box_setGeometryFull            (VisuBox *box,
                                                             double full[3][3]);
    gboolean            visu_box_setMargin                  (VisuBox *box,
                                                             gfloat margin,
                                                             gboolean emit);
    gboolean            visu_box_setUnit                    (VisuBox *box,
                                                             ToolUnits unit);
    

    Object Hierarchy

      GObject
       +----VisuBox
    

    Implemented Interfaces

    VisuBox implements VisuBoxed.

    Description

    Details

    struct VisuBox

    struct VisuBox;

    Opaque structure to stores VisuBox object.


    enum VisuBoxBoundaries

    typedef enum {
        VISU_BOX_PERIODIC,
        VISU_BOX_SURFACE_XY,
        VISU_BOX_SURFACE_YZ,
        VISU_BOX_SURFACE_ZX,
        VISU_BOX_WIRE_X,
        VISU_BOX_WIRE_Y,
        VISU_BOX_WIRE_Z,
        VISU_BOX_FREE
    } VisuBoxBoundaries;
    

    This describes the periodicity of the bounding box in the three directions.

    VISU_BOX_PERIODIC

    the full 3D periodicity ;

    VISU_BOX_SURFACE_XY

    the Z axis is a free axis ;

    VISU_BOX_SURFACE_YZ

    the X axis is a free axis ;

    VISU_BOX_SURFACE_ZX

    the Y axis is a free axis ;

    VISU_BOX_WIRE_X

    the periodicity is along X axis only ;

    VISU_BOX_WIRE_Y

    the periodicity is along Y axis only ;

    VISU_BOX_WIRE_Z

    the periodicity is along Z axis only ;

    VISU_BOX_FREE

    the system is isolated.

    struct VisuBoxCell

    struct VisuBoxCell {
      double box[VISU_BOX_N_VECTORS];
    };
    

    Structure used for bindings.

    double box[VISU_BOX_N_VECTORS];

    . [array fixed-size=6][element-type gdouble]

    Since 3.7


    struct VisuBoxClass

    struct VisuBoxClass {
      GObjectClass parent;
    };
    

    Class structure of VisuBox objects.

    GObjectClass parent;

    private.

    enum VisuBoxVector

    typedef enum {
        VISU_BOX_DXX,
        VISU_BOX_DYX,
        VISU_BOX_DYY,
        VISU_BOX_DZX,
        VISU_BOX_DZY,
        VISU_BOX_DZZ,
        VISU_BOX_N_VECTORS
    } VisuBoxVector;
    

    Identifier of every projection of the box super-cell on an orthogonal basis-set.

    VISU_BOX_DXX

    x box vector along X;

    VISU_BOX_DYX

    y box vector along X;

    VISU_BOX_DYY

    y box vector along Y;

    VISU_BOX_DZX

    z box vector along X;

    VISU_BOX_DZY

    z box vector along Y;

    VISU_BOX_DZZ

    z box vector along Z;

    VISU_BOX_N_VECTORS

    number of elements.

    Since 3.7


    struct VisuBoxVertices

    struct VisuBoxVertices {
      float vertices[8][3];
    };
    

    Structure used for bindings.

    float vertices[8][3];

    . [array fixed-size=8][element-type ToolVector]

    Since 3.7


    visu_box_constrainInside ()

    gboolean            visu_box_constrainInside            (VisuBox *box,
                                                             float translat[3],
                                                             float xyz[3],
                                                             gboolean withExt);

    Given the box defintion box and the initial xyz cartesian coordinates, it returns the translation translat to be applied to xyz to move the node into the box.

    box :

    a VisuBox object.

    translat :

    a translation in cartesian coordinates (out values).

    xyz :

    a set of cartesian coordinates.

    withExt :

    TRUE to take into account the box expansions.

    Returns :

    TRUE if translat is not (0;0;0).

    Since 3.7


    visu_box_convertBoxCoordinatestoXYZ ()

    void                visu_box_convertBoxCoordinatestoXYZ (VisuBox *box,
                                                             float xyz[3],
                                                             float boxCoord[3]);

    Use this method to transform box coordinates into cartesian.

    box :

    a VisuBox object ;

    xyz :

    an array of floating point values to store the result ;

    boxCoord :

    an array of floating point values that describes the box coordinates.

    Since 3.7


    visu_box_convertFullToCell ()

    void                visu_box_convertFullToCell          (VisuBox *box,
                                                             float cell[3],
                                                             float full[3]);

    Convert given cartesian coordinates of a full matrix definition (see visu_box_setGeometryFull()) to cartesian coordinates in the cell definition used by V_Sim. It corresponds to two applied rotations.

    box :

    a VisuBox object.

    cell :

    . [out caller-allocates][array fixed-size=3]

    full :

    . [in][array fixed-size=3]

    Since 3.7


    visu_box_convertReducedToXYZ ()

    void                visu_box_convertReducedToXYZ        (VisuBox *box,
                                                             GArray *red,
                                                             float *x,
                                                             float *y,
                                                             float *z);

    Use this method to transform box coordinates into cartesian.

    box :

    a VisuBox object ;

    red :

    floating point values that describes the cartesian coordinates. [in][array fixed-size=3][element-type gfloat]

    x :

    the x coordinate. [out caller-allocates]

    y :

    the y coordinate. [out caller-allocates]

    z :

    the z coordinate. [out caller-allocates]

    Since 3.7


    visu_box_convertXYZToReduced ()

    void                visu_box_convertXYZToReduced        (VisuBox *box,
                                                             GArray *xyz,
                                                             float *u,
                                                             float *v,
                                                             float *w);

    Use this method to transform cartesian into box coordinates.

    box :

    a VisuBox object ;

    xyz :

    floating point values that describes the cartesian coordinates. [in][array fixed-size=3][element-type gfloat]

    u :

    the x coordinate. [out caller-allocates]

    v :

    the y coordinate. [out caller-allocates]

    w :

    the z coordinate. [out caller-allocates]

    Since 3.7


    visu_box_convertXYZtoBoxCoordinates ()

    void                visu_box_convertXYZtoBoxCoordinates (VisuBox *box,
                                                             float boxCoord[3],
                                                             float xyz[3]);

    Use this method to transform cartesian coordinates to the box coordinates.

    box :

    a VisuBox object ;

    boxCoord :

    an array of floating point values to store the result ;

    xyz :

    an array of floating point values describing coordinates in cartesian.

    Since 3.7


    visu_box_getBoundary ()

    VisuBoxBoundaries   visu_box_getBoundary                (VisuBox *box);

    Get the boundary conditions defined for box.

    box :

    a VisuBox object.

    Returns :

    a VisuBoxBoundaries flag.

    Since 3.7


    visu_box_getCellMatrix ()

    void                visu_box_getCellMatrix              (VisuBox *box,
                                                             double matrix[3][3]);

    This method is used when the box matrix is required. This matrix can transform a vector given in box coordinates into a cartesian vector. If a simple vector multication is required, then the use of visu_box_convertBoxCoordinatestoXYZ() should be prefered.

    box :

    a VisuBox object ;

    matrix :

    an area to store the matrix.

    Since 3.7


    visu_box_getCellMatrixv ()

    void                visu_box_getCellMatrixv             (VisuBox *box,
                                                             double *m11,
                                                             double *m12,
                                                             double *m13,
                                                             double *m21,
                                                             double *m22,
                                                             double *m23,
                                                             double *m31,
                                                             double *m32,
                                                             double *m33);

    This method is a binding method for visu_box_getCellMatrix().

    Rename to: visu_box_getCellMatrix

    box :

    a VisuBox object ;

    m11 :

    an area to store the matrix. [out]

    m12 :

    an area to store the matrix. [out]

    m13 :

    an area to store the matrix. [out]

    m21 :

    an area to store the matrix. [out]

    m22 :

    an area to store the matrix. [out]

    m23 :

    an area to store the matrix. [out]

    m31 :

    an area to store the matrix. [out]

    m32 :

    an area to store the matrix. [out]

    m33 :

    an area to store the matrix. [out]

    Since 3.7


    visu_box_getCentre ()

    void                visu_box_getCentre                  (VisuBox *box,
                                                             float centre[3]);

    centre contains on output the cartesian coordinates of the centre of the bounding box.

    box :

    a VisuBox object ;

    centre :

    coordinates of the centre. [out][array fixed-size=3]

    Since 3.7


    visu_box_getExtension ()

    void                visu_box_getExtension               (const VisuBox *boxObj,
                                                             float extension[3]);

    Using visu_data_replicate(), it is possible to duplicate the primitive box in each directions. Use this method to know the current extension. Returned values are positive floating point values. An extension of 0. means that only the primitive box exists, while a value of one means a duplication of one box in each direction of the coordinate.

    boxObj :

    a VisuBox object ;

    extension :

    an allocated array to store the values. [out][array fixed-size=3]

    Since 3.7


    visu_box_getGeometry ()

    double              visu_box_getGeometry                (VisuBox *box,
                                                             VisuBoxVector vector);

    Retrieve the value of a vector defining the bounding box. The vector is chosen with an int, see the VisuBoxVector enum for more details.

    box :

    a VisuBox object ;

    vector :

    an int corresponding to a vector of the box.

    Returns :

    the value of the required vector (always a positive value for vector = 0, 2 or 5 !), or G_MAXFLOAT if the box has not been initialised.

    Since 3.7


    visu_box_getGlobalSize ()

    float               visu_box_getGlobalSize              (VisuBox *box,
                                                             gboolean withExt);

    The box has a whole size that contains it (including margin, see visu_box_setMargin()), this size can be retrieve taking into account the extension of the box, or not.

    box :

    a VisuBox object.

    withExt :

    a boolean.

    Returns :

    G_MAXFLOAT on failure, otherwise a length for the biggest diagonal distance of the box, with or without extension.

    Since 3.7


    visu_box_getInvMatrix ()

    void                visu_box_getInvMatrix               (VisuBox *box,
                                                             double matrix[3][3]);

    This method is used when the inverse box matrix is required. This matrix can transform a vector given in cartesian coordinates into a box vector. If a simple vector multication is required, then the use of visu_box_convertXYZtoBoxCoordinates() should be prefered.

    box :

    a VisuBox object ;

    matrix :

    an area to store the matrix.

    Since 3.7


    visu_box_getPeriodicArray ()

    void                visu_box_getPeriodicArray           (VisuBox *box,
                                                             float *array,
                                                             guint nEle);

    Used for bindings.

    box :

    a VisuBox object.

    array :

    an array of nEle * 3 floats. [type gint64]

    nEle :

    number of elements in array

    Since 3.7


    visu_box_getPeriodicVector ()

    void                visu_box_getPeriodicVector          (VisuBox *box,
                                                             float vect[3]);

    Modify vect to get the shortest equivalent vector, taking into account the periodicity.

    box :

    a VisuBox object.

    vect :

    a vector. [inout][array fixed-size=3]

    Since 3.7


    visu_box_getPeriodicVectorv ()

    void                visu_box_getPeriodicVectorv         (VisuBox *box,
                                                             float *x,
                                                             float *y,
                                                             float *z,
                                                             float vect[3]);

    Equivalent of visu_box_getPeriodicVector() used for bindings.

    Rename to: visu_box_getPeriodicVector

    box :

    a VisuBox object.

    x :

    the new x part. [out]

    y :

    the new y part. [out]

    z :

    the new z part. [out]

    vect :

    a vector. [array fixed-size=3]

    Since 3.7


    visu_box_getPeriodicity ()

    void                visu_box_getPeriodicity             (VisuBox *box,
                                                             gboolean per[3]);

    Get for each {x, y, z} directions if the box is periodic.

    box :

    a VisuBox object.

    per :

    a location to store three periodicties. [out caller-allocates][array fixed-size=3]

    Since 3.7


    visu_box_getUnit ()

    ToolUnits           visu_box_getUnit                    (VisuBox *box);

    The lengths of box may be given in a certain unit using visu_box_setUnit().

    box :

    a VisuBox object.

    Returns :

    the ToolUnits of box or TOOL_UNITS_UNDEFINED.

    Since 3.7


    visu_box_getVertices ()

    void                visu_box_getVertices                (VisuBox *box,
                                                             float v[8][3],
                                                             gboolean withExtension);

    All nodes are rendered inside a bounding box, this method can be used to retrieve it. This box is not the drawn box but the box containing all the nodes, included possible extension. To get the box itself, use visu_box_getCellMatrix() instead. One can also get the vertices of the box itself using FALSE as withExtension argument.

    box :

    a VisuBox object.

    v :

    the position of the eight vertices of the bounding box. [out caller-allocates][type VisuBoxVertices*]

    withExtension :

    a boolean.

    visu_box_new ()

    VisuBox *           visu_box_new                        (double geometry[VISU_BOX_N_VECTORS],
                                                             VisuBoxBoundaries bc);

    A VisuBox object store the definition of a cell.

    geometry :

    a cell definition. [array fixed-size=6]

    bc :

    a boundary condition.

    Returns :

    create a new VisuBox object. [transfer full]

    Since 3.7


    visu_box_new_full ()

    VisuBox *           visu_box_new_full                   (double full[3][3],
                                                             VisuBoxBoundaries bc);

    A VisuBox object store the definition of a cell.

    full :

    a cell definition (full matrix). [array fixed-size=9]

    bc :

    a boundary condition.

    Returns :

    create a new VisuBox object. [transfer full]

    Since 3.7


    visu_box_setBoundary ()

    gboolean            visu_box_setBoundary                (VisuBox *box,
                                                             VisuBoxBoundaries bc);

    Set up the boundary conditions of box.

    box :

    a VisuBox object.

    bc :

    a boundary condition.

    Returns :

    TRUE if the boundary conditions of box are changed.

    Since 3.7


    visu_box_setExtension ()

    gboolean            visu_box_setExtension               (VisuBox *boxObj,
                                                             float extension[3]);

    Using visu_data_replicate(), it is possible to duplicate the primitive box in each directions. Use this method to know the current extension. Returned values are positive floating point values. An extension of 0. means that only the primitive box exists, while a value of one means a duplication of one box in each direction of the coordinate.

    boxObj :

    a VisuBox object ;

    extension :

    an allocated array to store the values. [in][array fixed-size=3]

    Returns :

    TRUE if the extension of box is actually changed.

    Since 3.7


    visu_box_setGeometry ()

    gboolean            visu_box_setGeometry                (VisuBox *box,
                                                             double geometry[VISU_BOX_N_VECTORS]);

    This methods set the size of the box.

    box :

    a VisuBox object ;

    geometry :

    a 6 floating point array ;. [in][array fixed-size=6]

    Returns :

    TRUE if the geometry is indeed changed.

    Since 3.7


    visu_box_setGeometryFull ()

    gboolean            visu_box_setGeometryFull            (VisuBox *box,
                                                             double full[3][3]);

    As visu_box_setGeometry(), but using a full matrix.

    box :

    a VisuBox object.

    full :

    a matrix defining a basis-set.

    Returns :

    TRUE if the geometry is valid and changed.

    Since 3.7


    visu_box_setMargin ()

    gboolean            visu_box_setMargin                  (VisuBox *box,
                                                             gfloat margin,
                                                             gboolean emit);

    This routine add some margin to defined the OpenGL rendering zone of box.

    box :

    a VisuBox object.

    margin :

    a float value.

    emit :

    TRUE to emit "SizeChanged" signal.

    Returns :

    TRUE if the margin is actually changed.

    Since 3.7


    visu_box_setUnit ()

    gboolean            visu_box_setUnit                    (VisuBox *box,
                                                             ToolUnits unit);

    The lengths of box may be given in a certain unit by calling this routine. If the unit is different from the previously defined, the coordinate are scaled accordingly.

    box :

    a VisuBox object.

    unit :

    a ToolUnits flag.

    Returns :

    TRUE if the unit has been changed.

    Since 3.7

    Signal Details

    The "BoundaryChanged" signal

    void                user_function                      (VisuBox *box,
                                                            gpointer user_data)      : No Hooks

    Gets emitted when the boundary conditions are changed.

    box :

    the object which received the signal ;

    user_data :

    user data set when the signal handler was connected.

    Since 3.7


    The "ExtensionChanged" signal

    void                user_function                      (VisuBox *box,
                                                            gpointer user_data)      : No Hooks

    Gets emitted when the extension of the box is changed. The new size of the box is not yet computed, listen to VisuBox::SizeChanged instead.

    box :

    the object which received the signal ;

    user_data :

    user data set when the signal handler was connected.

    Since 3.7


    The "SizeChanged" signal

    void                user_function                      (VisuBox *box,
                                                            gfloat   extens,
                                                            gpointer user_data)      : No Hooks

    Gets emitted when the box size is changed (because of box duplication for instance).

    box :

    the object which received the signal ;

    extens :

    the new longuest distance in the box taking into account the extension.

    user_data :

    user data set when the signal handler was connected.

    Since 3.7


    The "UnitChanged" signal

    void                user_function                      (VisuBox *box,
                                                            gfloat   factor,
                                                            gpointer user_data)      : No Hooks

    Gets emitted when the units are changed.

    box :

    the object which received the signal ;

    factor :

    the factor that has been applied.

    user_data :

    user data set when the signal handler was connected.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/VisuData.html0000644000353400050620000037115112216331356017714 00000000000000 VisuData

    VisuData

    VisuData — Give methods to store and manage data from input file(s).

    Synopsis

    struct              VisuData;
    struct              VisuDataClass;
    gboolean            (*VisuDataColorFunc)                (VisuData *visuData,
                                                             float rgba[4],
                                                             VisuElement *ele,
                                                             VisuNode *node);
    float               (*VisuDataScalingFunc)              (VisuData *visuData,
                                                             VisuNode *node);
    void                visu_data_addFile                   (VisuData *data,
                                                             const gchar *file,
                                                             int kind,
                                                             ToolFileFormat *format);
    VisuNode *          visu_data_addNodeFromElement        (VisuData *data,
                                                             VisuElement *ele,
                                                             float xyz[3],
                                                             gboolean reduced,
                                                             gboolean emitSignal);
    VisuNode *          visu_data_addNodeFromElementName    (VisuData *data,
                                                             const gchar *name,
                                                             float xyz[3],
                                                             gboolean reduced,
                                                             gboolean emitSignal);
    VisuNode *          visu_data_addNodeFromIndex          (VisuData *data,
                                                             guint position,
                                                             float xyz[3],
                                                             gboolean reduced,
                                                             gboolean emitSignal);
    guint               visu_data_addTimeout                (VisuData *data,
                                                             guint time,
                                                             GSourceFunc func,
                                                             gpointer user_data);
    GList *             visu_data_class_getAllObjects       (void);
    gboolean            visu_data_constrainedElementInTheBox
                                                            (VisuData *data,
                                                             VisuElement *element);
    gboolean            visu_data_constrainedFree           (VisuData *data);
    gboolean            visu_data_constrainedInTheBox       (VisuData *data);
    gboolean            visu_data_forceXYZtranslation       (VisuData *data,
                                                             float xyz[3]);
    void                visu_data_freePopulation            (VisuData *data);
    gfloat              visu_data_getAllNodeExtens          (VisuData *dataObj,
                                                             VisuBox *box);
    gboolean            visu_data_getChangeElementFlag      (VisuData *data);
    VisuNodeInfo *      visu_data_getDistanceList           (VisuData *data,
                                                             guint nodeId,
                                                             float *minVal);
    const gchar *       visu_data_getFile                   (VisuData *data,
                                                             int kind,
                                                             ToolFileFormat **format);
    gchar *             visu_data_getFileCommentary         (VisuData *data,
                                                             gint iSet);
    gchar *             visu_data_getFilesAsLabel           (const VisuData *data);
    int                 visu_data_getISubset                (VisuData *data);
    int                 visu_data_getNSubset                (VisuData *data);
    gboolean            visu_data_getNodeBoxFromCoord       (VisuData *data,
                                                             float xcart[3],
                                                             int nodeBox[3]);
    gboolean            visu_data_getNodeBoxFromNumber      (VisuData *data,
                                                             guint nodeId,
                                                             int nodeBox[3]);
    void                visu_data_getNodeCoordinates        (VisuData *data,
                                                             VisuNode *node,
                                                             float *x,
                                                             float *y,
                                                             float *z);
    void                visu_data_getNodePosition           (VisuData *data,
                                                             VisuNode *node,
                                                             float coord[3]);
    float               visu_data_getNodeScalingFactor      (VisuData *data,
                                                             VisuNode *node);
    void                visu_data_getNodeUserPosition       (VisuData *data,
                                                             VisuNode *node,
                                                             float coord[3]);
    gboolean            visu_data_getTranslationStatus      (VisuData *data);
    gboolean            visu_data_getUserColor              (VisuData *data,
                                                             VisuElement *ele,
                                                             VisuNode *node,
                                                             float rgba[4]);
    float *             visu_data_getXYZtranslation         (VisuData *data);
    gboolean            visu_data_hasUserColorFunc          (VisuData *data);
    VisuData *          visu_data_new                       (void);
    VisuData *          visu_data_new_withFiles             (const gchar **files);
    void                visu_data_removeAllFiles            (VisuData *data);
    gboolean            visu_data_removeTimeout             (VisuData *data,
                                                             guint timeoutId);
    gboolean            visu_data_reorder                   (VisuData *data,
                                                             VisuData *dataRef);
    gboolean            visu_data_replicate                 (VisuData *data,
                                                             float extension[3]);
    gboolean            visu_data_restore                   (VisuData *data);
    void                visu_data_setChangeElementFlag      (VisuData *data,
                                                             gboolean changeElement);
    void                visu_data_setColorFunc              (VisuData *data,
                                                             VisuDataColorFunc func);
    void                visu_data_setFileCommentary         (VisuData *data,
                                                             gchar *commentary,
                                                             gint iSet);
    void                visu_data_setISubset                (VisuData *data,
                                                             int iSet);
    void                visu_data_setNSubset                (VisuData *data,
                                                             int nSet);
    gboolean            visu_data_setNewBasis               (VisuData *data,
                                                             float matA[3][3],
                                                             float O[3]);
    gboolean            visu_data_setNewBasisFromNodes      (VisuData *data,
                                                             guint nO,
                                                             guint nA,
                                                             guint nB,
                                                             guint nC);
    void                visu_data_setNodeScalingFunc        (VisuData *data,
                                                             VisuDataScalingFunc scaling);
    VisuBox *           visu_data_setTightBox               (VisuData *data);
    gboolean            visu_data_setXYZtranslation         (VisuData *data,
                                                             float xyz[3]);
    

    Object Hierarchy

      GObject
       +----VisuNodeArray
             +----VisuData
    

    Implemented Interfaces

    VisuData implements VisuBoxed.

    Properties

      "totalEnergy"              gdouble               : Read / Write / Construct
    

    Description

    The main goal of V_Sim is to draw lists of elements. For example, when used to render atoms, a box that contains 24 silicon atoms and 46 germanium atoms is a box with two elements (silicon and germanium) where the silicon element has 24 nodes and the germanium element has 46 nodes. This module gives then methods to create nodes (see VisuElement to create and managed elements).

    All nodes are stored in a structure called VisuNodes and VisuNodes is encapsulated in a VisuData for all not-node related information. V_Sim uses one VisuData per input file(s). This structure contains a list of pointers on all the VisuElement used in this file.

    To iterate on nodes, one should use the provided iterators (see VisuNodeArrayIter) methods, like visu_node_array_iter_next().

    Details

    struct VisuData

    struct VisuData;

    Opaque structure for VisuData objects.


    struct VisuDataClass

    struct VisuDataClass {
      VisuNodeArrayClass parent;
    };
    

    A short way to identify _VisuDataClass structure.

    VisuNodeArrayClass parent;

    the parent class.

    VisuDataColorFunc ()

    gboolean            (*VisuDataColorFunc)                (VisuData *visuData,
                                                             float rgba[4],
                                                             VisuElement *ele,
                                                             VisuNode *node);

    This prototype is used to specify an optional method to associate a color with external values to each node.

    visuData :

    a pointer to the calling object ;

    ele :

    a VisuElement ;

    node :

    a VisuNode ;

    rgba :

    an 4 allocated float area to store the return values. [in][array fixed-size=4]

    Returns :

    TRUE if the node should take colour read in rgba.

    VisuDataScalingFunc ()

    float               (*VisuDataScalingFunc)              (VisuData *visuData,
                                                             VisuNode *node);

    Interface for routine that need to rescale node before drawing them.

    visuData :

    a pointer to the calling object ;

    node :

    a VisuNode ;

    Returns :

    the scaling factor.

    visu_data_addFile ()

    void                visu_data_addFile                   (VisuData *data,
                                                             const gchar *file,
                                                             int kind,
                                                             ToolFileFormat *format);

    This method is used to add files of type kind to the data. The file attribute is copied. The format argument can be null.

    data :

    a VisuData object ;

    file :

    a string that points to a file ;

    kind :

    an integer to qualify the file to add ;

    format :

    a file format. [allow-none]

    visu_data_addNodeFromElement ()

    VisuNode *          visu_data_addNodeFromElement        (VisuData *data,
                                                             VisuElement *ele,
                                                             float xyz[3],
                                                             gboolean reduced,
                                                             gboolean emitSignal);

    This method adds a new VisuNode to the specified VisuData. If emitSignal is TRUE, then PopulationIncrease signal is triggered.

    data :

    the VisuData where to add the new VisuNode ;

    ele :

    the VisuElement kind of the new VisuNode ;

    xyz :

    its coordinates ;. [in][array fixed-size=3]

    reduced :

    coordinates are in reduced coordinates ;

    emitSignal :

    a boolean.

    Returns :

    a pointer to the newly created node. [transfer none]

    visu_data_addNodeFromElementName ()

    VisuNode *          visu_data_addNodeFromElementName    (VisuData *data,
                                                             const gchar *name,
                                                             float xyz[3],
                                                             gboolean reduced,
                                                             gboolean emitSignal);

    This method adds a new VisuNode to the specified VisuData. If emitSignal is TRUE, then PopulationIncrease signal is triggered.

    data :

    the VisuData where to add the new VisuNode ;

    name :

    the name of the element ;

    xyz :

    its coordinates ;. [in][array fixed-size=3]

    reduced :

    coordinates are in reduced coordinates ;

    emitSignal :

    a boolean.

    Returns :

    a pointer to the newly created node. [transfer none]

    Since 3.6


    visu_data_addNodeFromIndex ()

    VisuNode *          visu_data_addNodeFromIndex          (VisuData *data,
                                                             guint position,
                                                             float xyz[3],
                                                             gboolean reduced,
                                                             gboolean emitSignal);

    This method adds a new VisuNode to the specified VisuData. Position must be chosen between 0 and (ntype - 1) and corresponds to the position of the array of VisuNodes of a VisuElement. If emitSignal is TRUE, then PopulationIncrease signal is triggered.

    data :

    the VisuData where to add the new VisuNode ;

    position :

    a integer corresponding to the position of a VisuElement in the array **nodes in the structure;

    xyz :

    its coordinates ;. [in][array fixed-size=3]

    reduced :

    coordinates are in reduced coordinates ;

    emitSignal :

    a boolean.

    Returns :

    a pointer to the newly created node. [transfer none]

    visu_data_addTimeout ()

    guint               visu_data_addTimeout                (VisuData *data,
                                                             guint time,
                                                             GSourceFunc func,
                                                             gpointer user_data);

    This method is used to add the func method to be called regularly at the period time. This methos calls in fact g_timeout_add() with the given arguments. But the source id is stored internaly and the timeout function is removed automatically when the object data is destroyed. It is convienient to add a method working on the VisuData object that is called periodically during the life of te object.

    data :

    a valid VisuData object ;

    time :

    the period of call in milliseconds ;

    func :

    the callback function to be called ;. [scope call]

    user_data :

    a pointer to some user defined informations. [closure]

    Returns :

    the source id if the calling method need to work with it. To remove the callback, don't use g_source_remove() but visu_data_removeTimeout() to inform the VisuData object that this source has been removed and not to remove it when the object will be destroyed.

    visu_data_class_getAllObjects ()

    GList *             visu_data_class_getAllObjects       (void);

    This methods is used to retrieve all VisuObject currently allocated in V_Sim. It is usefull to apply some changes on all objects (resources for example).

    Returns :

    a list of V_Sim own VisuData objects. [transfer none][element-type VisuData*]

    visu_data_constrainedElementInTheBox ()

    gboolean            visu_data_constrainedElementInTheBox
                                                            (VisuData *data,
                                                             VisuElement *element);

    Check all the nodes of the specified element and change their coordinates if they are out of the bounding box. The position of each node is the result of the sum of their own position and of the box translation.

    data :

    a VisuData object ;

    element :

    a VisuElement object.

    Returns :

    if returns TRUE, the VisuNodeArray::PositionChanged signal should be emitted.

    visu_data_constrainedFree ()

    gboolean            visu_data_constrainedFree           (VisuData *data);

    Return all the nodes to their original position, except for the global translation.

    data :

    a VisuData object.

    Returns :

    if returns TRUE, the VisuNodeArray::PositionChanged signal should be emitted.

    visu_data_constrainedInTheBox ()

    gboolean            visu_data_constrainedInTheBox       (VisuData *data);

    It does the same things that visu_data_constrainedElementInTheBox() but for all the VisuElement of the given data. I.e. it checks all the nodes and changes their coordinates if they are out of the bounding box. The position of each node is the result of the sum of their own position and of the box translation.

    data :

    a VisuData object.

    Returns :

    if returns TRUE, the VisuNodeArray::PositionChanged signal should be emitted.

    visu_data_forceXYZtranslation ()

    gboolean            visu_data_forceXYZtranslation       (VisuData *data,
                                                             float xyz[3]);

    Apply the given box translation without paying attention to the box boundary conditions. See visu_data_setXYZtranslation() for a method respecting the periodicity.

    data :

    a VisuData object.

    xyz :

    three floats in cartesian representation. [in][array fixed-size=3]

    Returns :

    if returns TRUE, the VisuNodeArray::PositionChanged signal should be emitted.

    Since 3.7


    visu_data_freePopulation ()

    void                visu_data_freePopulation            (VisuData *data);

    This method frees only the allocated memory that deals with the nodes (i.e. everything except the data of the files, the properties and the setColor method.

    data :

    a VisuData to be freed.

    visu_data_getAllNodeExtens ()

    gfloat              visu_data_getAllNodeExtens          (VisuData *dataObj,
                                                             VisuBox *box);

    Calculate the longest distance between the surface of box (without extension) and all the nodes. If box is NULL, then the internal box of dataObj is used.

    dataObj :

    a VisuData object.

    box :

    a VisuBox object. [allow-none]

    Returns :

    the longest distance between the surface of box (without extension) and all the nodes.

    Since 3.7


    visu_data_getChangeElementFlag ()

    gboolean            visu_data_getChangeElementFlag      (VisuData *data);

    V_Sim can use a flag set on data object to know if data has exactly the same VisuElement list than the previously rendered one.

    data :

    a VisuData object.

    Returns :

    TRUE if the previously rendered VisuData object has had the same VisuElement list than the given one, FALSE otherwise.

    visu_data_getDistanceList ()

    VisuNodeInfo *      visu_data_getDistanceList           (VisuData *data,
                                                             guint nodeId,
                                                             float *minVal);

    This routine creates an array of VisuNodeInfo, storing for each node its node id and its distance to nodeId. The periodicity is NOT taken into account. The array is not distance sorted, but if minVal is provided, it will contain the minimal distance between nodeId and the other nodes.

    data :

    a VisuData object ;

    nodeId :

    a node id.

    minVal :

    a location for a float.

    Returns :

    an array of VisuNodeInfo of size the number of nodes. It is terminated by nodeId value itself.

    Since 3.5


    visu_data_getFile ()

    const gchar *       visu_data_getFile                   (VisuData *data,
                                                             int kind,
                                                             ToolFileFormat **format);

    This prototype is used to retrieve stored files identify by their kind.

    data :

    a VisuData object.

    kind :

    an integer to qualify the required file ;

    format :

    a location for a file format (can be NULL).

    Returns :

    the name of a file (it should not be deleted).

    visu_data_getFileCommentary ()

    gchar *             visu_data_getFileCommentary         (VisuData *data,
                                                             gint iSet);

    Get the commentary associated to the given data, for the given node set.

    data :

    a VisuData object ;

    iSet :

    an integer (>= 0).

    Returns :

    a string description (possibly empty). This string is own by V_Sim and should not be freed.

    visu_data_getFilesAsLabel ()

    gchar *             visu_data_getFilesAsLabel           (const VisuData *data);

    Creates a label using the list of files used to defined this data separated by dashes.

    data :

    a VisuData object.

    Returns :

    a newly created string with the filenames. If no filename were used to defined data, the function returns NULL.

    Since 3.6


    visu_data_getISubset ()

    int                 visu_data_getISubset                (VisuData *data);

    Retrieve the id of the current set of data (ordered as in C, beginning at 0).

    data :

    a VisuData object.

    Returns :

    the id of the set of nodes currently loaded, -1 if none.

    visu_data_getNSubset ()

    int                 visu_data_getNSubset                (VisuData *data);

    Retrieve the number of available sets of nodes for this VisuData, see visu_data_setNSubset().

    data :

    a VisuData object.

    Returns :

    the number of set of nodes (1 is default).

    visu_data_getNodeBoxFromCoord ()

    gboolean            visu_data_getNodeBoxFromCoord       (VisuData *data,
                                                             float xcart[3],
                                                             int nodeBox[3]);

    This method retrieves the value of the box associated to the coordinates of the node (with respect to the unit cell).

    data :

    a VisuData object.

    xcart :

    the coordinates of a node. [in][array fixed-size=3]

    nodeBox :

    the array to store the box of the node. [in][array fixed-size=3]

    Returns :

    TRUE if everything went well, FALSE otherwise. The box is stored in the nodeBox array.

    visu_data_getNodeBoxFromNumber ()

    gboolean            visu_data_getNodeBoxFromNumber      (VisuData *data,
                                                             guint nodeId,
                                                             int nodeBox[3]);

    This method retrieves the value of the box associated to a node (with respect to the unit cell).

    data :

    a VisuData object.

    nodeId :

    the index of the node considered.

    nodeBox :

    the array to store the box of the node. [in][array fixed-size=3]

    Returns :

    TRUE if everything went well, FALSE otherwise. The box is stored in the nodeBox array.

    visu_data_getNodeCoordinates ()

    void                visu_data_getNodeCoordinates        (VisuData *data,
                                                             VisuNode *node,
                                                             float *x,
                                                             float *y,
                                                             float *z);

    Wrapper for the function visu_data_getNodePosition() in case of call from python.

    data :

    a VisuData object ;

    node :

    a VisuNode object ;

    x :

    the x coordinate. [out caller-allocates]

    y :

    the y coordinate. [out caller-allocates]

    z :

    the z coordinate. [out caller-allocates]

    Since 3.6


    visu_data_getNodePosition ()

    void                visu_data_getNodePosition           (VisuData *data,
                                                             VisuNode *node,
                                                             float coord[3]);

    Position of nodes are subject to various translations and different transformations. Their coordinates should not be access directly through node.[xyz]. This method is used to retrieve the given node position.

    data :

    a VisuData object ;

    node :

    a VisuNode object ;

    coord :

    an array of 3 floating point values to store the position. [array fixed-size=3][out caller-allocates]

    visu_data_getNodeScalingFactor ()

    float               visu_data_getNodeScalingFactor      (VisuData *data,
                                                             VisuNode *node);

    One can modify the size of a given node using a routine set by visu_data_setNodeScalingFunc(). By default the scaling is 1.

    data :

    a VisuData object.

    node :

    a VisuNode object.

    Returns :

    the scaling factor to be applied to node node.

    Since 3.5


    visu_data_getNodeUserPosition ()

    void                visu_data_getNodeUserPosition       (VisuData *data,
                                                             VisuNode *node,
                                                             float coord[3]);

    This routine is equivalent to visu_data_getNodePosition() except that it's not applying internal box translation for non periodic directions.

    data :

    a VisuData object ;

    node :

    a VisuNode object ;

    coord :

    an array of 3 floating point values to store the position. [array fixed-size=3][out caller-allocates]

    Since 3.7


    visu_data_getTranslationStatus ()

    gboolean            visu_data_getTranslationStatus      (VisuData *data);

    When a translation is applied (even with a [0,0,0] vector), the nodes are shifted to be in the box. This routine returns the translation status of all nodes. If one of them is translated, then return value is TRUE.

    data :

    a VisuData object.

    Returns :

    if one of the nodes is shifted.

    visu_data_getUserColor ()

    gboolean            visu_data_getUserColor              (VisuData *data,
                                                             VisuElement *ele,
                                                             VisuNode *node,
                                                             float rgba[4]);

    If a user defined color has been set (see visu_data_setColorFunc()), then call this method to obtain a color for the given node.

    data :

    a VisuData object ;

    ele :

    a VisuElement object ;

    node :

    a VisuNode object ;

    rgba :

    a location to store the color. [array fixed-size=4]

    Returns :

    TRUE if a user color has been defined.

    Since 3.6


    visu_data_getXYZtranslation ()

    float *             visu_data_getXYZtranslation         (VisuData *data);

    The nodes are rendered at thier coordinates plus a translation. This method allows to retrieve that translation.

    data :

    a VisuData object.

    Returns :

    a newly allocated array of 3 floats. It should be freed with a call to free() after use. [array fixed-size=3][transfer full]

    visu_data_hasUserColorFunc ()

    gboolean            visu_data_hasUserColorFunc          (VisuData *data);

    Test the existence of a user defined colourisation function.

    data :

    a VisuData object.

    Returns :

    TRUE if a user color function has been defined with visu_data_setColorFunc().

    Since 3.6


    visu_data_new ()

    VisuData *          visu_data_new                       (void);

    This creates an empty VisuData object.

    Returns :

    a newly created VisuData object (its ref count is set to 1).

    visu_data_new_withFiles ()

    VisuData *          visu_data_new_withFiles             (const gchar **files);

    This creates an empty VisuData object with filename set to be ready to be loaded.

    files :

    a list of names. [element-type filename][array zero-terminated=1]

    Returns :

    a newly created VisuData object (its ref count is set to 1).

    Since 3.7


    visu_data_removeAllFiles ()

    void                visu_data_removeAllFiles            (VisuData *data);

    This method is used to empty the list of known file from the given data.

    data :

    a VisuData object.

    visu_data_removeTimeout ()

    gboolean            visu_data_removeTimeout             (VisuData *data,
                                                             guint timeoutId);

    This method is used to remove a timeout that has been associated to the given data (see visu_data_addTimeout()).

    data :

    a valid VisuData object ;

    timeoutId :

    a source id.

    Returns :

    TRUE if the source has been found and removed.

    visu_data_reorder ()

    gboolean            visu_data_reorder                   (VisuData *data,
                                                             VisuData *dataRef);

    This routine modifies the node ordering of data using the order in dataRef. The association is done by nearest neigbours conditions.

    data :

    a VisuData object, to reorder.

    dataRef :

    a VisuData object, to take the order from.

    Returns :

    TRUE is the reordering is successfull (i.e. all nodes of data correspond to one of dataRef).

    Since 3.6


    visu_data_replicate ()

    gboolean            visu_data_replicate                 (VisuData *data,
                                                             float extension[3]);

    This routine will create (or remove) nodes to expand the initial box to the required size. An extension of 0 means no extension, i.e. the initial box. The extension is done symmetrically in each direction toward negative and positive direction.

    To remove added nodes, see visu_data_restore().

    data :

    a VisuData object ;

    extension :

    three floating point values ;. [in][array fixed-size=3]

    Returns :

    TRUE if the redraw should be done.

    visu_data_restore ()

    gboolean            visu_data_restore                   (VisuData *data);

    Remove all nodes that have been added by a visu_data_replicate() call.

    data :

    a VisuData object.

    Returns :

    TRUE if some nodes has been indeed removed.

    visu_data_setChangeElementFlag ()

    void                visu_data_setChangeElementFlag      (VisuData *data,
                                                             gboolean changeElement);

    This method is mainly used by internal gears to set a flag. This flag control if the data object has the same VisuElement objects than the previously rendered one.

    data :

    a VisuData object ;

    changeElement :

    a boolean.

    visu_data_setColorFunc ()

    void                visu_data_setColorFunc              (VisuData *data,
                                                             VisuDataColorFunc func);

    This is a little trick to colorized the nodes. It should not be used since it will probably be different in future release.

    data :

    a VisuData object ;

    func :

    a method that colorize the nodes. [scope call]

    visu_data_setFileCommentary ()

    void                visu_data_setFileCommentary         (VisuData *data,
                                                             gchar *commentary,
                                                             gint iSet);

    This method is used to store a description of the given data. This string is copied and commentary can be freed. Before using this method, the number of possible node sets must have been defined using visu_data_setNSubset(), if not, only iSet == 0 is allowed.

    data :

    a VisuData object ;

    commentary :

    the message to be stored (null terminated) ;

    iSet :

    an integer.

    visu_data_setISubset ()

    void                visu_data_setISubset                (VisuData *data,
                                                             int iSet);

    Change the current id of the set of data (ordered as in C, beginning at 0).

    data :

    a VisuData object ;

    iSet :

    an integer.

    visu_data_setNSubset ()

    void                visu_data_setNSubset                (VisuData *data,
                                                             int nSet);

    Change the number of available sets of nodes for this VisuData. This has a side effect to delete all previously saved file commentaries (see visu_data_setFileCommentary()).

    data :

    a VisuData object ;

    nSet :

    an integer.

    visu_data_setNewBasis ()

    gboolean            visu_data_setNewBasis               (VisuData *data,
                                                             float matA[3][3],
                                                             float O[3]);

    Change the basis set of data according to the new definition given by matA and O. Nodes outside the new box are killed. See also visu_data_setNewBasisFromNodes() for a convenient function using nodes as basis set definition.

    data :

    a VisuData object.

    matA :

    a basis set definition.

    O :

    the origin cartesian coordinates.

    Returns :

    TRUE if the new basis set is valid.

    Since 3.6


    visu_data_setNewBasisFromNodes ()

    gboolean            visu_data_setNewBasisFromNodes      (VisuData *data,
                                                             guint nO,
                                                             guint nA,
                                                             guint nB,
                                                             guint nC);

    Change the basis set by providing the new basis set from a list of nodes. See also visu_data_setNewBasis(). Nodes outside the new box are killed.

    data :

    a VisuData object.

    nO :

    the index of node as origin.

    nA :

    the index of node on X axis.

    nB :

    the index of node as Y axis.

    nC :

    the index of node as Z axis.

    Returns :

    TRUE if the new basis set is valid.

    Since 3.6


    visu_data_setNodeScalingFunc ()

    void                visu_data_setNodeScalingFunc        (VisuData *data,
                                                             VisuDataScalingFunc scaling);

    Change the scaling routine when nodes are drawn.

    data :

    a VisuData object ;

    scaling :

    a scaling routine. [scope call]

    Since 3.5


    visu_data_setTightBox ()

    VisuBox *           visu_data_setTightBox               (VisuData *data);

    Calculate the box geometry to have a tight box in directions that are not periodic. If some directions are still periodic, the box size in these directions should be setup first with visu_box_setGeometry().

    data :

    a VisuData object.

    Returns :

    a new VisuBox if data had not one before, or the modified box of data. [transfer none]

    visu_data_setXYZtranslation ()

    gboolean            visu_data_setXYZtranslation         (VisuData *data,
                                                             float xyz[3]);

    This set the translations of the specified VisuData whatever previous values. The translation is done in the orthonormal referential, not the referential of the box.

    data :

    a VisuData object ;

    xyz :

    an array of floating point values. [in][array fixed-size=3]

    Returns :

    if returns TRUE, the VisuNodeArray::PositionChanged signal should be emitted.

    Property Details

    The "totalEnergy" property

      "totalEnergy"              gdouble               : Read / Write / Construct

    Total energy of the system (eV).

    Allowed values: [-G_MAXFLOAT,G_MAXFLOAT]

    Default value: 3.40282e+38

    Signal Details

    The "FilesChanged" signal

    void                user_function                      (VisuData *dataObj,
                                                            guint     arg1,
                                                            gpointer  user_data)      : No Hooks

    Gets emitted when one file of dataObj is set.

    dataObj :

    the object which received the signal ;

    user_data :

    user data set when the signal handler was connected.

    Since 3.7


    The "TranslationsChanged" signal

    void                user_function                      (VisuData *dataObj,
                                                            gpointer  user_data)      : No Hooks

    Gets emitted when translations are changed. At that point, node coordinates are all different, but to update on node positions, it's better to listen to VisuNodeArray::PositionChanged.

    dataObj :

    the object which received the signal ;

    user_data :

    user data set when the signal handler was connected.

    Since 3.7


    The "objectFreed" signal

    void                user_function                      (VisuData *dataObj,
                                                            gpointer  user_data)      : No Hooks

    Gets emitted when the object is been destroyed. All external objects having a reference on this VisuData should clean it.

    dataObj :

    the object which received the signal ;

    user_data :

    user data set when the signal handler was connected.

    Since 3.3

    v_sim-3.7.0/Documentation/reference/html/VisuGlExtAxes.html0000644000353400050620000010362612216331356020707 00000000000000 VisuGlExtAxes

    VisuGlExtAxes

    VisuGlExtAxes — Defines methods to draw axes.

    Object Hierarchy

      GObject
       +----VisuGlExt
             +----VisuGlExtAxes
    

    Description

    The axes are the X, Y and Z lines drawn on the bottom right of the screen defining a given orthogonal basis set in which the box is projected.

    The axis may be different, depending on the rendering method currently used. For instance, when the spin is used, a projection of the colour scheme is added to the simple lines of the basis set. Besides that, axes are defined by their width (see visu_gl_ext_axes_setLineWidth()) and their colour (see visu_gl_ext_axes_setRGB()).

    Details

    VISU_GL_EXT_AXES_ID

    #define VISU_GL_EXT_AXES_ID "Axes"
    

    The id used to identify this extension, see visu_gl_ext_rebuild() for instance.


    struct VisuGlExtAxes

    struct VisuGlExtAxes;

    An opaque structure.

    Since 3.7


    struct VisuGlExtAxesClass

    struct VisuGlExtAxesClass {
      VisuGlExtClass parent;
    };
    

    A short way to identify _VisuGlExtAxesClass structure.

    VisuGlExtClass parent;

    the parent class;

    Since 3.7


    visu_gl_ext_axes_draw ()

    void                visu_gl_ext_axes_draw               (VisuGlExtAxes *axes);

    This method creates a compiled list that draws axes.

    axes :

    the VisuBox object to build axes for.

    visu_gl_ext_axes_getDefault ()

    VisuGlExtAxes *     visu_gl_ext_axes_getDefault         ();

    V_Sim is using a default axes object.

    Returns :

    a VisuGlExtAxes object used by default. [transfer none]

    Since 3.7


    visu_gl_ext_axes_getLineStipple ()

    guint16             visu_gl_ext_axes_getLineStipple     (VisuGlExtAxes *axes);

    Read the line pattern used to draw axes.

    axes :

    the VisuGlExtAxes object to inquire.

    Returns :

    the value of current axes pattern.

    visu_gl_ext_axes_getLineWidth ()

    float               visu_gl_ext_axes_getLineWidth       (VisuGlExtAxes *axes);

    Read the line width used to draw axes.

    axes :

    the VisuGlExtAxes object to inquire.

    Returns :

    the value of current axes width.

    visu_gl_ext_axes_getPosition ()

    void                visu_gl_ext_axes_getPosition        (VisuGlExtAxes *axes,
                                                             float *xpos,
                                                             float *ypos);

    Inquire the position of the representation of tha axes.

    axes :

    the VisuGlExtAxes object to inquire.

    xpos :

    a location to store the x position. [out][allow-none]

    ypos :

    a location to store the y position. [out][allow-none]

    Since 3.7


    visu_gl_ext_axes_getRGB ()

    float *             visu_gl_ext_axes_getRGB             (VisuGlExtAxes *axes);

    Read all the colour components of axes (in [0;1]).

    axes :

    the VisuGlExtAxes object to inquire.

    Returns :

    three RGB values, private from V_Sim, read only. [array fixed-size=3][transfer none]

    visu_gl_ext_axes_new ()

    VisuGlExtAxes *     visu_gl_ext_axes_new                (const gchar *name);

    Creates a new VisuGlExt to draw axes.

    name :

    the name to give to the extension (default is VISU_GL_EXT_AXES_ID). [allow-none]

    Returns :

    a pointer to the VisuGlExt it created or NULL otherwise.

    Since 3.7


    visu_gl_ext_axes_setBasis ()

    gboolean            visu_gl_ext_axes_setBasis           (VisuGlExtAxes *axes,
                                                             double matrix[3][3]);

    The axes can represent an arbitrary basis-set, provided by matrix. matrix[{0,1,2}] represents the {x,y,z} axis vector in a cartesian basis-set. See visu_gl_ext_axes_setBasisFromBox() if the basis-set should follow the one of a given VisuBox.

    axes :

    the VisuGlExtAxes object to modify.

    matrix :

    the definition of the three basis axis.

    Returns :

    TRUE if visu_gl_ext_axes_draw() should be called and then 'OpenGLAskForReDraw' signal be emitted.

    Since 3.7


    visu_gl_ext_axes_setBasisFromBox ()

    gboolean            visu_gl_ext_axes_setBasisFromBox    (VisuGlExtAxes *axes,
                                                             VisuBox *box);

    The axes can follow the basis-set defined by box. If NULL is passed, then the orthorombic default basis-set is used.

    axes :

    the VisuGlExtAxes object to modify.

    box :

    the VisuBox to use as basis-set. [allow-none]

    Returns :

    TRUE if visu_gl_ext_axes_draw() should be called and then 'OpenGLAskForReDraw' signal be emitted.

    Since 3.7


    visu_gl_ext_axes_setGlView ()

    gboolean            visu_gl_ext_axes_setGlView          (VisuGlExtAxes *axes,
                                                             VisuGlView *view);

    Attach axes to view, so it can be rendered there. See visu_gl_ext_axes_draw().

    axes :

    the VisuGlExtAxes object to attached to rendering view.

    view :

    a VisuGlView object. [transfer full][allow-none]

    Returns :

    TRUE if visu_gl_ext_axes_draw() should be called and then 'OpenGLAskForReDraw' signal be emitted.

    Since 3.7


    visu_gl_ext_axes_setLineStipple ()

    gboolean            visu_gl_ext_axes_setLineStipple     (VisuGlExtAxes *axes,
                                                             guint16 stipple);

    Method used to change the value of the parameter axes_line_stipple.

    axes :

    the VisuGlExtAxes object to modify.

    stipple :

    value of the desired pattern.

    Returns :

    TRUE if visu_gl_ext_axes_draw() should be called and then 'OpenGLAskForReDraw' signal be emitted.

    visu_gl_ext_axes_setLineWidth ()

    gboolean            visu_gl_ext_axes_setLineWidth       (VisuGlExtAxes *axes,
                                                             float width);

    Method used to change the value of the parameter axes_line_width.

    axes :

    the VisuGlExtAxes object to modify.

    width :

    value of the desired axe width.

    Returns :

    TRUE if visu_gl_ext_axes_draw() should be called and then 'OpenGLAskForReDraw' signal be emitted.

    visu_gl_ext_axes_setPosition ()

    gboolean            visu_gl_ext_axes_setPosition        (VisuGlExtAxes *axes,
                                                             float xpos,
                                                             float ypos);

    Change the position of the axes representation.

    axes :

    the VisuGlExtAxes object to modify.

    xpos :

    the reduced x position (1 to the right).

    ypos :

    the reduced y position (1 to the bottom).

    Returns :

    TRUE if visu_gl_ext_axes_draw() should be called and then 'OpenGLAskForReDraw' signal be emitted.

    Since 3.7


    visu_gl_ext_axes_setRGB ()

    gboolean            visu_gl_ext_axes_setRGB             (VisuGlExtAxes *axes,
                                                             float rgb[3],
                                                             int mask);

    Method used to change the value of the parameter axes_color.

    axes :

    the VisuGlExtAxes object to modify.

    rgb :

    a three floats array with values (0 <= values <= 1) for the red, the green and the blue color. Only values specified by the mask are really relevant.

    mask :

    use TOOL_COLOR_MASK_R, TOOL_COLOR_MASK_G, TOOL_COLOR_MASK_B, TOOL_COLOR_MASK_RGBA or a combinaison to indicate what values in the rgb array must be taken into account.

    Returns :

    TRUE if visu_gl_ext_axes_draw() should be called and then 'OpenGLAskForReDraw' signal be emitted.
    v_sim-3.7.0/Documentation/reference/html/VisuGlExtBg.html0000644000353400050620000012767412216331356020350 00000000000000 VisuGlExtBg

    VisuGlExtBg

    VisuGlExtBg — Handle the background colour and the fog.

    Object Hierarchy

      GObject
       +----VisuGlExt
             +----VisuGlExtBg
    

    Description

    This module is used to support a background colour and to tune the fog. This last one can be turn on or off and its colour can be either a user defined one or the one of the background. The fog is a linear blending into the fog colour. It starts at a given z position (in the camera basis set) and ends at a lower z.

    Details

    VISU_GL_EXT_BG_ID

    #define VISU_GL_EXT_BG_ID "Background"
    

    The id used to identify this extension, see visu_gl_ext_rebuild() for instance.


    VISU_GL_EXT_FOG_MASK_END

    #define VISU_GL_EXT_FOG_MASK_END (1 << 1)
    

    Value used by the second parameter of setFogStartEndValues() to specified the value that must be changed. This actually changes the fog_end value.


    VISU_GL_EXT_FOG_MASK_START

    #define VISU_GL_EXT_FOG_MASK_START (1 << 0)
    

    Value used by the second parameter of setFogStartEndValues() to specified the value that must be changed. This actually changes the fog_start value.


    struct VisuGlExtBg

    struct VisuGlExtBg;

    An opaque structure.

    Since 3.7


    struct VisuGlExtBgClass

    struct VisuGlExtBgClass {
      VisuGlExtClass parent;
    };
    

    A short way to identify _VisuGlExtBgClass structure.

    VisuGlExtClass parent;

    the parent class;

    Since 3.7


    visu_gl_ext_bg_draw ()

    void                visu_gl_ext_bg_draw                 (VisuGlExtBg *bg);

    Creates the OpenGL lists used by bg (like the background image).

    bg :

    a VisuGlExtBg object.

    Since 3.7


    visu_gl_ext_bg_getDefault ()

    VisuGlExtBg *       visu_gl_ext_bg_getDefault           ();

    V_Sim is using a default bg object.

    Returns :

    a VisuGlExtBg object used by default. [transfer none]

    Since 3.7


    visu_gl_ext_bg_getRGBA ()

    void                visu_gl_ext_bg_getRGBA              (VisuGlExtBg *bg,
                                                             float rgba[4]);

    Read the RGBA value of the specific background colour (in [0;1]).

    bg :

    a VisuGlExtBg object.

    rgba :

    a storage for four values. [array fixed-size=4][out]

    visu_gl_ext_bg_new ()

    VisuGlExtBg *       visu_gl_ext_bg_new                  (const gchar *name);

    Creates a new VisuGlExt to draw bg.

    name :

    the name to give to the extension (default is VISU_GL_EXT_BG_ID). [allow-none]

    Returns :

    a pointer to the VisuGlExt it created or NULL otherwise.

    Since 3.7


    visu_gl_ext_bg_setCamera ()

    gboolean            visu_gl_ext_bg_setCamera            (VisuGlExtBg *bg,
                                                             float zoom,
                                                             float xs,
                                                             float ys);

    If the background image is in follow mode, see visu_gl_ext_bg_setFollowCamera(), this routine is used to update the current camera settings of the background image.

    bg :

    a VisuGlExtBg object.

    zoom :

    a floating point value.

    xs :

    a floating point value.

    ys :

    a floating point value.

    Returns :

    TRUE if the settings are indeed changed.

    Since 3.7


    visu_gl_ext_bg_setFollowCamera ()

    gboolean            visu_gl_ext_bg_setFollowCamera      (VisuGlExtBg *bg,
                                                             gboolean follow,
                                                             float zoomInit,
                                                             float xs,
                                                             float ys);

    When follow is TRUE, the size and the position of the background image is adjusted with every camera change.

    bg :

    a VisuGlExtBg object.

    follow :

    a boolean.

    zoomInit :

    a floating point value.

    xs :

    a floating point value.

    ys :

    a floating point value.

    Returns :

    TRUE if the following status has been changed.

    Since 3.7


    visu_gl_ext_bg_setGlView ()

    gboolean            visu_gl_ext_bg_setGlView            (VisuGlExtBg *bg,
                                                             VisuGlView *view);

    Set the view bg is drawn to. It is necessary if bg has a background image or is using transparency background colour.

    bg :

    a VisuGlExtBg object.

    view :

    a VisuGlView object. [transfer full][allow-none]

    Returns :

    TRUE is view is new.

    Since 3.7


    visu_gl_ext_bg_setImage ()

    void                visu_gl_ext_bg_setImage             (VisuGlExtBg *bg,
                                                             const guchar *imageData,
                                                             guint width,
                                                             guint height,
                                                             gboolean alpha,
                                                             const gchar *title,
                                                             gboolean fit);

    Draw the imageData on the background. The image is scaled to the viewport dimensions, keeping the width/height ratio, if fit is set to TRUE. If title is not NULL, the title is also printed on the background. The image data are copied and can be free after this call.

    bg :

    a VisuGlExtBg object.

    imageData :

    raw image data in RGB or RGBA format ;. [allow-none]

    width :

    the width ;

    height :

    the height ;

    alpha :

    TRUE if the image is RGBA ;

    title :

    an optional title (can be NULL). [allow-none]

    fit :

    a boolean (default is TRUE).

    visu_gl_ext_bg_setRGBA ()

    int                 visu_gl_ext_bg_setRGBA              (VisuGlExtBg *bg,
                                                             float rgba[3],
                                                             int mask);

    Method used to change the value of the parameter background_color.

    bg :

    a VisuGlExtBg object.

    rgba :

    a three floats array with values (0 <= values <= 1) for the red, the green and the blue color. Only values specified by the mask are really relevant.

    mask :

    use TOOL_COLOR_MASK_R, TOOL_COLOR_MASK_G, TOOL_COLOR_MASK_B, TOOL_COLOR_MASK_RGBA or a combinaison to indicate what values in the rgb array must be taken into account.

    Returns :

    TRUE if visu_gl_ext_bg_draw() should be aclled.

    visu_gl_ext_fog_create ()

    void                visu_gl_ext_fog_create              (VisuGlView *view,
                                                             VisuBox *box);

    Call the OpenGL routine to enable and initialise the fog. The fog is created in the not duplicated cell of box.

    view :

    the VisuGlView object the fog apply to.

    box :

    the VisuBox object to delimit the area start and end.

    visu_gl_ext_fog_create_color ()

    void                visu_gl_ext_fog_create_color        ();

    Call the OpenGL routines that change the colour of the fog.


    visu_gl_ext_fog_getEnd ()

    float               visu_gl_ext_fog_getEnd              ();

    Read the ending value of the fog (in [0;1]).

    Returns :

    the position where the fog ends.

    visu_gl_ext_fog_getOn ()

    gboolean            visu_gl_ext_fog_getOn               ();

    Read if fog is used or not.

    Returns :

    TRUE if the fog is rendered, FALSE otherwise.

    visu_gl_ext_fog_getStart ()

    float               visu_gl_ext_fog_getStart            ();

    Read the starting value of the fog (in [0;1]).

    Returns :

    the position where the fog starts.

    visu_gl_ext_fog_getUseSpecificColor ()

    gboolean            visu_gl_ext_fog_getUseSpecificColor ();

    Read if fog uses a specific colour or not.

    Returns :

    TRUE if the fog uses its own color or FALSE if it uses the color of the background.

    visu_gl_ext_fog_getValues ()

    void                visu_gl_ext_fog_getValues           (float rgba[4]);

    Read the RGBA value of the specific fog colour (in [0;1]).

    rgba :

    a storage for four values.

    visu_gl_ext_fog_init ()

    void                visu_gl_ext_fog_init                ();

    It initialises all variables of the OpenGL extension. It creates all resources and parameters introduced by this extension.

    Returns :

    a pointer to the VisuGlExt it created or NULL otherwise.

    visu_gl_ext_fog_setOn ()

    gboolean            visu_gl_ext_fog_setOn               (gboolean value);

    Method used to change the value of the parameter fog_is_on.

    value :

    TRUE if fog must be rendered, FALSE otherwise.

    Returns :

    FALSE if redrawing is not necessary. TRUE if the rendering window must be redrawn.

    visu_gl_ext_fog_setStartEndValues ()

    gboolean            visu_gl_ext_fog_setStartEndValues   (float startEnd[2],
                                                             int mask);

    Method used to change the value of the parameters fog_start and fog_end.

    startEnd :

    a two floats array with values (0 <= values <= 1) for the beging and the ending of the fog position. Only values specified by the mask are really relevant.

    mask :

    use VISU_GL_EXT_FOG_MASK_START, VISU_GL_EXT_FOG_MASK_END to indicate what values in the startEnd array must be taken into account.

    Returns :

    TRUE if visu_gl_ext_fog_create() should be called and then 'OpenGLAskForReDraw' signal be emitted.

    visu_gl_ext_fog_setUseSpecificColor ()

    gboolean            visu_gl_ext_fog_setUseSpecificColor (gboolean value);

    Method used to change the value of the parameter fog_color_is_specific.

    value :

    TRUE if fog is rendered with its own color specified by setFogRGBValues() or FALSE if the fog uses the background color.

    Returns :

    TRUE if visu_gl_ext_fog_create() should be called. In all cases, 'OpenGLAskForReDraw' signal should then be emitted.

    visu_gl_ext_fog_setValues ()

    int                 visu_gl_ext_fog_setValues           (float rgba[4],
                                                             int mask);

    Method used to change the value of the parameter fog_specific_color. This color is actually used only if fog_color_is_specific is set to 1, use setFogColorSpecific() to do that.

    rgba :

    a three floats array with values (0 <= values <= 1) for the red, the green and the blue color. Only values specified by the mask are really relevant.

    mask :

    use TOOL_COLOR_MASK_R, TOOL_COLOR_MASK_G, TOOL_COLOR_MASK_B, TOOL_COLOR_MASK_RGBA or a combinaison to indicate what values in the rgb array must be taken into account.

    Returns :

    0 if redrawing is not necessary. 1 if the rendering window must be redrawn.
    v_sim-3.7.0/Documentation/reference/html/VisuGlExtBoxLegend.html0000644000353400050620000013032012216331356021645 00000000000000 VisuGlExtBoxLegend

    VisuGlExtBoxLegend

    VisuGlExtBoxLegend — Draw a bounding box around nodes.

    Object Hierarchy

      GObject
       +----VisuGlExt
             +----VisuGlExtBox
    
      GObject
       +----VisuGlExt
             +----VisuGlExtFrame
                   +----VisuGlExtBoxLegend
    

    Description

    This extension allows V_Sim to draw a box around the nodes. The box is defined in the VisuBox structure and can be retrieved with visu_box_getGeometry(). This box is not necessary orthogonal.

    It has several properties, namely, its colour, its line width and its line pattern. It is represented in OpenGL with simple lines and is affected by the antialiasing property. Defined resources:

    • box_is_on (boolean): controls if a box is drawn around the rendering area (since 3.0).

    • box_color (RGB in [0;1]): defines the color of the box(since 3.0).

    • box_line_width (integer in [1;10]): defines the width of the lines of the box (since 3.0).

    • box_line_stipple (2 integers in ]0;65535]): dot scheme detail for the lines of the box. The first value is the pattern for the line of the main box and the second is the pattern for the lines of the expanded areas (since 3.4).

    Details

    VISU_GL_EXT_BOX_ID

    #define VISU_GL_EXT_BOX_ID "Box"
    

    The id used to identify this extension, see visu_gl_ext_rebuild() for instance.


    VISU_GL_EXT_BOX_LEGEND_ID

    #define VISU_GL_EXT_BOX_LEGEND_ID "Box legend"
    

    The id used to identify this extension, see visu_gl_ext_rebuild() for instance.


    struct VisuGlExtBox

    struct VisuGlExtBox;

    An opaque structure.

    Since 3.7


    struct VisuGlExtBoxClass

    struct VisuGlExtBoxClass {
      VisuGlExtClass parent;
    };
    

    A short way to identify _VisuGlExtBoxClass structure.

    VisuGlExtClass parent;

    the parent class;

    Since 3.7


    struct VisuGlExtBoxLegend

    struct VisuGlExtBoxLegend;

    An opaque structure.

    Since 3.7


    struct VisuGlExtBoxLegendClass

    struct VisuGlExtBoxLegendClass {
      VisuGlExtFrameClass parent;
    };
    

    A short way to identify _VisuGlExtBoxLegendClass structure.

    VisuGlExtFrameClass parent;

    the parent class;

    Since 3.7


    visu_gl_ext_box_draw ()

    void                visu_gl_ext_box_draw                (VisuGlExtBox *box);

    This method create a compile list that draw a box for the given box.

    box :

    a VisuBox object.

    visu_gl_ext_box_getDefault ()

    VisuGlExtBox *      visu_gl_ext_box_getDefault          ();

    V_Sim is using a default box object.

    Returns :

    a VisuGlExtBox object used by default. [transfer none]

    Since 3.7


    visu_gl_ext_box_getExpandStipple ()

    guint16             visu_gl_ext_box_getExpandStipple    (VisuGlExtBox *box);

    Read the line stipple pattern used for box (expanded part).

    box :

    the VisuGlExtBox to inquire.

    Returns :

    the value of current box line pattern.

    visu_gl_ext_box_getLineStipple ()

    guint16             visu_gl_ext_box_getLineStipple      (VisuGlExtBox *box);

    Read the line stipple pattern used for box (main part).

    box :

    the VisuGlExtBox to inquire.

    Returns :

    the value of current box line pattern.

    visu_gl_ext_box_getLineWidth ()

    float               visu_gl_ext_box_getLineWidth        (VisuGlExtBox *box);

    Read the line width used for box.

    box :

    the VisuGlExtBox to inquire.

    Returns :

    the value of current box line width.

    visu_gl_ext_box_getRGB ()

    float *             visu_gl_ext_box_getRGB              (VisuGlExtBox *box);

    Read the colour components of box (in [0;1]).

    box :

    the VisuGlExtBox to inquire.

    Returns :

    all the colour values of the current box line.

    visu_gl_ext_box_getSideRGB ()

    float *             visu_gl_ext_box_getSideRGB          (VisuGlExtBox *box);

    Read the colour components of the sides of the box (in [0;1]).

    box :

    the VisuGlExtBox to inquire.

    Returns :

    all the colour values of the current box line.

    visu_gl_ext_box_legend_getDefault ()

    VisuGlExtBoxLegend * visu_gl_ext_box_legend_getDefault  ();

    V_Sim is using a default box object.

    Returns :

    a VisuGlExtBoxLegend object used by default. [transfer none]

    Since 3.7


    visu_gl_ext_box_legend_new ()

    VisuGlExtBoxLegend * visu_gl_ext_box_legend_new         (const gchar *name);

    Creates a new VisuGlExt to draw a legend with the box size.

    name :

    the name to give to the extension. [allow-none]

    Returns :

    a pointer to the VisuGlExt it created or NULL otherwise.

    Since 3.7


    visu_gl_ext_box_legend_setBox ()

    gboolean            visu_gl_ext_box_legend_setBox       (VisuGlExtBoxLegend *legend,
                                                             VisuBox *boxObj);

    Attach an VisuGlView to render to and setup the box to get the size of also.

    legend :

    The VisuGlExtBoxLegend to attached to.

    boxObj :

    the box to get the size of.

    Returns :

    TRUE if visu_gl_ext_frame_draw() should be called and then 'OpenGLAskForReDraw' signal be emitted.

    Since 3.7


    visu_gl_ext_box_new ()

    VisuGlExtBox *      visu_gl_ext_box_new                 (const gchar *name);

    Creates a new VisuGlExt to draw a box.

    name :

    the name to give to the extension (default is VISU_GL_EXT_BOX_ID). [allow-none]

    Returns :

    a pointer to the VisuGlExt it created or NULL otherwise.

    Since 3.7


    visu_gl_ext_box_setBasis ()

    gboolean            visu_gl_ext_box_setBasis            (VisuGlExtBox *box,
                                                             float orig[3],
                                                             float mat[3][3]);

    Define the box to draw with a simple matrix basis-set and an origin.

    box :

    the VisuGlExtBox object to attach to.

    orig :

    the origin. [array fixed-size=3]

    mat :

    the basis-set. [array fixed-size=9]

    Returns :

    TRUE if visu_gl_ext_box_draw() should be called.

    Since 3.7


    visu_gl_ext_box_setBox ()

    gboolean            visu_gl_ext_box_setBox              (VisuGlExtBox *box,
                                                             VisuBox *boxObj);

    Attach the VisuBox to draw the frame of.

    box :

    the VisuGlExtBox object to attach to.

    boxObj :

    the box to get the definition of.

    Returns :

    TRUE if visu_gl_ext_box_draw() should be called.

    Since 3.7


    visu_gl_ext_box_setExpandStipple ()

    gboolean            visu_gl_ext_box_setExpandStipple    (VisuGlExtBox *box,
                                                             guint16 stipple);

    Method used to change the value of the parameter box_line_stipple (expanded part).

    box :

    the VisuGlExtBox to update.

    stipple :

    a pattern for line stipple in OpenGL.

    Returns :

    TRUE if visu_gl_ext_box_draw() should be called.

    visu_gl_ext_box_setLineStipple ()

    gboolean            visu_gl_ext_box_setLineStipple      (VisuGlExtBox *box,
                                                             guint16 stipple);

    Method used to change the value of the parameter box_line_stipple (main part).

    box :

    the VisuGlExtBox to update.

    stipple :

    a pattern for line stipple in OpenGL.

    Returns :

    TRUE if visu_gl_ext_box_draw() should be called.

    visu_gl_ext_box_setLineWidth ()

    gboolean            visu_gl_ext_box_setLineWidth        (VisuGlExtBox *box,
                                                             float width);

    Method used to change the value of the parameter box_line_width.

    box :

    the VisuGlExtBox to update.

    width :

    value of the desired box line width.

    Returns :

    TRUE if visu_gl_ext_box_draw() should be called.

    visu_gl_ext_box_setOrigin ()

    gboolean            visu_gl_ext_box_setOrigin           (VisuGlExtBox *box,
                                                             float origin[3]);

    Change the origin of the drawn box. This should be used with care since the OpenGL rendering area is not changed by moving the box, some parts may become unrendered.

    box :

    the VisuGlExtBox to update.

    origin :

    the new origin in cartesian coordinates. [array fixed-size=3]

    Returns :

    TRUE if visu_gl_ext_box_draw() should be called.

    Since 3.7


    visu_gl_ext_box_setRGB ()

    gboolean            visu_gl_ext_box_setRGB              (VisuGlExtBox *box,
                                                             float rgb[3],
                                                             int mask);

    Method used to change the value of the parameter box_color.

    box :

    the VisuGlExtBox to update.

    rgb :

    a three floats array with values (0 <= values <= 1) for the red, the green and the blue color. Only values specified by the mask are really relevant. [array fixed-size=3]

    mask :

    use TOOL_COLOR_MASK_R, TOOL_COLOR_MASK_G, TOOL_COLOR_MASK_B, TOOL_COLOR_MASK_RGBA or a combinaison to indicate what values in the rgb array must be taken into account.

    Returns :

    TRUE if visu_gl_ext_box_draw() should be called.

    visu_gl_ext_box_setSideRGB ()

    gboolean            visu_gl_ext_box_setSideRGB          (VisuGlExtBox *box,
                                                             float rgba[4],
                                                             int mask);

    Change the colour to represent the side of the super-cell. A channel alpha of zero, means that the box is rendered as wire-frame only. The sides are indeed drawn only if the box has expansion.

    box :

    the VisuGlExtBox to update.

    rgba :

    a four floats array with values (0 <= values <= 1) for the red, the green, the blue color and the alpha channel. Only values specified by the mask are really relevant. [array fixed-size=4]

    mask :

    use TOOL_COLOR_MASK_R, TOOL_COLOR_MASK_G, TOOL_COLOR_MASK_B, TOOL_COLOR_MASK_A or a combinaison to indicate what values in the rgba array must be taken into account.

    Returns :

    TRUE if visu_gl_ext_box_draw() should be called.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/VisuGlExtForces.html0000644000353400050620000001700112216331356021217 00000000000000 VisuGlExtForces

    VisuGlExtForces

    VisuGlExtForces — Draw arrows at each node to represent forces.

    Object Hierarchy

      GObject
       +----VisuGlExt
             +----VisuGlExtNodeVectors
                   +----VisuGlExtForces
    

    Description

    A specialised VisuGlExtNodeVectors to represent forces on nodes.

    Details

    struct VisuGlExtForces

    struct VisuGlExtForces;

    An opaque structure.

    Since 3.7


    struct VisuGlExtForcesClass

    struct VisuGlExtForcesClass {
      VisuGlExtNodeVectorsClass parent;
    };
    

    A short way to identify _VisuGlExtForcesClass structure.

    VisuGlExtNodeVectorsClass parent;

    the parent class;

    Since 3.7


    visu_gl_ext_forces_getDefault ()

    VisuGlExtForces *   visu_gl_ext_forces_getDefault       ();

    V_Sim internally uses a default VisuGlExtForces object to represent forces.

    Returns :

    the default VisuGlExtForces object. [transfer none]

    Since 3.7


    visu_gl_ext_forces_new ()

    VisuGlExtForces *   visu_gl_ext_forces_new              (const gchar *name);

    Creates a new VisuGlExt to draw forces.

    name :

    the name to give to the extension. [allow-none]

    Returns :

    a pointer to the VisuGlExt it created or NULL otherwise.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/VisuGlExtFrame.html0000644000353400050620000007134712216331356021045 00000000000000 VisuGlExtFrame

    VisuGlExtFrame

    VisuGlExtFrame — Draw a frame with the representation of a color frame.

    Object Hierarchy

      GObject
       +----VisuGlExt
             +----VisuGlExtFrame
                   +----VisuGlExtBoxLegend
                   +----VisuGlExtLegend
                   +----VisuGlExtShade
    

    Description

    This extension draws a frame on top of the rendering area with a color frame. One can setup printed values and draw additional marks inside the frame.

    Details

    struct VisuGlExtFrame

    struct VisuGlExtFrame;

    An opaque structure.

    Since 3.7


    struct VisuGlExtFrameClass

    struct VisuGlExtFrameClass {
      VisuGlExtClass parent;
    
      void     (*draw)     (VisuGlExtFrame* frame);
    };
    

    A short way to identify _VisuGlExtFrameClass structure.

    VisuGlExtClass parent;

    the parent class;

    draw ()

    the draw method for the content of this frame.

    Since 3.7


    visu_gl_ext_frame_draw ()

    void                visu_gl_ext_frame_draw              (VisuGlExtFrame *frame);

    Render theframe and its child.

    frame :

    a VisuGlExtFrame object.

    Since 3.7


    visu_gl_ext_frame_getPosition ()

    void                visu_gl_ext_frame_getPosition       (VisuGlExtFrame *frame,
                                                             float *xpos,
                                                             float *ypos);

    Inquire the position of the representation of the frame.

    frame :

    the VisuGlExtFrame object to inquire.

    xpos :

    a location to store the x position. [out][allow-none]

    ypos :

    a location to store the y position. [out][allow-none]

    Since 3.7


    visu_gl_ext_frame_getScale ()

    float               visu_gl_ext_frame_getScale          (VisuGlExtFrame *frame);

    Frames are rendered with a scaling factor of 1. by default.

    frame :

    a VisuGlExtFrame object.

    Returns :

    the scaling factor used to represent frames.

    Since 3.7


    visu_gl_ext_frame_setBgRGBA ()

    gboolean            visu_gl_ext_frame_setBgRGBA         (VisuGlExtFrame *frame,
                                                             float rgba[4],
                                                             int mask);

    Change the colour to represent the background of the frame.

    frame :

    the VisuGlExtFrame to update.

    rgba :

    a four floats array with values (0 <= values <= 1) for the red, the green, the blue color and the alpha channel. Only values specified by the mask are really relevant. [array fixed-size=4]

    mask :

    use TOOL_COLOR_MASK_R, TOOL_COLOR_MASK_G, TOOL_COLOR_MASK_B, TOOL_COLOR_MASK_A or a combinaison to indicate what values in the rgba array must be taken into account.

    Returns :

    TRUE if visu_gl_ext_frame_draw() should be called.

    Since 3.7


    visu_gl_ext_frame_setFontRGB ()

    gboolean            visu_gl_ext_frame_setFontRGB        (VisuGlExtFrame *frame,
                                                             float rgb[3],
                                                             int mask);

    Change the colour to represent the font of the frame.

    frame :

    the VisuGlExtFrame to update.

    rgb :

    a four floats array with values (0 <= values <= 1) for the red, the green, the blue color. Only values specified by the mask are really relevant. [array fixed-size=3]

    mask :

    use TOOL_COLOR_MASK_R, TOOL_COLOR_MASK_G, TOOL_COLOR_MASK_B or a combinaison to indicate what values in the rgb array must be taken into account.

    Returns :

    TRUE if visu_gl_ext_frame_draw() should be called.

    Since 3.7


    visu_gl_ext_frame_setGlView ()

    gboolean            visu_gl_ext_frame_setGlView         (VisuGlExtFrame *frame,
                                                             VisuGlView *view);

    Attach an VisuGlView to render to and setup the frame.

    frame :

    The VisuGlExtFrame to attached to.

    view :

    the nodes to get the population of.

    Returns :

    TRUE if visu_gl_ext_frame_draw() should be called and then 'OpenGLAskForReDraw' signal be emitted.

    Since 3.7


    visu_gl_ext_frame_setPosition ()

    gboolean            visu_gl_ext_frame_setPosition       (VisuGlExtFrame *frame,
                                                             float xpos,
                                                             float ypos);

    Change the position of the frame representation.

    frame :

    the VisuGlExtFrame object to modify.

    xpos :

    the reduced y position (1 to the left).

    ypos :

    the reduced y position (1 to the bottom).

    Returns :

    TRUE if visu_gl_ext_frame_draw() should be called and then 'OpenGLAskForReDraw' signal be emitted.

    Since 3.7


    visu_gl_ext_frame_setRequisition ()

    gboolean            visu_gl_ext_frame_setRequisition    (VisuGlExtFrame *frame,
                                                             guint width,
                                                             guint height);

    Set the size of the frame in pixels. Use visu_gl_ext_frame_setScale() to adjust the size if necessary.

    frame :

    the VisuGlExtFrame object to modify.

    width :

    the desired width.

    height :

    the desired height.

    Returns :

    TRUE if visu_gl_ext_frame_draw() should be called and then 'OpenGLAskForReDraw' signal be emitted.

    Since 3.7


    visu_gl_ext_frame_setScale ()

    gboolean            visu_gl_ext_frame_setScale          (VisuGlExtFrame *frame,
                                                             float scale);

    Change the zoom level for the rendering of the legend.

    frame :

    the VisuGlExtFrame to update.

    scale :

    a positive value.

    Returns :

    TRUE if visu_gl_ext_frame_draw() should be called.

    Since 3.7


    visu_gl_ext_frame_setTitle ()

    gboolean            visu_gl_ext_frame_setTitle          (VisuGlExtFrame *frame,
                                                             const gchar *title);

    Change the title of the box legend.

    frame :

    the VisuGlExtFrame object to modify.

    title :

    a title.

    Returns :

    TRUE if visu_gl_ext_frame_draw() should be called and then 'OpenGLAskForReDraw' signal be emitted.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/VisuGlExt.html0000644000353400050620000012422012216331356020057 00000000000000 VisuGlExt

    VisuGlExt

    VisuGlExt — All objects drawn by V_Sim are defined in by a VisuGlExt object

    Properties

      "active"                   gboolean              : Read / Write
      "description"              gchar*                : Read / Write
      "label"                    gchar*                : Read / Write / Construct
      "nGlObj"                   guint                 : Read / Write / Construct Only
      "name"                     gchar*                : Read / Write / Construct Only
      "priority"                 guint                 : Read / Write
      "saveState"                gboolean              : Read / Write
    

    Description

    All objects that are drawn by V_Sim are handled by a VisuGlExt object. Such an object has an OpenGL list. This list is only COMPILED. When V_Sim receives the 'OpenGLAskForReDraw' or the 'OpenGLForceReDraw' signals, each list of all known VisuGlExt are excecuted. This excecution can be canceled if the used flag of the VisuGlExt object is set to FALSE. The order in which the lists are called depends on the priority of the VisuGlExt object. This priority is set to VISU_GL_EXT_PRIORITY_NORMAL as default value, but it can be tune by a call to visu_gl_ext_setPriority(). This priority is an integer, the lower it is, the sooner the list is excecuted.

    The method registerVisuGlExt() is used to declare to V_Sim that there is a new VisuGlExt object available. This allows to create extension when V_Sim is already running. Nevertheless, an extension must be initialized in the initialisation process, it is better to add an initVisuGlExtFunc method in the listInitExtensionFunc array declared in extensions/externalVisuGlExts.h.

    Once again, the OpenGL list corresponding to an OpenGL extension is COMPILE only. Then, OpenGL methods like glIsenabled() are totally unusefull because it is called when the list is compiled not when the list is called. If the extension needs to alter some OpenGL state, such as desable GL_LIGHTING, it needs to set a flag for the extension. With this flag, V_Sim will save the OpenGL states and restore it when the list is called. Use visu_gl_ext_setSaveState() to set this flag.

    Details

    VISU_GL_EXT_PRIORITY_BACKGROUND

    #define VISU_GL_EXT_PRIORITY_BACKGROUND 0
    

    An extension with this priority is drawn first.


    VISU_GL_EXT_PRIORITY_HIGH

    #define VISU_GL_EXT_PRIORITY_HIGH 20
    

    An extension with this priority is drawn after the higher priorities.


    VISU_GL_EXT_PRIORITY_LAST

    #define VISU_GL_EXT_PRIORITY_LAST 100
    

    An extension with this priority is drawn last.


    VISU_GL_EXT_PRIORITY_LOW

    #define VISU_GL_EXT_PRIORITY_LOW 80
    

    An extension with this priority is drawn among last extensions.


    VISU_GL_EXT_PRIORITY_NODES

    #define VISU_GL_EXT_PRIORITY_NODES 2
    

    An extension with this priority is drawn alsmost first with the nodes.


    VISU_GL_EXT_PRIORITY_NODE_DECORATIONS

    #define VISU_GL_EXT_PRIORITY_NODE_DECORATIONS 5
    

    An extension with this priority is drawn just after the nodes.


    VISU_GL_EXT_PRIORITY_NORMAL

    #define VISU_GL_EXT_PRIORITY_NORMAL 50
    

    An extension with this priority is drawn after the higher priorities.


    struct VisuGlExt

    struct VisuGlExt;

    Common name to refer to a _VisuGlExt.


    struct VisuGlExtClass

    struct VisuGlExtClass {
      GObjectClass parent;
    
      void (*rebuild)(VisuGlExt *self);
    
      VisuGlExtClassPrivate *priv;
    };
    

    Common name to refer to a _VisuGlExtClass.

    GObjectClass parent;

    private.

    rebuild ()

    a rebuilding function for this extension.

    VisuGlExtClassPrivate *priv;

    private.

    VisuGlExtClassPrivate

    typedef struct _VisuGlExtClassPrivate VisuGlExtClassPrivate;

    Private data for VisuGlExtClass classes.


    visu_gl_ext_call ()

    void                visu_gl_ext_call                    (VisuGlExt *extension,
                                                             gboolean lastOnly);

    Select the VisuGlExt matching the given name and call it. The call is indeed done only if the extension is used. If lastOnly is TRUE, the list is called only if it has a VISU_GL_EXT_PRIORITY_LAST priority. On the contrary the list is called only if its priority is lower than VISU_GL_EXT_PRIORITY_LAST.

    extension :

    a VisuGlExt object.

    lastOnly :

    a boolean.

    visu_gl_ext_getActive ()

    gboolean            visu_gl_ext_getActive               (VisuGlExt *extension);

    Get if the extension is used or not. If not its ObjectList is not rendered.

    extension :

    the extension.

    Returns :

    TRUE if used, FALSE otherwise.

    visu_gl_ext_getAll ()

    GList *             visu_gl_ext_getAll                  (void);

    This method is used to get the list of all registered VisuGlExt. This list is own by V_Sim and should not be freed.

    Returns :

    the list of all VisuGlExt. [element-type VisuGlExt*][transfer none]

    visu_gl_ext_getFromName ()

    VisuGlExt *         visu_gl_ext_getFromName             (const char *name);

    VisuGlExt objects are identified by an id.

    name :

    a string identifying a VisuGlExt object.

    Returns :

    a VisuGlExt object matching name. [transfer none]

    Since 3.7


    visu_gl_ext_getGlList ()

    guint               visu_gl_ext_getGlList               (VisuGlExt *extension);

    All VisuGlExt objects have a master OpenGL list to draw to. This routine gets the identifier of this list.

    extension :

    a VisuGlExt method.

    Returns :

    an OpenGL identifier id for extension.

    Since 3.7


    visu_gl_ext_getPreferedRenderingMode ()

    VisuGlRenderingMode visu_gl_ext_getPreferedRenderingMode
                                                            (VisuGlExt *extension);

    Each VisuGlExt method can draw in a mode different from the global one, see VisuGlRenderingMode. See also visu_gl_ext_setPreferedRenderingMode().

    extension :

    a VisuGlExt method.

    Returns :

    the prefered rendering mode of this extension.

    Since 3.7


    visu_gl_ext_getSensitiveToRenderingMode ()

    gboolean            visu_gl_ext_getSensitiveToRenderingMode
                                                            (VisuGlExt *extension);

    Each VisuGlExt method can follow or not the global setting for the rendering mode, see VisuGlRenderingMode. See also visu_gl_ext_setSensitiveToRenderingMode().

    extension :

    a VisuGlExt object.

    Returns :

    TRUE if extension can change its rendering mode according to global settings.

    Since 3.7


    visu_gl_ext_rebuild ()

    void                visu_gl_ext_rebuild                 (VisuGlExt *self);

    This routine does not sort the extension on their priority and should be used only to draw some selected extensions. To draw all of them, use visu_gl_ext_rebuildAll() instead.

    self :

    a VisuGlExt object.

    visu_gl_ext_rebuildAll ()

    void                visu_gl_ext_rebuildAll              (void);

    For each registered extension that has a valid rebuild method, it calls it.


    visu_gl_ext_setActive ()

    gboolean            visu_gl_ext_setActive               (VisuGlExt *extension,
                                                             gboolean value);

    Set if an extension is actually used or not.

    extension :

    the extension,

    value :

    the new value.

    visu_gl_ext_setPreferedRenderingMode ()

    gboolean            visu_gl_ext_setPreferedRenderingMode
                                                            (VisuGlExt *extension,
                                                             VisuGlRenderingMode value);

    This method is used to specify the rendering mode that the extension should use to be drawn (if the sensitive flag has been set, see visu_gl_ext_setSensitiveToRenderingMode()). If the value is set to VISU_GL_RENDERING_FOLLOW, the extension follows the global setting for rendering mode.

    extension :

    a VisuGlExt object ;

    value :

    see VisuGlRenderingMode to choose one.

    Returns :

    TRUE if the "OpenGLAskForReDraw" should be emitted.

    visu_gl_ext_setPriority ()

    void                visu_gl_ext_setPriority             (VisuGlExt *extension,
                                                             guint priority);

    Extentions are drawn in an order that depends on their priority. The lower is the number, the sooner the extension is drawn. Flags, such as VISU_GL_EXT_PRIORITY_NORMAL or VISU_GL_EXT_PRIORITY_LOW, can be used or user defined values are also possible.

    extension :

    a VisuGlExt object ;

    priority :

    an integer value.

    visu_gl_ext_setSaveState ()

    void                visu_gl_ext_setSaveState            (VisuGlExt *extension,
                                                             gboolean saveState);

    If the extension needs to change some OpenGL state (to disable the fog for example, or the cullface), a flag should be set to enable V_Sim to restore the right values after the extensio have been called. Because the OpenGL list of an extension is just GL_COMPILE the extension can't just save and restore state itself because when the list is called, the state can have been changed.

    extension :

    a VisuGlExt object ;

    saveState :

    an boolean value.

    visu_gl_ext_setSensitiveToRenderingMode ()

    void                visu_gl_ext_setSensitiveToRenderingMode
                                                            (VisuGlExt *extension,
                                                             gboolean status);

    If status is TRUE, when the extension is rendered, OpenGL context is switched to the rendering mode preferd for the extension. Use visu_gl_ext_setPreferedRenderingMode() to choose one.

    extension :

    a VisuGlExt object ;

    status :

    an boolean value.

    Property Details

    The "active" property

      "active"                   gboolean              : Read / Write

    extension is used or not.

    Default value: FALSE


    The "description" property

      "description"              gchar*                : Read / Write

    description of extension.

    Default value: ""


    The "label" property

      "label"                    gchar*                : Read / Write / Construct

    label (translated) of extension.

    Default value: ""


    The "nGlObj" property

      "nGlObj"                   guint                 : Read / Write / Construct Only

    number of GL lists dealt with.

    Allowed values: [1,2048]

    Default value: 1


    The "name" property

      "name"                     gchar*                : Read / Write / Construct Only

    name (id) of extension.

    Default value: ""


    The "priority" property

      "priority"                 guint                 : Read / Write

    drawing priority of extension.

    Allowed values: <= 100

    Default value: 50


    The "saveState" property

      "saveState"                gboolean              : Read / Write

    save OpenGL state.

    Default value: FALSE

    v_sim-3.7.0/Documentation/reference/html/VisuGlExtInfos.html0000644000353400050620000006077212216331356021071 00000000000000 VisuGlExtInfos

    VisuGlExtInfos

    VisuGlExtInfos — give the capability to draw some information near each node.

    Object Hierarchy

      GObject
       +----VisuGlExt
             +----VisuGlExtInfos
    

    Description

    This part is used to draw some information near the nodes. This information can be the one of a VisuNodeProperty or something else. When read from a VisuNodeProperty, just giving the name will produce the right output. In other cases a print routine must be given.

    Details

    VISU_GL_EXT_INFOS_ID

    #define VISU_GL_EXT_INFOS_ID "Node information"
    

    The id used to identify this extension, see visu_gl_ext_rebuild() for instance.


    struct VisuGlExtInfos

    struct VisuGlExtInfos;

    An opaque structure.

    Since 3.7


    struct VisuGlExtInfosClass

    struct VisuGlExtInfosClass {
      VisuGlExtClass parent;
    };
    

    A short way to identify _VisuGlExtInfosClass structure.

    VisuGlExtClass parent;

    the parent class;

    Since 3.7


    enum VisuGlExtInfosDrawId

    typedef enum {
        DRAW_NEVER,
        DRAW_SELECTED,
        DRAW_ALWAYS
    } VisuGlExtInfosDrawId;
    

    This enum represents the possibilities for the information drawing.

    DRAW_NEVER

    don't draw any information on nodes ;

    DRAW_SELECTED

    draw information only on a list of nodes ;

    DRAW_ALWAYS

    draw information on all nodes.

    enum VisuGlExtInfosDrawMethod

    typedef enum {
        EXT_DRAW_METH_NONE,
        EXT_DRAW_METH_ID,
        EXT_DRAW_METH_TYPE,
        EXT_DRAW_METH_OTHER
    } VisuGlExtInfosDrawMethod;
    

    This enum represents the method for information drawing.

    EXT_DRAW_METH_NONE

    draw nothing ;

    EXT_DRAW_METH_ID

    draw the id of nodes ;

    EXT_DRAW_METH_TYPE

    draw the name of node element ;

    EXT_DRAW_METH_OTHER

    other possible draw rendering method.

    visu_gl_ext_infos_draw ()

    void                visu_gl_ext_infos_draw              (VisuGlExtInfos *infos);

    Compile the list representing information displayed on nodes.

    infos :

    a VisuGlExtInfos object.

    Since 3.7


    visu_gl_ext_infos_drawData ()

    gboolean            visu_gl_ext_infos_drawData          (VisuGlExtInfos *infos,
                                                             VisuDataNode *dataNode,
                                                             int *nodes);

    As visu_gl_ext_infos_drawIds(), but draw some informations instead of their numbers. The informations are defined by the dataNode argument.

    infos :

    the VisuGlExtInfos object to update.

    dataNode :

    a VisuDataNode object ;

    nodes :

    an integer list, terminated with a negative number. [array zero-terminated=1][transfer full]

    Returns :

    TRUE if a call to visu_gl_ext_infos_draw() is needed.

    visu_gl_ext_infos_drawElements ()

    gboolean            visu_gl_ext_infos_drawElements      (VisuGlExtInfos *infos,
                                                             int *nodes);

    As visu_gl_ext_infos_drawIds(), but draw the names of elements instead of their numbers.

    infos :

    the VisuGlExtInfos object to update.

    nodes :

    an integer list, terminated with a negative number. [array zero-terminated=1][transfer full]

    Returns :

    TRUE if a call to visu_gl_ext_infos_draw() is needed.

    visu_gl_ext_infos_drawIds ()

    gboolean            visu_gl_ext_infos_drawIds           (VisuGlExtInfos *infos,
                                                             int *nodes);

    With this extension, some the number of nodes will be drawn on them. Numbers can be drawn and all nodes (set nodes to a NULL pointer), or to a restricted list of nodes represented by their numbers. In this case, nodes can have whatever length but must be terminated by a negative integer. This array is then owned by the extension and should not be freed.

    infos :

    the VisuGlExtInfos object to update.

    nodes :

    an integer list, terminated with a negative number. [array zero-terminated=1][transfer full]

    Returns :

    TRUE if a call to visu_gl_ext_infos_draw() is needed.

    visu_gl_ext_infos_getDefault ()

    VisuGlExtInfos *    visu_gl_ext_infos_getDefault        ();

    V_Sim is using a default infos object.

    Returns :

    a VisuGlExtInfos object used by default. [transfer none]

    Since 3.7


    visu_gl_ext_infos_new ()

    VisuGlExtInfos *    visu_gl_ext_infos_new               (const gchar *name);

    Create a new VisuGlExt to represent information on nodes.

    name :

    the name of the VisuGlExt. [allow-none]

    Returns :

    a new VisuGlExtInfos object.

    Since 3.7


    visu_gl_ext_infos_setData ()

    gboolean            visu_gl_ext_infos_setData           (VisuGlExtInfos *infos,
                                                             VisuData *data);

    Attach an VisuData to render to and setup the infos.

    infos :

    The VisuGlExtInfos to attached to.

    data :

    the nodes to get the population of.

    Returns :

    TRUE if visu_gl_ext_infos_draw() should be called and then 'OpenGLAskForReDraw' signal be emitted.

    Since 3.7


    visu_gl_ext_infos_setGlView ()

    gboolean            visu_gl_ext_infos_setGlView         (VisuGlExtInfos *infos,
                                                             VisuGlView *view);

    Attach an VisuGlView to render to and setup the infos.

    infos :

    The VisuGlExtInfos to attached to.

    view :

    the nodes to get the population of.

    Returns :

    TRUE if visu_gl_ext_infos_draw() should be called and then 'OpenGLAskForReDraw' signal be emitted.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/VisuGlExtLegend.html0000644000353400050620000002562112216331356021203 00000000000000 VisuGlExtLegend

    VisuGlExtLegend

    VisuGlExtLegend — Draw a frame with the representation of each atom species, its name and the number of elements.

    Object Hierarchy

      GObject
       +----VisuGlExt
             +----VisuGlExtFrame
                   +----VisuGlExtLegend
    

    Description

    This extension draws a frame on top of the rendering area with an item per VisuElement currently rendered. For each VisuElement, a small representation of its OpenGL shape is drawn, its label is printed and the number of VisuNode associated to this element.

    This extension defines one resource entry labeled "legend_is_on" to control if the legend is printed or not.

    Details

    VISU_GL_EXT_LEGEND_ID

    #define VISU_GL_EXT_LEGEND_ID "Legend"
    

    The id used to identify this extension, see visu_gl_ext_rebuild() for instance.


    struct VisuGlExtLegend

    struct VisuGlExtLegend;

    An opaque structure.

    Since 3.7


    struct VisuGlExtLegendClass

    struct VisuGlExtLegendClass {
      VisuGlExtFrameClass parent;
    };
    

    A short way to identify _VisuGlExtLegendClass structure.

    VisuGlExtFrameClass parent;

    the parent class;

    Since 3.7


    visu_gl_ext_legend_getDefault ()

    VisuGlExtLegend *   visu_gl_ext_legend_getDefault       ();

    V_Sim is using a default legend object.

    Returns :

    a VisuGlExtLegend object used by default. [transfer none]

    Since 3.7


    visu_gl_ext_legend_new ()

    VisuGlExtLegend *   visu_gl_ext_legend_new              (const gchar *name);

    Creates a new VisuGlExt to draw a legend.

    name :

    the name to give to the extension (default is VISU_GL_EXT_LEGEND_ID). [allow-none]

    Returns :

    a pointer to the VisuGlExt it created or NULL otherwise.

    Since 3.7


    visu_gl_ext_legend_setNodes ()

    gboolean            visu_gl_ext_legend_setNodes         (VisuGlExtLegend *legend,
                                                             VisuNodeArray *nodes);

    Attach an VisuGlView to render to and setup the legend to get the node population also.

    legend :

    The VisuGlExtLegend to attached to.

    nodes :

    the nodes to get the population of.

    Returns :

    TRUE if visu_gl_ext_frame_draw() should be called and then 'OpenGLAskForReDraw' signal be emitted.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/VisuGlExtMaps.html0000644000353400050620000010066712216331356020711 00000000000000 VisuGlExtMaps

    VisuGlExtMaps

    VisuGlExtMaps — Defines methods to draw maps.

    Object Hierarchy

      GObject
       +----VisuGlExt
             +----VisuGlExtMaps
    

    Description

    Maps are coloured representation of a VisuScalarField on a VisuPlane.

    Details

    VISU_GL_EXT_MAPS_ID

    #define VISU_GL_EXT_MAPS_ID "Maps"
    

    The id used to identify this extension, see visu_gl_ext_rebuild() for instance.


    struct VisuGlExtMaps

    struct VisuGlExtMaps;

    An opaque structure.

    Since 3.7


    struct VisuGlExtMapsClass

    struct VisuGlExtMapsClass {
      VisuGlExtFrameClass parent;
    };
    

    A short way to identify _VisuGlExtMapsClass structure.

    VisuGlExtFrameClass parent;

    the parent class;

    Since 3.7


    visu_gl_ext_maps_add ()

    gboolean            visu_gl_ext_maps_add                (VisuGlExtMaps *maps,
                                                             VisuMap *map,
                                                             float prec,
                                                             ToolShade *shade,
                                                             ToolColor *color,
                                                             gboolean alpha);

    Add a new map to the list of drawn maps. If color is NULL, then iso-lines will be drawn in inverse color.

    maps :

    a VisuGlExtMaps object.

    map :

    a VisuMaps object. [transfer full]

    prec :

    rendering adaptivity level (default is 100).

    shade :

    a ToolShade object. [transfer full]

    color :

    a ToolColor object. [transfer full][allow-none]

    alpha :

    a boolean.

    Returns :

    FALSE if surf was already reguistered.

    Since 3.7


    visu_gl_ext_maps_draw ()

    void                visu_gl_ext_maps_draw               (VisuGlExtMaps *maps);

    Render the OpenGL list of maps.

    maps :

    a VisuGlExtMaps object.

    Since 3.7


    visu_gl_ext_maps_new ()

    VisuGlExtMaps *     visu_gl_ext_maps_new                (const gchar *name);

    Creates a new VisuGlExt to draw maps.

    name :

    the name to give to the extension (default is VISU_GL_EXT_MAPS_ID). [allow-none]

    Returns :

    a pointer to the VisuGlExt it created or NULL otherwise.

    Since 3.7


    visu_gl_ext_maps_remove ()

    gboolean            visu_gl_ext_maps_remove             (VisuGlExtMaps *maps,
                                                             VisuMap *map);

    Removes map from the list of drawn maps.

    maps :

    a VisuGlExtMaps object.

    map :

    a VisuMaps object.

    Returns :

    TRUE if visu_gl_ext_maps_draw(à should be called.

    Since 3.7


    visu_gl_ext_maps_setDirty ()

    gboolean            visu_gl_ext_maps_setDirty           (VisuGlExtMaps *maps,
                                                             VisuMap *map);

    Currently, VisuMap are not objects, so maps cannot react to a change on them. Callers have to set by hand that maps should be redrawn with this routine.

    maps :

    a VisuGlExtMaps object.

    map :

    a VisuMap object.

    Returns :

    TRUE is map is a drawn VisuMap of maps.

    Since 3.7


    visu_gl_ext_maps_setGlView ()

    gboolean            visu_gl_ext_maps_setGlView          (VisuGlExtMaps *maps,
                                                             VisuGlView *view);

    Attach maps to view, so it can be rendered there. See visu_gl_ext_maps_draw().

    maps :

    the VisuGlExtMaps object to attached to rendering view.

    view :

    a VisuGlView object. [transfer full][allow-none]

    Returns :

    TRUE if visu_gl_ext_maps_draw() should be called and then 'OpenGLAskForReDraw' signal be emitted.

    Since 3.7


    visu_gl_ext_maps_setLineColor ()

    gboolean            visu_gl_ext_maps_setLineColor       (VisuGlExtMaps *maps,
                                                             VisuMap *map,
                                                             ToolColor *color);

    Changes the rendered isoline color of map to color. If color is NULL, then the isolines will be color inversed to the ToolShade of map (see visu_gl_ext_maps_setShade()).

    maps :

    a VisuGlExtMaps object.

    map :

    a VisuMap object.

    color :

    a ToolColor object. [allow-none][transfer full]

    Returns :

    TRUE if color of map is changed.

    Since 3.7


    visu_gl_ext_maps_setPrecision ()

    gboolean            visu_gl_ext_maps_setPrecision       (VisuGlExtMaps *maps,
                                                             VisuMap *map,
                                                             float prec);

    Changes the adaptative mesh of map. At a value of 200, there is no adaptivity and all triangles are rendered. At a level of 100, a variation of less than 3% on neighbouring triangles make them merged.

    maps :

    a VisuGlExtMaps object.

    map :

    a VisuMap object.

    prec :

    a floating point value (default is 100).

    Returns :

    TRUE if prec of map is changed.

    Since 3.7


    visu_gl_ext_maps_setShade ()

    gboolean            visu_gl_ext_maps_setShade           (VisuGlExtMaps *maps,
                                                             VisuMap *map,
                                                             ToolShade *shade);

    Changes the ToolShade used to render data variation on the map.

    maps :

    a VisuGlExtMaps object.

    map :

    a VisuMap object.

    shade :

    a ToolShade object. [allow-none][transfer full]

    Returns :

    TRUE if shade of map is changed.

    Since 3.7


    visu_gl_ext_maps_setTransparent ()

    gboolean            visu_gl_ext_maps_setTransparent     (VisuGlExtMaps *maps,
                                                             VisuMap *map,
                                                             gboolean alpha);

    Sets if map is rendered with transparency or not. If alpha is TRUE, the lower the rendered value is, the more transparent the colour will be.

    maps :

    a VisuGlExtMaps object.

    map :

    a VisuMap object.

    alpha :

    a boolean.

    Returns :

    TRUE if transparency of map is changed.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/VisuGlExtNodes.html0000644000353400050620000006122312216331356021053 00000000000000 VisuGlExtNodes

    VisuGlExtNodes

    VisuGlExtNodes — Defines methods to draw a set of nodes.

    Object Hierarchy

      GObject
       +----VisuGlExt
             +----VisuGlExtNodes
    

    Description

    Details

    struct VisuGlExtNodes

    struct VisuGlExtNodes;

    An opaque structure.

    Since 3.7


    struct VisuGlExtNodesClass

    struct VisuGlExtNodesClass {
      VisuGlExtClass parent;
    };
    

    A short way to identify _VisuGlExtNodesClass structure.

    VisuGlExtClass parent;

    the parent class;

    Since 3.7


    enum VisuGlExtNodesEffects

    typedef enum {
        VISU_GL_EXT_NODES_NO_EFFECT,
        VISU_GL_EXT_NODES_DESATURATE,
        VISU_GL_EXT_NODES_SATURATE,
        VISU_GL_EXT_NODES_DARKEN,
        VISU_GL_EXT_NODES_LIGHTEN,
        VISU_GL_EXT_NODES_FLATTEN_DARK,
        VISU_GL_EXT_NODES_FLATTEN,
        VISU_GL_EXT_NODES_FLATTEN_LIGHT
    } VisuGlExtNodesEffects;
    

    The rendering done by VisuGlExtNodes can alter the color and material of rendered nodes.

    VISU_GL_EXT_NODES_NO_EFFECT

    no effect (apply pristine element color and material).

    VISU_GL_EXT_NODES_DESATURATE

    desaturate colour.

    VISU_GL_EXT_NODES_SATURATE

    saturate colour.

    VISU_GL_EXT_NODES_DARKEN

    darken colour.

    VISU_GL_EXT_NODES_LIGHTEN

    lighten colour.

    VISU_GL_EXT_NODES_FLATTEN_DARK

    render darker without light efect.

    VISU_GL_EXT_NODES_FLATTEN

    render without light efect.

    VISU_GL_EXT_NODES_FLATTEN_LIGHT

    render lighter without light efect.

    Since 3.7


    visu_gl_ext_nodes_draw ()

    void                visu_gl_ext_nodes_draw              (VisuGlExtNodes *nodes);

    Create the OpenGL list that store nodes.

    nodes :

    a VisuGlExtNodes object.

    Since 3.7


    visu_gl_ext_nodes_getData ()

    VisuData *          visu_gl_ext_nodes_getData           (VisuGlExtNodes *nodes);

    Retrieves the associated VisuData of nodes.

    nodes :

    a VisuGlExtNodes object.

    Returns :

    a VisuData object. [transfer none]

    Since 3.7


    visu_gl_ext_nodes_getSelection ()

    int                 visu_gl_ext_nodes_getSelection      (VisuGlExtNodes *ext,
                                                             VisuGlView *view,
                                                             int x,
                                                             int y);

    Get the id of a VisuNode on top of the z-buffer.

    ext :

    a VisuGlExtNodes object;

    view :

    a VisuGlView object;

    x :

    a window coordinate;

    y :

    a window coordinate.

    Returns :

    -1 if no node found, or its id.

    Since 3.7


    visu_gl_ext_nodes_getSelectionByRegion ()

    GList *             visu_gl_ext_nodes_getSelectionByRegion
                                                            (VisuGlExtNodes *ext,
                                                             VisuGlView *view,
                                                             int x1,
                                                             int y1,
                                                             int x2,
                                                             int y2);

    Get the VisuNode ids in the picked region defined by (x1, y1) - (x2, y2).

    ext :

    a VisuGlExtNodes object;

    view :

    a VisuGlView object;

    x1 :

    a window coordinate;

    y1 :

    a window coordinate;

    x2 :

    a window coordinate;

    y2 :

    a window coordinate.

    Returns :

    an empty list if no node found, or a newly created list of ids if any. [transfer full][element-type guint]

    Since 3.7


    visu_gl_ext_nodes_new ()

    VisuGlExtNodes *    visu_gl_ext_nodes_new               ();

    Creates a new VisuGlExt to draw a set of nodes. It can be used also for picking, see visu_gl_ext_nodes_getSelection().

    Returns :

    a pointer to the VisuGlExt it created or NULL otherwise.

    Since 3.7


    visu_gl_ext_nodes_setData ()

    void                visu_gl_ext_nodes_setData           (VisuGlExtNodes *nodes,
                                                             VisuGlView *view,
                                                             VisuData *dataObj);

    This setup nodes to render nodes of dataObj on view. Any changes on dataObj nodes will be automatically updated on the GL lists representing the nodes.

    nodes :

    the VisuGlExtNodes object that will render dataObj nodes.

    view :

    the VisuGlView to render to.

    dataObj :

    the nodes.

    Since 3.7


    visu_gl_ext_nodes_setMaterialEffect ()

    gboolean            visu_gl_ext_nodes_setMaterialEffect (VisuGlExtNodes *nodes,
                                                             VisuGlExtNodesEffects effect);

    Changes the effect applied on the color used to render VisuElement.

    nodes :

    a VisuGlExtNodes object.

    effect :

    a VisuGlExtNodesEffects id.

    Returns :

    TRUE if the effect has been changed.

    Since 3.7


    visu_gl_ext_nodes_setRendering ()

    void                visu_gl_ext_nodes_setRendering      (VisuGlExtNodes *nodes,
                                                             VisuRendering *method);

    Provide rendering method for nodes and elements.

    nodes :

    a VisuGlExtNodes object.

    method :

    a VisuRendering method. [transfer full][allow-none]

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/VisuGlExtNodeVectors.html0000644000353400050620000012016212216331356022234 00000000000000 VisuGlExtNodeVectors

    VisuGlExtNodeVectors

    VisuGlExtNodeVectors — Draw arrows at each node to represent forces, displacements, vibrations...

    Object Hierarchy

      GObject
       +----VisuGlExt
             +----VisuGlExtNodeVectors
                   +----VisuGlExtForces
    

    Properties

      "propId"                   gchar*                : Read / Write / Construct Only
    

    Description

    A generic VisuGlExt to represent vectors on nodes.

    Details

    struct VisuGlExtNodeVectors

    struct VisuGlExtNodeVectors;

    An opaque structure.

    Since 3.7


    struct VisuGlExtNodeVectorsClass

    struct VisuGlExtNodeVectorsClass {
      VisuGlExtClass parent;
    };
    

    A short way to identify _VisuGlExtNodeVectorsClass structure.

    VisuGlExtClass parent;

    the parent class;

    Since 3.7


    visu_gl_ext_geodiff_getDefault ()

    VisuGlExtNodeVectors * visu_gl_ext_geodiff_getDefault   ();

    V_Sim has a private internal VisuGlExtNodeVectors object to represent geometry differences.

    Returns :

    the default VisuGlExtNodeVectors object used for geometry differences. [transfer none]

    Since 3.7


    visu_gl_ext_node_vectors_draw ()

    void                visu_gl_ext_node_vectors_draw       (VisuGlExtNodeVectors *vect);

    Compile the OpenGL list that draw arrows on nodes.

    vect :

    a VisuGlExtNodeVectors object.

    Since 3.7


    visu_gl_ext_node_vectors_getData ()

    VisuData *          visu_gl_ext_node_vectors_getData    (VisuGlExtNodeVectors *vect);

    Retrieves associated VisuData, if any.

    vect :

    a VisuGlExtNodeVectors object.

    Returns :

    a VisuData object. [transfer none]

    Since 3.7


    visu_gl_ext_node_vectors_getNormalisation ()

    float               visu_gl_ext_node_vectors_getNormalisation
                                                            (VisuGlExtNodeVectors *vect);

    Gets the normalisation factor, see visu_gl_ext_node_vectors_setNormalisation().

    vect :

    the VisuGlExtNodeVectors object to inquire.

    Returns :

    the normalisation factor used by vact.

    Since 3.7


    visu_gl_ext_node_vectors_new ()

    VisuGlExtNodeVectors * visu_gl_ext_node_vectors_new     (const gchar *name,
                                                             const gchar *propId);

    Creates a new VisuGlExt to draw a box.

    name :

    the name to give to the extension. [allow-none]

    propId :

    the name of the VisuNodeProperty that stores the vector representation.

    Returns :

    a pointer to the VisuGlExt it created or NULL otherwise.

    Since 3.7


    visu_gl_ext_node_vectors_setArrow ()

    gboolean            visu_gl_ext_node_vectors_setArrow   (VisuGlExtNodeVectors *vect,
                                                             float tailLength,
                                                             float tailRadius,
                                                             guint tailN,
                                                             float headLength,
                                                             float headRadius,
                                                             guint headN);

    Defines the profile of the arrows representing the vectors.

    vect :

    the VisuGlExtNodeVectors object to modify.

    tailLength :

    the length for the tail part of the vector.

    tailRadius :

    the radius for the tail part of the vector.

    tailN :

    the number of polygons to draw the tail part of the vector.

    headLength :

    the length for the head part of the vector.

    headRadius :

    the radius for the head part of the vector.

    headN :

    the number of polygons to draw the head part of the vector.

    Returns :

    TRUE if setting has been changed.

    Since 3.7


    visu_gl_ext_node_vectors_setCentering ()

    gboolean            visu_gl_ext_node_vectors_setCentering
                                                            (VisuGlExtNodeVectors *vect,
                                                             VisuGlArrowCentering centering);

    Change how vectors are position with respect to to center of each node.

    vect :

    the VisuGlExtNodeVectors object to modify.

    centering :

    a VisuGlArrowCentering id.

    Returns :

    TRUE if setting has been changed.

    Since 3.7


    visu_gl_ext_node_vectors_setColor ()

    gboolean            visu_gl_ext_node_vectors_setColor   (VisuGlExtNodeVectors *vect,
                                                             gboolean follow);

    If follow is TRUE, the vectors are drawn with the color of the currently drawn VisuElement. If FALSE, it is drawn with a highlighted color.

    vect :

    the VisuGlExtNodeVectors object to modify.

    follow :

    a boolean.

    Returns :

    TRUE if setting has been changed.

    Since 3.7


    visu_gl_ext_node_vectors_setData ()

    gboolean            visu_gl_ext_node_vectors_setData    (VisuGlExtNodeVectors *vect,
                                                             VisuData *dataObj);

    Attach an VisuGlView to render to and setup the legend to get the node population also.

    vect :

    The VisuGlExtNodeVectors to attached to.

    dataObj :

    the nodes to get the population of.

    Returns :

    TRUE if visu_gl_ext_node_vectors_draw() should be called and then 'OpenGLAskForReDraw' signal be emitted.

    Since 3.7


    visu_gl_ext_node_vectors_setLabelThreshold ()

    gboolean            visu_gl_ext_node_vectors_setLabelThreshold
                                                            (VisuGlExtNodeVectors *vect,
                                                             float val);

    Vector norms can be drawn if a threshold value is reach. If val is strictly positive, the norm of each vector is compared to val. If val is negative, the normalised [0;1] norm is compared to -val.

    vect :

    the VisuGlExtNodeVectors object to modify.

    val :

    a value.

    Returns :

    TRUE if setting has been changed.

    Since 3.7


    visu_gl_ext_node_vectors_setNormalisation ()

    gboolean            visu_gl_ext_node_vectors_setNormalisation
                                                            (VisuGlExtNodeVectors *vect,
                                                             float norm);

    norm governs how the input node vector field is normalised. With a positive value, all node vectors will be normalised by norm. With a negative value, all node vectors are normalised with respect to the biggest one.

    vect :

    the VisuGlExtNodeVectors object to modify.

    norm :

    a floating point value.

    Returns :

    TRUE if setting has been changed.

    Since 3.7


    visu_gl_ext_node_vectors_setRenderedSize ()

    gboolean            visu_gl_ext_node_vectors_setRenderedSize
                                                            (VisuGlExtNodeVectors *vect,
                                                             gfloat scale);

    scale governs how large the node vectors are drawn. For a positive value, a vector with a normalised size of 1 (see visu_gl_ext_node_vectors_setNormalisation()) will be drawn with the size of scale. For a negative value, a vector of normalised size of 1 will be drawn with a size of -scale times the maximum element size (see visu_node_array_getMaxElementSize()).

    vect :

    the VisuGlExtNodeVectors object to modify.

    scale :

    a floating point value.

    Returns :

    TRUE if setting has been changed.

    Since 3.7


    visu_gl_ext_node_vectors_setTranslation ()

    gboolean            visu_gl_ext_node_vectors_setTranslation
                                                            (VisuGlExtNodeVectors *vect,
                                                             float trans);

    Defines a translation with respect to the center of each node. The vector is shifted outwards, following the vector direction by an amount given by the product of trans and the element size currently drawn.

    vect :

    the VisuGlExtNodeVectors object to modify.

    trans :

    a positive floating point value.

    Returns :

    TRUE if setting has been changed.

    Since 3.7


    visu_gl_ext_node_vectors_setVectorThreshold ()

    gboolean            visu_gl_ext_node_vectors_setVectorThreshold
                                                            (VisuGlExtNodeVectors *vect,
                                                             float val);

    Vectors are indeed drawn if a threshold value is reach. If val is strictly positive, the norm of each vector is compared to val. If val is negative, the normalised [0;1] norm is compared to -val.

    vect :

    the VisuGlExtNodeVectors object to modify.

    val :

    a value.

    Returns :

    TRUE if setting has been changed.

    Since 3.7


    visu_gl_ext_vibration_getDefault ()

    VisuGlExtNodeVectors * visu_gl_ext_vibration_getDefault ();

    V_Sim has a private internal VisuGlExtNodeVectors object to represent phonons with arrows.

    Returns :

    the default VisuGlExtNodeVectors object used for representing phonons with arrows. [transfer none]

    Since 3.7

    Property Details

    The "propId" property

      "propId"                   gchar*                : Read / Write / Construct Only

    property name to get vectors from.

    Default value: ""

    v_sim-3.7.0/Documentation/reference/html/VisuGlExtPairs.html0000644000353400050620000012557012216331356021067 00000000000000 VisuGlExtPairs

    VisuGlExtPairs

    VisuGlExtPairs — Draw links between nodes.

    Object Hierarchy

      GObject
       +----VisuGlExt
             +----VisuGlExtPairs
    
      GBoxed
       +----VisuPairExtension
    

    Description

    This extension draws links between nodes, depending on VisuPairExtension drawing capabilities.

    Details

    VISU_GL_EXT_PAIRS_ID

    #define VISU_GL_EXT_PAIRS_ID "Pairs"
    

    The id used to identify this extension, see visu_gl_ext_rebuild() for instance.


    struct VisuGlExtPairs

    struct VisuGlExtPairs;

    An opaque structure.

    Since 3.7


    struct VisuGlExtPairsClass

    struct VisuGlExtPairsClass {
      VisuGlExtClass parent;
    };
    

    A short way to identify _VisuGlExtPairsClass structure.

    VisuGlExtClass parent;

    the parent class;

    Since 3.7


    struct VisuPairDrawFuncs

    struct VisuPairDrawFuncs {
      /**
       * start:
       * @ele1: a #VisuElement object ;
       * @ele2: a #VisuElement object ;
       * @data: a #VisuPairLink object.
       * @view: a #VisuGlView object, giving some constants describing
       *        the OpenGL scene ;
       *
       * Prototype of functions called at the beginning and
       * the end of drawing of each pairs types. @ele1 and @ele2
       * arguments are the two elements between the pair defined by @data is drawn.
       * This is useful to set some OpenGL definition specific to each pair, such
       * as the color for example.
       */
      void (*start)(VisuElement *ele1, VisuElement *ele2, VisuPairLink *data, VisuGlView *view);
    
      /**
       * stop:
       * @ele1: a #VisuElement object ;
       * @ele2: a #VisuElement object ;
       * @data: a #VisuPairLink object.
       * @view: a #VisuGlView object, giving some constants describing
       *        the OpenGL scene ;
       *
       * Prototype of functions called at the beginning and
       * the end of drawing of each pairs types. @ele1 and @ele2
       * arguments are the two elements between the pair defined by @data is drawn.
       * This is useful to set some OpenGL definition specific to each pair, such
       * as the color for example.
       */
      void (*stop)(VisuElement *ele1, VisuElement *ele2, VisuPairLink *data, VisuGlView *view);
    
      /**
       * main:
       * @ele1: a #VisuElement object ;
       * @ele2: a #VisuElement object ;
       * @data: a #VisuPairLink object ;
       * @view: a #VisuGlView object, giving some constants describing
       *        the OpenGL scene ;
       * @x1: a floating point value ;
       * @y1: a floating point value ;
       * @z1: a floating point value ;
       * @x2: a floating point value ;
       * @y2: a floating point value ;
       * @z2: a floating point value ;
       * @d2: a floating point value ;
       * @alpha: a floating point value.
       *
       * Prototype of function to draw a pair. Such function are called each time a pair
       * is drawn between the two points (@x1, @y1, @z1) and (@x2, @y2, @z2). The @d2 argument
       * is the square distance between the two points. The @alpha argument
       * is a proposed alpha colour from the main program, its value is in [0;1].
       */
      void (*main)(VisuElement *ele1, VisuElement *ele2,
                   VisuPairLink *data, VisuGlView *view,
                   double x1, double y1, double z1,
                   double x2, double y2, double z2,
                   float d2, float alpha);
    };
    

    Drawing method for a VisuPairLink.

    start ()

    a method called before drawing a family of VisuPairLink.

    stop ()

    a method called after drawing a family of VisuPairLink.

    main ()

    a method used to draw each link of a VisuPairLink.

    VisuPairExtension

    typedef struct _VisuPairExtension VisuPairExtension;

    An Opaque structure.


    visu_gl_ext_pairs_draw ()

    void                visu_gl_ext_pairs_draw              (VisuGlExtPairs *pairs);

    Draw the pairs, see visu_gl_ext_pairs_setData() to attach a VisuData object to pairs.

    pairs :

    a VisuGlExtPairs object.

    Since 3.7


    visu_gl_ext_pairs_getDefault ()

    VisuGlExtPairs *    visu_gl_ext_pairs_getDefault        ();

    V_Sim is using a default pair object.

    Returns :

    a VisuGlExtPairs object used by default. [transfer none]

    Since 3.7


    visu_gl_ext_pairs_getDrawMethod ()

    VisuPairExtension * visu_gl_ext_pairs_getDrawMethod     (VisuGlExtPairs *pairs,
                                                             VisuPairLink *data);

    Get the drawing method of a pair.

    pairs :

    the rendering VisuGlExtPairs object.

    data :

    a VisuPairLink object.

    Returns :

    a drawing method.

    Since 3.6


    visu_gl_ext_pairs_getDrawnPair ()

    gboolean            visu_gl_ext_pairs_getDrawnPair      (VisuGlExtPairs *pairs,
                                                             VisuPairLink *data,
                                                             guint *node1,
                                                             guint *node2,
                                                             guint id);

    After pairs have been drawn, the ids of nodes in between links have been done can be retrieved with this routine. id range in between 0 and the value returned by visu_gl_ext_pairs_getNDrawn().

    pairs :

    the rendering VisuGlExtPairs object.

    data :

    a VisuPairLink object ;

    node1 :

    a location to store a node id ;. [out]

    node2 :

    a location to store a node id ;. [out]

    id :

    an index value.

    Returns :

    TRUE if id is a valid number.

    Since 3.7


    visu_gl_ext_pairs_getNDrawn ()

    guint               visu_gl_ext_pairs_getNDrawn         (VisuGlExtPairs *pairs,
                                                             VisuPairLink *data);

    This returns the number of pairs with characteristics of data, that have been drawn.

    pairs :

    the rendering VisuGlExtPairs object.

    data :

    a VisuPairLink object.

    Returns :

    the number of drawn pairs.

    Since 3.7


    visu_gl_ext_pairs_new ()

    VisuGlExtPairs *    visu_gl_ext_pairs_new               (const gchar *name);

    Creates a new VisuGlExt to draw a pairs.

    name :

    the name to give to the extension (default is VISU_GL_EXT_PAIRS_ID). [allow-none]

    Returns :

    a pointer to the VisuGlExt it created or NULL otherwise.

    Since 3.7


    visu_gl_ext_pairs_setData ()

    gboolean            visu_gl_ext_pairs_setData           (VisuGlExtPairs *pairs,
                                                             VisuGlView *view,
                                                             VisuData *data);

    Attach an VisuGlView to render to and setup the pairs to get the node population also.

    pairs :

    The VisuGlExtPairs to attached to.

    view :

    the view where to draw the pairs.

    data :

    the nodes to get the population of.

    Returns :

    TRUE if visu_gl_ext_pairs_draw() should be called and then 'OpenGLAskForReDraw' signal be emitted.

    Since 3.7


    visu_gl_ext_pairs_setDrawMethod ()

    gboolean            visu_gl_ext_pairs_setDrawMethod     (VisuGlExtPairs *pairs,
                                                             VisuPairLink *data,
                                                             VisuPairExtension *ext);

    Set the drawing method of a pair.

    pairs :

    the rendering VisuGlExtPairs object.

    data :

    a VisuPairLink object.

    ext :

    a VisuPairExtension object.

    Returns :

    TRUE if drawing method is changed.

    Since 3.6


    visu_pair_extension_free ()

    void                visu_pair_extension_free            (VisuPairExtension *extension);

    Free all the allocated attributes of the specified method.

    extension :

    the extension to delete.

    visu_pair_extension_getAllMethods ()

    GList *             visu_pair_extension_getAllMethods   ();

    Useful to know all VisuPairExtension.

    Returns :

    a list of all the known VisuPairExtension. This list should be considered read-only. [element-type VisuPairExtension*][transfer none]

    visu_pair_extension_getByName ()

    VisuPairExtension * visu_pair_extension_getByName       (const gchar *name);

    Useful to know a VisuPairExtension when knowing its name.

    name :

    a method name (untranslated).

    Returns :

    a VisuPairExtension, or NULL if not any matchs.

    Since 3.6


    visu_pair_extension_getDefault ()

    VisuPairExtension * visu_pair_extension_getDefault      ();

    If some process need to know the current VisuPairExtension. Such extension has been set with setPairsMethod().

    Returns :

    the current VisuPairExtension, NULL if none has been set.

    visu_pair_extension_getName ()

    const gchar *       visu_pair_extension_getName         (VisuPairExtension *extension,
                                                             gboolean UTF8);

    A VisuPairExtension has an internal name and a translated name for UI.

    extension :

    a VisuPairExtension object ;

    UTF8 :

    if name is provided for UI or not.

    Returns :

    a private label identifying this extension.

    Since 3.7


    visu_pair_extension_new ()

    VisuPairExtension * visu_pair_extension_new             (const char *name,
                                                             const char *printName,
                                                             const char *description,
                                                             gboolean sensitive,
                                                             const VisuPairDrawFuncs *meth);

    This creates a new pairs extension. Such an extension describes how to draw links (called pairs) between elements. The sensitive argument is to inform if pairs must be redrawn when the OpenGL engine sends the OpenGLFacetteChanged signal.

    name :

    name of the extension (must be non null) ;

    printName :

    a string to label the method that can be safely translated ;

    description :

    a brief description of the extension (can be null) ;

    sensitive :

    a boolean 0 or 1 ;

    meth :

    a set of drawing methods.

    Returns :

    the new VisuPairExtension or null if something wrong happens.

    visu_pair_extension_ref ()

    VisuPairExtension * visu_pair_extension_ref             (VisuPairExtension *ext);

    Increase the ref counter.

    ext :

    a VisuPairExtension object.

    Returns :

    itself.

    Since 3.7


    visu_pair_extension_setDefault ()

    gboolean            visu_pair_extension_setDefault      (VisuPairExtension *extension);

    Choose the method used to draw pairs.

    extension :

    a VisuPairExtension object.

    Returns :

    TRUE if pairs should be rebuilt.

    visu_pair_extension_unref ()

    void                visu_pair_extension_unref           (VisuPairExtension *ext);

    Decrease the ref counter, free all memory if counter reachs zero.

    ext :

    a VisuPairExtension object.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/VisuGlExtPaths.html0000644000353400050620000002717312216331356021070 00000000000000 VisuGlExtPaths

    VisuGlExtPaths

    VisuGlExtPaths — Defines methods to draw paths.

    Object Hierarchy

      GObject
       +----VisuGlExt
             +----VisuGlExtPaths
    

    Description

    Create a VisuGlExt object to handle VisuPaths drawing.

    Details

    VISU_GL_EXT_PATHS_ID

    #define VISU_GL_EXT_PATHS_ID "Paths"
    

    The id used to identify this extension, see visu_gl_ext_rebuild() for instance.


    struct VisuGlExtPaths

    struct VisuGlExtPaths;

    An opaque structure.

    Since 3.7


    struct VisuGlExtPathsClass

    struct VisuGlExtPathsClass {
      VisuGlExtClass parent;
    };
    

    A short way to identify _VisuGlExtPathsClass structure.

    VisuGlExtClass parent;

    the parent class;

    Since 3.7


    visu_gl_ext_paths_draw ()

    void                visu_gl_ext_paths_draw              (VisuGlExtPaths *paths);

    This method creates a compiled list that draws paths.

    paths :

    the VisuBox object to build paths for.

    visu_gl_ext_paths_new ()

    VisuGlExtPaths *    visu_gl_ext_paths_new               (const gchar *name);

    Creates a new VisuGlExt to draw paths.

    name :

    the name to give to the extension (default is VISU_GL_EXT_PATHS_ID). [allow-none]

    Returns :

    a pointer to the VisuGlExt it created or NULL otherwise.

    Since 3.7


    visu_gl_ext_paths_set ()

    gboolean            visu_gl_ext_paths_set               (VisuGlExtPaths *paths,
                                                             VisuPaths *obj);

    Set the VisuPaths to be drawn.

    paths :

    the VisuGlExtPaths object to modify.

    obj :

    a VisuPaths object. [allow-none]

    Returns :

    TRUE if visu_gl_ext_paths_draw() should be called and then 'OpenGLAskForReDraw' signal be emitted.

    Since 3.7


    visu_gl_ext_paths_setDirty ()

    void                visu_gl_ext_paths_setDirty          (VisuGlExtPaths *paths);

    Currently, VisuPath are not objects, so paths cannot react to a change on them. Callers have to set by hand that paths should be redrawn with this routine.

    paths :

    a VisuGlExtPaths object.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/VisuGlExtPlanes.html0000644000353400050620000003331312216331356021224 00000000000000 VisuGlExtPlanes

    VisuGlExtPlanes

    VisuGlExtPlanes — Draw a list of VisuPlane.

    Object Hierarchy

      GObject
       +----VisuGlExt
             +----VisuGlExtPlanes
    

    Description

    This extension draws a list of VisuPlane. Planes are outlined with a black line and also the intersections of planes.

    Details

    VISU_GL_EXT_PLANES_ID

    #define VISU_GL_EXT_PLANES_ID "Planes"
    

    The id used to identify this extension, see visu_gl_ext_rebuild() for instance.


    struct VisuGlExtPlanes

    struct VisuGlExtPlanes;

    An opaque structure.

    Since 3.7


    struct VisuGlExtPlanesClass

    struct VisuGlExtPlanesClass {
      VisuGlExtFrameClass parent;
    };
    

    A short way to identify _VisuGlExtPlanesClass structure.

    VisuGlExtFrameClass parent;

    the parent class;

    Since 3.7


    visu_gl_ext_planes_add ()

    gboolean            visu_gl_ext_planes_add              (VisuGlExtPlanes *planes,
                                                             VisuPlane *plane);

    Adds a plane to the list of drawn planes.

    planes :

    a VisuGlExtPlanes object.

    plane :

    a VisuPlane object. [transfer full]

    Returns :

    FALSE if plane was already registered.

    Since 3.7


    visu_gl_ext_planes_draw ()

    void                visu_gl_ext_planes_draw             (VisuGlExtPlanes *planes);

    Compile the OpenGL list representing planes.

    planes :

    a VisuGlExtPlanes object.

    Since 3.7


    visu_gl_ext_planes_getDefault ()

    VisuGlExtPlanes *   visu_gl_ext_planes_getDefault       ();

    V_Sim is using a default planes object.

    Returns :

    a VisuGlExtPlanes object used by default. [transfer none]

    Since 3.7


    visu_gl_ext_planes_new ()

    VisuGlExtPlanes *   visu_gl_ext_planes_new              (const gchar *name);

    Creates a new VisuGlExt to draw a list of planes.

    name :

    the name to give to the extension (default is VISU_GL_EXT_PLANES_ID). [allow-none]

    Returns :

    a pointer to the VisuGlExt it created or NULL otherwise.

    Since 3.7


    visu_gl_ext_planes_remove ()

    gboolean            visu_gl_ext_planes_remove           (VisuGlExtPlanes *planes,
                                                             VisuPlane *plane);

    Remove plane from the list of drawn planes.

    planes :

    a VisuGlExtPlanes object.

    plane :

    a VisuPlane object.

    Returns :

    TRUE if visu_gl_ext_planes_draw() should be called.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/VisuGlExtScale.html0000644000353400050620000012746412216331356021044 00000000000000 VisuGlExtScale

    VisuGlExtScale

    VisuGlExtScale — Draw an arrow with a label.

    Object Hierarchy

      GObject
       +----VisuGlExt
             +----VisuGlExtScale
    

    Description

    This little extension is used to draw an arrow at a given position displaying a given length.

    Details

    struct VisuGlExtScale

    struct VisuGlExtScale;

    All fields are private, use the access routines.

    Since 3.3


    struct VisuGlExtScaleClass

    struct VisuGlExtScaleClass {
      VisuGlExtClass parent;
    };
    

    An opaque structure.

    VisuGlExtClass parent;

    parent structure.

    Since 3.3


    visu_gl_ext_scale_add ()

    guint               visu_gl_ext_scale_add               (VisuGlExtScale *scale,
                                                             float origin[3],
                                                             float orientation[3],
                                                             float length,
                                                             const gchar *legend);

    Create a new arrow pointing somewhere in the box with a label. If legend is NULL, then the label will be the value of the length.

    scale :

    the VisuGlExtScale object to add to.

    origin :

    the origin ;. [array fixed-size=3]

    orientation :

    the orientation in cartesian coordinates ;. [array fixed-size=3]

    length :

    the length of the arrow ;

    legend :

    the text going with the arrow (can be NULL). [allow-none]

    Returns :

    the id of the newly added arrow.

    Since 3.7


    visu_gl_ext_scale_draw ()

    void                visu_gl_ext_scale_draw              (VisuGlExtScale *scale);

    This method creates a compile list that draw all arrow of a scale.

    scale :

    the VisuGlExtScale object to draw.

    Since 3.3


    visu_gl_ext_scale_getDefault ()

    VisuGlExtScale *    visu_gl_ext_scale_getDefault        ();

    The default VisuGlExtScale object used by V_Sim.

    Returns :

    a VisuGlExtScale object. [transfer none]

    Since 3.7


    visu_gl_ext_scale_getDefaultLineWidth ()

    float               visu_gl_ext_scale_getDefaultLineWidth
                                                            ();

    The scales share a line width for the stick of the arrow.

    Returns :

    the value of current width.

    Since 3.3


    visu_gl_ext_scale_getDefaultRGB ()

    float *             visu_gl_ext_scale_getDefaultRGB     ();

    All the scales shared a common colour.

    Returns :

    a four component array. [array fixed-size=4][transfer none]

    Since 3.3


    visu_gl_ext_scale_getDefaultStipple ()

    guint16             visu_gl_ext_scale_getDefaultStipple ();

    The scales share a line pattern for the stick of the arrow.

    Returns :

    the value of current stipple pattern.

    Since 3.3


    visu_gl_ext_scale_getLegend ()

    const gchar *       visu_gl_ext_scale_getLegend         (VisuGlExtScale *scale,
                                                             guint i);

    A VisuGlExtScale can have a legend. This is not actualy the string printed on screen but the one used to generate it.

    scale :

    the VisuGlExtScale to poll.

    i :

    the ith arrow.

    Returns :

    a string (private, do not free it). [allow-none]

    Since 3.3


    visu_gl_ext_scale_getLength ()

    float               visu_gl_ext_scale_getLength         (VisuGlExtScale *scale,
                                                             guint i);

    A VisuGlExtScale is characterised by its length.

    scale :

    the VisuGlExtScale to poll.

    i :

    the ith arrow.

    Returns :

    a positive floating point value or a negative value if i is not in the arrow list.

    Since 3.3


    visu_gl_ext_scale_getNArrows ()

    guint               visu_gl_ext_scale_getNArrows        (VisuGlExtScale *scale);

    A VisuGlExtScale is characterised by a set of arrows.

    scale :

    the VisuGlExtScale to poll.

    Returns :

    the number of stored arrows.

    Since 3.7


    visu_gl_ext_scale_getOrientation ()

    float *             visu_gl_ext_scale_getOrientation    (VisuGlExtScale *scale,
                                                             guint i);

    A VisuGlExtScale is characterised by its orientation in cartesian coordinates.

    scale :

    the VisuGlExtScale to poll.

    i :

    the ith arrow.

    Returns :

    three floating point values. [array fixed-size=3][transfer none][allow-none]

    Since 3.3


    visu_gl_ext_scale_getOrigin ()

    float *             visu_gl_ext_scale_getOrigin         (VisuGlExtScale *scale,
                                                             guint i);

    A VisuGlExtScale is characterised by its origin in cartesian coordinates.

    scale :

    the VisuGlExtScale to poll.

    i :

    the ith arrow.

    Returns :

    three floating point values. [array fixed-size=3][transfer none][allow-none]

    Since 3.3


    visu_gl_ext_scale_setDefaultLineWidth ()

    gboolean            visu_gl_ext_scale_setDefaultLineWidth
                                                            (float width);

    Method used to change the value of the parameter scale_line_width. This affects all the drawn scales.

    width :

    value of the desired width.

    Returns :

    TRUE if scaleDraw() should be called and then 'OpenGLAskForReDraw' signal be emitted.

    Since 3.3


    visu_gl_ext_scale_setDefaultRGB ()

    gboolean            visu_gl_ext_scale_setDefaultRGB     (float rgba[4],
                                                             int mask);

    Method used to change the value of the private parameter scales_color. This affects all the drawn scales.

    rgba :

    a four floats array with values (0 <= values <= 1) for the red, the green, the blue and the alpha color. Only values specified by the mask are really relevant.

    mask :

    use TOOL_COLOR_MASK_R, TOOL_COLOR_MASK_G, TOOL_COLOR_MASK_B, TOOL_COLOR_MASK_RGBA or a combinaison to indicate what values in the rgb array must be taken into account.

    Returns :

    TRUE if scaleDraw() should be called and then 'OpenGLAskForReDraw' signal be emitted.

    Since 3.3


    visu_gl_ext_scale_setDefaultStipple ()

    gboolean            visu_gl_ext_scale_setDefaultStipple (guint16 stipple);

    The scales share a line pattern for the stick of the arrow.

    stipple :

    a pattern for line.

    Returns :

    TRUE if scale are drawn, FALSE otherwise.

    Since 3.3


    visu_gl_ext_scale_setGlView ()

    gboolean            visu_gl_ext_scale_setGlView         (VisuGlExtScale *scale,
                                                             VisuGlView *view);

    Attach view to scale, so rendering is updated when view is modified.

    scale :

    a VisuGlExtScale object.

    view :

    a VisuGlView object. [transfer full]

    Returns :

    TRUE if view is changed.

    Since 3.7


    visu_gl_ext_scale_setLegend ()

    gboolean            visu_gl_ext_scale_setLegend         (VisuGlExtScale *scale,
                                                             guint i,
                                                             const gchar *value);

    Routine that changes the legend of the scale. If value is NULL then the length of the scale is printed.

    scale :

    the VisuGlExtScale to modify ;

    i :

    the ith arrow ;

    value :

    a string (can be NULL). [allow-none]

    Returns :

    TRUE if visu_gl_ext_scale_draw() should be called.

    Since 3.3


    visu_gl_ext_scale_setLength ()

    gboolean            visu_gl_ext_scale_setLength         (VisuGlExtScale *scale,
                                                             guint i,
                                                             float lg);

    Routine that changes the length of the scale.

    scale :

    the VisuGlExtScale to modify ;

    i :

    the ith arrow ;

    lg :

    a positive length.

    Returns :

    TRUE if visu_gl_ext_scale_draw() should be called.

    Since 3.3


    visu_gl_ext_scale_setOrientation ()

    gboolean            visu_gl_ext_scale_setOrientation    (VisuGlExtScale *scale,
                                                             guint i,
                                                             float xyz[3],
                                                             int mask);

    Routine that changes the direction of the scale.

    scale :

    the VisuGlExtScale to modify ;

    i :

    the ith arrow ;

    xyz :

    a vector in cartesian coordinates ;. [array fixed-size=3]

    mask :

    relevant values in xyz, see TOOL_XYZ_MASK_X...

    Returns :

    TRUE if visu_gl_ext_scale_draw() should be called.

    Since 3.3


    visu_gl_ext_scale_setOrigin ()

    gboolean            visu_gl_ext_scale_setOrigin         (VisuGlExtScale *scale,
                                                             guint i,
                                                             float xyz[3],
                                                             int mask);

    Routine that changes the origin of the scale.

    scale :

    the VisuGlExtScale to modify ;

    i :

    the ith arrow ;

    xyz :

    a vector in cartesian coordinates ;. [array fixed-size=3]

    mask :

    relevant values in xyz, see TOOL_XYZ_MASK_X...

    Returns :

    TRUE if visu_gl_ext_scale_draw() should be called.

    Since 3.3

    v_sim-3.7.0/Documentation/reference/html/VisuGlExtShade.html0000644000353400050620000004204112216331356021024 00000000000000 VisuGlExtShade

    VisuGlExtShade

    VisuGlExtShade — Draw a frame with the representation of a color shade.

    Object Hierarchy

      GObject
       +----VisuGlExt
             +----VisuGlExtFrame
                   +----VisuGlExtShade
    

    Description

    This extension draws a frame on top of the rendering area with a color shade. One can setup printed values and draw additional marks inside the shade.

    Details

    VISU_GL_EXT_SHADE_ID

    #define VISU_GL_EXT_SHADE_ID "Shade"
    

    The id used to identify this extension, see visu_gl_ext_rebuild() for instance.


    struct VisuGlExtShade

    struct VisuGlExtShade;

    An opaque structure.

    Since 3.7


    struct VisuGlExtShadeClass

    struct VisuGlExtShadeClass {
      VisuGlExtFrameClass parent;
    };
    

    A short way to identify _VisuGlExtShadeClass structure.

    VisuGlExtFrameClass parent;

    the parent class;

    Since 3.7


    visu_gl_ext_shade_new ()

    VisuGlExtShade *    visu_gl_ext_shade_new               (const gchar *name);

    Creates a new VisuGlExt to draw a shade.

    name :

    the name to give to the extension (default is VISU_GL_EXT_SHADE_ID). [allow-none]

    Returns :

    a pointer to the VisuGlExt it created or NULL otherwise.

    Since 3.7


    visu_gl_ext_shade_setMarks ()

    gboolean            visu_gl_ext_shade_setMarks          (VisuGlExtShade *shade,
                                                             float *marks,
                                                             guint n);

    The legend can draw additional marks in the shade. Setup these marks with this routine. The first and the last marks of the list will be rendered bigger than the next ones.

    shade :

    the VisuGlExtShade to update.

    marks :

    a list of float values in [0;1]. [array length=n]

    n :

    the length of marks.

    Returns :

    TRUE if visu_gl_ext_frame_draw() should be called.

    Since 3.7


    visu_gl_ext_shade_setMinMax ()

    gboolean            visu_gl_ext_shade_setMinMax         (VisuGlExtShade *shade,
                                                             float minV,
                                                             float maxV);

    Change the minimum and maximum values used on the legend.

    shade :

    the VisuGlExtShade to update.

    minV :

    a value.

    maxV :

    another value.

    Returns :

    TRUE if visu_gl_ext_frame_draw() should be called.

    Since 3.7


    visu_gl_ext_shade_setScaling ()

    gboolean            visu_gl_ext_shade_setScaling        (VisuGlExtShade *shade,
                                                             ToolMatrixScalingFlag scaling);

    Change the scaling variation of the shade between the minimum and the maximum values, see visu_gl_ext_shade_setMinMax().

    shade :

    the VisuGlExtShade to update.

    scaling :

    a ToolMatrixScalingFlag value.

    Returns :

    TRUE if visu_gl_ext_frame_draw() should be called.

    Since 3.7


    visu_gl_ext_shade_setShade ()

    gboolean            visu_gl_ext_shade_setShade          (VisuGlExtShade *ext,
                                                             ToolShade *shade);

    Attach an VisuGlView to render to and setup the shade.

    ext :

    The VisuGlExtShade to attached to.

    shade :

    the shade to get the color of.

    Returns :

    TRUE if visu_gl_ext_frame_draw() should be called and then 'OpenGLAskForReDraw' signal be emitted.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/VisuGlExtSurfaces.html0000644000353400050620000006103012216331356021552 00000000000000 VisuGlExtSurfaces

    VisuGlExtSurfaces

    VisuGlExtSurfaces — Defines methods to draw surfaces.

    Object Hierarchy

      GObject
       +----VisuGlExt
             +----VisuGlExtSurfaces
    

    Description

    VisuSurfaces object can be drawn with this class. Simply create a new VisuGlExtSurfaces object and add surfaces with visu_gl_ext_surfaces_add(). It is better to add several surfaces to a single VisuGlExtSurfaces object since all vertices are reordered when necessary to ensure proper transparency.

    Details

    VISU_GL_EXT_SURFACES_ID

    #define VISU_GL_EXT_SURFACES_ID "Surfaces"
    

    The id used to identify this extension, see visu_gl_ext_rebuild() for instance.


    struct VisuGlExtSurfaces

    struct VisuGlExtSurfaces;

    An opaque structure.

    Since 3.7


    struct VisuGlExtSurfacesClass

    struct VisuGlExtSurfacesClass {
      VisuGlExtClass parent;
    };
    

    A short way to identify _VisuGlExtSurfacesClass structure.

    VisuGlExtClass parent;

    the parent class;

    Since 3.7


    visu_gl_ext_surfaces_add ()

    gboolean            visu_gl_ext_surfaces_add            (VisuGlExtSurfaces *surfaces,
                                                             VisuSurfaces *surf);

    Add a new surface to the list of drawn surfaces.

    surfaces :

    a VisuGlExtSurfaces object.

    surf :

    a VisuSurfaces object. [transfer full]

    Returns :

    FALSE if surf was already reguistered.

    Since 3.7


    visu_gl_ext_surfaces_draw ()

    void                visu_gl_ext_surfaces_draw           (VisuGlExtSurfaces *surfs);

    Rebuild each visible surface's list. The order in which to draw the surfaces is given in the order argument. If the resource 'isosurfaces_drawIntra' is TRUE then, the interior of the surfaces is drawn as color inverse.

    surfs :

    a VisuGlExtSurfaces object.

    Since 3.7


    visu_gl_ext_surfaces_getDefault ()

    VisuGlExtSurfaces * visu_gl_ext_surfaces_getDefault     (void);

    V_Sim is using a default surfaces object.

    Returns :

    a VisuGlExtSurfaces object used by default. [transfer none]

    Since 3.7


    visu_gl_ext_surfaces_getDrawIntra ()

    gboolean            visu_gl_ext_surfaces_getDrawIntra   (VisuGlExtSurfaces *surfs);

    Retrieve if the interiors of surfaces are drawn with a colour inverse or not.

    surfs :

    a VisuGlExtSurfaces object.

    Returns :

    TRUE if the interior is painted in colour inverse.

    visu_gl_ext_surfaces_new ()

    VisuGlExtSurfaces * visu_gl_ext_surfaces_new            (const gchar *name);

    Creates a new VisuGlExt to draw surfaces.

    name :

    the name to give to the extension (default is VISU_GL_EXT_SURFACES_ID). [allow-none]

    Returns :

    a pointer to the VisuGlExt it created or NULL otherwise.

    Since 3.7


    visu_gl_ext_surfaces_remove ()

    gboolean            visu_gl_ext_surfaces_remove         (VisuGlExtSurfaces *surfaces,
                                                             VisuSurfaces *surf);

    Removes surf from the list of drawn surfaces.

    surfaces :

    a VisuGlExtSurfaces object.

    surf :

    a VisuSurfaces object.

    Returns :

    TRUE if visu_gl_ext_surfaces_draw(à should be called.

    Since 3.7


    visu_gl_ext_surfaces_setDrawIntra ()

    gboolean            visu_gl_ext_surfaces_setDrawIntra   (VisuGlExtSurfaces *surfs,
                                                             gboolean status);

    Set if the interiors of surfaces are drawn with a colour inverse or not.

    surfs :

    a VisuGlExtSurfaces object.

    status :

    a boolean.

    Returns :

    TRUE if calling routine should redraw the surfaces with visu_gl_ext_surfaces_draw().

    visu_gl_ext_surfaces_setOnObserveOrdering ()

    gboolean            visu_gl_ext_surfaces_setOnObserveOrdering
                                                            (VisuGlExtSurfaces *surfaces,
                                                             VisuInteractive *inter);

    Attach surfaces to inter, so it can be rendered there. See visu_gl_ext_surfaces_draw().

    surfaces :

    the VisuGlExtSurfaces object to attached to rendering inter.

    inter :

    a VisuInteractive object. [transfer full][allow-none]

    Returns :

    TRUE if visu_gl_ext_surfaces_draw() should be called and then 'OpenGLAskForReDraw' signal be emitted.

    Since 3.7


    visu_gl_ext_surfaces_setOnTheFlyOrdering ()

    gboolean            visu_gl_ext_surfaces_setOnTheFlyOrdering
                                                            (VisuGlExtSurfaces *surfaces,
                                                             VisuGlView *view);

    Attach surfaces to view, so it can be rendered there. See visu_gl_ext_surfaces_draw().

    surfaces :

    the VisuGlExtSurfaces object to attached to rendering view.

    view :

    a VisuGlView object. [transfer full][allow-none]

    Returns :

    TRUE if visu_gl_ext_surfaces_draw() should be called and then 'OpenGLAskForReDraw' signal be emitted.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/VisuObject.html0000644000353400050620000014140012216331356020241 00000000000000 VisuObject

    VisuObject

    VisuObject — A general object to store the signals.

    Object Hierarchy

      GObject
       +----VisuObject
    

    Description

    At the present time, the signals are global to all V_Sim, owned by a variable include in each parts called visu. This is wherre these signals are defined.

    Details

    VISU_OBJECT_INSTANCE

    #define VISU_OBJECT_INSTANCE visu_object_class_getStatic()
    

    This routine is used to get the global VisuObject object to listen to its signals.


    VISU_REDRAW_ADD

    #define VISU_REDRAW_ADD   g_idle_add(visu_object_redraw, (gpointer)__func__)
    

    A macro to ask V_Sim to redraw the rendering area at next idle time, except if the deferred redraw option is set.


    VISU_REDRAW_FORCE

    #define VISU_REDRAW_FORCE g_idle_add(visu_object_redrawForce, (gpointer)__func__)
    

    Force V_Sim to redraw at the next idle time, whatever value for the deferred redraw option.


    struct VisuObject

    struct VisuObject;

    This structure describes a VisuObject object.


    struct VisuObjectClass

    struct VisuObjectClass {
      GObjectClass parent;
    };
    

    This structure describes the class VisuObjectClass.

    GObjectClass parent;

    an object to inherit from.

    visu_object_class_getStatic ()

    VisuObject *        visu_object_class_getStatic         ();

    Internal routine to access the VisuObject object instanciated by default. Use VISU_OBJECT_INSTANCE instead.

    Returns :

    the default VisuObject used by V_Sim. [transfer none]

    visu_object_getRendering ()

    VisuRendering *     visu_object_getRendering            (VisuObject *obj);

    Get the current method used to render the data.

    obj :

    a VisuObject object.

    Returns :

    the rendering method attached to obj. [transfer none]

    visu_object_load ()

    gboolean            visu_object_load                    (VisuObject *obj,
                                                             VisuData *data,
                                                             int nSet,
                                                             GCancellable *cancel,
                                                             GError **error);

    This calls the load method of the current rendering method. Some informations may be store in error if the returned value is FALSE. The file(s) which is(are) opened is(are) stored in the VisuData. The nSet argument is used to load a specific set of nodes if the input format supports it. If nSet is 0, then the default set of nodes is loaded.

    obj :

    a VisuObject object.

    data :

    a VisuData object ;

    nSet :

    an integer ;

    cancel :

    a GCancellable object. [allow-none]

    error :

    a pointer to store a possible error, location must be initialized to (GError*)0.

    Returns :

    TRUE if everithing is OK, if FALSE, the error is set and should be freed with g_error_free().

    visu_object_redraw ()

    gboolean            visu_object_redraw                  (gpointer data);

    Call the signal OpenGLAskForReDraw. The API is adapted to the routine to be added in the gloop. Use VISU_REDRAW_ADD instead of this routine.

    data :

    a string. [allow-none][type utf8]

    Returns :

    FALSE to stop the emission as soon as done.

    visu_object_redrawForce ()

    gboolean            visu_object_redrawForce             (gpointer data);

    Call the signal OpenGLForceReDraw. The API is adapted to the routine to be added in the gloop. Use VISU_REDRAW_FORCE instead of this routine.

    data :

    a string. [allow-none][type utf8]

    Returns :

    FALSE to stop the emission as soon as done.

    visu_object_setLoadMessage ()

    void                visu_object_setLoadMessage          (VisuObject *obj,
                                                             const gchar *mess);

    If a message function on load action has been set by visu_object_setLoadMessageFunc(), then the given mess is given as argument to this function.

    obj :

    a VisuObject object.

    mess :

    a string.

    Since 3.6


    visu_object_setLoadMessageFunc ()

    void                visu_object_setLoadMessageFunc      (VisuObject *obj,
                                                             GFunc func,
                                                             gpointer data);

    When a load process is running, on can defined a message function that may be called to output message to the user using visu_object_setLoadMessage().

    obj :

    a VisuObject object.

    func :

    a function to print a message. [scope call]

    data :

    user data.

    Since 3.6


    visu_object_setRendering ()

    gboolean            visu_object_setRendering            (VisuObject *obj,
                                                             VisuRendering *method);

    Choose the method used to render the data.

    obj :

    a VisuObject object.

    method :

    a VisuRendering method. [transfer full]

    Returns :

    TRUE if the rendering method of obj is actually changed.

    Signal Details

    The "DirectoryChanged" signal

    void                user_function                      (VisuObject *visuObj,
                                                            guint       kind,
                                                            gpointer    user_data)      : No Hooks

    The current directory has been changed. The kind of directory is defined by kind (see #).

    visuObj :

    the object emitting the signal.

    kind :

    a flag.

    user_data :

    user data set when the signal handler was connected.

    Since 3.6


    The "OpenGLAskForReDraw" signal

    void                user_function                      (VisuObject *visuObj,
                                                            gpointer    user_data)      : No Hooks

    Internal signal, use VISU_REDRAW_ADD() instead.

    visuObj :

    the object emitting the signal.

    user_data :

    user data set when the signal handler was connected.

    The "OpenGLForceReDraw" signal

    void                user_function                      (VisuObject *visuObj,
                                                            gpointer    user_data)      : No Hooks

    Internal signal, use VISU_REDRAW_FORCE() instead.

    visuObj :

    the object emitting the signal.

    user_data :

    user data set when the signal handler was connected.

    The "colorNewAvailable" signal

    void                user_function                      (VisuObject *visuObj,
                                                            gpointer    color,
                                                            gpointer    user_data)      : No Hooks

    A new ToolColor is available.

    visuObj :

    the object emitting the signal.

    color :

    the newly created ToolColor.

    user_data :

    user data set when the signal handler was connected.

    Since 3.2


    The "dataLoaded" signal

    void                user_function                      (VisuObject *visuObj,
                                                            GObject    *dataObj,
                                                            gpointer    user_data)      : No Hooks

    The given dataObj is fully populated and ready for usage.

    visuObj :

    the object emitting the signal.

    dataObj :

    the newly created VisuData.

    user_data :

    user data set when the signal handler was connected.

    Since 3.1


    The "dataNew" signal

    void                user_function                      (VisuObject *visuObj,
                                                            GObject    *dataObj,
                                                            gpointer    user_data)      : No Hooks

    A new VisuData is available.

    visuObj :

    the object emitting the signal.

    dataObj :

    the newly created VisuData.

    user_data :

    user data set when the signal handler was connected.

    Since 3.2


    The "dataRendered" signal

    void                user_function                      (VisuObject *visuObj,
                                                            GObject    *dataObj,
                                                            GObject    *view,
                                                            gpointer    user_data)      : No Hooks

    The given dataObj is fully set up and ready for rendering (no further internal modifications will occur).

    visuObj :

    the object emitting the signal.

    dataObj :

    the VisuData object to be rendered on view.

    view :

    the view to render to.

    user_data :

    user data set when the signal handler was connected.

    The "dataUnRendered" signal

    void                user_function                      (VisuObject *visuObj,
                                                            GObject    *dataObj,
                                                            GObject    *view,
                                                            gpointer    user_data)      : No Hooks

    The given dataObj is not rendered anymore on view.

    visuObj :

    the object emitting the signal.

    dataObj :

    the VisuData object that was rendered on view.

    view :

    the view dataObj was rendered to.

    user_data :

    user data set when the signal handler was connected.

    Since 3.7


    The "entryParsed" signal

    void                user_function                      (VisuObject *visuObj,
                                                            gchar      *key,
                                                            gpointer    user_data)      : No Hooks

    The entry key of a configuration file has just been successfully parsed.

    visuObj :

    the object emitting the signal.

    key :

    the key that has been parsed.

    user_data :

    user data set when the signal handler was connected.

    Since 3.7


    The "renderingChanged" signal

    void                user_function                      (VisuObject *visuObj,
                                                            gpointer    meth,
                                                            gpointer    user_data)      : No Hooks

    The rendering method has been changed.

    visuObj :

    the object emitting the signal.

    meth :

    the newly chosen VisuRendering method.

    user_data :

    user data set when the signal handler was connected.

    The "resourcesLoaded" signal

    void                user_function                      (VisuObject *visuObj,
                                                            GObject    *dataObj,
                                                            gpointer    user_data)      : No Hooks

    The resource file has been read.

    visuObj :

    the object emitting the signal.

    dataObj :

    the associated VisuData.

    user_data :

    user data set when the signal handler was connected.

    The "shadeNewAvailable" signal

    void                user_function                      (VisuObject *visuObj,
                                                            gpointer    shade,
                                                            gpointer    user_data)      : No Hooks

    A new ToolShade is available.

    visuObj :

    the object emitting the signal.

    shade :

    the newly created ToolShade.

    user_data :

    user data set when the signal handler was connected.

    Since 3.7


    The "viewNew" signal

    void                user_function                      (VisuObject *visuObj,
                                                            GObject    *view,
                                                            gpointer    user_data)      : No Hooks

    A new VisuGlView is available.

    visuObj :

    the object emitting the signal.

    view :

    the newly created VisuGlView.

    user_data :

    user data set when the signal handler was connected.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/VisuPairLink.html0000644000353400050620000021353312216331356020553 00000000000000 VisuPairLink

    VisuPairLink

    VisuPairLink — V_Sim can draw link between nodes. This part defines a pair object and interface to draw pairs.

    Synopsis

    #define             VISU_PAIR_DISTANCE_MAX
    #define             VISU_PAIR_DISTANCE_MIN
                        VisuPair;
    struct              VisuPairDistribution;
    void                (*VisuPairForeachFunc)              (VisuElement *ele1,
                                                             VisuElement *ele2,
                                                             VisuPairLink *data,
                                                             gpointer user_data);
    struct              VisuPairLink;
    struct              VisuPairLinkClass;
    gboolean            visu_pair_distribution_getNextPick  (VisuPairDistribution *dd,
                                                             guint startStopId[2],
                                                             guint *integral,
                                                             guint *max,
                                                             guint *posMax);
    void                visu_pair_foreach                   (VisuPairForeachFunc whatToDo,
                                                             gpointer user_data);
    VisuPairDistribution * visu_pair_getDistanceDistribution
                                                            (VisuPair *pair,
                                                             VisuData *dataObj,
                                                             float step,
                                                             float min,
                                                             float max);
    void                visu_pair_getElements               (const VisuPair *pair,
                                                             VisuElement **ele1,
                                                             VisuElement **ele2);
    VisuPair *          visu_pair_getPair                   (VisuElement *ele1,
                                                             VisuElement *ele2);
    gpointer            visu_pair_getProperty               (VisuPair *pair,
                                                             const gchar *key);
    GList *             visu_pair_link_getAll               (VisuElement *ele1,
                                                             VisuElement *ele2);
    ToolColor *         visu_pair_link_getColor             (const VisuPairLink *data);
    float               visu_pair_link_getDistance          (const VisuPairLink *data,
                                                             int minOrMax);
    gboolean            visu_pair_link_getDrawn             (const VisuPairLink *data);
    VisuPairLink *      visu_pair_link_getFromId            (VisuElement *ele1,
                                                             VisuElement *ele2,
                                                             guint pos);
    VisuPair *          visu_pair_link_getPair              (const VisuPairLink *data);
    gboolean            visu_pair_link_getPrintLength       (const VisuPairLink *data);
    gboolean            visu_pair_link_isDrawn              (const VisuPairLink *data);
    VisuPairLink *      visu_pair_link_new                  (VisuElement *ele1,
                                                             VisuElement *ele2,
                                                             float minMax[2]);
    gboolean            visu_pair_link_setColor             (VisuPairLink *data,
                                                             ToolColor *destColor);
    gboolean            visu_pair_link_setDistance          (VisuPairLink *data,
                                                             float val,
                                                             int minOrMax);
    gboolean            visu_pair_link_setDrawn             (VisuPairLink *data,
                                                             gboolean drawn);
    gboolean            visu_pair_link_setPrintLength       (VisuPairLink *data,
                                                             gboolean status);
    gboolean            visu_pair_readLinkFromTokens        (gchar **tokens,
                                                             int *index,
                                                             VisuPairLink **data,
                                                             int position,
                                                             GError **error);
    gboolean            visu_pair_removePairLink            (VisuElement *ele1,
                                                             VisuElement *ele2,
                                                             VisuPairLink *data);
    void                visu_pair_setProperty               (VisuPair *pair,
                                                             const gchar *key,
                                                             gpointer value,
                                                             GDestroyNotify freeFunc);
    

    Object Hierarchy

      GObject
       +----VisuPairLink
    

    Description

    The visu_pairs.c defines only general methods to draw pairs. It introduces a new object called VisuPairLink. This stores some characteristics on links between two VisuElement. The main characteristic is that pairs are drawn only if the length between two nodes is in a specific range. Use visu_pair_link_setDistance() and visu_pair_link_getDistance() to tune this range.

    This file does not draw any pairs. But it gives some interface to create rendering capabilities. To create a new pair rendering module, called VisuPairExtension, use visu_pair_extension_new(). Basically, a VisuPairExtension is characterized by it drawing method. But it can have other methods that are called in different cases. See main() and startStop() prototypes to have more informations.

    Details

    VISU_PAIR_DISTANCE_MAX

    #define VISU_PAIR_DISTANCE_MAX 1
    

    Flag used to define the maximum length to draw pair. This is useful with the visu_pair_link_getDistance() and the visu_pair_link_setDistance() methods.


    VISU_PAIR_DISTANCE_MIN

    #define VISU_PAIR_DISTANCE_MIN 0
    

    Flag used to define the minimum length to draw pair. This is useful with the visu_pair_link_getDistance() and the visu_pair_link_setDistance() methods.


    VisuPair

    typedef struct _VisuPair VisuPair;

    An opaque structure to define links (i.e. several VisuPairLink) between elements.


    struct VisuPairDistribution

    struct VisuPairDistribution {
      VisuElement *ele1, *ele2;
      guint *histo;
      guint nValues;
      float initValue, stepValue;
      guint nNodesEle1, nNodesEle2;
    };
    

    This structure stores for a given pair, the distance distribution on a given range [initValue;nValues * stepValue[.

    VisuElement *ele1;

    one VisuElement.

    VisuElement *ele2;

    one VisuElement.

    guint *histo;

    an array containing the distribution ;

    guint nValues;

    the size of the array ;

    float initValue;

    the initial distance value (usualy 0) ;

    float stepValue;

    the step increase in distance at each value ;

    guint nNodesEle1;

    the number of nodes used during the computation ;

    guint nNodesEle2;

    idem for VisuElement 2.

    VisuPairForeachFunc ()

    void                (*VisuPairForeachFunc)              (VisuElement *ele1,
                                                             VisuElement *ele2,
                                                             VisuPairLink *data,
                                                             gpointer user_data);

    Prototype of functions called with the foreach method apply to each pairs.

    ele1 :

    a VisuElement object ;

    ele2 :

    a VisuElement object ;

    data :

    a VisuPairLink object ;

    user_data :

    some user defined data.

    struct VisuPairLink

    struct VisuPairLink;

    An opaque structure.


    struct VisuPairLinkClass

    struct VisuPairLinkClass {
      GObjectClass parent;
    };
    

    A short way to identify _VisuPairLinkClass structure.

    GObjectClass parent;

    the parent class;

    visu_pair_distribution_getNextPick ()

    gboolean            visu_pair_distribution_getNextPick  (VisuPairDistribution *dd,
                                                             guint startStopId[2],
                                                             guint *integral,
                                                             guint *max,
                                                             guint *posMax);

    Try to find the next pick in the distribution. A pick is a group of consecutive non-null values, with a significant integral. On enter, startStopId contains the span to look into for the pick, and on output, it contains the span of the pick itself.

    dd :

    a VisuPairDistribution object.

    startStopId :

    two ids.

    integral :

    a location for a guint value, can be NULL.

    max :

    a location to store the value ;

    posMax :

    a location to store the position of the pick.

    Returns :

    TRUE if a pick is found.

    Since 3.6


    visu_pair_foreach ()

    void                visu_pair_foreach                   (VisuPairForeachFunc whatToDo,
                                                             gpointer user_data);

    The way VisuPairLink are stored in V_Sim is private and could changed between version. This method is used to apply some method each pairs.

    whatToDo :

    a VisuPairForeachFunc() method ;. [scope call]

    user_data :

    some user defined data.

    visu_pair_getDistanceDistribution ()

    VisuPairDistribution * visu_pair_getDistanceDistribution
                                                            (VisuPair *pair,
                                                             VisuData *dataObj,
                                                             float step,
                                                             float min,
                                                             float max);

    This will compute the distnace distribution of nodes for the given pair.

    pair :

    a VisuPair ;

    dataObj :

    a VisuData ;

    step :

    a float for the distance mesh (negative value to use built-in default) ;

    min :

    a float for the minimum scanning value (negative value to use built-in default).

    max :

    a float for the maximum scanning value (negative value to use built-in default).

    Returns :

    a structure defining the distance distribution. This structure is private and should not be freed.

    visu_pair_getElements ()

    void                visu_pair_getElements               (const VisuPair *pair,
                                                             VisuElement **ele1,
                                                             VisuElement **ele2);

    Retrieve the VisuElement constituting the pair.

    pair :

    a VisuPair object.

    ele1 :

    a location to store a VisuElement object pointer. [out][allow-none][transfer none]

    ele2 :

    a location to store a VisuElement object pointer. [out][allow-none][transfer none]

    Since 3.7


    visu_pair_getPair ()

    VisuPair *          visu_pair_getPair                   (VisuElement *ele1,
                                                             VisuElement *ele2);

    The object VisuPair is used to characterized links between two elements.

    ele1 :

    a VisuElement object ;

    ele2 :

    a VisuElement object.

    Returns :

    the VisuPair object associated to the given two elements. If none exists it is created. The returned value should not be freed. [transfer none]

    visu_pair_getProperty ()

    gpointer            visu_pair_getProperty               (VisuPair *pair,
                                                             const gchar *key);

    Retrieve the property associated to the key or NULL if none exist.

    pair :

    a VisuPair object ;

    key :

    a string.

    Returns :

    the associated data. [transfer none]

    visu_pair_link_getAll ()

    GList *             visu_pair_link_getAll               (VisuElement *ele1,
                                                             VisuElement *ele2);

    There can be one or several links between elements, retrieve them with this routine.

    ele1 :

    a VisuElement object ;

    ele2 :

    a VisuElement object.

    Returns :

    a list of VisuPairLink. The list is owned by V_Sim and should not be freed. [element-type VisuPairLink*][transfer none]

    visu_pair_link_getColor ()

    ToolColor *         visu_pair_link_getColor             (const VisuPairLink *data);

    Look for the properties of the pair data to find if a colour has been defined. If none, the default colour is returned instead.

    data :

    a VisuPairLink object.

    Returns :

    a colour (don't free it). [transfer none]

    visu_pair_link_getDistance ()

    float               visu_pair_link_getDistance          (const VisuPairLink *data,
                                                             int minOrMax);

    A pair between ele1 and ele2 is drawn only if its length is between a minimum and a maximum value. This method can get these values.

    data :

    a VisuPairLink object ;

    minOrMax :

    VISU_PAIR_DISTANCE_MIN or VISU_PAIR_DISTANCE_MAX.

    Returns :

    the minimum or the maximum value for the pair between ele1 and ele2.

    visu_pair_link_getDrawn ()

    gboolean            visu_pair_link_getDrawn             (const VisuPairLink *data);

    A pair can or cannot be drawn, use this method to retrieve its state.

    data :

    a VisuPairLink object ;

    Returns :

    TRUE if pairs can be drawn.

    visu_pair_link_getFromId ()

    VisuPairLink *      visu_pair_link_getFromId            (VisuElement *ele1,
                                                             VisuElement *ele2,
                                                             guint pos);

    A link can also be retrieved by its position.

    ele1 :

    a VisuElement object ;

    ele2 :

    a VisuElement object ;

    pos :

    the position in the list of links.

    Returns :

    the VisuPairLink object associated to the given two elements and distances. If none exists NULL is returned. [transfer none]

    visu_pair_link_getPair ()

    VisuPair *          visu_pair_link_getPair              (const VisuPairLink *data);

    A link object is always associated to a VisuPair.

    data :

    a VisuPairLink object.

    Returns :

    the VisuPair this link is related to. [transfer none]

    Since 3.7


    visu_pair_link_getPrintLength ()

    gboolean            visu_pair_link_getPrintLength       (const VisuPairLink *data);

    Get the print length parameter of a pair. This parameter is used to tell if length should be drawn near pairs of this kind.

    data :

    a VisuPairLink object.

    Returns :

    TRUE if length are printed.

    visu_pair_link_isDrawn ()

    gboolean            visu_pair_link_isDrawn              (const VisuPairLink *data);

    A link is used or not depending on a distance criterion and a flag, see visu_pair_link_setDrawn() and visu_pair_link_setDistance().

    data :

    a VisuPairLink object.

    Returns :

    TRUE if the data is indeed drawn or not.

    Since 3.7


    visu_pair_link_new ()

    VisuPairLink *      visu_pair_link_new                  (VisuElement *ele1,
                                                             VisuElement *ele2,
                                                             float minMax[2]);

    A link between two elements is characterized by its boundary distances.

    ele1 :

    a VisuElement object ;

    ele2 :

    a VisuElement object ;

    minMax :

    the two min and max distances. [array fixed-size=2]

    Returns :

    the VisuPairLink object associated to the given two elements and distances. If none exists it is created. The returned value should not be freed. [transfer none]

    visu_pair_link_setColor ()

    gboolean            visu_pair_link_setColor             (VisuPairLink *data,
                                                             ToolColor *destColor);

    Set the color of the given pair.

    data :

    a VisuPairLink object ;

    destColor :

    a ToolColor object.

    Returns :

    TRUE if parameter has been changed.

    visu_pair_link_setDistance ()

    gboolean            visu_pair_link_setDistance          (VisuPairLink *data,
                                                             float val,
                                                             int minOrMax);

    Set the minimum or the maximum length for the given pair.

    val :

    a floating point value ;

    data :

    a VisuPairLink object ;

    minOrMax :

    VISU_PAIR_DISTANCE_MAX or VISU_PAIR_DISTANCE_MIN.

    Returns :

    TRUE if parameter has been changed.

    visu_pair_link_setDrawn ()

    gboolean            visu_pair_link_setDrawn             (VisuPairLink *data,
                                                             gboolean drawn);

    A pair can or cannot be drawn, use this method to tune it.

    data :

    a VisuPairLink object ;

    drawn :

    a boolean.

    Returns :

    TRUE if parameter has been changed.

    visu_pair_link_setPrintLength ()

    gboolean            visu_pair_link_setPrintLength       (VisuPairLink *data,
                                                             gboolean status);

    Set the attribute that controls if the length of pairs are drawn near pairs.

    data :

    a VisuPairLink object ;

    status :

    TRUE to print length near pairs.

    Returns :

    TRUE if parameter has been changed.

    visu_pair_readLinkFromTokens ()

    gboolean            visu_pair_readLinkFromTokens        (gchar **tokens,
                                                             int *index,
                                                             VisuPairLink **data,
                                                             int position,
                                                             GError **error);

    This routine is used to read the resource file. Given tokens, it associate a link object by reading the two elements and the two distances that characterised this link.

    tokens :

    array of tokens resulting from a call to g_strsplit() with " " as separator ;

    index :

    IN, the position of the beginning in tokens ; OUT, one token after the last read ;

    data :

    a pointer to return an allocated link object ;

    position :

    the number of the line of the config file which the line argument is taken from ;

    error :

    a location to store a possible reading error.

    Returns :

    TRUE if succeed.

    visu_pair_removePairLink ()

    gboolean            visu_pair_removePairLink            (VisuElement *ele1,
                                                             VisuElement *ele2,
                                                             VisuPairLink *data);

    Delete the given link.

    ele1 :

    a VisuElement object ;

    ele2 :

    a VisuElement object ;

    data :

    a link object.

    Returns :

    TRUE if the link exists and has been successfully removed.

    visu_pair_setProperty ()

    void                visu_pair_setProperty               (VisuPair *pair,
                                                             const gchar *key,
                                                             gpointer value,
                                                             GDestroyNotify freeFunc);

    Each element/element can have associated data.

    pair :

    a VisuPair object ;

    key :

    a static string ;

    value :

    a pointer to some allocated data ;

    freeFunc :

    a destroying method (can be NULL).

    Signal Details

    The "ParameterChanged" signal

    void                user_function                      (VisuPairLink *data,
                                                            gpointer      user_data)      : No Recursion

    Gets emitted when some rendering parameter of data has been changed.

    data :

    the object which received the signal ;

    user_data :

    user data set when the signal handler was connected.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/VisuRendering.html0000644000353400050620000021553612216331356020764 00000000000000 VisuRendering

    VisuRendering

    VisuRendering — Methods to create and add new rendering methods.

    Synopsis

    struct              VisuRendering;
    struct              VisuRenderingClass;
    int                 (*VisuRenderingCreateElementFunc)   (VisuElement *ele,
                                                             VisuGlView *view);
    void                (*VisuRenderingCreateNodeFunc)      (VisuData *visuData,
                                                             VisuNode *node,
                                                             VisuElement *ele,
                                                             int eleGlId);
    enum                VisuRenderingErrorFlag;
    int                 (*VisuRenderingGetElementGlId)      (VisuElement *ele);
    float               (*VisuRenderingGetNodeExtendFunc)   (VisuElement *ele);
    gboolean            (*VisuRenderingLoadFormatFunc)      (VisuData *data,
                                                             const gchar *filename,
                                                             ToolFileFormat *format,
                                                             int nSet,
                                                             GCancellable *cancel,
                                                             GError **error);
    void                visu_rendering_addFileFormat        (VisuRendering *method,
                                                             guint fileType,
                                                             ToolFileFormat *fmt,
                                                             guint priority,
                                                             VisuRenderingLoadFormatFunc loadFunc);
    GQuark              visu_rendering_class_getErrorQuark  (void);
    int                 visu_rendering_createElement        (VisuRendering *method,
                                                             VisuElement *element,
                                                             VisuGlView *view);
    void                visu_rendering_createNode           (VisuRendering *method,
                                                             VisuData *data,
                                                             VisuNode *node,
                                                             VisuElement *ele,
                                                             int eleGlId);
    GList *             visu_rendering_getAllObjects        (void);
    VisuRendering *     visu_rendering_getByName            (const gchar *name);
    const gchar *       visu_rendering_getDescription       (VisuRendering *method);
    int                 visu_rendering_getElementGlId       (VisuRendering *method,
                                                             VisuElement *ele);
    GList *             visu_rendering_getFileFormat        (VisuRendering *method,
                                                             guint fileType);
    const gchar *       visu_rendering_getFileTypeName      (VisuRendering *method,
                                                             guint fileType);
    const gchar *       visu_rendering_getIconPath          (VisuRendering *method);
    guint               visu_rendering_getNFileTypes        (VisuRendering *method);
    const gchar *       visu_rendering_getName              (VisuRendering *method,
                                                             gboolean UTF8);
    float               visu_rendering_getSizeOfElement     (VisuRendering *method,
                                                             VisuElement *ele);
    gboolean            visu_rendering_load                 (VisuRendering *method,
                                                             VisuData *data,
                                                             int nSet,
                                                             GCancellable *cancel,
                                                             GError **error);
    void                visu_rendering_setFileFormat        (VisuRendering *meth,
                                                             guint fileType,
                                                             VisuRendering *from);
    void                visu_rendering_setFileTypeLabel     (VisuRendering *method,
                                                             guint fileType,
                                                             const gchar *name);
    void                visu_rendering_setIcon              (VisuRendering *method,
                                                             const gchar *path);
    

    Object Hierarchy

      GObject
       +----VisuRendering
             +----VisuRenderingAtomic
             +----VisuRenderingSpin
    

    Properties

      "description"              gchar*                : Read / Write
      "label"                    gchar*                : Read / Write
      "nFiles"                   guint                 : Read / Write / Construct Only
      "name"                     gchar*                : Read / Write / Construct Only
    

    Description

    The way visu renders its data is done by modules. They are called rendering methods and they describes how data are drawn on the screen. Many can be defined but only one is used at a time to render the data.

    One or more file type are associated with a rendering method. And a rendering method must specify the way to load the data it needs. Taking the example of a spin system representation, there are two kinds of file. The first kind describes the position the spin and the second contains their orientations.

    To create a new rendering method, subclass VisuRendering. The name is mandatory and must be unique. The description is not compulsory. The number of file kinds is also required. Use renderingMethodSet_fileType() to associated a GList of ToolFileFormat. In our example of spin system, the first kind of file is about positions, and the associated file formats are *.ascii, *.d3 and *.xyz.

    The VisuRendering_struct has to two pointers on methods that are important. The first, createOpenGLElementFunc() is called when V_Sim needs to create an OpenGL list corresponding to the VisuElement given as argument. This list then can be used to render each node and thus accelerating the rendering operations. The second method is createOpenGLNodeFunc() and is called by V_Sim for each node of the system when the main OpenGL list (the one for the nodes) is created. Thus, in the contrary of the first method, thios one should not create an OpenGL list but directly call OpenGL routines to draw the node. This method is also responsible to put the node at the right position. Use visu_data_getNodePosition() to retrieve the position and translate the node accordingly.

    Details

    struct VisuRendering

    struct VisuRendering;

    This structure is used to describe a rendering method. Besides names, representing icon... this structure stores pointers to method technically used to draw elements with this method.


    struct VisuRenderingClass

    struct VisuRenderingClass {
      GObjectClass parent;
    
      VisuRenderingCreateElementFunc createElement;
      VisuRenderingGetElementGlId    getElementGlId;
      VisuRenderingCreateNodeFunc    createNode;
      VisuRenderingGetNodeExtendFunc getNodeExtend;
    };
    

    The structure for the VisuRenderingClass class.

    GObjectClass parent;

    the parent class.

    VisuRenderingCreateElementFunc createElement;

    a virtual method to create OpenGL shape for a given VisuElement.

    VisuRenderingGetElementGlId getElementGlId;

    a virtual method to get the OpenGL list id used for elements.

    VisuRenderingCreateNodeFunc createNode;

    a virtual method to position and draw a specific VisuNode.

    VisuRenderingGetNodeExtendFunc getNodeExtend;

    a virtual method to get the size of a given VisuElement.

    VisuRenderingCreateElementFunc ()

    int                 (*VisuRenderingCreateElementFunc)   (VisuElement *ele,
                                                             VisuGlView *view);

    Such functions are called whenever a newElement is registered.

    ele :

    a VisuElement object ;

    view :

    a VisuGlView object.

    Returns :

    an id representing an OpenGL list in which the element has been created.

    VisuRenderingCreateNodeFunc ()

    void                (*VisuRenderingCreateNodeFunc)      (VisuData *visuData,
                                                             VisuNode *node,
                                                             VisuElement *ele,
                                                             int eleGlId);

    Such functions are called to draw node at its right position. The ele parameter is the VisuElement of the given node and the visuData one points to the VisuData object that contains this node. eleGlId additionnal parameter represent an identifier to the OpenGL list ele is represented by. One can use this parameter to avoid calling visu_rendering_getElementGlId() for each node.

    visuData :

    a VisuData object ;

    node :

    a VisuElement ;

    ele :

    a VisuElement ;

    eleGlId :

    an identifier.

    enum VisuRenderingErrorFlag

    typedef enum {
        RENDERING_ERROR_METHOD,   /* Error from the rendering method. */
        RENDERING_ERROR_FILE,     /* Error when opening. */
        RENDERING_ERROR_FORMAT,   /* Wrongness in format. */
        RENDERING_ERROR_CANCEL    /* Cancellation asked. */
    } VisuRenderingErrorFlag;
    

    Thiese are flags used when reading a file with a rendering method.

    RENDERING_ERROR_METHOD

    Error from the rendering method.

    RENDERING_ERROR_FILE

    Error when opening.

    RENDERING_ERROR_FORMAT

    Wrongness in format.

    RENDERING_ERROR_CANCEL

    the rendering operation has been cancelled.

    VisuRenderingGetElementGlId ()

    int                 (*VisuRenderingGetElementGlId)      (VisuElement *ele);

    This function is used to get the OpenGL list identifier for ele.

    ele :

    a VisuElement.

    Returns :

    an id.

    Since 3.7


    VisuRenderingGetNodeExtendFunc ()

    float               (*VisuRenderingGetNodeExtendFunc)   (VisuElement *ele);

    This function is required to inform the OpenGL drawer and to adapt the maximum size of the drawing area.

    ele :

    a VisuElement.

    Returns :

    the geometrical size of the element.

    VisuRenderingLoadFormatFunc ()

    gboolean            (*VisuRenderingLoadFormatFunc)      (VisuData *data,
                                                             const gchar *filename,
                                                             ToolFileFormat *format,
                                                             int nSet,
                                                             GCancellable *cancel,
                                                             GError **error);

    This is an interface for a generic load method. This method read the file positionned on filename and populate or change the arrays in data. When enter this method, the data argument is already allocated but its arrays may be empty and unallocated (depending on context). If the load method fails (because the format is wrong or anything else), the data argument should not be modified. If some errors occur, the pointer error will be instanciated. A VisuRendering can have several VisuRenderingLoadFormatFunc methods for each format they support. The nSet argument is used to load a specific set of nodes if the input format supports it. If nSet is 0, then the default set of nodes is loaded.

    data :

    a VisuData object ;. [transfer full]

    filename :

    the access to the file to load ;

    format :

    a ToolFileFormat object (can be NULL) ;

    nSet :

    an integer ;

    cancel :

    a cancellable.

    error :

    a pointer to store possible errors.

    Returns :

    FALSE if data is unchanged (wrong format), TRUE otherwise (even if some minor errors have happened).

    visu_rendering_addFileFormat ()

    void                visu_rendering_addFileFormat        (VisuRendering *method,
                                                             guint fileType,
                                                             ToolFileFormat *fmt,
                                                             guint priority,
                                                             VisuRenderingLoadFormatFunc loadFunc);

    Add a file format descriptor to the list of already known file formats of the key fileType.

    method :

    a method ;

    fileType :

    an integer used as a key, must >= 0 and < method->nFiles.

    fmt :

    a ToolFileFormat ;

    priority :

    the priority (lower sooner) ;

    loadFunc :

    the loading routine. [scope call]

    visu_rendering_class_getErrorQuark ()

    GQuark              visu_rendering_class_getErrorQuark  (void);

    Internal function to handle error.

    Returns :

    a GQuark for VisuRendering method errors.

    visu_rendering_createElement ()

    int                 visu_rendering_createElement        (VisuRendering *method,
                                                             VisuElement *element,
                                                             VisuGlView *view);

    Use the create element function of method to render element for the given zoom level.

    method :

    a VisuRendering method.

    element :

    a VisuElement object.

    view :

    a VisuGlView object.

    Returns :

    the OpenGL list id of this element.

    Since 3.6


    visu_rendering_createNode ()

    void                visu_rendering_createNode           (VisuRendering *method,
                                                             VisuData *data,
                                                             VisuNode *node,
                                                             VisuElement *ele,
                                                             int eleGlId);

    Create node at the right position calling OpenGL routines.

    method :

    a VisuRendering method.

    data :

    the VisuData object the node is taken from.

    node :

    a VisuNode of data.

    ele :

    the VisuElement of node or NULL. [allow-none]

    eleGlId :

    the OpenGL list id repsresenting ele or -1 to get the default one.

    Since 3.6


    visu_rendering_getAllObjects ()

    GList *             visu_rendering_getAllObjects        (void);

    This method gives a GList with pointers to each rendering method. Warning : the returned GList is not a copy, it must not be modified, just read.

    Returns :

    A GList containing all the registered rendering methods. [element-type VisuRendering*][transfer none]

    visu_rendering_getByName ()

    VisuRendering *     visu_rendering_getByName            (const gchar *name);

    Get the corresponding VisuRendering method to name.

    name :

    a string. [type filename]

    Returns :

    . [transfer none]

    Since 3.6


    visu_rendering_getDescription ()

    const gchar *       visu_rendering_getDescription       (VisuRendering *method);

    Get its description (in UTF8).

    method :

    a VisuRendering method.

    Returns :

    a string, owned by V_Sim.

    visu_rendering_getElementGlId ()

    int                 visu_rendering_getElementGlId       (VisuRendering *method,
                                                             VisuElement *ele);

    This method is used to get the OpenGL identifier of a list for ele.

    method :

    a method ;

    ele :

    a VisuElement object.

    Returns :

    a OpenGL list identifier.

    Since 3.7


    visu_rendering_getFileFormat ()

    GList *             visu_rendering_getFileFormat        (VisuRendering *method,
                                                             guint fileType);

    This method is used to get the file formats associated to a kind of input file handled by the rendering method.

    method :

    this VisuRendering object.

    fileType :

    the file kind of filee format to get from.

    Returns :

    a GList* with the ToolFileFormat. This GList should been considered read-only. [transfer container][element-type ToolFileFormat*]

    Since 3.6


    visu_rendering_getFileTypeName ()

    const gchar *       visu_rendering_getFileTypeName      (VisuRendering *method,
                                                             guint fileType);

    This method is used to get the name associated to a kind of input file handled by the rendering method.

    method :

    a method ;

    fileType :

    an integer used as a key, must >= 0 and < method->priv->nFiles.

    Returns :

    a string own by V_Sim. This string should been considered read-only.

    visu_rendering_getIconPath ()

    const gchar *       visu_rendering_getIconPath          (VisuRendering *method);

    Get the location where to find the icon of the method.

    method :

    a VisuRendering method.

    Returns :

    a string, owned by V_Sim.

    visu_rendering_getNFileTypes ()

    guint               visu_rendering_getNFileTypes        (VisuRendering *method);

    This method is used to get the number of kind of files needed to render a set of data.

    method :

    a method.

    Returns :

    how many kind of files are handled by the given VisuRendering.

    visu_rendering_getName ()

    const gchar *       visu_rendering_getName              (VisuRendering *method,
                                                             gboolean UTF8);

    Get its name (in UTF8 or not).

    method :

    a VisuRendering method.

    UTF8 :

    a boolean.

    Returns :

    a string, owned by V_Sim.

    visu_rendering_getSizeOfElement ()

    float               visu_rendering_getSizeOfElement     (VisuRendering *method,
                                                             VisuElement *ele);

    This method is used to retrieve the radius of the sphere that contains the ele.

    method :

    a method ;

    ele :

    a VisuElement to get the size of.

    Returns :

    the radius of the given element.

    visu_rendering_load ()

    gboolean            visu_rendering_load                 (VisuRendering *method,
                                                             VisuData *data,
                                                             int nSet,
                                                             GCancellable *cancel,
                                                             GError **error);

    Call the load routine of method. Filenames to read from should have been set to data using visu_data_addFile(). If format is NULL, an automatic detection is used, trying all available file formats.

    method :

    a VisuRendering method.

    data :

    a new VisuData object to load into.

    nSet :

    the set id to read from.

    cancel :

    a cancellable.

    error :

    a location for possible error.

    Returns :

    TRUE on success.

    visu_rendering_setFileFormat ()

    void                visu_rendering_setFileFormat        (VisuRendering *meth,
                                                             guint fileType,
                                                             VisuRendering *from);

    It copies the ToolFileFormat of method from to meth for the given fileType.

    meth :

    a VisuRendering object.

    fileType :

    a file kind id.

    from :

    a VisuRendering object.

    Since 3.6


    visu_rendering_setFileTypeLabel ()

    void                visu_rendering_setFileTypeLabel     (VisuRendering *method,
                                                             guint fileType,
                                                             const gchar *name);

    Store a list of ToolFileFormat for the kind of file fileType. The name argument is copied. but warning, the fileTypeList GList* is not copied.

    method :

    a method ;

    fileType :

    an integer used as a key, must >= 0 and < method->nFiles ;

    name :

    a string to shortly describe the kind of file type (not NULL).

    visu_rendering_setIcon ()

    void                visu_rendering_setIcon              (VisuRendering *method,
                                                             const gchar *path);

    This method is used to set the path to an icon for the specified method. The path is copied, and the given name can be freed freely after a call to this method.

    method :

    a method ;

    path :

    a path to an image file.

    Property Details

    The "description" property

      "description"              gchar*                : Read / Write

    Description of the method.

    Default value: ""


    The "label" property

      "label"                    gchar*                : Read / Write

    Label of the method.

    Default value: ""


    The "nFiles" property

      "nFiles"                   guint                 : Read / Write / Construct Only

    Required number of input files to read to load a data.

    Allowed values: [1,100]

    Default value: 1


    The "name" property

      "name"                     gchar*                : Read / Write / Construct Only

    Name of the method.

    Default value: ""

    Signal Details

    The "elementSizeChanged" signal

    void                user_function                      (VisuRendering *obj,
                                                            gfloat         size,
                                                            gpointer       user_data)      : No Recursion

    Emitted when the size of a element is changed.

    obj :

    the object emitting the signal.

    size :

    the new size.

    user_data :

    user data set when the signal handler was connected.

    Since 3.6


    The "fileTypeChanged" signal

    void                user_function                      (VisuRendering *obj,
                                                            gpointer       user_data)      : No Hooks

    TODO

    obj :

    the object emitting the signal.

    user_data :

    user data set when the signal handler was connected.

    Since 3.6

    v_sim-3.7.0/Documentation/reference/html/VisuScalarField.html0000644000353400050620000020310512216331356021205 00000000000000 VisuScalarField

    VisuScalarField

    VisuScalarField — Gives capabilities to load a scalar field.

    Synopsis

    #define             VISU_SCALAR_FIELD_DEFINED_IN_STRUCT_FILE
    struct              VisuScalarField;
    struct              VisuScalarFieldClass;
    enum                VisuScalarFieldMeshFlags;
                        VisuScalarFieldMethod;
                        VisuScalarFieldMethodClass;
    gboolean            (*VisuScalarFieldMethodLoadFunc)    (VisuScalarFieldMethod *meth,
                                                             const gchar *filename,
                                                             GList **fieldList,
                                                             GError **error);
    void                visu_scalar_field_addOption         (VisuScalarField *field,
                                                             ToolOption *option);
    GList *             visu_scalar_field_getAllOptions     (VisuScalarField *field);
    const gchar *       visu_scalar_field_getCommentary     (VisuScalarField *field);
    double ***          visu_scalar_field_getData           (VisuScalarField *field);
    const GArray *      visu_scalar_field_getDataArray      (const VisuScalarField *field);
    const gchar *       visu_scalar_field_getFilename       (VisuScalarField *field);
    void                visu_scalar_field_getGridSize       (VisuScalarField *field,
                                                             guint grid[3]);
    VisuScalarFieldMeshFlags visu_scalar_field_getMeshtype  (VisuScalarField *field);
    double *            visu_scalar_field_getMeshx          (VisuScalarField *field);
    double *            visu_scalar_field_getMeshy          (VisuScalarField *field);
    double *            visu_scalar_field_getMeshz          (VisuScalarField *field);
    void                visu_scalar_field_getMinMax         (VisuScalarField *field,
                                                             double minmax[2]);
    void                visu_scalar_field_getOriginShift    (VisuScalarField *field,
                                                             float shift[3]);
    gboolean            visu_scalar_field_getValue          (VisuScalarField *field,
                                                             float xyz[3],
                                                             double *value,
                                                             float extension[3]);
    GList *             visu_scalar_field_method_getAll     (void);
    gboolean            visu_scalar_field_method_load       (VisuScalarFieldMethod *fmt,
                                                             const gchar *filename,
                                                             GList **fieldList,
                                                             GError **error);
    VisuScalarFieldMethod * visu_scalar_field_method_new    (const gchar *descr,
                                                             const gchar **patterns,
                                                             VisuScalarFieldMethodLoadFunc method,
                                                             int priority);
    VisuScalarField *   visu_scalar_field_new               (const gchar *filename);
    gboolean            visu_scalar_field_new_fromFile      (const gchar *filename,
                                                             GList **fieldList,
                                                             GHashTable *table,
                                                             GError **error);
    void                visu_scalar_field_setCommentary     (VisuScalarField *field,
                                                             const gchar *comment);
    void                visu_scalar_field_setData           (VisuScalarField *field,
                                                             GArray *data,
                                                             gboolean xyzOrder);
    void                visu_scalar_field_setGridSize       (VisuScalarField *field,
                                                             const guint grid[3]);
    void                visu_scalar_field_setMeshtype       (VisuScalarField *field,
                                                             VisuScalarFieldMeshFlags meshtype);
    void                visu_scalar_field_setOriginShift    (VisuScalarField *field,
                                                             const float shift[3]);
    

    Object Hierarchy

      GObject
       +----VisuScalarField
    
      GObject
       +----ToolFileFormat
             +----VisuScalarFieldMethod
    

    Implemented Interfaces

    VisuScalarField implements VisuBoxed.

    Description

    A scalar field is represented by the given of datas on a regular grid meshing the bounding box. Scalar field can be read from several kind of files by adding load methods using scalarFieldAdd_loadMethod(). The basic implementation gives access to ASCII encoded files following a simple format.

    When the scalar field is periodic, the values on the border x = 1, y = 1 or z = 1 can be obtained reading those of border x = 0, y = 0 or z = 0. So if there are n values in one direction, the nth is at position 1 - 1/n in box coordinates in that direction. On the contrary, for non-periodic scalar field, the nth value is at coordinate 1 in box system and can be different from value 0.

    In coordination with VisuPlane and ToolShade, scalar field can be represented as coloured map calling scalarFieldDraw_map(). The current implementation of interpolation is very limited since basic linear approximation is used.

    If a structure file also contains a scalar field, when loaded, it should add a VisuData property called VISU_SCALAR_FIELD_DEFINED_IN_STRUCT_FILE using g_object_set_data(). Then V_Sim will be able to handle the structure file as a density file also.

    Details

    VISU_SCALAR_FIELD_DEFINED_IN_STRUCT_FILE

    #define VISU_SCALAR_FIELD_DEFINED_IN_STRUCT_FILE "fileFormat_hasPotentialOrDensity"
    

    Flag used to registered a gboolean property in a VisuData object. If this flag is TRUE, the file used to read the structure can be used to read a density or a potential.


    struct VisuScalarField

    struct VisuScalarField;

    An opaque structure for the scalar field.


    struct VisuScalarFieldClass

    struct VisuScalarFieldClass {
      GObjectClass parent;
    };
    

    An opaque structure for the class.

    GObjectClass parent;

    the parent class.

    enum VisuScalarFieldMeshFlags

    typedef enum {
        VISU_SCALAR_FIELD_MESH_UNIFORM,
        VISU_SCALAR_FIELD_MESH_NON_UNIFORM
    } VisuScalarFieldMeshFlags;
    

    flag (comment) standing at the begining of a Scalar field file, that gives informations concerning the mesh.

    VISU_SCALAR_FIELD_MESH_UNIFORM

    the mesh has constant divisions along x, y and z axis ;

    VISU_SCALAR_FIELD_MESH_NON_UNIFORM

    the mesh has non linear divisions along x, y or z axis.

    VisuScalarFieldMethod

    typedef struct _VisuScalarFieldMethod VisuScalarFieldMethod;

    An opaque structure.


    VisuScalarFieldMethodClass

    typedef struct _VisuScalarFieldMethodClass VisuScalarFieldMethodClass;

    An opaque structure.


    VisuScalarFieldMethodLoadFunc ()

    gboolean            (*VisuScalarFieldMethodLoadFunc)    (VisuScalarFieldMethod *meth,
                                                             const gchar *filename,
                                                             GList **fieldList,
                                                             GError **error);

    Read the given file try to load it as a scalar field file. If succeed (i.e. with none fatal errors) the method should return TRUE, but if not fieldList must be unchanged and the method should return TRUE. If an error occurs, it is stored into error. When entering the routine, *error must be NULL. If table is given, it means that the caller routine gives some options to the loader routine. These options are a set of names and values.

    If the file contains several fields, they must be loaded and added to fieldList.

    meth :

    a VisuScalarFieldMethod object ;

    filename :

    the filename (path) the field should be loaded from ;. [type filename]

    fieldList :

    a GList to store read field(s) ;. [out][element-type VisuScalarField]

    error :

    a location on a error pointer.

    Returns :

    TRUE if the read file is in a valid format (even with minor errors), FALSE otherwise.

    visu_scalar_field_addOption ()

    void                visu_scalar_field_addOption         (VisuScalarField *field,
                                                             ToolOption *option);

    This method adds an option to the list of Option associated to the data. The given option will not be duplicated and should not be used elsewhere because it will be freed when the field will be freed.

    field :

    a VisuScalarField object ;

    option :

    a newly allocated option.

    visu_scalar_field_getAllOptions ()

    GList *             visu_scalar_field_getAllOptions     (VisuScalarField *field);

    Some Option can be stored in association to the values of the scalar field. These options are usually values associated to the read data, such as a spin direction when dealing with density of spin...

    field :

    a VisuScalarField object.

    Returns :

    a newly created GList that should be freed after use with g_list_free(). But data of the list are owned by V_Sim and should not be modified or freed. [transfer container][element-type ToolOption*]

    visu_scalar_field_getCommentary ()

    const gchar *       visu_scalar_field_getCommentary     (VisuScalarField *field);

    If the file format support a commentary, this is a good method to get it.

    field :

    a VisuScalarField object.

    Returns :

    a pointer on the commentary (it should not be freed), can be NULL.

    visu_scalar_field_getData ()

    double ***          visu_scalar_field_getData           (VisuScalarField *field);

    The data are stored as a 3 indexes array in x, y and z increasing.

    field :

    a VisuScalarField object.

    Returns :

    a pointer on the allocated data array (it should not be freed).

    visu_scalar_field_getDataArray ()

    const GArray *      visu_scalar_field_getDataArray      (const VisuScalarField *field);

    The data are stored z first in a flatten array.

    field :

    a VisuScalarField object.

    Returns :

    a pointer on the allocated data array. [transfer none][element-type double]

    Since 3.7


    visu_scalar_field_getFilename ()

    const gchar *       visu_scalar_field_getFilename       (VisuScalarField *field);

    The data are read from a file.

    field :

    a VisuScalarField object.

    Returns :

    a pointer on the filename (it should not be freed).

    visu_scalar_field_getGridSize ()

    void                visu_scalar_field_getGridSize       (VisuScalarField *field,
                                                             guint grid[3]);

    This method is used to get the division in x, y, and z directions.

    field :

    a VisuScalarField object ;

    grid :

    3 integer locations. [out caller-allocates][type ToolGridSize]

    visu_scalar_field_getMeshtype ()

    VisuScalarFieldMeshFlags visu_scalar_field_getMeshtype  (VisuScalarField *field);

    The vertex may be distributed linearly along the different directions or customily distributed.

    field :

    a VisuScalarField object ; to be added

    Returns :

    a VisuScalarFieldMeshFlags (uniform or nonuniform).

    visu_scalar_field_getMeshx ()

    double *            visu_scalar_field_getMeshx          (VisuScalarField *field);

    The mesh along x is stored as an array in x increasing.

    field :

    a VisuScalarField object.

    Returns :

    a pointer on the allocated meshx array (it should not be freed).

    visu_scalar_field_getMeshy ()

    double *            visu_scalar_field_getMeshy          (VisuScalarField *field);

    The mesh along y is stored as an array in y increasing.

    field :

    a VisuScalarField object.

    Returns :

    a pointer on the allocated meshy array (it should not be freed).

    visu_scalar_field_getMeshz ()

    double *            visu_scalar_field_getMeshz          (VisuScalarField *field);

    The mesh along z is stored as an array in z increasing.

    field :

    a VisuScalarField object.

    Returns :

    a pointer on the allocated meshz array (it should not be freed).

    visu_scalar_field_getMinMax ()

    void                visu_scalar_field_getMinMax         (VisuScalarField *field,
                                                             double minmax[2]);

    Get the minimum and the maximum values of the given field.

    field :

    a VisuScalarField object ;

    minmax :

    two double values. [array fixed-size=2]

    visu_scalar_field_getOriginShift ()

    void                visu_scalar_field_getOriginShift    (VisuScalarField *field,
                                                             float shift[3]);

    The scalar field can be shifted with respect to the origin of the VisuData box. Use this routine to get this shift.

    field :

    a VisuScalarField object.

    shift :

    a location to store the shift of field. [out caller-allocates][type ToolVector]

    Since 3.7


    visu_scalar_field_getValue ()

    gboolean            visu_scalar_field_getValue          (VisuScalarField *field,
                                                             float xyz[3],
                                                             double *value,
                                                             float extension[3]);

    Knowing the point coordinates, it interpolate a value from the scalar field. If the scalar field is periodic, then it allow the coordinates to extend inside the given extension.

    field :

    a VisuScalarField object ;

    xyz :

    a point coordinate (in real space) ;. [array fixed-size=3]

    value :

    a location to store the value ;. [out caller-allocates]

    extension :

    a possible extension in box coordinates. [array fixed-size=3]

    Returns :

    TRUE if the value can be interpolate, FALSE otherwise, for instance, when the point xyz is out of bounds.

    visu_scalar_field_method_getAll ()

    GList *             visu_scalar_field_method_getAll     (void);

    This routine gives access to all the registered load method for scamlar fields.

    Returns :

    returns a list of V_Sim owned VisuScalarFieldMethod objects. [transfer none][element-type VisuScalarFieldMethod*]

    visu_scalar_field_method_load ()

    gboolean            visu_scalar_field_method_load       (VisuScalarFieldMethod *fmt,
                                                             const gchar *filename,
                                                             GList **fieldList,
                                                             GError **error);

    Call the load routine of the given scalar field file format fmt.

    fmt :

    a VisuScalarFieldMethod object ;

    filename :

    a path ;. [type filename]

    fieldList :

    a location to store a list ;. [out][element-type VisuScalarField*]

    error :

    a location to an error.

    Returns :

    TRUE on success.

    Since 3.7


    visu_scalar_field_method_new ()

    VisuScalarFieldMethod * visu_scalar_field_method_new    (const gchar *descr,
                                                             const gchar **patterns,
                                                             VisuScalarFieldMethodLoadFunc method,
                                                             int priority);

    This routine is used to add a new method to load scalar field. The priority uses the scale of the GLib (G_PRIORITY_DEFAULT is 0, G_PRIORITY_LOW is 300 for instance).

    descr :

    the name of the method ;

    patterns :

    a NULL terminated list of strings ;. [array zero-terminated=1]

    method :

    a VisuScalarFieldMethodLoadFunc method ;. [scope call]

    priority :

    a priority value (the lower value, the higher priority).

    Returns :

    a newly create method to load scalar fields. [transfer full]

    visu_scalar_field_new ()

    VisuScalarField *   visu_scalar_field_new               (const gchar *filename);

    Create a new VisuScalarField object that is empty (all internal pointers are set to NULL and no memory is allocated except for the object itself. The filename argument is copied.

    filename :

    the path to the filename the field should be read from. [type filename]

    Returns :

    a newly created VisuScalarField object. [transfer full]

    visu_scalar_field_new_fromFile ()

    gboolean            visu_scalar_field_new_fromFile      (const gchar *filename,
                                                             GList **fieldList,
                                                             GHashTable *table,
                                                             GError **error);

    Read the given file and try to load it as a scalar field file. If succeed, all read fields are appended to the fieldList argument. If an error occurs, it is stored into error. When entering the routine, *error must be NULL. If table is given, it means that the caller routine gives some options to the loader routine. These options are a set of names and values.

    If the file contains several fields, they must be loaded and added to fieldList.

    filename :

    the path to the file to be loaded ;. [type filename]

    fieldList :

    a GList to store read field(s) ;. [transfer full][out][element-type VisuScalarField*]

    table :

    a set of different options (can be NULL). [allow-none]

    error :

    a location on a error pointer ;

    Returns :

    TRUE if everything goes with no error. [skip]

    visu_scalar_field_setCommentary ()

    void                visu_scalar_field_setCommentary     (VisuScalarField *field,
                                                             const gchar *comment);

    A commentary can be associated to a VisuScalarField, use this method to set it. The value of comment is NOT copied.

    field :

    a VisuScalarField object ;

    comment :

    an UTF-8 string to store as a commentary.

    visu_scalar_field_setData ()

    void                visu_scalar_field_setData           (VisuScalarField *field,
                                                             GArray *data,
                                                             gboolean xyzOrder);

    Set the data of the given field. The array data should be stored in z direction first, followed by y and x if xyzOrder is FALSE, or in the other order when TRUE. The number of elements in the x, y and z directions are read from field->priv->nElements. Then use visu_scalar_field_setGridSize() before using this method.

    field :

    a VisuScalarField object ;

    data :

    an array containing data to be copied ;. [element-type double]

    xyzOrder :

    a boolean.

    visu_scalar_field_setGridSize ()

    void                visu_scalar_field_setGridSize       (VisuScalarField *field,
                                                             const guint grid[3]);

    This method is used to set the division in x, y, and z directions. If the size of internal array for data is changed, it is reallocated and previous data are erased. Use visu_scalar_field_getData() to get a pointer on this data array.

    field :

    a VisuScalarField object ;

    grid :

    3 integers. [array fixed-size=3]

    visu_scalar_field_setMeshtype ()

    void                visu_scalar_field_setMeshtype       (VisuScalarField *field,
                                                             VisuScalarFieldMeshFlags meshtype);

    Change the distribution of the vertex of the scalarfield between regular or custom.

    field :

    a VisuScalarField object ;

    meshtype :

    a VisuScalarFieldMeshFlags object.

    visu_scalar_field_setOriginShift ()

    void                visu_scalar_field_setOriginShift    (VisuScalarField *field,
                                                             const float shift[3]);

    The scalar field can be shifted with respect to the origin of the VisuData box. Use this routine to set this shift.

    field :

    a VisuScalarField object.

    shift :

    a shift to apply to. [array fixed-size=3]

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/v-sim-atomic-xyz.html0000644000353400050620000001007112216331356021320 00000000000000 atomic_xyz

    atomic_xyz

    atomic_xyz — Method to load xyz position file.

    Synopsis

    void                initAtomicXyz                       (VisuRendering *method);
    

    Description

    XYZ formats are plain text format to store atomic positions. This format is quite simple, first line must contain the number of element, then the second usually store a commentary (but this is not required), then all lines that are not beginning with a '#' are tried to match "label x y z":. If succeed a node is added, if not, the next line is read as much time as specified on first line. This scheme can be repeated as much time as required to store animation for instance.

    Details

    initAtomicXyz ()

    void                initAtomicXyz                       (VisuRendering *method);

    Create the structure that gives access to a load method and some description of it (file formats associated, name...). Internal use only

    method :

    the VisuRendering method to be associated to.
    v_sim-3.7.0/Documentation/reference/html/v-sim-atomic-yaml.html0000644000353400050620000000752612216331356021443 00000000000000 atomic_yaml

    atomic_yaml

    atomic_yaml — Method to load YAML position file.

    Description

    YAML format is a plain text format to store atomic positions. This format is defined and used by BigDFT. It has meta-data available to store forces, total energy, units, boundary conditions...

    Details

    visu_rendering_atomic_yaml_init ()

    void                visu_rendering_atomic_yaml_init     (VisuRendering *method);

    Create the structure that gives access to a load method and some description of it (file formats associated, name...). Internal use only

    method :

    the VisuRendering method to be associated to.
    v_sim-3.7.0/Documentation/reference/html/v-sim-cylinder.html0000644000353400050620000003664612216331356021045 00000000000000 cylinder

    cylinder

    cylinder — Gives methods to draw cylinders as OpenGl objects pairing two elements.

    Description

    The cylinders have two characteristics: their radius and their colour. Their radius are in the units of the rendered box. They can be specific to each kind of pairs (e.g. Si-Si) or they have a default value. Only the default value is stored in the resource file with the flag "pairCylinder_radius". Their color is herited by the colour of the pair. The lighting values (i.e. emi., shi., spe. ...) are not movable and are fixed to amb = 0.5, dif = 0.5, shi = 0, spe = 0, emi = 0.

    Details

    VISU_GL_PAIRS_CYLINDER_RADIUS_MAX

    #define VISU_GL_PAIRS_CYLINDER_RADIUS_MAX 3.f
    

    Maximum value for the radius of cylinder pairs.


    VISU_GL_PAIRS_CYLINDER_RADIUS_MIN

    #define VISU_GL_PAIRS_CYLINDER_RADIUS_MIN 0.01f
    

    Minimum value for the radius of cylinder pairs.


    enum VisuGlPairsCylinderColorId

    typedef enum {
        VISU_GL_PAIRS_CYLINDER_COLOR_USER,
        VISU_GL_PAIRS_CYLINDER_COLOR_ELEMENT,
        VISU_GL_PAIRS_CYLINDER_N_COLOR
    } VisuGlPairsCylinderColorId;
    

    Possible flags to colourise the cylinder pairs.

    VISU_GL_PAIRS_CYLINDER_COLOR_USER

    color is chosen by the user.

    VISU_GL_PAIRS_CYLINDER_COLOR_ELEMENT

    color is chosen according to the color of the VisuElement the pair is linked to.

    VISU_GL_PAIRS_CYLINDER_N_COLOR

    number of choices for the colourisation.

    visu_gl_pairs_cylinder_getColorType ()

    VisuGlPairsCylinderColorId visu_gl_pairs_cylinder_getColorType
                                                            ();

    Get the color scheme.

    Returns :

    an integer corresponding to the color scheme (0 or 1).

    visu_gl_pairs_cylinder_getGeneralRadius ()

    float               visu_gl_pairs_cylinder_getGeneralRadius
                                                            ();

    Get the default value for cylinder radius.

    Returns :

    the default value for cylinder radius.

    visu_gl_pairs_cylinder_getRadius ()

    float               visu_gl_pairs_cylinder_getRadius    (VisuPairLink *data);

    Get the radius value for the specified pair.

    data :

    a VisuPairLink object.

    Returns :

    the radius value.

    visu_gl_pairs_cylinder_getStatic ()

    VisuPairExtension * visu_gl_pairs_cylinder_getStatic    ();

    Internal use only to get the cylinder extension.


    visu_gl_pairs_cylinder_init ()

    VisuPairExtension * visu_gl_pairs_cylinder_init         ();

    This method is used by V_Sim on startup, don't use it on your own.

    Returns :

    the cylinder pair extension.

    visu_gl_pairs_cylinder_setColorType ()

    gboolean            visu_gl_pairs_cylinder_setColorType (VisuGlPairsCylinderColorId val);

    It set the color scheme for cylinder pairs. It can be 0 or 1.

    val :

    a integer that identify the color scheme.

    Returns :

    TRUE if the calling method should take care of VisuGlExtPairs objects, FALSE if not.

    visu_gl_pairs_cylinder_setGeneralRadius ()

    gboolean            visu_gl_pairs_cylinder_setGeneralRadius
                                                            (float val);

    This method allows to change the default value of radius for cylinder pairs. When a pair is rendered via a cylinder, it first checks if that pairs has a specific radius value. If not, it uses the default value set by this method. If the default value is indeed changed, all VisuGlExtPairs objects should redraw themselves.

    val :

    a float value.

    Returns :

    TRUE if the calling method should take care of VisuGlExtPairs objects, FALSE if not.

    visu_gl_pairs_cylinder_setRadius ()

    gboolean            visu_gl_pairs_cylinder_setRadius    (VisuPairLink *data,
                                                             float val);

    This method allows to change the radius value of a specific pair. When a pair is rendered via a cylinder, it first checks if that pairs has a specific radius value set by this method. If not, it uses the default value.

    data :

    a VisuPairLink object ;

    val :

    a float value.

    Returns :

    TRUE if the value is changed.
    v_sim-3.7.0/Documentation/reference/html/v-sim-dataFile.html0000644000353400050620000023354612216331356020743 00000000000000 dataFile

    dataFile

    dataFile — Adds a possibility to colorize nodes depending on data read in an input file.

    Synopsis

                        VisuColorization;
    enum                VisuColorizationErrorFlag;
    gboolean            (*VisuColorizationHidingFunc)       (VisuColorization *dt,
                                                             const VisuColorizationNodeData *values,
                                                             gpointer data);
    enum                VisuColorizationInputScaleId;
    struct              VisuColorizationNodeData;
    gboolean            visu_colorization_applyHide         (VisuColorization *dt,
                                                             VisuData *dataObj);
    VisuColorization *  visu_colorization_get               (VisuData *data,
                                                             gboolean create,
                                                             gboolean *new);
    const int *         visu_colorization_getColUsed        (const VisuColorization *dt);
    gboolean            visu_colorization_getColumnMinMax   (const VisuColorization *dt,
                                                             float minMax[2],
                                                             guint column);
    GQuark              visu_colorization_getErrorQuark     ();
    gchar *             visu_colorization_getFile           (const VisuColorization *dt);
    gboolean            visu_colorization_getFileSet        (const VisuColorization *dt);
    float               visu_colorization_getMax            (const VisuColorization *dt,
                                                             int column);
    float               visu_colorization_getMin            (const VisuColorization *dt,
                                                             int column);
    int                 visu_colorization_getNColumns       (const VisuColorization *dt);
    gboolean            visu_colorization_getRestrictInRange
                                                            (const VisuColorization *dt);
    VisuColorizationInputScaleId visu_colorization_getScaleType
                                                            (const VisuColorization *dt);
    int                 visu_colorization_getScalingUsed    (const VisuColorization *dt);
    ToolShade *         visu_colorization_getShade          (const VisuColorization *dt);
    gboolean            visu_colorization_getSingleColumnId (const VisuColorization *dt,
                                                             gint *id);
    gboolean            visu_colorization_getUsed           (const VisuColorization *dt);
    int                 visu_colorization_init              ();
    VisuColorization *  visu_colorization_new               ();
    VisuColorization *  visu_colorization_new_fromData      (VisuData *dataObj,
                                                             guint nbColumns,
                                                             GArray *data,
                                                             gboolean *new);
    VisuColorization *  visu_colorization_new_fromFile      (VisuData *data,
                                                             const char *filename,
                                                             gboolean *new,
                                                             GError **error);
    VisuColorization *  visu_colorization_ref               (VisuColorization *dt);
    gboolean            visu_colorization_setColUsed        (VisuColorization *dt,
                                                             int val,
                                                             int pos);
    void                visu_colorization_setHidingFunc     (VisuColorization *dt,
                                                             VisuColorizationHidingFunc func,
                                                             gpointer data,
                                                             GDestroyNotify destroy);
    gboolean            visu_colorization_setMax            (VisuColorization *dt,
                                                             float max,
                                                             int column);
    gboolean            visu_colorization_setMin            (VisuColorization *dt,
                                                             float min,
                                                             int column);
    gboolean            visu_colorization_setRestrictInRange
                                                            (VisuColorization *dt,
                                                             gboolean status);
    gboolean            visu_colorization_setScaleType      (VisuColorization *dt,
                                                             VisuColorizationInputScaleId scale);
    gboolean            visu_colorization_setScalingUsed    (VisuColorization *dt,
                                                             int val);
    gboolean            visu_colorization_setShade          (VisuColorization *dt,
                                                             ToolShade *shade);
    gboolean            visu_colorization_setUsed           (VisuData *data,
                                                             int val);
    void                visu_colorization_unref             (VisuColorization *dt);
    

    Object Hierarchy

      GBoxed
       +----VisuColorization
    

    Description

    With this module, it is possible to colorize nodes depending on data read in an input file. An input file can be associated to a VisuData object using visu_colorization_new_fromFile(). Doing this, the rendering is changed and nodes are colorized following a scheme describe later. To turn off colorization without removing the data file (for temporary turn off for instance), use visu_colorization_setUsed().

    The input file must have the same numbers of uncommented lines as there are nodes in the VisuData associated with. If less data is given, missing data are treaded as min values data. The input data file can has as much column as desired. The colorization is based on a linear color transformation. This transformation is applied on color channel in RGB mode or in HSV mode. Resulting color is given by : [resulting color vect] = [vectB] + [input data][vectA], where [input data] are input data scaled to [0;1]. It is possible to choose which column multiplies which color channel.

    Using visu_colorization_applyHide(), it is possible to hide some nodes depending on given input data.

    Details

    VisuColorization

    typedef struct _VisuColorization VisuColorization;

    An opaque structure to store colorisation settings.

    Since 3.7


    enum VisuColorizationErrorFlag

    typedef enum {
        VISU_COLORIZATION_ERROR_NO_COLUMN,
        VISU_COLORIZATION_ERROR_MISSING_DATA
    } VisuColorizationErrorFlag;
    

    Possible errors when reading a file with column data.

    VISU_COLORIZATION_ERROR_NO_COLUMN

    no column can be found in the file ;

    VISU_COLORIZATION_ERROR_MISSING_DATA

    some data are missing to match the number of nodes.

    VisuColorizationHidingFunc ()

    gboolean            (*VisuColorizationHidingFunc)       (VisuColorization *dt,
                                                             const VisuColorizationNodeData *values,
                                                             gpointer data);

    Function to decide to hide a node or not.

    dt :

    a VisuColorization object ;

    values :

    the column values.

    data :

    some data. [closure]

    Returns :

    TRUE to hide a node depending on values.

    Since 3.7


    enum VisuColorizationInputScaleId

    typedef enum {
        VISU_COLORIZATION_NORMALIZE,
        VISU_COLORIZATION_MINMAX
    } VisuColorizationInputScaleId;
    

    Control how input data are converted into [0;1], after conversion, values are clamped if needed.

    VISU_COLORIZATION_NORMALIZE

    input data are converted into [0;1] using input min/max values.

    VISU_COLORIZATION_MINMAX

    input data are converted into [0;1] using user defined min/max values.

    struct VisuColorizationNodeData

    struct VisuColorizationNodeData {
      const VisuData *dataObj;
      const VisuNode *node;
      GArray *data;
    };
    

    This structure holds the column value for a given node. It is mainly intended for bindings...

    const VisuData *dataObj;

    a VisuData object.

    const VisuNode *node;

    a VisuNode object.

    GArray *data;

    the column values for node. [element-type float]

    visu_colorization_applyHide ()

    gboolean            visu_colorization_applyHide         (VisuColorization *dt,
                                                             VisuData *dataObj);

    From the hiding function of dt (see visu_colorization_setHidingFunc()), apply hiding property to nodes of dataObj.

    dt :

    a VisuColorization object.

    dataObj :

    a VisuData object to apply hiding scheme on.

    Returns :

    TRUE if "VisibilityChanged" signal should be emitted.

    Since 3.7


    visu_colorization_get ()

    VisuColorization *  visu_colorization_get               (VisuData *data,
                                                             gboolean create,
                                                             gboolean *new);

    Return an already associated VisuColorization object to data, or create it if necessary.

    data :

    a VisuData object. [allow-none]

    create :

    a boolean.

    new :

    a boolean location. [out][allow-none]

    Returns :

    a VisuColorization object. This object will be automatically freed with data. [transfer none]

    Since 3.7


    visu_colorization_getColUsed ()

    const int *         visu_colorization_getColUsed        (const VisuColorization *dt);

    This method is used to retrieve the vector used to adapt or not the colour to the value of the loaded data.

    dt :

    a VisuData object. [allow-none]

    Returns :

    a three value array, own by V_Sim. It should not be freed. [transfer none][array fixed-size=3]

    visu_colorization_getColumnMinMax ()

    gboolean            visu_colorization_getColumnMinMax   (const VisuColorization *dt,
                                                             float minMax[2],
                                                             guint column);

    This method is used to retrieve the minimum and the maximum values of the column designed by the column argument. Column are numbered beginning at 0.

    dt :

    the VisuColorization object which the colour data are associated to ;

    minMax :

    an allocated array of two floating point values ;

    column :

    an integer.

    Returns :

    FALSE if column < 0 or if column is greater than the number of read column or if no file has been set.

    visu_colorization_getErrorQuark ()

    GQuark              visu_colorization_getErrorQuark     ();

    Internal routine for error handling.

    Returns :

    the GQuark associated to errors related to colour data files. [transfer none]

    visu_colorization_getFile ()

    gchar *             visu_colorization_getFile           (const VisuColorization *dt);

    If the given dt has an input data file already loaded, it returns its name.

    dt :

    a VisuColorization object. [allow-none]

    Returns :

    the name of the input data file if set. [transfer full]

    visu_colorization_getFileSet ()

    gboolean            visu_colorization_getFileSet        (const VisuColorization *dt);

    A set of data per node can be associated to a VisuData. This routine retrieves if visuData has it or not.

    dt :

    a VisuColorization object. [allow-none]

    Returns :

    TRUE if visuData has colour data associated.

    Since 3.6


    visu_colorization_getMax ()

    float               visu_colorization_getMax            (const VisuColorization *dt,
                                                             int column);

    Retrieve the maximum value used when scaling is user defined.

    dt :

    a VisuData object. [allow-none]

    column :

    a column id.

    Returns :

    the maximum bound if dt is not NULL or the default value if not.

    visu_colorization_getMin ()

    float               visu_colorization_getMin            (const VisuColorization *dt,
                                                             int column);

    Retrieve the minimum value used when scaling is user defined.

    dt :

    a VisuData object. [allow-none]

    column :

    a column id.

    Returns :

    the minimum bound if dt is not NULL or the default value if not.

    visu_colorization_getNColumns ()

    int                 visu_colorization_getNColumns       (const VisuColorization *dt);

    This method is used to retrieve the number of columns of data read in the loaded file.

    dt :

    a VisuColorization object.

    Returns :

    this number of columns.

    visu_colorization_getRestrictInRange ()

    gboolean            visu_colorization_getRestrictInRange
                                                            (const VisuColorization *dt);

    The colourisation can be applied on all nodes or on nodes within range. See visu_colorization_setRestrictInRange().

    dt :

    a VisuColorization object with some data file information.

    Returns :

    TRUE if colourisation is done only if values are in range.

    Since 3.7


    visu_colorization_getScaleType ()

    VisuColorizationInputScaleId visu_colorization_getScaleType
                                                            (const VisuColorization *dt);

    Retrieve the scaling method of input data associated to the given dt.

    dt :

    a VisuColorization object. [allow-none]

    Returns :

    the scaling method if dt is not NULL or the default value if not.

    visu_colorization_getScalingUsed ()

    int                 visu_colorization_getScalingUsed    (const VisuColorization *dt);

    Retrieve if a column is used as entry to scale the nodes.

    dt :

    a VisuColorization object hosting the data values. [allow-none]

    Returns :

    -1 if no scaling is used.

    visu_colorization_getShade ()

    ToolShade *         visu_colorization_getShade          (const VisuColorization *dt);

    Return the shade used to colourise the nodes.

    dt :

    the VisuColorization object which the colour data are associated to. [allow-none]

    Returns :

    the ToolShade used (own by V_Sim). [transfer none]

    visu_colorization_getSingleColumnId ()

    gboolean            visu_colorization_getSingleColumnId (const VisuColorization *dt,
                                                             gint *id);

    The colourisation can be applied from values coming from several columns. But, if only one column is used, this routine will give it in id.

    dt :

    a VisuColorization object.

    id :

    a location to store a column id. [out]

    Returns :

    FALSE if several columns are used, or TRUE if a single column is used for the colourisation.

    visu_colorization_getUsed ()

    gboolean            visu_colorization_getUsed           (const VisuColorization *dt);

    This method retrieve the used flag, see visu_colorization_setUsed() to set it.

    dt :

    a VisuColorization object to get if the colorisation tool is set or not ;. [allow-none]

    Returns :

    1 if the used flag is set.

    visu_colorization_init ()

    int                 visu_colorization_init              ();

    Called by V_Sim on startup, should not be called again.

    Returns :

    1 if eveything goes right.

    visu_colorization_new ()

    VisuColorization *  visu_colorization_new               ();

    Create a new object to store colorisation data.

    Returns :

    a newly created VisuColorization. [transfer full]

    Since 3.7


    visu_colorization_new_fromData ()

    VisuColorization *  visu_colorization_new_fromData      (VisuData *dataObj,
                                                             guint nbColumns,
                                                             GArray *data,
                                                             gboolean *new);

    Add colourisation data to dataObj.

    dataObj :

    a VisuData object.

    nbColumns :

    an integer.

    data :

    the colorization data. [element-type gfloat]

    new :

    a location for a boolean. [allow-none][out caller-allocates]

    Returns :

    a newly created VisuColorization or NULL. [transfer full]

    Since 3.7


    visu_colorization_new_fromFile ()

    VisuColorization *  visu_colorization_new_fromFile      (VisuData *data,
                                                             const char *filename,
                                                             gboolean *new,
                                                             GError **error);

    Call this method to parse a data file and associate its values to the given VisuData object.

    data :

    a VisuData object to attach the data file to ;

    filename :

    the path to find the data file on the disk ;

    new :

    a location for a boolean. [allow-none][out caller-allocates]

    error :

    a location to a NULL GError.

    Returns :

    a newly created VisuColorization or NULL. [transfer full]

    visu_colorization_ref ()

    VisuColorization *  visu_colorization_ref               (VisuColorization *dt);

    Increase the ref counter.

    dt :

    a VisuColorization object.

    Returns :

    itself.

    Since 3.7


    visu_colorization_setColUsed ()

    gboolean            visu_colorization_setColUsed        (VisuColorization *dt,
                                                             int val,
                                                             int pos);

    Choose if the loaded value should change the given channel of the colour.

    dt :

    a VisuColorization object ;

    val :

    a column id a special value ;

    pos :

    an integer in [0;2].

    Returns :

    TRUE if VisuNodeArray::RenderingChanged should be emitted.

    visu_colorization_setHidingFunc ()

    void                visu_colorization_setHidingFunc     (VisuColorization *dt,
                                                             VisuColorizationHidingFunc func,
                                                             gpointer data,
                                                             GDestroyNotify destroy);

    Set the hiding function to be called when visu_colorization_applyHide() is used.

    dt :

    a VisuColorization object.

    func :

    a VisuColorizationHidingFunc function. [allow-none][closure data]

    data :

    some data. [closure]

    destroy :

    a destroy function for data.

    Since 3.7


    visu_colorization_setMax ()

    gboolean            visu_colorization_setMax            (VisuColorization *dt,
                                                             float max,
                                                             int column);

    When the scaling method is VISU_COLORIZATION_MINMAX (see VisuColorizationInputScaleId) min and max value for convert input data are user defined. Use this method to choose the maximum bound. This method raises a error if no input file has already been associated to the give visuData.

    dt :

    a VisuColorization object ;

    max :

    a floating point value.

    column :

    a column id.

    Returns :

    TRUE if VisuNodeArray::RenderingChanged should be emitted.

    visu_colorization_setMin ()

    gboolean            visu_colorization_setMin            (VisuColorization *dt,
                                                             float min,
                                                             int column);

    When the scaling method is VISU_COLORIZATION_MINMAX (see VisuColorizationInputScaleId) min and max value for convert input data are user defined. Use this method to choose the minimum bound. This method raises a error if no input file has already been associated to the give visuData.

    dt :

    a VisuColorization object ;

    min :

    a floating point value.

    column :

    a column id.

    Returns :

    TRUE if VisuNodeArray::RenderingChanged should be emitted.

    visu_colorization_setRestrictInRange ()

    gboolean            visu_colorization_setRestrictInRange
                                                            (VisuColorization *dt,
                                                             gboolean status);

    The colourisation can be applied on all nodes or on nodes within range. See visu_colorization_getRestrictInRange() and visu_colorization_setMin() and visu_colorization_setMax().

    dt :

    a VisuColorization object with some data file information.

    status :

    a boolean.

    Returns :

    TRUE if the status is changed indeed.

    Since 3.7


    visu_colorization_setScaleType ()

    gboolean            visu_colorization_setScaleType      (VisuColorization *dt,
                                                             VisuColorizationInputScaleId scale);

    This method is used to change the scale method used on input data. See VisuColorizationInputScaleId for further informations. This method raises a error if no input file has already been associated to the give visuData.

    dt :

    a VisuColorization object ;

    scale :

    an integer.

    Returns :

    TRUE if VisuNodeArray::RenderingChanged should be emitted.

    visu_colorization_setScalingUsed ()

    gboolean            visu_colorization_setScalingUsed    (VisuColorization *dt,
                                                             int val);

    Give the column id to used to take the scaling values from. Set -1 if no scaling used. The scaling is used to change the size of each node, using an homothetic factor.

    dt :

    a VisuColorization object hosting the data values ;

    val :

    a column id.

    Returns :

    TRUE if the status changed.

    visu_colorization_setShade ()

    gboolean            visu_colorization_setShade          (VisuColorization *dt,
                                                             ToolShade *shade);

    Apply all caracteristic of the given shade to the colorization the the given VisuObject.

    dt :

    the VisuColorization object which the colour data are associated to ;

    shade :

    a valid ToolShade object.

    Returns :

    TRUE if VisuNodeArray::RenderingChanged should be emitted.

    visu_colorization_setUsed ()

    gboolean            visu_colorization_setUsed           (VisuData *data,
                                                             int val);

    When TRUE, rendering is modified by applying a colorization method to normal nodes. The color used depend on input data. See visu_colorization_new_fromFile() to choose them.

    data :

    a VisuData object to set the colorisation tool or not ;

    val :

    a boolean.

    Returns :

    TRUE if val is true and if a valid input file is already in memory.

    visu_colorization_unref ()

    void                visu_colorization_unref             (VisuColorization *dt);

    Decrease the ref counter, free all memory if counter reachs zero.

    dt :

    a VisuColorization object.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/v-sim-dataNode.html0000644000353400050620000015247012216331356020745 00000000000000 dataNode

    dataNode

    dataNode — Extends capabilities of node properties.

    Object Hierarchy

      GObject
       +----VisuDataNode
    

    Description

    This module is a wrapper around node properties from VisuData. It adds some capabilities, such as a translatable name, a way to go from data to strings and reverse, callbacks when the properties is changed...

    When creating a node property calling visu_node_array_property_newPointer() for instance, a VisuDataNode can be created using visu_data_node_new(). A VisuDataNode may not be attached to a specific VisuData and is a global property found on each VisuData (or potentialy found). The advantage of doing this is to keep track of available properties for VisuData objects. To get all public properties, call visu_data_node_class_getAll().

    Details

    VisuDataNode

    typedef struct _VisuDataNode VisuDataNode;

    An opaque structure.


    VisuDataNodeCallbackMethod ()

    void                (*VisuDataNodeCallbackMethod)       (VisuData *dataObj,
                                                             VisuNode *node,
                                                             gpointer data);

    Interface for callbacks methods that are called whenever a data is changed on a node.

    WARNING: it may be removed later.

    dataObj :

    the VisuData object on which the callback is done ;

    node :

    the VisuNode on which the callback is done ;

    data :

    a user defined pointer.

    VisuDataNodeClass

    typedef struct _VisuDataNodeClass VisuDataNodeClass;

    An opaque structure.


    VisuDataNodeFromStringFunc ()

    gboolean            (*VisuDataNodeFromStringFunc)       (VisuDataNode *data,
                                                             VisuData *dataObj,
                                                             VisuNode *node,
                                                             gchar *labelIn,
                                                             gchar **labelOut,
                                                             gboolean *modify);

    If the string is correctly formatted (that means it has the same format as the string returned by GetValueAsStringFunc()) the stored values are modified. The resulting string is created and put into labelOut. If the input string labelIn is unparsable, labelOut will contain current values.

    data :

    a VisuDataNode ;

    dataObj :

    a VisuData object ;

    node :

    a VisuNode ;

    labelIn :

    a formatted string ;

    labelOut :

    a pointer to store a string ;

    modify :

    TRUE if the values have been modified.

    Returns :

    TRUE if the string was correctly parsed (modified or not).

    VisuDataNodeToStringFunc ()

    gchar *             (*VisuDataNodeToStringFunc)         (VisuDataNode *data,
                                                             VisuData *dataObj,
                                                             VisuNode *node);

    For the given node, the values stored are printed into a string.

    data :

    a VisuDataNode ;

    dataObj :

    a VisuData object ;

    node :

    a VisuNode.

    Returns :

    a newly created string (use g_free()).

    visu_data_node_class_getAll ()

    GList *             visu_data_node_class_getAll         (void);

    All registered VisuDataNode are stored in an intern list. This method is used to retrieve it.

    Returns :

    a GList of all registereed VisuDataNode (this list is owned by V_Sim). [transfer none][element-type VisuDataNode*]

    visu_data_node_emitValueChanged ()

    void                visu_data_node_emitValueChanged     (VisuDataNode *data,
                                                             VisuData *dataObj);

    Emit the 'valueChanged' signal. This method should be called after all changes have been done to a node property set of nodes. Then routines using this property can update itself.

    data :

    a VisuDataNode ;

    dataObj :

    a VisuData object.

    visu_data_node_getEditable ()

    gboolean            visu_data_node_getEditable          (VisuDataNode *data);

    If some callback method has been given with visu_data_node_setCallback(), then the values are considered editable.

    data :

    a VisuDataNode.

    Returns :

    TRUE if values are editable.

    visu_data_node_getLabel ()

    const gchar *       visu_data_node_getLabel             (VisuDataNode *data);

    A VisuDataNode can have a label, if not its name is used.

    data :

    a VisuDataNode ;

    Returns :

    the label of the node (in UTF8), this string is owned by V_Sim.

    visu_data_node_getUsed ()

    gboolean            visu_data_node_getUsed              (VisuDataNode *data,
                                                             VisuData *dataObj);

    Access method to know if the given dataObj has a public node property of the type data.

    data :

    a VisuDataNode ;

    dataObj :

    a VisuData object.

    Returns :

    TRUE if dataObj has a node property of the given type.

    visu_data_node_getValueAsString ()

    gchar *             visu_data_node_getValueAsString     (VisuDataNode *data,
                                                             VisuData *dataObj,
                                                             VisuNode *node);

    For the given node, the values stored are printed into a string.

    data :

    a VisuDataNode ;

    dataObj :

    a VisuData object ;

    node :

    a VisuNode.

    Returns :

    a newly created string.

    visu_data_node_new ()

    GObject *           visu_data_node_new                  (const gchar *name,
                                                             GType type);

    This method creates a new VisuDataNode and registers it. A VisuDataNode is characterised by a string used as a key to store it as a node property (see visu_node_array_property_newPointer()). The stored data can be arrays or not. Notice that name is copied.

    name :

    a string used to store the data as a node property ;

    type :

    the type of data stored (array or not).

    Returns :

    a newly created VisuDataNode. [transfer full]

    visu_data_node_newWithCallbacks ()

    GObject *           visu_data_node_newWithCallbacks     (const gchar *name,
                                                             VisuDataNodeFromStringFunc setAsString,
                                                             VisuDataNodeToStringFunc getAsString);

    As visu_data_node_new(), but with custom setAsString and getAsString routines. This is used to allow to treat every node related values, not just node properties.

    name :

    a string used to store the data as a node property ;

    setAsString :

    a custom routine to change node values from a string ;. [scope call]

    getAsString :

    a custom routine to create a string from node values. [scope call]

    Returns :

    a newly created VisuDataNode. [transfer full]

    visu_data_node_setCallback ()

    void                visu_data_node_setCallback          (VisuDataNode *data,
                                                             VisuDataNodeCallbackMethod callback,
                                                             gpointer user_data);

    When visu_data_node_setValueAsString(), values may be modified. If true, the given callback method is called with user_data as argument.

    data :

    a VisuDataNode ;

    callback :

    a VisuDataNodeCallbackMethod method ;. [scope call]

    user_data :

    a pointer to a location used to store some user data.

    visu_data_node_setEditable ()

    void                visu_data_node_setEditable          (VisuDataNode *data,
                                                             gboolean status);

    Set if the values are modifiable.

    data :

    a VisuDataNode ;

    status :

    a boolean value.

    visu_data_node_setLabel ()

    void                visu_data_node_setLabel             (VisuDataNode *data,
                                                             const gchar *label);

    A VisuDataNode can have a label, if not its name is used. Notice that label is not copied.

    data :

    a VisuDataNode ;

    label :

    an UTF8 string (may be translated).

    visu_data_node_setUsed ()

    void                visu_data_node_setUsed              (VisuDataNode *data,
                                                             VisuData *dataObj,
                                                             gint nb);

    A VisuDataNode stores data for each node of a given VisuData. The number of data stored for each node is set with this method. When some part wants to set a new node property and wants to make it public, this method can be called. It also can be called when the node property is removed (using a null nb argument). If nb is changed for a positive value, the "propertyUsed" signal is emitted with dataObj as argument, instead if the value is changed for null, the "propertyUnused" signal is triggered also with dataObj as argument.

    data :

    a VisuDataNode ;

    dataObj :

    a VisuData object ;

    nb :

    a positive or null integer.

    visu_data_node_setValueAsString ()

    gboolean            visu_data_node_setValueAsString     (VisuDataNode *data,
                                                             VisuData *dataObj,
                                                             VisuNode *node,
                                                             gchar *labelIn,
                                                             gchar **labelOut);

    If the string is correctly formatted (that means it has the same format as the string returned by visu_data_node_getValueAsString()) the stored values are modified. The resulting string is created and put into labelOut. If the input string labelIn is unparsable, labelOut will contain current values. Notice that this method is callable only if the data is editable (see visu_data_node_getEditable()).

    data :

    a VisuDataNode ;

    dataObj :

    a VisuData object ;

    node :

    a VisuNode ;

    labelIn :

    a formatted string ;

    labelOut :

    a pointer to store a string.

    Returns :

    TRUE if the string was correctly parsed.

    Signal Details

    The "propertyUnused" signal

    void                user_function                      (VisuDataNode *data,
                                                            GObject      *dataObj,
                                                            gpointer      user_data)      : No Hooks

    The given property data gets unused by dataObj.

    data :

    the VisuDataNode emitting the signal.

    dataObj :

    the VisuData its working on.

    user_data :

    user data set when the signal handler was connected.

    Since 3.3


    The "propertyUsed" signal

    void                user_function                      (VisuDataNode *data,
                                                            GObject      *dataObj,
                                                            gpointer      user_data)      : No Hooks

    The given property data gets used by dataObj.

    data :

    the VisuDataNode emitting the signal.

    dataObj :

    the VisuData its working on.

    user_data :

    user data set when the signal handler was connected.

    Since 3.3


    The "valueChanged" signal

    void                user_function                      (VisuDataNode *data,
                                                            GObject      *dataObj,
                                                            gpointer      user_data)      : No Hooks

    The given property data used by dataObj has its value changed.

    data :

    the VisuDataNode emitting the signal.

    dataObj :

    the VisuData its working on.

    user_data :

    user data set when the signal handler was connected.

    Since 3.3

    v_sim-3.7.0/Documentation/reference/html/v_sim.devhelp20000644000353400050620000074441512216331355020064 00000000000000 v_sim-3.7.0/Documentation/reference/html/v-sim-dumpThroughGdkPixbuf.html0000644000353400050620000001111212216331356023323 00000000000000 dumpThroughGdkPixbuf

    dumpThroughGdkPixbuf

    dumpThroughGdkPixbuf — add an export capability into PNG and JPG files.

    Description

    This provides a write routine to export V_Sim views into PNG and JPG files. It uses the GdkPixbuf to do it.

    Details

    visu_dump_jpeg_getStatic ()

    const VisuDump *    visu_dump_jpeg_getStatic            ();

    This routine returns the JPG dump object.

    Returns :

    a newly created dump object to create JPEG files. [transfer none]

    visu_dump_png_getStatic ()

    const VisuDump *    visu_dump_png_getStatic             ();

    This routine returns the PNG dump object.

    Returns :

    a newly created dump object to create PNG files. [transfer none]
    v_sim-3.7.0/Documentation/reference/html/v-sim-dumpToABINIT.html0000644000353400050620000000702712216331356021362 00000000000000 dumpToABINIT

    dumpToABINIT

    dumpToABINIT — add an export capability of current positions in ABINIT format.

    Synopsis

    const VisuDump *    visu_dump_abinit_getStatic          ();
    

    Description

    This provides a write routine to export V_Sim current coordinates. It has several options to output or not hiddden nodes or replicated nodes.

    Details

    visu_dump_abinit_getStatic ()

    const VisuDump *    visu_dump_abinit_getStatic          ();

    This routine returns the ABINIT dump object.

    Returns :

    a newly created dump object to create ABINIT files. [transfer none]
    v_sim-3.7.0/Documentation/reference/html/v-sim-dumpToAscii.html0000644000353400050620000000723312216331356021443 00000000000000 dumpToAscii

    dumpToAscii

    dumpToAscii — add an export capability of current positions.

    Synopsis

    const VisuDump *    visu_dump_ascii_getStatic           ();
    

    Description

    This provides a write routine to export V_Sim current coordinates. It has several options to output or not hiddden nodes or replicated nodes.

    Details

    visu_dump_ascii_getStatic ()

    const VisuDump *    visu_dump_ascii_getStatic           ();

    This routine is used to get the static VisuDump object for ASCII exportation.

    Returns :

    the static dump object to create ASCII files. [transfer none]
    v_sim-3.7.0/Documentation/reference/html/v-sim-dumpToPsAndPdf.html0000644000353400050620000001133112216331356022044 00000000000000 dumpToPsAndPdf

    dumpToPsAndPdf

    dumpToPsAndPdf — add an export capability into PS and PDF files (encapsulating bitmaps).

    Description

    This provides a write routine to export V_Sim views into bitmaps encapsulated into PS or PDF files. The PostScript file can be either in 256 colours or in full True Color. For a vectorial export, see dumpToSVG.

    Details

    visu_dump_bitmap_pdf_getStatic ()

    const VisuDump *    visu_dump_bitmap_pdf_getStatic      ();

    This routine returns the dump object to PDF (bitmap).

    Returns :

    a newly created dump object to create PDF files. [transfer none]

    visu_dump_bitmap_ps_getStatic ()

    const VisuDump *    visu_dump_bitmap_ps_getStatic       ();

    This routine returns the dump object to PS (bitmap).

    Returns :

    a newly created dump object to create PS files. [transfer none]
    v_sim-3.7.0/Documentation/reference/html/v-sim-dumpToSVG.html0000644000353400050620000002105612216331356021051 00000000000000 dumpToSVG

    dumpToSVG

    dumpToSVG — add an export capability into SVG files.

    Synopsis

    #include <extensions/box.h>
    #include <extensions/axes.h>
    #include <visu_pairs.h and visu_data.h>
    
    void                (*VisuDumpCairoAdd)                 (cairo_t *cr,
                                                             guint width,
                                                             guint height);
    const VisuDump *    visu_dump_cairo_pdf_getStatic       ();
    void                visu_dump_cairo_setPostFunc         (VisuDumpCairoAdd func);
    const VisuDump *    visu_dump_cairo_svg_getStatic       ();
    

    Description

    This provides a write routine to export V_Sim views into SVG files. Currently, this is an experimental feature. Not all V_Sim elements are rendered, only the nodes, the box, the pairs and the axes. All the characteristics are not used (no line stipple for instance). In spin mode, nodes are only atomic.

    Details

    VisuDumpCairoAdd ()

    void                (*VisuDumpCairoAdd)                 (cairo_t *cr,
                                                             guint width,
                                                             guint height);

    A method to be called by V_Sim after exportation to allow post-processing.

    cr :

    a cairo_t context.

    width :

    width of the surface.

    height :

    height of the surface.

    visu_dump_cairo_pdf_getStatic ()

    const VisuDump *    visu_dump_cairo_pdf_getStatic       ();

    This routine returns the dump object to PDF format.

    Returns :

    a newly created dump object to create SVG files. [transfer none]

    visu_dump_cairo_setPostFunc ()

    void                visu_dump_cairo_setPostFunc         (VisuDumpCairoAdd func);

    Allow to add a function that will be called on every Cairo exportation after V_Sim rendering to allow post-processing.

    func :

    a VisuDumpCairoAdd function or NULL. [allow-none][scope call]

    Since 3.7


    visu_dump_cairo_svg_getStatic ()

    const VisuDump *    visu_dump_cairo_svg_getStatic       ();

    This routine returns the dump object to SVG format.

    Returns :

    a newly created dump object to create SVG files. [transfer none]
    v_sim-3.7.0/Documentation/reference/html/v-sim-dumpToTiff.html0000644000353400050620000000644712216331356021311 00000000000000 dumpToTiff

    dumpToTiff

    dumpToTiff — add an export capability into TIFF files.

    Synopsis

    const VisuDump *    visu_dump_tiff_getStatic            ();
    

    Description

    This provides a write routine to export V_Sim views into TIFF files.

    Details

    visu_dump_tiff_getStatic ()

    const VisuDump *    visu_dump_tiff_getStatic            ();

    This routine returns the dump object in TIFF format.

    Returns :

    a newly created dump object to create TIFF files.
    v_sim-3.7.0/Documentation/reference/html/v-sim-dumpToXyz.html0000644000353400050620000000700212216331356021177 00000000000000 dumpToXyz

    dumpToXyz

    dumpToXyz — add an export capability of current positions.

    Synopsis

    const VisuDump *    visu_dump_xyz_getStatic             ();
    

    Description

    This provides a write routine to export V_Sim current coordinates. It has several options to output or not hiddden nodes or replicated nodes.

    Details

    visu_dump_xyz_getStatic ()

    const VisuDump *    visu_dump_xyz_getStatic             ();

    This routine returns the dump object for XYZ format.

    Returns :

    a newly created dump object to create XYZ files. [transfer none]
    v_sim-3.7.0/Documentation/reference/html/v-sim-extraNode.html0000644000353400050620000001774212216331356021161 00000000000000 extraNode

    extraNode

    extraNode — add further characteristics to the nodes.

    Synopsis

    void                visu_extra_node_addLabel            (VisuData *data);
    const gchar *       visu_extra_node_getLabel            (VisuData *data,
                                                             VisuNode *node);
    void                visu_extra_node_setLabel            (VisuData *data,
                                                             guint nodeId,
                                                             const gchar *label);
    

    Description

    blabla

    Details

    visu_extra_node_addLabel ()

    void                visu_extra_node_addLabel            (VisuData *data);

    Add the possibility to store labels for nodes.

    data :

    a VisuData object.

    visu_extra_node_getLabel ()

    const gchar *       visu_extra_node_getLabel            (VisuData *data,
                                                             VisuNode *node);

    Retrieve the label of node. If node has no label, NULL is returned.

    data :

    a VisuData object.

    node :

    a given node

    Returns :

    a label, private value, do not freed. [transfer none]

    visu_extra_node_setLabel ()

    void                visu_extra_node_setLabel            (VisuData *data,
                                                             guint nodeId,
                                                             const gchar *label);

    Set a label to the node nodeId.

    data :

    a VisuData object.

    nodeId :

    the id of a node.

    label :

    the label to set (will be copied). [allow-none]
    v_sim-3.7.0/Documentation/reference/html/v-sim-geometry.html0000644000353400050620000012664712216331356021070 00000000000000 geometry

    geometry

    geometry — different routines to do high level geometry studies on a box or a set of boxes.

    Synopsis

    #define             VISU_GEODIFF_ID
                        VisuPaths;
    gchar *             visu_geodiff_export                 (VisuData *data);
    void                visu_geodiff_getPeriodicDistance    (float diff[3],
                                                             VisuData *data,
                                                             VisuNode *node1,
                                                             VisuNode *node2);
    gboolean            visu_geodiff_hasData                (VisuData *data);
    gboolean            visu_geodiff_new                    (VisuData *dataRef,
                                                             VisuData *data,
                                                             gboolean reorder);
    void                visu_geometry_init                  ();
    gboolean            visu_paths_addFromDiff              (VisuPaths *paths,
                                                             VisuData *data);
    gboolean            visu_paths_addNodeStep              (VisuPaths *paths,
                                                             guint time,
                                                             guint nodeId,
                                                             float xyz[3],
                                                             float dxyz[3],
                                                             float energy);
    void                visu_paths_constrainInBox           (VisuPaths *paths,
                                                             VisuData *data);
    void                visu_paths_draw                     (VisuPaths *paths);
    void                visu_paths_empty                    (VisuPaths *paths);
    gboolean            visu_paths_exportXMLFile            (const VisuPaths *paths,
                                                             const gchar *filename,
                                                             GError **error);
    void                visu_paths_free                     (VisuPaths *paths);
    guint               visu_paths_getLength                (VisuPaths *paths);
    ToolShade *         visu_paths_getToolShade             (VisuPaths *paths);
    VisuPaths *         visu_paths_new                      (float translation[3]);
    gboolean            visu_paths_parseFromXML             (const gchar *filename,
                                                             VisuPaths *paths,
                                                             GError **error);
    void                visu_paths_pinPositions             (VisuPaths *paths,
                                                             VisuData *data);
    VisuPaths *         visu_paths_ref                      (VisuPaths *paths);
    gboolean            visu_paths_setToolShade             (VisuPaths *paths,
                                                             ToolShade *shade);
    void                visu_paths_setTranslation           (VisuPaths *paths,
                                                             float cartCoord[3]);
    void                visu_paths_unref                    (VisuPaths *paths);
    

    Object Hierarchy

      GBoxed
       +----VisuPaths
    

    Description

    The first possibility of the geometry section is to make a two by two difference node position difference between two VisuData objects. The VisuNode positions are compared (number to number and not closed equivalent to closed equivalent) and stored for visualisation. The visualisation is done through small arrows position on the currently visualised file.

    Details

    VISU_GEODIFF_ID

    #define VISU_GEODIFF_ID        "geometry_diff"
    

    The default name used for the VisuGlExt representing displacements, see visu_gl_ext_getFromName().


    VisuPaths

    typedef struct _VisuPaths VisuPaths;

    An opaque structure to save a set of paths.

    Since 3.6


    visu_geodiff_export ()

    gchar *             visu_geodiff_export                 (VisuData *data);

    Create a string with differences of coordinates stored in data in cartesian coordinates.

    data :

    a VisuData object.

    Returns :

    a new string that should be freed after use.

    Since 3.6


    visu_geodiff_getPeriodicDistance ()

    void                visu_geodiff_getPeriodicDistance    (float diff[3],
                                                             VisuData *data,
                                                             VisuNode *node1,
                                                             VisuNode *node2);

    Compute the shortest distance between node1 and node2 of data taking into account the periodic boundary conditions.

    diff :

    a location to store the shift. [out][array fixed-size=3]

    data :

    a VisuData object.

    node1 :

    a VisuNode object.

    node2 :

    another VisuNode object.

    Since 3.5


    visu_geodiff_hasData ()

    gboolean            visu_geodiff_hasData                (VisuData *data);

    A set coordinate differences can be associated to a VisuData using visu_geodiff_new().

    data :

    a VisuData object.

    Returns :

    TRUE if the given data has a set of differences associated.

    Since 3.6


    visu_geodiff_new ()

    gboolean            visu_geodiff_new                    (VisuData *dataRef,
                                                             VisuData *data,
                                                             gboolean reorder);

    Compare the position of each VisuNode of dataRef and data, the result is store as a property of data and can be visualise using a VisuGlExtNodeVectors object. If reorder is TRUE, the nodes in data will be modified to follow the ordering of dataRef.

    dataRef :

    a VisuData object ;

    data :

    another VisuData object.

    reorder :

    a boolean.

    Returns :

    TRUE if a difference is possible (same number of nodes).

    Since 3.5


    visu_geometry_init ()

    void                visu_geometry_init                  ();

    Initialise the geometry routines. Should not be called except at initialisation time.

    Since 3.5


    visu_paths_addFromDiff ()

    gboolean            visu_paths_addFromDiff              (VisuPaths *paths,
                                                             VisuData *data);

    This routine read the geometry difference hold in data and add a new step in the set of paths. If new paths are created, one should call visu_paths_setTranslation() to be sure that all paths are moved inside the box.

    data :

    a VisuData object with a geometry difference (see visu_geodiff_new()).

    paths :

    the set of paths to extend.

    Returns :

    TRUE if new paths have been added.

    Since 3.6


    visu_paths_addNodeStep ()

    gboolean            visu_paths_addNodeStep              (VisuPaths *paths,
                                                             guint time,
                                                             guint nodeId,
                                                             float xyz[3],
                                                             float dxyz[3],
                                                             float energy);

    This routine expand the path for the given nodeId at position xyz of dxyz. The energy value will be used only if visu_paths_setToolShade() is used with a non NULL ToolShade. In that case the energy value will be used to colourise the provided path.

    paths :

    a set of paths.

    time :

    the flag that give the number of expansion to update.

    nodeId :

    the node to expand the path of.

    xyz :

    the current position of the path.

    dxyz :

    the variation in the path.

    energy :

    the energy of the system.

    Returns :

    TRUE if a new path is started.

    Since 3.6


    visu_paths_constrainInBox ()

    void                visu_paths_constrainInBox           (VisuPaths *paths,
                                                             VisuData *data);

    Modify the corrdinates of the path nodes to contraint them in a box (when applying translations for instance).

    paths :

    a VisuPaths object.

    data :

    a VisuData object.

    Since 3.6


    visu_paths_draw ()

    void                visu_paths_draw                     (VisuPaths *paths);

    OpenGL calls to create the paths.

    paths :

    a set of paths.

    Since 3.6


    visu_paths_empty ()

    void                visu_paths_empty                    (VisuPaths *paths);

    Reinitialise internal values of a given paths.

    paths :

    a VisuPaths object.

    Since 3.6


    visu_paths_exportXMLFile ()

    gboolean            visu_paths_exportXMLFile            (const VisuPaths *paths,
                                                             const gchar *filename,
                                                             GError **error);

    Write an XML file with the description of the given paths.

    paths :

    a VisuPaths object.

    filename :

    a location on disk.

    error :

    a pointer on an error.

    Returns :

    TRUE if no error.

    Since 3.6


    visu_paths_free ()

    void                visu_paths_free                     (VisuPaths *paths);

    Free a set of paths.

    paths :

    a VisuPaths object.

    Since 3.6


    visu_paths_getLength ()

    guint               visu_paths_getLength                (VisuPaths *paths);

    Get the number of steps stored in a VisuPaths.

    paths :

    a VisuPaths object.

    Returns :

    the number of steps.

    Since 3.6


    visu_paths_getToolShade ()

    ToolShade *         visu_paths_getToolShade             (VisuPaths *paths);

    The paths are drawn with a colourisation scheme.

    paths :

    a VisuPaths object.

    Returns :

    the ToolShade used by the paths.

    Since 3.6


    visu_paths_new ()

    VisuPaths *         visu_paths_new                      (float translation[3]);

    Create a new VisuPaths object.

    translation :

    the current box translation (cartesian).

    Returns :

    the newly create object VisuPaths, to be freed with visu_paths_free().

    Since 3.6


    visu_paths_parseFromXML ()

    gboolean            visu_paths_parseFromXML             (const gchar *filename,
                                                             VisuPaths *paths,
                                                             GError **error);

    Read an XML containing a description of paths. paths is newly created on success and should be freed with visu_paths_free().

    filename :

    a location on disk.

    paths :

    a VisuPaths object.

    error :

    a pointer on an error.

    Returns :

    TRUE on success.

    Since 3.6


    visu_paths_pinPositions ()

    void                visu_paths_pinPositions             (VisuPaths *paths,
                                                             VisuData *data);

    Use the current positions of data to extend paths.

    paths :

    a VisuPaths object.

    data :

    a VisuData object.

    Since 3.6


    visu_paths_ref ()

    VisuPaths *         visu_paths_ref                      (VisuPaths *paths);

    Increase the ref counter.

    paths :

    a VisuPaths object.

    Returns :

    itself.

    Since 3.7


    visu_paths_setToolShade ()

    gboolean            visu_paths_setToolShade             (VisuPaths *paths,
                                                             ToolShade *shade);

    Set the colourisation scheme for the path.

    paths :

    a VisuPaths object.

    shade :

    a ToolShade object.

    Returns :

    TRUE is the scheme is changed.

    Since 3.6


    visu_paths_setTranslation ()

    void                visu_paths_setTranslation           (VisuPaths *paths,
                                                             float cartCoord[3]);

    Change the translation of the path, stored in cartesian coordinates.

    paths :

    a VisuPaths object.

    cartCoord :

    three floats.

    Since 3.6


    visu_paths_unref ()

    void                visu_paths_unref                    (VisuPaths *paths);

    Decrease the ref counter, free all memory if counter reachs zero.

    paths :

    a VisuPaths object.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/v-sim-gtk-about.html0000644000353400050620000000736712216331356021127 00000000000000 gtk_about

    gtk_about

    gtk_about — The about dialog with a readme, the copyright, the author list, the plug-in list and the version notes.

    Synopsis

    void                visu_ui_about_initBuild             (VisuUiMain *main);
    

    Description

    The about dialog window is activated when clicking on the V_Sim icon on bottom right part of the command panel. It contains a summary of V_Sim purpose and capabilities, the list of authors, the list of loaded plug-ins, the list of changes since the previous version, and the licence file. It displays also the version of V_Sim and provide a link to the web site.

    Details

    visu_ui_about_initBuild ()

    void                visu_ui_about_initBuild             (VisuUiMain *main);

    Create the about window.

    main :

    the command panel the about dialog is associated to.
    v_sim-3.7.0/Documentation/reference/html/v-sim-gtkAtomic.html0000644000353400050620000001747212216331356021152 00000000000000 gtkAtomic

    gtkAtomic

    gtkAtomic — The gtk interface elements that are specific to the atomic rendering method.

    Description

    This part gathers all the routine specific to the widgets related to the atomic rendering method. For the method itself, there is no specific widgets. For the VisuElement part, one can tune the shape, the radius and the elipsoid orientation (when selected). There is no specific GtkFileChooser widget.

    Details

    visu_ui_panel_elements_atomic_init ()

    void                visu_ui_panel_elements_atomic_init  ();

    Initialise the specific area in the element panel for the atomic rendering method.


    visu_ui_panel_elements_atomic_initBuild ()

    GtkWidget *         visu_ui_panel_elements_atomic_initBuild
                                                            ();

    Create the gtk widgets (a hbox with a spin with positive values) and return it.

    Returns :

    newly created widgets to handle atomic rendering characteristics of elements.

    visu_ui_panel_elements_atomic_initMethod ()

    void                visu_ui_panel_elements_atomic_initMethod
                                                            ();

    Initialise widgets related to the atomic rendering methods.

    Since 3.7


    visu_ui_panel_elements_atomic_initOpen ()

    void                visu_ui_panel_elements_atomic_initOpen
                                                            ();

    Initialise the gtk methods associated with the atomic rendering method.


    visu_ui_panel_elements_atomic_onChange ()

    void                visu_ui_panel_elements_atomic_onChange
                                                            (GList *eleList);

    Call this routine with a list of VisuElement to change the values shown in the widgets controling the atomic rendering. The values to be put are read from the first VisuElement of the list. The list is then stored for future changes to the widgets will be applied to all these elements.

    eleList :

    a list of VisuElement. [element-type VisuElement*]
    v_sim-3.7.0/Documentation/reference/html/v-sim-gtk-colorComboBoxWidget.html0000644000353400050620000012606612216331356023726 00000000000000 gtk_colorComboBoxWidget

    gtk_colorComboBoxWidget

    gtk_colorComboBoxWidget — Defines a specialised GtkComboBox to choose stored colours.

    Object Hierarchy

      GObject
       +----GInitiallyUnowned
             +----GtkWidget
                   +----GtkContainer
                         +----GtkBin
                               +----GtkComboBox
                                     +----VisuUiColorCombobox
    

    Implemented Interfaces

    VisuUiColorCombobox implements AtkImplementorIface, GtkBuildable, GtkCellLayout and GtkCellEditable.

    Description

    This widget looks like a GtkComboBox and it displays a list of stored colours. These colours may come from the configuration files or can be selected and stored by the user actions. To do it, the first entry of the combo box is 'new / modify', that opens a GTK colour picker. The new values are used to craete a new colour entry in the combo box. In a complete version, the combo box can have a GtkVBox associated to modify colours without creating new entries, see visu_ui_color_combobox_newWithRanges() method. Otherwise, only already selected colours are available. The stored colours are shared by all widgets of this class. It is thus a convenient way to have coherent colour picker through V_Sim.

    When the widget is created with ranges, the additional part can be retrieve with visu_ui_color_combobox_getRangeWidgets() and attached whereever is convenient. When the ranges are modified, the new colour is not added to the combo box. It can be read using visu_ui_color_combobox_getRangeColor() or visu_ui_color_combobox_getRangeMaterial(). The combo box is set thus to an unselected state and visu_ui_color_combobox_getSelection() will return a NULL pointer. Besides the colour ranges, there is an add button to insert the newly defined colour into the combo box.

    This widget can emit a "color-selected" signal that is a wrapper around the "changed" signal, but it is emitted only when a new colour is selected (either an existing one or a newly created from the picker). This colour is passed to the callback. The two other signals, "color-value-changed" and "material-value-changed", are generated when the widget have been created with ranges and that one of these ranges is modified.

    Details

    VisuUiColorCombobox

    typedef struct _VisuUiColorCombobox VisuUiColorCombobox;

    Private structure to store informations of a VisuUiColorCombobox object.

    Since 3.1


    VisuUiColorComboboxClass

    typedef struct _VisuUiColorComboboxClass VisuUiColorComboboxClass;

    Private structure to store informations of a VisuUiColorComboboxClass object.

    Since 3.1


    visu_ui_color_combobox_getPixbufFromColor ()

    GdkPixbuf *         visu_ui_color_combobox_getPixbufFromColor
                                                            (VisuUiColorCombobox *colorComboBox,
                                                             ToolColor *color);

    The colorComboBox has little pixbufs to represent the color. User methods can use these pixbufs but should considered them read-only.

    colorComboBox :

    a VisuUiColorCombobox widget ;

    color :

    a ToolColor object.

    Returns :

    a pixbuf pointer corresponding to the little image shown on the colorComboBox. [transfer none]

    Since 3.1


    visu_ui_color_combobox_getRangeColor ()

    float *             visu_ui_color_combobox_getRangeColor
                                                            (VisuUiColorCombobox *colorComboBox);

    If the colorComboBox uses ranges (see visu_ui_color_combobox_newWithRanges()), this method is used to get the values from the color ranges.

    colorComboBox :

    a VisuUiColorCombobox widget.

    Returns :

    a newly created array of size 4. Use g_free() to delete it. [array fixed-size=4][transfer full]

    Since 3.2


    visu_ui_color_combobox_getRangeMaterial ()

    float *             visu_ui_color_combobox_getRangeMaterial
                                                            (VisuUiColorCombobox *colorComboBox);

    If the colorComboBox uses ranges (see visu_ui_color_combobox_newWithRanges()), this method is used to get the values from the material ranges.

    colorComboBox :

    a VisuUiColorCombobox widget.

    Returns :

    a newly created array of size VISU_GL_LIGHT_MATERIAL_N_VALUES (see VisuGlLightMaterial). Use g_free() to delete it. [array fixed-size=5][transfer full]

    Since 3.3


    visu_ui_color_combobox_getRangeWidgets ()

    GtkWidget *         visu_ui_color_combobox_getRangeWidgets
                                                            (VisuUiColorCombobox *colorComboBox);

    Retrieve the wiodget using to represent the ranges, or NULL if the object has no ranges.

    colorComboBox :

    a ToolColor object.

    Returns :

    a widget owned by color. [transfer none]

    Since 3.3


    visu_ui_color_combobox_getSelection ()

    ToolColor *         visu_ui_color_combobox_getSelection (VisuUiColorCombobox *colorComboBox);

    The user can access to the selected ToolColor object using this method.

    colorComboBox :

    a VisuUiColorCombobox widget.

    Returns :

    a pointer to the selected ToolColor object (or NULL). This object is read-only. [transfer none]

    Since 3.1


    visu_ui_color_combobox_new ()

    GtkWidget *         visu_ui_color_combobox_new          (gboolean hasAlphaChannel);

    A VisuUiColorCombobox widget is like a GtkComboBox widget, but it is already filled with the colors stores in the structures adhoc in visu_tools.h. Using this widget is a convienient way to share colors between all part of V_Sim and to give a consistent look of all color selection. If the argument hasAlphaChannel is FALSE, the widget display all colors but without their alpha channel, assuming it to be fully opaque.

    hasAlphaChannel :

    a boolean.

    Returns :

    a newly created VisuUiColorCombobox widget. [transfer full]

    Since 3.1


    visu_ui_color_combobox_newWithRanges ()

    GtkWidget *         visu_ui_color_combobox_newWithRanges
                                                            (gboolean hasAlphaChannel);

    Create a color combo and several ranges.

    hasAlphaChannel :

    a boolean.

    Returns :

    a newly created VisuUiColorCombobox widget. [transfer full]

    Since 3.3


    visu_ui_color_combobox_setExpanded ()

    void                visu_ui_color_combobox_setExpanded  (VisuUiColorCombobox *colorComboBox,
                                                             gboolean value);

    Set the expanded state of the ranges. This is usable only if the colorComboBox has been created with ranges.

    colorComboBox :

    a ToolColor object ;

    value :

    a boolean value.

    Since 3.3


    visu_ui_color_combobox_setPrintValues ()

    void                visu_ui_color_combobox_setPrintValues
                                                            (VisuUiColorCombobox *colorComboBox,
                                                             gboolean value);

    Print or not the RGB values.

    colorComboBox :

    a ToolColor object ;

    value :

    a boolean.

    Since 3.4


    visu_ui_color_combobox_setRangeColor ()

    void                visu_ui_color_combobox_setRangeColor
                                                            (VisuUiColorCombobox *colorComboBox,
                                                             float rgba[4],
                                                             gboolean raiseSignal);

    Change the values for the ranges that control the color. If the color exists in the list, it is also selected. This is possible only if the colorComboBox has been created with visu_ui_color_combobox_newWithRanges().

    colorComboBox :

    a VisuUiColorCombobox widget ;

    rgba :

    4 floating point values ;

    raiseSignal :

    if TRUE a material-value-changed can be raised.

    Since 3.3


    visu_ui_color_combobox_setRangeMaterial ()

    void                visu_ui_color_combobox_setRangeMaterial
                                                            (VisuUiColorCombobox *colorComboBox,
                                                             float material[VISU_GL_LIGHT_MATERIAL_N_VALUES],
                                                             gboolean raiseSignal);

    Change the values for the ranges that control the light (emission, diffuse...). This is possible only if the colorComboBox has been created with visu_ui_color_combobox_newWithRanges().

    colorComboBox :

    a VisuUiColorCombobox widget ;

    material :

    VISU_GL_LIGHT_MATERIAL_N_VALUES (see VisuGlLightMaterial) floating point values ;

    raiseSignal :

    if TRUE a material-value-changed can be raised.

    Since 3.3


    visu_ui_color_combobox_setSelection ()

    gboolean            visu_ui_color_combobox_setSelection (VisuUiColorCombobox *colorComboBox,
                                                             ToolColor *color);

    Use this method to set the ComboBox on the given color. This emits a 'color-channel' signal if the color is changed, which means, a previous color has been modified, or a new color is selected.

    colorComboBox :

    a VisuUiColorCombobox widget ;

    color :

    a ToolColor object.

    Returns :

    TRUE if the color already exists in the model.

    Since 3.1

    Signal Details

    The "color-selected" signal

    void                user_function                      (VisuUiColorCombobox *combo,
                                                            gpointer             color,
                                                            gpointer             user_data)      : Action

    This signal is emitted when a new valid colour is selected, either an existing one or newly created one.

    combo :

    the VisuUiColorCombobox that emits the signal ;

    color :

    the newly selected ToolColor.

    user_data :

    user data set when the signal handler was connected.

    Since 3.1


    The "color-value-changed" signal

    void                user_function                      (VisuUiColorCombobox *combo,
                                                            guint                RGBA,
                                                            gpointer             user_data)      : Action

    This signal is emitted when the range of a colour is modified.

    combo :

    the VisuUiColorCombobox that emits the signal ;

    RGBA :

    the modified channel.

    user_data :

    user data set when the signal handler was connected.

    Since 3.3


    The "material-value-changed" signal

    void                user_function                      (VisuUiColorCombobox *combo,
                                                            guint                mat,
                                                            gpointer             user_data)      : Action

    This signal is emitted when the range of a material is modified.

    combo :

    the VisuUiColorCombobox that emits the signal ;

    mat :

    the modified material channel (see VisuGlLightMaterial).

    user_data :

    user data set when the signal handler was connected.

    Since 3.3

    v_sim-3.7.0/Documentation/reference/html/v-sim-gtk-curveWidget.html0000644000353400050620000011403312216331356022272 00000000000000 gtk_curveWidget

    gtk_curveWidget

    gtk_curveWidget — A specialised curve widget to draw distance distribution for pairs.

    Object Hierarchy

      GObject
       +----GInitiallyUnowned
             +----GtkWidget
                   +----GtkDrawingArea
                         +----VisuUiCurveFrame
    

    Implemented Interfaces

    VisuUiCurveFrame implements AtkImplementorIface and GtkBuildable.

    Description

    This is a psecialised widget to display g(r) information.

    Details

    VisuUiCurveFrame

    typedef struct _VisuUiCurveFrame VisuUiCurveFrame;

    An opaque structure defining a VisuUiCurveFrame widget.

    Since 3.6


    VisuUiCurveFrameClass

    typedef struct _VisuUiCurveFrameClass VisuUiCurveFrameClass;

    An opaque structure defining the class of a VisuUiCurveFrame widget.

    Since 3.6


    enum VisuUiCurveFrameStyle

    typedef enum {
      CURVE_LINEAR,
      CURVE_BAR,
      CURVE_GAUSS
    } VisuUiCurveFrameStyle;
    

    Possible styles for the curve rendering, see visu_ui_curve_frame_setStyle().

    CURVE_LINEAR

    the curve is drawn with lines ;

    CURVE_BAR

    the curve is drawn with bars ;

    CURVE_GAUSS

    the curve is convoluted with gaussians (not implemented yet).

    visu_ui_curve_frame_addData ()

    void                visu_ui_curve_frame_addData         (VisuUiCurveFrame *curve,
                                                             const gchar *eleName,
                                                             const gchar *lkName,
                                                             const guint *data,
                                                             guint nSteps,
                                                             float init,
                                                             float step);

    This routine changes the distribution for element eleName, with respect to element lkName. data is an array that gives the number data[i] of pairs eleName - lkName which distance is in (init + step * i).

    curve :

    a VisuUiCurveFrame widget.

    eleName :

    a string.

    lkName :

    a string.

    data :

    an array of frequencies.

    nSteps :

    the size of data.

    init :

    the initial x value for array data.

    step :

    the step value to increase x for array data.

    Since 3.6


    visu_ui_curve_frame_draw ()

    void                visu_ui_curve_frame_draw            (VisuUiCurveFrame *curve);

    Forces to redraw the widget.

    curve :

    a VisuUiCurveFrame widget.

    Since 3.6


    visu_ui_curve_frame_getHighlightRange ()

    gboolean            visu_ui_curve_frame_getHighlightRange
                                                            (VisuUiCurveFrame *curve,
                                                             float range[2]);

    Retrieves the distance span that is used for highlight rendering and calculation, see visu_ui_curve_frame_setHighlightRange().

    curve :

    a VisuUiCurveFrame widget.

    range :

    a location for two floats.

    Returns :

    TRUE if range has been set already.

    Since 3.6


    visu_ui_curve_frame_getIntegralInRange ()

    float               visu_ui_curve_frame_getIntegralInRange
                                                            (VisuUiCurveFrame *curve,
                                                             gchar **label);

    Calculates the integral of the displayed distribution (see visu_ui_curve_frame_setFilter()) in the given range (see visu_ui_curve_frame_setHighlightRange()). If label is present, it will points on a string labeling the displayed distribution. The string is owned by V_Sim.

    curve :

    a VisuUiCurveFrame widget.

    label :

    a location to a string.

    Returns :

    the integral.

    Since 3.6


    visu_ui_curve_frame_getMeanInRange ()

    float               visu_ui_curve_frame_getMeanInRange  (VisuUiCurveFrame *curve,
                                                             gchar **label);

    Calculates the average distance value of the displayed distribution (see visu_ui_curve_frame_setFilter()) in the given range (see visu_ui_curve_frame_setHighlightRange()). If label is present, it will points on a string labeling the displayed distribution. The string is owned by V_Sim.

    curve :

    a VisuUiCurveFrame widget.

    label :

    a location to a string.

    Returns :

    the average distance value.

    Since 3.6


    visu_ui_curve_frame_getSpan ()

    void                visu_ui_curve_frame_getSpan         (VisuUiCurveFrame *curve,
                                                             float span[2]);

    Retrieves the distances inside which the distribution is displayed.

    curve :

    a VisuUiCurveFrame widget.

    span :

    a location for two floats.

    Since 3.6


    visu_ui_curve_frame_hasData ()

    gboolean            visu_ui_curve_frame_hasData         (VisuUiCurveFrame *curve);

    Retrieve if some distance data have been added to the curve.

    curve :

    a VisuUiCurveFrame widget.

    Returns :

    TRUE if the curve has some data associated.

    Since 3.6


    visu_ui_curve_frame_new ()

    GtkWidget *         visu_ui_curve_frame_new             (float distMin,
                                                             float distMax);

    It creates a graph that can display distances distribution for VisuElement pairing. The display span is given by distMin and distMax.

    distMin :

    a float.

    distMax :

    a float (bigger than distMin).

    Returns :

    a newly craeted VisuUiCurveFrame widget.

    Since 3.6


    visu_ui_curve_frame_setData ()

    void                visu_ui_curve_frame_setData         (VisuUiCurveFrame *curve,
                                                             float step,
                                                             float min,
                                                             float max);

    Compute and allocate the required size to store distributions, see visu_ui_curve_frame_addData() to actually setup the distribution values.

    curve :

    a VisuUiCurveFrame widget.

    step :

    the stepping distance.

    min :

    the minimum distance for the distribution.

    max :

    the maximum distance for the distribution.

    Since 3.6


    visu_ui_curve_frame_setFilter ()

    gboolean            visu_ui_curve_frame_setFilter       (VisuUiCurveFrame *curve,
                                                             const gchar *filter);

    Modify the filter used to draw all or single VisuElement distribution.

    curve :

    a VisuUiCurveFrame widget.

    filter :

    a string.

    Returns :

    TRUE if filter is actually changed.

    Since 3.6


    visu_ui_curve_frame_setHighlightRange ()

    gboolean            visu_ui_curve_frame_setHighlightRange
                                                            (VisuUiCurveFrame *curve,
                                                             float range[2]);

    Modify the distance span that is used for highlight rendering and calculation, see visu_ui_curve_frame_getMeanInRange().

    curve :

    a VisuUiCurveFrame widget.

    range :

    two floats.

    Returns :

    TRUE if range is actually changed.

    Since 3.6


    visu_ui_curve_frame_setNNodes ()

    void                visu_ui_curve_frame_setNNodes       (VisuUiCurveFrame *curve,
                                                             const gchar *ele,
                                                             guint n);

    Modify the number of ... TODO

    curve :

    a VisuUiCurveFrame widget.

    ele :

    a string.

    n :

    a number.

    Since 3.6


    visu_ui_curve_frame_setSpan ()

    gboolean            visu_ui_curve_frame_setSpan         (VisuUiCurveFrame *curve,
                                                             float span[2]);

    Changes the distance range that is displayed on the curve.

    curve :

    a VisuUiCurveFrame widget.

    span :

    two floats.

    Returns :

    TRUE if the distance displayed is actually changed.

    Since 3.6


    visu_ui_curve_frame_setStyle ()

    gboolean            visu_ui_curve_frame_setStyle        (VisuUiCurveFrame *curve,
                                                             VisuUiCurveFrameStyle style);

    Modify the rendering style of the graph.

    curve :

    a VisuUiCurveFrame object.

    style :

    a style id.

    Returns :

    TRUE if the style is actually changed.

    Since 3.5

    v_sim-3.7.0/Documentation/reference/html/v-sim-gtk-cylinder.html0000644000353400050620000001603212216331356021613 00000000000000 gtk_cylinder

    gtk_cylinder

    gtk_cylinder — The additional widgets displayed in the pair dialog to handle cylinder pairs.

    Description

    Some additional widgets to be displayed in the pairs dialog window. It contains a tool to choose the colourisation scheme of pairs and the radius of cylinder representation.

    Details

    visu_ui_pairs_cylinder_getValues ()

    gchar *             visu_ui_pairs_cylinder_getValues    (VisuPairLink *data);

    Create an internationalised UTF-8 label that describes the information about a pair.

    data :

    information about a pair

    Returns :

    a newly allocated string. [transfer full]

    visu_ui_pairs_cylinder_init ()

    void                visu_ui_pairs_cylinder_init         (void);

    This routine is used by V_Sim to initialise the Gtk part of cylinder pair model. This should be called once on start-up.


    visu_ui_pairs_cylinder_initBuild ()

    GtkWidget *         visu_ui_pairs_cylinder_initBuild    ();

    This routine create a container GtkWidget that hold all widgets necessary for handling cylinder pair model.

    Returns :

    a newly created GtkWidget.

    visu_ui_pairs_cylinder_setValues ()

    void                visu_ui_pairs_cylinder_setValues    (VisuPairLink *data);

    Change the widget values with the given information. This change trigger no signals.

    data :

    information about a pair.
    v_sim-3.7.0/Documentation/reference/html/v-sim-gtk-dumpDialogWidget.html0000644000353400050620000005665112216331356023246 00000000000000 gtk_dumpDialogWidget

    gtk_dumpDialogWidget

    gtk_dumpDialogWidget — Defines a widget to export into different file formats.

    Object Hierarchy

      GObject
       +----GInitiallyUnowned
             +----GtkWidget
                   +----GtkContainer
                         +----GtkBin
                               +----GtkWindow
                                     +----GtkDialog
                                           +----VisuUiDumpDialog
    

    Implemented Interfaces

    VisuUiDumpDialog implements AtkImplementorIface and GtkBuildable.

    Description

    This widget is based on the GtkFileChooser in the save mode. It proposes the user to choose a file to save to. In addition, it automatically build a list of filters, corresponding to the available export routines in V_Sim. By default, the filter is set on 'auto', which means that the filter method is selected with the file extension. The dialog also has a progress bar.

    This widget is also a dialog, and should be used with gtk_dialog_run(). After the response GTK_RESPONSE_ACCEPT has been recieved, one can grep the selected filename with visu_ui_dump_dialog_getFilename(). The dialog does not call the exporting routine by itself, the calling method should take care of that. When doing it, the filechoosing part should be made insensitive, using visu_ui_dump_dialog_start() and the progress bar should be updated accordingly (get it with visu_ui_dump_dialog_getProgressBar()).

    The user interface propose also to change the size (see visu_ui_dump_dialog_getHeight() and visu_ui_dump_dialog_getWidth()) and if some options are associated to a file format, these options are displayed.

    Details

    VisuUiDumpDialog

    typedef struct _VisuUiDumpDialog VisuUiDumpDialog;

    Private structure to store informations of a VisuUiDumpDialog object.


    VisuUiDumpDialogClass

    typedef struct _VisuUiDumpDialogClass VisuUiDumpDialogClass;

    Private structure to store informations of a VisuUiDumpDialogClass object.


    visu_ui_dump_dialog_getCancelButton ()

    GtkButton *         visu_ui_dump_dialog_getCancelButton (VisuUiDumpDialog *dialog);

    Retrieve interesting widget.

    dialog :

    a VisuUiDumpDialog object.

    Returns :

    a pointer to the cancel button. [transfer none]

    visu_ui_dump_dialog_getFilename ()

    gchar *             visu_ui_dump_dialog_getFilename     (VisuUiDumpDialog *dialog);

    Retrieve the chosen filename.

    dialog :

    a VisuUiDumpDialog object.

    Returns :

    a read-only string.

    visu_ui_dump_dialog_getHeight ()

    gint                visu_ui_dump_dialog_getHeight       (VisuUiDumpDialog *dialog);

    Retrieve request image size.

    dialog :

    a VisuUiDumpDialog object.

    Returns :

    the height value.

    visu_ui_dump_dialog_getProgressBar ()

    GtkProgressBar *    visu_ui_dump_dialog_getProgressBar  (VisuUiDumpDialog *dialog);

    Retrieve interesting widget.

    dialog :

    a VisuUiDumpDialog object.

    Returns :

    a pointer to the progress bar. [transfer none]

    visu_ui_dump_dialog_getType ()

    VisuDump *          visu_ui_dump_dialog_getType         (VisuUiDumpDialog *dialog);

    Retrieve the chosen VisuDump.

    dialog :

    a VisuUiDumpDialog object.

    Returns :

    the selected format (ToolFileFormat and write method). [transfer none]

    visu_ui_dump_dialog_getWidth ()

    gint                visu_ui_dump_dialog_getWidth        (VisuUiDumpDialog *dialog);

    Retrieve request image size.

    dialog :

    a VisuUiDumpDialog object.

    Returns :

    the width value.

    visu_ui_dump_dialog_new ()

    GtkWidget *         visu_ui_dump_dialog_new             (VisuData *dataObj,
                                                             GtkWindow *parent,
                                                             const gchar *suggestedFilename,
                                                             gint suggestedWidth,
                                                             gint suggestedHeight);

    A VisuUiDumpDialog widget is complete dialog window widget, but it is already prepared for dumping, proposing known file formats. It is usefull to get an filename to export to. It has also a progress bar that can illustrate the process. The given dataObj argument is used to initialize some values related to the data to be dumped.

    dataObj :

    a VisuData object (can be NULL) ;. [allow-none]

    parent :

    the parent window ;. [allow-none]

    suggestedFilename :

    a string or NULL. [allow-none]

    suggestedWidth :

    a positive suggested width for exportation or a negative value to get the default.

    suggestedHeight :

    idem for height.

    Returns :

    a newly created VisuUiDumpDialog widget.

    visu_ui_dump_dialog_start ()

    void                visu_ui_dump_dialog_start           (VisuUiDumpDialog *dialog);

    Make the file chooser part insensitive during dump, only the progress bar and the abort button are kept sensitive.

    dialog :

    a VisuUiDumpDialog object.

    visu_ui_dump_dialog_stop ()

    void                visu_ui_dump_dialog_stop            (VisuUiDumpDialog *dialog);

    Return the filechooser to a sensitive state.

    dialog :

    a VisuUiDumpDialog object.
    v_sim-3.7.0/Documentation/reference/html/v-sim-gtk-elementComboBox.html0000644000353400050620000004501612216331356023070 00000000000000 gtk_elementComboBox

    gtk_elementComboBox

    gtk_elementComboBox — Defines a specialised GtkComboBox to choose VisuElement.

    Object Hierarchy

      GObject
       +----GInitiallyUnowned
             +----GtkWidget
                   +----GtkContainer
                         +----GtkBin
                               +----GtkComboBox
                                     +----VisuUiElementCombobox
    

    Implemented Interfaces

    VisuUiElementCombobox implements AtkImplementorIface, GtkBuildable, GtkCellLayout and GtkCellEditable.

    Signals

      "element-selected"                               : Action
    

    Description

    This widget looks like a GtkComboBox and it displays a list of VisuElement currently used by the displayed data.

    Details

    VisuUiElementCombobox

    typedef struct _VisuUiElementCombobox VisuUiElementCombobox;

    An opaque structure defining a VisuUiElementCombobox widget.

    Since 3.6


    VisuUiElementComboboxClass

    typedef struct _VisuUiElementComboboxClass VisuUiElementComboboxClass;

    An opaque structure defining the class of a VisuUiElementCombobox widget.

    Since 3.6


    visu_ui_element_combobox_getSelection ()

    GList *             visu_ui_element_combobox_getSelection
                                                            (VisuUiElementCombobox *wd);

    Provide a list of selected elements.

    wd :

    a VisuUiElementCombobox widget.

    Returns :

    a newly created list of VisuElement. It should be freed later with g_list_free(). [transfer container][element-type VisuElement*]

    Since 3.6


    visu_ui_element_combobox_new ()

    GtkWidget *         visu_ui_element_combobox_new        (gboolean hasAllSelector,
                                                             gboolean hasNoneSelector,
                                                             const gchar *format);

    Creates a GtkComboBox with a list of available VisuElement. This list can contain in addition a "all" value if hasAllSelector is TRUE, or a "None" value if hasNoneSelector is TRUE. The format parameter is used to specify the text for each row of the GtkComboBox. If formt is NULL, just the name of the element is printed.

    hasAllSelector :

    a boolean.

    hasNoneSelector :

    a boolean.

    format :

    a string (can be NULL). [allow-none]

    Returns :

    a newly created widget. [transfer full]

    Since 3.6


    visu_ui_element_combobox_setSelection ()

    gboolean            visu_ui_element_combobox_setSelection
                                                            (VisuUiElementCombobox *wd,
                                                             const gchar *name);

    Select a VisuElement by providing its name.

    wd :

    a VisuUiElementCombobox widget.

    name :

    a string.

    Returns :

    TRUE if the given element exists.

    Since 3.6


    visu_ui_element_combobox_setUnphysicalStatus ()

    void                visu_ui_element_combobox_setUnphysicalStatus
                                                            (VisuUiElementCombobox *wd,
                                                             gboolean status);

    If status is TRUE, the combobox will also show elements that are tagged unphysical, see visu_element_getPhysical().

    wd :

    a VisuUiElementCombobox object ;

    status :

    a boolean

    Since 3.7

    Signal Details

    The "element-selected" signal

    void                user_function                      (VisuUiElementCombobox *combo,
                                                            gpointer               element,
                                                            gpointer               user_data)      : Action

    This signal is emitted when a new element is selected.

    combo :

    the VisuUiElementCombobox that emits the signal ;

    element :

    the newly selected VisuElement.

    user_data :

    user data set when the signal handler was connected.

    Since 3.6

    v_sim-3.7.0/Documentation/reference/html/v-sim-gtk-fieldChooser.html0000644000353400050620000003721012216331356022411 00000000000000 gtk_fieldChooser

    gtk_fieldChooser

    gtk_fieldChooser — Defines a widget to choose a scalar field or an isosurface.

    Object Hierarchy

      GObject
       +----GInitiallyUnowned
             +----GtkWidget
                   +----GtkContainer
                         +----GtkBin
                               +----GtkWindow
                                     +----GtkDialog
                                           +----GtkFileChooserDialog
                                                 +----VisuUiFieldChooser
    

    Implemented Interfaces

    VisuUiFieldChooser implements AtkImplementorIface, GtkBuildable and GtkFileChooser.

    Signals

      "validate"                                       : No Recursion
    

    Description

    TODO.

    Details

    enum VisuUiBoxFit

    typedef enum {
        VISU_UI_FIT_TO_BOX,
        VISU_UI_FIT_TO_SURFACE
    } VisuUiBoxFit;
    

    Possible value to adapt the boxes of structure and field.

    VISU_UI_FIT_TO_BOX

    adapt the box of the field to the box of the loaded VisuData.

    VISU_UI_FIT_TO_SURFACE

    adapt the box of the loaded VisuData to the box of the field.

    Since 3.7


    VisuUiFieldChooser

    typedef struct _VisuUiFieldChooser VisuUiFieldChooser;

    Private structure to store informations of a VisuUiFieldChooser object.


    VisuUiFieldChooserClass

    typedef struct _VisuUiFieldChooserClass VisuUiFieldChooserClass;

    Private structure to store informations of a VisuUiFieldChooserClass object.


    visu_ui_field_chooser_getFileFormat ()

    VisuScalarFieldMethod * visu_ui_field_chooser_getFileFormat
                                                            (VisuUiFieldChooser *dialog);

    After the dialog returns, it has validate the selected file on possible file formats.

    dialog :

    a VisuUiFieldChooser object.

    Returns :

    the VisuScalarFieldMethod that correspond to the selected file.

    Since 3.7


    visu_ui_field_chooser_getFit ()

    VisuUiBoxFit        visu_ui_field_chooser_getFit        (VisuUiFieldChooser *dialog);

    The VisuScalarField objects can be fitted on the visuData box or impose their boxes to VisuData.

    dialog :

    a VisuUiFieldChooser object.

    Returns :

    if the box should be fitted or not.

    Since 3.7


    visu_ui_field_chooser_new ()

    GtkWidget *         visu_ui_field_chooser_new           (GtkWindow *parent);

    Create a filechooser, specific for VisuScalarField files.

    parent :

    the parent window. [allow-none]

    Returns :

    a newly created file chooser. [transfer full]

    Since 3.7


    visu_ui_field_chooser_setOptions ()

    void                visu_ui_field_chooser_setOptions    (VisuUiFieldChooser *dialog,
                                                             GtkWidget *wd);

    One can add widgets to add more options to the chooser. If the chooser already has some option widgets, they are destroyed.

    dialog :

    a VisuUiFieldChooser object.

    wd :

    some additional options to add to the dialog.

    Since 3.7

    Signal Details

    The "validate" signal

    void                user_function                      (VisuUiFieldChooser *chooser,
                                                            GObject            *arg1,
                                                            gpointer            user_data)      : No Recursion

    Gets emitted when the user choose a file and a format has been validated for it.

    chooser :

    the object which emit the signal ;

    user_data :

    user data set when the signal handler was connected.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/v-sim-gtk-interactive.html0000644000353400050620000004243512216331356022325 00000000000000 gtk_interactive

    gtk_interactive

    gtk_interactive — The interactive dialog.

    Description

    This is the second main interface for V_Sim after the command panel. It provides widgets to interact with the nodes. There is three built-in interactive modes : the observe one (as in normal behaviour), the pick one and the move one.

    It is possible to add new action thanks to visu_ui_interactive_addAction() function. It is also possible to show a small warning message with visu_ui_interactive_setMessage() that shows a GtkInfoBar.

    Details

    enum VisuUiInteractiveActionId

    typedef enum {
        VISU_UI_ACTION_OBSERVE,
        VISU_UI_ACTION_PICK,
        VISU_UI_ACTION_MOVE,
    } VisuUiInteractiveActionId;
    

    Possibe actions.

    VISU_UI_ACTION_OBSERVE

    interactive session is observe ;

    VISU_UI_ACTION_PICK

    interactive session is pick ;

    VISU_UI_ACTION_MOVE

    interactive session is geometry changes.

    VISU_UI_ACTION_N_PRESET

    private.

    VisuUiInteractiveBuild ()

    GtkWidget *         (*VisuUiInteractiveBuild)           (VisuUiMain *main,
                                                             gchar **label,
                                                             gchar **help,
                                                             GtkWidget **radio);

    One can create new tab in the interactive dialog window by providing routines with this prototype.

    main :

    the main interface.

    label :

    a location to store the name of the tab ;

    help :

    a location to store the help message to be shown at the bottom of the window ;

    radio :

    a location on the radio button that will be toggled when the desired action is used.

    Returns :

    a new container to be include as a tab in the interactive dialog window.

    VisuUiInteractiveStartStop ()

    void                (*VisuUiInteractiveStartStop)       (VisuUiRenderingWindow *window);

    Routines of this prototype are called each time the interactive mode should be changed.

    window :

    the rendering window that starts or stops the interaction defined in the tab.

    visu_ui_interactive_addAction ()

    guint               visu_ui_interactive_addAction       (VisuUiInteractiveBuild build,
                                                             VisuUiInteractiveStartStop start,
                                                             VisuUiInteractiveStartStop stop);

    One can add new interactive mode with specific tab in the interactive dialog.

    build :

    a routine to build a tab.

    start :

    a routine to run when session is selected.

    stop :

    a routine to run when session is stopped.

    Returns :

    an id for this new action.

    Since 3.6


    visu_ui_interactive_init ()

    void                visu_ui_interactive_init            ();

    Initialise the observe/pick window, connect the signals, give names to widgets...


    visu_ui_interactive_initBuild ()

    void                visu_ui_interactive_initBuild       (VisuUiMain *main);

    create the window.

    main :

    the command panel the about dialog is associated to.

    visu_ui_interactive_setMessage ()

    void                visu_ui_interactive_setMessage      (const gchar *message,
                                                             GtkMessageType type);

    Show a message in the interactive dialog.

    message :

    a string.

    type :

    the type of message.

    Since 3.6


    visu_ui_interactive_start ()

    void                visu_ui_interactive_start           (VisuUiRenderingWindow *window);

    Start the observe & pick session.

    window :

    the current rendering widget.

    visu_ui_interactive_toggle ()

    void                visu_ui_interactive_toggle          ();

    The user can switch between a current specific interactive action and the observe mode. This routine is used to do this.*

    Since 3.6


    visu_ui_interactive_unsetMessage ()

    void                visu_ui_interactive_unsetMessage    ();

    Hide any message from the interactive dialog. See also visu_ui_interactive_setMessage().

    Since 3.6

    v_sim-3.7.0/Documentation/reference/html/v-sim-gtk-lineObjectWidget.html0000644000353400050620000005726412216331356023240 00000000000000 gtk_lineObjectWidget

    gtk_lineObjectWidget

    gtk_lineObjectWidget — Defines a specialised GtkBox to choose all characteristic of lines.

    Synopsis

                        VisuUiLine;
                        VisuUiLineClass;
    GtkWidget *         visu_ui_line_getOptionBox           (VisuUiLine *line);
    GtkWidget *         visu_ui_line_new                    (const gchar *label);
    void                visu_ui_line_setColor               (VisuUiLine *line,
                                                             float rgb[3]);
    void                visu_ui_line_setStipple             (VisuUiLine *line,
                                                             guint16 stipple);
    void                visu_ui_line_setUsed                (VisuUiLine *line,
                                                             gboolean status);
    void                visu_ui_line_setWidth               (VisuUiLine *line,
                                                             gint width);
    

    Object Hierarchy

      GObject
       +----GInitiallyUnowned
             +----GtkWidget
                   +----GtkContainer
                         +----GtkBox
                               +----GtkVBox
                                     +----VisuUiLine
    

    Implemented Interfaces

    VisuUiLine implements AtkImplementorIface, GtkBuildable and GtkOrientable.

    Description

    Details

    VisuUiLine

    typedef struct _VisuUiLine VisuUiLine;

    Private structure to store informations of a VisuUiLine object.

    Since 3.4


    VisuUiLineClass

    typedef struct _VisuUiLineClass VisuUiLineClass;

    Private structure to store informations of a VisuUiLineClass object.

    Since 3.4


    visu_ui_line_getOptionBox ()

    GtkWidget *         visu_ui_line_getOptionBox           (VisuUiLine *line);

    Give access to the GtkVBox of the expander.

    line :

    the object to get the GtkVBox.

    Returns :

    a GtkWidget. [transfer none]

    Since 3.6


    visu_ui_line_new ()

    GtkWidget *         visu_ui_line_new                    (const gchar *label);

    A VisuUiLine widget is a widget allowing to choose the properties of a line. These properties are the line stipple pattern, its colour and its width. The colour is available through GtkRange and with a VisuUiColorCombobox widget. There is also a checkbox allowing to turn the line on or off.

    label :

    the name of the group, output in bold.

    Returns :

    a newly created VisuUiLine widget. [transfer full]

    Since 3.4


    visu_ui_line_setColor ()

    void                visu_ui_line_setColor               (VisuUiLine *line,
                                                             float rgb[3]);

    The line can is drawn in a given colour. Change the interface values using this routine. The colour ranges are updated and if it correspond to a registered colour, it is selected in the combobox.

    line :

    the object to modify ;

    rgb :

    a RGB array.

    Since 3.4


    visu_ui_line_setStipple ()

    void                visu_ui_line_setStipple             (VisuUiLine *line,
                                                             guint16 stipple);

    The line can be drawn with a given stipple pattern, call this routine to change the interface value.

    line :

    the object to modify ;

    stipple :

    a value.

    Since 3.4


    visu_ui_line_setUsed ()

    void                visu_ui_line_setUsed                (VisuUiLine *line,
                                                             gboolean status);

    The line can be turn on or off, call this routine to change the interface status.

    line :

    the object to modify ;

    status :

    a boolean.

    Since 3.4


    visu_ui_line_setWidth ()

    void                visu_ui_line_setWidth               (VisuUiLine *line,
                                                             gint width);

    The line can be drawn with a given width, call this routine to change the interface value.

    line :

    the object to modify ;

    width :

    a value.

    Since 3.4

    Signal Details

    The "color-changed" signal

    void                user_function                      (VisuUiLine *line,
                                                            gpointer    color,
                                                            gpointer    user_data)      : Action

    This signal is emitted when the colour of the line is changed.

    line :

    the VisuUiLine that emits the signal ;

    color :

    the new color values (three RGB values).

    user_data :

    user data set when the signal handler was connected.

    Since 3.4


    The "stipple-changed" signal

    void                user_function                      (VisuUiLine *line,
                                                            guint       stipple,
                                                            gpointer    user_data)      : Action

    This signal is emitted when the stipple pattern of the line is changed.

    line :

    the VisuUiLine that emits the signal ;

    stipple :

    the new stipple pattern.

    user_data :

    user data set when the signal handler was connected.

    Since 3.4


    The "use-changed" signal

    void                user_function                      (VisuUiLine *line,
                                                            gboolean    used,
                                                            gpointer    user_data)      : Action

    This signal is emitted when the usage check box is changed.

    line :

    the VisuUiLine that emits the signal ;

    used :

    TRUE if the line is used.

    user_data :

    user data set when the signal handler was connected.

    Since 3.4


    The "width-changed" signal

    void                user_function                      (VisuUiLine *line,
                                                            gint        width,
                                                            gpointer    user_data)      : Action

    This signal is emitted when the width of the line is changed.

    line :

    the VisuUiLine that emits the signal ;

    width :

    the new width.

    user_data :

    user data set when the signal handler was connected.

    Since 3.4

    v_sim-3.7.0/Documentation/reference/html/v-sim-gtk-main.html0000644000353400050620000005655412216331356020743 00000000000000 gtk_main

    gtk_main

    gtk_main — The command panel definition.

    Object Hierarchy

      GObject
       +----GInitiallyUnowned
             +----GtkWidget
                   +----GtkContainer
                         +----GtkBin
                               +----GtkWindow
                                     +----VisuUiMain
    

    Implemented Interfaces

    VisuUiMain implements AtkImplementorIface and GtkBuildable.

    Signals

      "DataFocused"                                    : No Hooks
    

    Description

    This is the main interface in V_Sim. It hosts the common action buttons, like open a file, save resources, switch to interactive session... It also hosts the different panels.

    Details

    struct VisuUiMain

    struct VisuUiMain;

    Structure to describe the main interface of V_Sim.


    VisuUiMainClass

    typedef struct _VisuUiMainClass VisuUiMainClass;

    A short way to identify _VisuUiMainClass structure.


    VisuUiMain_private

    typedef struct VisuUiMain_private_struct VisuUiMain_private;
    

    Private fields for VisuUiMain objects.


    visu_ui_main_buildInteractiveDialog ()

    void                visu_ui_main_buildInteractiveDialog (VisuUiMain *main);

    Create the mouse action dialog window (if not already done).

    main :

    a VisuUiMain object.

    visu_ui_main_class_createMain ()

    void                visu_ui_main_class_createMain       (GtkWindow **panel,
                                                             GtkWindow **renderWindow,
                                                             GtkWidget **renderArea);

    A convenience routine to create a command panel, a rendering window and links them together.

    panel :

    a location for a VisuUiMain panel ;

    renderWindow :

    a location for a GtkWindow ;

    renderArea :

    a location for a GtkWidget.

    visu_ui_main_class_getCurrentPanel ()

    VisuUiMain *        visu_ui_main_class_getCurrentPanel  ();

    This routine can be used to get the command panel, everywhere from V_Sim.

    Returns :

    the command Panel. [transfer none]

    visu_ui_main_class_getDefaultRendering ()

    VisuUiRenderingWindow * visu_ui_main_class_getDefaultRendering
                                                            ();

    Get the rendering window of V_Sim.

    Returns :

    the rendering window. [transfer none]

    visu_ui_main_class_getRememberPosition ()

    gboolean            visu_ui_main_class_getRememberPosition
                                                            ();

    V_Sim can store the position of its main windows. Use this routine to get the status of this capability.

    Returns :

    TRUE if set.

    visu_ui_main_class_setCurrentPanel ()

    void                visu_ui_main_class_setCurrentPanel  (VisuUiMain *main);

    After having created the command panel with visu_ui_main_new(), use this routine to declare it as the current command panel.

    main :

    a command panel.

    visu_ui_main_class_setRememberPosition ()

    void                visu_ui_main_class_setRememberPosition
                                                            (gboolean val);

    V_Sim can try to remember the position of its main windows, then open them again will result in a positioning on screen equivalent to previous position.

    val :

    an boolean.

    visu_ui_main_initPanels ()

    gboolean            visu_ui_main_initPanels             (gpointer data);

    Call the init routines for the different panels.

    data :

    a pointer on a VisuUiMain object.

    Returns :

    always FALSE.

    visu_ui_main_new ()

    GtkWidget *         visu_ui_main_new                    (gboolean oneWindow);

    Create the command panel window and is dependencies, such as the associated rendering window... WARNING: some part are still currently static, so only once instance can be created at a time. If oneWindow argument is TRUE, then the rendering area is creating in the same GtkWindow on the right of the panel.

    oneWindow :

    a boolean.

    Returns :

    a newly create command panel.

    visu_ui_main_quit ()

    void                visu_ui_main_quit                   (VisuUiMain *main,
                                                             gboolean force);

    Quit the program. If the preference to have a confirm dialog is set, then it raises the little warning window before quiting (or not).

    main :

    a pointer to the main interface.

    force :

    if TRUE, override the preference of a quiting dialog and quit.

    visu_ui_main_runCommandLine ()

    gboolean            visu_ui_main_runCommandLine         (gpointer data);

    Call the get routines from the command line module and associate the different tasks to the different panels. For a version that do not use the panels, call visu_ui_runCommandLine() instead.

    data :

    a pointer on a VisuUiMain object.

    Returns :

    always FALSE.

    Signal Details

    The "DataFocused" signal

    void                user_function                      (VisuUiMain *ui,
                                                            GObject    *dataObj,
                                                            gpointer    user_data)      : No Hooks

    This signal is emitted when dataObj has been displayed on the rendering window and is ready for use.

    ui :

    the object which received the signal ;

    dataObj :

    the newly associated VisuData object.

    user_data :

    user data set when the signal handler was connected.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/v-sim-gtk-move.html0000644000353400050620000002027712216331356020756 00000000000000 gtk_move

    gtk_move

    gtk_move — The move tab in the interactive dialog.

    Description

    This action tab provides widgets to move single or group of atoms. It provides also widgets to remove or add atoms. And finally it provides a way to change the basis-set by picking atoms to form vertices of a new basis-set.

    Details

    visu_ui_interactive_move_initBuild ()

    GtkWidget *         visu_ui_interactive_move_initBuild  (VisuUiMain *main,
                                                             gchar **label,
                                                             gchar **help,
                                                             GtkWidget **radio);

    This routine should be called in conjonction to the visu_ui_interactive_pick_initBuild() one. It completes the creation of widgets (and also initialisation of values) for the move tab.

    main :

    the main interface.

    label :

    a location to store the name of the move tab ;

    help :

    a location to store the help message to be shown at the bottom of the window ;

    radio :

    a location on the radio button that will be toggled when the move action is used.

    visu_ui_interactive_move_start ()

    void                visu_ui_interactive_move_start      (VisuUiRenderingWindow *window);

    Initialise a moving session.

    window :

    a VisuUiRenderingWindow object.

    visu_ui_interactive_move_stop ()

    void                visu_ui_interactive_move_stop       (VisuUiRenderingWindow *window);

    Finalise a moving session.

    window :

    a VisuUiRenderingWindow object.
    v_sim-3.7.0/Documentation/reference/html/v-sim-gtk-numericalEntryWidget.html0000644000353400050620000003155612216331356024157 00000000000000 gtk_numericalEntryWidget

    gtk_numericalEntryWidget

    gtk_numericalEntryWidget — Defines a widget to enter numerical values without any boundary or precision constrains.

    Object Hierarchy

      GObject
       +----GInitiallyUnowned
             +----GtkWidget
                   +----GtkEntry
                         +----VisuUiNumericalEntry
    

    Implemented Interfaces

    VisuUiNumericalEntry implements AtkImplementorIface, GtkBuildable, GtkEditable and GtkCellEditable.

    Signals

      "value-changed"                                  : Action
    

    Description

    This widget is based on the GtkEntry widget but behaves more like a GtkSpinButton is fact. It is designed to enter numerical values, but without any boundary or precision constrains. One can use either plain or scientific notations.

    Details

    VisuUiNumericalEntry

    typedef struct _VisuUiNumericalEntry VisuUiNumericalEntry;

    Short form for a VisuUiNumericalEntry_struct structure.


    VisuUiNumericalEntryClass

    typedef struct _VisuUiNumericalEntryClass VisuUiNumericalEntryClass;

    Opaque structure.


    visu_ui_numerical_entry_getValue ()

    double              visu_ui_numerical_entry_getValue    (VisuUiNumericalEntry *numericalEntry);

    You can get the value contained in the given numericalEntry using this method.

    numericalEntry :

    a VisuUiNumericalEntry widget.

    Returns :

    the double precision value printed in the VisuUiNumericalEntry.

    visu_ui_numerical_entry_new ()

    GtkWidget *         visu_ui_numerical_entry_new         (double value);

    A VisuUiNumericalEntry widget is like a GtkEntry widget, but it only accepts double precision values (written in plain format, e.g. 1.23456, or scientific notation, e.g. 1.2345e6). The widget can't be blank and there is always a value printed in it. If the user erase the current value or enter something that is not a recognised double precision value, the widget returns to its previous valid value.

    value :

    the initial value.

    Returns :

    a newly created VisuUiNumericalEntry widget.

    visu_ui_numerical_entry_setValue ()

    void                visu_ui_numerical_entry_setValue    (VisuUiNumericalEntry *numericalEntry,
                                                             double value);

    Use this method to set the value for the given numericalEntry widget.

    numericalEntry :

    a VisuUiNumericalEntry widget ;

    value :

    a double precision value.

    Signal Details

    The "value-changed" signal

    void                user_function                      (VisuUiNumericalEntry *entry,
                                                            gdouble               oldValue,
                                                            gpointer              user_data)      : Action

    This signal is emitted when a new valid numerical value is entered.

    entry :

    the VisuUiNumericalEntry that emits the signal ;

    oldValue :

    the previous value.

    user_data :

    user data set when the signal handler was connected.

    Since 3.1

    v_sim-3.7.0/Documentation/reference/html/v-sim-gtk-openGLWidget.html0000644000353400050620000005317012216331356022336 00000000000000 gtk_openGLWidget

    gtk_openGLWidget

    gtk_openGLWidget — defines an OpenGL capable GtkWidget.

    Object Hierarchy

      GObject
       +----GInitiallyUnowned
             +----GtkWidget
                   +----VisuUiGlWidget
    

    Implemented Interfaces

    VisuUiGlWidget implements AtkImplementorIface and GtkBuildable.

    Description

    This is a simple implementation of GtkGlExt to create an OpenGL surface that is a full GtkWidget. When creating such a widget, one should give then a VisuUiGlWidgetRedrawMethod() to tell the widget how to redraw itself when needed.

    The current implementation is working on X11 (built-in or with GtkGlExt) and Win32.

    Details

    VisuUiGlWidget

    typedef struct _VisuUiGlWidget VisuUiGlWidget;

    Short name to address VisuUiGlWidget_struct objects.


    VisuUiGlWidgetClass

    typedef struct _VisuUiGlWidgetClass VisuUiGlWidgetClass;

    Short name to address VisuUiGlWidgetClass_struct objects.


    VisuUiGlWidgetRedrawMethod ()

    void                (*VisuUiGlWidgetRedrawMethod)       (VisuGlView *view,
                                                             GList *lists);

    Methods of this prototype are called when the redraw of the OpenGL zone should be done.

    view :

    a VisuGlView object with the camera settings.

    lists :

    a VisuGlExt array or NULL. [allow-none][type VisuGlExt*]

    visu_ui_gl_widget_class_getCurrentContext ()

    VisuUiGlWidget *    visu_ui_gl_widget_class_getCurrentContext
                                                            ();

    Class routine that returns the OpenGL widget which has the current context.

    Returns :

    the VisuUiGlWidget with the current OpenGL context. [transfer none]

    visu_ui_gl_widget_getPixmapData ()

    GArray *            visu_ui_gl_widget_getPixmapData     (VisuUiGlWidget *render,
                                                             int *width,
                                                             int *height,
                                                             gboolean offScreen,
                                                             gboolean hasAlpha);

    Create an image from the OpenGL area. The size can be changed, using width and height. If these pointers contains positive values, then they are used to set the size for the image. If not, the current size is used and stored in these pointers. The boolean offScreen is used to tell if the image is taken from current context or if an offscreen pixmap is created for the rendering.

    render :

    a VisuUiGlWidget object ;

    width :

    a pointer to the desired width or -1 ;

    height :

    a pointer to the desired height or -1 ;

    offScreen :

    a boolean ;

    hasAlpha :

    if TRUE, the returned data is RGBA, else only RGB.

    Returns :

    image data, row by row. [transfer full]

    visu_ui_gl_widget_new ()

    GtkWidget *         visu_ui_gl_widget_new               (gboolean contextIsDirect);

    Create a new OpenGL area inside a GTK widget. If contextIsDirect then it tries to initialise the OpenGL context to a direct one.

    contextIsDirect :

    a boolean.

    Returns :

    a newly created widget.

    visu_ui_gl_widget_redraw ()

    void                visu_ui_gl_widget_redraw            (VisuUiGlWidget *render);

    Force redraw on the given surface, if a redraw method have been given (see visu_ui_gl_widget_setRedraw()).

    render :

    a VisuUiGlWidget object.

    visu_ui_gl_widget_setCurrent ()

    gboolean            visu_ui_gl_widget_setCurrent        (VisuUiGlWidget *render,
                                                             gboolean force);

    Make this object current. This means that all future OpenGL primitive will be rendered on this surface. If force is TRUE, the GL routine is actually called whereas in other cases, if render believe being already current, nothing is done.

    render :

    a VisuUiGlWidget object ;

    force :

    a boolean.

    Returns :

    TRUE if succeed.

    visu_ui_gl_widget_setRedraw ()

    void                visu_ui_gl_widget_setRedraw         (VisuUiGlWidget *render,
                                                             VisuUiGlWidgetRedrawMethod method,
                                                             VisuGlView *view);

    This method is used to defined a redraw method for the OpenGL area. By doing this the area will automatically redraw itself when necessary. Before doing it it calls visu_ui_gl_widget_setCurrent(), and after it calls visu_ui_gl_widget_swapBuffers().

    render :

    a VisuUiGlWidget object ;

    method :

    a redraw method ;. [scope call]

    view :

    the VisuGlView object.

    visu_ui_gl_widget_swapBuffers ()

    void                visu_ui_gl_widget_swapBuffers       (VisuUiGlWidget *render);

    Swap the buffers of the OpenGL area.

    render :

    a VisuUiGlWidget object.
    v_sim-3.7.0/Documentation/reference/html/v-sim-gtk-orientationChooser.html0000644000353400050620000006334212216331356023666 00000000000000 gtk_orientationChooser

    gtk_orientationChooser

    gtk_orientationChooser — Defines a dialog widget to choose the camera position.

    Object Hierarchy

      GObject
       +----GInitiallyUnowned
             +----GtkWidget
                   +----GtkContainer
                         +----GtkBin
                               +----GtkWindow
                                     +----GtkDialog
                                           +----VisuUiOrientationChooser
    

    Implemented Interfaces

    VisuUiOrientationChooser implements AtkImplementorIface and GtkBuildable.

    Signals

      "values-changed"                                 : Action
    

    Description

    This widget is a GtkDialog window that can be used to choose an orientation for the camera, using either the cartesian coordinates, the box coordinates or the spherical coordinates.

    Details

    VisuUiOrientationChooser

    typedef struct _VisuUiOrientationChooser VisuUiOrientationChooser;

    Short form for a VisuUiOrientationChooser_struct structure.


    VisuUiOrientationChooserClass

    typedef struct _VisuUiOrientationChooserClass VisuUiOrientationChooserClass;

    Opaque structure.


    enum VisuUiOrientationChooserKind

    typedef enum {
        VISU_UI_ORIENTATION_DIRECTION,
        VISU_UI_ORIENTATION_NORMAL
    } VisuUiOrientationChooserKind;
    

    These values are used when creating an VisuUiOrientationChooser, to specify the behavior of the box coordinates. This is due to the fact that the box coordinates are not always orthoggonal.

    VISU_UI_ORIENTATION_DIRECTION

    this flag specifies that the box coordinates are used to identity a direction ;

    VISU_UI_ORIENTATION_NORMAL

    this flag specifies that the box coordinates are used to identify a normal direction.

    visu_ui_orientation_chooser_getAnglesValues ()

    void                visu_ui_orientation_chooser_getAnglesValues
                                                            (VisuUiOrientationChooser *orientation,
                                                             float values[2]);

    Get the current orientation in the spherical basis set.

    orientation :

    a VisuUiOrientationChooser widget ;

    values :

    a location for two floating point values. [array fixed-size=2][out]

    visu_ui_orientation_chooser_getBoxValues ()

    void                visu_ui_orientation_chooser_getBoxValues
                                                            (VisuUiOrientationChooser *orientation,
                                                             float values[3]);

    Get the current orientation in the box basis set.

    orientation :

    a VisuUiOrientationChooser widget ;

    values :

    a location for three floating point values. [array fixed-size=3][out]

    visu_ui_orientation_chooser_getOrthoValues ()

    void                visu_ui_orientation_chooser_getOrthoValues
                                                            (VisuUiOrientationChooser *orientation,
                                                             float values[3]);

    Get the current orientation in the orthogonal basis set.

    orientation :

    a VisuUiOrientationChooser widget ;

    values :

    a location for three floating point values. [array fixed-size=3][out]

    visu_ui_orientation_chooser_new ()

    GtkWidget *         visu_ui_orientation_chooser_new     (VisuUiOrientationChooserKind kind,
                                                             gboolean liveUpdate,
                                                             VisuData *data,
                                                             GtkWindow *parent);

    Create a dialog box with three choices to choose a direction in space: the classical orthogonal basis set, the spherical one or the basis set linked to the box. If the data argument is NULL, this last possibility is made unsensitive. If the kind is set to VISU_UI_ORIENTATION_DIRECTION, the orthogonal coordinates correspond exactly to the box coordinates (after transformation) ; whereas kind is VISU_UI_ORIENTATION_NORMAL, the cartesian coordinates are those which give the right normal plane to the direction given in the box coordinates.

    kind :

    to set the box coordinates behavior ;

    liveUpdate :

    raise "values-changed" when a value is changed ;

    data :

    the associated VisuData to get the box definition (can be NULL);. [allow-none]

    parent :

    give the parent window to set the modal status and the position. [allow-none]

    Returns :

    a newly created object. [transfer full]

    visu_ui_orientation_chooser_setAnglesValues ()

    void                visu_ui_orientation_chooser_setAnglesValues
                                                            (VisuUiOrientationChooser *orientation,
                                                             float values[2]);

    Change the direction using the one given in a spherical basis set. Update all other values accordingly.

    orientation :

    a VisuUiOrientationChooser widget ;

    values :

    two floating point values. [array fixed-size=2]

    visu_ui_orientation_chooser_setBoxValues ()

    void                visu_ui_orientation_chooser_setBoxValues
                                                            (VisuUiOrientationChooser *orientation,
                                                             float values[3]);

    Change the direction using the one given in the box basis set. Update all other values accordingly.

    orientation :

    a VisuUiOrientationChooser widget ;

    values :

    three floating point values. [array fixed-size=3]

    visu_ui_orientation_chooser_setOrthoValues ()

    void                visu_ui_orientation_chooser_setOrthoValues
                                                            (VisuUiOrientationChooser *orientation,
                                                             float values[3]);

    Change the direction using the one given in an orthogonal basis set. Update all other values accordingly.

    orientation :

    a VisuUiOrientationChooser widget ;

    values :

    three floating point values. [array fixed-size=3]

    Signal Details

    The "values-changed" signal

    void                user_function                      (VisuUiOrientationChooser *chooser,
                                                            gpointer                  user_data)      : Action

    This signal is emitted when the values are changed and when the live update checkbox is active.

    chooser :

    the VisuUiOrientationChooser that emits the signal.

    user_data :

    user data set when the signal handler was connected.

    Since 3.4

    v_sim-3.7.0/Documentation/reference/html/v-sim-gtk-pairs.html0000644000353400050620000006016612216331356021127 00000000000000 gtk_pairs

    gtk_pairs

    gtk_pairs — The pairs dialog.

    Description

    The pair dialog provides a list of pairs as min/max distances between species to draw pairs. A set of two species can have several pairs drawn.

    This dialog also hosts widgets that depend on the pair method that is used for a given link.

    Finally, it has also a second tab where a graph of g(r) can be drawn.

    Details

    VisuUiPairsBuildWidgetsFunc ()

    GtkWidget *         (*VisuUiPairsBuildWidgetsFunc)      ();

    Prototype of functions that create a container GtkWidgets will all element needed to change characteristic of a model.

    Returns :

    a newly allocated GtkWidget.

    VisuUiPairsInitFunc ()

    void                (*VisuUiPairsInitFunc)              (void);

    Prototype of functions called once on V_Sim start-up.


    struct VisuUiPairsIter

    struct VisuUiPairsIter {
      VisuElement *ele1;
      VisuElement *ele2;
      VisuPairLink *data;
      GtkTreeIter iter;
    
      /* Private data. */
      GList *selected;
      GList *current;
    };
    

    An iterator on pairs.

    VisuElement *ele1;

    the VisuElement on one side ;

    VisuElement *ele2;

    the VisuElement on the other side ;

    VisuPairLink *data;

    the VisuPairLink information on the link between ele1 and ele2 ;

    GtkTreeIter iter;

    the GtkTreeIter corresponding to this link ;

    GList *selected;

    a private attribute ;

    GList *current;

    an other private attribute.

    VisuUiPairsSetValuesFunc ()

    void                (*VisuUiPairsSetValuesFunc)         (VisuPairLink *data);

    Prototype of functions used to update the widgets with given pair data.

    data :

    informations about a pair.

    VisuUiPairsToLabelFunc ()

    gchar *             (*VisuUiPairsToLabelFunc)           (VisuPairLink *data);

    Create a string, internationalised and in UTF-8, that describes the given pair data. This string is used in a column tree view to summarize the pair description.

    data :

    information about a pair.

    Returns :

    a newly created string.

    visu_ui_pairs_init ()

    void                visu_ui_pairs_init                  ();

    Initialise the default values for the pair dialog. It does not build the interface, use visu_ui_pairs_initBuild() to do it.


    visu_ui_pairs_initBuild ()

    void                visu_ui_pairs_initBuild             (VisuUiMain *main);

    Create the dialog window for pairs.

    main :

    the command panel the about dialog is associated to.

    visu_ui_pairs_iter_empty ()

    void                visu_ui_pairs_iter_empty            (VisuUiPairsIter *iter);

    Free internals of the iterator. This routine is automatically called by visu_ui_pairs_iter_nextSelected() when arriving at the end of selection.

    iter :

    an iterator.

    Since 3.7


    visu_ui_pairs_iter_nextSelected ()

    void                visu_ui_pairs_iter_nextSelected     (VisuUiPairsIter *iter);

    Go to the next selected pair or set iter->data to NULL if none.

    iter :

    an iterator.

    visu_ui_pairs_iter_startSelected ()

    void                visu_ui_pairs_iter_startSelected    (VisuUiPairsIter *iter);

    Initialise the given iterator iter on the first selected pair or set iter->data to NULL if none. If iter->data is not NULL, visu_ui_pairs_iter_nextSelected() must be called until iter->data is NULL to be sure that iter->selected list is freed.

    iter :

    an iterator. [out caller-allocates]

    visu_ui_pairs_newIter ()

    void                visu_ui_pairs_newIter               (VisuUiPairsIter *iter);

    This method is used by bindings to initialise a new VisuUiPairsIter object.

    iter :

    an iterator. [out caller-allocates]

    Since 3.7


    visu_ui_pairs_select ()

    gboolean            visu_ui_pairs_select                (const VisuPairLink *data);

    Select in the UI the given data.

    data :

    a VisuPairLink object.

    Returns :

    TRUE if the data pair is indeed selected.

    Since 3.7


    visu_ui_pairs_setSpecificLabels ()

    void                visu_ui_pairs_setSpecificLabels     (GtkTreeIter *iter,
                                                             const gchar *label);

    Change the specific label shown in the treeview of pairs for the given iter. An iter in this treeview can be retrieve using the _VisuUiPairsIter objects.

    iter :

    the GtkTreeIter to set the label ;

    label :

    the value of the label to be set.

    visu_ui_pairs_show ()

    void                visu_ui_pairs_show                  (VisuUiMain *main);

    Shows the pairs dialog and run possible update of the interface.

    main :

    the container for pairs dialog.

    Since 3.6


    visu_ui_pairs_update ()

    void                visu_ui_pairs_update                (VisuUiMain *main,
                                                             VisuData *dataObj,
                                                             gboolean force);

    Update the list of pairs. This routine must be called only after visu_ui_pairs_initBuild() has been called. The job is done only if the window is visible or if the force argument is used.

    main :

    the command panel the about dialog is associated to ;

    dataObj :

    the VisuData the pairs are related to (can be NULL, if none is loaded) ;

    force :

    build the pairs even if the window is hidden.
    v_sim-3.7.0/Documentation/reference/html/v-sim-gtk-pick.html0000644000353400050620000003735312216331356020741 00000000000000 gtk_pick

    gtk_pick

    gtk_pick — The pick and measurement tab in the interactive dialog.

    Description

    This action tab provides widgets to display information about selected atoms, like distances or angles. In addition, measured distances and angles are kept in a list when new files are loaded.

    With the list of selected nodes, one can modify properties associated to nodes like their coordinates, the value of colourisation if any, the forces on them, if any... One can also decide to display information directly on nodes.

    Details

    visu_ui_interactive_pick_exportXMLFile ()

    gboolean            visu_ui_interactive_pick_exportXMLFile
                                                            (const gchar *filename,
                                                             GError **error);

    Export to filename the list of currently picked nodes.

    filename :

    a filename to export to.

    error :

    a location to store an error. [allow-none]

    Returns :

    TRUE if everything goes right.

    Since 3.7


    visu_ui_interactive_pick_getNodeSelection ()

    GList *             visu_ui_interactive_pick_getNodeSelection
                                                            ();

    Compute a list of VisuNode currently listed.

    Returns :

    a newly created list. Should be freed with g_list_free() after use. [transfer container][element-type guint]

    visu_ui_interactive_pick_init ()

    void                visu_ui_interactive_pick_init       ();

    Internal routine to setup the pick action of the interactive dialog.

    Since 3.6


    visu_ui_interactive_pick_initBuild ()

    GtkWidget *         visu_ui_interactive_pick_initBuild  (VisuUiMain *main,
                                                             gchar **label,
                                                             gchar **help,
                                                             GtkWidget **radio);

    This routine should be called in conjonction to the visu_ui_interactive_move_initBuild() one. It completes the creation of widgets (and also initialisation of values) for the pick tab.

    main :

    the main interface.

    label :

    a location to store the name of the pick tab ;

    help :

    a location to store the help message to be shown at the bottom of the window ;

    radio :

    a location on the radio button that will be toggled when the pick action is used.

    visu_ui_interactive_pick_parseXMLFile ()

    gboolean            visu_ui_interactive_pick_parseXMLFile
                                                            (const gchar *filename,
                                                             VisuData *data,
                                                             GError **error);

    Parse the given V_Sim value file and update the dialog accordingly.

    filename :

    a filename ;

    data :

    a VisuData object to take the pick information from ;

    error :

    a location to store possible errors.

    Returns :

    TRUE if no error.

    visu_ui_interactive_pick_start ()

    void                visu_ui_interactive_pick_start      (VisuUiRenderingWindow *window);

    Initialise a pick session.

    window :

    a VisuUiRenderingWindow object.

    visu_ui_interactive_pick_stop ()

    void                visu_ui_interactive_pick_stop       (VisuUiRenderingWindow *window);

    Finalise a pick session.

    window :

    a VisuUiRenderingWindow object.
    v_sim-3.7.0/Documentation/reference/html/v-sim-gtk-renderingWindowWidget.html0000644000353400050620000020000012216331356024301 00000000000000 gtk_renderingWindowWidget

    gtk_renderingWindowWidget

    gtk_renderingWindowWidget — Defines a complex widget used to render files and print information.

    Synopsis

                        VisuUiRenderingWindow;
                        VisuUiRenderingWindowClass;
    gboolean            visu_ui_rendering_window_class_getAutoAdjust
                                                            ();
    gboolean            visu_ui_rendering_window_class_getDisplayCoordinatesInReduce
                                                            ();
    VisuInteractive *   visu_ui_rendering_window_class_getInteractive
                                                            ();
    gboolean            visu_ui_rendering_window_class_setAutoAdjust
                                                            (gboolean status);
    gboolean            visu_ui_rendering_window_class_setDisplayCoordinatesInReduce
                                                            (gboolean status);
    gboolean            visu_ui_rendering_window_dump       (VisuUiRenderingWindow *window,
                                                             VisuDump *format,
                                                             const char *fileName,
                                                             gint width,
                                                             gint height,
                                                             ToolVoidDataFunc functionWait,
                                                             gpointer data,
                                                             GError **error);
    GtkAccelGroup *     visu_ui_rendering_window_getAccelGroup
                                                            (VisuUiRenderingWindow *window);
    VisuData *          visu_ui_rendering_window_getData    (VisuUiRenderingWindow *window);
    VisuGlView *        visu_ui_rendering_window_getGlView  (VisuUiRenderingWindow *window);
    VisuGlExtMarks *    visu_ui_rendering_window_getMarks   (VisuUiRenderingWindow *window);
    void                visu_ui_rendering_window_loadFile   (VisuUiRenderingWindow *window,
                                                             VisuData *data,
                                                             guint iSet);
    GtkWidget *         visu_ui_rendering_window_new        (int width,
                                                             int height,
                                                             gboolean withFrame,
                                                             gboolean withToolBar);
    void                visu_ui_rendering_window_open       (VisuUiRenderingWindow *window,
                                                             GtkWindow *parent);
    void                visu_ui_rendering_window_popInteractive
                                                            (VisuUiRenderingWindow *window,
                                                             VisuInteractive *inter);
    void                visu_ui_rendering_window_popMessage (VisuUiRenderingWindow *window);
    void                visu_ui_rendering_window_pushInteractive
                                                            (VisuUiRenderingWindow *window,
                                                             VisuInteractive *inter);
    void                visu_ui_rendering_window_pushMessage
                                                            (VisuUiRenderingWindow *window,
                                                             const gchar *message);
    void                visu_ui_rendering_window_reload     (VisuUiRenderingWindow *window);
    void                visu_ui_rendering_window_setCurrent (VisuUiRenderingWindow *window,
                                                             gboolean force);
    void                visu_ui_rendering_window_setData    (VisuUiRenderingWindow *window,
                                                             VisuData *data);
    

    Object Hierarchy

      GObject
       +----GInitiallyUnowned
             +----GtkWidget
                   +----GtkContainer
                         +----GtkBox
                               +----GtkVBox
                                     +----VisuUiRenderingWindow
    

    Implemented Interfaces

    VisuUiRenderingWindow implements AtkImplementorIface, GtkBuildable and GtkOrientable.

    Description

    This is a complex widget, inheriting from GtkWindow, with a rendering area and a status bar area. A VisuData is always attached to this widget, see visu_ui_rendering_window_setData(). If not the V_Sim logo is displayed.

    The rendering area can receive keyboard or mouse events, see visu_ui_rendering_window_class_getInteractive.

    The status bar area has different buttons to load or export a file. It also display some usefull information like the number of rendered nodes. It has also a real status bar location displaying tips about current available actions. One can add news using visu_ui_rendering_window_pushMessage().

    Details

    VisuUiRenderingWindow

    typedef struct _VisuUiRenderingWindow VisuUiRenderingWindow;

    Short form for a VisuUiRenderingWindow_struct structure.


    VisuUiRenderingWindowClass

    typedef struct _VisuUiRenderingWindowClass VisuUiRenderingWindowClass;

    Opaque structure.


    visu_ui_rendering_window_class_getAutoAdjust ()

    gboolean            visu_ui_rendering_window_class_getAutoAdjust
                                                            ();

    The camera can be set to auto adjust its zoom capability for the data to be full size at zoom level 1.

    Returns :

    TRUE if the camera auto adjust on data loading.

    Since 3.6


    visu_ui_rendering_window_class_getDisplayCoordinatesInReduce ()

    gboolean            visu_ui_rendering_window_class_getDisplayCoordinatesInReduce
                                                            ();

    Picked nodes have their coordinates displayed in the status bar of the rendering window. This methods retrieves if they are printed in reduced values or not.

    Returns :

    TRUE if the coordinates are displayed in reduced values.

    Since 3.6


    visu_ui_rendering_window_class_getInteractive ()

    VisuInteractive *   visu_ui_rendering_window_class_getInteractive
                                                            ();

    The user actions on the rendering area are handled by a VisuInteractive object.

    Returns :

    the VisuInteractive object used by the rendering window of V_Sim. This object is owned by V_Sim. [transfer none]

    Since 3.6


    visu_ui_rendering_window_class_setAutoAdjust ()

    gboolean            visu_ui_rendering_window_class_setAutoAdjust
                                                            (gboolean status);

    If set, the camera auto adjust its zoom capability for the data to be full size at zoom level 1.

    status :

    a boolean.

    Returns :

    TRUE if the value has been changed.

    Since 3.6


    visu_ui_rendering_window_class_setDisplayCoordinatesInReduce ()

    gboolean            visu_ui_rendering_window_class_setDisplayCoordinatesInReduce
                                                            (gboolean status);

    If set, the coordinates of picked nodes are displayed in reduced values.

    status :

    a boolean.

    Returns :

    TRUE if the value has been changed.

    Since 3.6


    visu_ui_rendering_window_dump ()

    gboolean            visu_ui_rendering_window_dump       (VisuUiRenderingWindow *window,
                                                             VisuDump *format,
                                                             const char *fileName,
                                                             gint width,
                                                             gint height,
                                                             ToolVoidDataFunc functionWait,
                                                             gpointer data,
                                                             GError **error);

    Call this method to dump the given window to a file.

    window :

    a valid VisuUiRenderingWindow object ;

    format :

    a VisuDump object, corresponding to the write method ;

    fileName :

    a string that defined the file to write to ;. [type filename]

    width :

    an integer ;

    height :

    an integer ;

    functionWait :

    a method to call periodically during the dump ;. [allow-none][closure data][scope call]

    data :

    some pointer on object to be passed to the wait function. [closure]

    error :

    a location to store some error (not NULL) ;

    Returns :

    TRUE if everything went right.

    visu_ui_rendering_window_getAccelGroup ()

    GtkAccelGroup *     visu_ui_rendering_window_getAccelGroup
                                                            (VisuUiRenderingWindow *window);

    Retrieve the accelerator group of window.

    window :

    a VisuUiRenderingWindow object.

    Returns :

    the GtkAccelGroup object of window. [transfer none]

    Since 3.7


    visu_ui_rendering_window_getData ()

    VisuData *          visu_ui_rendering_window_getData    (VisuUiRenderingWindow *window);

    This method is used to get the VisuData attached to a window.

    window :

    a valid VisuUiRenderingWindow object.

    Returns :

    the VisuData attached to the window or NULL if none. [transfer none]

    visu_ui_rendering_window_getGlView ()

    VisuGlView *        visu_ui_rendering_window_getGlView  (VisuUiRenderingWindow *window);

    This method is used to get the VisuGlView attached to the rendering window.

    window :

    a valid VisuUiRenderingWindow object.

    Returns :

    the VisuGlView attached to the window or NULL on error. [transfer none]

    Since 3.7


    visu_ui_rendering_window_getMarks ()

    VisuGlExtMarks *    visu_ui_rendering_window_getMarks   (VisuUiRenderingWindow *window);

    Get the VisuGlExtMarks of the given window.

    window :

    a VisuUiRenderingWindow object ;

    Returns :

    a VisuGlExtMarks object owned by V_Sim. [transfer none]

    Since 3.6


    visu_ui_rendering_window_loadFile ()

    void                visu_ui_rendering_window_loadFile   (VisuUiRenderingWindow *window,
                                                             VisuData *data,
                                                             guint iSet);

    This method calls the general function to load data from file and deals with errors with gtkDialogs. The filenames must have already been set into data using visu_data_addFile().

    window :

    a valid VisuUiRenderingWindow object.

    data :

    the VisuData to be loaded.

    iSet :

    the id of data to load.

    visu_ui_rendering_window_new ()

    GtkWidget *         visu_ui_rendering_window_new        (int width,
                                                             int height,
                                                             gboolean withFrame,
                                                             gboolean withToolBar);

    A VisuUiRenderingWindow widget is a GtkWindow that have an area for OpenGL drawing and a statusBar with many stuff like action buttons, real status bar for notifications, ... The rendering area can be drawn with a frame or not. With this routine, only the VisuUiRenderingWindow widget is created.

    width :

    its desired width ;

    height :

    its desired height ;

    withFrame :

    a boolean ;

    withToolBar :

    a boolean.

    Returns :

    a newly created VisuUiRenderingWindow widget.

    visu_ui_rendering_window_open ()

    void                visu_ui_rendering_window_open       (VisuUiRenderingWindow *window,
                                                             GtkWindow *parent);

    Do as if the load button has been pushed, i.e. open a filechooser dialog on the parent window, and load the resulting file, refreshing the view if necessary.

    window :

    the window the file will by rendered on ;

    parent :

    the parent window for the filechooser dialog. [allow-none]

    visu_ui_rendering_window_popInteractive ()

    void                visu_ui_rendering_window_popInteractive
                                                            (VisuUiRenderingWindow *window,
                                                             VisuInteractive *inter);

    It removes inter from the stack of interactive sessions currently attached to window. If inter was first on the stack, the next session is launched.

    window :

    a VisuUiRenderingWindow object.

    inter :

    a VisuInteractive object.

    Since 3.6


    visu_ui_rendering_window_popMessage ()

    void                visu_ui_rendering_window_popMessage (VisuUiRenderingWindow *window);

    Remove the last message.

    window :

    a valid VisuUiRenderingWindow object.

    visu_ui_rendering_window_pushInteractive ()

    void                visu_ui_rendering_window_pushInteractive
                                                            (VisuUiRenderingWindow *window,
                                                             VisuInteractive *inter);

    It adds inter to the stack of interactive sessions currently attached to window and launch it.

    window :

    a VisuUiRenderingWindow object.

    inter :

    a VisuInteractive object.

    Since 3.6


    visu_ui_rendering_window_pushMessage ()

    void                visu_ui_rendering_window_pushMessage
                                                            (VisuUiRenderingWindow *window,
                                                             const gchar *message);

    Use this method to add some informations on the status bar.

    window :

    a valid VisuUiRenderingWindow object ;

    message :

    an UTF8 string to print on the status bar.

    visu_ui_rendering_window_reload ()

    void                visu_ui_rendering_window_reload     (VisuUiRenderingWindow *window);

    This routines reloads the current VisuData object by rereading it on disk. If there is no current VisuData object, it reports an error.

    window :

    a VisuUiRenderingWindow object.

    Since 3.7


    visu_ui_rendering_window_setCurrent ()

    void                visu_ui_rendering_window_setCurrent (VisuUiRenderingWindow *window,
                                                             gboolean force);

    Set the OpenGL area as the current rendering area. If force is TRUE then the context is switched whatever buffered value.

    window :

    a valid VisuUiRenderingWindow object ;

    force :

    a boolean.

    Since 3.5


    visu_ui_rendering_window_setData ()

    void                visu_ui_rendering_window_setData    (VisuUiRenderingWindow *window,
                                                             VisuData *data);

    This method is used to attach a VisuData object to a given window. When, data is not NULL, this method emit the "dataRendered" signal, and all modules that needs to draw something should catch this signal and draw in the rendering window.

    window :

    a valid VisuUiRenderingWindow object ;

    data :

    a VisuData to render in the given window. [allow-none]

    Signal Details

    The "export" signal

    void                user_function                      (VisuUiRenderingWindow *window,
                                                            gpointer               user_data)      : Action

    Signal emitted when the user ask for data export.

    window :

    the object emitting the signal.

    user_data :

    user data set when the signal handler was connected.

    Since 3.6


    The "load-next-file" signal

    void                user_function                      (VisuUiRenderingWindow *window,
                                                            gpointer               user_data)      : No Hooks

    Signal emitted when the user ask to load next file of a given list.

    window :

    the object emitting the signal.

    user_data :

    user data set when the signal handler was connected.

    Since 3.7


    The "load-prev-file" signal

    void                user_function                      (VisuUiRenderingWindow *window,
                                                            gpointer               user_data)      : No Hooks

    Signal emitted when the user ask to load previous file of a given list.

    window :

    the object emitting the signal.

    user_data :

    user data set when the signal handler was connected.

    Since 3.7


    The "open" signal

    void                user_function                      (VisuUiRenderingWindow *window,
                                                            gpointer               user_data)      : Action

    Signal emitted when the user ask to open new data.

    window :

    the object emitting the signal.

    user_data :

    user data set when the signal handler was connected.

    Since 3.6


    The "reload" signal

    void                user_function                      (VisuUiRenderingWindow *window,
                                                            gpointer               user_data)      : Action

    Signal emitted when the user ask to reload current data.

    window :

    the object emitting the signal.

    user_data :

    user data set when the signal handler was connected.

    Since 3.6


    The "search" signal

    void                user_function                      (VisuUiRenderingWindow *window,
                                                            gpointer               user_data)      : Action

    Signal emitted when the user ask to search info in current data.

    window :

    the object emitting the signal.

    user_data :

    user data set when the signal handler was connected.

    Since 3.7


    The "show-action-dialog" signal

    void                user_function                      (VisuUiRenderingWindow *window,
                                                            gpointer               user_data)      : No Hooks

    Signal emitted when the user ask to show the action dialog.

    window :

    the object emitting the signal.

    user_data :

    user data set when the signal handler was connected.

    Since 3.6


    The "show-main-panel" signal

    void                user_function                      (VisuUiRenderingWindow *window,
                                                            gpointer               user_data)      : No Hooks

    Signal emitted when the user ask to raise the main panel.

    window :

    the object emitting the signal.

    user_data :

    user data set when the signal handler was connected.

    Since 3.6


    The "show-orientation-chooser" signal

    void                user_function                      (VisuUiRenderingWindow *window,
                                                            gpointer               user_data)      : Action

    Signal emitted when the user ask to precisely select a camera angle.

    window :

    the object emitting the signal.

    user_data :

    user data set when the signal handler was connected.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/v-sim-gtk-save.html0000644000353400050620000000565212216331356020746 00000000000000 gtk_save

    gtk_save

    gtk_save — The load/save dialog for resources and parameters.

    Synopsis

    void                visu_ui_save_initBuild              ();
    

    Description

    The save dialog proposes to load or save resources, both parameters or resources.

    Details

    visu_ui_save_initBuild ()

    void                visu_ui_save_initBuild              ();

    Create the save window, conect the signals and run it as a modal dialog.

    v_sim-3.7.0/Documentation/reference/html/v-sim-gtk-shadeComboBoxWidget.html0000644000353400050620000005174212216331356023672 00000000000000 gtk_shadeComboBoxWidget

    gtk_shadeComboBoxWidget

    gtk_shadeComboBoxWidget — Defines a specialised GtkComboBox to choose pre-built shades.

    Object Hierarchy

      GObject
       +----GInitiallyUnowned
             +----GtkWidget
                   +----GtkContainer
                         +----GtkBin
                               +----GtkComboBox
                                     +----VisuUiShadeCombobox
    

    Implemented Interfaces

    VisuUiShadeCombobox implements AtkImplementorIface, GtkBuildable, GtkCellLayout and GtkCellEditable.

    Signals

      "shade-selected"                                 : Action
    

    Description

    This widget looks like a GtkComboBox and it displays a list of preset colour shades. These patterns are defined by colour parameters, see ToolShade.

    This widget can emit a "shade-selected" signal that is a wrapper around the "changed" signal, but it is emitted only when a new shade is selected and this shade is passed to the callback.

    Details

    VisuUiShadeCombobox

    typedef struct _VisuUiShadeCombobox VisuUiShadeCombobox;

    Private structure to store informations of a VisuUiShadeCombobox object.

    Since 3.3


    VisuUiShadeComboboxClass

    typedef struct _VisuUiShadeComboboxClass VisuUiShadeComboboxClass;

    Private structure to store informations of a VisuUiShadeComboboxClass object.

    Since 3.3


    visu_ui_shade_combobox_buildStamp ()

    GdkPixbuf *         visu_ui_shade_combobox_buildStamp   (ToolShade *shade,
                                                             GdkPixbuf *pixbuf);

    This method is used to create pixbuf representing shades. If pixbuf is given, it must be a valid pixbuf, and the shade is created in it. Otherwise, a new pixbuf is created.

    shade :

    a ToolShade object ;

    pixbuf :

    an existing pixbuf (can be NULL). [inout][allow-none]

    Returns :

    a pixbuf pointer. [transfer full]

    Since 3.3


    visu_ui_shade_combobox_getSelection ()

    ToolShade *         visu_ui_shade_combobox_getSelection (VisuUiShadeCombobox *shadeComboBox);

    The user can access to the selected ToolShade object using this method.

    shadeComboBox :

    a VisuUiShadeCombobox widget.

    Returns :

    a pointer to the selected ToolShade object (or NULL). This object is read-only. [transfer none]

    Since 3.3


    visu_ui_shade_combobox_getStamp ()

    GdkPixbuf *         visu_ui_shade_combobox_getStamp     (VisuUiShadeCombobox *shadeComboBox,
                                                             ToolShade *shade);

    The shadeComboBox has little pixbufs to represent the shade. User methods can use these pixbufs but should considered them read-only.

    shadeComboBox :

    a VisuUiShadeCombobox widget ;

    shade :

    a ToolShade object.

    Returns :

    a pixbuf pointer corresponding to the little image shown on the shadeComboBox. [transfer none]

    Since 3.3


    visu_ui_shade_combobox_new ()

    GtkWidget *         visu_ui_shade_combobox_new          (gboolean hasAlphaChannel,
                                                             gboolean showNames);

    A VisuUiShadeCombobox widget is like a GtkComboBox widget, but it is already filled with the known shades. Using this widget is a convienient way to share shades between all part of V_Sim and to give a consistent look of all shade selection. If the argument hasAlphaChannel is FALSE, the widget display all shades but without their alpha channel, assuming it to be fully opaque.

    hasAlphaChannel :

    a boolean.

    showNames :

    if TRUE, the names of the shades are displayed.

    Returns :

    a newly created VisuUiShadeCombobox widget. [transfer full]

    Since 3.3


    visu_ui_shade_combobox_setSelectionByShade ()

    gboolean            visu_ui_shade_combobox_setSelectionByShade
                                                            (VisuUiShadeCombobox *shadeComboBox,
                                                             ToolShade *shade);

    Use this method to set the ComboBox on the given shade. This emits a 'shade-channel' signal if the shade is changed, which means, a previous shade has been modified, or a new shade is selected.

    shadeComboBox :

    a VisuUiShadeCombobox widget ;

    shade :

    a ToolShade object.

    Returns :

    TRUE if the shade already exists in the model.

    Since 3.3

    Signal Details

    The "shade-selected" signal

    void                user_function                      (VisuUiShadeCombobox *combo,
                                                            gpointer             shade,
                                                            gpointer             user_data)      : Action

    This signal is emitted when a new valid colour shade is selected.

    combo :

    the VisuUiShadeCombobox that emits the signal ;

    shade :

    the newly selected ToolShade.

    user_data :

    user data set when the signal handler was connected.

    Since 3.3

    v_sim-3.7.0/Documentation/reference/html/v-sim-gtkSpin.html0000644000353400050620000001140012216331356020630 00000000000000 gtkSpin

    gtkSpin

    gtkSpin — The gtk interface elements that can interfere with renderingSpin parameters.

    Description

    This is the gtk interface for all VisuRenderingSpin module parameters. They are split in two parts. The first part is placed under the config tab and allows the user to modify the "global properties" of the renderingSpin module such as cone's axe orientation, and color repartition. The second part is under the element panel and allows to modify each element resource. Size of the arrows, and their shape can be modified.

    Details

    visu_ui_panel_elements_spin_init ()

    void                visu_ui_panel_elements_spin_init    ();

    Initialise the specific area in the element panel for the atomic rendering method.


    visu_ui_panel_elements_spin_initMethod ()

    void                visu_ui_panel_elements_spin_initMethod
                                                            ();

    Initialise the specific area in the config panel for the spin rendering method.


    visu_ui_panel_elements_spin_initOpen ()

    void                visu_ui_panel_elements_spin_initOpen
                                                            ();

    Initialise the gtk methods associated with the spin rendering method.

    v_sim-3.7.0/Documentation/reference/html/v-sim-gtk-stippleComboBoxWidget.html0000644000353400050620000004754512216331356024274 00000000000000 gtk_stippleComboBoxWidget

    gtk_stippleComboBoxWidget

    gtk_stippleComboBoxWidget — Defines a specialised GtkComboBox to choose patterns for lines.

    Object Hierarchy

      GObject
       +----GInitiallyUnowned
             +----GtkWidget
                   +----GtkContainer
                         +----GtkBin
                               +----GtkComboBox
                                     +----VisuUiStippleCombobox
    

    Implemented Interfaces

    VisuUiStippleCombobox implements AtkImplementorIface, GtkBuildable, GtkCellLayout and GtkCellEditable.

    Signals

      "stipple-selected"                               : Action
    

    Description

    This widget looks like a GtkComboBox and it displays a list of preset patterns for line. These patterns are defined by a guint16 value that is given to OpenGL for line stipple.

    This widget can emit a "stipple-selected" signal that is a wrapper around the "changed" signal, but it is emitted only when a stipple is selected and this stipple is passed to the call back.

    Details

    VisuUiStippleCombobox

    typedef struct _VisuUiStippleCombobox VisuUiStippleCombobox;

    Private structure to store informations of a VisuUiStippleCombobox object.

    Since 3.4


    VisuUiStippleComboboxClass

    typedef struct _VisuUiStippleComboboxClass VisuUiStippleComboboxClass;

    Private structure to store informations of a VisuUiStippleComboboxClass object.

    Since 3.4


    visu_ui_stipple_combobox_add ()

    void                visu_ui_stipple_combobox_add        (VisuUiStippleCombobox *stippleComboBox,
                                                             guint16 stipple);

    Create an entry in the ComboBox for the given stipple pattern if it does not already exist.

    stippleComboBox :

    a VisuUiStippleCombobox widget ;

    stipple :

    a pattern value.

    Since 3.4


    visu_ui_stipple_combobox_class_buildStamp ()

    GdkPixbuf *         visu_ui_stipple_combobox_class_buildStamp
                                                            (guint16 stipple);

    This method is used to create pixbuf representing stipples.A new pixbuf is created.

    stipple :

    a pattern value.

    Returns :

    a pixbuf pointer. [transfer full]

    Since 3.4


    visu_ui_stipple_combobox_getSelection ()

    guint16             visu_ui_stipple_combobox_getSelection
                                                            (VisuUiStippleCombobox *stippleComboBox);

    The user can access to the selected stipple pattern using this method.

    stippleComboBox :

    a VisuUiStippleCombobox widget.

    Returns :

    a pattern value (or 65535).

    Since 3.4


    visu_ui_stipple_combobox_getStamp ()

    GdkPixbuf *         visu_ui_stipple_combobox_getStamp   (VisuUiStippleCombobox *stippleComboBox,
                                                             guint16 stipple);

    The stippleComboBox has little pixbufs to represent the stipple. User methods can use these pixbufs but should considered them read-only.

    stippleComboBox :

    a VisuUiStippleCombobox widget ;

    stipple :

    a pattern value.

    Returns :

    a pixbuf pointer corresponding to the little image shown on the stippleComboBox. [transfer none]

    Since 3.4


    visu_ui_stipple_combobox_new ()

    GtkWidget *         visu_ui_stipple_combobox_new        ();

    A VisuUiStippleCombobox widget is like a GtkComboBox widget, but it is already filled with predefined line patterns (call stipple). Using this widget is a convienient way to share stipples between all part of V_Sim and to give a consistent look of all stipple selection.

    Returns :

    a newly created VisuUiStippleCombobox widget. [transfer full]

    Since 3.4


    visu_ui_stipple_combobox_setSelection ()

    gboolean            visu_ui_stipple_combobox_setSelection
                                                            (VisuUiStippleCombobox *stippleComboBox,
                                                             guint16 stipple);

    Use this method to set the ComboBox on the given stipple. This emits a 'stipple-channel' signal if the stipple is changed, which means, a previous stipple has been modified, or a new stipple is selected.

    stippleComboBox :

    a VisuUiStippleCombobox widget ;

    stipple :

    a pattern value.

    Returns :

    TRUE if the stipple already exists in the model.

    Since 3.4

    Signal Details

    The "stipple-selected" signal

    void                user_function                      (VisuUiStippleCombobox *combo,
                                                            guint                  stipple,
                                                            gpointer               user_data)      : Action

    This signal is emitted when a new valid line pattern is selected.

    combo :

    the VisuUiStippleCombobox that emits the signal ;

    stipple :

    the value of the newly selected line patter.

    user_data :

    user data set when the signal handler was connected.

    Since 3.4

    v_sim-3.7.0/Documentation/reference/html/v-sim-gtk-toolPanelWidget.html0000644000353400050620000023442512216331357023114 00000000000000 gtk_toolPanelWidget

    gtk_toolPanelWidget

    gtk_toolPanelWidget — Defines a widget that hold a set of V_Sim panel.

    Synopsis

    #define             VISU_UI_TYPE_DOCK_WINDOW
                        VisuUiDockWindow;
                        VisuUiPanel;
                        VisuUiPanelClass;
    void                visu_ui_dock_window_getCharacteristics
                                                            (VisuUiDockWindow *dock,
                                                             gchar **id,
                                                             gboolean *visibility,
                                                             gint *x,
                                                             gint *y,
                                                             gint *width,
                                                             gint *height);
    GtkWidget *         visu_ui_dock_window_getContainer    (VisuUiDockWindow *dock);
    GtkWidget *         visu_ui_dock_window_getNotebook     (VisuUiDockWindow *dock);
    GtkWidget *         visu_ui_dock_window_getWindow       (VisuUiDockWindow *dock);
    void                visu_ui_dock_window_setPosition     (VisuUiDockWindow *dock,
                                                             guint x,
                                                             guint y);
    void                visu_ui_dock_window_setSize         (VisuUiDockWindow *dock,
                                                             guint width,
                                                             guint height);
    void                visu_ui_dock_window_setVisibility   (VisuUiDockWindow *dock,
                                                             gboolean visible);
    void                visu_ui_panel_attach                (VisuUiPanel *visu_ui_panel,
                                                             VisuUiDockWindow *dock);
    GList *             visu_ui_panel_class_getAllPanels    (void);
    GList *             visu_ui_panel_class_getAllWindows   (void);
    VisuUiDockWindow *  visu_ui_panel_class_getCommandPanel (void);
    VisuUiDockWindow *  visu_ui_panel_class_getDockById     (const gchar *id);
    VisuUiPanel *       visu_ui_panel_class_getPanelById    (const gchar *id);
    void                visu_ui_panel_class_setCurrent      (VisuData *dataObj,
                                                             VisuGlView *view);
    void                visu_ui_panel_class_setHeaderVisibility
                                                            (gboolean status);
    void                visu_ui_panel_detach                (VisuUiPanel *visu_ui_panel);
    VisuUiDockWindow *  visu_ui_panel_getContainer          (VisuUiPanel *visu_ui_panel);
    const gchar *       visu_ui_panel_getContainerId        (VisuUiPanel *visu_ui_panel);
    GtkWindow *         visu_ui_panel_getContainerWindow    (VisuUiPanel *visu_ui_panel);
    VisuData *          visu_ui_panel_getData               (VisuUiPanel *visu_ui_panel);
    VisuBoxed *         visu_ui_panel_getFocused            (VisuUiPanel *visu_ui_panel);
    GtkWidget *         visu_ui_panel_getHeaderWidget       (VisuUiPanel *visu_ui_panel);
    const gchar *       visu_ui_panel_getId                 (VisuUiPanel *visu_ui_panel);
    const gchar *       visu_ui_panel_getLabel              (VisuUiPanel *visu_ui_panel);
    VisuGlView *        visu_ui_panel_getView               (VisuUiPanel *visu_ui_panel);
    gboolean            visu_ui_panel_getVisible            (VisuUiPanel *visu_ui_panel);
    GtkWidget *         visu_ui_panel_new                   (gchar *id,
                                                             gchar *name,
                                                             gchar *tabName);
    GtkWidget *         visu_ui_panel_newWithIconFromPath   (gchar *id,
                                                             gchar *name,
                                                             gchar *tabName,
                                                             const gchar *iconPath);
    GtkWidget *         visu_ui_panel_newWithIconFromStock  (gchar *id,
                                                             gchar *name,
                                                             gchar *tabName,
                                                             const gchar *stock);
    void                visu_ui_panel_setContainer          (VisuUiPanel *visu_ui_panel,
                                                             VisuUiDockWindow *window);
    void                visu_ui_panel_setContainerId        (VisuUiPanel *visu_ui_panel,
                                                             const gchar *id);
    void                visu_ui_panel_setDockable           (VisuUiPanel *visu_ui_panel,
                                                             gboolean value);
    

    Object Hierarchy

      GBoxed
       +----VisuUiDockWindow
    
      GObject
       +----GInitiallyUnowned
             +----GtkWidget
                   +----GtkContainer
                         +----GtkBin
                               +----GtkAlignment
                                     +----VisuUiPanel
    

    Implemented Interfaces

    VisuUiPanel implements AtkImplementorIface and GtkBuildable.

    Signals

      "page-entered"                                   : Action
    

    Description

    This widget is a complex association of a GtkComboBox and a GtkNotebook with V_Sim panels. It can have its own window or be attached into the main command panel.

    This widget also has a built-in menu to exchange V_Sim panel between different instances of a VisuUiPanel. A VisuUiPanel is refered by its name and has a position and a size. These values can be stored in the parameter files.

    Details

    VISU_UI_TYPE_DOCK_WINDOW

    #define VISU_UI_TYPE_DOCK_WINDOW (visu_ui_dock_window_get_type())
    

    The type of VisuUiDockWindow objects.


    VisuUiDockWindow

    typedef struct _VisuUiDockWindow VisuUiDockWindow;

    Short name for the structure of containers of VisuUiPanel.


    VisuUiPanel

    typedef struct _VisuUiPanel VisuUiPanel;

    Short form for a VisuUiPanel_struct structure.


    VisuUiPanelClass

    typedef struct _VisuUiPanelClass VisuUiPanelClass;

    Opaque structure.


    visu_ui_dock_window_getCharacteristics ()

    void                visu_ui_dock_window_getCharacteristics
                                                            (VisuUiDockWindow *dock,
                                                             gchar **id,
                                                             gboolean *visibility,
                                                             gint *x,
                                                             gint *y,
                                                             gint *width,
                                                             gint *height);

    A routine to know everything about a VisuUiDockWindow.

    dock :

    a VisuUiDockWindow object ;

    id :

    a location to store the identifier (owned by V_Sim) ;

    visibility :

    a location to store the status of the dock, hidden or not ;

    x :

    a location to store its x position on the root window ;

    y :

    a location to store its y position on the root window ;

    width :

    a location to store its width ;

    height :

    a location to store its height.

    visu_ui_dock_window_getContainer ()

    GtkWidget *         visu_ui_dock_window_getContainer    (VisuUiDockWindow *dock);

    A dock window is a small utility window with a list of VisuUiPanel. This window can be embedded in a container or have its own GtkWindow. This routine get the top-level container inside a given VisuUiDockWindow. If you prefer to get the GtkWindow containing the VisuUiDockWindow use visu_ui_dock_window_getWindow() instead.

    dock :

    a dock window descriptor.

    Returns :

    a top-level container (usually a GtkVBox). [transfer none]

    visu_ui_dock_window_getNotebook ()

    GtkWidget *         visu_ui_dock_window_getNotebook     (VisuUiDockWindow *dock);

    A dock window is a small utility window with a list of VisuUiPanel. All VisuUiPanel are contained in a GtkNotebook. This routine gets it.

    dock :

    a dock window descriptor.

    Returns :

    the GtkNotebook containing the VisuUiPanel of this VisuUiDockWindow. [transfer none]

    visu_ui_dock_window_getWindow ()

    GtkWidget *         visu_ui_dock_window_getWindow       (VisuUiDockWindow *dock);

    A dock window is a small utility window with a list of VisuUiPanel. This window can be embedded in a container or have its own GtkWindow. This routine get the GtkWindow containing the VisuUiDockWindow in the case the dock is stand-alone. If not NULL is returned.

    dock :

    a dock window descriptor.

    Returns :

    a top-level container (usually a GtkWindow) or NULL. [transfer none]

    visu_ui_dock_window_setPosition ()

    void                visu_ui_dock_window_setPosition     (VisuUiDockWindow *dock,
                                                             guint x,
                                                             guint y);

    Change the position of the given VisuUiDockWindow. The position is possibly adapted to avoid been out of screen.

    dock :

    a VisuUiDockWindow object ;

    x :

    the requested x position ;

    y :

    the requested y position.

    visu_ui_dock_window_setSize ()

    void                visu_ui_dock_window_setSize         (VisuUiDockWindow *dock,
                                                             guint width,
                                                             guint height);

    Change the size of the given VisuUiDockWindow. The size is possibly adapted to avoid been out of screen.

    dock :

    a VisuUiDockWindow object ;

    width :

    the requested width ;

    height :

    the requested height.

    visu_ui_dock_window_setVisibility ()

    void                visu_ui_dock_window_setVisibility   (VisuUiDockWindow *dock,
                                                             gboolean visible);

    Change the visibility of a VisuUiDockWindow. If hidden, the dock is added to the list of hidden VisuUiDockWindow that can be shown again using the pop-up menu on every visible VisuUiDockWindow. The 'Main' dock window can not be hidden.

    dock :

    a VisuUiDockWindow object ;

    visible :

    a boolean.

    visu_ui_panel_attach ()

    void                visu_ui_panel_attach                (VisuUiPanel *visu_ui_panel,
                                                             VisuUiDockWindow *dock);

    Put the given visu_ui_panel in the given dock window. It adds in this dock window a new page in the GtkNotebook using as tab header the widget returned by visu_ui_panel_getHeaderWidget().

    visu_ui_panel :

    a VisuUiPanel ;

    dock :

    a VisuUiDockWindow.

    visu_ui_panel_class_getAllPanels ()

    GList *             visu_ui_panel_class_getAllPanels    (void);

    This routine can be used to know all existing VisuUiPanel.

    Returns :

    a newly created list (use g_list_free() on it after use). [transfer full][element-type VisuUiPanel*]

    visu_ui_panel_class_getAllWindows ()

    GList *             visu_ui_panel_class_getAllWindows   (void);

    This routine can be used to know all existing VisuUiDockWindow.

    Returns :

    a newly created list (use g_list_free() on it after use). [transfer container][element-type VisuUiDockWindow*]

    visu_ui_panel_class_getCommandPanel ()

    VisuUiDockWindow *  visu_ui_panel_class_getCommandPanel (void);

    There is always a VisuUiDockWindow that is inside the command panel. This routine gets it.

    Returns :

    the VisuUiDockWindow that is inside the command panel. [transfer none]

    visu_ui_panel_class_getDockById ()

    VisuUiDockWindow *  visu_ui_panel_class_getDockById     (const gchar *id);

    This routine associates a VisuUiDockWindow identifier to the object pointer.

    id :

    a VisuUiDockWindow identifier.

    Returns :

    the VisuUiDockWindow that corresponds to this identifier. The dock window is built if not currently exist.

    visu_ui_panel_class_getPanelById ()

    VisuUiPanel *       visu_ui_panel_class_getPanelById    (const gchar *id);

    This routine associates a VisuUiPanel identifier to the object pointer.

    id :

    a VisuUiPanel identifier.

    Returns :

    the VisuUiPanel that corresponds to this identifier or NULL if none exists. [transfer none]

    visu_ui_panel_class_setCurrent ()

    void                visu_ui_panel_class_setCurrent      (VisuData *dataObj,
                                                             VisuGlView *view);

    Set the currently focussed VisuData. It then can be retrieve using visu_ui_panel_getData().

    dataObj :

    a VisuData object.

    view :

    a VisuGlView object.

    Since 3.7


    visu_ui_panel_class_setHeaderVisibility ()

    void                visu_ui_panel_class_setHeaderVisibility
                                                            (gboolean status);

    The header can be represented using the full image and label always or only the image when the tab is not on top.

    status :

    a boolean.

    visu_ui_panel_detach ()

    void                visu_ui_panel_detach                (VisuUiPanel *visu_ui_panel);

    Remove the given visu_ui_panel from its current container and add it to the list of hidden tool panels. It can be added again using the pop-up menu of any VisuUiDockWindow.

    visu_ui_panel :

    a VisuUiPanel.

    visu_ui_panel_getContainer ()

    VisuUiDockWindow *  visu_ui_panel_getContainer          (VisuUiPanel *visu_ui_panel);

    Return the VisuUiDockWindow that the given visu_ui_panel is attached to or NULL if the visu_ui_panel is currently dettached.

    visu_ui_panel :

    a VisuUiPanel.

    Returns :

    a VisuUiDockWindow object.

    visu_ui_panel_getContainerId ()

    const gchar *       visu_ui_panel_getContainerId        (VisuUiPanel *visu_ui_panel);

    Return the identifying string of the VisuUiDockWindow that the given visu_ui_panel is attached to or NULL if the visu_ui_panel is currently dettached.

    visu_ui_panel :

    a VisuUiPanel.

    Returns :

    a string owned by V_Sim.

    visu_ui_panel_getContainerWindow ()

    GtkWindow *         visu_ui_panel_getContainerWindow    (VisuUiPanel *visu_ui_panel);

    Return the GtkWindow that the given visu_ui_panel is rendered in or NULL if the visu_ui_panel is currently dettached.

    visu_ui_panel :

    a VisuUiPanel.

    Returns :

    a GtkWindow object. [transfer none]

    visu_ui_panel_getData ()

    VisuData *          visu_ui_panel_getData               (VisuUiPanel *visu_ui_panel);

    The visu_ui_panel is supposed to work on a VisuData, this routine can be used to get it.

    visu_ui_panel :

    a VisuUiPanel.

    Returns :

    the currently focused VisuData (can be NULL if none). [transfer none]

    visu_ui_panel_getFocused ()

    VisuBoxed *         visu_ui_panel_getFocused            (VisuUiPanel *visu_ui_panel);

    Retrieves the currently focused VisuBoxed object in the default VisuUiRenderingWindow.

    visu_ui_panel :

    a VisuUiPanel.

    Returns :

    the currently focused VisuBoxed (can be NULL if none). [transfer none][allow-none]

    Since 3.7


    visu_ui_panel_getHeaderWidget ()

    GtkWidget *         visu_ui_panel_getHeaderWidget       (VisuUiPanel *visu_ui_panel);

    The VisuUiPanel should be used in a page of a GtkNotebook. This routine is used to get the widget that should be used in the tab. This widget is a container with an icon and a label.

    visu_ui_panel :

    a VisuUiPanel.

    Returns :

    a container widget that should be put in the tab of a GtkNotebook. [transfer none]

    visu_ui_panel_getId ()

    const gchar *       visu_ui_panel_getId                 (VisuUiPanel *visu_ui_panel);

    The VisuUiPanel can be identifyed by an id (a string without space, usually using ASCII characters only).

    visu_ui_panel :

    a VisuUiPanel.

    Returns :

    a constant string identifying this VisuUiPanel.

    visu_ui_panel_getLabel ()

    const gchar *       visu_ui_panel_getLabel              (VisuUiPanel *visu_ui_panel);

    The VisuUiPanel has two label, a short one, used in the tab of a GtkNotebook and one longer. This routine gets the longer.

    visu_ui_panel :

    a VisuUiPanel.

    Returns :

    an UTF-8 internationalised name (property of V_Sim, should not be freed).

    visu_ui_panel_getView ()

    VisuGlView *        visu_ui_panel_getView               (VisuUiPanel *visu_ui_panel);

    Convenient routine to get the current VisuGlView, see visu_ui_panel_class_setCurrent().

    visu_ui_panel :

    a VisuUiPanel object.

    Returns :

    the current VisuGlView, or NULL. [transfer none]

    Since 3.7


    visu_ui_panel_getVisible ()

    gboolean            visu_ui_panel_getVisible            (VisuUiPanel *visu_ui_panel);

    This is used to retrieve if the visu_ui_panel is currently realised and the visualised page of the GtkNotebook it is associated to.

    visu_ui_panel :

    a VisuUiPanel.

    Returns :

    TRUE if the given visu_ui_panel is potentialy visible to the user.

    visu_ui_panel_new ()

    GtkWidget *         visu_ui_panel_new                   (gchar *id,
                                                             gchar *name,
                                                             gchar *tabName);

    Create a new VisuUiPanel with the given id, displaying name in the combo box of a VisuUiDockWindow and tabName in the tab of the page notebook.

    id :

    a string without space and non internationalised ;. [type filename]

    name :

    a string in UTF-8 that can be internationalised ;

    tabName :

    a shorter name than name, in UTF-8 that can be internationalised.

    Returns :

    a newly created widget.

    visu_ui_panel_newWithIconFromPath ()

    GtkWidget *         visu_ui_panel_newWithIconFromPath   (gchar *id,
                                                             gchar *name,
                                                             gchar *tabName,
                                                             const gchar *iconPath);

    Create a new VisuUiPanel with the given id, displaying name in the combo box of a VisuUiDockWindow and tabName in the tab of the page notebook. The displayed icon will be read from the iconPath.

    id :

    a string without space and non internationalised ;

    name :

    a string in UTF-8 that can be internationalised ;

    tabName :

    a shorter name than name, in UTF-8 that can be internationalised ;

    iconPath :

    a path to an icon (should be 20x20).

    Returns :

    a newly created widget. [transfer full]

    visu_ui_panel_newWithIconFromStock ()

    GtkWidget *         visu_ui_panel_newWithIconFromStock  (gchar *id,
                                                             gchar *name,
                                                             gchar *tabName,
                                                             const gchar *stock);

    Create a new VisuUiPanel with the given id, displaying name in the combo box of a VisuUiDockWindow and tabName in the tab of the page notebook. The displayed icon will be taken from the stock.

    id :

    a string without space and non internationalised ;

    name :

    a string in UTF-8 that can be internationalised ;

    tabName :

    a shorter name than name, in UTF-8 that can be internationalised ;

    stock :

    the name of a stock icon.

    Returns :

    a newly created widget. [transfer full]

    visu_ui_panel_setContainer ()

    void                visu_ui_panel_setContainer          (VisuUiPanel *visu_ui_panel,
                                                             VisuUiDockWindow *window);

    Change the container of a visu_ui_panel. If it is currently attached to a VisuUiDockWindow, it firstly detachs it.

    visu_ui_panel :

    a VisuUiPanel ;

    window :

    a VisuUiDockWindow.

    visu_ui_panel_setContainerId ()

    void                visu_ui_panel_setContainerId        (VisuUiPanel *visu_ui_panel,
                                                             const gchar *id);

    Change the container of a visu_ui_panel using the given id. If it is currently attached to a VisuUiDockWindow, it firstly detachs it.

    visu_ui_panel :

    a VisuUiPanel ;

    id :

    a VisuUiDockWindow identifier.

    visu_ui_panel_setDockable ()

    void                visu_ui_panel_setDockable           (VisuUiPanel *visu_ui_panel,
                                                             gboolean value);

    A VisuUiPanel can be moved between different VisuUiDockWindow or not. This ability is controlled by the dockable flag. Change it with this method. If visu_ui_panel is set dockable, then, it can be hidden or moved to another or a new VisuUiDockWindow with the pop-up memu that is triggered by a small button in the header widget (see visu_ui_panel_getHeaderWidget()).

    visu_ui_panel :

    a VisuUiPanel ;

    value :

    a boolean.

    Signal Details

    The "page-entered" signal

    void                user_function                      (VisuUiPanel *panel,
                                                            gpointer     user_data)      : Action

    This signal is emitted when a page of the GtkNotebook with all the V_Sim panels is entered.

    panel :

    the VisuUiPanel that emits the signal.

    user_data :

    user data set when the signal handler was connected.

    Since 3.3

    v_sim-3.7.0/Documentation/reference/html/v-sim-gtk-valueIOWidget.html0000644000353400050620000005573212216331357022525 00000000000000 gtk_valueIOWidget

    gtk_valueIOWidget

    gtk_valueIOWidget — Defines a specialised GtkHBox with three button to open, save and save as XML value files.

    Object Hierarchy

      GObject
       +----GInitiallyUnowned
             +----GtkWidget
                   +----GtkContainer
                         +----GtkBox
                               +----GtkHBox
                                     +----VisuUiValueIo
    

    Implemented Interfaces

    VisuUiValueIo implements AtkImplementorIface, GtkBuildable and GtkOrientable.

    Description

    Details

    VisuUiValueIo

    typedef struct _VisuUiValueIo VisuUiValueIo;

    Private structure to store informations of a VisuUiValueIo object.

    Since 3.5


    VisuUiValueIoCallback ()

    gboolean            (*VisuUiValueIoCallback)            (const gchar *filename,
                                                             GError **error);

    Prototypes of functions to be called when an IO file is saved or opened, see visu_ui_value_io_connectOnOpen() and visu_ui_value_io_connectOnSave().

    filename :

    the name of the file to be saved or opened ;

    error :

    a location to store a possible error.

    Returns :

    should return TRUE if the action of the callback succeed.

    VisuUiValueIoClass

    typedef struct _VisuUiValueIoClass VisuUiValueIoClass;

    Private structure to store informations of a VisuUiValueIoClass object.

    Since 3.5


    visu_ui_value_io_connectOnOpen ()

    void                visu_ui_value_io_connectOnOpen      (VisuUiValueIo *valueio,
                                                             VisuUiValueIoCallback open);

    Set the function to call when the open button is clicked.

    valueio :

    a VisuUiValueIo widget.

    open :

    a method.

    Since 3.5


    visu_ui_value_io_connectOnSave ()

    void                visu_ui_value_io_connectOnSave      (VisuUiValueIo *valueio,
                                                             VisuUiValueIoCallback save);

    Set the function to call when the save or save-as button is clicked.

    valueio :

    a VisuUiValueIo widget.

    save :

    a method.

    Since 3.5


    visu_ui_value_io_getFilename ()

    gchar *             visu_ui_value_io_getFilename        (GtkWindow *parent);

    Open a save dialog window with XML filter to choose the name of a file. This is the default action that can be connect to a VisuUiValueIo widget using visu_ui_value_io_connectOnSave().

    parent :

    a parent to display the dialog on.

    Returns :

    a filename that should be freed later with g_free() by the caller.

    Since 3.5


    visu_ui_value_io_new ()

    GtkWidget *         visu_ui_value_io_new                (GtkWindow *parent,
                                                             const gchar *tipsOpen,
                                                             const gchar *tipsSave,
                                                             const gchar *tipsSaveAs);

    A VisuUiValueIo widget is like a GtkComboBox widget, but it is already filled with predefined line patterns (call stipple). Using this widget is a convienient way to share stipples between all part of V_Sim and to give a consistent look of all stipple selection.

    parent :

    the parent used to show the file dialog.

    tipsOpen :

    a tooltip to show on open button.

    tipsSave :

    a tooltip to show on save button.

    tipsSaveAs :

    a tooltip to show on save-as button.

    Returns :

    a newly created VisuUiValueIo widget. [transfer full]

    Since 3.5


    visu_ui_value_io_setFilename ()

    gboolean            visu_ui_value_io_setFilename        (VisuUiValueIo *valueio,
                                                             const gchar *filename);

    Call the open routine previously set by visu_ui_value_io_connectOnOpen() on filename and update the buttons accordingly.

    valueio :

    a VisuUiValueIo widget.

    filename :

    a location on disk.

    Returns :

    TRUE on success of the open routine.

    Since 3.5


    visu_ui_value_io_setSensitiveOpen ()

    void                visu_ui_value_io_setSensitiveOpen   (VisuUiValueIo *valueio,
                                                             gboolean status);

    Modify the sensitivity of the open button, depending on status.

    valueio :

    a VisuUiValueIo widget.

    status :

    a boolean.

    Since 3.5


    visu_ui_value_io_setSensitiveSave ()

    void                visu_ui_value_io_setSensitiveSave   (VisuUiValueIo *valueio,
                                                             gboolean status);

    Modify the sensitivity of the save button, depending on status.

    valueio :

    a VisuUiValueIo widget.

    status :

    a boolean.

    Since 3.5

    v_sim-3.7.0/Documentation/reference/html/v-sim-gtk-wire.html0000644000353400050620000001571212216331357020755 00000000000000 gtk_wire

    gtk_wire

    gtk_wire — The additional widgets displayed in the pair dialog to handle wire pairs.

    Description

    Some additional widgets to be displayed in the pairs dialog window. It contains a selector for the stipple of line representation, a selector for the colour and a way to choose a shade in case of colourisation depending on length.

    Details

    visu_ui_pairs_wire_getValues ()

    gchar *             visu_ui_pairs_wire_getValues        (VisuPairLink *data);

    Create an internationalised UTF-8 label that describes the information about a pair.

    data :

    information about a pair

    Returns :

    a newly allocated string. [transfer full]

    visu_ui_pairs_wire_init ()

    void                visu_ui_pairs_wire_init             (void);

    This routine is used by V_Sim to initialise the Gtk part of wire pair model. This should be called once on start-up.


    visu_ui_pairs_wire_initBuild ()

    GtkWidget *         visu_ui_pairs_wire_initBuild        ();

    This routine create a container GtkWidget that hold all widgets necessary for handling wire pair model.

    Returns :

    a newly created GtkWidget.

    visu_ui_pairs_wire_setValues ()

    void                visu_ui_pairs_wire_setValues        (VisuPairLink *data);

    Change the widget values with the given information. This change trigger no signals.

    data :

    information about a pair.
    v_sim-3.7.0/Documentation/reference/html/v-sim-interactive.html0000644000353400050620000021157412216331357021545 00000000000000 interactive

    interactive

    interactive — Gives tools to interact with the rendered area.

    Synopsis

                        VisuInteractive;
                        VisuInteractiveClass;
    enum                VisuInteractiveId;
    enum                VisuInteractiveMethod;
    enum                VisuInteractivePick;
    enum                VisuInteractivePickError;
    void                visu_interactive_apply              (VisuInteractive *inter,
                                                             VisuNodeArray *array);
    void                visu_interactive_class_getNodes2DCoordinates
                                                            (VisuData *dataObj,
                                                             guint *nodeIds,
                                                             guint nNodes,
                                                             float *coordinates2D,
                                                             guint *size);
    VisuInteractiveMethod visu_interactive_class_getPreferedObserveMethod
                                                            ();
    void                visu_interactive_class_setPreferedObserveMethod
                                                            (VisuInteractiveMethod method);
    ToolSimplifiedEvents * visu_interactive_getEvent        (VisuInteractive *inter);
    void                visu_interactive_getSavedCameras    (VisuInteractive *inter,
                                                             GList **cameras,
                                                             GList **head);
    VisuInteractiveId   visu_interactive_getType            (VisuInteractive *inter);
    void                visu_interactive_handleEvent        (VisuInteractive *inter,
                                                             VisuGlView *view,
                                                             ToolSimplifiedEvents *ev);
    void                visu_interactive_highlight          (VisuInteractive *inter,
                                                             VisuData *dataObj,
                                                             guint nodeId);
    VisuInteractive *   visu_interactive_new                (VisuInteractiveId type);
    VisuGlCamera *      visu_interactive_popSavedCamera     (VisuInteractive *inter);
    void                visu_interactive_pushSavedCamera    (VisuInteractive *inter,
                                                             VisuGlCamera *camera);
    void                visu_interactive_setMovingAxe       (VisuInteractive *inter,
                                                             float axe[3]);
    void                visu_interactive_setMovingNodes     (VisuInteractive *inter,
                                                             GList *nodeIds);
    void                visu_interactive_setNodeList        (VisuInteractive *inter,
                                                             VisuGlExtNodes *nodes);
    void                visu_interactive_setReferences      (VisuInteractive *inter,
                                                             VisuInteractive *from);
    gboolean            visu_interactive_setType            (VisuInteractive *inter,
                                                             VisuInteractiveId id);
    

    Object Hierarchy

      GObject
       +----VisuInteractive
    

    Description

    When one wants some interactions on the rendering area (either from the mouse or from the keyboard), one should initialise it using openGLInteractiveInit_session(). Then, during the interactive session, several modes have been implemented:

    The observe mode has two different moving algorithms that can be changed using openGLInteractiveSet_preferedObserveMethod(). The first, called 'constrained' (cf. OPENGL_OBSERVE_CONSTRAINED) corresponds to movements along parallels and meridians. When the mouse is moved along x axis, the camera raotates along a parallel. When the camera is moved along y axis, the camera rotate along a meridian. The top is always pointing to the north pole (in fact, omega is always forced to 0 in this mode). This mode has a 'strange' behavior when the observer is near a pole: moving mouse along x axis make the box rotates on itself. It is normal, because movements on x axis is equivalent to movements on parallel and near the poles, parallel are small circle around the z axis. This can be unnatural in some occasion and the other mode, called 'walker' (see OPENGL_OBSERVE_WALKER) can be used instead of the 'constrained' mode. In the former, the moving is done has if the observer was a walking ant on a sphere : moving the mouse along y axis makes the ant go on or forward ; and x axis movements makes the ant goes on its left or on it right. This is a more natural way to move the box but it has the inconvient that it is hard to return in a given position (omega has never the right value).

    Details

    VisuInteractive

    typedef struct _VisuInteractive VisuInteractive;

    All fields are private.


    VisuInteractiveClass

    typedef struct _VisuInteractiveClass VisuInteractiveClass;

    An opaque structure representing the class of VisuInteractive objects.


    enum VisuInteractiveId

    typedef enum {
        interactive_none,
        interactive_observe,
        interactive_measureAndObserve,
        interactive_measure,
        interactive_pick,
        interactive_move,
        interactive_mark
    } VisuInteractiveId;
    

    These are the possible mouse interaction that are implemented.

    interactive_none

    no interaction ;

    interactive_observe

    interaction to rotate the view ;

    interactive_measureAndObserve

    interaction to rotate the view and access limited pick action on the right click ;

    interactive_measure

    interaction to pick and measure ;

    interactive_pick

    interaction to select node ;

    interactive_move

    interaction to move nodes ;

    interactive_mark

    interaction to mark nodes.

    enum VisuInteractiveMethod

    typedef enum {
        interactive_constrained,
        interactive_walker
    } VisuInteractiveMethod;
    

    Describes the different possible methods for observe moves.

    interactive_constrained

    the camera is moved keeping the north pole up. The north pole is defined by the Z axis et periodic boundary conditions and by normal to surface in surface conditions.

    interactive_walker

    the camera is moved following the mouse moves, orienting the view as a walker would do along a sphere.

    enum VisuInteractivePick

    typedef enum {
        PICK_NONE,
        PICK_SELECTED,
        PICK_DISTANCE,
        PICK_ANGLE,
        PICK_HIGHLIGHT,
        PICK_REFERENCE_1,
        PICK_UNREFERENCE_1,
        PICK_REFERENCE_2,
        PICK_UNREFERENCE_2,
        PICK_INFORMATION,
        PICK_REGION
    } VisuInteractivePick;
    

    Possible significations of a click.

    PICK_NONE

    click to void ;

    PICK_SELECTED

    click to select one node ;

    PICK_DISTANCE

    click to measure a distance between two nodes ;

    PICK_ANGLE

    click to measure an angle ;

    PICK_HIGHLIGHT

    click to highlight a node ;

    PICK_REFERENCE_1

    click to select a first reference ;

    PICK_UNREFERENCE_1

    click to un-select a first reference ;

    PICK_REFERENCE_2

    click to select a second reference ;

    PICK_UNREFERENCE_2

    click to un-select a second reference ;

    PICK_INFORMATION

    click to measure distances and angles around one node ;

    PICK_REGION

    click to select a list of nodes.

    enum VisuInteractivePickError

    typedef enum {
        PICK_ERROR_NONE,
        PICK_ERROR_NO_SELECTION,
        PICK_ERROR_SAME_REF,
        PICK_ERROR_REF1,
        PICK_ERROR_REF2
    } VisuInteractivePickError;
    

    Possible errors to occur when pick or measure.

    PICK_ERROR_NONE

    no error during click ;

    PICK_ERROR_NO_SELECTION

    click to sleect but nothing selected ;

    PICK_ERROR_SAME_REF

    click to set a reference but reference already exists ;

    PICK_ERROR_REF1

    click to select a first reference but impossible to choose this one ;

    PICK_ERROR_REF2

    the same for second reference.

    visu_interactive_apply ()

    void                visu_interactive_apply              (VisuInteractive *inter,
                                                             VisuNodeArray *array);

    Update all ids of inter to point to actual nodes of array.

    inter :

    a VisuInteractive object.

    array :

    a VisuNodeArray object. [allow-none]

    Since 3.7


    visu_interactive_class_getNodes2DCoordinates ()

    void                visu_interactive_class_getNodes2DCoordinates
                                                            (VisuData *dataObj,
                                                             guint *nodeIds,
                                                             guint nNodes,
                                                             float *coordinates2D,
                                                             guint *size);

    From nodes ids, compute and store in coordinates2D their 2D coordinates.

    dataObj :

    a VisuData object ;

    nodeIds :

    an array of VisuNode ids ;

    nNodes :

    the number of nodes in the array ;

    coordinates2D :

    an array of nodes 2D coordinates ;

    size :

    the size of the coordinates array.

    visu_interactive_class_getPreferedObserveMethod ()

    VisuInteractiveMethod visu_interactive_class_getPreferedObserveMethod
                                                            ();

    There are two methods to move the camera in a pick and observe sesion. These two methods are described in the commentary of the keys OPENGL_OBSERVE_CONSTRAINED an dOPENGL_OBSERVE_WALKER.

    Returns :

    an integer that identify the method, see OPENGL_OBSERVE_CONSTRAINED, and OPENGL_OBSERVE_WALKER flags.

    visu_interactive_class_setPreferedObserveMethod ()

    void                visu_interactive_class_setPreferedObserveMethod
                                                            (VisuInteractiveMethod method);

    There are two methods to move the camera in a pick and observe sesion. These two methods are described in the commentary of the keys OPENGL_OBSERVE_CONSTRAINED an dOPENGL_OBSERVE_WALKER.

    method :

    an integer that identify the method, see OPENGL_OBSERVE_CONSTRAINED, and OPENGL_OBSERVE_WALKER flags.

    visu_interactive_getEvent ()

    ToolSimplifiedEvents * visu_interactive_getEvent        (VisuInteractive *inter);

    This routine can be called in callbacks of inter to get some details about the event that raise signals like VisuInteractive::node-selection.

    inter :

    a VisuInteractive object.

    Returns :

    a location with details on the last event. [transfer none]

    Since 3.7


    visu_interactive_getSavedCameras ()

    void                visu_interactive_getSavedCameras    (VisuInteractive *inter,
                                                             GList **cameras,
                                                             GList **head);

    inter object stores camera settings as a ring. One can access the set of saved cameras thanks to cameras or to the current position in the ring thanks to head. cameras or head are not copied and are owned by V_Sim. They should be considered read-only.

    inter :

    a VisuInteractive object.

    cameras :

    a location to store a list of cameras. [out][element-type VisuGlCamera*]

    head :

    a location to store a list of cameras. [out][element-type VisuGlCamera*]

    Since 3.6


    visu_interactive_getType ()

    VisuInteractiveId   visu_interactive_getType            (VisuInteractive *inter);

    It returns the kind of interactive session.

    inter :

    a VisuInteractive object.

    Returns :

    a VisuInteractiveId value.

    visu_interactive_handleEvent ()

    void                visu_interactive_handleEvent        (VisuInteractive *inter,
                                                             VisuGlView *view,
                                                             ToolSimplifiedEvents *ev);

    This routine should be called by the rendering window when some event is raised on the rendering surface.

    inter :

    a VisuInteractive object ;

    view :

    a VisuGlView object the interaction happened on.

    ev :

    a simplified event.

    visu_interactive_highlight ()

    void                visu_interactive_highlight          (VisuInteractive *inter,
                                                             VisuData *dataObj,
                                                             guint nodeId);

    This routine simulates an highlight action on nodeId from dataObj. This triggers the signal "node-selection", or "selection-error" if nodeId is invalid.

    inter :

    a VisuInteractive object.

    dataObj :

    a VisuData object.

    nodeId :

    a node id.

    Since 3.7


    visu_interactive_new ()

    VisuInteractive *   visu_interactive_new                (VisuInteractiveId type);

    Creates a new interactive session of the given type.

    type :

    a VisuInteractiveId flag.

    Returns :

    a newly created object. [transfer full]

    visu_interactive_popSavedCamera ()

    VisuGlCamera *      visu_interactive_popSavedCamera     (VisuInteractive *inter);

    inter object stores camera settings as a ring. This routine goes to the next camera in the ring and returns the current one. The popped camera is not actually removed from the ring.

    inter :

    a VisuInteractive object.

    Returns :

    a pointer to the previously current VisuGlCamera. It is owned by V_Sim and should not be touched.

    Since 3.6


    visu_interactive_pushSavedCamera ()

    void                visu_interactive_pushSavedCamera    (VisuInteractive *inter,
                                                             VisuGlCamera *camera);

    inter object stores camera settings as a ring. The given camera is copied in the ring if its values not already exist. The current camera is set to this new one.

    inter :

    a VisuInteractive object.

    camera :

    a VisuGlCamera object.

    Since 3.6


    visu_interactive_setMovingAxe ()

    void                visu_interactive_setMovingAxe       (VisuInteractive *inter,
                                                             float axe[3]);

    Defines the axe that can be used to move along if inter is a move action session.

    inter :

    a VisuInteractive object.

    axe :

    a direction.

    visu_interactive_setMovingNodes ()

    void                visu_interactive_setMovingNodes     (VisuInteractive *inter,
                                                             GList *nodeIds);

    Defines the nodes that should be moved if inter is a move action session. The list is actually copied.

    inter :

    a VisuInteractive object.

    nodeIds :

    a list of node ids. [element-type guint32]

    visu_interactive_setNodeList ()

    void                visu_interactive_setNodeList        (VisuInteractive *inter,
                                                             VisuGlExtNodes *nodes);

    Associate a VisuGlExtNodes object for node selection. This is mandatory for move, pick and mark actions.

    inter :

    a VisuInteractive object.

    nodes :

    a VisuGlExtNodes object. [transfer full][allow-none]

    Since 3.7


    visu_interactive_setReferences ()

    void                visu_interactive_setReferences      (VisuInteractive *inter,
                                                             VisuInteractive *from);

    Copies all node ids used as reference from from to inter.

    inter :

    a VisuInteractive object.

    from :

    another VisuInteractive object.

    visu_interactive_setType ()

    gboolean            visu_interactive_setType            (VisuInteractive *inter,
                                                             VisuInteractiveId id);

    It changes the kind of interactive session.

    inter :

    a VisuInteractive object.

    id :

    a VisuInteractiveId.

    Returns :

    TRUE if indeed changed.

    Signal Details

    The "menu" signal

    void                user_function                      (VisuInteractive *obj,
                                                            gint             x,
                                                            gint             y,
                                                            VisuNode        *node,
                                                            gpointer         user_data)      : No Recursion

    This signal is emitted each time a menu key stroke is done.

    obj :

    the object emitting the signal.

    x :

    the x coordinate.

    y :

    the y coordinate.

    node :

    a VisuNode. [type VisuNode*][transfer none][allow-none]

    user_data :

    user data set when the signal handler was connected.

    Since 3.7


    The "move" signal

    void                user_function                      (VisuInteractive *obj,
                                                            gpointer         nodes,
                                                            gpointer         user_data)      : No Hooks

    This signal is emitted each time a set of nodes are moved. The corresponding nodes are stored in nodes.

    obj :

    the object emitting the signal.

    nodes :

    an array of node ids.

    user_data :

    user data set when the signal handler was connected.

    Since 3.6


    The "node-selection" signal

    void                user_function                      (VisuInteractive *obj,
                                                            guint            kind,
                                                            VisuNode        *node1,
                                                            VisuNode        *node2,
                                                            VisuNode        *node3,
                                                            gpointer         user_data)      : No Recursion

    This signal is emitted each time a single node selection succeed, providing the kind in kind (see VisuInteractivePick). The corresponding nodes are stored in node1, node2 and node3.

    obj :

    the object emitting the signal.

    kind :

    a flag, see VisuInteractivePick.

    node1 :

    the primary node. [type VisuNode*][transfer none]

    node2 :

    the secondary node, if any. [type VisuNode*][transfer none]

    node3 :

    the tertiary node, if any. [type VisuNode*][transfer none]

    user_data :

    user data set when the signal handler was connected.

    Since 3.6


    The "observe" signal

    void                user_function                      (VisuInteractive *obj,
                                                            gboolean         bool,
                                                            gpointer         user_data)      : No Recursion

    This signal is emitted each time an observe session is start (bool is TRUE) or finished (bool is FALSE).

    obj :

    the object emitting the signal.

    bool :

    a boolean.

    user_data :

    user data set when the signal handler was connected.

    Since 3.6


    The "region-selection" signal

    void                user_function                      (VisuInteractive *obj,
                                                            gpointer         nodes,
                                                            gpointer         user_data)      : No Hooks

    This signal is emitted each time a region selection succeed. The corresponding nodes are stored in nodes.

    obj :

    the object emitting the signal.

    nodes :

    an array of node ids.

    user_data :

    user data set when the signal handler was connected.

    Since 3.6


    The "selection-error" signal

    void                user_function                      (VisuInteractive *obj,
                                                            guint            err,
                                                            gpointer         user_data)      : No Hooks

    This signal is emitted each time a selection fails, providing the error in err (see VisuInteractivePickError).

    obj :

    the object emitting the signal.

    err :

    an error value.

    user_data :

    user data set when the signal handler was connected.

    Since 3.6


    The "start-move" signal

    void                user_function                      (VisuInteractive *obj,
                                                            gpointer         nodes,
                                                            gpointer         user_data)      : No Hooks

    This signal is emitted each time a set of nodes are clicked to be moved. The corresponding nodes are stored in nodes.

    obj :

    the object emitting the signal.

    nodes :

    an array of node ids.

    user_data :

    user data set when the signal handler was connected.

    Since 3.6


    The "stop" signal

    void                user_function                      (VisuInteractive *obj,
                                                            gpointer         user_data)      : No Hooks

    This signal is emitted each time a set of nodes are stopped to be moved.

    obj :

    the object emitting the signal.

    user_data :

    user data set when the signal handler was connected.

    Since 3.6

    v_sim-3.7.0/Documentation/reference/html/v-sim-isoline.html0000644000353400050620000003372712216331357020674 00000000000000 isoline

    isoline

    isoline — handle the drawing and the computation of isolines.

    Synopsis

                        VisuLine;
    void                visu_line_draw                      (VisuLine *line,
                                                             float rgb[3]);
    void                visu_line_free                      (VisuLine *line);
    double              visu_line_getValue                  (VisuLine *line);
    VisuLine *          visu_line_newFromTriangles          (float **data,
                                                             guint nTriangles,
                                                             double isoValue);
    float *             visu_line_project                   (VisuLine *line,
                                                             VisuPlane *plane,
                                                             guint *nSeg);
    VisuLine *          visu_line_ref                       (VisuLine *line);
    void                visu_line_unref                     (VisuLine *line);
    

    Object Hierarchy

      GBoxed
       +----VisuLine
    

    Description

    TODO

    Details

    VisuLine

    typedef struct _VisuLine VisuLine;

    Structure representing a curved line in 3D, opaque structure.


    visu_line_draw ()

    void                visu_line_draw                      (VisuLine *line,
                                                             float rgb[3]);

    Call the OpenGL routine that will draw this line.

    line :

    a set of points forming a line.

    rgb :

    a colour.

    Since 3.4


    visu_line_free ()

    void                visu_line_free                      (VisuLine *line);

    Free the line object.

    line :

    a set of lines.

    Since 3.4


    visu_line_getValue ()

    double              visu_line_getValue                  (VisuLine *line);

    Lines are usually created as iso-values line in a mesh.

    line :

    a VisuLine object.

    Returns :

    the value associated to the line.

    Since 3.6


    visu_line_newFromTriangles ()

    VisuLine *          visu_line_newFromTriangles          (float **data,
                                                             guint nTriangles,
                                                             double isoValue);

    Create on the fly an isoline from a given set of triangles. If the lines are created, isoline will be allocated and should be freed with visu_line_free() after use.

    data :

    the lines to be computed ;

    nTriangles :

    the surface to compute isoline from ;

    isoValue :

    the value of the computed isoline.

    Returns :

    the newly allocated VisuLine or NULL.

    Since 3.6


    visu_line_project ()

    float *             visu_line_project                   (VisuLine *line,
                                                             VisuPlane *plane,
                                                             guint *nSeg);

    Calculate the projection of each line vertex on plane.

    line :

    a VisuLine object.

    plane :

    a VisuPlane object.

    nSeg :

    a location to store the size of projection.

    Returns :

    a newly allocated array of line segments. The size of this array is 4 * nSeg, holding the two plane coordiantes of the two vertices of a line.

    Since 3.6


    visu_line_ref ()

    VisuLine *          visu_line_ref                       (VisuLine *line);

    Increase the ref counter.

    line :

    a VisuLine object.

    Returns :

    itself.

    Since 3.7


    visu_line_unref ()

    void                visu_line_unref                     (VisuLine *line);

    Decrease the ref counter, free all memory if counter reachs zero.

    line :

    a VisuLine object.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/v-sim-light.html0000644000353400050620000005660312216331357020337 00000000000000 light

    light

    light — Controls the use of lights in the rendering window.

    Object Hierarchy

      GBoxed
       +----VisuGlLight
    
      GBoxed
       +----VisuGlLights
    

    Description

    One can defines several lights in OpenGL. The VisuGlLights is an object that stores several of them and that can be applied to the current OpenGL context using visu_gl_lights_apply(). The lights that are created with visu_gl_light_newDefault() are ambiant light with a white colour. The multiplier coefficient is use to soften lights when several are used together. It is used as a factor for all light parameters (ambient, diffuse...) ecept the specular one.

    Details

    struct VisuGlLight

    struct VisuGlLight {
      gboolean enabled;
      float ambient[4];
      float diffuse[4];
      float specular[4];
      float position[4];
      float multiplier;
    };
    

    This structure is convenient to store lights as defined by OpenGL.

    gboolean enabled;

    if the light is used or not ;

    float ambient[4];

    the ambient color of the light ;

    float diffuse[4];

    the diffuse color of the light ;

    float specular[4];

    the specular color of the light ;

    float position[4];

    the position in space of the light ;

    float multiplier;

    a value that multiply all color values (should be in [0;1]).

    enum VisuGlLightMaterial

    typedef enum {
        VISU_GL_LIGHT_MATERIAL_AMB,
        VISU_GL_LIGHT_MATERIAL_DIF,
        VISU_GL_LIGHT_MATERIAL_SHI,
        VISU_GL_LIGHT_MATERIAL_SPE,
        VISU_GL_LIGHT_MATERIAL_EMI,
        VISU_GL_LIGHT_MATERIAL_N_VALUES
    } VisuGlLightMaterial;
    

    This enum is used to address the OpenGL parameters for light rendering.

    VISU_GL_LIGHT_MATERIAL_AMB

    the ambient identifier ;

    VISU_GL_LIGHT_MATERIAL_DIF

    the diffuse identifier ;

    VISU_GL_LIGHT_MATERIAL_SHI

    the shiningness identifier ;

    VISU_GL_LIGHT_MATERIAL_SPE

    the specular identifier ;

    VISU_GL_LIGHT_MATERIAL_EMI

    the emissivity identifier ;

    VISU_GL_LIGHT_MATERIAL_N_VALUES

    number of used material identifiers.

    VisuGlLights

    typedef struct _VisuGlLights VisuGlLights;

    A short way to access _VisuGlLights objects.


    visu_gl_light_newDefault ()

    VisuGlLight *       visu_gl_light_newDefault            ();

    Create a new light with default value (white color and position in the front, right, top position of the screen).

    Returns :

    the newly created VisuGlLight. Use g_free() to deallocate this light.

    visu_gl_lights_add ()

    gboolean            visu_gl_lights_add                  (VisuGlLights *env,
                                                             VisuGlLight *light);

    This method adds the given light to the list of known lights declared in the given environnement. The light is not copied and should not be freed when stored in the environnement.

    env :

    a VisuGlLights object ;

    light :

    a VisuGlLight object.

    Returns :

    TRUE if visu_gl_lights_apply() should be called.

    visu_gl_lights_apply ()

    gboolean            visu_gl_lights_apply                (VisuGlLights *env);

    Apply all stored informations about lights to the current OpenGL context.

    env :

    a VisuGlLights object.

    Returns :

    TRUE if the "OpenGLAskForReDraw" signal should be emitted after a call to this method.

    visu_gl_lights_free ()

    void                visu_gl_lights_free                 (VisuGlLights *env);

    Free memory occupied by the given environnement.

    env :

    a VisuGlLights object.

    visu_gl_lights_getList ()

    GList *             visu_gl_lights_getList              (VisuGlLights *env);

    Retrieve the list of known VisuGlLight used by the given environnement.

    env :

    a VisuGlLights object.

    Returns :

    a list of VisuGlLight objects. Should not be freed. [transfer none][element-type VisuGlLight*]

    visu_gl_lights_new ()

    VisuGlLights *      visu_gl_lights_new                  ();

    Create a new VisuGlLights object. It contains no light when created. Use visu_gl_lights_add() to add new lights and visu_gl_lights_remove() to remove others.

    Returns :

    a newly created VisuGlLights. Use visu_gl_lights_free() to free such an object.

    visu_gl_lights_ref ()

    VisuGlLights *      visu_gl_lights_ref                  (VisuGlLights *env);

    Increase the ref counter.

    env :

    a VisuGlLights object.

    Returns :

    itself.

    Since 3.7


    visu_gl_lights_remove ()

    gboolean            visu_gl_lights_remove               (VisuGlLights *env,
                                                             VisuGlLight *light);

    This method removes the given light from the list of known lights declared in the given environnement. The light argument is first removed and then freed by a call to g_free().

    env :

    a VisuGlLights object ;

    light :

    a VisuGlLight object.

    Returns :

    TRUE if visu_gl_lights_apply() should be called.

    visu_gl_lights_removeAll ()

    gboolean            visu_gl_lights_removeAll            (VisuGlLights *env);

    Empty the list of stored lights. All stored lights objects are freed.

    env :

    a VisuGlLights object.

    Returns :

    TRUE if the visu_gl_lights_apply() should be called.

    visu_gl_lights_unref ()

    void                visu_gl_lights_unref                (VisuGlLights *env);

    Decrease the ref counter, free all memory if counter reachs zero.

    env :

    a VisuGlLights object.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/v-sim-map.html0000644000353400050620000011512712216331357020002 00000000000000 map

    map

    map — Describe how to handle and draw coloured map on a plane from a density field.

    Synopsis

                        VisuMap;
    enum                VisuMapExportFormat;
    void                visu_map_compute                    (VisuMap *map);
    void                visu_map_draw                       (VisuMap *map,
                                                             float prec,
                                                             ToolShade *shade,
                                                             float *rgb,
                                                             gboolean alpha);
    gboolean            visu_map_export                     (VisuMap *map,
                                                             ToolShade *shade,
                                                             float *rgb,
                                                             float precision,
                                                             gchar *filename,
                                                             VisuMapExportFormat format,
                                                             GError **error);
    void                visu_map_free                       (VisuMap *map);
    float *             visu_map_getFieldMinMax             (VisuMap *map);
    VisuPlane *         visu_map_getPlane                   (VisuMap *map);
    float *             visu_map_getScaledMinMax            (VisuMap *map);
    void                visu_map_init                       ();
    VisuMap *           visu_map_new                        ();
    VisuMap *           visu_map_newFromPlane               (VisuPlane *plane);
    VisuMap *           visu_map_ref                        (VisuMap *map);
    gboolean            visu_map_setField                   (VisuMap *map,
                                                             VisuScalarField *field,
                                                             ToolMatrixScalingFlag scale,
                                                             float *inputMinMax);
    gboolean            visu_map_setLevel                   (VisuMap *map,
                                                             float glPrec,
                                                             float gross,
                                                             float refLength);
    gboolean            visu_map_setLines                   (VisuMap *map,
                                                             guint nIsoLines,
                                                             float minmax[2]);
    gboolean            visu_map_setPlane                   (VisuMap *map,
                                                             VisuPlane *plane);
    void                visu_map_unref                      (VisuMap *map);
    

    Object Hierarchy

      GBoxed
       +----VisuMap
    

    Description

    A map is a coloured representation of a scalar field on a plane. To define a new map, use visu_map_newFromPlane() and use visu_map_setField() to associate a scalarfield to it.

    The representation of the map is done by an adaptive mesh of triangles. One can adjust the size of the smaller resolution by using visu_map_setLevel(). Finally the level of adaptiveness is chosen at rendering time by choosing a more or less crude precision argument to visu_map_draw().

    In adition to the colour representation, isolines can be drawn at given iso-values, see visu_map_setLines().

    An additionnal capability allows to export VisuMap into SVG or PDF vector files.

    Details

    VisuMap

    typedef struct _VisuMap VisuMap;

    All fields are private.

    Since 3.6


    enum VisuMapExportFormat

    typedef enum {
        VISU_MAP_EXPORT_SVG,
        VISU_MAP_EXPORT_PDF
    } VisuMapExportFormat;
    

    Possible export for the map, see visu_map_export().

    VISU_MAP_EXPORT_SVG

    SVG export ;

    VISU_MAP_EXPORT_PDF

    PDF export.

    Since 3.6


    visu_map_compute ()

    void                visu_map_compute                    (VisuMap *map);

    After a VisuPlane and a VisuScalarField has been defined (see visu_map_newFromPlane() and visu_map_setField()), the map is computed by refining a triangle approximation up to level defined by visu_map_setLevel(). The evaluation is lazy and calculation is indeed done, only if required level is lower than actual level. Calculation is done only for missing levels anyway.

    map :

    a VisuMap object.

    Since 3.6


    visu_map_draw ()

    void                visu_map_draw                       (VisuMap *map,
                                                             float prec,
                                                             ToolShade *shade,
                                                             float *rgb,
                                                             gboolean alpha);

    It draws the map with the given shade. prec give the level of refinement used to draw the map, 100 means normal and 200 means twice smaller level. If rgb is present, this colour is used for possible isolines. If alpha is TRUE, an alpha channel is added as a linear variation of the value of each vertex.

    map :

    a VisuMap object.

    prec :

    a pourcentage value.

    shade :

    a ToolShade object.

    rgb :

    a colour or NULL.

    alpha :

    a boolean.

    Since 3.6


    visu_map_export ()

    gboolean            visu_map_export                     (VisuMap *map,
                                                             ToolShade *shade,
                                                             float *rgb,
                                                             float precision,
                                                             gchar *filename,
                                                             VisuMapExportFormat format,
                                                             GError **error);

    Export the given map to the format, using the shade color. If rgb is provided and map has some isolines, they will be drawn with this colour, otherwise an inverse colour is used.

    map :

    a VisuMap object.

    shade :

    a ToolShade object.

    rgb :

    a colour (can be NULL).

    precision :

    a pourcentage for rendering quality.

    filename :

    the location to export to.

    format :

    the kind of format.

    error :

    a location to store an error.

    Returns :

    TRUE if no error.

    Since 3.6


    visu_map_free ()

    void                visu_map_free                       (VisuMap *map);

    Deallocate all memory related to map.

    map :

    a VisuMap object.

    Since 3.6


    visu_map_getFieldMinMax ()

    float *             visu_map_getFieldMinMax             (VisuMap *map);

    After map has been computed by visu_map_compute(), one can access the min and max values of the field as represented in the map. For scaled values, see visu_map_getScaledMinMax().

    map :

    a VisuMap object.

    Returns :

    two floats being the min and the max.

    Since 3.6


    visu_map_getPlane ()

    VisuPlane *         visu_map_getPlane                   (VisuMap *map);

    Retrieves the plane map is based on.

    map :

    a VisuMap object.

    Returns :

    a VisuPlane or NULL. [transfer none][allow-none]

    Since 3.7


    visu_map_getScaledMinMax ()

    float *             visu_map_getScaledMinMax            (VisuMap *map);

    After map has been computed by visu_map_compute(), one can access the scaled min and max values represented in the map. For field values, see visu_map_getFieldMinMax().

    map :

    a VisuMap object.

    Returns :

    two floats being the min and the max in [0;1].

    Since 3.6


    visu_map_init ()

    void                visu_map_init                       ();

    Initialise the map routines. Should not be called except at initialisation time.

    Since 3.7


    visu_map_new ()

    VisuMap *           visu_map_new                        ();

    Creates a new VisuMap object.

    Returns :

    a newly created VisuMap object. [transfer full]

    Since 3.6


    visu_map_newFromPlane ()

    VisuMap *           visu_map_newFromPlane               (VisuPlane *plane);

    Creates a new VisuMap object, projected on plane.

    plane :

    a VisuPlane object.

    Returns :

    a newly created VisuMap object.

    Since 3.6


    visu_map_ref ()

    VisuMap *           visu_map_ref                        (VisuMap *map);

    Increase the ref counter.

    map :

    a VisuMap object.

    Returns :

    itself.

    Since 3.7


    visu_map_setField ()

    gboolean            visu_map_setField                   (VisuMap *map,
                                                             VisuScalarField *field,
                                                             ToolMatrixScalingFlag scale,
                                                             float *inputMinMax);

    It associates the values of field to map. The calculation is not directly done, and a call to visu_map_compute() is necessary. If inputMinMax is provided, these values are used to scale the values of field to [0;1], otherwise the minMax values of the field itself are used. The scaling algorithm is defined by scale.

    map :

    a VisuMap object.

    field :

    a VisuScalarField object.

    scale :

    a flag.

    inputMinMax :

    two floats or NULL.

    Returns :

    TRUE if field is changed.

    Since 3.6


    visu_map_setLevel ()

    gboolean            visu_map_setLevel                   (VisuMap *map,
                                                             float glPrec,
                                                             float gross,
                                                             float refLength);

    Setup the level of recursivity in triangle calculation, depending on the current zoom level.

    map :

    a VisuMap object.

    glPrec :

    the global OpenGL precision for drawing (default is 1.).

    gross :

    current zoom level.

    refLength :

    a reference length (see visu_gl_camera_getRefLength()).

    Returns :

    TRUE if the level is actually changed.

    Since 3.6


    visu_map_setLines ()

    gboolean            visu_map_setLines                   (VisuMap *map,
                                                             guint nIsoLines,
                                                             float minmax[2]);

    Calculate nIsoLines equally distributed in minmax.

    map :

    a VisuMap object.

    nIsoLines :

    number of required isolines.

    minmax :

    span for isoline values.

    Returns :

    TRUE if lines are successfully calculated.

    Since 3.6


    visu_map_setPlane ()

    gboolean            visu_map_setPlane                   (VisuMap *map,
                                                             VisuPlane *plane);

    Set the internal VisuPlane of map to plane. All changed to plane will be automatically propagated to map. Use visu_map_setField() to choose the field to take values from, set the level precision with visu_map_setLevel() and finally call visu_map_compute() to get the map.

    map :

    a VisuMap object.

    plane :

    a VisuPlane object. [transfer full][allow-none]

    Returns :

    TRUE if internal plane is changed.

    Since 3.7


    visu_map_unref ()

    void                visu_map_unref                      (VisuMap *map);

    Decrease the ref counter, free all memory if counter reachs zero.

    map :

    a VisuMap object.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/v-sim-marks.html0000644000353400050620000014233412216331357020342 00000000000000 marks

    marks

    marks — Draw features on nodes, like measurement marks or highlights.

    Synopsis

                        VisuGlExtMarks;
                        VisuGlExtMarksClass;
    enum                VisuGlExtMarksStatus;
    gboolean            visu_gl_ext_marks_exportXMLFile     (VisuGlExtMarks *marks,
                                                             const gchar *filename,
                                                             int *nodes,
                                                             VisuGlExtInfosDrawId drawingMode,
                                                             guint drawingInfos,
                                                             GError **error);
    gboolean            visu_gl_ext_marks_getActive         (VisuGlExtMarks *marks,
                                                             guint nodeId);
    gboolean            visu_gl_ext_marks_getHighlightStatus
                                                            (VisuGlExtMarks *marks,
                                                             guint nodeId);
    GList *             visu_gl_ext_marks_getHighlightedList
                                                            (VisuGlExtMarks *marks);
    VisuGlExt *         visu_gl_ext_marks_getInternalList   (VisuGlExtMarks *marks);
    gchar *             visu_gl_ext_marks_getMeasurementLabels
                                                            (VisuGlExtMarks *marks);
    gchar *             visu_gl_ext_marks_getMeasurementStrings
                                                            (VisuGlExtMarks *marks,
                                                             VisuData *dataObj);
    VisuGlExtMarks *    visu_gl_ext_marks_new               (const gchar *name);
    gboolean            visu_gl_ext_marks_parseXMLFile      (VisuGlExtMarks *marks,
                                                             const gchar *filename,
                                                             GList **infos,
                                                             VisuGlExtInfosDrawId *drawingMode,
                                                             guint *drawingInfos,
                                                             GError **error);
    gboolean            visu_gl_ext_marks_removeMeasures    (VisuGlExtMarks *marks,
                                                             gint nodeId);
    void                visu_gl_ext_marks_setData           (VisuGlExtMarks *marks,
                                                             VisuData *data);
    gboolean            visu_gl_ext_marks_setDrawValues     (VisuGlExtMarks *marks,
                                                             gboolean status);
    void                visu_gl_ext_marks_setGlView         (VisuGlExtMarks *marks,
                                                             VisuGlView *view);
    gboolean            visu_gl_ext_marks_setHighlightedList
                                                            (VisuGlExtMarks *marks,
                                                             GList *lst,
                                                             VisuGlExtMarksStatus status);
    gboolean            visu_gl_ext_marks_setInfos          (VisuGlExtMarks *marks,
                                                             guint nodeId,
                                                             gboolean status);
    void                visu_gl_ext_marks_setInteractive    (VisuGlExtMarks *marks,
                                                             VisuInteractive *inter);
    

    Object Hierarchy

      GObject
       +----VisuGlExt
             +----VisuGlExtMarks
    

    Description

    VisuGlExtMarks is used to store a set of mark on a list of nodes. A mark can be a distance measurement, an angle measurement or an highlight. The measurement marks are automatically updated by listening to the "node-selection" signal. On the contrary, highlights are set, unset or toggled using visu_gl_ext_marks_setHighlightedList().

    In addition, VisuGlExtMarks can be export to or loaded from an XML file thanks to visu_gl_ext_marks_exportXMLFile() and visu_gl_ext_marks_parseXMLFile().

    Details

    VisuGlExtMarks

    typedef struct _VisuGlExtMarks VisuGlExtMarks;

    All fields are private.

    Since 3.6


    VisuGlExtMarksClass

    typedef struct _VisuGlExtMarksClass VisuGlExtMarksClass;

    An opaque structure defining the class of a VisuGlExtMarks objects.

    Since 3.6


    enum VisuGlExtMarksStatus

    typedef enum {
        MARKS_STATUS_KEEP,
        MARKS_STATUS_TOGGLE,
        MARKS_STATUS_SET,
        MARKS_STATUS_UNSET
    } VisuGlExtMarksStatus;
    

    Possible parameters to change mark status, see visu_gl_ext_marks_setHighlightedList() for instance.

    MARKS_STATUS_KEEP

    do not change the status of the mark ;

    MARKS_STATUS_TOGGLE

    change the status of the mark ;

    MARKS_STATUS_SET

    set the mark on ;

    MARKS_STATUS_UNSET

    unset a mark.

    Since 3.6


    visu_gl_ext_marks_exportXMLFile ()

    gboolean            visu_gl_ext_marks_exportXMLFile     (VisuGlExtMarks *marks,
                                                             const gchar *filename,
                                                             int *nodes,
                                                             VisuGlExtInfosDrawId drawingMode,
                                                             guint drawingInfos,
                                                             GError **error);

    This routines export to an XML file a description of selected nodes. If nodes is NULL, the nodes stored in the mark will be used instead.

    marks :

    a VisuGlExtMarks object.

    filename :

    a location to save to.

    nodes :

    an array of nodes, -1 terminated (can be NULL).

    drawingMode :

    a flag.

    drawingInfos :

    a flag.

    error :

    a location to store an error.

    Returns :

    TRUE if no error.

    Since 3.5


    visu_gl_ext_marks_getActive ()

    gboolean            visu_gl_ext_marks_getActive         (VisuGlExtMarks *marks,
                                                             guint nodeId);

    Retrieve if nodeId is implied any measurement marks stored in mark.

    marks :

    a VisuGlExtMarks object.

    nodeId :

    a node id.

    Returns :

    TRUE if nodeId participate to any mark (distance, angle...).

    visu_gl_ext_marks_getHighlightStatus ()

    gboolean            visu_gl_ext_marks_getHighlightStatus
                                                            (VisuGlExtMarks *marks,
                                                             guint nodeId);

    Nodes can be highlighted.

    marks :

    a VisuGlExtMarks object.

    nodeId :

    a node id (ranging from 0).

    Returns :

    TRUE if nodeId has an highlight.

    Since 3.7


    visu_gl_ext_marks_getHighlightedList ()

    GList *             visu_gl_ext_marks_getHighlightedList
                                                            (VisuGlExtMarks *marks);

    marks has a list of mark for some nodes. These marks are only highlight marks.

    marks :

    a VisuGlExtMarks object ;

    Returns :

    list of highlighted nodes (starting from 0), should freed with g_list_free(). [element-type guint32][transfer container]

    Since 3.6


    visu_gl_ext_marks_getInternalList ()

    VisuGlExt *         visu_gl_ext_marks_getInternalList   (VisuGlExtMarks *marks);

    Return an additional list used internaly.

    marks :

    a VisuGlExtMarks object.

    Returns :

    a VisuGlExt object. [transfer none]

    Since 3.7


    visu_gl_ext_marks_getMeasurementLabels ()

    gchar *             visu_gl_ext_marks_getMeasurementLabels
                                                            (VisuGlExtMarks *marks);

    Exports as a string the ids of nodes for measurement marks.

    marks :

    a VisuGlExtMarks object.

    Returns :

    a newly allocated string.

    Since 3.6


    visu_gl_ext_marks_getMeasurementStrings ()

    gchar *             visu_gl_ext_marks_getMeasurementStrings
                                                            (VisuGlExtMarks *marks,
                                                             VisuData *dataObj);

    Exports as a string all measurements stored in marks.

    marks :

    a VisuGlExtMarks object.

    dataObj :

    the VisuData to apply the measurements to.

    Returns :

    a newly allocated string.

    Since 3.6


    visu_gl_ext_marks_new ()

    VisuGlExtMarks *    visu_gl_ext_marks_new               (const gchar *name);

    Create a new VisuGlExtMarks object. Make it listen to "node-selection" signal to update itself automatically.

    name :

    a possible name for the VisuGlExt. [allow-none]

    Returns :

    the newly created object.

    visu_gl_ext_marks_parseXMLFile ()

    gboolean            visu_gl_ext_marks_parseXMLFile      (VisuGlExtMarks *marks,
                                                             const gchar *filename,
                                                             GList **infos,
                                                             VisuGlExtInfosDrawId *drawingMode,
                                                             guint *drawingInfos,
                                                             GError **error);

    This routines read from an XML file the description of selected nodes, mark is updated accordingly.

    marks :

    a VisuGlExtMarks object.

    filename :

    a location to save to.

    infos :

    a location to a GList. [element-type guint32][out]

    drawingMode :

    a location to a flag.

    drawingInfos :

    a location to a flag.

    error :

    a location to store an error.

    Returns :

    TRUE if no error.

    Since 3.5


    visu_gl_ext_marks_removeMeasures ()

    gboolean            visu_gl_ext_marks_removeMeasures    (VisuGlExtMarks *marks,
                                                             gint nodeId);

    This routine scans the mark to remove all marks of distance or angle where nodeId is implied in.

    marks :

    a VisuGlExtMarks object.

    nodeId :

    a node id.

    Returns :

    TRUE is mark is changed.

    visu_gl_ext_marks_setData ()

    void                visu_gl_ext_marks_setData           (VisuGlExtMarks *marks,
                                                             VisuData *data);

    Attach the given marks to data. marks will be updated if data is changed and internal list of marks is updated with the new nodes of data.

    marks :

    a VisuGlExtMarks object.

    data :

    a VisuData object.

    visu_gl_ext_marks_setDrawValues ()

    gboolean            visu_gl_ext_marks_setDrawValues     (VisuGlExtMarks *marks,
                                                             gboolean status);

    Change if the measurements are printed or not (distance length, or angles...).

    marks :

    a VisuGlExtMarks object.

    status :

    a boolean.

    Returns :

    TRUE if marks is modified.

    visu_gl_ext_marks_setGlView ()

    void                visu_gl_ext_marks_setGlView         (VisuGlExtMarks *marks,
                                                             VisuGlView *view);

    Use the given view to render marks.

    marks :

    a VisuGlExtMarks object.

    view :

    a VisuGlView object.

    Since 3.7


    visu_gl_ext_marks_setHighlightedList ()

    gboolean            visu_gl_ext_marks_setHighlightedList
                                                            (VisuGlExtMarks *marks,
                                                             GList *lst,
                                                             VisuGlExtMarksStatus status);

    marks has a list of mark for some nodes. These marks can be highlight (or distance, angles...). Depending on status values, the mark may be switch on or off.

    marks :

    a VisuGlExtMarks object ;

    lst :

    a set of node ids (0 started) ;. [element-type guint32]

    status :

    changing command.

    Returns :

    TRUE if redraw needed.

    Since 3.6


    visu_gl_ext_marks_setInfos ()

    gboolean            visu_gl_ext_marks_setInfos          (VisuGlExtMarks *marks,
                                                             guint nodeId,
                                                             gboolean status);

    Depending on status, it removes all measurements from nodeId or it calculate all first neighbour relations of nodeId.

    Return: TRUE if marks is changed.

    marks :

    a VisuGlExtMarks object.

    nodeId :

    a node id.

    status :

    a boolean.

    visu_gl_ext_marks_setInteractive ()

    void                visu_gl_ext_marks_setInteractive    (VisuGlExtMarks *marks,
                                                             VisuInteractive *inter);

    Listen to "node-selection" signal to update marks.

    marks :

    a VisuGlExtMarks object.

    inter :

    a VisuInteractive object. [transfer full][allow-none]

    Since 3.7

    Signal Details

    The "highlightChanged" signal

    void                user_function                      (VisuGlExtMarks *marks,
                                                            gpointer        lst,
                                                            gpointer        user_data)      : No Hooks

    The list of highlighted nodes has been modified.

    marks :

    the object emitting the signal.

    lst :

    a list of node ids (starting from 0).

    user_data :

    user data set when the signal handler was connected.

    Since 3.6


    The "measurementChanged" signal

    void                user_function                      (VisuGlExtMarks *marks,
                                                            gpointer        user_data)      : No Hooks

    The list of measurements has been changed.

    marks :

    the object emitting the signal.

    user_data :

    user data set when the signal handler was connected.

    Since 3.6

    v_sim-3.7.0/Documentation/reference/html/v-sim-panelAxes.html0000644000353400050620000001224712216331357021144 00000000000000 panelAxes

    panelAxes

    panelAxes — The tab where axes, box, scale and legend are setup.

    Description

    Nothing tunable here.

    Details

    visu_ui_panel_axes_init ()

    VisuUiPanel *       visu_ui_panel_axes_init             ();

    Should be used in the list declared in externalModules.h to be loaded by V_Sim on start-up. This routine will create the VisuUiPanel where the axes and the label stuffs can be tuned, such as their colour, create scales...

    Returns :

    a newly created VisuUiPanel object.

    visu_ui_panel_axes_setAxesExtension ()

    void                visu_ui_panel_axes_setAxesExtension (VisuGlExtAxes *axes);

    Set the current axes extension handled by this VisuUiPanel.

    axes :

    a VisuGlExtAxes object. [transfer full][allow-none]

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/v-sim-panelBrowser.html0000644000353400050620000003627712216331357021700 00000000000000 panelBrowser

    panelBrowser

    panelBrowser — A tab to view a list of files and quickly change from one to another.

    Description

    One can display a message about the file list by calling visu_ui_panel_browser_setMessage(). It is possible also to change the browser directory or directories with visu_ui_panel_browser_setCurrentDirectory().

    Details

    VISU_UI_PANEL_BROWSER_NEXT

    #define VISU_UI_PANEL_BROWSER_NEXT     1
    

    Value that give the direction when the selector is moved around file list. See visu_ui_panel_browser_getNextSelected().


    VISU_UI_PANEL_BROWSER_PREVIOUS

    #define VISU_UI_PANEL_BROWSER_PREVIOUS 0
    

    Value that give the direction when the selector is moved around file list. See visu_ui_panel_browser_getNextSelected().


    visu_ui_panel_browser_getCurrentSelected ()

    gboolean            visu_ui_panel_browser_getCurrentSelected
                                                            (GtkTreePath **path,
                                                             GtkTreeIter *iterSelected);

    Get iter and path of the currently sleected file.

    path :

    a pointer to returned the path of the currently selected file ;

    iterSelected :

    a pointer to store the currently selected iter.

    Returns :

    TRUE if one exists.

    visu_ui_panel_browser_getNextSelected ()

    gboolean            visu_ui_panel_browser_getNextSelected
                                                            (GtkTreePath **path,
                                                             GtkTreeIter *iterSelected,
                                                             int direction);

    Change the selected file in the browser given the direction.

    path :

    a pointer to returned the path of the newly selected file ;

    iterSelected :

    a pointer to store the newly selected iter ;

    direction :

    VISU_UI_PANEL_BROWSER_NEXT or VISU_UI_PANEL_BROWSER_PREVIOUS.

    Returns :

    TRUE if one exists.

    visu_ui_panel_browser_init ()

    VisuUiPanel *       visu_ui_panel_browser_init          ();

    Should be used in the list declared in externalModules.h to be loaded by V_Sim on start-up. This routine will create the VisuUiPanel handling the browser.

    Returns :

    a newly created VisuUiPanel object.

    visu_ui_panel_browser_setCurrentDirectories ()

    void                visu_ui_panel_browser_setCurrentDirectories
                                                            (gchar **dirs);

    Change the directories for the browser. It is the same routine than visu_ui_panel_browser_setCurrentDirectory(), but several directories can be loaded at once. But internally, contrary to visu_ui_panel_browser_setCurrentDirectory() the given array must not be freed since it is not copied.

    dirs :

    a NULL terminated array of directories to be loaded.

    visu_ui_panel_browser_setCurrentDirectory ()

    void                visu_ui_panel_browser_setCurrentDirectory
                                                            (const gchar *dir);

    Change the directory for the browser. The directory is not parsed immediately but only when the subpanel becomes visible.

    dir :

    the path of a directory.

    visu_ui_panel_browser_setMessage ()

    void                visu_ui_panel_browser_setMessage    (const gchar *message,
                                                             GtkMessageType message_type);

    This routine is used to give the user a message. This message can be mere information or a warning or an error.

    message :

    a string to be displaied.

    message_type :

    the kind of message.

    Since 3.6

    v_sim-3.7.0/Documentation/reference/html/v-sim-panelConfig.html0000644000353400050620000002543112216331357021450 00000000000000 panelConfig

    panelConfig

    panelConfig — The tab where miscellaneous options are setup.

    Description

    Nothing special here.

    Details

    visu_ui_panel_config_getArea ()

    GtkWidget *         visu_ui_panel_config_getArea        ();

    This routine can be used to extend the configure panel from plug-ins.

    Returns :

    a GtkBox containing elements of the configure panel. [transfer none]

    Since 3.7


    visu_ui_panel_config_init ()

    VisuUiPanel *       visu_ui_panel_config_init           (VisuUiMain *ui);

    Should be used in the list declared in externalModules.h to be loaded by V_Sim on start-up. This routine will create the VisuUiPanel where the configuration stuff can be done, such as the auto-reloading.

    ui :

    a VisuUiMain object.

    Returns :

    a newly created VisuUiPanel object.

    visu_ui_panel_config_setAutomaticRefresh ()

    void                visu_ui_panel_config_setAutomaticRefresh
                                                            (VisuUiRenderingWindow *window,
                                                             gboolean bool);

    V_Sim can poll the rendered file at periodic intervals to check if the file has been modified. If true, the file is reloaded. Turn this functionality on or off with this method. See visu_ui_panel_config_setRefreshPeriod() to tune the period of the polling.

    window :

    the VisuUiRenderingWindow to associated the auto refresh ;

    bool :

    a boolean value.

    visu_ui_panel_config_setRefreshPeriod ()

    void                visu_ui_panel_config_setRefreshPeriod
                                                            (VisuUiRenderingWindow *window,
                                                             float val);

    V_Sim can poll the rendered file at periodic intervals. Use this method to tune the period. See visu_ui_panel_config_setAutomaticRefresh() to enable this functionality.

    window :

    the VisuUiRenderingWindow to associated the auto refresh ;

    val :

    a floating point value in milliseconds.

    visu_ui_panel_config_setTabView ()

    void                visu_ui_panel_config_setTabView     (gboolean viewed);

    The note can show its tabs or not. Change this with that method.

    viewed :

    a boolean value.
    v_sim-3.7.0/Documentation/reference/html/v-sim-panelDataFile.html0000644000353400050620000003605412216331357021717 00000000000000 panelDataFile

    panelDataFile

    panelDataFile — The tab where to configure the action of an external data file on colourisation of nodes.

    Description

    The widgets are organised in three categories. The first is used to normalised the inputs, see visu_ui_panel_colorization_setManualRange() or visu_ui_panel_colorization_setRangeMode(). The second category is used for colourisation, see visu_ui_panel_colorization_setPresetShade(). Finally the last category is about post-processing.

    Details

    visu_ui_panel_colorization_init ()

    VisuUiPanel *       visu_ui_panel_colorization_init     ();

    Should be used in the list declared in externalModules.h to be loaded by V_Sim on start-up. This routine will create the VisuUiPanel where the colouring stuff can be done, such as choosing a colour shade, opening a file, setting boundaries...

    Returns :

    a newly created VisuUiPanel object.

    visu_ui_panel_colorization_load ()

    gboolean            visu_ui_panel_colorization_load     (VisuData *visuData,
                                                             const gchar *file,
                                                             gboolean *new);

    Read the given data file and associate the values of each column to the node. It does not update the widgets of the panel. This is done to allow to change the values of the colouration before drawing the widgets. See visu_ui_panel_colorization_update() to do it.

    visuData :

    the VisuData object to associated the data to ;

    file :

    the file to read ;

    new :

    return TRUE if the loaded data are associated for the first time to visuData.

    Returns :

    TRUE if VisuNodeArray::RenderingChanged should be emitted.

    visu_ui_panel_colorization_setManualRange ()

    void                visu_ui_panel_colorization_setManualRange
                                                            (float min,
                                                             float max,
                                                             int column);

    Set the clamping range to [min;max] for column. Column ids range from 0 to (max number of column - 1). Use -3, -2 and -1 for x coordinates, y and z.

    min :

    a float value.

    max :

    a float value.

    column :

    the column to apply the manual range to.

    Since 3.7


    visu_ui_panel_colorization_setPresetShade ()

    gboolean            visu_ui_panel_colorization_setPresetShade
                                                            (ToolShade *shade);

    Change the preset shade used to colourise the data.

    shade :

    a ToolShade object.

    Returns :

    TRUE if a ToolShade is set.

    visu_ui_panel_colorization_setRangeMode ()

    void                visu_ui_panel_colorization_setRangeMode
                                                            (VisuColorizationInputScaleId mode);

    Set how data are clamp into [0;1].

    mode :

    auto or manual scaling mode.

    Since 3.7


    visu_ui_panel_colorization_setUsed ()

    void                visu_ui_panel_colorization_setUsed  (gboolean used);

    Set if the panel is used or not.

    used :

    a boolean.

    visu_ui_panel_colorization_update ()

    void                visu_ui_panel_colorization_update   (VisuData *visuData);

    Update the widgets depending on the colouration associated to the given VisuData object.

    visuData :

    the VisuData object to associated the data to.
    v_sim-3.7.0/Documentation/reference/html/v-sim-panelElements.html0000644000353400050620000002730212216331357022016 00000000000000 panelElements

    panelElements

    panelElements — The tab where VisuElement characteristics can be tuned.

    Description

    It is possible to get the list of selected elements by calling visu_ui_panel_elements_getSelected().

    Details

    VISU_UI_PANEL_ELEMENTS

    #define VISU_UI_PANEL_ELEMENTS visu_ui_panel_elements_getStatic()
    

    Retrieve the widget of the panel of VisuElement.

    Returns :

    a GtkWidget owned by V_Sim.

    VisuUiPanelElementsChangeFunc ()

    void                (*VisuUiPanelElementsChangeFunc)    (GList *elements);

    Methods from this interface are called whenever the currently selected elements are changed.

    elements :

    a list of all VisuElements that are selected.

    visu_ui_panel_elements_getSelected ()

    GList *             visu_ui_panel_elements_getSelected  ();

    This method is used to get a list of selected VisuElement from the element selector of this panel.

    Returns :

    a list of VisuElement, the list should be freed after use by g_list_free(). [transfer container][element-type VisuElement*]

    Since 3.6


    visu_ui_panel_elements_getStatic ()

    GtkWidget *         visu_ui_panel_elements_getStatic    ();

    Retrives a pointer on this VisuUiPanel.

    Returns :

    a pointer owned by V_Sim. [transfer none]

    visu_ui_panel_elements_init ()

    VisuUiPanel *       visu_ui_panel_elements_init         ();

    Should be used in the list declared in externalModules.h to be loaded by V_Sim on start-up. This routine will create the VisuUiPanel where the element stuff can be done, such as choosing a colour, setting the radius of spheres...

    Returns :

    a newly created VisuUiPanel object.

    visu_ui_panel_elements_setMethod ()

    void                visu_ui_panel_elements_setMethod    (VisuRendering *method,
                                                             VisuUiPanelElementsChangeFunc change,
                                                             VisuUiNewWidgetFunc create);

    This method allows to initiate the methods to deal with the rendering specific interfaces.

    method :

    a pointer on the method this interface is associated to ;

    change :

    the method to be called whenever the element selection is cahnged ;. [scope call]

    create :

    the method to be called when the interface must be built. [scope call]
    v_sim-3.7.0/Documentation/reference/html/v-sim-panelFogBgColor.html0000644000353400050620000001156412216331357022230 00000000000000 panelFogBgColor

    panelFogBgColor

    panelFogBgColor — The widget to tune the background and the fog.

    Synopsis

    VisuUiPanel *       visu_ui_panel_bg_init               ();
    void                visu_ui_panel_bg_setImage           (const gchar *filename);
    

    Description

    This is the user interface for fog and the background. The background can be either uniform or use a bitmap picture. The fog can be of different colours, custom or background.

    Details

    visu_ui_panel_bg_init ()

    VisuUiPanel *       visu_ui_panel_bg_init               ();

    Should be used in the list declared in externalModules.h to be loaded by V_Sim on start-up. This routine will create the VisuUiPanel where the fog and the background colour stuff can be tuned, such the position of the fog, its colour...

    Returns :

    a newly created VisuUiPanel object.

    visu_ui_panel_bg_setImage ()

    void                visu_ui_panel_bg_setImage           (const gchar *filename);

    Set the background image.

    filename :

    a path to a file.
    v_sim-3.7.0/Documentation/reference/html/v-sim-panelGeometry.html0000644000353400050620000001447512216331357022044 00000000000000 panelGeometry

    panelGeometry

    panelGeometry — This tab gathers the geometry operation on a VisuData, like periodic translation, physical units, ...

    Description

    Nothing tunable here.

    Details

    visu_ui_panel_geometry_getPaths ()

    VisuPaths *         visu_ui_panel_geometry_getPaths     ();

    This panel can store a VisuPaths object.

    Returns :

    the stored VisuPaths object. [transfer none]

    Since 3.7


    visu_ui_panel_geometry_init ()

    VisuUiPanel *       visu_ui_panel_geometry_init         ();

    Should be used in the list declared in externalModules.h to be loaded by V_Sim on start-up. This routine will create the VisuUiPanel where the box stuff can be tuned, such as the bounding box, its colour, and the actions linked to the periodicity (translation, dupplication...).

    Returns :

    a newly created VisuUiPanel object.

    visu_ui_panel_geometry_runTests ()

    void                visu_ui_panel_geometry_runTests     (GError **error);

    Internal test routine, used by the test suite.

    error :

    the location of a nullified GError pointer.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/v-sim-panelMap.html0000644000353400050620000003261412216331357020761 00000000000000 panelMap

    panelMap

    panelMap — The widget to create coloured map.

    Description

    This is the user interface for the coloured maps. For a plane, a scalar field and a shade, it is possible to draw one coloured plane. The available planes are taken from the panelVisuPlane subpanel and the scalar field for the panelSurfaces.

    Details

    visu_ui_panel_map_init ()

    VisuUiPanel *       visu_ui_panel_map_init              ();

    Should be used in the list declared in externalModules.h to be loaded by V_Sim on start-up. This routine will create the VisuUiPanel where the coloured map stuff can be done, such as choosing a plane, associating a scalar field...

    Returns :

    a newly created VisuUiPanel object.

    visu_ui_panel_map_setData ()

    VisuMap *           visu_ui_panel_map_setData           (guint planeId,
                                                             guint scalarFieldId,
                                                             guint shadeId);

    Change the values of the three combobox of this panel.

    planeId :

    a entry for the plane combobox ;

    scalarFieldId :

    a entry for the scalar field combobox ;

    shadeId :

    a entry for the shade combobox.

    Returns :

    the associated VisuMap. [transfer none]

    Since 3.4


    visu_ui_panel_map_setIsolinesColor ()

    void                visu_ui_panel_map_setIsolinesColor  (float *color);

    Change the colour of drawn isolines. If color is NULL, then the specific colour is unchecked and inversed colours are used.

    color :

    an RGB value (can be NULL).

    Since 3.5


    visu_ui_panel_map_setMinMax ()

    void                visu_ui_panel_map_setMinMax         (float *minMax);

    Set-up the minimum and maximum scaling values. In case minMax is NULL, then the automatic normalisation is chosen.

    minMax :

    two floats containing min and max values. Can be NULL.

    Since 3.6


    visu_ui_panel_map_setNIsolines ()

    void                visu_ui_panel_map_setNIsolines      (guint nIsoLines);

    Change the number of drawn isolines.

    nIsoLines :

    a value.

    Since 3.4


    visu_ui_panel_map_setPrecision ()

    void                visu_ui_panel_map_setPrecision      (guint prec);

    Set the precision used to render the maps. At 200, there is no adaptive mesh.

    prec :

    a pourcentage.

    Since 3.6


    visu_ui_panel_map_setScale ()

    void                visu_ui_panel_map_setScale          (ToolMatrixScalingFlag scale);

    Set the scaling method.

    scale :

    the status.

    Since 3.4


    visu_ui_panel_map_update ()

    void                visu_ui_panel_map_update            (VisuMap *map);

    Rebuild map depending on parameters selected in the interface. If map is NULL, rebuild all maps.

    map :

    a VisuMap to update (parameters may have changed). [allow-none]

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/v-sim-panelMethod.html0000644000353400050620000001577312216331357021473 00000000000000 panelMethod

    panelMethod

    panelMethod — The tab where drawing method is chosen (atomic or spin).

    Description

    This tab has an area to display custom widgets according to the selected rendering method, see visu_ui_panel_method_set().

    Details

    VisuUiPanelDestroyFunc ()

    void                (*VisuUiPanelDestroyFunc)           (void);

    Prototype of method called when the rendering method widget is destroyed.


    visu_ui_panel_method_init ()

    VisuUiPanel *       visu_ui_panel_method_init           ();

    Should be used in the list declared in externalModules.h to be loaded by V_Sim on start-up. This routine will create the VisuUiPanel where the stuff about a rendering method can be tuned, such as choosing the current rendering method, its parameters...

    Returns :

    a newly created VisuUiPanel object.

    visu_ui_panel_method_set ()

    void                visu_ui_panel_method_set            (VisuRendering *method,
                                                             VisuUiNewWidgetFunc create,
                                                             VisuUiPanelDestroyFunc destroy);

    This method allows to initiate the method to deal with the interface.

    method :

    a RenderingMethod ;

    create :

    a method returning a widget ;

    destroy :

    a method to detached, signals, free everything from the created widget.
    v_sim-3.7.0/Documentation/reference/html/v-sim-panelOpenGL.html0000644000353400050620000000722712216331357021372 00000000000000 panelOpenGL

    panelOpenGL

    panelOpenGL — The tab where OpenGL options like lights or quality are setup.

    Description

    Nothing tunable here.

    Details

    visu_ui_panel_gl_init ()

    VisuUiPanel *       visu_ui_panel_gl_init               ();

    Should be used in the list declared in externalModules.h to be loaded by V_Sim on start-up. This routine will create the VisuUiPanel where the OpenGL stuff can be tuned, such as antialise lines, drawing precision...

    Returns :

    a newly created VisuUiPanel object.
    v_sim-3.7.0/Documentation/reference/html/v-sim-panelPlanes.html0000644000353400050620000005265212216331357021472 00000000000000 panelPlanes

    panelPlanes

    panelPlanes — The tab where planes are defined.

    Description

    It is possible to get the list of planes using visu_ui_panel_planes_getAll(). One can also access to the list store hosting the planes by calling visu_ui_panel_planes_getList().

    Details

    enum VisuUiPanelPlanesColumnId

    typedef enum {
        VISU_UI_PANEL_PLANES_DRAWN,
        VISU_UI_PANEL_PLANES_LABEL,
        VISU_UI_PANEL_PLANES_HIDE_IS_ON,
        VISU_UI_PANEL_PLANES_HIDDEN_SIDE,
        VISU_UI_PANEL_PLANES_COLOR_PIXBUF,
        VISU_UI_PANEL_PLANES_POINTER,
        VISU_UI_PANEL_PLANES_N_COLUMNS
    } VisuUiPanelPlanesColumnId;
    

    Thesse are the description of the columns stored in the GtkListStore of this panel. See visu_ui_panel_planes_getList() to access this liststore.

    VISU_UI_PANEL_PLANES_DRAWN

    a boolean, code if the plane is drawn or not.

    VISU_UI_PANEL_PLANES_LABEL

    a string, the description of the plane (normal vector and distance to origin).

    VISU_UI_PANEL_PLANES_HIDE_IS_ON

    a boolean, code if the plane hide elements on one side.

    VISU_UI_PANEL_PLANES_HIDDEN_SIDE

    a boolean, code for the side.

    VISU_UI_PANEL_PLANES_COLOR_PIXBUF

    a pixbuf, a small colored square.

    VISU_UI_PANEL_PLANES_POINTER

    the pointer to the VisuPlane object.

    VISU_UI_PANEL_PLANES_N_COLUMNS

    the number of columns.

    visu_ui_panel_planes_add ()

    gboolean            visu_ui_panel_planes_add            (VisuPlane *plane,
                                                             gboolean hidingStatus,
                                                             gboolean hidingSide);

    Add a plane to the list of planes.

    plane :

    a VisuPlane object. [transfer full]

    hidingStatus :

    if plane is used for hiding.

    hidingSide :

    the side hiding is done on.

    Returns :

    TRUE if redraw is needed.

    Since 3.7


    visu_ui_panel_planes_applyHidingScheme ()

    gboolean            visu_ui_panel_planes_applyHidingScheme
                                                            (VisuData *data);

    Use this method to hide nodes according to current list of planes and hiding policy.

    data :

    a VisuData object to associate the planes to (required to compute the intersection with the bounding box) ;

    Returns :

    TRUE if the redraw signal should be emitted.

    visu_ui_panel_planes_getAll ()

    VisuPlane **        visu_ui_panel_planes_getAll         (gboolean maskingOnly);

    Return a newly created list (to be freed with g_list_free()) of all planes available in the subpanel. This list can be restricted to masking planes only with the help of argument maskingOnly.

    maskingOnly :

    a boolean.

    Returns :

    a newly created array NULL terminated that must be freed with g_free(). [array zero-terminated=1][transfer container]

    visu_ui_panel_planes_getList ()

    GtkListStore *      visu_ui_panel_planes_getList        ();

    This method gives read access to the GtkListStore used to store the planes.

    Returns :

    the GtkListStore used by this panel to store its planes. It should be considered read-only. [transfer none]

    visu_ui_panel_planes_init ()

    VisuUiPanel *       visu_ui_panel_planes_init           ();

    Should be used in the list declared in externalModules.h to be loaded by V_Sim on start-up. This routine will create the VisuUiPanel where the plane stuff can be done, such as creating a plane, masking nodes, changing the orientation or the colour...

    Returns :

    a newly created VisuUiPanel object.

    visu_ui_panel_planes_load ()

    gboolean            visu_ui_panel_planes_load           (VisuData *dataObj,
                                                             gchar *filename,
                                                             GError **error);

    This method is used to parse and load an XML file containing planes informations. The panel must have been initialised before calling this method. The error argument is required (can't be NULL), since it is set if something went wrong.

    dataObj :

    a VisuData object to associate the planes to (required to compute the intersection with the bounding box) ;

    filename :

    the path to the file to load ;

    error :

    a pointer to a GError handler to reccord possible failure.

    Returns :

    TRUE if visu_ui_panel_planes_applyHidingScheme().

    visu_ui_panel_planes_setRendered ()

    gboolean            visu_ui_panel_planes_setRendered    (VisuPlane *plane,
                                                             gboolean status);

    Change the visibility of the plane through the Gtk interface, then the widgets are also update and the list of drawn planes is rebuilt. To only directly change the visibility of one plane use visu_plane_setRendered() instead.

    plane :

    a VisuPlane object ;

    status :

    a boolean.

    Returns :

    TRUE if the redraw sigbnal should be emitted.

    visu_ui_panel_planes_setUsed ()

    gboolean            visu_ui_panel_planes_setUsed        (gboolean value);

    When value is TRUE, the planes are used and drawn. If the panel has not been created yet, a call to this function will do it.

    value :

    a boolean.

    Returns :

    TRUE if the hiding scheme has been applied.
    v_sim-3.7.0/Documentation/reference/html/v-sim-panelSurfaces.html0000644000353400050620000012047412216331357022021 00000000000000 panelSurfaces

    panelSurfaces

    panelSurfaces — Gtk interface to load isosurfaces.

    Description

    This module contains the panel used to draw isosurfaces. From it, you can draw isosurfaces on screen after they are loaded through the surfaces module. You can also access tools to manage and create .surf files, these tools are related to the panelSurfacesTools module.

    Details

    VISU_UI_SURFACE_NAME_CHOOSE

    #define VISU_UI_SURFACE_NAME_CHOOSE "<span size=\"smaller\"><i>"VISU_UI_SURFACE_NAME_STR"</i></span>"
    

    The string used in the tree view to represent the surfaces that don't share surface resources.


    VISU_UI_SURFACE_NAME_STR

    #define VISU_UI_SURFACE_NAME_STR    "Choose an id name"
    

    The default string used to name surfaces that are not associated to any public surface ressource.


    enum VisuUiSurfacesFieldId

    typedef enum {
        VISU_UI_SURFACES_FIELD_LABEL,
        VISU_UI_SURFACES_FIELD_POINTER,
        VISU_UI_SURFACES_FIELD_N_COLUMNS
    } VisuUiSurfacesFieldId;
    

    Thesse are the description of the columns stored in the GtkListStore of this panel. See visu_ui_panel_surfaces_getFields() to access this liststore.

    VISU_UI_SURFACES_FIELD_LABEL

    a string, the description of the scalar field.

    VISU_UI_SURFACES_FIELD_POINTER

    the pointer to the VisuScalarField object.

    VISU_UI_SURFACES_FIELD_N_COLUMNS

    the number of columns.

    visu_ui_panel_surfaces_add ()

    void                visu_ui_panel_surfaces_add          (gchar *filename,
                                                             float value,
                                                             gchar *name);

    Create and add a surface created from the given scalar field. This field must already be loaded. If name is not given, the surface will be called "Isosurface id" where id is an increasing counter.

    filename :

    the name of the scalar field from which to add a surface ;

    value :

    the iso value ;

    name :

    the name used to identify the new surface (can be NULL).

    visu_ui_panel_surfaces_addField ()

    void                visu_ui_panel_surfaces_addField     (VisuScalarField *field,
                                                             GtkTreeIter *iter);

    This routine can be used to add a VisuScalarField to the tree view. iter is then populated with the row it has been inserted to.

    field :

    a VisuScalarField object. [transfer full]

    iter :

    a location to store the iter. [out caller-allocates]

    Since 3.7


    visu_ui_panel_surfaces_addSurfaces ()

    void                visu_ui_panel_surfaces_addSurfaces  (VisuSurfaces *surf,
                                                             const gchar *name,
                                                             GtkTreeIter *iter);

    This routine can be used to add a VisuSurfaces to the tree view. iter is then populated with the row it has been inserted to.

    surf :

    a VisuSurfaces object. [transfer full]

    name :

    a name surf comes from.

    iter :

    a location to store the iter. [out caller-allocates]

    Since 3.7


    visu_ui_panel_surfaces_compute ()

    const VisuSurfaces * visu_ui_panel_surfaces_compute     (GtkTreeIter *iter,
                                                             const float *values,
                                                             const gchar **names,
                                                             guint nValues);

    This routine will generate nValues surfaces for the VisuScalarField located at iter. It will redraw if necessary.

    iter :

    a GtkTreeIter.

    values :

    values to create surfaces at. [array length=nValues]

    names :

    names for the new surfaces. [array length=nValues]

    nValues :

    number of surfaces to create.

    Returns :

    a VisuSurfaces object. [transfer none]

    Since 3.7


    visu_ui_panel_surfaces_computeAuto ()

    const VisuSurfaces * visu_ui_panel_surfaces_computeAuto (GtkTreeIter *iter);

    Add new surfaces to the entry pointed by iter. This entry must be a VisuScalarField object. This routine will redraw if necessary.

    iter :

    a GtkTreeIter.

    Returns :

    a VisuSurfaces object. [transfer none]

    Since 3.7


    visu_ui_panel_surfaces_editProperties ()

    void                visu_ui_panel_surfaces_editProperties
                                                            (GtkTreeIter *iter);

    Opens a new window allowing to edit surface properties.

    iter :

    the currently selected row iter (or NULL).

    visu_ui_panel_surfaces_exportXMLFile ()

    gboolean            visu_ui_panel_surfaces_exportXMLFile
                                                            (const gchar *filename,
                                                             GError **error);

    Export to filename the list of isosurfaces values of the selected scalar-field file.

    filename :

    a filename to export to.

    error :

    a location to store an error. [allow-none]

    Returns :

    TRUE if everything goes right.

    Since 3.7


    visu_ui_panel_surfaces_generateValues ()

    GtkWidget *         visu_ui_panel_surfaces_generateValues
                                                            (int *nbValues,
                                                             float **values,
                                                             gchar **name,
                                                             float minVal,
                                                             float maxVal);

    This method opens a little dialog window that is made to help the user enter a list of values for creation of iso-surfaces. These values are generated between minVal and maxVal.

    nbValues :

    a location of an integer to store the number of generated values ;

    values :

    a pointer on a float array. The target of this pointer must be NULL and it will be allocated after a call to this method. Use g_free() after use to free it.

    name :

    a pointer to store a name. The target of this pointer must be NULL on enter. It is associated only if a name is given.

    minVal :

    the minimum value for the range ;

    maxVal :

    the maximum value for the range.

    Returns :

    the dialog widget. [transfer full]

    visu_ui_panel_surfaces_getFields ()

    GtkListStore *      visu_ui_panel_surfaces_getFields    ();

    This method gives read access to the GtkListStore used to store the scalar field files.

    Returns :

    the GtkListStore used by this panel to store its scalar fields. It should be considered read-only. [transfer none]

    visu_ui_panel_surfaces_hide ()

    gboolean            visu_ui_panel_surfaces_hide         (VisuPlane **planes);

    Must be called after the initialisation of the plane subpanel. It applies the masking scheme of planes on current surfaces.

    planes :

    an array of planes to be applied (NULL terminated).

    Returns :

    TRUE if the surface should be rebuilt.

    visu_ui_panel_surfaces_init ()

    VisuUiPanel *       visu_ui_panel_surfaces_init         ();

    Should be used in the list declared in externalModules.h to be loaded by V_Sim on start-up. This routine will create the VisuUiPanel where the iso-surfaces stuff can be done, such as creating a surface, loading a scalar field, changing the properties...

    Returns :

    a newly created VisuUiPanel object.

    visu_ui_panel_surfaces_loadFile ()

    gboolean            visu_ui_panel_surfaces_loadFile     (const char *file_name,
                                                             VisuBox *boxToFit,
                                                             GHashTable *table,
                                                             VisuScalarFieldMethod *meth);

    Tries to load the given file_name and if it succeeds, adds loaded surfaces to the isosurfaces panel. If file_name is a VisuScalarField then, meth is used to load it. If fitToBox is not NULL, the load surfaces or scalar fields are fit to it.

    file_name :

    the file you want to try to load. [type filename]

    boxToFit :

    a VisuBox object to fit to ;. [allow-none]

    table :

    a set of different Option (can be NULL). [allow-none]

    meth :

    a VisuScalarFieldMethod object.

    Returns :

    TRUE in case of success.

    visu_ui_panel_surfaces_parseXMLFile ()

    gboolean            visu_ui_panel_surfaces_parseXMLFile (const gchar *filename,
                                                             GError **error);

    This routine reads an XML file and setup the resources and the isovalues to the selected row accordingly.

    filename :

    a location to read the XML data.

    error :

    a location to store possible error.

    Returns :

    TRUE on success.

    visu_ui_panel_surfaces_setUsed ()

    gboolean            visu_ui_panel_surfaces_setUsed      (gboolean used);

    Change the status of the isosurface extension, drawn or not.

    used :

    a boolean.

    Returns :

    TRUE if the OpenGLAskForReDraw signal should be emitted.

    visu_ui_panel_surfaces_showAll ()

    gboolean            visu_ui_panel_surfaces_showAll      (gboolean show);

    Shows or hides all surfaces and check their "draw" status in the panel accordingly.

    show :

    TRUE to show all surfaces, FALSE to hide them.

    Returns :

    TRUE if surface list should be rebuild and redraw.

    visu_ui_panel_surfaces_updateAtIter ()

    void                visu_ui_panel_surfaces_updateAtIter (GtkTreeIter *iter);

    Reset the shown surfaces at iter.

    iter :

    an iterator.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/v-sim-panelSurfacesTools.html0000644000353400050620000002004412216331357023032 00000000000000 panelSurfacesTools

    panelSurfacesTools

    panelSurfacesTools — Gtk interface to manage isosurfaces.

    Description

    This module contains the panel used to manage your .surf files. At the moment, only two tools are availiable for you to use. pot2surf will allow you to create .surf files from .pot files. There is also a .surf file merger which is so short that we beliedved it didn't need it's own module.

    Details

    gtk_tree_model_iter_previous ()

    gboolean            gtk_tree_model_iter_previous        (GtkTreeModel *tree_model,
                                                             GtkTreeIter *iter);

    Similar to gtk_tree_model_iter_next(). See www.gtk.org for more info.

    tree_model :

    the GtkTreeModel to get the previous iteration from ;

    iter :

    a location to a GtkTreeIter to store the result.

    Returns :

    TRUE if iter has been changed to the next node.

    visu_ui_panel_surfaces_tools_convertWidget ()

    GtkWidget *         visu_ui_panel_surfaces_tools_convertWidget
                                                            ();

    Creates a widget containing the whole pot2surf frontend. Don't use two of them simultaneously, they would conflict.

    Returns :

    an allocated GtkWidget containing the interface.

    visu_ui_panel_surfaces_tools_fileWidget ()

    GtkWidget *         visu_ui_panel_surfaces_tools_fileWidget
                                                            ();

    Creates a widget containing an interface to merge surf files. Don't use two of them simultaneously, they would conflict.

    Returns :

    an allocated GtkWidget containing the interface.

    visu_ui_panel_surfaces_tools_init ()

    void                visu_ui_panel_surfaces_tools_init   ();

    Opens a new window containing tools to operate on surf and pot files.

    v_sim-3.7.0/Documentation/reference/html/v-sim-panelVibration.html0000644000353400050620000000715312216331357022201 00000000000000 panelVibration

    panelVibration

    panelVibration — The tab where phonons are loaded and listed.

    Description

    Nothing tunable here.

    Details

    visu_ui_panel_vibration_init ()

    VisuUiPanel *       visu_ui_panel_vibration_init        ();

    Should be used in the list declared in externalModules.h to be loaded by V_Sim on start-up. This routine will create the VisuUiPanel where the box

    Returns :

    a newly created VisuUiPanel object.
    v_sim-3.7.0/Documentation/reference/html/v-sim-plane.html0000644000353400050620000021055612216331357020326 00000000000000 plane

    plane

    plane — Adds capabilities to draw and handle planes.

    Synopsis

    #define             VISU_PLANE_SIDE_MINUS
    #define             VISU_PLANE_SIDE_NONE
    #define             VISU_PLANE_SIDE_PLUS
                        VisuPlane;
                        VisuPlaneClass;
    enum                VisuPlaneHidingMode;
    gboolean            visu_plane_class_exportXMLFile      (const gchar *filename,
                                                             VisuPlane **list,
                                                             GError **error);
    gboolean            visu_plane_class_getIntersection    (VisuPlane **listOfVisuPlanes,
                                                             float pointA[3],
                                                             float pointB[3],
                                                             float inter[3],
                                                             gboolean inside);
    gboolean            visu_plane_class_getOrderedIntersections
                                                            (int nVisuPlanes,
                                                             VisuPlane **listOfVisuPlanes,
                                                             float pointA[3],
                                                             float pointB[3],
                                                             float *inter,
                                                             int *index);
    gboolean            visu_plane_class_getVisibility      (VisuPlane **listOfVisuPlanes,
                                                             float point[3]);
    gboolean            visu_plane_class_parseXMLFile       (gchar *filename,
                                                             VisuPlane ***planes,
                                                             GError **error);
    int                 visu_plane_class_setHiddingMode     (VisuPlaneHidingMode mode);
    gboolean            visu_plane_class_showHideAll        (VisuPlane **listOfVisuPlanes,
                                                             VisuData *visuData);
    void                visu_plane_getBasis                 (VisuPlane *plane,
                                                             float xyz[2][3],
                                                             float center[3]);
    ToolColor *         visu_plane_getColor                 (VisuPlane *plane);
    gfloat              visu_plane_getDistanceFromOrigin    (VisuPlane *plane);
    int                 visu_plane_getHiddenState           (VisuPlane *plane);
    GList *             visu_plane_getIntersection          (VisuPlane *plane);
    gboolean            visu_plane_getLineIntersection      (const VisuPlane *plane,
                                                             const float A[3],
                                                             const float B[3],
                                                             float *lambda);
    void                visu_plane_getNVect                 (VisuPlane *plane,
                                                             float *vect);
    void                visu_plane_getNVectUser             (VisuPlane *plane,
                                                             float *vect);
    gboolean            visu_plane_getPlaneIntersection     (const VisuPlane *plane1,
                                                             const VisuPlane *plane2,
                                                             float A[3],
                                                             float B[3]);
    float *             visu_plane_getReducedIntersection   (VisuPlane *plane,
                                                             guint *nVals);
    gboolean            visu_plane_getRendered              (VisuPlane *plane);
    VisuPlane *         visu_plane_new                      (VisuBox *box,
                                                             float vect[3],
                                                             float dist,
                                                             ToolColor *color);
    VisuPlane *         visu_plane_newUndefined             (void);
    gboolean            visu_plane_setColor                 (VisuPlane *plane,
                                                             ToolColor *color);
    gboolean            visu_plane_setDistanceFromOrigin    (VisuPlane *plane,
                                                             float dist);
    int                 visu_plane_setHiddenState           (VisuPlane *plane,
                                                             int side);
    gboolean            visu_plane_setNormalVector          (VisuPlane *plane,
                                                             float vect[3]);
    gboolean            visu_plane_setRendered              (VisuPlane *plane,
                                                             gboolean rendered);
    

    Object Hierarchy

      GObject
       +----VisuPlane
    

    Implemented Interfaces

    VisuPlane implements VisuBoxed.

    Signals

      "moved"                                          : No Hooks
      "rendering"                                      : No Hooks
    

    Description

    A VisuPlane is a GObject. It is defined by its normal vector and the distance of the plane with the origin (see visu_plane_setNormalVector() and visu_plane_setDistanceFromOrigin()). When these informations are given and an VisuGlView is used to render the plane, V_Sim computes the intersections of the plane with the bounding box (see visu_plane_getIntersection()).

    VisuPlanes can be used to hide nodes defining their visu_plane_setHiddenState() and visu_plane_class_setHiddingMode(). A list of planes can also be exported or imported from an XML file using visu_plane_class_exportXMLFile() and visu_plane_class_parseXMLFile().

    VisuPlanes can have transparency but the support of it is limited to one plane. If several planes are drawn with transparency, they may hide each other because of the implementation of transparency in OpenGL (planes are treated as single polygons).

    Details

    VISU_PLANE_SIDE_MINUS

    #define VISU_PLANE_SIDE_MINUS -1
    

    This is a key that defines which side is hidden by the plane. For this value, the side is the one at the opposite of the one pointed by the normal vector.


    VISU_PLANE_SIDE_NONE

    #define VISU_PLANE_SIDE_NONE 0
    

    This is a key that defines which side is hidden by the plane. For this value, no node is hidden.


    VISU_PLANE_SIDE_PLUS

    #define VISU_PLANE_SIDE_PLUS +1
    

    This is a key that defines which side is hidden by the plane. For this value, the side is the one pointed by the normal vector.


    VisuPlane

    typedef struct _VisuPlane VisuPlane;

    All fields are private, use the access routines.


    VisuPlaneClass

    typedef struct _VisuPlaneClass VisuPlaneClass;

    An opaque structure.


    enum VisuPlaneHidingMode

    typedef enum {
        VISU_PLANE_HIDE_UNION,
        VISU_PLANE_HIDE_INTER,
        VISU_PLANE_HIDE_N_VALUES
    } VisuPlaneHidingMode;
    

    Enum used to address different hiding modes. See visu_plane_class_setHiddingMode() for further details.

    VISU_PLANE_HIDE_UNION

    element are masked if one plane at least mask it ;

    VISU_PLANE_HIDE_INTER

    element are masked if all planes mask it ;

    VISU_PLANE_HIDE_N_VALUES

    number of masking possibilities.

    visu_plane_class_exportXMLFile ()

    gboolean            visu_plane_class_exportXMLFile      (const gchar *filename,
                                                             VisuPlane **list,
                                                             GError **error);

    Export in XML format the given list of planes to the given file.

    filename :

    the file to export to ;

    list :

    an array (NULL terminated) to export ;

    error :

    a pointer to store the error (can be NULL).

    Returns :

    TRUE if everything goes right, if not and error (if not NULL) is set and contains the message of the error.

    visu_plane_class_getIntersection ()

    gboolean            visu_plane_class_getIntersection    (VisuPlane **listOfVisuPlanes,
                                                             float pointA[3],
                                                             float pointB[3],
                                                             float inter[3],
                                                             gboolean inside);

    Compute the location of the intersection point of segment AB with list of planes listOfVisuPlanes. If there are several intersections, the closest to point A is returned. If inside is TRUE, then the intersection point must be within the line [AB].

    listOfVisuPlanes :

    an array of VisuPlane, NULL terminated ;

    pointA :

    three cartesian coordinates.

    pointB :

    three cartesian coordinates.

    inter :

    a location to store the intersection point.

    inside :

    a boolean.

    Returns :

    TRUE if there is an intersection.

    visu_plane_class_getOrderedIntersections ()

    gboolean            visu_plane_class_getOrderedIntersections
                                                            (int nVisuPlanes,
                                                             VisuPlane **listOfVisuPlanes,
                                                             float pointA[3],
                                                             float pointB[3],
                                                             float *inter,
                                                             int *index);

    Compute the location of the intersection points of segment AB with list of planes listOfVisuPlanes. If there are several intersections, they are ordered by the proximity to point A.

    nVisuPlanes :

    the number of planes (must be consistent with the number of planes in listOfVisuPlanes!)

    listOfVisuPlanes :

    an array of VisuPlane, NULL terminated ;

    pointA :

    three cartesian coordinates.

    pointB :

    three cartesian coordinates.

    inter :

    a pointer to the location to store the intersection points. Supposing you know the number of intersection points !

    index :

    a pointer to the location to store the indices of ordering of the planes.

    Returns :

    TRUE if the intersections are found.

    visu_plane_class_getVisibility ()

    gboolean            visu_plane_class_getVisibility      (VisuPlane **listOfVisuPlanes,
                                                             float point[3]);

    Compute the visibility of the given point, following the masking scheme of the given plane list.

    listOfVisuPlanes :

    an array of VisuPlane, NULL terminated ;

    point :

    three cartesian coordinates.

    Returns :

    TRUE if the point is not masked.

    visu_plane_class_parseXMLFile ()

    gboolean            visu_plane_class_parseXMLFile       (gchar *filename,
                                                             VisuPlane ***planes,
                                                             GError **error);

    Read the given file (syntax in XML) and create a list of planes. This list is an allocated array that should be deallocated with g_free(). This array has always one argument, since it is NULL terminated.

    filename :

    the file to parse ;. [type filename]

    planes :

    a pointer to store the parsed list (will be allocated and NULL terminated) ;. [out callee-allocates][array zero-terminated=1]

    error :

    a pointer to store the error (can be NULL).

    Returns :

    TRUE if everything goes right, if not and error (if not NULL) is set and contains the message of the error. [skip]

    visu_plane_class_setHiddingMode ()

    int                 visu_plane_class_setHiddingMode     (VisuPlaneHidingMode mode);

    This method is used to set the hiding mode flag. In union mode, elements are not drwn if they are hidden by one plane at least. In intersection mode, elements are only hidden if masked by all planes.

    mode :

    a value related to the hiding mode (look at the enum VisuPlaneHidingMode).

    Returns :

    1 if visu_plane_class_showHideAll() should be called.

    visu_plane_class_showHideAll ()

    gboolean            visu_plane_class_showHideAll        (VisuPlane **listOfVisuPlanes,
                                                             VisuData *visuData);

    This method test for each node if it is hidden or not by the combination of all the given planes.

    listOfVisuPlanes :

    (array zero-terminated=1) (element-type VisuPlane*) (transfer none): an array of VisuPlane, NULL terminated.

    visuData :

    a VisuData which show or hide nodes to;

    Returns :

    TRUE if VisuNodeArray::VisibilityChanged signal should be called.

    visu_plane_getBasis ()

    void                visu_plane_getBasis                 (VisuPlane *plane,
                                                             float xyz[2][3],
                                                             float center[3]);

    Stores the coordinates of barycentre of the plane in center and provide coordinates of two orthogonal vector in the plane. The planeComputeInter() should have been called before.

    plane :

    a VisuPlane ;

    xyz :

    two vectors.

    center :

    a point in cartesian coordinates.

    visu_plane_getColor ()

    ToolColor *         visu_plane_getColor                 (VisuPlane *plane);

    Stores the color of the plane.

    plane :

    a VisuPlane ;

    Returns :

    a ToolColor. [transfer none]

    visu_plane_getDistanceFromOrigin ()

    gfloat              visu_plane_getDistanceFromOrigin    (VisuPlane *plane);

    Stores the distance of the plane to the origin.

    plane :

    a VisuPlane ;

    Returns :

    a float value.

    visu_plane_getHiddenState ()

    int                 visu_plane_getHiddenState           (VisuPlane *plane);

    The plane can hide the nodes on one of its side. this method get the status for the given plane.

    plane :

    a VisuPlane.

    Returns :

    the state, defined by VISU_PLANE_SIDE_PLUS or VISU_PLANE_SIDE_MINUS or VISU_PLANE_SIDE_NONE.

    visu_plane_getIntersection ()

    GList *             visu_plane_getIntersection          (VisuPlane *plane);

    The list of intersection between the plane and the box is made of float[3]. The planeComputeInter() should have been called before.

    plane :

    a VisuPlane.

    Returns :

    a list of float[3] elements. This list is owned by V_Sim. [transfer none][element-type ToolVector]

    visu_plane_getLineIntersection ()

    gboolean            visu_plane_getLineIntersection      (const VisuPlane *plane,
                                                             const float A[3],
                                                             const float B[3],
                                                             float *lambda);

    If there is an intersection M between line (AB) and plane, then this function calculates M coordinates as M = A + lambda * AB.

    plane :

    a VisuPlane object.

    A :

    coordinates of point A. [array fixed-size=3]

    B :

    coordinates of point B. [array fixed-size=3]

    lambda :

    a location to store the intersecting factor. [out caller-allocates][allow-none]

    Returns :

    TRUE if there is an intersection between line (AB) and the plane.

    Since 3.6


    visu_plane_getNVect ()

    void                visu_plane_getNVect                 (VisuPlane *plane,
                                                             float *vect);

    Stores the coordinates of the normal vector in vect of the plane. It returns the normalized values.

    plane :

    a VisuPlane.

    vect :

    an already alloacted (size 3) float array.

    visu_plane_getNVectUser ()

    void                visu_plane_getNVectUser             (VisuPlane *plane,
                                                             float *vect);

    Stores the coordinates of the normal vector in vec of the plane. It returns the values given by the user, not the normalized vaues.

    plane :

    a VisuPlane.

    vect :

    an already alloacted (size 3) float array.

    visu_plane_getPlaneIntersection ()

    gboolean            visu_plane_getPlaneIntersection     (const VisuPlane *plane1,
                                                             const VisuPlane *plane2,
                                                             float A[3],
                                                             float B[3]);

    Calculates the intersection between plane1 and plane2, if it exists. The intersection is returned in A and B as the coordinates of the two points on the border of plane1 that intersect plane2.

    plane1 :

    a VisuPlane object.

    plane2 :

    another VisuPlane object.

    A :

    the coordinates of the first point of intersection. [out][array fixed-size=3]

    B :

    the coordinates of the second point of intersection. [out][array fixed-size=3]

    Returns :

    TRUE if there is an intersection between plane1 and plane2.

    Since 3.7


    visu_plane_getReducedIntersection ()

    float *             visu_plane_getReducedIntersection   (VisuPlane *plane,
                                                             guint *nVals);

    This routine returns the coordinates in the plane basis set of its intersections with a box (see visu_plane_setBox()). The coordinates are appended in the return array which length is stored in nVals.

    plane :

    a VisuPlane object.

    nVals :

    a location for an integer.

    Returns :

    a newly allocated array of nVals * 2 values. Free it with g_free().

    Since 3.6


    visu_plane_getRendered ()

    gboolean            visu_plane_getRendered              (VisuPlane *plane);

    Get the visibility of a plane.

    plane :

    a VisuPlane.

    Returns :

    TRUE if the plane is visible.

    visu_plane_new ()

    VisuPlane *         visu_plane_new                      (VisuBox *box,
                                                             float vect[3],
                                                             float dist,
                                                             ToolColor *color);

    Create a plane with the specified attributes.

    box :

    a box description ;. [transfer full]

    vect :

    three values defining the normal vector (unitary or not) ;. [array fixed-size=3]

    dist :

    the distance between origin and intersection of the plane and the line made by origin and normal vector ;

    color :

    a ToolColor.

    Returns :

    a newly allocated VisuPlane structure.

    visu_plane_newUndefined ()

    VisuPlane *         visu_plane_newUndefined             (void);

    Create a new plane with default values. This plane can't be rendered directly and one needs to computes its intersection with the bounding box before using planeComputeInter().

    Returns :

    a newly allocated VisuPlane structure. [transfer full]

    visu_plane_setColor ()

    gboolean            visu_plane_setColor                 (VisuPlane *plane,
                                                             ToolColor *color);

    Change the color of the plane.

    plane :

    a VisuPlane object ;

    color :

    a ToolColor.

    Returns :

    0 if everything went right.

    visu_plane_setDistanceFromOrigin ()

    gboolean            visu_plane_setDistanceFromOrigin    (VisuPlane *plane,
                                                             float dist);

    Change the position of the plane.

    plane :

    a VisuPlane object ;

    dist :

    the distance between origin and intersection of the plane and the line made by origin and normal vector.

    Returns :

    1 if the intersections should be recalculated by a call to planeComputeInter(), 0 if not. Or -1 if there is an error.

    visu_plane_setHiddenState ()

    int                 visu_plane_setHiddenState           (VisuPlane *plane,
                                                             int side);

    The plane can hide the nodes on one of its side. The side argument can be VISU_PLANE_SIDE_PLUS or VISU_PLANE_SIDE_MINUS or VISU_PLANE_SIDE_NONE. It codes the side of the plane which hides the nodes. If VISU_PLANE_SIDE_NONE is selected all nodes are rendered.

    plane :

    a VisuPlane ;

    side :

    a key, VISU_PLANE_SIDE_NONE, VISU_PLANE_SIDE_PLUS or VISU_PLANE_SIDE_MINUS.

    Returns :

    1 if visu_plane_class_showHideAll() should be called.

    visu_plane_setNormalVector ()

    gboolean            visu_plane_setNormalVector          (VisuPlane *plane,
                                                             float vect[3]);

    Change the normal vector defining the orientation of the plane.

    plane :

    a VisuPlane object ;

    vect :

    three values defining the normal vector (unitary or not).

    Returns :

    1 if the intersections should be recalculated by a call to planeComputeInter(), 0 if not. Or -1 if there is an error.

    visu_plane_setRendered ()

    gboolean            visu_plane_setRendered              (VisuPlane *plane,
                                                             gboolean rendered);

    Change the visibility of the plane.

    plane :

    a VisuPlane ;

    rendered :

    TRUE to make the plane drawable.

    Returns :

    TRUE if visu_plane_class_showHideAll() should be called.

    Signal Details

    The "moved" signal

    void                user_function                      (VisuPlane *plane,
                                                            gpointer   user_data)      : No Hooks

    This signal is emitted each time the plane position is changed (either distance or normal).

    plane :

    the object emitting the signal.

    user_data :

    user data set when the signal handler was connected.

    Since 3.3


    The "rendering" signal

    void                user_function                      (VisuPlane *plane,
                                                            gpointer   user_data)      : No Hooks

    This signal is emitted each time the rendering properties (color, visibility...) are affected.

    plane :

    the object emitting the signal.

    user_data :

    user data set when the signal handler was connected.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/v-sim-pot2surf.html0000644000353400050620000004473312216331357021015 00000000000000 pot2surf

    pot2surf

    pot2surf — Creates surfaces from scalar fields.

    Synopsis

    int                 visu_surfaces_createFromPotentialFile
                                                            (const gchar *surf_file_to_write,
                                                             const gchar *pot_file_to_read,
                                                             int nsurfs_to_build,
                                                             const float *surf_value,
                                                             const gchar **surf_name);
    gboolean            visu_surfaces_createFromScalarField (VisuSurfaces **surf,
                                                             VisuScalarField *field,
                                                             double isoValue,
                                                             int id,
                                                             const gchar *name);
    gboolean            visu_surfaces_exportXMLFile         (const gchar *filename,
                                                             float *values,
                                                             VisuSurfacesResources **res,
                                                             int n,
                                                             GError **error);
    gboolean            visu_surfaces_parseXMLFile          (const gchar *filename,
                                                             VisuSurfaces **surfaces,
                                                             VisuScalarField *field,
                                                             GError **error);
    

    Description

    Originally written by Luc Billard for his program VISUALISE. It has been since transformed to a single function and integrated in V_Sim. .pot file are text files which specification are the following :

    • 1st line: full pathname of the potential file to read

    • 2nd line: full pathname of the surface file to build

    • 3rd line: an integer giving the nbr n of isosurfaces to build

    • Each of the n following lines must match the pattern [value name] where value is a real number for the isovalue and name is the name given for the corresponding isosurface to build. Each surface should be named surface_*.

    The function will fail if it finds no isosurface corresponding to some of the given isovalues. The panelSurfacesTools contains a frontend to build valid .instruc files. This panel is originally integrated in V_Sim. You can access it through the Convert tab in the Isosurfaces panel.

    Details

    visu_surfaces_createFromPotentialFile ()

    int                 visu_surfaces_createFromPotentialFile
                                                            (const gchar *surf_file_to_write,
                                                             const gchar *pot_file_to_read,
                                                             int nsurfs_to_build,
                                                             const float *surf_value,
                                                             const gchar **surf_name);

    Warning

    visu_surfaces_createFromPotentialFile is deprecated and should not be used in newly-written code. 3.7

    Read the given pot file and produce an associated surf file. WARNING, it may be removed later.

    surf_file_to_write :

    target surf file

    pot_file_to_read :

    source pot file

    nsurfs_to_build :

    number of surfaces to build

    surf_value :

    an array with iso-values

    surf_name :

    an array with iso-surface names.

    Returns :

    0 in case of success, n!=0 otherwise.

    visu_surfaces_createFromScalarField ()

    gboolean            visu_surfaces_createFromScalarField (VisuSurfaces **surf,
                                                             VisuScalarField *field,
                                                             double isoValue,
                                                             int id,
                                                             const gchar *name);

    Create on the fly a surface from the scalar field field. If name is given, the surface is created with it, if not, "Isosurface id + 1" is used. surf can already contains several surfaces, in that case, the new surface is added. If surf is NULL, then a new VisuSurfaces object is created and returned.

    surf :

    a location on a VisuSurfaces pointer ;. [inout][allow-none]

    field :

    the scalar field to create the surface from ;

    isoValue :

    the value of the isosurface ;

    id :

    an integer identifying the surface ;

    name :

    the name of the surface to use (can be NULL). [allow-none]

    Returns :

    TRUE if the surface is created.

    visu_surfaces_exportXMLFile ()

    gboolean            visu_surfaces_exportXMLFile         (const gchar *filename,
                                                             float *values,
                                                             VisuSurfacesResources **res,
                                                             int n,
                                                             GError **error);

    Export the surface resources into an XML file.

    filename :

    a path to a file.

    values :

    an array of n values.

    res :

    an array of n VisuSurfacesResources.

    n :

    number of surface resources to export.

    error :

    a location to store a possible error.

    Returns :

    FALSE if a error occured.

    visu_surfaces_parseXMLFile ()

    gboolean            visu_surfaces_parseXMLFile          (const gchar *filename,
                                                             VisuSurfaces **surfaces,
                                                             VisuScalarField *field,
                                                             GError **error);

    Parse the given XML file, looking for the <surfaces> tag and create the given surfaces.

    filename :

    a path to a file.

    surfaces :

    a location on a VisuSurfaces pointer.

    field :

    the scalar field to create the surface from.

    error :

    a location to store a possible error.

    Returns :

    FALSE if a error occured.
    v_sim-3.7.0/Documentation/reference/html/v-sim-renderingAtomic-ascii.html0000644000353400050620000002730112216331357023421 00000000000000 renderingAtomic_ascii

    renderingAtomic_ascii

    renderingAtomic_ascii — Method to load ascii position file.

    Synopsis

    void                initAtomicAscii                     (VisuRendering *method);
    void                visu_meth_asciiFree                 (gpointer data);
    void                visu_meth_asciiValToNb              (gpointer key,
                                                             gpointer value,
                                                             gpointer data);
    void                visu_meth_asciiValToType            (gpointer key,
                                                             gpointer value,
                                                             gpointer data);
    

    Description

    Ascii format is a plain text format to store elements and their position. The first line is a commentary and is not read. Then, the next two lines must contains each three numbers, describing the box containing the data. The first number is the length on x direction. The next two numbers are on one hand the component on the same x direction and on the other hand the other component on a direction orthogonal to the x direction, setting thus the y direction. The three other numbers are the component of the z direction on first, the x direction, then the y direction and finally in a direction orthogonal both to x and y directions. After these three first lines, all other lines can be blank, beginning with a '#' character or containing three numbers and a label name for the element.

    Some public methods here have been put for other loader which wants to share the code of this loader (see the XYZ loader for instance).

    Details

    initAtomicAscii ()

    void                initAtomicAscii                     (VisuRendering *method);

    Create the structure that gives access to a load method and some description of it (file formats associated, name...). Internal use only

    method :

    the VisuRendering method to be associated to.

    visu_meth_asciiFree ()

    void                visu_meth_asciiFree                 (gpointer data);

    This method is used to free an allocated stuct VisuMethAscii, and can be used as a destructor when creating an hashtable with such datas.

    data :

    a pointer to stuct VisuMethAscii instances.

    visu_meth_asciiValToNb ()

    void                visu_meth_asciiValToNb              (gpointer key,
                                                             gpointer value,
                                                             gpointer data);

    This method is used in a g_hash_table_foreach() method that work on data. data is an array of int and this method puts its nth value to the value read from the nbNodes attribute of the structure object pointed by value.

    key :

    a VisuElement pointer ;

    value :

    a struct VisuMethAscii pointer ;

    data :

    a pointer on array of int.

    visu_meth_asciiValToType ()

    void                visu_meth_asciiValToType            (gpointer key,
                                                             gpointer value,
                                                             gpointer data);

    This method is used in a g_hash_table_foreach() method that work on data. data is an array of pointers to VisuElement and this method puts its nth value to point to key. The value nth is read from the pos attribute of the structure object pointed by value.

    key :

    a VisuElement pointer ;

    value :

    a struct VisuMethAscii pointer ;

    data :

    a pointer on array of pointers of VisuElement.
    v_sim-3.7.0/Documentation/reference/html/v-sim-renderingAtomic-d3.html0000644000353400050620000000737612216331357022651 00000000000000 renderingAtomic_d3

    renderingAtomic_d3

    renderingAtomic_d3 — Method to load d3 position file.

    Synopsis

    void                initAtomicD3                        (VisuRendering *method);
    

    Description

    D3 format is a binary format to store elements and their position.

    Details

    initAtomicD3 ()

    void                initAtomicD3                        (VisuRendering *method);

    Create the structure that gives access to a load method and some description of it (file formats associated, name...). Internal use only

    method :

    the VisuRendering method to be associated to.
    v_sim-3.7.0/Documentation/reference/html/v-sim-renderingAtomic.html0000644000353400050620000013306312216331357022336 00000000000000 renderingAtomic

    renderingAtomic

    renderingAtomic — A rendering method to draw atoms positioned in a box.

    Synopsis

    #define             VISU_RENDERING_ATOMIC_FORCES
    #define             VISU_RENDERING_ATOMIC_FORCES_ELE_MAX
    #define             VISU_RENDERING_ATOMIC_NAME
                        VisuRenderingAtomic;
                        VisuRenderingAtomicClass;
    enum                VisuRenderingAtomicShapeId;
    const char **       visu_rendering_atomic_getAllShapes  ();
    const char **       visu_rendering_atomic_getAllShapesI18n
                                                            ();
    float               visu_rendering_atomic_getElipsoidPhi
                                                            (VisuElement *ele);
    float               visu_rendering_atomic_getElipsoidRatio
                                                            (VisuElement *ele);
    float               visu_rendering_atomic_getElipsoidTheta
                                                            (VisuElement *ele);
    float               visu_rendering_atomic_getMaxForces  (VisuData *dataObj);
    float               visu_rendering_atomic_getRadius     (VisuElement *ele);
    float               visu_rendering_atomic_getRadiusDefault
                                                            ();
    VisuRenderingAtomicShapeId visu_rendering_atomic_getShape
                                                            (VisuElement *ele);
    VisuRenderingAtomicShapeId visu_rendering_atomic_getShapeDefault
                                                            ();
    const char *        visu_rendering_atomic_getShapeName  (VisuRenderingAtomicShapeId shape);
    const char *        visu_rendering_atomic_getShapeNameDefault
                                                            ();
    VisuRenderingAtomic * visu_rendering_atomic_new         ();
    gboolean            visu_rendering_atomic_setElipsoidParameters
                                                            (VisuElement *ele,
                                                             float ratio,
                                                             float phi,
                                                             float theta);
    gboolean            visu_rendering_atomic_setElipsoidPhi
                                                            (VisuElement *ele,
                                                             float phi);
    gboolean            visu_rendering_atomic_setElipsoidRatio
                                                            (VisuElement *ele,
                                                             float ratio);
    gboolean            visu_rendering_atomic_setElipsoidTheta
                                                            (VisuElement *ele,
                                                             float theta);
    void                visu_rendering_atomic_setForces     (VisuData *dataObj,
                                                             float *forces);
    int                 visu_rendering_atomic_setRadius     (VisuElement *ele,
                                                             float value);
    int                 visu_rendering_atomic_setShape      (VisuElement *ele,
                                                             VisuRenderingAtomicShapeId shape);
    int                 visu_rendering_atomic_setShapeFromName
                                                            (VisuElement *ele,
                                                             const char *shape);
    

    Object Hierarchy

      GObject
       +----VisuRendering
             +----VisuRenderingAtomic
    

    Description

    This the main part of a rendering method made to represent atomic positions. It draws either spheres or cubes depending of the elements properties. The radius (for the sphere) or the length of the sides of the cubes can be tuned.

    Details

    VISU_RENDERING_ATOMIC_FORCES

    #define VISU_RENDERING_ATOMIC_FORCES "forces_id"
    

    Public name of the VisuNodeProperty used to store forces on atoms.


    VISU_RENDERING_ATOMIC_FORCES_ELE_MAX

    #define VISU_RENDERING_ATOMIC_FORCES_ELE_MAX "max_ele_forces_id"
    

    Public name of the VisuNodeProperty used to store the max of forces per element.


    VISU_RENDERING_ATOMIC_NAME

    #define VISU_RENDERING_ATOMIC_NAME "Atom visualisation"
    

    Public name of the atomic rendering mode.


    VisuRenderingAtomic

    typedef struct _VisuRenderingAtomic VisuRenderingAtomic;

    An opaque structure.


    VisuRenderingAtomicClass

    typedef struct _VisuRenderingAtomicClass VisuRenderingAtomicClass;

    An opaque structure.


    enum VisuRenderingAtomicShapeId

    typedef enum {
      VISU_RENDERING_ATOMIC_SPHERE,
      VISU_RENDERING_ATOMIC_CUBE,
      VISU_RENDERING_ATOMIC_ELLIPSOID,
      VISU_RENDERING_ATOMIC_POINT,
      VISU_RENDERING_ATOMIC_TORUS,
      VISU_RENDERING_ATOMIC_N_SHAPES
    } VisuRenderingAtomicShapeId;
    

    This enum is used as identifier for shapes managed by the attomic rendering method.

    VISU_RENDERING_ATOMIC_SPHERE

    draw sphere ;

    VISU_RENDERING_ATOMIC_CUBE

    draw cube ;

    VISU_RENDERING_ATOMIC_ELLIPSOID

    draw elipsoid ;

    VISU_RENDERING_ATOMIC_POINT

    draw square dot ;

    VISU_RENDERING_ATOMIC_TORUS

    draw torus ;

    VISU_RENDERING_ATOMIC_N_SHAPES

    number of shapes.

    visu_rendering_atomic_getAllShapes ()

    const char **       visu_rendering_atomic_getAllShapes  ();

    This methods retrieve the whole list of shape names used by V_Sim for example in the resources file. These names are not translated. If internationalized names are required, use visu_rendering_atomic_getAllShapesI18n() instead.

    Returns :

    a pointer to a list of shape names (should not be modified or freed). [transfer none][array zero-terminated=1][element-type filename]

    visu_rendering_atomic_getAllShapesI18n ()

    const char **       visu_rendering_atomic_getAllShapesI18n
                                                            ();

    This methods retrieve the whole list of shape names, translated strings.

    Returns :

    a pointer to a list of shape names (should not be modified or freed). [transfer none][array zero-terminated=1][element-type utf8]

    visu_rendering_atomic_getElipsoidPhi ()

    float               visu_rendering_atomic_getElipsoidPhi
                                                            (VisuElement *ele);

    Retrieve the phi angle parameter of the elipsoid shape for the element ele.

    ele :

    a VisuElement object.

    Returns :

    the phi angle of the elipsoid.

    visu_rendering_atomic_getElipsoidRatio ()

    float               visu_rendering_atomic_getElipsoidRatio
                                                            (VisuElement *ele);

    Retrieve the ratio parameter of the elipsoid shape for the element ele.

    ele :

    a VisuElement object.

    Returns :

    the ratio of the elipsoid.

    visu_rendering_atomic_getElipsoidTheta ()

    float               visu_rendering_atomic_getElipsoidTheta
                                                            (VisuElement *ele);

    Retrieve the theta angle parameter of the elipsoid shape for the element ele.

    ele :

    a VisuElement object.

    Returns :

    the theta angle of the elipsoid.

    visu_rendering_atomic_getMaxForces ()

    float               visu_rendering_atomic_getMaxForces  (VisuData *dataObj);

    If dataObj has forces associated to (see visu_rendering_atomic_setForces()), this routine provides the modulus of the biggest force.

    dataObj :

    a VisuData object.

    Returns :

    0 if no forces have been associated.

    Since 3.7


    visu_rendering_atomic_getRadius ()

    float               visu_rendering_atomic_getRadius     (VisuElement *ele);

    In the rendering atomic method, shapes are characterized by a radius. This method gets it for the specified element. If this element has no radius defined yet, the default value is associated and returned.

    ele :

    a VisuElement object.

    Returns :

    the radius of the specified element. A negative value if something goies wrong.

    visu_rendering_atomic_getRadiusDefault ()

    float               visu_rendering_atomic_getRadiusDefault
                                                            ();

    This method gets the default radius of the rendering atomic method.

    Returns :

    the default value for radius resource.

    visu_rendering_atomic_getShape ()

    VisuRenderingAtomicShapeId visu_rendering_atomic_getShape
                                                            (VisuElement *ele);

    In the rendering atomic method, shapes are multiple. This method gets it for the specified element. Shapes are characterized by their id, corresponding to an integer value. Use the enum VisuRenderingAtomicShapeId to associate an integer value to a specific shape.

    ele :

    a VisuElement object.

    Returns :

    the shape id of the element ele.

    visu_rendering_atomic_getShapeDefault ()

    VisuRenderingAtomicShapeId visu_rendering_atomic_getShapeDefault
                                                            ();

    This method gets the default shape.

    Returns :

    the default shape id.

    visu_rendering_atomic_getShapeName ()

    const char *        visu_rendering_atomic_getShapeName  (VisuRenderingAtomicShapeId shape);

    This method does the corresponding between a shape id and its name (a string value).

    shape :

    an integer.

    Returns :

    the name associated to a shape.

    visu_rendering_atomic_getShapeNameDefault ()

    const char *        visu_rendering_atomic_getShapeNameDefault
                                                            ();

    This method is used to retrieve the default name for shapes.

    Returns :

    the name associated to the default shape.

    visu_rendering_atomic_new ()

    VisuRenderingAtomic * visu_rendering_atomic_new         ();

    Create the structure and initialise its values.

    Returns :

    a newly allocate VisuRenderingAtomic object.

    Since 3.6


    visu_rendering_atomic_setElipsoidParameters ()

    gboolean            visu_rendering_atomic_setElipsoidParameters
                                                            (VisuElement *ele,
                                                             float ratio,
                                                             float phi,
                                                             float theta);

    Change the parameters for the elipsoid shape for the given ele. These parameters include a ratio which is the ratio of the long axis on the short one. Thus ratio is always equal or greater than 1. Arguments theta and phi are the direction of the long axis.

    ele :

    a VisuElement object ;

    ratio :

    a float ;

    phi :

    a float ;

    theta :

    a float.

    Returns :

    TRUE if visu_rendering_createElement() should be called.

    visu_rendering_atomic_setElipsoidPhi ()

    gboolean            visu_rendering_atomic_setElipsoidPhi
                                                            (VisuElement *ele,
                                                             float phi);

    Set the phi angle parameter of the elipsoid shape for the element ele.

    ele :

    a VisuElement object.

    phi :

    a float ;

    Returns :

    TRUE if visu_rendering_createElement() should be called.

    visu_rendering_atomic_setElipsoidRatio ()

    gboolean            visu_rendering_atomic_setElipsoidRatio
                                                            (VisuElement *ele,
                                                             float ratio);

    Set the ratio parameter of the elipsoid shape for the element ele.

    ele :

    a VisuElement object.

    ratio :

    a float ;

    Returns :

    TRUE if visu_rendering_createElement() should be called.

    visu_rendering_atomic_setElipsoidTheta ()

    gboolean            visu_rendering_atomic_setElipsoidTheta
                                                            (VisuElement *ele,
                                                             float theta);

    Set the theta angle parameter of the elipsoid shape for the element ele.

    ele :

    a VisuElement object.

    theta :

    a float.

    Returns :

    TRUE if visu_rendering_createElement() should be called.

    visu_rendering_atomic_setForces ()

    void                visu_rendering_atomic_setForces     (VisuData *dataObj,
                                                             float *forces);

    Forces can be associated to nodes of dataObj. The array forces must have the size of the number of nodes of dataObj times three. Forces are given in cartesian coordinates.

    dataObj :

    a VisuData object.

    forces :

    an array of forces. [array]

    Since 3.7


    visu_rendering_atomic_setRadius ()

    int                 visu_rendering_atomic_setRadius     (VisuElement *ele,
                                                             float value);

    This change the radius value of element ele to value.

    ele :

    a VisuElement object ;

    value :

    a positive floating point value.

    Returns :

    1 if a call to visu_rendering_createElement() is required, 0 if not.

    visu_rendering_atomic_setShape ()

    int                 visu_rendering_atomic_setShape      (VisuElement *ele,
                                                             VisuRenderingAtomicShapeId shape);

    This changes the shape of the element ele to the shape defined by its id.

    ele :

    a VisuElement object ;

    shape :

    an integer.

    Returns :

    1 if a call to visu_rendering_createElement() is required, 0 if not.

    visu_rendering_atomic_setShapeFromName ()

    int                 visu_rendering_atomic_setShapeFromName
                                                            (VisuElement *ele,
                                                             const char *shape);

    This method is equivalent to visu_rendering_atomic_setShape() but the shape is defined by its name.

    ele :

    a VisuElement object ;

    shape :

    a string.

    Returns :

    1 if a call to visu_rendering_createElement() is required, 0 if not.

    Signal Details

    The "ForcesChanged" signal

    void                user_function                      (VisuRenderingAtomic *obj,
                                                            GObject             *dataObj,
                                                            gpointer             user_data)      : No Recursion

    Emitted each time forces are updated.

    obj :

    the object emitting the signal.

    dataObj :

    the VisuData forces are applied on.

    user_data :

    user data set when the signal handler was connected.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/v-sim-renderingMode.html0000644000353400050620000003316712216331357022012 00000000000000 renderingMode

    renderingMode

    renderingMode — Controls the way OpenGL renders objects.

    Description

    This modules creates an interface to access to the way OpenGL renders the objects (glPolygonMode() and glToolShadeModel() functions). There are then three rendering modes available in V_Sim: wireframe, flat and smooth. They are controls by an enum RenderingModeId. When visu_gl_rendering_applyMode() is called, the current rendering mode is changed for all future drawing calls that uses polygons.

    Details

    enum VisuGlRenderingMode

    typedef enum {
        VISU_GL_RENDERING_WIREFRAME,
        VISU_GL_RENDERING_FLAT,
        VISU_GL_RENDERING_SMOOTH,
        VISU_GL_RENDERING_SMOOTH_AND_EDGE,
        VISU_GL_RENDERING_N_MODES,
        VISU_GL_RENDERING_FOLLOW
    } VisuGlRenderingMode;
    

    Implemented mode to draw objects.

    VISU_GL_RENDERING_WIREFRAME

    objects are rendered with lines only ;

    VISU_GL_RENDERING_FLAT

    objects are rendered with polygons whose colours are uniform on each polygon ;

    VISU_GL_RENDERING_SMOOTH

    objects are rendered with polygons whose colours are shaded to be smooth all along the object.

    VISU_GL_RENDERING_SMOOTH_AND_EDGE

    objects are rendered with lines hightlighting the contours of polygons.

    VISU_GL_RENDERING_N_MODES

    number of rendering mode.

    VISU_GL_RENDERING_FOLLOW

    use this value not to choose any rendering mode.

    visu_gl_rendering_applyMode ()

    void                visu_gl_rendering_applyMode         (VisuGlRenderingMode mode);

    Change the rendering mode of current OpenGL context.

    mode :

    an integer.

    visu_gl_rendering_getAllModeLabels ()

    const char **       visu_gl_rendering_getAllModeLabels  (void);

    This function retrieve al the names (translated) of available rendering modes.

    Returns :

    an array of string, NULL terminated that is private (not to be freed). [transfer none]

    visu_gl_rendering_getAllModes ()

    const char **       visu_gl_rendering_getAllModes       (void);

    This function retrieve al the names of available rendering modes.

    Returns :

    an array of string, NULL terminated that is private (not to be freed). [transfer none]

    visu_gl_rendering_getGlobalMode ()

    VisuGlRenderingMode visu_gl_rendering_getGlobalMode     (void);

    This function retrieve the value of the parameter renderingOption.

    Returns :

    the identifier of the current rendering option.

    visu_gl_rendering_getModeFromName ()

    gboolean            visu_gl_rendering_getModeFromName   (const char *name,
                                                             VisuGlRenderingMode *id);

    This function retrieve the rendering mode id associated to the name.

    name :

    a string ;

    id :

    a location to store the resulting id.

    Returns :

    TRUE if the name exists.

    visu_gl_rendering_init ()

    void                visu_gl_rendering_init              (void);

    This method is used by opengl.c to initialise this module (declare config file options...). It should not be called elsewhere.


    visu_gl_rendering_setGlobalMode ()

    gboolean            visu_gl_rendering_setGlobalMode     (VisuGlRenderingMode value);

    This function change the value of the parameter renderingOption. It controls how V_Sim renders objects, in wireframe for example.

    value :

    an integer to represent the method of rendering.

    Returns :

    TRUE if the signal OpenGLAskForReDraw should be emitted.
    v_sim-3.7.0/Documentation/reference/html/v-sim-renderingSpin.html0000644000353400050620000014566312216331357022044 00000000000000 renderingSpin

    renderingSpin

    renderingSpin — A module able to represent atoms by their position and spin.

    Synopsis

    #define             VISU_RENDERING_SPIN_MAX_MODULUS_ID
    #define             VISU_RENDERING_SPIN_NAME
    #define             VISU_RENDERING_SPIN_VALUES_ID
                        VisuRenderingSpin;
                        VisuRenderingSpinClass;
    enum                VisuRenderingSpinDrawingPolicy;
    enum                VisuRenderingSpinFileType;
    enum                VisuRenderingSpinModulusPolicy;
    enum                VisuRenderingSpinResources;
    enum                VisuRenderingSpinShapeId;
    VisuRenderingSpinDrawingPolicy visu_rendering_spin_getHidingPolicyFromName
                                                            (const char *name);
    const char *        visu_rendering_spin_getHidingPolicyName
                                                            (VisuRenderingSpinDrawingPolicy n);
    const char *        visu_rendering_spin_getHidingPolicyNameI18n
                                                            (VisuRenderingSpinDrawingPolicy n);
    void                visu_rendering_spin_getResource     (VisuElement *ele,
                                                             VisuRenderingSpinResources property,
                                                             GValue *val);
    gboolean            visu_rendering_spin_getResourceBoolean
                                                            (VisuElement *ele,
                                                             VisuRenderingSpinResources property);
    gfloat              visu_rendering_spin_getResourceFloat
                                                            (VisuElement *ele,
                                                             VisuRenderingSpinResources property);
    guint               visu_rendering_spin_getResourceUint (VisuElement *ele,
                                                             VisuRenderingSpinResources property);
    const char *        visu_rendering_spin_getShapeNameI18n
                                                            (VisuRenderingSpinShapeId n);
    VisuRenderingSpin * visu_rendering_spin_new             ();
    gboolean            visu_rendering_spin_setResource     (VisuElement *ele,
                                                             VisuRenderingSpinResources property,
                                                             GValue *val);
    gboolean            visu_rendering_spin_setResourceBoolean
                                                            (VisuElement *ele,
                                                             VisuRenderingSpinResources property,
                                                             gboolean value);
    gboolean            visu_rendering_spin_setResourceFloat
                                                            (VisuElement *ele,
                                                             VisuRenderingSpinResources property,
                                                             gfloat value);
    gboolean            visu_rendering_spin_setResourceUint (VisuElement *ele,
                                                             VisuRenderingSpinResources property,
                                                             guint value);
    

    Object Hierarchy

      GObject
       +----VisuRendering
             +----VisuRenderingSpin
    

    Properties

      "cone-omega"               gfloat                : Read / Write
      "cone-phi"                 gfloat                : Read / Write
      "cone-theta"               gfloat                : Read / Write
      "hiding-mode"              guint                 : Read / Write
      "modulus-scaling"          guint                 : Read / Write
      "use-atomic"               gboolean              : Read / Write
    

    Description

    This method draws arrows to represent atoms. Each arrow has a given orientation which is set acording to parameters. This is one way to represent the spin of an atom. These arrows direction are determined by the spin of each atom. It is designed to read two separate files : one containing the position of the atoms, the other containing the spin of each atom. Of course these two files need to have the exact same number of atoms and also need to sort atoms in the same order.

    Details

    VISU_RENDERING_SPIN_MAX_MODULUS_ID

    #define VISU_RENDERING_SPIN_MAX_MODULUS_ID "spinRendering_maxModulus"
    

    This flag should be used when creating a new spin rendering method as the flag for the max modulus values as a VisuNode property (see visu_node_array_property_newPointer()).


    VISU_RENDERING_SPIN_NAME

    #define VISU_RENDERING_SPIN_NAME "Spin visualisation"
    

    Public name of the spin rendering mode.


    VISU_RENDERING_SPIN_VALUES_ID

    #define VISU_RENDERING_SPIN_VALUES_ID     "spinRendering_values"
    

    This flag should be used when creating a new spin rendering method as the flag for the spin values as node properties (see visu_node_array_property_newPointer()).


    VisuRenderingSpin

    typedef struct _VisuRenderingSpin VisuRenderingSpin;

    An opaque structure.


    VisuRenderingSpinClass

    typedef struct _VisuRenderingSpinClass VisuRenderingSpinClass;

    An opaque structure.


    enum VisuRenderingSpinDrawingPolicy

    typedef enum {
        VISU_RENDERING_SPIN_ALWAYS,    
        VISU_RENDERING_SPIN_HIDE_NULL,  
        VISU_RENDERING_SPIN_ATOMIC_NULL,
        VISU_RENDERING_SPIN_N_MODES
    } VisuRenderingSpinDrawingPolicy;
    

    Different policy to render the spin when the modulus is null. This policy is applied for all VisuElement.

    VISU_RENDERING_SPIN_ALWAYS

    Arrows are drawn whatever the modulus value.

    VISU_RENDERING_SPIN_HIDE_NULL

    Spin with a null modulus are hidden.

    VISU_RENDERING_SPIN_ATOMIC_NULL

    Follow atomic rendering for null modulus.

    VISU_RENDERING_SPIN_N_MODES

    a flag to count the number of modes.

    enum VisuRenderingSpinFileType

    typedef enum {
        FILE_KIND_POSITION,
        FILE_KIND_SPIN
    } VisuRenderingSpinFileType;
    

    These are keys for the storing of spin files in a VisuData object.

    FILE_KIND_POSITION

    define a position file ;

    FILE_KIND_SPIN

    define a spin description file.

    enum VisuRenderingSpinModulusPolicy

    typedef enum {
        VISU_RENDERING_SPIN_CONSTANT,    
        VISU_RENDERING_SPIN_PER_TYPE,  
        VISU_RENDERING_SPIN_GLOBAL,
        VISU_RENDERING_SPIN_N_MODULUS_MODES
    } VisuRenderingSpinModulusPolicy;
    

    Different policy to render the spin depending on the modulus.

    VISU_RENDERING_SPIN_CONSTANT

    arrows have all the same size, whatever the modulus value.

    VISU_RENDERING_SPIN_PER_TYPE

    arrows are scaled per node type.

    VISU_RENDERING_SPIN_GLOBAL

    arrows are scaled globaly.

    VISU_RENDERING_SPIN_N_MODULUS_MODES

    a flag to count the number of modes.

    enum VisuRenderingSpinResources

    typedef enum {
        VISU_RENDERING_SPIN_HAT_LENGTH,
        spin_VISU_RENDERING_SPIN_TAIL_LENGTH,
        VISU_RENDERING_SPIN_HAT_RADIUS,
        VISU_RENDERING_SPIN_TAIL_RADIUS,
        VISU_RENDERING_SPIN_HAT_COLOR,
        VISU_RENDERING_SPIN_TAIL_COLOR,
        VISU_RENDERING_SPIN_A_AXIS,
        VISU_RENDERING_SPIN_B_AXIS,
        VISU_RENDERING_SPIN_ELIPSOID_COLOR,
        VISU_RENDERING_SPIN_SHAPE,
        VISU_RENDERING_SPIN_N_RESOURCES
    } VisuRenderingSpinResources;
    

    These are resources defined for each element. They can be accessed with visu_rendering_spin_getResource() or visu_rendering_spin_getResourceBoolean() and other methods of the same kind.

    VISU_RENDERING_SPIN_HAT_LENGTH

    the length of the pointing element ;

    spin_VISU_RENDERING_SPIN_TAIL_LENGTH

    the length of the tail ;

    VISU_RENDERING_SPIN_HAT_RADIUS

    the raidus of the pointing element ;

    VISU_RENDERING_SPIN_TAIL_RADIUS

    the radius of the tail ;

    VISU_RENDERING_SPIN_HAT_COLOR

    if TRUE, the pointing part use the color of the element ;

    VISU_RENDERING_SPIN_TAIL_COLOR

    if TRUE, the tail uses the color of the element ;

    VISU_RENDERING_SPIN_A_AXIS

    the size of the A axis (elipsoid shape) ;

    VISU_RENDERING_SPIN_B_AXIS

    the size of the B axis (elipsoid shape) ;

    VISU_RENDERING_SPIN_ELIPSOID_COLOR

    if TRUE, the elipsoid uses the color of the element ;

    VISU_RENDERING_SPIN_SHAPE

    an id to defined the shape (rounded arrow, elipsoid...) ;

    VISU_RENDERING_SPIN_N_RESOURCES

    number of resources per element.

    enum VisuRenderingSpinShapeId

    typedef enum {
        VISU_RENDERING_SPIN_ARROW_SMOOTH,
        VISU_RENDERING_SPIN_ARROW_SHARP,
        VISU_RENDERING_SPIN_ELLIPSOID,
        VISU_RENDERING_SPIN_TORUS,
    } VisuRenderingSpinShapeId;
    

    An identifier for the different shapes to draw elements.

    VISU_RENDERING_SPIN_ARROW_SMOOTH

    the shape is smooth and rounded ;

    VISU_RENDERING_SPIN_ARROW_SHARP

    the shape is built on squares ;

    VISU_RENDERING_SPIN_ELLIPSOID

    the shape is an ellipsoid ;

    VISU_RENDERING_SPIN_TORUS

    the shape is a torus (direction of the arrow is normal to the torus plane).

    VISU_RENDERING_SPIN_N_SHAPES

    private.

    visu_rendering_spin_getHidingPolicyFromName ()

    VisuRenderingSpinDrawingPolicy visu_rendering_spin_getHidingPolicyFromName
                                                            (const char *name);

    In the config file, the hiding policy resource is stored with its name (untranslated). This method is used to retrieve the id from the name.

    name :

    a string. [type filename]

    Returns :

    the maximum value if the name is invalid.

    visu_rendering_spin_getHidingPolicyName ()

    const char *        visu_rendering_spin_getHidingPolicyName
                                                            (VisuRenderingSpinDrawingPolicy n);

    Transform ids to untranslated names.

    n :

    an id for hiding policy.

    Returns :

    the name associated to the id. [type filename]

    visu_rendering_spin_getHidingPolicyNameI18n ()

    const char *        visu_rendering_spin_getHidingPolicyNameI18n
                                                            (VisuRenderingSpinDrawingPolicy n);

    Transform ids to translated names.

    n :

    an id for hiding policy.

    Returns :

    the name associated to the id in UTF-8. [type utf8]

    visu_rendering_spin_getResource ()

    void                visu_rendering_spin_getResource     (VisuElement *ele,
                                                             VisuRenderingSpinResources property,
                                                             GValue *val);

    This is a generic method to access resources per element. Use visu_rendering_spin_setResourceBoolean() is favored if the type of the value is known (boolean in this exemple).

    ele :

    a pointer to a VisuElement object ;

    property :

    the id of the resource (see VisuRenderingSpinResources);

    val :

    a location to store the value. [out caller-allocates]

    Since 3.7


    visu_rendering_spin_getResourceBoolean ()

    gboolean            visu_rendering_spin_getResourceBoolean
                                                            (VisuElement *ele,
                                                             VisuRenderingSpinResources property);

    This is the specific method to retrieve value of boolean element resources.

    ele :

    a pointer to a VisuElement object ;

    property :

    the id of the property to get.

    Returns :

    the boolean value.

    visu_rendering_spin_getResourceFloat ()

    gfloat              visu_rendering_spin_getResourceFloat
                                                            (VisuElement *ele,
                                                             VisuRenderingSpinResources property);

    This is the specific method to retrieve value of floating point element resources.

    ele :

    a pointer to a VisuElement object ;

    property :

    the id of the property to get.

    Returns :

    the floating point value.

    visu_rendering_spin_getResourceUint ()

    guint               visu_rendering_spin_getResourceUint (VisuElement *ele,
                                                             VisuRenderingSpinResources property);

    This is the specific method to retrieve value of guint element resources.

    ele :

    a pointer to a VisuElement object ;

    property :

    the id of the property to get.

    Returns :

    the guint value.

    visu_rendering_spin_getShapeNameI18n ()

    const char *        visu_rendering_spin_getShapeNameI18n
                                                            (VisuRenderingSpinShapeId n);

    This routine returnes the translated name in UTF-8 corresponding to the given shape id.

    n :

    an id for spin shape.

    Returns :

    a string owned by V_Sim. [type utf8]

    visu_rendering_spin_new ()

    VisuRenderingSpin * visu_rendering_spin_new             ();

    Create the structure and initialise its values.

    Returns :

    a newly allocate VisuRenderingSpin object.

    Since 3.6


    visu_rendering_spin_setResource ()

    gboolean            visu_rendering_spin_setResource     (VisuElement *ele,
                                                             VisuRenderingSpinResources property,
                                                             GValue *val);

    The spin rendering method has properties stored for each element. Use this method to change the value of property for ele.

    ele :

    a VisuElement object.

    property :

    an id for element property.

    val :

    the value.

    Returns :

    TRUE if value is indeed changed.

    Since 3.7


    visu_rendering_spin_setResourceBoolean ()

    gboolean            visu_rendering_spin_setResourceBoolean
                                                            (VisuElement *ele,
                                                             VisuRenderingSpinResources property,
                                                             gboolean value);

    This method is used to change element resources that are boolean.

    ele :

    a pointer to a VisuElement object ;

    property :

    the id of the property to set ;

    value :

    its value.

    Returns :

    TRUE if the value was changed.

    visu_rendering_spin_setResourceFloat ()

    gboolean            visu_rendering_spin_setResourceFloat
                                                            (VisuElement *ele,
                                                             VisuRenderingSpinResources property,
                                                             gfloat value);

    This method is used to change element resources that are floating point.

    ele :

    a pointer to a VisuElement object ;

    property :

    the id of the property to set ;

    value :

    its value.

    Returns :

    TRUE if the value was changed.

    visu_rendering_spin_setResourceUint ()

    gboolean            visu_rendering_spin_setResourceUint (VisuElement *ele,
                                                             VisuRenderingSpinResources property,
                                                             guint value);

    This method is used to change element resources that are guint.

    ele :

    a pointer to a VisuElement object ;

    property :

    the id of the property to set ;

    value :

    its value.

    Returns :

    TRUE if the value was changed.

    Property Details

    The "cone-omega" property

      "cone-omega"               gfloat                : Read / Write

    The omega angle to orientate the colourisation cone.

    Allowed values: [0,360]

    Default value: 0


    The "cone-phi" property

      "cone-phi"                 gfloat                : Read / Write

    The phi angle to orientate the colourisation cone.

    Allowed values: [0,360]

    Default value: 0


    The "cone-theta" property

      "cone-theta"               gfloat                : Read / Write

    The theta angle to orientate the colourisation cone.

    Allowed values: [0,180]

    Default value: 0


    The "hiding-mode" property

      "hiding-mode"              guint                 : Read / Write

    The hiding policy for spin with a null modulus.

    Allowed values: <= 3

    Default value: 0


    The "modulus-scaling" property

      "modulus-scaling"          guint                 : Read / Write

    The scaling policy based on modulus value.

    Allowed values: <= 3

    Default value: 0


    The "use-atomic" property

      "use-atomic"               gboolean              : Read / Write

    If atomic rendering is used in addition to spin rendering.

    Default value: FALSE

    Signal Details

    The "colorisationChange" signal

    void                user_function                      (VisuRenderingSpin *render,
                                                            gpointer           user_data)      : No Hooks

    This signal is emitted whenever a change occur in the colourisation scheme of the spins.

    render :

    the object emitting the signal.

    user_data :

    user data set when the signal handler was connected.

    Since 3.6

    v_sim-3.7.0/Documentation/reference/html/v-sim-surfaces.html0000644000353400050620000017201412216331357021036 00000000000000 surfaces

    surfaces

    surfaces — Supports loading of .surf files and drawing of surfaces through OpenGL.

    Synopsis

    #define             VISU_ERROR_ISOSURFACES
    #define             VISU_SURFACES_PROPERTY_POTENTIAL
    struct              VisuSurfaces;
                        VisuSurfacesClass;
    void                visu_surfaces_add                   (VisuSurfaces *surf,
                                                             guint nsurf,
                                                             guint npolys,
                                                             guint npoints);
    float *             visu_surfaces_addPropertyFloat      (VisuSurfaces *surf,
                                                             const gchar *name);
    void                visu_surfaces_allocate              (VisuSurfaces *surf,
                                                             guint nsurf,
                                                             guint npolys,
                                                             guint npoints);
    void                visu_surfaces_checkConsistency      (VisuSurfaces *surf);
    GQuark              visu_surfaces_getErrorQuark         (void);
    int                 visu_surfaces_getId                 (VisuSurfaces *surf,
                                                             int i);
    guint               visu_surfaces_getN                  (VisuSurfaces *surf);
    const gchar *       visu_surfaces_getName               (VisuSurfaces *surf,
                                                             int surf_index);
    int                 visu_surfaces_getNewId              (VisuSurfaces *surf);
    int                 visu_surfaces_getPosition           (VisuSurfaces *surf,
                                                             int id);
    float *             visu_surfaces_getPropertyFloat      (VisuSurfaces *surf,
                                                             const gchar *name);
    gboolean            visu_surfaces_getPropertyValueFloat (VisuSurfaces *surf,
                                                             int idSurf,
                                                             const gchar *name,
                                                             float *value);
    gboolean            visu_surfaces_getRendered           (VisuSurfaces *surf,
                                                             int surf_index);
    VisuSurfacesResources * visu_surfaces_getResource       (VisuSurfaces *surf,
                                                             guint i);
    VisuSurfacesResources * visu_surfaces_getResourceById   (VisuSurfaces *surf,
                                                             int surf_index);
    int *               visu_surfaces_getSortedById         (VisuSurfaces *surf);
    gboolean            visu_surfaces_hide                  (VisuSurfaces *surf,
                                                             VisuPlane **planes);
    gboolean            visu_surfaces_loadFile              (const char *file,
                                                             VisuSurfaces **surf,
                                                             GError **error);
    VisuSurfaces *      visu_surfaces_new                   (guint bufferSize);
    gboolean            visu_surfaces_remove                (VisuSurfaces *surf,
                                                             int idSurf);
    gboolean            visu_surfaces_setColorAndMaterial   (VisuSurfaces *surf,
                                                             int surf_index,
                                                             ToolColor *color,
                                                             float material[VISU_GL_LIGHT_MATERIAL_N_VALUES]);
    gboolean            visu_surfaces_setRendered           (VisuSurfaces *surf,
                                                             int surf_index,
                                                             gboolean status);
    void                visu_surfaces_setResource           (VisuSurfaces *surf,
                                                             int surf_index,
                                                             VisuSurfacesResources *res);
    void                visu_surfaces_setShowAll            (VisuSurfaces *surf,
                                                             gboolean show);
    

    Object Hierarchy

      GObject
       +----VisuSurfaces
    

    Implemented Interfaces

    VisuSurfaces implements VisuBoxed.

    Description

    Originally written by Luc Billard for his Visualize program. This module allows loading of .surf files to draw scalar fields on top of the current display scene. .surf files are text files which specs are the following :

    • 1st line is arbitrary

    • 2nd line must contain 3 real (float) values: dxx dyx dyy

    • 3rd line must contain 3 real (float) values: dzx dzy dzz

    • 4th line must contain 3 positive integers which represents respectively the number of surfaces, the total number of polys, and the total number of points

    • Then, for each of these surfaces :

      • next line must contain the name of the surface : it is a string which should match the pattern surface_*

      • next line must contain 2 positive integer values: the number of polys (num_polys) and the number of points (num_points) used by the surface

      • each of the following num_polys lines must match the pattern [n i_1 i_2 i_3 ... i_n] where n is the number of vertices in the poly (n >= 3) and [i_1 i_2 i_3 ... i_n] are the numbering of these vertices (vertices numbered from 1 to num_points)

      • each of the following num_points lines must contain 6 real values for the successive (1 to num_points) points : [x y z nx ny nz], where x y z are the coordinates of the point and nx ny nz are the coordinates of the unit normal at the point

    It is the responsibility of the user to guarantee that dxx, dyx, dyy, dzx, dzy, dzz match the one currently loaded in V_Sim's current context. Though if you use panelSurfaces you can ask to resize the surfaces so that they fit in the current loaded box.

    Details

    VISU_ERROR_ISOSURFACES

    #define VISU_ERROR_ISOSURFACES visu_surfaces_getErrorQuark()
    

    Internal function for error handling.


    VISU_SURFACES_PROPERTY_POTENTIAL

    #define VISU_SURFACES_PROPERTY_POTENTIAL "potential_values"
    

    Flag used in an ASCII surf file to give informations on the value the surface is built from.


    struct VisuSurfaces

    struct VisuSurfaces;

    All fields are private, use the access routines.


    VisuSurfacesClass

    typedef struct _VisuSurfacesClass VisuSurfacesClass;

    An opaque structure.


    visu_surfaces_add ()

    void                visu_surfaces_add                   (VisuSurfaces *surf,
                                                             guint nsurf,
                                                             guint npolys,
                                                             guint npoints);

    Change the allocation of internal arrays to store the additional surfaces with the given description.

    surf :

    a VisuSurfaces structure ;

    nsurf :

    the number of surfaces to add ;

    npolys :

    the number of polygons to add ;

    npoints :

    the number of vertices to add.

    visu_surfaces_addPropertyFloat ()

    float *             visu_surfaces_addPropertyFloat      (VisuSurfaces *surf,
                                                             const gchar *name);

    Some properties can be associated to the surfaces stored in surf. This method is add a new property.

    surf :

    a VisuSurfaces object ;

    name :

    the name of the property to add.

    Returns :

    a newly allocated array that can be populated.

    visu_surfaces_allocate ()

    void                visu_surfaces_allocate              (VisuSurfaces *surf,
                                                             guint nsurf,
                                                             guint npolys,
                                                             guint npoints);

    Allocate internal arrays to store surfaces having the given description.

    surf :

    a VisuSurfaces structure ;

    nsurf :

    the number of surfaces to store ;

    npolys :

    the number of polygons (in total) ;

    npoints :

    the total number of vertices.

    visu_surfaces_checkConsistency ()

    void                visu_surfaces_checkConsistency      (VisuSurfaces *surf);

    Check if all arrays in the structures are consistent (without overflow).

    surf :

    a VisuSurfaces object.

    visu_surfaces_getErrorQuark ()

    GQuark              visu_surfaces_getErrorQuark         (void);

    Internal routine for error handling.

    Returns :

    the GQuark associated to errors related to surface files.

    visu_surfaces_getId ()

    int                 visu_surfaces_getId                 (VisuSurfaces *surf,
                                                             int i);

    This returns for the given i its id information.

    surf :

    the surface object ;

    i :

    the number of the surface.

    Returns :

    the id of the surface or 0, if i is invalid.

    visu_surfaces_getN ()

    guint               visu_surfaces_getN                  (VisuSurfaces *surf);

    Retrieves th number of surfaces stired in a given surf object.

    surf :

    the surface object.

    Returns :

    number of surfaces.

    visu_surfaces_getName ()

    const gchar *       visu_surfaces_getName               (VisuSurfaces *surf,
                                                             int surf_index);

    This returns for the given surf_index its name (1 <= surf_index <= surfaces_number)

    surf :

    the surface object ;

    surf_index :

    the number of the surface.

    Returns :

    the name of the surface or empty name or NULL, if surf_index is invalid.

    visu_surfaces_getNewId ()

    int                 visu_surfaces_getNewId              (VisuSurfaces *surf);

    This returns a unique id to create a new surface.

    surf :

    the surface object.

    Returns :

    a value suitable to create a new surface in this set of surfaces.

    visu_surfaces_getPosition ()

    int                 visu_surfaces_getPosition           (VisuSurfaces *surf,
                                                             int id);

    This returns for the given id its number.

    surf :

    the surface object ;

    id :

    the id of the surface.

    Returns :

    the number of the surface or 0, if id is invalid.

    visu_surfaces_getPropertyFloat ()

    float *             visu_surfaces_getPropertyFloat      (VisuSurfaces *surf,
                                                             const gchar *name);

    Some properties can be associated to the surfaces stored in surf. This method is used to retrieve floating point values properties.

    surf :

    a VisuSurfaces object ;

    name :

    the name of the property to look for.

    Returns :

    a table with the values if the property is found, NULL otherwise.

    visu_surfaces_getPropertyValueFloat ()

    gboolean            visu_surfaces_getPropertyValueFloat (VisuSurfaces *surf,
                                                             int idSurf,
                                                             const gchar *name,
                                                             float *value);

    This method retrieves a float value stored as a property called name for the surface defined by its number idSurf.

    surf :

    a VisuSurfaces object ;

    idSurf :

    a surface number ;

    name :

    the name of the property to get the value from ;

    value :

    a location to store the value.

    Returns :

    TRUE if a value is indeed found.

    visu_surfaces_getRendered ()

    gboolean            visu_surfaces_getRendered           (VisuSurfaces *surf,
                                                             int surf_index);

    This returns for the given surf_index its visibility.

    surf :

    the surface object ;

    surf_index :

    the number of the surface.

    Returns :

    the visibility of the surface or FALSE, if surf_index is invalid.

    visu_surfaces_getResource ()

    VisuSurfacesResources * visu_surfaces_getResource       (VisuSurfaces *surf,
                                                             guint i);

    This returns the resource of the ith stored surface. If the surface is known by its id, use visu_surfaces_getResourceById() instead.

    surf :

    the surface object ;

    i :

    the ith stored surface.

    Returns :

    the resource of the surface or NULL, if i is invalid. [transfer none]

    Since 3.7


    visu_surfaces_getResourceById ()

    VisuSurfacesResources * visu_surfaces_getResourceById   (VisuSurfaces *surf,
                                                             int surf_index);

    This returns for the given surf_index its resource information.

    surf :

    the surface object ;

    surf_index :

    the id of the surface.

    Returns :

    the resource of the surface or NULL, if surf_index is invalid. [transfer none]

    visu_surfaces_getSortedById ()

    int *               visu_surfaces_getSortedById         (VisuSurfaces *surf);

    This returns the surface numbers sorted using their ids.

    surf :

    the surface object.

    Returns :

    a newly allocated array with surface numbers.

    visu_surfaces_hide ()

    gboolean            visu_surfaces_hide                  (VisuSurfaces *surf,
                                                             VisuPlane **planes);

    Change the visibility of polygons stored in surf, following the masking scheme defined by the given list of planes (see VisuPlane).

    surf :

    a VisuSurfaces object ;

    planes :

    an array of planes (NULL terminated).

    Returns :

    TRUE if the surfaces visibility status have been changed.

    visu_surfaces_loadFile ()

    gboolean            visu_surfaces_loadFile              (const char *file,
                                                             VisuSurfaces **surf,
                                                             GError **error);

    This loads a surface file and set default material properties for it. See surf file specifications.

    file :

    target file to load ;

    surf :

    a set of surfaces (location) ;. [out][transfer full]

    error :

    a location to store errors.

    Returns :

    TRUE in case of success, FALSE otherwise. Even in case of success error may have been set. [skip]

    visu_surfaces_new ()

    VisuSurfaces *      visu_surfaces_new                   (guint bufferSize);

    Create a new (with unallocated internal arrays) structure to store surfaces. The buffer size is used to store other values than the position and the normal on each point.

    bufferSize :

    an integer.

    Returns :

    a newly allocated VisuSurfaces structure.

    visu_surfaces_remove ()

    gboolean            visu_surfaces_remove                (VisuSurfaces *surf,
                                                             int idSurf);

    Remove from memory all polygons from the given surface.

    surf :

    a VisuSurfaces object ;

    idSurf :

    the id of the surf to remove.

    Returns :

    TRUE if the surface list is reduced to zero (and surf to be freed).

    visu_surfaces_setColorAndMaterial ()

    gboolean            visu_surfaces_setColorAndMaterial   (VisuSurfaces *surf,
                                                             int surf_index,
                                                             ToolColor *color,
                                                             float material[VISU_GL_LIGHT_MATERIAL_N_VALUES]);

    Update the color and material property of given surface.

    surf :

    the surface object ;

    surf_index :

    the number of the surface.

    color :

    a ToolColor object. [transfer none]

    material :

    the material values. [array fixed-size=5]

    Returns :

    TRUE if the values are differents.

    Since 3.7


    visu_surfaces_setRendered ()

    gboolean            visu_surfaces_setRendered           (VisuSurfaces *surf,
                                                             int surf_index,
                                                             gboolean status);

    Change the visibility status of surface surf_index.

    surf :

    the surface object ;

    surf_index :

    the number of the surface.

    status :

    a boolean.

    Returns :

    TRUE if the visibility has been indeed changed.

    Since 3.7


    visu_surfaces_setResource ()

    void                visu_surfaces_setResource           (VisuSurfaces *surf,
                                                             int surf_index,
                                                             VisuSurfacesResources *res);

    This method is used to change the resource of a surface.

    surf :

    the surface object ;

    surf_index :

    the number of the surface ;

    res :

    the new resource.

    visu_surfaces_setShowAll ()

    void                visu_surfaces_setShowAll            (VisuSurfaces *surf,
                                                             gboolean show);

    Shows or hides all surfaces and check their "draw" status in the panel accordingly.

    surf :

    a VisuSurfaces object ;

    show :

    TRUE to show all surfaces, FALSE to hide them.

    Signal Details

    The "added" signal

    void                user_function                      (VisuSurfaces *surf,
                                                            gpointer      user_data)      : No Hooks

    Gets emitted when a new surface is added to the object.

    surf :

    the object which received the signal.

    user_data :

    user data set when the signal handler was connected.

    Since 3.7


    The "masked" signal

    void                user_function                      (VisuSurfaces *surf,
                                                            gpointer      user_data)      : No Hooks

    Gets emitted when a surface is shown or hidden by a plane.

    surf :

    the object which received the signal.

    user_data :

    user data set when the signal handler was connected.

    Since 3.7


    The "removed" signal

    void                user_function                      (VisuSurfaces *surf,
                                                            guint         idSurf,
                                                            gpointer      user_data)      : No Hooks

    Gets emitted when a surface is removed from the object.

    surf :

    the object which received the signal.

    idSurf :

    the id of the surface that has been removed.

    user_data :

    user data set when the signal handler was connected.

    Since 3.7


    The "rendering" signal

    void                user_function                      (VisuSurfaces *surf,
                                                            guint         idSurf,
                                                            gpointer      user_data)      : No Hooks

    Gets emitted when a rendering property of a surface is modified.

    surf :

    the object which received the signal.

    idSurf :

    the id of the surface that has been modified.

    user_data :

    user data set when the signal handler was connected.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/v-sim-surfaces-points.html0000644000353400050620000004701112216331357022346 00000000000000 surfaces_points

    surfaces_points

    surfaces_points — Define a structure to store a set of triangles defining a surface.

    Description

    This structure is used to store and draw polyedges as a set of XYZ points and a set of link to them.

    Details

    VISU_SURFACES_POINTS_OFFSET_NORMAL

    #define VISU_SURFACES_POINTS_OFFSET_NORMAL 3
    

    The offset to read the normal values in poly_points.


    VISU_SURFACES_POINTS_OFFSET_TRANSLATION

    #define VISU_SURFACES_POINTS_OFFSET_TRANSLATION 6
    

    The offset to read the translation values in poly_points.


    VISU_SURFACES_POINTS_OFFSET_USER

    #define VISU_SURFACES_POINTS_OFFSET_USER 9
    

    The offset to read the user values in poly_points.


    struct VisuSurfacesPoints

    struct VisuSurfacesPoints {
      /* Number of different surfaces. */
      guint nsurf;
      /* This is the size of additional data on each points in addition to
         (x,y,z) coordinates, normal and translation. Then poly_points is
         allocated to (num_points * (9 + bufferSize)). */
      guint bufferSize;
    
      /* Number of polygons */
      guint num_polys, num_points;
    
      /* Number of polygons per surface. */
      guint *num_polys_surf;
    
      /* Give the number of the surface when the number of the
         polygon is given. */
      int *poly_surf_index;
    
      /* Return the number of vertices when the id of
         the polygon is given. */
      guint *poly_num_vertices;
    
      /* Return the id in poly_points_data of the vertice j of polygon i. */
      guint **poly_vertices;
    
      /* Vectors giving points and normal of the vertice i. */
      float **poly_points_data;
    };
    

    This structure stores geometric description of surfaces. Several surfaces are stored in a single structure for improved performances.

    guint nsurf;

    number of surfaces encoded in this structure ;

    guint bufferSize;

    number of stored float in addition to coordinates and normals ;

    guint num_polys;

    number of polygoins stored in this structure ;

    guint num_points;

    number of vertices stored in this structure ;

    guint *num_polys_surf;

    number of visible polygons stored in this structure per surface ;

    int *poly_surf_index;

    gives the id of the surface for each polygon, this value ranges from - nsurf to + nsurf. abs(id - 1) gives the index of the surface the polygon is attached to. If values are negative, then the polygon is currently not used ;

    guint *poly_num_vertices;

    gives the number of vertices used by each polygons ;

    guint **poly_vertices;

    returns the id j of the vertices of polygon i ;

    float **poly_points_data;

    vectors giving additional data of vertex i.

    visu_surfaces_points_allocate ()

    void                visu_surfaces_points_allocate       (VisuSurfacesPoints *points,
                                                             int nsurf,
                                                             int npolys,
                                                             int npoints);

    Allocate the arrays to store a set of points.

    points :

    a pointer on a set of points (not allocated) ;

    nsurf :

    the number of stored surfaces ;

    npolys :

    the number of stored polygons ;

    npoints :

    the corresponding number of points ;

    visu_surfaces_points_check ()

    void                visu_surfaces_points_check          (VisuSurfacesPoints *points);

    A debug routines to check that all pointers and size are relevant. It should not be used outside a debug area because it can be slow.

    points :

    a set of points.

    visu_surfaces_points_free ()

    void                visu_surfaces_points_free           (VisuSurfacesPoints *points);

    Free all allocated arrays of the given set of points. The point structure itself is not freed.

    points :

    a set of points.

    visu_surfaces_points_init ()

    void                visu_surfaces_points_init           (VisuSurfacesPoints *points,
                                                             int bufferSize);

    Initialise a VisuSurfacesPoints structure. It must be done before any use.

    points :

    a pointer on a set of points (not initialised) ;

    bufferSize :

    the number of additional data to coordinates and normals.

    visu_surfaces_points_remove ()

    void                visu_surfaces_points_remove         (VisuSurfacesPoints *points,
                                                             guint pos);

    Remove the points belonging to surface number pos.

    points :

    a set of points ;

    pos :

    an integer between 0 and points->nsurf.

    visu_surfaces_points_transform ()

    void                visu_surfaces_points_transform      (VisuSurfacesPoints *points,
                                                             float trans[3][3]);

    Apply trans matrix to all vertices coordinates stored by points.

    points :

    a set of points.

    trans :

    a matrix.

    Since 3.7


    visu_surfaces_points_translate ()

    void                visu_surfaces_points_translate      (VisuSurfacesPoints *points,
                                                             float xyz[3]);

    In devel...

    points :

    a set of points.

    xyz :

    a given translation in cartesian coordinates.
    v_sim-3.7.0/Documentation/reference/html/v-sim-surfaces-resources.html0000644000353400050620000003323312216331357023045 00000000000000 surfaces_resources

    surfaces_resources

    surfaces_resources — Define the rendering parameters of a surface.

    Object Hierarchy

      GBoxed
       +----VisuSurfacesResources
    

    Description

    This structure stores all the rendering elements of a set of VisuSurfaces.

    Details

    struct VisuSurfacesResources

    struct VisuSurfacesResources {
      /* Name used to label the surface. */
      gchar *surfnom;
    
      /* VisuGlLightMaterial used to draw a specific surface. */
      ToolColor *color;
      float material[5];
    
      /* Rendered or not */
      gboolean rendered;
    
      /* Sensitive to masking properties of planes. */
      gboolean sensitiveToPlanes;
    };
    

    This structure defines some drawing properties of a set of VisuSurfaces.

    gchar *surfnom;

    the name of the surface (in UTF-8) ;

    ToolColor *color;

    a ToolColor for the surface ;

    float material[5];

    the lighting effects of the surface ;

    gboolean rendered;

    boolean for the visibility of the surface ;

    gboolean sensitiveToPlanes;

    boolean for the sensitivity of a surface to the masking effect of planes.

    visu_surfaces_resources_copy ()

    void                visu_surfaces_resources_copy        (VisuSurfacesResources *res,
                                                             VisuSurfacesResources *res_old);

    This method copies all values from res_old to res.

    res :

    an allocated VisuSurfacesResources object to receive values ;

    res_old :

    a VisuSurfacesResources to read the values from.

    visu_surfaces_resources_free ()

    void                visu_surfaces_resources_free        (VisuSurfacesResources *res);

    This method frees the memory used by the given resource.

    res :

    an allocated VisuSurfacesResources object to be freed.

    visu_surfaces_resources_getFromName ()

    VisuSurfacesResources * visu_surfaces_resources_getFromName
                                                            (const gchar *surf_name,
                                                             gboolean *new_surf);

    This returns the resource information matching the given surf_name. If the resource doesn't exist, it is created and new is set to TRUE. If the given name (surf_name) is NULL, then a new resource is created, but it is not stored and will not be shared by surfaces.

    surf_name :

    the name of the surface (can be NULL) ;

    new_surf :

    a location to store a boolean value (can be NULL).

    Returns :

    the resource (created or retrieved). [transfer none]

    visu_surfaces_resources_getRendered ()

    gboolean            visu_surfaces_resources_getRendered (const VisuSurfacesResources *res);

    Retrieves the rendering status of a surface.

    res :

    the resource storing rendering information of a surface.

    Returns :

    TRUE, if the resource indicate a renedered surface.

    Since 3.7


    visu_surfaces_resources_init ()

    void                visu_surfaces_resources_init        (void);

    Internal routine called automatically on VisuSurfacesClass creation. Do not use it.

    v_sim-3.7.0/Documentation/reference/html/v-sim-text.html0000644000353400050620000003355012216331357020210 00000000000000 text

    text

    text — Enables capabilities to write some text on rendering screen.

    Description

    For the moment, this module is very basic and the only fonts available is the helvetica 12 one. This module is currently broken under Windows.

    Details

    VisuGlTextFunc ()

    void                (*VisuGlTextFunc)                   (const gchar *text,
                                                             VisuGlTextSize size);

    A function that render iso8859-1 text at the current raster position.

    text :

    the text to render.

    size :

    the size for rendering.

    Since 3.7


    enum VisuGlTextSize

    typedef enum {
        VISU_GL_TEXT_NORMAL,
        VISU_GL_TEXT_SMALL
    } VisuGlTextSize;
    

    Different text size available in V_Sim.

    VISU_GL_TEXT_NORMAL

    normal size (14) ;

    VISU_GL_TEXT_SMALL

    small text (12).

    visu_gl_text_drawChars ()

    void                visu_gl_text_drawChars              (gchar *s,
                                                             VisuGlTextSize size);

    Draw the given string on the current raster position with default font.

    s :

    a string.

    size :

    the size of the text to render.

    visu_gl_text_initFontList ()

    void                visu_gl_text_initFontList           ();

    Initialise the font drawing with default font (depending on system). It must be called before visu_gl_text_drawChars() and not in a glNewList(). Can be called several times, fonts are initialized once only. Use visu_gl_text_rebuildFontList() to force to build a new font list.


    visu_gl_text_onNewContext ()

    void                visu_gl_text_onNewContext           ();

    Set the flag for text list build to FALSE. It will force to rebuild the text lists at next call of visu_gl_text_initFontList().

    Since 3.6


    visu_gl_text_putTextWithFTGL ()

    void                visu_gl_text_putTextWithFTGL        (const gchar *text,
                                                             VisuGlTextSize size);

    A VisuGlTextFunc routine using FTGL to render text with Pixmap lists, see visu_gl_text_setFunc().

    text :

    the text to write.

    size :

    the size.

    Since 3.7


    visu_gl_text_rebuildFontList ()

    void                visu_gl_text_rebuildFontList        ();

    Force to buid a new font list (for example new context has changed.


    visu_gl_text_setFontSize ()

    gboolean            visu_gl_text_setFontSize            (float size);

    Change the normal font size used by V_Sim (see VISU_GL_TEXT_NORMAL). The small font is scaled accordingly. This is working only with the FTGL backend.

    size :

    a new size.

    Returns :

    TRUE if font size is indeed changed.

    Since 3.7


    visu_gl_text_setFunc ()

    gboolean            visu_gl_text_setFunc                (VisuGlTextFunc func);

    Set the function to render text at the raster position.

    func :

    a VisuGlTextFunc function. [scope call][allow-none]

    Returns :

    TRUE if the function is indeed changed.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/v-sim-toolColor.html0000644000353400050620000010122312216331357021171 00000000000000 toolColor

    toolColor

    toolColor — Simple handling and storage of RGBA colours.

    Synopsis

    #define             TOOL_COLOR_MASK_A
    #define             TOOL_COLOR_MASK_B
    #define             TOOL_COLOR_MASK_G
    #define             TOOL_COLOR_MASK_R
    #define             TOOL_COLOR_MASK_RGBA
    struct              ToolColor;
    ToolColor *         tool_color_addColor                 (ToolColor *color);
    ToolColor *         tool_color_addFloatRGBA             (float rgba[4],
                                                             int *position);
    ToolColor *         tool_color_addIntRGBA               (int rgba[4]);
    void                tool_color_convertHSLtoRGB          (float *rgb,
                                                             float *hsl);
    void                tool_color_convertHSVtoRGB          (float *rgb,
                                                             float *hsv);
    void                tool_color_convertRGBtoHSL          (float *hsl,
                                                             float *rgb);
    void                tool_color_copy                     (ToolColor *color,
                                                             ToolColor *color_old);
    gboolean            tool_color_equal                    (ToolColor *color1,
                                                             ToolColor *color2);
    void                tool_color_freeAll                  (void);
    int                 tool_color_getByColor               (ToolColor *color);
    ToolColor *         tool_color_getById                  (int num);
    ToolColor *         tool_color_getByValues              (int *pos,
                                                             float red,
                                                             float green,
                                                             float blue,
                                                             float alpha);
    ToolColor *         tool_color_getLastStored            (void);
    GList *             tool_color_getStoredColors          (void);
    ToolColor *         tool_color_new                      (float rgba[4]);
    const ToolColor *   tool_color_new_bright               (guint id);
    

    Object Hierarchy

      GBoxed
       +----ToolColor
    

    Description

    This file defines a basic structure to store colours (not using the GDK one beca use V_Sim core should not rely on GDK and GTK): ToolColor. Several transformations are possible on a colour, going from and to RGB encoding. Use tool_color_convertHSVtoRGB() and tool_color_convertHSLtoRGB() to do that.

    This file gives also the capability to store known colours in a list. Use methods such as tool_color_addColor() or tool_color_addFloatRGBA(). Them, one can access to stored colours, using tool_color_getByValues() or tool_color_getByColor().

    Details

    TOOL_COLOR_MASK_A

    #define TOOL_COLOR_MASK_A (1 << 3)
    

    This value can be used to create a mask for methods that require one for reading rgb color array. This value actually correspond to the alpha channel.


    TOOL_COLOR_MASK_B

    #define TOOL_COLOR_MASK_B (1 << 2)
    

    This value can be used to create a mask for methods that require one for reading rgb color array. This value actually correspond to blue.


    TOOL_COLOR_MASK_G

    #define TOOL_COLOR_MASK_G (1 << 1)
    

    This value can be used to create a mask for methods that require one for reading rgb color array. This value actually correspond to green.


    TOOL_COLOR_MASK_R

    #define TOOL_COLOR_MASK_R (1 << 0)
    

    This value can be used to create a mask for methods that require one for reading rgb color array. This value actually correspond to red.


    TOOL_COLOR_MASK_RGBA

    #define TOOL_COLOR_MASK_RGBA (15)
    

    This value can be used to create a mask for methods that require one for reading rgb color array. This value is a shortcut for TOOL_COLOR_MASK_R | TOOL_COLOR_MASK_G | TOOL_COLOR_MASK_B.


    struct ToolColor

    struct ToolColor {
      float rgba[4];
      gpointer userData;
    };
    

    A structure to store colors.

    float rgba[4];

    the coding of color in Red, Green, Blue, Alpha format, floating point numbers between 0 and 1 ;

    gpointer userData;

    a pointer to store some data (should be used with care).

    tool_color_addColor ()

    ToolColor *         tool_color_addColor                 (ToolColor *color);

    This method copies color informations from color to the list of stored colors.

    color :

    a ToolColor.

    Returns :

    the newly created ToolColor. [transfer none]

    tool_color_addFloatRGBA ()

    ToolColor *         tool_color_addFloatRGBA             (float rgba[4],
                                                             int *position);

    This method adds a new color in the list of stored colors with the given values. If it already exits it returns the pointer of that color.

    rgba :

    four values between 0. and 1. that represent [Red, Green, Blue, Alpha] ;

    position :

    an int pointer to store the position of the returned colour. [out caller-allocates][allow-none]

    Returns :

    a newly created ToolColor or the already existing one. [transfer none]

    tool_color_addIntRGBA ()

    ToolColor *         tool_color_addIntRGBA               (int rgba[4]);

    This method adds a new color in the list of stored colors with the given values.

    rgba :

    four values between 0 and 255 that represent [Red, Green, Blue, Alpha].

    Returns :

    a newly created ToolColor or the already existing one. [transfer none]

    tool_color_convertHSLtoRGB ()

    void                tool_color_convertHSLtoRGB          (float *rgb,
                                                             float *hsl);

    This methods convert a HSL color to a RGB one.

    rgb :

    an allocated 3 elements array to receive the RGB values ;

    hsl :

    a 3 elements array to retrieve the HSL values from.

    tool_color_convertHSVtoRGB ()

    void                tool_color_convertHSVtoRGB          (float *rgb,
                                                             float *hsv);

    This methods convert a HSV color to a RGB one.

    rgb :

    an allocated 3 elements array to receive the RGB values ;

    hsv :

    a 3 elements array to retrieve the HSV values from.

    tool_color_convertRGBtoHSL ()

    void                tool_color_convertRGBtoHSL          (float *hsl,
                                                             float *rgb);

    Convert a RGB colour into a HSL one.

    hsl :

    three float to store the HSL value ;

    rgb :

    three floats giving the RGB values.

    tool_color_copy ()

    void                tool_color_copy                     (ToolColor *color,
                                                             ToolColor *color_old);

    This method copies all values from color_old to color.

    color :

    an allocated ToolColor object to receive values ;

    color_old :

    a ToolColor to read the values from.

    tool_color_equal ()

    gboolean            tool_color_equal                    (ToolColor *color1,
                                                             ToolColor *color2);

    Test if the two colours are the same.

    color1 :

    a ToolColor ;

    color2 :

    an other ToolColor.

    Returns :

    TRUE if the rgba attributes are the same.

    tool_color_freeAll ()

    void                tool_color_freeAll                  (void);

    Remove all previously stored colours.


    tool_color_getByColor ()

    int                 tool_color_getByColor               (ToolColor *color);

    This function retrieves the number (begining at 0) of the specified color.

    color :

    a pointer to a stored color.

    Returns :

    the position of the specified color or -1 if not found.

    tool_color_getById ()

    ToolColor *         tool_color_getById                  (int num);

    This function retrieves the nth stored color. Number 0, is the last added color.

    num :

    an integer (>0).

    Returns :

    the corresponding color, or NULL if none has been found. [transfer none]

    tool_color_getByValues ()

    ToolColor *         tool_color_getByValues              (int *pos,
                                                             float red,
                                                             float green,
                                                             float blue,
                                                             float alpha);

    This method is used to look for a specific color in the stored list. The argument pos is -1 if nothing is found or stores the position (beginning at 0) of the found color.

    pos :

    an allocated int to store the position of the found color ;. [out caller-allocates]

    red :

    a value between 0. and 1. ;

    green :

    a value between 0. and 1. ;

    blue :

    a value between 0. and 1. ;

    alpha :

    a value between 0. and 1..

    Returns :

    the found color, or NULL if none exists. [transfer none]

    tool_color_getLastStored ()

    ToolColor *         tool_color_getLastStored            (void);

    This method is typiccally called after a client has catched the colorNewAvailable signal.

    Returns :

    the last added color, NULL if no color exists. [transfer none]

    tool_color_getStoredColors ()

    GList *             tool_color_getStoredColors          (void);

    Use this method to get a pointeur to the list of stored colors.

    Returns :

    a GList pointer to the stored colors. [transfer none][element-type ToolColor]

    tool_color_new ()

    ToolColor *         tool_color_new                      (float rgba[4]);

    Create a new color with initial values given as arguments.

    rgba :

    four values between 0. and 1. that represent [Red, Green, Blue, Alpha].

    Returns :

    a new allocated ToolColor (use g_free() to free it). [transfer none]

    tool_color_new_bright ()

    const ToolColor *   tool_color_new_bright               (guint id);

    V_Sim has a list of 20 bright colors. One can get one by calling this routine. The id is taken modulo the number of available colors.

    id :

    an index

    Returns :

    a bright color. [transfer none]

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/v-sim-toolConfigFile.html0000644000353400050620000017724212216331357022136 00000000000000 toolConfigFile

    toolConfigFile

    toolConfigFile — Generic read methods of the configuration files are defined here.

    Synopsis

    #define             TOOL_CONFIG_FILE_ERROR
    enum                ToolConfigFileError;
    gboolean            tool_config_file_clampFloat         (float *variable,
                                                             float value,
                                                             float min,
                                                             float max);
    GQuark              tool_config_file_getQuark           ();
    gboolean            tool_config_file_readBoolean        (gchar *line,
                                                             int position,
                                                             gboolean *values,
                                                             guint size,
                                                             GError **error);
    gboolean            tool_config_file_readBooleanFromTokens
                                                            (gchar **tokens,
                                                             int *position,
                                                             gboolean *values,
                                                             guint size,
                                                             int lineId,
                                                             GError **error);
    gboolean            tool_config_file_readBooleanWithElement
                                                            (gchar *line,
                                                             int position,
                                                             gboolean *values,
                                                             guint size,
                                                             VisuElement **ele,
                                                             GError **error);
    gboolean            tool_config_file_readElementFromTokens
                                                            (gchar **tokens,
                                                             int *position,
                                                             VisuElement **values,
                                                             guint size,
                                                             int lineId,
                                                             GError **error);
    gboolean            tool_config_file_readFloat          (gchar *line,
                                                             int position,
                                                             float *values,
                                                             guint size,
                                                             GError **error);
    gboolean            tool_config_file_readFloatFromTokens
                                                            (gchar **tokens,
                                                             int *position,
                                                             float *values,
                                                             guint size,
                                                             int lineId,
                                                             GError **error);
    gboolean            tool_config_file_readFloatWithElement
                                                            (gchar *line,
                                                             int position,
                                                             float *values,
                                                             guint size,
                                                             VisuElement **ele,
                                                             GError **error);
    gboolean            tool_config_file_readInteger        (gchar *line,
                                                             int position,
                                                             int *values,
                                                             guint size,
                                                             GError **error);
    gboolean            tool_config_file_readIntegerFromTokens
                                                            (gchar **tokens,
                                                             int *position,
                                                             int *values,
                                                             guint size,
                                                             int lineId,
                                                             GError **error);
    gboolean            tool_config_file_readString         (gchar *line,
                                                             int position,
                                                             gchar ***values,
                                                             guint size,
                                                             gboolean join,
                                                             GError **error);
    gboolean            tool_config_file_readStringFromTokens
                                                            (gchar **tokens,
                                                             int *position,
                                                             gchar ***values,
                                                             guint size,
                                                             int lineId,
                                                             GError **error);
    gboolean            tool_config_file_readStringWithElement
                                                            (gchar *line,
                                                             int position,
                                                             gchar ***values,
                                                             guint size,
                                                             VisuElement **ele,
                                                             GError **error);
    

    Description

    These methods give generic tools to read common data in the configuration files, such as arrays of float values or one VisuElement... It also defines a enumeration of detailed errors (see ToolConfigFileError) when reading a file. All read elements are either from tokens (given g_strsplit()) or strings.

    Details

    TOOL_CONFIG_FILE_ERROR

    #define TOOL_CONFIG_FILE_ERROR tool_config_file_getQuark()
    

    Domain used to parse config files.


    enum ToolConfigFileError

    typedef enum {
        TOOL_CONFIG_FILE_ERROR_EMPTY_LINE,
        TOOL_CONFIG_FILE_ERROR_BAD_ELEMENT_NAME,
        TOOL_CONFIG_FILE_ERROR_MAX_ELEMENT,
        TOOL_CONFIG_FILE_ERROR_CREATED_ELEMENT,
        TOOL_CONFIG_FILE_ERROR_VALUE,
        TOOL_CONFIG_FILE_ERROR_READ,
        TOOL_CONFIG_FILE_ERROR_MISSING,
        TOOL_CONFIG_FILE_ERROR_TAG,
        TOOL_CONFIG_FILE_ERROR_MARKUP,
        TOOL_CONFIG_FILE_ERROR_NO_FILE
    } ToolConfigFileError;
    

    Possible errors when parsing a config file.

    TOOL_CONFIG_FILE_ERROR_EMPTY_LINE

    error when reading the file, found an empty line, where something should have been.

    TOOL_CONFIG_FILE_ERROR_BAD_ELEMENT_NAME

    error when reading a VisuElement name.

    TOOL_CONFIG_FILE_ERROR_MAX_ELEMENT

    error because too much VisuElement have been created.

    TOOL_CONFIG_FILE_ERROR_CREATED_ELEMENT

    error when creating a new VisuElement.

    TOOL_CONFIG_FILE_ERROR_VALUE

    error of file format, values read are out of bounds.

    TOOL_CONFIG_FILE_ERROR_READ

    error of file format (can't read variables...).

    TOOL_CONFIG_FILE_ERROR_MISSING

    error of file format (missing variables...).

    TOOL_CONFIG_FILE_ERROR_TAG

    error dealing with a tag.

    TOOL_CONFIG_FILE_ERROR_MARKUP

    error dealing with a markup (unkown one...).

    TOOL_CONFIG_FILE_ERROR_NO_FILE

    no valid file found on disk.

    tool_config_file_clampFloat ()

    gboolean            tool_config_file_clampFloat         (float *variable,
                                                             float value,
                                                             float min,
                                                             float max);

    It puts value in a variable if value is in min and max or put min or max in if not. It return true if value is out of bounds. Min and max are inclusive values. If there is no max bounds then put max at a lower value than min and if there is no min bound, put min at a higher value than max.

    variable :

    a pointer to a storage for the value ;

    value :

    the value to put in the storage ;

    min :

    a lower bound ;

    max :

    a upper bound.

    Returns :

    TRUE if the value is out of bounds.

    tool_config_file_getQuark ()

    GQuark              tool_config_file_getQuark           ();

    Internal routine for error handling.

    Returns :

    the GQuark associated to errors related to configuration files.

    tool_config_file_readBoolean ()

    gboolean            tool_config_file_readBoolean        (gchar *line,
                                                             int position,
                                                             gboolean *values,
                                                             guint size,
                                                             GError **error);

    Read size boolean values from line and store them in values.

    line :

    string where values are read from ;

    position :

    the number of the line of the config file which the line argument is taken from ;

    values :

    allocated area to store read values ;

    size :

    the number of boolean values to be read ;

    error :

    a location to store a possible reading error.

    Returns :

    TRUE if no error occured.

    tool_config_file_readBooleanFromTokens ()

    gboolean            tool_config_file_readBooleanFromTokens
                                                            (gchar **tokens,
                                                             int *position,
                                                             gboolean *values,
                                                             guint size,
                                                             int lineId,
                                                             GError **error);

    Read size boolean values from tokens, store them in values and returns the new head in tokens.

    tokens :

    array of tokens resulting from a call to g_strsplit() with " " as separator ;

    position :

    IN, the position of the beginning in tokens ; OUT, one token after the last read ;

    values :

    allocated area to store read values ;

    size :

    the number of floating point values to be read ;

    lineId :

    the number of the line of the config file which the line argument is taken from ;

    error :

    a location to store a possible reading error.

    Returns :

    TRUE if no error occured.

    tool_config_file_readBooleanWithElement ()

    gboolean            tool_config_file_readBooleanWithElement
                                                            (gchar *line,
                                                             int position,
                                                             gboolean *values,
                                                             guint size,
                                                             VisuElement **ele,
                                                             GError **error);

    Same as tool_config_file_readBoolean() but begins by reading an element at the begining of the line.

    line :

    string where values are read from ;

    position :

    the number of the line of the config file which the line argument is taken from ;

    values :

    allocated area to store read values ;

    size :

    the number of boolean values to be read ;

    ele :

    a pointer to a VisuElement location ;

    error :

    a location to store a possible reading error.

    Returns :

    TRUE if no error occured.

    tool_config_file_readElementFromTokens ()

    gboolean            tool_config_file_readElementFromTokens
                                                            (gchar **tokens,
                                                             int *position,
                                                             VisuElement **values,
                                                             guint size,
                                                             int lineId,
                                                             GError **error);

    Read size VisuElement from tokens, store them in values and returns the new head in tokens.

    tokens :

    array of tokens resulting from a call to g_strsplit() with " " as separator ;

    position :

    IN, the position of the beginning in tokens ; OUT, one token after the last read ;

    values :

    allocated area to store read values ;

    size :

    the number of VisuElement to be read ;

    lineId :

    the number of the line of the config file which the line argument is taken from ;

    error :

    a location to store a possible reading error.

    Returns :

    TRUE if no error occured.

    tool_config_file_readFloat ()

    gboolean            tool_config_file_readFloat          (gchar *line,
                                                             int position,
                                                             float *values,
                                                             guint size,
                                                             GError **error);

    Read size floating point values from line and store them in values.

    line :

    string where values are read from ;

    position :

    the number of the line of the config file which the line argument is taken from ;

    values :

    allocated area to store read values ;

    size :

    the number of floating point values to be read ;

    error :

    a location to store a possible reading error.

    Returns :

    TRUE if no error occured.

    tool_config_file_readFloatFromTokens ()

    gboolean            tool_config_file_readFloatFromTokens
                                                            (gchar **tokens,
                                                             int *position,
                                                             float *values,
                                                             guint size,
                                                             int lineId,
                                                             GError **error);

    Read size floating point values from tokens, store them in values and returns the new head in tokens.

    tokens :

    array of tokens resulting from a call to g_strsplit() with " " as separator ;

    position :

    IN, the position of the beginning in tokens ; OUT, one token after the last read ;

    values :

    allocated area to store read values ;

    size :

    the number of floating point values to be read ;

    lineId :

    the number of the line of the config file which the line argument is taken from ;

    error :

    a location to store a possible reading error.

    Returns :

    TRUE if no error occured.

    tool_config_file_readFloatWithElement ()

    gboolean            tool_config_file_readFloatWithElement
                                                            (gchar *line,
                                                             int position,
                                                             float *values,
                                                             guint size,
                                                             VisuElement **ele,
                                                             GError **error);

    Same as tool_config_file_readFloat() but begins by reading an element at the begining of the line.

    line :

    string where values are read from ;

    position :

    the number of the line of the config file which the line argument is taken from ;

    values :

    allocated area to store read values ;

    size :

    the number of floating point values to be read ;

    ele :

    a pointer to a VisuElement location ;

    error :

    a location to store a possible reading error.

    Returns :

    TRUE if no error occured.

    tool_config_file_readInteger ()

    gboolean            tool_config_file_readInteger        (gchar *line,
                                                             int position,
                                                             int *values,
                                                             guint size,
                                                             GError **error);

    Read size integers from line and store them in values.

    line :

    string where values are read from ;

    position :

    the number of the line of the config file which the line argument is taken from ;

    values :

    allocated area to store read values ;

    size :

    the number of floating point values to be read ;

    error :

    a location to store a possible reading error.

    Returns :

    TRUE if no error occured.

    tool_config_file_readIntegerFromTokens ()

    gboolean            tool_config_file_readIntegerFromTokens
                                                            (gchar **tokens,
                                                             int *position,
                                                             int *values,
                                                             guint size,
                                                             int lineId,
                                                             GError **error);

    Read size integer values from tokens, store them in values and returns the new head in tokens.

    tokens :

    array of tokens resulting from a call to g_strsplit() with " " as separator ;

    position :

    IN, the position of the beginning in tokens ; OUT, one token after the last read ;

    values :

    allocated area to store read values ;

    size :

    the number of floating point values to be read ;

    lineId :

    the number of the line of the config file which the line argument is taken from ;

    error :

    a location to store a possible reading error.

    Returns :

    TRUE if no error occured.

    tool_config_file_readString ()

    gboolean            tool_config_file_readString         (gchar *line,
                                                             int position,
                                                             gchar ***values,
                                                             guint size,
                                                             gboolean join,
                                                             GError **error);

    Read size strings from line and values points on them. If more strings than size are available, an error is raised ; except if join is TRUE. In that case, the method return size tokens, joining all remaining ones.

    line :

    string where values are read from ;

    position :

    the number of the line of the config file which the line argument is taken from ;

    values :

    a location to point on a gchar** ;

    size :

    the number of strings to be read ;

    join :

    a boolean ;

    error :

    a location to store a possible reading error.

    Returns :

    TRUE if no error occured, then values point on an allocated memory area that is NULL terminated and that must be freed with g_strfreev().

    tool_config_file_readStringFromTokens ()

    gboolean            tool_config_file_readStringFromTokens
                                                            (gchar **tokens,
                                                             int *position,
                                                             gchar ***values,
                                                             guint size,
                                                             int lineId,
                                                             GError **error);

    Read size strings from tokens, store them in values and returns the new head in tokens.

    tokens :

    array of tokens resulting from a call to g_strsplit() with " " as separator ;

    position :

    IN, the position of the beginning in tokens ; OUT, one token after the last read ;

    values :

    a location to point on a gchar** ;

    size :

    the number of floating point values to be read ;

    lineId :

    the number of the line of the config file which the line argument is taken from ;

    error :

    a location to store a possible reading error.

    Returns :

    TRUE if no error occured.

    tool_config_file_readStringWithElement ()

    gboolean            tool_config_file_readStringWithElement
                                                            (gchar *line,
                                                             int position,
                                                             gchar ***values,
                                                             guint size,
                                                             VisuElement **ele,
                                                             GError **error);

    Same as tool_config_file_readString() but begins by reading an element at the begining of the line.

    line :

    string where values are read from ;

    position :

    the number of the line of the config file which the line argument is taken from ;

    values :

    a location to point on a gchar** ;

    size :

    the number of strings to be read ;

    ele :

    a pointer to a VisuElement location ;

    error :

    a location to store a possible reading error.

    Returns :

    TRUE if no error occured, then values point on an allocated memory area that is NULL terminated and that must be freed with g_strfreev().
    v_sim-3.7.0/Documentation/reference/html/v-sim-toolFortran.html0000644000353400050620000007350512216331357021541 00000000000000 toolFortran

    toolFortran

    toolFortran — Introduces routines to read the binary Fortran data format.

    Synopsis

    enum                ToolFortranEndianId;
    gboolean            tool_fortran_readCharacter          (char *var,
                                                             guint nb,
                                                             FILE *flux,
                                                             GError **error,
                                                             ToolFortranEndianId endianness,
                                                             gboolean testFlag,
                                                             gboolean store);
    gboolean            tool_fortran_readDouble             (double *var,
                                                             guint nb,
                                                             FILE *flux,
                                                             GError **error,
                                                             ToolFortranEndianId endianness,
                                                             gboolean testFlag,
                                                             gboolean store);
    gboolean            tool_fortran_readFlag               (guint *nb,
                                                             FILE *flux,
                                                             GError **error,
                                                             ToolFortranEndianId endianness);
    gboolean            tool_fortran_readInteger            (guint *var,
                                                             guint nb,
                                                             FILE *flux,
                                                             GError **error,
                                                             ToolFortranEndianId endianness,
                                                             gboolean testFlag,
                                                             gboolean store);
    gboolean            tool_fortran_readReal               (float *var,
                                                             guint nb,
                                                             FILE *flux,
                                                             GError **error,
                                                             ToolFortranEndianId endianness,
                                                             gboolean testFlag,
                                                             gboolean store);
    gboolean            tool_fortran_testEndianness         (guint nb,
                                                             FILE *flux,
                                                             GError **error,
                                                             ToolFortranEndianId *endianness);
    

    Description

    In Fortran binary data are written inside tags. These tags give the size to the data that are between. The routines in this module can read these tags and the data inside. One must know the endianness of the file and the kind of data to be read (integer, float, double...). If the first tag is known, one can test the endianness of the file calling tool_fortran_testEndianness().

    The size of the tag (32 bits or 64 bits) is not modifiable for the moment and is fixed at 32 bits. This may be changed in the futur with the same kind of things that for endianness.

    Details

    enum ToolFortranEndianId

    typedef enum {
        TOOL_FORTRAN_ENDIAN_KEEP,
        TOOL_FORTRAN_ENDIAN_CHANGE
    } ToolFortranEndianId;
    

    Thiese ids are used when reading a multi-bytes information from a binary file.

    TOOL_FORTRAN_ENDIAN_KEEP

    read a file without inverting records.

    TOOL_FORTRAN_ENDIAN_CHANGE

    read a file inverting records.

    tool_fortran_readCharacter ()

    gboolean            tool_fortran_readCharacter          (char *var,
                                                             guint nb,
                                                             FILE *flux,
                                                             GError **error,
                                                             ToolFortranEndianId endianness,
                                                             gboolean testFlag,
                                                             gboolean store);

    Read an array of characters from a fortran record. The endianness is required to read the Fortran flag. If argument store is FALSE, then the file is read and consistency checked but no data is stored. In that case, var can be not allocated.

    var :

    an allocated array of char ;

    nb :

    the size of the array var ;

    flux :

    a pointer on an opened file ;

    error :

    a pointer to an error location ;

    endianness :

    reverse or not the order of multi-bytes ;

    testFlag :

    if TRUE, read start and stop flags and test their values ;

    store :

    a boolean.

    Returns :

    TRUE if everything went right.

    tool_fortran_readDouble ()

    gboolean            tool_fortran_readDouble             (double *var,
                                                             guint nb,
                                                             FILE *flux,
                                                             GError **error,
                                                             ToolFortranEndianId endianness,
                                                             gboolean testFlag,
                                                             gboolean store);

    Read an array of doubles from a fortran record. If argument store is FALSE, then the file is read and consistency checked but no data is stored. In that case, var can be not allocated.

    var :

    an allocated array of double ;

    nb :

    the size of the array var ;

    flux :

    a pointer on an opened file ;

    error :

    a pointer to an error location ;

    endianness :

    reverse or not the order of multi-bytes ;

    testFlag :

    if TRUE, read start and stop flags and test their values ;

    store :

    a boolean.

    Returns :

    TRUE if everything went right.

    tool_fortran_readFlag ()

    gboolean            tool_fortran_readFlag               (guint *nb,
                                                             FILE *flux,
                                                             GError **error,
                                                             ToolFortranEndianId endianness);

    Read the flag of a record (a 32bits integer).

    nb :

    a location t store the value of the flag ;

    flux :

    a pointer on an opened file ;

    error :

    a pointer to an error location ;

    endianness :

    reverse or not the order of multi-bytes.

    Returns :

    TRUE if everything went right.

    tool_fortran_readInteger ()

    gboolean            tool_fortran_readInteger            (guint *var,
                                                             guint nb,
                                                             FILE *flux,
                                                             GError **error,
                                                             ToolFortranEndianId endianness,
                                                             gboolean testFlag,
                                                             gboolean store);

    Read an array of integers from a fortran record. If argument store is FALSE, then the file is read and consistency checked but no data is stored. In that case, var can be not allocated.

    var :

    an allocated array of int ;

    nb :

    the size of the array var ;

    flux :

    a pointer on an opened file ;

    error :

    a pointer to an error location ;

    endianness :

    reverse or not the order of multi-bytes ;

    testFlag :

    if TRUE, read start and stop flags and test their values ;

    store :

    a boolean.

    Returns :

    TRUE if everything went right.

    tool_fortran_readReal ()

    gboolean            tool_fortran_readReal               (float *var,
                                                             guint nb,
                                                             FILE *flux,
                                                             GError **error,
                                                             ToolFortranEndianId endianness,
                                                             gboolean testFlag,
                                                             gboolean store);

    Read an array of reals from a fortran record. If argument store is FALSE, then the file is read and consistency checked but no data is stored. In that case, var can be not allocated.

    var :

    an allocated array of float ;

    nb :

    the size of the array var ;

    flux :

    a pointer on an opened file ;

    error :

    a pointer to an error location ;

    endianness :

    reverse or not the order of multi-bytes ;

    testFlag :

    if TRUE, read start and stop flags and test their values ;

    store :

    a boolean.

    Returns :

    TRUE if everything went right.

    tool_fortran_testEndianness ()

    gboolean            tool_fortran_testEndianness         (guint nb,
                                                             FILE *flux,
                                                             GError **error,
                                                             ToolFortranEndianId *endianness);

    Read a flag and compare the value with nb for little and big endian. It return the value of endianness to be used after. The file is rewind after the call.

    nb :

    the value of the flag to read ;

    flux :

    a pointer on an opened file ;

    error :

    a pointer to an error location ;

    endianness :

    a location to store the endianness.

    Returns :

    TRUE if everything went right.
    v_sim-3.7.0/Documentation/reference/html/v-sim-toolMatrix.html0000644000353400050620000013110312216331357021357 00000000000000 toolMatrix

    toolMatrix

    toolMatrix — Defines basic handlings on matrix.

    Synopsis

    #define             TOOL_XYZ_MASK_ALL
    #define             TOOL_XYZ_MASK_X
    #define             TOOL_XYZ_MASK_Y
    #define             TOOL_XYZ_MASK_Z
    struct              ToolGridSize;
    enum                ToolMatrixScalingFlag;
    enum                ToolMatrixSphericalCoord;
    struct              ToolVector;
    void                tool_matrix_cartesianToSpherical    (float *spherical,
                                                             float *cartesian);
    float               tool_matrix_determinant             (float mat[3][3]);
    void                tool_matrix_dtof                    (float mf[3][3],
                                                             double md[3][3]);
    gboolean            tool_matrix_getInter2D              (float *lambda,
                                                             float a[2],
                                                             float b[2],
                                                             float A[2],
                                                             float B[2]);
    gboolean            tool_matrix_getInter2DFromList      (float i[2],
                                                             float *lambda,
                                                             float a[2],
                                                             float b[2],
                                                             GList *set);
    gboolean            tool_matrix_getRotationFromFull     (float rot[3][3],
                                                             double full[3][3],
                                                             double box[6]);
    double              tool_matrix_getScaledLinear         (double x,
                                                             double minmax[2]);
    double              tool_matrix_getScaledLinearInv      (double x,
                                                             double minmax[2]);
    double              tool_matrix_getScaledLog            (double x,
                                                             double minmax[2]);
    double              tool_matrix_getScaledLogInv         (double x,
                                                             double minmax[2]);
    double              (*tool_matrix_getScaledValue)       (double x,
                                                             double minmax[2]);
    double              tool_matrix_getScaledZeroCentredLog (double x,
                                                             double minmax[2]);
    double              tool_matrix_getScaledZeroCentredLogInv
                                                            (double x,
                                                             double minmax[2]);
    void                tool_matrix_init                    (void);
    gboolean            tool_matrix_invert                  (float inv[3][3],
                                                             float mat[3][3]);
    void                tool_matrix_productMatrix           (float matRes[3][3],
                                                             float matA[3][3],
                                                             float matB[3][3]);
    void                tool_matrix_productVector           (float vectRes[3],
                                                             float mat[3][3],
                                                             float vect[3]);
    gboolean            tool_matrix_reducePrimitiveVectors  (double reduced[6],
                                                             double full[3][3]);
    void                tool_matrix_setIdentity             (float mat[3][3]);
    void                tool_matrix_sphericalToCartesian    (float *cartesian,
                                                             float *spherical);
    

    Description

    Some very basic linear algebra are redefined here. It also gives access to coordinates conversion, essentially between cartesian and spherical.

    Details

    TOOL_XYZ_MASK_ALL

    #define TOOL_XYZ_MASK_ALL (7)
    

    This value can be used to create a mask for methods that require one for reading xyz coordinates array. This value is a shortcut for TOOL_XYZ_MASK_X | TOOL_XYZ_MASK_Y | TOOL_XYZ_MASK_Z.

    Since 3.3


    TOOL_XYZ_MASK_X

    #define TOOL_XYZ_MASK_X (1 << 0)
    

    This value can be used to create a mask for methods that require one for reading xyz coordinates array. This value actually correspond to the x direction.

    Since 3.3


    TOOL_XYZ_MASK_Y

    #define TOOL_XYZ_MASK_Y (1 << 1)
    

    This value can be used to create a mask for methods that require one for reading xyz coordinates array. This value actually correspond to the y direction.

    Since 3.3


    TOOL_XYZ_MASK_Z

    #define TOOL_XYZ_MASK_Z (1 << 2)
    

    This value can be used to create a mask for methods that require one for reading xyz coordinates array. This value actually correspond to the z direction.

    Since 3.3


    struct ToolGridSize

    struct ToolGridSize {
      guint grid[3];
    };
    

    Structure used for bindings.

    guint grid[3];

    . [array fixed-size=3][element-type guint]

    Since 3.7


    enum ToolMatrixScalingFlag

    typedef enum {
        TOOL_MATRIX_SCALING_LINEAR,
        TOOL_MATRIX_SCALING_LOG,
        TOOL_MATRIX_SCALING_ZERO_CENTRED_LOG,
        TOOL_MATRIX_SCALING_N_VALUES
    } ToolMatrixScalingFlag;
    

    Flag used to specify the transformation for scalarFieldDraw_map() routine.

    TOOL_MATRIX_SCALING_LINEAR

    a linear convertion from [min,max] to [0,1] ;

    TOOL_MATRIX_SCALING_LOG

    a TOOL_MATRIX_SCALING_LOGic transformation from [min,max] to [0,1], the formula is -(f(x) - f(m) / f(m) where f(x) = ln((x-xmin)/(xmax-xmin)) ;

    TOOL_MATRIX_SCALING_ZERO_CENTRED_LOG

    a TOOL_MATRIX_SCALING_LOGic transformation for data that are zero centred, the formula is 0.5+s*(log(MAX*SEUIL)-log(max(abs(x),MAX*SEUIL)))/(2*log(SEUIL)) where s is the sign, max=max(xmax,-xmin) and seuil a parameter (1e-5).

    TOOL_MATRIX_SCALING_N_VALUES

    number of available scale functions.

    Since 3.4


    enum ToolMatrixSphericalCoord

    typedef enum {
        TOOL_MATRIX_SPHERICAL_MODULUS,
        TOOL_MATRIX_SPHERICAL_THETA,
        TOOL_MATRIX_SPHERICAL_PHI
    } ToolMatrixSphericalCoord;
    

    This is used to access the ordering of the vectors with tool_matrix_cartesianToSpherical() or with tool_matrix_sphericalToCartesian().

    TOOL_MATRIX_SPHERICAL_MODULUS

    the modulus of a spherical vector.

    TOOL_MATRIX_SPHERICAL_THETA

    the theta angle of a spherical vector.

    TOOL_MATRIX_SPHERICAL_PHI

    the phi angle of a spherical vector.

    Since 3.6


    struct ToolVector

    struct ToolVector {
      float vect[3];
    };
    

    Structure used for bindings.

    float vect[3];

    . [array fixed-size=3][element-type gfloat]

    Since 3.7


    tool_matrix_cartesianToSpherical ()

    void                tool_matrix_cartesianToSpherical    (float *spherical,
                                                             float *cartesian);

    A method to transform cartesian coordinates in spherical coordinates (radius, phi and theta).

    spherical :

    an allocated array of 3 floating point values to store the result ;

    cartesian :

    an allocated array of 3 floating point values to read the input.

    Since 3.3


    tool_matrix_determinant ()

    float               tool_matrix_determinant             (float mat[3][3]);

    Calculate the determinant of matrix mat.

    mat :

    a matrix.

    Returns :

    the determinant value.

    Since 3.6


    tool_matrix_dtof ()

    void                tool_matrix_dtof                    (float mf[3][3],
                                                             double md[3][3]);

    Cast md into mf.

    mf :

    a matrix in single precision.

    md :

    a matrix in double precision.

    Since 3.7


    tool_matrix_getInter2D ()

    gboolean            tool_matrix_getInter2D              (float *lambda,
                                                             float a[2],
                                                             float b[2],
                                                             float A[2],
                                                             float B[2]);

    Get the intersection coeeficient of lines [ab] and [AB].

    lambda :

    a location to store a float.

    a :

    a point.

    b :

    another point.

    A :

    a point.

    B :

    another point.

    Returns :

    TRUE if [ab] and [AB] have an intersection.

    tool_matrix_getInter2DFromList ()

    gboolean            tool_matrix_getInter2DFromList      (float i[2],
                                                             float *lambda,
                                                             float a[2],
                                                             float b[2],
                                                             GList *set);

    Same as tool_matrix_getInter2D(), but from a list of points.

    i :

    a location to store a point.

    lambda :

    a location to store a float.

    a :

    a point.

    b :

    another point.

    set :

    a list of points.

    Returns :

    TRUE if an intersection exists.

    tool_matrix_getRotationFromFull ()

    gboolean            tool_matrix_getRotationFromFull     (float rot[3][3],
                                                             double full[3][3],
                                                             double box[6]);

    There is a rotation matrix to transform from full cartesian coordinates into reduced box cartesian coordinates.

    rot :

    a rotation matrix (out values).

    full :

    the description of basis set in full development.

    box :

    the description of basis set in align X axis.

    Returns :

    TRUE if full does not describe properly a 3D box.

    Since 3.6


    tool_matrix_getScaledLinear ()

    double              tool_matrix_getScaledLinear         (double x,
                                                             double minmax[2]);

    Transform x into [0;1] with a linear scale.

    x :

    the initial value ;

    minmax :

    the boundaries for the x argument ;

    Returns :

    a value into [0;1].

    Since 3.5


    tool_matrix_getScaledLinearInv ()

    double              tool_matrix_getScaledLinearInv      (double x,
                                                             double minmax[2]);

    Reverse function for tool_matrix_getScaledLinear().

    x :

    the initial value ;

    minmax :

    the boundaries for the x argument.

    Returns :

    a value into [0;1].

    Since 3.5


    tool_matrix_getScaledLog ()

    double              tool_matrix_getScaledLog            (double x,
                                                             double minmax[2]);

    Transform x into [0;1] with a log scale.

    x :

    the initial value ;

    minmax :

    the boundaries for the x argument.

    Returns :

    a value into [0;1].

    Since 3.5


    tool_matrix_getScaledLogInv ()

    double              tool_matrix_getScaledLogInv         (double x,
                                                             double minmax[2]);

    Reverse function for tool_matrix_getScaledLog().

    x :

    the initial value ;

    minmax :

    the boundaries for the x argument.

    Returns :

    a value into [0;1].

    Since 3.5


    tool_matrix_getScaledValue ()

    double              (*tool_matrix_getScaledValue)       (double x,
                                                             double minmax[2]);

    Transform x into [0;1] using the given minmax values.

    x :

    the initial value ;

    minmax :

    the boundaries for the x argument.

    Returns :

    a value into [0;1].

    Since 3.4


    tool_matrix_getScaledZeroCentredLog ()

    double              tool_matrix_getScaledZeroCentredLog (double x,
                                                             double minmax[2]);

    Transform x into [0;1] with a log scale with zero centred values.

    x :

    the initial value ;

    minmax :

    the boundaries for the x argument.

    Returns :

    a value into [0;1].

    Since 3.5


    tool_matrix_getScaledZeroCentredLogInv ()

    double              tool_matrix_getScaledZeroCentredLogInv
                                                            (double x,
                                                             double minmax[2]);

    Reverse function for tool_matrix_getScaledZeroCentredLog().

    x :

    the initial value ;

    minmax :

    the boundaries for the x argument.

    Returns :

    a value into [0;1].

    Since 3.5


    tool_matrix_init ()

    void                tool_matrix_init                    (void);

    This method is used by V_Sim internally and should not be called.

    Since 3.5


    tool_matrix_invert ()

    gboolean            tool_matrix_invert                  (float inv[3][3],
                                                             float mat[3][3]);

    Calculate the inverse matrix of matrix mat and store it in inv.

    inv :

    a matrix (out values).

    mat :

    a matrix.

    Returns :

    FALSE if mat is singular.

    Since 3.6


    tool_matrix_productMatrix ()

    void                tool_matrix_productMatrix           (float matRes[3][3],
                                                             float matA[3][3],
                                                             float matB[3][3]);

    Compute the mathematical product between matA and matB and put the result matrix in matRes.

    matRes :

    an array of floating point values of size 3x3 ;

    matA :

    an array of floating point values of size 3x3 ;

    matB :

    an array of floating point values of size 3x3.

    Since 3.2


    tool_matrix_productVector ()

    void                tool_matrix_productVector           (float vectRes[3],
                                                             float mat[3][3],
                                                             float vect[3]);

    Compute the mathematical product between matA and vect and put the result vector in vectRes.

    vectRes :

    an array of floating point values of size 3 ;

    mat :

    an array of floating point values of size 3x3 ;

    vect :

    an array of floating point values of size 3.

    Since 3.2


    tool_matrix_reducePrimitiveVectors ()

    gboolean            tool_matrix_reducePrimitiveVectors  (double reduced[6],
                                                             double full[3][3]);

    This routine transforms the given matrix full into a reduced array used by V_Sim to store box definition.

    reduced :

    a storage for 6 floating point values ;. [out caller-allocates][array fixed-size=6]

    full :

    a full 3x3 matrix to be transformed. [in][array fixed-size=9]

    Returns :

    FALSE if the given matrix is planar.

    tool_matrix_setIdentity ()

    void                tool_matrix_setIdentity             (float mat[3][3]);

    Initialise mat with the identity.

    mat :

    a matrix location. [array fixed-size=9]

    Since 3.7


    tool_matrix_sphericalToCartesian ()

    void                tool_matrix_sphericalToCartesian    (float *cartesian,
                                                             float *spherical);

    A method to transform spherical coordinates (radius, phi and theta) to cartesian coordinates.

    cartesian :

    an allocated array of 3 floating point values to store the result ;

    spherical :

    an allocated array of 3 floating point values to read the input.

    Since 3.3

    v_sim-3.7.0/Documentation/reference/html/v-sim-toolOptions.html0000644000353400050620000004034512216331357021555 00000000000000 toolOptions

    toolOptions

    toolOptions — A convienent wrapper around GHashTable that can support types.

    Description

    This wrapper is a simple way to store integers, floating point values or booleans in a table, accessing with a string key and remembering their types.

    Details

    ToolOption

    typedef struct _ToolOption ToolOption;

    An opaque structure to store values. It is equivalent to GValue but with a name and a label.


    tool_option_copy ()

    ToolOption *        tool_option_copy                    (const ToolOption *from);

    Create a new ToolOption using the values from option from.

    from :

    an existing ToolOption.

    Returns :

    a newly created option, use tool_option_free() to free it. [transfer none]

    tool_option_free ()

    void                tool_option_free                    (ToolOption *option);

    Free the memory used by the data.

    option :

    the Option to free.

    tool_option_getLabel ()

    const gchar *       tool_option_getLabel                (ToolOption *option);

    Get the label of the option.

    option :

    the Option to get the label of.

    Returns :

    a string owned by V_Sim, should not be freed.

    tool_option_getName ()

    const gchar *       tool_option_getName                 (ToolOption *option);

    Get the name of the option.

    option :

    the Option to get the name of.

    Returns :

    a string owned by V_Sim, should not be freed.

    tool_option_getType ()

    GType               tool_option_getType                 (ToolOption *option);

    Get the type of the option.

    option :

    the Option to get the type of.

    Returns :

    a OptionTypes value.

    tool_option_getValue ()

    GValue *            tool_option_getValue                (ToolOption *option);

    Get the location of the storage for the option.

    option :

    a Option object.

    Returns :

    the GValue storing the option value.

    tool_option_getValueAndLabel ()

    gchar *             tool_option_getValueAndLabel        (ToolOption *option);

    This method returns a string with the value followed by the label in parenthesis and with Pango markup for smaller font.

    option :

    the Option to get the value from.

    Returns :

    a newly created markup string.

    tool_option_new ()

    ToolOption *        tool_option_new                     (const gchar *name,
                                                             const gchar *label,
                                                             GType g_type);

    Create a new Option using the name as identifier.

    name :

    a string identifying the option ;

    label :

    a string describing shortly the option (must be in UTF-8).

    g_type :

    the type of option to create.

    Returns :

    a newly created option, use tool_option_free() to free it. [transfer none]
    v_sim-3.7.0/Documentation/reference/html/v-sim-toolPhysic.html0000644000353400050620000003415412216331357021362 00000000000000 toolPhysic

    toolPhysic

    toolPhysic — introduce physical values for the chemical species.

    Synopsis

    enum                ToolUnits;
    gboolean            tool_physic_getSymbolFromZ          (gchar **name,
                                                             float *radcov,
                                                             int zele);
    ToolUnits           tool_physic_getUnitFromName         (const gchar *name);
    const gchar **      tool_physic_getUnitNames            (void);
    float               tool_physic_getUnitValueInMeter     (ToolUnits unit);
    gboolean            tool_physic_getZFromSymbol          (int *zele,
                                                             float *radcov,
                                                             gchar *symbol);
    

    Description

    This is a data base associating symbol names and atomic numbers. One can also get the covalent radius of chemical species. It is convenient to plot bindings.

    Details

    enum ToolUnits

    typedef enum {
        TOOL_UNITS_UNDEFINED,
        TOOL_UNITS_BOHR,
        TOOL_UNITS_ANGSTROEM,
        TOOL_UNITS_NANOMETER,
    } ToolUnits;
    

    The possible length units defined in V_Sim. The special case TOOL_UNITS_UNDEFINED means that a unit must be defined before any conversion operations may be done.

    TOOL_UNITS_UNDEFINED

    the units are undefined.

    TOOL_UNITS_BOHR

    the length are given in Bohr (1ang = 0.529177Bohr);

    TOOL_UNITS_ANGSTROEM

    the length are given in angstroems ;

    TOOL_UNITS_NANOMETER

    the length are given in nanometers.

    TOOL_UNITS_N_VALUES

    private.

    Since 3.5


    tool_physic_getSymbolFromZ ()

    gboolean            tool_physic_getSymbolFromZ          (gchar **name,
                                                             float *radcov,
                                                             int zele);

    Get the symbol or the covalence radius of the argument zele.

    name :

    a pointer on an unallocated string (can be NULL) ;. [out][allow-none]

    radcov :

    a pointer on a float (can be NULL) ;. [out][allow-none]

    zele :

    the atomic number.

    Returns :

    TRUE if zele is known in the atomic built-in list.

    tool_physic_getUnitFromName ()

    ToolUnits           tool_physic_getUnitFromName         (const gchar *name);

    Find the unit corresponding to the name. If none is found, TOOL_UNITS_UNDEFINED is returned.

    name :

    a unit name.

    Returns :

    a ToolUnits.

    Since 3.5


    tool_physic_getUnitNames ()

    const gchar **      tool_physic_getUnitNames            (void);

    It provides the names corresponding to each units.

    Returns :

    an array, null terminated of strings. It is owned by V_Sim. [transfer none][array zero-terminated=1]

    Since 3.5


    tool_physic_getUnitValueInMeter ()

    float               tool_physic_getUnitValueInMeter     (ToolUnits unit);

    It provides the factor used to transform unit into meters.

    unit :

    a ToolUnits.

    Returns :

    a factor.

    Since 3.5


    tool_physic_getZFromSymbol ()

    gboolean            tool_physic_getZFromSymbol          (int *zele,
                                                             float *radcov,
                                                             gchar *symbol);

    Get the the covalence radius or the atomic number of a given atomic symbol.

    zele :

    a pointer on an integer (can be NULL) ;. [out][allow-none]

    radcov :

    a pointer on a float (can be NULL) ;. [out][allow-none]

    symbol :

    the symbol of an atom.

    Returns :

    TRUE if symbol is known in the atomic built-in list.
    v_sim-3.7.0/Documentation/reference/html/v-sim-toolShade.html0000644000353400050620000013574012216331357021152 00000000000000 toolShade

    toolShade

    toolShade — ToolShades are color gradients.

    Synopsis

                        ToolShade;
    enum                ToolShadeColorMode;
    enum                ToolShadeMode;
    struct              ToolShadeStep;
    GList *             tool_shade_appendList               (ToolShade *shade,
                                                             gboolean unique);
    void                tool_shade_channelToRGB             (const ToolShade *shade,
                                                             float rgba[4],
                                                             float values[3]);
    gboolean            tool_shade_compare                  (ToolShade *sh1,
                                                             ToolShade *sh2);
    ToolShade *         tool_shade_copy                     (ToolShade *shade);
    void                tool_shade_free                     (ToolShade *shade);
    ToolShadeColorMode  tool_shade_getColorMode             (ToolShade *shade);
    gchar *             tool_shade_getLabel                 (ToolShade *shade);
    gboolean            tool_shade_getLinearCoeff           (ToolShade *shade,
                                                             float **vectA,
                                                             float **vectB);
    GList *             tool_shade_getList                  (void);
    ToolShadeMode       tool_shade_getMode                  (ToolShade *shade);
    ToolShade *         tool_shade_new                      (const gchar *labelUTF8,
                                                             float vectA[3],
                                                             float vectB[3],
                                                             ToolShadeColorMode colorMode);
    ToolShade *         tool_shade_newFromData              (const gchar *labelUTF8,
                                                             guint len,
                                                             float *vectCh1,
                                                             float *vectCh2,
                                                             float *vectCh3,
                                                             ToolShadeColorMode colorMode);
    ToolShade *         tool_shade_newFromSteps             (const gchar *labelUTF8,
                                                             GList *lst,
                                                             ToolShadeColorMode colorMode);
    ToolShade *         tool_shade_newFromString            (const gchar *labelUTF8,
                                                             const gchar *descr,
                                                             ToolShadeColorMode colorMode,
                                                             GError **error);
    gboolean            tool_shade_setColorMode             (ToolShade *shade,
                                                             ToolShadeColorMode mode);
    gboolean            tool_shade_setLinearCoeff           (ToolShade *shade,
                                                             float coeff,
                                                             int channel,
                                                             int order);
    void                tool_shade_valueToRGB               (const ToolShade *shade,
                                                             float rgba[4],
                                                             float value);
    

    Object Hierarchy

      GBoxed
       +----ToolShade
    

    Description

    This module allow V_Sim to deal with color gradients. Such a gradient is defined by a linear transformation of color space. This space can be RBG or HSV (see the enum ToolShadeColorMode). This linear transformation can be written [resulting color vector] = [vectB] + lambda.[vectA], where lambda denotes the input variable of the gradient (ranging from 0 to 1). Resulting color vector are clamped to [0;1] if needed.

    Use tool_shade_new() to create a new shade, giving the arguments as defined above. A shade can be linked to an image to represent it, use shadeSet_pathToImage() to do it.

    To share color gradients between modules in V_Sim, you can add new shade to the global list of stored shades using tool_shade_appendList() and get this list with a call to tool_shade_getList().

    Details

    ToolShade

    typedef struct _ToolShade ToolShade;

    Short name to address _ToolShade objects.


    enum ToolShadeColorMode

    typedef enum {
        TOOL_SHADE_COLOR_MODE_RGB,
        TOOL_SHADE_COLOR_MODE_HSV,
        TOOL_SHADE_COLOR_MODE_N_VALUES
    } ToolShadeColorMode;
    

    Defines color mode : Red-Green-Blue or Hue-Saturation-Value.

    TOOL_SHADE_COLOR_MODE_RGB

    variation described in the shade are applied to RGB coding colors ;

    TOOL_SHADE_COLOR_MODE_HSV

    variation described in the shade are applied to HSV coding colors ;

    TOOL_SHADE_COLOR_MODE_N_VALUES

    number of modes available.

    enum ToolShadeMode

    typedef enum {
        TOOL_SHADE_MODE_LINEAR,
        TOOL_SHADE_MODE_ARRAY,
        TOOL_SHADE_MODE_N_VALUES
    } ToolShadeMode;
    

    Defines the storage of the shade mode.

    TOOL_SHADE_MODE_LINEAR

    all channels are defined by a linear variation Ax+B ;

    TOOL_SHADE_MODE_ARRAY

    all channels are defined by a given array of values ;

    TOOL_SHADE_MODE_N_VALUES

    the number of different shade mode.

    struct ToolShadeStep

    struct ToolShadeStep {
      float index;
      float channels[3];
    };
    

    Stores a step in the definition of a shade.

    float index;

    a value.

    float channels[3];

    three values in [0;1] for RGB or HSV channels. [array fixed-size=3]

    Since 3.7


    tool_shade_appendList ()

    GList *             tool_shade_appendList               (ToolShade *shade,
                                                             gboolean unique);

    Add a shape to the internal list. Use the return value or tool_shade_getList() method to look into this list. If unique is TRUE, the internal list is read and shade is added only if it is not already existing in the list.

    shade :

    a ToolShade object.

    unique :

    a boolean.

    Returns :

    a read-only pointer to the internal shade list. [transfer none][element-type ToolShade*]

    tool_shade_channelToRGB ()

    void                tool_shade_channelToRGB             (const ToolShade *shade,
                                                             float rgba[4],
                                                             float values[3]);

    Like tool_shade_valueToRGB() but here, the three values are applied respectivly for the Red, the Green and the Blue channel.

    shade :

    a ToolShade ;

    rgba :

    a location to store the result of the colour transformation ;

    values :

    inout values.

    tool_shade_compare ()

    gboolean            tool_shade_compare                  (ToolShade *sh1,
                                                             ToolShade *sh2);

    Compare if the two shade are identical (first, smae mode, then same values).

    sh1 :

    a ToolShade ;

    sh2 :

    a ToolShade.

    Returns :

    TRUE if shade1 is equivalent to shade2.

    tool_shade_copy ()

    ToolShade *         tool_shade_copy                     (ToolShade *shade);

    Create a new shade deep copy of the first.

    shade :

    a ToolShade.

    Returns :

    a newly created shade.

    tool_shade_free ()

    void                tool_shade_free                     (ToolShade *shade);

    Free all dynamic memory from shade and free shade itself.

    shade :

    a ToolShade.

    tool_shade_getColorMode ()

    ToolShadeColorMode  tool_shade_getColorMode             (ToolShade *shade);

    Get the color mode of the shade (RGB or HSV).

    shade :

    a valid ToolShade object.

    Returns :

    the color mode.

    tool_shade_getLabel ()

    gchar *             tool_shade_getLabel                 (ToolShade *shade);

    Get the name (in UTF8) of the shade.

    shade :

    a valid ToolShade object.

    Returns :

    a string naming the shade.

    tool_shade_getLinearCoeff ()

    gboolean            tool_shade_getLinearCoeff           (ToolShade *shade,
                                                             float **vectA,
                                                             float **vectB);

    This methods can get the linear color transformation. The given arrays (vectA, vectB) are read-only. This method return FALSE if the shade is not in a TOOL_SHADE_MODE_LINEAR state.

    shade :

    a valid ToolShade object ;

    vectA :

    a pointer to a floating point values array to store vect in AX+B ;

    vectB :

    a pointer to a floating point values array to store vect in AX+B.

    Returns :

    TRUE if vectA, vectB and vectX have been set correctly.

    tool_shade_getList ()

    GList *             tool_shade_getList                  (void);

    It returns a read-only pointer to the internal shade list. Use tool_shade_appendList() to add new shades to this list.

    Returns :

    a pointer to the internal shade list. [transfer none][element-type ToolShade*]

    tool_shade_getMode ()

    ToolShadeMode       tool_shade_getMode                  (ToolShade *shade);

    Get the mode of the shade (linear, array...).

    shade :

    a valid ToolShade object.

    Returns :

    the mode.

    tool_shade_new ()

    ToolShade *         tool_shade_new                      (const gchar *labelUTF8,
                                                             float vectA[3],
                                                             float vectB[3],
                                                             ToolShadeColorMode colorMode);

    Create a linear shade. Its profile is given by an AX+B formula, dealing on three channels. These channels are defined by the colorMode parameter. All given values are copied when the new shade is created.

    labelUTF8 :

    a UTF8 string that shortly named this new shade ;

    vectA :

    an array of three floating point values ;

    vectB :

    an array of three floating point values ;

    colorMode :

    an integer that describes the color code (see ToolShadeColorMode enumeration).

    Returns :

    the newly created ToolShade.

    tool_shade_newFromData ()

    ToolShade *         tool_shade_newFromData              (const gchar *labelUTF8,
                                                             guint len,
                                                             float *vectCh1,
                                                             float *vectCh2,
                                                             float *vectCh3,
                                                             ToolShadeColorMode colorMode);

    Create a ToolShade from direct data for three channels. These channels are defined by the colorMode parameter. All given values are copied when the new shade is created.

    labelUTF8 :

    a UTF8 string that shortly named this new shade ;

    len :

    the size of arguments vectCh1, vectCh2 and vectCh3 ;

    vectCh1 :

    an array of floating point values for the first channel ;

    vectCh2 :

    an array of floating point values for the second channel ;

    vectCh3 :

    an array of floating point values for the third channel ;

    colorMode :

    an integer that describes the color code (see ToolShadeColorMode enumeration).

    Returns :

    the newly created ToolShade.

    tool_shade_newFromSteps ()

    ToolShade *         tool_shade_newFromSteps             (const gchar *labelUTF8,
                                                             GList *lst,
                                                             ToolShadeColorMode colorMode);

    Create a ToolShade from a set of steps defining colours at given indexes. These channels are defined by the colorMode parameter. All given values are copied when the new shade is created. The values of indexes will be normalised by this call to range in [0;1]. Colour channel values must be in [0;1] for each step.

    labelUTF8 :

    a UTF8 string that shortly named this new shade ;

    lst :

    a list of color steps. [transfer none][element-type ToolShadeStep*]

    colorMode :

    a ToolShadeColorMode mode.

    Returns :

    the newly created ToolShade. [transfer full]

    Since 3.7


    tool_shade_newFromString ()

    ToolShade *         tool_shade_newFromString            (const gchar *labelUTF8,
                                                             const gchar *descr,
                                                             ToolShadeColorMode colorMode,
                                                             GError **error);

    As tool_shade_newFromSteps() routine, but it takes an unparsed string describing the steps in descr.

    labelUTF8 :

    a UTF8 string that shortly named this new shade ;

    descr :

    a string with the shade description.

    colorMode :

    a ToolShadeColorMode mode.

    error :

    a location for an error. [allow-none]

    Returns :

    the newly created ToolShade. [transfer full]

    Since 3.7


    tool_shade_setColorMode ()

    gboolean            tool_shade_setColorMode             (ToolShade *shade,
                                                             ToolShadeColorMode mode);

    Change the mode of the shade, see ToolShadeColorMode.

    shade :

    a ToolShade ;

    mode :

    a new mode for the shade.

    Returns :

    TRUE if mode is different from previous shade mode.

    tool_shade_setLinearCoeff ()

    gboolean            tool_shade_setLinearCoeff           (ToolShade *shade,
                                                             float coeff,
                                                             int channel,
                                                             int order);

    Change one value coeff of the linear mode for the given shade.

    shade :

    a ToolShade ;

    coeff :

    a new value ;

    channel :

    either RGBA (from 0 to 3) ;

    order :

    the order in the linear approx (0 means constant and 1 is the linear coeeficient).

    Returns :

    TRUE if the new value changes anything.

    tool_shade_valueToRGB ()

    void                tool_shade_valueToRGB               (const ToolShade *shade,
                                                             float rgba[4],
                                                             float value);

    Give a RGBA vector for the given value.

    shade :

    a valid ToolShade object ;

    rgba :

    an array of size [4] ;

    value :

    the value ranged in [0;1].
    v_sim-3.7.0/Documentation/reference/html/v-sim-vibration.html0000644000353400050620000010442012216331357021214 00000000000000 vibration

    vibration

    vibration — Add a support to animate the node positions with a phonon frequency.

    Description

    Define a way to store vibration or phonons to a VisuData object. One can store several phonons in one object, each phonon is them represented by its id. The phonons can be animated on screen, using a user defined frequency (visu_vibration_setUserFrequency) and amplitue (visu_vibration_setAmplitude), by calling visu_vibration_play().

    Phonons are set with visu_vibration_setCharacteristic() and VisuNode displacements are set with visu_vibration_setDisplacements().

    Details

    VISU_VIBRATION_ID

    #define VISU_VIBRATION_ID "Vibration"
    

    The default name used for the VisuGlExt representing vibrations, see visu_gl_ext_getFromName().


    visu_vibration_getCharacteristic ()

    gboolean            visu_vibration_getCharacteristic    (VisuData *data,
                                                             guint n,
                                                             float q[3],
                                                             float *en,
                                                             float *omega);

    This routine is used to get the characteristics of a given phonon, see visu_vibration_setCharacteristic() to set them.

    data :

    a VisuData object.

    n :

    a phonon id.

    q :

    a location for the reciprocal vector.

    en :

    a locattion for the phonon energy.

    omega :

    a location for the phonon frequency.

    Returns :

    TRUE on success.

    Since 3.5


    visu_vibration_getCurrentMode ()

    guint               visu_vibration_getCurrentMode       (VisuData *data);

    Retrieves the phonon that is currently applied to data.

    data :

    a VisuData object.

    Returns :

    a phonon id.

    Since 3.5


    visu_vibration_getNPhonons ()

    gboolean            visu_vibration_getNPhonons          (VisuData *data,
                                                             guint *n);

    Retrieves if data contains phonons or not. Number of stored phonons is set in n.

    data :

    a VisuData object.

    n :

    a location.

    Returns :

    TRUE if data has phonons.

    Since 3.5


    visu_vibration_init ()

    gboolean            visu_vibration_init                 (VisuData *data,
                                                             guint n,
                                                             guint nNodes);

    Allocate (or reallocate) storage of phonons for data. The allocated memory will be automatically freed when data is destroyed.

    data :

    a VisuData object.

    n :

    number of phonons to set.

    nNodes :

    number of vibrating nodes.

    Returns :

    TRUE if data has no phonons before.

    Since 3.5


    visu_vibration_isSet ()

    gboolean            visu_vibration_isSet                (VisuData *data);

    Retrieve if data has some phonon attached to.

    data :

    a VisuData object.

    Returns :

    TRUE if visu_vibration_init() has been called already.

    Since 3.5


    visu_vibration_play ()

    guint               visu_vibration_play                 (VisuData *data);

    Make the phonon displace the VisuNode of data according to their definitions (see visu_vibration_setDisplacements() and visu_vibration_setCurrentMode()).

    data :

    a VisuData object.

    Returns :

    the timer's ID

    Since 3.5


    visu_vibration_resetPosition ()

    void                visu_vibration_resetPosition        (VisuData *data);

    Reset the node position of the given VisuData.

    data :

    a VisuData object.

    Returns :

    a boolean

    Since 3.5


    visu_vibration_setAmplitude ()

    gboolean            visu_vibration_setAmplitude         (VisuData *data,
                                                             float ampl);

    Change the amplitude at which phonon are displayed on screen when using visu_vibration_play().

    data :

    a VisuData object.

    ampl :

    an amplitude.

    Returns :

    TRUE if amplitude is actually changed.

    Since 3.5


    visu_vibration_setCharacteristic ()

    gboolean            visu_vibration_setCharacteristic    (VisuData *data,
                                                             guint n,
                                                             float q[3],
                                                             float en,
                                                             float omega);

    This routine is used to define the characteristics of a given phonon.

    data :

    a VisuData object.

    n :

    a phonon id.

    q :

    a reciprocal vector.

    en :

    the phonon energy.

    omega :

    the phonon frequency.

    Returns :

    TRUE on success.

    Since 3.5


    visu_vibration_setCurrentMode ()

    gboolean            visu_vibration_setCurrentMode       (VisuData *data,
                                                             guint iph,
                                                             GError **error);

    Set all node displacements to zero and setup the displacement vector (u+iv) for each VisuNode. After this call, visu_vibration_play() will move the nodes according to their vibration.

    data :

    a VisuData object.

    iph :

    a phonon id.

    error :

    a location for a possible error.

    Returns :

    TRUE if its the first time VisuNodes are displaced.

    Since 3.5


    visu_vibration_setDisplacements ()

    gboolean            visu_vibration_setDisplacements     (VisuData *data,
                                                             guint iph,
                                                             float *vibes,
                                                             gboolean complex);

    visu_vibration_init() must have been call before. This routine is used to define a set of displacement vectors, corresponding to one phonon. The displacement vectors can be complex, in that case vibes contains 6 values for each VisuNode.

    data :

    a VisuData object.

    iph :

    a phonon id.

    vibes :

    a set of displacement vectors.

    complex :

    a flag.

    Returns :

    TRUE on success.

    Since 3.5


    visu_vibration_setUserFrequency ()

    void                visu_vibration_setUserFrequency     (VisuData *data,
                                                             float freq);

    Change the frequency at which phonons are played with visu_vibration_play().

    data :

    a VisuData object.

    freq :

    a frequency.

    Since 3.5


    visu_vibration_setZeroTime ()

    void                visu_vibration_setZeroTime          (VisuData *data);

    Reset the position of phonons to use position at time equals zero (so applying just the q vector displacement).

    data :

    a VisuData object.

    Since 3.5


    visu_vibration_stop ()

    gboolean            visu_vibration_stop                 (guint timeoutID);

    Stop the timer with the given timeoutID.

    timeoutID :

    an id.

    Returns :

    if the timer is indeed removed.

    Since 3.5

    v_sim-3.7.0/Documentation/reference/html/v-sim-visu-actionInterface.html0000644000353400050620000002261512216331357023306 00000000000000 visu_actionInterface

    visu_actionInterface

    visu_actionInterface — Interface for defining actions and events.

    Description

    These definitions are used to give a library and plateform independent simplified event handlers.

    Details

    TOOL_BUTTON_TYPE_PRESS

    #define TOOL_BUTTON_TYPE_PRESS   1
    

    Value that can be put into field buttonType of structure _ToolSimplifiedEvents.


    TOOL_BUTTON_TYPE_RELEASE

    #define TOOL_BUTTON_TYPE_RELEASE 2
    

    Value that can be put into field buttonType of structure _ToolSimplifiedEvents.


    struct ToolSimplifiedEvents

    struct ToolSimplifiedEvents {
      int x, y;
      int root_x, root_y;
      guint button;
      int buttonType;
      int shiftMod, controlMod;
      int motion;
      char letter;
      ToolSpecialKeyStroke specialKey;
    };
    

    This structure is a common interface for events (inspired from X). We don't use the one introduced by GDK because we don't want this dependency be a limitation.

    int x;

    the position x (on parent) for the event ;

    int y;

    the position y (on parent) for the event ;

    int root_x;

    the position x (in root window) for the event ;

    int root_y;

    the position y (in root window) for the event ;

    guint button;

    the number of the button, 0 if not a button event ;

    int buttonType;

    TOOL_BUTTON_TYPE_PRESS or TOOL_BUTTON_TYPE_RELEASE ;

    int shiftMod;

    TRUE if Shift key is pressed during the event ;

    int controlMod;

    TRUE if Control key is pressed during the event ;

    int motion;

    TRUE if the event is a motion ;

    char letter;

    The value of the letter if the event is a key stroke '\0' if not ;

    ToolSpecialKeyStroke specialKey;

    the value of a special key if the event is a key stroke but not with an ascii letter.

    enum ToolSpecialKeyStroke

    typedef enum {
        Key_None,
        Key_Page_Up,
        Key_Page_Down,
        Key_Arrow_Left,
        Key_Arrow_Right,
        Key_Arrow_Up,
        Key_Arrow_Down,
        Key_Menu
    } ToolSpecialKeyStroke;
    

    Possible non ascii keys used in ToolSimplifiedEvents.

    Key_None

    no key pressed ;

    Key_Page_Up

    key up ;

    Key_Page_Down

    key down ;

    Key_Arrow_Left

    key left ;

    Key_Arrow_Right

    key right ;

    Key_Arrow_Up

    key up ;

    Key_Arrow_Down

    key down ;

    Key_Menu

    key menu.
    v_sim-3.7.0/Documentation/reference/html/v-sim-visu-basic.html0000644000353400050620000012414712216331357021274 00000000000000 visu_basic

    visu_basic

    visu_basic — Main functions of V_Sim (except graphical ones).

    Description

    There are here the main functions of V_Sim (except for graphical methods) such as open file.

    Details

    VISU_VERSION

    #define VISU_VERSION       VERSION
    

    The value of current compiled version.


    VISU_WEB_SITE

    #define VISU_WEB_SITE      "http://inac.cea.fr/L_Sim/V_Sim"
    

    URL where to find info on V_Sim.


    V_SIM_DATA_DIR

    #define V_SIM_DATA_DIR           visu_basic_getDataDir()
    

    The directory where data files are stored.


    V_SIM_ICONS_DIR

    #define V_SIM_ICONS_DIR          visu_basic_getIconsDir()
    

    The directory where icon files are stored.


    V_SIM_LEGAL_DIR

    #define V_SIM_LEGAL_DIR          visu_basic_getLegalDir()
    

    The directory where copyright and author files are stored.


    V_SIM_LOCALE_DIR

    #define V_SIM_LOCALE_DIR         visu_basic_getLocaleDir()
    

    The directory where locale files are stored.


    V_SIM_LOCAL_CONF_DIR

    #define V_SIM_LOCAL_CONF_DIR     visu_basic_getLocalDir()
    

    The directory where user configuration files are stored.


    V_SIM_OLD_LOCAL_CONF_DIR

    #define V_SIM_OLD_LOCAL_CONF_DIR visu_basic_getOldLocalDir()
    

    Old value of V_SIM_LOCAL_CONF_DIR.


    V_SIM_PIXMAPS_DIR

    #define V_SIM_PIXMAPS_DIR        visu_basic_getPixmapsDir()
    

    The directory where pixmap files are stored.


    V_SIM_PLUGINS_DIR

    #define V_SIM_PLUGINS_DIR        visu_basic_getPluginsDir()
    

    The directory where plugin files are stored.


    struct VisuBasicCLISet

    struct VisuBasicCLISet {
      gchar *colorFile;
    
      VisuPlane **planesList;
    
      VisuSurfaces **surfsList;
      GList *fieldsList;
    
      VisuMap **mapsList;
    
      ToolShade *shade;
    
      gint *mapPlaneId;
      ToolMatrixScalingFlag logScale;
      guint nIsolines;
      ToolColor* isoLinesColor;
    
      gchar *bgImage;
    };
    

    Internal object to store values read from command line.

    gchar *colorFile;

    TODO

    VisuPlane **planesList;

    TODO

    VisuSurfaces **surfsList;

    TODO

    GList *fieldsList;

    TODO

    VisuMap **mapsList;

    TODO

    ToolShade *shade;

    TODO

    gint *mapPlaneId;

    TODO

    ToolMatrixScalingFlag logScale;

    TODO

    guint nIsolines;

    TODO

    ToolColor *isoLinesColor;

    TODO

    gchar *bgImage;

    TODO

    visu_basic_applyCommandLine ()

    gboolean            visu_basic_applyCommandLine         (VisuData *data,
                                                             VisuGlView *view,
                                                             VisuBasicCLISet *set,
                                                             GError **error);

    Call all the get methods on the command line options to tune the given data.

    data :

    a VisuData object to apply the options on ;

    view :

    a VisuGlView object.

    set :

    a table of options ;

    error :

    a location for error report.

    Returns :

    TRUE if complete without error.

    visu_basic_createExtensions ()

    void                visu_basic_createExtensions         (VisuData *data,
                                                             VisuGlView *view,
                                                             VisuBasicCLISet *set,
                                                             gboolean rebuild);

    Create all extensions (planes, surfaces...) for the given data. Use static values read from visu_basic_applyCommandLine(). This method is mainly used when V_Sim run without the command panel.

    data :

    a VisuData object ;

    view :

    a VisuGlView object.

    set :

    a table of options ;

    rebuild :

    a boolean.

    visu_basic_freeAll ()

    void                visu_basic_freeAll                  (void);

    This routine is called by V_Sim when quiting and it frees the memory used by visu_basic.

    Since 3.5


    visu_basic_getDataDir ()

    const gchar *       visu_basic_getDataDir               (void);

    Get the static string where V_Sim looks for its data files.

    Returns :

    a string owned by V_Sim. [transfer none]

    Since 3.4


    visu_basic_getIconsDir ()

    const gchar *       visu_basic_getIconsDir              (void);

    Get the static string where V_Sim looks for its icon files.

    Returns :

    a string owned by V_Sim. [transfer none]

    Since 3.4


    visu_basic_getLegalDir ()

    const gchar *       visu_basic_getLegalDir              (void);

    Get the static string where V_Sim looks for its legal files.

    Returns :

    a string owned by V_Sim. [transfer none]

    Since 3.4


    visu_basic_getLocalDir ()

    const gchar *       visu_basic_getLocalDir              (void);

    Get the static string where V_Sim looks for its user configuration files.

    Returns :

    a string owned by V_Sim. [transfer none]

    Since 3.4


    visu_basic_getLocaleDir ()

    const gchar *       visu_basic_getLocaleDir             (void);

    Get the static string where V_Sim looks for its localisation files.

    Returns :

    a string owned by V_Sim. [transfer none]

    Since 3.4


    visu_basic_getMainContext ()

    GMainContext *      visu_basic_getMainContext           (void);

    Even without GUI, V_Sim requires to run a main loop. This method is to get the main loop.

    Returns :

    the main loop, as defined in GLib. [transfer none]

    Since 3.6


    visu_basic_getOldLocalDir ()

    const gchar *       visu_basic_getOldLocalDir           (void);

    Get the static string where V_Sim looks for its user configuration files (old location).

    Returns :

    a string owned by V_Sim. [transfer none]

    Since 3.4


    visu_basic_getPixmapsDir ()

    const gchar *       visu_basic_getPixmapsDir            (void);

    Get the static string where V_Sim looks for its pixmap files.

    Returns :

    a string owned by V_Sim. [transfer none]

    Since 3.4


    visu_basic_getPluginsDir ()

    const gchar *       visu_basic_getPluginsDir            (void);

    Get the static string where V_Sim looks for its plug-in files.

    Returns :

    a string owned by V_Sim. [transfer none]

    Since 3.4


    visu_basic_getPreferedUnit ()

    ToolUnits           visu_basic_getPreferedUnit          (void);

    By setting the prefered unit, when a file is load, V_Sim tries to render it in this prefered unit.

    Returns :

    the prefered unit set by the user (default is TOOL_UNITS_UNDEFINED).

    Since 3.5


    visu_basic_init ()

    void                visu_basic_init                     (void);

    A call to this method is done at startup after having probe the locale of the file system and having initialized the rendering window. It makes the following actions : create the visu object to store the signals, initialize the module part (parameters, and resources), initialize the dump part, the OpenGL part and its extensions, the storage of elements and the 'colorize with data' part.


    visu_basic_mainExport ()

    int                 visu_basic_mainExport               (void);

    This method is called when V_Sim is in export mode from the command line.

    Returns :

    0 if everything is normal, 1 if an error occured.

    visu_basic_parseConfigFiles ()

    gchar *             visu_basic_parseConfigFiles         (VisuGlView *view);

    Parse the parameter and the resource file. Used once at startup.

    view :

    current VisuGlView if any. [allow-none]

    Returns :

    a newly allocated GString if some error occured.

    visu_basic_setDataFromCommandLine ()

    VisuData *          visu_basic_setDataFromCommandLine   (void);

    Read the command line option and set the filenames for a new VisuData. The object is not loaded (files are not parsed), just prepared.

    Returns :

    a newly allocated VisuData if required. [transfer full]

    visu_basic_setExePath ()

    void                visu_basic_setExePath               (const gchar *exePath);

    This method is used to tell V_Sim where V_Sim is running (usually reading from argv[0]. This makes it possible to relocate everything on the fly. exePath is copied.

    exePath :

    a path where the V_Sim executable is running in.

    Since 3.6


    visu_basic_setExtInfos ()

    void                visu_basic_setExtInfos              (VisuData *dataObj,
                                                             VisuGlView *view,
                                                             VisuGlExtInfosDrawMethod method,
                                                             int *nodes,
                                                             VisuDataNode *data);

    Create and draw possible information on nodes. This method is mainly used when V_Sim run without the command panel.

    dataObj :

    a VisuData object ;

    view :

    a VisuGlView object.

    method :

    where to draw information ;

    nodes :

    a possible list of selected nodes, or NULL ;

    data :

    the information to draw.

    visu_basic_setPreferedUnit ()

    gboolean            visu_basic_setPreferedUnit          (ToolUnits unit);

    By setting the prefered unit, when a file is load, V_Sim tries to render it in this prefered unit.

    unit :

    a ToolUnits value.

    Returns :

    TRUE if the prefered unit is actually changed.

    Since 3.5


    visu_basic_showOptionHelp ()

    gboolean            visu_basic_showOptionHelp           (gboolean force);

    Display a small help for some options. The output is different from the -h command line options, here some details about running time options is displayed like the available file format for exportation... If force is TRUE, all possible values are output, otherwise only those relevant to the user provided command line options.

    force :

    a boolean.

    Returns :

    TRUE if something is displayed.

    Since 3.6

    v_sim-3.7.0/Documentation/reference/html/v-sim-VisuBoxed.html0000644000353400050620000002314712216331357021135 00000000000000 VisuBoxed

    VisuBoxed

    VisuBoxed — Defines a common interface for objects with a VisuBox.

    Synopsis

    struct              VisuBoxedInterface;
    VisuBox *           visu_boxed_getBox                   (VisuBoxed *self);
    gboolean            visu_boxed_setBox                   (VisuBoxed *self,
                                                             VisuBoxed *box,
                                                             gboolean update);
    

    Description

    Details

    struct VisuBoxedInterface

    struct VisuBoxedInterface {
      GTypeInterface parent;
    
      VisuBox* (*get_box) (VisuBoxed *self);
      gboolean (*set_box) (VisuBoxed *self, VisuBox *box, gboolean update);
    };
    

    The different routines common to objects implementing a VisuBoxed interface.

    GTypeInterface parent;

    yet, its parent.

    get_box ()

    a routine to get a pointer on the VisuBox.

    set_box ()

    a routine to set a VisuBox to a VisuBoxed object.

    Since 3.7


    visu_boxed_getBox ()

    VisuBox *           visu_boxed_getBox                   (VisuBoxed *self);

    Retrieves the VisuBox of self.

    self :

    a VisuBoxed object.

    Returns :

    the VisuBox of self. [transfer none]

    Since 3.7


    visu_boxed_setBox ()

    gboolean            visu_boxed_setBox                   (VisuBoxed *self,
                                                             VisuBoxed *box,
                                                             gboolean update);

    Attach the VisuBox of box to boxed. If update is TRUE, coordinates inside boxed are updated to fit into the new VisuBox. A reference is taken on the VisuBox of box. This routine emits "setBox" signal if the self has changed its VisuBox.

    self :

    a VisuBoxed object.

    box :

    a VisuBoxed object. [transfer none]

    update :

    a boolean.

    Returns :

    FALSE boxed was already boxed with the VisuBox of box.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/v-sim-visu-commandLine.html0000644000353400050620000013072012216331357022433 00000000000000 visu_commandLine

    visu_commandLine

    visu_commandLine — All methods needed to parse options from the command line.

    Synopsis

    gboolean            commandLineExport                   (const gchar *filename,
                                                             GError **error);
    void                commandLineFree_all                 (void);
    char *              commandLineGet_ArgFilename          (void);
    char *              commandLineGet_ArgSpinFileName      (void);
    char *              commandLineGet_ExportFileName       (void);
    int                 commandLineGet_WithGtk              (void);
    void                commandLineGet_XWindowGeometry      (int *width,
                                                             int *height);
    gchar *             commandLineGet_bgImage              (void);
    GArray *            commandLineGet_colorMinMax          (void);
    int *               commandLineGet_coloredMap           (void);
    int *               commandLineGet_colorizeColUsed      (void);
    gchar *             commandLineGet_colorizeFileName     (void);
    #define             commandLineGet_colorizePresetColor
    float *             commandLineGet_extension            (void);
    gboolean            commandLineGet_fitToBox             (void);
    guint               commandLineGet_iSet                 (void);
    gchar *             commandLineGet_introspect           (void);
    float *             commandLineGet_isoLinesColor        (void);
    gchar **            commandLineGet_isoNames             (int *nb);
    float *             commandLineGet_isoValues            (int *nb);
    gchar *             commandLineGet_isoVisuSurfacesFileName
                                                            (void);
    ToolMatrixScalingFlag commandLineGet_logScale           (void);
    float *             commandLineGet_mapMinMax            (void);
    guint               commandLineGet_mapPrecision         (void);
    guint               commandLineGet_nIsoLines            (void);
    GHashTable *        commandLineGet_options              (void);
    gchar *             commandLineGet_planesFileName       (void);
    int                 commandLineGet_presetColor          (void);
    const gchar *       commandLineGet_programName          (void);
    gchar *             commandLineGet_resourcesFile        (void);
    gchar *             commandLineGet_scalarFieldFileName  (void);
    int                 commandLineGet_scalingColumn        (void);
    gboolean            commandLineGet_spinAndAtomic        (void);
    int                 commandLineGet_spinHidingMode       (void);
    float *             commandLineGet_translation          (void);
    gchar *             commandLineGet_valueFile            (void);
    gchar *             commandLineGet_windowMode           (void);
    int                 commandLineParse                    (int argc,
                                                             char **argv);
    

    Description

    V_Sim parses the command line at startup and store data in private variables. All this values can be retrieve later by the program through calls to commandLineGet_* methods.

    Details

    commandLineExport ()

    gboolean            commandLineExport                   (const gchar *filename,
                                                             GError **error);

    Export the known command line options to an XML file.

    filename :

    a path to a filename to create ;

    error :

    a location to store a possible error.

    Returns :

    TRUE on success.

    Since 3.5


    commandLineFree_all ()

    void                commandLineFree_all                 (void);

    Release all allocated memory related to the command line options.

    Since 3.5


    commandLineGet_ArgFilename ()

    char *              commandLineGet_ArgFilename          (void);

    This method retrieves the first argument. All other arguments are ignored.

    Returns :

    the value of the first argument.

    commandLineGet_ArgSpinFileName ()

    char *              commandLineGet_ArgSpinFileName      (void);

    This method retrieves the second argument. All other arguments are ignored.

    Returns :

    the value of the second argument.

    commandLineGet_ExportFileName ()

    char *              commandLineGet_ExportFileName       (void);

    This method retrieves the value of the option --export or -e. This value must be a valid filename, with an extension known by V_Sim to do the export.

    Returns :

    the value of the option --export.

    commandLineGet_WithGtk ()

    int                 commandLineGet_WithGtk              (void);

    This method tells V_Sim is the GTK interface is needed or not.

    Returns :

    1 if the interface is needed.

    commandLineGet_XWindowGeometry ()

    void                commandLineGet_XWindowGeometry      (int *width,
                                                             int *height);

    This method retrieves the values of the option --geometry or -g. These values must be formatted with the following format : &dx&d and they give the size of the rendering window.

    width :

    an integer to stores the desired width.

    height :

    an integer to stores the desired height.

    commandLineGet_bgImage ()

    gchar *             commandLineGet_bgImage              (void);

    Retrieve if the filename to be loaded as a background image.

    Returns :

    a string or NULL if option is not used.

    commandLineGet_colorMinMax ()

    GArray *            commandLineGet_colorMinMax          (void);

    The external data file colourisation can be manually scaled.

    Returns :

    the scaling values for manual scaling of external data values.

    Since 3.7


    commandLineGet_coloredMap ()

    int *               commandLineGet_coloredMap           (void);

    One can pass options on the command line to create colored maps on planes.

    Returns :

    an array of plane indexes to be maped, -1 terminated.

    Since 3.6


    commandLineGet_colorizeColUsed ()

    int *               commandLineGet_colorizeColUsed      (void);

    This method retrieves the value of the option --use-column or -u. This value consists of three integer values.

    Returns :

    the three values of the option --use-column, or NULL if this option is not present.

    commandLineGet_colorizeFileName ()

    gchar *             commandLineGet_colorizeFileName     (void);

    This method retrieves the value of the option --colorize or -c. This value must be a valid filename. If this option is called, V_Sim actually enable the colorization, even if parameter file doesn't.

    Returns :

    the value of the option --colorize.

    commandLineGet_colorizePresetColor

    #define commandLineGet_colorizePresetColor() commandLineGet_presetColor();
    

    DEPRECATED, use commandLineGet_presetColor() instead.

    Returns :

    the value of option --color-preset if set, -1 if not.

    commandLineGet_extension ()

    float *             commandLineGet_extension            (void);

    This method retrieves the value of the option --expand or -x. This value consists of three floating values.

    Returns :

    the three values of the option --expand.

    commandLineGet_fitToBox ()

    gboolean            commandLineGet_fitToBox             (void);

    This method gets if the surface should be adapted to the bounding box of the structure.

    Returns :

    TRUE if the surface should be fitted.

    commandLineGet_iSet ()

    guint               commandLineGet_iSet                 (void);

    Retrieve the desired id for multi dataset file to render.

    Returns :

    0 as default value.

    Since 3.5


    commandLineGet_introspect ()

    gchar *             commandLineGet_introspect           (void);

    Used only by introspection scanner.

    Returns :

    the parameters of the introspection option.

    Since 3.6


    commandLineGet_isoLinesColor ()

    float *             commandLineGet_isoLinesColor        (void);

    Retrieve the chosen colour for the iso-lines.

    Returns :

    an array of three floats or NULL if the colour is auto.

    Since 3.5


    commandLineGet_isoNames ()

    gchar **            commandLineGet_isoNames             (int *nb);

    This method retrieves the names associated to the values of the option --ios-values or -v. It returns an array of size nb, but not all element are set since names are not mandatory. The nb value is guarantied to by equal to the one returned by commandLineGet_isoValues(void);

    nb :

    a location to store an integer.

    Returns :

    an array with the values of a size stored in nb.

    commandLineGet_isoValues ()

    float *             commandLineGet_isoValues            (int *nb);

    This method retrieves the values of the option --ios-values or -v.

    nb :

    a location to store an integer.

    Returns :

    an array with the values of a size stored in nb.

    commandLineGet_isoVisuSurfacesFileName ()

    gchar *             commandLineGet_isoVisuSurfacesFileName
                                                            (void);

    This method retrieves the filename given by the option --iso-surfaces or -i.

    Returns :

    a filename, the string is owned by V_Sim.

    commandLineGet_logScale ()

    ToolMatrixScalingFlag commandLineGet_logScale           (void);

    Retrieve if a log scale is required for various plots.

    Returns :

    the logscale method.

    commandLineGet_mapMinMax ()

    float *             commandLineGet_mapMinMax            (void);

    The coloured maps can be manually scaled.

    Returns :

    the scaling values for manual scaling of coloured maps.

    Since 3.6


    commandLineGet_mapPrecision ()

    guint               commandLineGet_mapPrecision         (void);

    The coloured maps can be rendered with more or less accuracy.

    Returns :

    the precision requested by the user.

    Since 3.6


    commandLineGet_nIsoLines ()

    guint               commandLineGet_nIsoLines            (void);

    Retrieve if the user asked for isolines on the coloured map (see commandLineGet_coloredMap()).

    Returns :

    a positive number if some isolines are required, 0 if not.

    commandLineGet_options ()

    GHashTable *        commandLineGet_options              (void);

    This method gets the contents of all -o options. The value is first parsed as letters to check for a boolean value (F/T), then, a float is used and finally an integer. If nothing parsed, the option is dismissed.

    Returns :

    a GHashTable pointer owned by V_Sim.

    commandLineGet_planesFileName ()

    gchar *             commandLineGet_planesFileName       (void);

    This method retrieves the value of the option --planes or -p. This value must be a valid filename.

    Returns :

    the value of the option --planes.

    commandLineGet_presetColor ()

    int                 commandLineGet_presetColor          (void);

    This method returns the value of option --color-preset.

    Returns :

    the value of option --color-preset if set, -1 if not.

    commandLineGet_programName ()

    const gchar *       commandLineGet_programName          (void);

    Get argv[0].

    Returns :

    the program name used to run V_Sim.

    Since 3.7


    commandLineGet_resourcesFile ()

    gchar *             commandLineGet_resourcesFile        (void);

    This method gets if a resources file has been given.

    Returns :

    the name (owned by V_Sim) of the given resources file or NULL if none was present.

    commandLineGet_scalarFieldFileName ()

    gchar *             commandLineGet_scalarFieldFileName  (void);

    This method retrieves the filename given by the option --scalar-field or -f.

    Returns :

    a filename, the string is owned by V_Sim.

    commandLineGet_scalingColumn ()

    int                 commandLineGet_scalingColumn        (void);

    Get the column used to scale nodes, if any given.

    Returns :

    -1 if not provided, or a column id.

    Since 3.7


    commandLineGet_spinAndAtomic ()

    gboolean            commandLineGet_spinAndAtomic        (void);

    This method retrieves if the option --spin-and-atomic or -a has been set.

    Returns :

    the TRUE if the option exists.

    commandLineGet_spinHidingMode ()

    int                 commandLineGet_spinHidingMode       (void);

    This method retrieves if the option --hiding-mode or -m has been set.

    Returns :

    the value of the option.

    commandLineGet_translation ()

    float *             commandLineGet_translation          (void);

    This method retrieves the value of the option --translate or -t. This value consists of three floating values.

    Returns :

    the three values of the option --translate.

    commandLineGet_valueFile ()

    gchar *             commandLineGet_valueFile            (void);

    Retrieve the name of a possible value file, if any has been given.

    Returns :

    a path (absolute) or NULL if the option has not been passed. Data are static.

    Since 3.5


    commandLineGet_windowMode ()

    gchar *             commandLineGet_windowMode           (void);

    Retrieve the windowing mode for V_Sim, 'classic' with the two rendering and command panel windows ; 'oneWindow' with a joined version of the two windows or 'renderOnly' with only the rendering window.

    Returns :

    one of the three strings.

    Since 3.5


    commandLineParse ()

    int                 commandLineParse                    (int argc,
                                                             char **argv);

    This method is called at startup to parse the command line and store all important information. If --help is given, or an unknown option, a little help is printed on the standard output.

    argc :

    the number of arguments.

    argv :

    the values of all arguments.

    Returns :

    0 if everything goes well.
    v_sim-3.7.0/Documentation/reference/html/v-sim-visu-configFile.html0000644000353400050620000022361612216331357022261 00000000000000 visu_configFile

    visu_configFile

    visu_configFile — Defines methods to access (read/write) to config files and to create different entries.

    Synopsis

    #define             VISU_CONFIG_FILE_PARAMETER
    #define             VISU_CONFIG_FILE_RESOURCE
                        VisuConfigFileEntry;
    void                (*VisuConfigFileExportFunc)         (GString *data,
                                                             VisuData *dataObj,
                                                             VisuGlView *view);
    struct              VisuConfigFileForeachFuncExport;
    gboolean            (*VisuConfigFileReadFunc)           (VisuConfigFileEntry *entry,
                                                             gchar **lines,
                                                             int nbLines,
                                                             int position,
                                                             VisuData *dataObj,
                                                             VisuGlView *view,
                                                             GError **error);
    VisuConfigFileEntry * visu_config_file_addBooleanEntry  (int kind,
                                                             const gchar *key,
                                                             const gchar *description,
                                                             gboolean *location);
    VisuConfigFileEntry * visu_config_file_addEntry         (int kind,
                                                             const gchar *key,
                                                             const gchar *description,
                                                             int nbLines,
                                                             VisuConfigFileReadFunc readFunc);
    void                visu_config_file_addExportFunction  (int kind,
                                                             VisuConfigFileExportFunc writeFunc);
    VisuConfigFileEntry * visu_config_file_addFloatArrayEntry
                                                            (int kind,
                                                             const gchar *key,
                                                             const gchar *description,
                                                             guint nValues,
                                                             float *location,
                                                             float clamp[2]);
    void                visu_config_file_addKnownTag        (gchar *tag);
    VisuConfigFileEntry * visu_config_file_addStringEntry   (int kind,
                                                             const gchar *key,
                                                             const gchar *description,
                                                             gchar **location);
    void                visu_config_file_entry_setReplace   (VisuConfigFileEntry *newEntry,
                                                             VisuConfigFileEntry *oldEntry);
    void                visu_config_file_entry_setTag       (VisuConfigFileEntry *entry,
                                                             const gchar *tag);
    void                visu_config_file_entry_setVersion   (VisuConfigFileEntry *entry,
                                                             float version);
    void                visu_config_file_exportComment      (GString *buffer,
                                                             const gchar *comment);
    void                visu_config_file_exportEntry        (GString *buffer,
                                                             const gchar *name,
                                                             const gchar *id_value,
                                                             const gchar *format_,
                                                             ...);
    gboolean            visu_config_file_exportToXML        (const gchar *filename,
                                                             int kind,
                                                             GError **error);
    const gchar *       visu_config_file_getDefaultFilename (int kind);
    GList *             visu_config_file_getEntries         (int kind);
    gchar *             visu_config_file_getNextValidPath   (int kind,
                                                             int accessMode,
                                                             GList **list,
                                                             int utf8);
    GList *             visu_config_file_getPathList        (int kind);
    const gchar *       visu_config_file_getPathToResources ();
    gchar *             visu_config_file_getValidPath       (int kind,
                                                             int mode,
                                                             int utf8);
    gboolean            visu_config_file_load               (int kind,
                                                             const char *filename,
                                                             VisuData *dataObj,
                                                             VisuGlView *view,
                                                             GError **error);
    gboolean            visu_config_file_save               (int kind,
                                                             const char *fileName,
                                                             int *lines,
                                                             VisuData *dataObj,
                                                             VisuGlView *view,
                                                             GError **error);
    gboolean            visu_config_file_saveResourcesToXML (const char *filename,
                                                             int *lines,
                                                             VisuData *dataObj,
                                                             VisuGlView *view,
                                                             GError **error);
    

    Object Hierarchy

      GBoxed
       +----VisuConfigFileEntry
    

    Description

    V_Sim uses two different configuration files. The first stores the configuration of the program itself and is called parameters file. The second stores differents values that control the way files are rendered. It is called resources file. For example, their is an entry in the parameters file that controls your favorite rendering method ; and there is an entry in the resources file that codes that vacancy elements are rendered by cube in the atomic rendering method. Most methods of this part uses a first argument usually called 'kind', that control if the method will apply on the parameters file or on the resources file. VISU_CONFIG_FILE_PARAMETER and VISU_CONFIG_FILE_RESOURCE are the two flags that should be used for the 'kind' argument.

    There are different paths where these files can be stored. These paths are stored in V_Sim with an order : for example parameters file are first looked for in the current working directory, then in the $HOME/.v_sim directory and finally in the installation directory. This is transparent for the user and visu_config_file_getValidPath() is the right method to access to the best readable configuration file.

    Different part of V_Sim can add entries in these files. The method visu_config_file_addEntry() is designed to this purpose. The entries are defined by their name and they appear in the configuration file as 'name:' followed by the data associated to this entry. In the parameters file, the data are on the same line. In the resources file, the data begin the line after and can be longer that one line. When a configuration file is read, the method associated to each entry (VisuConfigFileReadFunc()) is called with a copy of their data lines. The method visu_config_file_addExportFunction() should be used to add a callback when the configurations files are written, then each part of V_Sim that have entries can put some lines in the configuration files.

    Details

    VISU_CONFIG_FILE_PARAMETER

    #define VISU_CONFIG_FILE_PARAMETER 0
    

    This defines a parameter entry in the config files.


    VISU_CONFIG_FILE_RESOURCE

    #define VISU_CONFIG_FILE_RESOURCE 1
    

    This defines a resource entry in the config files.


    VisuConfigFileEntry

    typedef struct _VisuConfigFileEntry VisuConfigFileEntry;

    This is the common name of the structure.


    VisuConfigFileExportFunc ()

    void                (*VisuConfigFileExportFunc)         (GString *data,
                                                             VisuData *dataObj,
                                                             VisuGlView *view);

    This prototype defines a method that is used to export some resources or parameters. The data argument is an empty GString where the export has to be written. If the argument dataObj is not null, only resources related to the VisuData object should be exported (for parameters files, dataObj is always NULL).

    data :

    an empty GString to store the export ;

    dataObj :

    a VisuData object ;. [allow-none]

    view :

    a VisuGlView object. [allow-none]

    struct VisuConfigFileForeachFuncExport

    struct VisuConfigFileForeachFuncExport {
      GString *data;
      VisuData *dataObj;
    };
    

    This structure can be used to encapsulate the arguments of an export method when used in a foreach glib loop.

    GString *data;

    the string where the values are exported to ;

    VisuData *dataObj;

    the current VisuData object, values are related to.

    VisuConfigFileReadFunc ()

    gboolean            (*VisuConfigFileReadFunc)           (VisuConfigFileEntry *entry,
                                                             gchar **lines,
                                                             int nbLines,
                                                             int position,
                                                             VisuData *dataObj,
                                                             VisuGlView *view,
                                                             GError **error);

    This prototype corresponds to methods called when an entry is found. The lines argument is an array of lines read from the files. These strings are copies and can be modified but not freed. There are nbLines and this value correspond to the number of lines defined for the entry. The error argument is used to store some text messages and error ids. They should be in UTF8. The error argument must be initialised with (GError*)0. The position argument give the number of the first line given in lines argument. If the dataObj argument is not null, some updates should be done with read values.

    entry :

    the VisuConfigFileEntry that raises this callback.

    lines :

    an array of strings ;

    nbLines :

    an integer ;

    position :

    an integer ;

    dataObj :

    a VisuData object ;. [allow-none]

    view :

    a VisuGlView object. [allow-none]

    error :

    a pointer to a GError pointer.

    Returns :

    TRUE if everything goes right, FALSE otherwise.

    visu_config_file_addBooleanEntry ()

    VisuConfigFileEntry * visu_config_file_addBooleanEntry  (int kind,
                                                             const gchar *key,
                                                             const gchar *description,
                                                             gboolean *location);

    Defines a VisuConfigFileEntry that will be a single boolean to read and to store in location.

    kind :

    an integer ;

    key :

    a string (should not be NULL) ;

    description :

    a string (can be NULL) ;. [allow-none]

    location :

    a pointer where to store a boolean when the entry is parsed.

    Returns :

    the newly created VisuConfigFileEntry object. [transfer full]

    Since 3.7


    visu_config_file_addEntry ()

    VisuConfigFileEntry * visu_config_file_addEntry         (int kind,
                                                             const gchar *key,
                                                             const gchar *description,
                                                             int nbLines,
                                                             VisuConfigFileReadFunc readFunc);

    This creates a new VisuConfigFileEntry object with the given values. The key and description arguments are copied.

    kind :

    an integer ;

    key :

    a string (should not be NULL) ;

    description :

    a string (can be NULL) ;. [allow-none]

    nbLines :

    an integer ;

    readFunc :

    a VisuConfigFileReadFunc. [scope call]

    Returns :

    the newly created VisuConfigFileEntry object.

    visu_config_file_addExportFunction ()

    void                visu_config_file_addExportFunction  (int kind,
                                                             VisuConfigFileExportFunc writeFunc);

    This stores the writeFunc given. It will be called when resources or parameters will be exported to disk.

    kind :

    an integer to identify resources or parameters ;

    writeFunc :

    a VisuConfigFileExportFunc method. [scope call]

    visu_config_file_addFloatArrayEntry ()

    VisuConfigFileEntry * visu_config_file_addFloatArrayEntry
                                                            (int kind,
                                                             const gchar *key,
                                                             const gchar *description,
                                                             guint nValues,
                                                             float *location,
                                                             float clamp[2]);

    Defines a VisuConfigFileEntry that will parse nValues floats and store them consecutively in location. The parsed values are checked to be in clamp.

    kind :

    an integer ;

    key :

    a string (should not be NULL) ;

    description :

    a string (can be NULL) ;. [allow-none]

    nValues :

    the number of floats to read.

    location :

    a pointer where to store floats when the entry is parsed.

    clamp :

    the min and max values allowed.

    Returns :

    the newly created VisuConfigFileEntry object. [transfer full]

    Since 3.7


    visu_config_file_addKnownTag ()

    void                visu_config_file_addKnownTag        (gchar *tag);

    If parameter entries have a tag, they are ignored except if their tag has been declared using this method.

    tag :

    a string (not nul or empty).

    visu_config_file_addStringEntry ()

    VisuConfigFileEntry * visu_config_file_addStringEntry   (int kind,
                                                             const gchar *key,
                                                             const gchar *description,
                                                             gchar **location);

    Defines a VisuConfigFileEntry that will be a string to read and to store in location. If location already contains a string, it is g_free().

    kind :

    an integer ;

    key :

    a string (should not be NULL) ;

    description :

    a string (can be NULL) ;. [allow-none]

    location :

    a pointer where to store a string when the entry is parsed.

    Returns :

    the newly created VisuConfigFileEntry object. [transfer full]

    Since 3.7


    visu_config_file_entry_setReplace ()

    void                visu_config_file_entry_setReplace   (VisuConfigFileEntry *newEntry,
                                                             VisuConfigFileEntry *oldEntry);

    Use this method to declare that oldEntry has become obsolete and has been replaced by newEntry.

    newEntry :

    a VisuConfigFileEntry object ;

    oldEntry :

    idem.

    visu_config_file_entry_setTag ()

    void                visu_config_file_entry_setTag       (VisuConfigFileEntry *entry,
                                                             const gchar *tag);

    This method is used to set a tag to the given entry. This tag is used to ignore or not the entry when the file is read. The tag argument is copied.

    entry :

    a VisuConfigFileEntry object ;

    tag :

    a string.

    visu_config_file_entry_setVersion ()

    void                visu_config_file_entry_setVersion   (VisuConfigFileEntry *entry,
                                                             float version);

    Set the version number the entry appear in.

    entry :

    a VisuConfigFileEntry object ;

    version :

    the version the entry appear in.

    visu_config_file_exportComment ()

    void                visu_config_file_exportComment      (GString *buffer,
                                                             const gchar *comment);

    Append to buffer the given comment, using the current output style (raw text or XML as instance).

    buffer :

    the buffer to add a comment to.

    comment :

    a comment.

    Since 3.7


    visu_config_file_exportEntry ()

    void                visu_config_file_exportEntry        (GString *buffer,
                                                             const gchar *name,
                                                             const gchar *id_value,
                                                             const gchar *format_,
                                                             ...);

    Append to buffer the given entry, using the current output style (raw text or XML as instance). id_value can be used to specify the entry apply to, for instance, the name of the VisuElement the colour property entry apply to.

    buffer :

    the buffer to write the entry to.

    name :

    the name of the entry.

    id_value :

    an id for the entry. [allow-none]

    format_ :

    the formatting string for the message.

    ... :

    the values to print.

    Since 3.7


    visu_config_file_exportToXML ()

    gboolean            visu_config_file_exportToXML        (const gchar *filename,
                                                             int kind,
                                                             GError **error);

    Export all the registered entries for resources or parameters to an XML file.

    filename :

    a string in the encoding of the file system ;

    kind :

    either VISU_CONFIG_FILE_PARAMETER or VISU_CONFIG_FILE_RESOURCE ;

    error :

    a location to store an error.

    Returns :

    TRUE if the file is written with success.

    visu_config_file_getDefaultFilename ()

    const gchar *       visu_config_file_getDefaultFilename (int kind);

    This methods is used to get the filename used for different config files.

    kind :

    an integer identifier.

    Returns :

    the filename of config file. The returned *gchar is owned by V_Sim and should not be freed or modified.

    visu_config_file_getEntries ()

    GList *             visu_config_file_getEntries         (int kind);

    This routine should be used for introspections purpose, to know what resources or parameters are available.

    kind :

    either VISU_CONFIG_FILE_PARAMETER or VISU_CONFIG_FILE_RESOURCE ;

    Returns :

    a GList own by V_Sim. [element-type utf8][transfer none]

    visu_config_file_getNextValidPath ()

    gchar *             visu_config_file_getNextValidPath   (int kind,
                                                             int accessMode,
                                                             GList **list,
                                                             int utf8);

    Test the entries of the given list to find a valid position to read or write a config file. It tests access for the specified file. After a call to this method the list argument points to the next entry in the list, after the one found.

    kind :

    an integer identifier ;

    accessMode :

    a value from R_OK, W_OK and X_OK as described in unistd.h ;

    list :

    a pointer to a valid *GList ;. [element-type filename][inout][transfer none]

    utf8 :

    if 1, the path is return in UTF-8 format, otherwise, the locale of the file system is used.

    Returns :

    the first valid path find in the given list of paths.

    visu_config_file_getPathList ()

    GList *             visu_config_file_getPathList        (int kind);

    V_Sim stores a list of paths where to look for resources or parameters files, this method is used to get these lists.

    kind :

    an integer identifier.

    Returns :

    the list of the parameters or resources paths. This list is read-only. [transfer none][element-type filename]

    visu_config_file_getPathToResources ()

    const gchar *       visu_config_file_getPathToResources ();

    The resource file can be read from different places.

    Returns :

    the path used to read the last resource file.

    Since 3.6


    visu_config_file_getValidPath ()

    gchar *             visu_config_file_getValidPath       (int kind,
                                                             int mode,
                                                             int utf8);

    Test the entries of the hadoc list to find a valid position to read or write a config file. It tests access for the specified file.

    kind :

    an integer identifier ;

    mode :

    a value from R_OK, W_OK and X_OK as described in unistd.h.

    utf8 :

    if 1, the path is return in UTF-8 format, otherwise, the locale of the file system is used.

    Returns :

    the first valid path find in the list of known paths.

    visu_config_file_load ()

    gboolean            visu_config_file_load               (int kind,
                                                             const char *filename,
                                                             VisuData *dataObj,
                                                             VisuGlView *view,
                                                             GError **error);

    Try to load the resources/parameters from the file name given in parameter.

    kind :

    an integer to identify the kind of file ;

    filename :

    the path to file to read ;

    dataObj :

    a VisuData object, sometime needed to update values (can be NULL) ;. [allow-none]

    view :

    a VisuGlView object, sometime needed to update values (can be NULL). [allow-none]

    error :

    a pointer to a GError pointer. [allow-none]

    Returns :

    TRUE if everything goes right. If error is not NULL it should be freed with g_error_free().

    visu_config_file_save ()

    gboolean            visu_config_file_save               (int kind,
                                                             const char *fileName,
                                                             int *lines,
                                                             VisuData *dataObj,
                                                             VisuGlView *view,
                                                             GError **error);

    Try to export the resources/parameters to the file name given in parameter. If lines argument is not NULL, and everything went right, it stores the number of written lines. If the argument dataObj is not null, only resources related to the VisuData object should be exported (for parameters files, dataObj is always NULL). The same for view.

    kind :

    an integer to identify the kind of file ;

    fileName :

    the path to file to read ;

    lines :

    a pointer to an integer (can be NULL) ;

    dataObj :

    a VisuData object (can be NULL) ;. [allow-none]

    view :

    a VisuGlView object (can be NULL) ;. [allow-none]

    error :

    a location to store a possible error.

    Returns :

    TRUE if everything goes right.

    visu_config_file_saveResourcesToXML ()

    gboolean            visu_config_file_saveResourcesToXML (const char *filename,
                                                             int *lines,
                                                             VisuData *dataObj,
                                                             VisuGlView *view,
                                                             GError **error);

    Same routine as visu_config_file_save() but use an XML format instead.

    filename :

    the path to file to read ;

    lines :

    a pointer to an integer (can be NULL) ;

    dataObj :

    a VisuData object (can be NULL) ;. [allow-none]

    view :

    a VisuGlView object (can be NULL) ;. [allow-none]

    error :

    a location to store a possible error.

    Returns :

    TRUE if everything goes right.

    Since 3.7

    v_sim-3.7.0/Documentation/reference/html/v-sim-visu-dump.html0000644000353400050620000010575012216331357021157 00000000000000 visu_dump

    visu_dump

    visu_dump — Some resources to add the ability to export the rendered data to an other format (usually image format).

    Synopsis

                        VisuDump;
                        VisuDumpClass;
    enum                VisuDumpErrorFlag;
    const VisuDump *    (*VisuDumpInitFunc)                 ();
    gboolean            (*VisuDumpWriteFunc)                (ToolFileFormat *format,
                                                             const char *fileName,
                                                             int width,
                                                             int height,
                                                             VisuData *dataObj,
                                                             guchar *image,
                                                             GError **error,
                                                             ToolVoidDataFunc functionWait,
                                                             gpointer data);
    void                visu_dump_abort                     (GObject *obj,
                                                             gpointer data);
    GList *             visu_dump_getAllModules             ();
    gboolean            visu_dump_getAlphaStatus            (VisuDump *dump);
    gboolean            visu_dump_getBitmapStatus           (VisuDump *dump);
    gboolean            visu_dump_getGlStatus               (VisuDump *dump);
    gint                visu_dump_getNModules               ();
    GQuark              visu_dump_getQuark                  ();
    VisuDump *          visu_dump_new                       (const gchar *descr,
                                                             const gchar **patterns,
                                                             VisuDumpWriteFunc method,
                                                             gboolean bitmap);
    void                visu_dump_setGl                     (VisuDump *dump,
                                                             gboolean needGl);
    void                visu_dump_setHasAlpha               (VisuDump *dump,
                                                             gboolean hasAlpha);
    gboolean            visu_dump_write                     (VisuDump *dump,
                                                             const char *fileName,
                                                             int width,
                                                             int height,
                                                             VisuData *dataObj,
                                                             GArray *image,
                                                             ToolVoidDataFunc functionWait,
                                                             gpointer data,
                                                             GError **error);
    

    Object Hierarchy

      GObject
       +----ToolFileFormat
             +----VisuDump
    

    Description

    V_Sim can export loaded data to othe formats. This module descibes the methods and structure to create a dumping extension. Basically, a dumping extension is just a FileFormat and a method that is called when exporting is required. No method exists to create a dumping extension, just allocate and initialize the DumpType structure.

    The writeDumpFunc should suspend its process to allow the calling program to refresh itself if the dump process is slow. Ideally, the argument waitFunction should be called exactly 100 times.

    Details

    VisuDump

    typedef struct _VisuDump VisuDump;

    An opaque structure.


    VisuDumpClass

    typedef struct _VisuDumpClass VisuDumpClass;

    An opaque structure.


    enum VisuDumpErrorFlag

    typedef enum {
        DUMP_ERROR_OPENGL,
        DUMP_ERROR_FILE,
        DUMP_ERROR_ENCODE
    } VisuDumpErrorFlag;
    

    These are flags used when dumping to a file.

    DUMP_ERROR_OPENGL

    Error with OpenGL dumping.

    DUMP_ERROR_FILE

    Error when opening.

    DUMP_ERROR_ENCODE

    Wrongness when computing the encoding format.

    VisuDumpInitFunc ()

    const VisuDump *    (*VisuDumpInitFunc)                 ();

    This protoype defines initializing function for dumping extension. Create such a function and add its name in the list listInitDumpModuleFunc defined in dumpModules/externalDumpModules.h thus the new dumping extension will be initialized on startup.

    Returns :

    a newly allocated VisuDump.

    VisuDumpWriteFunc ()

    gboolean            (*VisuDumpWriteFunc)                (ToolFileFormat *format,
                                                             const char *fileName,
                                                             int width,
                                                             int height,
                                                             VisuData *dataObj,
                                                             guchar *image,
                                                             GError **error,
                                                             ToolVoidDataFunc functionWait,
                                                             gpointer data);

    This is a prototype of a method implemented by a dumping extension that is called when the current rendering must be dumped to a file.

    format :

    a ToolFileFormat object, corresponding to the write method ;

    fileName :

    a string that defined the file to write to ;

    width :

    an integer ;

    height :

    an integer.

    dataObj :

    the VisuData to be exported ;

    image :

    the data to be written ;

    error :

    a location to store some error (not NULL) ;. [allow-none]

    functionWait :

    a method to call periodically during the dump ;. [allow-none][scope call]

    data :

    some pointer on object to be passed to the wait function. [closure]

    Returns :

    TRUE if everything went right.

    visu_dump_abort ()

    void                visu_dump_abort                     (GObject *obj,
                                                             gpointer data);

    Does nothing for the moment.

    obj :

    an object ;

    data :

    some data.

    visu_dump_getAllModules ()

    GList *             visu_dump_getAllModules             ();

    All dumping extensions are stored in an opaque way in V_Sim. But they can be listed by a call to this method.

    Returns :

    a list of all the known dumping extensions. This list is own by V_Sim and should be considered read-only. [transfer none][element-type VisuDump*]

    visu_dump_getAlphaStatus ()

    gboolean            visu_dump_getAlphaStatus            (VisuDump *dump);

    Retrieve if dump use alpha channel or not.

    dump :

    a VisuDump method.

    Returns :

    TRUE if dump has an alpha channel.

    visu_dump_getBitmapStatus ()

    gboolean            visu_dump_getBitmapStatus           (VisuDump *dump);

    Retrieve if dump is exporting a bitmap or not (like to a new input file format...).

    dump :

    a VisuDump method.

    Returns :

    TRUE if the output is a bitmap indeed.

    visu_dump_getGlStatus ()

    gboolean            visu_dump_getGlStatus               (VisuDump *dump);

    Retrieve if dump requires OpenGL to export or not.

    dump :

    a VisuDump method.

    Returns :

    TRUE if OpenGL is required.

    visu_dump_getNModules ()

    gint                visu_dump_getNModules               ();

    A convenient way to know how many dumping extensions are registered.

    Returns :

    the number of known dumping extensions.

    visu_dump_getQuark ()

    GQuark              visu_dump_getQuark                  ();

    Internal routine to get the GQuark to handle error related to dump actions.


    visu_dump_new ()

    VisuDump *          visu_dump_new                       (const gchar *descr,
                                                             const gchar **patterns,
                                                             VisuDumpWriteFunc method,
                                                             gboolean bitmap);

    Create a new dump format.

    descr :

    an UTF8 translated string ;

    patterns :

    a NULL terminated list of pattern for this dump format ;. [array zero-terminated=1]

    method :

    a method used to dump the current VisuData ;. [scope call]

    bitmap :

    a flag for bitmap export.

    Returns :

    a newly created dump format.

    Since 3.7


    visu_dump_setGl ()

    void                visu_dump_setGl                     (VisuDump *dump,
                                                             gboolean needGl);

    Set if dump requires OpenGL or not.

    dump :

    a VisuDump method.

    needGl :

    a boolean

    visu_dump_setHasAlpha ()

    void                visu_dump_setHasAlpha               (VisuDump *dump,
                                                             gboolean hasAlpha);

    Set if dump has an alpha channel or not.

    dump :

    a VisuDump method.

    hasAlpha :

    a boolean.

    visu_dump_write ()

    gboolean            visu_dump_write                     (VisuDump *dump,
                                                             const char *fileName,
                                                             int width,
                                                             int height,
                                                             VisuData *dataObj,
                                                             GArray *image,
                                                             ToolVoidDataFunc functionWait,
                                                             gpointer data,
                                                             GError **error);

    Use the write function of dump to export the current dataObj to file fileName.

    dump :

    a VisuDump object ;

    fileName :

    a string that defined the file to write to ;. [type filename]

    width :

    an integer ;

    height :

    an integer ;

    dataObj :

    the VisuData to be exported ;

    image :

    the data to be written ;. [allow-none][element-type gint8]

    error :

    a location to store some error (not NULL) ;

    functionWait :

    a method to call periodically during the dump ;. [allow-none][closure data][scope call]

    data :

    some pointer on object to be passed to the wait function. [closure]

    Returns :

    TRUE if dump succeed.

    Since 3.6

    v_sim-3.7.0/Documentation/reference/html/v-sim-visu-elements.html0000644000353400050620000014641512216331357022031 00000000000000 visu_elements

    visu_elements

    visu_elements — defines methods to create and acccess to VisuElement.

    Object Hierarchy

      GObject
       +----VisuElement
    

    Description

    V_Sim is used to rendered at given position several object of the same kind. The VisuElement object is used to control that kind. Typically, it corresponds to chemical element. It can represent the silicon, the iron...

    VisuElement are defined by their name and have some characteristic like their color or if they are rendered or not. The color characteristic is defined by an RGBA array and different value for the behavior of the light, as defined in OpenGL : diffusivity, shiningness, emissivity, specular and ambient. These values can be controlled with the following methods : visu_element_setAllColorValues(), visu_element_setAllRGBValues(), visu_element_setRGBValue(), visu_element_setAllMaterialValues() and visu_element_setMaterialValue().

    If the OpenGL representation of one element is not dependent of its position, it is recommended to use the OpenGL list associated to each VisuElement that can be accessed by a call to visu_element_getMaterialId().

    Details

    struct VisuElement

    struct VisuElement;

    Structure to stores VisuElement objects.


    VisuElementClass

    typedef struct _VisuElementClass VisuElementClass;

    An opaque structure representing the class of VisuElement objects.


    visu_element_createMaterial ()

    void                visu_element_createMaterial         (VisuElement *ele);

    Create a list whose number is defined by ele->glMaterialId that stores the definition of light and color for this VisuElement. The previous OpenGL object list with the same identifier is deleted.

    ele :

    a pointer to a valid VisuElement.

    visu_element_getAllElements ()

    const GList *       visu_element_getAllElements         (void);

    This method returns a list of all the registered VisuElement. The returned list is read-only.

    Returns :

    the list of all known VisuElement. [element-type VisuElement][transfer none]

    visu_element_getMaterialId ()

    int                 visu_element_getMaterialId          (VisuElement *ele);

    This method is useful for the rendering method to get the OpenGl identifier of the material of the specified element.

    ele :

    an element.

    Returns :

    the OpenGL identifier of the specified VisuElement.

    visu_element_getName ()

    const gchar *       visu_element_getName                (const VisuElement *ele);

    This routines returns the name of the given ele.

    ele :

    a VisuElement object.

    Returns :

    a string owned by V_Sim.

    Since 3.7


    visu_element_getPhysical ()

    gboolean            visu_element_getPhysical            (VisuElement *ele);

    This routine gets if ele is physical or not. A not physical element can be used for instance to represent specific points...

    ele :

    a VisuElement object.

    Returns :

    TRUE if ele is indeed physical.

    Since 3.7


    visu_element_getRendered ()

    gboolean            visu_element_getRendered            (VisuElement *element);

    This gets the value of the private attribute 'rendered' for the specified VisuElement.

    element :

    a VisuElement object.

    Returns :

    the value of attribute 'rendered'.

    visu_element_getSensitiveToPlanes ()

    gboolean            visu_element_getSensitiveToPlanes   (VisuElement *element);

    This method is used to retrieve if nodes of the element are sensitive to the masking property of planes, or not.

    element :

    a VisuElement object.

    Returns :

    TRUE if nodes are masked by planes.

    visu_element_getUpdateNodesOnMaterialChange ()

    gboolean            visu_element_getUpdateNodesOnMaterialChange
                                                            (void);

    Retrieve if one the VisuElement is sensitive to the material values. See visu_element_setUpdateNodesOnMaterialChange().

    Returns :

    TRUE if a VisuGlExtNodes object should rebuild its nodes when the material values are changed.

    visu_element_lookup ()

    VisuElement *       visu_element_lookup                 (const gchar *name);

    Lookup for element name in the base. Do not create it if not found. To do this, use visu_element_retrieveFromName().

    name :

    a string.

    Returns :

    the found VisuElement or NULL. [transfer none]

    Since 3.6


    visu_element_new ()

    VisuElement *       visu_element_new                    (const char *key);

    Allocate a new visuElement with the specified name. Remember that names must be unique since they identify the element.

    key :

    the name of the new element to create.

    Returns :

    the newly created VisuElement or 0 if something goes wrong in the process (if the name already exist for example). [transfer none]

    visu_element_retrieveFromName ()

    VisuElement *       visu_element_retrieveFromName       (const gchar *name,
                                                             gboolean *nw);

    Try to find a VisuElement already associated to that name or create a new one if none has been found. If nw is not NULL it is set to FALSE if name was found.

    name :

    a string that identify the VisuElement (in UTF8) ;

    nw :

    a location to store a boolean. [out caller-allocates]

    Returns :

    a VisuElement associated to this name. [transfer none]

    visu_element_setAllColorValues ()

    gint                visu_element_setAllColorValues      (VisuElement *ele,
                                                             float rgb[4],
                                                             float material[5]);

    This method is used to set all the values that define the color and the lighting of the given element.

    ele :

    the element of which the color must be changed ;

    rgb :

    the new color given by a {red, green, blue} array ;. [in][array fixed-size=4]

    material :

    the new values to define the lighting. [in][array fixed-size=5]

    Returns :

    > 0 if values for ele have changed.

    visu_element_setAllMaterialValues ()

    gint                visu_element_setAllMaterialValues   (VisuElement *ele,
                                                             float material[5]);

    It saves the values of material in the specified VisuElement.

    ele :

    the element of which the color must be changed,

    material :

    the new values to define the lighting. [in][array fixed-size=5]

    Returns :

    > 0 if values for ele have changed.

    visu_element_setAllRGBValues ()

    gint                visu_element_setAllRGBValues        (VisuElement *ele,
                                                             float rgb[4]);

    It saves the values of rgb in the specified VisuElement.

    ele :

    the element of which the color must be changed,

    rgb :

    the new color given by a {red, green, blue} array. [in][array fixed-size=4]

    Returns :

    > 0 if values for ele have changed.

    visu_element_setMaterialValue ()

    gint                visu_element_setMaterialValue       (VisuElement *ele,
                                                             int material,
                                                             float value);

    It saves the specific value of material (use the enum as the parameter material) in the specified VisuElement.

    ele :

    the element of which the color must be changed,

    material :

    the component to change,

    value :

    the new value of the specified component.

    Returns :

    > 0 if values for ele have changed.

    visu_element_setRGBValue ()

    gint                visu_element_setRGBValue            (VisuElement *ele,
                                                             int rgb,
                                                             float value);

    It saves the specific value of rgb (0 for red, 1 for green and 2 for bluein the specified VisuElement.

    ele :

    the element of which the color must be changed,

    rgb :

    the component to change, 0 for red, 1 for green and 2 for blue,

    value :

    the value for one of the red, green or blue component.

    Returns :

    > 0 if values for ele have changed.

    visu_element_setRendered ()

    gboolean            visu_element_setRendered            (VisuElement *element,
                                                             gboolean rendered);

    This method sets the private attribute 'rendered' to TRUE or FALSE for the specified visuElement. If FALSE, all the nodes of that VisuElement are not included in the nodes OpenGL list.

    element :

    a VisuElement object ;

    rendered :

    TRUE or FALSE.

    Returns :

    TRUE if values for ele have changed.

    visu_element_setSensitiveToPlanes ()

    gboolean            visu_element_setSensitiveToPlanes   (VisuElement *element,
                                                             gboolean status);

    This method sets the private attribute 'sensitiveToPlanes' to TRUE or FALSE for the specified visuElement. If TRUE, all the nodes of that VisuElement are not sensitive to the masking property of planes.

    element :

    a VisuElement object ;

    status :

    TRUE or FALSE.

    Returns :

    TRUE if values for ele have changed.

    visu_element_setUpdateNodesOnMaterialChange ()

    void                visu_element_setUpdateNodesOnMaterialChange
                                                            (void);

    If this method is called, whenever a change occurs to a VisuElement material description (color and light) the corresponding OpenGl list of nodes of the currentVisuData is rebuilt. This is usefull if the nodes can't use the list material because the color is node dependant for example. Use visu_element_unsetUpdateNodesOnMaterialChange() to return to the normal behavior.


    visu_element_unsetUpdateNodesOnMaterialChange ()

    void                visu_element_unsetUpdateNodesOnMaterialChange
                                                            (void);

    If this method is called (and no other method has used visu_element_setUpdateNodesOnMaterialChange(), a changement in the material description only change the list of the material.

    Signal Details

    The "ElementMaterialChanged" signal

    void                user_function                      (VisuElement *element,
                                                            gpointer     user_data)      : No Recursion

    Gets emitted when the material or color properties of a VisuElement are modified.

    element :

    the object which emit the signal ;

    user_data :

    user data set when the signal handler was connected.

    Since 3.6


    The "ElementNew" signal

    void                user_function                      (VisuElement *element,
                                                            gpointer     user_data)      : No Recursion

    A new element is available.

    element :

    the object emitting the signal.

    user_data :

    user data set when the signal handler was connected.

    Since 3.6


    The "ElementPlaneChanged" signal

    void                user_function                      (VisuElement *element,
                                                            gpointer     user_data)      : No Recursion

    Gets emitted when the property of masking by plane is modified.

    element :

    the object which emit the signal ;

    user_data :

    user data set when the signal handler was connected.

    Since 3.6


    The "ElementRenderingChanged" signal

    void                user_function                      (VisuElement *element,
                                                            gpointer     user_data)      : No Recursion

    Gets emitted when the rendering characteristics of an element are changed, like their shape or specific colour. For a signal on generic colours (like the element colour), listen to VisuElement::ElementMaterialChanged signal instead.

    element :

    the object which emit the signal ;

    user_data :

    user data set when the signal handler was connected.

    Since 3.7


    The "ElementVisibilityChanged" signal

    void                user_function                      (VisuElement *element,
                                                            gpointer     user_data)      : No Recursion

    Gets emitted when one of the rendered VisuElement is made visible or hidden.

    element :

    the object which emit the signal ;

    user_data :

    user data set when the signal handler was connected.

    Since 3.6

    v_sim-3.7.0/Documentation/reference/html/v-sim-visu-gtk.html0000644000353400050620000017111212216331357020772 00000000000000 visu_gtk

    visu_gtk

    visu_gtk — Basic GUI routines, for preview, standard dialogs...

    Synopsis

    enum                VisuUiDirectoryType;
    struct              VisuUiFileFilter;
    void                (*VisuUiInitWidgetFunc)             (GtkWindow **panel,
                                                             GtkWindow **renderWindow,
                                                             GtkWidget **renderArea);
    GtkWidget *         (*VisuUiNewWidgetFunc)              (void);
    struct              VisuUiPreview;
    gboolean            (*VisuUiSetFilesFunc)               (VisuData *data,
                                                             GtkWindow *parent);
    GdkPixbuf *         tool_color_get_stamp                (const ToolColor *color,
                                                             gboolean alpha);
    GtkWidget *         visu_ui_buildRenderingWindow        (VisuUiRenderingWindow *renderWindow);
    GList *             visu_ui_createFilter                (GList *list,
                                                             GtkWidget *fileChooser);
    void                visu_ui_createInterface             (GtkWindow **panel,
                                                             GtkWindow **renderWindow,
                                                             GtkWidget **renderArea);
    GdkPixbuf *         visu_ui_createPixbuf                (const gchar *filename);
    gboolean            visu_ui_getFileFromDefaultFileChooser
                                                            (VisuData *data,
                                                             GtkWindow *parent);
    gchar *             visu_ui_getLastOpenDirectory        (void);
    GtkWindow *         visu_ui_getPanel                    (void);
    GtkWidget *         visu_ui_getRenderWidget             (void);
    GtkWindow *         visu_ui_getRenderWindow             (void);
    VisuUiSetFilesFunc  visu_ui_getRenderingSpecificOpen    (VisuRendering *method);
    gchar **            visu_ui_getSelectedDirectory        (GtkWindow *parent,
                                                             gboolean multiple,
                                                             const gchar *dir);
    void                visu_ui_mainCreate                  (VisuUiInitWidgetFunc panelFunc);
    VisuUiPreview *     visu_ui_preview_add                 (VisuUiPreview *preview,
                                                             GtkFileChooser *chooser);
    void                visu_ui_preview_update              (VisuUiPreview *preview,
                                                             const char *filenames[]);
    void                visu_ui_raiseWarning                (gchar *action,
                                                             gchar *message,
                                                             GtkWindow *window);
    void                visu_ui_raiseWarningLong            (gchar *action,
                                                             gchar *message,
                                                             GtkWindow *window);
    gboolean            visu_ui_runCommandLine              (gpointer data);
    void                visu_ui_setLastOpenDirectory        (const char *directory,
                                                             VisuUiDirectoryType type);
    void                visu_ui_setRenderWidget             (VisuUiRenderingWindow *render);
    void                visu_ui_setRenderingSpecificMethod  (VisuRendering *method,
                                                             VisuUiSetFilesFunc methodLoad);
    void                visu_ui_setWindowTitle              (GtkWindow *window,
                                                             const VisuData *dataObj);
    void                visu_ui_wait                        (void);
    

    Description

    There are some common UI routines here. The preview widget can be called with visu_ui_preview_add(). Error messages can be displayed via dialogs, see visu_ui_raiseWarning()...

    Details

    enum VisuUiDirectoryType

    typedef enum {
        VISU_UI_DIR_FILE,
        VISU_UI_DIR_SURFACE,
        VISU_UI_DIR_DATAFILE,
        VISU_UI_DIR_CONF,
        VISU_UI_DIR_BROWSER,
    } VisuUiDirectoryType;
    

    V_Sim remembers the last open directory when presenting a new file selector. This enum is used to specify different kind of directories. Like that saving a configuration file in a given directory will not affect the prefered directory for browsing a list of files.

    VISU_UI_DIR_FILE

    default kind of directory ;

    VISU_UI_DIR_SURFACE

    directory for surfaces ;

    VISU_UI_DIR_DATAFILE

    directory for data files ;

    VISU_UI_DIR_CONF

    directory for configuration files ;

    VISU_UI_DIR_BROWSER

    directory used in the browser.

    VISU_UI_DIR_N_VALUES

    private.

    struct VisuUiFileFilter

    struct VisuUiFileFilter {
      GtkFileFilter *gtkFilter;
      ToolFileFormat* visuFilter;
    };
    

    Structure used to associate the V_Sim way to store file filters with the Gtk way.

    GtkFileFilter *gtkFilter;

    the GtkFileFilter associate to visuFilter.

    ToolFileFormat *visuFilter;

    a ToolFileFormat object.

    VisuUiInitWidgetFunc ()

    void                (*VisuUiInitWidgetFunc)             (GtkWindow **panel,
                                                             GtkWindow **renderWindow,
                                                             GtkWidget **renderArea);

    This prototype is used whenever a method is required to initialise the GTK interface of V_Sim. panel must be set to point on the window of the command panel, renderWindow must point to the window containing the rendering area (can be the same than panel) and renderArea contains the widget that does the OpenGL rendering.

    panel :

    a location for a GtkWindow describing the panel.

    renderWindow :

    a location for a GtkWindow ;

    renderArea :

    a location for a GtkWidget.

    VisuUiNewWidgetFunc ()

    GtkWidget *         (*VisuUiNewWidgetFunc)              (void);

    This prototype is used whenever a method is required to create a GtkWidget.

    Returns :

    a newly created GtkWidget. [transfer full]

    struct VisuUiPreview

    struct VisuUiPreview {
      GtkWidget *check;
      GtkWidget *image;
      GtkWidget *table;
      GtkWidget *vbox;
    
      VisuData *data;
      VisuGlView *view;
    };
    

    A container for the relevant widgets of the preview area.

    GtkWidget *check;

    the widget used to allow or not preview ;

    GtkWidget *image;

    the GtkImage with the preview ;

    GtkWidget *table;

    a GtkTable with file informations ;

    GtkWidget *vbox;

    the GtkVBox with all the stuff for previewing.

    VisuData *data;

    a VisuData object.

    VisuGlView *view;

    a VisuGlView object.

    VisuUiSetFilesFunc ()

    gboolean            (*VisuUiSetFilesFunc)               (VisuData *data,
                                                             GtkWindow *parent);

    Methods that conform to this prototype is used to set filename(s) to be loaded when the 'load' button is pushed. They can use a GtkFileChooser to prompt the user for file names.

    data :

    a VisuData to store the informations ;

    parent :

    the parent window of the dialog.

    Returns :

    FALSE if no filename as been set, TRUE if the calling method should call visu_ui_rendering_window_loadFile().

    tool_color_get_stamp ()

    GdkPixbuf *         tool_color_get_stamp                (const ToolColor *color,
                                                             gboolean alpha);

    This method is used by VisuUiColorCombobox object to create little stamps representing the color. If the pixbuf of such stamps are needed, use visu_ui_color_combobox_getPixbufFromColor() if the color is registered in an already existing VisuUiColorCombobox object or use this method to create a new stamp.

    color :

    a ToolColor object ;

    alpha :

    a boolean.

    Returns :

    a pixbuf pointer corresponding to the little image as shown on a colorComboBox (use g_object_unref() to free this pixbuf). [transfer full]

    Since 3.7


    visu_ui_buildRenderingWindow ()

    GtkWidget *         visu_ui_buildRenderingWindow        (VisuUiRenderingWindow *renderWindow);

    Create a GtkWindow with V_sim render window icon and wmclass set to "V_Sim:v_sim_render". It also set the accelerators of renderWindow to the newly created window and pack renderWindow inside.

    renderWindow :

    a VisuUiRenderingWindow object.

    Returns :

    a newly created GtkWindow. [transfer full]

    Since 3.7


    visu_ui_createFilter ()

    GList *             visu_ui_createFilter                (GList *list,
                                                             GtkWidget *fileChooser);

    Create a list of GtkFileFilter created from the given list of file formats and attach it to the given fileChooser.

    list :

    a GList of ToolFileFormat ;. [element-type ToolFileFormat*]

    fileChooser :

    a file chooser to associate filters with.

    Returns :

    a list of VisuUiFileFilter. This list should be freed after use. [element-type VisuUiFileFilter][transfer full]

    visu_ui_createInterface ()

    void                visu_ui_createInterface             (GtkWindow **panel,
                                                             GtkWindow **renderWindow,
                                                             GtkWidget **renderArea);

    A convenient routine that creates a VisuUiRenderingWindow alone. To create also a command panel, visu_ui_main_class_createMain() should be used instead.

    panel :

    always NULL here.

    renderWindow :

    a location for a GtkWindow ;

    renderArea :

    a location for a GtkWidget.

    visu_ui_createPixbuf ()

    GdkPixbuf *         visu_ui_createPixbuf                (const gchar *filename);

    Replace the create_pixbuf() routine from Glade. It looks only in the default pixmap directory of V_Sim to find the given file.

    filename :

    a file name (must be a base name). [type filename]

    Returns :

    a newly created GdkPixbuf on success. [transfer full]

    visu_ui_getFileFromDefaultFileChooser ()

    gboolean            visu_ui_getFileFromDefaultFileChooser
                                                            (VisuData *data,
                                                             GtkWindow *parent);

    This method is a default method to launch a file chooser that select a single file, with the filters of the current RenderingMethod. It creates a modal dialog, and wait for its reponse. If OK is clicked, the selected filename is stored. If Cancel is clicked, nothing is done. The dialog is destroyed after use.

    data :

    an allocated VisuData to store the file names ;

    parent :

    the parent window of the dialog.

    Returns :

    FALSE if no file has been set, TRUE if the calling method should call visu_ui_rendering_window_loadFile().

    visu_ui_getLastOpenDirectory ()

    gchar *             visu_ui_getLastOpenDirectory        (void);

    V_Sim stores the last open directory to set the file chooser to this one the next time it will come. Use visu_ui_setLastOpenDirectory() to store it after a GTK_RESPONSE_OK has been returned by a file chooser and then initialise each new with this routine.

    Returns :

    a string owned by V_Sim. [transfer none]

    visu_ui_getPanel ()

    GtkWindow *         visu_ui_getPanel                    (void);

    A convenient function to get the command panel window.

    Returns :

    a GtkWindow. [transfer none]

    visu_ui_getRenderWidget ()

    GtkWidget *         visu_ui_getRenderWidget             (void);

    A convenient function to get the rendering area widget.

    Returns :

    a GtkWidget. [transfer none]

    visu_ui_getRenderWindow ()

    GtkWindow *         visu_ui_getRenderWindow             (void);

    A convenient function to get the rendering area window.

    Returns :

    a GtkWindow. [transfer none]

    visu_ui_getRenderingSpecificOpen ()

    VisuUiSetFilesFunc  visu_ui_getRenderingSpecificOpen    (VisuRendering *method);

    This method is used to retrieve the VisuUiSetFilesFunc associate with the specified method.

    method :

    a RenderingMethod object.

    Returns :

    a load method if one has been specified for method or visu_ui_getFileFromDefaultFileChooser().

    visu_ui_getSelectedDirectory ()

    gchar **            visu_ui_getSelectedDirectory        (GtkWindow *parent,
                                                             gboolean multiple,
                                                             const gchar *dir);

    General procedure to get the location of one or more directories. In the multiple case, all selected directories shares a common ancestor since the selection is done through the same selector that for single directory but with multiple selection activated. If dir is NULL the last opened (and stored) directory is used (see visu_ui_getLastOpenDirectory() and visu_ui_setLastOpenDirectory()).

    parent :

    if NULL, the command panel window is used ;. [allow-none]

    multiple :

    if TRUE, multiple directories can be selected ;

    dir :

    if not NULL, give the opening directory. [allow-none]

    Returns :

    a newly allocated array of paths, NULL terminated. Use g_strfreev() to free it after use. If no directory is selected, then NULL is returned. [array zero-terminated=1][transfer full]

    visu_ui_mainCreate ()

    void                visu_ui_mainCreate                  (VisuUiInitWidgetFunc panelFunc);

    It initializses the GTK part of V_Sim. During this initialisation, the panelFunc is called. It should create all the windows needed by V_Sim, like the command panel and the rendering area. The return widget is the widget returned itself by panelFunc. It must be the main widget: it is the command panel if used, the window containing the rendering area if no command panel or the rendering area itself if no container window.

    panelFunc :

    function to be called to create the different windows. [scope call]

    Returns :

    the main widget for V_Sim, returned itself by panelFunc.

    visu_ui_preview_add ()

    VisuUiPreview *     visu_ui_preview_add                 (VisuUiPreview *preview,
                                                             GtkFileChooser *chooser);

    Create the widgets to have a preview attached to filechooser. But the signal raised by filechooser when previewing is needed is not attached and this must be done by the user with custom routine.

    preview :

    a location on VisuUiPreview (uninitialised) ;

    chooser :

    the filechooser the preview must be attached to.

    Returns :

    preview itself.

    visu_ui_preview_update ()

    void                visu_ui_preview_update              (VisuUiPreview *preview,
                                                             const char *filenames[]);

    This routine update the content of the given preview by making a rendering in a pixmap of the given filenames. The number of given filenames must match the number required by the current rendering method. Only the nodes, the box and the background (plus fog) is actually previewed.

    preview :

    a location on VisuUiPreview (initialised) ;

    filenames :

    an array of filenames.

    visu_ui_raiseWarning ()

    void                visu_ui_raiseWarning                (gchar *action,
                                                             gchar *message,
                                                             GtkWindow *window);

    Raise a warning window with the action in bold and the message written underneath.

    action :

    a string ;

    message :

    another string ;

    window :

    the parent window to raise the warning on.

    visu_ui_raiseWarningLong ()

    void                visu_ui_raiseWarningLong            (gchar *action,
                                                             gchar *message,
                                                             GtkWindow *window);

    Same as visu_ui_raiseWarning() except that the message is displayed in a text buffer, ideal for a log.

    action :

    a string ;

    message :

    another string ;

    window :

    the parent window to raise the warning on.

    visu_ui_runCommandLine ()

    gboolean            visu_ui_runCommandLine              (gpointer data);

    Call the get routines from the command line module and deal with them. This method is not aware of the panels and is intended to be called only when the command panel is not used. In the opposite case, use visu_ui_main_runCommandLine() instead.

    data :

    a pointer to the command panel (see VisuUiMain).

    Returns :

    FALSE always.

    visu_ui_setLastOpenDirectory ()

    void                visu_ui_setLastOpenDirectory        (const char *directory,
                                                             VisuUiDirectoryType type);

    V_Sim stores the last open directory to set the file chooser to this one the next time it will come. Use this routine each time a file chooser returns GTK_RESPONSE_OK. The given string will be copied and can be freed after use.

    directory :

    a full path to a directory ;

    type :

    the kind of directory to set the remember flag on.

    visu_ui_setRenderWidget ()

    void                visu_ui_setRenderWidget             (VisuUiRenderingWindow *render);

    A convenient function to set the rendering area widget.

    render :

    a VisuUiRenderingWindow widget.

    Since 3.7


    visu_ui_setRenderingSpecificMethod ()

    void                visu_ui_setRenderingSpecificMethod  (VisuRendering *method,
                                                             VisuUiSetFilesFunc methodLoad);

    This function is used by a client to add gtk methods to a rendering method. The methodLoad argument is called to when the 'load' button is pushed.

    method :

    a RenderingMethod object;

    methodLoad :

    a VisuUiSetFilesFunc method (can be NULL). [scope call]

    visu_ui_setWindowTitle ()

    void                visu_ui_setWindowTitle              (GtkWindow *window,
                                                             const VisuData *dataObj);

    Change the title of the given window, according to dataObj (setting usually the name of the loaded file).

    window :

    a GtkWindow object.

    dataObj :

    a VisuData object.

    Since 3.7


    visu_ui_wait ()

    void                visu_ui_wait                        (void);

    It runs the Gtk event loop, flushing it before returning.

    v_sim-3.7.0/Documentation/reference/html/v-sim-visu-openGL.html0000644000353400050620000004025612216331357021375 00000000000000 visu_openGL

    visu_openGL

    visu_openGL — Define the OS dependent routines related to OpenGL.

    Synopsis

    #define             GDKGLEXT_MULTIHEAD_SUPPORT
    #define             IMPL_BUILTIN_WIN32
    #define             IMPL_BUILTIN_X11
    #define             IMPL_GTKGLEXT
                        VisuPixmapContext;
    GdkGLConfig *       visu_gl_getGLConfig                 (GdkScreen *screen);
    XVisualInfo *       visu_gl_getVisualInfo               (Display *dpy,
                                                             int screenId);
    GLuint              visu_gl_initFontList                (guint size);
    void                visu_gl_setupPixelFormat            (HDC hDC);
    void                visu_pixmap_context_free            (VisuPixmapContext *dumpData);
    VisuPixmapContext * visu_pixmap_context_new             (guint width,
                                                             guint height);
    GArray *            visu_pixmap_getData                 (guint width,
                                                             guint height,
                                                             gboolean hasAlpha);
    

    Description

    TODO

    Details

    GDKGLEXT_MULTIHEAD_SUPPORT

      #define GDKGLEXT_MULTIHEAD_SUPPORT
    

    GtkGlExt support.


    IMPL_BUILTIN_WIN32

      #define IMPL_BUILTIN_WIN32
    

    Win32 support.


    IMPL_BUILTIN_X11

      #define IMPL_BUILTIN_X11
    

    X11 support.


    IMPL_GTKGLEXT

      #define IMPL_GTKGLEXT
    

    GtkGlExt support.


    VisuPixmapContext

    typedef struct _VisuPixmapContext VisuPixmapContext;

    Short way to address _VisuPixmapContext objects.


    visu_gl_getGLConfig ()

    GdkGLConfig *       visu_gl_getGLConfig                 (GdkScreen *screen);

    Call gdk_gl_config_new_for_screen(), trying to acquire a RGBA visual with stereo capabilities. This method is used internaly and should not be used elsewhere.

    screen :

    a GdkScreen.

    Returns :

    a matching GdkGLConfig.

    visu_gl_getVisualInfo ()

    XVisualInfo *       visu_gl_getVisualInfo               (Display *dpy,
                                                             int screenId);

    Call glXChooseVisual(), trying to acquire a RGBA visual with stereo capabilities. This method is used internaly and should not be used elsewhere.

    dpy :

    an X display ;

    screenId :

    an X screen id.

    Returns :

    an allocated XVisualInfo.

    visu_gl_initFontList ()

    GLuint              visu_gl_initFontList                (guint size);

    This method create a list with a default font.

    size :

    the size of the text.

    Returns :

    the GL id of the list storing the font. [type guint32][transfer none]

    visu_gl_setupPixelFormat ()

    void                visu_gl_setupPixelFormat            (HDC hDC);

    Call ChoosePixelFormat() and SetPixelFormat(), trying to acquire a RGBA visual. This method is used internaly and should not be used elsewhere.

    hDC :

    an HDC.

    visu_pixmap_context_free ()

    void                visu_pixmap_context_free            (VisuPixmapContext *dumpData);

    Free an allocated DumpImage.

    dumpData :

    an allocated DumpImage object.

    visu_pixmap_context_new ()

    VisuPixmapContext * visu_pixmap_context_new             (guint width,
                                                             guint height);

    Create a pixmap storage and a context associated to it. This pixmap can then be used to dump pixel data from an OpenGL area.

    width :

    an integer ;

    height :

    an integer.

    Returns :

    a newly allocated DumpImage object. [transfer none]

    visu_pixmap_getData ()

    GArray *            visu_pixmap_getData                 (guint width,
                                                             guint height,
                                                             gboolean hasAlpha);

    Dump the pixels of the current GL area, assuming that its size is given by widthx@height. This method should not be used directly, see visu_ui_gl_widget_getPixmapData() to dump a given OpenGL area.

    width :

    an integer ;

    height :

    an integer ;

    hasAlpha :

    if TRUE, read also the alpha channel.

    Returns :

    newly allocated dump data (use g_array_unref() after use). [transfer full][element-type gint8]
    v_sim-3.7.0/Documentation/reference/html/v-sim-visu-plugins.html0000644000353400050620000004237012216331357021671 00000000000000 visu_plugins

    visu_plugins

    visu_plugins — Introduces the basic handling of plug-ins.

    Description

    Plug-ins are made of shared library presenting some common routines. These routines are of kind:

    All these routines must be named using the name of the module. When the module is loaded into memory, V_Sim will try to find these methods and will store them into the VisuPlugin structure for future calls.

    At the present time, only the Unix version is functional. Moreover, currently, no stable API is available from the main program. This should be corrected quickly.

    Details

    VisuPlugin

    typedef struct _VisuPlugin VisuPlugin;

    Short way to address _VisuPlugin objects.


    VisuPluginFreeFunc ()

    void                (*VisuPluginFreeFunc)               (void);

    This kind of method may exist in all plugins with the name '{module_name}Free'. It is called by V_Sim when it stops.

    Since 3.7


    VisuPluginInfoFunc ()

    const gchar *       (*VisuPluginInfoFunc)               (void);

    This kind of method should exist in all plugins it give a description of what the plugin does. It must be named '{module_name}Get_description'.

    Returns :

    a string in UTF-8 owned by the plugin.

    VisuPluginInitFunc ()

    gboolean            (*VisuPluginInitFunc)               (void);

    This kind of method should exist in all plugins with the name '{module_name}Init'. It is called by V_Sim when the module is loaded.

    Returns :

    TRUE if it loads correctly.

    visu_plugin_getAuthors ()

    const gchar *       visu_plugin_getAuthors              (VisuPlugin *plug);

    Return a string with the list of authors.

    plug :

    a VisuPlugin object.

    Returns :

    a private string.

    Since 3.6


    visu_plugin_getDescription ()

    const gchar *       visu_plugin_getDescription          (VisuPlugin *plug);

    Return a string with the description of the plugin.

    plug :

    a VisuPlugin object.

    Returns :

    a private string.

    Since 3.6


    visu_plugin_getIconPath ()

    const gchar *       visu_plugin_getIconPath             (VisuPlugin *plug);

    Return a string with the path to find an icon representing the plugin.

    plug :

    a VisuPlugin object.

    Returns :

    a private string.

    Since 3.6


    visu_plugin_getName ()

    const gchar *       visu_plugin_getName                 (VisuPlugin *plug);

    Return a string with the name.

    plug :

    a VisuPlugin object.

    Returns :

    a private string.

    Since 3.6


    visu_plugin_initGtk ()

    void                visu_plugin_initGtk                 (VisuPlugin *plug);

    Run the initGtk() method of the plugin, if it exists.

    plug :

    a VisuPlugin object.

    Since 3.6


    visu_plugins_free ()

    void                visu_plugins_free                   ();

    Finalise the part of V_Sim related to plug-ins. Should not be called (called once by V_Sim on stopping only).

    Since 3.7


    visu_plugins_getListLoaded ()

    GList *             visu_plugins_getListLoaded          ();

    On startup, plugins are loaded according to a list present in the configuration file. It is possible to access the list of all loaded plugins with this method.

    Returns :

    a GList owned by V_Sim of VisuPlugin objects. [element-type VisuPlugin][transfer none]

    visu_plugins_init ()

    void                visu_plugins_init                   ();

    Initialise this part of code. Should not be called (called once by V_Sim on startup only). It try to load all plugins found in the installation directory and in the user directory.

    v_sim-3.7.0/Documentation/reference/html/v-sim-wire.html0000644000353400050620000004431612216331357020174 00000000000000 wire

    wire

    wire — Gives methods to draw lines as OpenGl objects pairing two elements.

    Description

    The wire pair module is the simplest way to draw pairs between elements : using lines. The size of lines can be chosen but is limited by OpenGL implementation that usually only allow line width of 10 pixels as maximum size.

    Details

    visu_gl_pairs_wire_getGeneralWidth ()

    guint               visu_gl_pairs_wire_getGeneralWidth  ();

    Get the default width for wire pairs (see visu_gl_pairs_wire_setGeneralWidth() to set this value).

    Returns :

    the default width.

    visu_gl_pairs_wire_getShade ()

    ToolShade *         visu_gl_pairs_wire_getShade         (VisuPairLink *data);

    Colour of wires can depend on length, following a ToolShade scheme.

    data :

    a VisuPairLink object.

    Returns :

    the ToolShade scheme if used, or NULL. [transfer none]

    Since 3.6


    visu_gl_pairs_wire_getStatic ()

    VisuPairExtension * visu_gl_pairs_wire_getStatic        ();

    Internal function to access the VisuPairExtension wire.

    Returns :

    the VisuPairExtension wire. [transfer none]

    Since 3.6


    visu_gl_pairs_wire_getStipple ()

    guint16             visu_gl_pairs_wire_getStipple       (VisuPairLink *data);

    Get the line pattern of data.

    data :

    a VisuPairLink object.

    Returns :

    a line pattern (default is 65535).

    visu_gl_pairs_wire_getWidth ()

    guint               visu_gl_pairs_wire_getWidth         (VisuPairLink *data);

    Get the width of the given pair data. If the given pair has no specific width, the defaul value is returned.

    data :

    a VisuPairLink object.

    Returns :

    the width of the given pair.

    visu_gl_pairs_wire_init ()

    VisuPairExtension * visu_gl_pairs_wire_init             ();

    This method is used by V_Sim on startup, don't use it on your own.

    Returns :

    the wire pair extension.

    visu_gl_pairs_wire_setGeneralWidth ()

    gboolean            visu_gl_pairs_wire_setGeneralWidth  (guint val);

    The width of line between elements can be chosen by kinds of pairs, but can use a default value for all kinds of pairs when no individual value is available. Use this method to set the default width.

    val :

    a positive integer.

    Returns :

    TRUE if the value is different from previous.

    visu_gl_pairs_wire_setShade ()

    gboolean            visu_gl_pairs_wire_setShade         (VisuPairLink *data,
                                                             ToolShade *shade);

    If shade is not NULL, make the colour of each pair varies with its length according to shade colour scheme.

    data :

    a VisuPairLink object.

    shade :

    a ToolShade object (can be NULL). [allow-none]

    Returns :

    TRUE if shade is changed.

    Since 3.6


    visu_gl_pairs_wire_setStipple ()

    gboolean            visu_gl_pairs_wire_setStipple       (VisuPairLink *data,
                                                             guint16 stipple);

    Change the line pattern of data.

    data :

    a VisuPairLink object ;

    stipple :

    a pattern.

    Returns :

    TRUE if the value is different from previous.

    visu_gl_pairs_wire_setWidth ()

    gboolean            visu_gl_pairs_wire_setWidth         (VisuPairLink *data,
                                                             guint val);

    This method allows to change the width of line for a specific pair. When a pair is rendered via with a line, it first checks if that pairs has a specific width value set by this method. If not, it uses the default value.

    data :

    a VisuPairLink object ;

    val :

    a positive integer.

    Returns :

    TRUE if the value is different from previous.
    v_sim-3.7.0/Documentation/reference/html/VisuGlView.html0000644000353400050620000030700512216331356020235 00000000000000 VisuGlView

    VisuGlView

    VisuGlView — Defines all necessary informations for the rendering of a view.

    Synopsis

    #define             TOOL_PI180
    #define             VISU_GL_CAMERA_OMEGA
    #define             VISU_GL_CAMERA_PHI
    #define             VISU_GL_CAMERA_THETA
    #define             VISU_GL_CAMERA_XS
    #define             VISU_GL_CAMERA_YS
    struct              VisuGlCamera;
    enum                VisuGlCameraAxis;
    struct              VisuGlView;
    struct              VisuGlViewClass;
                        VisuGlViewClassPrivate;
    struct              VisuGlWindow;
    void                visu_gl_camera_copy                 (VisuGlCamera *to,
                                                             const VisuGlCamera *from);
    float               visu_gl_camera_getRefLength         (VisuGlCamera *camera,
                                                             ToolUnits *unit);
    void                visu_gl_camera_getScreenAxes        (VisuGlCamera *camera,
                                                             float xAxis[3],
                                                             float yAxis[3]);
    void                visu_gl_camera_modelize             (VisuGlCamera *camera);
    gboolean            visu_gl_camera_setGross             (VisuGlCamera *camera,
                                                             float value);
    gboolean            visu_gl_camera_setPersp             (VisuGlCamera *camera,
                                                             float value);
    gboolean            visu_gl_camera_setRefLength         (VisuGlCamera *camera,
                                                             float value,
                                                             ToolUnits unit);
    gboolean            visu_gl_camera_setThetaPhiOmega     (VisuGlCamera *camera,
                                                             float valueTheta,
                                                             float valuePhi,
                                                             float valueOmega,
                                                             int mask);
    void                visu_gl_camera_setUpAxis            (VisuGlCamera *camera,
                                                             VisuGlCameraAxis upAxis);
    gboolean            visu_gl_camera_setXsYs              (VisuGlCamera *camera,
                                                             float valueX,
                                                             float valueY,
                                                             int mask);
    float               visu_gl_view_class_getPrecision     (void);
    gboolean            visu_gl_view_class_setPrecision     (float value);
    gint                visu_gl_view_getDetailLevel         (VisuGlView *view,
                                                             float dimension);
    void                visu_gl_view_getRealCoordinates     (VisuGlView *view,
                                                             float xyz[3],
                                                             float winx,
                                                             float winy,
                                                             float winz);
    float               visu_gl_view_getZCoordinate         (VisuGlView *view,
                                                             float xyz[3]);
    VisuGlView *        visu_gl_view_new                    (void);
    VisuGlView *        visu_gl_view_new_withSize           (guint w,
                                                             guint h);
    void                visu_gl_view_rotateBox              (VisuGlView *view,
                                                             float dTheta,
                                                             float dPhi,
                                                             float angles[2]);
    void                visu_gl_view_rotateCamera           (VisuGlView *view,
                                                             float dTheta,
                                                             float dPhi,
                                                             float angles[3]);
    gboolean            visu_gl_view_setGross               (VisuGlView *view,
                                                             float value);
    gboolean            visu_gl_view_setObjectRadius        (VisuGlView *view,
                                                             float lg,
                                                             ToolUnits units);
    gboolean            visu_gl_view_setPersp               (VisuGlView *view,
                                                             float value);
    gboolean            visu_gl_view_setRefLength           (VisuGlView *view,
                                                             float lg,
                                                             ToolUnits units);
    gboolean            visu_gl_view_setThetaPhiOmega       (VisuGlView *view,
                                                             float valueTheta,
                                                             float valuePhi,
                                                             float valueOmega,
                                                             int mask);
    gboolean            visu_gl_view_setViewport            (VisuGlView *view,
                                                             guint width,
                                                             guint height);
    gboolean            visu_gl_view_setXsYs                (VisuGlView *view,
                                                             float valueX,
                                                             float valueY,
                                                             int mask);
    float               visu_gl_window_getAddLength         (VisuGlWindow *window,
                                                             ToolUnits *unit);
    float               visu_gl_window_getFileUnitPerPixel  (VisuGlWindow *window);
    void                visu_gl_window_project              (VisuGlWindow *window,
                                                             const VisuGlCamera *camera);
    gboolean            visu_gl_window_setAddLength         (VisuGlWindow *window,
                                                             float value,
                                                             ToolUnits unit);
    gboolean            visu_gl_window_setViewport          (VisuGlWindow *window,
                                                             guint width,
                                                             guint height);
    

    Object Hierarchy

      GBoxed
       +----VisuGlCamera
    
      GObject
       +----VisuGlView
    

    Implemented Interfaces

    VisuGlView implements VisuBoxed.

    Description

    The VisuGlView stores three basic informations: one for the position and orientation of the camera (VisuGlCamera), one for the description of the bounding box in the OpenGL coordinates (OpenGLBox, should be moved elsewhere later) and one last for the definition of the viewing window (VisuGlWindow, including volumic informations).

    One resource is used by this part, defining the precision desired by the user when drawing OpenGL objects. This precision can be changed using visu_gl_view_class_setPrecision() and all V_Sim part drawing something should use visu_gl_view_getDetailLevel() to know the size of the vertices to be drawn depending on this precision and the level of zoom.

    The rendering is done in an OpenGl viewport whose size is given by the bounding box (plus 10%). The camera can be positionned with three angles (theta, phi and omega) and has a zoom factor (gross) and a perspective value (d_red). The angle theta is around the z axis (box coordinates), phi is around the new x axis (after the theta rotation) and omega is a rotation around the axis which goes from the observer to the center of the bounding box. By default the camera looks at the center of the bounding box but this can be changed with the Xs and Ys parameters. These values are stored and are readable through the VisuGlCamera structure. They must be changed with the following methods : openGLViewSet_thetaPhiOmega(), openGLViewSet_gross(), openGLViewSet_persp() and openGLViewSet_XsYs().

    Details

    TOOL_PI180

    #define TOOL_PI180 0.017453292522
    

    Value of pi / 180.


    VISU_GL_CAMERA_OMEGA

    #define VISU_GL_CAMERA_OMEGA   (1 << 3)
    

    Value used in the visu_gl_camera_setThetaPhiOmega() method to store the omega angle.


    VISU_GL_CAMERA_PHI

    #define VISU_GL_CAMERA_PHI   (1 << 2)
    

    Value used in the visu_gl_camera_setThetaPhiOmega() method to store the phi angle.


    VISU_GL_CAMERA_THETA

    #define VISU_GL_CAMERA_THETA (1 << 1)
    

    Value used in the visu_gl_camera_setThetaPhiOmega() method to store the tetha angle.


    VISU_GL_CAMERA_XS

    #define VISU_GL_CAMERA_XS (1 << 1)
    

    Value used in the visu_gl_camera_setXsYs() method to store the horizontal offset.


    VISU_GL_CAMERA_YS

    #define VISU_GL_CAMERA_YS   (1 << 2)
    

    Value used in the visu_gl_camera_setXsYs() method to store the vertical offset.


    struct VisuGlCamera

    struct VisuGlCamera {
      /* Perspective. */
      double d_red;
      /* Orientation. */
      double theta, phi, omega;
      /* Position. */
      double xs, ys;
      /* Zoom. */
      double gross;
      /* A length reference and its unit. */
      double length0;
      ToolUnits unit;
    
      /* Up vector. */
      double up[3];
      /* Up axis. */
      VisuGlCameraAxis upAxis;
      /* Eye target and eye position. */
      double centre[3], eye[3];
    };
    

    Values to define the position of the observer.

    double d_red;

    a factor for perspective from 1. to inifnity. With one, the nose of the observer is completly set on the rendered object, and the size of the observer is neglectible compared to the size of the object.

    double theta;

    the theta angle in spherical coordinates of the position of the observer ;

    double phi;

    the phi angle in spherical coordinates of the position of the observer ;

    double omega;

    rotation of the observer on itself ;

    double xs;

    a value for translation of the viewport on x axis ;

    double ys;

    a value for translation of the viewport on y axis ;

    double gross;

    a value of zoom ;

    double length0;

    a length reference to adimension all values, by default, this is the longest diagonal of the current box (without duplication) ;

    ToolUnits unit;

    the unit of length0.

    double up[3];

    the current up vector. [in][array fixed-size=3]

    VisuGlCameraAxis upAxis;

    which axis define the north pole.

    double centre[3];

    position of the eye look at ;. [in][array fixed-size=3]

    double eye[3];

    position of the eye. [in][array fixed-size=3]

    enum VisuGlCameraAxis

    typedef enum {
        VIEW_X,
        VIEW_Y,
        VIEW_Z
    } VisuGlCameraAxis;
    

    Define the up axis.

    VIEW_X

    the up axis is X ;

    VIEW_Y

    the up axis is Y ;

    VIEW_Z

    the up axis is Z.

    struct VisuGlView

    struct VisuGlView;

    A container structure to deal with OpenGL observer position, size of rendering viewport...


    struct VisuGlViewClass

    struct VisuGlViewClass {
      GObjectClass parent;
    
      VisuGlViewClassPrivate *priv;
    };
    

    An opaque structure.

    GObjectClass parent;

    the parent class.

    VisuGlViewClassPrivate *priv;

    private members.

    VisuGlViewClassPrivate

    typedef struct _VisuGlViewClassPrivate VisuGlViewClassPrivate;

    An opaque structure.


    struct VisuGlWindow

    struct VisuGlWindow {
      float extens;
      ToolUnits unit;
    
      guint width, height;
      double near, far;
      double left, right, bottom, top;
    };
    

    Values to describe the window where the render is done.

    float extens;

    additional length to add to length0 to obtain the global viewable area.

    ToolUnits unit;

    the ToolUnits of extens.

    guint width;

    the width of the window ;

    guint height;

    the height of the window ;

    double near;

    the beginning of the viewport on z axis (z for observer) ;

    double far;

    the end of the viewport on z axis (z for observer) ;

    double left;

    the left of the viewport on x axis ;

    double right;

    the right of the viewport on x axis ;

    double bottom;

    the bottom of the viewport on y axis ;

    double top;

    the top of the viewport on y axis ;

    visu_gl_camera_copy ()

    void                visu_gl_camera_copy                 (VisuGlCamera *to,
                                                             const VisuGlCamera *from);

    Do a deep copy of from to to.

    to :

    a location to copy values to

    from :

    a VisuGlCamera to copy values from

    Since 3.7


    visu_gl_camera_getRefLength ()

    float               visu_gl_camera_getRefLength         (VisuGlCamera *camera,
                                                             ToolUnits *unit);

    The zoom is define from a reference length in given unit. If unit is provided, the corresponding unit will be set.

    camera :

    a VisuGlCamera object.

    unit :

    a location for unit value (can be NULL).

    Returns :

    the current reference length.

    Since 3.6


    visu_gl_camera_getScreenAxes ()

    void                visu_gl_camera_getScreenAxes        (VisuGlCamera *camera,
                                                             float xAxis[3],
                                                             float yAxis[3]);

    This method is used to get the coordinates in box frame of x axis and y axis of the current camera view.

    camera :

    a valid VisuGlCamera.

    xAxis :

    three float values representing x axis ;. [in][array fixed-size=3]

    yAxis :

    three float values representing y axis. [in][array fixed-size=3]

    visu_gl_camera_modelize ()

    void                visu_gl_camera_modelize             (VisuGlCamera *camera);

    Set-up the orientation matrix, depending on the camera definition.

    camera :

    a VisuGlCamera object.

    visu_gl_camera_setGross ()

    gboolean            visu_gl_camera_setGross             (VisuGlCamera *camera,
                                                             float value);

    Change the value of the camera zoom value. If the value is higher than 10 it is set to 10 and if the value is negative it is set to 0.001.

    camera :

    a valid VisuGlCamera object ;

    value :

    a positive floating point value.

    Returns :

    TRUE if the signal OpenGLAskForReDraw should be emitted.

    visu_gl_camera_setPersp ()

    gboolean            visu_gl_camera_setPersp             (VisuGlCamera *camera,
                                                             float value);

    Change the value of the camera perspective value and put it in bounds if needed.

    camera :

    a valid VisuGlCamera object ;

    value :

    a floating point value greater than 1.1.

    Returns :

    TRUE if the signal OpenGLAskForReDraw should be emitted.

    visu_gl_camera_setRefLength ()

    gboolean            visu_gl_camera_setRefLength         (VisuGlCamera *camera,
                                                             float value,
                                                             ToolUnits unit);

    Change the reference value that is used for the zoom.

    camera :

    a VisuGlCamera object.

    value :

    a new length.

    unit :

    its measurement unit.

    Returns :

    TRUE if the value is indeed changed.

    Since 3.6


    visu_gl_camera_setThetaPhiOmega ()

    gboolean            visu_gl_camera_setThetaPhiOmega     (VisuGlCamera *camera,
                                                             float valueTheta,
                                                             float valuePhi,
                                                             float valueOmega,
                                                             int mask);

    Change the orientation of the camera to the specified angles.

    camera :

    a valid VisuGlCamera object ;

    valueTheta :

    a floatinf point value in degrees ;

    valuePhi :

    a floating point value in degrees ;

    valueOmega :

    a floating point value in degrees ;

    mask :

    to specified what values will be changed.

    Returns :

    TRUE if the signal OpenGLAskForReDraw should be emitted.

    visu_gl_camera_setUpAxis ()

    void                visu_gl_camera_setUpAxis            (VisuGlCamera *camera,
                                                             VisuGlCameraAxis upAxis);

    In constraint observation mode, the "north" direction is a singular one. Define this direction with this routine.

    camera :

    a VisuGlCamera object.

    upAxis :

    a direction.

    Since 3.6


    visu_gl_camera_setXsYs ()

    gboolean            visu_gl_camera_setXsYs              (VisuGlCamera *camera,
                                                             float valueX,
                                                             float valueY,
                                                             int mask);

    Change the point where the camera is pointed to.

    camera :

    a valid VisuGlCamera object ;

    valueX :

    a floatinf point value in the bounding box scale (1 is the size of the bounding box) ;

    valueY :

    a floating point value in bounding box scale ;

    mask :

    to specified what values will be changed.

    Returns :

    TRUE if the signal OpenGLAskForReDraw should be emitted.

    visu_gl_view_class_getPrecision ()

    float               visu_gl_view_class_getPrecision     (void);

    This function retrieve the value of the parameter precisionOfRendering.

    Returns :

    the actual precision.

    visu_gl_view_class_setPrecision ()

    gboolean            visu_gl_view_class_setPrecision     (float value);

    This function change the value of the parameter precisionOfRendering. It changes the number of facettes advised for every objects. It allows to increase or decrease the number of polygons drawn and thus acts on the speed of rendering.

    value :

    a positive value (1. is normal precision).

    Returns :

    TRUE if the signals OpenGLFacetteChanged and OpenGLAskForReDraw should be emitted.

    visu_gl_view_getDetailLevel ()

    gint                visu_gl_view_getDetailLevel         (VisuGlView *view,
                                                             float dimension);

    This is a function to get the number of "facettes" advised by the server (according to its policy on rendering) to draw an object according to a given dimension.

    view :

    a valid VisuGlView object ;

    dimension :

    the size of the object which asks for its number of facettes.

    Returns :

    the number of facettes the object should used.

    visu_gl_view_getRealCoordinates ()

    void                visu_gl_view_getRealCoordinates     (VisuGlView *view,
                                                             float xyz[3],
                                                             float winx,
                                                             float winy,
                                                             float winz);

    Use this routine to get the cartesian coordinates in real space of a point located at winx and winy on screen.

    view :

    a VisuGlView object.

    xyz :

    a location to store the result.

    winx :

    position on X axis of screen.

    winy :

    position on Y axis of screen.

    winz :

    height before projection on screen.

    visu_gl_view_getZCoordinate ()

    float               visu_gl_view_getZCoordinate         (VisuGlView *view,
                                                             float xyz[3]);

    Use this routine to know the Z value of a real point defined by xyz in caretsian coordinates.

    view :

    a VisuGlView object.

    xyz :

    a cartesian point.

    visu_gl_view_new ()

    VisuGlView *        visu_gl_view_new                    (void);

    Create a new VisuGlView object with default values.

    Returns :

    the newly created object. [transfer full]

    visu_gl_view_new_withSize ()

    VisuGlView *        visu_gl_view_new_withSize           (guint w,
                                                             guint h);

    Create a new VisuGlView object with default values and the given window size.

    w :

    the width ;

    h :

    the height.

    Returns :

    the newly created object. [transfer full]

    Since 3.7


    visu_gl_view_rotateBox ()

    void                visu_gl_view_rotateBox              (VisuGlView *view,
                                                             float dTheta,
                                                             float dPhi,
                                                             float angles[2]);

    This methods rotates the camera of the given view of (dTheta, dPhi) and put new theta and phi angles in angles, first being theta and second phi.

    view :

    a valid VisuGlView object ;

    dTheta :

    a float value ;

    dPhi :

    a float value ;

    angles :

    a storing area two floats. [out][array fixed-size=2]

    visu_gl_view_rotateCamera ()

    void                visu_gl_view_rotateCamera           (VisuGlView *view,
                                                             float dTheta,
                                                             float dPhi,
                                                             float angles[3]);

    This methods rotates the camera of the given view of (dTheta, dPhi). dTheta is taken as displacement along camera x axis and dPhi along camera y axis. Then, computations are done to obtain new theta, phi and omega values. They are put in angles, first being theta, second phi and third omega.

    view :

    a valid VisuGlView object ;

    dTheta :

    a float value ;

    dPhi :

    a float value ;

    angles :

    a storing area three floats. [out][array fixed-size=3]

    visu_gl_view_setGross ()

    gboolean            visu_gl_view_setGross               (VisuGlView *view,
                                                             float value);

    This method is used to change the camera zoom for the given view. If necessary, this method will emit the 'GrossChanged' signal and the 'FacetteChangedChanged' signal.

    view :

    a VisuGlView object ;

    value :

    a positive floating point value.

    Returns :

    1 if the 'OpenGLAskForReDraw' signal should be emitted.

    visu_gl_view_setObjectRadius ()

    gboolean            visu_gl_view_setObjectRadius        (VisuGlView *view,
                                                             float lg,
                                                             ToolUnits units);

    This method is used to change the window frustum for the given view. If necessary, this method will project and emit the 'NearFarChanged' signal.

    view :

    a VisuGlView object ;

    lg :

    the new value.

    units :

    the unit to read lg with.

    Returns :

    TRUE if the 'OpenGLAskForReDraw' signal should be emitted.

    Since 3.7


    visu_gl_view_setPersp ()

    gboolean            visu_gl_view_setPersp               (VisuGlView *view,
                                                             float value);

    This method is used to change the camera perspective for the given view. If necessary, this method will emit the 'PerspChanged' signal and the 'FacetteChangedChanged' signal.

    view :

    a VisuGlView object ;

    value :

    a positive floating point value (> 1.1).

    Returns :

    1 if the 'OpenGLAskForReDraw' signal should be emitted.

    visu_gl_view_setRefLength ()

    gboolean            visu_gl_view_setRefLength           (VisuGlView *view,
                                                             float lg,
                                                             ToolUnits units);

    This method is used to change the camera reference length for the given view. If necessary, this method will modelize and emit the 'RefLengthChanged' signal.

    view :

    a VisuGlView object ;

    lg :

    the new value.

    units :

    the unit to read lg with.

    Returns :

    TRUE if the 'OpenGLAskForReDraw' signal should be emitted.

    visu_gl_view_setThetaPhiOmega ()

    gboolean            visu_gl_view_setThetaPhiOmega       (VisuGlView *view,
                                                             float valueTheta,
                                                             float valuePhi,
                                                             float valueOmega,
                                                             int mask);

    This method is used to change the camera orientation for the given view. If necessary, this method will emit the 'ThetaPhiOmegaChanged' signal.

    view :

    a VisuGlView object ;

    valueTheta :

    a floatinf point value in degrees ;

    valuePhi :

    a floating point value in degrees ;

    valueOmega :

    a floating point value in degrees ;

    mask :

    to specified what values will be changed.

    Returns :

    1 if the 'OpenGLAskForReDraw' signal should be emitted.

    visu_gl_view_setViewport ()

    gboolean            visu_gl_view_setViewport            (VisuGlView *view,
                                                             guint width,
                                                             guint height);

    It changes the size of the OpenGl area and reccompute the OpenGL viewport. Warning : it doesn't change the size of the window.

    view :

    a VisuGlView object ;

    width :

    the new horizontal size ;

    height :

    the new vertical size.

    Returns :

    TRUE if the 'AskForReDrawChanged' signal should be emitted.

    visu_gl_view_setXsYs ()

    gboolean            visu_gl_view_setXsYs                (VisuGlView *view,
                                                             float valueX,
                                                             float valueY,
                                                             int mask);

    This method is used to change the camera position for the given view. If necessary, this method will emit the 'XsYsChanged' signal.

    view :

    a VisuGlView object ;

    valueX :

    a floatinf point value in the bounding box scale (1 is the size of the bounding box) ;

    valueY :

    a floating point value in bounding box scale ;

    mask :

    to specified what values will be changed.

    Returns :

    1 if the 'OpenGLAskForReDraw' signal should be emitted.

    visu_gl_window_getAddLength ()

    float               visu_gl_window_getAddLength         (VisuGlWindow *window,
                                                             ToolUnits *unit);

    The viewable area is defined by the VisuGlCamera size, as set by visu_gl_camera_setRefLength() and by additional space setup by visu_gl_window_setAddLength().

    window :

    a VisuGlWindow object.

    unit :

    a location for the unit of the returned value. [allow-none]

    Returns :

    the additional length to be added to the camera object size to obtain the full viewable area.

    Since 3.7


    visu_gl_window_getFileUnitPerPixel ()

    float               visu_gl_window_getFileUnitPerPixel  (VisuGlWindow *window);

    This method is used to know the ratio of a pixel with the unit of the file. WARNING : this method is valid only when the camera is position at infinity.

    window :

    a valid VisuGlWindow object.

    Returns :

    how much of a unit of file is in a pixel.

    visu_gl_window_project ()

    void                visu_gl_window_project              (VisuGlWindow *window,
                                                             const VisuGlCamera *camera);

    This method is used to set the projection and the OpenGL viewport.

    window :

    definition of the screen.

    camera :

    position of the camera.

    visu_gl_window_setAddLength ()

    gboolean            visu_gl_window_setAddLength         (VisuGlWindow *window,
                                                             float value,
                                                             ToolUnits unit);

    The viewable area is defined by the VisuGlCamera size, as set by visu_gl_camera_setRefLength() and by additional space setup by this routine.

    window :

    a VisuGlWindow object.

    value :

    a float value (positive).

    unit :

    the unit of value.

    Returns :

    TRUE if the value is indeed changed and visu_gl_window_project() should be called.

    Since 3.7


    visu_gl_window_setViewport ()

    gboolean            visu_gl_window_setViewport          (VisuGlWindow *window,
                                                             guint width,
                                                             guint height);

    It changes the size of the OpenGl area and reccompute the OpenGL viewport.

    window :

    a valid VisuGlWindow object ;

    width :

    the new horizontal size ;

    height :

    the new vertical size.

    Returns :

    TRUE the size of window is actually changed.

    Signal Details

    The "DetailLevelChanged" signal

    void                user_function                      (VisuGlView *view,
                                                            gpointer    user_data)      : No Hooks

    Gets emitted when precision of the drawn object has been changed.

    view :

    the object which received the signal ;

    user_data :

    user data set when the signal handler was connected.

    Since 3.2


    The "GrossChanged" signal

    void                user_function                      (VisuGlView *view,
                                                            gpointer    user_data)      : No Hooks

    Gets emitted when the camera zoom factor has been changed.

    view :

    the object which received the signal ;

    user_data :

    user data set when the signal handler was connected.

    Since 3.2


    The "NearFarChanged" signal

    void                user_function                      (VisuGlView *view,
                                                            gpointer    user_data)      : No Hooks

    Gets emitted when the viewing field has been changed.

    view :

    the object which received the signal ;

    user_data :

    user data set when the signal handler was connected.

    Since 3.2


    The "PerspChanged" signal

    void                user_function                      (VisuGlView *view,
                                                            gpointer    user_data)      : No Hooks

    Gets emitted when the camera perspective factor has been changed.

    view :

    the object which received the signal ;

    user_data :

    user data set when the signal handler was connected.

    Since 3.2


    The "RefLengthChanged" signal

    void                user_function                      (VisuGlView *view,
                                                            gpointer    user_data)      : No Hooks

    Gets emitted when the reference length of the camera has been changed.

    view :

    the object which received the signal ;

    user_data :

    user data set when the signal handler was connected.

    Since 3.7


    The "ThetaPhiOmegaChanged" signal

    void                user_function                      (VisuGlView *view,
                                                            gpointer    user_data)      : No Hooks

    Gets emitted when the camera angles have been changed.

    view :

    the object which received the signal ;

    user_data :

    user data set when the signal handler was connected.

    Since 3.2


    The "WidthHeightChanged" signal

    void                user_function                      (VisuGlView *view,
                                                            gpointer    user_data)      : No Hooks

    Gets emitted when the viewing frame has been changed.

    view :

    the object which received the signal ;

    user_data :

    user data set when the signal handler was connected.

    Since 3.2


    The "XsYsChanged" signal

    void                user_function                      (VisuGlView *view,
                                                            gpointer    user_data)      : No Hooks

    Gets emitted when the camera position has been changed.

    view :

    the object which received the signal ;

    user_data :

    user data set when the signal handler was connected.

    Since 3.2

    v_sim-3.7.0/Documentation/reference/html/VisuNodeArray.html0000644000353400050620000046415112216331356020732 00000000000000 VisuNodeArray

    VisuNodeArray

    VisuNodeArray — Defines the elementary structure to store informations about an element in a box.

    Synopsis

    struct              VisuNode;
    struct              VisuNodeArray;
    struct              VisuNodeArrayClass;
    void                (*VisuNodeArrayElementPropertyInit) (VisuElement *element,
                                                             GValue *value);
    struct              VisuNodeArrayIter;
    enum                VisuNodeArrayIterType;
    typedef             VisuNodeInfo;
                        VisuNodeProperty;
    void                visu_node_array_allocate            (VisuNodeArray *array,
                                                             GArray *elements,
                                                             GArray *nNodes);
    void                visu_node_array_allocateByNames     (VisuNodeArray *array,
                                                             GArray *nNodesPerElement,
                                                             GArray *elementNames);
    void                visu_node_array_allocateNodesForElement
                                                            (VisuNodeArray *array,
                                                             guint eleId,
                                                             guint nNodes);
    gboolean            visu_node_array_askForShowHide      (VisuNodeArray *array);
    gboolean            visu_node_array_compareElements     (VisuNodeArray *data1,
                                                             VisuNodeArray *data2);
    void                visu_node_array_freeNodes           (VisuNodeArray *nodeArray);
    void                visu_node_array_freeProperty        (VisuNodeArray *nodeArray,
                                                             const char *key);
    VisuNode *          visu_node_array_getCopyNode         (VisuNodeArray *nodeArray,
                                                             VisuNode *node);
    VisuElement *       visu_node_array_getElement          (VisuNodeArray *data,
                                                             VisuNode *node);
    gint                visu_node_array_getElementId        (VisuNodeArray *array,
                                                             VisuElement *element);
    GValueArray *       visu_node_array_getElementProperty  (VisuNodeArray *data,
                                                             const gchar *name);
    VisuNode *          visu_node_array_getFromId           (VisuNodeArray *array,
                                                             guint number);
    float               visu_node_array_getMaxElementSize   (VisuNodeArray *nodes);
    guint               visu_node_array_getNElements        (VisuNodeArray *array,
                                                             gboolean physical);
    guint               visu_node_array_getNNodes           (VisuNodeArray *array);
    VisuNode *          visu_node_array_getNewNode          (VisuNodeArray *nodeArray,
                                                             guint iEle);
    gint                visu_node_array_getOriginal         (VisuNodeArray *nodeArray,
                                                             guint nodeId);
    VisuNodeProperty *  visu_node_array_getProperty         (VisuNodeArray *nodeArray,
                                                             const char *key);
    #define             visu_node_array_getPropertyValue    (nodeArray,
                                                             node,
                                                             key,
                                                             value)
    void                visu_node_array_iterNew             (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter);
    void                visu_node_array_iterNext            (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter);
    void                visu_node_array_iterNextElement     (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter);
    void                visu_node_array_iterNextList        (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter);
    void                visu_node_array_iterNextNode        (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter);
    void                visu_node_array_iterNextNodeNumber  (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter);
    void                visu_node_array_iterNextNodeOriginal
                                                            (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter);
    void                visu_node_array_iterNextVisible     (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter);
    void                visu_node_array_iterRestartNode     (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter);
    void                visu_node_array_iterStart           (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter);
    void                visu_node_array_iterStartList       (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter,
                                                             GList *lst);
    void                visu_node_array_iterStartNumber     (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter);
    void                visu_node_array_iterStartVisible    (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter);
    gboolean            visu_node_array_iter_next           (VisuNodeArrayIter *iter);
    gboolean            visu_node_array_iter_next2          (VisuNodeArrayIter *iter1,
                                                             VisuNodeArrayIter *iter2);
    VisuNodeProperty *  visu_node_array_property_newInteger (VisuNodeArray *nodeArray,
                                                             const char *key);
    VisuNodeProperty *  visu_node_array_property_newPointer (VisuNodeArray *nodeArray,
                                                             const char *key,
                                                             GFunc freeFunc,
                                                             GCopyFunc newAndCopyFunc,
                                                             gpointer user_data);
    gboolean            visu_node_array_removeAllDuplicateNodes
                                                            (VisuNodeArray *nodeArray);
    void                visu_node_array_removeNodes         (VisuNodeArray *nodeArray,
                                                             int *nodeNumbers);
    void                visu_node_array_removeNodesOfElement
                                                            (VisuNodeArray *nodeArray,
                                                             VisuElement *element);
    GValueArray *       visu_node_array_setElementProperty  (VisuNodeArray *data,
                                                             const gchar *name,
                                                             VisuNodeArrayElementPropertyInit init);
    gboolean            visu_node_array_setOriginal         (VisuNodeArray *nodeArray,
                                                             guint nodeId);
    gboolean            visu_node_array_switchNumber        (VisuNodeArray *nodeArray,
                                                             guint from,
                                                             guint to);
    void                visu_node_array_traceProperty       (VisuNodeArray *array,
                                                             const gchar *id);
    void                visu_node_copy                      (VisuNode *nodeTo,
                                                             VisuNode *nodeFrom);
    gboolean            visu_node_getVisibility             (VisuNode *node);
    void                visu_node_newValues                 (VisuNode *node,
                                                             float xyz[3]);
    GValue *            visu_node_property_getValue         (VisuNodeProperty *nodeProp,
                                                             VisuNode *node,
                                                             GValue *value);
    void                visu_node_property_setValue         (VisuNodeProperty *nodeProp,
                                                             VisuNode *node,
                                                             GValue *value);
    gboolean            visu_node_setCoordinates            (VisuNode *node,
                                                             float xyz[3]);
    gboolean            visu_node_setVisibility             (VisuNode *node,
                                                             gboolean visibility);
    #define             visu_node_setpropertyValue          (nodeArray,
                                                             node,
                                                             key,
                                                             value)
    

    Object Hierarchy

      GBoxed
       +----VisuNode
    
      GObject
       +----VisuNodeArray
             +----VisuData
    

    Description

    In V_Sim, elements are drawn in a box. The VisuNode structure is used to represent an instance of an element position somewhere in the box. This element can have several characteristics such as its translation or its visibility.

    All nodes are stored in a VisuData object in a two dimensional array. The first dimension is indexed by the VisuElement of the node and the second corresponds to the number of this node for this element. When a node is own by a VisuData, the two integers, that control the indexes in this array, are not negative. See the VisuNode structure for further explanations.

    The only basic informations own by the VisuNode structure is basicaly its position. To add further informations (such as orientation for the spin), define a node property using visu_node_array_property_newPointer().

    Details

    struct VisuNode

    struct VisuNode {
      /* coordinates of the node in cartesian coordinates. */
      float xyz[3];
    
      /* translation */
      float translation[3];
    
      /* Number of this element in the input file. */
      guint number;
      /* Position in the #VisuData structure. */
      guint posElement, posNode;
    
      /* A boolean to specify if this node is rendered or not. */
      gboolean rendered;
    };
    

    Structure to store primary data of a node.

    float xyz[3];

    an array of three floating point values that positions the node in (x, y, z) ;. [in][array fixed-size=3]

    float translation[3];

    an array of three floating point values that translates the node to its drawn position from (x, y, z) ;. [in][array fixed-size=3]

    guint number;

    an integer that corresponds to its position in the entry file, it references also the node itself in the array 'fromNumberToVisuNode' of the VisuData that contains the node ;

    guint posElement;

    an integer that is the position of the VisuElement of the node in the array 'fromIntToVisuElement' of the VisuData object that contains the node ;

    guint posNode;

    an integer that is the position of the node itself in the array 'nodes' of the VisuData object that contains the node ;

    gboolean rendered;

    a boolean to store if the node is drwn or not.

    struct VisuNodeArray

    struct VisuNodeArray;

    Opaque structure to stores VisuNodeArray object.


    struct VisuNodeArrayClass

    struct VisuNodeArrayClass {
      GObjectClass parent;
    };
    

    Class structure of VisuNodeArray objects.

    GObjectClass parent;

    private.

    VisuNodeArrayElementPropertyInit ()

    void                (*VisuNodeArrayElementPropertyInit) (VisuElement *element,
                                                             GValue *value);

    Prototype of routine used to initialise an element property.

    element :

    a VisuElement object ;

    value :

    a GValue.

    Since 3.7


    struct VisuNodeArrayIter

    struct VisuNodeArrayIter {
      VisuNodeArray *array;
    
      guint idMax;
      guint nAllStoredNodes;
      guint nElements;
    
    
      guint iElement;
      guint nStoredNodes;
      VisuNode *node;
      VisuElement *element;
    
      VisuNodeArrayIterType type;
      gboolean init;
      GList *lst, *itLst;
    };
    

    This structure is an iterator over the nodes of a VisuData object. Create it with visu_node_array_iterNew(). Then the numbers are allocated and correspond to the value of the VisuData object. Use visu_node_array_iterStart() to initialise the iterator for a run over the nodes, visu_node_array_iterNext() to associate node and element to the next node, or NULL if there is no more node to run over.

    VisuNodeArray *array;

    a pointer the iterator is associated to ;

    guint idMax;

    current higher id used to identified nodes.

    guint nAllStoredNodes;

    the total number of stored nodes for the associated VisuData ;

    guint nElements;

    the number of VisuElement for the associated VisuData ;

    guint iElement;

    the index corresponding to element (or -1 if no set);

    guint nStoredNodes;

    the number of stored nodes for the current element ;

    VisuNode *node;

    a pointer on a current node ;

    VisuElement *element;

    a pointer on a current element.

    VisuNodeArrayIterType type;

    the kind of iterator, see VisuNodeArrayIterType.

    gboolean init;

    an internal flag.

    GList *lst;

    an internal list.

    GList *itLst;

    an internal list iterator.

    enum VisuNodeArrayIterType

    typedef enum {
        ITER_NODES_BY_TYPE,
        ITER_NODES_BY_NUMBER,
        ITER_NODES_VISIBLE,
        ITER_NODES_ORIGINAL,
        ITER_ELEMENTS
    } VisuNodeArrayIterType;
    

    The kind of iterator to be used on VisuData objects.

    ITER_NODES_BY_TYPE

    run on nodes, as V_Sim internal storage, fastest.

    ITER_NODES_BY_NUMBER

    run on nodes as entered in the input file.

    ITER_NODES_VISIBLE

    run on visible nodes only (internal sort).

    ITER_NODES_ORIGINAL

    run on original nodes only (internal sort).

    ITER_ELEMENTS

    run on elements only.

    Since 3.6


    VisuNodeInfo

    typedef struct VisuNodeInfo_struct VisuNodeInfo;
    

    Some data.

    Since 3.5


    VisuNodeProperty

    typedef struct _VisuNodeProperty VisuNodeProperty;

    This structure defines a storage for one property for each node of a given VisuNodeArray. Use visu_node_array_property_newPointer() or visu_node_array_property_newInteger() to create one property.


    visu_node_array_allocate ()

    void                visu_node_array_allocate            (VisuNodeArray *array,
                                                             GArray *elements,
                                                             GArray *nNodes);

    Reallocate the internal arrays to match elements and nNodes.

    array :

    a VisuNodeArray object.

    elements :

    the size of nNodes. [in][element-type VisuElement*]

    nNodes :

    an array giving the number of nodes per element. [in][element-type guint]

    visu_node_array_allocateByNames ()

    void                visu_node_array_allocateByNames     (VisuNodeArray *array,
                                                             GArray *nNodesPerElement,
                                                             GArray *elementNames);

    This method allocates the storing part of the given VisuNodeArray structure and store all the VisuNodes.

    array :

    a VisuNodeArray object;

    nNodesPerElement :

    number of VisuNode per VisuElement;. [in][element-type guint]

    elementNames :

    names of elements;. [in][element-type utf8]

    visu_node_array_allocateNodesForElement ()

    void                visu_node_array_allocateNodesForElement
                                                            (VisuNodeArray *array,
                                                             guint eleId,
                                                             guint nNodes);

    This routine is used to allocate space for nNodes of a VisuElement. This VisuElement is identified by its internal id, see visu_node_array_getElementId(). If this VisuElement has already enough space in this array, nothing is done, otherwise space is reallocated.

    array :

    a VisuNodeArray object ;

    eleId :

    an internal VisuElement id ;

    nNodes :

    a positive number of nodes.

    Since 3.7


    visu_node_array_askForShowHide ()

    gboolean            visu_node_array_askForShowHide      (VisuNodeArray *array);

    This function emits the "AskForShowHide" signal of array. This signal will make all the nodes visible and each hiding objects will have to switch off nodes.

    array :

    a VisuNodeArray object.

    Returns :

    TRUE if "VisibilityChanged" signal should be emitted.

    Since 3.7


    visu_node_array_compareElements ()

    gboolean            visu_node_array_compareElements     (VisuNodeArray *data1,
                                                             VisuNodeArray *data2);

    This method is used to compare the composition of the given two VisuData objects. The test is only done on VisuElement lists.

    data1 :

    a VisuData object ;

    data2 :

    an other VisuData object.

    Returns :

    TRUE if the two objects contains exactly the same VisuElement objects (not one more or one less or one different), FALSE otherwise.

    visu_node_array_freeNodes ()

    void                visu_node_array_freeNodes           (VisuNodeArray *nodeArray);

    Deallocate all nodes of the object and related properties but keep the object alive.

    nodeArray :

    a VisuNodeArray object.

    visu_node_array_freeProperty ()

    void                visu_node_array_freeProperty        (VisuNodeArray *nodeArray,
                                                             const char *key);

    This method free the given property and all associated data.

    nodeArray :

    a VisuNodeArray object.

    key :

    the name of the property to be removed.

    visu_node_array_getCopyNode ()

    VisuNode *          visu_node_array_getCopyNode         (VisuNodeArray *nodeArray,
                                                             VisuNode *node);

    Return the location of an unstored node that is the deep copy of the given node. The returned node is then added in the list of used nodes.

    nodeArray :

    a VisuNodeArray object ;

    node :

    a node of the given VisuNodeArray.

    Returns :

    the location of a newly used node. [transfer none]

    visu_node_array_getElement ()

    VisuElement *       visu_node_array_getElement          (VisuNodeArray *data,
                                                             VisuNode *node);

    This routine gets the VisuElement the node belongs to.

    data :

    a VisuNodeArray object ;

    node :

    a VisuNode of this array.

    Returns :

    a VisuElement, owned by V_Sim. [transfer none]

    Since 3.7


    visu_node_array_getElementId ()

    gint                visu_node_array_getElementId        (VisuNodeArray *array,
                                                             VisuElement *element);

    This routines returns the internal id used to represent element, or -1 if not found.

    array :

    a VisuNodeArray object ;

    element :

    a VisuElement object.

    Returns :

    a positive number or -1 if not found.

    Since 3.7


    visu_node_array_getElementProperty ()

    GValueArray *       visu_node_array_getElementProperty  (VisuNodeArray *data,
                                                             const gchar *name);

    This routine is used to retrieve an array of GValue for each element of the data array.

    data :

    a VisuNodeArray object ;

    name :

    an identifier string.

    Returns :

    an array of GValue, indexed by the id of each VisuElement of data. [transfer none]

    Since 3.7


    visu_node_array_getFromId ()

    VisuNode *          visu_node_array_getFromId           (VisuNodeArray *array,
                                                             guint number);

    This methods retrieves the VisuNode identified by the integer number. The number must be strictly positive. No error is raised if no node corresponds to the given number.

    array :

    a VisuNodeArray structure which stores the nodes.

    number :

    an integer.

    Returns :

    the found VisuNode or NULL if none corresponds to number. [transfer none]

    visu_node_array_getMaxElementSize ()

    float               visu_node_array_getMaxElementSize   (VisuNodeArray *nodes);

    Calculate the maximum size of all VisuElement used in these nodes.

    nodes :

    a VisuNodeArray object.

    Returns :

    a positive size.

    visu_node_array_getNElements ()

    guint               visu_node_array_getNElements        (VisuNodeArray *array,
                                                             gboolean physical);

    The parameter array stores several VisuNode of VisuElement. This routine is used to get the number of VisuElement that are used by this array. Depending on physical value, the number of VisuElement representing physical element or not is retrieved. The actual returned number of VisuElement take into account only elements with a positive number of nodes.

    array :

    a VisuNodeArray object ;

    physical :

    a boolean.

    Returns :

    a positive number.

    Since 3.7


    visu_node_array_getNNodes ()

    guint               visu_node_array_getNNodes           (VisuNodeArray *array);

    This routines returns the number of VisuNode stored in array.

    array :

    a VisuNodeArray object.

    Returns :

    a positive number.

    Since 3.7


    visu_node_array_getNewNode ()

    VisuNode *          visu_node_array_getNewNode          (VisuNodeArray *nodeArray,
                                                             guint iEle);

    Return the location of an unstored node for the given VisuElement. The returned node is then added in the list of used nodes.

    nodeArray :

    a VisuNodeArray object ;

    iEle :

    an integer between 0 and nodeArray->priv->elements->lens - 1.

    Returns :

    the location of a newly used node. [transfer none]

    visu_node_array_getOriginal ()

    gint                visu_node_array_getOriginal         (VisuNodeArray *nodeArray,
                                                             guint nodeId);

    Test if the given nodeId is an original or a replica for the periodisation.

    nodeArray :

    a VisuNodeArray object.

    nodeId :

    a node id.

    Returns :

    TRUE for an original node.

    visu_node_array_getProperty ()

    VisuNodeProperty *  visu_node_array_getProperty         (VisuNodeArray *nodeArray,
                                                             const char *key);

    This method is used to retrieve the node property associated to the given key.

    nodeArray :

    a VisuNodeArray object ;

    key :

    a string.

    Returns :

    a VisuNodeProperty. [transfer none]

    visu_node_array_getPropertyValue()

    #define             visu_node_array_getPropertyValue(nodeArray, node, key, value)

    This method is used to retrieve some data associated to the specified node, stored in the given data. These return data should not be freed after used. The read value is stored in the given GValue pointer. This GValue must be of the right type, depending on the creation of the VisuNodeProperty.

    nodeArray :

    a VisuNodeArray object ;

    node :

    a VisuNode object ;

    key :

    a string ;

    value :

    an initialise GValue location.

    Returns :

    some data associated to the key, stored the given GValue location.

    visu_node_array_iterNew ()

    void                visu_node_array_iterNew             (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter);

    Set values to a VisuNodeArrayIter object to iterate over nodes. Its contain is initialised with the array size (number of elements, number of nodes per element...).

    array :

    a VisuNodeArray object ;

    iter :

    an alocated iterator. [out caller-allocates][transfer full]

    visu_node_array_iterNext ()

    void                visu_node_array_iterNext            (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter);

    Modify node and element internal pointers to the next node, or NULL if none remains.

    array :

    a VisuNodeArray object ;

    iter :

    a VisuNodeArrayIter object.

    visu_node_array_iterNextElement ()

    void                visu_node_array_iterNextElement     (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter);

    Modify element internal pointer to the next element and set node to the first one, or NULL if none remains.

    array :

    a VisuNodeArray object ;

    iter :

    a VisuNodeArrayIter object.

    visu_node_array_iterNextList ()

    void                visu_node_array_iterNextList        (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter);

    Modify node and element internal pointers to the next node from the starting list, or NULL if none remains.

    array :

    a VisuNodeArray object ;

    iter :

    a VisuNodeArrayIter object.

    Since 3.7


    visu_node_array_iterNextNode ()

    void                visu_node_array_iterNextNode        (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter);

    Modify node internal pointer to the next node, or NULL if none remains. Contrary to visu_node_array_iterNext() it does not go to the next element if one exists.

    array :

    a VisuNodeArray object ;

    iter :

    a VisuNodeArrayIter object.

    visu_node_array_iterNextNodeNumber ()

    void                visu_node_array_iterNextNodeNumber  (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter);

    Modify node internal pointer to the next node, increasing the id of the current node. The element internal pointer is also updated accordingly. If no more nodes exist after the given one, node and element internal pointers are set to NULL.

    array :

    a VisuNodeArray object ;

    iter :

    a VisuNodeArrayIter object.

    visu_node_array_iterNextNodeOriginal ()

    void                visu_node_array_iterNextNodeOriginal
                                                            (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter);

    Modify node internal pointer to the next original node, or NULL if none remains. Contrary to visu_node_array_iterNext() it does not go to the next element if one exists.

    array :

    a VisuNodeArray object ;

    iter :

    a VisuNodeArrayIter object.

    Since 3.6


    visu_node_array_iterNextVisible ()

    void                visu_node_array_iterNextVisible     (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter);

    Go to the next rendered node (changing element if required).

    array :

    a VisuNodeArray object ;

    iter :

    a VisuNodeArrayIter object.

    visu_node_array_iterRestartNode ()

    void                visu_node_array_iterRestartNode     (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter);

    The element internal pointer must be associated. Then, it returns the node pointer to the first node for this element.

    array :

    a VisuNodeArray object ;

    iter :

    a VisuNodeArrayIter object.

    visu_node_array_iterStart ()

    void                visu_node_array_iterStart           (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter);

    Initialise the node and element internal pointers for a run over the nodes.

    array :

    a VisuNodeArray object ;

    iter :

    a VisuNodeArrayIter object.

    visu_node_array_iterStartList ()

    void                visu_node_array_iterStartList       (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter,
                                                             GList *lst);

    Set values to a VisuNodeArrayIter object to iterate over nodes of the given list.

    array :

    a VisuNodeArray object ;

    iter :

    an alocated iterator. [out caller-allocates][transfer full]

    lst :

    a list of node ids to iterate on. [element-type guint][transfer full]

    Since 3.7


    visu_node_array_iterStartNumber ()

    void                visu_node_array_iterStartNumber     (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter);

    Initialise the node and element internal pointers for a run following the node oder.

    array :

    a VisuNodeArray object ;

    iter :

    a VisuNodeArrayIter object.

    visu_node_array_iterStartVisible ()

    void                visu_node_array_iterStartVisible    (VisuNodeArray *array,
                                                             VisuNodeArrayIter *iter);

    Initialise the node and element internal pointers for a run over the visible nodes (see visu_node_array_iterNextVisible).

    array :

    a VisuNodeArray object ;

    iter :

    a VisuNodeArrayIter object.

    visu_node_array_iter_next ()

    gboolean            visu_node_array_iter_next           (VisuNodeArrayIter *iter);

    Run the iterator to go to next item.

    iter :

    a VisuNodeArrayIter object.

    Returns :

    TRUE if any item is found, FALSE otherwise.

    Since 3.6


    visu_node_array_iter_next2 ()

    gboolean            visu_node_array_iter_next2          (VisuNodeArrayIter *iter1,
                                                             VisuNodeArrayIter *iter2);

    Iterator to run on a pair of different nodes.

    iter1 :

    a VisuNodeArrayIter object.

    iter2 :

    a VisuNodeArrayIter object.

    Returns :

    TRUE if any item is found, FALSE otherwise.

    Since 3.6


    visu_node_array_property_newInteger ()

    VisuNodeProperty *  visu_node_array_property_newInteger (VisuNodeArray *nodeArray,
                                                             const char *key);

    This method creates and allocates a new area to store nodes associated integer values. This is the same than visu_node_array_property_newPointer() but for static integers instead of pointers as data.

    nodeArray :

    a VisuNodeArray object ;

    key :

    a string.

    Returns :

    the newly created VisuNodeProperty object. [transfer none]

    visu_node_array_property_newPointer ()

    VisuNodeProperty *  visu_node_array_property_newPointer (VisuNodeArray *nodeArray,
                                                             const char *key,
                                                             GFunc freeFunc,
                                                             GCopyFunc newAndCopyFunc,
                                                             gpointer user_data);

    This method creates and allocates a new area to store nodes associated data that can be retrieve with the key. These data are pointers on allocated memory locations. When the property is removed with the visu_node_freePropertry (or the associated VisuNodeArray is free) the area is free and freeFunc is called for each token (or g_free() if freeFunc is NULL).

    The method newAndCopyFunc is used when the number of nodes is increased, if the const gpointer of the GCopyFunc is not NULL, then we require a copy, if it is NULL, then the routine must create a new token with default values.

    If the property already exists, it is returned.

    nodeArray :

    a VisuNodeArray object ;

    key :

    a string ;

    freeFunc :

    a method to free each token (can be NULL). [allow-none][scope call]

    newAndCopyFunc :

    a method to create or copy each token. [scope call]

    user_data :

    a user defined pointer that will be given to the free and copy routine. [closure]

    Returns :

    the newly created VisuNodeProperty object or the existing one. [transfer none]

    visu_node_array_removeAllDuplicateNodes ()

    gboolean            visu_node_array_removeAllDuplicateNodes
                                                            (VisuNodeArray *nodeArray);

    Remove all nodes that are not original in the box.

    nodeArray :

    a VisuNodeArray object.

    Returns :

    TRUE if some nodes have been removed.

    visu_node_array_removeNodes ()

    void                visu_node_array_removeNodes         (VisuNodeArray *nodeArray,
                                                             int *nodeNumbers);

    Remove the given VisuNode from the nodeArray. The properties are also updated.

    nodeArray :

    a VisuNodeArray object.

    nodeNumbers :

    an array of integers (negative terminated). [in][array]

    visu_node_array_removeNodesOfElement ()

    void                visu_node_array_removeNodesOfElement
                                                            (VisuNodeArray *nodeArray,
                                                             VisuElement *element);

    Remove all the VisuNode from the element element. The properties are also updated.

    nodeArray :

    a VisuNodeArray object.

    element :

    a VisuElement object.

    Since 3.7


    visu_node_array_setElementProperty ()

    GValueArray *       visu_node_array_setElementProperty  (VisuNodeArray *data,
                                                             const gchar *name,
                                                             VisuNodeArrayElementPropertyInit init);

    Create a new array to stores properties related to elements. If the property name already exists the previous one is destroyed. The init routine is called for each VisuElement of the data.

    data :

    a VisuNodeArray object.

    name :

    a string to identify the property.

    init :

    an init routine. [scope call]

    Returns :

    a newly allocated array. [transfer none]

    Since 3.7


    visu_node_array_setOriginal ()

    gboolean            visu_node_array_setOriginal         (VisuNodeArray *nodeArray,
                                                             guint nodeId);

    Test if the given nodeId is an original or a replica for the periodisation.

    nodeArray :

    a VisuNodeArray object.

    nodeId :

    a node id.

    Returns :

    TRUE for an original node.

    visu_node_array_switchNumber ()

    gboolean            visu_node_array_switchNumber        (VisuNodeArray *nodeArray,
                                                             guint from,
                                                             guint to);

    Two nodes of nodeArray switches their number.

    nodeArray :

    a VisuNodeArray object.

    from :

    a node id.

    to :

    another node id.

    Returns :

    TRUE if number is switched.

    Since 3.6


    visu_node_array_traceProperty ()

    void                visu_node_array_traceProperty       (VisuNodeArray *array,
                                                             const gchar *id);

    This is a debug method. It outputs on stderr the values for all nodes of the property id.

    array :

    a VisuNodeArray object ;

    id :

    a property name.

    visu_node_copy ()

    void                visu_node_copy                      (VisuNode *nodeTo,
                                                             VisuNode *nodeFrom);

    Copy all attributes of the object nodeFrom to nodeTo.

    nodeTo :

    an allocated VisuNode object ;

    nodeFrom :

    an allocated VisuNode object.

    visu_node_getVisibility ()

    gboolean            visu_node_getVisibility             (VisuNode *node);

    This method is used get the status of the drawing state of a node.

    node :

    a VisuNode object.

    Returns :

    true if the node is rendered, false otherwise.

    visu_node_newValues ()

    void                visu_node_newValues                 (VisuNode *node,
                                                             float xyz[3]);

    Set the coordinates and set all other values to default.

    node :

    an allocated VisuNode object ;

    xyz :

    the coordinates to set. [in][array fixed-size=3]

    visu_node_property_getValue ()

    GValue *            visu_node_property_getValue         (VisuNodeProperty *nodeProp,
                                                             VisuNode *node,
                                                             GValue *value);

    This method is used to retrieve some data associated to the specified node, stored in the given data. These return data should not be freed after used. The read value is stored in the given GValue pointer. This GValue must be of the right type, depending on the creation of the VisuNodeProperty.

    nodeProp :

    a VisuNodeArray object ;

    node :

    a VisuNode object ;

    value :

    an initialise GValue location.

    Returns :

    some data associated to the key, stored the given GValue location.

    visu_node_property_setValue ()

    void                visu_node_property_setValue         (VisuNodeProperty *nodeProp,
                                                             VisuNode *node,
                                                             GValue *value);

    This method is used to store some values associated with the given node of the given nodeArray. These values can be pointers to anything allocated (will be free automatically when the property is deleted) or they can be static values. This depends on the construction of the node property. These values can be retrieved with the visu_node_property_getValue() method.

    See visu_node_array_getProperty() to get a property by its name.

    nodeProp :

    a VisuNodeProperty object ;

    node :

    a VisuNode object ;

    value :

    A GValue pointer this the value to be stored.

    visu_node_setCoordinates ()

    gboolean            visu_node_setCoordinates            (VisuNode *node,
                                                             float xyz[3]);

    This method is used to change coordinates of node.

    node :

    a VisuNode object ;

    xyz :

    new cartesian coordinates. [array fixed-size=3]

    Returns :

    TRUE if the calling method should emit "PositionChanged" signal.

    Since 3.7


    visu_node_setVisibility ()

    gboolean            visu_node_setVisibility             (VisuNode *node,
                                                             gboolean visibility);

    This method is used to turn on or off the drawing of the specified node.

    node :

    a VisuNode object ;

    visibility :

    a boolean.

    Returns :

    true if the calling method should emit the VisuNodeArray::VisibilityChanged signal.

    visu_node_setpropertyValue()

    #define             visu_node_setpropertyValue(nodeArray, node, key, value)

    This method is used to store some values associated with the given node of the given nodeArray. These values can be pointers to anything allocated (will be free automatically when the property is deleted) or they can be static values. This depends on the construction of the node property. These values are described by the key, and can be retrieved with the visu_node_array_getPropertyValue() method.

    See visu_node_property_setValue() to directly set a value associated to a node.

    nodeArray :

    a VisuNodeArray object ;

    node :

    a VisuNode object ;

    key :

    a string ;

    value :

    A GValue pointer this the value to be stored.

    Signal Details

    The "AskForShowHide" signal

    void                user_function                      (VisuNodeArray *nodes,
                                                            gpointer       redraw,
                                                            gpointer       user_data)      : No Hooks

    Gets emitted when external modules should recompute their masking effect on nodes. Location pointed by redraw must be set to TRUE if the visibility of at least one node is changed.

    nodes :

    the object which received the signal ;

    redraw :

    a location on a boolean. [out caller-allocates][type gboolean]

    user_data :

    user data set when the signal handler was connected.

    Since 3.2


    The "ElementRenderingChanged" signal

    void                user_function                      (VisuNodeArray *nodes,
                                                            GObject       *ele,
                                                            gpointer       user_data)      : No Hooks

    Gets emitted when the rendering characteristic of elements are changed, like their shape or specific colour.

    nodes :

    the object which received the signal ;

    ele :

    the VisuElement nodes have changed or NULL for all elements. [allow-none]

    user_data :

    user data set when the signal handler was connected.

    Since 3.7


    The "MaterialChanged" signal

    void                user_function                      (VisuNodeArray *nodes,
                                                            gpointer       user_data)      : No Hooks

    Gets emitted when one or more nodes have changed of color or material.

    nodes :

    the object which received the signal ;

    user_data :

    user data set when the signal handler was connected.

    Since 3.6


    The "PopulationDecrease" signal

    void                user_function                      (VisuNodeArray *nodes,
                                                            gpointer       ids,
                                                            gpointer       user_data)      : No Hooks

    Gets emitted when the number of nodes has changed, decreasing. ids contains all removed ids and is -1 terminated. When emitted, nodes have already been removed, so no external routines should keep pointers on these nodes.

    nodes :

    the object which received the signal ;

    ids :

    an array of VisuNode ids. [element-type gint][array]

    user_data :

    user data set when the signal handler was connected.

    Since 3.4


    The "PopulationDefined" signal

    void                user_function                      (VisuNodeArray *nodes,
                                                            guint          nEle,
                                                            gpointer       user_data)      : No Hooks

    Gets emitted when the population of nodes is created or destroyed. It is possible then to associate new VisuNodeProperty for instance.

    nodes :

    the object which received the signal ;

    nEle :

    the actual allocated number of VisuElement of nodes.

    user_data :

    user data set when the signal handler was connected.

    Since 3.5


    The "PopulationIncrease" signal

    void                user_function                      (VisuNodeArray *nodes,
                                                            gpointer       ids,
                                                            gpointer       user_data)      : No Hooks

    Gets emitted when the number of nodes has changed, increasing. ids contains all new ids and is -1 terminated.

    nodes :

    the object which received the signal ;

    ids :

    an array of VisuNode ids. [element-type gint][array]

    user_data :

    user data set when the signal handler was connected.

    Since 3.4


    The "PositionChanged" signal

    void                user_function                      (VisuNodeArray *nodes,
                                                            GObject       *ele,
                                                            gpointer       user_data)      : No Hooks

    Gets emitted when one or more nodes have moved, because of translations or because the user has moved them manually.

    nodes :

    the object which received the signal ;

    ele :

    the VisuElement nodes have moved or NULL for all elements. [allow-none]

    user_data :

    user data set when the signal handler was connected.

    Since 3.2


    The "RenderingChanged" signal

    void                user_function                      (VisuNodeArray *nodes,
                                                            GObject       *ele,
                                                            gpointer       user_data)      : No Hooks

    Gets emitted when the rendering characteristic of nodes are changed, like their shape or specific colour. For a signal on generic colours (like the inherited element colour), listen to VisuNodeArray::MaterialChanged signal instead.

    nodes :

    the object which received the signal ;

    ele :

    the VisuElement nodes have changed or NULL for all elements. [allow-none]

    user_data :

    user data set when the signal handler was connected.

    Since 3.7


    The "VisibilityChanged" signal

    void                user_function                      (VisuNodeArray *nodes,
                                                            gpointer       user_data)      : No Hooks

    Gets emitted when one or more nodes have changed of visibility. Some may have appeared, some may have disappeared.

    nodes :

    the object which received the signal ;

    user_data :

    user data set when the signal handler was connected.

    Since 3.2

    v_sim-3.7.0/Documentation/reference/html/v-sim-objectList.html0000644000353400050620000007204212216331357021325 00000000000000 objectList

    objectList

    objectList — Gives storage for ids used by OpenGL lists and provides primitive routine for common drawing operations (distances, torus...).

    Synopsis

    enum                VisuGlArrowCentering;
    void                visu_gl_drawAngle                   (float xyzRef[3],
                                                             float xyzRef2[3],
                                                             float xyz[3],
                                                             guint id,
                                                             gboolean drawLength);
    void                visu_gl_drawDistance                (float xyzRef[3],
                                                             float xyz[3],
                                                             gboolean drawLength);
    void                visu_gl_drawEdgeArrow               (int material_id,
                                                             VisuGlArrowCentering centering,
                                                             float tailLength,
                                                             float tailRadius,
                                                             gboolean tailUseMat,
                                                             float hatLength,
                                                             float hatRadius,
                                                             gboolean hatUseMat);
    void                visu_gl_drawEllipsoid               (GLUquadricObj *obj,
                                                             int material_id,
                                                             float aAxis,
                                                             float bAxis,
                                                             float n,
                                                             gboolean useMat);
    void                visu_gl_drawSmoothArrow             (GLUquadricObj *obj,
                                                             int material_id,
                                                             VisuGlArrowCentering centering,
                                                             float tailLength,
                                                             float tailRadius,
                                                             float tailN,
                                                             gboolean tailUseMat,
                                                             float hatLength,
                                                             float hatRadius,
                                                             float hatN,
                                                             gboolean hatUseMat);
    void                visu_gl_drawTorus                   (GLUquadricObj *obj,
                                                             int material_id,
                                                             float radius,
                                                             float ratio,
                                                             int nA,
                                                             int nB,
                                                             gboolean useMat);
    void                visu_gl_objectlist_init             (void);
    int                 visu_gl_objectlist_new              (int size);
    

    Description

    When using OpenGL list, one must specify ids. This module can return unused ids when needed.

    Here are also defined the common primitive for drawing, see visu_gl_drawDistance() for instance.

    Details

    enum VisuGlArrowCentering

    typedef enum {
        VISU_GL_ARROW_ORIGIN_CENTERED,
        VISU_GL_ARROW_BOTTOM_CENTERED,
        VISU_GL_ARROW_TAIL_CENTERED,
        VISU_GL_ARROW_CENTERED
    } VisuGlArrowCentering;
    

    The way to draw arrows (see visu_gl_drawSmoothArrow() for instance).

    VISU_GL_ARROW_ORIGIN_CENTERED

    the arrows are positioned with respect to the point between tail and hat.

    VISU_GL_ARROW_BOTTOM_CENTERED

    the arrows are positioned with respect to the bottom of the arrow ;

    VISU_GL_ARROW_TAIL_CENTERED

    the arrows are positioned with respect to the center of the tail part ;

    VISU_GL_ARROW_CENTERED

    the arrows are centered.

    visu_gl_drawAngle ()

    void                visu_gl_drawAngle                   (float xyzRef[3],
                                                             float xyzRef2[3],
                                                             float xyz[3],
                                                             guint id,
                                                             gboolean drawLength);

    Draw an angle mark by to distance marks and a disk taking xyzRef as central point and xyzRef2 and xyz as the two positions. id is a counter to obtain different colours for the disk and drawLength is a flag to display or not the angle value in degrees.

    xyzRef :

    cartesian coordinates of first ref.

    xyzRef2 :

    cartesian coordinates of second ref.

    xyz :

    cartesian coordinates of current point.

    id :

    a counter.

    drawLength :

    a boolean.

    Since 3.6


    visu_gl_drawDistance ()

    void                visu_gl_drawDistance                (float xyzRef[3],
                                                             float xyz[3],
                                                             gboolean drawLength);

    Draw a distance mark between xyzRef and xyz. A distance mark is a colour inverted line and two squared marks on node. drawLength is a flag to display or not the distance value.

    xyzRef :

    cartesian coordinates of first ref.

    xyz :

    cartesian coordinates of current point.

    drawLength :

    a boolean.

    Since 3.6


    visu_gl_drawEdgeArrow ()

    void                visu_gl_drawEdgeArrow               (int material_id,
                                                             VisuGlArrowCentering centering,
                                                             float tailLength,
                                                             float tailRadius,
                                                             gboolean tailUseMat,
                                                             float hatLength,
                                                             float hatRadius,
                                                             gboolean hatUseMat);

    Draw arrows, using sqaure edges. For rounded arrows, see visu_gl_drawSmoothArrow().

    material_id :

    an OpenGL list id for material change.

    centering :

    a flag.

    tailLength :

    length of tail part.

    tailRadius :

    length of edge of tail part.

    tailUseMat :

    use the material colour for the tail part.

    hatLength :

    length of hat part.

    hatRadius :

    length of edge of hat part.

    hatUseMat :

    use the material colour for the hat part.

    Since 3.6


    visu_gl_drawEllipsoid ()

    void                visu_gl_drawEllipsoid               (GLUquadricObj *obj,
                                                             int material_id,
                                                             float aAxis,
                                                             float bAxis,
                                                             float n,
                                                             gboolean useMat);

    Draw an ellipsoid.

    obj :

    . [type gpointer]

    material_id :

    an OpenGL list id for material change.

    aAxis :

    length of long axis.

    bAxis :

    length of short axis.

    n :

    number of edges for the sphere approximation.

    useMat :

    a flag to use the material definition or not.

    Since 3.6


    visu_gl_drawSmoothArrow ()

    void                visu_gl_drawSmoothArrow             (GLUquadricObj *obj,
                                                             int material_id,
                                                             VisuGlArrowCentering centering,
                                                             float tailLength,
                                                             float tailRadius,
                                                             float tailN,
                                                             gboolean tailUseMat,
                                                             float hatLength,
                                                             float hatRadius,
                                                             float hatN,
                                                             gboolean hatUseMat);

    Draw arrows, using sqaure edges. For rounded arrows, see visu_gl_drawEdgeArrow().

    obj :

    . [type gpointer]

    material_id :

    an OpenGL list id for material change.

    centering :

    a flag.

    tailLength :

    length of tail part.

    tailRadius :

    length of edge of tail part.

    tailN :

    number of edges in the approximation.

    tailUseMat :

    use the material colour for the tail part.

    hatLength :

    length of hat part.

    hatRadius :

    length of edge of hat part.

    hatN :

    number of edges in the approximation.

    hatUseMat :

    use the material colour for the hat part.

    Since 3.6


    visu_gl_drawTorus ()

    void                visu_gl_drawTorus                   (GLUquadricObj *obj,
                                                             int material_id,
                                                             float radius,
                                                             float ratio,
                                                             int nA,
                                                             int nB,
                                                             gboolean useMat);

    Draw a torus.

    obj :

    . [type gpointer]

    material_id :

    an OpenGL list id for material change.

    radius :

    global radius.

    ratio :

    ratio on internal radius over global radius.

    nA :

    number of edges for the global radius.

    nB :

    number of edges for the internal radius.

    useMat :

    a flag to use the material definition or not.

    Since 3.5


    visu_gl_objectlist_init ()

    void                visu_gl_objectlist_init             (void);

    Used to initialise this part of code, don't use it.


    visu_gl_objectlist_new ()

    int                 visu_gl_objectlist_new              (int size);

    It returns the id that can be used to link glObjectList. This number is also added to the list of glObjectList to be displayed. The size parameter is the number of lists that could be used by the user for this glObjectList. Then the next call to this function will return the last value plus the size plus one.

    size :

    the requested size.

    Returns :

    an identifier used by OpenGl as a list.
    v_sim-3.7.0/Documentation/reference/html/v-sim-opengl.html0000644000353400050620000005737212216331357020520 00000000000000 opengl

    opengl

    opengl — This part is responsible for the pseudo3D rendering through OpenGl and gives methods to adapt the view.

    Description

    There is a last parameter which controls when render is done. There are two states : whenever a changing occurs (in fact when the OpenGLAskForReDraw signal is received) or only the OpenGLForceReDraw is received.

    Except when high performances are required, this module never makes a redraw by itself, even when parameters such as the camera position are changed. The redraw must be asked by the client by emitting the OpenGLAskForReDraw signal or the OpenGLForceReDraw signal. This is to avoid situations when the client makes different changes but want just only one redraw at the end. All set methods return a boolean which informs the client of the opportunity to redraw after the set occurs. For example, if the client call a set change on theta or phi but the server returns FALSE, it means that not emission of OpenGLAskForReDraw is needed (for example because theta or phi had already these values).

    Details

    visu_gl_getAntialias ()

    gboolean            visu_gl_getAntialias                ();

    Get the value of the antialiasing parameter.

    Returns :

    wether or not the antialising for lines is activated.

    visu_gl_getImmediate ()

    gboolean            visu_gl_getImmediate                ();

    Get the value of the immediateDrawing option.

    Returns :

    the value of the immediateDrawing option.

    visu_gl_getLights ()

    VisuGlLights *      visu_gl_getLights                   ();

    V_Sim proposes a wrapper around the OpenGL light definitions.

    Returns :

    the set of current lights.

    visu_gl_getStereo ()

    gboolean            visu_gl_getStereo                   ();

    Retrieve the status of the OpenGL surface.

    Returns :

    TRUE if the surface try to draw in stereo (may be TRUE, even if visu_gl_getStereoCapability() returns FALSE, in that case the stereo capability is not used).

    visu_gl_getStereoAngle ()

    float               visu_gl_getStereoAngle              ();

    Retrieve the angle of the eyes in the stereo output.

    Returns :

    the angle.

    visu_gl_getStereoCapability ()

    gboolean            visu_gl_getStereoCapability         ();

    Retrieve if the OpenGL window can render in stereo or not.

    Returns :

    TRUE if the OpenGL surface can draw in stereo.

    visu_gl_getTrueTransparency ()

    gboolean            visu_gl_getTrueTransparency         ();

    The drawing can be done in one pass or two to respect transparency.

    Returns :

    TRUE if the drawing is done twice.

    visu_gl_init ()

    void                visu_gl_init                        ();

    This initialises the drawing window and all the variables used by this module. It must be called once by the main program and should not be used otherwise.


    visu_gl_initContext ()

    void                visu_gl_initContext                 ();

    This method is called when an OpenGL surface is created for the first time. It sets basic OpenGL options and calls other OpenGLFunctions used in V_Sim.


    visu_gl_initGraphics ()

    void                visu_gl_initGraphics                ();

    Internal use only. Call at startup to call OpenGL initialisation routines.

    Since 3.6


    visu_gl_redraw ()

    void                visu_gl_redraw                      (VisuGlView *view,
                                                             GList *lists);

    Basic drawing method : it clears the OpenGL area and call all lists if lists is NULL, or draw only the given lists.

    view :

    a VisuGlView object with the camera settings. [transfer none]

    lists :

    a VisuGlExt array or NULL. [element-type v_sim.GlExt][transfer none][allow-none]

    visu_gl_setAntialias ()

    gboolean            visu_gl_setAntialias                (gboolean value);

    To set the antialiasing on lines.

    value :

    a boolean to activate or not the lines antialias.

    Returns :

    TRUE if the signal OpenGLAskForReDraw should be emitted.

    visu_gl_setColor ()

    void                visu_gl_setColor                    (float *material,
                                                             float *rgba);

    This method call glMaterial to create the right shiningness, emission, diffuse...

    material :

    a 5 elements array with the material properties ;

    rgba :

    a 4 elements array with the color values.

    visu_gl_setHighlightColor ()

    void                visu_gl_setHighlightColor           (float material[5],
                                                             float rgb[3],
                                                             float alpha);

    This method try to set a colour that will contrast with rgb.

    material :

    a 5 elements array with the material properties ;

    rgb :

    a 3 elements array with the color values.

    alpha :

    the alpha channel.

    visu_gl_setImmediate ()

    gboolean            visu_gl_setImmediate                (gboolean bool);

    If true all changes are applied only when the refresh button is pushed.

    bool :

    a boolean to set or not the immediateDrawing option.

    Returns :

    TRUE if the value is changed.

    visu_gl_setStereo ()

    gboolean            visu_gl_setStereo                   (gboolean status);

    Change the type of rendering. The surface can be switch to stereo, only if the OpenGL has stereo capabilities (see visu_gl_getStereoCapability()).

    status :

    a boolean.

    visu_gl_setStereoAngle ()

    gboolean            visu_gl_setStereoAngle              (float angle);

    Change the angle of the eyes in the stereo output.

    angle :

    a positive floating point value.

    Returns :

    TRUE if redraw should be done.

    visu_gl_setTrueTransparency ()

    gboolean            visu_gl_setTrueTransparency         (gboolean status);

    If true the rendering is done twice to respect the transparency.

    status :

    a boolean.

    Returns :

    TRUE if redraw should be done.

    X!7X>6 *>ҳ->Fo(8>y>vYSH>s>vۜ|>bK>G!~>$>T:Y>+>ۭl>">>w>Z[>z>vB6>szǙ>1 խ9>x}i>p5>4p?(JI۪?\6=?#I!db?0qPOR?;,!cnD?F#ew?R?^q9?g"?q#xY?xU??C &?=-Z??E?#ZV?>'^X?ZM?Gm?6fZ?Zm?ߘ7?j {?ˢdJ?>J?,9?v?/~TϘ?j< ?,??1$C?,0?B3 ;W?" x?z?BV??W??8HN?3 C?7F ?t?Q>!TQZQ@> X>֮UQ>1`>ϿEP`>5uY>%>7S>>@cX>pZ>`QhQ>g)sh>T> y?>IW'>2^q>Ё>egF6>(僅>Kn6t>WOd>Ц!:C>B?&>f>ڎ?]˱GE?y2"?!he,?-il?8C3<?Cc+l?Pi cw?Z 2=^?cmy?b}?N+t?|^݆?w&?Eu?՛9(?z?|"%7?w>D2?vãT?xCIt?~Z ?o$~+X?:Ty?$F=?W3?}H?45h?4 ?so^S[?d:?V%?FnP?6|q0?'qz#?JKP?%[>j>0 ->l%){(>kt>|>BVF>R<Ǿ>ƣ|> $>8H> #ɢ>@$&>r&RY>Vesd>Jr>)M<>QD>tV3>4>>_0>1!>r0->H~%>Tu$j>lN? @&?SA?#H/?)qW"?4¿?@SH ?K 8?U-F8 ?_t H?f` s?o+?uA͓?|MSW?h2)?Ǭ?Gg?Sv\?Mf7?TW?¹?-Er?ESy???t?'C?'."{?،f(?WU?p{?3r?aL[?ȶ"2?|n:G?}^:Z?zba?{9I\E?\"Ik?V2 ?G9}?Zg?Ʌ`9"?y?W)?~CB?"?5?=P)?Bs$?ˈ#?uX/6?ҡ\A?nX?Zw?D?|רo?u _?rVz?rRwX?uAl9?|-?Uӕ]?f3?<$?s??3@oG?X?âd?I8a?2`_,?S?0:%??ݒ?踠O?zu+?l67?]4 *?MR ?=r8H?.J`p ?&ա? ךV>C>ވtg9>/>4;x>˿ɚf@>E>,Q>>]yJ>0YP0>d7n>YSm>-ܦ>þGPK>#N>*b q>MX*0>i#R>b>{>\E>Y6FN>_k.>r >q>g&? 5??\kr?% O`?12;&Gl>(>{\Ac>~$>Zz\>er>ڲ>pv>}1bDs>?q>W)N>s >Ďp>zG> 5Rʹ>W)@{>ag$>wøk>#ؕ,>|*h>gh{>qR>v>f >PR>ʚc>L\?oB?>x? >C?+ Ω ?60SC?APC~?J%?ScK?]cd?eEJ?ms[?sE`?y-. ?1 0?$(?cU?*n/?4ť?Z&,P?n?Itt?r+?X#p?""? A??b[?-.?[?BpK[?߫A%?(鲟??{rZ?tN@?qt ?r?wl7?^9?Kh?O?qä!6?qYp?tFL?zoR۹?UVm?x"?i9[_?u^{b_?#;?ĺ6b?Ȧ?-;>z?dϲF?i6e.? T?x[<?[?RڡL?/^ꬶ?t.?e&V?TA?D?5&f?&;V?!w$?]`>0%6R>uQx>Wb->]0 >ǧ18 >9(>|i>@r>QCr}9 >~'oy>1>R`[>_Z>ӭf>r֮gp>Nn>C/>#ǩ=F{>44]͐>$6j>ݍ >At`>šAt>\ː>ꔪ[]>YvH ? g? q\OX?=M?%F?1>1?<,?EJ0?P¾#?Ye.?cd!~?lH ׃?ta}X#?{[oJ? p?zl-??XL?K?tE:?&?n}?I1?!k?jN?9޹{?}P2?w{X2?vԎN?w=1?{$ u!?l<?,j?u?|"69?Œ%?V.sN?IF}m @?0%*U?N ?=8?>[a~?5 ?vq"? ?k?[L z?vj?gA?VٚGWm?F״Hx?8MEXI?*`rP?]ֲKl? ;ly{>>ܞX>1Fc>( 5">|2>~BL>^R><>Y]{>VRC >Z->aM>pGڍ>T>P*`>!&>R'( >aHu>oο\E>v!>w>I]>,<>װ§>xKX>B77>>[(?G< %?f? ̟t?,S"JU`?7;?B ś0?Ma<ۨ?X 4?c{")?n?wo?]¦?,O?GfXZ?ʐl?)cY?;j'?ИΑ? ^?7??HT?Ob?1rg?}?kV"9?|DYZ?U.Ex?XV5?Ƶ7_N??|@! ?wt?wH/w=?z42?^%?mҳ>?V??IXj?讹L?"c? ?wz>f?J*?O[Bf?~2ZR?Afq? ?=ܢP??8Z?z,?En?} a?|V;?}/]m?1l?o=oX?4j[B?!?YO?? "??۩p/?e!?qmt?zA:??@`?$?0,4 ?|b8?}*ɳ?;zi)?u%b?gh%EB?Wp:z?Hj$?:p•?-Mz?+j ?\w?xUT>#;>Ɯk>ޚ(r*>i貆>%$q>1> s>n;>:ю>W<\>2~>JQam>ء~>Cg>*K6>}rEa>rtJ9?>+>I[>EO>>.Lv>;_>&>ߍϭ>ec>?^[Dx?04?JE=?'?Y?3'̢?@z?K6.\t?Wv=ׄ?d;H ?qp?|G"E?F?Zr~/?彆ȧ?4??Kx(ɛ??Pφ?$?4? AMwF*?_?\Hw?l-r?^}?3r?9iM?Zd?_Tk?nq6?< ?܍{0?|^u/?|'@W?G\:kf?פy?9%c?O7/?oꊳ?[?ael?H??߻W~E?C׫r-P?Bi?D^K?Kʿx?(?מt?3?e<~f?<]PY ?}9?rR<?dme?VP(?Hu F?6,>b>g>.Sz\(>.pm>OoQ>H>BH > Y>+L>4 >1v0l>R>1u>4 >+Myr> F>BJ>I>Oڜ>.pm><:>.SzB>NK>b׾N>6?-N?P) ?!@l?0c*?r?o77o?NX?qF6?bH?ƪ%hUWF>񼝇>ޚ7r>ќ`> y>m>͟I>qު>Qt?>X>H2^>1>i"o>_&D>=/>=>k5Yʊ>7cp>]l>Xn*>W|t>@0+(>ЦHT׺>>lRv>X:?Ím'C?_ͼD?F?-;'?92Z8?GSpe?V?f)0*?tNѧl??d6?$~Zd?PH?#$TI?}#?e*??NGXH?Sfi?:̔8z?=?KPz'?Fշ?+t?mի'?Qx?pKdPY?{Lo4?y:µ?zS=?+ Q?;z_?T?J&!?cc?gU:?а?f4 0$?,X;?]1?@?)?ᴒ?-5?TR~?][!?u`CH9?u]?yE0C?8?pxܻ?C1F?@L??|#?_z?i-x?x2H?}b?L?tώ?<2]?LЯ?tIB5?eJ&?^N?Gsk??.j?A ?~]`Өx?u/A2~?kf?a[Z?UcXx:f?J(?AnA?65. :?* ak?nS?b0?.YE>ln.>I;%>Mz>Nf" >b{f>¦M>0Rq>O.+7>[)1>->>Aub!&>|> 8E>_]B˗>>$kǴ>Z:y>s'FJ>53`>KH>-Va~>mv^:>hԽΛ>s"X>fע>3&8? 4}],??)z?7m[?F9#?U.`t[?N>H? ?b,~?gaZ?h\~+M?[Rm?G`?c9R?A{Uk?eP?)?}p#?yo ?q?"x@?xAH?rí?q(>?sNn?x$Kh?OU?HĖ?,/?1ա?̎z?J} 6>^Fj>݅>йϜ> ;>x ">@r36F>ny/>`TP>H'7>5+$+>@>zb&,>,2#F>e5>N>eO>zð>M'zW>chQ >pB:>nnÌ>*^}ѽ`>+B>쏌!>]u (`?bf?l?&N?5zplC?DG ?TJa?dxE?t?g ^?Eo?&)?ށ>??CJe?;_?`?CR+?s%I??ӷ?Z??lǽQ??z?s]6g?pc ?p9|Y?s-L?z?{jf?c ??ˈ?qKeH?d|s?m?7!?UǕ??,4?H]ݓ?-?@R?b6?5I^??w?Y ??q&F?pF7?r鳚?yoZ?xb>2?*?'<^>?~?e6B_r?2i~?mN?#&ld?eud?ۑ?R?f,J%?F̓T?J/@??jJu?)3?C?|)Y?vL?qdY\?iTx{?am^?Y>L?Q"?GVV??>?4զSp?* ,&Zx>=>nF[>ԗb> >Q>1>)QD, >&n*0> > T!3>IlEs>rvK8n>1ROBY>E燝>>儱>O>>{f>U{j>J^>ŗ0>{8>ͅW}80>ڿH 0>^&<>P? K%?S[8?#HG?2^?AP?Q> ?aLcA?qriP|? ̪?z7,?!6?GiO?<[weA?(17?׊?K ?Rk|?y?GT ?Ki)?tk?Xۑ?X'$?xbmm?q۾#?m>e r?mR?rI)83?zv-sa?@ ?~8bO?*/p(?_1H?IT?4?[?y'w?W>%?x&(?T؜ ?7p?ӬY ?$UB?>?% ?|Z|[?u( %:?r۶O?tGJ?ygSq??? Y?!+7j?xQ?:j?d]d?6=u*?:K?<e.>~[UT> >]RD>9>2>_he>z0(>t>윗@>ȓ>t6d>>[VG>umt]\>8Beo>d[>?9>B9PD> >2> T0>Ӎ4>̲> [Ġ>!$=@>_.£>}8>z? %&?_Q0?._^{#P?=Ml?M= ?lB?zwIX?b J?haB?I ?c ?)]0?-~?,ks?G#j?>EZ/?3`@?(6G?,4A??G[>_ > 9ͦ=^>~r>̮c>>q[{C>^j>xp>TIX>uBq.>N5+>5G4>se1X>e>rk>{TF>o>zv)0d>y_,Q>G<>A>>ӀJk>X4lW> p0>W;0?~?BL?'es?6/?F0r?Ve ?e3WHr?sP!IK?ؾ?Lie?%%? ?=wd?8ގ?{ yu?/? !2=?*bj_~? 41?@?,0r?10x~?R]?}'>>?w~8$?tvRލ?tH[(?y*Ԏ?ب?M >?xq{?ll?_=`>?o!;T?B2c?r? T=?ߓ(?#x{?ff/?,p( ?[$?h:?a{8Y[?Vi;b?L}?Aұ>>?6z%kJ?,/ۍYu?? ̈f?é{ ?1B@> gj>쥎ԓ>j>ϋ'F>[q>o%> i>s;f5X>* >vR>R|{>x">\ >فt>$>Ί )>CE>גj>vKe >'bU >LxR>GP`>ы>p&X> `>~?.?z`?!Jw?0\l?@r-?P-?^4F,?kL!l ?xP?RHaҜj?R4r"?R7,?qN]?F?>?G?Xt?.x7)?N4d?|ѼJ?uQ~?% P?ņߚ?^W]?΍?{ _?w[?xYoS+?|3G?n?|LA?L8a?F?E?7~Y?-O?, M?zOb?A9?f?{?l['??b=?'>+?)t#,?'N?`)D? /?|}XK?~Ch?؟W?+ ?zh?ZZ?X,?0?i~Zd?XYz?YjQL?Th?-_q?!_?r%ae?P$Sȋ?ʺݧ?MJ?Ö?#?{h?/gM?uԀ5X?na?dRQj ?ZX<f?P>ǭ?D6 @K?9+S?/88LN?"UQy?|?Cf >Jĥ>[|->q;>jM>Ms&8> F*>&U>Q=R>4$@Y>n"4m>Kg_W>4CZ)> 1G>? XlF>ʯ)d>d3JW>T>#iNt>IZ>>1>Ɓ>>@>>s'>TD?N`?38?("?(Q=?6Eo?EߩH?T:l?b6Rٟ?o}`\7?{o~*v?‘+~?yt?u*?Wø? ␢?^7 :?ik?gF2K?=Z"?|הD?xD9T=J?xP=Q?{6x>?3VS?l>&?֩2?9 K|?Ug? b? N?M׷(, >Aڛt>> >뗱ς>9 2>2>NJ4n>ߧ>eNm>!P}{>;M_>>+>ݪB3>{> H_>"(>35>5? >Øh>rz# > +Ō>yr>9Cx>}|nv?~x? 5Ia@?X>?#Pm?l*C6?IW?7?@7f?:[<*?lV)?{;c5?uT ?sM z ?uNa?{A?<$fJ?`|??)? d? ?cXB}?8<"?ZLh ?CIY?,$?y]l?˅?nJ?d9?j6?1`?:*rKM?zk>?qջ?g]D?]o3k?R+5?EsҐ?:Id ?0M;%;?# t>Y? f?B1"z>p%#>8uټ>uM>(,>D!Z:>zVS>POj͸>0UN >+2@>#C{(>QE> h>)&1o>&1e>i~U>&>֠>Xr> i8>PH>e؝K>ӵW\_> > >?<>es)(?ރ?\P?M7\H?"S6{?-BqWh?7ԁH?C#yB(j?PAM?\'f?h n?t.?&(?[?m>f?FLP&?2I?imx3?3Z[?E?ն?&V?W=?mg?RP?̳}1C?̻?]7?qh?y %?s0C?p\/O?pk?t/Q2?{H\n?cslc?7P?hT?D~2P?8-; ?.s?!N?UO*?lQ>b=`Y>R>P\;(u>wDf>w R>'G->+t>u">8ɾ>E*i>?>1O ɿ>i>?eg>c>r>~E>\X>c>M> p>HZnH>/7<>MD>LQYB?3? Z;UZ?2㨿?*(?'!6&4?0vvP?7ۑc]j?A!A%?Lr # ?W<c/?dF66݄?q˭j ?}kP7?D!͘e?)qkն?F'T?٦I?1|%?Ѳ ?ڣ8?. =?n?ia/ ?C?HP?v#?> }k >,>{Av>κl>KfA4u>pEH>&Su>DZ> ؊>&4>t݂{>DU0>}>Zu$ >tYO>Dc>2 >}t>>r6z>ˮvo>רUp>ݩU>;),8>}X?>~0y? +e? z?Sp?&?0Fqvd?68O?>L?F0@0f?Pв[t?Z'?ڰ2?f?Q9?֛n_?2 ?+C?Cf&?ʅ?5 Je?yX"?8KȰ?|_?ݐE?4JY??zV ?qY.렪A?fmT?\0?RPD@^?G\ՋC'?=|Q?2m7?'?? 8w>;!>NC>tgZo>f)>}ȼ`>:lJ>^w>#L>R>f>uD ><pm>ބ,>;t>x$>r hL>c d>ڞ܄jL>EXd>Ƈp >׽"iI>࢏R >hcė">8>kxT? oK~?켎?>?''KF?1g?8\Y7i?@O}?F ?Pӄ?YHŘ?c2-X ?n[%t?xʡi? W)?eS?2O\B?aY? ?كѨ?e`?+_Kp? 7gN?`9?)@?}/?ܓF2]?7+O?rFh:? M-?yX gL?to?rWޢ?s'f?xFYV?`? W?ɞl??f ?i?~kS?M).?i=?+n;m?f@?-?ZH?z ?NU!?{?̉ ?~?xv?vՄ(k?wk?|B J ^?kF?{2/??I[?S8?dع?iZ]??)?p2V?` ?;~? R ^?Gr:?i? '?D曒z?{Ő?r_S*?h=oZ)?_cw?Td]?Je?AǛk|`?7Rac?-z=K?" HL?n?ՈJ>>a9>y I>옲>Fb() >ȷ&>>/16>8q>>L&O̐>yRa>1>gu>5>;ZJe>cr>^l>]>ݜ#>2G>٫Mn>D o}>i}\>O&M?&} ?1I?f$?'Ӹ$?2&2?: \J?Bw?Iy.oF?RXҚB?\ w<`?da~?ob^K?xcd?Sn9?]4?o?ȓMr?jBQ?G:ε?a? Zq!?Du?*g?ȱ? ?! T?<2?) ;?Y`?~0r%?xk?v~?xAbC'?}2?M h7?n_~x)?Qij9?k?Z4?оwH?E?Xc?Py.h?oWc?0X?Ϛ?XB?$ K? 1h} ?44?^ Ӂ?zeOX?xoȻY?z#[?d&?'FM7U?{v^DC?*??eQiB?Bn ?6PF@?VQ ?@?γz?_Pw?Wf?mB?y|D??|-?WKF?z͋Sg?q|Ys{?g`=]?^Mk?TRrK?Kx 7N+?B2+?9$]?1);2T?%-? ?Ɯs?>*m ">޿3>K7>яԁ> *>.,i >Ç/>>W->>Q^>[ېI>Q^ޞ>>W>(>Ç/+>.,i> *4N>яԁ>Kϻd>޿3x>*m "|?~?Ɯs?Z?%-Q?1);2T?9$]?B2+?Kx 7N, ?TRro?^Mk?g`=]?q|Ys{?z͋S\?WKF?|0??y|F?mB?Wf?_Pw?γx?@?VQ?6PF??Bn?eQi?<2?! T? ?ȳ?*g?Du? Zq!?a?G:β?jBQ?ȓMr?k?]4?Sn9?xc]?ob^L ?da~?\ w<`?RXҚH?Iy.o?BM?: \J?2&~?'ӸJ?f$?1?&}!J>O&>i>D z>٫Mn>2G>ݜ>k#>^l>cpv>;ZI>5ݦ>gv>1S>yRaU>L&PT>^>8qdQ>/1>JJ>ȷ;E>Fb(>옲>y >V:?ՈJ>L?3?" HM?-z=Kp?7Ray?AǛk|X?Je?Td|?_cw?h=oZ)?r_S*?{Ő?D曒z? '?i?Gr;? R _?;~?` ?p2V?)??iZ]?dع?S7??IS?{2-?kF?|B J ^?wk?vՄ(k?xv?~ξ?̉?{?NU!?z ?ZI?-?f@?+n;m?i=?LXl-?~kS?i??f ?ɞh? W?`?xFYV?s'f?rWޞ?ty?yX gM? M-?rFh:?7+O?ܓF2a?}1?)@?`8? 7gN?+_Kp?e`?كѨ? ?aY?2O\B?eS? W)?xʡi?n[%?c2-X0?YHŘ?Pl?F 8?@O}?8\Y7i?1g?''K??켍? oKn>k{B>8>hcė9c>࢏RJ>׽"i>Ƈp>EX8Y>ڞ܄ >c c`3>r g>xy>;>ބ?F><q7>ul>f >Sc>R&>^wN>:m>}ȼr>f)>>tgT>N>;!? 8q??'ޘ?2mb?=|Q?G\ՋC2?RPD@^?\09?fm`?qY.렪B?zV ??4JW?ݐE?|_?8Kȳ?yX"?5 Jb?ʅ?Cf%?+C?2 ?֛n_?Q9?f?ڰ'?H>'?xɬwq?t?E?rP'?tS2.?y1/?E o?!8)?, ?Ǫ^o?|?@rîc?Fi-X7?O+?5`C?H)`Y9?~ƩW?sΔY?K"?1E?rG*?:&H?xJ/c0?qʦ2?neoa?nEMܠ?r&`?z&:?a?r??߂?h?'?֮N?B^??x?2?H}]?N09P?Xΰj?Q$#?B%D?YY?r6(?fw?ZLt?68O?0Fqvd?&?SpB? ? +?>~0y>}D>;)=>ݩ>רUpb>ˮY>r6>}t>9>2ؼ>DchZ>tYO >Zt߲>}ی>DWA>t݃ >&4> >V2>&S{>pEhJ>KfA5&*>κl>{->,>}k?5H?ry?^?+g`Jr?6+6wV0V?A"i?MXUd?WU2dL?bx ?l1?vS;2b?? YPZ? kbv?vA?a˕?I ?N6B??Sڛ?n.?'h?a2<9?}$bD?HI??_VL0?|95-?{C?s\?pl?p2*.?sMW?zoB?@;d? 5?1?R?|?aF? X?*\?@?hZY?5Jz?mG?Uςu?`?A`8?Dq?.N9?v?pcxG?l~`?m ?rl^?z%?)jl ?> LQYN>MDZ>/7L">HZ~> >~>c@>\=>}>>N>?e>i/>1O C>@>E)|>8ɽO>u>+u>'G>w >wE>P\;!Y>R~>b=a?lQ?UO*?!?.sw?8-;"?D~2K?PY>hT?[dt?eD1?pj6A ?ywz?{8@?Qy?c;?R)o@?YX!^?\?4Eu?T'?}!q?^T?}Pb?x^pʲ,?64.?wɢO? ?p/N?|[[O?ti$?po?pwm?sB9?{-RI?vXF9?5iQ?,O@?^T?@A'?Ô? -q?{|?n6 ?pJ ?Uo ?sk&?\Sr?e?&(?[?t"?h n?\'f?PAM?C#yB($?7ԁl?-BqV?"S6z?M7\H?\N?ނ >es)>?4> > |>ӵW\jH>e؝Z>PH]> ip>X>֠>&F>i~>&1 n>)&1> XL>Qp>#C{f>*>0UNힳ>POj#|>zV*>D!Zz@>(@>u>8uټy>p'?B1? f?# t>Y?0M;%;l?:Id7?Esқ?R+4?]o3k?g]D?qջ?zk>?:*rKL?1`?j6?d9?nJ?˅?y]n?,$?CIY?ZLh ?8< ?cXB|? ? e?)?`|>?<$fI?{A?uNa?sM z)?uT ?{;c/?lV)?:[<'?@7f?7?IV?l*C5?f>?z;?G6? ?'dA1?j}N%?gK'Ҏ? m ?)?5?Nm?~i暺?w3y??t: ?ug?x- ?hOa}??:VO?v? ?<? 5Ia?~>}|nu>9C>yr> +>rz<>Øh>5> >35h>"> GR>{J>ݪ@'S>+$V>28>;M>!P ->eNl>R>NJ%>2R>9 >뗱> >>Aڛi>>׷(-Z?' x??P4y?׿[?A9?M<`? M? b?Ug?9 K?֩6?l>&?3VS ?{6x??xP=Y?xD9T=R?|הD?=Z?gF2F?ik?^7 :? ␢?Wø?u*?yt?‘+~?r>v?F+?,?!D4'?QQ?% ?ɔ G ?{o~*TD>s.>8> >Ɓ>>1>|>>#h>T>d3>ʯ7H>? W> 15>4CΖ>Kg0>n"u >4$@RJ>QWv>&Vc(> >Ms'<>jM$>q6>[|>Jĥ?Cb?|S?"UQy?/88K?9+S?D6 @K?P>ǜ?ZX<f?dRQj ?na?uԀ5X?/gM?{h??Ö?MJ?ʺݧ?P$Sȋ?r%ad?!_?-_p?Tf?YjQL?XYz?i~Zb?0?X,?ZZ?zh?+ ?؟Z?~Ch?|}X+?b=??l['?}?f?#x{?zO`?, K?-O?7~X?H?N?L8d?|LA?n?|3Y?xYoS+!?w[ ?{ _?Ή?^W]"?ņߚ?% P?uQ~?|ѼJ?N4d?.x7)?Xv?G?>?F?qN]?R7,?R4r"?RHaҜj?xP?kL!l$?^4F?P-?@r-?0\lx?!Jw?z`4?.p>~h>  >p&o>ы(>GPҸ>LxRT>'b>vK>גY>CE >Έk>c>ف;t>\8>x>R|<>vֻ)>*G>s;f> >o&X>[,F>ϋ'>jў>쥎ԓ> gi?1B&?é{>? ̈e?,/ۍYt?6z%k?Aұ>i?L}?Vi;b?a{8Yl?hK?q:?xs ?]\W?d"?:gB?Bf? O?ҷ?t6?`>?R]?10x~?,0p?@? 41?*bj_? !2=?/?{ ys?8ގ?=wd? ?%%?Lif??sP!IY?e3WHr?Ve ?F0r?6/?'es?BL?~>W;> p͘>X4le>ӀJ>0>A>G>y_,>zv)>n^>{Rš>r>e>sec>5K>N5=>uBpb>TI>x>^]5>q\6>>̮c%.>~b(> 9ͦ=h>_?G ? ?,4?(6G?3`@?>EZ0 ?G#j?R>,ks?[xV?cRV?k<~?rڱ?y6R2r? ?I}?MEIG?0"Ԋ?w?c9?ql?ckh?R-'L?LS?+F?Mk?ԳV?TCe?dʫ?H#I?=Q_?$;? ?Cխ?zM%?wq«j?yU= ?Mz>}>_.±>!$=u> [H>̲>Ӎk> T0>2`> e>B9P)>?vT>dK>8Bep>umt>>[VG:>to>ɜ>윗Ī>t>z0%>_he4>>9>]RDҌ> >~[UQ? >e+v?o?#晤n?0#sq,?9%th?C|[?M)?Ut5DJ?^^I?em/:?mtq"?ss?y0 ?+%O0?25?/c?m!Cz`?F R?e@?~ſ?V?ȅ?hy?<?$U@?ӬY ?7p?H]ݒ?x&&?W>?y'w?X?4?IT?_1H?*/p(?~8bO?@ ?zv-se?rI)86?mR?m>e {?q۾#?xbmm?X'$?Xی?to?Ki)?GT ?}?Rk|?K ?׊?(17?<[weA?GiO?!7?z7,? ̮?qriP|?aLcA?Q> ?AP?2^?#HG?S[(? K$ >P>^&G>ڿH 30>ͅW}i>{n>ŗ>JR>U{d>{">Mo>儰&>>E;>1RP>rvKR >Il> T![> >&n*&>)QD-\>Q> l>ԗb>nF`>=>,&UT?Dxcy?"a"M?BE4?* &?GVV?Q?Y>L?am^ ?iTx{?qdY\?vL?|)X?C?)6?jJu??J/B?F̓T?f,J?R?ۑ?eua?#&ld?mN?2i~?e6B_p?~?'<^B?,?xb>5?yoV?r鳠?pF7?q&F?w?Y ?v??5I^?b8?@R?-?eP?,4??UǗ?7?m?d|s?qKeH??ˈ?c ?{jf?z?s-L?p9|P?pc ?s]6g?z??lǽQ??Z??ӷ?s%I?CR.?`?;_?CJe??ށ>?&)?Eo?g b?t?dxE?TJa?DG ?5zplC?&@?J?bf>]u (\>쏌!\>+>*^}>nnÀH>pC >chQ:>M'z;>y>e܅>M >e0>,2#1>zb-R>?>5+"">H'7>`TY>n>@r3Ճ>x `?> '>йϐ>݅ >^F]Y> ?`A? MUdj?<?$t-xR`?0P)~?:Z|>?C?MV 1?VP U ?`,L*W?h7?qF1?x+$?͔~p?6g??$Q+?X]Z?=\?$m-?g ?M UہH?1`?I:?v8?;c2U?J};?̎z?1ՠ?,/?HĖ?OS?x$K^?sNr?q(>?rí?xA5?"x:?q?yo ?}p#?)?@?A{Uj?c9Q?G`?[Rl?h\~+L?gaX?b,~?N>H? ?n>Y?<$7?z_i'?uLw?s ?uYu?z#5? bA?oi_?qn?$|?$ʻ?A??K),?nӚ ?hB? d?c}(?a?k?OeeC? ?uD?fc??U.`t3#>f>s9&>hԽξ>mvh>-Vb>Kߢ>5>s'>Z:>$kDz̐>9f>_]Bm> 8WK>|@>Au`V>>.>[*X>O.+->0Rqю>¦;n>b{>Nf>Mzq<>I;O>l`?.Y?b0?nSD?* aQ?65. ?AnA?J(?UcXx:f?a[Z?kf?u/A2|?~]`Өl?A??.l?Gsk?^N?eJ&?tIB5?LЯ?<2\?tϏ?L?}b?x2K?i-z?_z ??|?@L?C1F?pxܻ?8?yE0;?u]?u`CHX:N>lmN>D>ЦHT>@0+ڠ>W|>Xn=I>]k8$>7y>k5W>=:>=X>_&>i">>H2^V>X>Qtj>qܳM>#>7F> ya>ќB>ޚ7rf>񼝇>UW%?b'؉? LJ?:l\?%{?2bGI??FV?IJ?U?c ?pJ ??z-V.?'q?{Mf?,8{?-zn?=-?CM ?Ա%?y A?,CrD?M; ?=;p?0X8{?085?1gJY׳?g<?~?bH?uд?Hv?R;?WK8?Z?%H? 70?XMA?t+h?w ȮL?$?X4D?JG",?=+r\~?1- 5^ ?"fc~?x^??T>=紈>ߠ><> c}>#l0>°2`Z>(DB>oU>QϿV`>?]L>ǣU>h~>G >F>Gs>hۧ>ǣ(:>?]N8>QϿW*O>oV >(Dr>°2`>#l0tt> c><>ߖ>=??x^??"fc?1- 5]?=+r\z?JG",?X4D?fmh~T?t)h?z! ?7JSW?J4"`?5yW?n)i?ؼ? ?^~?%o_?"DĂ6?R;? N?-]V?*B?R`??./$ݣ;?45W?&(J ?MD0?ic֊?$>ec>ߍ>&!E>;_=j>.LW>EO@>M>+ >rtH >}q>*L>Ce>ؠ_>JQa>3>Ȳ><#h>n> s,T>11>%$R>i貆Z>ޚ(r>Ɯk*>#,?xUT?[?+jb?-M ?:p•?Hj?Wp:z?gh%EO?u%b?;zi)?}*ɯ?|b8?0,4 ?$?@`??zA:?qmt?e!?۩p/? "f?(sR?"c?讹L?IXj?V??mҳ7?^%?z40?wH/w=?wt?|@! %??Ƶ7_J?XV8?U.Ey?|DYZ?kV"9?}?1rg?Ob?HT??8? ^?ИΑ?;j'?)cU?ʐl?GfX`?,T?]«?wo?n?c{"(?X 4?Ma<?B śZ?7;܎?,S"JV? ̟?fF?G<(p>[(>B77>xP>װ¨$>,<+>I]I>a>v N>oν+G>aHt<>R'>!4>P*>T>pG,>ay0>Zzt>VRD^>Y]z`>^ Z>~(>|2@>( />1Fc>ܞ> H? ;ly{?]ֲKmf?*`r?8MEXI?F״Hx?VٚGW?gA?vd?[L {?f? ?vq"?5 ?>[a~?=8?N ?0%*T?IF}m ;?V.sO?Œ%?|"69?u?,X?l<?{$ u!?w=0?vԎN?w{X,?}P6?9޹}?jM?!k?I1?n}?tE:?'?K?>?H߮?NCf?[= ?k??%6(U??ӂ?x,Z7?sbq?rC ?u?{BN?*?7 ?:Tq?9F.G?m%?K=$?$Ԧ? -eɡ?+:?Φ(?ەQL?*3?l?81 ?%F?=N? q\XL? gd>YvH:>ꔪ[]>\˾$>šAE>Atʼn>ݍ >$>44\B>#ǩ<>C/'>Pk>r֮f>ӭ>_>RaX>3t>~'oV>QCr|U>@r1>|i>9(>ǧ18 D>]0 >Wb->uQg>0%6U8?]_|?!wd?&:~?5&?Dp?TA?e&V?t.?/^ꬷ?RڡL?[?x[<? Q?i6e.?dϲA?-;>v?Ȧ?ĺ6b?#;?u^{b]?i9[\?x"?UVm?zoRۼ?tFL?qYp?qä!3?uq U7?}Ib*?A?V M?M^&+?Ӕ?=v?_g"?A?k_ ?zn??v- ? ~ta?ȑ?OC?>xt?oHN>L`>ʚc2>PhD>fܯ,>qRL>gg>|*>#ؕLV>w÷>agn>W)AR> 5RI >zF>Ďj>s>W+X>?q7>}1bD >p0|>צ>e>ZzR>~h>{\AY>8>&G ?"x?0]?#BgX=0?2 L?Aڱ?Qy?wӏ?K揜sS?._?fZMU?!HW?|]SF?vH:?t?v]VM?|Pg*>q>r >_k>Y6G >\>{D>b/>i#ڄ>MX*A>c>* >þG|I>-ݑ>YSω>d>0YC\>]y>ܠ>, >E>˿ɚU>4;p>/(>ވtgA>C? ךV?&ա@?.J`pp?=r8?MR ?]4 *?l67?zu-?踠Ov?ݒ??0:#?S?2`_-?I8a?âg?X?3@oG?s>?<#?f3?Uӕ\?|-?uAl8?rRwXԽ?rVz?u _?|רj???Zw?nX?ҡ\C?uX/6?ˈ!?Bs$?=P,?9?&?dx?W)?z?Ʌ`9!?Zk?G9}?V2 ?\"Io?{9I\=?zba?}^:S?|n:G?ȶ"2?aL[?3q?p{?WU?،f)?'."~?'B?t???ESy?-Es?¹?TW?Mf7?Sv`?Gg?Ǭ?h2&?|MSW?uA͓?o+?f` V?_t ?U-F81?K 8?@SH ?4¿?)qW?#H4!?SA? BJ>lN>Tu$>H~T>r0>1!w>_3>0k>4>t㲹>Q9>)MW>JrG>Ve}>r&S>@쵙v> #>8H> $>ƣ1>R< >BVFȠ(>|>kM>l%)o>0 B>j?%[h?JKX?'qz#3?]:?Ը{ 1?Mm?}ub`??3I?#U&l?WD$?|"%7?z?՛9(?Eu?w&?|^݆?N+p?b}?Ea>y?%d?3Yk?/?8?-k?ct?_6?,?zI?&M ?J\?nUC?S\u?z|k?3?!J7? NR?lwj?;ZM?\_?EUU?QYv??Jk7i?N):+.?B7* ?O?zOJ;z?x U?IwmG?d84?h ?6Ԭ?ɜ ?{TP?sՔl?l(}ھ?cm?!he,?y2?]˱I>ڎ>fɶ>B4>Ц!:?z>WOd>Knm]>(傈>egg>ЁBa>3U:>IW)> x.>T>g)s8>`Qhl>pZ>@cAm>7Sy*>%>5t>ϿE>1>֮U$> Xv>!TQZd>Q??KxF0?}p?!Ԋհ?0F\?@+JX?Oo4 O?]lf?jVZ?w+^?ce?f)E?ˢdJ?j {?ߘ6?Zm~?6fX?Gk?ZM?>'^X?#ZV??I?=-\?C '??xT?q#xY?g"?^q9?R?F#eǔ?;,!cnx?0qPO1?#I!dd?\6=0?(JI>6>p5>x}z>1 ՝>szT>vB5V>z W>Zc>w2&>#>"-r>۬>+ >T;ʲ>i>G>aE>vۜ}>sQ6>vY $>yj>Fo2(>ҳ->6 *>X!BP>/=H?CdLH?ȝ";?E_?(0?6+&?EsQ ?S0 ?a{?ngZ?z<1?7$#?u ?{?t?5J+d?%H?)7?c'?\4}N?> z*?L* ?%??Zy?yC~?Zo?ɍiUd?YJ?{jљ?{M ;?~" ?9c?v؍?% 1}?/O#d/? p:?sY?S4c?R$M?28??_LW?%Ib?vT?l?i:1b?5w?wW?~zm?c\?~=o*?{x+?|Z\u?D;?Ajm?JU`=?ۃ?js?HJ?-}*Vx?ӕ?0&???s?^W:?%;V'?0r#?0~?-5-E%?/!L?1?|+?[?sT?ix> {?Ob|?!=">kx\>Au%!!{> @>һ">{Wq>Ul>ÄIe@>zf!;G>ڀl>S$9|>f >(_>Ԩ.u>w "0>6ӞK>32>[Z)>Okj~>0Uf.H>vp>)xd>C1` >fI >klZh>DG>h?1&Ĝ? c9?93H?#{g՜?0qX?=p"r:(?JZe(?WbO`4p>?D}>*a>`>|>j>OnXN6>S @>ÜJ>n>k C>up d>@A6U>4h^@>n>D:>]\>?4'> 3">#2>%>XW(>ʐ!_&>Գ!p>߫.W\>Q>hgm>"\?kT?}?v ?#[>ŨD?-B):P?76b?CC̠?PW0?[]wR?g/2?s?Lj!?~L]K?[z?7XYK?Ѻ,v?Ȼv?ee?N2?? g8?H)7?z.dJ?aUC? ?TP'H?앥?|6 ".?u]?r|P}?r{D|(y?u"{l?{_]? ?!j'?n?5 ?h'??d;*?97?ჿ?]??7?=Uy?xH5?Ke?L`M??Al?#C?~5[{E?u*e?r?q?t"[#L?{7n N?#:WN?*9?Ɋ/?sK?ʑ?N]]K? /K? ?p"?ү)?BXn?}Y?:B's??.$C?vU?|<w?s$ ?h\?_h@(_E?S\lE?FwY!?;o?0,U?"&l82?3?VB4>{Ѿ8> >yLj>m[> hG(>r=>R.و>D>m >}x>k>o_>&>}>[8>P F><.~>j?s>*7 ڪ>Ł >ѷܽ H>*0>`>_0dJ?5? -Ӌ?D" e? F+>?'Գl?06 ?8<P֯p?BEh?L1FL?W[1?cR?p!F?|T/?RHN?:?WE'\?J23?# ?P1 ! ?hKg?|˳?UH؇?k??S]?.;~?0$?n|?}AyS> εR> a >ϻ?">f%p>Z>v>7>w3>w>a$E>7">W.%3>S{>BG> >uy>R6saL>˥{s>)ߊ>xU>؋8ֲ><>7*c>Q=(?M|s? 9?^IrD? ۓ?'_m?0 j+?7 QЄ??̯??Fg$?Q ?Zsw_?e_`R?rr*?~ s?;aO?TT?.(?鰓?S[!Qc?$&9?|j?#jLK?+բ}?֒ 60?nrJ ?xaYh?耽?E?,Q1_?%Qg? h?3.X!?dSb?L&v?fĢx?4?;'hd?F?|?rED?0=.?6-?| ?F,?vևM+n?t=$X?upb?yW?J?HM??%?'a/?0[?Qh|?-rDP?zq>?|R_?:?|**?RPol?|0f?aB?fC?>ܼ?|Gy1?s)瘊N?i+1?`M?TB?J_};h?@16;?3%S.J?(%^}r?*@????YJW> 19v>r-O">V4.\>ci>93D>U>F>xN>멕>rx>*6>"~>2$v_g>!G@>M@T>4EA>"| >?d>lr>fހ~>ᆽM!^><|>]'?qs|? BF?{%4? ?)#?2P_c?9mF?A?H;]r?QMw?ZG\$4?c?n2_?xPFRǞ?'_?TMP?޸zT?coZ?F6?ĺlh?[v6X?|"/E?"?QЌM?jZκ?k?AD?y?,^?(ڵ? >k?|{=T?v\?t#?uH̲?yZs`?s+\? ؠ=cb?,?\0~?z ?+:#ȕ?\?zzE?f ?E?;ė?15V ?,^? QK?d2h?UK|?~?謊)?|<?ysK?zOt)sJ?~Rٷq?EF+Pt?D5H?ةÿ?\$?xu!?_,?wMq?0'H`g?0O?T?j\?uz?5?j^0?6}8?j6DT |->Ki0>v8>בNx>d>2f>`=k>,6F>zV;>!ab>b7]>^@ l^>tL;> { >t;>pkJ2>ZM.g)>#>|i>̓Q֏>ږUK>1\>rDsl>v ?"˫?$lv? i ?)2El?3,q?<B?C ?L1 h?TI?^O ~?f&2?p6>SB?x`)_& ?NB?d?p>?xjM?:>i? &?M`tQQ?VRyI?}Ț?!M?$th?jn?x?vO?uqg`?ئ?ip-?{Ҡs5)?y*p5?zR嵾?/ n?Ƚ?~<ɶ?lE@A?E4?!\d2H?y"x/?gtCF?*ũ?T>?T<?/&P?.{U?bn@?DC3Bu[?u!/?|?oϡ?}?{o>u?}DHE?Qw'b?qeK?Q\ʫ?H?]8` "?[?/Q?SDs?T?LVD?E"? O? ?o,?ҷH2?N?{: ?{]~?r%?ic x?a:LR?V2M&?NξL?EZ8]?< K?2,?&i@S?.8.?:t!?qbn> >Z۬>Aw >XE>b>w>Pk>nla>W#>Oѫg>ڈrN>b >ڈ>Oѫx>W#>nmh>P>w=>>Xk>Aw >Zt> :?qb?:t?.9N?&i@S?2,?< ?EZ8O?Nξ?V2Mk?a:Lb?ic p?r%?{]~?{: ?N?ҷH2?o,? ? O?E"?LVD?T?SDr?/Q?[?]8` "?H?Q\ʫ?qeK?Qw'f?}DHE?{o>j?}?oϡ?|?u!/?DC3Bu\?bnD?.{U?/&Q?T<?T>?\?gtCF?y"x+?!\d2F?E7?lE@i?xjM?p>?f?NB?x`)_& ?p6>SJ?f&2?^O ~?TH?L1 h?C ?<B ?3,qQ?)2Em? i ?$l?"˵>vn>rDn>1Z>ږe>̓Q֏*>|i~>E>ZM.>pkH]*>̹U> ᗳ>tL=ic>^@ (>b7p>!ab>zWR>,6f>`H>2Ҁr>d<>בN6>v8ѿ>Kk>>DT |0?f{'P?.' ?#Ƞ?/S@?8&?C[4#?NF*?W7dxQ?al?j!͛-?sTy?} '?j6<\?6}8?j^0?5?u{?j\?T?0M?0'H`f?wMq?_,?xu!?\${?ةÿ?D5H?EF+Pp?~Rٷk?zOt)sT?ysK?|<?~?謊'?UK|?d2h? QM?,^?15V"?;ė?F?f ?zzE?3.X!?+:#Ȓ?z ?\0~?,? ؠ=cY?s+\?yZs`?uH̲?t#?vg?|{=T? >k?(ڹ?y?,^?AD?k?jZκ?QЌM?"?|"/D?[v6W?ĺlh?F6?co\?޸zR?TMP?'_?xPFRǞ?n2?c?ZG\$>?QMr?H;];?A?9mEK?2P_c?)#? ?{%? BG?qs>]4c><|Z>ᆽM*>fޔO>l>?/">"|>4E>M@(a>!G>2$v_>"@>*6zu>rx;>멕%>x#|>G,>!#>93/>c>V4@ >r-O> 1:"??YK??V?*@ ?(%^} ?3%S.z?@16@?J_};a?TB?`M?i+1?s)瘊N?|Gy1?>ܼ?f@?aB?|0f?RPol?|**?:?|R_?zqJ?p?qBSyA?uC*?}4p?e!?HJ&?% oZ?x8?nr>?֒ 60?+բ}?#jLK?|j?$&9?S[!Qa?鰓?.(?TS?;aO?~ s?rr(?e_`l?Zsw_?Q ?Fg$|??̯?t?7 Q^?0 j?'_m? ۓv?^Ir? 9?M|7>QTg>7*b>؋8>x*>)ck>˥{q>R6sapn>uj> \=>BG*>S6w>W0ՠ>7DZ>a$D>MM>wV>w?>ZQ>fE>ϻ?> a> ε>AyR?R/J?BW=? S?,?7717?C-T?P$?Z&o7o?dB@A?pDU?x=?@F?fvgm?ڏe$? ;?F%qE?e!?hY*,?T?HoL?;|"?sOz?U_'n ?sqg??2"??5Uk?zG ?te솪?qDHx?qх_?uj2?}K8?2lyt?4$%?{B?2A 8?`ל?vBf?GpBxR??|(?j*&?Ƕ,??d;)?4o?3;X?@ ??9^?vs%v?q_s[̻?o$ ?pU?tP6A?}_0d>` >*0>ܽ %>ѷŁ 0>*7 @>jP><.>P >[EA>}>'>o>kB>|>m |F>D>R.[>r[> hGG>m>yR> >{Ѿ5?VB5?3?"&l8?0,V?;o?FwY ?S\lE?_h@(_E?h\?s$ ?|<x?vP?.$C??:B's?}Y?BXl?ү)?p"? ? /K?N]]K?ʑ?sK?Ɋ/?*7?#:WN?{7n P?t"[#G?q?r?u*h?~5[{A?#C?Al??L`M?Ke?xH5?=Ux??7?ჿ?]?98?c\|?h'?5 ?n?!j'? ?{_]?u"{d?r{D|(m?r|Py?u]?|6 ")?앥?TP'H??aUB?z.dJ?H)6? g8??N4?ee?Ȼw?Ѻ,v?7XYK?[z?~L]Z?Lj1?s?g/Y?[]wR?PW0?CCl?76at?-B)98?#[>ť?v ?~"Z>hgpt>Q;x>߫.W>Գ!W>ʐ!P>XW>:>#(> >?4'G>]\q>n=,>4hC>@A8->up)>k BD>+>Üc~>S >OnX'>j>`>%\>*>?D}>`0? [l?Ti/?$L?1.J??<?H'6?TQ@D?`*Z@?jEfGp! ?t(U&?~nqJ?b?u~WY?0#/E?m4.?|?- ?^?$N?.b?7i??\? ?fb?ӯT?3-H?cp?{9@Bј?va0c?uuD?wȿi?~WØ?~F}?j*q?(?i?I:?zn#?bP?IU ?i??28?S?qԫ)8?VM:?2t? 1T?m)=?LSֶ{?ys^?wHIKU?w aw?{?Hi-I?tPbB?LaK?oe?xޛ?K鈡#?rr8?-F?N~Z?Hm?(I>DG>klyX>fI&>C1Eh>)x<>v>0Uf-J>Ok1>[ZB>3{>6ӜbJ>w o>Ԩt>(_ H>f 5>S$_>ڀyi>zf!>ÄJe>U >{Wp>һ"k> ~>Au%!>kxVS?!=# ?Ob}?$>> Y?1E? z*?\4}N?c'?)8?%H?5J+d?v?{?u ?7$#?z/;>X!;h>6 *">ҳ-@>Fo#h>y\>vY<>s>vۜ|҄>a<>G><>T:D5>+>۬P>"O>>w>Z>z>>vB5 >sz2 >1 լW>x}>p5>.?(JI݀?\6=?#I!dc`?0qPO?;,!cnk?F#eǻ?R?^q9?g"?q#xY?x\??C %?=-X????#ZU?>'^X?ZM?Gl?6fZ?Zm~?ߘ7?j {?ˢdJ?>J?,:?v?/~TϘ?j<?,??1$C?,0?B3 ;U?" u?z?BT??W??8HN?3 C?7F?u??ce?w+n?jVZ?]lh?Oo4 Od?@+JX ?0F ?!Ԋ՜?}Đ??KxB>Q`>!TQZT> Xp>֮UP(>1>ϿEW>5u*,>%->7SD>@c#>pZ>`Qh>g)s>T> x3?>IWӼ>2g>Ё>eg>(僈>KnZ>WOdh>Ц!:O>BI=>f>ڎ?]˱I?y2&?!he,ޔ?-i?8C3?3?z|f?S\u?nUC?J\?&M ?zI?)?_6?cu?-m?8?dx?3Yj?%d?Ea>y?b}?N+s?|^݆?w&?Eu?՛9(?z?|"%7?w>D)?vãR?xCIt?~Z?o$~+Y?:T?$F=?W3?}H?45g?4?so^S[?d:?V%?FnP?6|p?'qz#,?JKH?%[`>j>0 .>l%)>kt>|(>BVFм>R<dž8>ƣ|> $6>8H> #ݬ;>@쳽 >r&R>Ve>Jrl>)M->Qc>t4^> >_p>1!~>r0->H~=>Tu$ >lN8? C?SA?#H1!?)qW ?4¿?@SH ?K 8?U-F86?_t N?f` v?o+?uA͓?|MSW?h2&?Ǭ?Gg?SvX?Mf7?TU?¹?-Es?ESy???t?'A?'."|?،f)?WU?p{?3t?aL`?ȶ"2?|n:G?}^:T?zba?{9I\M?\"Il?V2 ?G9}?Zh?Ʌ`9 ?{?W)?~C>?"?5?=P)?Bs$?ˈ#?uX/6?ҡ\C?nX?Zx?K?|רt?u _?rVz?rRwX?uAl??|-?Uӕd?f3?<%?s??3@oG?X?âd?I8a?2`_,?S?0:$??ݒ?踠O?zu)?l67?]4 ?MR ?=r8?.J`pl?&բ`? ךVX>CP>ވtg8h>/H>4;$>˿ɚ?>E>,! >z>]x>0YE >d@5>YSP>->þGp>">*a]>MX)D>i#>b>{D>\>>Y6G2>_kG]>r >q>g1P? 5>`?\kr?% O_?12;?;j7AGyT?E3z?P)?Xx@?aХ8U?h =?p05g?v2B#?|̇??E7 ?|z?P4:?2v?HDZ~ز? qKY?NsWM?:M?'?4I7%?@,|?4(}?\#4?'+?u͍?[~?@l?%?|P?0]?"xp>&G<>>{\Amp>~>Zz[>eMl>6>pv*>}1bC>?qH>W)vF>sN>Ďwv>zG^> 5R<>W)?U>ag혨>wø>#ؕ^>|*P0>gg>qRV>f>P[>ʚc>Li~?oB?>xJ? >C?+ Ω!w?60SD5?APC?J%?ScK?]cd?eEP?ms[?sEZ?y-. ?1 0?$,?cU?*n(?4Ŧ?Z&,P?p?Itt?r,?X#p?""? A??b[?-.?[?BpK[?߫A%?(鲠??{rZ?tN@?qt?r?wl7?^9?Kh?Ow?dϲA?i6e.? T?x[<?[?RڡL?/^ꬶ?t.?e&V?TA?D?5&?&; ?!w0%6P>uQ>Wb->]0 ~>ǧ18 >9(>|i60>@q>QCr|E>~'o>1>R`>_>ӭ5>r֮f}>M_>C.>#ǩ= >44]b>$>ݍ >At>šA~>\˥>ꔪ[]>YvH? gH? q\N?=N?%F^?1>1;?<,?EJ1?P¾#?Ye.?cd!?lH ׃?ta}X ?{[oN? p?zl-??XL8?5YK.?<{?8[a~?5 ?vq"? ?i?[L z?vf?gA?VٚGWv?F״Hw?8MEXI?*`r?]ֲKl? ;ly{\>p>ܞt>1Fc>( h>|2>~.">^><2>Y]z>VRCZ>Z{>a닙P>pG>T੠>P*,>!3>R&F>aHu>oξb'>v >Q>I]iU>,װ¨ >xH>B7<>[(:?G<?f? ̟I?,S"JV?7;,?B śY?Maf?J*?O[Be?~2ZQ?Afq? ?=ܢP??8X?z(?En?} f?|V7?}/]l?1p?o=oZ?4j[B?!?YO?? ">?۩p/?e!?qmt?zA:??@`?$?0,4 ?|b9?}*ɲ?;zi)?u%b?gh%E;?Wp:z?Hi?:p•?-M ?+jl?[?xUT>#=B>Ɯkv>ޚ(r^>i貆>%$\,>1\> s>n>;Wf>WI>2T>JQa>ؠ+>Ce~>*K%>}q{#>rtIݹ>+(>M>EOD>.LcB>;_=>&>ߍX>ec>?^[Duu?04)?JE??'?Y0?3'̢?@z ?K6.\?Wv=ׄ?d;H ?qq?|G"B?F?Zr~/?彆Ȩ?4??Kx(ɚ??Pυ?$?4? AMwF)?_?\Hu?l-r?^~?3%?%/i?qO;,-?k-?[t?-?CB?[|?KN?UZ?Li?1Q6?q EI?EyL?y# ͝?@?<*]`?sE5p?h0P?=+&?Z?h?CV?>d?Df?̥?f%?0egB5?w.F?jiS?]O?Oԧ?Akv?3u0?%.T?.`t? B`>@T>$=hr>̓>G~̀N>FҐ>ñH'>tKܞ>'M>᪜6>5>]I#8>pQ>M5{A> >M5H>pQ>]I$r>JY>᪜\B>'>tK>ñH*>F>G~n(>̓f>$=h>@? B`h?.`rv?%.TΆ?3u?Ak{?Oԧ?]O?jiS?w.F?0egB8?f&?̥?Dg?>g?CV?h?Z?=+&?h0P?sE5p?<*]`?@?y# ͘?EyL?q EE?1Q6?Ld?UZ?KK?[|?CB?-?[t?k3?qO;,-?%/i?W>%?ZJ?M?'m\?bR~?;|uv?"΁l?CY?{Ν@?$Ub?vt?m˶??<ֽ? _gA?3>6*?^z(?JDe?1 v??s$?Mۚ#?%!?b?Ⳁ?{P?2:t@? $}?l4?1?'/x?*? {?%Xk?a?cB"?v^G?ji퀞?^KlM^,?QW}a?C ")?77G?+046?Y?he?H{>*J>)?8>e>+|o>yS > )>.z찜>w[8>ۿ>\2>}>9H>ԝZ5G>Q7>b2[>]>2k>=P>oj>V,U>3t->,иF>RȲ0> y [>"?(>dp#-v?u\w*r?/$?! w?0ys!?>V@ ?Lؒ$-?[xP?je_(?x\?X?T? YQ?( ?AqR?Qu?Ci?$J?=繀?ќ5R~?se ?UF?]i???Oc?j|?yz?ǫb??|r?^ȕ?I}y?u8֞?hYa?X%?x?k^?_?5a?RI?t?}?@?B?'-'?{$?oLM?}x?}I'?NJ?K7ڃ?Qg'2? - ?e9q*?pY&R? KS?l1QU?[J[ 8?oD?_s:?NV? ;Cp?ө?S?5+d?AN ?b?XD;?K#!"?e׭V?=)46x?sں?t3&7}x?j MH?`wW?ST|=5U?Fx/؊?;hb?0j]u?$r%X?mX?p)? f>w>qt\>hV8M> U TT>3ԋϱ>p3V>#uR,>?u>xv&>H)E>>>M>4'> YzH>){RO>]7ͱ>|bE>G?#>4Nm>ʊK>>->̈́g>LGЯ>D3)>>7l?-G?G?q427?+՘?:<xF?Ij,H!?Y+?iK@(+?x e?{fr?#Rr?x~b?M!?Y~X?є?#t?5"oe_u?gnaV?\q?<^w%?2?<Mz?LD G?F ^?C>I?|~??7? M?v?Z ?Rs?ԹY5?n 図?Ea D? (|?A4?#O?Sn?L@??|J[V?t P ?kc֐?a=?V1?KiNR?A 8 Ԑ'?5C=s1?*09`d3>lG/Q`>> >і(a>ű e%>:> Y"+>vT>,@@> :?>S6>u5><#gR>#̥>"+xG>l>޲M>2 >u`> >!m> Af>Ӕz}T>@] >0U_>AR? ?|8Kl?'2P4?6a.>J?E^?VRlݴ?f d?u~^?32c?c?6F ?X`p?A:A?"YC??~z?O_?byq.?:ˁz?hҧ?^Ȅ?BV?f?؄}?zt(?v P;?u81J?we,?}W0?h2?~5g?gm?@4?]?JE?zѻ3?xO1?Ơ$?FXB? S?INmڊ?z!F?Ej?;5 ?r/?V樔?x%`=?u|w ?v%4Д?{W?/g ?䩽IxY?,ǡ;?}Ja?T?9?4|?H&h]?,b}?Q2?%kۻ=?o@x?]$?ȉ.?>P^?Xa?Dj??U?>5W|?gҏ?0Mk?|.rx?ut)D?n|?e Ѳ`?[Fm`?QAKB?EH ?:.?0zǨ?#I?tۋ ? ,|>Jۇ"> >プ5m8>Kb?>,TI>,me>0i>>O*x>Q7>U!y3>~+>S> ?">z! >Q4>Y >֘*>|qi>gzs>It> ޽> ,>ĝ>>ETqp >M >"h>P C?$*$?^¨?#5?2|F?B%*e?Rs|[ p?bkE?r4 ?Jɞd? ̦?b?{;?*~?V?N1?L ?uW? ??]%?kV?V U&?E~?lFl?x9ܺ?t'6?s}=?vS?|=d^?Zo gwA?Pc?+k^?Hݿ?̡?Lp@?o'L%?AF?ID?$`+?|`?ȳ?5 TQ*?Rv? )W?%Fc?4ɛT?}JQ?y=}u?yS]?}8?M#^c?ӱ%F?Rv?Z ?iýX?]ŏ?b(1?P;_>s?DO?$w",?c??\g s?=hQ?dj?S (?m~x?4F8??,_S0J?[|?=P?\ 81?x(?kIzڟD >7 >s?>5]~>ׇٙH>r>@qA>o#H>b}Z>) L^>ݪ=>?|g>x4A>.>o%J>a >>D>B0>;y>Czh>2:w>>A3h>|,?o?. Jh?.Hwnx?=(?L?] ̀j$?lsf?z? ?y\p@?|scZ?$̘.?IZ??P\|?'܂?EX?,ap?7??##B?ŧQj3?9?ʛ?|K?wT+$?v 5}?xd΁]?}aܘ? y%?8?n?I?GJe?'?6~?Jm?~OT?r9^?.!?,?3w/?l &?jy?=غNX?e7YZ?ڹy?#BlD?rS;vw?U?&̏?O}?3?KYlk?bT{?ՙ;=]r>j6>܉>2+V>Pg!آ>uwý>\> _]>No^J> ͺ>>y>Dy>#%i#>d)D>1>>d7>U~UT>rBx>@ֻ>V‰h>,' >j|F{x>NCyX>~.5@>u,?7d?Z{?'_?6; ć?E6?UCtI?dBP?rH?Ed`h?/1?P?DR ?}brڊ?{I?GA?;tM? o?ߚYیU?q~?WoY?Rb?^?$?פ?x1=?~ 9?}X{?/Kצ?c@?aE1t?Ej??{ "ʟl?yw?Vڀq?1AO?*?BQy}?\E??9 y?/_?B%k??B\G?a}R?2?^?J-I?fm ?Q?Pˏ?g y?؄0?>8?;#Q?a?I86?bj?;YU?I3? z?}֒>?͔],?FE\S? ?th3? I?S2?ElbJ?cbC?<{FE?c%0?vx?nX?|I?sF&-6?k?aJ"\ ?VvԪ?J?@?=ۘl?1> Wbp?$ d|?AU/o?z/aa>~g>d<9>)эV>ҤE>([n>rCna> >{vW>2JX >c|> g> ߐ>fo>wi>?ET>.o+>/Q>v[E>Q>mc>>6l4N8>y>]HX> >T1?gYp@?D=Ũ?" u?0ME?>ϼa?MT4u?[Į?h++?uf?p|?bV.5?jO?O)?D0J?,c?2 *?A:?d4J?xn{?7ģj8?ș?Xx{Xu?z?6@?ʸ˘9?f"Z?Wџ$?SA?_?loF?nw?ȟB?]? \VU?QSiS?uO%?<`?澜 0?"ըw???,e}?މͷW?O?k{?'??+{=?L%*z'?:N`?jl7?Ms?Dy?{2?*Y1?1?(??ͳ?譓S(?dߞO?^ 7 ?chvk?YI?f 8?nR?:Lrt?u?fq ?Dغ?h?hqo@?"P?x oQ?p (w?e￐?Z-ޯ?NDT?@KL?3,ĵb?&%,6?6 ? %K>ju>jhe>3M!!>.1Ƞ>-R>YT>ru0>*-߄>>I>g>ڊ>Ȋq>-̲̥'>4>]>vM~(>.->ϗv>j rEZ>a>۸$>Evv`>Җ>ĭ#7>:>UZX?/z?4?q)@?(v*h?6@?DZSKU?RtGD?`\#m ?k2Yl?w,sFӺ?TDK }?r?:z?""F?T[~?a"q? ?oY?SN?F/{]^?Y+zF?=P~i?B ?n?;H-?B?jw?ǵ?@%1 ?K(?ǭ@Ó?{ ? [W?VnL?EY0d?M? ? Q?,yk ?OFC?wv ?ύd?xDn?Ȼg?jr2-?aԳЛ?}tf?Nhq=??)? `u>?&o?V ? ?{?D:?jϹ?n^?[4E?B $??9AN?JfE?8I?& ?h?+%?/?niXi?.*@Ua?1X?2?n0?{-r?qzr?g$+{$?\z|?P]t9=L?B`?44q|?':,=?ft`? ϑŌ>e">ͩF>≔&n>Gc>{o5o>Q>;iڪ>fe>WI>&a>N)?l> *N >w>}$>Hy>#>߇>PQ2>;FHU>g. _> Y$>I9 >ة[p>Jj/(>1Xh>NOVS?j%??@?$}*HH?0]P?=l?I{~ ?U vT?a1?mOޒ?xI ?O?87p!?Ԕ4n?mo?17?`@-y?2?e>?:bH[?o^'?8gR? [?lE:?C ?ƙ|?rO? _?b}(G?~f{ ?J@͠=?ua0?ke]?.&jMm?3[YP?}iY?|r?#TA?X?֓?t QU?kݿ? Hs?ĐN~?܃>h?p? k?7h? km67?[tj?0ԥ?{TQڪ?zy⟲Y?},R?j0?9ǣ?̨?$T?z̈́v?W?cH>?iy7??Iӣ?~,y.? 8J*?U?C:?JԻl ?d8T?IR?Ux?|[?r]n#h6?gk@ѿ?\@?PpG??B 8Zy?4*?B?'?e? 思>EUlk>ߓ4v>)i9> ݃V>-b> @>mv7>Qsp>C _N>w)>ONU>c{>>w>GGSr>:٢>jrU*>őҾ>'И>9/=iR>j3HY>$>d\o4>K-v>C5~>nXut>O?`p?FO?1DP?$q?/*:=8?81$?C33-X?O Oz?YC)-)X?dޓQ,?qR8vNE?|# { ?:1:?::: d?5y?Gb?=V>s>ƥ$>ႜ>Wܜ{>_>(ː>Zӽ>VM>~|>Ob> >I>%?>qKM&>>'q,>.ך$>>΂ dz>_sI>ݦ.F >RXp>r>B?g[b?}zMb?PHf?!XF?)fCX?29"?9#sr?B~?K7?U6WV2?as7>X?m0?xф3?0&V?pcWt?L/9^?Z?eˬBY?V\9+?}?q'TCe?C*{?B0.^?1#|? Ł?(X;?yK+? w4?ae@T_?|.(h74?v;Z?sQW?sio?w_k?~?, [6?r?[MI"?~?Mi?=c"H?'X?5<2F?lp9?)m?t/?tz??_3u>?_?6E^?TG@?{_c?}l8h?wKO?uxNݚ?vr:I?zy?? dbs?!$2g?4) h?џS#? e?V?^?Ή?9(~? L˟?8?W?ˍQ?ZLV?B S?Y\?D ?v5zsB?lۘT?b}$?V{U?J>V?=%{d?0q?#oZ*?P&UB?x<">K.gj>%cA>˿h>df#<>ð>]?A>W> I d>)>:pr>qIs}>Tl>t>d 8_>,>@K4>š֜?>8>mS>y^>w0Y> xͻw>?#⏻?}2?56?"b[y?*iX?2ݣ?:?$Ձ?AH f?H׌I?Qg ?Z;BSΰ?d_2Ջt?phJV]?zp/|?g+Ѥ?QQ?_Ʒ?Sxڜ?C^W2?~Vw2 ?x?%g$AŻ?f)J?(g%?J?=[?}?bއ?xN?K])%=?}&*?wAZ%?t?uLL6?xÕ?x- i7? E?lx8?OlmKd?Dzt?1M1U??R=-?XQAx?7L?C@d? b?F?̉:6&?{\z?kzf??Y'??.n?>q+?{D%J%?z!?|ھgG?1;?}^q? L?9#W?RoZ{v?uUM?%?5?Ț6v?&;*^?\^nG^?*؇ ?5?~Z?;S?lY?Nҕ?y0a/?pv?fF?\>܈?QIZlo?D?7e?+a? bMٓ? ^5?B!O>/Y(T>*%G>d\A>Kwq6X>®*B>V!E&>J3>5~1&>>-ax> ~ >QX>&#>L?>> 1H>Y>̪`>M3>=>qFt>R\>!_w?RZ?ѩI?hۥ,?#O 犼|?,3cj6?5Pz0>'?>$37W?EM{?M7?TÕ?]-nn?dO@?mhj&?vk?oު[X?z7??tSb? DE|?h_J2?8?ҌIW?|?MlO?*?y}?b̤yd??/?lu?%~?ڪ??&Os?{X誨h&?zOkQ?|5NI?V&Oy?l?Fۣ?s&?|uw ? ?mx6?:iO"?v*V?s?WӺ?0q%/?%acQ ?<)?$?dF=u\?,?_NO?Q7?!G4?^&xE?I;BT?|IMS?oJ?)V?uu骗?xpyĺ?qCCq?g?_e?TPet?IKw|?>v,?2J7?%|&?ϕ? ّ>c>n>zξ\>hƩ >8Ay^>n5>S>oTSR2>J<{>S5>)z+>>uX:m>>4>A:>5߷>4!QUG>^O=p>py]>)xA>s>cRnx>lFT? 6M9?^B+?"g~?-"?62n?AN95S0L?Ie[m^?R/GeQ?YB%gM?bU9B?iuE?q?xmg?e?W =1?$|F?ct??$dǍ?0?H&?cՇ&?Q?t?ȁؘ~?QlU?/šr?#â\?ɡy?F2?I[(?l A?ee>D? yd2b?s[3?Y6?@o?(?X;Xڿ?.h$? |8;I?1_8?1/Vx?䃭[!?!H?mH?k:ab?=?,4C+?ޯ?#?ِ\? Y#??m?lp?ke?3? Kc?fL:]?H}o? C:?+U?aJA?n ?g?xht?ҍ?{Yo?k? &泺?ˑ"j?~= P?uC>?o &~?eXbg?^=];r?T?KqDJ?At2z?5{CG-?*w~? b?qfFӆ?Bح>aW>0_>XB;>ԌC>B#>h>kإ>z>|SX>B1U>tvZ> 3N>tv>B11>|S˖t>z>kK>h;>B#梹>ԌC >XBՐ>0_>aP?B?qfFE? bT?*w~?5{CGs?At2?KqD=?T?^=];?eXbg?o &~?uC>}?~= J?ˑ"h? &泼?k?{Yt?ҍ?xht?g?n ?aJ@?+U? C: ?H}j?fL:V? Kc?3?ke?lp??m? Y#?ِ]?#?޲?,4C/?=?k:ab?mH?!H?䃭[#?1/Vx?mx6? |8;E?.h$?X;Xڻ?(?@o?Y6?s[3? yd2`?ee>>?l A?I[)?F6?ɡy?#â\?/šz?QlU?ȁؘ?t?S?cՇ&?H&?0?$dǏ??ct?$|A?W =-?e?xm`?q?iuE?bU9B?YB%g$?R/Ge?Ie[mlF[O>cRn,>sI>)x9D>pyI>^O= >4!QU >5İ>>4 >>uXÞ>K>)zL >S5a>JoTS>T>n[>8AC>hƒ.>zξ>n>]? ّ ?ϔ?%|?2J7:?>v-,?IKw?TPet?_e?g?qCCz?xpyĺ~?uu骗?)V?oK?>S?Y?q͙?w:?|4L?:.X?\ ? h?Jd?R?+`2?$37'?5Pz0>!`>R>qF҇>=>M >̪1>Y~> 0Y>xk>L?y>&G>QYC8> }%>-ax~>g>5~1i[>JQ>V!E>®*n>Kwq6X>d\Q>*%:>/Y+^?B!Lp? ]? bMٓ?+ab?7e?D8?QIZlo-?\>܈?fF?pv?y0a/?Nҕ?lY?;S?~\?5?*؇ ?\^nG`?&;*Z?Ț6u?5?%?uUM?RoZ{v?9#S? L?}^q?18?|ھg5?z?{D%J% ?>q+??.n?Y'?kzfA?{\|?̉:6(?F? b?C@d?7L?XQAy??R=.?=c"H?Dzt?OlmKd?lx8? E?x- i5?xÕ?uLL6?t?wAZ%?}&*?K])%=?xR?bއ?}?=[?J?(g%?f)J?%g$AŻ?x?~Vw2 ?C^W0?Sxڜ?_ƴ?QQ?g+ў?zp/?phJVS?d_2Ջn?Z;BSά?Qg ?H׌I?AH :?:?$ՁH?2ݣ|?*ix?"b[0?5?}4?# >y> x˲>w0cQ>y\>mSȦ>8>š֜ľ>@KM >+Y>d 8>ѹ>Tl>qI7><d>:p,>)}> I?>W>]?M>ð>de>˿UT>%c>K.g1?x9?P&U>?#oZ?0q?=%{?J>V?V{U?b}$?lۘT?v5zsH?D ?YV?B P?ZLT?ˍQ?8?V? Lˠ?9(~?ΉȾ?[?S? c?џS#?4) g?!$2e? dbl??zy?vr:I?uxNݚj?wKU?}l8h?{_c?TG@?6E^?_?_3u??tz??t/?)l?lp8?5<2H?'X?P_ă?Mi?ˀ?[MI$?r?~?, [1?w_k?sio?sQW?v;Z?|.(h7.?ae@T_? w4?yK+?(X;? ń?1#|?B0.^?C*{?q'TCf?}?V\9,?eˬBY?Z?L/9`?pcWu?0&V?xфG?m0?as7>B?U6WV2?K74?B~?9#sr?29!?)fB?!XT?PHf?}zM?g[>DD>rv>RX>ݦ.R>_s$>΂ d>6>.ך>'q-&F>G>qK>%e>k> >O6>~.>VMk>Zӽ;>(v>_ >Wܜd!>ႜp>ƥP>s>=W? Lr­?;Y?%a0?2v«?@πPH?N~?Zqc?eb ?qL?zLkw?Z!V?<;?D$?zAg?`x?nYuxt0?p?t{?FB?A?x?Ve??bD`_?T'?.?Hp?,?)Q?;Hj ?{<?vn?uu*`]?w}[J?}֠{s?o7"?PgQ?Bv? o?,?+?d:z[?: 3t?e"c(?F_?4-?X?*{p?`W?%~%?k-霡?kh?|Gaܐg?w™6s?w c?x}?}p:c?FZ:?ZJ?y:?Vy?Jx#?̷?딌?8ګy?dx?Y&L?z͗0?OH>nXw>C5 >K?>d\v>>j3H(>9/= >>'Йr>őK>jrSm>:>GGSL>>>c>O9R>w)I>C `4O>Qsl>mvՓ>âF>-G> ݃(>)U>ߓ.>EUl? 思?e?'B?4*?X?B 8Zyj?PpGI?\@?gk@ѿ?r]n#h6?|`?Uw?IR?d8T?JԻl ?C:?U? 8J)?~,y0?Iӣ??iy7?cH>?W?z̈́v?$T?̨?9ǣ?j.?},R?zy⟲K?{TQڪ?0Ԡ?[te? km6*?7h? k?p?܃>d?ĐN~? Hs?kݿ?t QU?֓?,yk ?#T@?|v?}iY?3[YP?.&jMv?ke]#?ua4?J@͠6?~f{?b}(G? _?rO ?ƙ|?C ?lE:? [?8gP?o^'?:bHX?e@?2?`@-|?1;?mq?Ԕ4t?87p!?O?xI ?mOި?a1?U vT?I{~ x?=l?0]?$}*H?@?P?j%>NOV\H>1[8>Jj@@>ة[@>I9$> Z'>g. p>;FH >P>߇># >Hyh>}$T>wX> *N#>N)A>&c\3>WI>fe\Q>;io>QҒ>{or>G.>≔&E>ͩ>e#v? ϑ?ftR?':,j?44q|?B`L?P]t9=b?\z|?g$+{&?qzx?{-|?n0?2?1R?.*@Ua?niXi?/?+%?h?& ?8H?JfA?9AQ? ?B $?[4J?n^?jϹ?D:?x? ?V ?&o? `u:???Nhq:?}tf?aԳЙ?jr2+?Ȼg?xDn?ύd?wv ?OFC?"ըw? Q? ?M?EY0d?VnR? [W?{?ǭ@Ñ?K)?@%1#?ǵ?jw?B?;H*?n?B ?=P~h?Y+zC?F/{]Z?SN?oY? ?a"s?T[?""F?:~?r?TDK }?w,sFӾ?k2Y?`\#m6?RtG8?DZSKT?6@h?(v(?q)`?38?/t>UZ>:}p>ĭ#F>Җ0>Evv>۸ >ax>j rE>ϗʋR>.-3g>vLb>]3>4D>-̲ͬ->ȉ>ڍ>(c>><>*-ڍ)>ru0̸>YTި>-Rx>.1M>3M>jh>ju? %KD?6F?&%,5?3,ĵb?@KL?ND?Z-ޯ?e￐?p (w?x oQ?"Q?hqo@?h?Dذ?fq z?u?:Lrp?nR?f 6?YH?chvk?^ 7 ?dߞO?譓S(?ͳ??(?1?*Y1?{2?Dy?Ms?jl5?:NX?L%*z'?+{=??'?k{?O?މͷV?,e~???/_?澜 ,?<`?uO%?QSiU? \VY?]?ȟB?nw?loF?_?SA?Wџ(?f"Z?ʸ˘>?6B?z?Xx{Xr?ș?7ģj4?xn{?d4J?A:?2 ,?,c?D0J?O)?jT?bV.=?p|?u~?h++?[Įȼ?MT4u?>ϼa?0MEP?" u?D=?gYk>T6> >]H>>6l4R>/>mcfX>Q%>v[>/Q!>.o*&>?E'>wi#>fp> ߎ0> ] >A>2JVv?>{v>A>rC >([>ҤEv>)т>d<>~gT?z/aN?AU/l?$ cZ?1> WbT?=ۘ ?J?@`?VvԪ?aJ"\ ?k?sF&-D?|I?nX?vs?c%*?<{FE?cbC?ElbD?S1? I?th0? ?FE\R?͔],?}֒>? z?I6?;YU?bk?I87?a?;#T?>8?؄0?g x?Q?Pˎ?fm ?J-L?^?,?a}R?B\G??B%m?,?9 y?\E??BQy?*?1AR?Vڀs?yw?{ "ʟl?Ej??aE1?c@?/Kצ?}X{?~ 9?x1=?$?ת?^?Rb?WoS?q~?ߚYیS? l?;tM?GA?{I?}brڋ?DR?R?/1?Ed`u?rR?dBP?UCtI?E5?6; ć?'_?Zy?7``>u00>~.+>NCy>j|F~>,'>VŽ>@ֻT>rBH>U~W@>dk0>1=m>d)6>#%i>D>x]>T> ͺ>No\3> ^t>آ>ux>Pg!؊>2>܄\>j>=T ?pS?S5?!@Z?ڹm?e7YO?=غNX?ju?l "?3w/?ȳ?.?r9[?~OT?Jm?6~?'?GJe?I?n?8? y*?}aܟ?xd΁_?v 5?wT+%?|K?ʛ?9?ŧQj1?##B??7?,ap?EX?'܂??P\|?I\?$̘-?|scZ?y\pK?z? ?lsf?] ̀j$?L?=?.Hwnp?. G?o >|,Ƞ>A3x>>2:wh>C>;iH>Bt>>P>a`s>o%I!>~>x4>?{\>y>) 2+>bꯒ >o!~>@q>0>ׇm>5]>s'>7 >ڟ9?gF?f6Z?_3E5?(x \?4?A*‘?LSk]M?VsŹH?aYTb]?ii&q{?qi?x(?kIzH?\ 81?=P?[{?,_S0J?4F8.?m~x?S (?dd?=hQ?\g q??`?$w"*?DN?P;_>r?b(1?]Ő?iýZ?Z ?Rv?ӱ%I?M#^c?}8?yS]?y=}w?}J??4ɛP?%Fa? )W?Rv ?5 TQ,?INmڊ?|`|?$`,?ID?AF?o'L%?LpA?̡?Hݿ?+k`?Pl?Zo gwD?|=d^?vS?s}=?t'6?x9ܺ?lFl?E~?V U%?kV?]%? ??uY?L ?N1?V?*~?{;?b? ̦?Jɞk?r4?bk??Rs|[ F?B%*eH?2|F?#4?^?$*>P C~>" >MH>ETq} >ĝ>h> ޽>T>I>gzϏ>|q,>֗>Y$>Q5>z_> ?~>S >~[>U!wp>Q7Y >>O*r>0>,mI>,Tߠ>KbIi>プ5i> [>Jۇ? ,2?tۋ ?#I?0zǨ?:/?EH,?QAKB?[Fmz?e Ѳ|?n|?ut)L?|.rx?0Mk?gҏ?>5W|?U?Dj??Xa?>PZ?ȉ+?]$?o@w?%kۻ=?Q1?,b}?H&h]?4|?9?T?}Ja?,ǡ;?䩽IxZ?/g?{W?v%4Д?u|w ?x%`=?V樔?r+?;5 ?Ef?z!F?-)Gz? S?FXB?Ơ$?xO1?zѻ3?JE?]?@4?gm?~5j?h2?}W0?we,?u81f?v P;?zt(?؄}?f?BV?^Ȅ?hҧ?:ˁz?byq.?O_??~z?"YC?A:@?X`p?6F ?c?32c?u~^?f d?VRl݊?E^T?6a.>J?'2P?|8K? D>AR>0U\>@X>Ӕz> Af>!mJ> &>ua!>2 /A>{>l>"+y%P>#̥_><#i>u5q*>S;> 96>,@@7>vr> Y>:>ű >і(mp>> yV>lG/QH1>`d3?uG9S?LP??*09;D?5C=s20?A 8 Ԑ@?KiNR?V1?a=?kc֦?t P ?|J[V??LD?Sx?#P?A4? (|?Ea E?n 図?ԹY5?Rs?Z ?v? M?7??|~?C>G?F ^?LD E?R>Mz?7b5?|>7D>D3+ >LGЯ>̈́g>-ø>| >ʊz/>4D>E>|b>]8 >){j> Y>^>>~@>ʶ>Hq>xv>D>#uR>p>3ԋP> U P>hV!>qm>o? f@?mX?p)H?$r%"?0j]u?;hb?Fx/،?ST|=5l?`ws?j Md?t3&7}|?sں?=)46z?e׭^?K#!$?XD;?b?AN?5+c?S?ө? ;Co?NU?_s:?oD?[J[ 7?l1QU? KS?pY&Q?e9q*? -?Qg'.?K7ڃ?NN?}I(?}x?oLM?{+?'-%?B?A?}?bR~?RH?5a?_?k]?x?X#?hYa?u8֝?I}r?^Ȕ?|q??ǫb?yz#?j?Oc???]i?UI?se!?ќ5R|?=繀?$J?Ci?Qu?AqQ?( ? YP?T?X?x\?je_(d?[xPی?Lؒ$?>V@ ?0ys!@?! 2?/&?u\w*r>dp#/>"?> y >RȲ2>,и+>3t-0>V,U>oX>=PP>2kߚ>])>b>Q>ԝZ+$>d>}>]>ۿxn>w[>.z> )>yS&<>+|m>>)/>*J?H?he.?YM?+046C?77G?C "0?QW}{?^KlM^i?ji퀾?v^G?cB$?a?%Xo? |?*?'/}?1?l4? $}?2:t>?{P??b?%!?Mۚ#?s!??1 v?JDb?^z"?3>6*? _gA?<ֽ??m˶?vt?$Ub?{ΝB?CY?"΁l?;|uv?? ?}? ?^$??3zX?az?=Pr6/?}@E?c?uvF?4?rX6>!> >Qj!.>F9 z>A88>#">1d[>7U >B>9%>#b>>#bY>9%v>Bw>7V >1d\W ># h>A:>F9 >Qj> >!$>rX6#%V>sm>h9>W@`> K;`>ILL >%:">LW8 +>p}:>NB>* 4An>|> =>mcL>p/m>Ko,>Brƒz><*B,u>T0 >Ш>u .>yG`>Հ;pk>\T>-3>0 =?|{Sh2?_:ٰ?$z "M?3+?BX&?Q?| ?ay?pD?}9?a?UMH.?<_%v ?@2>? m#?S?-EY?AqU?}>ђ?Z?qrL?|7?-Z9??u?wǩ(?f?,?dp?F?S?=#p?? }ԟ?P?pڧ?v!?CLA?+?;nO?uf?N507[?dD?_?cep?D0?sΡ?SSJ?ϏO?kV?!L?r?|vNX ?n5?Qt(6?w;F?}e/???n?9?0&?a (W?\9?R9?-?co?':?YD?@b=??, O?BO?1N?8px?~v?r2R?g]o@?[ ?N>?AFk٘?5?N?){%?|^?Gta3?"ަD>AZ>a^J>Tmc>3>*T>->J4C>z>f>U5Й6>\>{Z;>c'+>m`q{r>f\% >Ðb>/S>^ > >_q9>*->ZK-@>ETs߸>$?E` ?F^? Ev4?.l?=ziL?Mqe?]>8^n?m z?{2i-?@d ?_??]$\?U(m?dYR. N?*F̭r??,eD?u?FWb?cx?zu~?AP?Ʌ?#'[i?$M?&E;Vt??+#t4?شx?`o?l?g&ؿ$?0h ?+1a?[ l?b8?!8R?_^}?Z6k?%ظb? ¿?:^?ܶ?tt?oXW?~w7?{xDY?|pX-?f$ M6?Yvli?{ݥ[?~>8&Y>3>*m}> 'L>͍0L >.>Tk`>ސ >@wk!>">xap&>Vp*>L5vm>FCC>7\>XDQ<>Ke>s\ǽ >?[]L>D$>~&4>Հn@>L_eNh>@M<>zx? q,?[hB?)O ?8*~ d?G-_5t?X4#پ?h$u?w["?(QK@!?b׷@?,w?*xEy?S1t?]?|v?RNk0?p?EI?C)֠?: ٶ?%?? oB?rM?zl(wR?y?{Gt?[ >]?w]T?o?d{=?X>6.?Mq<*?AITq?4:?(%8?Z? m9|N?K8̾k>|%>佞&>ΧQ4> K>+N3>j:>K6l>S"i~>.h>df>Xg/J}>C'>rJ>&W>|Sz>nn-/>[ݺ>Kw>48>~,>Ĺ) X>&7h>ܕ^A`>oy>(`?}O?]-K?$ڛ8?3_&Ց?B%t?SE ?cn?rV_?|A?WDڤ?zYݶ?%Ǟ?B?Ǔ ?)l?16? ?2Q?xyz?+~4?>(mj@?wAi?}W7m(?xl?w5('?zANs ?djR?&}?9@FP3?Ys-?f?\}?S-I?`E!?f)7X?vyqz?RQu?]9B?S&0?{_R?7f?>?`?L?! ?DFC?AȮF?R)&?B?A2?VG\?~y?P:g?.tE?$6?ᯤc?8VL??z3?)( M?ޖI?Ax.?4s*?[? ? h!2?O?J[vV?C?1Q3?'K?q ?R 6?{ŒI;?saa?i^Z?`Xd?S&f?G47(?:7ŝ?-)bqwh?!2 ?JI->觀Z%ߩ> x>ul>ēZ>K>C(r>X23>o[A>zޛ'V>BFn_>kl>>BFA>;^>Ա>4'S>,iG>F>IţP><kth>lғ'>W&A>XIČp>(>涋?ޒx|? ? ^;?.{?=2.k(?L֨?]wq@?k2$?yC =r?VC ?JEȺ?ID?/W7d?O;?m5F[?dL@?ѐb_?%*GT?h#?,*=?=F?}a?i}w?}4?|=eV?~J1a3?Xm?>x?.!?6? ?+?@RH?p??w,?A:h?υdG?w?S}'?uI+U?Vw?D9?gqNȝ?*0?4|?G_??:IÂ?Gde+2?ie?XI6?]s|?uLa?v#?'?uhٛ?*?~>D?u?/;6?h?jWv.?W,?E%?a))??>U,? ?8ٓ?7F?0w/.?pOo?L:?bЅ?x]gO?pM?e#>f?Y"?MK?@_KR?26μ4?$*?:?]pԼ>hFm>)٪>FI>,r>;ܲ*>'H>]n7>.IOӏ>">;Ն;>-(=V@>]κ>wV>2Ԃ>~s >g0N<> 9@>oI>=4>@l>T@T>Լm%>TRC|0>d> ,@? `YtPP?\5?'e:0?5N?D?THC8IXX?cP y( ?qb?~5)oP?J?}i?۷\Q?gض??>?~)?]e_?x6?1:҅?Oe?eZt?0%{?Bx?x?90?YQ? ~B?a?(%?U.?GVv ?֫7=?}jy3?m6?I?D*J??Sϖ0?+jH؇?<p?-1?0G(c??l07?kQ[06?W>n?ħ%?H7*?&e,'? Ӹx?J??PA\?z;cm?j\?hb`M?4 ?Lc'q?,rj1?]C^?©fH?g!F?`O? LD?yiw?9dOkl?3dl?Qh?*2?V-mj^?6g'??L`?Dn?t :?jSMu?`zF?R[vEu?C裢+Z?5mO7$?(,Iч?mC? GJJh>&\>>F g>h_z>Ȉc,>lX>oU>6>;+>da9>tK>mϨ>>K >>$>zt0>?x>^F>ybuC>B_7>c,.>*M>p8>%N >]klp?|E? ; ?"<3$ ?08h/à?=[SۊG?K~{1p?YYy?f]wL?s/2&>?=?t̉?#Jx?E0?r#+? ?mx?A8_‚>?0?F*/?8\%?*ݷE#D?;S?0bQ>#8)r>lC>GuG>>|#H>ȷ%<>rU>' >xBۣ>DD;9>66۴>&0>KQ`D>[Px;>N>"W>3>G>A~B>]s>SAP>< T>n猳>գ(jŐ> #'>%6@>Jj?ɵ2x?CL ?" `@?(d2?5`H~?B>x?P"?]9Gx?h ?s^Lcp?~L?>?z--?~̇?2콦?ݠ?{?!s? r¢?eW۽?5GHui?_s~?d| j?fj?D0O?֧?` ?M~?;>??%ތ?b$(?iI/?/ ?xW@?~\?Xr?NiR?THف?-~1U ?щ ?%S`J?lXR? {K9?=5G?k?]O?S3,?dmP?C)R'?j&o?'j?=* _9?IAj]?*5qm?1w3?*;?2h_?׊L9?W?k?ebD?UWDx?Gnw?3?=?A>(j?rz=?#P?1?{;#P?N{?5t?|#7 p8?q=G?d&DK.?W'@֪?H\q ?9?,&Y6o,?tdx?e`M?9^[I7>k71>67>֧i*>Ȁ@>HN">)9F> 3>`>އ> p>c>ؽ>}j7>oC{2>N{> >!>Jb>Wrl>.g7>с8>!H>E.Th>@>B?nR~v?.7_8?3ra?%i^*?1R?<J6k0?G#eP?Sl0`?_e?h l?sȊ?~d?e9?`(?Oe?r?=4?oID?'?ƚ?t4j? )?RU*?հu?qȊ1?_$^?y_?>:?mC0?3%?I?1?'t=h?C?a? ?I"?9\Z#?x??kHb?=r?J??*?n7?ڨa?Q2h?nU?ެ[?91?_h5>yɫ>֪y> X\ ?>hޡr>%Ӥ>-A>CW>5>7>1>!Qv>SңI">>ٸ#>i"YHZ>{UD ?>>æD>/H>כ%>kq 8>-Ս߬>{+E?xP?1C]?d*A?o6U?Zm/?V^]A? ]f?Mułp>%.x>FN">~7>hg>cGĝF>a`1>hyZ>H&ys>w,~->p>N\3>sf>˯TZ>H >$">zDO>fB>_& 4>Ȉa>Լ >߹JF>6eW~>L•>Õ@? jP̴?2S?Nt?$.ݰ?-3+vp?4x$'sD?<(B@?CwmP?rF?C@i ?$ ?AKw?b]kL?>r?An?.Aa ?|Rl7?z&x+?z.p?!?-wK?5 ?9Q??͹{&?.$7?ӌ?g?CH?~6?-y? N?@qZ?'5)>흽dLk>*Q>~K{>|PK>1I>bȖx>eŊ>>0K>}7>4d#ew>ag k>cn[>Us > f)L>DN>8>Ъ'>Uy>Uhu>pEC>D? Y:?YuSo?u?& ?/O?.?6ֿt??zw-?EZp?Ld?S&%X?ZNbP4?bQ]?lk#?uô?A gg?DK??(?9-9Y?6^?*z!?M4??PBO?HW?ݵ?, 1?|s?j?VRΩ?)I?8"?|]v?yJBo/?yٮId#?~9tL?r+0{?1G?h[nȺ?8G?;гf?v?с L?YJv?L(zGd?>]ܖT?1 aZX?#?J?6گIk>K|>JT > !o>|^WN>Č[Qk>UÛ>D1x>C$K>Lc;>Vi>1KuU>q _>T>o>lŸG,>D.e=>y<>|da4>-Ġn>Qwb >␏;>E+>?UD]yt\?h}Y?`=?'y8S(?1Ĥ?:w,r?C!1?K(Ip?R?m?YX1p?`߭t?fR,?m-?t~T?}@ϡ?LTq?_ɂ?H Z?c,?I?!xl?l~E ?.\?.If??8)W{?-U|?dS`?-ob?U]?o?ԫGh9E?a?搵?S|?:/v?;}ٹ?d?`b)zJ?Hz-?sؓ ?8Pd?{DN?_Z?v#?Wh]Z?O-?uH??IL?>P*?ͼ?{Ļ?j(?w?P %?UkH?k !?.I?X6:A?lS??;?yR K?!.i?kFU?u]eO?mU0?j2? ,?x @ #?p:/A?fp+?]Ph?Q˩>2?D:?6k~?*Q[?Пu?pJU?F(ra>7+=H?>7oa|>Tv>DŽ>*Ϻ>>w >ZFz>8><@>`sp>gϭM>҉>}@=>2n>T>]V%>]_1r>>󎴭<> m>LME?W #`?0?2?ns_?&j?2 Uƒ?='K?G|= ?QVx[?XŁ<$?a?g /M?nT"?s]?yYK ?-?"?;? ؋F?zR愧?BmT?[{?\c?Iw/v?Z)]@?t?a=9A? ?& 页?{治?򹟾?5v??3'? Ml?ĭ,2 ?cc1?\,?}T? w@w?YC?5W4?X=?M ?),2d?mI$?b?5#{?{ )>?z3ԁ? i!-?{D>?q?o3?*???b z?Vf?)h>Wj?bj?k9?& G]?s,?Z;?@?b?9ngH?]X?zqm3A?w?~9?wW1?-ؔ?JlP8 ??zIџ#?tR6?ml:\?dAa0D?]Մ\$?S B4?G[~&?;rN&?0GMJ?#M9?s? oi+>Q_>-(>+9C>&+i>i5>lgw>񉔳2>Jk6J]>;p>NQ>֝ o>l"?h>֝ o1>N>:>Jk6KT>񉔴H>lgwh>i5o>&+i)>+9>-I>Q_j? oi+?q?#M9?0GMJ?;rM?G[~?S B6?]Մ\0?dAa0R?ml:\?tR6?zIџ#??JlP8$?-ؔ?wW1?~=?w ?zqm3C?]X?9ngH?@?`?Z;?s,?& GS?k/?bj?)h>Wd?Vf ?b z???*?o3?q?{D>? i!-?z3ԁ?{ )>?5#{?d?mI&?),2f?;}ٹ?XLMFH> >󎴭>Nn>]_#>]V$>T>2x>~-> >gϭ>_A><>8}>ZF>w .>>*>DŽp.>Tv0>7o]Z>7+=D?F(nm?pJ ?П@?*Q?6k~?D:?Q˩>2?]Pc?fp+?p:/C?x @ .? ,?j2?mU+?u]eO?kFV?!.i?yR N??>?lS?X6:B?.I?k ?UkG?P %?w?j(?{Ļ?Ͱ?>P"?IL??uJ?O-?Wh]Z?v#!?_Z?{DQ?8Pd?sؓ ?Hz2?`b)zM?d?r+0{?of>v?HD?+e?#(+?߆e?Ļh E?:/L>E+>␏;>Qwb>-Ġn>|d`>y>D.d>lŸh>oq>1>q>1K˲N>Vh>L>C$v>D1u>V >Č[Qk>|^~z> !o>JT>K{ ?6گE??#?1 aZX?>]ܖ\?L(zGd?Yj>H?dj7b?p8#?x#@??r9?&Py`?l?D?6W?ϝA,?"$|?¥?ȡ S?᩾?p?=F?vt?4S?}?O?u~?L? 7ƥX?dn?l?~9tD >pEL>Uhh>UyJ>Ъ'1>8ݎ >DE> f(`>Us2>cn\l >ag"P>4d#e>}>/>>də>bȖ>1>|PK>~K{,>*Q$>흽dLh>)È? Tc??` ?'я£?46?C=҄?R%%?`:%?j?zE%?s?b]kJ?AKw?$ ?C@i ?rH?,3>?Lb?5?ݗf? ?uO?K2{k?lb?U?!w?|47P/?x =ڡ?w&[?zf/1~J?Aݙ?2%?j04?c*?eIi?m5ż?ꂐ?f;?/'T ?G#O?( Py?yc?nǃ?~={O?q.F?T$?s=]?/p&E?s֗P?h?_)??T*fÕl>L• >6eWF>߹J9>Լ>Ȉ>_& 4o>f>zDF>$>:r>˯V1>0>N]1>p`>w,~>H&|>hy>a`1>cG_>h/>~V>FN>%.>MułD?!B?v)y?*\\?7bVa?F6?Ur ?c0C ?ppi+?z9%=6?9C?/jE!?[W?{)K?5xX)? x?IpTl?Ǘ3?;?85"6?)L.t? e?R ? 2??x??\L?MDk?9Ű{+N@>-Ս4>kq$>כ%>/L>æD<>">{UC>i"Y<>ٸ:>=>SҤ+>!Q>>82g>>CW>->%Ӥ>hԶ> X\D>֪ >y˗>h6:?Br?Lv?Ed(y?,??9ug]J$?HY>?W;?dy#Y,?qpE:h?|^?Yݎ?"(=#?5/ݜ]?x&N?[<?rX?9ԃ]?Gi?+DC?Bb|?+7z5?]|y?)@V?P\Z?qR G?|GnA?1;$?)q߹?G`R?֢??79?/~}?_:?y_?_$Y?qȊ1?հp?RU(? )?t4e?ƚ ?'?oID?=4?r?Oe?`(?e9?~d4?sȄ?h l8?_e?Sl0?G#d?<J6k?1R?%i^*`?3ra?.7_?nR~y@>Bh>>E.v>IP>с̬>.gY>WrR>I>!m>>N{I>oC|>}k0>q>e >އCR>`#|> 3Ut>)9>HN#^>Ȁs>֧i8>6;>k73k?9^[I7K?e`K?tc?,&Y6m?9L?H\q ~?W'@֪?d&DK"?q=G?|#7 pA?5t?N{?{;#O?1?#P?rz=?A>(l?=?3?Gnv?UWDw?ebE?k?W?׊L;?2hh?*;?1w3?*5qm?IAjg?=* _8?'j?j&n?C)R%?dmJ?S3,?]N?k?=5E? {K5?lXR?%S`I?щ ?-~1U ?;K(?NiR?Xr?~\?xW@?/ ?iI8?b$.?%ތ??;G?M~?` ?֧?D0K?fj?d| f?_s~ ?5GHuc?eWۺ? r ?!s?{?ݠ?2콩?~̇ ?z--?>?~L?s^Lcx?h@?]9G?P"?B>h?5`H~`?(d1p?" ``?CL?ɵ2y>JjP>%6@נ> #'>գ(j >n猳`>< >S>]s T>A.>- >>"X>NX>[Q!>KQ`>&0#>66ᴙ>DD;8>xB,>' `>rWh>ȷ%b>|#P>GuO>lGH>#8'1?0bQ?;?*ݷE!|?8\%u?F*/ƺ?UZHH?bS?o<ZF?xlMͶ?#]j?URZ?rN9??rh?W?S$? ?C"t?::7?M?8?q8^8?o? 0ni?U ?A$P?1Ӽg?[I? *n?b_?^Z^}?p?~Np?ñ? Y=? '?5!??38?8)?OB::?7 ߶?{~?<p?pNUh?,h&?WRw?'|?^/)?HȊN?*]kp>%S>q>*M>c,.>B_7ƌ>ybt`>^F,>>O>z]R>$>>Kt>0>me2>s>daw>;>5>oT>l>Ȉc>h_$>F r>.>&Y? GJG?mB?(,IчT?5mO6?C裢+3?R[vEu?`z6?jSMr?t I?Dn?L`??6g"?V-mjR?*2?Qe?3dl?9dOkh?yiv? LD?`O?g!E?©fI?]C^?,rj1?Lc'w?4 ?hb`Q?j_?z;cq?PA\??J? Ӹx?&e,%?H7*?ħ%?W>e?kQ[03?l05??0G(c?-1?Vw?+jH؇?Sϖ0?D*J@?I?m6?}jy7?֫7= ?GVv ?U.?(%?a? ~B?YM?90?x?Bx?0%t?eZk?Oe?1:҅?x6?]e`?~*?>??gض?۷\Q?}l?J?~5)ol?qb?cP y( ?THC8IXP?D?5N8?'e: ?\50? `YtM> ,0>dP>TRCx>Լm>T@W>@ 4>=,>oIN> Cd>g0.>~r>2Mf>wo>]κ>-(<>;> \>.IO >]mh>'Hn>;ܲЪ>,v>FW>)>hFi?]pԸ?:^?$*?26μ3{?@_KR?MK?Y"?e#>e?pM"?x]gO?bЄ?L:?pOh?0w/&?7@?8ٔ??>U,??a)*?E%?W,?jWv.?h?/;8?u?~>D?*?uhٛ?'?v#?uLb?]s|?XI2?ie?Gde+3?:Iz??G_?4|?*0?gqNȚ?D9?{_R?uI+T?S}&?w?υdG?A:h?w,?p??@RI? ?+?6?.!?>x?Xj?~J1a3?|=eV?}4?i}}?}a?=B?,*=?h#?%*GV?ѐb`?dLA?m5F_?O;?/W7g?ID?JEȺ?VC ?yC =r?k2$?]wq0?L֠?=2.j`?.{p? ^;? ?ޒx{>涋8>/>XIČ(>W&A>lғT><kx>Iţ>F|>,i8>4'X>GK>;_D>B{>kl?[>BFŚ>zޛ%>o[@/>X/\>C(>>ēZs>u> y >>觀Z%>I(?`Z5r8?J}?!2 ?-)bqv9?:7Ŝ?G46?S&?7f??S&-?]9@?RQu?vyq{?f)7X?`E!?S-I?\}?f?Ys-?9@FP3?&}?djU?zANs?w5('?xl?}W7m.?wAi?>(mjE?+~2?xyz?2Q?!?16?)l!?Ǔ?B?%Ǣ?zYݶ?WDڶ?|A?rV_?cn?SE ?B%,?3_&Ց?$ڛ?]-K?}O>(>o~>ܕ^Ao>&7h>Ĺ) G>~N>4T>K|>[Z>nn,s>|a>&>rK)>C({>Xg.F>dd>,>S"i>K6l?>j:a>+N> Kf>ΧQV>佞>|~?K8̾f? m9wL?Z?(%8?4:&?AIT:?Mq;?X>6.?d{=?o?w]T?[ >^?>Gt? !v?N?^ir?[&w?`?ŏ3zx?f?07?W_;?5Je^k? <\A ?dm? ?\.A?I"'?$?&ý?׎n\?3j??-?q䛢?m?z3X?y@p?}%??x/6?$^)?y%I?HR[B? ¿?A;?*?2Ө?u?$?VY5Β??L?2ñ'? ˺?;3?TD?r1?{z >@M@<>L_eE>Հn@Ǭ>~&h>DF>?[>s\ǼY>K]>XDP>7B>FCD P>L5vns>WvQ>xas>"ہ>@w>ސ k>Ti>.>͍0 > 'a>*m>3>8&>~???#z?0OC{?:N?Fg?S6qv?`tg熤?j351?tHhX?~f};\? S!:?arҬ?q?am]?nA:??0 0+?";0?ka?؁?%A1?d?d<8?b8?ʇi?_?黖a?gI@?dk1?Koө?8^?Mqe?=zid?.l? EvN?F^r?E`>>ETsl>ZK68>*-4>_q^L>>^ N>/S.>Ðb=>f\ H>m`qj >c($>{[>]0>U5И>f'>y">J4Bl>>*T>3>Tn>a^7>Aȴ?"ަ@A?Gta?|?){%?5?M?AFk8?N>?[ ?g]oL?r2R$?~v?8py?1N?BP?, T??@b=?YF?':?co?-?R9?\8?a (S?0&?9?k???}e/?w;F?Qt(4?n5?|vNX?r?!T?kV?ϏJ?SSJ?sΤ?D1?cep?e%t?dC?N507X?ua?;nN?&?CLђ?AqU?-EY?S? m#?@2>?<_%v?UMH0?}9?^?pD?ay?Q?|?BX&?3+q?$z "?_:?|{Sg>0 =,>-3>\\>Հ;pl>ym">u | >Ш >TM><*BΓE>Br5p>LR>pt >mcLM> u>{B>* 4>NM>p}p#>LW8a>%;&>ILb> K;w>W7>h>s]>#%N?3UuU?qn(?#{5OM?0Z]?<3K?Iu5D?WC{@?d\|?qD`n?~?8XI?΍E?@32?]?'A? ^$N?Ry$?< Z?1,?qN:?e55?i-F%?D5?e?cXKX?'bI?mj2?yBgx?"g,?Q%y?!@6Q?g:?ȱ8?t*?u;?u^P-?hqP?K?4 9LJ?o?LczCI?Nh8 H?V??^ ֬?Q-]?8 ?6=A?d%*v?]?{?[?m?c_?~o]? /?. 44?MOת?>??Dp?5h?N>?)ir? Y\?p?3rM+ ?P521e>˱>O">`-K>Rm3x>τ>MZ>/ D>]#4T>:Ԛ>ӀC>!/M>GC>!.ff>ӀD>:N>]#4(>/ DEz>M>τۖ>Rm3F>`>O>˱>521T?i.? ?!3I?/T.h?=?5d?Dp?>??MOס?. 40? /?~o]?c_?m ?{?a?]?d%*v?6=G?8 ?Q-]?^ ֬?V? ?ᅺ?y|8? kq?z7h?)? AT?l$Zj?4?۞a?v<3?g] ?t?]PEZ?ԭ)Eh?p&?iE?x[KM?k׮n?_<>囌?P「{?B#e?4?'19 ?8;rb? NNH6>RO> /E>4>iZ9Q>ʉmY4> ?y>5 ">$C!>_L>-3->e>:/>5%g>nxkp> L >lL[>Jq=߹>"xZ>P>|> >p>ح>^flR>qs}> J? 7hF?&`e?(5?60m?FS?U^tՃ?d7$)?oCY?֠?!??4?4L?BJ?RO?o?R\[a?#?B7?TK3? /C?Ά?}7M? }p?&?7/)?tܣ}Q?I ;W)?VY}b?N5??ȻFaX?׎? 4>?@?{nT2?֪R?UgJQ?yIG3_?{V?pi&ä"?cɁ?TTN:?F6?:]M]?/_BJ=?!2ڐ?͸?<>2k>aF>nb}>[~@>Qf$*>o9a>q (y>o9&X1>RalG>1>QZ2>p> מ">K>Z|/>s>t9JԿB>v_>VK>Ū^6>ѩWώ>||>@E@>y2?qw(\?(b/?"C偋?1(u?A N?Q}?a$Bb+?pH̑?[W?="V?jd?6[?5R? ?WF-;?L?Ry Zj?TB?4?|?ޜ߅+?:NО?sV{? ?q:`?`:?k屶?z~{?h?T_k?~w?Vj.?}(?~Dt?G2)?Xr?Ԡ1\p?ҹ?E =h9?JY?-?L+ ?Qܞ?Zw?ki?dш?$;Z?ZGM'?P?JrI?yn@fT?`yWڔ?=k,OJ">M> f0E>ճM>C%f<>PO>z.:rq>L>TiM<>S׿~>[>pd>L L>]~,>p8k^>ɼ1)а>StU8>f2g>I:f>gcx>>ʳn1X>p>Ǽ>3mFe?R,?{?2{-?+@#J?::T?Joͨ?[d1?j +?y Im?d"x?c8r9?eJ-?Jde?è ?P ?0d?- ?0?pZ?&S?Ԩ?4 ? ?|8WO?{Wտd?~hcDf?N1?%Û?$? ?#|23u?]̠L ?L ?W$?tЮ?e?P?BH}#?̼eR?*#+@/?oC!e?Abq?ğ7? fٔ?6{?fjFA?~88?{^}zcm?|wX~?i̱7+?򸐎ʯ?S?vWi&?ُ>mV>?>ڤmN >SX>q8>옎w>~>n<l>  V>zbG>(ȳ CE>8> T>^ŭ>3>9SM>sj>.>.+z>ۊŬ> VuGo>Ѧ`!>W7>ʹ`>߆B?hY8?ƹx?%y?4?K)?D$ᬦ=@?TLB?d*wM?r˸?$(u$?S*?,=~?*?s?)ڣ?Gkp? /;? 5?h!^?Y(s#(?]xX? M?zOu"?zho?yMp?|£C?(yg?>6=?[9??cƴv?d ?ǿ?*?joH?n8[? Ⅶ?3R_m?f il?cĂ?ۨ?SN6`?G'gdlZ? ?{9?ѷf? ݠ?FaSa?aA?i]u?>U3?;zlE?@!%?SH ?BJ@?e?g?jdi6?{i?U|? w]?h:|r?Ǐ??"AZk?/?v?TX" ?CQ?Pf;E?YT?l/?;s ?VB?}\)'4>?riG|?g9[a?[i8'(1?NHn?@Mz ?2]0?$ZFÜ?F?nk?ہ.b>d> o^>U$o>ͩDl>ćc|>âB>N>°>8MQZ>bͳt)> H1C> >fO>B2>KJO>濧>7;>٭bqc>}c>ԯ >ۄ>KVp>ץU@>=Ɖ>]\Jh?."?i9Z? Lj ?/eǼ0?=$P?L8Gtp?\U?k)b* 5?ƒ\a?ޑ?8`? 1? ?,v?,h?'jd,ƶ?d?@M-,?Er#L1???hM? 68?W*?+  c?s>?Ļ:?Ntcd?@??q&?{ ?Vi?,.i?x`J?n!X?bW;j?TEAF?E5z%A?6< >}?)*T˶?GU%? =^i>{>"M>'>{Ƙq>ǁ z>ŹJ>cT6J>?sRL>l,>8x˳>ar~>>S$.>Mnop>^xN>5>>=laZl>a4>D>IT>b=`>˂DR>7 >>`>Z/S6>'9? "2??'(Y?5@?DÀTK?SJ0?b'"bR?o1Cx?zs?5z;?p?z6?(1?&?V~?l?>i^n?ҟ$?v`dT?[g?[.:4?U1?&HT`!?tW5?E͈"?ٚ6?]i1]?`\E?.jk?3 2?E(?4<%?$4zJ?fԗ?5 ?˞A"?\Y?C?xw?f3m?Vo?phop?zMDB?o E? ?d˜?S?r ?ٴ@?E$y?|]L?PpB?sPS?f7z?YH)J?Jj?;,"?-Zi[V? KMM?C1?kqzz>I>ٽz@ݡ>m >}ճ.CR>W>, >`$I3>>Wi.>_8>C>>jr\>+Z0>p8<>y_^>1GJ>`xF>|& >JAt$>:s|]7>i>Bg6 >Փ0 >"G8>tB>C?:'e?e0?"0}w/?/ש?;ط*?IX!t?W/9-X?d>r,X?p5?yJ?Lʱb ?g\? } K?łӪ_$?0~0ʒZ?D?n?]tHt?wYY?Ԧ?٧sn?;CF%?8>?7i?Pl#?¼ԡ?&GQs?]F?R3"T??#]?q4!?4?P? ?9yP?N??uO?qnV'O?b@?C?+&?C?&$[?Xˆ?Fuy%?-D?J!?)Nc-?! "?;Gv?.?sE?4R?0ۺ?urd?UY'38?Ihp_??Ojz?( i\?edVz?XO*s3?-&b?c)V f?8MX?pnJ?e??A|g?mÇ :?A='?56?wB ?jR ?]6刌?Nd ?>楎S>?0_i?" o`H?N?р>,KV>D>=Wŝ>65P;>*hSzk> 4#>Rl>q7l>0j.̥>NM>ǝ /I>/ J>J+ի>><)D>E'\L>ϳ'>۹H8>pD>T1%$>̜8xЭ>LM>b+>Dd >?L$t?dto?dj?(4?4_;?A^ ?I=?NtEK ?Yx-\`?dxr?ol?wm*P?k?)VkA?aJ$?gTc>ǖ >ّJ M>Rg>OgN>ğ E:>yۧU>D}>~Y>Ct>"n>JT>^P?s>$$>Nl>3I>z>5-f>&Z>Ǒ(p>52>,H>M`>qJ> g@?˂)Q%? h?֨+?&)5(?1";hsP?:R?EVD3 ?Q[y^EH?Zﮟ`?d-=d?nM?vS*,?e?9*;e?TJN?8?fF*? v?/? ;E?}i?i ?0v>U?=D?|Yp?ԫd?ʍH? ?y?)F?zf3?T?+@W@?cԋy?;>?+?g_e??b? , a? W|?u(T?7jA?.a?7 F?j ??.J kZ?Ac*?B ?aYX?;cO?n ?$3s?+t?{g>C?rx?ui2O?&a?Qٲ?c,?(xy?)?je?/5%? ?47n ?"kf?e]%?O?y?_?å?vuҰ?(?z _a?mi|0!w@?`A4 ?P~uا?@x/?19Ck?"ϢD?xP o?*fy>6Jb$>ύ>ْO\>b>(e>2 X >#>I^G5>WYrk>?>u>{n>{nYH>*kn,S>KF*>~ȗ>X>YvJ>~>u\ɳ>&&ä>-<>윩Q>|È?5H? hX?cƆb? $[s?(NÝ?1~n-T?9#5oP?B B?Jj^#0?Sh&l?]O/?f ")?ppO?xGr? "?c ? u"?-B?@$?s]&2\?l??t?/J?⫙o?}W?_طXL%?e]"?q*̒?d:Βĺ?k&&?Sp8Čf?}B1?g푑?0a}g?$?"7?7Էt?K䥺?Z}?YGF?cƐ?kv-?E]@?`~i? ?IN9?ݬ?c&?{-?SQ?//>?+?Kg_?M+>?Ki?g0n'l?7^?w \t?kkI?]d!R?Nc?>-p?0*L?!%n?-4ǟ?gTS>$>{fp>p\w>ɮHy>~`3=>>>ޭpu>3f@!>rq~MN >Q|_:->M^>Ï>{>Q'&8>979>snh> l#>ʲlL>א ,a>&_>m">ܳC?:F2?C)?= '?dex?;"ڮ??f/OS.?svZ.*?fTtt?X>8?IrԔ5?:k=y?,W?~>Me?DY>֋>?#>N%!>֛P/5>I%j>u%<>Fty>O:R>:p>-R>*6d*u>>$->ZP>uK>ʱu͗>̬>C)>>Jy >ݜ`9>1auY8>[U>?}? Z 8?,0?"A\&?*L&?3.@̠?? \>v>ma>gwh>FH>]fJA>J{>.>sM>H>""4Z>F"" >["\>K> >z`=>S kk>>F>K"H>ٹV>zF6>b:RR>uD? m"y?>?"?,-'=?6H)њ N?AOI?IG'>/?R=Xz%?X8 ?^ `?cQƀ?gi H?m##qnx?rYB?w޳/???k, ?ճ-s?O9?.m6B?en#?4N?Zl?i? q?/օ?l,?2@Z?5GF?އ?'D?2Z?|POo?}W8?rc?LcD?qDVn?} k?:,?KRm?!zU!?2t$?޳tf? :t?oe?-?tR?򙒔?CG?V9{?S'u?p+9?=LJsQ?pe?#Rb??S{?u?V K?b@,_?tCVi?+Y?+x8? ?&^?(Ν?r?):u?w-Q?oFo)?dOj ?X^f?KB?=D,*?0^8!?" ,?<까? jc/x>讦/v>2} >vJXI>ƒД0>,{>7A>v~; >Լ->1,>0jO>٘>С >5vUW>xWJ>\(>ޅc]>A|i>>7]>dO`>|Y H> r?2zv??!,U?+&?6j~?B;Y?N I7?WqH1?`P ?f>˘?lŘI( ?q k?u*n ?yG\?~cT?Wh ?Ii8?Clg?a?h ?5?S-$?Dek?E|W}?贈\?N\9? l۴?ʝ q?fs5~W2?%=e??hqAc?p^*?~L?!ն?f?}G5?{r?(#ke?$?z>d>5v>r:l>ؿ&>iu>@>P;Ξ>B>:"q>e>^7'>>_W>^7&8>e4>:">B2>P< >@>iv5>ؿ¦o>r:T>5v>d*??$_?(#ke?4k-> ?Ao?Op#?ZU@?cQ?l̞=?s(?zJcV?b8?BX?KCB?-B?.,?w:l?yt?uD?fn?YH?o+?-ʚͤ?C?|%T ?Lx~?b?*1?EL?0z?}?L? 6?u~,P)?? ?OxZ?sJ?')?g1?Hel?s?rc?UD?Ct?);?,B?{r˘?`P?WqH0?N I7?B;?6j~c?+&?!,ݬ?#?2zv> u>|Yl>dOd>>7>A|>ޅc]Z>\>xWc >5vTP >С{A>ٙŞ>0~>>Լ->v~G&>7Aߒ>,>ƒЌ>vJXk>2} >讦/6>c/̩? j=(?<깇?" ,n?0^8"?=D,ܯ?K?X^b?dOj ?oFo.?w-Z?):u?r?(Ν?&^? ?+xGF ?Ns+?&~|j?0]Bl?d?1[[?:Q?5?w޳/?rYB?m##qnP?gi G?cQƀ?^ ,?X8 ¦?R=Xz?IG'>0?AOI?6H)њ ?,-'=?"?>? m"{ >uD,>b:Y>zF6#8>ٹVc>K"$>>Ff>S kJ>z`gU>W>KTo>[!>F"#Y>""32>H>r>>J&>]fJQ>F>g>ma>ʞ>? ? J?tȺ{x?'٪ɐ?5]3H?DB26D?S)a٤?a]Ը*?mD"j?wu՘?2?Bv:?rt?d? ڴwP?"pj?~U? 4? p*?؋*,?\[?br ?+s?ԮfI?z6$U?]-Y.?;? 6o?JL?ES J=?WZ?Dm?}OM??QGfe?a?Z&? v-6?#? e.?y ?`?=?B?Z/Ԇ6?sp:8?0?͖=?簐uz?7вH&?=#?{ڟl!?{`?#?|[ ?*??\?u?a ?kzՎ??yJv?M?u+mf?b;(\?$8rb?&D9?a ?q2ĉ?79J ~?V=?r;?x?e/p?q #k#,?g#;,8?a{Sl?Ze?Uy=| ?P/դ?J"}CO\?CY?e>[U(>1au>ݜe>Jy>C)>->E>ʱǘ>uKx>Z>$->y>*6b>->:>O:>F̴>u%>>I%SY>֛P/K9>N%>?#>֋?DYe?~>H?,W?:k=yP?Irԓ?X>8?fTtt?svZ.)?f/OS0??;"گ?dex?= '?*U~Թ>?VX)a?i$?ka?8R?MCk?o^?_17?Ԥ#e?Դ,=C?CK*?r+?D2e,q?|bK1?{sE ?R??/r^?ԏA? A?}RR5?RW; ?NYi?̜З`?1Fh?2~ݸ?_t$?ە?2U?p;-I?CD$?Z}?ȵA^?47O?SĉIC?}b&X?y9!.?y肜?}N?"ʍ?qVK?/H ?vPl?y?m̀8t?_6h7?7+?:O?v*J?'hS?$y%? 8(n?,w?wĪi?h}4?d?5,?v|΢?nq?cy2^?Zة?R8?Kuː?D5y??x6E?7eu?0RK?'{d? bd8?*&ceV?C- ?:F6>ܳCʄ>m#L>A>א ]>ʲlL> l5>sn>9W>Q'->{>>M^J8>Q|_Q>rq~K>3fAN>ޭs> F>>~`3U>ɮ&P>p\̇a>{fV>!?gTS?-4ǟ|?!%lC?0*Lw?>-?Nc?]d!R?kkI?w \s?7^?g0n'l?Ki ?M+>?Kg_?+?//>?SP?>-?De?b-?R~F?W)$|p>윩Q(>->&&>u\>~>Yu,>Wx>~x>Kt8>*kmu>{nYI`>|>u>?>WYrl>I^Fk>#y>2 u>('>>ْO>x>6J`?*eg?xP n?"ϢD?19Ck ?@x/?P~uا?`A4 ?mi|0!wD?z _a?,?vuҰ?å?_?y?O?e]%?"kf?47n ? ?/5&?je?*?(xy?c0?Qٶ?&a?ui2[?rx?{g>C?+t?$3s ?n?;cP?aYX?B ?Ac*?.J kZ??j?7 F?.a?7jA?u(U? W}?,Gׅ'??b?g_e?+?;??cԋ~?+@W>?T ?zf3?)H?y??ʍH?ԫc?|Yp?=@?0v>U?i ?}i? ;D?/? v?fF+?8?TJN?9*;n?e?vS*>?nM?d-=d?Zﮟ0?Q[y^E?EVD2?:R0?1";hs?&)5'?֨*? hP?˂)Q&p> l>qR>M`x>,H/x>52ΰ>Ǒ(oX>&[>5-f>K>3Iw>Nz>$>^P>JŁ->">Ct9>~E>D|tF>yUj>ğ F,>OgNۛ~>R3G>ّJ >ǖ>gT`?Np L?!D?"]g?1JDqsQ?@z?P~D?` 5`?m<w?y@&?p2]?0Z?CB-?W 7?eL?9lђ?UwF?}6?z8?̂B?+ea"Q?.?2%t?Q̥F?P =?c㘠?1jٻ?[HH? 8}}?T?\u?|Wx ?BFH?;a5?d9E?Fe/?7?3?.b?RaF?#L? 1V?-?X8?=?uO?b?BR}?3?ɒ:? 02?R?\i ? 9ڣ?*Nى?P?4?ah?e< s7E?9b"W?)sF?fS=4?oC&r?$3{ި? ~PՅ?zj?L[O?OB\?}lBh? >Dd >b+>Lc>̜8x>T1%>q>۹>ϳ'>E'B>>J+,>/ OT>ǝ 0>NM(>0j.>q7g>(> >*hS >65P>=WŖ>Dʹ>,G,?·??" o_?0_i?>楎S*?Nd l?]6列?jR?wB ?5?;CF%?٧sn?Ԧ?wYY?]tHr?l?D?0~0ʒY?łӪ_*? } P?g\?Lʱb?yJ?p5?d>r,X?W/9-X?IX!tP?;ط*?/ש`?"0}w/?e?:'c>CÀ>tB0>"A>Փ0#`>Bg6>j#>:s|]+H>JAtS>|&>`xF>1G.>yv>p8<>+Z>jr[>C>>@>Wd>:>`$J?>W>+>}ճ.s>m|>ٽz@j>-?kqv?Cһ? KMd?-Zi[Vx?;,"?Jjn?YH)J?f7z?sPS?PpL?|]H?E$y?ٴC?r?S?dš?> ?C?w?nƈ?(/?b|?*?f\"kD1?o;Z?|$%m?(ؤ ?Au?? 7/?Y(?p?\B?c4}?m4 ?C4¸?]f?".'[8?i^l?l?V~?&?(7?z6?p?5z;?zs?o1Cx?b'"bR?SJ?DÀTK?5?P?'(Z?? "2>'9@>Z/S1`>8>7 >˂DdP>b=4@>IT>D>a->=la(>6 >^c>Mno5<>S$ъ>s->ar>8x>l(>?s7>cT65I>ŸҶ>ǁ zIN>{Ƙh>'>"B>{D? =TP?GU#p?)*T>?6< >}?+  `?W*? 68?hN???>L/?Er# 5?U ?|CNh?1 ?*w\?,5?m/,?@?ۨ?QCV~?-;?r|ȼ?WHC?dX*?!ƙ?-U??ev??=r?Vd?]ڙa?Z AP?4Ă>?@ND?k?Gdu79?nO?)?zkM_?)?,{}?ojt?P|?W?!1i?7\?τb?0={?/C6?w턊]?k)b*]\J>=ƅ>ץU°>KF>ۜ>ԯ X>}x>٭bp>7;>)>KJO}|>B2|>fҋ>p> H1>bͳt}>8Ki>°ʅ$>y>á>ćc>ͩDm0>U$> n|>?ہ.X?F?nP?$ZF?2]0?@Mz z?NHn?[i8'(1?g9[a?riG|?}\)'46?VF?;s ?l/?YR?Pf;H?CQ?TX" ?v?/?"AZk??ǎ?h:|r? w]?U|?{h?jdi6?g?e?BJA?SH ?@!&?;zlD?>U3?i]u?aA?FaSS? ݠ?ѷf?{7? ?G'gdlR?SN6_?ğ7?cĂ?f il?3R_m? Ⅶ?n8[?joH?*?ǿ?d ?cƴw??[7?>6B?(yg?|£\?yMr?zho?zOu"? M?]xX?Y(s#%?h!_? 5? /߆;>ʹ>WR>Ѧ`!> VuG>ۊ >.+y>묦>s>9SM2>>^V>pA>8'>(ȳ h>zb_> r>n<w>>?>q>SwT>ڤmN>?>mV?ن?vWi? cP?-+z[?:3 :]-?GmH?TJc #?aD^W?m#"?wH^?-?͹B ?Hp֘?~U?H?ta?~ݣĆ?9l? =n`?t y?!ȖL?8?Фvc?K|?4ԀV? ?#`?cv? }?B%? eX?k7 E?]+O? r?S=?򸐎ʬ?i̱7'?|wX~?{^}zct?~84?fjFA?6{? fٓ?d?Abq?oC!e?*#+@.?̼eP?BH}!?e?N?tЮ?W"?L ?]̠L ?#|23u?$? ?%Ý?NC?~hcDf?{Wտd?|8W\??4 ?ԩ?&Q?pZ?0?- ?0e?P ?è?Jde?eJ/?c8r9?d"x?y Im?j +?[d1?Jox?::T?+@#Jp?2{+?{?R,޸>3mFf>H>p>ʳnh>">gc>I:f>f2@>StV>ɼ1)8>p8jw>]~->L M8>p`>>S׿3>Ti>L>z.:V>">C%f>ճM> f0 >(>J? Μn?|:?'a 4?4G?A5{q5?N ` ?Z@_?gI~?sJe?~?%?=k,OB?H>ڑ?NߧF?Vj???nb?_u ?`yW=?yn@fT?JrI?P?ZGM'?$;Z?dш?ki?Zw?Qܞ?L+ ?-?JY?E =h8?ҹ?Ԡ1\s?Xv?G2 ?~Dt?}(?$>j2?6Y?J3B?t?2_W?g*A4.?F,5F??B8?yR?n͖&?ogm\?'s?Vy54>@EbH>||>ѩW>Ū_#>Vm>v>9JԿ]B>ts>Z|ٯ|>Kd> >eF>QZM>1P>Ral>o9&Rg>q J>o9Y>Qf|>[~>nb}}>aF>2k??׎?ȻFaY?N5??VY}b?I ;W)?tܣ}Q?7/(?&? }p?}7M?Ά? /C?TK3?B4?#?R\[^?o?RO?BJ?4L?4??!?֠?oCY?>7$+?ᅺ?k?x}?O#g#?laa??S16?h?28?jd6?⠗F}?3x-?zt:6?miQ ?"Ғ?Fqf? Iv?δ8r?ğx?1YQ?~?J?%U Mh>qs֏>^fe>حؚ>p1> Ҧ>{>O>"x2>Jq=&>lK> Ll>nxl>5>:.>ef>-3>_z>$ь>5 > >ʉmY7P>iZ9] >4 > +.>R ? NNHN?8;ra囏?k׮n?x[KM?iE?p#?ԭ)Ec?]PE\?t?g] ?v<3?۞e?6?l$Zk? AT?,?B>h??u20?,&ʷr)?]o?gZ E?\7Xd??~1?O?nH4?'Ky?~qx?ˤj?LMdQ?N? 6l?z7=? kr?y|;?θb?*}?FSKE(?\k>?VWZ?? I?^P?\.?GZ? tQJ?l?he1?~ ?A,?U`?w(!?b?Ma|H?~W? E?z?)?l$2?˩td6?_)?l}(j? fJ?|Ţ?n#Dl?`GZ]O?Q)D ?A+?2˿ L?$(AM?G?J?HM>P >9G>IM>/]4F>#$>m;;>+>;>bT\>^c%K>>7;*>z>JZ>7;)>>^c%Kw8>bTh>;a>+x>m;>#$ >/]4F>IS>9G>P ?HI?G?J?$(AMl?2˿ b?A+?Q)D ?`GZ]O%?n#D\?|Ţ? fE?l}(h?_)?˩td6?l$2?)?z? E?~V?Ma|H?h>b?+c?"_?mJZ`+??=??FSKE*?*}?!?1en?,ۆ?h,i?}W-h?e ]C?US?M?Y7?P+/??k"H?ļc%?8۾Wf?k0?좨 ?ZǷ}?k??T`i|?nMP(?ex?}d?r_˺k?d.U?Ua8P?Fza$g,?8;9?,?*?_hxP>J>}hN >̵>.ޒVv>!_ϓ>j>Ep>&O@>6kQ>ͤ>k_7>j3>0>Z> m1 >0 \>|6Xn>^>2S>ݬ>1>&+(>c,؊7?P{}Z|?"G S?*gEQ?+X?; a*x?K )?Z3q J ?hH7X?wb]~p?A:?Ӯu?8 ? &?e?x+??[?nW?V/?b?Ŀ?!h+H?@ti&?R~:? P?kll?IJH?nj`f?=?[̇?צ?M)?ߑVΕ ?f ?^Ǝt?k@?Z,^?w xq?|Kw?WL?J?ᳺO=?!,ж?r?+*S?R(}<?F;? V?1? *Gѧ?6hr.?f?P@P{?? +u?#}?y4?eN?4 2nt? #Im?$Ae?16uP?Dz: u?9R?C@Y?+Z4:?sFo?3?Ƭ?$-?&h?NbS?^9? o-l??v`~1?ijuh2?[T}?M$ֱ?@?2Yy?%4%W?(a3:?z;R>P8XH)>S0>᧫z`q>"4 >ĵ>aA>':>6'>Q7U>8?>z?>v:>]>fL>h>ή>zCA>KEN>W_>ӰŰ>X>'>'2x>f=>1۸?1r_h?'z(?$yԆH?4̢^ ?DvkoP?T^s6#U^?cy ?r{mW+? |?E?)?֯?`X'?gJh?NYm?*n0?R4?6'bH??uh&?8ck?&V?F3? @? f?XfXxb^?1?3}?(?Y?pF ?/b;[~?Nl#?҅?*R|?L).ҟ?j y?$I`u?<.?}(?zq^?|)q/Q?Vj?sh?]{?,?"2?'e?xB? 7$?qo?_kI?eH?nÈQ?|2?H?)9? ?ӟuY7?D*r?Q1?j:>9?y?#ŹT ?yШ{?Q?%G^?|J,?. L?ku=VB?E ui?{h?px?bS?SF,?EsT?8|[?+1-|?ANyp?o\#GT?0pb>5@>]koV5>؋|>&G>/>8 >Mwn>p >R'C>++b>atK>>ق o>DZ>A>N蛍>@PY>}-\ >AE"L>CO>Cgd>SlS>E><9,F??!?lkhXKh>W&>++G>ne18>Vբ2>VLbQ>s2O>q1>d1>Ƈ~>b>lT!+>L,Lw>գp>A_a>>w\J>R\&>9d>+>o D>7\i>ҪK>f8a >z<0>=\i? ?֝p?&adFy1?5Ā?E'2?UP,?d|?rU*N?ǖ?ʑ}Z?9?u0?򴫙R?)^mc?W<@?6 h?~Ap*?֤i䮎?*15k?X/G? 5to? j?h:N?88?YJ?Xwx?Zn`?xY4{?䖫:2>m >þ>St>. w؅>$UWƑ&>M*~>UJV>لW>l]'>S>$ #>ER%&>׻>c7kMO>u>#灂>[0t>BD>]"Qg><](>ϣ5>->pܯP@>:.?}?EzEf?!.}?0u`?>]?M]5?\50?i/`?vcSyx?U?W9Z?cq#g?Ɇ\?ጷg1?dk[{4?؅ .?[V?+?'x?Z;_? ?}-u\?}ɑ,?/c?%ˣv?BC~?V^?ezF?46v?^)?bψ?Ty?N? ?yj?.g? 6^?)n?mgD?yH?bC? q?]?I7?Kv4?P/p?Rҁ?}?o W??k2?i^ ?יq?.?r=:)?8gWJ?Gv?3r?\wJ?Uka\?G?/'??;_?s;Q?b_vs$?)l\K?ĝQ:4?"%'R^?Xb{*?o U?O_x?n@??Rda?4fk?x>x?hp ?t$~?gE'?Zc?Kx@rt?<k_@?-lr3߳? F?xƪ!Z?y1M>_I\>Π%$>ֲ9E>w%x>+5>1G>bm^6?>DeH:>t>RF>T>">D;>{:>F̋~*>K9I9}>Ų .rH>%k( >J >«8>t)m>DJ>ZJ@>œ&>/O? nK`?c?'? ?5SB@?C==RP?R^!S?`ӭH?l`H?v?x~?FS? 3pQ?)gt?Ő^?kȀ+R?K]~?nI_?;Jt?xm??izb?F-j?-?;N?I? w(xX?0 Ʃm?U[0?LUt?uXB?~I0?]3"-?=z܋?0`?)E?6~$??|S#X ?Bjz#?!1\w?yp_ T?iM|?o it?z#H\\a?n6?`1xe?Q(NS?@~Y?1{c?"y?.l?,T>ᾧ)b>wdEb}>y+/>G]ѡ>'3?7>_i_>LJ>u~QL>' >5+I>PV!>,>6!f_2>^>Қ>c!Qt>]r,>c_)C >E>4>BT>)܄ݡ>phCP>G >ՙ*wx?p?tN?|3ה?v -?@eZ?+:&A?ې?l̕e? ?`]j ?N=v?o?yo퀒?$JE ?a=w?[G7?LG4?\g*|? /?xf?}c? N? ?+=|d9)`>Tu>"I~rZ>R>W,>:l>3_> ⮀>by>fm*>ɪB|>/WIU>&P>./&>6؊:>8->iM>*Q>۝gm>•A>z.zp>kL>cAP>{ID>8??k?/oS?(g:`?3B?@.'I?J%t`?U `?aX?i*2X?qd?w -d?~Z??4+?r UЪ?V8?!-?xH?(+?&r?͖o?a>>!<6>kK > ;/Ḏ>͟aR K(>N5> B6]>K>5+͗>-t>%:3E>S>D`,h>ǒ>x]>"Ҁ>>7zA>It>>p0|>S>v)jS>k&@a8>$3>G4(>#-g?a9K/`?S7??& 2?0;?F?9c<9?C@8u?M[>Do?UࢧK ?`8?fuvP?o?uŠr?|QAT ?RI@? Fؘ?a#X7?[vI?\bhB?(U ?h8?4?_zկX?u?j[P?/4 `?z?G@f?R?~gI?0#?,?A ?1V ?RՍ?Xw?R?GL?iߑ?T{oݣ?g]?Dt+?~&ms\?~&Y@?=R?y9?x,( LL>|`\h.>eM >AĿ>yl>>!f+U>y :>jtAr>f>J]h>O_>T">7 >S^>s_>lmZd>>EJd>ĔGp>f4">s۲">V3X4>ܪ ]x>xtf?@?3=?[P?"6?*?2Q#uِ?9sK@?A?HCgP?Pa?Wf}p?`.Y?hY?p?wƧ?i ?963_v?4`\?&?66?wo{?PT?[h?T\N?lէ?s;'?Vה^ƒ?O+=ˑ?sR?M+?%2Y6?__F?ڴ?7Nؕ?}?}PwK?aK>?y?GRm?B;?t2?T\e5?N!z?5[ ߂?HԬI?t֭&e?b8?hߛ?Qʃ(?"*Z ??4pBI?ڨ,O?vMel?3wp?{9?xj?x㟤sL?|$? O?Kc ?@j?Qf?*wI?o?wu?G ?? ? ?|15f?ڜ1?̗O?? g.X? j0?r"A"- "?cd@ $QV>椣_t>Ʋ6>jʞK3>Q0>Km0">nu@>i T>[s?>.>h>mۓz>]P%>)Y>^5>k1>kLVt>j>u>&=3>فM>FR1*>{]20>4?3?k5r?t?#9&8}?+Zp?3;7?:xT`?AyX?FapP?Li _= ?Q Fd ?V2x?_;e?e׍?o%>F8?vnfű?B&n?Ц>A?^?rg 1?An8?k??Z+W?~-=?71Z?ZZZK? ˹?#"?q+?!iW? ,?% d?1a?+ ?|Z?xR7?xGGɈ?{2x?[ѐ?FR33?p4?yP?^m?`Z?y,6 ?7%Lo?ڿu?Nj='?bA?I?}=!?Wz?Iڴw?fXu? h}?@?0?j?`?&(?s(K!? q(?z~g?n 9@?`C7X{T?P&YMN?@z,tX?1y;?"D W?%ư?nD>/[*><ؘ>ؚ>|,I>pp><.p`>skJT>n >r1_>Â>u0&>{{|><>6r'>'>4dvَ>2>8'>8k\>- ^7>ꢀڨ>R?22K? {Ŋ?I ?%GU9ϖ?/ I3?7tC?A3!?G;g?Od0?Syր:X?WSn;?[w!@?`S! ?d,-p]?j,+&Z< ?qz?'? ?y.?<v?~/j)?z$Go?yv^'?},?K(?,Ȱ?ԵZف?T?&{? 䮕?+>v ?񾣆?.?Z?gT?p ?? V߾?g?ߠ*?'y2.?9 0?"?CJl?s v?s?rU?%*{'?tҸ?'<o?Ǣj?X,N?$3?:=?<}Q?Q%n[B?w)[\?m@]?HS-5?>?a}?>}?h?s;K?fR[?XP7?IAP?:J?,<=?/06?M>-lw>A)Oc>>8>wmM>Dp>:}׆>Ubm)>hF> I#wN>Bz>* Q>in=8V>R6>[>?Pk;>!Z@>;e^ >l$>=!o>܋B8>>?ӧ?p?>Q?%y?1>#?;z&`?E ?P`y?V f?]o0?bv4k?e_ 0?i;0b?l]1?pf6L?sT ?wp*.?}7*,?`ۻw?"/=?')s'?ⰌN?6#氣?l$T?#i? tR=E?)a:?kZ?6~9?Qߪ?m0X?%]ă?EB`/?J=?@&?LD\?&l??\kQ?E)t5?{Q?ͮ|d6?ړh?p??qTc?{Ev?R?3锯?n(?@N?EeeA?i7|?uTxΈ?jsB?_U?Qx ?Bl */?3)H?&(ѵGJ?!.?:i>6Օ>lp>4>O>IC6>|P>Fidy`>:)Ř> `y>py_>^f>-Vl>}4΂0>F%>K;>\>_N b>>q> uiU? ,,N|?T4?$g?0wx?<=(?HI?SŽh`?^YO?e2G b?lsn?qO,?uLqe]P?x sD?zd ?|u^C?<?b^.??Ev?=x]?V((?o;{?Bm?8|{?-;1T?<*m?m?Lɷ?{86?M'3#?o%?DefK\?LOt?3@!?XrXp~?4J?,h?N0s?Rz9?}R?bub|?ie3?ק?P?"F:?)y? `6J?] ?Ӷ ?״?gXL? ?@#?_]*>?qh?! |?s#VcE?_?yl`>m|>Px$> ]>ə` >S׉j>R>" Eq>I6r>1%>*wXN>>*w>ʅ>I6r\>" E)>R6>SU>ə`> ;>PxR>m?yld?D? >c|?,_L?9*4Or?F«ބ?TD۲?`ޫ >?i.?rژ?z cE ?" ?ArA?s#VG?! ?qh?_]*>?@#? ?gXL?״?Ӷ ?]? `6J ?)y?"F5?P?ק?ie,?buby?}Q?Rz:?N0s?,h?4N?XrXp}?3@"?LOz?DefKc?o%?M'3(?{88?Lɷ?:¦?<*m?-;1U?8|q?Bl?>;m?Q?,sp?4?z#?ZpՋ?nd;7?֢Y?p ?@?'?|ޣk ?\c ]?ǩ/ ?6\zh?saj?o ud>q>>_N >\>KN>F%S><å>}4΢>->&>^ek>pyA> `z>:)>Fidi#>|+x>IC6>>4>lp>6Օ?:i"g?!.?&(ѵGE?3)H?Bl */?Qx ?_U?jsB?uTxΈ?i7~?EeeH?@N?n(?3锵?R?{Ev?qTc??p?ړh?ͮ|d6?{Q?i>*?Gߝ|@?Jh?vL6?O?6?c{O&?O;^?5Nv?aXS?1*&ze?qM ?_??RT ?@ ?,6?·O}?}\#Q??n;K?ԵZـ? ?s~{?E)t$ ?%y]?@ ?ǜ?ӧl>C>>܋B>=!px>l$>>;e^1>!Z>?O>[ >d>in=9Q>* >Bz > I#U>hF>Ub8>:}>Dp_>wm.R>>8>A)R>-lt_?Mz?/.?,<=?:J?IAP?XP7?fR[?s;K?h?>}?a}?>?HS-6?m@_?w)[\?Q%n[D?<}V?:=?$3?X,N?Ǣl?'<o?tҸ?%*{'?rH?s?s v?CJl?"?9 0|?'y2*?ߠ*?g?? V߿?p ?gT?Z?0?񾣆?+>v ? 䮕?&{?U?p4?,Ȱ?K(?},?yv^?z$Go?~/j ?<l?y.? |?r>#?c1o?uGO,p?p_`?ybHA?ܣSM?蝎$P?5C?u?f?~3?<Ųd?Nbm?c?l*|Q?wDB?qz?R >ꢀن>- ^>8k[>8'X>2/>4dwL>'>>6֛>{{U>u0( >^>r1_8>nۢY>skJD><.p[>pp >|,,>ؚ><嶾>/[?nB ?%~?"D V9?1ym?@z,tX?P&YMJ?`C7X{W?n 9@?z~g? q(?s(K!?&(?`?j?2?@? h~?fXy?Iڴy?Wz?}=!?I?Y>b@?P\?dޡo?}x?y/?yLQ?}tޜ?ܜw?̜1?aTsע?T?ϛ?h Ay?1?A?B&r?vnfű?o%>F9?e׍?_;e@?V2x ?Q Fc?Li _4>{]2 >FR1/>فM@>&=>{^>ji>kLV@>j>^5$>)Y u>]P>m۔N>.>>[t>h]>nu*>Kl>퇭>jʞK>ƲɆ>椣_\p> $T ?Qk? Tޡ?$'s?3k03?C;%?p?S2jd?cd@B?r"A"- "? j.? g.X??̗O?ڜ1?|15f? ? !??G ?wu?o?*wI?Qf?@j?Kc? N?|?x㟤sN?xj|?{9?3wp?vMek?ڨ,N?4pBM??"*Z ?Qʃ(?hߛ?b8?t֭&f?HԬJ?5[ ߄?N!{?T\e6?t2?/4 `?GRq?y?aK>?}PwK?}?7Nؕ?ڴ?__A?%2Y3?M+?sQ?O+=ˏ?Vה^ƒ?s;'?lէ?T\N?[h?PT?wo{?66?&?4`]?963_x?i ?wƧ?p?hY8?`.Y`?Wf}p?Pa`?HCg ?A?9sKp?2Q#uـ?*0?"6?[?3=? >xtf>ܪ ]>V3p>s۲0>f4*>ĔGx>>E(>lmZ R>sOu>S>7o@>T#!>Oa\T>J>f>jtB)>y >!f >bG>>Aľ>eM L>|`\U>,( N?rnuC4?n?%(Mz?4[;?D]`D?Uk<֚?e \?s<҉?Ѝ ?y^R?#nfx?qW???]Q?Blތ? :L?fn?|;? M?@?`O?=t?K?!2???[]|?8?;G?Ȓ?%ğO?m?RIDo?C@8u?9c<8?0;?F?& 2@??S7?a9K-0>#-i>G45>$3p>k&@H>v)jS>Sʬ>p]>It>@>7z\>G>"ҀZ$>xMV>Ǔ6>D`.q>>%:->->5+͖>K֠> B6>N5>͟aR > ;/}}>kK}T>>!(*?D'?UlHi?e&?s2)?Z8Ѐ>{IY>cA0>kL@>z. >•%>۝f >*Q>i0>8.>6Q>.0h^>&Je>/WL,>ɪ>fmӄ[>b 5> ~K>3_U>:lj>W'>R>"I~r\>T>d9)B?h?Fa?% 5?3 ?C]k?ȘN?cf=?qut?gVA?Rl?:@X?Cd?=Z)?Sy=M?fəR?o?wӰ?V xZ?:X-q\?mp?`˿z?bH>?ΒD~f?.u8y?%d? 2?Wʰ?w d?WJO??= ?gƄl? ?BX?M)b?bG? e?0?ψ(?P?ƈ]M?W_fH?32Gt?-?͒E@?7?VJeI?RX?Yj?T_w?y_?+=|=? ? P?}c?xf? /?\g*{?LG.?[G7?a=u?$JE?yo퀐?o?N=v?`]j? ?l̕g?ۘ?+:&J?@ep?v -?|3׈?tN?l>p?aJF ?T3bP?GV N ?:^7?.^=`?!LK?)?ՙ*ww>G>phQ0>)܄>BT>4g>E:`>c_)@>]U>c!#P>Қ.>^>6!f_>,*>PV]a>5s>ꀋ>u~Q>Lm>_Ȩ>'3>G]n>y+.>>wdEb>ᾧ)j?,|?.l?"yo?1{c~B?@~YU?Q(N;?`1xe?n5?z#H\\b?o ix?iMx?yp_ R?!1\w?Bjz"?|S#X ?6~$?ξM?+ !?flә?󛔕Y?bC?[[ט?s?Cz#?鯈c?Wl$?;a}?R+v?T;?lFy\?Bl?9?v?l`P?`ӭ`?R^!S?C==R@?5SA`?'??c? nC>/M>œ&>ZJF`>DJ8>t)m>«(>J>%k1>Ų /<>K9I:>F̊>{<>DA>%>T#>RE>tO>DeE>bm]>1F:>+>w%F>ֲ9>Π%p>_I\`?y1L?xƪ!? F?-lr3?<k_?Kx@r.?Zc?gE'?t$~?hp#?x>r?4fk?Rda??n??O_x?o U?Xb{,?"%'R]?ĝQ:8?)l\J?b_vs%?s;Q??;_?/'?K?Uka\?\wQ?3r?Gz?8gWM?r=:+?יq?/?i^ ?k2??o W?}?R~?P/p?Kv4?I7?]? q?>򴫙R?yH?mgD?)n? 6^?.g? ?yj?N?Ty?bχ?^)?46v?ezE?V^?BCy?%ˣv?/c?}ɑ,?}-u`? ?Z;_?'x?+?[Y?؅ .?dk[{:?ጷg??Ɇ_?cq#e?W9Z?U*?vcSyp?i/`?\50?M]4?>] ?0u`?!.}?EzEb`?} >:.p>pܯPp>-@>ϣ5><">]"P>BW>[1>#>u>c7kNA>p>ERp(>$\2>S>l>ف>UJ r>M*i>$UWl>. wpz>Sty&>þ>m>䖫:1|? LZ? k?(3?6ss?E?j?S,yL?b˞E[0?o^gy?zN2{?:nDB?A ?~Q {?:? L!(=g?Q˔??Rx??YpOY?c3? ?l??wp4?B?`ˢ ?3#!?=\fP>z<>f8u@>ҪKh>7\izx>n>=>9d0>R\f>w[<>A`;>գÇ>L,L>lT>b1>Ɔ/>d1A>q1>s2L>VLb~>VBF>ne>+|>W&>XK?򎲺? l?#H/?1KA?@ A‚2?MKKZ?ZX?grRU?tf@ ?C%?kъ?V?Js&?dz*?1fP?LҀ?U?]f?2]6?+c?m~b:?kHZ?S4fh??3"'?]l,?YTڧ? ?|?(H?j] ?Za R?k?[?0 P^?~7<.?M`?L2?zm@!?y$O*?{ ^T?W ?H"??j y?4?X}r-N?O!?bΉC?e? W ?)\ ?)?:Y?SvYw?8t1?FV?Fy4K4? ?Jo1 m?|N?y~_?z]*?Xj?_?Sl?z ?n?8k?v@T?Vsġ?H%?|h%\?p? /??rIى;*?z@ ?l?ڋ+t?]J΀(?N4@?=8?-y1X?@z~?lkg0??!P><9,I`>S>Sl7>Cgd>CO>AE" >}-\ @>@P>N(>A쾏>D>فd>V>at>++`{|>R'b>pQ>Mq>8;>/V`>&Q>؋#>]koR>54?0pb?o\#GU?ANy?+1-?8|ZD?Es"?SF,|?bS?pz?{h?E uj?ku=VD?. L?|J,?%G\?R?yШ{?#ŹT?y?j:>8?Q1?D*s?ӟuY7? ?H?)9?|2?nÈQ?eH?_kI?qo? 7$?xB?'e?"2?,?]y?sp?Vj?|)q/Q?zq^?}(?<.?$I`u?ᳺO=?L).Ҡ?*Rz?҃?Nl"?/b;[z?pF ?Y?(?3}?1?XfXxb^? f ? B?F3?&\?8ck?uh&??6'bH?R4?*n0?NYm?gJi?`X'?֯?)?E? ~?'>W,?{*ˢ?VV@? @dy?r{m1>fO>'2 >'x>f4>Ӱ<>W޴4>KEN>zCL7>ή[>htj>fu>>v:M>z>X>8@>Q6>7*1>':>aɶ>ĵO>"4>᧫zU>S1>P8XM?z;JE?(a0?%4%W?2YyD?@^?M$ֱq?[T|?ijuh2?v`~$?? o-l?^9?NbS?&g?$.?Ƭ?3?sFo?+Z4:?C@Y?9R?Dz: q?16uO?$Ae? #Ik?4 2nt?eN?y3?#}? +u??P@Pz?f?6hr.? *Gѧ?1? V?F;?R(}<?+*X?r?!,д?!?J?WL?|Kw ?w xp?Z,^?k:?^Ǝt?f ?ߑVΕ?M)?צ?[̆?@?nj`f?IJL?klj? P?R~:?@ti5?!h+L??b?V/?nW?[??x-?e? &?8 ?Ӯu?A:?wb]~v?hH7e?Z3q J?K )?; a*|?+ܒ?*gEQ?"G S?P{}^>c,؊B>&+d>1ל>ݬ6>2G>MM>|6E>0 > m10>Tv>D]>j4Si>k_Ć>Ё>6@>&O@{>EqA>jUU>!_>.ޒVF>̵P>}hM>J>xP+?Ǹ'?+7=H?_h:?,???8;9?Fza$g?Ua8P?d.U?r_˺f?>d?|?$⸲?VO;f?,!y?PO<_?-q_?A$#zh?jc ?T$HA?c+?}>?ex?nMP(?T`iw??k?ZǷ}?좨 ?k0 ?8۾We?ļc%?k"F??P+3?Y:?M?UY?e ]S?}W-g?h,s?,ۆ?1em?.Ώ?l3C? e?H]?`ڊ?ݣ]ؾn?_@D?DVv?x`?p -h?B?)3?(s?؄h?ZT\?Q{;e?t?Yog?BJ) ?Q ?V΋l6??Y9WZ?a/??kϲ?Q?2/`?Gn?MMg*?o >|of>J`>ռX.> >f7z>ߌ>>`H@H>0Uu>p>Jm>ʀꌊ>JĞ>p~>0U>`H?>Ֆ>ߌމ>f7y> T>ռXIN>J|>|o˽G> f? r(?CL?'9N?5}[`?D+$*?T2] ?cFs 7FL>?5>݈m$̰>%>ftP>W#1*>Ii%>d6&Է>m.q>zgM>ۢƭf>Ӕ">TY >Nuۂ>Sq>/Ւ(>`H<>d[>p)v>V$,>αW>r\b>C/ל?>N?fZԢ? Hٵ? 8Mr?/4?>n8?O3>?^,*6?lsߥ?|4?`? = ?MĶ?8?Z ?R?!?,?s??ե?5ևGY?Hה?/?oŅ?J?yYd?%s ?C?oB7E?~ }{?I[(?I??~?4?a[o?2Z܊?t*?"1o?V%?j?)?[%8?JǚՄ?j?|>p?{}N?~O܆))?;k'M?gP̕?8^;(?=&q??37 ?2y?z~?j?BG?ix9D@?N?rf5?3g>?* ?ZU?M??It?N? ؠqyU?LN?ܰB? ]?yt?B(9?k~y?Skі?HNO_?C#vh\?|n.?ov6O2?a t?Q(?B>7?5N$_?(--?P? oyy>w{*>E]^6>%q>k{Kx>ŵ_%Y>CW^>23n>$Y<^>QU+b>O5d>{l> %̋>B>*>>U(2C > ESz>|>ϑ"R>3V`>\ > X>~Wxx>O50>)B>dJW? nؓ|?3?&x0ј?6\` ?G1o?V0?eGr.?t|j?b?z?In? kH?N^?O;?ޭ(?AX$@?se?9="2?G+?p6V?E0T?,93?5?}$1'?{h;(?kghL?Fy#}?B?{c_R?Ϫi"?JQH÷?6d_?Ol?1IQL?+N*{?D? ?0xh?o?|di_??(ܦ?Ȳoz?` ?xJ5?uӍj@?v߿N?{æy?1:hx7?Tt?kY?ݓ;??h?w_"Ai? A?a?L)8?,!G?lAe? f?m?|WA?%J??^?zY?y?DU> ??"~:\?8j,?4?+sD?syN?LJ?uyCog?D}?XjBJ?tJ{&?f.C?XEr?IxL(?)d>S7tu>ڣ$7`>˘ E>r1>jq9>z>Y>leY>߉8>@1y]>ď9O>`V> >:'>1>,ƝZ><ξ_$>?gD>Af1UP>xMw@>)qٿ`>+pX>H?X?O? K8?/\lp?@]{?Pr?_&V?mڢ?|FP `|?iq?Yw ??DE@? f?U>S.~?ՐEDt?3XK?l? J3?XC?}`b?wdFS5?u{R?wC?~~0B?6(iwH?'b?r?ݸ?R?ʈ/u? i%?驓%`?3?{\.?Qrh?N?[_?jue?&?#r?~5?wo-+7?t*jL?u{[]\T?z@IYm?#,^_?n ?Cԕ8j?p0 2?.J?N#B?~H?a?Gs7f?e}F?5"? v?G?ָܥ]?N?rb?#?QNj?j̒\? w]8?pvo?Y?t ?̤?ta ?ts~?Q?qLx?tW:?yP?mۦ?`~*?Q_?Bֵ?4?&\o X?ٮZ? jW,l>N >L(>_,0>$|q>']Ξ_>уFJ>ݿ9>u[>p;n>4^>o|>^/1>>">Cau>F=1j>:VG>]>Nji 4>z[!>D_ >ȕ2>XjOKX>u >Gm@>j+q? mW?Z^?'J_ ?6٭T0v ?F[?VB Z?dБZX?rm& ? ~?H<?vσ?}tz? >?;& ?*rAE?ϲf)?9ȭw??qd?Iih ?ı%?رdh@?gֿ|?(l?c`^,?1?W=;? ;?_V$C?o?z Q"zOF?x/yl?y,g?[6j?{*Oy?Tfɗ?=?z"?@?sY`? ҟ[?i?d!D?:}@d?i1|q?Z:?pD?8S ?+Q?ݞ!;?r`?ѯ?)ǵ0%?9X_?>%?̆?+<|? `?4Տ>\Gpu>9 >[:>PM)V->g<>js>2>-âNB>\O>>9>q.>ZwFN> $rM> =>ιS>c+ >ϴ>aƮ>J[>ʌ>K!;8>Ы?V>7+5X@>K!T@>UI?? M``?!18@?0&7wv??)w?Mr{?[E?hw]cH?tV}?xm?{Ѻ?7)?<^5N ? p?-?iJ?D!>y?s?0`$?{?yM>%蒣 >׎{>$Ձ5aj>@>9"L>]>yD>|>t>>>e.T4>է"C&>,>5>0.>7oG>gS>ݲt_>MM>is>e#>;l]@>o7z`>J@? ރ`?"῀?''ĺ?5._?Cq?Q*SY?_ X ?iƺFjP?t3P{?|d?L?ݤ ۚ?~?"?OV?נ? dw?ML{?7R?Gy$rA?}I0~?0|?j0 ?Nz7?Cu1%T??3͔?j"s?HV}?xz?P]ý?ɋ2?[h?Aa?vGU?ѐPi?}?yJ?[_DL?Q @?KM?,?>&i?KX?C[:b?핂WX?#h&q?GF?rGʹi?U ?:eE6?/f2?b?dC?З?U??rstj?dC$S0?TuwX?D .?4L^?%J9?Y>K:>q|V>W\>OՄ+>ް5C>`ean>R />SΟ%>=>~śx>P>.c,>F>evo>z?\>!>%B>'.>LVX>X>N`>^>n >{%@?D?dRԩ ?!1`(?.㄀?9N?F=ڼZ* ?R?_'M@?h[~J ?qn*@?v^@$?{F@? ?z2W?T;C?A~?n ?'?&%?F?׏w1?udjX? F?IO~>胍0>p S>H>A>t&j>a}>yOi>Qb>P_)/>dRB> NT4>K&G>~6><">Opܭ >Iu>5%x0>8XX(>H2(>g@>+`>1W4>s%z>J=@?u??Xʝ?'i?3yf?>9?Guv?RԟD ?\z ~?dAM?k<%H?q5|?tí8?xxom?{+]\?`&?ok ڛ?00?n0@}?y]?{ue??"4g_?41?(q_$?]@D?UÃ?e5;?O?FЋs?vy?//v?o|o&Q?Ju?6*?#q?\9$?Še?d?s?])_ ?}H?kU?w?`~A?Q.E?)>E?׹Y?8T3?܋R?g?F*SBw?J~S|?z1?K\=??8?l?8Ǚ!=? m?v?:{A)??CAg?s.>&?hŵF?= ?rl:?Z[Ζ?TC+?x\:?8E?iT?#?ۖ|hp??А?I0?y!a?i9&?Z @?HQ?8o?(C?|f?\>qL >x{U¸>ݡc\>΋>RK>U>tg>P>i>>Y># .> X >oj 8w>Q%lσ>P >wbQO>BB> d)>>q(h>)0>;ў+W> )p>Ѯ1>>+0|`?"?'hP?ԯϠ?&ٷ?0c?8l|u`?A.?IA%?RYjcg?Y|bo?a:=p?f̂hx?mBH?rpT%?wQ]Rҁ?}'>? 4'?¢Z?.T!y?Ȧq?LZH?UΤF?wd#+?Wt?Kr&??^X?2pT?rg(T?F$?1B??i1?Zl?H?88?(UZX?'`? ^_->Q*;>ey\>݊oj>Π~>6 >p20>꫼2v>:` >ǎd>sX>R,>a>U Sw>O|>CɈ$>B[2\>FO>՟3>x6j>n>.Wl+T>g4`>Qc&@>w?S"h?>B?q@͠?#&žp?+ԏ@?3Y?9L?AB". ?Fƣ҈?M}?SQ`?YH@?a3;?gDU?o$U?t2(wwj?}X9?/ز?)JdB?N`C?x?^Nc?0zp?r/Ċ?}ܬx?~ $N?&y C?RvV?0pwU?b4 ?n!?U ߼?0ŶE?ִ ?|r?xO>v?xMuJi?z,?IO?1\?yN”@?6?u ji?wNi?R;J\ ?~ H"?*Cp?Sy_?-lں??r#y?J?RF@.?Ԉ?`g?g?/56Bu?^>얚?D~?v??gȅ?W>c?F5?6b& S?'t? ?? > fL>p{r܌>ۻ|>̺>\>`;>j_p7b>nƊ >ŗG>} YFS> 0iQ:>HF>?%I>D6˃>J>(6>mؔ~>ë>bp>ڗܢ >y)@>#?j>BNQ?_UtHH??{l"4?% Ύ}P?.4yp?5r۔?=T`?CT]⍀?HQjdp?MrՅ ?Qeݥ4ހ?Tn  ?Ydą?`.Xm?e++]?m;N*?tDqۂ?}pGl?Ee?r?ةNl?[[?!Z?*,ޱ?4q?`?W$?}?On?g -? [.-?GS?C^Br?c@^?_m}?~T??wmUI?tK0gy?t_X?wnҠ/?~1??1)`Cb?9Gp?MD53?oO?ݤ? m8-?.D?w?.Q]?@^?c)G?@s)?ޤ< ? ? 0j?L?LM?x.?u"-- ?uMډ1?x/)Q?~Bs?s}!O?r3#,??q%6?}?)0?@y?I8y?W7 Zh?#?~h?sc?^rk?K%}?G|z?r>{0?c߯P?T& ?CT5?3@m ?$kHv?$>Gp?? >b[b>|CY,>$H>8>$z>cH&>j,> a>&`< >Pyz>:G]>fꏹ>xKPv>ޖ>!>pzD>)>h>%b>^f=->f>4h?UyX,?W?ϳ1?'V?21@HVX?;W *?D\5?Ku7?R ?VDh?YZƠ?\jyq?_3?am5?df-,?i\ u?0 />}?!mzr?b'`?Gv>S<>,׊>!t=P>YDq3>Di>`[>sQ>>OҢ>Y>2u">,{IQt>.{o>6>[u> N>/C>G>G>gI>=?F?5vzf?(.?(5?3,?@5=M3?=`ӕ^?lk%?B"?9?<?=en^T?y?) ?k3~?l*i1?z$r?⾻/?Eu??}(p>?{0=̘?|yl?J?ho?Ab?W`@ͤ?7e%U?iV?#r@?S?0#?`&?P^ ?(?qwB?#e?"6\?8? X?.kn?rt(\?N`?jt?{5?wP%D? P8?7MFNE?2\&? F X?¨?8=Ɏ?-?`?sl?@^G?K?Ff:?h u?{86R?pw*?cE*E?U5Cy@?F3T!V?7 D?("8?Sי? *P/>7%0>b3a>Cp*>һ+>dO>>>>to> >LL>zQg>[#>c(:O>`` >?&K>>4M;>L>ȾZ>l8>a_M>A?0e>Li{j? Y??&pp?3MR 5?@7bs?Lzׯy?Wb?b"Ӱ?iꜜ?p[?tۇ,?x#+_?z1 4HP?zτf\?z,0l?z} ^?z?{r s?}lZ ? ?@ ֕?VQ("?\"?J?a!?)D?]?OY?7i~?i?_ga51b?Rs?tOzz?fm×?2c?5I?/4?nٴ?QYhm? U@-Vw?X6X?WI??Fm~?ZPzm?]p?^EΙY?Tۣ?.*@!L?#B?Wn?il??A2"[?♤G??Lv_?T??SWC?AT?pB4?{`?yg)~? %w^5?`y?EBv?~x%Sn?9Z?>Zi?ޓ(?_Fr?,5 ?<2?]j4 ?Ѽ?뎼u?'g?'@?b?w ?o塶ֶ?dvkg?X\sb?Ki~?=D~ɮp>%ﲙM>ܙ״>"1=>LCL>+F>*eP>ߍ C>L-q>H?j}>l>H?j~>L- >ߍ%>*eF>+F`>LCz>"y>ܙ״ܤ>%ﲅ>ɩ?(r78??X?"#?0n; ?=D~?Ki?X\sbw?dvkg?o塶ֶ?w ?b?'@?'g?뎼v ?Ѽ?]j4?<2"?,5&?_Fx?ޓ(?>Zj?9Z?~x%Sk?EBy?`y? %w^,?yg)v?{`?pB3?AT?SWB?T??Lvb??♤G??A2"[?il?Wn?#D?.*@!M?Tۣ?^EΙ]?]s?ho?Fm|?WI? ?X6W? U@-Vw?QYhm?n٬?/4?5J?2c?fmÖ?tOzw?Rs?_ga51b?i?7i~?O[?b?)N?J?a(?\"?VQ($?@ ֕? ?}lZ ?{r s?z?z} ^?z,0X?zτfD?z1 4HD?x#+_?tۇ,?pM?iꜜ?b"Ӧ?Wb?Lzׯ?@7bW?3MR 5?&pq&?? Y>Li{l>A?7>a_\>l>ȾZb>MJx>4M!>>?&>``T2>c(>[郸>zQފ>Ld> @g>s^>>>dO>>һ+͛&>Cg,>b3>7? *P1=?Sי?("n?7 \?F3T!2?U5Cy8?cE*;?pw*?{86b?h {?Ff:?K?@^J?sl?`?/?8=ɔ?©? F `?2\$?7MFNF? P8?wP%A?{8?jb?N`?rt(\|?.kn? U?8?"6Y?#e?qwB?'?P^ ?`&?0%?S?#r@?iV?7e%Y?W`@ͨ?Ab"?s 8?J?|yl?{0=̛?}(p>??Eu?⾻(?z$s?l*i-?k3~?) ?y?=en^S?<?9?B$?lk%?=`ӕb?Oi̵F?ʿ?_']?.{V?/pJ?xC(s `?t-G1?qST $?oa}d(?m'?l$Ӆ?j/6?hN=4?eH8D?aO:?[I:E?SID>g.->PV>GI>0K> E>[]>7>.|\>,{I>2uz >`>O_>#>s>=>Db>YDc>!t<6>,9>Sl?Gsp?b'?!my?0 />?> u?O71V?^VC0?k9G?xĒ?^è?bPI4h(>f>^f=-">%RH>a>)>pzD*>!V>X>xKT>fD*>:>Py+>&` >jĆg>cGZ>$zĪ>8a>#>|CY">b[???$>G?$kH?3@m{*?G|z?K%?^rk?sc?~h?#?W7 Zi?I8z?@y?)0?}?q%6??r3#,?s}!O?~Bs?x/)Q?uMډ?u"-- ?x.?LM?L? 0j? ?ޤ< ?@s,?c)G?@]?.Q]?.D?w? m8.?ݤ?oO?MD54?9Gp?1)`Cd?1\?~1?wnҠ:?t_\?tK0g|?wmUI?~T-?_m}?c@^?C^Br?GR? [.*?g -?On?}?W$?`?4p?*,ޱ?!Z?[W?ةNl?Ee?v?}pGn?tDqێ?m;N*?e++]?`.Xn?Ydą`?Tn ?Qeݥ4`?MrՅ?HQjd?CT]?=T0?5r۔@?.4y?% Ύ}?{l"ބ? ?_UtL>BNZ>#I">y)ަ>ڗܢ6x>b8>ë>mؕ>(> H>D6U6>?%>H<> 0iQ>} Y>ŗ~K>nƊ_>j_p|z>`<>>̺\>ۻ|;;>p{r܀> fm? ??'t>Y?6b& Ș?F5}?W>B?gȅ?v??D~?^>얝?/56Bu?`g?g?Ԉ?RF@,?J?r#y??-lں?Syd?*Cp?~ H ?R;J\ ?wNm?u jg?w@l>?teFA?s(J?vh%&ȷ?} r?;J?)?۰^?j{$|5?Zş?DؽZ?g W?֢B?f\3?Nr.?Pj?D? g4?6v?|r?ִ?0ŶE?U ߽?n ?b4"?0pwT?RvW?&y C?~ $L?}ܬu?r/Ċ?0zn?^Nb?x?N`C?)JdB?/ز?}X9 ?t2(wwn?o$U?gDU?a3; ?YH@?SQ?M}`?Fƣ҈€?AB".ˠ?9L鸀?3X?+ԏ?#&žP?q@P?>B?S">w>Qc,>g4n>.Wlgh>n\>x>՟>FPC>B[1>CɈu >O!>U T*>a-u>Rw>sY>ǎd>9S>꫼X$>p1>6>Π>݊oJ>ey\J>Q*;,? ^_)?'L?(UZ?88?H?Zlt?i1?y@:?(7@?D?I-Z2 ?@ ?۰pt?X}R?N=??NBm>+0„ >Ѯ<> )@>;ў+^>)p>q(ha@>0> cH>BB>wbQ>P !>>Q%n%>oj > Xm$># ́>>i?MS>/>tgC>TGK>R">΋>ݡbr>x{U¢j>qL ?\?|f?(Co?8o"?HQn?Z @?i90?y!a?I0??А?ۖ|hp?#?iU?8E?x\&??CAe?:{A.?v? m?8Ǚ!4?l??8?K\=?z8?J~S}?F*SBw?g?܋R?8T3?׹Y?)>F?Q.B?`~A?w?kU?}H?])_ ?s?E9V?Še?\9$?#q?6-?Ju?o|o&P?//w?vz?FЋs?O?e5:?UÂ?]@B?(q_"?41 ?"4g]??{uc?y]?n0@{?00?ok ژ?`&?{+]h?xxom?tíD?q5|?k<%x?dAM?\z ~P?RԟDP?Guv?>9?3yf@?'i@?Xʞ??q@>JC`>s%>1W4@>+>gK>H2(>8XXX>5%x>IvE>Opܮ1f><">x:>K'W> NC>dRQ >P_)!\>Q2>yOh9>aM>t&3f>Aٺk>Hs>p $J>胍>~H?I$?pֆy0?'3m%P?6|?G&I?X Fw!?gq-.n?vEuO?tb?n}&?_{5ۅL?1j?*a?B0?r@"B?_c1?v?U u?' g?tD?_쪬?Il ?k3t??ы ?cm?ضJ=?jv?fw|E?:T?!=N?,U?P؅?t+6F?g =>{+>n >[>N0>r>LV`>'/6P>%C`>!>z?>ev>G[>.>@&>~Ś>=>SΟ0a>R >`dI>ްU>ON>W\ܶt>q|N>K:U>9?Vv?*n&?y?%J[??8A$&i?,?KM?YW?[_DL?yK?}?ѐPi?vGV?Aa?[h?ɋ2?P]ý?xz?HV{?j"r?3͔??Cu1%M?Nz7?j0 ?0|?}I0?Gy$r@?7R?ML{? d?נ?OV?~?"?ݤ ۢ?L?|t?t3P{?iƺFj?_ X0?Q*SY?Cq?5._`?''ĺ?" ? ރ`>Q>o7>;l]0>e#ؾ>is >MMӐ>ݲt8>gT>7q4>0.ؠ>5>,>է"x.>e.T>E>r>|G>yDu>]e>9">?~d>$Ձ5>׎{~>%蒇>M~?B?9r^?"?]3?04?@}Ԏ?Po "?`&F꿌?mzm(?zFɡ?VO?砀w ?M?$?NO]?a61?v<*?ܸ?ϫ2?|?Yy ?SGP?n?\?9AkL?Ɓ?<DŽe?H]x=c?4Jc??R!?!)?͒5x?hZN?m̽?R?x#?+2?( uN?S!3?U[?:7 A?sBQ?HA?_|?ZӒJ?_V$C?+q? _?qI?m?( =[x2?əi?9x? V5?x3eD}?iQ?-? v?<^5N?7)?{Ѻ?xm?tV}?hw]cH?[D?Mr{`??)v?0&7wv?!18`? M`?P>UI>K!S>7+5Lp>Ы?C>K!;>ʍdp>JËh>aưa$>w>c*>ιT^> $r>Zw^>o>ծ>>[>-âN=0>2,>g<>?>PM)U>>[9>9 q>\Gp?4^? ?+<f?:;\>?IVХs^?XG&DI?fUC_[?s5U6? 4|sa?iJֿU?H??cV(??v?Ph?_6<+?%?9Xa?)ǵ0%?Ѳ?rh?ݞ!=?+Q?8S ?pE?Z>?i1|q?:}@f?d!F?i? ҟZ?sYa?>?z"?=?Tfɓ?{*O}?[6j?y,^?x/yg?z Q"zOB?o¡?#r? ;?W=9?1?c`^-?(k?gֿ|?رdh@?ı%?Iih ??qd?9ȭu?ϲf)?*rAE?;& ? :?}tz?vσ?t)F?uoeD)?{y?]qIj+q0>GmР>u >XjOK >ȕ2P>D_X>z[!>Nji >Z>:VÊ>F=1kA@>C`xL>>"м>^>ozuE>4EL>p;Y>uEf>ݿ9m>уE>']·>$|q>_,>L(>N? jW6?ٮr?&\o V?4 ?Bֵj?Q_?`~*?mۦ?yP?tW:~?qLs?Q?ts|?ta ?̤?t ?Y?pvo? w]:?j̒\?QNj?&?rb?N?ָܥ_?G? v?5$?e}G?Gs7g?_?~H?N#B?.I?p0 2?Cԕ8h?n ?#,^_?z@IYp?u{[]\O?t*jL?wo-+7?~5?Ȳox?&?jub?[_?N?Qrh?{\+?3?驓%`? i&?ʈ/x?Q?ݸ?r?'g?6(iwH?~~0E?wQ?u{R?wdFS5?}`b?XF? J3?l?3XL?ՐEDv?U>S.? i?DE@??Yw #?iq?|FP `?mڢ?_&V?Pr?@]{?/\l? K8`?Op?(>H>+l>)qٻ@>xMɒh>Af1yx>?g@><οr>,Ɲ>1fg>:'}> ݐ>!>ď9̋>@1 >߉6>leXo>Y̦>zM'>jqL>q2>˘ >ڣ$7ˤ>S7tq>)d2?;|bO9? #?!@=ֈ?/KPx"? ?y?zY?^??%J?|WA?m? f?lAe?,!G?L)9? A?a?w_"Al??h?ݓ:?kY?Ty?1:hx@?{æy?v߿R?uӍj@?xJ0?` ?JǚՃ?(ܦ??|diY?o?0xf??D?+N*|?1IQO?Ol?6d_?JQH÷?Ϫi$?{c_R?C?Fy#|?kghL?{h;(!?}$1'?5?,93?E0S?p6W?G-?9="6?se ?AX$A?ޭ+?N^?O>? kL?In?z?t|j?\?eGr6?V0?G1o?6\` ?&x0ј?3? nؗ<>dJW>)BX>O54~>~Wx> XQ>\ ň>3VV>ϑܪ>|j> Ez>U(12>*?L>A> $>{k]>O4e>QTN>$Y;#>23n>CW(>ŵ_$K>k{K_T>%qg>E]OU>w{ʸ? oyu?PZ?(--q?5N$?B>7?Q(?a t?ov6O3?|n.|?C#vhZ?HNO]?Skі?k~v?B(:?yr? ]?ܰB?LN? ؠqyV?N?It??M?ZU?* ?3g>?rf5?N?ix9D>?BG?j?z~?2y??37 ?=&p?8^;-?gP̟?;k'L?~O܆)*?{}N?|>p?j?}= ?[%3?)?j?V%?"1l?t%?2Z܊?a[o?4??~?I?I[(?~ }~?oB7M?C?%s ?yYo?J ?oŅ?/?Hו?5ևGX?ե??s?,?!?Z ?T?8?MĶ? =?`?|4?ls߹?^,*8?O3L?>n8?/4? 8M? HٸT?fZ>N>C/לH>rq>α>V$[>p)m>d[=>`H/Ւ>S>Nuۃt>TY>Ӕ"eE>ۢƬj>zgM >m.q>d6&$>Ii>W#1>ftٖ>%Y>݈m$>?4O> 7F>x?<[ ?.?(V_?! W?0 iއ.F?<_v{w.?JiK?YsP?h2?w^D7?M`?NI&-L?^S?#w?Tb$?~?RD?*l ?/g?kX2?h??Mߪ?u a?RI?fL?y-?Llcν'?kr?*?~P?9&?hc?Q ?Zڨ4?;DD?C?_!f?//S?ίr?]#? *sv?Ko`َ?}[N_?L}Q(?ve'?M 8A?x׌SV?!?G ?Ip?S?1^Q=?j(? a?Ff?7jO?)]UHK~>Kta>Xja2>[>]~$Ô>H>F >E+H>Xؕ9>z>]n}Q>˥>]n{>>Xw>E>FC >>]~$>[>XjVv>Kt>HK? f"?XFתd?)]U?e ?t4? ^ژ?q=?i?HP^I?݇_ ?a >#>ވj%>J4\>Τy>\q>lF>zIB>vēt>8k5>"I:Y>5R>hxo>{RzX>M>￷^>h\ٯ">xr"->cу>*1%>Ubф>nFؚ>. P>oP?{~?dw@?"(l&W?1 @ff?@d.`?Q;Ȭ?`l2`?oj'?P?rt?h;?Kbs?%k?`Q(8V?pz?8ߋQ?Wg*?C:?:"r?c%2f??i50@8? W?EE4?|E?|44@?0B;?OYJJ?{޸a??NG駮?2N@?d?E?!q?%COo?35o?-?'+M?7$?~`C?~Oe?x.ޏ6n?u8?v{+?{~RTQ?Q? *u?Ac?$WW?W ?9?FQ :m?4;OL?@>?tL?T?[V? 48 ?g?##ζ?}N{?zp4?`?ߔ7?_?Y$/F?=ܱ^ ?s@Ģ?9?1\|J?DQP?0: ?`@Kcd?Ԏl%?>#?r6bOc>->X>ԳZ!<>/Jzdg>CA>`o>c>p/}>M{e>?}>dIp>ɋ}s>oadV> [y>sĴx>f >w>-Id:k>,FZ>́O'>հZL>\ >ya B(>d!@? a??'4?7 4?HI?Xu ?gvn8?vgUL?K, ?Gf%?Jt^?'mZ?eF?lEl?7Kp}?B?3=L?&C X?ݘ`?lXe-j?{(|?wq#%h?x-,I?~fg?-PQ{?H?e3~?2nGzo?aX ?;6?w5?Ct܋?nlit?m? lE?G מ ??F?{?F&\? %?Q[#E?v-Fe?,?rNH(?q-b ?tT@)?|(j?_1M?P_?eF?~ o?+0?8?RvN?/3?AdӶ8?:츌W?L0?}|?SP??-J?W+6 M?M??3*'?-L?>0''M?ȃ?di8?H:?DP ?"͇h?*?[X?V ?wnvD?jcs>?[U4E?Lj]o?>srH?1O)c?"-HI?>+8c?0]/E>+$ ,>b> >̟dBS 9>Zw>i<>Y"L>cav>?>mR>|˙>L'hG>`>vDӝ$>ln >hG>6\>{ P>M8I|>>񱓙(>4X>܃x>HG?8?V3?,(? ij?0 ?AQ>+pm@?QtI?`_ }l?o.T1?}bR0?[͘ l?oyM?{&t? [.=??z%U?YN;H?>I?71z?dI?@d?wfA?rʭu?r^?vdB)?bI?dbV?:V@?t'l{?$U?[ ?|,4?7+j?|B?^y?R@?Amy?R?TB ?&E?g!I?WTI?vc)?q ل?pSvx ?sp1 A3?zȅ:iM?΍"?E=+?_?_~?N?O?R6?p)'?(?Ǝ߇?>h?Mjc?mUO|?X.0?v?qQDE?7Dr?h{?mq2?if ??[.?4?1p?m#nA?x\b?pY\~?ټ?BՍRi?b@0k?~#Pp|4?qC [?bҷ?S#T??D2R&?6v1Jd?(1G?[? zG[>0f, h>%.>_]M>b=>äoT>{(¸>vz>}*N>3 >=nu>{ >āLE>֍G#>WP`>Pd> Ÿ[>Kp>8_)>L.2p>uޞ>X%>Բp> gH> U >1l@? q?1?'R®?7?GhICP?W&[P?dfl ?r \?YY?.?*>?fe4?2/x?œc@-?<^۸?\,GV?cJ?0E|ɨ?{Wi`z?t'ܰ)?q?qx}?v6]?[n']?˕?dVXp?.v?/{?8!'O)?P^1?R^q&?(?7L[@?D'?]eol?I9?k5?^ k? ?=n?!?h.r?u= ?Q?{?I&w?U%j=%?h(S~T?$[V?g?BJ?ET`? h?L?([!c?C*?!ɳ%?Q^X?vma?i|.,8?[qO ?LSux?<4.k?.>I? ?b'?3Q>_O>W2`>՘.>ƮM(@>#>/L*>T>t^h >y>X>yN[>`).>L0>W^*ه`>>sKf7>c!K>m>7>٤(>IJp>лYC> ]Ő>iw#>Yr?$?L?! RR ?0#F٠??-?Nn?[vUw0?g c?sj?*_x?~?),?=N?i???KY.f??J?uw?y RO4?uIA{A?t9=?vIS#?{D>BL?@N?Hm?ê?⭺=X? ?-rl?S&<}?)t?[~Y?P?$?R8uѵ?4?w??/Wi?~xd?y5:?x}j?zi ]?0h?gx9?W?kfM?&+S8?㥣+&.?Ta?J:~:"?6@-Y+?\?Z?K;?>#T?:??tX??ss?u&[?]%JO??HUœ?2J+6??0$?Խy@?r=G?+?N??V[/>?U׬?b[+?`~V?~BM?p.6-S?bA8?RDX[g?BM,?2};iid?#[2Iz?.[6?t9>󎬦l>5>{x#>I=>Ve<>}>DD3> !>K/:|>G2h'>۳->I.!h>#2@py>BE>]>,Zޓ>ߥ{>kܿj>+@>Ȭ&(>baLF@>5ǖ>ۈ!>KN[?3R'`? )6?=c@?&?5#?C[X?QV\?]YW@] ?gA`?qe5#J?yL?4"g?^5*?ݛc?nV7?? Ƶ?{V ?y2 ZT?y{ ?{CpسH?^_?5 h?k?/?FU?͉?~?N(p?U 'e?z2Z?R ;e]?K?w`2?8YMT?%xG?XHq;?1UI>d?Fv?^?$?u^W?;hB?Dr?6+?z~,?cG?uͅᆮ?gҲT?W[ncF?Fjk?5]f?&ᤰ} ?a ?͞c>W>>n[A:>l(>Iv>PL>-H8>pC=>>DĒ>)>/f>->ʦv>ֶP>O<>Sx>9S p>y>oN28>S3@>uF9>P(;~`>Z ?:|4? ui? `?-aV?9 T[?E&c ?Q?\qp`?eg98?m_h]0?rvَ?va*lX?xhU?yir?yH}$?yB?y??{0?(.c? Ȅ[ ?l?}M?bIQ??J?;N7?w?Lid?:L?=v8~d?O?cp?4FU?G$?Qz]B?c?=C$,?DM?A`5?}LB?ͽx?_1?U-ϝ?P? 0?k+?n1f'?*QQ?j?T,FF?- ?-~?¾Ī?Y8P?E7T?&c\?mB?7:r??Y$?~r.n2R?A?Oh6v1?t2?Z0?jm??Y:?ή?DsB ?mˀ?=;?%m?]Vp?@,$?8n@?U9?zMD?k+"WL?[Qvʋ?I]?8Ze?)kD?7 :?L>كG>>>A =j>=N>ʸO >0>$`H>Bsy>%Y:>@>'>757> ʢ>vCNo~>H’G>x>\>*mx>eP>; H>ڪQv>u P>50>#Q ?<?+pE?W_ @?'mvI?2 ?=]E@?Fo]&<@?Py4!P?X_Sp?a ~{?f"O?k X?o}|`?q2@?s?v4*.+?zhg?~&$k?;WS?2p/?ב鍭?b+?IjMl?#q'?rq? ?6##?(Sl?rʜ(?ʤ!0?__*?hu?TH? Ln?m?wYZ?rÄ,?}P 2?~Q-J?4~?7| ? f?2?6ߟc{,?Ey?N?ɢ?Fhȶ?. ???rh@l?g3 ك?)n?;e?y>q i>򯺡[ >g;>Mf>#>!>+3>8rqcb>E0xV,>͙X >) =TG>SiC>=e>Ǝ鼤>ܣM>jz z>Aޗ>m-o8>d[>~[:P>vw;>UD`>4\q > ? ?:o?E(V`?`c@?' {v3@?0I`?8c?@ޱ i?Gw8`k?PFȪ?Uj5?[?aqV?eۍר?jMA5f?pbܳP?u gP?|WK?C?u#?O3?rGDH? " ??9?JKwdV?73?ydp?$?o}?Z7?P֥?me=-?hcWZ?!?3 ?;}?{(~?x,?yRg] =?at? H?ּ6?R.?!'Mgm?̡ ???N?\ ?W>F?Ji҆i?55? Gj?&?H;VT?> e4 ?s?ٝ&?yUӼc?tu?rE΀?s+ñ?y om?o4?O'+E?iC?fGۉF?75?GG|(?4??n3?->X- ?,?ASj? t?Nf?Qox?<?}y6?mU`x?]HR?Keh?:QgX\?*Wuc?V}? .K >غ|n>U(>x0->e|>@>$N1># 9>h}U&>)^>f 2>4x0>K}>bnG|>2>sT@>=%c>GhM>\(y">Oݱ*>r8”R> >;9>e@Gx?>viP?x!HH>?O(g?$Fe?,%U[@?3˞8?:8Ŏ ?A5 ?FO%d ?Km8?Q5?U p?Zxy$>0?aa'?f8?mx?td=)?~uoR?M4?Ǯ7:?R}?h? ;?ё?I^?B`?Dh?v&\?*cL?ٽzN?m9:4f?Haj?FP?/~#*?|Pq?v4E{?ssKU?s}?wOhan? {@F?zG?IBC?w1f8?1X?^ ?+4?17#Xs?98=?y{#g???H?Uކ?2@?0|jie?~bޜ ?uU_0A?p?o ?qd,:{?w$D]?}?=m ?-LR?bM?s򆹔?hX}j?KZ?-(M??_PV?cBa2?kC\? pb?ɐG)}?2>?0?z9R?kT&?[ ы+>&/Sl>n$pݲ>}ų>VoY> I>Z6h >h,W(>޼TL>T+ >wVn>n݃>D4K>S >>Î*x>/[Z>~> 3(>WB*>ڮg>wf>+=H>+[?ۚ4?E?4ox?'Sa8?0KQR8?7 p??eQ,?D:,L ?Iظ$?NmT)?Qv[ޠ?S<?U#`?Yns>ǩ>ض9QHu>MPN>B`3>:24>3>t4L>K2 C+>YHQ4> )>~Jc>~4P&>[ϧ>&>o0>v>ɣ />!6)>✎y>u>3?{C91?Ꭹ~? zQ8@?)ڷ7x?3! R ?Fi?Ng-8?S8"Ax?XBwX?[;~Dנ?]^W?^hP@?_ϙ@~?aQP`?cVtXy?gmH?no|P?uY.?{r-?]E?1g?@)C?\&ڞ?W#[]?tX?&|j=?4; ?OY?g׼֑8?QCغ? R?C;D?6[*;?| ?M^?x+}?sII=%?qcO2Tk?r[q?vIJI?2n k?g.?> t?DrmX ?;?M.rN?y!W?J-?yU(|?ۚW?yK?> S?Si?b B?u?oO~?_:Z^?.z?y6#?uʬӺD?u4$sZ?wR$z?| ?]\ ?TG?קHY?WI>䕸(>,p^>Ǎ*DL>%Ǻ>P_J>.>=X>^+O>2iS>2Ț>!3>b@>],>hk>̦ʶ>s6MÍ>T=c>*>=2k9>H8?R8 ?n4TV? FM?*IS?5b?Bk:z?Lao>?U?^jSC?c?gs-D?j*/d?k?kփrԊ?kٲM>?kWdp?l vP8?n2y@ P?qm/T0?v J-?~tIr?qiǪ?J,g?\ ?q? V_Z?6f:?bM?MK?plM?ARr!?9»9?/i5-H>-$RgQ>+(>;ŧ[>Ď"XP_<>4,>Ǜ>{O>y~>1V:Hm&>Rʳ>4̓>Ms>5N^>2l'>HҸ><>iOO>ּ^>o> >@? ?ݤEGr?(`{&"?5,]R?Bã ?P4?Zcvz?d]56R?l0?s!Ր!|?wt?zNv?{ÊL,?{7m8?y#x6?w~vٙ?v1)?udm?u ?:?["[z?^vo?u, ̓?|L<.?|_?r[i?Y_E?2ew?B?EJL?^T>%?8?2 ?{ݕ ?Gh1?~!i?zםO(?zJ)?| x*?_:Uh? ?/J?UH?%i??fD4?:F˳?y|??<\>?{?RL?r0ufH+?g`R#?[N?N 8?@@Js?1=?#̗x?D}N"?c(>='>ʡ>Ow0>+B+>&F>rљX>9`L>U $>R[C>.}]X}>L|>.}]X8l>R[>U >9A>rљ j>&͓>+BT\>Ow0 >ʓ>=$?do?D}N"z?#̗v?1=?@@JW?N 8ʸ?[Nz?g`R#?r0ufH'?{?RL?<\D?y|A?:F˸?fD???%i?/J?UR? ?_:Uh?| x*?zJ)?zםO(?~!i?Gh1?{ݕ?8?2 ?^T>%?EJG?B?2ew?Y_C?r[i?|_?|L</?u, ͅ?^vo?["[z?:?%PPA??^X?/_֢±??~C/??{w낁?|{?x?< vx?ze? 0?_?(x?U}=V> y>o>ּ^>iOP>=0>H>2>5N>Ms77>4̓>R|>1V:G>y~x>wp>Ǥ>4,(>Ď"XO>;>i>+8>-$RZ>5-? 1%Ҷ?"?*؍E2?9crO?Hc!,?WqW(?eɳg^?rӅPǭ??z^,?Eo9?WP?N -?%Z?f\? $H? SN?0,t?0پ8??~oSHV?z07*۾?y=ǽR?{3$ݸ?ƭ$?m?c?~?7]H?ßD?X"c? n{??#`~?#А?@?`hk? {?B?iU?5Y}Q?GEp$~?F?n%?FYd'?2n e?xsW?u 3?v6皭?zG1?\R?`R?; ?\s,:?5?/i8?9»7?ARr!?plL?MH?bN?6f:? V_Z?q?\ ?J,c?qiǪ?~tI|?v J-?qm/T0?n2y@ P?l vPH?kWdt?kٲM>?kփrԊ?k?j*/d?gs-D?c?^jSC?U?Lao>?Bk:?5b?*I? FD?n4Y?R8#C>Hd>=2kMo>MJ>T=bJ>s6Ne>̦˯>hk >]j'>e>!3l>2ੑ>2i>^*>=>.>P_>%>Ǎ*C2>,p^->䕸(>M?[S?D?"HSpQ?1gGC?A6QK,R?QA(i?a*g`?o1Ury?} -% S?< ?=RI?s}H??.?<0?'P??FN,?WI S?yJ?ۚW?yU(x?J-?y!W?M.rQ?;?DrmX ?> x?g.?f!d?vIJI?r[q?qcO2Tl?sII=&?x+}?MT?| ?6[*;?C;E? P?QCغ?g׼֑6?OY?4; ?&|j=?tX?W#[]?\&ڞ?@)C?1g?]A?{r7?uY.?no|H?gmH?cVtXy?aQPX?_ϙ@~P?^hP ?]^W?[;~D׀?XBv?S8"Ax?Ng,?Fi?>! R @?3<?)ڷ7x? zQ8?Ꭻ?{CC >e>>✎y1/>!7>ɣ  >z>o>'$>[4$>~4U@>~WU> )Gv>YHQ>K2 B>t4.>3>:25>B;:>MP>ض9QH>>nsV?rG?tΩ}P?% ?5Q#NNz?EFy?V|_!?f!skz?uk9v?\m?EsV?Cq?Mk?۶\Fnm?V@s?Z?.K?Y?}]? n1?2d??3W ?~w''y?vYꔭ?r"2o?pމ)֒?rU͏?wgG%W?X4?7D\? ?3~o?X?WO{?6o5nh?z7p?v 1|?n?oT(?g4?]ۇ?^mj~?YC?@?8̰I? {@G?va pwu?qIo?pW?qkbu?w"X@: ?|yr?'?c!h?s&?`* ?peh|C?<^A?Ո߁Bj?2,v[?ȷw%?Cu?a?n᷈x?E?mO}d?fEݜ^?@}?ufbq?l?e'·?`008$p?Y+[\>+=H >wL>ڮg >W> p>~(>/[">Î*x>S >D4(>n݄Q>wVo>T+>޼S>h,V%>Z6h > ڏ>Voj>}Z>n$pj>&/N>ы ?V^??ɐG)|? pb?kCX?cBa2??_PV?-(M?K\?hX}l?s򆹖?bL?-LR?=m?}?w$D]?qd,:?o?p?uU_0E?~bޜ"?0|ji_?2@?Uނ?H???y{#h?98;?17#Xv?+4?^ ?1Z?w1f:?IBG?zL?at?wOhaj?sr?ssKR?v4E{?|Pq?/~#*?FP?Hai?m9:4e?ٽzN?*cK?v&\?Dk?Ba?I^?ё? 9?h?R}?Ǯ7:?M4?~uo[?td=)?mx?f8?aa'?Zxy$>0?U p`?Q5ɠ?Km8?FO%c?A5?:8Ŏ?3˞8 ?,%U[ ?$Fe ?O(i0?x!HH?(?>vl@>e@G>;9*> H>r8”Zl>OH>\(yS>GhM>=%eW><>sT@>3i>bnG >K}>4x1;>f>)]>h}U~># u>$NJ>@_X>e|5>x/>U>غ|c? .K?VP?*Wuc?:QgX\X?Kep?]H??mU`h?}y6?<?Qox?Nf? t?ASh?,?->X- ?n3?4??GG|(?78?fGۉG?iC?O'+H?o4?y ox?s+ú?rE΀?tu?yUӼl?ٝ&?r?> e4?H;VR?& ? Gj?55?Ji҆j?W>F?\ ??N?̡ ??!'Mgo?R2?ּ6? H?~Q-J?yRg] >4\qp>UX`>vw;>~[G>dp>m->A>jzh>ܣ,>ƎW(>=>SiCl">) =TP>͙X~>E0w>8rqc#>+pp>&>#U|>Mf>gT>򯺠>q T>? (7 uv?G y?*os?:roɜ?K,?]?m0+x?}VZMԅ?迄b?8,'?kK?@9jQ?@?v.?àm??/{b?q8h?34ץ?{!?R#њ5?ɛR?ThkbS?{a?x1d?xBWT?|R?0C}?y#V`>5>u @>ڪQvp>; >e>*m@>x> >H”%$>CNp^&>v to>756>'d>Q>%YQ>Bru>$`>0>ʸO_>=N$>A =>>ڪ>ك=?Ld?7 :U?)k?8Zew?I]?[Qvʋ?k+"WL?zMD?U9?8n@?@,!?]Vp?%m?=;?m˂?DsB ?ή?Y:??jm?Z0?t7?Oh6v3?A?~r.n2V??Y$?7:q?mB?&c_?E7R?Y8P?¾ĩ?-~?- ?T,FF?k?*QQ?n1f'?k+? -?P?U-Ϟ?_1?ͽx?}d\n?A`3?DM ?=C$'?c?Qz]B?G$?4FR?cp?N?=v8~d?:L?Lid?x?;N7??J?bIQ?}K?l? Ȅ[ ?(.c?{*?y??yB?yH}"?yir?xhV?va*lT?rvَ?m_h]H?eg9X?\qp`?Q?E&c?9 TZ?-aV? `? ui?:|3>>ZP(; >uF9:>S3>oN2(>y>9SC>Uj>O>ֶr>ʦv>->xh>>Dđ|>ja>pC=>-HX!>O{u>Iut>l(>nZ >>W?͞?^?&ᤰ{?5]f:?FjkZ?W[nc@?gҲT?uͅᆮ?cG?z~,?6+?Dp?;hC?u^X?$?^?Fv?1UI>f?XHq;?%xG?8YMT?w`6?K?R ;ea?z2Z?U 'e?N(p?~?r`>͋?ݲ? w? qv? ?IΆ?~m?BY D?b |??U?:?U;r?.D?& ?Q2?}\4#r?~x`?[ |?vK?H?N?e— ?j?~{?Ë?r{`?ޚ]Nw? `m?Fv?KN[ `>ۈ!@>5DZ >baLgP>Ȭ& >>8>kܿj4>ߥ~>,Z>]V>B>#2@>I.Q>۳>G2h%>K/ט > !>DC֤>}H>Ve:>I@>{w >5>󎬦r?t?.[3?#[2G?2};ii?BM?RDX[^?bA/?p.6-T?~BM?`~V?b[+?U׬?V[/>??N?+?r=H?ԽyB?0$??2J+6?HU¢??]%JO?u&Y?ss??:??tX?>#U?K;?Z?\?6@-Y*?J:~:!?T`?㥣+&/?&+S8?kfM?W?gx5?0h?zi \?x}j?y5;?=BM?vIS,?t9>?uIA{A?y RO/?u|?J??KY.i? ?i??=J?)8?~?sj?*_v?g c?[vUw?Nn??,?0#F٠p?! RR?L0?$@>Yr>iwP> ]Ր>лYC0>>٤+>a>mx>c!L>sK>>W^*>LD>`)>[l:>yN; >X~>t^h >/L*>#˜>ƮM'>՘f>W2\>_?3LQ?b'? f?.>I?<4.kT?LSu^?[qO?i|.,8 ?vmb?Q^X}?!ɳ%?C*?([!d?L? f?ETa?BJ?g?$[V?h(S~T?U%j=$?I&w?Q?{?u=?h.r?!?>o? ?/wBs?(J?dfLL|?`R?~+ "?W0?STw?U"?Ú6?nPiY?v7?,?w1l> ͆> m >Բ>Xhh>u>L.L>8_n>Kq> Ź->Pds>WP`>֍q>āL>zu>=m >3А>})G>>{({>>ä#>b>_]C>%.>0f, vp? zG[F?[?(1G?6v1I?D2R?S#T??bҷ?qC [?~#Pp|/?b@0k?BՍRj?ټ?pY\~?x\`?m#nA?1p?4?[.?if >?mq0?h{?7Dv?qQDF?v?X./?mUO}?Mjc?>h?Ǝ߇?%?p)'?R8?L?N?_~?_~?E=/?΍ ?zȅ:iO?sp1 A0?pSvx?q ه?vc*?Q[#H?g!K?&D?TB ?R?Amy?R@?^y?|F?7+j?|,4?[ ?$U?t'l{?:VF?dbV?bM?vdB:?r^?rʭu?wfE?@d?dI?71z?>I?YN;I?z%U?? [.=?{&u?oyR?[͘ l?}bR8?o.T2?`_ }?QtI?AQ>+pm8?0 ? ijH?,(?V40>HGZH>܋(>4X>񱓙X> >M8h>{ Q">6\7>hG>lmA>vDp>`>L'h{>|˘>mU>?s>c`>Y">i;>(>̟dBRco> >>aT>+$?0]/B ?>+4?"-HH(?1O)c?>srG?Lj]l?[U4E?jcsB?wnvD?V z?[X?*?"͇h?DP?H9?di7?Ȃ?>0''L?-J?3*'??M?W+6 O?-K??SP?}|?L0?:츌W?AdӶ9?/3?RvN?8?+2?~ n?eD?P_?_1M?|(j?tT@)?q-b?rNH(?v-Fe?.?~Oe? %?F&\?{??F?G מ? lE?m?nliv?Ct܏?w5?;6?aX ?2nGzq?e3?H?-PQ{?~fp?x-,a?wq#%}?{(|?lXe-l?ݘ^?&C [?3=L?B?7Kp}?lEm?eF?'mZ?Jtc?Gf(?K, ?vgUP?gvnD?Xu?HI?7  ?'4?? ct>d!>ya BX>\`>հZLj>́O?>,Fkh>-Id;>wt>fN>sĴ!> f>oad>ɋ}>dI>?} >MT>p.6>cPk>`o1?>C3Z>/Jzcc>ԳZ!>X> V>O^0? 9'_m?{k?*5ca?7 \Ȋ?Dw?S[h?czPN,?r6b#?Ԏl%?`@Kcd?0:?DQL?1\|H?9?s@ğ?=ܱ^?Y$/D?^?ߔ7?`?zp4?}N{?##ε?g? 48 ?[V?T ?tL?@??4;OM?FQ :m?:?W?$WV?Af? *~?Q?{~RTQ?v{.?u8?x.ޏ6o?}qL"?~`C?7$?'+M?-?35l?%COk?!q?E?d?2N@?NG駮??{޸c?OYJM?0B@?|44C?|E?EE?? ^?i50@:??c%2e?:"v?C;?Wg.?8ߋO?p|?`Q(8T?%k?Kbs?h;?rt?P?oj'?`l2X?Q;Ȭ?@d.`?1 @fh?"(l&W?dw@?{,>oY>. PZ>nFh>Ubj>*1L>cI>xr">h\ٺ>￷>M5>{Rz>hxo*>5Rc>"I>8kp>vo>zI>l>`>\oe>Τy>J4\X>ވj>#>a ?jַ _?k߆ ?#3s?1][S%l?? U3.?M?]DS?kPD2f?z?cx-2?ibǞ?׮o`&? >??WA4?<,!?CSJ?≓e?\@?ug?%[?{j??Fc?:cA? l? ?LGP?S(z?{lAd?{?v_sim-3.7.0/lib/plug-ins/nanoquanta-netcdf/nanoquanta.png0000644000353400050620000000251312215546173020355 00000000000000PNG  IHDR jMbKGD pHYsHHFk>IDATHǭ]lUt:;ݖ.&+ IkFDKĢ1~h|P!5QQk_QAPj?H-4Xڲi'ត{s?WǏ |>XD\ԀiٶFet'?ӧ5oSU\ܭ a>:&]Dֶ׵փbo%%%m[: I&Ǎ#*DIUiDi3[>_)**Pbf{…yJ,^,kh= ]#K"W6XyTۥY()HWsw$NJ4YL( Ȅ(Hiye$X+- 8KYFaj? 4`LS0[1O,8RTs~( 6w[xGccV3{HUW'O GUU N:u6_4:bd5@׵Z7_@eX'Ef0lqvٶI? 3q{{(ccc30 k0|$084M0=vNF !eY&;Wl8v;ZKe=m)raX뺟#]]]x 088e,H$JJJ>z455+]ys w0omk]:̅F ">Ed UboދO4 2:::qmx<~0<<ȌH`(z?`|ςL jfAĹBfKfsh8g7?}`[1zTXtCommentxs.JM,IMQ(,PHUp P03RHTp lIENDB`v_sim-3.7.0/lib/plug-ins/OpenBabel-wrapper/0000755000353400050620000000000012216331347015454 500000000000000v_sim-3.7.0/lib/plug-ins/OpenBabel-wrapper/Makefile.am0000644000353400050620000000117212215546157017437 00000000000000## Process this file with automake to produce Makefile.in vpath %.h $(top_srcdir)/src libobloader_la_SOURCES = ob_basic.cpp libobloader_la_LDFLAGS = -module -version-info $(lib_v_sim_version) libobloader_la_LIBADD = $(top_builddir)/src/lib@PACKAGE_TARNAME@-3.la \ $(OPENBABEL_LIBS) @GLIB_LIBS@ if HAVE_OPENBABEL OB_LIB = libobloader.la OB_PIX = openbabel.png endif v_simplugins_LTLIBRARIES = \ $(OB_LIB) INCLUDES = \ -I$(top_srcdir)/src \ $(OPENBABEL_CFLAGS) \ @GLIB_CFLAGS@ if PLATFORM_WIN32 cflagWin = -mms-bitfields -mno-cygwin endif AM_CXXFLAGS = $(cflagWin) v_simpixmaps_DATA = $(OB_PIX) EXTRA_DIST = openbabel.png v_sim-3.7.0/lib/plug-ins/OpenBabel-wrapper/Makefile.in0000644000353400050620000005541512216330211017440 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = lib/plug-ins/OpenBabel-wrapper DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/abinit.m4 \ $(top_srcdir)/m4/ax_check_gl.m4 \ $(top_srcdir)/m4/ax_check_glu.m4 \ $(top_srcdir)/m4/ax_lang_compiler_ms.m4 \ $(top_srcdir)/m4/ax_lapack.m4 $(top_srcdir)/m4/bigdft.m4 \ $(top_srcdir)/m4/etsf_io.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/libxc.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/netcdf.m4 \ $(top_srcdir)/m4/python.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(v_simpluginsdir)" \ "$(DESTDIR)$(v_simpixmapsdir)" LTLIBRARIES = $(v_simplugins_LTLIBRARIES) am__DEPENDENCIES_1 = libobloader_la_DEPENDENCIES = \ $(top_builddir)/src/lib@PACKAGE_TARNAME@-3.la \ $(am__DEPENDENCIES_1) am_libobloader_la_OBJECTS = ob_basic.lo libobloader_la_OBJECTS = $(am_libobloader_la_OBJECTS) libobloader_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(libobloader_la_LDFLAGS) $(LDFLAGS) -o $@ @HAVE_OPENBABEL_TRUE@am_libobloader_la_rpath = -rpath \ @HAVE_OPENBABEL_TRUE@ $(v_simpluginsdir) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libobloader_la_SOURCES) DIST_SOURCES = $(libobloader_la_SOURCES) DATA = $(v_simpixmaps_DATA) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AB_CPPFLAGS = @AB_CPPFLAGS@ AB_LIBS = @AB_LIBS@ ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIGDFT_CPPFLAGS = @BIGDFT_CPPFLAGS@ BIGDFT_LIBS = @BIGDFT_LIBS@ BLAS_LIBS = @BLAS_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETSF_IO_LIBS = @ETSF_IO_LIBS@ EXEEXT = @EXEEXT@ EXTRA_CFLAGS = @EXTRA_CFLAGS@ EXTRA_LDFLAGS = @EXTRA_LDFLAGS@ EXTRA_LIBS = @EXTRA_LIBS@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ FCLIBS = @FCLIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLIBS = @FLIBS@ FONT_BOLD = @FONT_BOLD@ FONT_NORMAL = @FONT_NORMAL@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_BIGDFT_CFLAGS = @GLIB_BIGDFT_CFLAGS@ GLIB_BIGDFT_LIBS = @GLIB_BIGDFT_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GOBJECT_INTROSPECTION_REQUIRED = @GOBJECT_INTROSPECTION_REQUIRED@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTKS_CFLAGS = @GTKS_CFLAGS@ GTKS_LIBS = @GTKS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_SCANNER = @G_IR_SCANNER@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LAPACK_LIBS = @LAPACK_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXC_LIBS = @LIBXC_LIBS@ LIB_ARCHIVE_CFLAGS = @LIB_ARCHIVE_CFLAGS@ LIB_ARCHIVE_LIBS = @LIB_ARCHIVE_LIBS@ LIB_YAML_CFLAGS = @LIB_YAML_CFLAGS@ LIB_YAML_LIBS = @LIB_YAML_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NC_CPPFLAGS = @NC_CPPFLAGS@ NC_LDFLAGS = @NC_LDFLAGS@ NC_LIBS = @NC_LIBS@ NC_NETCDF_3_CPPFLAG = @NC_NETCDF_3_CPPFLAG@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBABEL_CFLAGS = @OPENBABEL_CFLAGS@ OPENBABEL_LIBS = @OPENBABEL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PYGOBJECT_CFLAGS = @PYGOBJECT_CFLAGS@ PYGOBJECT_LIBS = @PYGOBJECT_LIBS@ PYGOBJECT_REQUIRED = @PYGOBJECT_REQUIRED@ PYGTK_CFLAGS = @PYGTK_CFLAGS@ PYGTK_LIBS = @PYGTK_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_INCLUDES = @PYTHON_INCLUDES@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ V_SIM_MAJOR_VERSION = @V_SIM_MAJOR_VERSION@ V_SIM_MICRO_VERSION = @V_SIM_MICRO_VERSION@ V_SIM_MINOR_VERSION = @V_SIM_MINOR_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ girdir = @girdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ lib_v_sim_version = @lib_v_sim_version@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typelibsdir = @typelibsdir@ v_simexamplesdir = @v_simexamplesdir@ v_simexedir = @v_simexedir@ v_simiconsdir = @v_simiconsdir@ v_simlegaldir = @v_simlegaldir@ v_simpixmapsdir = @v_simpixmapsdir@ v_simpluginsdir = @v_simpluginsdir@ v_simresourcesdir = @v_simresourcesdir@ visupyexecdir = @visupyexecdir@ visutypelibsdir = @visutypelibsdir@ libobloader_la_SOURCES = ob_basic.cpp libobloader_la_LDFLAGS = -module -version-info $(lib_v_sim_version) libobloader_la_LIBADD = $(top_builddir)/src/lib@PACKAGE_TARNAME@-3.la \ $(OPENBABEL_LIBS) @GLIB_LIBS@ @HAVE_OPENBABEL_TRUE@OB_LIB = libobloader.la @HAVE_OPENBABEL_TRUE@OB_PIX = openbabel.png v_simplugins_LTLIBRARIES = \ $(OB_LIB) INCLUDES = \ -I$(top_srcdir)/src \ $(OPENBABEL_CFLAGS) \ @GLIB_CFLAGS@ @PLATFORM_WIN32_TRUE@cflagWin = -mms-bitfields -mno-cygwin AM_CXXFLAGS = $(cflagWin) v_simpixmaps_DATA = $(OB_PIX) EXTRA_DIST = openbabel.png all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu lib/plug-ins/OpenBabel-wrapper/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu lib/plug-ins/OpenBabel-wrapper/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-v_simpluginsLTLIBRARIES: $(v_simplugins_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(v_simpluginsdir)" || $(MKDIR_P) "$(DESTDIR)$(v_simpluginsdir)" @list='$(v_simplugins_LTLIBRARIES)'; test -n "$(v_simpluginsdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(v_simpluginsdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(v_simpluginsdir)"; \ } uninstall-v_simpluginsLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(v_simplugins_LTLIBRARIES)'; test -n "$(v_simpluginsdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(v_simpluginsdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(v_simpluginsdir)/$$f"; \ done clean-v_simpluginsLTLIBRARIES: -test -z "$(v_simplugins_LTLIBRARIES)" || rm -f $(v_simplugins_LTLIBRARIES) @list='$(v_simplugins_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libobloader.la: $(libobloader_la_OBJECTS) $(libobloader_la_DEPENDENCIES) $(EXTRA_libobloader_la_DEPENDENCIES) $(libobloader_la_LINK) $(am_libobloader_la_rpath) $(libobloader_la_OBJECTS) $(libobloader_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ob_basic.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-v_simpixmapsDATA: $(v_simpixmaps_DATA) @$(NORMAL_INSTALL) test -z "$(v_simpixmapsdir)" || $(MKDIR_P) "$(DESTDIR)$(v_simpixmapsdir)" @list='$(v_simpixmaps_DATA)'; test -n "$(v_simpixmapsdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(v_simpixmapsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(v_simpixmapsdir)" || exit $$?; \ done uninstall-v_simpixmapsDATA: @$(NORMAL_UNINSTALL) @list='$(v_simpixmaps_DATA)'; test -n "$(v_simpixmapsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(v_simpixmapsdir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) installdirs: for dir in "$(DESTDIR)$(v_simpluginsdir)" "$(DESTDIR)$(v_simpixmapsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-v_simpluginsLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-v_simpixmapsDATA \ install-v_simpluginsLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-v_simpixmapsDATA \ uninstall-v_simpluginsLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-v_simpluginsLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip install-v_simpixmapsDATA \ install-v_simpluginsLTLIBRARIES installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-v_simpixmapsDATA \ uninstall-v_simpluginsLTLIBRARIES vpath %.h $(top_srcdir)/src # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: v_sim-3.7.0/lib/plug-ins/OpenBabel-wrapper/ob_basic.cpp0000644000353400050620000003064712215546157017661 00000000000000 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace OpenBabel; extern "C" { gboolean obloaderInit(); const char* obloaderGet_description(); const char* obloaderGet_authors(); const char* obloaderGet_icon(); } #define OPENBABEL_DESCRIPTION _("" \ "This plug-in wraps the OpenBabel\n" \ "library (visit the home page at URL\n" \ "http://www.openbabel.org).") #define OPENBABEL_AUTHORS _("Caliste Damien:\n wrapper.") /* Local variables. */ static gchar *iconPath; /* Local methods. */ static gboolean loadOpenBabelFile(VisuData *data, const gchar* filename, ToolFileFormat *format, int nSet, GCancellable *cancel, GError **error); static gboolean saveOpenBabelFile(ToolFileFormat *format, const char* filename, int width, int height, VisuData *dataObj, guchar* imageData, GError **error, ToolVoidDataFunc functionWait, gpointer data); static gpointer waitData; static ToolVoidDataFunc waitFunc; /* Required methods for a loadable module. */ gboolean obloaderInit() { const gchar *type[] = {(char*)0}; const gchar *typeOut[] = {(char*)"*.cif", (char*)"*.cml", (char*)"*.dmol", (char*)0}; VisuDump *dump; DBG_fprintf(stderr, "OpenBabel: loading plug-in 'openbabel'...\n"); visu_rendering_addFileFormat(visu_rendering_getByName(VISU_RENDERING_ATOMIC_NAME), 0, tool_file_format_new(_("OpenBabel known formats"), type), 75, loadOpenBabelFile); iconPath = g_build_filename(V_SIM_PIXMAPS_DIR, "openbabel.png", NULL); /* Declare the output using OpenBabel. */ dump = visu_dump_new(_("OpenBabel output formats"), typeOut, saveOpenBabelFile, FALSE); g_object_set(G_OBJECT(dump), "ignore-type", TRUE, NULL); waitData = (gpointer)0; waitFunc = (ToolVoidDataFunc)0; return TRUE; } const char* obloaderGet_description() { return OPENBABEL_DESCRIPTION; } const char* obloaderGet_authors() { return OPENBABEL_AUTHORS; } const char* obloaderGet_icon() { return (char*)iconPath; } static char* getSymbol(OpenBabel::OBAtom *atom) { return (char*)etab.GetSymbol(atom->GetAtomicNum()); } static void addNode(GList **lst, OpenBabel::OBAtom *atom) { char *ele; GList *tmplst; GList *lstatom; gboolean found; ele = getSymbol(atom); /* Look for type ele in lst. */ found = FALSE; tmplst = *lst; while (tmplst && !found) { lstatom = (GList*)tmplst->data; if ( !strcmp(getSymbol((OpenBabel::OBAtom*)lstatom->data), ele) ) { // fprintf(stderr, "one node for element '%s'\n", ele); lstatom = g_list_prepend(lstatom, (gpointer)atom); tmplst->data = lstatom; found = TRUE; } tmplst = g_list_next(tmplst); } if (!found) { // fprintf(stderr, "one element '%s'\n", ele); lstatom = (GList*)0; lstatom = g_list_prepend(lstatom, (gpointer)atom); *lst = g_list_prepend(*lst, lstatom); } } static gboolean loadOpenBabelFile(VisuData *data, const gchar* filename, ToolFileFormat *format, int nSet _U_, GCancellable *cancel _U_, GError **error) { OpenBabel::OBMol *mol; OpenBabel::OBFormat *pFormat, *xyzFormat; bool res; std::ifstream fin(filename); std::istream* pIn = &fin; OpenBabel::OBConversion conv(pIn, NULL); GList *allNodes, *lstatom, *tmplst; int i, j; GArray *nattyp, *types; VisuElement *ele1, *ele2; guint nNodes; guint ntype; OpenBabel::OBUnitCell *uc; double rprimdFull[9], rprimd[3][3]; std::vector eleRGB; float xyz[3], xyz0[3], length, lengthMin, lengthMax; GList *pairs; gchar *infoUTF8; double vect[3], radius; gboolean newEle; VisuBox *box; g_return_val_if_fail(error && *error == (GError*)0, FALSE); g_return_val_if_fail(data && filename, FALSE); /* Create a new OpenBabel object. */ mol = new OpenBabel::OBMol; /* Try to guess the file format. */ DBG_fprintf(stderr, "Open Babel: try to guess the file format of '%s'.\n", filename); pFormat = conv.FormatFromExt(filename); if (!pFormat) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("'%s' doesn't match any file format."), filename); fin.close(); delete mol; return FALSE; } if ( pFormat->Flags() & NOTREADABLE ) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("format of '%s' is not a readable one."), filename); fin.close(); delete mol; return FALSE; } /* Exclude the xyz file format since V_Sim handles it natively. */ xyzFormat = conv.FindFormat("xyz"); if (xyzFormat == pFormat) { DBG_fprintf(stderr, "OpenBabel: skip XYZ format.\n"); fin.close(); delete mol; return FALSE; } DBG_fprintf(stderr, " | set format %p.\n", (gpointer)pFormat); DBG_fprintf(stderr, " | format description\n%s\n", pFormat->Description()); conv.SetInFormat(pFormat); /* Read the file. */ DBG_fprintf(stderr, "Open Babel: read the file.\n"); res = conv.Read(mol); fin.close(); DBG_fprintf(stderr, " | read OK.\n"); if (!res) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("The given file doesn't match the format '%s'."), tool_file_format_getName(format)); delete mol; return FALSE; } /* Store if the file is periodic or not. */ uc = (OBUnitCell*)mol->GetData(OBGenericDataType::UnitCell); if (uc) { DBG_fprintf(stderr, "OpenBabel: file has periodic conditions.\n"); uc->GetCellMatrix().GetArray(rprimdFull); for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) rprimd[j][i] = rprimdFull[i * 3 + j]; box = visu_box_new_full(rprimd, VISU_BOX_PERIODIC); visu_boxed_setBox(VISU_BOXED(data), VISU_BOXED(box), FALSE); g_object_unref(box); uc->GetOffset().Get(vect); } else { DBG_fprintf(stderr, "OpenBabel: file has no periodic conditions.\n"); for (i = 0; i < 3; i++) vect[i] = 0.; box = (VisuBox*)0; } DBG_fprintf(stderr, "OpenBabel: first pass to find Elements.\n"); allNodes = (GList*)0; FOR_ATOMS_OF_MOL(a,mol) { addNode(&allNodes, &(*a)); } DBG_fprintf(stderr, "OpenBabel: count nodes.\n"); /* Allocate the space for the nodes. */ ntype = g_list_length(allNodes); DBG_fprintf(stderr, " | %d types.\n", ntype); types = g_array_sized_new(FALSE, FALSE, sizeof(VisuElement*), ntype); nattyp = g_array_sized_new(FALSE, FALSE, sizeof(guint), ntype); /* Get the visuelements. */ tmplst = allNodes; while (tmplst) { lstatom = (GList*)tmplst->data; ele1 = visu_element_retrieveFromName(getSymbol((OpenBabel::OBAtom*)lstatom->data), &newEle); g_array_append_val(types, ele1); if (newEle) { // We use the standard OB colours. eleRGB = etab.GetRGB(((OpenBabel::OBAtom*)lstatom->data)->GetAtomicNum()); ele1->rgb[0] = eleRGB[0]; ele1->rgb[1] = eleRGB[1]; ele1->rgb[2] = eleRGB[2]; tool_color_addFloatRGBA(ele1->rgb, NULL); // We use standard radius for element. radius = etab.GetCovalentRad(((OpenBabel::OBAtom*)lstatom->data)->GetAtomicNum()); visu_rendering_atomic_setRadius(ele1, (float)radius); } nNodes = g_list_length(lstatom); g_array_append_val(nattyp, nNodes); g_list_free(lstatom); DBG_fprintf(stderr, " | '%s' : %d.\n", ele1->name, nNodes); tmplst = g_list_next(tmplst); } g_list_free(allNodes); /* Allocate space in the given visudata. */ visu_node_array_allocate(VISU_NODE_ARRAY(data), types, nattyp); g_array_free(nattyp, TRUE); g_array_free(types, TRUE); /* Stores coordinates. */ FOR_ATOMS_OF_MOL(a,mol) { xyz0[0] = xyz[0] = (float)a->GetX() + vect[0]; xyz0[1] = xyz[1] = (float)a->GetY() + vect[1]; xyz0[2] = xyz[2] = (float)a->GetZ() + vect[2]; if (uc) visu_box_convertFullToCell(box, xyz, xyz0); visu_data_addNodeFromElementName(data, getSymbol(&(*a)), xyz, FALSE, FALSE); } if (!uc) box = visu_data_setTightBox(data); visu_box_setMargin(box, visu_node_array_getMaxElementSize(VISU_NODE_ARRAY(data)) + visu_data_getAllNodeExtens(data, box), TRUE); /* Set the bonds, if any. */ FOR_BONDS_OF_MOL(b, mol) { ele1 = visu_element_lookup(getSymbol(b->GetBeginAtom())); ele2 = visu_element_lookup(getSymbol(b->GetEndAtom())); pairs = visu_pair_link_getAll(ele1, ele2); lengthMin = visu_pair_link_getDistance((VisuPairLink*)pairs->data, VISU_PAIR_DISTANCE_MIN); lengthMax = visu_pair_link_getDistance((VisuPairLink*)pairs->data, VISU_PAIR_DISTANCE_MAX); length = (float)b->GetLength(); if (lengthMax < length) visu_pair_link_setDistance((VisuPairLink*)pairs->data, length, VISU_PAIR_DISTANCE_MAX); if (lengthMin > length || lengthMin == 0.) visu_pair_link_setDistance((VisuPairLink*)pairs->data, length, VISU_PAIR_DISTANCE_MIN); } /* Set the commentary. */ if (mol->GetTitle()) { infoUTF8 = g_locale_to_utf8(mol->GetTitle(), -1, NULL, NULL, NULL); if (infoUTF8) { visu_data_setFileCommentary(data, infoUTF8, 0); g_free(infoUTF8); } else { g_warning("Can't convert '%s' to UTF8.\n", mol->GetTitle()); } } delete mol; return TRUE; } static gboolean saveOpenBabelFile(ToolFileFormat *format _U_, const char* filename, int width _U_, int height _U_, VisuData *dataObj, guchar* imageData _U_, GError **error, ToolVoidDataFunc functionWait, gpointer data) { std::ofstream fout(filename); std::ostream* pOut = &fout; OpenBabel::OBConversion conv(NULL, pOut); OpenBabel::OBFormat *pFormat; OpenBabel::OBMol *mol; OpenBabel::OBAtom *atom; OpenBabel::OBUnitCell *cell; OpenBabel::vector3 a(0.,0.,0.), b(0.,0.,0.), c(0.,0.,0.); VisuNodeArrayIter iter; float coord[3]; bool res; gchar *comment; double matrix[3][3]; waitData = data; waitFunc = functionWait; /* Try to guess the file format. */ DBG_fprintf(stderr, "Open Babel: try to guess the fileformat of '%s'.\n", filename); pFormat = conv.FormatFromExt(filename); if (!pFormat) { *error = g_error_new(VISU_ERROR_DUMP, DUMP_ERROR_FILE, _("'%s' doesn't match any file format."), filename); fout.close(); return FALSE; } if ( pFormat->Flags() & NOTWRITABLE ) { *error = g_error_new(VISU_ERROR_DUMP, DUMP_ERROR_FILE, _("format of '%s' is not a readable one."), filename); fout.close(); return FALSE; } DBG_fprintf(stderr, " | set format %p.\n", (gpointer)pFormat); DBG_fprintf(stderr, " | format description\n%s\n", pFormat->Description()); conv.SetOutFormat(pFormat); /* Create a new OpenBabel object. */ mol = new OpenBabel::OBMol; comment = visu_data_getFileCommentary(dataObj, visu_data_getISubset(dataObj)); if (comment) mol->SetTitle(comment); if (visu_box_getBoundary(visu_boxed_getBox(VISU_BOXED(dataObj))) != VISU_BOX_FREE) { cell = new OpenBabel::OBUnitCell; visu_box_getCellMatrix(visu_boxed_getBox(VISU_BOXED(dataObj)), matrix); a.Set(matrix[0]); b.Set(matrix[1]); c.Set(matrix[2]); cell->SetData(a, b, c); mol->SetData(cell); } visu_node_array_iterNew(VISU_NODE_ARRAY(dataObj), &iter); mol->ReserveAtoms(iter.nAllStoredNodes); for (visu_node_array_iterStart(VISU_NODE_ARRAY(dataObj), &iter); iter.node; visu_node_array_iterNext(VISU_NODE_ARRAY(dataObj), &iter)) { atom = mol->NewAtom(); atom->SetAtomicNum(etab.GetAtomicNum(iter.element->name)); visu_data_getNodePosition(dataObj, iter.node, coord); atom->SetVector((double)coord[0], (double)coord[1], (double)coord[2]); } DBG_fprintf(stderr, "Open Babel: calling write routine.\n"); res = conv.Write(mol); DBG_fprintf(stderr, "Open Babel: free memory.\n"); delete mol; fout.close(); if (!res) { *error = g_error_new(VISU_ERROR_DUMP, DUMP_ERROR_FILE, _("Unable to write the file.")); return FALSE; } DBG_fprintf(stderr, "Open Babel: write succeed.\n"); return TRUE; } v_sim-3.7.0/lib/plug-ins/OpenBabel-wrapper/openbabel.png0000644000353400050620000000541712215546157020046 00000000000000PNG  IHDR VόbKGD pHYs.#.#x?vtIME9: IDATHǭWiU~w~~I$:! Z,NA&S3UԄRA@HB NعI:Mw:}kۿb MEy{9e_T֮]+3㳿rï֯YLd*^Φ!}X>-V؝ G_Qѥe3Fs0LB CW[y#Xo5#3mR>8Ķ+{ۂ d,bSlnnNbqEVsQ?(,:̽pbn?TeA!,N|bR,_|_}Ta bĢbڤvٚ Bk S Ȃ I )U.AQ}_(bq]vYl}g?is=׌9FnxU3}X0vFFA(sVX`@qR׽<w#xwogzm>4.vc>)!4Igi zR#% K?3z{{AI߯Tg.l>iӕ3pe]VD1!,s1@р@K' G ' s.|nJ&&FlY## oqأdzчSx(}-@( $`qQ< @L(j;`||\k6ͷzkOnu|bb}me5fW\Gjg`i I ڀz@3ǘEE0yq`l#MӺ"4= yLW;+v=+7tJ VǵIE37g]x fr NMEa$ e}T,ȇzW cxddiPԶ$%NLڶ+?c -$x  ^*QzqkGٍDUZMlN^uB鍦^"qqLeT6dfgO jJɖPe۶#wLOk2qIѢѦ85L h@O4v,0}|d  7MC,i: r8 j/ ۶}s'Ye%M7/}pj 6rsumMwupQ2?oB\lKŽ?ƗFM6nB!wM\ Y?z̾WW{rC;?q&a݁᪆C@j@@Qh>3(j|̀0,['m}ji鎌yk˓' E1@7q B0bER{tX*CeqXƑFG`.,4<Ʋ+ }YPJI:=;ߙϿ/_YwO-J Ki*~@IՎ3Y92Jsض `4(#BGQV*2`) {ךDV'3A[y, x3c@aP1;;YUCB8GOrk[پvݝVd8L@uqT`Y{kwYw*p2HTDWAxrJP ru\_A1,+  D%)Ml8p  ²LԛLˆE @]L9A SR`ojg*%3<'&~G$?Fg5lTOۺnPC7=j TuX&cɕ8J^ 覴/BʔF ߏ*' pixh`D3g˥j5W\m/bzjP`; 4  <= $/'A2!$pLGacQ,(OOcJ>ua&R.Y<#80:/zn{e}ܼ)pGmqHwٌPC`bIH<Y׼||llrZ'#a̡BF)5ł,#[$*OmWm*]b)BdB5.&7~{knnNK{4MN>??_Cd*&A %%(\Mg2 _)i"iIENDB`v_sim-3.7.0/lib/plug-ins/xsf/0000755000353400050620000000000012216331347012747 500000000000000v_sim-3.7.0/lib/plug-ins/xsf/Makefile.am0000644000353400050620000000117012215546157014730 00000000000000## Process this file with automake to produce Makefile.in vpath %.h $(top_srcdir)/src libxsf_la_SOURCES = xsf.c xsf.h xsf_density.c xsf_density.h libxsf_la_LIBADD = $(top_builddir)/src/lib@PACKAGE_TARNAME@-3.la \ @GLIB_LIBS@ libxsf_la_LDFLAGS = -module @EXTRA_LDFLAGS@ -version-info $(lib_v_sim_version) if HAVE_XSF XSF_LIB = libxsf.la XSF_EXAMPLE = cinchonidine.xsf.bz2 XSF_PIX = xsf.png endif v_simplugins_LTLIBRARIES = \ $(XSF_LIB) INCLUDES = \ -I$(top_srcdir)/src \ @GLIB_CFLAGS@ AM_CFLAGS = @EXTRA_CFLAGS@ v_simexamples_DATA = $(XSF_EXAMPLE) v_simpixmaps_DATA = $(XSF_PIX) EXTRA_DIST = cinchonidine.xsf.bz2 xsf.png v_sim-3.7.0/lib/plug-ins/xsf/Makefile.in0000644000353400050620000005703012216330211014726 00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = lib/plug-ins/xsf DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/abinit.m4 \ $(top_srcdir)/m4/ax_check_gl.m4 \ $(top_srcdir)/m4/ax_check_glu.m4 \ $(top_srcdir)/m4/ax_lang_compiler_ms.m4 \ $(top_srcdir)/m4/ax_lapack.m4 $(top_srcdir)/m4/bigdft.m4 \ $(top_srcdir)/m4/etsf_io.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/libxc.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/netcdf.m4 \ $(top_srcdir)/m4/python.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(v_simpluginsdir)" \ "$(DESTDIR)$(v_simexamplesdir)" "$(DESTDIR)$(v_simpixmapsdir)" LTLIBRARIES = $(v_simplugins_LTLIBRARIES) libxsf_la_DEPENDENCIES = \ $(top_builddir)/src/lib@PACKAGE_TARNAME@-3.la am_libxsf_la_OBJECTS = xsf.lo xsf_density.lo libxsf_la_OBJECTS = $(am_libxsf_la_OBJECTS) libxsf_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libxsf_la_LDFLAGS) $(LDFLAGS) -o $@ @HAVE_XSF_TRUE@am_libxsf_la_rpath = -rpath $(v_simpluginsdir) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libxsf_la_SOURCES) DIST_SOURCES = $(libxsf_la_SOURCES) DATA = $(v_simexamples_DATA) $(v_simpixmaps_DATA) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) AB_CPPFLAGS = @AB_CPPFLAGS@ AB_LIBS = @AB_LIBS@ ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIGDFT_CPPFLAGS = @BIGDFT_CPPFLAGS@ BIGDFT_LIBS = @BIGDFT_LIBS@ BLAS_LIBS = @BLAS_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETSF_IO_LIBS = @ETSF_IO_LIBS@ EXEEXT = @EXEEXT@ EXTRA_CFLAGS = @EXTRA_CFLAGS@ EXTRA_LDFLAGS = @EXTRA_LDFLAGS@ EXTRA_LIBS = @EXTRA_LIBS@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ FCLIBS = @FCLIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FLIBS = @FLIBS@ FONT_BOLD = @FONT_BOLD@ FONT_NORMAL = @FONT_NORMAL@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIB_BIGDFT_CFLAGS = @GLIB_BIGDFT_CFLAGS@ GLIB_BIGDFT_LIBS = @GLIB_BIGDFT_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GLU_CFLAGS = @GLU_CFLAGS@ GLU_LIBS = @GLU_LIBS@ GL_CFLAGS = @GL_CFLAGS@ GL_LIBS = @GL_LIBS@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GOBJECT_INTROSPECTION_REQUIRED = @GOBJECT_INTROSPECTION_REQUIRED@ GREP = @GREP@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTKS_CFLAGS = @GTKS_CFLAGS@ GTKS_LIBS = @GTKS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_SCANNER = @G_IR_SCANNER@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ LAPACK_LIBS = @LAPACK_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXC_LIBS = @LIBXC_LIBS@ LIB_ARCHIVE_CFLAGS = @LIB_ARCHIVE_CFLAGS@ LIB_ARCHIVE_LIBS = @LIB_ARCHIVE_LIBS@ LIB_YAML_CFLAGS = @LIB_YAML_CFLAGS@ LIB_YAML_LIBS = @LIB_YAML_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ NC_CPPFLAGS = @NC_CPPFLAGS@ NC_LDFLAGS = @NC_LDFLAGS@ NC_LIBS = @NC_LIBS@ NC_NETCDF_3_CPPFLAG = @NC_NETCDF_3_CPPFLAG@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENBABEL_CFLAGS = @OPENBABEL_CFLAGS@ OPENBABEL_LIBS = @OPENBABEL_LIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ PYGOBJECT_CFLAGS = @PYGOBJECT_CFLAGS@ PYGOBJECT_LIBS = @PYGOBJECT_LIBS@ PYGOBJECT_REQUIRED = @PYGOBJECT_REQUIRED@ PYGTK_CFLAGS = @PYGTK_CFLAGS@ PYGTK_LIBS = @PYGTK_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_INCLUDES = @PYTHON_INCLUDES@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ V_SIM_MAJOR_VERSION = @V_SIM_MAJOR_VERSION@ V_SIM_MICRO_VERSION = @V_SIM_MICRO_VERSION@ V_SIM_MINOR_VERSION = @V_SIM_MINOR_VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ girdir = @girdir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ lib_v_sim_version = @lib_v_sim_version@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ typelibsdir = @typelibsdir@ v_simexamplesdir = @v_simexamplesdir@ v_simexedir = @v_simexedir@ v_simiconsdir = @v_simiconsdir@ v_simlegaldir = @v_simlegaldir@ v_simpixmapsdir = @v_simpixmapsdir@ v_simpluginsdir = @v_simpluginsdir@ v_simresourcesdir = @v_simresourcesdir@ visupyexecdir = @visupyexecdir@ visutypelibsdir = @visutypelibsdir@ libxsf_la_SOURCES = xsf.c xsf.h xsf_density.c xsf_density.h libxsf_la_LIBADD = $(top_builddir)/src/lib@PACKAGE_TARNAME@-3.la \ @GLIB_LIBS@ libxsf_la_LDFLAGS = -module @EXTRA_LDFLAGS@ -version-info $(lib_v_sim_version) @HAVE_XSF_TRUE@XSF_LIB = libxsf.la @HAVE_XSF_TRUE@XSF_EXAMPLE = cinchonidine.xsf.bz2 @HAVE_XSF_TRUE@XSF_PIX = xsf.png v_simplugins_LTLIBRARIES = \ $(XSF_LIB) INCLUDES = \ -I$(top_srcdir)/src \ @GLIB_CFLAGS@ AM_CFLAGS = @EXTRA_CFLAGS@ v_simexamples_DATA = $(XSF_EXAMPLE) v_simpixmaps_DATA = $(XSF_PIX) EXTRA_DIST = cinchonidine.xsf.bz2 xsf.png all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu lib/plug-ins/xsf/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu lib/plug-ins/xsf/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-v_simpluginsLTLIBRARIES: $(v_simplugins_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(v_simpluginsdir)" || $(MKDIR_P) "$(DESTDIR)$(v_simpluginsdir)" @list='$(v_simplugins_LTLIBRARIES)'; test -n "$(v_simpluginsdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(v_simpluginsdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(v_simpluginsdir)"; \ } uninstall-v_simpluginsLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(v_simplugins_LTLIBRARIES)'; test -n "$(v_simpluginsdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(v_simpluginsdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(v_simpluginsdir)/$$f"; \ done clean-v_simpluginsLTLIBRARIES: -test -z "$(v_simplugins_LTLIBRARIES)" || rm -f $(v_simplugins_LTLIBRARIES) @list='$(v_simplugins_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libxsf.la: $(libxsf_la_OBJECTS) $(libxsf_la_DEPENDENCIES) $(EXTRA_libxsf_la_DEPENDENCIES) $(libxsf_la_LINK) $(am_libxsf_la_rpath) $(libxsf_la_OBJECTS) $(libxsf_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xsf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xsf_density.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-v_simexamplesDATA: $(v_simexamples_DATA) @$(NORMAL_INSTALL) test -z "$(v_simexamplesdir)" || $(MKDIR_P) "$(DESTDIR)$(v_simexamplesdir)" @list='$(v_simexamples_DATA)'; test -n "$(v_simexamplesdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(v_simexamplesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(v_simexamplesdir)" || exit $$?; \ done uninstall-v_simexamplesDATA: @$(NORMAL_UNINSTALL) @list='$(v_simexamples_DATA)'; test -n "$(v_simexamplesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(v_simexamplesdir)'; $(am__uninstall_files_from_dir) install-v_simpixmapsDATA: $(v_simpixmaps_DATA) @$(NORMAL_INSTALL) test -z "$(v_simpixmapsdir)" || $(MKDIR_P) "$(DESTDIR)$(v_simpixmapsdir)" @list='$(v_simpixmaps_DATA)'; test -n "$(v_simpixmapsdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(v_simpixmapsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(v_simpixmapsdir)" || exit $$?; \ done uninstall-v_simpixmapsDATA: @$(NORMAL_UNINSTALL) @list='$(v_simpixmaps_DATA)'; test -n "$(v_simpixmapsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(v_simpixmapsdir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) installdirs: for dir in "$(DESTDIR)$(v_simpluginsdir)" "$(DESTDIR)$(v_simexamplesdir)" "$(DESTDIR)$(v_simpixmapsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-v_simpluginsLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-v_simexamplesDATA install-v_simpixmapsDATA \ install-v_simpluginsLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-v_simexamplesDATA uninstall-v_simpixmapsDATA \ uninstall-v_simpluginsLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-v_simpluginsLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip install-v_simexamplesDATA \ install-v_simpixmapsDATA install-v_simpluginsLTLIBRARIES \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-v_simexamplesDATA \ uninstall-v_simpixmapsDATA uninstall-v_simpluginsLTLIBRARIES vpath %.h $(top_srcdir)/src # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: v_sim-3.7.0/lib/plug-ins/xsf/xsf.c0000644000353400050620000005055412216266774013657 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "xsf.h" #include "xsf_density.h" #include #include #include #include #include #include #include #include #define XSF_DESCRIPTION _("" \ "This plug-in reads XSF" \ " input files\n (position, forces and densities).") #define XSF_AUTHORS "Caliste Damien" /* Local methods */ static gboolean loadXsfIn(VisuData *data, const gchar* filename, ToolFileFormat *format, int nSet, GCancellable *cancel, GError **error); static gboolean loadXsfSpin(VisuData *data, const gchar* filename, ToolFileFormat *format, int nSet, GCancellable *cancel, GError **error); static int read_xsf_file(VisuData *data, GIOChannel *flux, int nSet, GError **error); static void xsfStructuralInit(VisuRendering *method); static void xsfSpinInit(VisuRendering *method); /* Local variables */ static gchar *iconPath; /* Required methods for a loadable module. */ gboolean xsfInit() { DBG_fprintf(stderr, "XSF: loading plug-in 'xsf'...\n"); DBG_fprintf(stderr, "XSF: declare a new rendering load method.\n"); xsfStructuralInit(visu_rendering_getByName(VISU_RENDERING_ATOMIC_NAME)); DBG_fprintf(stderr, "XSF: declare a new spin load method.\n"); xsfSpinInit(visu_rendering_getByName(VISU_RENDERING_SPIN_NAME)); iconPath = g_build_filename(V_SIM_PIXMAPS_DIR, "xsf.png", NULL); DBG_fprintf(stderr, "XSF: declare a new density load method.\n"); xsfDensityInit(); return TRUE; } const char* xsfGet_description() { return XSF_DESCRIPTION; } const char* xsfGet_authors() { return XSF_AUTHORS; } const char* xsfGet_icon() { return iconPath; } static void xsfStructuralInit(VisuRendering *method) { const gchar *type[] = {"*.xsf", "*.axsf", (char*)0}; visu_rendering_addFileFormat(method, 0, tool_file_format_new(_("XCrysDen Structure File format"), type), 90, loadXsfIn); } static gboolean loadXsfIn(VisuData *data, const gchar* filename, ToolFileFormat *format _U_, int nSet, GCancellable *cancel _U_, GError **error) { int res; GIOChannel *readFrom; g_return_val_if_fail(error && *error == (GError*)0, FALSE); g_return_val_if_fail(data && filename, FALSE); readFrom = g_io_channel_new_file(filename, "r", error); if (!readFrom) return FALSE; res = read_xsf_file(data, readFrom, nSet, error); if (res < 0) /* The file is not a XSF file. */ return FALSE; else if (res > 0) /* The file is a XSF file but some errors occured. */ return TRUE; /* Everything is OK. */ *error = (GError*)0; return TRUE; } void xsf_reader_new(struct xsf_reader *rd) { /* The storage for read line. */ rd->line = g_string_new(""); /* Storage of number of elements per types. */ rd->ntype = 0; rd->elements = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_free); rd->nodeTypes = (VisuElement**)0; rd->bc = VISU_BOX_FREE; rd->coords = (float*)0; rd->forces = (float*)0; /* rd->lst = (GList*)0; */ } void xsf_reader_free(struct xsf_reader *rd) { /* GList *tmpLst; */ g_hash_table_destroy(rd->elements); if (rd->nodeTypes) g_free(rd->nodeTypes); if (rd->coords) g_free(rd->coords); if (rd->forces) g_free(rd->forces); /* if (rd->lst) */ /* { */ /* tmpLst = rd->lst; */ /* while (tmpLst) */ /* { */ /* g_free(tmpLst->data); */ /* tmpLst = g_list_next(tmpLst); */ /* } */ /* g_list_free(rd->lst); */ /* } */ g_string_free(rd->line, TRUE); if (g_io_channel_shutdown(rd->flux, FALSE, (GError**)0) != G_IO_STATUS_NORMAL) g_warning("XSF: can't close file."); g_io_channel_unref(rd->flux); } gboolean xsf_reader_skip_comment(struct xsf_reader *rd, GError **error) { gsize term; /* Eat blank or commentary lines. */ do { rd->status = g_io_channel_read_line_string(rd->flux, rd->line, &term, error); if (rd->status != G_IO_STATUS_NORMAL && rd->status != G_IO_STATUS_EOF) return FALSE; g_strstrip(rd->line->str); } while (rd->status != G_IO_STATUS_EOF && (rd->line->str[0] == '#' || rd->line->str[0] == '!' || rd->line->str[0] == '\0')); return TRUE; } gboolean xsf_reader_get_flag(struct xsf_reader *rd, gboolean *found, const gchar *flag, int *value, gboolean mandatory, GError **error) { size_t len; *found = FALSE; len = strlen(flag); g_strstrip(rd->line->str); if (!strncmp(rd->line->str, flag, len)) { if (mandatory && sscanf(rd->line->str + len, "%d", value) != 1 && *value <= 0) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong XSF format, '%s' flag has a" " wrong value.\n"), flag); return FALSE; } else if (!mandatory && sscanf(rd->line->str + len, "%d", value) == 1) { if (*value <= 0) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong XSF format, '%s' flag has a" " wrong value.\n"), flag); return FALSE; } } *found = TRUE; } if (*found) return xsf_reader_skip_comment(rd, error); else return TRUE; } static gboolean read_periodicity(struct xsf_reader *rd, GError **error) { gboolean found; if (!xsf_reader_get_flag(rd, &found, "MOLECULE", (int*)0, FALSE, error)) return FALSE; if (found) rd->bc = VISU_BOX_FREE; if (!xsf_reader_get_flag(rd, &found, "SLAB", (int*)0, FALSE, error)) return FALSE; if (found) rd->bc = VISU_BOX_SURFACE_XY; if (!xsf_reader_get_flag(rd, &found, "CRYSTAL", (int*)0, FALSE, error)) return FALSE; if (found) rd->bc = VISU_BOX_PERIODIC; return TRUE; } gboolean xsf_reader_get_box(struct xsf_reader *rd, double cart[3][3], GError **error) { int i; for (i = 0; i < 3; i++) { if (sscanf(rd->line->str, "%lf %lf %lf\n", cart[i], cart[i] + 1, cart[i] + 2) != 3) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong XSF format, missing float values" " after tag '%s'.\n"), "PRIMVEC"); return FALSE; } if (!xsf_reader_skip_comment(rd, error)) return FALSE; } DBG_fprintf(stderr, "XSF: read box %8g %8g %8g\n" " %8g %8g %8g\n" " %8g %8g %8g\n", cart[0][0], cart[0][1], cart[0][2], cart[1][0], cart[1][1], cart[1][2], cart[2][0], cart[2][1], cart[2][2]); return TRUE; } static gboolean read_coords(struct xsf_reader *rd, GError **error) { int i, zele, nb; float rcov, f[3]; gchar *name, *ptChar; VisuElement *type; struct VisuMethAscii *infos; if (sscanf(rd->line->str, "%d", &rd->nNodes) != 1 && rd->nNodes <= 0) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong XSF format, missing or wrong integer values" " after tag '%s'.\n"), "PRIMCOORD"); return FALSE; } if (!xsf_reader_skip_comment(rd, error)) return FALSE; rd->ntype = 0; rd->nodeTypes = g_malloc(sizeof(VisuElement*) * rd->nNodes); rd->coords = g_malloc(sizeof(float) * 3 * rd->nNodes); DBG_fprintf(stderr, "XSF: read coordinates.\n"); for (i = 0; i < rd->nNodes; i++) { name = g_strdup(rd->line->str); g_strstrip(name); ptChar = strchr(name, ' '); if (!ptChar) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong XSF format, can't read coordinates at line '%s'.\n"), name); return FALSE; } *ptChar = '\0'; /* The first three values are coordinates. Possible three others are forces. */ nb = sscanf(ptChar + 1, "%f %f %f %f %f %f\n", rd->coords + 3 * i, rd->coords + 3 * i + 1, rd->coords + 3 * i + 2, f + 0, f + 1, f + 2); if (nb != 3 && nb != 6) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong XSF format, can't read coordinates from '%s' (only %d read).\n"), ptChar + 1, nb); return FALSE; } if (nb == 6) { /* If forces where not used, we allocate then now. */ if (!rd->forces) rd->forces = g_malloc(sizeof(float) * 3 * rd->nNodes); rd->forces[3 * i + 0] = f[0]; rd->forces[3 * i + 1] = f[1]; rd->forces[3 * i + 2] = f[2]; } /* Try to find a z number instead of a name. */ rcov = -1.f; if (sscanf(name, "%d", &zele) == 1 && tool_physic_getSymbolFromZ(&ptChar, &rcov, zele)) { g_free(name); name = g_strdup(ptChar); } /* adding nomloc to the hashtable */ type = visu_element_retrieveFromName(name, (gboolean*)0); rd->nodeTypes[i] = type; infos = (struct VisuMethAscii*)g_hash_table_lookup(rd->elements, (gconstpointer)type); if (!infos) { infos = g_malloc(sizeof(struct VisuMethAscii)); infos->ele = type; infos->pos = rd->ntype; infos->nbNodes = 1; g_hash_table_insert(rd->elements, (gpointer)type, (gpointer)infos); rd->ntype += 1; } else infos->nbNodes += 1; if (!xsf_reader_skip_comment(rd, error)) return FALSE; } DBG_fprintf(stderr, " | read OK.\n"); return TRUE; } static int read_xsf_file(VisuData *data, GIOChannel *flux, int nSet, GError **error) { struct xsf_reader rd; gboolean found; int valInt; double box[3][3]; int i; int nSets, iNodes; GArray *nattyp, *types; VisuBox *boxObj; float xyz[3]; /* We read every line that corresponds to this schema : "%s %f %f %f" */ DBG_fprintf(stderr, "XSF: reading file as an xsf file.\n"); rd.flux = flux; xsf_reader_new(&rd); /* We read the file completely to find the number of sets of points and we store only the one corresponding to @nSet. */ nSets = -1; if (!xsf_reader_skip_comment(&rd, error)) { xsf_reader_free(&rd); return -1; } do { /* Test the periodicity mode. */ if (!read_periodicity(&rd, error)) { xsf_reader_free(&rd); return 1; } /* If ANIMSTEPS is found, we are in animated mode. */ if (!xsf_reader_get_flag(&rd, &found, "ANIMSTEPS", &valInt, TRUE, error)) { xsf_reader_free(&rd); return 1; } if (found) { DBG_fprintf(stderr, "XSF: found the 'ANIMSTEPS' flag (%d).\n", valInt); if (nSets > 0) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong XSF format, '%s' tag already" " defined.\n"), "ANIMSTEPS"); xsf_reader_free(&rd); return 1; } else nSets = valInt; } /* fprintf(stderr, "'%s'\n", rd.line->str); */ /* If PRIMVEC is found, we store the box. */ valInt = -1; if (!xsf_reader_get_flag(&rd, &found, "PRIMVEC", &valInt, FALSE, error)) { xsf_reader_free(&rd); return 1; } if (found && (valInt < 0 || (valInt - 1) == nSet)) { if (rd.bc == VISU_BOX_FREE) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong XSF format, primitive vectors found" " with free boundary conditions.\n")); xsf_reader_free(&rd); return 1; } DBG_fprintf(stderr, "XSF: found the 'PRIMVEC' flag (%d).\n", valInt); /* We read the box. */ if (!xsf_reader_get_box(&rd, box, error)) { xsf_reader_free(&rd); return 1; } /* We set nSets to 1 if not already set. */ if (nSets < 0) nSets = 1; } /* fprintf(stderr, "'%s'\n", rd.line->str); */ /* If PRIMCOORD is found, we store the coordinates. */ valInt = -1; if (!xsf_reader_get_flag(&rd, &found, "PRIMCOORD", &valInt, FALSE, error)) { xsf_reader_free(&rd); return 1; } if (found && (valInt < 0 || (valInt - 1) == nSet)) { if (rd.bc == VISU_BOX_FREE) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong XSF format, primitive coordinates found" " with free boundary conditions.\n")); xsf_reader_free(&rd); return 1; } DBG_fprintf(stderr, "XSF: found the 'PRIMCOORD' flag (%d).\n", valInt); /* We read the coords. */ if (!read_coords(&rd, error)) { xsf_reader_free(&rd); return 1; } /* We set nSets to 1 if not already set. */ if (nSets < 0) nSets = 1; } /* If ATOMS is found, we store the coordinates. */ valInt = -1; if (!xsf_reader_get_flag(&rd, &found, "ATOMS", &valInt, FALSE, error)) { xsf_reader_free(&rd); return 1; } if (found && (valInt < 0 || (valInt - 1) == nSet)) { if (rd.bc != VISU_BOX_FREE) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong XSF format, atom coordinates found" " with free boundary conditions.\n")); xsf_reader_free(&rd); return 1; } DBG_fprintf(stderr, "XSF: found the 'ATOMS' flag (%d).\n", valInt); /* We read the coords. */ if (!read_coords(&rd, error)) { xsf_reader_free(&rd); return 1; } /* We set nSets to 1 if not already set. */ if (nSets < 0) nSets = 1; } /* We go on. */ if (!xsf_reader_skip_comment(&rd, error)) { xsf_reader_free(&rd); return 1; } /* fprintf(stderr, "'%s'\n", rd.line->str); */ } while(rd.status != G_IO_STATUS_EOF && rd.coords == (float*)0); DBG_fprintf(stderr, " | found %d types.\n", rd.ntype); if (rd.ntype == 0) { xsf_reader_free(&rd); return -1; } /* Allocate the space for the nodes. */ types = g_array_sized_new(FALSE, FALSE, sizeof(VisuElement*), rd.ntype); nattyp = g_array_sized_new(FALSE, FALSE, sizeof(guint), rd.ntype); g_array_set_size(types, rd.ntype); g_array_set_size(nattyp, rd.ntype); g_hash_table_foreach(rd.elements, (GHFunc)visu_meth_asciiValToType, (gpointer)types); g_hash_table_foreach(rd.elements, (GHFunc)visu_meth_asciiValToNb, (gpointer)nattyp); DBG_fprintf(stderr, " | begin to transfer data to VisuData.\n"); /* Begin the storage into VisuData. */ visu_data_setNSubset(data, nSets); visu_node_array_allocate(VISU_NODE_ARRAY(data), types, nattyp); DBG_fprintf(stderr, "XSF: there are %d types in this file.\n", rd.ntype); if (DEBUG) for (i = 0; i < rd.ntype; i++) fprintf(stderr, " | %d atom(s) for type %d.\n", g_array_index(nattyp, guint, i), i); g_array_free(nattyp, TRUE); g_array_free(types, TRUE); /* Store the coordinates */ boxObj = visu_box_new_full(box, rd.bc); visu_boxed_setBox(VISU_BOXED(data), VISU_BOXED(boxObj), FALSE); g_object_unref(boxObj); for(iNodes = 0; iNodes < rd.nNodes; iNodes++) { visu_box_convertFullToCell(boxObj, xyz, rd.coords + 3 * iNodes); visu_data_addNodeFromElement(data, rd.nodeTypes[iNodes], xyz, FALSE, FALSE); } visu_box_setMargin(boxObj, visu_node_array_getMaxElementSize(VISU_NODE_ARRAY(data)) + visu_data_getAllNodeExtens(data, boxObj), TRUE); visu_box_setUnit(boxObj, TOOL_UNITS_ANGSTROEM); /* We store the forces as a property to be used later by the spin loading method. */ if (rd.forces) { visu_rendering_atomic_setForces(data, rd.forces); g_object_set_data_full(G_OBJECT(data), "XSF_forces", (gpointer)rd.forces, g_free); /* We nullify the rd.forces pointer to avoid its deletion. */ rd.forces = (float*)0; } /* Free the local data. */ xsf_reader_free(&rd); return 0; } static void freeSpin(gpointer obj, gpointer data _U_) { #if GLIB_MINOR_VERSION > 9 g_slice_free1(sizeof(float) * 3, obj); #else g_free(obj); #endif } static gpointer newOrCopySpin(gconstpointer obj, gpointer data _U_) { float *spinData; #if GLIB_MINOR_VERSION > 9 spinData = g_slice_alloc(sizeof(float) * 3); #else spinData = g_malloc(sizeof(float) * 3); #endif if (obj) memcpy(spinData, obj, sizeof(float) * 3); else memset(spinData, 0, sizeof(float) * 3); return (gpointer)spinData; } static void xsfSpinInit(VisuRendering *method) { const gchar *type[] = {"*.xsf", "*.axsf", (char*)0}; visu_rendering_addFileFormat(method, FILE_KIND_SPIN, tool_file_format_new(_("XCrysDen Structure File format"), type), 40, loadXsfSpin); } static void initMaxModulus(VisuElement *ele _U_, GValue *val) { DBG_fprintf(stderr, " | init max modulus of val %p.\n", (gpointer)val); g_value_init(val, G_TYPE_FLOAT); g_value_set_float(val, -G_MAXFLOAT); } static gboolean loadXsfSpin(VisuData *data, const gchar* filename, ToolFileFormat *format _U_, int nSet _U_, GCancellable *cancel _U_, GError **error) { float *forces, *svgSpinValues; GValueArray *svgMaxSpinModulus; float sph[3], vals[3]; VisuNodeProperty *spin; VisuNodeArrayIter iter; GValue spinValue = {0, {{0}, {0}}}; GValue *val; g_return_val_if_fail(error && *error == (GError*)0, FALSE); g_return_val_if_fail(data && filename, FALSE); forces = (float*)g_object_get_data(G_OBJECT(data), "XSF_forces"); if (!forces) return FALSE; /* We check that spin and position are the same. */ /* TODO... */ /* Create a storage for max values of spin modulus for each element. */ svgMaxSpinModulus = visu_node_array_setElementProperty(VISU_NODE_ARRAY(data), VISU_RENDERING_SPIN_MAX_MODULUS_ID, initMaxModulus); spin = visu_node_array_property_newPointer(VISU_NODE_ARRAY(data), VISU_RENDERING_SPIN_VALUES_ID, freeSpin, newOrCopySpin, (gpointer)0); g_value_init(&spinValue, G_TYPE_POINTER); visu_node_array_iterNew(VISU_NODE_ARRAY(data), &iter); for(visu_node_array_iterStartNumber(VISU_NODE_ARRAY(data), &iter); iter.node; visu_node_array_iterNextNodeNumber(VISU_NODE_ARRAY(data), &iter)) { visu_box_convertFullToCell(visu_boxed_getBox(VISU_BOXED(data)), vals, forces + iter.node->number * 3); tool_matrix_cartesianToSpherical(sph, vals); svgSpinValues = newOrCopySpin(sph, (gpointer)0); g_value_set_pointer(&spinValue, svgSpinValues); visu_node_property_setValue(spin, iter.node, &spinValue); val = g_value_array_get_nth(svgMaxSpinModulus, iter.iElement); g_value_set_float(val, MAX(vals[TOOL_MATRIX_SPHERICAL_MODULUS], g_value_get_float(val))); } /* We kill the temporary forces property. */ g_free(g_object_steal_data(G_OBJECT(data), "XSF_forces")); /* Everything is OK. */ *error = (GError*)0; return TRUE; } v_sim-3.7.0/lib/plug-ins/xsf/xsf.h0000644000353400050620000000474412215546157013657 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) Adresse ml : BILLARD, non joignable par ml ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est rgi par la licence CeCILL soumise au droit franais et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffuse par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accder cet en-tte signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accept les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD et Damien CALISTE, laboratoire L_Sim, (2001-2005) E-mail address: BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef XSF_H #define XSF_H #include #include #include struct xsf_reader { const gchar *filename; GString *line; GIOStatus status; GIOChannel *flux; /* GList *lst; */ int ntype; GHashTable *elements; VisuElement **nodeTypes; int nNodes; float *coords; float *forces; VisuBoxBoundaries bc; }; void xsf_reader_new(struct xsf_reader *rd); void xsf_reader_free(struct xsf_reader *rd); gboolean xsf_reader_skip_comment(struct xsf_reader *rd, GError **error); gboolean xsf_reader_get_flag(struct xsf_reader *rd, gboolean *found, const gchar *flag, int *value, gboolean mandatory, GError **error); gboolean xsf_reader_get_box(struct xsf_reader *rd, double cart[3][3], GError **error); #endif v_sim-3.7.0/lib/plug-ins/xsf/xsf_density.c0000644000353400050620000002045412215546157015405 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD, Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2011) Adresses mèl : BILLARD, non joignable par mèl ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD and Damien CALISTE and Olivier D'Astier, laboratoire L_Sim, (2001-2011) E-mail addresses : BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #include "xsf.h" #include "xsf_density.h" #include #include #include /* Local methods. */ static gboolean xsfDensityLoad(VisuScalarFieldMethod *meth, const gchar *filename, GList **fieldList, GError **error); void xsfDensityInit() { const gchar *type[] = {"*.xsf", "*.axsf", (char*)0}; visu_scalar_field_method_new(_("XCrysDen density file format"), type, xsfDensityLoad, G_PRIORITY_HIGH - 10); } static gboolean read_values(struct xsf_reader *rd, guint mesh[3], GArray **values, GError **error) { int i, j, n; gchar **tokens; GArray *density; #if DEBUG == 1 GTimer *timer; gulong fractionTimer; #endif #if DEBUG == 1 timer = g_timer_new(); g_timer_start(timer); #endif n = mesh[0] * mesh[1] * mesh[2]; density = g_array_sized_new(FALSE, FALSE, sizeof(double), n); density = g_array_set_size(density, n); DBG_fprintf(stderr, "XSF: read density (%gMo).\n", sizeof(double) * n / 1024. / 1024.); i = 0; do { tokens = g_strsplit(rd->line->str, " ", 0); for (j = 0; tokens[j] && i < n; j++) if (tokens[j][0]) { if (sscanf(tokens[j], "%lf", &g_array_index(density, double, i)) != 1) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong XSF format, unreadable float value" " %d for density.\n"), i); g_strfreev(tokens); g_array_unref(density); return FALSE; } i += 1; } g_strfreev(tokens); if (!xsf_reader_skip_comment(rd, error)) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong XSF format, missing density lines.\n")); g_array_unref(density); return FALSE; } } while(i < n && rd->status == G_IO_STATUS_NORMAL); #if DEBUG == 1 g_timer_stop(timer); fprintf(stderr, "XSF: density parsed in %g milli-s.\n", g_timer_elapsed(timer, &fractionTimer)/1e-3); g_timer_destroy(timer); #endif if (rd->status != G_IO_STATUS_NORMAL) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong XSF format, missing float values" " for density (%d read, %d awaited).\n"), i, mesh[0] * mesh[1] * mesh[2]); g_array_unref(density); return FALSE; } *values = density; return TRUE; } static gboolean read_one_density(struct xsf_reader *rd, VisuScalarField **field, GError **error) { VisuScalarField *density; VisuBox *boxObj; gchar *comment; gboolean found; int valInt; guint mesh[3]; float trans[3]; double box[3][3]; GArray *values; density = visu_scalar_field_new(rd->filename); /* Read the comment and the flag. */ comment = g_strdup(rd->line->str); g_strstrip(comment); visu_scalar_field_setCommentary(density, comment); g_free(comment); if (!xsf_reader_skip_comment(rd, error)) { g_object_unref(density); return FALSE; } if (!xsf_reader_get_flag(rd, &found, "BEGIN_DATAGRID_3D", &valInt, FALSE, error)) { g_object_unref(density); return FALSE; } /* Read the mesh size. */ if (sscanf(rd->line->str, "%u %u %u", mesh, mesh + 1, mesh + 2) != 3) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong XSF format, missing or wrong mesh size" " after tag '%s'.\n"), "BEGIN_DATAGRID_3D"); g_object_unref(density); return FALSE; } if (!xsf_reader_skip_comment(rd, error)) { g_object_unref(density); return FALSE; } visu_scalar_field_setGridSize(density, mesh); /* Read the translation. */ if (sscanf(rd->line->str, "%f %f %f", trans, trans + 1, trans + 2) != 3) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Wrong XSF format, missing or wrong translation definition.")); g_object_unref(density); return FALSE; } if (!xsf_reader_skip_comment(rd, error)) { g_object_unref(density); return FALSE; } if (ABS(trans[0]) + ABS(trans[1]) + ABS(trans[2]) > 1e-6) { *error = g_error_new(VISU_ERROR_RENDERING, RENDERING_ERROR_FORMAT, _("Translation in data grid is an unsupported feature of XSF files.")); g_object_unref(density); return FALSE; } /* Read the box. */ if (!xsf_reader_get_box(rd, box, error)) { g_object_unref(density); return FALSE; } boxObj = visu_box_new_full(box, VISU_BOX_PERIODIC); visu_box_setMargin(boxObj, 0.f, FALSE); visu_boxed_setBox(VISU_BOXED(density), VISU_BOXED(boxObj), FALSE); g_object_unref(boxObj); /* Read the values. */ if (!read_values(rd, mesh, &values, error)) { g_object_unref(density); return FALSE; } DBG_fprintf(stderr, "Cube: transfer density into field object.\n"); visu_scalar_field_setData(density, values, FALSE); g_array_unref(values); *field = density; return TRUE; } static gboolean xsfDensityLoad(VisuScalarFieldMethod *meth _U_, const gchar *filename, GList **fieldList, GError **error) { struct xsf_reader rd; gboolean found; int valInt; VisuScalarField *field; g_return_val_if_fail(error && *error == (GError*)0, FALSE); g_return_val_if_fail(filename, FALSE); g_return_val_if_fail(*fieldList == (GList*)0, FALSE); xsf_reader_new(&rd); rd.filename = filename; rd.flux = g_io_channel_new_file(filename, "r", error); if (!rd.flux) { xsf_reader_free(&rd); return FALSE; } found = FALSE; /* We read all the file. */ if (!xsf_reader_skip_comment(&rd, error)) { xsf_reader_free(&rd); return FALSE; } do { /* If BLOCK_DATAGRID_3D is found, we store the densities. */ if (!xsf_reader_get_flag(&rd, &found, "BEGIN_BLOCK_DATAGRID_3D", &valInt, FALSE, error)) { xsf_reader_free(&rd); return FALSE; } if (found) { DBG_fprintf(stderr, "XSF: found the 'BEGIN_BLOCK_DATAGRID_3D' flag.\n"); if (!read_one_density(&rd, &field, error)) { xsf_reader_free(&rd); return TRUE; } *fieldList = g_list_append(*fieldList, (gpointer)field); } /* We go on. */ if (!xsf_reader_skip_comment(&rd, error)) { xsf_reader_free(&rd); return found; } } while(rd.status != G_IO_STATUS_EOF); xsf_reader_free(&rd); return found; } v_sim-3.7.0/lib/plug-ins/xsf/xsf_density.h0000644000353400050620000000352112215546157015406 00000000000000/* EXTRAITS DE LA LICENCE Copyright CEA, contributeurs : Luc BILLARD, Damien CALISTE, Olivier D'Astier, laboratoire L_Sim, (2001-2011) Adresses mèl : BILLARD, non joignable par mèl ; CALISTE, damien P caliste AT cea P fr. Ce logiciel est un programme informatique servant à visualiser des structures atomiques dans un rendu pseudo-3D. Ce logiciel est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce programme sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site "http://www.cecill.info". Le fait que vous puissiez accéder à cet en-tête signifie que vous avez pris connaissance de la licence CeCILL, et que vous en avez accepté les termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel). */ /* LICENCE SUM UP Copyright CEA, contributors : Luc BILLARD and Damien CALISTE and Olivier D'Astier, laboratoire L_Sim, (2001-2011) E-mail addresses : BILLARD, not reachable any more ; CALISTE, damien P caliste AT cea P fr. This software is a computer program whose purpose is to visualize atomic configurations in 3D. This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free software. You can use, modify and/ or redistribute the software under the terms of the CeCILL license as circulated by CEA, CNRS and INRIA at the following URL "http://www.cecill.info". The fact that you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. You can find a copy of this licence shipped with this software at Documentation/licence.en.txt. */ #ifndef XSF_DENSITY_H #define XSF_DENSITY_H void xsfDensityInit(); #endif v_sim-3.7.0/lib/plug-ins/xsf/cinchonidine.xsf.bz20000644000353400050620000131370512215546157016557 00000000000000BZh91AY&SY7Ɇ_@ > b~>B@()*P@(PART@ ("P( ((@P  (( (P@@ PBP (*%) m1PC,6֘ ыAX46 " {[[l6[j`Mɑ--VE֩mmTֶJ@¹@G Z *ZGZe:i@QtEբkUH*[fkVUV4͢SL*iBP24ĭ Z 58jke4fjmҶeCf`h۔LJV  *k23ْCZS-F@iPuͅXm0Z r VpmZKk b1L ؖFյX-T4weQHe(KE mlܺkN⠐ 2dfm6T.#͓km]4mf*U6j̲ՃEUУYs6+Z+!lQ-[m3bzsbSDeH1]DI&Z6fЛ3Pq'm^* ئYYG[S bBMWlڂ͘eE"է]l3WSʚ͊fZ4֎v(nxTM II [fVfF"2[dnuǯA+J{0tQY6m3[bZ1 "mtd햙%3mV͚T>Nr40Fm hfIVڙ`m65 YjliXFٶm6ڶf6 1mֆR heRVSMQ+#Ƭڪ mJmB-QJҖX [+6ի6m *lŲ$[Z3[c 4h)i[m+*Bث[ZmZ²V6͍Rjl +mk+LDmZk56eSZRK*-e[SmdaڶRjbj2-YJfѶCKYMSCQh-*fF)Jc$VMcl6M&ͲeYle- [UHY-HZhYQ- 6ƪj**mjVچT X-1!UUkBZ6ւ3LcmF[%VզUlڦͤU"#EV0mVֵZ5SeUT~L$&0?I0d=@j)J ! =Rި4zBI$H`ne-@ (7˾gjRQb)Q__7yahHɩ $#E ^~m4J14cbH(̍ʻ>+4[k>^UDQh}mZQX$ٔwA,Tl4chϝ5$@QDhh_/obQ"A21oo~WFRm*M|dd"lFǟ}{s=Z-EcQ&m-ѴE&MDHZ/ƢTTXf*6V(߷Z(-|h$DFf+=MlXFIHE)!&k&7jѨh-{zE`l,Xk=_+X5AEZ+oIZIQ%^>y|jJ E6LV*4^3#!ƒ򼍾6Kk#b 66{|c(mŴjjWƋDQ#hHhFϟ7Ɋlj{ﷺj(hbA5߿~kZ+Eh"26J1+Ծ3ZE`|!6TdňϛR$2[*_6`+󶷋k"+uWIXՂAUߵ_VBd ( =6IH j@PwVHbţ{_Fhڋ}nj+b<-mF(4j6Q[1mF#5`Hn5[ƶ" ) 6@ dw)EiEt זBerRQRAV8I1 ;|nh׵tR$%%_].NS7W,[Wk]\c"D@6w"vnWuuD]wK+\dH0닮97;KsvNGw7$w;.]ˢؒҎd9E.ruwHm~b !eQ_b2H`DX.@pZTږV1JT J6j%j -mKLNi9r1UhmZRBmR]%hW9%$ݗnG.n[Im[IKV,m%_<72E1;h"$d6 ((0ӻwwwsn\9vrtnttLu;W# gw.뻗qr㝝YU[J ҶVRwvnnrܻ-@m)Jim*Uhp.mӻ{~<.=2vr.y9vJ\]ʿ5JfKE!\'.gupFn뻺"9#Εwv.sr㒅\M"9.s]q.\'v.r9BV-edB ԵҠڕZ+LחhwrUȯ6HTXΜw]݂ͺcEΛ$wp;9lN]Ћ9PR]݉*Em*-jJpwW.w\IN%w\Guws9LN]˺;MQp%~GbڊcH %Dc\s;twur]5·SQIћ#$JeeZR)lkJ`u\ N˘Ƨ.r\Lpw[Pp6uԚ9˻ 4mh|f?U0_C*[:#'%\ŦRE"4iCdN\;3ܷNeݝub5s+.EEܝ]껻]tt ӎQrvQwsr,,JZPieA-Y*(jEFPi@dUmm}֟Ilw6[ɷkl,D`RŞv`[Q+ZR :똫WtbZRijTV m@oXM9ۻ \tλۜ#DG ֎\w;9Qt\+r]]NY۹ќsK|Č5>0QAn 9kmXjVT[h)YRmm VQ-k*`\ݻ˲nQuq\.+Xd)K RZQnҙږږڊ4mHRjڴhmBVU`OgP[ $Kߓ Y^Nmq*wAP]s]uq)ӠܮE˻5s:Z;wdNw8qvNQ˔˺ܱwrw[w)빮GݻU䑨6ɸsrU]ι**W-Q Ys~cbMY5HjwlW+ swupRQJim*NƇ;r;ܝ˹']tEr ]1Χ]v'3&H5i΁&Ze2m_ݞ7iw\,]lJ")*0En\.ݮйpn+[].\ҒՕjU-U[V%))mk[j˺ݙt]r˻ȱndvwEr 6|}P[-TZm&ƤlLHӺ;S[' 07;:%\ۄCw]D]-3N#sX5N[dn[A7w.sG.7nAber*ss%A(iʶ:_{y7r5Lf5`U<6 nmw;s7wHn.rttr\uƹF wu \]ܨݤn9pgu9;n㛜ƹ3ks\:ar)wfAnS;wnwv軷7Bi42(?J;W9W[-&U&ƤlFFhpb볝tefWuu;\tD)n.Mup+#rF.HY(cr".t#vnwLr5vW8Ww`+J+sq$kŋw---6Z6 @2j#IT橔Ewvtt;;v],nG(F7L5Ӕj哀lG5rȫ5йE'9ѮZ]q%s͎h.܍\ 5˥5(wth.nnUsq/l ej(k4 FkˮW79WwD˻;Is\ ҈.\ܮanDl묑sTcn'Nm\ܔN5.\wr7J8bw;.\w۔\EŐM4\N1pW\r):8FV«(*~2._lu,ػ\hbѲ ,TTVyv]ݨMwhwF Βwr9NK.u90F2sΨ$]5㩗 κw7.;p;X]t65W#F~߈M|r;o[%E!FeQsr, w]ˮE"Qvn]\IA$.[")%5`Dk]sPut1wP7+ƮW t&#]vwvnQIwvtFM۟|<.)mmYR,"iRmwKvwthbwt.\,WwXnsssۻDAC"srB̉] Q+vst6KuEp4\%su: q˺웥rC5XKsş|,-IA2LYKcoŠm&,EG:]Q,ڒTDU&JsIW($M7McnQQhmp5i rt!\,mr!C 9] s pw].sgآܹ8Ea~>>~3/S½ߊQX6`IkxmF52-,wuĉΛѫܹEw]6 79Erir4뻻tɹnZ:]UAE.q".rs\1hӻMwqZwW4Zv6v븊wtH5|h>aY.v7Z# ƍXŒots5®Z41\M&7JQWK#F,d䑧v;]s75Ȅn5;-kkttQ\&rrcW1.Pm73#duumcRt<<3D*}z( sa;HhܹcX9b.bF\skܫїun'].Zwk775q4\wD&+\wW.V;GuVAnFa)-w\幺V79˕5XmH| y[-w+b ej55Z1Wݷ,tFIk sw;+Iۗ(ܹɔܻ6MMrF!J"bstgunhu.@iط"g;`srqHj'w#fAAbU{m2(4)񜝣Mo,TUiMFѴ^Cwuιs sw:ܵuQg9M –"n˦4d swwwk˷9kI\1k]&:D-Xq`خ,\.79r6Si+o%k[(Ѩ4Z 7fKu]6ۤt4m8Q7B:q6wnF'75E\%th\ᨌjKQݮXu5 \%j~~ɂw8.]ݮ6EhVB7 Ni(wqrwF\.7+hs˥spḐh\wTFa1`nfWfѹQ[9WwF:N䣦j9LbwX9q9\_&mDhbѣ%XnG rѢ;vhaݮnt\X'uÛrY.n\ܹwu;lQs3bI7Nʊt2]cds]v-tݮ9b5;k%$[]ye:'@Ymx h4Nk,Q#Qq.crwW"lVj6FttUԍ w$wr.PQQh65sw]tuMrXӻvr%ەE~߼JSrWm~VJXhּ[rMwQ\ۥQ\;D%WMr(N,1ۜd(wRErܺU.(L2Aˆww;ErpWwwuܹ\nӺ(DV._/ûno0̺kbѢŬQ 75t܈4Usb) ˗(ţ#b*2(Ҹnsc\r5w\W E۔ Tݹ6wcDQ#W-͢cb1&@Hߣ$ѿe ]WcXXlj(Սy%YhZL`uervnww,c2\"5tԆMkc!5p*+&w]۷P(s8gv,ݚˮuw;\wkRW7 XlXh~yEz&9k6DkEMO;RIs$[1j mI"*-\ڍQcEP9ܮV4mΚ*  H5rH5hPM;rF7wQPmp$A_~*J\nUmcx ̚ԋ61ܹcT2\@J[\9Mrܮ&lw1N%;sp\"b1wwwQsmͮ\wV\L5XG~f#u^.6EQlZ;@sA(Ecrۄ]6չ#g84VTcs̷tE'9F9qήQdDps\&FscƎs9(FݤS1j{wB}4ZIjTj1*- 6m$*EE&94*DljI),&.kpb23"N\EG.E2Ei01+mJU֋m)"hd(b)1i($E jă4Ib-wonkUE)5cb(#N\bTZ55ȱIe#QhalQbb%Di=׫{}W'V%6"AFMAMHAdS"V6M@Eb)7]+'4@C|mC(TmQD IQ&hJ\ELJI4b )DʋFߋ~Zڼ`"]#&sR[S"rqcW-sEW61I1cY1nruT*O6|'>db@mŹ LQ4b hbrM FXr*LAbʼn6\#կ&Eci0QlQس QkҍIh("b=MܶRFQm!\-A&4 skd565eQ?w߫w'_`C.[C- 6%AhbhL Ɖ,Fэcb(~OzkoͶlQPIdƍRhtɢm#+`vZ6Ѳ3M&&Z'@@bzKEF\j(1 KܢIiS)Ŋ1F0`0[_~~5{rU) *#FƤrLEW9bhm)D!EQҚ^?]PT%Z6F(j#Q\ܬXܹkKr!Ec_~{WU$i*4VHF#F1X cEIQXd2 DV &i~hTP~a*QlFEI-b,Fb(XQLcF6ݼb^޶Zۅ!c1-FYTl4h`(`rɒNѳ^׭õ}\T hERjf-EXb1Q\pu=9ZMؤ5!ѢTkmksfBF$Z 5_aּXЋPQd,I*,Xr1Iđ5d}wk~C,W( FЕIb*L1ƒF}YmtѯU֒Ѡ$hHڊCE ͵m09\,bmxr*15RfT`#"2i#S#%1*({^U: \I4`EDܺQPj"6-F,dW~ֱ 0%XZ2XV5c$h${^{Ob ^ߛjF4V5ζ#&&chLQcRRY1F!(5~|zm^(5h&"LEFm)1Y+s~~v1si4-h51cPElbDd9$IETA L41F4j"4", =$` P,2 EdFŨ0QȋEPhؿr{A4 !&d&F5KQH$lo=1WJ&5%FXm%v5XE"]A_⟌[hɭ&M"L~vb*(r뭫**2E5IRcP-4E~^}^bEE*"J5b,-cb$M^-|W#QQcA1m*4aQRNuq$*,KzMEQ$`Hɨ1TP__}bnjfchh4%h1E; ~e޺w6Rj66"@0j 5D&^Z(K_JmJdbĐDIY#&Ō&ƍb_k|϶ ѣEhmֈLb#D_{\jnkkdh-ٕ% +$2A#A {ͽv1#lF،cS(d@XƢ+}ןb5OZ"4Z(mdlVaj6׷kԵ")#QB_Dm{s^|m%MRQ(q'LHh APlQlj)=~ֿWQAhF4T&&Ǿ{"\Eb,h+ccL5Bmܯ[E$X-LF1bcn7{+} E,IF4F}߻{rIknhLPQQ@h#`c}־$؍b%wWƿwlb- m_oփHF6lhѤѡ`mᢪH"5Qhh6%_-O1i(ض7 *(,XF#i=CwָMi*폵;*)* ( o}׷WݬX,hc"Z4T3{WmWLFœQEF V1ϻwطݫ4RFcF"E3}{65hōQo{OKU,llh2DY#F6}'}s6P2 fsݹ[Dc$Ϻs͟-dImFAP%b$IV,$W۾b6(#2%߾QƠƟ>WOϚ&Qj5h!V5F`6M_}M{mIXԑQF4c_j$bƌDb5$i7ωl"E}o~nE"1h_wϸ_kdɤňJ-{^nXQF u{}ouPhj)ﷷuF65DU$Z{oumz6)"4U^TZ(fPŏt:c'H P^Y(Qw'},XѶ$ NX[{w/uXo~={{p1bJX#>[|ƈ(X5}S)DKI2"%|;-DU&顄 dAd'ۙ}ѱb(ooQ-4X1}{ݷb6|^QWJ* y}> *q:K,h"Q{owtXbJ okp6H#_/n^ o{׊{_jfbƈ/}mF*}}t$,RinwOY(*1:$EF}(kx62P b}}G&` DCǻ{^u0Jf]h 'mF !PXP)3GH((1Q;PqQdE{&0 #b5ouōϹ}ʂ c$F/oQ}sbbCq!P "vaD(=1Ѣ{"^yJ-g )Zx“6- {Wb(Wpk q݇4h(}G"23:o+Y8IDFM}^/A'T^!D",qМ0L{FUa7q& bEUL(H"M%, 4:Qb Ӹ"Q ^;TbqOAE]aE*$٤E7zV( Md5"3T6IXӍzq1vPG2hbE)41 /wf׎Qv1ghbhi&$xV ;php2H*ȱNN!Qb'N:Ƞ'pppq99gLbpt\N[hDf45U 0 1cM1H:LQit۠T*$N:+Ct4#""i $F&ɛDQCno݉3vl@P{b׺L"NM`;TJu`l`:Tw *28.H:c:vpwq$f+I&LM P]w`#6 TY8^@ ܲcXv,{y1UQ!y4Wd*4䉑* ٪ /^ScEJS!E iɡ͚La5vCwf*(; *mGf6ёdp 'MAEo 4Уf6;SӧsP8LئM㻺Eݛ!P8Ҋ1^M噁Lbͫ (h8(8,ˊ &+'N3:V 5 &nx`fc#a7cӂ)7C4QDUɆ 2n+@M3WM7j i!^s^绞Iίw4vn$5/(q `̙Ī6#:hLfu& 3t 0lR{8* 7XOBؠWcv C;*v;4R/q3n6r(s &CqxMcvCQJš tN1B7kҚbit SMSj𮋱Jf3%vhsv5!cgpb;㗅!N8_7Hq8>M3M -'fIcta+;!XegWꊏvty袨wnaL\fΜk;Iba CM Eמ H\ɂ/wNN3qy9&J\@Le@_t a(*ES{4S7Ɠwq7fYN;gxP(wO{=9X%w@ĚiIƙ5Y}aKDOx0̞7f$wӘ|q!{ִS(VsuツaW]NgWN8mxTo$<+ Tw`rwfΏc״`ٷuj>: &|q+};{k=sG}0|^t^r,49 _{a0ޛ]AB%D{ǵ^4.0|n;=xp¨^jLJ^zXMM^1"_ӊ5lw{| T>40 qb,Y&"$w}: <%v&esM5VGoGaP,zPtɨ(7J<<1[a;G;";&puQ7c4q[K௽'^twtXsťDlPO{{*&')6кi&5qԳg$X6-îmk;&'`>ƂitꓑV֎4\(=x- (z}:NE{875@^=QEնxS5\.aRr(Ư }r*>xFk8}=b°]7XU/N)Q3]178|7Tx] rBZ}k>(rz[){Ȩ6  ښf 'T ZZ}sX-2O]T5(}==RyiܵduLڏ١hK>hdk%L2qr1n5-N렪Ghn3.qTT^;MJ4Jlۅ] Å'Q~ > NQWKW V0b ]zWR]FMDg1mo T1K[Fq[NjΈ٩P+Km6AxvVfeNNWiY.6F{VU>LMԪwMpJ;mhonQb!*6Cث1vs=^ҷAhaSTnIU7N٣J%[ `cPT{[:Т]mli1XѷMbBvԨp#m{3RgiQxU,cw1y-`c|oDӔGL+ ֨3ÞdB1.u緾<s넣9\tjLS%п{G*yD~x|ZV[4bo;ȦlLMEtLf%YWSBFS㶍 Ds)+KgWQKJVҕ'k0DU YjB"[iE[JQ1sk>|K}!#J655eAJhTEƶmTcmn`3Kkh6VF"Yc[j**")'up۝zH0-Bqu6*X*+[dA%T[%eXs)maQr;tKV´Sc8UaaKhre Vdk{nnV/}>Lm6m_~F><Qn<-BF1*VLYh]+/!5ZVxȭEA{[BP.h`v%m` mam;ؔKwsyypbK[hWoPᅶ%J#kSF"Ѩlaw\Y4nR<.;4Q1me@ǧQjUJ"ʊ 9qklQڍ26+1- *'{0ڶ-4ͼBJ/7/8u\r>S@.uw]ӕQQ,xaEHul9UmX֗>锵`UV++QKfQQQV+9chU "겊ZP-mId91Š[eī~gV 1V[AmKǷ)ȡb DؗqS7r[[2ĪįsTEmk 4{DIV Ts6B_uDE*jo}} 4[JQeb>{xb b 2w}v.6<;t)7@[9w:|EV*HuIXm)DibE)oMHUj9mbF[eihTFQ bmb)iYXnRhElF9ܦ[ k ,Uzg%X*qΐD6R5JTХ*"o#?fkIsyk BsoB}>1ohZ5clF}k` U"*( Ewn<v$R`Mح5uw炉 5umy'^{Hg)>q :L}tp,.WI 0H??~##~'kVώLj%Li(|çnj J@FES鿽[xU}jjܶ5o[z" $R̅&Kη,U/@_f*3[}tve'5`c ! j@ʬ:,moQ$$ <)O:e3׀s w_7ۈW}dŶ) >GswgFm6-) ,Wo~MXѭ^5sm֠kz۔F&i(4 HD#HͰX1.kʹx׍]X\LFu7vʸĮ"3Lf AB~d%EEQ55łĒHM4tx?ֹ9ML hʃ?<""aPn4 Pr1 ~> LePXO>[smڍ5mUET%(59;fH"IlnYε^O ~;j>j-7rDz}Njq0 kDY1]ۊ%*4?<# ! ؑ }bkLOe]n!D>01> r{n=ط?!!c[Նw۷_~O8y$0$Y}gC&$XAI""h,ebI7+cE1ԑvUst>O֎RWi@v5TY2elT! c$dfP 1Z=3I$$ٶ|`o{E-ͫ\+cFŷ-}k\AI J$H K mx\:[uC,/*zx&8Q$>؃m5j6x.5*&fZ ٹ+d$01#s bbDƓo;5ZQknZkEQk+!IbL͸#Ѩܫx6 b1lԹ|ƿ~v壨fHV@[D.W#ckr ^?<F(Bĩљĸ]#sSu3ȱrye0@<~pk b-oUpcF5_}fVI"GhNHbj`,&0 D?76HJm$T C Q-m\1{ذҏV PQms&&'rM<їG,~izKsI [Lxvr/o r HK):&}zϲN}o@LqW!gI<<0-e@Y݊rXWDGJLK 8s](W w%nVpN}@~@w ˸>GN׃6`@X'Ŝ6ydO{q,Kn.cTn;صhߵxD >j՘vƵJʄdOU3wOQm" xP[Up0ْ y#dQإ*N**=˳n:}#ۨ}v0t4MIpV oBǺv1b^g=] 8檫!XGؠ/|o ǬecsϽ_9^cu^M9xI!^/s+n* V?t]և9 ";/W4w"S ƻވdh%[MLLcx-z [T> 8Fjl'MG NF*z='UgHϖ:svڳr`ǂ"/zajAi8VgrA=BڲAH,P(r+Pf+S1FPY-/A9#BUkA9 stF.V7+[F!E=5ܫ>¤w8lÞ'AR~*Ђf#>(cu@/Xt%;ۼ ĞmsnOmvh̐i<;Z29`%{t^=D{XXZ><IXAC|ɗK(~G tdR{׌A9p: '& Տjҁ0lm&8<4gf f'`)x#&q3ǛUQ8n:Ú=bdn1p5FGn%'rxc^k57Ûgu+ӬCysGOAGCWu̥VIs/N}P:Gs7\s޵bhnɼص}j܏a4MP]0h\!e=jRsUy+ɸ ޞ6x\ݗEVWsrMenη}FrD#-gi6VautbRScӆy!aјې]q Z_^y2{brAL\gԦO`ɾ:3] 7aО.}qv} 3i <:8װ(¬b0Cs=r z,;MNe|PiL9,uo43r a5P+zPzL.o(\̮p;Re՛&S.lރڪ 3ݫWmŴn?K{yv91Pӳeɍhf9uus:3IT;e4-w2FS\:YGvzutW[,XU{ւ"r,9S:ģؕ)IX{"G5WCY -LNb-C=Xy+P/(z3z1g;=*TXhFou ﵯ5bڲYdKIIY%%JJVkkZ|$$ !$OMo*f [)\ɨT;>}$D1@~yVljFՋm#Do] M;0JR"0P`TX5\Mlug+:)gO{)ohZy($rJi7QaI C Hh'!!, $M) >wlFƋvnmQ`PggI0am ̅CL<&$̚ '05,ؤLDƃ& 6%5EollF|xtBN|.XLH}\uēXs$V ,FQ ! N?$  HH"B 0 Δ,_޾gYm?ۿ;ޢs/V|Nxڽ{!@Y! [^Fjnm[ضŵV6,Ȩž9F#1?u32HFLAd5cRX~b(;OeG~o]3feߩ57hJ)RbBV5jT><H a$ #%BI!$H\;)5VQxw1ե/ki'[o.$$PI޴7|g!1@k[EX,mbFە"Q1S-vK͸r7 ⫃S8T8ldzqg_֯^6(|Bч H $$0d`I|$$$ SgݨakgPݰ3on1d$(sh^mEƋiUҍыa5&?/:X B5652:JF2I"̀rh6JTԲHH@aIa! '  q?߷kfW;Y壙vS,O&nbZmož\(&ˠ}'H0Y6Z[\Qh[mddߚ"#Q|opϽo5n\?9D;1ˊ >LS\Ͼuh $@.e²Y]Fي (HI?BI$(DI8H$@?d4OpAW`usl?Z?}edѵK `aj,XXnC&$'X@r@'̐֊ѶJ"EoDLFi)جljc1F, {sژz\+g$5y#W%B.sV HJR&! $$4YQuL}o J.S=g3c!<|=>@$PUCdjXV*clt&Ě ^QFj#\kWg9c d H,?PrÕpaX*HBq?HBIIN ٘T.?s?kmGC 11~bu^=䜀~da"jHjZŶ--W-FmUc,i1h2fbWͣIz$"P,ET7nƿrb$P.9j`((f1ĶHI!?d &@$!$>Cm9i?]Yt>dďPԵo>ϻ߿m&]/~> L`@d?5VEhJ1bA@.YVVVAF T+ɺ$lئk^ (J++$@C&Ѷ,JD~m?~̳sӋ.%1<jT, eI:j/]'FAhkeOfTez}mҚ4Hً,Mu82YEyK爳&aͣ 6ҵL<>ET\8Sa[Z+W`n< KM4>RX.r9{~ T%yF2(f{P 봙.Xpy᳕bQ͸fFl7OEz.`sK3Aޗ4I ŏ `<Q ذ,.skIu vAq7!"POAP{Q#N}u>Z{*mo8ANfs)FV0Ȱa۾̜^oA8厬y>ėv=.M0q^>nS? l%- -8!|xN}n[)Z}B}V}cu:Y7HaP?ffc[ȅ@=_\{Y x )9S)#$cUѭPNP X-qv ï5=H4q6G u<=Q{6b.)Tq j>mU75A8 3^_D/ΈlˍI}A S w_ÌQ=FE e9,|o \Ѷ #@a<.i!&ַdjw#YwvY{BC:LTͷ$jdPz03K,"_,s*&)!\}녵 K;nF]X|}1sJ EN'.Н+(1nqv+8Mt!B 8=DEΦbea\@%|-8k&=.{ٚW~mxj¦G) x!.Î:^81p^^¨4@usX'h0ך+}iޏuPLk`5lC+0\W9ŏ6.w4ǙeLS9ی[N=_ } wӼL> J O>\dL>׫rP^tFeZAUvu 2 δvteI$-BL\-( nџOoRa)j&Q4g,<$vx A/={9 ަװaŚ lZ3O[.<$BQ"QhcfՋ>\Z4s՜-U4fSr}鳁axWl5LiZ˔Ջp{ Xjgvјd9I%_-*rn^9/k" &M>[Bw6{ٞۤUgF~*؞|`Ż@?1폞/=H]| 7螺^jy7cX}6zW+y(^]97n >wz>t cHhxW=IsyP.a칧\K`¯rۑOShO^T@kyzT;xOgC#:5F-GSEH3`.7@ƅg+O˧&ϞQ=xQYRFC}ޫ9'a׷*qaTX kNGϼcIj.oU{"7³HRc_}u\b@!I3{m`uLQS$UE&Udgg<3x!sw,^S4qd>g<^HnMݽ L+W-{˾5. uT's;ΔzXYGmuMZZ^M2[ Tg^Gskɝ9M1M HJOsՔF^N S9q/;P38MRK '}#8D{jKq7\{4->u#1',Y}Ş}}1Q׻EׯmE{w$mj0}a{FDŃ"oq}}k]dgvID`iKc(xS]:Bwj}ݹc03YC/C|/;$vP{ I2l6þpEUe.Ӳ{I$?r.t .'5X]^WR׵; V%0fh9KF7Q`dsG!l&>>Qyt֗XRz}`9l :[^QewsL6Oɏj +"2HE-mr8( MPپϮu\( +;bIG(_D *#^T#n'q/EJr hӸ#(z1z e۽㭠rlMڠ՗m-M:^>+#JmLǁ9o⢋8p"8t\::I j8IO=}ha|3jY==uS7#|ӡ\ȝKW #{ 8of .XXߦl< ﶹzKHмZ|}7=}4gf-3oG(;qcA w[@W{}ZǃwH3}<$,Zp&hECVgk&mi@":>,[ųG|,I  $pI@'2SxEUq}O%= _w.UIh3h*ckf/wJ  @m1LdT5EZ\TjZbk&sr c19cRU˕ok4k$u5mE@Ko4im@!8SL?BHAC %,@BԿq18fЍ#|8bck/`",8+ᄨCq&LbJEnmQlj( u!i߷@>@'I! \1V+4m5~&LƃX2Xܱ\܈S桀sQ |Nȵ˜Rc*@̴ ycbQ^#^Kh iHCdiB@ 9Kqt&r>f5|.WHǚI<Ć  B,"0 I'0jmQZ6Ţ\T( ; H I7.% .nUۿw`1#n1 W-kDBf%UN)H@|i <  $qIфQ }߆h͂ '~kEkWms,gPXn8,5QƈWmh_U^Umh+Bwh/Βb&ɤȘXWM9wݣ5*=*TXŪErbqֵ[A1Jq$ ,'!"i`HA0hen7o؟~Ɍ_fw(V1Z\u8=`|BA@#PYC1)+}ʿU=a@  I%I(,XE4IeL31Q} il e" Gn8(b!WW_~G0ek?HH 4 d DaFL>@Ya$9mQ[m_ͪh(Z &\,!5tq5rdPQPPrmʇߩ݆w%(lӂ]v̼o6rF|wx͙.Z{sš8<[H@'.D7\Z쑳 #zi|=19UnHь' i7rv X־DrW  ?nfݚ4Nr0e"\B\8b0r:ո7 ܦ)vKI57  du0_=UX]8szUɽ۬ei|9@,cQeU0"|֟I>J[݉Bٺ}D1/|hq]I&qIn0i>;eV7^>ǜNHؘe O>§sn+y;ڗwwusxk|z g?Fq*Q+ hj ;ܛ7} v}*K;i؋ݐ(>@;#QEċIH&مn@v!b TM˳Ha 8.3F[R"!U 5Gd38K h2.M /0'|/e&9q#;7ٍ3=n#q NŔ;-yli(~Y%Rߐ3=ӵ}g_[YLӣ8M˕H̺ͮ}4Ժ7#%0T|%}wy[՛go;ݦ{Q`^Ō6CLvwoB vݤ4~l˹ ưfH#쁅A'锐xLA^@KW$=W{Ge!nd#u;\3׽ڻTsvd/`G[5c;!g޴ "ƌI]u]>U}Zz|w }{8CjK O 2D`w\P I;R'vCb.ojcn>3 :Ѽ}*᫋b!(S ph7U~^V)tmbS mSYcM4P?m+x%#N ؓ] Y شC1RS°B3a2 EO4p/DŽq1ב׊&`tz4\s1\/Ho#xIqAĉh$&YD!qJM(itƋװNFqSw%p@`2c\=΂P<#<@٘%'`E2(.bn؎C]/kܾz,N@-k'=ERdLE5Xu&4Pq"S/5bkXPI'w#:0z6SPäR-x[2'PrcBө kL]=}s:NQ{;7 ,2^n 5 }XI=leW\Z-;lkYIPqLcdOAڜHWf^2z\y}Ȇ^"hVMa8,@da֮fOiQMq҇AI!&.xQv8h僚hc;xa]\ji6"|NԱ!5o`<+GOgoW9ĩViE~Ao]#;[xlqe =7 |}C 7OxX!8Lr,vDL_yFa =]`$b1l7 ?h워 څY۩WZ"[oQ5jK5&4߷띞g3mF9'͵tvOB.j=.1۾!$\ላ3OԀ4٤.JQ5v[{G(;O$iz#wrpVQcyy3YoMܳ$Q]t;&ϳУ>`^G 1:25F;N$D]T[GՍZokF!f^ys'jVܷK{^`w#܃cKo{f'{sl=0U/};,{LG>2%YKJ9^x7zY3;KZ5窩j_{ q6~0vws1{zٗGkYسց؜ն<@ըPs%>`4LxYv=*7dܒ}LyX vUXo!>d˟vQiΗUV; !<HOIIL7}6ۮhPh1٧s4@%_ؾ<2 $9ԁPVN->I!nnZ65Dj~rѢU# n %+* T TS7ٙJ{߇ + әReeVJXJI>4 |0$O~qn_櫨[=tSHG:L?xSw7i\}{?!B B(X~HBs !շ-oZ͢b5~\EF0a#!?Vbe ȥR(K0? EjVu<+6HyIA$ $$IN3RE_A8<64|ƮӆgQYmͫx#[̅d a1!'̒mUVRZ6$_TnTE"Li'#t}v (FVm,Bao:%WMa)>~D}ي(c*1"-11rg ? ?BQa$%YSE˙w8vOx6~_c, m7SH~-O>VI'B#EVڏk!B,QUmF5ZHȢz([jKiRU^pmg4_p%g PQNZֈ,F+̡kl'p L FFM?(i;gwgu~Ù>d}T.2H bHCy@0 @_UF(jb 4&FYvXɭ;-*dp~۪LήH&c 8  ί\f%X#)C-ىc >,  &mWWj.aᄈ|B )}uMBVa1)~=sٻ*ƯVEj4m^MEh RE AA,;)Xar⌿GY~A1߻mu^sCQZ-ѠR`ђd&F|?Ӄ "Ԋ-te<}u~aLjbw>wjFojk-[b(,E AR"rWOYyQ y!\F# ȌuHgjITE&JM&RJ"B~2 L!ҿnoՓC)٩"-xy~B~I8W$j(O$@ *IW ^h1F<1μLsr0Ь**?~Qq3~yhfŌO2iJ4|IA{>iGF$2rg} LN5l)8&o'=i6$->hb`nr@P(4տgn#MHHv_!Cd2+./IXFyEF̕\K0/B޸AA3F ] LW B Iԛ"tHF 0| ` }U¢a&rZXSqJ{3eL0MApũu ҮuuG6lzwlEm2Ҽ̓n!/LCzye[HX@krXY`|C5[殬?Y`hl7× †zM7&seYXV}7i>`ft2 `s:ֲ[j>bVq^czWosaoF:p{6/Jx{h=Ĵ˿:|tu;N[^((ytȻf`F[& -S3 *}@ϙSXqq@<-~&]U5syh#QFhdNص kR`eEYHSdO`PyՆd\ %) Ea-0Sb} BMё[Mt&eی?,'lנ0wB ƈsu?_NLkm}_o:yBgTTla԰xa4 L8S8ʳ~ś%2kȢNwS0VV-7ځ`af'қ& h9Fcަ9$dbkBcAd/Sj)zޝ\-gl 2&Õ|KxlڻbOےj8nЗ;~@@r 5)w}2*ĹG- LM'nwN0)lmF? ^9o[F\ZFb3S+;@Bئ y]_>c3rؕ*.jKq`+`eA_ɠMjj~$m)l5z?׹`>;MVgnR=Ĥr=oyz$7~{ܼ)s xrju fOCy3 躎qd pQ~."|˫6/yJ;f랄5?&7=׾_#EPQ]n;+i陏c猶8W|gvDk +cP>@NQ]ݸ-2XQ-L .lDmVwe&\ Sw ϐ=Mm;P_'f)8k@opY Gb~þdr?J?i^vmc(3RҨq{Ȫ9^O%Gw:&nѫFx!ƻ|ǧ*Gyx-#)q@ƌ!yKp355G9 .uoq>7;+dp1׺Ƿp\J mm[JQ_UNT]0tno _׋>^j\N,֙}{}bfmt6Uc8|U-f{.$.xYZk7CdhlEfټf:žLl뼼=e3TJՓ!}_ 2K o-KA/2ZSctUOgrǚX&쓑BA`>{'J{-ۡ y÷ ZGB9`c86 diwҜ -ϡRܔ(Ja?zh(2k%8ЇyR!0@UP!="ݒ_>ɓ%ߺ ;:s_3q߰TYGKÊ;Dq4tʐ'hL>x4I$M ӍE;>FDaH(qq {30t.}vTt+yG3b&`s?;;TW.X}׮P E\S[h.&&(ҿ]pWm?8V#'vؾ~ ?|KE_׌m8HDHi? P pw?w=؞^6Rj"tÒ@ "(*V+KVZ-r+)"6+۳AJ2;kc1 G&a8lb \3&aeXBKk HB' ?RN}hER ~>1FÝ~ LمPC~ޛ.! 9$0,X4_߳v_}cխ}V[nm-V_nF1HlXւ)Xʇٸ[S34sưsaB<˙51̡@ӋihƔ? P/K;T^fH֘EArE zp ߳ 1!m}??_}Q}V*mF5i(hd1;Sn[٢A0%s\0sxBGlm$"jShii\Ų, qI?%>0HaJ?YRaԜ"J;4~DR;mfu'>O$Sɮ7 HNE 2dSώ|>!b5UXX+rh.Eђh;^Kr6 /R}-=br~~7CO0MaQf6ԥX,0sԢ"f&C0 O$ !8ws ԴnCjs)t!SRm~٬gB1mMHY ضmsmF&*#"( &n{;8 %[cXXBKt\xgp ;'$?$ x,",@/ V¹>{h3}?0T5D~;/#UU}LLv-`O$ j?-kbRmxZƬZF"K 4 ,s`g͢?r@d@%-¹|*V3rwi-ElRѵJ6OЀ|0 a88d=:g7$ֆBkE46+?1U@b:0"¯VV-0kch(117ܬT`)S`[M-hEk/y`,] Ef>˦( Ä\2Ln ݅C{~;\ -GCdub󏀾3K5ow{ etm'ĭXzދ4rH8aYAgd$.=[t.X^$ @$d#1ϒaJJ2eNȏlnG X#Q(4jRҾJH`"X2Gُ[3B$k2BO"&P $(4mZF.IBF3őI R¶f1k?"HC$@$ xi ١q7G!U0y$\xf*kBi XC#4PimwNw_9Љؖ˨PF"%Շ2c&"Aə& "׃&9'=-R;^xva:]!4/1dDԏpop'ۇm=@\>*:SAx$˃ű ͯ~TfaAplZ,g3C4Ԧ76W}nnLqZ.A` (WFA1WL%J06q!L- tEf|j٤h w /XRXg*xp73yᄃL)ׂ@$n/{gM0rܘkn^((OATa^^ d)5>DSŐHsΧ|F!&^]%2!U- 29$ ʯ_;QyXŖ﬒Ƀ=D騉j^B&ܱNygJ&[!/Vk!{Ȗ NMtZVsmz{vFn%W+?8++O ۄAJvDy3 BNgc,w>"/%Zܳ^Zpɏ5醚sVO =&w%W{$?pqfBȖM3l^'vY;<*# :my,7Q_9~Eh$P+j6F^ DB5YQ#sTO~\"+Ԍ tܽil>s3{p =)7*^oO/6 pv&>o\"7̝.NK׵ym8ZLS+;]ޣ:[Cc -z/ۺy6< Qwzﭝs` +yfz!/HdoN;b}YIƵEb=yr{=udKoq?=LvQF<#iyxhPя{G+I?{W/^˔ÞHpt/N_.3DccA)~9޲aYO .C;x"-Q9oT泻%﷥oP/j%>AO05+VTՃxQ/;*_\޲9{X}q0«;JO7t;ðsAŶKw$h>rSFQ,ob9sY/6oh~ݠϢppeWwKb>{7=^q>TnFN[+ܱ,Ռ[^Rx= ȦN@5;D5y޼yw<|k=Bz2y퉹}R Oy{pRos)BKV"o4kΦ"_ѫC;'~\̮ƐcrcMi=?*%%[-<A|wPKYثh`;3/iqp_n>kqD*&vIÛp< ,8Za=+ˎ50y1U&93{~]^-đn$Aa&tj6K0Np,\1գ`^`W5Vim1[g| Chxg$h8{mg)˫+nx,R}MDWysq-s}:]& $ҋy$ߣMoapn z<^dsɷ6/}2 6R>"z`tSZXnoiPlgۊGRstioY:a7 /;wgbGYty#\yOc]ϩ^ĠAV>R)O d`ҽo݃qzX/%/` Vhhw?4Yy&co{<ؘ棺X鞍 {}}}`'C4$FI$utS <|qNj!>) x4J_ɓ ݻ~4}Yfg_~Ǿ|,Pgc?4E$$5`E5[+^MFI% <8EJT*opkK¢\E)V[Ci~$?Bh$4Ɩh:k62~Is~C9(AGA{ݏ65W+cQͫsm.F6DdU"Zqss):{O~˸c3,U4AZPmq)X@?!~?"73bԈuHt5]Y=ɽI`XҢq%dXkJ+lkoۖbkFI w0btjm_X6gϿ}߷k1*iU5 *1ahB"I0 2CKq?$|~(~(?HOgE!!11Ku\YzFp:q" @q ߰$2Uj6cVc $L#tb.Q kP3?&\fSkg͡@wm6FQ!YU#FZ(Y'$?$4I4B0g$BC9P.ӈk8VtN~`,~:̆0 kF[xMI`_ǍʻHtkfF('̀`0QwEJD¹]^.QtxHhd"Sь+b8η% ">g"kRo&bgHD w}^(~HÌ}$$,$ ͬZpI7vF/.Ƌk9Z4d 10(u?S</Ro"R[`s-F@,C2Piph3?Ð]^O_m~{FcD^rmZ-V׫6X#wt;vd)s~A9ՁupS9yCyˆn&&"0$HC I/ z}l;ݎC&^?B|+Ƣ|3ﱌ g}aNVۖضoܶF*5QPW(AаDRfIPj`2:( H"Ɣ Hޘkb¦ mcIŭE*JR RыB>JZFr֊[~j+ʮ`Dda*6$v=(KF-k:m*"s+nWhT_aaBZY($!A p\ùr m{ "9t%&ܖ0Xh+<ڳ_U:kj3w%ٷthE@Ѿ3zlcDZ. !j0GQ΃ ,@T ]N]YAGNlw w6 |_wAL]#Iisފ_fv*n#ѮvL;kuJ+-| ,# !Ք3s/Twit9uOPad|=0F}F"q]/׋Io7-Hvj&%En#A@RixR%">ub88G/eH {v+ n(^\z a%CA .bHwf*S1bkr :!%ƽ06 ]$^0\{L;$N'TKsFCӨCX栵t.ךLe 6Y1Ȋ׾3F7 roE㏼ɡ= uzK{OTwM֘/;3xmGiwvZ%̹zØ{Iι}ixlFzD^{ܬTf;b{;KYPi꒽ü||U?[&Ͱ6n\_tayy(l4_ľ1Bb(EnHպƷn#eX7G\jAuA )Ɨ PD/ Äl 9`dGoH  $a{뱷XNfRAq [?20y5 *҄E$ aOuJHɄJj $[t]a K3b|"1zlЏ"N tdK}nTiPQkV'ϫL#e473>XQL ߕ{.y Bs͡q~O+\YUxYk! =q!y2$OC`~8/vGӨ񙃂I6#%U# hf3O!-ƚP*i7P^QPwU`%|CyMFk QTE9Z/9}b9&iZ4ĊG͌Y('PƫK Qqj"iqfhVqd:3h`U)(nZkf[dmC2Lok>/mrh/~݌=i1Hz޴*q5z׏7 J{]!4-v ,w98TRQCk[9ro5up@HHdS=xū4auiVA j`z(q1m}n}hQ\m,"[i))[VAEAR{J/XMlO5\ Amaߊ/p{ ב٣ة\nu2>+h tsզːlg`uV{w6_q؂$7Uw!]?oU]1K;){ծ/|a7ۺ% #݅|NJp{SehhQg޾Q(̣`>{fF)aTIDŽG'VvkT(k-?>?JrۼV_|,DvuKuLz !!$sU/jGϾ/< Yl^ oQA`sצUlsU8 Bq壷)l_iJ~,L(ATqaɌl{᷸mljY*DGp_ʡ{epZ`D U+GZ8_WA8/^rnvuE sUxr wLB.4[aXɻb Iԧ/&ϯVΌ+kfo]Mf26Qwt lq"3jC0 ReSȹFHG՞ Dw%PZXF<)If{a_z760=\Jo } T"6|x3:*ޡk rzwɴY +{Z6+tccCH\ӆa~5D!'Pzi{WlhpH7FqeFƧl7sWc >p{ߟlB0̎)owcᛝc c`X'}-+/jtn tv1˯$V.2[ 5+j.xͅgr ,UD+u a8+O$I;熪Z i ؼpɄD2UC'0SfG0vXHA9`yuI'剬m1|ԏFMbu*QC d~fI .4L&7g_Oo"8cR Ax},w(: zg(Jhփg]=y@'/]Yl˘'8,`7[?q\t5C|OBx`^Ps= Բn}" m(B pX6F,ncۯ76Nqa|VM3ʊ!te#7e8,38,DQy6dCUQp)ڄN>ڸ` 9}t/UeM6ɂbss]n+xI I'!!d 8!HC~MCfA)?VO&Aԛvo\_{J?>߾m׍Zƭ*,"L e S"փ7Yɿ =e[hͥm-14Zi4!,$"?󟯜^kLC(>ӄ$ͬ^_+H ~b[q۽BIY1VōV*\#Zd'YV"SdʑE IqH!D;Jh" T`f mE%?dH)CJ_} G?cG^`ʜ%vC7߳VAYg߽6z֍kUlkEh4wHAVPjXsfn^u>n ꭴ]l DUkQH"RŶ\f5@Cxג+( wM9 8~p)}{.=$B 0Ra!<|@MX[W2[er13S) l(Vn50k/Z Z"E[*Ї >(0!d`aIs-##F``i2Ba2A5*T|Ϝ`?5~H~OH 5!B +|TIr\c3q}xba]$aײ߻ncpb&Ze-hVHڥ p Ƣ0II 2@(? k ߿KR쩚h#a8Ig 4$H3XJ-,3`F6[!* ]!?8 u- `Z֠YRڴ?O !%ORI@Dwr"-?4>=ye|e0EbPs ɉ(1 U-h-W湢Z,QQe1`?Q \Na@AҘ̮$A+]L£RkJJ(0$<2,n?]ko93aoKKUeA梾{nBLEaZŎ!̓ s$%aY c_bbE#SV YiEZ3:Sك3XS')i04@`D屺NBwN띯m_f`? $~647V xCĕݛaƏ8?~{́+\|~qoտ*IcTm|75!Ș(uuS˟~{Vb&4D$˹λ]t;!$N埳h2pQdSw!pgn|_r[ӹN.hһy=^C[k{ñ=˽9jng ɋY;V"^;pwfT.륈>IAQ8OYu|QD/&.q˥X/!m>#0k ^-?vk{~,ьJ2vLފ2[YT^*7p>۝f+7)WI[5_bLY!3yYލmdOagA02@&9X$TB2/Ih)b%T-ȅX eеf}>W&arsb1W  IScZ Pzbx,xaxflPQkl 1#lӓpF)ݘ?l􏆔Ioͬ@N$,sXn{HhdxEͿ2/eFvtC_t7Jر@ѴcQB곟P<"fV/xɰٲs2v8c4߭<;{ŀ{"藣-%v=5`C츣MD ]k{̧E&]*>[|/ȅ^z( #J{->WuU} TH=S%C%x`>)wIyhZ!іd !g1Ԫnϓ>Ov`~Nu3 4.YN“,PPt1%g " 3dfyA0;(18F|dd wy_n̬,ЛArdK)o!Ne[2K,U6#S( ©CRX˴Еɽ9ףB>B`2`<޷`|>,Ekm>v$ՋY)ܖQ?c+ln:2"ccrLl62Kq\z3npZ_[aW4+deL5dtw>rWPD8˖r\qc8 w1dt_q&ޚ zDĎA9"B62n\t? 8}zMpv(36O!:*[Rf($OL0~bboryF mh"}xa2!MF1k:w2,V=廎*Oϋ?ه>Dʈ۽湅L= y=*eXJKu 9u}{csvL/{cP\IgI]r@ҏqL3otywP7rj(8֊>GvQi,U.綁+۬]qQ-HDhYIY"0CǼ1ê`׏6B_YU  b$g1x$qD=᎜(.T;HێZC$,}uV:& 9Ihc7Kњᷪ.IsŔb&Ƨi87 n./_Eƛ>.׻</JR55VYJ]͋žq{:D)5`] 잊+",A!mx^JW;[uϽ`<Ր"}t n9^}`pQ93ky:<=.t)7ѽΌ^p\DĊs^_7k»J-Fgƃ1xJuۗB\CED]u]hqԬDh;ݯ<8M$޼~EN޳JYJ하8*^S| SW|obceTʱ9>52_f Y' 1F-2A/f3;xcXM";g Uxv 3D}$~ۛǫц&qY0r ~sQ్3]^=l_*;/!^ɫܺY'tW'S:zӅGkm VS17Q·ҏ_ [ 'mN<Kݺ$rwz_Rg'2S^=ݗ!Ɂ ,MYp_:ՑRwk#epL],:V?qךԖ[0_^ƔDw^c(#w>*:Z~/K f-H/?cHщ#ǟ=ZӲ^O"e{}xKNܾnoNNr{T8vpoXLkav2DLdp-{ Nx$i2w ~2%q4@<ƶϷSHΤ$}bx$=NMy1^uYzELx ?'=f|\s^c\mY:w1}gK8E_(w[#mG4X]Kwza|W^?X^wh=9-Tc3pr| }s@#}{N%ޓԁWN`ĈΓaxwK:S),f8"ۘ -RՔsw[սxד`~S׻{Eޠ 30ضYf=[JNҏM^`)ϒ ,=?O|̐Lu*nVMW".V[%J*a[ߴͯ4\nWsg?:* *mMAR#QlbcOCƖ0ҁ .xLﺷ={y2ӑ˖5߳0.YqC(3?2I~mk⍭|moj֏W7JT\)c٩}Jyh1%)bƥj?Fd0'_qo?_{d*ffe`|a/ǻRCƠrȡI'2@M@lEQT[Fkt' j9WyD FHEqA* qfۓ 1QV fSne[$&!!`DAO6qi?모kwgdN/7j2#8q` <$W30+$![WW4j(,(q2--Zdpci{yڔEAZȉZm\[RC?RI ?D=(fp~Cd'g-? BjF/{O @5?$~Ckm19n\UZ-fTDe]}ц|"(5ۆV FE [h +0Pd8d!,{?\?`ܵH|+ #9s",^s,E6ok_\-n\{("CǏ wq'V`P XlqM"Z\}3)EmjPPMj#Ac"J ? H9FV{@{ka&&c 7+Hr1Y R{RÄPۚ~[^6k&6b0JbUꢪ)tOno7U1XSlZPUFF\؋ 0$BQ$ ? ?>1>~ߪ,i74p(ݳL,Roa! SmnUF֢*2@~sV UQcKZOέzeP/q"2Ҋ*# b?@N?I? >(I)dDr>/˴ֺ}kFڊ}[ |4HȜBc QmZ}[Տ[cc&"w -EJƍ>3BU{LnzICK#KRG޻oä4Ll-jF!k&vq=Op[lJfyz\ڔ҆} T}qgzBC{*f۪2عO*go]2.xi(1ʿ-XM]f[ apw85(#Pz3mtWek< Fyo(ݬ4v T獝2Tj쾔z".^nQ>YΆ*ܐK9:+ N ^c434:D$EEI8a+NI݅bGA/+lK221%Y҅_#(&?,lqՁ/>2dj 6mǑ my".k *@Fl{X$z:zN10Ṱ+" WK-@JBԵ95qarqJhA2݃XDcЙ; TO,oܱݑaB7\r{:<<=<-/gsWz'ci횞ɑ7-i>P{|1xE Ӕ{/Fpry=!ewIIЫLbv(hPy;r>0,Tضw^c5-[#^o.\I߮nnɴ;?$Y҈(0븡SΝ*+4EG$zy+4?J7yLM=ry'1#%SHyG5##}e[ k>L Lw22#А &[!/7H*%AfcmdȈ PP0s  a2ǤY!%#ILR[`# n&'A9Uej% (rqù~I ;r`:ҷnIAx|DAC |znjϳk>y2PK9F'ٖrw؀dyΝm?ó}Wsw7]<ϬA_PrLù{*TM/|.Sh^s#8m4StHG2mY44kH.% e[+DHDNɋH@Z->/C9_Is{q^R>P|Fqf ͫk =$6 q<($>ֳjU#+tc: N= zt㹡Cv>AM32`'sZEa (ܯ,',rT:2&A3%,Da?gQEҊɺ)C3 4Z7 ;(ķ&W'(Ky֒u}ʁS'cw]uiU8SfO0vv#-ax<-[g)GiRj%Ϙ Щqe` ng/C]>Ou'; _Q^lp2+JEیb0c֖w=eij!}NiΫ9n4ݐKr|!dDzpˌ+wyk `lYWpުȟ3iI|% \2X4D4QωCO9!E-u0=a o o,4o>b+/y޶Rz#1Ml8Z`-?{|#1LnM P"TԡoOsnp:s7EOp5ANWMz9`.F٤oj^Ue*UYWH+5x)!)neI#sleEMޙ<4zץ*!-Ϧu./ch3w&ع&hfsMLC;pHmtXwxۇ^gdP>X#zNm;ѿS [ k/)+^~oMA +6nG6-΅E@׎F_! fq{I7 B\~#y?f$au5s1} ;=Ϩ۹1Fޮ8UD6}p^Ո{>i8l879˵we>49@\Fn]ܷː7Y]~m' _,ΐ}Y'=tz8ޫIئ'>_:jNsgsY-rhcYVgK jĔRHE#^r9xnnAQ< \H%NJA{L򼢇 /&= Ǿp[{ Xf߷B{G ry`_]7^t!;};pmUADžt=L=eWS{!=;< D,yYG#imx%{= ~,wLu Ӌzn*ւ/b8iC>vXcߙ6B#V/ve7K1_}M+%/> *o}ޑ ]םe-C[<}EsasxDc|(%ӷ cXޛnKVBzéʛ͢{Q}:hsK3|ɸ,8ORJ9^rMx6Ocz>U;+Oh ?xܞ})LwWwއD˄{_:d&uxrb޽DonVs{}#;h{F\J7^xYѸ3\v6k7vm?+Zvf^0P"uB~=g\ 'ݶru"a?;fDdF@13aB_Ct"($QN^fIN ~ٷ` Yu`!ߣ YQh(=ZUB-0$ B}jmj$"J!(2f߶^|OvǛc8)hGQjPv޾Be峨ŝ|֏I@wIs}N R\^ q6:=.%rzӾšޝa\6r~Yefݶaw^S˚C^Mb{H$kn%틸k[- ` D{vҐ]o> *SIʔ5koYʏCc5Ƿ&Bsѩ̸Yrwx]!,%OvIPأwrYti /5= 0}o_(sLc |J8W žaO`̛5g9x|?p@ᐘ$a'$' ? 24d3Ak'=]!9U >"$7ֹ hԖƣcGwcbsX4Xo{Qeե}k7)ews;.p(Թl$O$N lo{mˏcg"8RyC(rvOu:bg_hF(nIkr$ D-.Du,l E}N Qł*e.fe?I'h<H#$0  4 5ؔ> u~|{/?x9'2AdQ /-!Xc$<H"F+܂rF+"xy׾&-9 aOܔIhuXKɱ0e"-?!?B$R~?Ns)+޸81*FEn~5w %v sAYߌ u[h[@" g2ҵ̬L(I$ #%3Ơ$2]<'a˂wYxPYm_>?!@?$ a Vq0 gr {n i 1Q~S) 22@!X%`j6j*0FF" Fc+P+y4Vh]x cG#H+-#-26-qR@)BŀCJB~knqn͂6hLnh_eY; ]ŐC!HU-1򹴠s R/~0gW۵F63-QUU ª%Bĝb5c~\sc~ax$aݝU0> $Y kmsTh[XŠiPb1Ug럶?>ffF_<ү*ؕBѰUImfV1?N0  $>'&O~~Q oksV{}??!ǤH(A`TZ;#Cb?7ƹXx ! &H'!&)U,ne/["8֕ZcH9qRq/$D ?p`~.0FSfi@1J}Y5bj, ϭ)XC?}};vnC~mDlmAEaXcQD?$'>|;Ǿ1 "}dpc.Za}g|)ir}{@!6Tk%UFKdqD-LhVa/+H 79ю&Ҩ1Al@DhC){S8=5V/&_<8}4% {r; &໇k1oUX˷2{gf-Jҗ zⶹМ+nwi3wחƻ4ӄ뎊=+Vzv<(A cioy"xYN!'U Ce׃lT/<4hi3PADN11{nFL<5e4k/5lhO] s@QLny2Nv7L/]f=r0w󍥝u񁳾r]dȅ\QO,Uh)k_G*%*I~(,W8F6!7Dlꁆu 0C-VxL k/2}h03x]rX9y:[#m ⤊Zռ[c>DL t\V)#BQXR~U [؃ QCjrK75#DA(SakbE zŌa8G$ Ө,$U޹{(S("L ǁ)eZ q69KП[.& !!a7 ١pBfRYxXDDf-nw0ewJ9-90XUE3>pbA0E UOB1 b @;HӃ7VXA5$pq%HM ֔';LP^: :϶K<øV~xu<`$>= [5r|{8ք/Xi8n :pQ=737|jSӴJ#i qFBpˁ]Ĉ: :)0۲*C%TqTY]Vc'c7v(M# BMܱeh3kAْ?bER+.2S;3"sd6AE& g5bBCB֢6,ZbXޗ\6B#a nADh@fݙ_sIap2|3x2)rbQb&Es,ӎ֩<g6Т |pVP@GM!͓#L8ޮ'f F6#xL ӡCkD3sKVv2GBq2mט ޕc\idBRVL>1\OGJtfkrͅV01R\1pU5Г2cAnTӁw7fV'԰TGa=DjybWe:ofr&0D4BY_F\4[3y.hDT~f"S]lB'`/8vCX/ĿH',Tϧ\ mms wAAq4R#,"̐:( okڃ[3j~^dPuKɮ9ƞhYyy8JYAafDmUtVNk-v-=D2R.a=W{!1!(ci߱ROݱXյ` cIt,sJ%I/ؒˋ1<^,ywܡ۴v6F# Q"f`o^O$sy(yp@]]T{fxwA'qUokH׍vF5r wUOj`N^>S֧{pՇ{!ЕOh]N2Уk5ww;u^ BzAu|yY#:ZN޸oiߕDk=X>`#vhz1rP*J,b nǑEU}SliݖNS2nv/|v FXɾ['d'I`8g;_ hAoW6r .p5,nj]Nʔj[ľz`7Y/BQsA<^B`~gDt͗;Zklo`}rEا"yycW8f7eh/RoT1@~(+D#8rb# <֖P<(L9MplnʕݹծT3 u`gx`kW :^kwx?qJnd"wU@NX<$4aR[3ny[4j8n7|8fNn!h!DΎ5dgu4?\P3w˅{; >IMo';i}@,gSΦeoz<_>_ZbƍEhbbR+dD#q6F`[/gV[,lV"2VWme?@$(I>f}sv( Ώko~Vca"Kiσ vP7MTlL˝x[TXc|S<)͈{zxJ[O1F(u2hcBH0@'o x'hQ)Hb\Qxi3OVZV1DXȌ,J=9˟Uy 1(o< #\y*fS <04HCIBQL>$\?uE=Wc5LWHzhO}U6׍k(V7db\ha]prn5[oΛ&oTTz:-R/R(Ken iOM8?d$4(BN)I!|~gy=?dOv$BIcn_g!!UA;}}0/<%HQdQEѕ%VgbZ\ ;p ϹHږ,]pLSk@mFعhϒI Hxa $'HON`Ct1i93.CHְ㛱;7珘̊VobUxڹlZMb#@cty|0GLwd-59/ekR+mv¦PY*n" G.EI$80 ,$lH#ܘI)a>Aaj@!/J9CvK;TȲEoߙ{!I )X߻v&dW.]"oG,؈B w.]8sIӑww\;uן$ ㏌ ) C,vAѐҁ#pVc ," W}Ċ&hUi4j1aFSQB;>r~➦oB>uڑnTlT,KmTA~׎8%ԁoX<xhB6/?vK~h^\WEDv9U[i}RƥmI_l&0~[4#[:=zBwʻ;>kL{(YGﯦ.]2saqxv2[Ћ 1u#ƺ'dw&AwK\O'A˴@nw?'XJu!͙KTpc^rPv/bAY=pxp Mo9 Ì>dQ(|k)mϞ'x5GWЎ|E8ߎ| tzv UӼߺ˶`N[!mK)]i1kgh"^+hf`ޫf"[P{iEp]aBFA&U5^;{CVMWZDS"a1JV`LnF431% hvX:sP%_3[ PFF?d؏ /-HxmSS *q0s,>MXYovECk/*_b-4.Ӱkg͹Ww|W^-(Fd9"O{&Ռ?/c+-t@\/FHЋ~" 'xr⧚ƼL%BTSwck2z׌gV"Olc5a;g]kޘBɶlo=-3/su-r(` ǞܒxFCcE'.<#3pPwZo<. ⾙0ώӭ5pbҞUBN+&nBեB z9XJ%ڟЦk)Ao=9maJNn ܴچ[ XCoHeQF.45b&mXOE] Hyad@uZp^LB'Ej%CB`9X i".Fm7h'$z5ML+/2}[-hi칡M#)5~`X(rePeas 7& wV!X܈+!s@*@츷ix[~wѬZRڴ8 Cռ315g64r}a,XY54^ %׍mOmnVM! Y5ʻKk $P>464e%zobx!{5C ְF _mi#sf]g >Sr>$3SDz^9ܯ. w@ep~Ñ$c4aRΕ "g0  5좉d0` _N{jLKHnR/vч57*_35ЀdM⫃hY׷Oj2c&>غ ?Q]YJ'-]ΏӵiR3Y&XOΗW{5wZ600~{ϸt.Jy㡙ώPMfHzX\DR[i}[{ÎK}Q\}w ',Eׇllv{ɩѕ}fvtL'$:Z({'5nTi.~lnQ3ty7}c`4u۝OAb/U0 ζۊj½91h&^]~3`rڰ*Z{{]yt!e~Zt7 _HVxou{uuF3\C!k.i~u^[gۅ>,Ƶo6~hmbȯޣ GC ='3oggzڣOw[ʵzka;7=b| fS OI=PNu\Ժ>2-9wU;lʱۄ{ S~7RFgKzUhsq獈УOEys'Ϧ1Ed η^WT9\l>2Lt3bg_I}# qvy̦Ğ>ګmʐv:h=pW4Քgs r $/oP{"=/j9bV#R"xL4wf螹:z,й6B ?V6S n=品خiqVo{v1'u;@a̺:l6{%9&AvY' i,M|_D5m KIS9P1Kdg,jh}k}5q N8ܨ0H%"_*QB"4hk Eóg GI| )7e3^iX+qf[6F7tE /L-yxz^v&<hF\t˹bi9hY2MMLn ow^}s4;,UJI(K  'FZ H[`0~Ҧsr-/o?oX^]b8xAG8x,XnldZ͝bz;9(h3OrXY;HD~1YN^سǓ c\-5_-Z#r{4q,{R<3E-v2Nt<}^zιh6l5 l`@G cG<8A 0Qˆ4<0 1!xQiN?i㏎44ҟ ~? Pa<  Xm G 'er&*3fp)]kBʜC˖_vK5v% HU2_1ݘFUGu?j~L& -il+{cf3Hī~.zl^zQbNnE+ͻMX<ޞpwSй! lwJT CkJk{xv8! 2*dwM7Jri2 .[ԧks?ycVzd:XOP,L]hswY:+Sxlt:B'J$دd=\pC72pRW@U{& J|Wex4iz"c8{!IλuO$[=j1}YF1 EدEpFD}:ƩH6ƓlƝs&a|;f x"S \ң/s{g|51|oK Β7xoI{EK7< zkUZ-CF3PމafVƱO,y7lx+4[Sbh%Ѿvͼ7er71wzvn-y=s uu$mh}0ш =pV˳@RY!xE4jdax:G }z2< {u5x?,mQݢRpWf\ }!n?Q1ΜX`q%by؜HwX> ;)lJ?v;2 A'3v:J Oŵy9}0_ _8pP9h[:z='x]P` uuj !+zS}<gG;\[ڠaKM1|yko< P p4.3X#1Y^^X;R;JjEBȯyG7Է/ogTvzc"mӖԟmX(OoBpڇ6ixG< xdazCDžт[%9Yom>ME>EqYOyf{oQ}8ӯ` }cp?vkn6/zMCo={2[=2~={fsxM,O-jf\e}[y~;6 ކ:xTۈ?_E7eo_m=Tefr`ʞ{-5p0 |N!7n+h[=.lץ`+ \T%jmg3O>S4mǶN{1h=p/TOȘ_W5ro^@d]5̬8p]}j0WCW/8eG[e>RpϷR˚m?`Zz_l{[FYG!,_j)wl dza>N(O cK7; \TkI6~3m#rMۤN9j9nj< !'igzGT:~#-H^ny 𖈘1O8$/3zlRIM=r6ه`Lc4HT^ ׃@.}}μT{>"VIVŨFj ~O-V2 Gf@[O/b'$S*Xo@ԺA=c TeobHnmxoK}竎{o~eK=Fx iZIJ #4GiRn odCE}; DS͉gc9^Q984-y,=3r|fzqm}Q^'da>؃[ak^ 5a;B<#AGUh'z@ɒ!x1xz{|f!+v?ys}Xm,{.#f hd+uuȽˠ ]ЁBήX|CM<79=W}.Oq#b~O"wZ:7ZZ,nAG -ՠa' tח;{BƧl{pbzr!=_CN0:ˎ/? 3xl|ո8wDzFwHbqU(' 35mrRK du7$R,pCk[s@n>s:j]>4wq<+Q]%1jkAm]Uܧ}.{ T{_ !JPCޓe885 ܄3=>tޙNl7wx.vӵ9}YoSfWyl u<<8Ml [E 0=qWl&W±aWʹ݌5gou~g Z;m)'+/b]=JLRÈ) {=&O؏Y:j|z3&WR\7[d(fo[Vt=b0Q{ﰌ[smNI;#;k# PGǚP'aLafM ˋPWL?W⺽3KCa&A%3ԎncnNiygycL=_lx9bvO 0=N_{ hZeu޾7Wo1[߸H 2;ʞɤI#Ǧ^;v5x,l=u\Tozr^zߟaGXiymv߄raIXSJqW}?^)s+yDFx%NPg^vņtӾw ݺ'7ǔ:kxwgwȑs80^p ym]Swa"oE 5 z}I$LoNL&#kڤ44bGRB z=ѝvDd=5bz{tnόp]:c9}m/"9$CG^ڈ˓p[g%vK;Ӽm|A<Dٓ5R7|`k?ywwt5,6y_y>=UNjDA]20Oz.<ۂ|,۷5Yzz3 s\:I3˛sA6fD?frgfQ+F d,ս#zmb-wC+o/w u'8dG)\;m@G35é=qk..yHKd],!{fIK٩y<,~ٝDaRoZWyZ9$H׋} S}5GN(x~tJx3oK7H \N<#ܦ;ӧmnGio$&BSr6#(8z>{ްBl) D j` p,d3?pܚ 'k {ǽ|qe|Jc,7<2'M|=IROxֶ܏Yo*9x=lf3V5}-L{6u ]gGpyEY[%CɃT a3Lh8Cёֺ$|+{Z<~Zn~ܻwKO+^Б,MQz X ~1w5%`m#A잰!cIUNyxQ Q}gVW-hh{bc;48nێBњm؍'$_n=~ZÁovG?hqz"\⡾Þ2׉!g>2{̺3(}X.F}z {-1 >{yJ7XcG}S%l  @JS[qC=V֍Cw,xxu[}YQbP?Dr2>^6Gz >/o 1yjW½SՓrqg d\??^g&tڝ=51,]5a>[*YGWRv[_{1^;)M",]!*r&*FmMT7/4znP /y 7<_AWX" x:7zx2XߞKEbU|4j etO?{cǎJ1s({3]6D_[e/gL:^>25}Me[0xlGЊҊgr\u}.K/7+?FyP MN;{ ъuljw][uk*,]0~~ vuJ;۽Tl xT 3W;po[KzumS£&3}¯^!x452!;WKXrjt ;Qp>{WN+=_;>C:WZNh(AEdza :4,r z_o2z+wI U{t|v%pn>ﳤdwZԒU&\ξ/pcY `7I'x˝I1^Aݳ(V^s-Ȳ B|O7V/{kjͤIs7ݒ3@!-KLP=m{$s=W1lh5^.-JaLr[kDHd I<}3ݯӮ-A~j!䵦VMNL⻖-wC.&xSA{ x%"&Kzu{_5]5VGIi?z_v{wz-X wg c۾e y;{1`8: ~,E Y]{>3ʗc:<$vox蒽=U<1Iw{Z ~*&{]x.9m s۽XZѾ6~);~ S{M6'ev횘.Pf~4.'xGxo sZV=?W_ x[s'z좜ޘL5i*Y{ܛXq]{Ǣ2 @6왾-;޽!5窍}d{17m{\)O_W`c9/Z|'#{7!{{w#/wΚoHG%i>'HrM>۝Ӊﻲ)o^q=WJsz]_QNN纼{y^`C+lUDIz8+|E^S FṪ==efrK:eAE|N$ CJfgzGx8 ϰFJDrgm]=9}4xy23޾\LW!sbs[Y35zZe=1¶NFys ~:U*erIkױ-Gt x=Axf,;0+=wm.f"lvx[ٝnj嚉?mH sb򇯎{ZaϭgNc1f Ug?HP#VEvoy4zbuHw .'LqFc<}'xaUcTk&{ݧu/ݫf8S/L刜C[ncc\(tGd{z_ טey)kr{Gv<ܚҘgjH =]wC2MJ:ӇRܻ<'Q|_ӛط|0{[znD̶a)y}7(0Ggw=L|Le8?n2Qquwٯf*'ǬuXy{D޹y{4ї{/A^Bgwc=~{ɭy[HX=^,#&soM8%o/=YW=rўL\P=(T(g{rDw~+]1h<\@yW]#w}{٭ =;[}oeUo5=0Jo(sA;I79p9jsCv.,7 _x Nh}, <3W}|p#}k>|k]vٺ yIMf,{jǪbi1/y*/b *QZ+h?%GN>w%Y::o]pu6/{Q mW;4lKA~9܏ۅ;:ľ51>%/ Gtm%.f{VXj͑@Κ6.PIa)*Ӧ!ݍ-_rxFDV$n6eyT_ĵ8esݡ\|œR=\\1P6 sԶbcV"W<;F*IԞmEi}උhS}Zؙ5aOes^GhՆMcy .Cٺt6r`Ń4Eݺ'z݂xkH9ox(_,ys,a`pcz@[5Tμ͜=z HÞ<]Q }'M3nnp|`=U|.4|-#Wiݖu/js{<`ڕ/6]o}i}vEЏjF8b^ׂA=d< sH9j^xrᷟ[TM{Y/ m|YOc7`]|7O9?{I{ ۖ9uٷZKGیz jT޹v_x\C su{ٜ.lhզN?^ҳ32Mz#8)zbqSL\G`5:u:UPܚ9b7H|;;{>P}v7=]S87Ҋ&>qrz1{&y1su-Mz۳xvM[5y'rr[=V7Ayÿ3[.c+9[:>%go]YH=sڻ[ykݹoc{}NuHԂtP9=16f^bz/2h=%zPw'dzZoO8ov"Rq\ wȥmL}3z nwnv&QKu]td^-sVl"y1^hyi5_K"]`D6DuSptvz{ţ0m5\xvǘ 1{ogUf Lvʽ{b*0V#ׄqكы]{EېN9Q+K&Y縃ZX{ |:ocb`l\9O rsFQ{|7 4Q~'6RpvP> 2qz,û0YRY1+#ɞOR$Y=YSZ|炏η^L_=/ W=-|%8˳+]iOdiH^7ziGI嵮&PSibnS sZ~^}op$O6pKS{/loWNV",?9܇gnSol@x^''/f^>Os9~xv^gik̘٣/nnvw?D;fÜ>Gֵ|:ϫ;nќy 1 ] oS,lpR4gCV/[i7%mjk([ho$1##;Rf;Z7`OP)Uq˜&k|& 4kԽU]5Gc+X_oE^6pHhyw|3PPd~)}_'K8]\jVw.Kެjĝo> qynܗr>X2үձ|C!ǽhPA\Nc/W>e=9m>2I/ݛ㽝\~J9U◐{wW"p\m}\>'>[s]Es݅s0o'ʓ*׏C\b:u;]3v#gB$fMz]W;RG{^**yFǞѾiٚo`NWk3}M>VpE'7< u^A\{\[2w3Z2.X8,1;T8ǗݔW5x_1`CK#\WY^{W,Qww0Q\yI%3a(ђWη8y]mr8O:Woo+/F~Ouv@cu|7TtySqNsyfHRdՃ{i['YjebFm~iI>>oO ^Y;,lvk^y sy, k} *ԭ  h{߻ݣ~hBַAOX DyRYlAW¾&{ڰxz}VAU`{Bo9H-SuF`72vE'RS5bЯb"TW&ޖKE7dx)szMSd #]zS+|>=DMu_wvopz%H9'v ŞU( V>G $bA.QȒIgÐ>U6i|oA" ? J-퇹b+^|RA2v{ŴSBo_ehl{uqCs'%C/ ]v]ry ^Mp3ACDۇ]EߐyHWL6TuO6[hw5f$öS6ӗf3r8@<8=N5-UO=k?gO<$]@uNp/t%$ǥ>OI;nXOZś3Tڞ%h0J^6yǺjpxݼ:t7wrewHP:>c<4%f-{-8ɹs)).(9;}sVJ\[iu}. h iJRM/yE'~=v|ef+2+Cm c=Q{Z3þIOr9َ+.e=A2*hɑ5!ڽd[FW:6xh$xf0N LzV'ZmG#{'ۺ/kaF9z=ѪV業 "9q\{ +vۛTޤOgY"2 r>{mC [WȟƁ۵nvI:b\xBa:OW֦vN O*UQM5d^,Psuom/>ûr9]e{r6yn~w9ۄ.&6nۂY-[ǎӆu ݬ5zx}_G(w:̦OwV}1ozM5s2_y{mfу3o)eܾ ZQVUFn obTpp7;SxW5,Zl]mU0&գ󽂶Zy Mx\  f.یs3}٣kC> z-=AG4mPj Nw7jͼBa8 {<0 ]83E^ ;+e69i/ӯo6ƸDѥ<.qS{qx~fNZ.nFYݻTۃ2I>a\1Q_{n8Abx<'MEɝ &Zgpmܗ~d9)xlq$G4 Pw-$(8}Wmn߳ʧN|&-W|B3(v{Td@RӃVS༹nu$Fvkŭy ߟ;D~qj^r|T|c!3R\wʹ /$/? z׷w]zJ=yk7t^qpp}З$tzSȽp/q}Z}k%VK;쑁;Ԯ>grAuHs& g`obuMK #:7\3YbgXq֮D<P=z?]4[qt[}yT[rُH`#`kwrc1l'5xMkR\OCMO}\ ʻ!^G/|эC -h{2־wl}<ͣc_sEe=[]V~OzYy5-v91$F8wܜA9^y2_> YӨSgN8{"p*fܗy(kE=hbW-==]o[G.W1Mrux޻ ˃j78՞,~ϝ]2Nԇ^* "3WܶDn LYy2(6c+Cy1YԵ|.i3lpnM}Ǹ1.) uMU>3j{>^}zfrHhǯ}N`$ӯO1o}7 kw@z4Nl'&7VZHSbK[뛞hdD&SqygZA_wz7=JWwTDyU~2Ag?u(=vмӳa.v2׻C>2.漞vؕc40@9 WqNJT_p,ڽ޻잾=yw+Ɏg`̪hC3pu<i\{\#53Zrnכ9n4Lrϣ=Y+u-O&ʊ'9uY8?)۝r[vD'̌z,CL`lx/iPŨ^{Or/ާ_J`y=OAȃx+*{fۥb֐۬7OhV4v-pFxt: qll1M?׶O94ol)3z/Lz"O3Ţka0lEk'Oe]u@Wa~ڷQˎXgu-3Z#="q|\5Di{_w<#+[s竝5cyx>9V{mȧw[{ S2\go| WE jlfOg9U٫$W_w s X2ػ^Z}G,N=ý/T<=7粟f)H;+ a|]66:,yE8g3AsII^Kw|uWwoV]TW;6zLFUW*Uw;6nQk/Ng/e]0fԴ"q{LLw˛y J9u$!^#sՂ0P_\N~ &O.u7ۢd׹]Z qS^giTp(+\tN[N6jdS>rw4_j%71WZL6_7w jrj_opP} $[O7Yxmķ| M1;KEz Rݞ?V0kCns!팑pЏJ !> jF'-=qNGjoҼd7BN1ޒ 7ckٞ*RlxɢL[J|N#-^e##P}Y6e83 G=k:, 1X}n*=G q^e^wGIq{qe_$@Ht:u3z/8/t.ew eyv(QGTgb&4I w{~0a5'!#s j3>: R3bbn؟6p՟f<7ZzB[{JϺx7tIc=CUn:\QЬUt8O7WJ$d,ybj휕/h~7A͹ශ9}BeOy흃}mٍ\)zmM_5N>><֑;[g?^IT5=7D3\kPtWb:5\W6FzkrrO1>j..ާɀ {'\~wz4*=>~{'n<ԝ\lijf"U,g'CHߖR5c]ڻVmOn_!oiS<4(m. LTxtb˚=!cp=O#7ףɛ_{C[h93ۍSHD[Ӧ{sV+^hp{GnJrNrm2pֽ\o j=3Ot^8SgƏd%.W灬s??d#an6t]jgge}㼔bnZ珒#wF'|{)@Ⱥ>=Kozv'x+!۾o\N3~t+뛠% ~I{rƯGieԪNXܞI9cwsùS lw]1IP%:3w%*g 5ޞT|wSz,8Yw#ُMd]GHѩ,VL -Ond{<]_ss'ŸͤѴ5\7yQ#Ȣ-~AМ ,> ;6qW|t]h'O#~}.'V'xy}pi4:'tuu 5h^}p5˻*Yv{;M3'O{wX㷽 X/.b14ʧWj}hV!u| !<-*'z6hHG,֯LWlScjݹц琒.qG{>ܚ߰V7ax Y/`iyzUwW;wwM:G^=r1I(ƍ: ]/"o$@qϗzߴ _LKgmzPQNE/qݹTqCa8;^ъ9"а7x}Z2Vyop дp:=\=02kv;=eMe;͝;k,?yp92ڛ㖈z>]CtjnKMwwVoל3]1 xS*` UWם(nF s3 ɂۤ:=[RŠfv$m5*>uްw5l|'7W=ntG.tSo~++&it]Es]=L h`ՍrEnL#|sL>D,Sњ2} :޴='fZv;iw, n4e>sasˇ,CnSVݥ/w_x&T?Iz- K`vq]M4p?[`_|gw}c=atnW|>foe1z'M=d7^=.M9\7˻*_Vsts.ܼǣl<6H^{h}Iu4oywL(lS94h^xt\4ItC4>p~ce;˓A9̓m9V&s$];1t;.zH᲍OqI_9+ &h^mq~{IT;kceoKSDd0ٞnz{|I'{.A8, j_z.-r}:)lcNyWNS {^ ,췽p2&Ӆ& h[2s+Xv{I]/uNDYԁv׏ KgAIrq=wyI0١ܜNF;f~Yh1ǘszGUM]F$ NA҃뜲oO:6a#n[1u#w5V&phGpwgp\{whg#ϐKo)>bZ9G]͹gwr+FSb_X?BW}pmmiN ER2yg7 !g*Z[# EBvHܓeѦYLW ;ٮ ۇ}Zx2?cu^eZOVqkf1w,ۻ'*˦v~Nޮ޳1/}GvmŢM]N!sw{ڊ==Ej~Na~mߛVEy{imߪStze'ٝ~yc}Mǔಅ҇pf1vw7F镁Pa}֬yrY3"+Id>ot]O{qֱsV2,u:^BfNTNn=={hQ{w7< \AoglDL뙳F s&1{pԡw a7\/ ~=ET6:w2Y;99זNit4)mE=ޕ,q)5`zj=(cA0/&:̦Ζ{sH !+'إO{Cŝ|,lfs S7u/lHu=xĻw%sg#di׽^B v0"n Grr^-ǭ}CMgt]}kHqr>75Ū$5Ncɜx\O9-3BK}[,X4^\&o?15_*mM>ea-3cKoW=ݦv>؃OF׹=Z{7϶=w% )d_iwLjxf痪>7붜#_Ɏ/S}}OwmlMKUn/+^@P=T:VSԭq\8|Gri쫰gQù8&7fwwM,wkÂy7)=z]Sz\a(o1;e<1p=+Κ_fV9w'D/SԼ.=,.zi!lli7^0,S=߽Yt(?vΰDdoE$7qmAǍz:lKM"+zm]_Iy*g|kuq^zU^ 9"+/gkGH,G_77>ђ* @d/gV9ا[)Y"oh=vvurݐ{vcYV`|TtqyƩq<뱃9:ѕG'HH<=x%϶e5qj2i}z|2).z}{ƻ\'2ۉ`|X@/3sԽOs1Y^-&״b:9fjs5r2|; 'v ZDc\VL.@ùHڂ:5$7+<znSU7Eq 蘓~gA"r{: ,6b6sHrn) Ec-:n=f|6/5>M +XD{bھ!r-K>!ŭz\z}\kUx_zLG_p=.+hIYhHt9{xX;,m;$2r27>k<U`))?K4ׂrOg^AB;eƌIYTaɫ܃3{='T t1P:#=M1_&HIG =sq =?ֹÄ='wz]^Ajwȑ`>7{¾懙%RĨL-MO.]zPϟ޽o-=*bj#Mݶ{O; s]c[Q:aΦ0-x˖nX{)0Cӹ8z?3'rS=Leu1ۻז/9[nES;5t(bt5%qxo?h؆h#ő=e*DvFWu{-t `9.ݯ+bWE2޶ 㔋 |P;شev>/J0+vo]^RO73M0ma =rZ%cؼ7B6ϟp2xx5؄]{{=fqؙ3QhOn0vwPU %fyo Y/k'_iVbU ޘ/oh/G_yʎdNIGgxA^:;q'A2ȇXb{EzU\I9wotuZ[rWB!C'UWb-w킈ٯ/U;{$ҧS2v`lJvEյaãouܣٰ2J/쾣 s#:lգW s~zl^~Fv.C8 C]!x _vzf)Y;<9/wrB,.Gzy^))^ڜ}w{oզGJ C=e6П.r^)0W}ٜ6-}LQWFנ6m2H͚4q!JS9H8Zug>oW솙zg{ッwz2O<þ E/OgKa}影{{sf+&Ar'BgbkqQT]W9ds9Nj[O<iid#qVfpsn q;7 u~vhxe[Au0(8N˴lܸkvyNΎv;M!.^wؚ~Y0iC; r=}YQUv\=Sяl~}IXJw)eSm!lfE:{z=><|ϲGmKYO43}(yvɒެ{ BϽ$oD4p40-"ΝǨ+oB mÛ^ bGm.^dcl%.X14+g5=wV!ayr lqSR($mSXE,sVOL5c8ٯ)X=Rm32ZgW;A !~!Ζ +#8)Q#0s[÷ƣXMeM#np:׽t(S2Tn(t+ܔظo{9շyh|׋l[:E,^ǰ{C<#JhFaM7'mz.Gsnm@ŦiݘoS_%.ߘ8ɼߩnM,ڢ.NJ3-n,󏇘z XjG%Ty;t2\ )l}Np _rt^6\J?=|qeܷyT]@6N{d,3?{ĝ B .ۖ-~k^C`9*-c(x}SBMU51W:񹛒ujεs_!q͕mCYkvo7i7Dpg|fAbEl*8GEh דmrsA#C"!¨bN,Bg.{?2U\T$0ݮҷU_Th52畚LV]Nrw{qJ9 nHR foY!Ѝ5暬n=9GmX>̱l^;,<9w,xR{ BhGqkn=CJG/=2]Sjpjрx&J,qgWQ\ƍZok{9%8 l~-k[&=nV:p~g\@\KhiZ\Nyޯ&]\-zB50/5?-tyGI^ w;ӑ;'A)-н&m@,-'+.Ns?d3;NZ+.+_cN"ny^!; gӣM%nijm4+ޞ}N ǻzW<8*>O;Sb^b&>&Kvy-p;^oC3-ì1(:n.7cwhbOmii˴y7, o6bg9ʨ m~Y>p|c~Ʈ״Sl4Slݥְ{F|6v=d/|53 5osf`bwb ȌSOzD߹A|。NM5Ox`?r_M_\=os@ﴢHHT6瀋0?Q018D,w|GEbz=BKBOoΕ8\6c)dޥ dP3~ޯ2 ߏ!#.=:=5čZ‰(VuW#)gz.#˷/洱<:+A$[]0\}h,rm&+}f Pq.=#y`)iy kt&d(_,zN#uu\t<1ESs_GmJ"ھ*z$ݧe]Lq.gvABB= y]ZuGBؽzp_nO2b>fyNtł;Kc`%ktHU}+TN a+7Eun 6dP>DilR ]^*vQF{ݥ{IfW];DyRx2yzu\./{rdǎ87R~=A2g]˧`m㴳[=7_<gT|xvt-= OG/ 2 6=pX)l-L{:&gpd7N?tsW<D/x{n̞ɔrR.;52yq݅¢ю& tGAyQ^g+쩤Saۺq9ŽWz+KƬU98c#?;uYtz*~b8AO%mgGe8=n<,_e rI ?kXĶ/|P{ 7,=ͯNlYp8YZ ;پgOٞ.pXJ{mX=v-Ɩ|kW^ w[6xt/p:ڹUjGhD]([Ûx^K^".>o;ISώu9hsۻ97 0䋱mUҜY6uT@K8,#|U)g#==A<^{*r5F~=Gu7]$sksEÉ?h\6߷TKsϚ*7l_Fı> =okGXkٵ_޾MtDyw*2[KwF\/\þz/,%e1~y$#gx^7HҺi:ZI]{Itl{ۜZqN=]nl+׺|g]9E}><ЖgvidbtvɾUx\9/.QlB窍gObNIs:hˣ]t6AY`yr:Cn{%3Abd~v=j3x(/Vn!{X'K_jگ"[=f=/T Y˼`=p$Ƿa,/͡sӚ+욋B8Nԟ Y.>'qtbl+\Ji؞ W(%}^!\TUƑ.]. J74@P_>+]f:p#w>:Ғ,kqrxVWly偨L'd%Odܻ` E-Ǜ.һ|'-}x.>W=y|dzE*U{N^ 1K=@Žw:3! xMA YbsoHm޾v :n9+{ۛu=JR}ZZk)߬{ Tԍ;y {}aBx&ΛϡzKN=:OhB9Nh}<݀=(f27vޘ}ps sD&mǁ2.X:_¼tg 9M]cGx1 IY>EO;_K="Z+٢Xߖ,u{ R /dSb^L[3髼ǝ[NoRP:tїRV랇ϖgf{=ڑ֔лۣ^DY<'8Ef<dFX_;ҁ^fy=u&v &[ƯhtYL`lk=>R.ADV8>giFs3LfYn,9}I%^.pn&M|f0;ݏ̲*{1`I:{]Hp OvYlX~.7VЭGG N~0*pQlzj·s=G}WLV7xRsyz!L⶜p9{=fchU9>6hdШ1i!YQЉJ]>Ztw5վy,4 xų{ͫw;L6z{B28rqdA>_P*v5o.|w),nzg  X["[ rAw}?jV\ :8z&6Sc@gӾ9/A}y)a߮sS\e8i8L( A6X^szi 7=)2<_snF_z0t7=cIux b5q<_F wv0^}r|YCGΰ݄׶$f:6KLPt/<"]DWmLS>S?.4)>?q.&K/*rui{b1:9-֌AY9*PtEŗyأ;=%(7ܦLOZF&hۼMV Dm}IZe8C,}=E])-D{"aF̽mC .R}J: 9vʜc~On9ccyryoO'R:_3?Q R!I3vA$y]^}}E=;RBub/ {eu&+gssꠉ΂sڰtIO;xQ~NwY)ORڞﭾ2Nm0z}2)`QV`[p{Pqcu%xhM#5h= ͧvUJdz݊j85֖ Ძ*ǹ#ޘlC+*orGx1M&HFd%4N{. o򚻷ϼsfw=!KmsN9Kҷi={rrYyBr4Btη+׽ڣ^z{ޒaQiy꣟[n@}'%w)y/0m6 iGov vq{xY'<@{e=Y#6wk,g Z /Z'#<\yERTK=ku2+KG Ӟwdi<16Ҍܣw/((j ,v"ϯpxoc;g0jr{yi7X@x ^ԩCSk1.ν$yv_ 5gN!!ȷ2ۓo\8=#œv=;(wҰqDrN 1Cd8F{n5姩[Ȇez KȡƱ뱑q/1/4"~mٹP_|W_ONchg)a+r#F8B_>YbD빹op,{o`g@9ēwY LVR.==.\^Sxf&=tZ j'{J[>G\6n/)/VD8|{( Uy >zE sql<;#Q=z%^8oZw?}_ :Mʷ?5oJ+4ohUawOZэ^y={)Ǎ=ΏAc3i<{kGo!ϊںB sO9ώz: ~gUrӻWZY]R5W4CW,r>\C3ql$sW$ >` c}eJlc{ظY0]Q4?r.8-'yKѥj0ۊSv6D_I&A  R:^':=y]VNr7%Yü24OM;0Ҵk+giwx4 :%so:j^i#WMys_<$\zIǸ{|Nxu37iw]uTWޘ<!wm #63&?|]_L!`jm.rs>@rއv.(s[n?G$J$.zݜL,v{G`f;0X x+7;S诔,>֭Da1{\qJMѧ%Z!}` "1.{xO_ж4l~=StH2Y_eB${ M 79 >ԾXr x\F-j/^_sIܔtnb'yQhM(r6^\nl@ XՋ[[tviA}쵹<ݓ"K/k7n { ~B>|G}?OR;%ڡMEUnA\TVs 3r{ב kNw&6Wz5:ȯ7h͚nɽKBSe 5By[hyfW3ڈ_I,OMU|=Y]{ָmメo$n߫۞B+/}׈=̀FFWR~\CD{7Vl kq㽞,ހLe:he!^J-ߦmOLŚ^_>_(.;v[0oPȼkpEXtwd=3kJ XSG4^F'1ޢ}xM&ŧ$vs"꼘] Gٲ@ՖyyZMy{.+'dXIadG8om<~ylʿ)r0%dznIJh㣭N}O{;zm9N7c}\]]4!tNsnc~[0Y/Y3^R`H=壋F7tAo,>mz^~^s:-u$zbT:݋|xm}ޒWv=(zw 9.g[#7VpLbeI>9D4R4 .P+{E/[D7z2|xˎx3E= ͏%nӣ`#BvSY;є6HMٻq qzK+Hs;3LVSHo~YJC\_utٸ脄+r;] XS 98ov{+2S:u'ٶj=FRf 98)enNט.ۮUL]yPVIlJ@^WO@ Ԅ2#fmXJ$h[[pP$)@@PH(U(AAA@@ @PPJJP  A@@R%@ DEB"I@P(LZ >΀qzaŻk֩us55šU.0pꩵJQuEam7vn.ns;iNWJٕ:-ݬUA.mgm]YDTU5m[l:0uT:7l}*bȖ, 'fReѩhtk)TjmCJ0uZH0lR8r5u W-GSKvխDTi*)FTk]ufkTvQmvV *ZeM5*Q/}>U{cݲaɔ.jI}h̾RݘujmEňmV:mkml봦tjdqom]r:rGu*6S)H*̨$J}ͪղE"km+u6Ѳ*V6N6Ѥ>/%PכNt'\i5g(ẊjeƧӻ5ƝЕqlk$ҭХ(Tvb5#c6҂WwjNxX۷-rt]W8vquq]Iɫ\y}1lSD JѰwsmbTk 2mJ!\ڥUӻi(D>{z֮rZ590#]kg7UPJ-iMvrrmӁR `֥ٶ6Tڋmvʊ>MrκYɝSr霵ӦswLg/\WlZ eݜV[5mlݺMv]ER͹qjϗtuXZ(V,.ݓS뽶m۪t6 "f-hԻUml5%[cZ4jh.LZjJU*٪VbMk[lekmke*֫k5L*jk PQ%fƚmeMi يFAPZN°]bB5V؊fƪZf%".Ɣ-+m RD!E*)-dŨm&KJ$c mS6*LI@3 h5*m*laٛIii]ػ$wnkVeCEift4GaM3SݹLc%BհجNEk62kkZ,tmZ-)KSIvҁ&h[5`Vˤա[wIKwrmm%VcUUGZB١ֲͬRK6 ͕l+NV[[m`MTMelTRZVXۺ ͦ-imm ]գ,[UUlmO'T4JT SډP)S $JSeJQIPɡ,?Qcp7iX$Tb9+X,L6d($WWblp)7fhYAw LcX Hz= 0n M8QhY7Mwv]eB-5{%fb݈A4M4M(0n l4Һ# XRA F(j 54Db0f6j&2I*a5dDt4v0mPhXb 7u6b!&X(3udh.1XjHi3f~!k^ץzBC5&4]b"ɳMDA Bk n Lj#3YLDUE 1LBM5u:0P$٪"hM/ѷ^=U 4C``PYf5dFE&f5B QQ `&NHw nRdRE$`fI, lF`I3qC$CMwAD$5b2uHAH, 2c L3( ȪaHvvla $hlj0$c$2L2dMH).d1@1aM $ `M46b$Rj3uu $ d44݆b2HdçN!8d01 ICMSC@MH ,ٳfɡY4݆EI$3&MI 44j @ɦ6ik,!l`!EŒj47Ca`Ba'dޙC&a0rĄdHdd2df"Ba@dRM446`fb&5$4ٰd`dņIa0@0 DI5bD;! 01ɀC2L\d2HLv2BfL )d!!3&@02Ba$ 3da2 3@j0a8rI3&``a d1I T 47aRIthd da2@2dçBNw&0;Na 3!dNI'NYꐝt:L\1a 9 Iβ&2fB00L&ٓ$ç`N0Ɂ8s&d3 2a;;ά a$&L02a0d2L0 dáC!&L&t{; ;;Β遁 L0Lt! L!2pI&`wp:I3&&I ;Cdɐ'!Ð çg@:a̒ýHf0N)J |>!B:t;; w;$̇`WSB!|| I_O"$sfa;ޝ 'Nadd3;; C&gI,Ð䓼8p``C&d3 p9y8r@{: R_I(}"J)%𐄄%WiZI]֏/!fL ÀpI8vwg$N2faӜ ó_| G_]H@/ }!;Ü3&C JX 8C{;B[HrRw; NNBqӧ$sN& 9(e!ddӠwgC;wgN)Ӂt^' ӀpJg /Nt;E>__|%/PBJ/B~a/xEǘaޝ:{8gKX7'ޢ G6 9='yrrR3&dC!$T! DEđ(PHJ| Q}>9 G)RJE"J"@4}_H'}>@|A#o(@0*{0{z H~RJ}>I| >@ O$IG)'U_"!||!RM3(( O 6 (א^|'IKނ=M0^~b! < ,s(Pxse)C$i2R% "PA&QH DE $TPBQ^< |*0mRESDOJT0$ x ~O QJ$8 H0'* /&ˉ@3;8 w'[N *6}I4ڤDQ)84'nG$@U \æNg*;:ٲVŸ*"FiQ>rx? tR`|G' >"*e $P ? p Co4ܥ;ԦvV,Fiy?Il$[~`FƤUJ7RD|7QI %Īԉ!Q*$ @CRCvREq+#DJ 8idnכ^AOgo1p6Q@!aI6)-|E_,̕i!b"Dl?lא4DԼ j`I ^M`L "0)z4^%H0A nwrRP&UJTM]M)4[ (Q3jHnӪ&1 ))$K5U$*T1x#MySk/i!D7-CWI+E)ƝJiޝpY$/4i<"YR%wDaB)n4JH:- DO@*AJ Ab$D}S̈́#Q4y0aA$B- KΗis̃|ʗ)6 m/8mADAzsz|R .}viTk(POX" FQd1$:M )I bQ(/ B"@h ZwiI *"D"լ-j8f8t-]dH@D *SqP H˞ml A#̰iE6vw(srS1yӒ*$$) 򶰯,MBEYSv{0^<8vv;+b/ ׈1}&ܱl!t[r[A(wuswv}FQS+*(Ձ_KZgcun^dq \Ѯj"1Qۗ5v"ή׌|)-Ϸeە}^ ]nͷvD^fkΡuܮi[l#l-DFF%FFխBci-Un$}s9Zo&o!pp4,w]Fw.뮻1#2̹ݝݶMꉻEPf{]:6y'h;^ĥG;ˮ|jMxs#9ŀӜ1$14N֕- xNzquȻ\u;DFK#M<nRu(#F} +̖7 jI\2y } ǝ >^WmkуGu]tɹpM;k# '9;pw.t.9]5rםsھ8s$78@ U@Jxa2sN6wW[᷂wBwsnRkr#\;k鶍bEW74LĚIwE.롹pwtb $s(AƶZ-R(65ܔvbmsrv܎K6ksprEʸ[ThlG+Q͹9sΰZ R#R׋G\ێ[v^RW7vk6Ʈ k(2R7iQ.kwhܹfXNh,jX^uն_ϵ|wuL AE|׈рr\EdaieV(&1.Z4Uc黴WuvpX".]u{wsY2blbh", iAm .q̤%<TeCHyn[WsWvֆŢXɣ& [$WJ1rWk/;vW"z$ɮ|XѱLb&F˜dIFKŁKR&鋇M6-Ջ_m_<_\;WLTS]]WFvrv[rӹAѠi-FdMFEbNبEYqZ%KK,<#Ul\.t[ZQAd؈3ܤIhLhr11\/˫+[ֹhwQ1{;m_+vlQICE\آ((dmrj1ƒ* \>oil-o1zwyjkBd1bCmTiݮlʋIE1EEE]+%`'TCіz]5jk\+$R`&XDhWw;hѓW w].Q[U b5TXR fTF hƌ"HaZnΚ EhƊŋFnuṻwcF1cQ]wv5xEU&`T(+ldJIRz+{r:%ݺ&JءKDTi2EvIbi)"FIy]gq;^(7ooex7Sknbd(E(dXB.F l*4Z"4)s%>r;)W}]ٺbvuus^rfj[ƈ؈j"DPFƂ-c*+Elh"wm_u4T^ssmͦھ#Q6n%,b7wQDD#j br) 'odvC7q˷gm[cd-\TPX64Q"5N ۔F ]}4xn.zlwqsNN f&(PDh6(K%*Ll[EPX;7F;_)^Ly QvPmXlC)tƍ FƍEnE(A`.ZB)5E+W7xL`7ӕ׫y .أMƢ&ƋBiic[*JxxZJ@oMh2TV !cI_51bȆ4h4XѢr}3r5 mĎ]ӫHWe6b(dZI+Tc64W7|׊7ntʊ3Xy"r(KnhѬj ZLljJ|ۈ WwEX}k>>nž/ծPbF(ֈQhd 1hAc[={rg;zN^%uΫuU4[Qj(4d+FJi*(mt{ռnk^nb(ڰQf,QJlhRP3RXE̤#ok^'[r-m ޷v #IЅ+EQbUX}\q\*]ܷknFQcF1i4QHbƤ,l\ TDF)#p_h}hf[]9־Tk^1,bʹi61FM FA)|h^4Dah4b"ͤXJ -ouv毤sw5,WoWJ8s[%$c2lm-&̢KXDc}%v{Xu&sh #Z Y1h؃IdA eb!Ǻޕ"az܈n\w[6'wwJkbi( H}|PɴF7֯|t2jbř`(DY"QXK&%ۘTuoKrmmWLlc3Q(1d-׷nKu܄4ɞ]>U^5H Anr DA$bĕ Eȗ۪J1RQBi64DV"boN嗽ĢQE,lh`b,Zuw{D"K4F5|Wa 0;fEE2b&mh_p+xE؏k{lj,R#ci1bŢ *5}W 'M]+(G֮{p%[t "0lRV E 6*{ZY=WNhlY6 hɤF-2"zQ=7r^nLZ^r li+E_.Ɖ"ƠWվ9ɃN|]']w6黮F*Dцm`Ė$[5)+kݸp,vڹ6",cQDk&41^ƽ7\ԵzvmrFѢ1F%IlA QhѤnD+rݹ{\#OHWCE5؍Fhؠc-lak^r1hhM0IFn`>7_%nlkp־oE6,b5)*LOKmPZJaiV,DHP!A$TX"0`aeV M&.R(CEb"4X(ՊF $RjB>neK\[FM:FѪ*"**(bX+m}kgO(7;EڹEPk% Fd4(s7v}&E}b r,`15I ւ(hn=n%ֹ^{]cb#jfQRF5zvh׹DE/m̠QhFѪM|kq|mmj 4IFرCd t5ܥ6[ݶELIY5+c@[!{ovAC`V(`UdPэQLIƱEFJJObl8h,V(,NVBp*J#cD5,EMU@h"!@ % #E$k%%F liO`{sr*֮Lj4FPd5k{\{=\E6)D`cQ-=銞/kr mC!5bQ5I=꿘u\ɤzWkF5-j((FDE/u׺)+z׍ܶ05b&ڈTT`0mޓgRi j2J,`(-5 +&ѣQȖn{mޖZۑ"*+$b AQA*oIQ4V^A[ޛhѣQPX RZKZ2Ž۶A+VD#Q`bcۖ{(bܩj 4PQT͢d>J_tIb-F1lQDbD {s{۰=^uF\DDlX֓A`7UI\IDc-Q`^G{݊%^5骹h*6+_wi(1k-}&r&T1IfC{]{^Q{Ƀj*J 6 أL#ojF۽%jEJ( "b#0B{7k"ޮ*,okn`BhЅIcEonݽMxؓ=4i6dRl1XPQcbݫ3g-UM%&,ZI,+i(m6"/tZoq{k܊LovcEPF #*j=x̽{\"ܶ bQ5@u0VOwֹ%("1Ih5%{׈`&c$F(L{6^뮭EAIIEb5E7{Bj] #\a}lXVx!v)64%D)4*Ca)=ۋ ۖ0^ۥdƓhԒ`DY6)+ۯv/gua5҈4b$cTGb}0nY4bh`14W{^=ۢ^hVb JɍRX z/ooZm'E0ih%^7 {nj{&Q4XHmJ\6*!6*FTA%w#齹tF`5lg׭-ֹn$4QQQ"^ެ֯b u^&@h4%k=*7q(/k4TQ) XѱŽv/jXTbɍEE$'pj{sXmX+8f*f`JMQ*1^뽧"+ݹKƢ,EDXLFƈu{naow4{scbcQ Ht4X,6d @׵ڽKxدyF7 5c{{o混+7-HE4!dܽ 뺽^1]2b1#dŒRQou{\s^4Td׻{ {U@Q1XF̽{UʈcHRF6-ok7vZXdRMIeAF&V+Fcc{xG(3Q5ݽʽln,`,*d(L Hphfclk{ou^,Q94X+5r7B\Rk%#{Eou^^JXI4}ۅ{tbэ^k^{#W#dl%5l۽u=d^MF-,?XwWB߭\Z* {xucW4c Th ׽{ۓ^]ݣ{ʓ1Tc ,w@UdQ X&$byokk&,h؄Q(n6MmZݫEQ2n^{k彮ǻnFfM QXbz^cݍ{5W Id3u{JWADb)b纽=׻\db,XF>_Z\O">ljMQR(Eݚu-b`¸L'Pph(6(jLE"i6UE $hHY"62^)L{hXP~GGnG\XDYOWFZXm~ſm_WODi4X#6%t+`"i b-DHX?~搣cXl_ߍܷ+FF EnY6A٭QiKbb(Ƿosi_ȬZM^5\Dc"h 4T~Lk_߭L̤EF4^ob׶/mPDh1c=p׻n{{7\%WOq{AfET},gŷ61F/}+ݽMZd-mL{Ok{mQ`IB *+6T 0SdfhMAy^mĖ/k=r#bƓAE{kow1^ۛm˗B&6+k_?jj4P_k搬h#٤ b]"2 FMSYr EQ 0:"9 bAH) $ӈlQLƋ^uBݮXh'ոI {xr{[29" *enDF+{x/yݹEb\&Nd0*`AvMDvM(ذEAdX1W%AW%a8SDRlQ~י_0EsWH?rd b",6vJ& "ł#rk\1fV1J8Y=] X*!PɊBUADɀd"䨣*ADAbGtM ͐6Qo~߫U`PrT şs_MOPl풿n~Qm,`)==w]+TEF{ڻ fP()&qJnQQOݗ?Z!H(JLi 7~~ͫdA`qeIYQa90r2,Y/}{^=jU-Gb6"C_W/un)Lb(@DX(%d$0¸J@rgܵEI_wP~oڸ#AL0W$*$PW + !qb9RV ݜfCJ " v&ћ?j,"3PX"~o_ڹ`/תb5iXlXG!\H&W~܈/ Q$X+d(+frbȰqYJZQX\9IXE0Èa09 HLK`K$fL'%dNX J( DX(P~o/G,h%2L:` *"ɧ3dq D (S qZ n~/U͊O+?QW8+2 Edd00()PS/``&aU ņ2J*%p(0 "(08$qjJIY &E .LTDPPSvq4:[M,`Pb#rQ!X #\#L Q"wN;[dF! V,PQ2̘qP Ka2b"(9 2,dʑJbYXLB\.@.*L' -Wؐ_xSDX!QrZZ&T0Lr)0\p+0)u2b&I #LT0'QdQH&W&C$9V`U1L&2-p08,LS dUr4rQAnoќG(,Up`dۄ pLaS1S0qaReb̙%`TQf-ÉT"ɐg-`P̓!+!2.E X aX8pPP*T\+&!YFeb \%XL'%d¹`̪Řp+̓""QHJɆrAJ$cS qUpa ,˭v@ U7x6Pd"̓fEp E2qLL⣆XWÃJR;*: i@U&@0&I6((\+Z3$*d/rQ!<pF Ia C:Ř[`JQdaQ0\usBbLG`UfH#.\*`T%TpUʓ!HT0+2CpE ,Xd)(́TTEfq0 ,W!8UNK RE6-p ŀ\*(LpQrL!Y0,T,kFE &)TX[M; C+H:m6 L Z Uc!vAb*I2(2[aXd&V.TG$0"1Ƚ%@a\C+ C56MJY/~x_iP L N\L%J"NFhЩ,WI ¢L0' %R,).D $`'LKIr)rZKMPP°3!R r8L0ALK[V (ST`)80\2rNFGt*1rQX$Gtd gQI008%L\l40ԬT2TSdJJ121. pQQd#e``aL2d:$¦Rb\$\.& E2 <(]͕݆Τ*gJQ 0[0r8eV6WHnӬTٱ[MXC&I&dH)! &"*a\ 1[B桲qDa¹*La(*C!0XUQq!f +UV L1T+ (Vlr2`-¦@A&CS*8&(Ik Pz9JDfJ̬L奖a-`aS+`qޤC+Oo4*l,TbfL2 *AqaC b\ Ʌf&r aS%pHs`.ĵmvs8).% T UV,p\2VWd+%\V"aSef]3xۣhR٠q%fViZ[4`.F.IJd8UPrsDB*+0pW+GTa0S Jʨa\Iw02`()8Sd!eLQcULK\(8B욈u44LS8 l:j G hl:a)+ t`&S0NZJ &L0:D0:YEJ!s#l-pݼMd;fa+2o)6)PNsS#hM6#6hkKn81[E vڸ(ej(qE5t,ҽ D8eU0Ird̅H0Lp,2gLp9VQɁ0D-I$eB8SXV +DS+2* +ak;%^0*3{dt4hIQȘւ:A`e 2^100 :**Rn͆lUc8+V):\#hI0Fd:棰:aRzTR`)QaC2(/RL &J"DI*V;ZHjqo(E+U ك02tUSWB*VKsl4GdWDG!lf[QA^ҽ3 dAX`+y`CFfIX\2`saTHDNM*a.,.jsE4*@2"`nv+b`BܒnQ 3hiơF.͚bXhf )s[vl{E E. qfLVep5]ٳTR݅Rer'LL噼t-4"_/VfedڕTGkjͅ&øLX*gSAn*PvxJ3e4e;x٢[ 0ӉT+q+qǕL*u]lf@vg4衢񇷓a6;R"{ft֩BPP Y7MPxXʍtg06UW-Tv)MT؉[lc ZLR 2```_@u ؎]5tEyltRl{J".blyK2ul{m ik5VpOa82`qXyqž4Uvk&590`0Xel0 !1Eيw-+5flS"R!s G8-T^e2)Q*Q7CiZSLZ wx=}ŖOg| zhtklUZ2ryB뀕SQauiL ŇM PC<ӍTrȈs06̊iR <{I녥ȜÌQTRo<]SQg2m<>:i'rFij}Y8fc˨ʑ33] I] I56heqNQkQѴЭ9\Ө4(gNIž= ^db[iǽNy*벸ÑEI),8+0`t8ΑJ{StۥͰo6M;=tx> xftݕ暫Sw{ifaLǖJ*QU.{Q-Rvw͎6ؘ\ M4\3ltBW4{uдo<y"'WP3Zh{t3]D5Fػ3Ej mQ|n˺ZՆ-[[U=i_'8Bݸ.L' -NyCJnWaX\)`xݴx9sn *xO=Jǭ\*aFơ7-]uMa}[y-]63Gn(ѣzi/|pӦNOE*zf^±@컌1MWumaÑ̙:V<.ҚsXǏv PKe|ч<(+ZRM7-;hg"uJn 6Tc usl)h:næݚtbq 8ѬD76uMQC̝0^JT.[*)|uN -1T\ݮ虰Y=|z\Ehy97ϧ&DM=9ѵy;US{8=i 01t.igrb|>Ғ;}_">%Zw΋ @jn[D OX=eiJ vg-o4g./qzDT0GdoJd=/vklӔH~!H EX ??sVuJopqb^ӜYD\T(6ՊgbBzVCHm$wT) Ȳq#}>k. yDxB"&8 ;@mā&HǴSxi@UQ^3в"1`CYbUNgNӞ~>u8T$ $<ڻtEp5E:.xr 3w)Zc1+bryo(qA%.:jQe2ۍb˧b{_w3ۇUBET>а ָ4p4ؤ*! 60PYU@$l0SĈ"SP9^#2B $Ad68i!Dfk6R$0m$˴c y~\PCBƚi6F$Ap5YjiL4VZYETz=b8Lf+s;[~-pۙM̽ffsԪN7Y!Tǯ"X .ϽE DX!Vr⑓dnllX\b^ bE1]rXDA;~񀏉+#U :/P#mf7UfYJsZuFf2syI;&1DPdv 54Nj!.ýݜE'0N}'げ0D&` Ǽs}˗< x !mD"m{|Ƨ7]lg&0SExH'[<ȼ&!6h1{/ىC*PVTU(s90:4 "IpO?ecPS FtH*J\> V+^?=@<Oo9;~b #T*XÎ$aYP<2T*U!R:VaY ^%ƈzʮy*[`ƹKTxXOm71fG&ENr4hl83ߠB@9~JLa 2dZw=!I)hF>=I@-vZ۲p8 Hq!b)}K-&!_[ܰ2ѶQ7Ac:fchr Pw4o"Z.ӟw9~Ï/z}AۭO$>KQQu~~mDQ""¤C_⊍i!1JR,bT1,gSRu!QTUXĈ5BZ|tըV\4Q4ah#_<,QUQ*/wu!dSV@#1^$> $A iAPEimC"wb %&0'&lEJD(x3h* T(X:$xѧhI2D# xHB<,azvzgQ/^omaG;KD眿z/ԊYyuc ־nA3$bM EqGhTNRwa,bҞwFC$J<wUYQBfEss:V`5El-&mZU]8/\jQÎo1%}j|aj|q~fbc4%֡0R@#'Jԉ AiGKU-'S}SNy]d*o_!PE>a:eO·̕kx2RKZZSKQ~);N$ ԓAAqyD2"cniy\*K9RQ寛㛘^91p"HLm쬣?0. T ,94(4^FM! `}@Ee0@=\&jP L,9Un#iXƏE=*L-lXǍ&=Kp/sܞgXn dBɈ'yC}j~N7ԻCs'Y<UC}a>TC{JͼENT8vQt3xc wt"tw;_6/ʸ1Do6)D*=zos-y=k8Ѳ=v!D f{~D}hoos~߽!GiVı#5$ 36m2f$.]CPKϓ ]'oGٮC4=oXH3 4m7)OdI:W'D"CN6+ź.\( &ip8N9]QF޸M73cX qQ;jSP{ \VvO m|-ۋoA^8W8 4'1 r=bMqt0#햂}ն~]yM:'-s wn{C 5Ag+. 湈i'6:sn:8kbTXm3"yd Û9[j5zk c1:g;Bvhn_vnsbA?91}Bb"T a~w^ Åkj`3x<\i=dwU"fz*<7aRl541NoԡnWv-Xxo}Hwfw3I\AA[s[t9LaVs/LO]~ܺ\;{=[d.L!Dely`zo'v̢m7B /ku/gEΐq!|Y8anfRuFXSwY#4I { ͸J@@50/H/lBunS Gh#˓u(^ e?7}='=%wMFr|[Tv"-8 {%)\y:DY{&zϹtU9$r|,4|#S7)PtT.ݍc˾s{4;n\.a ۗ/]|.-;ͷqI~b vWw똈4B!>o>۞6mػ[O!^[v?9xwVbBv'y^t8W,3ik-=2h`̝3HpGSwcOM#9=}vvr ( &ÚmPp,9q1cM;G^PX Y!}v lsfӃ fd81 Eyڍ^MÈy L(qmZWwcDEh4:&us8ZOVT9;+ˮ; P( >cF|>h$1驸[SS tU(f=Ʀl~^ŕƥM6w8+a`']hl.̟.{x9:_pٕFY喑dj t Z)/iG޹!uE T-OV0fcMn;>/(ź> Iwn,̋ƖlVN< 7WZo8HfWV+Y\^,nv[-lm[]}# Zo0; zmo-}-橷bق_qkh9ɱH"vApͣE`O ݆_(x߭ɏ*a]ww\L/k''uao^a|6tOx057ñg.SB:A+n/MPk5؄>^D7W %t$fjR1 &"4{pz+;{_ӹ٫"*В*m3ճ4#W 0 lR|1zys7Ik.D߾q}8%xk;VUqJYcTOdԴ0'(.g>bQu!ܓ4YA;ڏ{@őg_Rn3匘]I3#:m=}UVgkX܏o!Aɢ{cvjin>#s35Mw9j ɳVhӖ*{!OKpbpF=I,||?6aQݡpvz\^AYgC |Oe^ Fy{Ѭ]=з:d"{ywBsAIu>A5PרHQvIӃ8j&wl"Z/I Z1j]4SYg}BI$! ?X***4c\ƥmEB$ܓ]r1 \K3%wjCM؝b}o9ޥV^ڪM!!WI)e؀#-G!2 /G֐D7K)#:FsR9i7RYjG/o|?>ɮ!"RGhw>~r_\?Fqi^e\~!Pak@kZGԵKTr}Y﹈N*"*%`bv>{>"I8c-ǁupwO+까[ƹXT[$oA|E*LdgECׯzĴud`jaOw]^Hr*BuYtg珒j{{Qu4"m+ymv:R  7rSqyFI NXŦrrΚu{wwg>MCs;3q= Km Yni~ۂ:eBυS,K=|?uAw[9q u/~3:lU3`1C4o湹G/rFܷJ$s^bU|-Ar9G/3=yՂDKisݴ:>;t͠kP"L\d &d(.G<4Sά-AkNJLQ~cKCp+g\~r0vÍkw4ܦYJX(|ҶZ"^W-nC/Z%U) :FQuG dWboܟ8eHFY!6\$aI%o:Fw\wsXE'>vVGRӃU/yF.VL!L yXXMo(Q8w3OĐ̌*DzsyS)gṻޢc엨>8 Hv3ڠ(QݧQf/E* :Vt9qeg{;!I}@Ḏ@OK ܳ|\VX>P)SiYO=Ung$Wy6Q_(1'K a*oSIĩYU+ {B'(TuA;jvʽ[*1b_pmGךP>ײ4Yn Ӑ*Qy]!$ 8C0TsmDҮG* ׹[ALjDK {fh4P`hڇJEujnh#䇴?f #D!4|b{ #Sg6w5zH|²c tyӎcwp['́ ϘCTe_Bokb67t6)7!#xr9Z-nI^;eWM%o'-cӰ4!*#qCR=aćDԘ!9i֨:^m/=ۼBγ!UEEdv3Na`XƴS#Jd(g`2q9AIPq+ (*jk¸s3 ! zr,a.![V]_I2H ]7$0dQsz̘P4$3c@SqkaGPV"Z+iDvJMPwBK&fF$i/H+I>e`iid2u=r!ffX { ,R=y/<5݋ ;Ξjv9dqk+W^,.o1F?;eiKeEQEESqyIWEW/7bW7bubS/Gzv (k#QoU5U1 GjQei|axvߥnS2cCb6Qct9N׭!],c 1p7,:ͧdvKKF{Cǩ˽rYC!g{ ,,p "X3Q͖86f1yg%yexɷyKB cg}KD>#SӜKJ f^C}0:Q_^^?yLQٳ\%үzKzpQ4ʜ;"7{!n&寺蛲;۔XmsÉ''RlÚybӷ1bK9Ξwr:niΫ&u J{;MC|}>9Y}'j 'uqcSZeƉ,Lq0<{ԡi&In谌NWf_]%]lX4 "x ɬ-ۛÝV٤U֮l5 =ӽ,Z-:yP=c͗BQ{r<\zg{H|`^h u$f)RfU.1Q}2aWٴK`IP&,;b@Ͷ&Mәïr$ݶ˂toۻ.};Aَz3f㕘,oUwj{pyooq&y/}݂zFvp\)d8dWu#[\1Nˠ=%.р7m:Yx(R ۨN.C ڽN$lpyzW/>1_lZ`AoP:xs/bmh0>۵=q,euow@Sl */`=m ˏCnyuE^|nj봧qbvsOG.M -g9ьe̋hQRod-37nZlLwyq$B1M}|a/HOT1V\:߱Bt)t_^ zG=g^a2^cًj{W޹KRN wL\Eu9D53Kyc:>w_emɇ<&Y}w=m/C&!:d̹o.j`@vM0dܲ}۾>]`Kѫ1ͷuzwUt_TuW_ Y}I^i= !B7Wivh;;ou뼽Z5jSyĀ<$8Hf[.abFhԞ{rgo`̝mIX³7x}rڞzz9ޱfNίLaJ3q߭޲X˂M˳9g#wFj_+nݍ ,mFn=.!uD~;/w ;jEN .ԧmɯR['#g";&ҝY{}Zŗؓƾ;;JXͮ{ٽsO6U=1kAX .+BSf?=܏jb@zQ}Zvw vH&ю}t8AsnwT\7yGuc=->W.mȤXyOs:ά=ӫraE>o0& {㹽lY碪K֜f,XFy^={;a}زj=U'God2碠v3^DpYWدMBHf%Yy>A*6082ƞMx&pcty1ھz{3/ 3ozc*J 3oewצ{Ƭjn]&ײ}&AϷ ݤqxq%4\42 !ͺϸfٗ O:1mDP{UlKݳ .hL1oxok[`)@'QwtX J3םv{\H;>5E0\ͱ3߮7TXWHWHF]>{{.{7$zM[-|u^EƲ,v۾̦ޠX }/Uu>v'N{k{)u<^McmzLX{{8WU7SgگSi;=5Nwznejڲ?v#j,z1~;"E|bۗ{qXfz\2B} Ѿ]Y^5Ţ/o_!?*Ty{7xl}QCVYfvz wF7d;~|ogl, >܃x&2ǚI%ɾ9OW \yYA =ͳ)7X]ۏ*0l:&'$H"zkF%A͜1r}u+*rpS߭s5Ws}+k邪oy%d^҉RP)y]AR9Hi~>$B-{ۅ]6gɡZI?|RTUwܽLP*mȍhUmQ4 j%(2 : 8ܾ߮EC_yRqQaĪ^2}Lj'w/&$*&{aEM~Md$ߩQܧ_{M5]4h x Z"*Omo*,_Xy1%C& ίkůJxMI\*XNNzÔۜ,Bj 56B+B'6眳JBgS0l -Q],4ߐ yB`@~6 ;Fd9i%id6kI^ɭ1i59ghqB>$/R LfH$YDpY's$ $7ocR9[{KIUm"{z}IשPCPR '\1kE# 2Ufo'88ExT脗) : ղZb'BAA_V=mu:ÖU>~xx]lQn89 4oғ^Ӵ쵐޿QVx$QBG.J\no_^=W{w1^xU<5$yW(˝<;CV|1P<ʼnHC(<ZuW}ۧ|*sMdMb7-n~(wt3%rSL,no7yr [iRJ()T8eX)0"ٳHG!mj !LnV-h4C>Tp HI2R,"D JbW;;*&`/ŤcjXva$n{$. ' W-4|g)5Jʊ?7qѩLIEUmպ. , >hz7HIxTSs%Eǻ{g)pMNKeW*ŬTQ196CPP(AHōF<<"l79>f"8a5W#QKCHʦ0S+m'٩C-,-sTeTɔu3qzh7g(!I!ӇISnX}ٛ}B =k:ƪc_Z~]{|o}\z/o_3^%P+uT(|ʑ|Ӗ_*_-Wj5#TE܍Kc)Pa^rÕ;h^ suK/ xq*(+%HgN<ƫS7ۘ-%~ss]F\$u)C>>${.2E+i:Kd?/Ti[`zDM_rga82O%JŠ+=4~3}{ܓ:^[1Իl{p R΅,vv/np;3 ,(V /:0SHK{/Ko܌?\ڋlb7dRaq!'yb~xRq:Όq11%D%,卬}CXwkBUX,L,$;$E@{߳H~WFq-# )~v >zTX\Ct,Sڃ0:*b QOd:09㷶8:o}Y~߸TܰShh2MtiUl=Quٕu~<|uRj yagP , TCY/zrJH'u˝|Kۣ:湣sy4nwwpRw$ʇ.s{/Es:?fǛI%MYSʐ L=XZ@I:wK׺i RL~]#`QKvb#t+ÇUP32pc Gj TѢ\ds%l8!㽧\[1Dm>GȓkҔucJV!1dX(1TbZ5//=v|}C+>J:<*tda!gw(7r "QE^.]2PfBQs_z7:xya1ֶ*iY$%#Z ltX.[ڜ:~H,YF>l Ed`PjfBo- +r.T#s#۳*!=n`~h5.JaTnڦ 滝}gO&[%j(u*"H͓Pջqs]xE AH"/p5:g->FO)wUmUQoj[t "ɍaqyNjE5xĕWĩzŒҢaIVkGE q/==5.%}8b] j랄3mk%LRs>g_{.L-f\;[ yDpE7F+-촏Ox&Y)eƮkԣ|ć}4ʇͪʛqjݕ[0C6xb,k F, }zF5SnhyouQ cu%{eS:QyA򞊋4hQ">tK"'KBy[6["[.K51cYab:?^ži_XRoqMd{q_wjԵ%8nCn.@-ITT:ԉ8j1aTη`сGHVk@G_GF+Wy}rkO:mã]xGf).\ 9Zr#^1;;yC(ss纟Aw9M2i m/y^D<|k 9ؽX0$2"!rȵpF1ڋwj#в"^LZras+QPW#7}~wr^x]Bw2qchz>rm½[$Z0ż.+rV}Uj brbK-UCN+ ޜ,';ܽM9n% Nṉ:;/Bco[Quce!Q)Sj?)>*yY*6rh H̐,SQ < lzz+ Kdnn0)鸨flVz1O]lX<1=<8uk(&FmM*0xEr>{JN3X21*6AHH6S9'Tzw41|1ۤosHb !p0~GwsRL;~kuMoÒ=QWI4ԉ5b 3mB}>{ij<|Fz{F3k쩼;z|AӊDF桇to$_PK,ck-K8̗vxFbDyLy5~ԙ;~1fUc)1WnMAha=;=V`B hxXW%efKmƣxF9v{}]3wZ_]oXZA3; ݩ7xF("\29PZ\'v=W3.Qxvrz;9TTeE=_HٞZ!{˵v uxHP}Y@Exj'~R;N/^. PyW"2`'Wu`d#߱QDP@o6׆=ms~=n^c +R;=+L.]J1!SBB띕'6Zvv6v X7wtM3ˤѶ{:rO`ƴM3b8ZxjDGN7v푝ܼU ϸ7ۛQz̊tݒ |c:6WeЛ +p,w!2>}}7| 3/^'G[[5Tz6='uW᯹"H0^- {cx]2k3m_ D^MH}/)n\`;nsviw]3w3wzW:7}[l77pcU⻺~`;2vK֩ ͫKѦ!di73䅤&&5!X'4˽1er{Ev}*v31pc"zfiB}}[RH%o7]N#zZ͛٢󼊢iY%2u85G0aK$ٖpQ'jD,|_mn) {wy!5תfמ<:U*>P>^Kcka "XajG峉2.rAa^kY"`E((wԜd4jSⲔdĐODm5V0QKꏛJiZǷK[׆P5lF2h3޳{Ą* û_baiB/V/Q)UZ߼DzMTeq2Mx ?|q"uoe "&Ma$BHhuH)I'<%N5_rzϜ\+o;I8y>HTOeߖ܋F1J׽ܸZ (k\rПw\ E})ܥhT 2_vڬ',9j 67_Vgbf;6TB8D+ВXl$$? X!΁m#"e7Y0ii_d; ҳ-}Eu `8H~X"XP) ,¼pE|_}?*V8Ss~s׾=5ܳPv*#@h:eS)"F:} (,Py¼ULx[ͽ}+YQI ak!J.hŢ WJ6dA3[C*  U8+q|';B0CJ] I+mUzMjvۂa>$ $$'|"EOwhb$; !2!,L %a ~&oZX۔+bl͔WihqEtqLH)>i`#ea| ۩^ Dy(BOu&2οnjf]! "(5))YVǟ|&0dVHDa5Xkѱ],Ad1#G]\0, )8-kT;̻c%7ъuڗ3hw6쇛So0(4M  >= O~ >헓m׉9pNCԋ> :Ƭ`kYZg4uj1e2wk7{rod M9Ck#>"Z_@'J60TNn<s}Í|XBOD4bE5YLsEXqO@*= n[ޫx$ɓb4a1? rN9E6/ b75$YNCe&!§ϝm3GB$1^L3yT#_']yw1O;wuGJ 9dm*O5v6X XLau HIlkž[xmˆbߛJ i@,^"[!^P80̡8&ÙxR4Rэ -ʼn\b$&t\nb5G5hOI$`A8\YOq0+2FHT%&9P(Jwδ^dcOSI$bHHφ8^$LLL?2EEcyG󆦍MM,Y@hY$Dx$w=yzd+8u0Cd@ B9e@y@Aw\E0W.)II:+9j""'[S⩄1Q{yGB~PX#N^}0 {:qѢcNTswaעI i?bP<$pu+jZ}G(V !{t~%nn&_Ofȿ!ҍJ5˘|s+=3~:èjByQV1I ܫ+I5>~Aa5hcIHF`?.HI/i’<+Ӕ8P/lNJ+̼jXXkrws[ΦB>/Pjǩ/c*^ Ui$& Exs]9*IQKG*T"cC9,"h44kZ^fb|ݐ*  RjK;ٛ,%)iM!͐ϴB#Q'1yjm?ZIK n:]$%`[u.9qѬmWZ-ˤ Os$~ۉ{g:BםZ)traJ_ƖM d!7i`F( W Yfز)H x@~a yu9J$B,+un@E=PIBeyZ˙36Œ-іogjmyD^>ز޼uF`0bh)z\f? ^]Cr-1vKv~JU1ES;yeP+Z[6oy1ʹb)҈gwII'v5Emru mZ~*e+V´}˰cIҪM:c'#6ӬQ?:;5 A}Uz^jS$s2϶H5hNʍWT5Ŧ"6{Ȃ% N.x^׾&hAnuh.s;9sH#7xC尦D22 L噩}BK3yooowݻYaKt#r.28ruI!yUCᙢ C663s;hfzfc% p)ã֯_pwޯWrx x3uy ղ!W딫{d99>W+TnڭK'g—'P/k3h]Ge]Qv{L~my6%]:>Suo39ܜ }byG7.x=ɫB]B7.7B\l~'Ӗ.¤~%9loblT羷@Hqf8Lodi1!KyMW?m!؝w֥qn`K|'j'ǥ6-VΦkFPL틱#7bruiŊri^6֫# b8K氞V*r!o^Y;/L lfѤ=s2s5w zl?31nTxvuFIO`CS:UL)wOۯxbFEcW]P#}ȣ6k n%n2wqְ/yf9^ ėAW^nA%^kP{'gwBHoYp}L>ji dWnպX&Jx9{t/7>B6ao=/~)U+n}>L=Y:fߒeR<Biuvxt='ꮯJ4*j\s(2q:}$}rQDyɲD2Ne-w&vKrq&Ųemmr'!g{AP:% E2O0>*xzxՅz<;R+mK$sX]3]3dH'A"tMa,m1onM{is)|xwk r[z%3ƚ>ی4bcԸw8<(p5 L2 B,O+3ò:z^cF]e9HDe^+ ;Fh,gهNDzzmiQCuٛ^X˧Aש햽 E2J'g亥 x['{򕒺'=%am̷(=N*vNqe~0iI?WoXWtgxga@{ nY o\ݬz6 ٓ.?hȇNS/iHp;va/C]f57ՈNy9$ն뽅\}Zl,, ]הּdlz%J=NHfӞ7^s#1]5!L pYEܡBZY9Pvdd+Aƈ[XD>"p{zdɇ)c:ø؛2v^=y}K3sbFܬ;9Bz}G=$InqO>s1/N&q{p>p1 LvzKy#/ njjbbl#bFzw9La{q凲=96e ىWKSD{/S9QE4/S9wMaaǝ!u+:fJ̝\R׫Άb9VQ̖c,dL%Āwl/ئx;kxYXshìG)aXy<#qvxucxe^}'cلN$٤ ˹_^Z3n)Xa{!>|{D͞\s0.K-ķng= M>{5KzdHwŲNҎÛ7Uuy0yBjjoo&׎Лd$&uy4Gnw ަxfG(gڵ1pU:w;z V ourT^bHOZ<%z,UsnaP/Za6۔ui"{.2&H^xn6wP;˖-c.f`oʧUYC:،ϚC~Gs\+zAp(аSm=ɓ܊#')TO25k+ !P_i}q+9'$5:h,lF6 E .r 2@kUA (>Ft)mk։hz @dptP:t V aJ! KH WBN~@R19A-ȈWNۺ.1 >È&" 6Tl:SPwfp@FADF45@${Z)5&`Mʶ} Cܧ'RZ3܌taG&l@>.n`Ry8UQ M9w4N{;ޛeDoFvtc=wk?_0gBd>>oyT(S,,( (|!ʥx/xs)fo 4^"haqdXH'd(=k<}7Ko~E>d*H(EĚ~ߊ΢mj6n!Di ː0M h7pYQBu8iN%OQ7&Q!DAB{d`O9iyڽz:XI YtD amz e&t: $o2D ߰ܳ3=+[gL[;FtveNSyg׫ܿ{׿Wݪ,h1 ,8zؼqox=|,[WkWHF(jhwŠ(rŅ6Nnb.s\܏ga׎o8e[ zp%A9<QI{ͪe>{zr'liЇʹ"""C*Da(3(aYM{4JJ%YDWnQ㘆aRw>hw2fgκϒu^rV}W{{UlZpL!Kk6qG{L]= b|$< /oZkܬrQkc UgƏSP/Q9x QD "%H8:Ri<hKI8t@!;>I62~5LOrǤUBUŔD[ݛc ZXq>jg'^Er׾0UHE!FV!9K"L"H&~Aj{g:PH9ÏF7q>HX!B`>AQWuwܢdbC>QVyi)79ETw[/iB6D0}N`HTՠQ蓼O]3˘/+y S㔨&7 ~ l-X4.u㻚-~جFV1ƛ"G觭by{fPoFnsjH3WrٙN }::ĭ+5g"xK6G&{|1>˸3<|>R"LO ٜX׽Bb.`0:ny%/z '^ܒf8$ЊGzrXc-Džf$u#:`DwLkzmgY.vVGio*̻z]ė XQ8sZ: g.#|֮?Q)pMۣvHi>sC|LZ<U`|в*p?k:7!6=<²4z:t Lj:" B}fggCX8m&펏ۛuνé>~{}9E}àsa[.14wL4upF=w'6PǗlL(WW|Kk,%6>@e fbRr+dzݝ']瞗Ggްfi"+Z ncu+H9zxYmg՗I;be ejwtClXQ{pm(cNQSNF#zǿFڏw5CcNp 9xd-ӕ[YOU4t{J!jrAm_YZ-{"΁#}jй aܢ"ŴL?ewc 3'h+|&]o7;}T;-۝'U󽸬jntqt%Wp1 OiU3xAݦdݯ9Xv=Nv隗}cƻ;zGvXMS*}SqOXc>\s]q0rTRKzXFb[Oax֦7L< O]'_tGŞ`p+tݚ:;kh9ټG]tǎLWÙ8(A랢 ЗzfQȉ! }}E M>;iŬN (*qT]^l$:#\Ry73{9-{آiEػPv~E+KdfT"+_#:]) m1F4-jLswlz׺(ցz$ 'z\vVyBARbuH:A 6S\]n4X/$Oouy( p y(7J/=uJgqnY:\w;s*tpJ{o e=pΊycvmr\wwaYޖqԖxLk4]9}' T!+^gZ]{Sg.vS9HM[47&#B*~s!_3uSGJ爾8h&ͽ}{k a vrR {ۅrԏүVh>; ;'+y 1-0^0wbl 7w?LG|XB3Jܫ`eB6ԞU` !q׳ۉ2lDtCd8Kأqu"͠-!?;}J`{/!W"ON#^t=aqcTԦws7Gcoj|;%yȲ$žT<ݑ^W^zqY {OɤFZwGv{}̓בz!Ø Ch9kn|׷"A}K8w^l~%,<}%vhPq3{đZz Oeʎ]ܷdc:Ɨh86S1zrJmR|G)Apw*GK&#y< h8;N-Rf$*ogNM/v8=i v)oi1`s=xHKh6 zz`SE~ykY0171yz_|{ľZG =40σ_sY=I:ǍBKAr".D|;`lÅwSe sޣ;x1X Z^k޺smõ;l;<,7HձA)DjeL_`񶗝hn)y{L邍X<b,t)ǃY2^w,.r՗{jߑcw*gwq◰z4Cגc#J&5i 4)yͤ7nAhOcm"DVڞ$] blbm2w,F^o :Sn}'Czuo{Wp"OS6:mʛSK!nws/ezz猶f㾍P*Ʊ?[Zx} |"s2\S&/tskã}p6"TQP*c}rbP٬3iܬǻcXc)F:'aO>heՑܞ| 3{\\C*P->a@!*hhjoy3̀4nf_Eb0w:5}⏮+ t[-We_0D~Ƿ;"ݧ^5 ;ʝՓv" &fV;9LUM YmV:qOm_iXYpZR}nu7fjz}r7_$pt[5ۆC¡>q>1wA O)`y#%ʆsxg߼Nd{ܧ`u;w:/O=ѧEV'\3=}Kq&M kZ㽞Zmk8/;8vom,yr ftcuo [ǰU 亭: 2NNJ`tCL}vc(ɗi[U64isպ<7=|}Sgq hl v㻈zqOK3sGwhO0oxjU !ǻBrA޾Uoݓ2[*˛ ]`iE}/zi=]:an8*'{Ab0هpk+UxQi2[9ji:i^C<[ّvӽyOGO%y;~vrHOl7FJ}B3ټo#+ x v֮# x51 RLH.2QUUnf^wݿ^q1TVŵhƢ6f\س4EJ"wA* ,Y'-Em"1c^ M7@(m)\nb\nt+!8$ >'5yMU0H|b[^S7o,ma3G9\){HuȺi¶Kyݪ:>Q ȄԣYͰ8<ޥk(y}Wo޾E̹;%x4ZvMHh#mo|u7"yqH %_u/oKLY)_i0/39{:~`u q9ªE>aRO/pl8Ǵw)+ mc_Bi˝B+dž7.x<ݤ2VEM2a)gvԟICZ })dzm­ Grw2T9$[8I'Of2|AG 9'K'VEcf4xMG7PoN>7=7H|2**PTG,w'VCޭj(޷-W[I[`FEx.-_@+b}yN'*ֈ*-8<+]Ypzf2{=v`C0 caIרⓨ<I 2Fqbaz<2YX#ߨQ:)+鿮5JOdQ7e* uP~De|NcM4^RԼG!R̴=IȤ&Pmox\騩?Y""X9Xrt!DbAy( E[H$ܵzb6{J{C9e4+Msm7[tu!dQTTJR*տ[O9Ss{@!lU.h֍dsou 2m0\E$Xw]sX/-"#/y^˃>Ta#@Ma׍ ^,u0M $d; !?1AQ{[O<n3-eIv^W/(g'Im5)aL,F QҰT!j]A D44rۍj 9կkܵsvϹ9~@DqJKt/EIiݚ?616oչkn[%x,gwo^ eyM; NԝsuYהV5b  TX(Un$x]:U{Uʣbhrm\X(;ṱwn7Nj|Ϙu!XQ\j4Bu)q^]9;U$@''@ȁtl>DM-|Q ׾*`.p(,YAMx:g <ׇhUc6R$aBqm5Cv %xy/,gݏU^CJF W}2A |wυ} '|7*VMVsxUOxKVVVŌK*KٮyZo!0 w@6:7ɡǧo=oh TVٞ윬q-` sSpᚏd ޛR7yaxx/7wN7s;;"l}myԜŝǖ0fXb/<^V[o`vAnqk-xOf$3Rz9#=EQC/ }->`Btv+E{q{dԟvf0/^<⸻֖GW{+l|/9ؼ(xLPDLټ]hM˛pj.I~!a/ 2k"<-2sᲬ>]*<26oyo\_a8b]٭E\adFxAzKVݴ C{yyd[JFKeNNbo׫žkW q& nvᱢ)p)Q́"Q i/ c)jotH/Y]f^"@ ,DFгi v)51tp0 w\D|0܇Ρ]GÇF[+lU֤Z$0:Y[lgTgvmY=Xyr8,F7oxA\EXÃ7<(隰j[x [m=)ZZy=ЮpW=rq/?seO{(gЇr{w"\c}[|{WM4^}F]kJua]%9\mw-xjB,E<чܚ^ym?UmF`yKes'(6ήAcYڒ>iH9Q1_=pR]>7}PNP 5^z8z:#E{I"M#oS&08֞5">[]զ6J[݉Luxc,_iSO>@G9{s`Ãya* 띃#lH,+z+Y˔wx<җ\)Vw@eo{wRLQ|W6$Kt0|]VnX<^xm25&;iN߹A~7N}ǰzݏ;\?>E<}M;|nv f =='dô/F?% &-CUT6wZnnp{:nyޖ^e^Ҿ?q,ysV?9/;# ;w8'wzA{*7COUK\5dm1vaLJ2=llyfg0S+=˲2'Ө7_&m:X@~/ z֗w HfYFU1}5f/HHfG -:dqaܭ>wz3:ug.4N Ol4e/|ɾ۸b7ܜ?g_SKf]NB.K= LS&P=c˺[\7.`),9y`՘wo;lAkA1e넙a|6DQvʵs׍>6YH6P_x;HL&sn>˂z{zhr!7_MYF䗝oc3O5;&5S{<'J']9ankulsUSɊsOv]s)87'bS6N}\r?)8pxbvTx6qZ1;iٯ4S Dg:11>ģy~ xA<+jo>l{*~iB"+qh, sRha( `1h+sGM[S^K}F1_Z|ۋGRhІ>P$i~:>7Zf~ϭ9hX@JY[{~^Ϭ$$<@%ԖD 5A!N5N3ݽV+mHe^c59)ill$Tdʲ(+'2} x]LS2C Hd1ORsx: "KB8Z0y~<,/x :Qo۲P ùbN!DF$GgpBc,փi6 mmүKIPc S qxκvcn_(hW1~oo %SU.!Nja`bzK:şBC$AsgxUyaa{K W`ͶRš߇Ω*YMGU>ҒAOB(gKB@\ j瓜0t:rc[Ho=yjJOsekc3]K0;Ou}G52g7@Դm+_eU)ȢpQ;yԤRr!!&#9ovw}/Y<^=+*7UnZ֊r5Ư˼ IHS.E9}h7)׉U?pNZ,a$@{yKVi3Y)I!bPM>^!J6Rw|g A2atG&;zژv9 <ٝ>gnҚ=.zaU5BΘ|TgKIE09Rfug8!f+]~s=O_.pdY^vܱd-Qi5Ex䘦7:h7Njww:挒<~pj Xk2"m$P t2툒;Sk1RU'>6smQ d s6ښt*%W6Ӹm8ۧxU.;fŕ*!FC u >4f &E^4ykrgq/C\xk{N:ʄX)P*۷IĐWlT[_7˖yͮQ̫]9Ds.tS \~KZZP9F*ֹFyTeE*]Lń n8i=.6[HȠ7!I[ϖ 7{u7uHy'`DX#.lrдm;ofmqю+ջ!4Eqߙ(ty4PjR!j/m%PQ<ۙ!U"^ϓyx~q$ ƍUr樷wF\|떺"QW+)EPyy<ם*Wwq#AXԡÉ 6ˌH8IDQ̾wH8FmTJ"Lw$P&i_i#}BZ&*mulÄaOG< #6 Xa˪M+;iFI8Rvgkvi>Hu.RV ((a깴D۝ֈ3,[^ҫ[wQO<4g3!ԞPP,9GӢbd2k6 gS{/yݙXHp'ρ {ji}UPRyO{U(؏9,i+8]?rܶ0L%t$!`@}F׀*m¢eY)z֌dcAhTHHFǯj܌S fg{^a d "zuΕK;y:+1 u"a8 BL rE>F.0fJ?^D#ujkDET8On("I "zB[39/2: ovHv}TODT/#uiV,j6]=@Qd-WH7Ch4hq;K/q soQs!WG}Ai\Tkw+l;fl??3.>7۞x<{339a'x6M$1DǎxW%B"ͻL#'nCksZ\n+{uBNeMW#{di:N<'+sg#>2j*2@]iy6+O{l~Kץ>Yu{(et\lł2:n |q}r ^Q,@S#LL1 zͮ}NT`, n:R8n{r3F|T;;owv!h}[@z}]Q*Hys={^/nXr=Og^:O`*9Mظpʹ#5:5t0a-G *G=L˦rªM{g/nJPD-Sh$Z@(ݻw 7Z 82;YUOu7]0a'2bj+$rSV*$61^KN4rm}ۛgL]v^R.S;Of:(ܛo{L{BXaCdˆ͓Wt]~uo[1`eXQM@V|b=֊YBC򪡈]2iX~G7 'nŸW aVS[v@=.FsK< lݔ{JtH=+"^~]O-XX $54ޟT1,.>Bpnat'v:`Nx7[WqnwJ'"Ov~82Ya5G˚itL-y!UIEsQ|f9NkuX5<mwLصK<6P*H^tuKN5xt=p{sоݛwX2;8}A>oHY~&NT~M`ޙ`[qIB}%;Q*Xv3%iY6FW3Bޯnwk$eZ c)R